Documentazione
Torna al sito web >

Eventi SQL (API SQL EULANDA)

Problematica

Un gran numero di eventi SQL possono essere intercettati e gestiti separatamente tramite trigger. È possibile eseguire controlli speciali quando si salva un indirizzo o registrare le modifiche ai dati. I trigger funzionano sempre a livello di tavolo. Questo limita il possibile campo di applicazione agli eventi che riguardano principalmente una tabella o la creazione, la modifica e la cancellazione di uno o più record di dati. Processi complessi, come la conversione di un ordine in bolla di consegna, sono difficili da comprendere. Per continuare con l'esempio: Quando si converte un ordine in una bolla di consegna, all'interno di una transazione vengono eseguite diverse azioni individuali.

  • Creazione dell'intestazione della bolla di consegna
  • Creare elementi o sotto-voci
  • Controllo dei limiti di credito, se necessario
  • Impostazione dello stato dell'ordine
  • Compilare la matrice di conversione tra gli invii d'ordine e gli invii della bolla di consegna
  • Se necessario, creare titoli che vengono utilizzati nell'ordine
  • ecc.

L'elenco è esemplare e non completo. Le azioni da eseguire variano da una versione all'altra di EULANDA® . Sicuramente si potrebbe scrivere un trigger che esegue un'azione definita dall'utente quando si modifica lo stato del lavoro. Tuttavia, non possiamo garantire che tutte le altre azioni siano già state realizzate in questa fase. Ad esempio, non si può essere sicuri che tutti gli invii della bolla di consegna siano stati creati. Per contrastare questa limitazione del concetto di trigger, EULANDA® introduce una nuova classe di eventi a livello di server. Di seguito è riportato un elenco degli eventi disponibili.

Eventi lato server

 

Eventid Event nome Aannotazione
10000 AfBuchen.OnSuccess Ordine contabile
10003 AfEdit.OnSuccess Perfezionare l'ordine
10004 AfStornoBuchung.OnSuccess Annullare prenotazione
10005 TraAfLf_DoJob.OnSuccess Conversione di un ordine in un DDT 
NOTA: A seconda delle impostazioni, questo evento può essere attivato dopo la prenotazione della bolla di consegna. Se si devono apportare modifiche rilevanti per la registrazione, utilizzare l'evento 10019.
10006 TraLfRe_DoJob.OnSuccess Conversione di una bolla di consegna in fattura
10007 AnpCreate.OnSuccess Creare una voce dell'offerta
10008 AfpCreate.OnSuccess Creare un articolo d'ordine
10009 LfBuchen.OnSuccess Magazzino con bolla di consegna spedita
10010 TraAnAf.OnSuccess Dopo aver convertito un'offerta in un ordine
10011 KfBuchen.OnSuccess Quando l'inserimento dell'ordine di acquisto è completato (CTRL+B)
10012 KfpCreate.OnSuccess Creare un articolo dell'ordine di acquisto
10013 AfStornoRest.OnSuccess Annullare le quantità rimanenti nell'ordine
10014 AfCreate.OnSuccess Creazione di un ordine, indipendentemente dal fatto che sia stato copiato o creato da zero
10015 AnCreate.OnSuccess Creare un'offerta, indipendentemente dal fatto che sia stata copiata o creata da zero
10016 CbBuchen.OnSuccess Dopo aver affisso il magazzino di una distinta di vendita
10017 CbStornoBuchen.OnSuccess Annullamento dell'affissione in magazzino del documento di cassa. Questo viene fatto principalmente quando si elimina un vecchio documento di cassa.
10018 CbBuchen.Before Viene chiamato prima della registrazione a magazzino del documento di cassa. La tabella "cnLbJob" con le informazioni di inserimento è già compilata. (RefTyp = „CB“, RefId = @ObjId )
10019 LfBuchen.Before Viene richiamato prima che la bolla di consegna venga spedita a magazzino.
10020 LfLdInit.OnSuccess Interno: preparazione dell'affissione in magazzino delle bolle di consegna
10021 JbLdInit.OnSuccess Interno: preparazione della registrazione delle distinte materiali in magazzino
10022 LLInitAbLd.OnSuccess Interno: preparazione della registrazione a magazzino dei documenti di magazzino (prima registrazione)
10023 LLInitZuLd.OnSuccess Interno: preparazione della registrazione a magazzino dei documenti di magazzino (seconda registrazione)
10024 ReStorno.OnSuccess Dopo la cancellazione delle fatture
10025 KfDelete.OnSuccess Dopo aver cancellato gli ordini
10026 K.BeforefDelete Chiamata prima dell'eliminazione degli ordini di acquisto
10027 AfBuchen.Before Chiamata prima dell'eliminazione degli ordini di acquisto
10028 TraKfWe.OnSuccess Dopo aver creato una consegna per un ordine di acquisto
10029 SpnInit.onSuccess Dopo l'inizializzazione di un messaggio SEPA
10030 SpnRender.onSuccess Dopo generazione XML del messaggio SEPA
10031 TraAfLf_DoJob.BeforeBuchen In preparazione
10032 ReStorno.Before In preparazione - richiamate prima dell'annullamento della fattura per evitarlo, se necessario
10033 LLBuchen.OnSuccess In preparazione - dopo l'affissione di un documento di magazzino (ricevimento merci, inventario fisico, consegna, ecc.)
10034 LLZuBuchen.OnSuccess In preparazione - dopo l'affissione di un documento di deposito alternativo (ricevimento della merce, inventario fisico, consegna, e così via). Non utilizzato dai moduli standard
10035 LLStornoBuchen.Before In preparazione - viene richiamato prima dell'annullamento di un documento di magazzino. La registrazione originale esiste ancora in questo momento
10036 AfShopCreate.OnSuccess Viene attivato dopo la creazione di un ordine ricevuto tramite l'interfaccia del negozio.
10037-10041 Versandübergabe riservato
10042 LfVersanduebergabe.OnHandover dal 7.0.19 viene attivato dopo la consegna
10043 LfVersanduebergabe.OnPrint dal 7.0.19 si attiva dopo la stampa delle etichette di spedizione
10044-10049 Versandübergabe riservato

