[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    May 2004
    Beiträge
    470

    SQLRPG Nullindikator

    Hallo zusammen,

    Ich habe eine Datei mit Datumsfelder in denen NULL-Werte zulässig sind.

    Ich habe im RPG ein SQL ausgeführt und habe mich zunächst gewundert dass ich keine Daten bekommen habe. Bis ich gelesen habe dass ich ein Array brauche welches die Null-Werte empfängt

    Ich habe jetzt also folgende D-Bestimmungen

    PHP-Code:
    DName+++++++++++ETDsVon++++Bi/L+++IDG.Schl}sselw¦rter+++++
    d W@CDICTLP     E DS                  EXTNAME(CDICTLPINZ
    ** 
    d Ary@NulInd      s              5i 0 dim(256
    Meine SQL-Routine sieht wie folgt aus:

    PHP-Code:
    0806.51 **                                                           
    0806.52 c/exec sql                                                   
    0806.53 c
    PREPARE S1 FROM :w@SqlString                              
    0806.54 c
    /end-exec                                                   
    0806.55 
    **                                                           
    0806.56 c/exec sql                                                   
    0806.57 c
    + DECLARE C1 CURSOR FOR S1                                  
    0806.58 c
    /end-exec                                                   
    0806.59 
    **                                                           
    0806.60 c/exec sql                                                   
    0806.61 c
    OPEN C1                                                   
    0806.62 c
    /end-exec                                                   
    0806.63 
    **                                                           
    0806.65 **                                                           
    0806.66 c/exec sql                                                   
    0806.67 c
    WHENEVER NOT FOUND GOTO Sb32SqlDlcE                       
    0806.68 c
    /end-exec                                
    0806.70 c
    /exec sql                                         
    0806.71 c
    FETCH NEXT FROM C1 INTO :W@CDICTLP :Ary@NulInd  
    0806.72 c
    /end-exec 
    Jetzt hab ich gelesen wenn ich z.B. mein Datumsfeld (13. Feld in der Datei) auf NULL abfragen möchte muss ich auf das 13. Element im Array Ary@NulInd abfragen.
    Das würde ja auch bedeuten wenn sich die Datei ändert und man ein Feld vor dem Datumsfeld einfügt dass man daran denken muss und die Array-Elemente anpassen muss.

    Jetzt meine Frage.

    Kann man dies auch irgendwie eleganter lösen, oder bleibt mir dann nur übrig auf den tatsächlichen Wert im Feld z.B. '01-01-0001' zu prüfen ?

    Vielen Dank für die Hilfe

    Viele Grüße Harald

  2. #2
    Registriert seit
    Apr 2005
    Beiträge
    385
    Hallo,

    wichtiger Unterschied

    '01-01-0001' ist kein NULL-Wert sondern quasi das *LOVAL des Datumwertes. Daher wird dir eine Abfrage auf NULL nichts bringen, sondern nur auf *LOVAL.

    In der DB2 werden bei Datumsfelder (leg keine hand in Feuer ) NULL Werte auf den *LOVAL Wert gesetzt.

    Was du aber bei allen Feldern machen kannst, ist eine Abfrage auf
    %NULLIND

    IF %NULLIND(FELDNAME)
    ....
    ENDIF

    Daher brauchst du keine Reihenfolge zu wissen und du kannst das richtige Feld immer sauebr verarbeiten

  3. #3
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Hallo,
    %NULLIND(FELDNAME) funktioniert nur mit Native I/O und der H-Spec
    Code:
    H ALWNULL(*USRCTL)
    In der DB2 gibt es auch für Datumsfelder NULL-Values.
    Liest du mit Fetch den nächsten Satz ein und enthält diese Spalte einen NULL-Value, dann wird die Datums-Variable NICHT verändert, sondern eben nur ein Kennzeichen im Indikator-Feld gesetzt.
    Das '01-01-0001' was du erhälst, stand sicher auch schon vor dem Fetch drinnen.
    Wichtig ist nur, vor jedem Fetch auch ein CLEAR der Datenstruktur gemacht wird. Sonst passiert es, dass du den Wert des vorherigen Satzes prüfst.
    Wenn du nicht vorher den Indikator prüfst.

    lg Andreas

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von harkne Beitrag anzeigen
    Jetzt hab ich gelesen wenn ich z.B. mein Datumsfeld (13. Feld in der Datei) auf NULL abfragen möchte muss ich auf das 13. Element im Array Ary@NulInd abfragen.
    Das würde ja auch bedeuten wenn sich die Datei ändert und man ein Feld vor dem Datumsfeld einfügt dass man daran denken muss und die Array-Elemente anpassen muss.
    ... und wieder ein Grund warum man es unbedingt vermeiden sollte alle Felder mit SELECT * auszuwählen, sondern explizit nur die, die auch tatsächlich gebraucht werden!

    ... bei einer Datei-Änderung müsstest Du bei der Verwendung von SELECT * und Ausgabe in eine externe Datenstruktur zumindest Dein Programm umwandeln.

    ... bei einer expliziten Auswahl hätte man die Chance einen NULL-Wert mit der Skalaren Funktion COALESCE in einen Default-Wert umzuwandeln.

    ... und bei einer Datei-Änderung würde nichts passieren.

    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

  5. #5
    Registriert seit
    May 2004
    Beiträge
    470
    Vielen Dank für die Antworten.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Bei Select * ist keine Programmumwandlung erforderlich, da der Compiler die aktuellen Struktur feststellt und einen entsprechenden SQL generiert.
    Eine nachträgliche Änderung des Programmes weil sich die Datei ändert ist nicht erforderlich.

    Aber es ist immer besser (aber eben Tiparbeit) jedes Feld zu benennen.
    Somit kann man beim Fetch gezielt für jedes Feld den NULL-Indikator definieren:

    fetch MyCursor into
    : F1 : NullF1
    , : F2 : NullF2
    , ...

    Man beachte, dass der NullIndikator ohne Komma auf das Feld folgt.
    Felder, die nie NULL enthalten können bedürfen auch kein Null-Indikator.
    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. SQLRPG Debug
    By olbe in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 24-07-07, 14:48
  2. CRTBNDRPG OPTION(*NODEBUGIO) für SQLRPG
    By harkne in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 27-06-07, 12:09
  3. SQLRPG
    By muadeep in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 28-06-05, 13:17
  4. Dateifreigabe bei SQLRPG
    By Wiezorek in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 16-10-01, 12:03
  5. SQLRPG
    By Ursus in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 13-08-01, 07:05

Berechtigungen

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