PDA

View Full Version : MS ACCESS+ADO: CALL funktioniert nicht



padawan
28-07-11, 10:47
Hallo,
MS ACESS, ADO, WIN XP, V5R4

Call auf der AS400 funktioniert einwandfrei, aber

ich möchte in VBA ein Call mit Parameter übergeben, bekomme aber folgenden Fehler:

SQL0103: Numerische Konstante 1456459C ungültig

Code AS400 (funktioniert) - Parameter werden hexadezimal übergeben:

PGM PARM(&VAR1 &VAR2)
DCL VAR(&VAR1) TYPE(*DEC) LEN(7 0)
DCL VAR(&VAR2) TYPE(*DEC) LEN(4 0)
DCL VAR(&VAR1A) TYPE(*CHAR) LEN(7)
DCL VAR(&VAR2A) TYPE(*CHAR) LEN(4)
/* */
CHGVAR VAR(&VAR1A) VALUE(&VAR1)
CHGVAR VAR(&VAR2A) VALUE(&VAR2)
/* */
CLRPFM FILE(DTALIB/MVREKP)
/* MONMSG MSGID(CPF0000) */
ADDLIBLE LIB(DTALIB)
MONMSG MSGID(CPF0000)
CALL PGM(OBJLIB/MVREKLA1) PARM(&VAR1A &VAR2A)
MONMSG MSGID(CPF0000)
/*** */
ENDPGM: ENDPGM

VBA Code:

Dim VAR1, VAR11, VAR2, VAR22, CallCmd As String
VAR1 = "1456459"
VAR11 = "X'" & VAR1 & "C'"
VAR2 = "0101"
VAR22 = "X'0" & VAR2 & "C'"
'CallCmd = "CALL OBJLIB/TTREKLA1(" & VAR11 & ", " & VAR22 & ")"
CallCmd = "CALL PGM(OBJLIB/TTREKLA1) PARM(" & VAR11 & ", " & VAR22 & ")"
Dim cnn As New ADODB.Connection
Dim cmd As ADODB.Command
'Dim CallCmd As String
cnn = New ADODB.Connection
cnn.Open ("Provider=IBMDA400;" & _
"Data Source=ICHAS;" & _
"User ID=USERE;" & _
"Password=PW;")
'CallCmd = "CALL OBJLIB/TTREKLA1 PARM(VAR1 VAR2)"
'cnn.Execute ("CALL QSYS.QCMDEXC ('" & CallCmd & "', " & Format(Len(CallCmd), "0000000000.00000") & ")")
cnn.Execute ("CALL QSYS.QCMDEXC ('" & CallCmd & "', " & Format(Len(CallCmd), "0000000000.00000") & ")")

cnn.Close

Fehler tritt bei cnn.execute auf.

Danke.

Gruss
Tobias

Fuerchau
28-07-11, 10:54
Wie immer ein Problem der Hochkomma:

Prompte dir den CALL auf der AS/400 also auch mit X'1234567F'.

Genauso baust du dir das CMD in VBA auf und anschließend verdoppelst du alle Hochkomma:

... Replace(CallCmd, "'", "''") ...

Ansonsten noch ein kleiner Fehler:

Positives Vorzeichen für gepackt ist F, negatives ist D.
Alles andere führt zu MCH-Fehler.

padawan
28-07-11, 11:10
... das mit dem Verdoppeln verstehe ich nicht so ganz bzw wie ich das in den Befehl einbauen muss:

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

Wo und welche muss ich verdoppeln?
Stehe auf dem Schlauch? Alle verdoppeln und bei welchem CallCmd baue ich das Replace ein?

Fuerchau
28-07-11, 11:36
Schau dir den Inhalt von "CallCmd" an.
Diese enthält ja selber Hochkommata, nämlich die X'...'.

Nun kommen wir zur SQL-Syntax:
Zeichenketten zwischen Hochkommas, enthaltene Hochkommas verdoppeln (sieht man auch schon mal im CLP).

'Baldur''s Hinweis' => Baldur's Hinweis

Dein CallCmd sieht dann wohl so aus:

CALL MYLIB/MYPGM PARM(X'123F' X'1234567F')

Da du das wiederum als Text an QCMDEXC übergeben musst erfolgt daraus:

"CALL QSYS.QCMDEXC '" & replace(CallCmd, "'", "''") & "' , " & format(...


Man beachte:
Dein CallCmd wird zwischen einfachen Hochkomma eingebettet, die enthaltenen werden verdoppelt.
Beim Aufruf von QCMDEXC werden die doppelten wieder auf einfach zurückgesetzt, daher ist die Länge wie gehabt ohne Verdoppelung zu berechnen.

padawan
28-07-11, 12:06
Hallo,
ich bekomme jetzt den Fehler:

CPF0006: Falss bei einem Teil des Befehls eine falsche Länge weitergegeben wurde, werden andere Nachrichten ausgegeben, weil der falsche Teil des Befehls analysiert wird.

Habe den Befehl so geändert:

CallCmd = "CALL PGM(OBJLIB/TTREKLA1) PARM(" & VAR11 & ", " & VAR22 & ")"

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

Was ist denn jetzt falsch? Gibts doch gar nicht...

Fuerchau
28-07-11, 12:13
Schau dir die Syntax des AS/400-Calls an, hier werden die Parameter nicht mit Komma getrennt wie bei SQL.

padawan
28-07-11, 13:08
Hallo Herr Fuerchau,

einwandfrei, so funktioniert es jetzt.

CallCmd = "CALL PGM(OBJLIB/TTREKLA1) PARM(" & VAR11 & " " & VAR22 & ")"

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

Ich bedanke mich 5-6000 mal. Danke Herr Fuerchau und eine schöne Woche noch.

Gruss
Tobias

Fuerchau
28-07-11, 13:54
:cool: Ich weß, dass es funktioniert...;)