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…

Runden auf Komponenten eines DATETIME

Es kommt manchmal vor, dass man in T-SQL einen DateTime-Wert auf eine bestimmte Komponente runden muss. Beispielsweise möchte mann die Minuten und Sekunden abschneiden, die Stunde aber behalten. Dies kann man mit folgendem Statement erreichen:

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

Das macht aus 2012-01-01 13:59:59 den gewünschten Wert 2012-01-01 13:00:00. Das Vergleichsdatum 20000101 ist beliebig gewählt. Es kann jedes Datum sein, welches vor dem Datum, das bearbeitet wird, liegt.

Zeilen in kommaseparierte Strings umwandeln

Manchmal möchte man die Ergebnisse einer Abfrage nicht als separate Datensätze, sondern in Form eines kommaseparierten Strings zurückliefern.

Beispiel:

Das SELECT liefert:
Hello
World
It's
Me

Aber man möchte als Ergebnis des Aufrufs:
Hello, World, It's, Me

Anstatt nun mit einem Cursor die Ergebnisse hintereinanderzuhängen, kann man dies auch relativ elegant folgendermaßen lösen:

Das AND Field IS NOT NULL am Ende der WHERE-Bedingung ist wichtig, denn ansonsten wäre das Ergebnis immer null, sobald einer der Werte null ist (denn etwas + NULL = NULL).

Ergebnisse einer T-SQL Abfrage seitenweise liefern

In MySQL kann man LIMIT verwenden, um Ergebnisse seitenweise zu erhalten. So etwas gibt es in T-SQL nicht, aber mit wenig Aufwand kann man dasselbe Ergebnis erhalten:

Dies liefert 15 Einträge ab Eintrag 45 in der Tabelle tCustomer. Zu beachten ist, dass die „Seitennummer“ nullbasiert angegeben werden muss. Daher wird auch ROW_NUMBER() OVER (ORDER BY LastName, FirstName)) – 1 verwendet.

Hinweise zum System.Threading.Timer

Eventuell funktioniert die Übergabe eine State-Objekts an einen System.Threading.Timer nicht – man sieht keine Werte, wenn man die Eigenschaften vor der Übergabe an den Constructor des Timers nicht initialisiert. Offensichtlich wird eine Kopie des Objekts angelegt.

Das hier funktioniert nicht:

Der Timer wird immer den Wert 0 in object.Number verwenden.

Das hier funktioniert hingegen wie erwartet:

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.