Transaktions-Logbuch

Ziel


Vorgänge zu rekapitulieren (Beispiel: Auftragswerdegang) und bestimmte Ereignisse (Beispiel: Auflösen eines Fertigungsauftrags) festzuhalten.

Umsetzung


Alle Ereignisse werden in die Tabelle tlogtab eingetragen. Befüllt wird diese Tabelle nicht durch syslog.ERP sondern durch selbst definierte Datenbanktrigger.

Beispiele


Anhand des Beispiels 'Auftragswerdegang' soll die Verwendung der Trigger erläutert werden.

Trigger für die Auftragsanlage definieren

CREATE TRIGGER auftab_insert INSERT ON auftab
REFERENCING NEW AS post
FOR EACH ROW (
INSERT INTO tlogtab VALUES ( 0, post.finr, 'Auftragsneuanlage', CASE(SELECT COUNT(*) FROM sltuser WHERE dbsessid = dbinfo('sessionid')) WHEN 0 THEN "Unknown" ELSE (SELECT DISTINCT sachb FROM sltuser WHERE dbsessid = dbinfo('sessionid')) END,CURRENT YEAR TO DAY,CURRENT HOUR TO SECOND, post.auart,
                             post.aufnr, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', post.sbaen ));

Nun wird bei jeder Auftragsneuanlage (genauer gesagt bei jedem INSERT in die Tabelle auftab) ein Eintrag in die tlogtab geschrieben. Die zu Protokollierenden Felder können selbst bestimmt werden und müssen entsprechend im INSERT Statement angegeben werden.

Trigger für die Auftragsentfernung definieren

CREATE TRIGGER auftab_delete DELETE ON auftab 
REFERENCING OLD AS pree 
FOR EACH ROW ( 
INSERT INTO tlogtab VALUES ( 0, pre.finr, 'Auftrag entfernt', CASE(SELECT COUNT(*) FROM sltuser WHERE dbsessid = dbinfo('sessionid')) WHEN 0 THEN "Unknown" ELSE (SELECT DISTINCT sachb FROM sltuser WHERE dbsessid = dbinfo('sessionid')) END, CURRENT YEAR TO DAY, CURRENT hour to second, pre.auart, 
					pre.aufnr, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', pre.sbaen ));

Trigger/Prozedur für die Auftragsänderung definieren

Für die Auftragsänderung kommt ein Trigger und eine Prozedur zum Einsatz.
Die Prozedur wird benötigt um den Sbaen des Auftrages vor und nach dem Update zu vergleichen. Dieser Schritt ist notwendig um auch nur die tatsächlichen Änderungen eines Auftrages zu Protokollieren.

CREATE PROCEDURE auftab_update_p(
Finr LIKE fauftab.finr,
Aufnr LIKE fauftab.aufnr,
Auart LIKE fauftab.auart,
Ausachb LIKE gpktab.sachbsys,
SbaenAlt LIKE fauftab.sbaen,
SbaenNeu LIKE fauftab.sbaen )

   IF SbaenAlt != SbaenNeu THEN
      INSERT INTO tlogtab VALUES ( 0, Finr ,'Auftragsänderung' , Ausachb, CURRENT YEAR TO DAY, CURRENT HOUR TO SECOND, Auart,
                                   Aufnr, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', SbaenNeu );
   END IF;
END PROCEDURE;

CREATE TRIGGER auftab_update UPDATE ON auftab
REFERENCING NEW AS post OLD AS pre
FOR EACH ROW(
EXECUTE PROCEDURE auftab_update_p( post.finr, post.aufnr, post.auart, CASE(SELECT COUNT(*) FROM sltuser WHERE dbsessid = dbinfo('sessionid')) WHEN 0 THEN "Unknown" ELSE (SELECT DISTINCT sachb FROM sltuser WHERE dbsessid = dbinfo('sessionid')) END, pre.sbaen, post.sbaen ));

Trigger/Prozedur für den Druck von PR, AB, LI, RG und EP definieren

Auch hier ist eine Prozedur erforderlich um nur die tatsächlichen Druckabrufe zu Protokollieren. Dies verhindert die unnötige Protokollierung von Proforma und Vorschauabrufen.

 CREATE PROCEDURE fauftab_insert_p( 
 Finr LIKE fauftab.finr,
 Archivnr LIKE fauftab.archivnr,
 Aufnr LIKE fauftab.aufnr,
 Auart LIKE fauftab.auart,
 Formular LIKE fauftab.formular,
 Ausachb LIKE gpktab.sachbsys,
 Modus LIKE fauftab.modus,
 Wiederhol LIKE fauftab.wiederhol,
 Sbaen LIKE fauftab.sbaen )
  
    DEFINE Bez60 LIKE tlogtab.bez60;
    LET Bez60 = "";

    IF Modus = "P" THEN
       RETURN;
    END IF;

    IF Wiederhol = 2 THEN
       RETURN;
    END IF;
 
    IF Formular = "PR" THEN
       LET Bez60 = "Protokolldruck";
    END IF;

    IF Formular = "AB" THEN
       LET Bez60 = "AB-Druck";
    END IF;

    IF Formular = "LI" THEN
       LET Bez60 = "Lieferscheindruck";
    END IF;

    IF Formular = "EP" THEN
       LET Bez60 = "EP-Druck";
    END IF;

    IF Formular = "RGI" OR Formular = "RGE" OR Formular = "RGZ" THEN
       LET Bez60 = "Rechnungsdruck";
    END IF;

    if Bez60 != "" THEN
       INSERT INTO tlogtab VALUES ( 0, Finr ,Bez60 , Ausachb, CURRENT YEAR TO DAY, CURRENT HOUR TO SECOND, Auart , Aufnr ,' ' ,' ',
                                    Archivnr ,' ' ,' ' ,' ' ,' ' ,' ', Sbaen );
    END IF;
 
 END PROCEDURE;
CREATE TRIGGER fauftab_insert INSERT ON fauftab
REFERENCING NEW AS post
FOR EACH ROW( 
EXECUTE PROCEDURE fauftab_insert_p( post.finr, post.archivnr, post.aufnr, post.auart, post.formular, CASE(SELECT COUNT(*) FROM sltuser WHERE dbsessid = dbinfo('sessionid')) WHEN 0 THEN "Unknown" ELSE (SELECT DISTINCT sachb FROM sltuser WHERE dbsessid = dbinfo('sessionid')) END,  post.modus, post.wiederhol,
                                    post.sbaen ));

 Links


/wiki/spaces/SYSINT/pages/2588929