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: