[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Jan 2004
    Beiträge
    24

    Angry Probleme mit Datumsformat in RPG

    Hallo Leute,

    Ich habe in der extern beschriebenen PF ein Datumsfeld mit L (10 Stellen) deklariert.

    Es gelingt mir nicht, dieses Feld aus RPG zu füllen, egal wie ich die Aufbereitung auch dort versuche reinzustellen - ich bekomme beim Ablauf permanent einen E/A Fehler.

    Es wäre super, wenn mir jemand einen Tipp geben kann!

    Vielen Dank

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Das Datumsformat wird in der H-Bestimmung beschrieben oder als Erweiterung in der D-Bestimmung (das Standardformat sieht man ggf. in der Umwandlung).

    h datfmt(*iso)
    d myDate L [datfmt(*iso)]

    c/free
    myDate = '2004-07-21';
    /end-free

    In RPG (OPM) werden Datumsfelder nicht unterstützt !
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Jan 2004
    Beiträge
    24
    Das heisst: Ich kann mit einem Datumsfeld, was extern in einer DDS mit "L" beschrieben ist nur in ILE RPG etwas anfangen? Auch nicht wenn ich das RPG-Programm mit CVTOPT(*DATETIME) umwandle?

    Grüße

  4. #4
    Registriert seit
    Jun 2004
    Beiträge
    26
    Hallo,



    doch, schon. Ist das Datumsformat z.B. *EUR, so wird das Feld im RPG III als 10-stellig alpahnumerisch gehandhabt. Allerdings muss penibel darauf geachtet werden, dass nur gültige Datumswerte bei einem WRITE oder UPDAT eingetragen werden. *BLANKS ist z.B. kein gültiger Wert, aber z.B. "01.01.0001". Mit "31.02.2004" wirst Du auch Pech haben.
    D.h. ein CLEAR aufs Satzformat und dann ein WRITE ohne füllen der Datumsfelder => Pustekuchen. Auch wenn Du das Datumsfeld in einer Schlüsselliste hasst, muss z.B. bei einem SETLL das Schlüsselfeld mit einem gültigen Datumswert initialisiert sein, sonst rappelts im Karton.

    Wir verwenden dazu z.B. für Dialogeingaben so ein selbstgestricktes Prüfprogramm, welches die semantische Korrektheit einer abzuspeichernden Eingabe prüft. Leere Satzformate initialisieren wir in Copy-Strecken mit einer Konstanten '01.01.0001' als "*LOVAL". Diese werden bei Dateierstellungen/-erweiterungen um Datumsfeldern dieser Art neu generiert, damit wir auch ja kein Datumsfeld vergessen.

    Falls Du nicht weisst, welches Format das Datumsfeld überhaupt hat, dann probiere ein INZPFM auf die leere Datei mit TOTRCDS(1). Der stellt Dir einen initialisierten Satz mit dem aktuellen Datum für das Feld dort rein, sofern kein anderer Default-Wert für das Feld angegeben wurde. In diesem Format müssen dann auch die einzutragenden Daten sein.

    Tja, und rechnen/vergleichen im RPG III und Datumsfeldern ist nicht, da Alphafelder, also Vergleiche durch Drehen ermöglichen oder am besten externes Programm konsultieren.

    mfG Dufti

  5. #5
    Registriert seit
    Jan 2004
    Beiträge
    24
    Danke auch dir Dufti!
    Werd ich mal probieren...
    Eine Deklaration mit nur L ohne *EUR geht wohl dann nicht?
    Oder stellt mir RPG dann auch ein 10-stellig alpahnumerisches Feld zur Verfügung, was ich z.B. mit 2004-07-20 füllen müsste? Das hatte ich nämlich schon probiert und ging nicht.

    Grüße Strickistracki

  6. #6
    Registriert seit
    Jun 2004
    Beiträge
    26
    Zitat Zitat von strickistracki
    Danke auch dir Dufti!
    Werd ich mal probieren...
    Eine Deklaration mit nur L ohne *EUR geht wohl dann nicht?
    Oder stellt mir RPG dann auch ein 10-stellig alpahnumerisches Feld zur Verfügung, was ich z.B. mit 2004-07-20 füllen müsste? Das hatte ich nämlich schon probiert und ging nicht.

    Grüße Strickistracki
    Ohne *EUR geht das sicher genauso, nur eben entsprechendes Format. Sollte jedenfalls. Ich bin mir fast sicher. Ich habs nicht ausprobiert, aber da Wette ich nen Kasten Bier drauf. Du hast sicher irgendwas vergessen. Setz nen Debugger vor den Satzupdate und schau Dir die Datumsfelder an. Da steht dann sicher noch was falsches drin.

    Gruß, Dufti

  7. #7
    Registriert seit
    Jan 2004
    Beiträge
    24
    Vielen Dank, ich hatte ein Datumsfeld übersehen - jetzt funktioniert es wie beschrieben!

    Grüße

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Noch ein Hinweis:
    In RPG hängt das Datumsformat zur Laufzeit vom JOB-Wert ab (in Deutschland meist *DMY). Änderst du das Jobformat, ändert sich auch die Darstellung des DATE-Feldes !
    Es spielt dabei keine Rolle wie das Datumformat innerhalb der Datei definiert ist da beim Lesen bzw. Schreiben eine Umsetzung erfolgt.
    In ILE-RPG hast du aber genaue Kontrolle über das Datum-Format !

    Ich bin damit auch schon auf die Schnautze gefallen weil der Kunde für seine Amerikaner nun mal das Datumformat auf *MDY umstellt.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Jan 2004
    Beiträge
    24
    Danke, werd ich hoffentlich dran denken, wenn ich mal vor diesem Problem stehe.

    Grüße

  10. #10
    Registriert seit
    Sep 2004
    Beiträge
    23

    Ich hab da auch so meine Probleme ... gehabt?

    Hallo zusammen!

    1. Frage: Wo kann ich denn das Format 'L' zuweisen? Ist es nicht so, daß man 'D' oder 'T' in den Sourcebestimmungen definiert und dies erst beim Umwandeln zum Datenformat 'L' gemacht wird?

    Und nun mein größeres Problem: Mir gelingt es nicht, ein Datumsfeld mit einem Literal zu vergleichen oder dem Datumsfeld ein Literal zuzuweisen, z.B.

    H DatFmt(*Eur.)
    D W1AUDT D DatFmt(*Eur.)
    C Eval W1AUDT='30.10.2004'

    Das meckert der Compiler wegen unterschiedlicher Formate an!
    Erst über ein numerisches und ein Datums-Hilfsfeld
    und unter Anwendung der Funktion %Date ist es mir gelungen,
    mein Datum mit einem festen Wert zu vergleichen.

    Geht das nicht auch einfacher?

    Mit herzlichen Grüßen aus Hamburg
    Werner

    Hier sind die betreffenden Stellen aus der Umwandlungsliste
    (es handelt sich um ein SQLRPGLE-Programm):

    1. Versuch:
    5722WDS V5R2M0 020719 RN IBM ILE RPG EX1WRK/LG0010R TLZ2 30.10.04 04:26

    1 H DatFmt(*Eur.) DatEdiT(*DMY.)

    DSPF
    274=I *EUR.D 18 27 F2AUDT Auftragsdatum

    983 C* Datumsprüfung: Auftragsdatum
    984 C If F2AUDT <> *Loval
    985 C and (F2AUDT < '01.01.1990' or
    986 C F2AUDT > '31.12.2050')
    987 C Eval M0MSGT = %Trim(M0MSGT) +
    988 C ' * Auftragsdatum!'
    989 C Eval *In81 = *On
    990 C EndIf

    *RNF7421 30 985 068200 Operanden sind mit der Art des Operators nicht kompatibel.
    *RNF7421 30 986 068300 Operanden sind mit der Art des Operators nicht kompatibel.
    2. Versuch:

    1 H DatFmt(*Eur.) DatEdiT(*DMY.)

    124 D W1MIEU D DatFmt(*Eur.)
    125 D W1MXEU D DatFmt(*Eur.)

    991 C* Datumsprüfung: Auftragsdatum
    992 C Eval W1MIEU = '01.01.1990'
    993 C Eval W1MXEU = '31.12.2050'
    994 C If F2AUDT <> *Loval
    995 C and (F2AUDT < W1MIEU or
    996 C F2AUDT > W1MXEU)
    997 C Eval M0MSGT = %Trim(M0MSGT) +
    998 C ' * Auftragsdatum!'
    999 C Eval *In81 = *On
    1000 C EndIf

    *RNF7416 30 992 068900 Die Arten der Operanden auf der rechten und linken Seite des Ausdrucks in der Operation EVAL stimmen nicht überein.
    *RNF7416 30 993 069000 Die Arten der Operanden auf der rechten und linken Seite des Ausdrucks in der Operation EVAL stimmen nicht überein.
    3. Versuch:

    1 H DatFmt(*Eur.) DatEdiT(*DMY.)

    122 D W1MIND 8 0 Inz(01011990)
    123 D W1MAXD 8 0 Inz(31122049)
    124 D W1MIEU D DatFmt(*Eur.)
    125 D W1MXEU D DatFmt(*Eur.)

    So klappt es:
    1001 C* Datumsprüfung: Auftragsdatum
    1002 C Eval W1MIEU = %Date(W1MIND:*Eur)
    1003 C Eval W1MXEU = %Date(W1MAXD:*Eur)
    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
    1010 C EndIf



    Zitat Zitat von Fuerchau
    Das Datumsformat wird in der H-Bestimmung beschrieben oder als Erweiterung in der D-Bestimmung (das Standardformat sieht man ggf. in der Umwandlung).

    h datfmt(*iso)
    d myDate L [datfmt(*iso)]

    c/free
    myDate = '2004-07-21';
    /end-free

    In RPG (OPM) werden Datumsfelder nicht unterstützt !
    Werner Kakuschky

  11. #11
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    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:
    PHP-Code:
    H DATEDIT(*DMYDatFmt(*Eur)             
     *--------------------------------------------------------
    D DateIso         S               D   DatFmt(*Isoinz(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.

    PHP-Code:
     /Free
         MyTime 
    T'23:47:17';
     /
    End-Free 
    Werden Zeitmarken-Literale verwendet, muss ein Z vorangestellt werden:
    PHP-Code:
     /Free
        MyTimeStamp 
    Z'2004-10-30-11.33.44.000000';
     /
    End-Free 
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  12. #12
    Registriert seit
    Sep 2004
    Beiträge
    23

    Thumbs up Kaum macht man's richtig - dann klappt's!

    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 ?
    PHP-Code:
       1 H DatFmt(*Eur.) DatEdiT(*DMY.)
    Eingabebestimmungen
    DSPF
     274
    =*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 CDatumsprüfungAuftragsdatum
    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.
    Werner Kakuschky

Similar Threads

  1. RPG: Client Infos lesen?
    By robertki in forum NEWSboard Programmierung
    Antworten: 25
    Letzter Beitrag: 19-01-07, 08:42
  2. Problem mit Java-Methoden Aufruf aus ILE RPG?
    By Stoeberl in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 10-01-07, 10:58
  3. RPG goes Web
    By jth in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 21-12-06, 11:13
  4. Keine Probleme mit Parametern
    By harkne in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 01-06-06, 12:42
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •