Transaktions-Logbuch
- lk
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 ));