[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Apr 2008
    Beiträge
    83

    Question CALL-Programme als CALLP

    Moin,

    uns stören die hin und wieder vorkommenden CALL-Aufrufe aus Programme im Free-RPG, mit und auch ohne Parameter.
    Ich würde gerne wissen ob und welche einfachen Möglichkeiten es gibt den CALL durch CALLP zu ersetzen, damit Free nicht verlassen werden muss?

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Du legst für Programme genau wie für Prozeduren Prototypen und Procedure Interfaces an.

    Das Procedure Interface ersetzt die *ENTRY PLIST, der Prototyp wird in alle Quellen aus denen das Programm aufgerufen wird in den globalen D-Bestimmungen als Copy-Strecke eingebunden.
    Ebenso muss der Prototyp in der Quelle, in der auch das Procedure Interface (im eigentlichen Programm also) eingebunden werden.

    Im Prototypen muss für Programme das Schlüssel-Wort EXTPGM('PROGRAMM') angegeben werden.

    ... und dann kann der Aufruf mit CALLP erfolgen (bzw. CallP ist im Free Format nur erforderlich, wenn eine Erweiterung z.B. (E) benötigt wird.)

    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

  3. #3
    Registriert seit
    Apr 2008
    Beiträge
    83
    Ich habe das wohl nicht verständlich genug geschrieben. Die Programme die aufgerufen werden existieren bereits alle. Alte Programme mit PLIST.

    Oder verstehe ich das richtig, dass ich nicht drumherum komme das Programm, welches ich aufrufen möchte auf eine Prozedur zu ändern?

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Vielleicht habe ich mich auch nicht verständlich ausgedrückt:

    Du benötigst lediglich Procedure Interface und Prototyp. Von einer Umwandlung in eine Prozedur habe ich nicht gesprochen.
    Damit der Kompiler zwischen Programm und Prozedur unterscheiden kann, muss bei Programm-Prototypen das Schlüssel-Wort EXTPGM angegeben werden.

    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

  5. #5
    Registriert seit
    Apr 2008
    Beiträge
    83
    Ah okay.

    Sprich Interface und Prototyp erstellen, damit diese aus den Free-Programmen verwendet werden können.
    Das Interface wiederum ruft dann das alte Programm auf.

    Korrekt?

  6. #6
    Registriert seit
    Jan 2001
    Beiträge
    833
    Hallo,
    hier ein kleines Beispiel:

    PHP-Code:
    DPGMR2          PR                  EXTPGM('XXXXXR2')   
    D Mode                                CONST LIKE(ParmSel
    D Season                              CONST LIKE(SLSSEA

    Callp Aufruf
    PHP-Code:
    CALLP     PGMR2(02   :aSaison
    Gruß
    Michael

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ein Prototyp wird im rufenden Programm definiert, das Interface im gerufenen Programm (ersetzt den *ENTRY).
    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

  8. #8
    Registriert seit
    Apr 2008
    Beiträge
    83
    Moin,

    Zitat Zitat von mk Beitrag anzeigen
    PHP-Code:
    DPGMR2          PR                  EXTPGM('XXXXXR2')   
    D Mode                                CONST LIKE(ParmSel
    D Season                              CONST LIKE(SLSSEA
    Callp Aufruf
    PHP-Code:
    CALLP     PGMR2(02   :aSaison
    da haben wir wieder einen typischen Fall von zu kompliziert gedacht. So einfach ist das also.

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Ein Prototyp wird im rufenden Programm definiert, das Interface im gerufenen Programm (ersetzt den *ENTRY).
    Aber das gerufene Programm muss kein Interface haben oder? So wie das Beispiel von mk.
    Habe ich selbst gerade ausprobiert und es ging ohne. Es gab sogar die Rückgabe.

    Gruß

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ein Interface ersetzt den *ENTRY!

    Achtung bei der Parameterdefinition.
    CONST bedeutet, dass der Compiler zusätzlichen Code generiert um die Übergabe zuerst in interne Variablen zu kopieren und dann zu übergeben.
    Solltest du Antwort in einem Parameter erwarten, darfst du CONST nicht verwenden, da du ja an die interne Kopie nicht drankommst.

    CONST ist dann sinnvoll, wenn man als Parameter eine feste Definition hat aber mit variablen Parametern ohne vorherigen Move/Eval arbeiten möchte oder verhindern möchte, dass das gerufene Programm meine Parameter verändert.
    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

  10. #10
    Registriert seit
    Apr 2008
    Beiträge
    83
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Ein Interface ersetzt den *ENTRY!
    Ja das habe ich verstanden. Die Frage ist: Muss ich den *ENTRY ersetzen oder kann ich es?
    Bei dem Test den ich gemacht habe, wird ein altes Programm, welche *ENTRY beinhaltet, aufgerufen und es hat funktioniert. Daher würde ich sagen, ich muss *ENTRY nicht durch ein Interface ersetzen.

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Achtung bei der Parameterdefinition.
    CONST bedeutet, dass der Compiler zusätzlichen Code generiert um die Übergabe zuerst in interne Variablen zu kopieren und dann zu übergeben.
    Solltest du Antwort in einem Parameter erwarten, darfst du CONST nicht verwenden, da du ja an die interne Kopie nicht drankommst.

    CONST ist dann sinnvoll, wenn man als Parameter eine feste Definition hat aber mit variablen Parametern ohne vorherigen Move/Eval arbeiten möchte oder verhindern möchte, dass das gerufene Programm meine Parameter verändert.
    Das hatte ich auch so gedacht. So kannte ich CONST bislang.
    Testweise habe ich versucht das alte Programm mit einer Prozedur ohne CONST und einer Prozedur mit CONST aufzurufen. Es kommt in beiden Fällen allerdings dasselbe dabei heraus.

    Kann es sein, dass CONST nur das ändern der Parameter verhindert, wenn es im Interface verwendet wird?
    Und wird es im Prototypen verwendet bedeutet es lediglich, dass Parameter durch Referenz übergeben werden dürfen? (Siehe Beispiel mk)

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Parameter an externe Programme können immer nur als Referenz übergeben werden, Value funktioniert nur bei Prozeduren und Funktionen.

    Const verhindert nicht das verändern der Parameter im gerufenen Programm sondern gibt die Veränderung nicht zurück.

    Interface und *ENTRY sind nur unterschiedliche Compiler-Directiven, zur Laufzeit gibts da keinen Unterschied.
    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

  12. #12
    Registriert seit
    Apr 2008
    Beiträge
    83
    Okay. Das hab ich soweit. Danke erstmal dafür.

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Const verhindert nicht das verändern der Parameter im gerufenen Programm sondern gibt die Veränderung nicht zurück.
    Dazu aber noch eine Frage.

    Folgendes Beispiel:
    PHP-Code:
         DPGM1             PR                  extpgm('PGM1')
         
    D EXT_VAR1                       1A   const
         
    D EXT_VAR2                       2A   const
         
    D EXT_VAR3                       3A   const

         
    D  VAR1           S              1A
         D  VAR2           S              2A
         D  VAR3           S              3A

           VAR3 
    'XYZ';
           
    PGM1(VAR1:VAR2:VAR3); 
    PGM1 kann VAR3 jetzt zwar auf 'ABC' ändern, es kommt aber nicht zurück, sondern es steht weiterhin 'XYZ' drin?

    Ich habe das mit einem Programm mit *ENTRY getestet und der Wert wird verändert, obwohl die Variable im Prototyp auf CONST steht.

    Es macht natürlich keinen Sinn den Wert der sich verändern soll als Konstante (im Beispiel: PGM1(VAR1:VAR2:'XYZ')) zu übergeben. Dann kann die Veränderung ja in keine Variable geschrieben werden.

Similar Threads

  1. alle Programme zu einen PF
    By steven_r in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 01-07-08, 15:33
  2. Call in einem Ile-RPG
    By dino in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 17-01-07, 09:23
  3. "remote" - call
    By hh-mi in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 15-11-06, 12:23
  4. CallP über mehrere Zeilen im Free-Format
    By edig in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 14-07-06, 15:48
  5. aktive Programme
    By jajonowak in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 12-06-06, 13:55

Berechtigungen

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