[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    425
    ok, das ISO kam aber später oder??

    (Danke)

  2. #2
    Registriert seit
    Sep 2005
    Beiträge
    425

    Fast gut

    leider gibt es auch jjjj mm und tt Felder die leer sind.
    Um das abzufangen habe ich nun

    Code:
    SELECT dec(coalesce(replace(char( date(digits(jjjj) CONCAT '-'   
    CONCAT digits(mm) CONCAT '-' CONcat digits(tt))-5 DAYS ,   
    iso), '-', ''), 0), 8, 0) AS DATUM, jjjj*10000+mm*100+tt 
    FROM datei
    drumherum gebaut

    das bringt aber bei den leeren jjjj Feldern zrotzdem in der Anzeige nur +++++

  3. #3
    Registriert seit
    Sep 2005
    Beiträge
    425

    auch in Birgittas version

    Code:
    SELECT Dec(coalesce(VarChar_Format(Timestamp(Digits(jjjj) concat  
    Digits(mm) concat Digits(tt) concat '000000')+ 5 Days ,     
    'YYYYMMDD'), 0), 8, 0) , jjjj*10000+mm*100+tt FROM datei

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Ungültige Daten kann man da leider nicht in ein Datum umsetzen, dass kannst du nur mit einem Case-Ausdruck eingrenzen.

    Zusätzlich passiert ja noch folgendes:
    Im STRSQL, also Dialog, schafft SQL es diese Daten dann zu überlesen.
    Im embedded SQL geht das nur, wenn du NULL-Anzeiger verwendest, ansonsten kommt ein Fetch nicht über den fehlerhaften Satz hinaus.

    Solange du sicher sein kannst, dass in den Daten, wenn sie <> 0 sind, nur gültige Daten drinn stehen, kannst du einen Case-Ausdruck verwenden:

    case
    when JJJJ <> 0 and MM <> 0 and TT <> 0
    then DateAusdruck
    else NULL
    end

    Auch hier benötigst du natürlich bei embedded SQL einen NULL-Anzeiger.

    PS:
    ISO kam tatsächlich erst beim Edit, das das Datumformat bei mir in STRSQL immer auf *ISO steht.
    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

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Ach übrigens:

    man kann auch folgendes kodieren:

    date('0001-01-01') + (JJJJ - 1) years + (MM - 1) months + (TT - 1) days

    Das liefert dir dann immer ein gültiges Datum.
    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

  6. #6
    Registriert seit
    Sep 2005
    Beiträge
    425
    Sowas hatte ich auch kurz überlegt aber ...
    knallt der nicht, wenn ich - 5 days rechne ?

    Der ILEMax

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Nun ja, dann nimm ein anderes Jahr und rechne dieses wieder runter:

    date('1900-01-01') + (case JJJJ when 0 then 0 else -1900 end) years + (MM - 1) months + (TT - 1) days

    Ob das dann ein sinnvolles Datum ist ...
    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

  8. #8
    Registriert seit
    Sep 2005
    Beiträge
    425
    knallt auch ....

    Code:
    SELECT dec(coalesce(replace(char( date('0001-01-01') +           
    (dec(digits(jjjj), 4, 0)-1) years +                              
    (dec(digits(mm), 2, 0)-1) month +                                
    (dec(digits(tt), 2, 0)-1) days - 5 days, iso                     
    ), '-', ''), 0), 8, 0) AS DATUM, jjjj*10000+mm*100+tt from datei

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Da machst du doch einiges zu viel.
    Die Felder JJJJ, MM, TT sind doch numerisch!!!
    Was soll das Casten auf Char und DEC?
    Und coalesce hilft dir da nicht, da die Berechnung nicht NULL ergibt sondern einen Fehler.

    Versuch es doch mal mit meinem Bespiel.
    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
    Feb 2001
    Beiträge
    20.696
    Ich hatte mir da mal was gebastelt:

    <code>
    CREATE FUNCTION USMOD_16/DATESERIAL
    (YEAR INTEGER,
    MONTH INTEGER,
    DAY INTEGER)
    RETURNS DATE
    LANGUAGE RPGLE
    EXTERNAL NAME 'USMOD_16/DATSER'
    DETERMINISTIC
    RETURNS NULL ON NULL INPUT
    NO SQL
    NO EXTERNAL ACTION
    PARAMETER STYLE SQL
    ALLOW PARALLEL
    NOT FENCED

    hactgrp(*caller) dftactgrp(*no) datfmt(*iso)

    d SYear s 10I 0
    d SMonth s 10I 0
    d SDay s 10I 0

    d SQLDate s d
    d SYear_Ind s 5I 0
    d SMonth_Ind s 5I 0
    d SDay_Ind s 5I 0

    d SQLDate_Ind s 5I 0
    d SQLState s 5
    d FuncName s 139 varying
    d SpecName s 128 varying
    d DiagMsg s 70 varying

    c *entry plist
    c parm SYear
    c parm SMonth
    c parm SDay
    c parm SQLDate
    c parm SYear_Ind
    c parm SMonth_Ind
    c parm SDay_Ind
    c parm SQLDate_Ind
    c parm SQLState
    c parm FuncName
    c parm SpecName
    c parm DiagMsg
    c*
    c/free
    if SYear_ind <> *zero
    or SMonth_ind <> *zero
    or SDay_ind <> *zero;
    SQLDate_ind = -1; // Ergebnis ist NULL
    else;
    monitor;
    SQLDate = %date('0001-01-01')
    + %Years(SYear-1)
    + %Months(SMonth-1)
    + %Days(SDay-1);
    on-error *all;
    SQLDate_ind = -1; // Ergebnis ist NULL
    endmon;
    endif;
    /end-free
    c*
    c return
    </code>

    Man kann das auch alles native in einer SQL-Prozedur kodieren.

    Der Aufruf erfolgt dann in SQL so:

    dateserial(JJJJ, MM, TT + n)

    Bei Fehlern wird halt NULL geliefert.
    Kleine Schmankerln:

    1. des Monats: dateseriel(JJJJ, MM, 1)
    Letzter des Monats: dateseriel(JJJJ, MM+1, 0)
    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

  11. #11
    Registriert seit
    Sep 2005
    Beiträge
    425
    ja, danke
    da war wohl was mit dem Wald und den Bäumen ...

    habe dein

    date('1900-01-01') + (case JJJJ when 0 then 0 else -1900 end) years + (MM - 1) months + (TT - 1) days

    in
    date('1900-01-01') + (case JJJJ when 0 then 0 else jjjj-1900 end) years + (MM - 1) months + (TT - 1) days

    geändert, dann geht es

    nicht schön, aber selten ...

    Danke
    der ILEMax

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Gegen Tippfehler ist ja niemand gefeit .
    Und was das selten angeht: wenn mans braucht ?
    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. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL und OBJLCK
    By malzusrex in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 19-09-06, 11:04
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  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
  •