[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2018
    Beiträge
    3

    RPG Programm per UDF aufrufen mit Rückgabewert

    Hallo miteinander,
    ich bin neu hier und auch mehr als unerfahren mit ISeries. Ich greife im Regelfall per ODBC auf die Datenbanken und Tabellen der ISeries zu.
    Für Preisermittlungen müsste ich jetzt auf ein Programm der ISeries zugreifen und die entsprechenden Rückgabe-Werte verarbeiten. Hab mich mit Google unterhalten und mal folgende Funktion geschrieben

    CREATE FUNCTION PLAQUEPRIZES
    ( PARAM CHAR(163) )
    RETURNS CHAR(163)
    LANGUAGE RPGLE
    EXTERNAL NAME 'ASTROFREMD/KSR100'
    DETERMINISTIC
    NO SQL
    NO EXTERNAL ACTION
    ALLOW PARALLEL
    NOT FENCED

    Im Programm KSR100 ist ein Parameter YPKSR100 mit 163 Zeichen definiert. Dieser Parameter ist auch der Rückgabeparameter.

    Create Function hat soweit funktioniert, auch SQL mit ' SELECT .. , PLAQUEPRIZES( ) (mit einem Wert von exakt 163 Zeichen) FROM .... ' wird ausgeführt, aber ich erhalte keine Rückgabewerte.

    Was mache ich falsch ? Was sollte ich noch prüfen ?

    Dankeschön im voraus für die Unterstützung!

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Schau noch mal nach Parameter Style General, da sonst noch erheblich mehr Parameter übergeben werden (Default ist glaube ich SQL).

    Und auch sonst sind Parameter und Returnwert bei UDF eigenständige Parameter, zuerst alle Eingangsparameter anschließend der Returnwert.
    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
    Aug 2003
    Beiträge
    1.508
    Wenn das Ergebnis über den Parameter zurück geliefert werden soll, dann benötigst du hier eine SQL Prozedur und keine Funktion.
    CREATE PROCEDURE ...

    lg Andreas

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Wobei eine Prozedur a) anders aufgerufen wird und b) nicht im Select (wie oben) 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

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    UDFs können keine Ein/Ausgabe Parameter handeln, sondern nur Eingabe-Parameter. Das Ergebnis wird immer über dien Rückgabe-Wert ausgegeben.
    Du musst also Dein Programm so modifizieren, dass es der erwarteten Struktur entspricht.

    Am einfachsten ist es Du wrappst Dein Original-Programm,
    d.h. Du generierst eine RPG-Funktion (in einem Service-Programm), in der Dein eigentliches RPG-Programm aufgerufen wird. Die Funktion gibt dann das Ergebnis bzw. Deinen Ein/Ausgabe-Parameter über RETURN aus.

    Diese Funktion wird dann im CREATE FUNCTION angegeben.

    Etwa so:
    Code:
      Ctl-Opt NoMain;
    
      DCL-Proc YourFunction   Export; 
         DCL-PI *N   Char(163);
           YourPar   Char(163);
         End-PI;
         CallP YourPGM(YourPar);
         Return YourPar;
      End-Proc;
    Ich meine es wäre auch möglich ein Programm zu generieren mit 2 Parametern, der erste ist Dein normaler Ein/Ausgabe-Parameter und der zweite ist der Ausgabe-Parameter.
    Dieses Programm ruft dann Dein Original-Programm auf.
    Diese Klimmzüge musste man machen, bevor man Funktionen handeln konnte (also schon Jahrhunderte zurück und seither habe ich es nicht mehr probiert).
    Die bessere Lösung ist allerdings eine zusätzliche Funktion.

    Was den Parameter Style angeht:
    Bei GENERAL werden nur die Parameter übergeben, die auch im RPG definiert sind.
    Bei allen anderen Styles noch einige Parameter mehr. Das ist kein Problem, solange diese Parameter im RPG-Programm nicht angesprochen werden.
    (Wie früher bei Entry-PLISTs, da was es auch kein Problem, wenn nicht alle Parameter übergeben wurden, solange die Parameter, die nicht übergeben wurden, nicht angesprochen wurden)
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  6. #6
    Registriert seit
    Feb 2018
    Beiträge
    3
    Erst mal dankeschön für die vielen Antworten.

    Ich habe mich heute entsprechend Ihren Antworten noch mal mit Google unterhalten und auch das RED BOOK von IBM runtergeladen. Ich denke, eine STORED PROCEDURE wäre dann doch eher der richtige Weg, wenn ich mir das alles mal so zu Gemüte führe. Also habe ich das Ganze in eine stored procedure übertragen, hab das der Sicherheit und Einfachheit halber auch mit ISeries Navigator durchgeführt.

    Ergebnis ist dann folgendes

    CREATE PROCEDURE ASTRD.PRIZESPLAQ (
    IN PLSIZE CHAR(163),
    OUT PRIZES CHAR(163)
    )
    DYNAMIC RESULT SETS 1
    LANGUAGE RPGLE
    SPECIFIC ASTRD.PRIZESPLAQ
    DETERMINISTIC
    NO SQL
    CALLED ON NULL INPUT
    EXTERNAL NAME 'ASTROFREMD/KSR100'
    PARAMETER STYLE SQL

    Aufruf dann wie folgt:

    CALL ASTRD.PRIZESPLAQ(Wert für 1.Parameter (exakt 163 Zeichen), '?')
    oder mit 2. Parameter explicit als CAST
    CALL ASTRD.PRIZESPLAQ(Wert für 1.Parameter (exakt 163 Zeichen), CAST ('?' as CHAR(163) ) )

    Fehlermeldung:
    Attribut IN, OUT oder INOUT für Parameter 2 in Prozedur PRIZESPLAQ ungültig

    Ich hab das auch schon mit nur einem Parameter (INOUT) probiert, da erhalte ich dann die gleiche Fehlermeldung für diesen Parameter 1.

    Syntax müsste eigentlich passen.
    Was mache ich hier jetzt wieder falsch ?

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Du solltest den 1. Parameter explizit auf CHAR(163) casten und bei dem 2. Parameter nur das Fragezeichen ohne die Hochkommata angeben.
    Mach sicherheitshalber noch ein Blank vor dem Komma.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  8. #8
    Registriert seit
    Feb 2018
    Beiträge
    3
    Hallo und dankeschön für die Unterstützung.

    Habe mich jetzt gestern und heute nochmal intensiv mit den STORED PROCEDURE auseinander gesetzt.
    Da ich über PHP und ODBC zugreife, rufe ich jetzt die STORED PROCEDURE über PDO auf.

    Wie hier im Manual PHP beschrieben: http://php.net/manual/de/intro.pdo.php

    Nach einigen Versuchen hat dann auch alles wie gewünscht funktioniert.

    Dankeschön nochmals für die Unterstützung.

Similar Threads

  1. Prozeduren in Servicepgm von einem Anderen Programm aus aufrufen.
    By dholtmann in forum NEWSboard Programmierung
    Antworten: 13
    Letzter Beitrag: 22-07-16, 09:57
  2. CL-Programm aus C# mit Rückgabeparameter aufrufen
    By Armin in forum NEWSboard Programmierung
    Antworten: 16
    Letzter Beitrag: 04-03-16, 17:07
  3. Antworten: 2
    Letzter Beitrag: 19-02-16, 11:01
  4. Wie kann man über SQL ein I5-Programm aufrufen
    By MR-BN in forum NEWSboard Programmierung
    Antworten: 12
    Letzter Beitrag: 02-10-15, 16:40
  5. Batch-Programm aus RPG aufrufen?
    By hansr in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 28-11-02, 17:38

Tags for this Thread

Berechtigungen

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