Gli eventi di base sono stati introdotti solo in EULANDA 2007. Per ottenere un elenco di eventi supportati dal database, eseguire il seguente comando:Eventi supportati nella propria versione

IF OBJECT_ID('cnEventType') IS NULL
  RAISERROR('Gli eventi SQL non sono ancora supportati in questa versione di Eulanda',16,1)
ELSE SELECT id,Name FROM cnEventType ORDER BY id

Esecuzione asincrona / ritardata

A partire dalla versione 7.0.19 la procedura evento può essere chiamata anche in modo asincrono. Il processo originale che attiva l'evento viene elaborato per primo. La procedura viene quindi chiamata dopo un determinato periodo di tempo. Per fare ciò, nella colonna AsyncDeferredSeconds della tabella cnEventSubscriber deve essere inserito un valore maggiore o uguale a 0. Specifica il tempo minimo di attesa in secondi fino all'esecuzione della procedura.

L'esecuzione ritardata richiede che la procedura cn_Queue_HandleCnEvents sia richiamata regolarmente, ad esempio ogni 5 minuti. Nell'Edizione Standard del Server SQL, questo può essere fatto tramite l'Agente SQL Server. Quando si utilizza l'edizione Express, questo può essere ottenuto tramite la pianificazione delle attività di Windows.

Se la procedura non viene più eseguita nella stessa transazione dell'operazione originaria, ovviamente non può più essere terminata. Se viene restituito un valore diverso da zero, questo viene ignorato o può essere considerato un errore nelle versioni successive. L'esecuzione asincrona è destinata ad esempio a processi che richiedono molto tempo e che non devono ritardare inutilmente l'elaborazione originale (invio della bolla di consegna ecc.). Si consiglia inoltre di verificare se l'oggetto trasferito esiste ancora e corrisponde allo stato richiesto. È possibile, ad esempio, che una bolla di consegna sia già stata convertita in fattura o nel frattempo annullata.

Procedura Prototipo

La gestione di un evento di questo tipo è attuata come procedura. La procedura deve essere rigorosamente strutturata secondo lo schema seguente:

CREATE PROC cn_user_evtXXX
  @SubsId int,
  @ObjType char(4),
  @ObjId int
AS

SET NOCOUNT ON



  RAISERROR('Messaggio di errore',16,1)
  RETURN -1

  RETURN 0

Esempio

Un controllo dei prezzi è implementato utilizzando il seguente codice SQL che impedisce la pubblicazione dell'ordine se il prezzo scende al di sotto del prezzo di acquisto

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('Il prezzo di acquisto non è stato raggiunto in posizione %d',16,1,@Pos)
RETURN -1
END ELSE RETURN 0

GO

INSERT cnEventSubscriber (EventId, Vendor, ProcName)
VALUES(10000, 'USER', 'cn_user_evtAfBuchen_EkPruefung')