[NEWSboard IBMi Forum]

Thema: DatFmt in UDF

  1. #1
    Registriert seit
    Apr 2020
    Beiträge
    16

    DatFmt in UDF

    Guten Morgen,
    in der Firma in der ich aktuell arbeite werden viele Datumsfelder als sammlung von decimals behandelt. Da dadurch häufig eine Konvertierung beim zugriff auf die DB2 notwendig ist habe ich eine UDF geschrieben.

    Code:
    -- Konvertiert 3 Zahlen zu einem Datum
    create or replace function dateConverter(day decimal(2, 0), month decimal(2, 0), year decimal(4, 0)) returns date
        language sql
        fenced
        deterministic
        returns null on null input
        no external action
        not secured
        set option datFmt = *ISO
    begin
        declare returnValue date default '1940-01-01';
        -- on conversion error
        declare continue handler for sqlstate '22007' 
            return null;
        
        set returnValue = date(digits(year) || '-' || digits(month) || '-' || digits(day));
        return returnValue;
    end;
    Die Funktion arbeitet grundsätzlich korrekt, jedoch ist sie nur in der Lage Daten vom 1940-01-01 - 2039-12-31 umzuwandeln. Nach einiger Recherche habe ich herausgefunden das bei verwendung des ISO-Datumsformat daten zwischen dem 0001-01-01 - 9999-12-31 verwendet werden können. Mein Ansatz war jetzt die sql option datFmt zu setzen. Das Ergebnis ist jedoch nicht zufriedenstellend, da bei enem Datum größer 2039-12-31 immer noch NULL ausgegeben wird. Habe ich etwas vergessen?

    Vielen Dank für Ihre Hilfe.
    Gruß x00

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Die Funktion funktioniert korrekt.
    SQL arbeitet bei dem Datum immer mit der Scaliger No (einer internen laufenden Nr.).
    Das Datums-Format wird nur zur (lesbaren) Anzeige der Scaliger No verwendet.
    Welches Format verwendet wird, hängt von dem Datums-Format, das im Job/Verbindung verwendet wird.

    Ich vermute, in deiner Umgebung wird ein Datums-Format mit einem 2-stelligen Jahr verwendet. Ändere das Datums-Format im Job/Verbindung und Du wirst sehen, dass alles korrekt funktioniert.

    Wenn Du ++++++++ siehts bedeutet das lediglich, dass das Datum im aktuellen Format nicht angezeigt werden kann.

    NULL-Werte werden entweder mit einem - oder null oder überhaupt nicht angezeigt.

    Wenn Du Deine UDF debugst wirst Du feststellen, dass bei einem Datum vor 1940 oder nach 2039 der Handler nicht aktiviert wird.

    Ich habe eine ähnliche Funktion (außer, dass ich im Fehler-Fall keine NULL-Werte, sonder echte Datums-Werte ausgebe).

    Click image for larger version. 

Name:	Datum.jpg 
Views:	10 
Size:	163,0 KB 
ID:	589



    Birgitta
    Birgitta Hauser

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

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Wie Birgitta schon ausführte, die SQL-Funktion selber interessiert sich für kein Datumformat, da der Inhalt immer vom Typ DATE ist.
    Entscheidend ist hier das Datumformat deiner Programme!

    Wenn du in RPGLE als DATFMT kein EUR oder ISO verwendest sondern normal YMD oder DMY, kann dein RPG nur den eingeschränkten Datenbereich.
    Der Fehler passier dann nicht unbeding im SQL-Bereich.

    Es nützt also nichts, wenn du per "set option datfmt=*ISO" verwendest, dein RPG aber nur mit 6-stelligem Datum arbeitet. Die SQL-Variablen werden korrekt definiert (10-stellig), allerdings wird vom Precompiler ja eine Zuweisung "MyRpgDate = SQLnnnn;" generiert und da bekommst du dann einen Fehler.

    Du kannst es ganz einfach auch mit STRSQL ausprobieren.
    Setze per F13 ein Format wie DMY dann siehst die die Ausgabe als ++++++.
    Setze *ISO oder *EUR dann kommt das Format korrekt.
    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

Similar Threads

  1. DATFMT bei CREATE TABLE
    By lorenzen in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 21-03-01, 14:44

Tags for this Thread

Berechtigungen

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