-
2 Möglichkeiten:
a) solange rückwärts im Callstack senden, bis das 1. Programm nicht mit "Q" anfängt.
b) in der DS MsgInf wird auch die Lib übergeben, also prüfen bis Lib <> QSYS
Dabei würde ich allerdings spezielle Programmnamen wie von STRSQL spezifisch behandeln.
-
Ich mache das (seit V5R2) so:
Code:
* --------------------------------------------------------
* API-Definitionen CALLSTACK
* --------------------------------------------------------
DGetStack pr extpgm('QWVRCSTK')
d 2000
d 10I 0 const
d 8 const
d 56
d 8 const
d 16
dStackInfo ds 2000
d ByteAvail 10I 0 inz(%size(StackInfo))
d ByteReturn 10I 0
d Entries 10I 0
d Offset 10I 0
d Count 10I 0
dApiErr ds
d ErrAvail 10I 0 inz(16)
d ErrReturn 10I 0
d ErrReserv 1
d ErrMsg 7
dStackID ds
d IdInfo 26 inz('*')
d IdInt 16 inz
d IdRes 2 inz(*loval)
d IdThread 10I 0 inz(1)
d IdThId 8 inz(*loval)
dStackPtr s *
dStackEntry ds based(StackPtr)
d EntryLen 10I 0
d EntryDispSt 10I 0
d EntryStmtNo 10I 0
d EntryDispPr 10I 0
d EntryProcLen 10I 0
d EntryReqLvl 10I 0
d EntryPgm 10
d EntryLib 10
d StackAct s 10I 0
d FirstQ s 1
c/free
callp GetStack(StackInfo:%size(StackInfo):'CSTK0100'
:StackId:'JIDF0100':ApiErr);
if ErrReturn = *zero;
StackPtr = %addr(StackInfo) + Offset;
FirstQ = *off;
for StackAct = 0 to Entries - 1;
if FirstQ = *off;
if %subst(EntryPgm:1:1) = 'Q';
FirstQ = *on;
endif;
else;
if %subst(EntryPgm:1:1) <> 'Q'
or EntryLib <> 'QSYS';
LEPROG = EntryPgm; // gefundenes Programm
LEPLIB = EntryLib; // in Lib
leave;
endif;
endif;
StackPtr += EntryLen;
endfor;
/endfree
-
Eigentlich ist das ziemlich einfach. Das eigentliche Trigger-Programm wird durch eines der beiden QDBPUT (für Input-Trigger) oder QDBUDR (für Undate/Delete/Read-Trigger) aufgerufen. Damit muss man nur das Programm, das im Callstack vor dem entsprechenden Aktivierungsprogramm liegt ermitteln.
Birgitta
-
Das ist leider nicht ganz richtig.
Bei mir liegt bei COBOL zwischen dem QDBUDR und dem Auslöser noch das QLNRFIDX.
Ich muss also weiter gehen.
Je nach Programmsprache können da schon Unterschiede im Callstack durch Runtime-Programme auftreten.
"Q"-Programme ist auch nicht eindeutig, da durch Programmerstellung und Verschiebung in QRPLOBJ das Objekt dort auch mit "Q" anfängt, deshalb ist hier die Lib auch wieder entscheidend.
-
 Zitat von B.Hauser
