Nello sviluppo di applicazioni multi utente, specialmente in ambito gestionale, è spesso necessario prevedere un modo per rispondere alla domanda “chi è stato a cambiare questo dato, e quando è stato fatto?”. È un tema che tratto spesso anche nelle consulenze presso chi comincia con la document orientation o con chi sta avviando un nuovo progetto software. Visto l’interesse che molti hanno dimostrato verso questo argomento ho pensato di scriverci un post.
A venire in nostro aiuto anche questa volta è la Document Orientation, mediante due funzionalità in particolare: l’uso del Document Helper per globalizzare gli eventi e la capacità di salvare un qualunque documento in xml. Ma andiamo con ordine.
La prima cosa da ottenere è che qualsiasi documento che viene salvato nell’applicazione registri le proprie variazioni da qualche parte. In questo progetto di esempio ho creato una cartella logs nel database, dove scrivere il DNA del documento, la sua conversione in XML ottenuta tramite la funzione saveToXML, l’utente che ha effettuato la modifica e il momento in cui è avvenuta l’operazione. Ottenere questo risultato è semplice, basta implementare una propria estensione di IDDocumentHelper e implementare l’evento onGlobalAfterSave come in questa immagine.
A questo punto qualsiasi modifica su qualsiasi documento effettuata dall’applicazione viene registrata nella tabella. Semplicemente tutte.
La seconda cosa è far sì che l’utente possa vedere la storia delle modifiche di un certo documento, sempre a prescindere dal tipo del documento stesso. Nella schermata di gestione dei prodotti trovate un albero che mostra l’albero delle categorie e prodotti dell’applicazione, utilizzando l’albero si viene automaticamente portati alla videata per l’editing dei dati e qui è possibile salvare. Per far vedere la storia delle modifiche all’utente ho implementato un comando di menu contestuale che apre una seconda videata.
A questo punto si pone la terza cosa da risolvere: come poter mostrare le modifiche apportate a qualsiasi documento senza scrivere codice specifico? Semplice: utilizzando l’oggetto XMLDocument. Navigando l’XML del documento salvato in precedenza nei log è infatti possibile conoscere lo stato completo del documento al momento del salvataggio, questo comprende sia il nuovo valore di tutte le proprietà del documento sia il valore che esse eventualmente avevano quando è stato letto dal database. Con una tabella IMDB e le righe di codice qui sotto il gioco è fatto.
Che ne dite? Ci sono domande? 🙂