Ho realizzato un esempio che serve a memorizzare in una apposita tabella (Logs) le modifiche ai documenti contenuti nell’applicazione ed a visualizzarli in modo generalizzato aggiungendo un custom command a tutte le videate.
Descrizione
Il cuore del meccanismo di salvataggio delle modifiche a tutti i documenti dell’applicazione sono gli eventi GlobalBeforeSave dei documenti e GlobalPanelCommand dei pannelli, oltre all’utilizzo della reflection di Instant Developer Foundation.
GlobalPanelCommand
GlobalBeforeSave
I due eventi sono presenti nel progetto perché sono stati resi globali i rispettivi eventi BeforeSave (documento) e OnCommand (pannello).
Lo stato precedente all’ultima modifica di un documento all’atto del suo salvataggio sono salvate nella tabella Logs in un campo in formato JSON.
Nell’evento GlobalBeforeSave viene salvato lo stato precedente alle modifiche effettuate alle proprietà del documento se effettivamente lo stesso è in stato updated. Non viene effettuata la procedura se sto salvando il documento Log (quello della tabella Logs).
Se un documento ha dei figli faccio in modo che lo stato precedente di tutti i figli venga memorizzato nel documento padre e non dei singoli record relativi ai figli. Questo si realizza attaccando un tag ad ogni istanza di un figlio per indicare che non va tracciato il log.
Per i documenti dei quali si deve memorizzare lo stato precedente richiamo la funzione Log.CreaLog passandogli il documento corrente.
La funzione Log.CreaLog recupera i valori originali del documento, quelli prima delle modifiche, e li salva in una variabile in formato JSON. Viene quindi creato un documento di tipo Log con la data e ora attuali, la classe del documento che si sta salvando, la chiave del documento e il contenuto del documento stesso in formato JSON.
Nell’applicazione web viene definito un custom command che verrà aggiunto a tutte le videate (vedi evento Inizialize) che serve per aprire la videata di visualizzazione della tabella log modifiche ai documenti. Il comando attivato viene gestito nell’evento GlobalPanelCommand che verifica che sia stato premuto il bottone custom e apre in modale la videata LogsDoc passandole il DNA del documento (il suo identificativo univoco) in esame utilizzando la funzione GetDNA dell’istanza del documento.
La videata LogsDoc si occupa di visualizzare le varie modifiche effettuate nel tempo al documento identificato dal DNA passato.
Cliccando sull’attivatore della lista della videata LogsDoc viene caricato il documento dal JSON e visualizzato mediante il metodo show del documento.
Come fa il documento a sapere quale videata deve utilizzare per visualizzarsi?
Normalmente viene utilizzata la prima videata che è stata creata da quel documento (se si utilizza il tasto destro del mouse cliccando sulla videata si vede a quale classe è attaccata) ma in questo caso ho preparato delle videate apposite (nel componente) che sono state collegate specificatamente ai documenti trascinando la videata sulla classe e tenendo premuto il tasto SHIFT (perché la cosa funzioni la videata non deve essere collegata a nessuna classe).
La videata Products oltre a visualizzare il logo mediante il bottone custom lo può fare anche in riga con il bottone LOG IN RIGA che carica per ogni record che le ha anche le versioni precedenti e le aggiunge alla collection di documenti sul pannello. Le righe di log sono protette e con i campi evidenziati in rosso.
Il progetto è sul Team Works della Community e anche allegato a questa discussione (aggiornato il 5-gen-2024).
Log Modifiche Documenti.zip (1,3 MB)



