Caricare un documento in memoria
copia linkTrascrizione
Analizziamo ora alcune istruzioni fondamentali per la manipolazione, via codice, dei documenti, ed iniziamo con il caricamento di un documento dal database.
Partiamo subito con un esempio prima di qualsiasi nozione teorica, in quanto nel progetto la videata Prenotazioni contiene un Command Button Scheda, alla cui pressione si vorrebbe vedere la scheda dell’appartamento; l’ossatura della procedura attaccata al Command Button è tutta presente.
Ecco come notate, ad un certo punto nel codice facciamo riferimento a un metodo statico loadDocument creato nel documento Appartamento: questo dobbiamo ancora sistemarlo.
Per caricare in memoria il documento dobbiamo in primis definire una variabile della stessa tipologia del documento da caricare, istanziare l’oggetto ed impostare le proprietà come criteri di filtro: nel nostro esempio scriveremo:
docAppartamento = new
docAppartamento.Id = PrimaryKey
Stiamo utilizzando le proprietà del documento come criteri di caricamento, perché in effetti se il documento esiste, avrà proprio questa primary key.
Ed ora l’istruzione: docAppartamento.loadFromDb()
Questa istruzione indica al framework di preparare una query, basata sulla Master Query Documentale aggiungendo una Where per le proprietà di filtro che abbiamo valorizzato: il tutto ovviamente automatico e trasparente per noi.
Un piccolo appunto, anzi due: questa istruzione può causare una eccezione di errore nel caso in cui il documento non venga trovato, oppure ne vengano trovati più di 1; è necessario includerla in un blocco try catch: l’istruzione try catch consente di eseguire istruzioni, e nel caso scatti un errore questo viene gestito con il codice del blocco catch.
Noi scriveremo:
Try {
docAppartamento.loadFromDB()
catch {
docAppartamento = null
}
Passiamo all’esecuzione e ora possiamo provare il pulsante SCHEDA.
Rimaniamo nella videata Prenotazioni, e dovremmo gestire il caso in cui venga aggiunto un servizio: l’aggiunta deve recuperare il Prezzo e se è Prezzo al Giorno dal documento ServizioAppartamento: tutta la logica la inseriamo nel documento PrenotazioneServizi.
Creiamo un metodo in PrenotazioneServizio chiamato recuperaPrezzo().
Function void recuperaPrezzo() {
ServizioAppartamento docSA = null
docPrenotazione = parent
if (docPrenotazione != null) {
If (length(docPrenotazione.idAppartamento) != 0 and length(idServizio) != 0)
docSA = new()
docSA.IdAppartamento = docPrenotazione.idAppartamento
docSA.idServizio = idServizio
docSA.loadFromDB()
}
If (docSA != null)
Prezzo = nullvalue(docSA.Prezzo)
PrezzoAlGiorno = nullvalue(docSA.PrezzoAlGiorno, false)
}
}
}
Questa funzione recupera il prezzo partendo da un servizio e un appartamento.
Ora creiamo una funzione che calcola il Totale della riga.
Public void calcolaRigo() {
docPrenotazione = parent;
if (PrezzoAlGiorno = false)
Totale = nullvalue(Prezzo,0)
Else
Totale = nullvalue(Prezzo,0) * nullvalue(docPrenotazione.Giorni,0)
}
}
Cominciamo a unire queste funzioni, quando dobbiamo recuperare il prezzo ? Quando l’utente cambia il Servizio, allora sottoscriviamoci all’evento onEndTransaction del documento PrenotazioneServizio.
Event PrenotazioneServizio.onEndTransaction {
Boolean ricalcola = false
docPrenotazione = parent
If (wasmodified(idServizio) }
recuperaPrezzo()
ricalcola = true
}
if (wasModified(Prezzo) or wasModified(PrezzoGiorno) or wasModified(Ricalcola) {
calcolaRigo()
ricalcola = true
}
if (ricalcola) {
docPrenotazione.calcolaTotale()
}
}
Controlliamo che i campi di pannello siano impostati come attivi, così riusciremo a vedere immediatamente il totale rigo, mandiamo in esecuzione.
L’applicazione, ma soprattutto la logica di funzionamento, si sta formando proprio grazie alle operazioni documentali, che ci aspettano anche nei prossimi tutorial.
Partiamo subito con un esempio prima di qualsiasi nozione teorica, in quanto nel progetto la videata Prenotazioni contiene un Command Button Scheda, alla cui pressione si vorrebbe vedere la scheda dell’appartamento; l’ossatura della procedura attaccata al Command Button è tutta presente.
Ecco come notate, ad un certo punto nel codice facciamo riferimento a un metodo statico loadDocument creato nel documento Appartamento: questo dobbiamo ancora sistemarlo.
Per caricare in memoria il documento dobbiamo in primis definire una variabile della stessa tipologia del documento da caricare, istanziare l’oggetto ed impostare le proprietà come criteri di filtro: nel nostro esempio scriveremo:
docAppartamento = new
docAppartamento.Id = PrimaryKey
Stiamo utilizzando le proprietà del documento come criteri di caricamento, perché in effetti se il documento esiste, avrà proprio questa primary key.
Ed ora l’istruzione: docAppartamento.loadFromDb()
Questa istruzione indica al framework di preparare una query, basata sulla Master Query Documentale aggiungendo una Where per le proprietà di filtro che abbiamo valorizzato: il tutto ovviamente automatico e trasparente per noi.
Un piccolo appunto, anzi due: questa istruzione può causare una eccezione di errore nel caso in cui il documento non venga trovato, oppure ne vengano trovati più di 1; è necessario includerla in un blocco try catch: l’istruzione try catch consente di eseguire istruzioni, e nel caso scatti un errore questo viene gestito con il codice del blocco catch.
Noi scriveremo:
Try {
docAppartamento.loadFromDB()
catch {
docAppartamento = null
}
Passiamo all’esecuzione e ora possiamo provare il pulsante SCHEDA.
Rimaniamo nella videata Prenotazioni, e dovremmo gestire il caso in cui venga aggiunto un servizio: l’aggiunta deve recuperare il Prezzo e se è Prezzo al Giorno dal documento ServizioAppartamento: tutta la logica la inseriamo nel documento PrenotazioneServizi.
Creiamo un metodo in PrenotazioneServizio chiamato recuperaPrezzo().
Function void recuperaPrezzo() {
ServizioAppartamento docSA = null
docPrenotazione = parent
if (docPrenotazione != null) {
If (length(docPrenotazione.idAppartamento) != 0 and length(idServizio) != 0)
docSA = new()
docSA.IdAppartamento = docPrenotazione.idAppartamento
docSA.idServizio = idServizio
docSA.loadFromDB()
}
If (docSA != null)
Prezzo = nullvalue(docSA.Prezzo)
PrezzoAlGiorno = nullvalue(docSA.PrezzoAlGiorno, false)
}
}
}
Questa funzione recupera il prezzo partendo da un servizio e un appartamento.
Ora creiamo una funzione che calcola il Totale della riga.
Public void calcolaRigo() {
docPrenotazione = parent;
if (PrezzoAlGiorno = false)
Totale = nullvalue(Prezzo,0)
Else
Totale = nullvalue(Prezzo,0) * nullvalue(docPrenotazione.Giorni,0)
}
}
Cominciamo a unire queste funzioni, quando dobbiamo recuperare il prezzo ? Quando l’utente cambia il Servizio, allora sottoscriviamoci all’evento onEndTransaction del documento PrenotazioneServizio.
Event PrenotazioneServizio.onEndTransaction {
Boolean ricalcola = false
docPrenotazione = parent
If (wasmodified(idServizio) }
recuperaPrezzo()
ricalcola = true
}
if (wasModified(Prezzo) or wasModified(PrezzoGiorno) or wasModified(Ricalcola) {
calcolaRigo()
ricalcola = true
}
if (ricalcola) {
docPrenotazione.calcolaTotale()
}
}
Controlliamo che i campi di pannello siano impostati come attivi, così riusciremo a vedere immediatamente il totale rigo, mandiamo in esecuzione.
L’applicazione, ma soprattutto la logica di funzionamento, si sta formando proprio grazie alle operazioni documentali, che ci aspettano anche nei prossimi tutorial.
Ultima modifica: 19/03/2021 / Validità: da 20.5.8000