Vai al contenuto

Transaction Notification

Meccanismo lato server, separato sia da UI API che da DI API — permette di intercettare (e potenzialmente bloccare) una transazione prima che venga scritta nel database, indipendentemente da come è stata generata (form SAP, DI API, un altro add-on, un'integrazione esterna).

Perché serve

Se la tua validazione vive solo nella UI API (es. blocchi il salvataggio con un controllo su ItemEvent), quella validazione si applica solo se il documento viene creato passando dalla UI che hai istrumentato. Se qualcun altro crea lo stesso documento via DI API o import diretto, il tuo controllo UI non scatta mai. Il Transaction Notification invece agisce a livello di database, quindi copre tutti i canali.

Come funziona concettualmente

sequenceDiagram
    autonumber
    actor Sorgente as Client UI / DI API / Import
    participant SAP as SAP Core Engine
    participant TN as SBO_SP_TransactionNotification
    participant DB as Database Aziendale

    Sorgente->>SAP: Creazione o modifica documento (A / U / D)
    SAP->>TN: Invoca procedura (object_type, transaction_type, key)
    alt Validazione Superata (@error = 0)
        TN-->>SAP: Esito OK (@error = 0)
        SAP->>DB: COMMIT transazione
        SAP-->>Sorgente: Documento salvato con successo
    else Validazione Fallita (@error > 0)
        TN-->>SAP: Segnala errore (@error, @error_message)
        SAP->>DB: ROLLBACK transazione
        SAP-->>Sorgente: Blocco operazione e messaggio d'errore
    end
  1. SAP chiama una stored procedure (tipicamente chiamata SBO_SP_TransactionNotification) ogni volta che sta per confermare (COMMIT) una transazione su determinate tabelle.
  2. La stored procedure riceve parametri come tipo di oggetto, numero documento, tipo di transazione (Add/Update/Delete/Cancel).
  3. Se la stored procedure restituisce un errore, SAP annulla la transazione e mostra un messaggio all'utente — a prescindere da dove sia partita l'operazione.

Esempio concettuale (T-SQL, non C#)

ALTER PROCEDURE [dbo].[SBO_SP_TransactionNotification]
    @object_type NVARCHAR(20),
    @transaction_type NCHAR(1),
    @num_of_cols_in_key INT,
    @list_of_key_cols_tab_del NVARCHAR(255),
    @list_of_cols_val_tab_del NVARCHAR(255)
AS
BEGIN
    DECLARE @error INT
    DECLARE @error_message NVARCHAR(200)

    IF @object_type = '17' AND @transaction_type IN ('A', 'U') -- Es. Ordine di Vendita
    BEGIN
        -- Logica di validazione custom qui
        -- Se qualcosa non va:
        -- SET @error = 1
        -- SET @error_message = 'Validazione fallita: motivo'
    END

    IF @error > 0
    BEGIN
        SELECT @error, @error_message
    END
END

Relazione con l'add-on C

Il Transaction Notification non è scritto in C# — è T-SQL lato database. Ma un add-on può comunque avere bisogno di sapere che questo meccanismo esiste, perché:

  • Spiega perché certe validazioni "a prova di bomba" non possono vivere solo nella UI API.
  • Un add-on può ricevere feedback dall'utente su un errore che in realtà proviene dal Transaction Notification, non dal proprio codice — utile saperlo per non perdere tempo a debuggare nel posto sbagliato.

Differenza riassuntiva con UI/DI API

UI API DI API Transaction Notification
Dove gira Client (thread SAP) Client/server (.NET) Database (T-SQL)
Cosa intercetta Interazioni utente su schermo Operazioni programmatiche sui documenti Ogni transazione DB, da qualunque fonte
Può bloccare il salvataggio? Sì, ma solo se l'operazione passa da lì No (è lei stessa a generare l'operazione) Sì, sempre, a prescindere dalla fonte