Introduzione
Le WAM scritte per essere eseguite all'interno del VLFramework come Filtri o Command-Handler, devono sottostare a delle precise regole dettate da Lansa: in aggiunta a queste ci sono le nostre regole per far funzionare correttamente l'infrastruttura di D-MODA Web.
Il VLFramework simula un'esecuzione ad "eventi": simula perchè la WAM per sua natura è procedurale, ma all'avvio della webroutine, viene creato un particolare oggetto che decodifica la richiesta pervenuta e la trasforma in una sequenza di SignalEvent sincroni.
Ci sono degli Eventi di Sistema che vengono triggati in automatico ma c'è la possibilità di definire degli eventi utente per la gestione delle azioni nella pagina: il Framework mette a disposizione 20 uWAMEvent_ ma si possono estendere definendo degli attributi in fase di registrazione.
La creazione dell'oggetto e la definizione degli eventi gestiti avvengono all'interno della webroutine UHandleEvent, mentre l'esecuzione vera e propria va implementata nelle EvtRotuine specifiche dell'evento.
Il ciclo di vita di una WAM richiamata dal Framework si può riassumere in questo modo:
1a esecuzione
UHandleEvent (webroutine)
uInitialize (evtroutine)
uExecute (evtroutine)
uTerminate (evtroutine)
successive esecuzione (restando sempre all'interno dello stesso command-handler)
UHandleEvent (webroutine)
uInitialize (evtroutine)
uWAMEvent_nn (evtroutine)
uTerminate (evtroutine)
come si può vedere gli eventi uInitialize e uTerminate vengono sempre triggati, mentre l'uExecute viene triggata solo la prima volta che il command viene selezionato.
(ATTENZIONE: se si clicca sulla tab del command anche se il command è già aperto, per il Framework è sempre una prima esecuzione)
Template di riferimento
Sono state create due principali Application Template per la generazione del codice "standard" che contengono tutta la struttura minima per il funzionamento della WAM
EDVLFWFILT per i Filtri
EDVLWFBASE per i Command-Handler
Struttura di un programma
La struttura generale del programma è la seguente:
Il layout da utilizzare è sempre "vlf_layout"
BEGIN_COM ROLE(*EXTENDS £PRIM_WAM) LAYOUTWEBLET('vlf_layout')
Definizioni degli oggetti del FrameWork
Per i Filtri
DEFINE_COM CLASS(£VF_SW100) NAME(£avFrameworkManager)
DEFINE_COM CLASS(£VF_AW007) NAME(£ThisFilter) REFERENCE(*Dynamic)
DEFINE_COM CLASS(£VF_LW002) NAME(£avListManager) REFERENCE(*Dynamic)
DEFINE_COM CLASS(£FP_IN001) NAME(£FastPart) REFERENCE(*Dynamic)
Per i Command-Handler
DEFINE_COM CLASS(£VF_SW100) NAME(£avFrameworkManager)
DEFINE_COM CLASS(£VF_AW010) NAME(£ThisHandler) REFERENCE(*Dynamic)
DEFINE_COM CLASS(£VF_LW002) NAME(£avListManager) REFERENCE(*Dynamic)
DEFINE_COM CLASS(£FP_IN001) NAME(£FastPart) REFERENCE(*Dynamic)
Definizione oggetto per D-MODA Web
La reusable-part DMWAMHND contiene tutti i principali oggetti per la configurazione e la gestione della WAM all'interno dell'infrastruttura di D-MODA Web.
E' l'unica che può essere definita senza reference(*deferred): tutte le altre reusable-part DEVONO riportare l'attributo REFERENCE(*DEFERRED)
* ===================================================================================
* OGGETTO DMWAMHND - SERVE PER ARCHITTETTURA INTERNA EMMEDATA
* ===================================================================================
DEFINE_COM CLASS(£DMWAMHND) NAME(£DMWAMHND)
Working-list per gestire la definizione delle parti comuni ad ogni wam come i Pulsanti Standard, il box Emissione ed altro
DEF_LIST NAME(£WLENVLIST) FIELDS(£WLVFTYPE £WLVFSUBTP £WLVFDEFID £WLVFENAB £WLVFATTR1 £WLVFATTR2 £WLVFATTR3 £WLVFATTR4 £WLVFATTR5 £WLVFFLAG1 £WLVFFLAG2 £WLVFFLAG3 £WLVFFLAG4 £WLVFFLAG5) TYPE(*Working) ENTRYS(*MAX)
WebMap per i campi necessari al FrameWork
********** VL Framework map fields. DO NOT CHANGE.
WEB_MAP FOR(*BOTH) FIELDS((£VF_FRAMEI *PRIVATE) (£VF_FRAMEW *PRIVATE) (£VF_FRAMES *PRIVATE) (£VF_ELXTOF *PRIVATE) (£VF_ELXN01 *PRIVATE) (£VF_ELXN02 *PRIVATE) (£VF_ELXN03 *PRIVATE) (£VF_ELXN04 *PRIVATE) (£VF_ELXN05 *PRIVATE) (£VF_ELXN06 *PRIVATE) (£VF_ELXN07 *PRIVATE) (£VF_ELXN08 *PRIVATE) (£VF_ELXN09 *PRIVATE) (£VF_ELXN10 *PRIVATE) (£VF_ELXA01 *PRIVATE) (£VF_ELXA02 *PRIVATE) (£VF_ELXA03 *PRIVATE) (£VF_ELXA04 *PRIVATE) (£VF_ELXA05 *PRIVATE) (£VF_ELXA06 *PRIVATE) (£VF_ELXA07 *PRIVATE) (£VF_ELXA08 *PRIVATE) (£VF_ELXA09 *PRIVATE) (£VF_ELXA10 *PRIVATE))
WebMap per i campi necessari a D-MODA Web
WEB_MAP FOR(*BOTH) FIELDS((£WLENVLIST *PRIVATE) (£WLVFIDSEL *PRIVATE))
Aggiungere separatamente tutte le WebMap necessarie al programma
Nella "CreateInstance" si aggancia la working-list £WLENVLIST per essere gestita da altre reusable-part durante il processo di esecuzione della WAM
EVTROUTINE HANDLING(£COM_OWNER.CreateInstance) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)
USE BUILTIN(UD_EDVFLIST) WITH_ARGS("BIND_WAM_LIST" "WLENVLIST") TO_GET(£WLVFRETC)
ENDROUTINE
Il segnaposto [TIPO] va sostituito con FILTER per i Filtri e COMMAND per i command-handler
Il segnaposto [HANDLER] va sostituito con £ThisFilter per i Filtri e £ThisHandler per i command-handler
Webroutine principale UHandleEvent
Registrare Eventi Utente
Inizializzare il FrameWork
Eseguire la gestione degli Eventi (soncorna)
Aggiornare la working-list WLENVLIST
**********
********** Standard webroutine used by all VLF WAM filters and command handlers. DO NOT CHANGE the Web routine name. Use this routine to register WAM events.
**********
WEBROUTINE NAME(UHandleEvent)
**********
**********
INVOKE METHOD(£avFrameworkManager.avRegisterEvent) NAMED(xxxxxxxxxxxxxxxxxxx) SIGNALASWAMEVENT(nn) * DA 01 A 20
**********
**********
**********
INVOKE METHOD(£avFrameworkManager.avInitializeWAM) TYPE([TIPO]) INVOKER(£COM_OWNER) LISTMANAGER(£avListManager) HANDLERMANAGER([HANDLER]) FASTPARTMANAGER(£FastPart)
INVOKE METHOD(£avFrameworkManager.avHandleWAMEvent) ANCHORBLOCK(£vf_framew) EVENT(£vf_event) DESIGNMODE(£vf_framed) SKIN(£VF_Frames) METATAG(£vf_elmeta) TOF(£vf_elxtof) N01(£vf_elxn01) N02(£vf_elxn02) N03(£vf_elxn03) N04(£vf_elxn04) N05(£vf_elxn05) N06(£vf_elxn06) N07(£vf_elxn07) N08(£vf_elxn08) N09(£vf_elxn09) N10(£vf_elxn10) A01(£vf_elxA01) A02(£vf_elxA02) A03(£vf_elxA03) A04(£vf_elxA04) A05(£vf_elxA05) A06(£vf_elxA06) A07(£vf_elxA07) A08(£vf_elxA08) A09(£vf_elxA09) A10(£vf_elxA10) SSINAME(£VF_FRAMEI)
**********
USE BUILTIN(UD_EDVFLIST) WITH_ARGS("SYNC_WAM_LIST" *BLANK) TO_GET(£WLVFRETC)
ENDROUTINE
EventRoutine uInitialize, uExecute e uTerminate: invocare i rispettivi metodi di DMWAMHND
EVTROUTINE Handling(£avFrameworkManager.uInitialize) Options(*NOCLEARMESSAGES *NOCLEARERRORS)
£DMWAMHND.um_InitializeWAM Frameworkmanager(£avFrameWorkManager) Tipo([TIPO]) Listmanager(£avListManager) Handlermanager([HANDLER]) Fastpartmanager(£FastPart)
**********
********** INSERIRE I COMANDI DOPO QUESTA RIGA
**********
ENDROUTINE
EVTROUTINE HANDLING(£avFrameworkManager.uExecute) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)
£DMWAMHND.um_ExecuteWAM FRAMEWORKMANAGER(£avFrameWorkManager) TIPO([TIPO]) LISTMANAGER(£avListManager) HANDLERMANAGER([HANDLER]) FASTPARTMANAGER(£FastPart)
**********
********** INSERIRE I COMANDI DOPO QUESTA RIGA
**********
ENDROUTINE
EVTROUTINE HANDLING(£avFrameworkManager.uTerminate) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)
**********
********** INSERIRE I COMANDI PRIMA DI QUESTA RIGA
**********
£DMWAMHND.um_TerminateWAM FRAMEWORKMANAGER(£avFrameWorkManager) TIPO([TIPO]) LISTMANAGER(£avListManager) HANDLERMANAGER([HANDLER]) FASTPARTMANAGER(£FastPart)
ENDROUTINE
EventRoutine uWAMEvent_nn
EVTROUTINE HANDLING(£avFrameworkManager.uWAMEvent_nn) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)
**********
********** IMPLEMENTARE CODICE NECESSARIO
**********
ENDROUTINE
Solitamente nella routine uExecute si mettono le istruzioni per inizializzare la WAM solo la prima volta dato che non vengono ripetute tra un evento e l'altro.
Un esempio è l'abilitazione dei Pulsanti Standard o Funzione necessari, la configurazione del tipo di emissione in caso di gestione stampe, ecc.
Infrastruttura D-MODA Web
Tasti Standard e Tasti Funzione
Tramite l'oggetto £DMWAMHND.up_ButtonHandler si gestiscono i pulsanti da abilitare ad uso dell'utente: questi sono suddivisi in "Tasti Standard" e "Tasti Funzione".
La differenza sta nel fatto che quelli "Standard" hanno funzionalità prefissate assegnate ad id fissi, mentre quelli "Funzione" sono configurabili (in fatto di descrizione ed id)
Tasti Standard
I "Tasti Standard" attivabili sono 13
1 Salva
2 Modifica
3 Cerca
4 Elimina
5 Annulla
6 Chiudi
7 Stampa
8 Aggiorna
9 Conferma
10 Decodifica
11 Forza
12 Avanti
13 Indietro
Vanno abilitati:
£DMWAMHND.up_ButtonHandler.um_STDButton Pitembottone(1) Pgestito(TRUE) * Attiva il Tasto "Salva"
£DMWAMHND.up_ButtonHandler.um_STDButton Pitembottone(5) Pgestito(TRUE) * Attiva il Tasto "Annulla"
La gestione, per convenzione, va fatta nell'eventroutine 18 per l'evento "FP_RBTSTD.CLICK" ( gli identificativi eventi sono delle semplici stringhe), attraverso il controllo dell'id passato
INVOKE METHOD(£avFrameworkManager.avRegisterEvent) NAMED(FP_RBTSTD.CLICK) SIGNALASWAMEVENT(18)
********** ===================================================================================
********** ROUTINE GESTIONE MESSAGGI DEI PULSTANTI STANDARD
********** ===================================================================================
EVTROUTINE HANDLING(£avFrameworkManager.uWAMEvent_18) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)
**********
IF (£WLVFIDSEL = 0)
£FastPart.uSingName := FP_RBTSTD
£WLVFIDSEL := £FastPart.UselectItem
ENDIF
**********
CASE (£WLVFIDSEL)
**********
WHEN (= 1)
£com_owner.um_WAMSalva
**********
WHEN (= 2)
********** £com_owner.um_WAMModifica
**********
WHEN (= 3)
********** £com_owner.um_WAMCerca
**********
WHEN (= 4)
********** £com_owner.um_WAMElimina
**********
WHEN (= 5)
********** £com_owner.um_WAMAnnulla
**********
WHEN (= 6)
********** £com_owner.um_WAMChiudi
**********
WHEN (= 7)
********** £com_owner.um_WAMStampa
**********
WHEN (= 8)
********** £com_owner.um_WAMAggiorna
**********
WHEN (= 9)
********** £com_owner.um_WAMConferma
**********
WHEN (= 10)
********** £com_owner.um_WAMDecodifica
**********
WHEN (= 11)
********** £com_owner.um_WAMForza
**********
WHEN (= 12)
********** £com_owner.um_WAMAvanti
**********
WHEN (= 13)
********** £com_owner.um_WAMIndietro
**********
ENDCASE
**********
ENDROUTINE
Tasti Funzione
Vanno abilitati:
£DMWAMHND.up_ButtonHandler.um_FUNButton Pitembottone(1) Pgestito(TRUE) PCaption(*MTXTxxxxxxxxxxx)
La gestione, per convenzione, va fatta nell'eventroutine 19 per l'evento "FP_RBTFUN.CLICK" attraverso il controllo dell'id passato
INVOKE METHOD(£avFrameworkManager.avRegisterEvent) NAMED(FP_RBTFUN.CLICK) SIGNALASWAMEVENT(19)
********** ===================================================================================
********** ROUTINE GESTIONE MESSAGGI DEI PULSTANTI FUNZIONE
********** ===================================================================================
EVTROUTINE HANDLING(£avFrameworkManager.uWAMEvent_19) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)
**********
IF (£WLVFIDSEL = 0)
£FastPart.uSingName := FP_RBTFUN
£WLVFIDSEL := £FastPart.UselectItem
ENDIF
**********
CASE (£WLVFIDSEL)
**********
WHEN (= 1)
********** £com_owner.um_WAMFun01
**********
WHEN (= 2)
********** £com_owner.um_WAMFun02
**********
ENDCASE
**********
ENDROUTINE
Tecniche di programmazione
Argomenti parametrici al command
Più command possono richiamare la stessa WAM per cui il VLFramework dà la possibilità di specificare degli argomenti che verranno messi a disposizione tramite l'oggetto Handler per essere letti e comportarsi di conseguenza.
Questi argomenti sono 2 alfanumerici e 2 numerici:
£[HANDLER].avAlphaArg1
£[HANDLER].avAlphaArg2
£[HANDLER].avNumericArg1
£[HANDLER].avNumericArg2
Controlloare se un'instanza è selezionata e leggerla
I command-handler a livello di instance-list devono controllare se esiste l'instanza selezionata è valida tramite:
£avListmanager.GetcurrentInstance AKEY1(<Key>) NKEY1(<Key>) FOUND(£FLTROVATO)
IF (£FLTROVATO.asBoolean)
<Istruzioni>
ENDIF
Esempio per abilitare o meno i tasti
£DMWAMHND.up_ButtonHandler.um_stdbuttonenabled PITEMBOTTONE(1) PENABLED(£FLTROVATO.asBoolean)
Disegno della pagina XSL della Webroutine
La weblet da utilizzare per i la gestione dei Tasti è : "ed_standard_button".
Nei FILTRI questa deve essere posizionata IN BASSO e NON deve essere inglobata all'interno di altri tag html
Nei COMMAND-HANDLER deve essere posizionata IN ALTO e NON deve essere inglobata all'interno di altri tag html
Note sui Filtri
Per poter sfruttare al meglio la paginazione automatica a livello di instance-list occorre che i filtri seguano le seguenti regole:
NON DEVONO implementare la paginazione al loro interno: il filtro si occuperà di caricare tutti i record selezionati nell'instance-list
bisogna caricare nell'instance-list solo il primo livello padre (per gli oggetti che gestiscono padre-figlio): i livelli secondari devono essere caricati on-demand con apposita funzione RELATIONSHIP-HANDLER