PDA

View Full Version : SQLRPLE und LEFT JOIN und ganz komisches Verhalten



ExAzubi
24-01-13, 15:51
Hallo zusammen,

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



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!

Fuerchau
24-01-13, 17:23
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).

ExAzubi
24-01-13, 18:17
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.

Fuerchau
24-01-13, 18:41
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.

ExAzubi
24-01-13, 19:31
Schade, dann werde ich mal eine Schleife machen. Und danke für den Tipp

BenderD
24-01-13, 21:01
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

B.Hauser
25-01-13, 08:15
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:

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()

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

BenderD
25-01-13, 08:31
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