Anmelden

View Full Version : Probleme mit Datumsformat in RPG



Seiten : 1 [2]

B.Hauser
30-10-04, 10:35
Hallo,

hier einige Erklärungen:

1. Wie wird ein Datums- oder Zeit-Feld definiert?
1.1. im DDS mit L für Datum, T für Zeit und Z für Zeitmarke jeweils ohne Längenangabe
1.2. in RPG mit D für Datum, T für Zeit und Z für Zeitmarke jeweils ohne Längenangabe

2. Welches Datums-Format wird in RPG verwendet?
2.1. Das Format, das in den D-Bestimmungen bei der Definition des Datums- oder Zeitfeldes im Schlüssel-Wort DATFMT angegeben wurde.
2.2. Wurde in den D-Bestimmungen das Schlüssel-Wort DATFMT nicht angegeben, gilt das Datumsformat, das im Schlüssel-Wort DATFMT in den H-Bestimmungen angegeben wurde.
2.3. Wurde das Schlüssel-Wort DATFMT weder in den D- noch in den H-Bestimmungen angegeben, wird das Datums-Format *ISO verwendet.

Für die Zeit gilt das Ganze analog nur mit dem Schlüssel-Wort TIMFMT.

Für Zeitmarken gibt es im Moment nur das ISO-Format.

3. Wie wird ein Datums-Feld initialisiert?
Im Gegensatz zu SQL kann RPG eine alphanumerische Repräsentation eines Datums oder einer Zeit als Datum oder Zeit erkennen und verwenden.

Aber es ist nicht notwendig Built-in-Funktionen zu benutzen.
Bei Datums-Feldern genügt ein D vor das Literal zu stellen. Der String muss allerdings das Format, das in den H-Bestimmungen angegeben wurde oder ,sofern das Schlüssel-Wort DATFMT nicht in den H-Bestimmungen angegeben wurde, im Format *ISO aufbereitet sein.

Beispiel:


H DATEDIT(*DMY) DatFmt(*Eur)
*--------------------------------------------------------
D DateIso S D DatFmt(*Iso) inz(D'30.10.2004')
D DateDMY S D DatFmt(*DMY-)
*--------------------------------------------------------
/Free
If DateIso >= D'15.10.2004';
Dsply DateIso;
EndIf;

DateDMY = D'30.10.2004';

If DateDMY = DateIso;
Dsply DateDMY;
EndIf;

*InLR = *On;
/End-Free


Das gilt analog auch für die Zeit-Felder. Bei Zeit-Literalen muss ein T vorangestellt werden.



/Free
MyTime = T'23:47:17';
/End-Free


Werden Zeitmarken-Literale verwendet, muss ein Z vorangestellt werden:


/Free
MyTimeStamp = Z'2004-10-30-11.33.44.000000';
/End-Free


Birgitta

WeKaSys
30-10-04, 13:58
Danke vielmals, Birgitta!

1. Es ist also das dem Literal vorangestellte D, das den Unterschied ausmacht.

2. Jetzt muß ich doch auch einmal PHP testen, aber wie verhindere ich, daß die Leerzeichen aus meinem mit Ctrl-V eingefügten Code komprimiert werden, und warum mischt er mir die Farben so durcheinander ?


1 H DatFmt(*Eur.) DatEdiT(*DMY.)
Eingabebestimmungen
DSPF
274=I *EUR.D 18 27 F2AUDT Auftragsdatum
124 D W1MIEU D DatFmt(*Eur.) Inz(D'01.01.1990')
125 D W1MXEU D DatFmt(*Eur.) Inz(D'31.12.2049')
1001 C* Datumsprüfung: Auftragsdatum
1004 C If F2AUDT <> *Loval
1005 C and (F2AUDT < W1MIEU or
1006 C F2AUDT > W1MXEU)
1007 C Eval M0MSGT = %Trim(M0MSGT) +
1008 C ' * Auftragsdatum!'
1009 C Eval *In81 = *On
1000 C EndIf


Beste Grüße
Werner.

malzusrex
03-11-05, 13:21
hmm, ich muss das thema noch einmal auf nehmen.

ich habe eine Datei mit SQL erstellt. Diese beinhaltet ein Datumsfeld.


Create Table LARS/EHStammdaten (
....
"EINDATUM" for Column EHS1BEL date not Null,
....


In einem RPG-Proggi wird diese Datei aus einer anderen befüllt. In dieser ist das Datum 8stellig num angelegt und das Datum steht in der Form JJJJMMTT darin.

Wie bekomme ich nun diese Feld elegant in das Datumsfeld ??

Gruß Ronald

Fuerchau
03-11-05, 13:55
mydate = %date(yydate:*CYMD0);

malzusrex
03-11-05, 14:18
hm, konnte ich so nicht wandeln. nur mit einem %EditC


Eval EHS1BEL = %Date(%EditC(kd1bel:'X'):*CYMD0 )


nun bekomme ich einen Datums-/Zeitmarkenfehler.
im feld kd1bel steht 19900520

Fuerchau
03-11-05, 14:45
Dann mach es mit %editw:
EHS1BEL = %Date(%EditW(kd1bel:'0____-__-__'):*ISO)

Fuerchau
03-11-05, 15:18
So klappt es:

d TestNum s 8 0 inz(19900522)
d TestDate s d

c/free
TestDate = %date(TestNum);
return;
/end-free

Der 2. Parameter von %date gibt das Ziel- und nicht das Quellformat an !!