View Full Version : Anzeigervariable im SQLRPGLE
Hallo Kollegen,
ich habe ein Problem mit meinem SQLRPGLE.
Benutze folgende DS
D BANK00 DS
D BANKKT 1 15
D BLZ2 16 23
D SKONTO 24 25P 2 INZ(0,00)
D SKTB 26 27P 2 INZ(0,00)
D VORPRO 28 30P 3 inz(0,000)
D VORFUE 31 31
D GUELT3 32 41
wenn ich jetzt mit SQL die Datenstruktur fülle, bekomme ich immer ein SQL-Fehler 305.
Ich lese eine Datei per Sql aus, über select übertrage ich mehrere Felder mit INTO in die DS BANK00 das Feld(BLZ) in meiner Datei ist NULL. Beim Programmlauf bekomme ich Fehler 305 (Anzeigervariable benutzen), aber wir baue ich soetwas in meine DS ein ?
Vielleicht kann mir einer einen Tip geben !
In einem solchen Fall brauchst du ein Anzeiger-Array:
d AnzArray 5I 0 dim(nn)
wobei nn midestens der Anzahl der Felder der Struktur sein muss.
dann "fetch cursor into :bank00 :AnzArray" oder "select ... into :Bank00 :AnzArray ..."
AnzArray(1) ist der Anzeiger für das 1. Feld
AnzArray(2) ist der Anzeiger für das 2. Feld
usw.
Inhalt:
0 = OK
-1 = NULL
-2 = Datenverlust (abgeschnitten)
Ansonsten auch jedes Feld einzeln mit Anzeiger aufführen (ist sowieso sicherer)
Select/Fetch ... into :feld1 :anz1, :feld2 :anz2 ...
Hallo Fuerchau,
habe alles so gemacht wie beschrieben.
Beim kompilieren bekomme ich aber folgende Fehlermeldung :
Position 53 Variable ANZARRAY nicht definiert oder nicht
verwendbar.
Was mache ich falsch ?
Hallo Fuerchau,
habe leider zwischen der Hostvariablen und der Anzeigervariablen ein Komma gesetzt. War mein Fehler !!!!!!!!!!!!
Sorry, aber jetzt klappt es dank Deiner Hilfe
Schöne Grüße
Hi ihr,
Es geht auch anders.
Einfach mit
SELECT IPONUM, VALUE(PROSCD, ' ')
FROM INVMST LEFT OUTER JOIN POMZPO
ON IPONUM = PONUMB
GROUP BY IPONUM, PROSCD
Mit VALUE und dann den Alternativ Wert (Hier ein Blank) angeben.
So mach ich das wie man oben Sehen kann bei Left Outer Joins im SQLRPGLE.
Also vs noch
Rince
Hi ihr,
Es geht auch anders.
Einfach mit
SELECT IPONUM, VALUE(PROSCD, ' ')
FROM INVMST LEFT OUTER JOIN POMZPO
ON IPONUM = PONUMB
GROUP BY IPONUM, PROSCD
Mit VALUE und dann den Alternativ Wert (Hier ein Blank) angeben.
So mach ich das wie man oben Sehen kann bei Left Outer Joins im SQLRPGLE.
Also vs noch
Rince
Eine kleine Anmerkung:
Die Skalare Funktion COALESCE bietet die gleiche Funktionalität und sollte der Skalaren Funktion VALUE vorgezogen werden, da COALESCE dem Standard SQL 1999 entspricht.
Birgitta
@Rince
Sicherlich geht das so, aber der nicht vorhandene Inhalt NULL kann so ja nicht abgefragt werden. Benötige ich die Unterscheidung zwischen NULL und Blank/Zero nicht, ist das sicherlich so einfacher.
Ich kann dann allerdings nicht mehr "Select * " verwenden (vor allem wenn die Struktur aus extern deklariert ist). Ich sollte allerdings so sowieso nicht arbeiten sondern (auch aus Performancegründen) immer alle gewünschten Felder einzeln aufführen.
In einem solchen Fall brauchst du ein Anzeiger-Array:
d AnzArray 5I 0 dim(nn)
wobei nn midestens der Anzahl der Felder der Struktur sein muss.
dann "fetch cursor into :bank00 :AnzArray" oder "select ... into :Bank00 :AnzArray ..."
AnzArray(1) ist der Anzeiger für das 1. Feld
AnzArray(2) ist der Anzeiger für das 2. Feld
usw.
Inhalt:
0 = OK
-1 = NULL
-2 = Datenverlust (abgeschnitten)
Ansonsten auch jedes Feld einzeln mit Anzeiger aufführen (ist sowieso sicherer)
Select/Fetch ... into :feld1 :anz1, :feld2 :anz2 ...
Hallo,
kann es sein, daß die o.g. Lösung bei V5R2M0 noch nicht funktioniert ?
Ich habe den Anzeiger-Array wie folgt definiert:
D w1indic 5I 0 DIM(26) Anz.Felder von ds_datei
Und den FETCH habe ich wie folgt definiert:
Fetch C1 into :ds_datei :w1indic
Und bekomme nun bei Ausführung des Pgms den SQL-Fehler 326 Zu viele Hostvariablen definiert !
Danke im Voraus !
Peet
... da COALESCE dem Standard SQL 1999 entspricht.
Birgitta
Hallo Birgitta!
Was heißt das jetzt? Ist Value irgendwann nicht mehr gültig? Ich benutze nämlich lieber value, weil es kürzer und einfacher als Coalesce ist. ;)
Schönen Grüß...
Value und Coalesce sind identisch, der einzige Untersichied:
Value -> AS/400
Coalesce -> ANSI
Es geht hier nur um Portierbarkeit von SQL's, aber bei ILE/RPG spielt das wohl eher eine untergeordnete Rolle.