Alcuni flussi di lavoro eLegere possono richiedere di tenere aggiornati dati fra due applicazioni.
Example
Processi di business che richiedono la sincronizzazione dati fra applicazioni eLegere:
Aggiungere una riga di progetto in un'applicazione di gestione progetti aggiorna la riga del budget mensile nell'applicazione Budget.
Aggiornare gli orari di lavoro in un'applicazione che calcola gli stipendi dopo aver completato un'attività in un task manager.
Sincronizzare informazioni fra due Domini eLegere.
Questo tutorial considera il seguente caso d'uso comune a più circostanze: Ci sono due applicazioni e le loro tabelle SQL. Cambiamenti nella prima applicazione innesca cambiamenti nella tabella della seconda applicazione.
Example
Il tutorial considera la seguente applicazione come caso d'uso per mostrare come scrivere le Stored Procedure per eLegere.
Due applicazioni gestiscono gli acquisti da un sito di e-commerce: Warehouse Orders e Warehouse Stock.
Warehouse Orders registra gli ordini dei clienti e le spedizioni dal magazzino.
Ciascuna riga di Master in Warehouse Orders è una spedizione con una tabella di Dettaglio chiamata "Order Items". "Order Items" elenca tutti i prodotti richiesti e la loro quantità.
Warehouse Stock cataloga i proditti e lo stock disponibile. Se un prodotto è esaurito, l'applicazione evidenzia la sua riga e manda una notifica per il restock.
Quando gli utenti aggiungono gli articoli alla tabella di Dettaglio "Order Items" in Warehouse Orders, devono aggiornare manualmente la disponibilità in Warehouse Stock. (Lo stesso accade quando gli utenti rimuovono un oggetto da un ordine.) Il Designer dovrebbe trovare un modo per sincronizzare automaticamente le due applicazioni per evitare perdite di tempo.
Configurare le Actions nel Design Mode dell'applicazione per automatizzare l'esecuzione.
Info
Ciascuna sezione in Configurare le Stored Procedure nel Database descrive una Stored Procedure passo dopo passo tramite pseudocodice. Gli snippet di codice di ciascuna parte accompagnano la spiegazione. In fondo a ciascuna sezione potrai trovare l'intera Stored Procedure SQL da copiare e incollare.
Che cosa dovresti sapere e di quali permessi hai bisogno?¶
Leggi la lista necessaria di conoscenze e permessi database della tua installazione eLegere.
Se soddisfi i requisiti sotto, puoi affrontare questo tutorial.
Il permesso account Application Designer in eLegere. (Consultare Quali sono i compiti di Design? per maggiori informazioni riguardo i permessi di Design.)
Contatta il tuo amministratore in caso ti manchino o i permessi sul database o il permesso Application Designer di eLegere.
Le Store Procedure richiedono la funziona F_APP_DATETIME2BIGINT per funzionare. Assicurati di aggiungerla al database se assente.
Le Stored Procedure impiegano la funzione F_APP_DATETIME2BIGINT. F_APP_DATETIME2BIGINT converte un valore DateTime in una data espressa come numero di 14 cifre compatibile con eLegere. Durante l'installazione di eLegere, il tuo DBA dovrebbe averla già aggiunta.
In caso il database sia sprovvisto, aggiungi F_APP_DATETIME2BIGINT alle funzioni definite dall'utente.
-- Assicurati di chiamare la funzione F_APP_DATETIME2BIGINT.USE[SMARTINTELLIGENCE]GOSETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOCREATEFUNCTION[elegere].[F_APP_DATETIME2BIGINT](@dtDateTimedatetime)RETURNSBIGINTASBEGINDECLARE@biDateTimeASBIGINTSET@biDateTime=DATEPART(second,@dtDateTime)+DATEPART(minute,@dtDateTime)*100+DATEPART(hour,@dtDateTime)*10000+DATEPART(day,@dtDateTime)*1000000+DATEPART(month,@dtDateTime)*100000000+DATEPART(year,@dtDateTime)*10000000000RETURN(@biDateTime)ENDGO
Questa sezione spiega ciascuna Stored Procedure da configurare nel database.
Devi prima configurare le Stored Procedure nel database eLegere prima dell'applicazione.
Note
Quando un utente con permessi Application Management (consultare Quali sono i compiti di Design? per maggiori informazioni) crea un'applicazione, eLegere inserisce le seguenti Stored Procedure vuote nel database:
SP_Application_Name_PRE_INSERT
SP_Application_Name_POST_INSERT
SP_Application_Name_PRE_UPDATE
SP_Application_Name_POST_UPDATE
SP_Application_Name_PRE_DELETE
SP_Application_Name_POST_DELETE
Inserire il codice SQL nella Stored Procedure corrispondente. Per esempio, incolla PRE INSERT in SP_Warehouse_Management_Warehouse_Orders_PRE_INSERT.
La sottosezione Flusso delle Stored Procedure nell'applicazione descrive il flusso di lavoro delle Stored Procedure, quando le applicazioni le lancia e come.
Le seguenti sottosezioni spiegano con commenti ciascuna Stored Procedure da configurare nel database per ciascun caso.
Il flusso delle Stored Procedure nell'applicazione¶
La sottosezione descrive il flusso di lavoro generale nel quale ciascuna Stored Procedure modifica dati.
Il diagramma di flusso sotto riassume come ciascuna Stored Procedure funziona nel caso d'uso di Warehouse Orders. Espandi il box per visualizzarlo.
Flusso delle Stored Procedure
---
title: Flusso Stored Procedure
---
flowchart TD
begin[[BEGIN]] --> choice1{L'utente sta aggiungendo prodotti a Order Items?}
choice1-- Sì -->preinsert[La Stored Procedure PRE INSERT controlla\nse ci sono abbastanza unità di prodotto in stock.]
preinsert --> choice2{Ci sono abbastanza unità in stock?}
choice2-- Sì --> newrow[L'applicazione crea una nuova riga.]
choice2-- No -->abort[L'applicazione blocca la creazione della nuova riga.\nInforma l'utente riguardo la ragione.]
abort-->ending[[END]]
newrow --> postinsert[La Stored Procedure POST INSERT aggiorna \nle unità di stock dopo che l'applicazione ha salvato la nuova riga.]
postinsert --> ending
choice1-- No -->choice3{L'utente sta aggiornando la\nquantità di prodotto in un ordine?}
choice3-- Sì --> preupdate[La Stored Procedure PRE UPDATE verifica che ci\n siano abbastanza unità di prodotto in stock.]
preupdate --> choice4{Ci sono abbastanza unità in stock?}
choice4-- Sì --> updatedrow[L'applicazione aggiorna i campi Quantity.]
choice4-- No --> abort
updatedrow --> postupdate[La Stored Procedure POST UPDATE aggiorna\nle unità in stock dopo che l'applicazione ha salvato la nuova riga.]
postupdate --> ending
choice3 -- No --> delete{L'utente cancella un prodotto da un ordine o un intero ordine.}
delete --> predelete[La PRE DELETE aggiorna la quantità del prodotto.]
predelete --> deletion[L'applicazione cancella la riga.]
deletion-->ending
Il requisito chiave è aggiornare la quantità di un prodotto in Warehouse Stock ogni volta che gli utenti salvano qualunque cambiamento in Warehouse Orders.
Un cambiamento nella quantità del prodotto può avvenire in quattro momenti differenti:
Quando un utente in Warehouse Orders aggiunge un prodotto alla tabella di DettaglioOrder Items.
Quando un utente in Warehouse Orders rimuove un prodotto dalla tabella di DettaglioOrder Items.
Quando un utente in Warehouse Orders cambia la quantità di un prodotto nella tabella di DettaglioOrder Items.
Quando un utente cancella la riga di un intero ordine da Warehouse Orders o una riga da Order Items.
Ciascuna Stored Procedure copre uno dei casi 1-4 sopra.
Le Stored Procedure PRE INSERT e POST INSERT aggiornano le quantità nel caso 1.
Le Stored Procedure PRE UPDATE e POST POST UPDATE aggiornano le quantità nel caso 2.
La Stored Procedure PRE DELETE aggiorna le quantità dei prodotti nei casi 3 e 4.
Why There Isn't a POST DELETE Stored Procedure?
Una Stored Procedure POST DELETE è inutile per due ragioni:
La PRE DELETE aggiorna la quantità di prodotto prima della cancellazione.
L'applicazione eseguirebbe una procedura su una riga non più esistente che l'utente ha già cancellato.
La Stored Procedure prima di salvare una nuova riga¶
Segue la spiegazione della Stored Procedure che l'applicazione eseguirà prima di salvare una nuova riga nella tabella di Dettaglio Order Items.
La Stored Procedure inizia creando una procedura e dichiarando tutti i parametriobbligatori che eLegere richiede per SQL. (Consultare Stored Procedure per maggiori informazioni riguardo i parametri.)
Note
In eLegere si possono recuperare le informazioni delle righe da salvare tramite l'oggetto JSON.
L'oggetto JSON deve essere passato alla Stored Procedure come valore per @jsonParameters.
La chiave Item nell'oggetto JSON contiene l'oggetto della riga con tutte le chiave e i valori che contengono le sue informazioni.
La chiave StorageName contiene il nome della tabella SQL dello Storage eLegere. Il nome (i.e. [SQL TABLE NAME]) è il nome fisico dello Storage in eLegere. Corrisponde alla tabella dove l'utente sta eseguendo l'azione.
UserId è lo Username del logon.
Riferirsi all'oggetto "Item" nel JSON per ottenere i lavori dei campi della nuova riga. Usare il seguente comando per aprire l'oggetto JSON della nuova riga:
1
OPENJSON(@jsonParameters,'$.Item')
Riferirsi ai valori di "Item" tramite la funzione JSON_VALUE().
1
JSON_VALUE(@jsonParameters,'$.Item.FIELD_NAME')
Le Stored Procedure possono usare il valore di "StorageName" per eseguire query e azioni a seconda della tabella. Il caso d'uso corrente impiega piuttosto spesso la chiave "StorageName" per verificare le condizioni.
Vedere Stored Procedures per maggiori informazioni riguardo i paramreti SQL per eLegere.
Dopo la dichiarazione delle variabili, assegnare il loro valore. La Stored Procedure assegna un valore ai nomi delle tabelle essendo richieste per la parte successiva. La Stored Procedure impiega la funzione GETDATE() per ottenere il DateTime corrente e convertirlo in un formato Numerico.
La procedura al passo 4 assegna la data convertita come Timestamp per la riga.
La procedura apre l'oggetto JSON che ha ricevuto da @jsonParameters e assegna i valori alle variabili.
In seguito, la procedura esegue il primo controllo: verificare che l'applicazione stia salvando nella tabella Order Items. Se la tabella corrisponde alla tabella SQL di TBL_ORDER_ITEMSOrder Items, la procedura esegue il secondo controllo prima di permette il processo di salvataggio. Altrimenti, non accade nulla.
Se il nome della tabella dall'oggetto JSON è TBL_ORDER_ITEMS, la Stored Procedure esegue il secondo controllo. Il secondo controllo verifica le unità di prodotto nella tabella TBL_PRODUCTS di Warehouse Stock Registra il valore della chiave '$.Item.Quantity' dall'oggetto "Items" per compararlo con il campo WarehouseQuantity. Se il valore di '$.Item.Quantity' è maggiore del valore di WarehouseQuantity per il prodotto su TBL_PRODUCTS, la procedura blocca il processo di salvataggio.
Se la procedura blocca la procedure di salvataggio della nuova riga, riporta una notifica di errore all'utente.
SET@ActionTargetStorage=ISNULL(JSON_VALUE(@jsonParameters,'$.StorageName'),@ApplicationMasterStorage)IF@ActionTargetStorage=@ApplicationDetailStorageBEGINSELECT@Id=JSON_VALUE(@jsonParameters,'$.Item.Id'),@QuantityOrder=JSON_VALUE(@jsonParameters,'$.Item.Quantity'),@ProductOrder=JSON_VALUE(@jsonParameters,'$.Item.Product'),@USERID_CREATION=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_CREATION'),@USERID_LASTUPDATE=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_LAST_UPDATE'),@DT_CREATION=JSON_VALUE(@jsonParameters,'$.Item.DT_CREATION'),@UPDATE_DATE=JSON_VALUE(@jsonParameters,'$.Item.DT_LAST_UPDATE'),@TIMESTAMP=CONVERT(VARBINARY(4),ISNULL(JSON_VALUE(@jsonParameters,'$.Item.TIMESTAMP'),'0x00000001'))FROMOPENJSON(@jsonParameters,'$.Item')SELECT@QuantityStock=WarehouseQuantityFROM[whrman].[TBL_PRODUCTS]WHEREIdProduct=@ProductOrderIF(@QuantityOrder>@QuantityStock)BEGINSET@OutCodeStatus='000500'SET@OutMessage='The requested quantity exceeds the current product stock.'SET@OutLevel='Error'RETURN-1ENDEND
-- Crea la procedura dichiarando i parametri che eLegere richiede. CREATEPROCEDURE[whrman].[SP_Warehouse_Management_Warehouse_Orders_PRE_INSERT]@jsonParametersNVARCHAR(MAX),@OutCodeStatusNVARCHAR(4000)OUTPUT,@OutLevelNVARCHAR(4000)OUTPUT,@OutMessageNVARCHAR(4000)OUTPUTASBEGIN-- Dichiarazione variabili/* Le variabili registreranno le informazioni riguardo le tabelle coinvolte nel database. */DECLARE@ApplicationNameNVARCHAR(4000)DECLARE@ApplicationMasterStorageNVARCHAR(4000)DECLARE@ApplicationDetailStorageNVARCHAR(4000)DECLARE@ActionTargetStorageNVARCHAR(4000)--------------/* Le seguenti variabili registrano i valori della nuova riga. @Today e @dtToday registrano la data in formato numerico e DateTime. La Stored Procedure richiede @Today e @dtToday per valorizzare il campo DT_CREATION. */DECLARE@IdINTDECLARE@ProductOrderINTDECLARE@QuantityOrderINTDECLARE@QuantityStockINTDECLARE@USERID_CREATIONNVARCHAR(4000)DECLARE@USERID_LASTUPDATENVARCHAR(4000)DECLARE@DT_CREATIONBIGINTDECLARE@UPDATE_DATEBIGINTDECLARE@TIMESTAMPVARBINARY(4)DECLARE@TodayASBIGINTDECLARE@dtTodayASDATETIME---------------- Importa la data corrente di sistema come valore di @dtToday value.SET@dtToday=GETDATE()/* Converte il valore di DateTime in un numero intero. Assegna il valore della data convertita alla variabile @Today. */SET@Today=[dbo].F_APP_DATETIME2BIGINT(@dtToday)-- Assegna i nomi delle tabelle del database alle variabili.SET@ApplicationName='Warehouse Orders'SET@ApplicationMasterStorage='TBL_WAREHOUSE_ORDERS'SET@ApplicationDetailStorage='TBL_ORDER_ITEMS'/* Assegna il valore a @ActionTargetStorage. L'assegnazione impiega il contesto della riga: controlla il nome dello Storage dal JSON contenente i dati da salvare. - Se il nome dello Storage è null, l'utente ha salvato una riga nella tabella di Master. Registra il valore di @ApplicationMasterStorage per @ActionTargetStorage. - Se il nome dello Storage NON È NULL, l'utente ha salvato la riga sul Dettaglio. La procedura registrerà il nome della tabella di Dettaglio dal JSON. */SET@ActionTargetStorage=ISNULL(JSON_VALUE(@jsonParameters,'$.StorageName'),@ApplicationMasterStorage)/* La procedura confronta @ActionTargetStorage e @ApplicationDetailStorage. Se i nomi delle tabelle sono gli stessi, l'utente ha aggiunto una riga alla tabella di Dettaglio Order Items. In questo caso, la procedura verifica se la quantità richiesta è disponibile in stock. Altrimenti la procedura è terminata. */IF@ActionTargetStorage=@ApplicationDetailStorageBEGIN/* Il JSON contiene l'oggetto Item. Item ha tutti i campi e valori della riga. La procedura recupera tutti i valori richiesti da Item. Recupera le informazioni del prodotto partendo dal suo Id nel JSON. */SELECT@Id=JSON_VALUE(@jsonParameters,'$.Item.Id'),@QuantityOrder=JSON_VALUE(@jsonParameters,'$.Item.Quantity'),@ProductOrder=JSON_VALUE(@jsonParameters,'$.Item.Product'),@USERID_CREATION=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_CREATION'),@USERID_LASTUPDATE=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_LAST_UPDATE'),@DT_CREATION=JSON_VALUE(@jsonParameters,'$.Item.DT_CREATION'),@UPDATE_DATE=JSON_VALUE(@jsonParameters,'$.Item.DT_LAST_UPDATE'),@TIMESTAMP=CONVERT(VARBINARY(4),ISNULL(JSON_VALUE(@jsonParameters,'$.Item.TIMESTAMP'),'0x00000001'))FROMOPENJSON(@jsonParameters,'$.Item')-- Recupera il valore della quantità di prodotto dalla tabella di Warehouse Stock.SELECT@QuantityStock=WarehouseQuantityFROM[whrman].[TBL_PRODUCTS]WHEREIdProduct=@ProductOrder-- Confronta la quantità inserita dall'utente e la quantità di prodotto da Warehouse Stock. IF(@QuantityOrder>@QuantityStock)BEGIN--- In caso la quantità sia troppo bassa, la procedura blocca il salvataggio e avverte l'utente con una notifica.SET@OutCodeStatus='000500'SET@OutMessage='The requested quantity exceeds the current product stock.'SET@OutLevel='Error'RETURN-1ENDENDENDGO
La Stored Procedure dopo il salvataggio della nuova riga¶
Segue la spiegazione della Stored Procedure che l'applicazione eseguirà dopo il salvataggio della nuova riga nella tabella di Dettaglio Order Items.
A questo punto, la procedura aggiorna lo stock del prodotto dopo il salvataggio della riga in Warehouse Orders. La Stored Procedure PRE INSERT ha già verifica che c'è abbastanza stock e non ha bloccato il processo di salvataggio.
La query recupera la riga del prodotto selezionato sulla tabella TBL_PRODUCTS di Warehouse Stock.
Dopodiché la procedura aggiorna l'inserimento sulla tabella per il campo WarehouseQuantity.
Ciascun prodotto in Warehouse Stock ha un campo Booleano chiamato isAvailable. Se la quantità del prodotto va a 0, la procedura cambia isAvailable da true a false. Se isAvailable è false, gli utenti in Warehouse Orders non possono scegliere quel prodotto per un ordine.
-- Crea la procedura dichiarando i parametri che eLegere richiede. CREATEPROCEDURE[whrman].[SP_Warehouse_Management_Warehouse_Orders_POST_INSERT]@jsonParametersNVARCHAR(MAX),@OutCodeStatusNVARCHAR(4000)OUTPUT,@OutLevelNVARCHAR(4000)OUTPUT,@OutMessageNVARCHAR(4000)OUTPUTASBEGIN-- Dichiarazione variabili/* Le variabili registreranno le informazioni riguardo le tabelle coinvolte nel database. */DECLARE@ApplicationNameNVARCHAR(4000)DECLARE@ApplicationMasterStorageNVARCHAR(4000)DECLARE@ApplicationDetailStorageNVARCHAR(4000)DECLARE@ApplicationDetailStorage2NVARCHAR(4000)DECLARE@ActionTargetStorageNVARCHAR(4000)--------------/* Le seguenti variabili registrano i valori della nuova riga. @Today e @dtToday registrano la data in formato numerico e DateTime. La Stored Procedure richiede @Today e @dtToday per valorizzare il campo DT_CREATION. */DECLARE@IdINTDECLARE@ProductOrderINTDECLARE@QuantityOrderINTDECLARE@USERID_CREATIONNVARCHAR(4000)DECLARE@USERID_LASTUPDATENVARCHAR(4000)DECLARE@DT_CREATIONBIGINTDECLARE@UPDATE_DATEBIGINTDECLARE@TIMESTAMPVARBINARY(4)DECLARE@TodayASBIGINTDECLARE@dtTodayASDATETIME-------------- -- Importa la data corrente di sistema come valore di @dtToday valueSET@dtToday=GETDATE()/* Converte il valore di DateTime in un numero intero. Assegna il valore della data convertita alla variabile @Today. */SET@Today=[dbo].F_APP_DATETIME2BIGINT(@dtToday)-- Assegna i nomi delle tabelle del database alle variabili.SET@ApplicationName='Warehouse Orders'SET@ApplicationMasterStorage='TBL_WAREHOUSE_ORDERS'SET@ApplicationDetailStorage='TBL_ORDER_ITEMS'/* Assegna il valore a @ActionTargetStorage. L'assegnazione impiega il contesto della riga: controlla il nome dello Storage dal JSON contenente i dati da salvare. - Se il nome dello Storage è null, l'utente ha salvato una riga nella tabella di Master. Registra il valore di @ApplicationMasterStorage per @ActionTargetStorage. - Se il nome dello Storage NON È NULL, l'utente ha salvato la riga sul Dettaglio. La procedura registrerà il nome della tabella di Dettaglio dal JSON. */SET@ActionTargetStorage=ISNULL(JSON_VALUE(@jsonParameters,'$.StorageName'),@ApplicationMasterStorage)/* La procedura confronta @ActionTargetStorage e @ApplicationDetailStorage. Se i nomi delle tabelle sono gli stessi, l'utente ha aggiunto una riga alla tabella di Dettaglio Order Items. In questo caso, procede con l'aggiornamento di Warehouse Stock. Altrimenti, la procedura termina. */IF@ActionTargetStorage=@ApplicationDetailStorageBEGIN/* Il JSON contiene l'oggetto Item. Item ha tutti i campi e valori della riga. La procedura recupera tutti i valori richiesti da Item. Recupera le informazioni del prodotto partendo dal suo Id nel JSON. */SELECT@Id=JSON_VALUE(@jsonParameters,'$.Item.Id'),@QuantityOrder=JSON_VALUE(@jsonParameters,'$.Item.Quantity'),@ProductOrder=JSON_VALUE(@jsonParameters,'$.Item.Product'),@USERID_CREATION=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_CREATION'),@USERID_LASTUPDATE=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_LAST_UPDATE'),@DT_CREATION=JSON_VALUE(@jsonParameters,'$.Item.DT_CREATION'),@UPDATE_DATE=JSON_VALUE(@jsonParameters,'$.Item.DT_LAST_UPDATE'),@TIMESTAMP=CONVERT(VARBINARY(4),ISNULL(JSON_VALUE(@jsonParameters,'$.Item.TIMESTAMP'),'0x00000001'))FROMOPENJSON(@jsonParameters,'$.Item')/* La query aggiorna la tabella di Warehouse Stock con la nuova quantità, data di aggiornamento e chi ha ha aggiornato la quantità. PROD è l'alias assegnato alla tabella di Warehouse Stock (TBL_PRODUCTS). Inoltre, aggiorna anche i campi DT_LAST_UPDATE e USER_ID_LAST_UPDATE. DT_LAST_UPDATE registra l'ultima data di aggiornamento. USER_ID_LAST_UPDATE registra l'ultimo account che ha modificato la riga. */UPDATEPRODSETPROD.WarehouseQuantity=PROD.WarehouseQuantity-@QuantityOrder,PROD.DT_LAST_UPDATE=@UPDATE_DATE,PROD.USER_ID_LAST_UPDATE=@USERID_LASTUPDATEFROM[whrman].[TBL_PRODUCTS]ASPRODWHEREPROD.IdProduct=@ProductOrder/* Ciascun prodotto in TBL_PRODUCTS ha un campo Booleano chiamato isAvailable Se isAvailable è falso, gli utenti in Warehouse Orders non possono scegliere un prodotto per un ordine. Quando il campo _WarehouseQuantity_ di un prodotto è 0, la procedura cambia il valore di isAvailable. Inoltre, aggiorna DT_LAST_UPDATE e USER_ID_LAST_UPDATE. */UPDATE[whrman].[TBL_PRODUCTS]SETIsAvailable=0,DT_LAST_UPDATE=@UPDATE_DATE,USER_ID_LAST_UPDATE=@USERID_LASTUPDATEWHEREIdProduct=@ProductOrderANDWarehouseQuantity=0ENDENDGO
La Stored Procedure prima di salvare i cambiamenti alla riga¶
Segue la spiegazione della Stored Procedure che l'applicazione eseguirà prima di salvare qualunque cambiamento alle righe esistenti nella tabella di Dettaglio Order Items
La procedura apre l'oggetto JSON che la procedura riceve da @jsonParameters e assegna i valori alle variabili.
Dopo procede con il primo controllo: verificare che la tabella nella quale l'applicazione stia salvando è la tabella di Order ItemsTBL_ORDER_ITEMS. Se la tabella corrisponde a TBL_ORDER_ITEMS, la procedura procede con il secondo controllo prima di permettere il processo di salvataggio. Altrimenti, non accade nulla.
Se il nome della tabella dall'oggetto JSON è TBL_ORDER_ITEMS, la Stored Procedure esegue il secondo controllo. Il secondo controllo verifica le unità di prodotto nella tabella TBL_PRODUCTS di Warehouse Stock.
Il processo per il secondo controllo cambia da PRE INSERT.
Nella PRE UPDATE, la procedura esegue una JOIN fra TBL_ORDER_ITEMS e TBL_PRODUCTS per selezionare gli inserimenti in comune. L'Id del prodotto è il filtro della query.
La procedura sottrae la vecchia quantità del prodotto dalla nuova quantità richiesta per calcolare il cambio di quantità.
Se la differenza fra lo stock del prodotto attuale e il cambio di quantità è inferiore a 0, non c'è abbastanza unità di prodotto nello stock. In questo caso, la procedura blocca il processo di salvataggio e avverte l'utente con una notifica che ne spiega la ragione.
Se la differenza fra lo stock di prodotto attuale e il cambio di quantità è maggiore di 0, ci sono abbastanza unità di prodotto in stock. In questo caso, la procedura aggiorna l'inserimento del prodotto in Warehouse Stock. Dopodiché l'applicazione può salvare la riga aggiornata nella tabella di Dettaglio Order Items.
SET@ActionTargetStorage=ISNULL(JSON_VALUE(@jsonParameters,'$.StorageName'),@ApplicationMasterStorage)IF@ActionTargetStorage=@ApplicationDetailStorageBEGINSELECT@Id=JSON_VALUE(@jsonParameters,'$.Item.Id'),@QuantityOrder_New=JSON_VALUE(@jsonParameters,'$.Item.Quantity'),@USERID_CREATION=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_CREATION'),@USERID_LASTUPDATE=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_LAST_UPDATE'),@DT_CREATION=JSON_VALUE(@jsonParameters,'$.Item.DT_CREATION'),@UPDATE_DATE=JSON_VALUE(@jsonParameters,'$.Item.DT_LAST_UPDATE'),@TIMESTAMP=CONVERT(VARBINARY(4),ISNULL(JSON_VALUE(@jsonParameters,'$.Item.TIMESTAMP'),'0x00000001'))FROMOPENJSON(@jsonParameters,'$.Item')SELECT@QuantityStock=PROD.WarehouseQuantity,@QuantityOrder_Old=ORD.Quantity,@ProductOrder=ORD.ProductFROM[whrman].[TBL_ORDER_ITEMS]ASORDINNERJOIN[whrman].[TBL_PRODUCTS]ASPRODONORD.Product=PROD.IdProductWHEREORD.Id=@IdSELECT@DeltaQuantity=@QuantityOrder_New-@QuantityOrder_OldIF(@QuantityStock-@DeltaQuantity<0)BEGINSET@OutCodeStatus='000500'SET@OutMessage='The requested quantity exceeds the current product stock.'SET@OutLevel='Error'RETURN-1ENDELSEBEGINUPDATEPRODSETWarehouseQuantity=WarehouseQuantity-@DeltaQuantity,DT_LAST_UPDATE=@UPDATE_DATE,USER_ID_LAST_UPDATE=@USERID_LASTUPDATEFROM[whrman].[TBL_PRODUCTS]ASPRODWHEREPROD.IdProduct=@ProductOrderEND
-- Crea la procedura dichiarando i parametri che eLegere richiede.CREATEPROCEDURE[whrman].[SP_Warehouse_Management_Warehouse_Orders_PRE_UPDATE]@jsonParametersNVARCHAR(MAX),@OutCodeStatusNVARCHAR(4000)OUTPUT,@OutLevelNVARCHAR(4000)OUTPUT,@OutMessageNVARCHAR(4000)OUTPUTASBEGIN-- Dichiarazione variabili/* Le variabili registreranno le informazioni riguardo le tabelle coinvolte nel database. */DECLARE@ApplicationNameNVARCHAR(4000)DECLARE@ApplicationMasterStorageNVARCHAR(4000)DECLARE@ApplicationDetailStorageNVARCHAR(4000)DECLARE@ActionTargetStorageNVARCHAR(4000)--------------/* Le seguenti variabili registrano i valori della nuova riga. @Today e @dtToday registrano la data in formato numerico e DateTime. La Stored Procedure richiede @Today e @dtToday per valorizzare il campo DT_CREATION. */DECLARE@IdINTDECLARE@ProductOrderINTDECLARE@QuantityOrder_NewINTDECLARE@QuantityOrder_OldINTDECLARE@QuantityStockINTDECLARE@DeltaQuantityINTDECLARE@USERID_CREATIONNVARCHAR(4000)DECLARE@USERID_LASTUPDATENVARCHAR(4000)DECLARE@DT_CREATIONBIGINTDECLARE@UPDATE_DATEBIGINTDECLARE@TIMESTAMPVARBINARY(4)DECLARE@TodayASBIGINTDECLARE@dtTodayASDATETIME---------------- Importa la data corrente di sistema come valore di @dtToday value.SET@dtToday=GETDATE()/* Converte il valore di DateTime in un numero intero. Assegna il valore della data convertita alla variabile @Today. */SET@Today=[dbo].F_APP_DATETIME2BIGINT(@dtToday)-- Assegna i nomi delle tabelle del database alle variabili.SET@ApplicationName='Warehouse Orders'SET@ApplicationMasterStorage='TBL_WAREHOUSE_ORDERS'SET@ApplicationDetailStorage='TBL_ORDER_ITEMS'/* Assegna il valore a @ActionTargetStorage. L'assegnazione impiega il contesto della riga: controlla il nome dello Storage dal JSON contenente i dati da salvare. - Se il nome dello Storage è null, l'utente ha salvato una riga nella tabella di Master. Registra il valore di @ApplicationMasterStorage per @ActionTargetStorage. - Se il nome dello Storage NON È NULL, l'utente ha salvato la riga sul Dettaglio. La procedura registrerà il nome della tabella di Dettaglio dal JSON. */SET@ActionTargetStorage=ISNULL(JSON_VALUE(@jsonParameters,'$.StorageName'),@ApplicationMasterStorage)/* La procedura confronta @ActionTargetStorage e @ApplicationDetailStorage Se il nome della tabella è lo stesso, l'utente ha aggiunto una riga alla tabella di Dettaglio Order Items. In questo caso, la procedura aggiorna Warehouse Stock. Altrimenti, la procedura termina. */IF@ActionTargetStorage=@ApplicationDetailStorageBEGIN/* Il JSON contiene l'oggetto Item. Item ha tutte le righe di campi e valori. La procedura recupare tutte i valori richiesti da Item. Recupera le informazioni del prodotto partendo dall'Id nel JSON. @QuantityOrder_New è la variable che registra il nuovo valore desiderato. */SELECT@Id=JSON_VALUE(@jsonParameters,'$.Item.Id'),@QuantityOrder_New=JSON_VALUE(@jsonParameters,'$.Item.Quantity'),@USERID_CREATION=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_CREATION'),@USERID_LASTUPDATE=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_LAST_UPDATE'),@DT_CREATION=JSON_VALUE(@jsonParameters,'$.Item.DT_CREATION'),@UPDATE_DATE=JSON_VALUE(@jsonParameters,'$.Item.DT_LAST_UPDATE'),@TIMESTAMP=CONVERT(VARBINARY(4),ISNULL(JSON_VALUE(@jsonParameters,'$.Item.TIMESTAMP'),'0x00000001'))FROMOPENJSON(@jsonParameters,'$.Item')/* Assegna i valori necessari della query alle variabili. ORD è l'alias per la tabella di Warehouse Order. PROD è l'alias per la tabella di Warehouse Stock. Dopodiché la query filtra entrambe le tabelle per gli inserimenti che hanno lo stesso Id di prodotto. */SELECT@QuantityStock=PROD.WarehouseQuantity,@QuantityOrder_Old=ORD.Quantity,@ProductOrder=ORD.ProductFROM[whrman].[TBL_ORDER_ITEMS]ASORDINNERJOIN[whrman].[TBL_PRODUCTS]ASPRODONORD.Product=PROD.IdProductWHEREORD.Id=@Id-- Calcola la differenze fra quantità desiderata e la precedente quantità dell'ordine. SELECT@DeltaQuantity=@QuantityOrder_New-@QuantityOrder_Old/* Controlla la quantità in stock nel Warehouse Order sottraendo la differenza. Se la differenza fra stock e quantità è inferiore a 0, la Stored Procedure blocca l'azione e mostra una notifica di errore. */IF(@QuantityStock-@DeltaQuantity<0)BEGINSET@OutCodeStatus='000500'SET@OutMessage='The requested quantity exceeds the current product stock.'SET@OutLevel='Error'RETURN-1ENDELSEBEGIN-- Se c'è abbastanza stock, la procedura aggiorna la quantità in Warehouse Stock. UPDATEPRODSETWarehouseQuantity=WarehouseQuantity-@DeltaQuantity,DT_LAST_UPDATE=@UPDATE_DATE,USER_ID_LAST_UPDATE=@USERID_LASTUPDATEFROM[whrman].[TBL_PRODUCTS]ASPRODWHEREPROD.IdProduct=@ProductOrderENDENDENDGO
La Stored Procedure dopo avere salvato i cambiamenti alla riga¶
Segue la spiegazione della Stored Procedure che l'applicazione eseguirà dopo il salvataggio di qualunque cambiamento alle righe esistenti nella tabella di Dettaglio Order Items.
L'esecuzione dell'azione differisce dalla PRE UPDATE.
In questo passaggio, la procedura aggiorna lo stock di prodotto dopo il salvataggio della riga in Warehouse Orders. La Stored Procedure PRE UPDATE ha già verificato che c'è abbastanza stock e non ha bloccato il processo di salvataggio.
La query recupera la riga del prodotto selezionato sulla tabella TBL_PRODUCTS di Warehouse Stock.
Dopodiché la procedura aggiorna il campo WarehouseQuantity dell'inserimento.
Ciascun prodotto in Warehouse Stock ha un campo chiamato isAvailable. Se la quantità del prodotto va a 0, la procedura cambia il valore del campo da true a false. Se isAvailable è false, gli utenti in Warehouse Orders non possono scegliere quel prodotto per un altro ordine. Altrimenti, se la quantità ritorna sopra 0, la procedura imposta il valore del campo isAvailable come true.
-- Crea la procedura dichiarando i parametri che eLegere richiede.CREATEPROCEDURE[whrman].[SP_Warehouse_Management_Warehouse_Orders_POST_UPDATE]@jsonParametersNVARCHAR(MAX),@OutCodeStatusNVARCHAR(4000)OUTPUT,@OutLevelNVARCHAR(4000)OUTPUT,@OutMessageNVARCHAR(4000)OUTPUTASBEGIN-- Dichiarazione variabili/* Le variabili registreranno le informazioni riguardo le tabelle coinvolte nel database. */DECLARE@ApplicationNameNVARCHAR(4000)DECLARE@ApplicationMasterStorageNVARCHAR(4000)DECLARE@ApplicationDetailStorageNVARCHAR(4000)DECLARE@ActionTargetStorageNVARCHAR(4000)--------------/* Le seguenti variabili registrano i valori della nuova riga. @Today e @dtToday registrano la data in formato numerico e DateTime. La Stored Procedure richiede @Today e @dtToday per valorizzare il campo DT_CREATION. */DECLARE@IdINTDECLARE@USERID_CREATIONNVARCHAR(4000)DECLARE@USERID_LASTUPDATENVARCHAR(4000)DECLARE@DT_CREATIONBIGINTDECLARE@UPDATE_DATEBIGINTDECLARE@TIMESTAMPVARBINARY(4)DECLARE@TodayASBIGINTDECLARE@dtTodayASDATETIME---------------- Importa la data corrente di sistema come valore di @dtToday value.SET@dtToday=GETDATE()/* Converte il valore di DateTime in un numero intero. Assegna il valore della data convertita alla variabile @Today. */SET@Today=[dbo].F_APP_DATETIME2BIGINT(@dtToday)-- Assegna i nomi delle tabelle del database alle variabili.SET@ApplicationName='Warehouse Orders'SET@ApplicationMasterStorage='TBL_WAREHOUSE_ORDERS'SET@ApplicationDetailStorage='TBL_ORDER_ITEMS'/* Assegna il valore a @ActionTargetStorage. L'assegnazione impiega il contesto della riga: controlla il nome dello Storage dal JSON contenente i dati da salvare. - Se il nome dello Storage è null, l'utente ha salvato una riga nella tabella di Master. Registra il valore di @ApplicationMasterStorage per @ActionTargetStorage. - Se il nome dello Storage NON È NULL, l'utente ha salvato la riga sul Dettaglio. La procedura registrerà il nome della tabella di Dettaglio dal JSON. */SET@ActionTargetStorage=ISNULL(JSON_VALUE(@jsonParameters,'$.StorageName'),@ApplicationMasterStorage)/* La procedura confronta @ActionTargetStorage e @ApplicationDetailStorage Se il nome della tabella è lo stesso, l'utente ha aggiunto una riga alla tabella di Dettaglio Order Items. In questo caso, la procedura aggiorna Warehouse Stock. Altrimenti, la procedura termina. */IF@ActionTargetStorage=@ApplicationDetailStorageBEGIN/* Il JSON contiene l'oggetto Item. Item ha tutte le righe di campi e valori. La procedura recupare tutte i valori richiesti da Item. Recupera le informazioni del prodotto partendo dall'Id nel JSON. */SELECT@Id=JSON_VALUE(@jsonParameters,'$.Item.Id'),@USERID_CREATION=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_CREATION'),@USERID_LASTUPDATE=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_LAST_UPDATE'),@DT_CREATION=JSON_VALUE(@jsonParameters,'$.Item.DT_CREATION'),@UPDATE_DATE=JSON_VALUE(@jsonParameters,'$.Item.DT_LAST_UPDATE'),@TIMESTAMP=CONVERT(VARBINARY(4),ISNULL(JSON_VALUE(@jsonParameters,'$.Item.TIMESTAMP'),'0x00000001'))FROMOPENJSON(@jsonParameters,'$.Item')/* Ciascun prodotto in TBL_PRODUCTS ha un campo Booleano chiamato isAvailable. Se isAvailable è false, gli utenti in Warehouse Orders non possono scegliere il prodotto per un ordine. Quando un prodotto ha un valore uguale o maggiore di 0 per il campo WarehouseQuantity, la procedura cambia il valore di isAvailable. Se uguale a 0 False o True quando la quantità è più di 0. Inoltre, aggiorna i campi DT_LAST_UPDATE e USER_ID_LAST_UPDATE. */UPDATEPRODSETIsAvailable=CASEWHENWarehouseQuantity=0THEN0ELSE1END,DT_LAST_UPDATE=@UPDATE_DATE,USER_ID_LAST_UPDATE=@USERID_LASTUPDATEFROM[whrman].[TBL_PRODUCTS]ASPRODINNERJOIN[whrman].[TBL_ORDER_ITEMS]ASORDONPROD.IdProduct=ORD.ProductWHEREORD.Id=@IdENDENDGO
La Stored Procedure prima della cancellazione di una riga¶
Segue la spiegazione della Stored Procedure che l'applicazione eseguirà prima di cancellare una riga sulla tabella di Master o Dettaglio.
A questo punto, la procedura aggiorna lo stock di prodotto prima che l'applicazione abbia salvato la cancellazione in Warehouse Orders.
La Stored Procedure si comporta in modo differente in base a tabella di Master e Dettaglio. Il primo controllo è verificare tramite il nome dello Storage se la tabella modificare è quella di Master.
Se la tabella è la tabella di Master, le procedura rimuove tutte le righe della tabella di Dettaglio (Order Items) e aggiorna le quantità in Warehouse Stock.
Se il nome dello Storage non corrisponde al nome della tabella di Master (TBL_WAREHOUSE_ORDERS), allora il secondo controllo verifica se l'utente ha cancellato una riga nella tabella di Order Items.
Question
Perché fare un secondo controllo se c'è solo un Master e solo una tabella di Dettaglio? Se la tabella non è il Master, allora deve essere per forza la tabella TBL_PRODUCTS del Dettaglio.
Il secondo controllo è necessario in caso il Designer decida di aggiungere ulteriori righe di Dettaglio a Warehouse Order.
In questo modo, l'applicazione eseguirà la procedura solo o sul Master o solo sulla tabella di Dettaglio Order Items. Se l'utente salva in un'ulteriore tabella di Dettaglio, nessuna azione accadrà sulla tabella di Warehouse Stock.
Se l'utente cancella un prodotto da un ordine, la procedura aggiorna la quantità in stock in Warehouse Stock. Aggiunge di nuovo la quantità dell'ordine al valore di Warehouse Quantity.
Se WarehouseQuantity era 0, la procedura imposta il campo isAvailable di nuovo a true. Il prodotto è di nuovo in stock e disponibile.
-- Crea la procedura dichiarando i parametri che eLegere richiede.CREATEPROCEDURE[whrman].[SP_Warehouse_Management_Warehouse_Orders_PRE_DELETE]@jsonParametersNVARCHAR(MAX),@OutCodeStatusNVARCHAR(4000)OUTPUT,@OutLevelNVARCHAR(4000)OUTPUT,@OutMessageNVARCHAR(4000)OUTPUTASBEGIN-- Dichiarazione variabili /* Le variabili registreranno le informazioni riguardo le tabelle coinvolte nel database. */DECLARE@ApplicationNameNVARCHAR(4000)DECLARE@ApplicationMasterStorageNVARCHAR(4000)DECLARE@ApplicationDetailStorageNVARCHAR(4000)DECLARE@ActionTargetStorageNVARCHAR(4000)--------------/* Le seguenti variabili registrano i valori della nuova riga. @Today e @dtToday registrano la data in formato numerico e DateTime. La Stored Procedure richiede @Today e @dtToday per valorizzare il campo DT_CREATION. */DECLARE@IdINTDECLARE@IdOrderINTDECLARE@USERID_CREATIONNVARCHAR(4000)DECLARE@USERID_LASTUPDATENVARCHAR(4000)DECLARE@DT_CREATIONBIGINTDECLARE@UPDATE_DATEBIGINTDECLARE@TIMESTAMPVARBINARY(4)DECLARE@TodayASBIGINTDECLARE@dtTodayASDATETIME---------------- Importa la data corrente di sistema come valore di @dtToday value.SET@dtToday=GETDATE()/* Converte il valore di DateTime in un numero intero. Assegna il valore della data convertita alla variabile @Today. */SET@Today=[dbo].F_APP_DATETIME2BIGINT(@dtToday)-- Assegna i nomi delle tabelle del database alle variabili.SET@ApplicationName='Warehouse Orders'SET@ApplicationMasterStorage='TBL_WAREHOUSE_ORDERS'SET@ApplicationDetailStorage='TBL_ORDER_ITEMS'/* Assegna il valore a @ActionTargetStorage. L'assegnazione impiega il contesto della riga: controlla il nome dello Storage dal JSON contenente i dati da salvare. - Se il nome dello Storage è null, l'utente ha salvato una riga nella tabella di Master. Registra il valore di @ApplicationMasterStorage per @ActionTargetStorage. - Se il nome dello Storage NON È NULL, l'utente ha salvato la riga su un Dettaglio. La procedura registrerà il nome della tabella di Dettaglio dal JSON. */SET@ActionTargetStorage=ISNULL(JSON_VALUE(@jsonParameters,'$.StorageName'),@ApplicationMasterStorage)-- Ci sono due condizioni IF per verificare quale tabella è coinvolta nella cancellazione./* La procedurea confronta @ActionTargetStorage e @ApplicationMasterStorage. Se i nomi delle tabelle sono gli stessi, l'utente ha cancellato l'intero ordine. Quindi, la procedura ripulirà tutte le righe di Dettaglio e aggiornerà lo stock prima di salvare la riga. */IF@ActionTargetStorage=@ApplicationMasterStorageBEGIN/* Recupera le informazioni di prodotto cominciando dall'Id del prodotto dal JSON. Il JSON contiene l'oggetto Item. Item ha tutti i campi e i valori delle righe. La procedura recupera tutti i valori richiesti da Item. Per la cancellazione, la procedura richiede solo l'Id e i campi che registrano informazioni come Timestamp, data di creazione, ecc. */SELECT@Id=JSON_VALUE(@jsonParameters,'$.Item.Id'),@USERID_CREATION=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_CREATION'),@USERID_LASTUPDATE=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_LAST_UPDATE'),@DT_CREATION=JSON_VALUE(@jsonParameters,'$.Item.DT_CREATION'),@UPDATE_DATE=JSON_VALUE(@jsonParameters,'$.Item.DT_LAST_UPDATE'),@TIMESTAMP=CONVERT(VARBINARY(4),ISNULL(JSON_VALUE(@jsonParameters,'$.Item.TIMESTAMP'),'0x00000001'))FROMOPENJSON(@jsonParameters,'$.Item')/* La procedura immagazzina l'Id dell'ordine e la cerca su TBL_WAREHOUSE_ORDERS per la chiave che lega il Dettaglio alle righe di Master. */SELECT@IdOrder=IdWarehouseOrderFROM[whrman].[TBL_WAREHOUSE_ORDERS]WHEREId=@Id/* Trova il prodotto coinvolto nell'ordine tramite l'Id del prodotto. Assegna a WarehouseQuantity al nuovo valore. Aggiorna la quantità di prodotto in stock. */UPDATEPRODSETWarehouseQuantity=PROD.WarehouseQuantity+ORD.QuantityFROM[whrman].[TBL_PRODUCTS]ASPRODINNERJOIN[whrman].[TBL_ORDER_ITEMS]ASORDONPROD.IdProduct=ORD.ProductWHEREWarehouseOrderId=@IdOrder/* Ciascun prodotto in TBL_PRODUCTS ha un campo Booleano chiamato isAvailable. Se isAvailable è false, gli utenti in Warehouse Orders non possono scegliere il prodotto per un ordine. Quando il campo WarehouseQuantity di un ordine ha valore 0, la procedura cambia il valore di isAvailable. Quando la quantità aggiornata di un prodotto torna di nuovo a 0, la procedura cambia il valore di isAvailable a true. */UPDATEPRODSETIsAvailable=CASEWHENWarehouseQuantity>0THEN1ELSE0ENDFROM[whrman].[TBL_PRODUCTS]ASPRODINNERJOIN[whrman].[TBL_ORDER_ITEMS]ASORDONPROD.IdProduct=ORD.ProductWHEREWarehouseOrderId=@IdOrder-- Cancella tutte le righe di Dettagli che hanno lo stesso Id di ordine. DELETEFROM[whrman].[TBL_ORDER_ITEMS]WHEREWarehouseOrderId=@IdOrderENDIF@ActionTargetStorage=@ApplicationDetailStorageBEGIN/* Recupera le informazioni di prodotto cominciando dall'Id del prodotto dal JSON. Il JSON contiene l'oggetto Item. Item ha tutti i campi e i valori delle righe. La procedura recupera tutti i valori richiesti da Item. Per la cancellazione, la procedura richiede solo l'Id e i campi che registrano informazioni come Timestamp, data di creazione, ecc. */SELECT@Id=JSON_VALUE(@jsonParameters,'$.Item.Id'),@USERID_CREATION=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_CREATION'),@USERID_LASTUPDATE=JSON_VALUE(@jsonParameters,'$.Item.USER_ID_LAST_UPDATE'),@DT_CREATION=JSON_VALUE(@jsonParameters,'$.Item.DT_CREATION'),@UPDATE_DATE=JSON_VALUE(@jsonParameters,'$.Item.DT_LAST_UPDATE'),@TIMESTAMP=CONVERT(VARBINARY(4),ISNULL(JSON_VALUE(@jsonParameters,'$.Item.TIMESTAMP'),'0x00000001'))FROMOPENJSON(@jsonParameters,'$.Item')/* Trova il prodotto coinvolto nell'ordine tramite gli Id dei prodotti. Assegna il nuovo valore di WarehouseQuantity. Aggiorna la quantità del valore in stock. */UPDATEPRODSETWarehouseQuantity=PROD.WarehouseQuantity+ORD.QuantityFROM[whrman].[TBL_PRODUCTS]ASPRODINNERJOIN[whrman].[TBL_ORDER_ITEMS]ASORDONPROD.IdProduct=ORD.ProductWHEREORD.Id=@Id/* Ciascun prodotto in TBL_PRODUCTS ha un campo Booleano chiamato isAvailable. Se isAvailable è false, gli utenti in Warehouse Orders non possono scegliere il prodotto per un ordine. Quando il campo WarehouseQuantity di un ordine ha valore 0, la procedura cambia il valore di isAvailable. Quando la quantità aggiornata di un prodotto torna di nuovo a 0, la procedura cambia il valore di isAvailable a true. */UPDATEPRODSETIsAvailable=1FROM[whrman].[TBL_PRODUCTS]ASPRODINNERJOIN[whrman].[TBL_ORDER_ITEMS]ASORDONPROD.IdProduct=ORD.ProductWHEREWarehouseQuantity>0ENDENDGO
Questa parte richiede il permesso Application Designer dal tuo amministratore. (Consultare Quali sono i compiti di Design? per maggiorni informazioni sui permessi di Design.)
Dopo aver salvato la Stored Procedure nel database, devi abilitarle con tutti gli inneschi nel Design Mode.
Seguono i passaggi per eseguire le Stored Procedure.
Nel pannello Table del Design Mode dell'applicazione, clicca sulla tab Actions nel pannello laterale a sinistra.
Nel sotto-pannello Actions, c'è una lista di inneschi chiamata Action Types.
Puoi specificare quando l'applicazione dovrebbe eseguire una Stored Procedure tramite gli Action Types:
Pre Save Esegue la Stored Procedure prima di salvare la nuova riga.
Post Save Esegue la Stored Procedure dopo il salvataggio della nuova riga.
Pre Update Esegue la Stored Procedure prima dell'aggiornamento della riga.
Post Update Esegue la Stored Procedure dopo l'aggiornamento della riga.
Pre Remove Esegue la Stored Procedure prima della cancellazione della riga.
Post Remove Esegue la Stored Procedure dopo della cancellazione della riga.
Attiva tutti gli interruttori Enabled, eccezion fatta per Post Remove.
Salva i cambiamenti cliccando sul pulsante Save.
Success
Ogni volta che si aggiunge o modifica un ordine in Warehouse Orders, la Stored Procedure aggiornerà lo stock degli oggetti in Warehouse Stock.
Se la quantità richiesta va sopra lo stock disponibile, l'applicazione non salva i cambiamenti e avverte gli utenti.