Anmelden

View Full Version : SQLRPGLE



mk
14-11-05, 14:02
Hallo zusammen,

in einem sqlrpgle soll in der Where Bedingung eine
In Abfrgae durchgeführt werden z.B:

C/EXEC SQL
C+ DECLARE
C+ SELECT
C+ FROM
c+ where
c*** laender in ('AU', 'D' , 'NL')
c+ laender in :wk2

Die Variable wk2 enthält folgenden Inhalt
WK2 = '('AU' , 'NL' , 'D') '

Leider klappt die SQL Abfrage nicht.

Kann man keine IN Abfrage mit einer Variablen durchführen ?

Gruss an alle
Michael

Fuerchau
14-11-05, 14:33
So geht das leider nicht. Du musst die Anzahl möglicher Inhalte per Programm bereits vorsehen und mehrere Variablen benennen:

where ... laender in (:vin1, :vin2, :vin3, ...) ...

mk
14-11-05, 15:15
Hallo Baldur,

okay, vielen Dank das klappt.

Ich habe aber ein Arrary DIM(99) mit den evtl vorkommenden
Länderkürzel. Wobei 1 bis n Elenente gefüllt sein können.
Mal sehen wie man soetwas machen könnte.

Gruss
Michael

B.Hauser
14-11-05, 15:59
Hallo Michael,

hier noch eine etwas unkonventionelle Methode. Du must nur den String entsprechend aufbereiten. Achtung der String sollte mit Komma beginnen und enden:


/Free
String = ',D,E,F,DK,CH,GB,USA,';
/End-Free
C/Exec SQL
C+ Declare .....
C+ Select LAENDER, ....
C+ from MyTable
C+ where :String like '%,' concat TRIM(LAENDER) concat ',%'
C/End-Exec


Wenn ich mich jetzt nicht vertippt habe, sollte es funktionieren. Performancemäßig dürfte es allerdings nicht der Renner sein.

Birgitta

mk
14-11-05, 16:10
Hallo zusammen,

danke für die Tipps. Ich habe es jetzt so gelöst:

where
laender in ( :wkdst1 , :wkdst2 , :wkdst3, :wkdst4 , :wkdst5 ,
:wkdst6 , :wkdst7 , :wkdst8, :wkdst9 , :wkdst10 ,
:wkdst11, :wkdst12, :wkdst13, :wkdst14 , :wkdst15 ,
:wkdst16, :wkdst17, :wkdst18, :wkdst19 , :wkdst20 ,
:wkdst21, :wkdst22, :wkdst23, :wkdst24 , :wkdst25 ,
:wkdst26, :wkdst27, :wkdst28, :wkdst29 , :wkdst30
)

wobei es dabei egal ist ob ein Wert in den Feldern steht. Die Felder die auf Blank stehen werden wohl ignoriert.

Viele
Grüße

Fuerchau
14-11-05, 16:17
Ignoriert ist falsch !
Solange dein Feld "laender" keine Blanks enthält ist das korrekt.
Ggf. solltest du die nicht benötigten Felder mit *HIVAL initialisieren.

B.Hauser
15-11-05, 07:33
*HIVAL?!

Was aber wenn man auch Sätze hat in denen LAENDER mit *HIVAL belegt sind?

Dann ist die Lösung genauso hinfällig, wie wenn man *Blanks für die nicht initialisierten Elemente verwenden würde!

Deshalb würde ich die nicht belegten Elemente mit dem einem ausgewählten Länder-Kennzeichen (z.B. dem letzten oder dem ersten ausgewählten Wert) auffüllen. Der Optimizer sollte erkennen, dass der gleiche Wert mehrfach angegeben wurde.

Birgitta

Karl23
17-11-05, 09:48
Hallo,

ich würde den Variablen die *BLANKS als Inhalt haben einen hexadecimalen Wert zuweisen, einen Wert der keinem Zeichen entspricht.
Damit ist sichergestellt, daß nicht ungewollt Sätze abgerufen werden, die eigentlich nicht gewünscht sind.