Eigentlich ist das ziemlich einfach. Das eigentliche Trigger-Programm wird durch eines der beiden QDBPUT (für Input-Trigger) oder QDBUDR (für Undate/Delete/Read-Trigger) aufgerufen. Damit muss man nur das Programm, das im Callstack vor dem entsprechenden Aktivierungsprogramm liegt ermitteln.
Birgitta
Hallo Birgitta,
im Internet hast du folgendes zu QDBPUT/QDBUDR gepostet.
Code:
/*****************************************************************/
/* Object. . . . . . . . . : PRVPGM */
/* Funkcion. . . . . . . . : Retrieve Caller Programm */
/* from Call Stack */
/* Parameter . . . . . . . : CALLER 10 A */
/* CALLED 10 A */
/* Author . . . . . . . . : B.Hauser */
/*****************************************************************/
PGM PARM(&CALLER +
&CALLED)
/* ---------------------------------------------------------------*/
DCL VAR(&CALLER) TYPE(*CHAR) LEN(10)
DCL VAR(&CALLED) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4)
DCL VAR(&SENDER) TYPE(*CHAR) LEN(80)
/* ---------------------------------------------------------------*/
SNDPGMMSG MSG('TEST') +
TOPGMQ(*PRV (&CALLED)) +
MSGTYPE(*RQS) +
KEYVAR(&MSGKEY)
RCVMSG PGMQ(*PRV (&CALLED)) +
MSGKEY(&MSGKEY) +
SENDER(&SENDER)
CHGVAR VAR(&CALLER) VALUE(%SST(&SENDER 56 10))
ENDE: ENDPGM
Mein Problem ist das ich ermitteln muss woher das Update(QDBUDR) kommt.
Habe ein PF-File wo als "Triggerprogramm" ein Cl hinterlegt(JRN050CL) ist, das wiederum andere CL-aufruft.
Das dritte CL ruft ein RPG-Programm auf und schreibt im Endeffekt den geänderten Satz.
Wie ermittle ich nach deiner Methode den Aufruf?
Muss ich im RPG-Programm nach den Wert 'QDBUDR' abfragen und dann das CL-aufrufen.
Wie müsste der Aufruf des CL in einem Rpg-Pgm aussehen?
lg und Dank im Voraus
-
Dein aufgerufenes Programm ist QDBUDR und das rufende Programm must Du ermitteln.
Also übergibst Du im Parameter CALLED QDBUDR und bekommts in CALLED das Programm, das den Trigger aktiviert hat.
Birgitta
-
Wir brauchen diese Funktion auch ab und zu.
Dafür haben wir einen Trigger, (der nur angehängt wird wenn wir das brauchen), der mit dem Dateinamen in einer Datei nachsieht ob er protokollieren soll. Wenn ja schreibt er den gesammten Pgm Stack und einige zus. Infos (Datum Zeit, User, ...) in eine Datei mit 30 Programm-Namen Feldern.
Häufig ist nämlich nicht nur das Pgm, sondern auch der Aufruf von Interesse.
Allerdings haben bei uns alle Dateien einer allg. Trigger, der den eigentlichen Trigger aus einer Datei ausliest und per Call ruft.
Das hat den Vorteil, das wir zu jeder Zeit Trigger "runter" / "rauf" schalten können.
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Habe es jetzt umgesetzt und bekomme aber einen Fehler.
Mein Rpg-Code
Code:
D PRVPGM PR EXTPGM('PRVPGM')
D CALLER_ 10A Options( *Omit )
D CALLED_ 10A Options( *Omit )
D*
D CALLER_ID S 10A
D CALLED_ID S 10A
:
:
IF CHGPGM = 'QDBUDR';
CALLER_ID = 'QDBUDR';
CALLED_ID = *BLANKS;
CALLP(E) PRVPGM(CALLER_ID : CALLED_ID);
IF CALLED_ID <> *BLANKS AND %ERROR = *OFF;
CHGPGM = CALLED_ID;
ELSE;
IF %ERROR;
CHGPGM = 'ERR:PRVPGM';
ENDIF;
ENDIF;
ENDIF;
Joblog
Code:
Modulquelle anzeigen
Programm: PRVPGM Bibliothek: SRCTST Modul: PRVPGM
14 DCL VAR(&SENDER) TYPE(*CHAR) LEN(80)
15 /* ---------------------------------------------------------------*/
16 SNDPGMMSG MSG('TEST') TOPGMQ(*PRV (&CALLED)) MSGTYPE(*RQ
17
18 RCVMSG PGMQ(*PRV (&CALLED)) MSGKEY(&MSGKEY) SENDER(&S
19
20 CHGVAR VAR(&CALLER) VALUE(%SST(&SENDER 56 10))
21
22 ENDE: ENDPGM
Weitere Nachrichteninformationen
Nachrichten-ID . . . . : CPA0702 Bewertung . . . . . . : 99
Nachrichtenart . . . . : Anfrage
Sendedatum . . . . . . : 17.08.10 Sendezeit . . . . . . : 11:12:50
Nachricht . . . : (C D I R) CPF2469 von Prozedur PRVPGM empfangen.
Ursache . . . . : Die ILE CL-Prozedur PRVPGM in Modul PRVPGM in Programm
PRVPGM in Bibliothek SRCTST stellte einen Fehler bei Anweisungsnummer
0000000116 fest. Der Nachrichtentext für CPF2469 ist: Fehler aufgetreten
beim Senden der Nachricht . Die Taste F10 (falls verfügbar) oder den Befehl
DSPJOBLOG (Jobprotokoll anzeigen) verwenden, um die Nachrichten im
Jobprotokoll aufzulisten und eine ausführlichere Beschreibung der
Fehlerursache zu erhalten. Kann das Problem trotzdem nicht gelöst werden,
den technischen Dienst verständigen.
Fehlerbeseitigung: Diese Abfragenachricht kann vermieden werden, indem die
Prozedur geändert wird. Nachrichten auf den Fehler hin überwachen (Befehl
MONMSG) und den Fehler in der Prozedur beheben. Um fortzufahren, einen
Weitere ...
Eingabetaste --> Weiter
Öffnen von Teildatei ZPG001P in SEQONLY(*NO) geändert.
Abfrageoptionsdatei kann nicht abgerufen werden.
Aufrufstapeleintrag nicht gefunden.
Fehler aufgetreten beim Senden der Nachricht .
Funktionsprüfung. CPF2469 nicht überwacht durch PRVPGM bei Anweisung
0000000116, Instruktion X'0000'.
(C D I R) CPF2469 von Prozedur PRVPGM empfangen.
? I
Teildatei oder Kennsatz in Ausgangsdatei nicht gefunden oder
zurückgestellt.
Wegen eines Fehlers Kopierbefehl beendet.
Abfrageoptionsdatei kann nicht abgerufen werden.
Abfrageoptionsdatei kann nicht abgerufen werden.
1 Sätze aus Teildatei QDEFAULT kopiert.
Was habe ich falsch gemacht?
Feld CHGPGM wird über ein Srv-Pgm befüllt(Stackaufruf).
-
Halte den Prozess mal auf dem SNDPGMMSG an und schaue dir die CALL-Stack mal genau an.
Wenn das Programm im Stack nicht gefunden wird, gibts was auf die Finger.
-
Aufrufstappel ist:
Code:
Art Programm Anweisung Prozedur
QCMD QSYS /04FA
ADDLIBLE TSTPGM 2100 /0034
QUOCPP QPDA /07A0
QUOMAIN QPDA /011E
1 QUOCMD QSYS /01EA
MNU01C TSTPGM 6900 /008F
MNU01R T_TSTOBJ _QRNP_PEP_MNU01R
MNU01R T_TSTOBJ 457 MNU01R
TPGM03 T_TSTOBJ _QRNP_PEP_TPGM03
TPGM03 T_TSTOBJ 2495 TPGM03
QRNXIO QSYS 49 _QRNX_DB_UPDATE
QDBUDR QSYS /0853
Update wurde vom Testprogramm TPGM03 gemacht.
-
Wie du siehst gibts noch eine Runtimeebene dazwischen, QRNXIO.
Aus OPM wird aber QDBUDR direkt aufgerufen.
Und wie siehts bei SQL oder UPDDTA aus?
Ich habe mir dafür mal eine kleine Routine geschrieben, die den CALL-Stack (API) nach oben durchläuft und das 1. Programm sucht, dass nicht in einer Q-Lib liegt und nicht mit Q beginnt.
Denn dein SNDPGMMSG kann da nicht alle Varianten durchtesten, denn man muss wirklich mit der höchsten Variante anfangen. Aber wer sagt dir denn, dass nicht durch mehrere Trigger und diversen Zwischenstufen nicht das QRNXIO sehr viel höher liegt als der aktuelle Verursacher?
Ohne eine Stackuntersuchung ist das SNDPGMMSG-Verfahren nur noch für OPM ohne SQL gültigt.
Und noch eine Variante:
Die Anwendung benutzt Filehandler-Programme. Wenn nun jedesmal der Filehandler auftaucht ist der tatsächliche Verursacher nur zu finden, wenn man den Aufrufer des Filehandlers ermittelt.
Deshalb habe ich die CALL-Stackanalyse auch in jedem Trigger individualisiert.
-
Habe die von dir angegeben Variante getestet.
Hätte noch eine Frage:
Updates mit:
UPDDTA = QDZTD00001
SQL = QSQISE
gibt es sonst noch andere Ausnahmen die Updates machen können(außer Programme)?
Similar Threads
-
By froehlich in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 06-02-03, 14:37
-
By Robi in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 28-05-02, 16:45
-
By lorenzen in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 11-01-02, 13:49
-
By Liebhoff in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 20-11-01, 19:52
-
By Frank Pusch in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 17-05-01, 09:34
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