[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2002
    Beiträge
    164

    Aufruf RPG aus PHP

    Hallo Leute,
    vielleicht kann mir jemand eine kurze Anleitung für den Aufruf
    eines RPG IV - Programms aus einer PHP-Site heraus geben.
    Das RPG-PGM (RPGPGM1) hat einen Input-Parameter und befindet sich in Bibliothek PGMLIB.
    Habe mich schon informiert über SQL-Stored-Procedures.
    Leider bislang ohne gewünschten Erfolg.
    Vielen Dank für eure Antworten.
    RR

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Es kommt nur auf die Parameterart an um das Programm direkt aus SQL aufzurufen:

    call MYLIB.MYPGM ('VALUE')

    Wichtig ist, enthaltenen Hochkommatas vorher zu verdoppeln und ggf. mit Leerzeichen in der benötigten Länge aufzufüllen.

    Benötigst du eine gepackte Zahl, so ist die Zahl mit Vornullen und Dezimalstellen genau aufzubereitn:

    call MYLIB.MYPGM (123456.12)

    In diesem Fall übergibt SQL eine Packedvariable P(8, 2).
    mit anderen Formaten ist analog zu verfahren.
    Es können auch mehrere Parameter übergeben werden:

    call MYLIB.MYPGM (P1, P2, ..., Pn)
    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
    Feb 2002
    Beiträge
    164

    hier mein Beispiel

    $proc_query = "create procedure mylib.proc1 (in :rtn char(7))
    language RPG external name mylib.mypgm'";

    $exec = odbc_exec($dbHost, 'call mylib.proc1('$rtn')');

    In $dbHost steht der Name der Datenbank.

    Die Verbindung zur AS400 ist ok.
    Leider wird mylib.mypgm nicht aufgerufen.

    Hab ich etwas wichtiges übersehen?

  4. #4
    Registriert seit
    Jan 2001
    Beiträge
    833

    Thumbs up

    Hallo,

    man kann im PHP auch ein Programm mit der
    i5_toolkit Library aufrufen.

    Im Handbuch im Kapitel 4 API Toolkit function
    ist der i5_programm_prepare beschrieben
    http://www.redbooks.ibm.com/redbooks/pdfs/sg247327.pdf

    Deine Parameter kannst Du in einem Array übergeben.
    Klappt übrigens sehr gut.

    Alternativ kann man auch eine PCML Datei erstellen lassen
    und in PHP einbinden.
    Parameter beim CRTxx Command sind
    PGMINFO INFOSTMF



    Live auf der i5 ist unsere kleine Demo mit
    unserem Command CVTOSDTA zu sehen.

    Bei Interesse
    Example_Command_CVTOSDTA

    Mit dem Command CVTOSDTA können 20 SQL's verarbeitet
    werden. Die Daten werden als XML oder JSON Datei
    an den Browser zurückgesendet.




    Gruß
    Michael

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Die Deklaration deiner Prozedur läuft auf einen Fehler und wurde nicht erstellt:

    create procedure mylib.proc1 (in rtn char(7))
    language RPG external name mylib.mypgm'

    Der Doppelpunkt ist da zu viel!

    Beim Aufruf ist es wichtig, dann genau 7 Zeichen zu übergeben.
    SQL sucht nämlich die passende Prozedur an Hand der Übergabeparameter.

    Da du in deinem Call nur 4 Zeichen übergibst, wird SQL nicht fündig.
    Für variable Argumente empfielt sich dann VARCHAR zu verwenden und in dem RPGLE! dann als "varying" zu definieren.
    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
    Feb 2002
    Beiträge
    164

    Hallo Michael,

    ich nehme an, für einen i5_program_call ist ein i5_connect Voraussetzung.
    In meiner PHP-Site wird derzeit nur ein odbc_connect aufgerufen.
    Kann ich das i5_connect zusätzlich aufrufen?

    Hast du vielleicht die Zeit, mein angeführtes Beispiel mit deiner Methode zu beschreiben?
    Vielen Dank
    RR

  7. #7
    Registriert seit
    Jan 2001
    Beiträge
    833
    Hi,

    sorry, ich habe hier vor Ort leider keine Möglichkeiten.

    Du hast unter ODBC doch bestimmt auch eine Connection.
    Vielleicht kannst Du diese ja verwenden.
    Gruß
    Michael

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    i5_program_call benötigt auf jeden fall auch i5_connect.

    Aber warum soll das mit dem SQL-Call und ODBC nicht funktionieren ?

    Lass doch einfach mal das Create Procedure weg.

    Die AS/400 erlaubt auch direkte Programmaufrufe ohne Prozeduren, einfach:

    call mylib.mypgm (P1, ...., Pn)
    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
    Jan 2001
    Beiträge
    833
    Hallo,

    ich habe da noch was gefunden.
    Sind zwar nur Fragmente, aber vielleicht ist die Doku hilfreich.
    PHP-Code:
    $conn i5_connect("localhost""gpapayia""secret");

    if (!
    $conn) {
        
    throw_error("i5_connect");
        exit();
    }



    function 
    throw_error($func) {
        echo 
    "Error in function: ".$func." --- ";
        echo 
    "Error Number: ".i5_errno()." --- ";
        echo 
    "Error Message: ".i5_errormsg()."";
    }




         
    C     *ENTRY        PLIST
         C                   PARM                    prod_id           7
         C                   PARM                    store_loc        10
         C                   PARM                    price             5 2
          
    /FREE
           price 
    price 10.99;
           *
    INLR = *ON;
          /
    END-FRE



    $description 
    = array(
        array(
            
    "Name"=>"PROD_ID",
            
    "IO"=>I5_IN,
            
    "Type"=>I5_TYPE_CHAR,
            
    "Length"=>"7"
        
    ),
        array(
            
    "Name"=>"STORE_LOC",
            
    "IO"=>I5_IN,
            
    "Type"=>I5_TYPE_CHAR,
            
    "Length"=>"10"
        
    ),
        array(
            
    "Name"=>"PRICE",
            
    "IO"=>I5_INOUT,
            
    "Type"=>I5_TYPE_PACKED,
            
    "Length"=>"5.2"
        
    ),
    );

    $pgm i5_program_prepare("QGPL/GEOPGRM"$description);

    if (!
    $pgm) {
        
    throw_error("i5_program_prepare");
        exit();

    oder mit Übergabe der Parameter :
    PHP-Code:
    $parameter = array(
        
    "PROD_ID"=>"xyz101",
        
    "STORE_LOC"=>"a1001",
        
    "PRICE"=>0.00
    );

    $parmOut = array(
        
    "PROD_ID"=>"PROD_ID",
        
    "STORE_LOC"=>"STORE_LOC",
        
    "PRICE"=>"AMOUNT",
    );

    $ret i5_program_call($pgm$parameter$parmOut);

    if (!
    $ret) {
        
    throw_error("i5_program_call");
        exit();
    }

    echo 
    "Product Id: ".$PROD_ID."";
    echo 
    "Store Location: ".$STORE_LOC."";
    echo 
    "Price: ".$AMOUNT."";


    i5_program_close($pgm);
    i5_close($conn); 

  10. #10
    Registriert seit
    Feb 2002
    Beiträge
    164

    Beide Varianten laufen.

    Werte Kollegen,

    habe beide Varianten zum Laufen gebracht.

    Vielen Dank für eure Hilfe.

    RR

Similar Threads

  1. PHP Aufruf AS400 RPG Programm
    By chrisonline in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 07-12-07, 17:39
  2. Problem mit Java-Methoden Aufruf aus ILE RPG?
    By Stoeberl in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 10-01-07, 10:58
  3. Aufruf von Java Methode aus RPG
    By codierknecht in forum NEWSboard Java
    Antworten: 7
    Letzter Beitrag: 23-03-05, 08:31
  4. Aufruf von Java Programm direkt aus RPG
    By mk in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 09-09-04, 08:22
  5. Frage zu RPG: Aufruf RPG-Programm mit Parametern
    By hs in forum IBM i Hauptforum
    Antworten: 14
    Letzter Beitrag: 09-10-01, 12:06

Berechtigungen

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