-
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
-
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)
-
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?
-
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
-
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.
-
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
-
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
-
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)
-
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);
-
Beide Varianten laufen.
Werte Kollegen,
habe beide Varianten zum Laufen gebracht.
Vielen Dank für eure Hilfe.
RR
Similar Threads
-
By chrisonline in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 07-12-07, 17:39
-
By Stoeberl in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 10-01-07, 10:58
-
By codierknecht in forum NEWSboard Java
Antworten: 7
Letzter Beitrag: 23-03-05, 08:31
-
By mk in forum IBM i Hauptforum
Antworten: 0
Letzter Beitrag: 09-09-04, 08:22
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks