Vai al contenuto

Sincronizzare dati fra applicazioni automaticamente

Introduzione

Verifica i requisiti

Controlla la sezione Che cosa dovresti sapere e di quali permessi hai bisogno? per verificare se hai le conoscenze e i permessi d'amministrazione richiesti per completare il tutorial.

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.

In questo tutorial

  1. Accederai al database per scrivere le Stored Procedure nel paragrafo Configurare le Stored Procedure nel Database.
  2. 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.

Conoscenze

Questo tutorial da per scontato le seguenti conoscenze:

  • Transact-SQL Il motore del database eLegere è Transact SQL. Il livello è Intermedio e il tutorial richiede la conoscenza di:
    • Operazione CREATE PROCEDURE
    • Asserzioni di controllo di flusso
    • Parametri
    • Variabili
    • Integrazione oggetti JSON
  • Come funzionano le Stored Procedures in eLegere. Vedere Stored Procedure per maggiori informazioni.

Permessi

Questo tutorial richiede:

  • Il permesso database CREATE PROCEDURE dal tuo DBA.
  • 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.

Configurazioni Database

Warning

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.

Trovi il codice qui sotto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
-- Assicurati di chiamare la funzione F_APP_DATETIME2BIGINT.

USE [SMARTINTELLIGENCE]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [elegere].[F_APP_DATETIME2BIGINT](@dtDateTime datetime) 
RETURNS BIGINT
AS
BEGIN
DECLARE @biDateTime AS BIGINT

     SET @biDateTime = DATEPART(second, @dtDateTime) +
        DATEPART(minute, @dtDateTime) * 100 +
        DATEPART(hour, @dtDateTime) * 10000 +
        DATEPART(day, @dtDateTime) * 1000000 +
        DATEPART(month, @dtDateTime) * 100000000 +
        DATEPART(year, @dtDateTime) * 10000000000

    RETURN(@biDateTime)
END


GO

Configurare le Stored Procedure nel Database

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:

  1. Quando un utente in Warehouse Orders aggiunge un prodotto alla tabella di Dettaglio Order Items.
  2. Quando un utente in Warehouse Orders rimuove un prodotto dalla tabella di Dettaglio Order Items.
  3. Quando un utente in Warehouse Orders cambia la quantità di un prodotto nella tabella di Dettaglio Order Items.
  4. 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.

Passo 1

La Stored Procedure inizia creando una procedura e dichiarando tutti i parametri obbligatori 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.

1
2
3
4
5
{
"Item": {},
"StorageName": "[SQL TABLE NAME]",
"UserId": "j.doe@vesenda.com",
}
  • 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.

Code
1
2
3
4
5
CREATE PROCEDURE [whrman].[SP_Warehouse_Management_Warehouse_Orders_PRE_INSERT]
        @jsonParameters NVARCHAR(MAX)
         , @OutCodeStatus NVARCHAR(4000) OUTPUT
         , @OutLevel NVARCHAR(4000) OUTPUT
         , @OutMessage NVARCHAR(4000) OUTPUT    

Passo 2

Il prossimo passo è dichiarare le variabili. Ci sono due gruppi di variabili:

  • Variabili per registrare i nomi delle tabelle.
  • Variabili per registrare i valori dei campi della nuova riga.

Bisogna dichiarare delle variabili per calcolare il tempo quando una nuova riga sarà registrata.

Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
DECLARE @ApplicationName            NVARCHAR(4000)
DECLARE @ApplicationMasterStorage   NVARCHAR(4000)
DECLARE @ApplicationDetailStorage   NVARCHAR(4000)
DECLARE @ActionTargetStorage        NVARCHAR(4000)

--------------

DECLARE @Id                     INT
DECLARE @ProductOrder           INT
DECLARE @QuantityOrder          INT
DECLARE @QuantityStock          INT

DECLARE @USERID_CREATION        NVARCHAR(4000)
DECLARE @USERID_LASTUPDATE      NVARCHAR(4000)
DECLARE @DT_CREATION            BIGINT
DECLARE @UPDATE_DATE            BIGINT
DECLARE @TIMESTAMP              VARBINARY(4)

