Schnellstart für     Interessenten | Kunden | Reseller | Entwickler | Affiliates | Presse

Home Produkte Download Support Betriebshandbuch Schulungen Mitteilung Newsletter Impressum

Anwender-Forum

Fernwartungssystem laden (nur nach Aufforderung)

SQL-Ereignisse (SQL-API)

Zurück | Ebene zurück

Problemstellung

Ü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.

  • Anlegen des Lieferscheinkopfes
  • Anlegen der Positionen oder Teilpositionen
  • ggf. Prüfung des Kreditlimits
  • Setzen des Auftragsstatus
  • Füllen der Umsetzungsmatrix zwischen Auftragspositionen und Lieferscheinpositionen
  • ggf. Anlegen von Titeln, die im Auftrag verwendet werden
  • etc..

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.

Serverseitige 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

unterstützte Ereignisse in Ihrer Version

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

Prozedur Prototyp

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 ON



  RAISERROR('Fehlermeldung',16,1)
  RETURN -1

  RETURN 0

Beispiel

Ü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')