Anmelden

View Full Version : SQLRPGLE - Select ... where xxfeld in( ??)



selli
01-08-11, 13:53
Hallo, ich habe leider hier nichts gefunden:
Mein Problem ist eine Abfrage auf eine programminterne Tabelle:

D ZON# S 3 0 DIM(999)

DECLARE SQLDaten2 CURSOR FOR
SELECT DISTINCT Feld1, Feld2, Feld3...
FROM Datei1
WHERE Feld1=:Var1 and Feld2=:Var2 and
Feld3 IN (:ZON) ??????

usw..

Ich habe in ZON# 999 mögliche gültige Feldwerte.
Wie kann ich Feld3 auf diese mehreren Feldwerte abfragen?


Geht das überhaupt?

Vielen Dank Martin

Fuerchau
01-08-11, 14:01
Du musst je möglichen Feldwert eine Hostvariable definieren:

where myfield in (: F1, : F2, : F3, ...)

Variablen, die du nicht benötigst solltest du dann mit ggf. *LOVAL oder *HIVAL initialisieren.

Wenn du allerdings eine Liste mit so vielen Variablen abgleichen willst, wäre POSSTR ggf. besser. Dafür benötigst du eine Hilfsvariable, die die Liste der Werte beinhaltet mit einem Trennzeichen zusammengefasst:

MyCharList = "1;2;3;...;999;"

where posstr(char(MyField) concat ';', : MyCharList) > 0

andreaspr@aon.at
01-08-11, 15:39
Du könntest dir auch mit dynamischen SQL deinen String zusammenbasteln. Und diesen dann als Cursor einlesen.

selli
02-08-11, 10:33
Danke für die Antworten,
ich habe mich jetzt 5 Stunden gespielt im RPG als auch im SQL, ich brings nicht hin.

Werde es daher wieder klassisch programmieren.

Trotzdem vielen Dank.

C MOVEL(P) '001;002;003;'M1OUNR 3100
C MOVEL(P) '001;002;003;'M1ZONE 3100

habe es auch probiert mit

C MOVEL(P) '1;2;3;' M1OUNR 3100
C MOVEL(P) '1;2;3;' M1ZONE 3100

0404.00 C/EXEC SQL
0405.00 C+ DECLARE SQLDaten2 CURSOR FOR
0406.00 C+ SELECT DISTINCT OFMDNR, OFHANR, OFOFNR, OFLEIA, OFDTBI, OFSAAK
0407.00 C+ FROM OFAL0302
0408.00 C+ WHERE OFMDNR=:OSMDNR and
0409.00 C+ OFHANR=:OSHANR and
0410.00 C+ OFOFNR=:OSOFNR and
0411.00 C+ POSSTR(CHAR(OFOUNR) CONCAT ';', : M1OUNR) > 0 and
0412.00 C+ POSSTR(CHAR(OFZONE) CONCAT ';', : M1ZONE) > 0 and
0413.00 C+ OFDTBI=:M0DTBI and
0414.00 C+ OFSAAK=:M0SAAK
0415.00 C+ GROUP BY OFMDNR, OFHANR, OFOFNR, OFLEIA, OFDTBI, OFSAAK
0416.00 C+ ORDER BY OFMDNR, OFHANR, OFOFNR, OFLEIA, OFDTBI, OFSAAK
0417.00 C/END-EXEC

Fuerchau
02-08-11, 11:30
Entschuldigung, war mein Fehler!
Die Argumente für POSSTR waren vertauscht:

posstr(ZuDurchsuchendeZeichenkette, ZuSuchendeZeichenkette)

Also

POSSTR(: M1OUNR, CHAR(OFOUNR) CONCAT ';') > 0

Wichtig ist, dass CHAR ohne Vornullen aufbereitet, daher in der Suchliste auch ohne Vornullen, ansonsten ist DIGITS(MyNum) zu verwenden.

Das ";" ist deshalb nötig, da eine einzelne Ziffer ja auch in einer längeren Zahl vorkommen kann und nur so Eindeutigkeit gewährleistet ist.

selli
02-08-11, 12:29
ohhhhhhhhhhh :D


habs vertauscht und siehe da ...

es funktioniert .. herzlichen Dank

C/EXEC SQL
C+ DECLARE SQLDaten2 CURSOR FOR
C+ SELECT DISTINCT OFMDNR, OFHANR, OFOFNR, OFLEIA
C+ FROM OFAD03
C+ WHERE OFMDNR=:OSMDNR and
C+ OFHANR=:OSHANR and
C+ OFOFNR=:OSOFNR and
C+ POSSTR(:M1OUNR, CHAR(DIGITS(OFOUNR)) CONCAT ';') > 0 and
C+ POSSTR(:M1ZONE, CHAR(DIGITS(OFZONE)) CONCAT ';') > 0 and
C+ OFDTBI=0 and
C+ OFSAAK='J'
C+ GROUP BY OFMDNR, OFHANR, OFOFNR, OFLEIA
C+ ORDER BY OFMDNR, OFHANR, OFOFNR, OFLEIA


Vielen vielen Dank :)