[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Nov 2011
    Beiträge
    91

    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!

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Ich denke

    %date(%editw(%dec(MyStrDate:8:0):'0__.__.____'))

    Die "_" müssen mit Blank ersetzt werden.
    Die "0" am Anfang erzwingt die Vornull.
    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
    Mar 2002
    Beiträge
    5.365
    ... da gibt es auch was komfortableres und besseres:
    http://think400.dk/files/idate.zip

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Nov 2011
    Beiträge
    91
    Zitat Zitat von Fuerchau Beitrag anzeigen
    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...

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Wie wäre es damit:
    Code:
     /Free
        Monitor;
           RealDate = %Date(AlphaDate: *EUR0);
        On-Error;
           //Ungültiges Datum
        EndMon;
     /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

  6. #6
    Registriert seit
    Nov 2011
    Beiträge
    91
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Wie wäre es damit:
    Code:
     /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

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... 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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    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:
    Code:
     /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:
    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

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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.
    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

  10. #10
    Registriert seit
    Nov 2011
    Beiträge
    91
    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)

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Mit %trim hatte ich das dann auch probiert, aber wenn man eine Funktion sparen kann .....
    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

  12. #12
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von philsturm Beitrag anzeigen
    Und in der Datei hat das Feld ein Datumsformat mit (*EUR)
    Das Datumsformat in der Datei ist uninteressant!
    Das Datum wird als Binär-Wert gespeichert.
    Das Datumsformat in der Datei wird nur dazu verwendet um den Binär-Wert mit (alten) Tools wie WRKF oder UPDDTA sichtbar zu machen.

    ... und wenn's schon darum geht eine Funktion zu sparen, warum nicht so:
    Code:
    /Free
       RealDate = %Date(%Dec(AlphaDate: 8: 0): *EUR);
    /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

Berechtigungen

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