Vai al contenuto

InitializationEvents

Nel Framework Ribes, la gestione degli eventi UI API di SAP Business One è modularizzata. La classe astratta InitializationEvents rappresenta il punto di ingresso per registrare i gestori eventi per uno o più form specifici.

Questa classe implementa l'interfaccia InitialEventConfigurationInterface, che definisce il metodo principale initialization(ref SAPEvents.EventDispatcher eventDispatchers).

Funzionamento

Il CoreCoordinator, durante l'avvio, scorre tutte le classi registrate nel parametro EVENT_CONFIGURATION e chiama per ognuna il metodo initialization.

A sua volta, la classe chiama: 1. subscribeEventsOnLoad(): Registra i gestori per l'evento di load del form (che intercetteranno il momento in cui l'utente apre una specifica maschera). 2. subscribeExistingForms(): Analizza i form già aperti in SAP in quel momento e chiama subscribeEvents per agganciarsi ai form che sono già aperti (utile quando l'add-on viene avviato dopo il client SAP).

Metodi Astratti da Implementare

Creando una classe per gestire un form (es. Ordine di Vendita), dovrai implementare questi metodi: - subscribeEventsOnLoad(): Qui si sottoscrive l'evento FormLoad controllando il FormTypeEx. - subscribeEvents(string FormUID, string FormType): Qui si registrano tutti gli eventi aggiuntivi (es. click bottoni, validazione campi) specifici di un'istanza del form.

Relazione con EventDispatcher

Questa classe sfrutta il gestore eventi centralizzato, per maggiori dettagli vedi la documentazione su EventDispatcher.

Esempio Pratico: Eventi Ordine di Vendita

Ecco un esempio completo di come agganciarsi al form degli Ordini di Vendita (FormType = "139").

using RibesSAPFramework.SAPEvents;
using SAPbouiCOM;

public class SalesOrderEvents : InitializationEvents
{
    public override void subscribeEventsOnLoad()
    {
        // Sottoscrizione al caricamento del form 139 (Ordine di vendita)
        eventDispatchers.ItemEventDispatcher.SubscribeLoad("139", 
            new SAPEvents.ItemEventDispatcher.ItemEventAction(OnFormLoad));
    }

    public override void subscribeEvents(string FormUID, string FormType)
    {
        // Questo metodo viene chiamato da OnFormLoad o per form già aperti
        if (FormType != "139") return;

        // Esempio: Sottoscrizione al click del pulsante "Aggiorna" (UID: 1)
        eventDispatchers.ItemEventDispatcher.Subscribe(FormUID, "1", BoEventTypes.et_ITEM_PRESSED, 
            new SAPEvents.ItemEventDispatcher.ItemEventAction(OnButtonPressed));
    }

    private void OnFormLoad(string formUID, ref ItemEvent pVal, out bool bubbleEvent)
    {
        bubbleEvent = true;
        if (!pVal.BeforeAction)
        {
            // Il form è stato caricato, aggiungiamo i bottoni e iscriviamoci agli eventi
            subscribeEvents(formUID, pVal.FormTypeEx);

            // Logica custom: Aggiungi un pulsante
            SAPbouiCOM.Form form = SAPManager.Instance.SapApplication.Forms.Item(formUID);
            // ...
        }
    }

    private void OnButtonPressed(string formUID, ref ItemEvent pVal, out bool bubbleEvent)
    {
        bubbleEvent = true;
        if (pVal.BeforeAction)
        {
            SAPManager.Instance.SapApplication.SetStatusBarMessage("Hai premuto un tasto sull'Ordine di Vendita!", BoMessageTime.bmt_Short, false);
        }
    }
}

Per attivare questa classe, ricorda di aggiungerla nel GenericInit o nel Program.cs del tuo add-on:

cc.Parameter(CoreCoordinator.EVENT_CONFIGURATION, new SalesOrderEvents());