View Full Version : Datumsfunktion
Hallo zusammen!
Da mein erstes Problem hier so gut gelöst wurde, habe ich auch gleich die nächste Frage.
Ich habe ein Datum als String in einer Datei (Bsp: 6012011).
Jetzt möchte ich das in eine weitere Datei schreiben, in der das Feld allerdings als L (Datum) definiert ist.
Gibt es da eine Convert-Funktion?
Vielen Dank schonmal!
Ich denke
%date(%editw(%dec(MyStrDate:8:0):'0__.__.____'))
Die "_" müssen mit Blank ersetzt werden.
Die "0" am Anfang erzwingt die Vornull.
... da gibt es auch was komfortableres und besseres:
http://think400.dk/files/idate.zip
D*B
Ich denke
%date(%editw(%dec(MyStrDate:8:0):'0__.__.____'))
Die "_" müssen mit Blank ersetzt werden.
Die "0" am Anfang erzwingt die Vornull.
Danke für den Tipp. Allerdings bekomme ich die Fehlermeldung:
Datums-, Zeit- oder Zeitmarkenwert ist ungültig.
Protokoll:
Datums-, Zeit- oder Zeitmarkenwert ist ungültig
Funktionsprüfung. RNX0112 nicht überwacht durch...
Wie wäre es damit:
/Free
Monitor;
RealDate = %Date(AlphaDate: *EUR0);
On-Error;
//Ungültiges Datum
EndMon;
/End-Free
Birgitta
Wie wäre es damit:
/Free
Monitor;
RealDate = %Date(AlphaDate: *EUR0);
On-Error;
//Ungültiges Datum
EndMon;
/End-Free
Birgitta
Such hier tritt der gleiche Fehler, wie oben beschrieben, auf
... um es vielleicht mal zu verdeutlichen:
- die (korrekte) RPG Konvertierung geht nur im Programm
- die SQL Konvertierung kann man auch in einem Bulk Statement verwenden (schmiert aber bein ersten fehlerhaften Datum ab)
- iDate macht das als UDF und hat entsprechendes Error Handling, kann also sogar in eine View eingebaut werden
Die ersten beiden Varianten arbeiten nach dem MIC Printzip (Mist in Crash), die letztere nach dem MINO Prinzip (Mist in, Null out). Das ist auch die Ecke, an der du wahrscheinlich klebst (siehe dein Beispiel!!!)
D*B
Könnte es sein, dass der Feld-Inhalt linksbündig ausgerichtet ist und sofern der Tag nur 1-stellig ist (z.B. 1.12.2011) keine führende 0 enthält?
Könnte es auch weiter sein, dass einstellige Monate ohne führende 0 dargestellt sind?
Wenn nur ersteres zutrifft, könnte iDate noch funktionieren. Wenn beides zutrifft, wird es schwierig.
Wenn nur das erste zutrifft, musst Du halt die fehlende 0 davor setzen:
/Free
Monitor;
EvalR AlphaDate = '0' + %Trim(AlphaDate);
RealDate = %Date(AlphaDate: *EUR0);
On-Error;
//Ungültiges Datum
EndMon;
/End-Free
... das alphanumerische Datum sollte mit 8A definiert sein:
Das Problem mit der fehlenden Vornull lässt sich so lösen:
%date(%editc(%dec(DatNum:8:0):'X'):eur0)
Der Compiler ist da wohl irgendwie doof. H-Bestimmung wird ignoriert und der default für die %date-Funktion ist *ISO.
Also:
In Dezimal (8,0) konvertieren, per %editc(...:'X') in Zeichenkette umwandeln und mit explizitem *EUR0 in Datum umwandeln.
Mit Monitor solltest du das abfangen, falls kein gültiges Datum drinsteht.
Danke für die Hilfe!
Ich habe das mir jetzt so zusammengebastelt (es funktioniert sogar!)
%trim(%editw(myDat:'0 . . .'));
Und in der Datei hat das Feld ein Datumsformat mit (*EUR)