[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jun 2001
    Beiträge
    1.987

    Proceduraufruf auf variable ?

    Hi *all
    wenn ich einen Programmnamen zur Laufzeit erst zusammenbaue, und trotzdem mit callb arbeite, geht das mit
    eval call = %Paddr(variable)
    callb call parm ...

    Was muß ich machen um eine Procedur aufzurufen

    eval prc = %paddr(variable)
    eval wert = prc(x:y:z)

    so geht es leider nicht

    geht das überhaubt
    Danke Robi

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.887
    Zitat Zitat von Robi
    Hi *all
    wenn ich einen Programmnamen zur Laufzeit erst zusammenbaue, und trotzdem mit callb arbeite, geht das mit
    eval call = %Paddr(variable)
    callb call parm ...

    Was muß ich machen um eine Procedur aufzurufen

    eval prc = %paddr(variable)
    eval wert = prc(x:y:z)

    so geht es leider nicht

    geht das überhaubt
    Danke Robi
    Hallo Robi,

    wie sieht den Dein Prototyp aus?

    In dem folgenden Beispiel gibt es 3 Prozeduren (Wochentag auf Deutsch, Englisch, Französisch). Jede dieser Prozeduren hat einen eigenen Prototypen.

    Um diese Prozeduren variabel aufrufen zu können, musst Du einen zusätzlichen Prototypen generieren mit dem Schlüssel-Wort ExtProc und einer Variablen für den Procedure Pointer.

    Der Aufruf erfolgt dann mit diesem Prototypen.

    PHP-Code:
    D DayWeekPP       PR            10A   varying extproc(MyProcPtr)
    D  DayNum                        3U 0 const 
    Der Aufruf sieht dann wie folgt aus:
    PHP-Code:
    D MyProcPtr       S               *   ProcPtr  
    D DayDeutsch      C                   
    %PAddr('DAYWEEKD'
     *---------------------------------------------------------
     /
    Free
       Select
    ;                                    
       
    when MyFld 'F';               
            
    MyProcPtr = %PAddr('DAYWEEKF');        
       
    when MyFld 'E';               
            
    MyProcPtr = %PAddr('DAYWEEKE');
       
    other;               
            
    MyProcPtr DayDeutsch;
       
    EndSL;

       
    Ergebnis DayWeekPP(MyParm); 
     /
    End-Free 
    Birgitta
    Birgitta Hauser

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

  3. #3
    Registriert seit
    Jun 2001
    Beiträge
    1.987

    Jau, Danke

    Suuuper, danke
    das mit dem extProc hatte ich nicht
    Danke
    Robi

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.303
    Hallo,

    wobei bei dieser Variante für die %PADDR BIF ein Literal verwendet werden muss und die entsprechenden Prozeduren zur Compile Time gebunden werden.
    Eleganter geht das, wenn man sich die Procedure Pointer per API holt, dann braucht man zur Laufzeit nur den Namen der Prozedur, den Namen des Serviceprogramms und einen passenden Prototyp wie im obigen Beispiel.
    Ein ServiceProgramm, das per API zur Laufzeit bindet ist auf meiner Open Source Seite zu finden.
    Weiter Vorteile des dynamischen Bindens zur Laufzeit sind, dass man erst bindet, wenn die Prozedur das erste mal benötigt wird und man kann auch nach einem RCLACTGRP ohne Probleme erneut Binden.


    mfg

    Dieter Bender


    Zitat Zitat von B.Hauser
    Hallo Robi,

    wie sieht den Dein Prototyp aus?

    In dem folgenden Beispiel gibt es 3 Prozeduren (Wochentag auf Deutsch, Englisch, Französisch). Jede dieser Prozeduren hat einen eigenen Prototypen.

    Um diese Prozeduren variabel aufrufen zu können, musst Du einen zusätzlichen Prototypen generieren mit dem Schlüssel-Wort ExtProc und einer Variablen für den Procedure Pointer.

    Der Aufruf erfolgt dann mit diesem Prototypen.

    PHP-Code:
    D DayWeekPP       PR            10A   varying extproc(MyProcPtr)
    D  DayNum                        3U 0 const 
    Der Aufruf sieht dann wie folgt aus:
    PHP-Code:
    D MyProcPtr       S               *   ProcPtr  
    D DayDeutsch      C                   
    %PAddr('DAYWEEKD'
     *---------------------------------------------------------
     /
    Free
       Select
    ;                                    
       
    when MyFld 'F';               
            
    MyProcPtr = %PAddr('DAYWEEKF');        
       
    when MyFld 'E';               
            
    MyProcPtr = %PAddr('DAYWEEKE');
       
    other;               
            
    MyProcPtr DayDeutsch;
       
    EndSL;

       
    Ergebnis DayWeekPP(MyParm); 
     /
    End-Free 
    Birgitta
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Jun 2001
    Beiträge
    1.987

    Stimmt

    Hallo Dieter,
    Du hast (leider) Recht,
    wir haben drei Variablen die z.B. mit 'M' 'DT' 'TT' gefüllt werden. Daraus ergibt sich ein Procedurname CLC_MDTTT
    und ein coding : eval wert = procedurname(feld1:feld2)
    Das geht so nicht, es sei denn ich weiß alle möglichen Inhalte und kombinationen der drei variablen und erfasse eine Select Gruppe wie es bei Brigittas beispiel ist. Da uns das zu Starr ist werden wir mal auf deiner Freeware Seite wildern. Bei erfolg werde ich mich auf jedenfall noch mal melden.

    Der Vorteil, das die Procedur nicht zum Programmaufruf geladen wird, ist genial. So kann ein Trigger Proceduren verwenden, und bricht auch nicht ab, wenn er aus neutraler Umgebung aufgerufen wird(SQL-Upd ohne gute Lib.list)

    Erstmal vielen Dank
    Robi

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.343
    Da würde ich mich eher fragen, was diese Prozeduren denn so geniales treiben ?
    Sieht mir irgendwie nach Datumskonvertierungen aus, die mit RPGLE auch direkt gehen.
    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

  7. #7
    Registriert seit
    Jun 2001
    Beiträge
    1.987

    Fast richtig

    Hi,
    fast richtig,
    der Benutzer(EDV-Leiter) erfasst in einer Formeldatei <feldname>xx mit xx = TT für Tag, mm für Monat ... bis zm für Zeitmarke. eine Formel sieht dann z.b. so aus :
    TT = &Heute - <feld1>DT - <feld3>tt
    Ein Pgm ermittelt die Feldwerte und bedient sich der Dynamischen Servicepgmme.
    Die rechnen und geben einen Wert und eine definierte Einheit zurück.
    erst clc_mdtdt, (rückgabe = TT)
    dann CLC_mtttt, (rückgabe TT)
    (Klammern würden berücksichtigt)

    Das Ergebnis der Formel kann im Subfile angezeigt werden oder auf Listen gedruckt. Bei der Erfassung wird die Existenz des Servicepgm's geprüft und die Formel ggf. abgewiesen. Neue Ideen erfordern nur neue Servicepgmme. (umrechnung von Durchmesser nach Laufmeter ...)

    was immer auch kommt, wir können es ...
    Gruß
    Robi

  8. #8
    Registriert seit
    Jun 2001
    Beiträge
    1.987

    Nachtrag

    Grade, aus der Praxis, eine neue Anforderung.
    TV für Tage unter Berücksichtigung des Versandkalenders

    Bsp. Lieferdatum - Liefertage unter Berücksichtigung des Versandkalenders = abfahrtsdatum ( ergänzbar um anliefeungszeit, beladezeit ...)

    Wenn das Pgm steht, braucht nur ein Srvpgm nachgeliefert werden.
    Robi

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.343
    Dann würde ich empfehlen, die Funktionen als eigenständige Programme aufzurufen anstatt Serviceprogramme zu verwenden.
    Vorteile:
    - Kein Binden von Serviceprogrammen
    - Aufruf mit Variable
    Die Performance ist weiterhin gut, da nur der 1. Aufruf eines Programmes etwas dauert.
    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
    Jun 2001
    Beiträge
    1.987

    Klappt prima

    Haben die Definitionen von Dieter kopiert und integriert.
    funktioniert Prima. ist auch schnell genug
    Danke Dieter und Brigitta

    @Fuerchau
    So hätten wir es früher gemacht. Die halbe Software arbeitet so. (siehe fragestellung oben) Dies ist mal was neues. und irgendwie sexy

    Wenn ich alles richtig verstanden habe, müßte ich, wenn ich Proceduren immer so rufe, diese jederzeit im laufenden Betrieb tauschen können, da die PRC immer neu geöffnet / ermittelt wird. Hört sich langsam an, is aber ok

    Gruß
    Robi

  11. #11
    Registriert seit
    Mar 2002
    Beiträge
    5.303
    Hallo,

    wenn man die bereits geladenen Procedures cached, dann ist das genauso schnell, wie statisch gebunden. Wenn man die nicht cached, macht auch nicht soviel aus, weil die Aktiviwerung erhalten bleibt solange die Activation Group lebt.
    Diese Technik des dynamischen bindens ist inter anderem im Einsatz in einem Ladeprozess für ein Datawarehouse mit Millionen von Transaktionen, wo es in erster Linie auf optimale Performance und erst in zweiter Hinsicht auf Flexibilität ankommt.

    mfg

    Dieter Bender

    Zitat Zitat von Robi
    Haben die Definitionen von Dieter kopiert und integriert.
    funktioniert Prima. ist auch schnell genug
    Danke Dieter und Brigitta

    @Fuerchau
    So hätten wir es früher gemacht. Die halbe Software arbeitet so. (siehe fragestellung oben) Dies ist mal was neues. und irgendwie sexy

    Wenn ich alles richtig verstanden habe, müßte ich, wenn ich Proceduren immer so rufe, diese jederzeit im laufenden Betrieb tauschen können, da die PRC immer neu geöffnet / ermittelt wird. Hört sich langsam an, is aber ok

    Gruß
    Robi
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.303
    @Baldur: Das ist doch gerade der Witz an der Sache mit dem API, dass kein statisches Binden erforderlich ist. Den Hauptvorteil bei der Verwendung von Procedures versus Programme sehe ich in:
    - Langnamen möglich
    - Call by Value möglich
    - Rückgabe Variablen möglich
    - multi entrante Serviceprogramme
    Dass die Performance optimal ist, ist nur ein Nebeneffekt, der feinstkörnige Modularisierung ermöglicht.
    Ein anderer Nebeneffekt ist, dass die Schwächen des originalen Aktivierungsprozesses überwunden werden; beim RCLACTGRP kann ich im Errorhandler einfach nachbinden.

    mfg

    Dieter

    Zitat Zitat von Fuerchau
    Dann würde ich empfehlen, die Funktionen als eigenständige Programme aufzurufen anstatt Serviceprogramme zu verwenden.
    Vorteile:
    - Kein Binden von Serviceprogrammen
    - Aufruf mit Variable
    Die Performance ist weiterhin gut, da nur der 1. Aufruf eines Programmes etwas dauert.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. Duplex-Druck auf vorbedrucktem Papier
    By jgv in forum NEWSboard Drucker
    Antworten: 7
    Letzter Beitrag: 02-08-13, 09:28
  2. Kein Zugriff über QNTC auf Win-Share
    By marmart in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 25-09-07, 15:29
  3. Nachricht CPDB053 beim Zugriff auf Windows Freigabe
    By schatte in forum NEWSboard Windows
    Antworten: 7
    Letzter Beitrag: 21-11-06, 11:37
  4. QNTC Zugriff auf CD Laufwerk Fehlerhaft
    By pwrdwnsys in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 07-11-06, 15:34
  5. Status nach Druck nich SAV, sonder Drucker auf END
    By zannaleer in forum NEWSboard Drucker
    Antworten: 6
    Letzter Beitrag: 13-09-06, 10:35

Berechtigungen

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