PDA

View Full Version : Anzeigervariable im SQLRPGLE



Seiten : [1] 2

Jenne
30-06-04, 16:16
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 !

Fuerchau
30-06-04, 16:47
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 ...

Jenne
01-07-04, 07:49
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 ?

Jenne
01-07-04, 12:13
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

Rincewind
01-07-04, 14:51
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

B.Hauser
01-07-04, 15:49
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

Fuerchau
02-07-04, 08:06
@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.

Peet
05-06-07, 15:20
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

GreatEMU
06-06-07, 07:37
... 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üß...

Fuerchau
06-06-07, 10:01
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.