[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2010
    Beiträge
    83

    MS ACCESS+ADO: CALL funktioniert nicht

    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Jan 2010
    Beiträge
    83
    ... 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?

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Jan 2010
    Beiträge
    83
    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...

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Schau dir die Syntax des AS/400-Calls an, hier werden die Parameter nicht mit Komma getrennt wie bei SQL.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Jan 2010
    Beiträge
    83
    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

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Ich weß, dass es funktioniert...
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. MS ado und Prepared Command
    By Asti in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 26-10-06, 09:39
  2. MS Access ODBC mit JOIN: SQL FEHLER666
    By olafu in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 05-10-06, 08:13
  3. Timestamp Feld von MS Access abfragen
    By andreas.lundschien in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 05-09-06, 14:55
  4. iSeries + MS Access
    By reraru in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 18-01-05, 13:06
  5. MS Access 97 - DB2 Problem
    By Salvi in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 21-05-04, 07:44

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •