PDA

View Full Version : Call-Befehl über VBA an AS400 funktioniert nicht



Seiten : [1] 2

padawan
25-02-10, 07:22
Hallo,
iServer V5R3 und VBA (dotnet)

Ich habe hier im Forum recherchiert und möchte über VBA eine Query auf der AS400 starten und gebe über VBA noch einen Parameter mit. Unten genannter Code wird per VBA (dotnet) ohne Fehlermeldung ausgeführt (der hinterlegten Query auf der AS400 wird ein Parameter VAR1 übergeben), doch die PF-Datei(Tabelle) wird nicht mit dem übergebenen Parameter überschrieben. Der abgesetzte CallCmd-Befehl funktioniert einwandfrei, wenn man ihn in der Befehlszeile der AS400 absetzt. Über VBA will das aber nicht funktionieren und die PF-Datei hat seinen alten Stand. Warum wird der Call nicht ausgeführt?

Vielen Dank für Eure Hilfe.

Dim cnn As ADODB.Connection
'Dim cmd As ADODB.Command
cnn = New ADODB.Connection
Dim CallCmd As String
cnn.Open("Provider=IBMDA400;" & _
"Data Source=AS400Server;" & _
"User ID=USER;" & _
"Password=PWD;")
CallCmd = "STRQMQRY QMQRY(TRUMPFH/TTRAJJLIP9) ALWQRYDFN(*YES) SETVAR((VAR1 0519617))"
cnn.Execute("CALL QSYS.QCMDEXC ('" & CallCmd & "', " & Format(Len(CallCmd), "0000000000.00000") & ")")
cnn.Close()

Fuerchau
25-02-10, 07:55
STRQMQRY gibt die Daten am Bildschirm aus.
Für eine Dateiausgabe ist OUTPUT(*OUTFILE) erforderlich.

Allerdings frage ich mich, warum du den Select nicht direkt selber verwendest, das wäre erheblich schneller.

padawan
25-02-10, 08:17
Hallo Herr Fuerchau,

... ist das so richtig:

CallCmd = "STRQMQRY QMQRY(TRUMPFH/TTRAJJLIP9) OUTPUT(*OUTFILE) OUTFILE(TRUMPF/TTRAJJLIP9) ALWQRYDFN(*YES) SETVAR((VAR1 0519617))"

Danke.

Wie müsste ich denn, denn Select einbauen?

Fuerchau
25-02-10, 08:26
Schau dir den Inhalt deines QMQRY einfach an. Wenn die Basis ein QRYDFN ist, kannst du per RTVQMQRY den Select in eine SRC-PF kopieren.

Diesen Select gibst du halt per Execute an.
Du kannst dann
a) VAR1 direkt per Replace vorher ersetzen
b) Statt VAR1 einen Parametermarker "?" setzen und per Command-Object den Select ausführen.
Du erhältst dann ein Recordset.

Schließlich holst du doch die Daten auch per Select ab, oder ?

padawan
25-02-10, 09:18
...verstehe ich das richtig, das heißt bspw.:

die bestehende query (definiert als *QRYDFN -->
TTRAJJLIP9 *QRYDFN QRY Verkaufte Tore (Nach Land)

kann ich mit einem geändertem select-Befehl überschreiben?
Können Sie mir bitte einen Tipp geben, wie der Befehl RTVQMQRY aussehen muss?
Was müsste dann in der Klammer beim Befehl cnn.execute() übergeben werden?
...
cmd = select idr, kdnr from tabelle1 where kdnr = ?
cnn.execute(cmd)

Hätten Sie evt einen kurzen Codeausschnitt an dem ich mich orientieren könnte?

Tausend Dank für Ihre Hilfe.

Fuerchau
25-02-10, 11:06
Deine Fragen verstehe ich jetzt überhaupt nicht mehr.
Benötigst du eine Einweisung, wie man per ODBC Daten von der AS/400 per Select abruft ?

Schau dir doch bitte einfach die ODBC-Beispiele in der MSDN oder der ADO-Dokumentation an.
Diese findist du in deinem Windows-Verzeichnis in Help, ADO-Hilfe.

padawan
25-02-10, 11:30
Oh nein, nein - Selects und ODBC sind nicht das Problem. Es geht mir um die Umsetzung des Befehls RTVQMQRY im Zusammenspiel mit VBA. Ich habe ja diese zwei funktionierende Befehlszeilen:

CallCmd = "STRQMQRY QMQRY(TRUMPFH/TTRAJJLIP9) OUTPUT(*OUTFILE) OUTFILE(TRUMPFH/TTRAJJLIB9) ALWQRYDFN(*YES) SETVAR((VAR1 0519617))"
cnn.Execute("CALL QSYS.QCMDEXC ('" & CallCmd & "', " & Format(Len(CallCmd), "0000000000.00000") & ")")

Ich habe nicht ganz die Umsetzung mit RTVQMQRY verstanden. Wie kann das denn jetzt aussehen?

Fuerchau
25-02-10, 12:22
Nicht in VBA lösen, sondern manuell den Select auf der AS/400 ansehen und in dein VBA für ein Command-Objekt kopieren.

Hast du ein QRYDFN-Objekt kannst du per RTVQMQRY (Bedienung siehe F1-Hilfe) das QRYDFN in eine Quelle schreiben.
Ansonsten kannst du per STRQM->1 dir den SQL ja ansehen und ins VBA kopieren.

padawan
25-02-10, 12:56
...ist das korrekt von der Syntax:

CallCmd = STRQMQRY QMQRY(SELECT DISTINCT A.LINDLL A.LIKNR A.LIRAL A.LIMENG A.LIBREI
A.LIHOCH A.LIHGRT FROM "TRUMPFH"/"TTRAJJLIP9" A WHERE (LIKNR = 0512079))

cnn.Execute("CALL QSYS.QCMDEXC ('" & CallCmd & "', " & Format(Len(CallCmd), "0000000000.00000") & ")")

Fuerchau
25-02-10, 13:20
Jetzt bin ich aber enttäuscht.
Wie kodierst du denn sonst einen Select ?

Ich mach das immer so:
dim Cmd as new ADODB.Command
dim Rcd as ADODB.Recordset
Cmd.Commandtext = "Select ..."
set xCmd.ActiveConnection = cnn
set Rcd = Cmd.Execute