[Gelöst] Industriedatum konvertieren

28. Dezember 2006 12:05

Ich muss aus einem Fremdsystem Daten übernehmen. Datumsfelder werden als sogenanntes Industriedatum geliefert (den Ausdruck kannte ich bisher nicht und ich weiss auch nicht, ob das ein allgemein gültiger Begriff ist).

Das Datum kommt im folgenden Format: 1980015

Die ersten vier Zahlen sind das Jahr, die letzten drei der Tag im Jahr (hier im Beispiel also der 15. Januar). Gibt es in Navision einen Befehl, mit dem man aus solchen einem String ein gültiges Datum machen kann?
Zuletzt geändert von rotsch am 28. Dezember 2006 12:46, insgesamt 1-mal geändert.

28. Dezember 2006 12:39

Einen speziellen Befehl gibt es dafür nicht, aber mit den folgenden Funktionen kannst du hin- und herrechnen:

IndustrialDate2NormalDate(DateText : Text[7]) : Date
Code:
EVALUATE(Year,COPYSTR(DateText,1,4));
EVALUATE(Days,COPYSTR(DateText,5));
EXIT(CALCDATE('<' + FORMAT(Days - 1) + 'D>', DMY2DATE(1,1,Year)));


NormalDate2IndustrialDate(NewDate : Date) : Text[7]
Code:
Year := DATE2DMY(NewDate,3);
Days := NewDate - DMY2DATE(1,1,Year) + 1;
EXIT(FORMAT(Year) + PADSTR('',3 - STRLEN(FORMAT(Days)),'0') + FORMAT(Days));

28. Dezember 2006 12:46

Einfach perfekt!

Herzlichen Dank und guten Rutsch ins neue Jahr :-D

24. Oktober 2007 17:39

Kamm ich irgendwie feststellen, ob das Datum, das aus dem Industriedatum generiert würde, gültig ist, bevor ich es ein ein Datumsfeld schreibe?

Ich möchte die Fehlermeldung umgehen können.

25. Oktober 2007 09:23

Natürlich kann man die Zahl vorher prüfen. Ich würde wie folgt vorgehen:
(Die Beispiele gehen davon aus, dass IndustrialDate als Integer definiert ist. Falls es als Text definiert sein sollte, kann der FORMAT-Befehl weggelassen werden.)
  1. Länge mus 7 Zeichen betragen
    IF STRLEN(FORMAT(IndustrialDate)) <> 7 THEN ERROR(...);
  2. Alle Zeichen müssen nummerisch sein
    IF DELCHR(FORMAT(IndustrialDate),'=','0123456789') <> '' THEN ERROR(...);
  3. Die Zahl aus den letzten drei Ziffern muss eine Zahl von 1 bis 366 sein.
    EVALUATE(IndustrialDayNo,COPYSTR(FORMAT(IndustrialDate),5));
    IF NOT (IndustrialDayNo IN [1..366]) THEN ERROR(...);

25. Oktober 2007 10:07

Danke für die Antwort. Die Abfragen funktionieren gut.

Mein Problem ist aber ein anderes. Ich bekomme zum Beispiel ein quasi gültiges Datum zurück (z.B. 10.10.1010). Dieses Datum akzeptiert der SQL-Server aber nicht.

Wie kann ich das verhindern?

25. Oktober 2007 10:25

rotsch hat geschrieben:[...] Ich bekomme zum Beispiel ein quasi gültiges Datum zurück (z.B. 10.10.1010). Dieses Datum akzeptiert der SQL-Server aber nicht.

Wie kann ich das verhindern?

Dann musst du die dritte Prüfung auch auf die Jahreszahl anwenden:
EVALUATE(Year,COPYSTR(FORMAT(IndustrialDate),1,4));
IF Year < 1753 THEN ERROR(...);

25. Oktober 2007 10:25

Du musst zusätzlich die ersten 4 Zeichen auf > 1753 testen

25. Oktober 2007 11:32

Ah, genau. Das wars.

Vielen Dank für die schnelle Hilfe :-D