PDA

View Full Version : SQL - Select mit variablen Feldnamen



Tobse77
24-07-07, 11:59
Hallo zusammen !!

Bin ein ziemlicher Neuling, was SQL-Programmierung anbelangt.

Ich habe nun allerdings die Notwendigkeit in meinem RPG-Programm einige SQL-Statements einzubauen.

Folgende Ausgangslage:
Eine Physische Datei mit über 5000 Felder bildet eine Berechtigungsstruktur verschiedener Menüpunkte pro User ab.
Folgender Aufbau:
Username, A0001, A0002, .... A5900

Hierbei stellt jedes Feld einen Menüpunkt dar. Wenn man jetzt z. B. wissen möchte, welcher Benutzer den Menüpunkt 810 hat, so kann man recht einfach über RUNQRY abfragen: A0810 EQ '1' !!
Nun soll dies in ein Dialogprogramm eingebunden werden. Der Benutzer soll in ein Eingabefeld der DSPF den gewünschten Menüpunkt eingeben können (z. B. 810) und das Programm passt entsprechend auf den Feldnamen der abzufragenden Datei an -> 'A0810'

Ich möchte also per SQL abfragen:
SELECT * FROM DATEI WHERE A0810 = '1'
bzw.
SELECT * FROM DATEI WHERE FELDNAME = '1'

Wer kann mir weiterhelfen :confused:

MfG,
Tobias

Fuerchau
24-07-07, 12:03
Dies geht nur mit dynamischem SQL:

declare xxx cursor for yyy
prepare yyy from :mystmt
open xxx
fetch xxx into ...
close xxx

xxx = dein Cursorname
yyy = ein Statementname
mystmt = eine Programmvariable die den vollständigen Select enthält

Ansonsten ist das Design dieser Tabelle eher fragwürdig ;)

Tobse77
24-07-07, 13:17
Hallo Fuerchau,

danke für die schnelle Antwort.

Sehr fragwürdig, ich weiß... aber sie existiert so nun mal... :o

Mit prepare hab ich bisher noch nie gearbeitet..

Mein SQL-Statement sieht folgendermaßen aus:

MPA = Variable mit Feldinhalt (z. B. 'A0810')
C/EXEC SQL
C+ DECLARE C1 CURSOR FOR SELECT * FROM LIB/FILE WHERE MPA = '1'
C/END-EXEC

Was genau ist mit Statementname gemeint?
Gem. deinem Tip sollte es also folgendermaßen aussehen(?!):
C/EXEC SQL
C+ DECLARE C1 CURSOR FOR YYY
C/END-EXEC

C/EXEC SQL
C+ PREPARE YYY FOR :VAR
C/END-EXEC

wobei :VAR = 'SELECT * FROM LIB/FILE WHERE' +Eingabevariable +'= "1"'

Richtig ??

Fuerchau
24-07-07, 15:05
Im Prinzip ja, allerdings solltest du einen eindeutigen Cursor- und Statementnamen verwenden und nicht YYY.
Ein Cursor kann auch nicht umdefiniert werden, nimm also C2 oder was anderes.

Tobse77
25-07-07, 10:19
Danke, es funktioniert (fast)!!

Allerdings möchte ich aus Gründen der Performance nicht alle Felder selektieren, sonder nur das eine Feld, das ich im Programm benötige. (SIMUSR)
Wenn ich nun aber das SQL-Statement
SELECT * FROM VOGIO/WUSIMSEC WHERE A0810 = '1'
durch dieses
SELECT SIMUSR FROM VOGIO/WUSIMSEC WHERE A0810 = '1'
ersetze, so funktioniert die Abfrage nicht mehr !?!?!
Das gleiche Statement in STRSQL aufgerufen, funktioniert wie erwartet tadellos.
Selbst wenn ich das jeweilige Feld, das ich im WHERE-Teil abfrage zusätzlich auswähle, also
SELECT SIMUSR, A0810 FROM VOGIO/WUSIMSEC WHERE A0810 = '1'
so funktioniert es dennoch nicht !!!!:mad:

Woran liegt das ???

UFK
25-07-07, 10:56
Ich würde dafür eine Skript-Sprache benutzen, also ein Skipt schreiben, das interpretiert wird.

B.Hauser
25-07-07, 11:08
Hallo Tobse77,

Wenn Du anstatt SELECT *, Select Feld bzw. Felder angibst, musst Du natürlich auch die Ausgabe-Felder oder die Datenstruktur, die Du im Fetch angibst entsprechend anpassen!

Birgitta

Tobse77
25-07-07, 11:30
Manchmal sieht man vor lauter Bäumen den Wald nicht !!!! :o

Genau das war's !!!! :)


VIELEN DANK !!!