DECLARE @Today AS BIGINT
DECLARE @dtToday AS DATETIME

Passo 3

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.

Code
1
2
3
4
5
6
7
SET @dtToday = GETDATE()

SET @Today = [dbo].F_APP_DATETIME2BIGINT( @dtToday )

SET @ApplicationName = 'Warehouse Orders'
SET @ApplicationMasterStorage = 'TBL_WAREHOUSE_ORDERS'
SET @ApplicationDetailStorage = 'TBL_ORDER_ITEMS' 

Passo 4

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_ITEMS Order 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.

Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
SET @ActionTargetStorage = ISNULL( JSON_VALUE(@jsonParameters, '$.StorageName' ), @ApplicationMasterStorage )

IF @ActionTargetStorage = @ApplicationDetailStorage
    BEGIN 
        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'))
        FROM 
            OPENJSON(@jsonParameters, '$.Item' )

    SELECT @QuantityStock = WarehouseQuantity
    FROM [whrman].[TBL_PRODUCTS]
    WHERE IdProduct = @ProductOrder

    IF (@QuantityOrder > @QuantityStock)
    BEGIN
        SET @OutCodeStatus = '000500'
        SET @OutMessage = 'The requested quantity exceeds the current product stock.'
        SET @OutLevel = 'Error'
        RETURN -1

    END


END

PRE INSERT

Copia il contenuto sotto nella Stored Procedure SP_Warehouse_Management_Warehouse_Orders_PRE_INSERT.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
-- Crea la procedura dichiarando i parametri che eLegere richiede. 
CREATE PROCEDURE [whrman].[SP_Warehouse_Management_Warehouse_Orders_PRE_INSERT]
          @jsonParameters NVARCHAR(MAX)
        , @OutCodeStatus NVARCHAR(4000) OUTPUT
        , @OutLevel NVARCHAR(4000) OUTPUT
        , @OutMessage NVARCHAR(4000) OUTPUT  
