[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Apr 2004
    Beiträge
    16

    Question RPG-CALL mit Parameter aus VB...

    Hallo zusammen,

    bei dem Versuch, ein RPG-Programm auf der AS400 auszuführen tritt
    ein Problem auf, der da lautet:

    Run-time error '-2147217865(80040e37)':
    [IBM][Client Access ODBC-Treiber (32-Bit)[DB2/400 SQL]
    SQL0204 - RPGPGM1 der Art *N in LIB1 nicht gefunden.

    hier kurz der Code...

    as400db.ConnectionString = "DRIVER=Client Access ODBC Driver (32- bit);SYSTEM=UnserSys;"

    as400db.CursorLocation = adUseClient
    as400db.Open , "USR", "PW"

    Set as400cmd.ActiveConnection = as400db
    Set as400rs.ActiveConnection = as400db

    as400cmd.CommandText = "{{CALL LIB1.CLPGM}}"
    as400cmd.Execute

    Set parmOUT = as400cmd.CreateParameter("IsDa", adChar, , 1)
    as400cmd.Parameters.Append parmOUT

    as400cmd.CommandText = "{{CALL LIB1.RPGPGM1(?)}}"

    as400cmd.Execute

    Just bei diesem Execute tritt der oben zitierte Fehler auf
    Weiss jemand wieso?
    Der Parameter im RPG Programm ist so definiert:

    *Entry PLIST
    PARM IsDa

    Da ich AS400-Neuling bin, könnte es ja eventuel auch daran liegen?

    Vielen Dank für eure Hilfe und schöne Grüße aus dem Sauerland,

    BeWe

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Der Fehler deutet zuerst darauf hin, dass das Programm nicht gefunden wird !

    Anmerkung:
    Installiere das Toolkit von CA, dann kannst du über das VB-AddIn dir die Programmaufrufe generieren lassen.
    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
    Apr 2004
    Beiträge
    16
    das habe ich auch zuerst gedacht, aber wenn im CommandText
    das (?) rauslasse wird das Programm zwar aufgerufen, scheitert dann
    auf der AS400 aber am fehlenden Eingangsparameter.

    Das mit dem Toolkit-Tip habe ich schon probiert, leider musste ich
    feststellen, dass der Zugriff per SQL bei Provider=IBMDA400 langsamer ist
    als mit Driver=Client Access ODBC Driver (32-bit) im Connectionstring.

    Desweiteren ist nicht ganz ersichtlich, wie denn jetzt über das ADODB.
    Connection-Object direct Parameter an die Execute-Methode übergeben werden
    können, da dieses Objekt keine Parameter-Collection hat , ist dieses *N
    vielleicht ein Umwandlungs-Parameter des ILERPG-Programms auf der AS400?

    Vielen Dank für Ihre Hilfe, wüssten sie vielleicht noch einen anderen Tip?

  4. #4
    Registriert seit
    Apr 2004
    Beiträge
    16
    Ok, Ok, mein Fehler.... habe nicht gesehen, wie man Programme
    auswählen kann... hab es dann soweit verfolgt... dort wird dann
    der Commandtext so generiert....

    {{CALL /QSYS.LIB/SAGPLIB.LIB/PSEULABRPG.PGM(?)}}

    Alles andere ist identisch mit meinem Aufruf, aber bei diesem
    Call bemängelt er schon den ersten Slash vor QSYS als ungültigen
    Token...

    ...was mir leider auch nicht wirklich hilft

    Haben Sie noch eine andere Idee?

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Was den IBMDA400 angeht hast du leider recht !

    Ich verwende auch nicht den {{CALL ...}}, sondern erstelle mir eine Prozedur:

    myConn.Execute "CREATE PROCEDURE QTEMP.QCMDEXC (IN :PARM1 CHAR (512), IN :PARM2 DEC(15, 5)) LANGUAGE CL NOT DETERMINISTIC NO SQL EXTERNAL NAME QSYS.QCMDEXC PARAMETER STYLE GENERAL", , adExecuteNoRecords

    (Fehler kann ignoriert werden, wenn Prozedur schon da)

    Mein Command-Objekt:

    With cCallCmd
    .Name = "CallCmd"
    Set .ActiveConnection = cConnect
    .CommandText = "{CALL QTEMP.QCMDEXC (?, ?)}"
    .CommandType = adCmdText
    .Prepared = True
    End With

    Der Aufruf erfolgt dann analog:

    cCallCmd.Execute(,Array(Cmd, Len(Cmd)))

    Der 2. Paramter des Execute kann ein Parameter-Array enthalten.

    Dieses Verfahren kannst du bestimmt auf dein Programm umsetzen.
    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

  6. #6
    Registriert seit
    Apr 2004
    Beiträge
    16
    Vielen Dank für den Tip. Jedoch kann ich mit dem SQL-Statement
    von seiner Bedeutung her nicht all zu viel anfangen, weswegen
    ich doch lieber weiter auf der Suche nach dem Ursprung der
    Fehlermeldung bleibe, um letzten Endes zu wissen, wie das Programm
    auch läuft

    Trotzdem vielen Dank nochmals.

  7. #7
    Registriert seit
    Apr 2004
    Beiträge
    16
    Hallo Fuerchau,

    leider habe ich bis jetzt keine andere Lösung gefunden und bin somit dann
    doch fest entschlossen, deinen Code-Ausschnitt gerne zu benutzen. Nur
    leider verstehe ich es nicht so ganz.
    Ich habe ein rpg Programm in Lib SAGP und es heisst Pseulabrpg hat einen Paramter
    der Etwas zurückliefert (also OUT?) Wie müsste das ganze dann aussehen?
    Woher kommt denn der letzte cmd Parameter bei deinem Exceute?

    Wäre wirklich sehr nett, wenn du da nochmal helfen könntest, da ich sonst
    leider verzweifle

    Mit freundlichem Gruße, BeWe

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Also:
    Ein CALL mit dem ODBC-Treiber ist nur auf Prozeduren möglich !
    Der generierte CALL "{{CALL /qsys.lib/...." funktioniert so wie das Toolkit ihn erstellt, allerdings nur mit dem IBMDA400, da dann der SQL-Weg umgangen wird.

    Wenn du also sowohl SQL als auch Programm-Calls verwenden willst, kannst du
    a) 2 Verbindungen nutzen: 1 ODBC für SQL und die 2. IBMDA400 für CALL PGM
    b) für jedes Programm eine Prozedur erstellen

    Für die Prozedurerstellung kannst du das Beispiel oben nehmen, für den Ausgabeparameter ist dann OUT anzugeben.

    Was den letzten Parameter des Execute's angeht, so sollte dieser angewendet werden wenn kein RecordSet zurückgegeben wird, was ja bei fast allen SQL-Befehlen ausser Select der Fall ist.
    Der Grund ist, dass Execute sonst ein leeres Recordset-Object erstellt das anschließend sowieso wieder verworfen wird.
    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

  9. #9
    Registriert seit
    Apr 2004
    Beiträge
    16

    Post

    Hallo und wiedermals lieben Dank,

    habe das dann alles so befolgt, aber komme nun zu der Fehlermeldung:

    "Die Argumente sind vom falschen Typ, liegen außerhalb des Gültig-
    keitsbereiches oder sind miteinander unvereinbar"


    Das bei folgendem Code:...

    On Error Resume Next
    as400db.Execute "CREATE PROCEDURE QTEMP.QCMDEXBW (IN :PARM1 CHAR (512), OUT :PARM2 CHAR(1)) LANGUAGE RPG NOT DETERMINISTIC NO SQL EXTERNAL NAME QSYS.QCMDEXC PARAMETER STYLE GENERAL", , adExecuteNoRecords

    On Error GoTo 0
    '(Fehler kann ignoriert werden, wenn Prozedur schon da)

    With as400cmd
    Set .ActiveConnection = as400db
    .CommandText = "{CALL QTEMP.QCMDEXBW(?)}"
    .CommandType = adCmdText
    .Prepared = True
    End With

    cmd = "CALL SAGPLIB.PSEULABRPG(?)"

    'as400cmd.Parameters.Append as400cmd.CreateParameter("PARM1", adChar, adParamOutput, 1)
    as400cmd.Execute , Array(cmd, Len(cmd))


    Ich hoffe mir ist da einfach nur ein grober Schnitzer unterlaufen, oder wieso
    kommt es nicht zum gewünschten Ergebnis? Ich wüsste auch nicht, wie
    ich dann, bei erfolgreicher Ausführung den Paramter auslesen könnte?
    Tut mir wirklich Leid, wie gesagt, bin ich völliger AS400-Neuling

  10. #10
    Registriert seit
    Apr 2004
    Beiträge
    16
    Kleine Korrektur...

    as400db.Execute "CREATE PROCEDURE QTEMP.QCMDEXBW (IN :PARM1 CHAR (512), IN :PARM2 DEC(15, 5), OUT :PARM3 CHAR(1)) LANGUAGE RPG NOT DETERMINISTIC NO SQL EXTERNAL NAME QSYS.QCMDEXC PARAMETER STYLE GENERAL", , adExecuteNoRecords

    With as400cmd
    Set .ActiveConnection = as400db
    .CommandText = "CALL QTEMP.QCMDEXBW(?,?,?)"
    .CommandType = adCmdText
    .Prepared = True
    End With
    cmd = "CALL PGM(SAGPLIB/PSEULABRPG)"

    as400cmd.Execute , Array(cmd, Len(cmd), result)

    So wird zwar alles richtig aufgerufen, aber wieder bekommt doch das Programm
    Pseulabrpg keinen Zeiger für den Rückgabeparameter und stürtzt ab.
    Ein Königreich für alle, die mir da jetzt den letzten Denkanstoß, nein besser
    gleich die Lösung geben können.

    Erneut mit freundlichstem Gruße, BeWe

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Da hast du ja was gemacht, was du wohl selber nicht verstehst !

    Also:

    as400db.Execute "CREATE PROCEDURE MyLib.MyPgm (IN :PARM1 CHAR (512), IN :PARM2 DEC(15, 5)) LANGUAGE RPG NOT DETERMINISTIC NO SQL EXTERNAL NAME MyLib.MyPgm PARAMETER STYLE GENERAL", , adExecuteNoRecords

    Du solltest dein Programm und die Lib benennen, denn das wird der Name der Prozedur !
    Die 2. Angabe . verweist dann tatsächlich auf das Programm !

    Die Parameter definierst du auch entsprechend Deinem Programm mit IN/OUT/INOUT, Typ und Länge !

    DANN kannst du auch das Programm aufrufen.

    PS:
    Mein Beispiel war für den Aufruf des Programmes QCMDEXC um Kommandos per SQL durchzuführen.
    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. Rückgabewert vom RPG Programm
    By mk in forum NEWSboard Java
    Antworten: 8
    Letzter Beitrag: 21-04-11, 21:51
  2. Bibliotheksliste in RPG IV abfragen
    By timeless in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 11-01-07, 12:04
  3. Problem mit Java-Methoden Aufruf aus ILE RPG?
    By Stoeberl in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 10-01-07, 10:58
  4. "remote" - call
    By hh-mi in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 15-11-06, 12:23
  5. Return ILE RPG
    By Squall in forum IBM i Hauptforum
    Antworten: 31
    Letzter Beitrag: 28-09-06, 17:53

Berechtigungen

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