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

 

EventidEvent nomeAannotazione
10000AfBuchen.OnSuccessOrdine contabile
10003AfEdit.OnSuccessPerfezionare l'ordine
10004AfStornoBuchung.OnSuccessAnnullare prenotazione
10005TraAfLf_DoJob.OnSuccessConversione 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.
10006TraLfRe_DoJob.OnSuccessConversione di una bolla di consegna in fattura
10007AnpCreate.OnSuccessCreare una voce dell'offerta
10008AfpCreate.OnSuccessCreare un articolo d'ordine
10009LfBuchen.OnSuccessMagazzino con bolla di consegna spedita
10010TraAnAf.OnSuccessDopo aver convertito un'offerta in un ordine
10011KfBuchen.OnSuccessQuando l'inserimento dell'ordine di acquisto è completato (CTRL+B)
10012KfpCreate.OnSuccessCreare un articolo dell'ordine di acquisto
10013AfStornoRest.OnSuccessAnnullare le quantità rimanenti nell'ordine
10014AfCreate.OnSuccessCreazione di un ordine, indipendentemente dal fatto che sia stato copiato o creato da zero
10015AnCreate.OnSuccessCreare un'offerta, indipendentemente dal fatto che sia stata copiata o creata da zero
10016CbBuchen.OnSuccessDopo aver affisso il magazzino di una distinta di vendita
10017CbStornoBuchen.OnSuccessAnnullamento dell'affissione in magazzino del documento di cassa. Questo viene fatto principalmente quando si elimina un vecchio documento di cassa.
10018CbBuchen.BeforeViene chiamato prima della registrazione a magazzino del documento di cassa. La tabella "cnLbJob" con le informazioni di inserimento è già compilata. (RefTyp = „CB“, RefId = @ObjId )
10019LfBuchen.BeforeViene richiamato prima che la bolla di consegna venga spedita a magazzino.
10020LfLdInit.OnSuccessInterno: preparazione dell'affissione in magazzino delle bolle di consegna
10021JbLdInit.OnSuccessInterno: preparazione della registrazione delle distinte materiali in magazzino
10022LLInitAbLd.OnSuccessInterno: preparazione della registrazione a magazzino dei documenti di magazzino (prima registrazione)
10023LLInitZuLd.OnSuccessInterno: preparazione della registrazione a magazzino dei documenti di magazzino (seconda registrazione)
10024ReStorno.OnSuccessDopo la cancellazione delle fatture
10025KfDelete.OnSuccessDopo aver cancellato gli ordini
10026K.BeforefDeleteChiamata prima dell'eliminazione degli ordini di acquisto
10027AfBuchen.BeforeChiamata prima dell'eliminazione degli ordini di acquisto
10028TraKfWe.OnSuccessDopo aver creato una consegna per un ordine di acquisto
10029SpnInit.onSuccessDopo l'inizializzazione di un messaggio SEPA
10030SpnRender.onSuccessDopo generazione XML del messaggio SEPA
10031TraAfLf_DoJob.BeforeBuchenIn preparazione
10032ReStorno.BeforeIn preparazione - richiamate prima dell'annullamento della fattura per evitarlo, se necessario
10033LLBuchen.OnSuccessIn preparazione - dopo l'affissione di un documento di magazzino (ricevimento merci, inventario fisico, consegna, ecc.)
10034LLZuBuchen.OnSuccessIn preparazione - dopo l'affissione di un documento di deposito alternativo (ricevimento della merce, inventario fisico, consegna, e così via). Non utilizzato dai moduli standard
10035LLStornoBuchen.BeforeIn preparazione - viene richiamato prima dell'annullamento di un documento di magazzino. La registrazione originale esiste ancora in questo momento
10036AfShopCreate.OnSuccessViene attivato dopo la creazione di un ordine ricevuto tramite l'interfaccia del negozio.
10037-10041Versandübergaberiservato
10042LfVersanduebergabe.OnHandoverdal 7.0.19 viene attivato dopo la consegna
10043LfVersanduebergabe.OnPrintdal 7.0.19 si attiva dopo la stampa delle etichette di spedizione
10044-10049Versandübergaberiservato

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