[NEWSboard IBMi Forum]

Thema: SQL-Trigger

Hybrid View

  1. #1
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von loeweadolf
    Kann bei RPG evtl. auch der RPG-Name ermittelt werden ?
    Das ist relativ einfach. Mit dem CL-Programm kannst Du Dich durch den kompletten Call-Stack hangeln. Einfach immer das ermittelte rufende Programm als aufgerufenes Programm übergeben. Das wird solange ausgeführt, bis Du den ersten Eintrag findest, der nicht mit Q anfängt. (Wenn Deine Programm-Namen allerdings mit Q anfangen hast Du verloren!)

    Falls Du auch noch Modul und Prozedur ermitteln willst, musst Du die entsprechenden Informationen im SNDPGMMSG bei TOMSGQ angeben. Das rufende Modul wird im Sender ab Stelle 355 ausgegeben und die rufende Prozedur ab Stelle 375.

    Alternativ kannst Du natürlich auch den CALL-Stack über das API QWVRCSTK (Retrieve Call Stack).

    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Wenn du eine Datei journalisierst, stehen Programm, User und Zeitmarke im Journal.
    Ansonsten per RPG in der SDS den *USER-Eintrag oder per RTVJOBA den User abfragen.

    Und was den Parameterstyle angeht:
    Bei SQL werden noch NULL-Flag-Zeiger und eine Status-Area übergeben, bei General eben nur die Parameter.
    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
    Jul 2003
    Beiträge
    338

    Question

    Das CL habe ich erweitert um die Ermitteln des Users. Die Stored Procedure habe ich ergänzt um einen weiteren OUT-Parameter für ds obige CL für den User. Das klappt wohl.


    Zitat Zitat von Birgitta
    Das ist relativ einfach. Mit dem CL-Programm kannst Du Dich durch den kompletten Call-Stack hangeln. Einfach immer das ermittelte rufende Programm als aufgerufenes Programm übergeben. Das wird solange ausgeführt, bis Du den ersten Eintrag findest, der nicht mit Q anfängt. (Wenn Deine Programm-Namen allerdings mit Q anfangen hast Du verloren!)
    Ich habe das so verstannden, dass ich eine Schleife in das CL einbauen kann, die solange durchlaufen wird, bis der ermittelte Aufruf-Name nicht mehr mit -Q- anfängt.

    Den Wert aus &CALLER bringe ich dann nach &CALLED und wiederhole das SNDPGMMSG.

    Bei der ersten Wiederholung des SNDPGMMSG kommt allerdings folgende Fehlermeldung:

    PHP-Code:
     Job 060880/LUMU/LUMU_A im Subsystem QINTER in QSYS am 03.01.06 um 01:52:11 g   
     Nachrichtenwarteschlange LUDGER ist anderem Job zugeordnet
    .                      
     
    CPF2469 von TRIWERCL bei 2600 empfangen. (C D I R)                             
                                                                                    
                           
    Weitere Nachrichteninformationen                      
                                                                                 
    Nachrichten
    -ID . . . . :   CPA0701       Bewertung  . . . . . . :   99       
    Nachrichtenart 
    . . . . :   Anfrage                                           
    Sendedatum 
    . . . . . . :   03.01.06      Sendezeit  . . . . . . :   01:53:26 
                                                                                 
    Nachricht 
    . . . :   CPF2469 von TRIWERCL bei 2600 empfangen. (C D I R)       
    Ursache . . . . . : Das CL-Programm TRIWERCL in Bibliothek MUHSTANPGM hat    
      einen Fehler bei Anweisung 2600 erkannt
    Der Nachrichtentext für CPF2469   
      ist
    Fehler aufgetreten beim Senden der Nachricht .. 

    Was könnte die Ursache sein ?

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Du kannst deinen Triger auch ganz normal debuggen (mittels STRDBG und Umwandlungsoption) um den Inhalt deiner Variablen anzusehen.
    Irgendwie kommst du auf die MSGQ LUDGER und nicht auf die Job-MSGQ !
    Ggf. zerstörst du die die Variablen mit dem User-Namen ?!
    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

  5. #5
    Registriert seit
    Jul 2003
    Beiträge
    338

    Thumbs down

    Es wird jetzt die JOB-MSGQ verwendet.


    Da immer noch derselbe Fehler kam, habe ich die Schleife
    aus dem CL rausgenommen und als Schleife jeweils ein 2. CL
    aufgerufen, um den Namen zu ermittel, jeweils mit Übergabe
    des zuluetzt ermitteln "CALLER"
    Immer derselbe Fehler, auch ein DUMP bringt mich nicht weiter.
    Vielleicht fehlen mir auch die kenntnisse bzgl. Nachrichtenschlangen.

    Da ich mich jetzt anderen Dingen widmen muss, gebe ich zunächst mal auf.

    mfg. Ludger

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Vielleicht hilft dir ja folgendes CLP ein wenig:

    Code:
     
    			 PGM		PARM(&START &PROG)							  
    																		
    			 DCL		VAR(&START) TYPE(*CHAR) LEN(10)				 
    			 DCL		VAR(&PROG) TYPE(*CHAR) LEN(10)				  
    																		
    /* API-FELDER */														
    			 DCL		VAR(&RCV) TYPE(*CHAR) LEN(9999)				 
    			 DCL		VAR(&RCVLEN) TYPE(*CHAR) LEN(4)				 
    			 DCL		VAR(&RCVFMT) TYPE(*CHAR) LEN(8) VALUE(CSTK0100) 
    			 DCL		VAR(&JOBID) TYPE(*CHAR) LEN(56)				 
    			 DCL		VAR(&JOBFMT) TYPE(*CHAR) LEN(8) VALUE(JIDF0100) 
    			 DCL		VAR(&ERRCD) TYPE(*CHAR) LEN(128)				
    																		
    /* ARBEITSFELDER */													 
    			 DCL		VAR(&NOCENT) TYPE(*DEC) LEN(9)				  
    			 DCL		VAR(&OFFSET) TYPE(*DEC) LEN(9)				  
    			 DCL		VAR(&ENTRY) TYPE(*DEC) LEN(9)			 
    			 DCL		VAR(&ENTLEN) TYPE(*DEC) LEN(9)			
    			 DCL		VAR(&POS) TYPE(*DEC) LEN(9)			   
    			 DCL		VAR(&PGM) TYPE(*CHAR) LEN(10)			 
    			 DCL		VAR(&LIB) TYPE(*CHAR) LEN(10)			 
    																  
    /* INIT'S */													  
    			 CHGVAR	 VAR(%BIN(&RCVLEN)) VALUE(9999)			
    			 CHGVAR	 VAR(%BIN(&ERRCD 1 4)) VALUE(128)		  
    			 CHGVAR	 VAR(%BIN(&ERRCD 5 4)) VALUE(0)			
    			 CHGVAR	 VAR(%SST(&JOBID 1 10)) VALUE('*')		 
    			 CHGVAR	 VAR(%SST(&JOBID 43 2)) VALUE(X'0000')	 
    			 CHGVAR	 VAR(%BIN(&JOBID 45 4)) VALUE(1)		   
    			 CHGVAR	 VAR(%SST(&JOBID 49 8)) +				  
    						  VALUE(X'0000000000000000')			  
    																  
    /* AUFRUF */														   
    			 CALL	   PGM(QWVRCSTK) PARM(&RCV &RCVLEN &RCVFMT +	  
    						  &JOBID &JOBFMT &ERRCD)					   
    																	   
    			 IF		 COND(%BIN(&ERRCD 5 4) > 0) THEN(DO)			
    			 SNDPGMMSG  MSGID(%SST(&ERRCD 9 7)) MSGF(QCPFMSG) +		
    						  MSGDTA(%SST(&ERRCD 17 112)) TOPGMQ(*PRV) +   
    						  MSGTYPE(*ESCAPE)							 
    			 ENDDO													 
    																	   
    /* ALLES OK */														 
    			 CHGVAR	 VAR(&NOCENT) VALUE(%BIN(&RCV 17 4))			
    			 CHGVAR	 VAR(&OFFSET) VALUE(%BIN(&RCV 13 4) + 1)		
    																	   
    /* SCHLEIFE ÜBER EINTRÄGE */										   
    STACK:																 
    			 CHGVAR	 VAR(&NOCENT) VALUE(&NOCENT - 1)			
    																   
    			 IF		 COND(&NOCENT >= 0) THEN(DO)				
    			 CHGVAR	 VAR(&ENTLEN) VALUE(%BIN(&RCV &OFFSET 4))   
    																   
    			 CHGVAR	 VAR(&POS) VALUE(&OFFSET + 24)			  
    			 CHGVAR	 VAR(&PGM) VALUE(%SST(&RCV &POS 10))		
    			 CHGVAR	 VAR(&POS) VALUE(&POS + 10)				 
    			 CHGVAR	 VAR(&LIB) VALUE(%SST(&RCV &POS 10))		
    																   
    /* TESTAUSGABE */												  
    			 SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&PGM + 
    						  *CAT &LIB) TOPGMQ(*PRV) MSGTYPE(*INFO)   
    																   
    			 CHGVAR	 VAR(&OFFSET) VALUE(&OFFSET + &ENTLEN)	  
    			 GOTO	   CMDLBL(STACK)							  
    			 ENDDO		 
    						   
    			 ENDPGM
    Anstelle der Testausgabe kannst du ja PROG und LIB entsprechend auswerten und abfragen.
    Zu beachten ist lediglich, dass der 1. Stackeintrag das eigene Programm ist !
    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
    Jul 2003
    Beiträge
    338

    Wink

    Hallo Baldur, das CL hat mir sehr geholfen.

    Jetzt konnte ich gut die Reihenfolge der Aufruf-Programme erkennen.
    Nach entspr. Modifikation habe ich das CL jetzt eingesetzt.

    Danke für de Unterstützung. Ludger

Similar Threads

  1. SQL Trigger
    By Jenne in forum NEWSboard Programmierung
    Antworten: 0
    Letzter Beitrag: 19-01-07, 09:24
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL Trigger
    By bigmoon in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 14-09-06, 18:26
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  5. Erstellen Trigger über SQL / Read Funktion
    By GHoffmann in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 07-07-05, 09:18

Berechtigungen

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