-
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
-
-
danke, aber....
 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
-
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
-
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.
-
huch
 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
-
-
QWVRCSTK
 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
-
 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
-
Vielen Dank an ALLE
 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
-
Was nützt dir die Info, das ein QDB-Programm der Auslöser ist ?
Die sind es doch immer !
-
ANtwort
 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
-
By TMusolf in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 25-01-07, 12:42
-
By jogisarge in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 22-11-06, 16:02
-
By hh-mi in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 15-11-06, 12:23
-
By alexander may in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 18-05-06, 20:16
-
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
-
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