Wann war der 1. des Monats?

Manchmal muss man ein DATE erzeugen, welches den ersten Tag des aktuellen Monats repräsentiert. Dies ist nicht ganz so trivial, wie es auf den ersten Blick erscheinen mag! Das folgende Kommando berechnet dieses Datum:

CALCDATE('<CM+1D-1M>')

Diese Datumsformel nimmt zunächst den aktuellen Monat (dies ist standardmäßig der letzte Tag des Monats in NAV). Dazu addiert es einen Tag (das ist dann der erste des Folgemonats) und zieht wieder einen Monat ab – und schon hat man den 1. des aktuellen Monats…

Achte auf Deinen Pfad

Ein paar Tage lang hatte ich arge Probleme mit meinem Arbeitsrechner. Nachdem ich die Visual Studio-Versionen 2012 und 2013 installiert hatte, funktionierten plötzlich nahezu alle Programme nicht mehr – auch die Systemsteuerung nicht.

Beispielsweise konnten einige in der Taskleiste angepinnten Programme nicht mehr gestartet werden. Auch beim Öffnen von Modulen der Systemsteuerung gab es Fehlermeldungen der Art %windir%\system32\xyz.exe wurde nicht gefunden. Oder, dass alle Einträge im Startmenü plötzlich keine Symbole mehr hatten…

Nach einigen Tagen böser Flüche und den vergeblichen Versuchen, alte Systemwiederherstellungspunkte wiederherzustellen, fand ich im Internet einen Hinweis, der schlussendlich zur Lösung des Problems führte:

Der Inhalt der Umgebungsvariablen PATH darf nicht länger sein als 2048 Zeichen! Falls er länger ist, funktioniert weder die PATH-Variable, noch andere %…%-Umgebungsvariablen des Systems.

Ich habe daraufhin den Inhalt gekürzt, neu gebootet – Problem gelöst. Willkommen in Windows 7, wo die Pfadvariable immernoch längenmäßig begrenzt ist…

Rounding to DATETIME components

Sometimes you need to round DateTimes in T-SQL to a certain DateTime component. For example, you need to truncate the minutes and seconds and only keep the date and the hour. To do so, you can do this:

SELECT DATEADD(hh, DATEDIFF(hh, '20000101', getdate()), '20000101')

This turns 20120101 13:59:59 into 20120101 13:00:00. Please note that the comparison date 20000101 is totally arbitrary. You can use any day before the date you’re truncating.

Transpose lines into comma separated strings

Sometimes you need to return from a stored procedure the results of a SELECT as a comma-separated string.

Example: The SELECT returns:
Hello
World
It's
Me

But you want the stored procedure to return:
Hello, World, It's, Me

Instead of looping with a cursor you can solve this pretty elegantly like the following:

The AND Field IS NOT NULL at the end of the WHERE-clause is important, because otherwise the result would always be null if one of the values was null (because something + NULL = NULL).

Paginate results from T-SQL query

In MySQL you can use LIMIT to page results. There’s nothing like that in T-SQL, but with a little effort you get the same result:

This returns 15 entries starting at entry 45 in table tCustomer. Please note that the page number is zero-based here, that’s why we use ROW_NUMBER() OVER (ORDER BY LastName, FirstName)) – 1.

Notes about System.Threading.Timer

You can fail to pass a state object to a System.Threading.Timer – you won’t see any values if you pass the instance to the timer’s constructor before initializing the values, as obviously a copy of the object is created.

The following does not work:

The timer will use 0 for object.Number.

The following, however, works as expected:

Same column widths in WPF ListBox

You can use ItemTemplate to style the appearance of entries of a ListBox for example. Sometimes you want to use a Grid, and you want the column widths to be the same for all items of the ListBox. You can simply use the SharedSizeGroup attribute:

Don’t forget to set the Grid.IsSharedSizeGroup attribute to true for the ListBox.