[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Aug 2004
    Beiträge
    923

    Question Retrieve Call Stack (QWVRCSTK) API

    Hallo,

    erst mal schönen tag aus berlin.
    ich möchte in einem triggerprogramm (RPG) wissen, welches programm diesen trigger ausgelöst hat.
    die einfachste möglichkeit scheint mir den "Retrieve Call Stack (QWVRCSTK) API" aufzurufen...
    nur leider kriege ich das absolut nicht gebacken...
    hat jemand zufällig nen beispiellisting, möglichst in altem rpg?
    als alternative habe ich in den usertools gesucht, aber da ist der rtvpgmstk angeblich seit v3wasweissich nicht mehr bei und nun komme ich nicht weiter...
    ach ja, noch was: ein simples wrkjob nach *print und wieder einlesen darf ich wegen performencegründen leider nicht machen...

    any ideas? help!

    grussle
    kuempi

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    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 2004
    Beiträge
    923

    Angry danke, aber....

    Zitat Zitat von Fuerchau
    danke fuerchau, aber das ist genau das was ich nicht suche...
    es sollte wirklich per apicall gehen.
    ein cl was ne liste erstellt und die dann eingelesen wird geht leider leider nicht....
    mein chef hat diesen weg ausdrücklich verneint.
    wenn ich nur den blöden api ansteuern könnte... die doku bei ibm ist unter aller kanone dazu... kann aber auch an mir liegen, habe ewig nicht mehr mit apis gearbeitet..
    die links bei ibm helfen auch nicht weiter...
    habe irgendwo noch ne redbook cd rumfliegen... mal sehen ob ich da was finde..

    *grummel*

    in diesen sinne

  4. #4
    Registriert seit
    May 2002
    Beiträge
    2.643

    API Beispiel

    Hallo Kuempi,
    vielleicht hilft Dir dies weiter:

    quick method to determine the name of the calling program in RPG400

    From: "Peter Connell"
    Infinitely, IBM has kindly provided us with QWVRCSTK at V5.
    Here's a "quickee" I whipped up to prove it.

    D GetCaller PR Extpgm('QWVRCSTK')
    D 2000
    D 10I 0
    D 8 CONST
    D 56
    D 8 CONST
    D 15

    D Var DS 2000
    D BytAvl 10I 0
    D BytRtn 10I 0
    D Entries 10I 0
    D Offset 10I 0
    D EntryCount 10I 0
    D VarLen S 10I 0 Inz(%size(Var))
    D ApiErr S 15

    D JobIdInf DS
    D JIDQName 26 Inz('*')
    D JIDIntID 16
    D JIDRes3 2 Inz(*loval)
    D JIDThreadInd 10I 0 Inz(1)
    D JIDThread 8 Inz(*loval)

    D Entry DS 256
    D EntryLen 10I 0
    D PgmNam 10 Overlay(Entry:25)
    D PgmLib 10 Overlay(Entry:35)
    D
    C CallP GetCaller(Var:VarLen:'CSTK0100':JobIdInf
    C :'JIDF0100':ApiErr)
    C Do EntryCount
    C Eval Entry = %subst(Var:Offset + 1)
    C Eval Offset = Offset + EntryLen
    C Enddo
    C Eval *InLR = *on

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Das Problem ist, dass du auf diesem Wege nur das Programm unmittelbar vor dem Trigger bekommst.
    Dieses ist allerdings nicht der Auslöser sondern ein Systemprogramm. Schau dir mal mittels Debugger den Callstack genau an, wieviel Programme ggf. noch dazwischen liegen.
    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
    Aug 2004
    Beiträge
    923

    QWVRCSTK

    Zitat Zitat von TARASIK
    Hallo Kuempi,
    vielleicht hilft Dir dies weiter:
    hello tarasik,

    das sieht mir verdächtig nach ile-rpg aus. werde ich mal vorsichtig eintippen. habe leider keine erfahrungen damit. scheint aber genau das zu sein was ich benötige...
    mhh...
    hoffe mal, das ich den call zu diesem ile-teil ohne probs in mein olles rpg reinbekomme.
    interpretiere ich die source richtig, dass da 10 mal ne schleifwe durchlaufen wird? dann muss ich ergo noch den "richtigen caller" finden und nen parm ans ile-rpg ranhängen, damit ich das zurückgeliefert bekomme was ich suche?
    denke mal bis montag oder so kann ich mehr dazu sagen.
    ist ca cool wie schnell hier geholfen wird.

    oder noch besser, ich finde jemand, der mir das umsetzt von ile nach "oldstyle"-rpg...

    es wird echt zeit, dass ich ile-rpg lerne denke ich.
    mag jemand nen gutes buch empfehlen?

    so long erstmal

    kuempi

  7. #7
    Registriert seit
    Aug 2004
    Beiträge
    923

    huch

    Zitat Zitat von Fuerchau
    Das Problem ist, dass du auf diesem Wege nur das Programm unmittelbar vor dem Trigger bekommst.
    Dieses ist allerdings nicht der Auslöser sondern ein Systemprogramm. Schau dir mal mittels Debugger den Callstack genau an, wieviel Programme ggf. noch dazwischen liegen.
    so schnell kann ich gar nicht tippen wie hier die antworten reinkommen... *lach...
    ja das mit dem callstack dachte ich mir schon...

    *seufz*

    da kommt mir noch eine idee, ich könnte ja das triggerprogramm per call hier in dieses teil einbauen? mmhh...
    das hat aber auch 2 parms... dann muss ich die rüberschleifen...
    ich merk schon... ist alles komplizierter als geträumt..

    kuempi

  8. #8
    Registriert seit
    May 2002
    Beiträge
    2.643

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von kuempi von stein
    es sollte wirklich per apicall gehen.
    ein cl was ne liste erstellt und die dann eingelesen wird geht leider leider nicht....
    mein chef hat diesen weg ausdrücklich verneint.
    Darfst Du überhaupt kein CL verwenden oder nur keines das eine Liste erstellt?

    Mit CL gibt es nämlich einen ganz einfachen Weg das rufende Programm zu ermitteln, über Send/Receive Message.

    Hier das CL-Programm, vielleicht hilfts:
    P$CALLED wird als Parameter übergeben, und P$CALLER ist das Programm im Call-Stack, für das das rufende Programm ermittelt werden soll.
    Code:
                 PGM        PARM(&P$CALLER           +                     
                                 &P$CALLED)                
     
                 DCL        VAR(&P$CALLER) TYPE(*CHAR) LEN(10)             
                 DCL        VAR(&P$CALLED) TYPE(*CHAR) LEN(10)             
                                                                           
                 DCL        VAR(&MSGKEY)   TYPE(*CHAR) LEN(4)              
                 DCL        VAR(&SENDER)   TYPE(*CHAR) LEN(80)             
                                                                           
                 SNDPGMMSG  MSG('TEST') TOPGMQ(*PRV (&P$CALLED)) +         
                              MSGTYPE(*RQS) KEYVAR(&MSGKEY)                
                                                                           
                 RCVMSG     PGMQ(*PRV (&P$CALLED)) MSGKEY(&MSGKEY) +       
                              SENDER(&SENDER)                              
                                                                           
                 CHGVAR     VAR(&P$CALLER) VALUE(%SST(&SENDER 56 10))
    ENDE:        ENDPGM

    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

  10. #10
    Registriert seit
    Aug 2004
    Beiträge
    923

    Thumbs up Vielen Dank an ALLE

    Zitat Zitat von B.Hauser
    Darfst Du überhaupt kein CL verwenden oder nur keines das eine Liste erstellt?
    Birgitta
    Sodele ...

    erst mal vielen Dank an die vielen Helferlein!
    Die Variante mit dem CL funktioniert.
    Da muss dann natürlich als callendes Programm z.B. QDBPUT gegeben werden, wenn ich den Trigger auf Insert habe.
    Wie auch immer, ein SNDPGMMSG mit anschliessenden RCVMSG scheint mir auch nicht ganz so ressourcenfressend zu sein wie eine Ausgabe nach Liste und diese dann einzulesen...
    Die ILE-Geschichte hab ich leider nicht auf Anhieb gebacken bekommen. Interessant, aber da muss ich erst mal ein wenig Autodidaktik betreiben...
    Aber der Tag hat ja leider nur 24 Stunden... :-))

    Also, nochmal ein Dankeschön und schönes WE dann irgendwann...

    kuempi

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Was nützt dir die Info, das ein QDB-Programm der Auslöser ist ?
    Die sind es doch immer !
    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
    Aug 2004
    Beiträge
    923

    ANtwort

    Zitat Zitat von Fuerchau
    Was nützt dir die Info, das ein QDB-Programm der Auslöser ist ?
    Die sind es doch immer !
    ähmm... ich habe mich vermutlich schlecht ausgedrückt.
    alsooooo
    Sagen wir mal PGM4711 macht einen Insert auf eine Datei ...
    Dann steht im Stack als Letzter caller VOR dem Triggerprogramm eben QDBdingens..
    Und diesen Namen muss man im CL mitgegebn...
    weil die Frage ist ja eben nicht welches Systemprogramm den Trigger ausgelöst hat, sondern welches Anwenderprogramm hat das Systemprogramm gerufen, welches dann eben den Trigger auslöst......
    Wenn ich in dem Beispiellistung von der Brigitte als Anfrager den Namen des TriggerPGM mitgebe würde ich den QDBdingens zurückbekommen...
    Gebe ich aber QDBdingens als Frage kommt der Name des ANwenderprogrammes...
    Aber was rede ich mir den Mund fusselig? Das weisste doch eh alles...
    Ich hatte mich nur schlecht ausgedrückt anscheinend..
    Anyway...

    ICH SAGE NOCHMAL DANKE AN ALLE!!!!

    Werde in Zukunft hier öfter mitmischen denke ich...

    Grüsse und so aus dem verregneten Berlin

    kuempi

Similar Threads

  1. Probleme API QUSLJOB aufzurufen
    By TMusolf in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 25-01-07, 12:42
  2. javamail api
    By jogisarge in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 22-11-06, 16:02
  3. "remote" - call
    By hh-mi in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 15-11-06, 12:23
  4. CALL PGM schlägt fehl
    By alexander may in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 18-05-06, 20:16
  5. rekursiver Call
    By Marimari1009 in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 03-05-06, 17:30

Berechtigungen

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