Anmelden

View Full Version : ADO und SETVAR bei STRQMQRY



padawan
02-07-10, 12:20
Hallo,
V5R4 und ADO

Ich habe wie in diesem Forum beschrieben in der Qry bei Sätze auswählen eine Variable gesetzt --> WVLDAT LE :VAR1 --> dabei hat das Feld WVLDAT das Format Decimal 6 0

Folgender Befehl in der Befehlszeile auf der AS400 funktioniert:
STRQMQRY QMQRY(TRUMPFH/TTRWLSVST1) OUTPUT(*OUTFILE) OUTFILE(TRUMPFH/TTRWLSVST1) ALWQRYDFN(*YES) SETVAR((VAR1 100626))

Jetzt möchte ich diesen Befehl über ADO aufführen. In ADO habe ich folgendes gemacht, wobei STRQMQRY nicht funktioniert:

datbb = "26.06.2010"
t = Left(datbb, 2)
m = Mid(datbb, 4, 2)
j = Right(datbb, 2)
datbb = j & m & t
'datb = "X'0" & datbb & "C'"
VAR1 = datb 'VAR1 ist jetzt 100626
'************************************************* ************
'Daten holen
'************************************************* ************
Dim cnn As ADODB.Connection
Dim con_str AsString
Dim CallCmd AsNew ADODB.Command
cnn = New ADODB.Connection

VAR99 = "STRQMQRY QMQRY(TRUMPFH/TTRWLSVST1) OUTPUT(*OUTFILE) OUTFILE(TRUMPFH/TTRWLSVST1) ALWQRYDFN(*YES) SETVAR((VAR1 " & VAR1 & "))"
'anderer Versuch
'VAR99 = "STRQMQRY QMQRY(TRUMPFH/TTRWLSVST1) OUTPUT(*OUTFILE) OUTFILE(TRUMPFH/TTRWLSVST1) ALWQRYDFN(*YES) SETVAR((VAR1 ('''' *CAT " & VAR1 & " *CAT '''')))"
' oder SETVAR((VAR1 ('''' *CAT &VAR1 *CAT '''')))
con_str = "Driver={iSeries Access ODBC Driver};System=ICHAS;Uid=TRUMPFH;Pwd=tobias;"
cnn.Open(con_str)
CallCmd = New ADODB.Command
OnErrorResumeNext
CallCmd.CommandText = VAR99
CallCmd.ActiveConnection = cnn
CallCmd.Execute(cnn)
cnn.Close()

Irgendwie übergebe ich die Variable bei SETVAR nicht korrekt. Was mache ich falsch?

Vielen Dank.
Gruss
Tobias

Fuerchau
02-07-10, 12:27
Etwas grundsätzliches:
Du kannst keine Kommandos aus der AS/400 aufrufen, du musst diese in QCMDEXC verpacken:

call QSYS.QCMDEXC ('MyCmd', Länge als 10VK5NK formatiert)

Man beachte, dass du das Kommando ja in Hochkomma setzen musst, also sind alle enthaltenen Hochkommas zu verdoppeln:

MyCmd = replace(MyCmd, "'", "''")

.execute "call qsys.qcmdexc ('" & mycmd & "', " & format(len(mycmd), "0000000000.00000" ) & ")"

Pikachu
02-07-10, 12:29
Ist VAR1 eine numerische oder alphanumerische Variable? Probier mal den Inhalt von VAR1 nach alphanumerisch umzusetzen und diese alphanumerische Zeichenfolge dann zu übergeben.

Fuerchau
02-07-10, 12:35
@Pikachu
Hier wird ein SQL-Aufruf fabriziert.

Ansonsten frage ich mich, warum der im QMQRY enthaltene SQL nicht direkt ausgeführt wird ?
So muss man bei Korrekturen immer 2 Seiten ändern, das QMQRY und das Programm.
Zumal du anscheinend das Ausgabeergebnis dann wieder per Select ausliest.

padawan
02-07-10, 12:45
VAR1 übergebe ich alphanumerisch.

Fuerchau
02-07-10, 13:03
Schau dir bitte meine Hinweise an.

padawan
02-07-10, 13:18
habe das jetzt so umgesetzt, klappt aber noch nicht:

cnn = New ADODB.Connection
con_str = "Driver={iSeries Access ODBC Driver};System=ICHAS;Uid=TRUMPFH;Pwd=tobias;"
cnn.Open(con_str)
'CallCmd = New ADODB.Command
On Error Resume Next
CallCmd = "STRQMQRY QMQRY(TRUMPFH/TTRWLSVST1) OUTPUT(*OUTFILE) OUTFILE(TRUMPFH/TTRWLSVST1) ALWQRYDFN(*YES) SETVAR((VAR1 " & VAR1 & "))"
CallCmd = Replace(CallCmd, "'", "''")
cnn.Execute("CALL QSYS.QCMDEXC('" & CallCmd & "', " & Format(Len(CallCmd), "0000000000.00000") & ")")
cnn.Close()

Habe ich hier einen Denkfehler?

Gruss
Tobias

Fuerchau
02-07-10, 13:23
Prinzipell nicht, aber die Fehlermeldung (Err-Objekt, Errors-Auflistung der Connection) wäre schon ganz hilfreich.

padawan
02-07-10, 13:44
sehr gerne, ich hoffe, daß Dir der ODBC-Treiber-Fehler CPF0006 etwas sagt:


Serverfehler in der Anwendung /IMHO.

[IBM][iSeries Access ODBC-Treiber][DB2 UDB]CPF0006 - Im Befehl ist ein Fehler aufgetreten.

Beschreibung: Unbehandelte Ausnahme beim Ausführen der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde.

Ausnahmedetails: System.Runtime.InteropServices.COMException: [IBM][iSeries Access ODBC-Treiber][DB2 UDB]CPF0006 - Im Befehl ist ein Fehler aufgetreten.

Quellfehler:

Zeile 116: CallCmd = Replace(CallCmd, "'", "''")
Zeile 117:
Zeile 118: cnn.Execute("CALL QSYS.QCMDEXC('" & CallCmd & "', " & Format(Len(CallCmd), "0000000000.00000") & ")")
Zeile 119: 'cnn.Execute(CallCmd)
Zeile 120:

Stapelüberwachung:

[COMException (0x80004005): [IBM][iSeries Access ODBC-Treiber][DB2 UDB]CPF0006 - Im Befehl ist ein Fehler aufgetreten.] ADODB.ConnectionClass.Execute(String CommandText, Object& RecordsAffected, Int32 Options) +0 AÜA.btn_aüa_Click(Object sender, EventArgs e) in C:\Dokumente und Einstellungen\trumpfheller\Eigene Dateien\Visual Studio 2008\WebSites\IMHO\AÜA.aspx.vb:118 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111 System.Web.UI.WebControls.Button.RaisePostBackEven t(String eventArgument) +110 System.Web.UI.WebControls.Button.System.Web.UI.IPo stBackEventHandler.RaisePostBackEvent(String eventArgument) +10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEve ntHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCol lection postData) +36 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

Fuerchau
02-07-10, 14:35
CPF0006 ist ein Syntaxfehler im Kommando.

Nimm also dein Kommando und kopiere es in eine Befehlszeile auf der AS400.

Ist die Zeile zu klein, einfach CALL QCMD aufrufen und F11 drücken.
Ggf. zu viele/zuwenige Hochkommas ?