Kaufmännische Software für Handel, Handwerk und Produktionsbetriebe
Über Trigger lassen sich eine Vielzahl von SQL-Ereignissen abfangen und gesondert behandeln. Es ist möglich besondere Prüfungen beim Speichern einer Adresse durchzuführen oder Änderungen an Daten zu protokollieren. Trigger arbeiten aber stets auf Tabellenebene. Dadurch ist das mögliche Einsatzgebiet auf diejenigen Ereignisse beschränkt, die primär eine Tabelle betreffen resp. das Anlegen, Ändern und Löschen eines oder mehrerer Datensätze. Komplexe Vorgänge - wie beispielsweise das Umwandeln eines Auftrags in einen Lieferschein - lassen sich nur schwer greifen. Um bei dem Beispiel zu bleiben: Beim Umwandeln eines Auftrags in einen Lieferschein werden etliche Einzelaktionen innerhalb einer Transaktion durchgeführt.
Diese Auflistung ist beispielhaft und nicht vollständig. Die durchzuführenden Aktionen variieren von einer EULANDA®-Version zur nächsten. Sicherlich könnte man einen Trigger schreiben, der beim Ändern des Auftragsstatus eine benutzerdefinierte Aktionen durchführt. Aber man kann nicht sicherstellen, dass zu diesem Zeitpunkt bereits alle anderen Aktionen durchgeführt worden sind. Man kann beispielsweise nicht sicher sein, dass alle Lieferscheinpositionen angelegt sind. Um dieser Limitierung des Trigger-Konzeptes zu begegnen führt EULANDA® eine neue Klasse von Ereignissen auf Server-Ebene ein. Im Nachfolgenden finden Sie eine LIste der verfügbaren Ereignisse.
| Eventid | Eventname | Bemerkung |
| 10000 | AfBuchen.OnSuccess | Auftrag Buchen |
| 10003 | AfEdit.OnSuccess | Auftrag weitererfassen |
| 10004 | AfStornoBuchung.OnSuccess | Auftrag Buchung stornieren |
| 10005 | TraAfLf_DoJob.OnSuccess | Umwandlung eines Auftrags in einen Lieferschein |
| 10006 | TraLfRe_DoJob.OnSuccess | Umwandlung eines Lieferscheins in eine Rechnung |
| 10007 | AnpCreate.OnSuccess | Anlegen einer Angebotsposition |
| 10008 | AfpCreate.OnSuccess | Anlegen einer Auftragsposition |
| 10009 | LfBuchen.OnSuccess | Lager des Lieferscheins wird gebucht |
| 10010 | TraAnAf.OnSuccess | Nach dem Umwandeln eines Angebots in einen Auftrag |
| 10011 | KfBuchen.OnSuccess | Wenn die Erfassung der Bestellung abgeschlossen wird (STRG+B) |
| 10012 | KfpCreate.OnSuccess | Anlegen einer Bestellposition |
| 10013 | AfStornoRest.OnSuccess | Stornieren der Restmengen des Auftrags |
| 10014 | AfCreate.OnSuccess | Anlegen eines Auftrags unabhängig davon ob er kopiert oder komplett neu angelegt wird |
| 10015 | AnCreate.OnSuccess | Anlegen eines Angebots unabhängig davon ob es kopiert oder komplett neu angelegt wird |
| 10016 | CbBuchen.OnSuccess | nach dem Buchen des Lagers |
| 10017 | CbStornoBuchen.OnSuccess | Stornierung der Lagerbuchung zum Kassenbeleg. Dies geschieht hauptsächlich beim Löschen eines alten Kassenbelegs. |
| 10018 | CbBuchen.Before | wird vor dem Lagerbuchen des Kassenbelegs aufgerufen. Die Tabelle „cnLbJob“ mit den Buchungsinformationen ist dabei bereits gefüllt. (RefTyp = „CB“, RefId = @ObjId ) |
| 10019 | LfBuchen.Before | wird vor dem Lagerbuchen des Lieferscheins aufgerufen. |
| 10020 | LfLdInit.OnSuccess | intern: Vorbereitung der Lagerbuchung von Lieferscheinen |
| 10021 | JbLdInit.OnSuccess | intern: Vorbereitung der Lagerbuchung von Stücklisten |
| 10022 | LLInitAbLd.OnSuccess | intern: Vorbereitung der Lagerbuchung von Lagerbelegen (erste Buchung) |
| 10023 | LLInitZuLd.OnSuccess | intern: Vorbereitung der Lagerbuchung von Lagerbelegen (zweite Buchung) |
| 10024 | ReStorno.OnSuccess | nach dem Löschen von Rechnungen |
| 10025 | KfDelete.OnSuccess | Nach dem Löschen von Bestellungen |
| 10026 | K.BeforefDelete | wird vor dem Löschen von Bestellungen aufgerufen |
Die meisten Ereignisse wurden erst in EULANDA 2007 eingeführt. Um eine Liste der von Ihrer Datenbank unterstützten Ereignisse zu erhalten führen Sie folgenden Befehl aus:
IF OBJECT_ID('cnEventType') IS NULL
RAISERROR('In dieser Eulanda-Version werden noch keine SQL-Ereignisse unterstützt',16,1)
ELSE SELECT id,Name FROM cnEventType ORDER BY id
Die Behandlung eines solchen Ereignisses wird als Prozedur implementiert. Dabei muss die Prozedur streng nach folgendem Schema aufgebaut sein:
CREATE PROC cn_user_evtXXX @SubsId int, @ObjType char(4), @ObjId int AS SET NOCOUNT ONRAISERROR('Fehlermeldung',16,1) RETURN -1 RETURN 0
Über nachfolgenden SQL-Code wird eine Preisprüfung implementiert, die bei Unterschreitung des Einkaufspreises das Buchen des Auftrags verhindert
CREATE PROC cn_user_evtAfBuchen_EkPruefung
@SubsId int,
@ObjType char(4),
@ObjId int
AS
SET NOCOUNT ON
DECLARE @Pos int
SELECT TOP 1 @Pos = afp.PosNummer
FROM dbo.AuftragPos afp
WHERE afp.KopfId = @ObjId AND afp.Basis > afp.VkRab
IF @@ROWCOUNT > 0
BEGIN
RAISERROR('Der Einkaufspreis wurde in Position %d unterschritten',16,1,@Pos)
RETURN -1
END ELSE RETURN 0
GO
INSERT cnEventSubscriber (EventId, Vendor, ProcName)
VALUES(10000, 'USER', 'cn_user_evtAfBuchen_EkPruefung')