[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2005
    Beiträge
    385

    SQLRPLE und LEFT JOIN und ganz komisches Verhalten

    Hallo zusammen,

    ich eine ein SQL Statement mit einem LEFT JOIN.
    Die gefunden Sätze werden per

    Code:
      FETCH C1 FOR 9999 ROWS INTO :DSSATZ
    in die Datenstruktur gesetzt.
    Der erste Satz hat jetzt nicht alle Felder füllen können, da in der inneren Datei kein Satz gefunden worden ist.

    Allerdings ist die DS ab dem Satz dahinter leer obwohl noch weitere Sätze vorhanden sind.
    Wenn ich das gleiche SQL-Statement per STRSQL ausführe, bekomme ich alle Sätze angezeigt, einzig im RPGLE wird nur der erste Satz in die DS gesetzt?

    Was kann / muss ich machen, damit alle gefundenen Sätze in die DS gesetzt bekomme?

    Danke an alle Helfenden!

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.245
    Bei Vorkommen von NULL-Werten benötigst du natürlich auch NULL-Anzeiger.
    Bei verwendung einer Struktur beim Fetch brauchst du ein Array von NULL-Anzeigern:

    D MyDs DS
    D F1 ...
    D F2 ...

    D MyNulls S 5I 0 dim(Anzahl Felder)

    exec sql fetch MyCursour into : MyDS :MyNulls;

    Beachte bitte: kein Komma zwischen den Feldern beim Fetch.

    In den NULL-Anzeigern erfährst du dann, ob das Feld gefüllt wurde (hier ist leider abzählen angesagt).
    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
    Apr 2005
    Beiträge
    385
    Was mir ein wenig Spanisch vorkam ist aber das nicht alle Datensätze aus der Datei in die DS geladen worden sind. Wenn ich den OCCUR dann auf das zweite vorkommen mache, ist dann der Datensatz in der DS drinnen, oder muss ich vorher noch was machen?

    Aber trotzdem vielen Dank.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.245
    Den Fetch 9999 habe ich übersehen, mit NULL-Werten dürfte das nicht klappen, da du kein 2-dimensionales NULL-Array angeben kannst.
    Du musst wohl die Sätze einzeln mit Fetch laden und deinen OCCUR selber machen.
    Performancemäßig macht das keinen Unterschied.
    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
    Apr 2005
    Beiträge
    385
    Schade, dann werde ich mal eine Schleife machen. Und danke für den Tipp

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Den Fetch 9999 habe ich übersehen, mit NULL-Werten dürfte das nicht klappen, da du kein 2-dimensionales NULL-Array angeben kannst.
    Du musst wohl die Sätze einzeln mit Fetch laden und deinen OCCUR selber machen.
    Performancemäßig macht das keinen Unterschied.
    Hier irrt Baldur, was nicht sehr häufig ist.
    - mit SQLDA geht das schon
    - ein einfacher Work around mit coalesce im Select statement tut es in den meisten Fällen auch
    - block fetch ist für read only Verarbeitung signifikant schneller (ein fetch von 999 Sätzen dauert meist gleichlang wie ein einzelner fetch)
    - eingeholt wird das erst bei updates, da ist der positioned wieder mächtig im Vorteil

    Ansonsten sollte man sich von den Altlasten occur trennen und dim verwenden

    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/

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    Hier haben sich wohl einige vergaloppiert!

    Indikator-Datenstrukturen können sowohl mit Mehrfach-Datenstrukturen (Schlüsselwort OCCURS) als auch Array-Datenstrukturen (Schlüsselwort DIM) verwendet werden!

    1. Occurs:
    Code:
    D DSCsrC1         DS                  Occurs(50) Inz       
    D   CsrC1Kunde                  15A                        
    D   CsrC1ArtNr                  22A                        
    D   CsrC1Umsatz                 11P 2                      
                                                               
    D DSIndC1         DS                  Occurs(50) Inz       
    D   Ind                          5I 0 dim(3)            
     *------------------------------------------------------
     /Free
        Exec SQL Declare CsrC1 Cursor For Select ... ;
        Exec SQL Open CsrC1;
        EXEC SQL Fetch Next From CsrC1 For  50 Rows       
                            into :DSCsrC1  :DSIndC1;
    2. Dim()
    Code:
    D DSCsrC1         DS                  Dim(50)  Qualified  Inz    
    D   CsrC1Kunde                  15A                           
    D   CsrC1ArtNr                  22A                           
    D   CsrC1Umsatz                 11P 2                         
                                                                  
    D DSIndCsrC1      DS                  Dim(50)  Qualified  Inz    
    D   Ind                          5I 0 Dim(3)                  
     /*--------------------------------------------------------
     /Free
        Exec SQL Declare CsrC1 Cursor For Select ... ;
        Exec SQL Open CsrC1;
        EXEC SQL Fetch Next From CsrC1 For  50 Rows       
                            into :DSCsrC1  :DSIndCsrC1;
    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

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Hier haben sich wohl einige vergaloppiert!

    Indikator-Datenstrukturen können sowohl mit Mehrfach-Datenstrukturen (Schlüsselwort OCCURS) als auch Array-Datenstrukturen (Schlüsselwort DIM) verwendet werden!
    Birgitta
    ... wer lesen kann ist klar im Vorteil! hat niemand behauptet, dass das nicht geht, aber längst nicht alles was geht, ist auch von Vorteil, insbesondere bei RPG nicht.

    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/

Similar Threads

  1. dynamisches Group by funktioniert nicht
    By Tobse77 in forum NEWSboard Programmierung
    Antworten: 12
    Letzter Beitrag: 24-09-09, 08:31
  2. SQL: View + left join + sortierung
    By muadeep in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 15-01-09, 10:30
  3. SQL left join
    By ahingerl in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 08-12-06, 08:28
  4. SQL - Join mit Bedingung und Update
    By cassi in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 22-11-06, 15:03
  5. QMQRY LEFT OUTER JOIN
    By Matthias.Hayn in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 06-12-04, 13:33

Berechtigungen

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