[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Feb 2001
    Beiträge
    20.207

    SQL-Precompiler Fehler gefunden ?

    In meiner aufgelösten SQL-Quelle habe ich was seltsames festgestellt:

    Code:
    //*                exec sql select max(PLDAT), sum(PLMENG)       
    //*                           into :Wareneingangsdatum :Null1    
    //*                               ,:Wareneingangsmenge :Null2    
    //*                           from D060                          
    //*                          where PLBBNR   = :D242.BBNR         
    //*                            and PLABNR   = :D242.BBABNR       
    //*                            and PLPONR   = :D242.BBPONR       
    //*                         ;                                    
              SQL_00128 = D242.BBNR;                                 
              SQL_00129 = D242.BBABNR;                               
              SQL_00130 = D242.BBPONR;                               
              SQLER6 = -4;                                           
              SQLROUTE_CALL(                                         
                   SQLCA                                             
                 : SQL_00123                                         
              );                                                     
              IF SQL_00126 = '1';                                    
              IF SQL_00132 >= 0;                                     
              EVAL WARENEINGANGSDATUM = SQL_00131;                   
              ENDIF;                                
              EVAL NULL1 = SQL_00132;               
              EVAL WARENEINGANGSMENGE = SQL_00133;  
              EVAL NULL2 = SQL_00134;               
              ENDIF;
    Man beachte: Wenn der Nullanzeiger vom WARENEINGANGSDATUM >= 0 ist, nur dann wird das WARENEINGANGSDATUM gesetzt.
    Warum wird dann das Feld WARENEINGANGSMENGE immer gesetzt?

    SQL_00131 enthält nämlich dann den 01.01.0001.
    Durch die NULL-Abfrage des Precompilers enthält aber WARENEINGANGSDATUM den vorherigen Wert, während WARENEINGANGSMENGE auf 0 gesetzt wird.

    Seltsam....
    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

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Man sollte die Ausgabe-Felder immer zunächst initialisieren bzw. nach dem SQL-Statement zunächst die Indikator-Variablen prüfen und dann die Ausgabe-Felder entsprechend initialisieren.

    Auszug aus der IBM Dokumentation:
    Always test the indicator variable first. If the value of the indicator variable is less than zero, you know the value of the result column should not be used. When the database manager returns a null value, the host variable might or might not be set to the default value for the result column's data type (0 for numeric, blanks for fixed length character, etc).
    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
    Das ist mir schon klar, dass ich NULL-Indikatoren abfragen muss.
    Ich finde nur die Ungleichbehandlung fragwürdig.
    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

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Das ist mir schon klar, dass ich NULL-Indikatoren abfragen muss.
    Ich finde nur die Ungleichbehandlung fragwürdig.
    ... dir fehlts am Wohlwollen, statt begeistert zu sein, dass da was richtig gemacht wurde, mäkelst du rum, damit hat dich IBM nicht lieb.

    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/

  5. #5
    Registriert seit
    Jan 2003
    Beiträge
    746
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Das ist mir schon klar, dass ich NULL-Indikatoren abfragen muss.
    Ich finde nur die Ungleichbehandlung fragwürdig.
    Kein Mensch muss müssen...

    PHP-Code:
    exec sql select coalescemax(PLDAT), '01.01.0001') , 
                    
    coalescesum(PLMENG), 0) ,
                    
    count(*)                
               
    into :Wareneingangsdatum
                   
    ,:Wareneingangsmenge
                   
    ,:Gefunden               
               from D060                          
              where PLBBNR   
    = :D242.BBNR         
                
    and PLABNR   = :D242.BBABNR       
                
    and PLPONR   = :D242.BBPONR 

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Dies funktioniert leider nicht, wenn der Select keine Daten findet;-).
    Da die Felder selber kein NULL erlauben, ist das Coalesce hier sinnlos.

    Wenn schon, dann muss man den Coalesce außerhalb machen, allerdings erlaubt ein scalarer Subselect nur 1 Ergebnisfeld, die Abfrage müsste also 2 Mal gemacht werden.

    exec sql values(coalesce((select f1 ....), Default), coalesce((select f2 ....), Default)) into ...

    Man könnte es auch als Left join machen:

    with EinSatz as (
    values (1)
    )
    select coalesce(f1, default), coalesce(f2, default) from EinSatz
    left join (
    select max(f1) f1, sum(f2) f2 from MyTable
    where ...
    ) x on 1=1

    Vielleicht hat Birgitta da noch mehr Ideen;-).

    Klar kann ich vor dem SQL einen CLear machen. Allerdings läuft auf den SQL-Variablen ebenso ein Clear so dass der 1. Clear (Micro-Optimierung) unnötig ist.
    Die NULL-Indikatoren werden doch nur benötigt um nicht haufenweise Joblogs zu produzieren die die Maschine vollmüllen (auch ohne Debugmodus!).

    Bei obigem SQL sollte ein SQLCODE 100 eigentlich vollkommen ausreichen;-).
    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

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... wie wärs mit create view mit group by?
    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
    Feb 2001
    Beiträge
    20.207
    Da ich ja eine eindeutige Where-Klausel habe, brauche ich ja keinen Group By.
    Außerdem löst das ebenso nicht das Problem bei No Data, ich bräuchte auch entsprechend mehr NULL-Inds.
    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
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Da ich ja eine eindeutige Where-Klausel habe, brauche ich ja keinen Group By.
    Außerdem löst das ebenso nicht das Problem bei No Data, ich bräuchte auch entsprechend mehr NULL-Inds.
    ... die view tauscht dir die nullvalues gegen den sqlcode 100

    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/

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Dann könnte das mit
    select * from (select max....)
    klappen.
    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
    Mar 2002
    Beiträge
    5.286
    ... CTE reicht auch schon:

    with d as (select max(PLDAT) maxpldat, sum(PLMENG) sumplmeng
    from D060
    group by (PLBBNR, PLABNR, PLPONR))
    select maxpldat, sumplmeng
    from d
    where ....

    und dann kommt sqlcode 100 statt eines Satzes mit Nullvalues.

    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/

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Dann könnte das mit
    select * from (select max....)
    klappen.
    ... der casus knaxus ist, dass die where clause in den äußeren select wandert.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. SQL-Precompiler mitten in einer DCL-DS
    By prsbrc in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 16-07-19, 07:44
  2. SQL-Precompiler
    By DKSPROFI in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 19-10-17, 07:54
  3. Nutzung von **free RPG und SQL Precompiler wirft Fehler?
    By Dominic K. in forum NEWSboard Programmierung
    Antworten: 21
    Letzter Beitrag: 14-09-16, 16:43
  4. Antworten: 4
    Letzter Beitrag: 23-02-16, 12:15
  5. Zufällig gefunden
    By KingofKning in forum NEWSboard Server Job
    Antworten: 6
    Letzter Beitrag: 11-11-14, 19:26

Berechtigungen

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