[NEWSboard IBMi Forum]

Thema: SQL-Trigger

Hybrid View

  1. #1
    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 ?

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

  3. #3
    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

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.749
    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

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

Berechtigungen

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