In sintesi
In questa lezione vediamo cosa succede quando un documento si deve caricare dal database.
Nota: questo video corso è stato realizzato con la versione 4 di Instant Developer. Anche se i contenuti sono ancora attuali e sono utili per imparare ad utilizzare Instant Developer, alcune affermazioni sono di fatto superate. Per i dettagli e le ultime novità sulle funzionalità illustrate vi rimandiamo alla sezione di reference che viene tenuta aggiornata giornalmente.
In questa lezione vediamo come funziona la fase di load di un documento. Abbiamo già visto che, dopo aver creato l'istanza di un documento, è possibile caricarlo dal database impostando le proprietà chiave e poi usando la funzione Load From DB. Per ogni documento o parte di esso che sta per essere caricato dal database viene lanciato l'evento di Before Load. In questo modo il documento si può preparare al caricamento, oppure può decidere lui come caricarsi impostando poi il parametro Skip a TRUE per evitare la fase di caricamento standard del framework. Dopo aver caricato il documento o una sua parte, viene lanciato l'evento di After Load che il documento può sfruttare per completare il caricamento, ad esempio, di proprietà che non erano mappate 1 a 1 sulla tabella di origine.
Per fare un esempio, abbiamo visto nella lezione precedente che il documento ordine ha la proprietà Importo Totale, ma sul database quel campo non esiste, essa viene calcolata "al volo" mentre viene caricato il documento. Per ottenere questo risultato è sufficiente aggiungere l'evento di After Load e calcolare il valore totale utilizzando una query sul database. Proviamo l'applicazione.
Questa modalità di completamento del caricamento può essere migliorata perché così ogni volta che carichiamo un singolo ordine è richiesta una query in più. Possiamo invece istruire il framework a calcolare quella proprietà senza l'evento di After Load, tramite la definizione di una Master Query di documento. Nella MQ di documento aggiungiamo il calcolo del valore totale, poi lo assegniamo alla proprietà Importo. Togliamo l'evento di After Load e riproviamo l'applicazione.
Se nel parametro ChildrenLevel della chiamata alla funzione Load From DB è stato specificato un valore maggiore di zero, allora il documento caricherà anche le sue collection, ma solo se esse non hanno il flag TRANSIENT impostato. Tali collection potranno essere caricate da codice usando la funzione Load Collection From DB del documento. Il framework, prima di caricare una collection chiama il metodo Before Load Collection sulla classe da caricare per sapere se vogliamo fare da soli. In alternativa è possibile specificare una Value Source Query dall'oggetto collection che dice come dovrà essere caricata quella collection. Specifichiamo, ad esempio, di volere caricare le righe solo se il loro importo è maggiore di zero. La Value Source Query può essere utilizzata anche per valorizzare le proprietà speciali delle classi figlie, visto che il caricamento della collection non usa l'eventuale MQ definita a livello della classe figlia se c'è la Value Source Query. In mancanza della value source query verrà utilizzata la definizione della foreign key che lega la tabella padre alla tabella figlia per la composizione della query. Se è stata specificata una MQ sulla classe figlia, essa verrà utilizzata.
Notiamo infine la proprietà Loaded definita sia a livello di documento che di collection. Se un documento o una collection sono state caricate, la proprietà loaded è vera e successive chiamate alla Load From DB non verranno eseguite sulle parti di documento già caricate per evitare inutili query; è possibile però utilizzare la funzione Reset Loaded per forzare il ricaricamento del documento alla prossima chiamata alla Load From DB.