Anmelden

View Full Version : strqm: SQL-Anweisung mit Parameter



Seiten : [1] 2

padawan
02-02-11, 17:04
Hallo,
V5R4

Tabelle mvtel1p:
username(Char15)
pcstation(Char7)

username pcstation
RGE xx1
VCH xx2

SELECT
-- Spalten
USERNAME,pcstation
-- Tabellen
FROM trumpfh/mvtel1p
-- Zeilenauswahl
WHERE USERNAME = &VAR1

Wenn ich für &VAR1 den Wert RGE in Hochkomma übergeben, erhalte den Fehler:

call trumpfh/testmartin parm('RGE')
Spalte RGE nicht in angegebenen Tabellen.
Befehl RUN für Objekt QUERY mit SQLCODE -206 fehlgeschlagen.
Befehl RUN QUERY aufgrund eines Fehlers beendet.
Befehl STRQMQRY fehlgeschlagen.
Funktionsprüfung. QWM2701 nicht überwacht durch TESTMARTIN bei Anweisung
901, Instruktion X'0017'.

Was mache ich falsch?

Vielen Dank.

Gruss
Tobias

Fuerchau
02-02-11, 17:24
Zeichenketten benötigen ein Hochkomma das du mit übergeben musst, also

DCL &HPARM *CHAR 10
CHGVAR &HPARM ('''' *CAT &PARM *CAT '''')

STRQMQRY ...
SETVAR((RGE &HPARM))

padawan
02-02-11, 21:36
Hallo,
die Spaltennamen heißen username und pcstation...

Der Parameter &VAR hat den Wert: 'RGE'
Beim Debugger bleibt dieser bei Fehler QWM2701 stehen (siehe Joblog oben) und behauptet die Spalte RGE wäre nicht in den angegebenen Tabellen - häh, wie bitte. RGE ist doch der Wert und Spalte ist username. Irgendwie bin ich total verwirrt???
Meine Tabelle mvtel1p sieht so aus:

USERNAME PCSTATION
RGE xx1
VCH xx2
...

select username, pcstation
from mvtel1p
where username = &VAR1

Habe ich vielleicht einen Denkfehler?

Danke.

Gruss
Tobias

B.Hauser
03-02-11, 06:48
Nur nochmal um sicher zugehen:

Ist der Wert der eingehenden Variablen &VAR in Hochkommata eingebettet oder nicht?

Wie Baldur schon sagt, bei alphanumerischen Parametern, müssen die Werte in Hochkommata eingebettet werden!
Ohne einschließende Hochkommata geht das SQL Statement schief!

Birgitta

padawan
03-02-11, 07:04
Guten Morgen zusammen,

ja, wie oben beschrieben ist der Wert in Hochkomma eingebettet. Mich verwirrt die Fehlermeldung, daß der eigentliche Wert hier 'RGE' als Spalte angegeben wird, obwohl es die Spalte USERNAME ist.

Gruss
Tobias

B.Hauser
03-02-11, 08:10
Kann es sein, dass Du versuchst Dein QMQuery mit CALL auszuführen?

QMQueries müssen mit dem Befehl STRQMQRY ausgeführt werden.
Die Variablen werden in der Option SETVAR in der Form VariableName &Variable übergeben werden.

Der Inhalt der Variablen muss bei alphanumerischen Feldern oder Datumsvariablen mit Hochkommata umgeben werden.

Birgitta

Fuerchau
03-02-11, 08:26
Dein Denkfehler ist, dass du die Variable &VAR in deinem CLP in Hochkomma setzt.
Es muss jedoch der Inhalt der Variable an QMQRY in Hochkomma übergeben werden.

Dein SQL sieht nach der Ersetzung eben so aus, da die Hochkommata fehlen:

select username, pcstation
from mvtel1p
where username = RGB

SETVAR unterstützt auch Berechnungen:

SETVAR((VAR ('''' *CAT &MYCLVAR *CAT '''')))

padawan
03-02-11, 08:47
...könnte der Select auch so aussehen?

select username, pcstation
from mvtel1p
where username = char('&VAR')

Birgitta:
In VS2010 über ADO stosse ich ein CL an:

Dim VAR1 AsString
VAR1 = "'" & txt_eingabe.Text & "'"
'************************************************* ************
'Daten holen
'************************************************* ************
Dim cnn As ADODB.Connection
Dim con_str AsString
Dim CallCmd AsNew ADODB.Command
Dim cmd AsString
cnn = New ADODB.Connection
cmd = "CALL TRUMPFH.TESTMARTIN(" & VAR1 & ")"
...

das CL sieht folgendermaßen aus:

PGM PARM(&VAR1)
DCL VAR(&VAR1) TYPE(*CHAR) LEN(15)

STRQMQRY QMQRY(TRUMPFH/MARTIN_4) OUTPUT(*PRINT) +
ALWQRYDFN(*YES) SETVAR((VAR1 &VAR1))
MONMSG MSGID(CPF0000)
ENDPGM: ENDPGM

Die Qry MARTIN_4 hat obigen Select

Gruss
Tobias

B.Hauser
03-02-11, 09:09
das CL muss so aussehen:


PGM PARM(&VAR1)
DCL VAR(&VAR1) TYPE(*CHAR) LEN(15)
DCL VAR(&VAR2) Type(*CHAR) LEN(17)

CHGVAR VAR(&VAR2) VALUE('''' *CAT &VAR1 *CAT '''');

STRQMQRY QMQRY(TRUMPFH/MARTIN_4) OUTPUT(*PRINT) +
ALWQRYDFN(*YES) SETVAR((VAR1 &VAR2))
MONMSG MSGID(CPF0000)
ENDPGM: ENDPGM


Birgitta

Fuerchau
03-02-11, 10:28
Die Hochkomma in VB sind ja erforderlich, damit die Syntax des CALL-CMD's korrekt ist.
Diese werden allerdings bei der Übergabe an dein CLP wieder entfernt!

Du kannst ja auch die Hochkommata bereits in dem VB mit angeben:

VAR1 = "'''" & txt_eingabe.Text & "'''"

Dann brauchst du dein CLP nicht zu ändern.
Ggf. musst du allerdings noch
Replace(txt_eingabe.Text, "'", "''")
einbauen, falls dein Text Hochkomma enthalten kann.