AS 
BEGIN 
    -- Dichiarazione variabili

    /* 
        Le variabili registreranno le informazioni riguardo
        le tabelle coinvolte nel database.
    */

    DECLARE @ApplicationName            NVARCHAR(4000)
    DECLARE @ApplicationMasterStorage   NVARCHAR(4000)
    DECLARE @ApplicationDetailStorage   NVARCHAR(4000)
    DECLARE @ActionTargetStorage        NVARCHAR(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 @Id                     INT
    DECLARE @ProductOrder           INT
    DECLARE @QuantityOrder          INT
    DECLARE @QuantityStock          INT

    DECLARE @USERID_CREATION        NVARCHAR(4000)
    DECLARE @USERID_LASTUPDATE      NVARCHAR(4000)
    DECLARE @DT_CREATION            BIGINT
    DECLARE @UPDATE_DATE            BIGINT
    DECLARE @TIMESTAMP              VARBINARY(4)

    DECLARE @Today AS BIGINT
    DECLARE @dtToday AS DATETIME


    --------------

    -- 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 = @ApplicationDetailStorage
    BEGIN 

    /* 
        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'))
        FROM 
            OPENJSON(@jsonParameters, '$.Item' )

        -- Recupera il valore della quantità di prodotto dalla tabella di Warehouse Stock.
        SELECT @QuantityStock = WarehouseQuantity
        FROM [whrman].[TBL_PRODUCTS]
        WHERE IdProduct = @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 -1

        END


    END


END
GO

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.

Passo 1

Questo passo è identico al Passo 1 da La Stored Procedure prima di salvare una nuova riga: creare la procedura e dichiarare i parametri obbligatori che eLegere richiede.

Passo 2

Questo passo è identico al Passo 2 da La Stored Procedure prima di salvare una nuova riga: dichiarare le variabili.

Passo 3

Questo passo è identico al Passo 3 da La Stored Procedure prima di salvare una nuova riga: configurare i valori della variabili per la registrazione.

Passo 4

L'azione eseguita cambia da PRE INSERT.

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.

Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
IF @ActionTargetStorage = @ApplicationDetailStorage
BEGIN 

    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'))
    FROM 
        OPENJSON(@jsonParameters, '$.Item' )

    UPDATE PROD
    SET PROD.WarehouseQuantity = PROD.WarehouseQuantity - @QuantityOrder
        , PROD.DT_LAST_UPDATE = @UPDATE_DATE
        , PROD.USER_ID_LAST_UPDATE = @USERID_LASTUPDATE
    FROM [whrman].[TBL_PRODUCTS] AS PROD
    WHERE PROD.IdProduct = @ProductOrder

    UPDATE [whrman].[TBL_PRODUCTS]
    SET IsAvailable = 0
        , DT_LAST_UPDATE = @UPDATE_DATE
        , USER_ID_LAST_UPDATE = @USERID_LASTUPDATE
    WHERE IdProduct = @ProductOrder AND WarehouseQuantity = 0


    END


END

POST INSERT

Copia il contenuto sotto nella Stored Procedure SP_Warehouse_Management_Warehouse_Orders_POST_INSERT.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
-- Crea la procedura dichiarando i parametri che eLegere richiede. 
CREATE PROCEDURE [whrman].[SP_Warehouse_Management_Warehouse_Orders_POST_INSERT]  
          @jsonParameters NVARCHAR(MAX)
        , @OutCodeStatus NVARCHAR(4000) OUTPUT
        , @OutLevel NVARCHAR(4000) OUTPUT
        , @OutMessage NVARCHAR(4000) OUTPUT  
AS 
BEGIN 
    -- Dichiarazione variabili

    /* 
        Le variabili registreranno le informazioni riguardo
        le tabelle coinvolte nel database.
    */

    DECLARE @ApplicationName            NVARCHAR(4000)
    DECLARE @ApplicationMasterStorage   NVARCHAR(4000)
    DECLARE @ApplicationDetailStorage   NVARCHAR(4000)
    DECLARE @ApplicationDetailStorage2  NVARCHAR(4000)
    DECLARE @ActionTargetStorage        NVARCHAR(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 @Id                     INT
    DECLARE @ProductOrder           INT
    DECLARE @QuantityOrder          INT

    DECLARE @USERID_CREATION        NVARCHAR(4000)
    DECLARE @USERID_LASTUPDATE      NVARCHAR(4000)
    DECLARE @DT_CREATION            BIGINT
    DECLARE @UPDATE_DATE            BIGINT
    DECLARE @TIMESTAMP              VARBINARY(4)


    DECLARE @Today AS BIGINT
    DECLARE @dtToday AS DATETIME

    --------------  

    -- 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, procede con l'aggiornamento
          di Warehouse Stock. Altrimenti, la procedura termina.
    */

    IF @ActionTargetStorage = @ApplicationDetailStorage
    BEGIN 

    /* 
        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'))
        FROM 
            OPENJSON(@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.
        */

        UPDATE PROD
        SET PROD.WarehouseQuantity = PROD.WarehouseQuantity - @QuantityOrder
            , PROD.DT_LAST_UPDATE = @UPDATE_DATE
            , PROD.USER_ID_LAST_UPDATE = @USERID_LASTUPDATE
        FROM [whrman].[TBL_PRODUCTS] AS PROD
        WHERE PROD.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]
        SET IsAvailable = 0
            , DT_LAST_UPDATE = @UPDATE_DATE
            , USER_ID_LAST_UPDATE = @USERID_LASTUPDATE
        WHERE IdProduct = @ProductOrder AND WarehouseQuantity = 0


    END


END
GO

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

Passo 1

Questo passo è identico al Passo 1 da La Stored Procedure prima di salvare una nuova riga: creare la procedura e dichiarare i parametri obbligatori che eLegere richiede.

Passo 2

Questo passo è identico al Passo 2 da La Stored Procedure prima di salvare una nuova riga: dichiarare le variabili.

Passo 3

Questo passo è identico al Passo 3 da La Stored Procedure prima di salvare una nuova riga: configurare i valori della variabili per la registrazione.

Passo 4

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 Items TBL_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.
Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    SET @ActionTargetStorage = ISNULL( JSON_VALUE(@jsonParameters, '$.StorageName' ), @ApplicationMasterStorage )

    IF @ActionTargetStorage = @ApplicationDetailStorage
    BEGIN  
        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'))
        FROM 
            OPENJSON(@jsonParameters, '$.Item' )

        SELECT 
            @QuantityStock = PROD.WarehouseQuantity
            , @QuantityOrder_Old = ORD.Quantity
            , @ProductOrder = ORD.Product
        FROM [whrman].[TBL_ORDER_ITEMS] AS ORD
        INNER JOIN [whrman].[TBL_PRODUCTS] AS PROD
            ON ORD.Product = PROD.IdProduct
        WHERE ORD.Id = @Id

        SELECT @DeltaQuantity =  @QuantityOrder_New - @QuantityOrder_Old 

        IF (@QuantityStock - @DeltaQuantity < 0 )
        BEGIN

            SET @OutCodeStatus = '000500'
            SET @OutMessage = 'The requested quantity exceeds the current product stock.'
            SET @OutLevel = 'Error'
            RETURN -1

        END
        ELSE 
        BEGIN
            UPDATE PROD
            SET WarehouseQuantity = WarehouseQuantity - @DeltaQuantity
                , DT_LAST_UPDATE = @UPDATE_DATE
                , USER_ID_LAST_UPDATE = @USERID_LASTUPDATE
            FROM [whrman].[TBL_PRODUCTS] AS PROD
            WHERE PROD.IdProduct = @ProductOrder 

        END

PRE UPDATE

Copia il contenuto sotto nella Stored Procedure SP_Warehouse_Management_Warehouse_Orders_PRE_UPDATE.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
-- Crea la procedura dichiarando i parametri che eLegere richiede.
CREATE PROCEDURE [whrman].[SP_Warehouse_Management_Warehouse_Orders_PRE_UPDATE] 
          @jsonParameters NVARCHAR(MAX)
        , @OutCodeStatus NVARCHAR(4000) OUTPUT
        , @OutLevel NVARCHAR(4000) OUTPUT
        , @OutMessage NVARCHAR(4000) OUTPUT  
AS 
BEGIN 
    -- Dichiarazione variabili

    /* 
        Le variabili registreranno le informazioni riguardo
        le tabelle coinvolte nel database.
    */

    DECLARE @ApplicationName            NVARCHAR(4000)
    DECLARE @ApplicationMasterStorage   NVARCHAR(4000)
    DECLARE @ApplicationDetailStorage   NVARCHAR(4000)
    DECLARE @ActionTargetStorage        NVARCHAR(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 @Id                     INT
    DECLARE @ProductOrder           INT
    DECLARE @QuantityOrder_New      INT
    DECLARE @QuantityOrder_Old      INT
    DECLARE @QuantityStock          INT
    DECLARE @DeltaQuantity          INT

    DECLARE @USERID_CREATION        NVARCHAR(4000)
    DECLARE @USERID_LASTUPDATE      NVARCHAR(4000)
    DECLARE @DT_CREATION            BIGINT
    DECLARE @UPDATE_DATE            BIGINT
    DECLARE @TIMESTAMP              VARBINARY(4)


    DECLARE @Today AS BIGINT
    DECLARE @dtToday AS DATETIME


    --------------

    -- 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 = @ApplicationDetailStorage
    BEGIN  

    /* 
        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'))
        FROM 
            OPENJSON(@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.Product
        FROM [whrman].[TBL_ORDER_ITEMS] AS ORD
        INNER JOIN [whrman].[TBL_PRODUCTS] AS PROD
            ON ORD.Product = PROD.IdProduct
        WHERE ORD.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 )
        BEGIN

            SET @OutCodeStatus = '000500'
            SET @OutMessage = 'The requested quantity exceeds the current product stock.'
            SET @OutLevel = 'Error'
            RETURN -1

        END
        ELSE 
        BEGIN
            -- Se c'è abbastanza stock, la procedura aggiorna la quantità in Warehouse Stock. 
            UPDATE PROD
            SET WarehouseQuantity = WarehouseQuantity - @DeltaQuantity
                , DT_LAST_UPDATE = @UPDATE_DATE
                , USER_ID_LAST_UPDATE = @USERID_LASTUPDATE
            FROM [whrman].[TBL_PRODUCTS] AS PROD
            WHERE PROD.IdProduct = @ProductOrder 

        END
    END

END
GO

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.

Passo 1

Questo passo è identico al Passo 1 da La Stored Procedure prima di salvare una nuova riga: creare la procedura e dichiarare i parametri obbligatori che eLegere richiede.

Passo 2

Questo passo è identico al Passo 2 da La Stored Procedure prima di salvare una nuova riga: dichiarare le variabili.

Passo 3

Questo passo è identico al Passo 3 da La Stored Procedure prima di salvare una nuova riga: impostare i valori delle variabili.

Passo 4

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.

Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SET @ActionTargetStorage = ISNULL( JSON_VALUE(@jsonParameters, '$.StorageName' ), @ApplicationMasterStorage )

IF @ActionTargetStorage = @ApplicationDetailStorage
BEGIN 
    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'))
    FROM 
        OPENJSON(@jsonParameters, '$.Item' )

    UPDATE PROD
    SET IsAvailable = CASE 
                            WHEN WarehouseQuantity = 0 THEN 0 
                            ELSE 1 
                      END
        , DT_LAST_UPDATE = @UPDATE_DATE
        , USER_ID_LAST_UPDATE = @USERID_LASTUPDATE
    FROM [whrman].[TBL_PRODUCTS] AS PROD
    INNER JOIN [whrman].[TBL_ORDER_ITEMS] AS ORD
        ON PROD.IdProduct = ORD.Product
    WHERE ORD.Id = @Id


END

POST UPDATE

Copia il contenuto sotto nella Stored Procedure SP_Warehouse_Management_Warehouse_Orders_POST_UPDATE.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
-- Crea la procedura dichiarando i parametri che eLegere richiede.
CREATE PROCEDURE [whrman].[SP_Warehouse_Management_Warehouse_Orders_POST_UPDATE]
          @jsonParameters NVARCHAR(MAX)
        , @OutCodeStatus NVARCHAR(4000) OUTPUT
        , @OutLevel NVARCHAR(4000) OUTPUT
        , @OutMessage NVARCHAR(4000) OUTPUT  
AS 
BEGIN 
    -- Dichiarazione variabili

    /* 
        Le variabili registreranno le informazioni riguardo
        le tabelle coinvolte nel database.
    */


    DECLARE @ApplicationName            NVARCHAR(4000)
    DECLARE @ApplicationMasterStorage   NVARCHAR(4000)
    DECLARE @ApplicationDetailStorage   NVARCHAR(4000)
    DECLARE @ActionTargetStorage        NVARCHAR(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 @Id                     INT

    DECLARE @USERID_CREATION        NVARCHAR(4000)
    DECLARE @USERID_LASTUPDATE      NVARCHAR(4000)
    DECLARE @DT_CREATION            BIGINT
    DECLARE @UPDATE_DATE            BIGINT
    DECLARE @TIMESTAMP              VARBINARY(4)


    DECLARE @Today AS BIGINT
    DECLARE @dtToday AS DATETIME


    --------------

    -- 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 = @ApplicationDetailStorage
    BEGIN 

    /* 
        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'))
        FROM 
            OPENJSON(@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.
        */

        UPDATE PROD
        SET IsAvailable = CASE 
                                WHEN WarehouseQuantity = 0 THEN 0 
                                ELSE 1 
                          END
            , DT_LAST_UPDATE = @UPDATE_DATE
            , USER_ID_LAST_UPDATE = @USERID_LASTUPDATE
        FROM [whrman].[TBL_PRODUCTS] AS PROD
        INNER JOIN [whrman].[TBL_ORDER_ITEMS] AS ORD
            ON PROD.IdProduct = ORD.Product
        WHERE ORD.Id = @Id


    END

END
GO

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.

Note

La cancellazione di dati richiede solo la PRE DELETE per le ragioni spiegare in Il flusso delle Stored Procedure nell'applicazione.

Questa procedura aggiorna la quantità di stock in due casi

  • L'utente cancella la riga dell'ordine sulla tabella di Master. La procedura cancella tutte le righe relazionate da Order Item e aggiorna lo stock.
  • L'utente cancella un articolo dalla tabella di Dettaglio Order Items. La procedura aggiorna lo stock.

Questa Stored Procedure ha un passo ulteriore dato che gestisce la cancellazione sia sulla tabella di Master che sul Dettaglio.

Passo 1

Questo passo è identico al Passo 1 da La Stored Procedure prima di salvare una nuova riga: creare la procedura e dichiarare i parametri obbligatori che eLegere richiede.

Passo 2

Questo passo è identico al Passo 2 da La Stored Procedure prima di salvare una nuova riga: dichiarare le variabili.

Passo 3

Questo passo è identico al Passo 3 da La Stored Procedure prima di salvare una nuova riga: impostare i valori delle variabili.

Passo 4

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.

Altrimenti, la procedura continua al passo 5.

Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
SET @dtToday = GETDATE()
SET @Today = [dbo].F_APP_DATETIME2BIGINT( @dtToday )

SET @ApplicationName = 'Warehouse Orders'
SET @ApplicationMasterStorage = 'TBL_WAREHOUSE_ORDERS'
SET @ApplicationDetailStorage = 'TBL_ORDER_ITEMS'

SET @ActionTargetStorage = ISNULL( JSON_VALUE(@jsonParameters, '$.StorageName' ), @ApplicationMasterStorage )

IF @ActionTargetStorage = @ApplicationMasterStorage
BEGIN 
    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'))
    FROM 
        OPENJSON(@jsonParameters, '$.Item' )

    SELECT @IdOrder = IdWarehouseOrder
    FROM [whrman].[TBL_WAREHOUSE_ORDERS]
    WHERE Id = @Id

    UPDATE PROD
    SET WarehouseQuantity = PROD.WarehouseQuantity + ORD.Quantity
    FROM [whrman].[TBL_PRODUCTS] AS PROD
    INNER JOIN [whrman].[TBL_ORDER_ITEMS] AS ORD
        ON PROD.IdProduct = ORD.Product
    WHERE WarehouseOrderId = @IdOrder

    UPDATE PROD
    SET IsAvailable = CASE
                            WHEN WarehouseQuantity > 0 THEN 1 
                            ELSE 0 
                      END
    FROM [whrman].[TBL_PRODUCTS] AS PROD
    INNER JOIN [whrman].[TBL_ORDER_ITEMS] AS ORD
        ON PROD.IdProduct = ORD.Product
    WHERE WarehouseOrderId = @IdOrder

    DELETE
    FROM [whrman].[TBL_ORDER_ITEMS]
    WHERE WarehouseOrderId = @IdOrder


END

Passo 5

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.

Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
IF @ActionTargetStorage = @ApplicationDetailStorage
BEGIN 
    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'))
    FROM 
        OPENJSON(@jsonParameters, '$.Item' )    

    UPDATE PROD
    SET WarehouseQuantity = PROD.WarehouseQuantity + ORD.Quantity
    FROM [whrman].[TBL_PRODUCTS] AS PROD
    INNER JOIN [whrman].[TBL_ORDER_ITEMS] AS ORD
        ON PROD.IdProduct = ORD.Product
    WHERE ORD.Id = @Id

    UPDATE PROD
    SET IsAvailable = 1
    FROM [whrman].[TBL_PRODUCTS] AS PROD
    INNER JOIN [whrman].[TBL_ORDER_ITEMS] AS ORD
        ON PROD.IdProduct = ORD.Product
    WHERE WarehouseQuantity > 0


END

PRE DELETE

Copy the content below in the SP_Warehouse_Management_Warehouse_Orders_PRE_DELETE Stored Procedure.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
-- Crea la procedura dichiarando i parametri che eLegere richiede.
CREATE PROCEDURE [whrman].[SP_Warehouse_Management_Warehouse_Orders_PRE_DELETE] 
          @jsonParameters NVARCHAR(MAX)
        , @OutCodeStatus NVARCHAR(4000) OUTPUT
        , @OutLevel NVARCHAR(4000) OUTPUT
        , @OutMessage NVARCHAR(4000) OUTPUT  
AS 
BEGIN 
    -- Dichiarazione variabili 

    /* 
        Le variabili registreranno le informazioni riguardo
        le tabelle coinvolte nel database.
    */

    DECLARE @ApplicationName            NVARCHAR(4000)
    DECLARE @ApplicationMasterStorage   NVARCHAR(4000)
    DECLARE @ApplicationDetailStorage   NVARCHAR(4000)
    DECLARE @ActionTargetStorage        NVARCHAR(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 @Id                     INT
    DECLARE @IdOrder                INT

    DECLARE @USERID_CREATION        NVARCHAR(4000)
    DECLARE @USERID_LASTUPDATE      NVARCHAR(4000)
    DECLARE @DT_CREATION            BIGINT
    DECLARE @UPDATE_DATE            BIGINT
    DECLARE @TIMESTAMP              VARBINARY(4)


    DECLARE @Today AS BIGINT
    DECLARE @dtToday AS DATETIME

    --------------

    -- 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 = @ApplicationMasterStorage
    BEGIN 

    /* 
        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'))
        FROM 
            OPENJSON(@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 = IdWarehouseOrder
        FROM [whrman].[TBL_WAREHOUSE_ORDERS]
        WHERE Id = @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. 
        */

        UPDATE PROD
        SET WarehouseQuantity = PROD.WarehouseQuantity + ORD.Quantity
        FROM [whrman].[TBL_PRODUCTS] AS PROD
        INNER JOIN [whrman].[TBL_ORDER_ITEMS] AS ORD
            ON PROD.IdProduct = ORD.Product
        WHERE WarehouseOrderId = @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. 
        */  

        UPDATE PROD
        SET IsAvailable = CASE
                                WHEN WarehouseQuantity > 0 THEN 1 
                                ELSE 0 
                          END
        FROM [whrman].[TBL_PRODUCTS] AS PROD
        INNER JOIN [whrman].[TBL_ORDER_ITEMS] AS ORD
            ON PROD.IdProduct = ORD.Product
        WHERE WarehouseOrderId = @IdOrder

        -- Cancella tutte le righe di Dettagli che hanno lo stesso Id di ordine. 
        DELETE
        FROM [whrman].[TBL_ORDER_ITEMS]
        WHERE WarehouseOrderId = @IdOrder


    END


    IF @ActionTargetStorage = @ApplicationDetailStorage
    BEGIN 

    /* 
        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'))
        FROM 
            OPENJSON(@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. 
        */

        UPDATE PROD
        SET WarehouseQuantity = PROD.WarehouseQuantity + ORD.Quantity
        FROM [whrman].[TBL_PRODUCTS] AS PROD
        INNER JOIN [whrman].[TBL_ORDER_ITEMS] AS ORD
            ON PROD.IdProduct = ORD.Product
        WHERE ORD.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. 
        */  

        UPDATE PROD
        SET IsAvailable = 1
        FROM [whrman].[TBL_PRODUCTS] AS PROD
        INNER JOIN [whrman].[TBL_ORDER_ITEMS] AS ORD
            ON PROD.IdProduct = ORD.Product
        WHERE WarehouseQuantity > 0


    END

END


GO

Abilitare le Stored Procedure in Design Mode

Attention

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.

  1. Nel pannello Table del Design Mode dell'applicazione, clicca sulla tab Actions nel pannello laterale a sinistra.

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

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