Creare un nuovo documento e salvare
copia linkTrascrizione

Pensiamo di trovarci nella videata Appartamento e voler creare al volo una Prenotazione per l’appartamento, con all’interno tutti i servizi previsti: voler creare una prenotazione al volo intendo preparare un documento di tipo Prenotazione già compilato con Appartamento e Servizi che sarà possibile utilizzare in interfaccia ad esempio passandolo alla videata Prenotazione così da mostrarlo nel pannello per il completamento dei dati mancanti (Arrivo, Partenza, Cliente etc).
Andiamo per step: iniziamo implementando un metodo che effettui la creazione in memoria di un documento di tipo Prenotazione valorizzato con IdAppartamento e Servizi; il documento non verrà salvato ma ritornato dal metodo funzione così da poterlo utilizzare come meglio si creda.
Domanda: dove sarebbe logico creare un metodo creaPrenotazione con le funzionalità che vi ho esposto? Siccome si parte da un Appartamento e sulla base di questo si crea una Prenotazione il posto opportuno per la sua creazione è proprio il documento Appartamento.
Albero di progetto => Appartamento => Tasto destro => Aggiungi Procedura => chiamiamo il metodo creaPrenotazione.
Il metodo è un metodo di istanza, vuol dire che quando utilizzeremo il metodo potremo accedere a tutte le proprietà del documento:
Public Prenotazione creaPrenotazione() {
Prenotazione docPrenotazione = null //Creiamo la prenotazione
PrenotazioneServizio docSP = null //Aggiungeremo righe di servizi
//Inizio creazione Prenotazione
docPrenotazione = new()
docPrenotazione.init() //FONDAMENTALE PER I VALORI PREDEFINITI
docPrenotazione.IdAppartamento = Id //Siamo nell’istanza
}
Ora dobbiamo caricare la collection dei Servizi relativi all’Appartamento nel caso non sia caricata.
If (not(ServiziAppartamenti.loaded) and not(inserted)) {
loadCollectionFromDb(ServiziAppartamenti)
}
//Ora cicliamo sui Servizi presenti e intanto creiamo i documenti per la prenotazione For each ServiziAppartamenti recSA of ServiziAppartamenti {
docSP = new()
docSP.init()
//Aggiungo alla collection
docPrenotazione.PrenotazioneServizi.add(docSP)
docSP.idPrenotazione = docPrenotazione.Id
docSP.idServizio = recSA.idServizio
}
Il codice scritto negli eventi EndTransaction del documento Prenotazione e Prenotazione Servizi vengono emessi anche quando si modificano le proprietà via codice? Se ricordate gli eventi, o meglio il codice che abbiamo scritto negli eventi serviva a calcolare il totale della Prenotazione, ma ahimè gli eventi vengono emessi solo in presenza di una transazione documentale e la transazione documentale è una operazione che nasce quando i dati viaggiano tra client e server… quindi non in questo caso!! Il codice è eseguito lato server non lato client quindi non ci sono interazioni tra client e server.
Brutta notizia questa, vuol mica dire che dobbiamo riscrivere il codice che abbiamo già scritto? Assolutamente no, basta informare il framework di aprire una transazione documentale fittizia prima di modificare le proprietà e chiudere la transazione dopo la modifica.
Quindi la riga:
docSP.idServizio = recSA.idServizio
diventa:
docSP.beginTransaction()
docSP.idServizio = recSA.idServizio
docSP.EndTransaction()
Apriamo e chiudiamo la transazione documentale via codice.
Concludiamo il metodo con:
return docPrenotazione
Metodo pronto andiamo in interfaccia partiamo dalla videata Prenotazioni, aggiungiamo un metodo che chiamiamo ApriPer.
Public void ApriPer(Prenotazione docPrenotazione).
Il metodo riceve un documento e lo mostra nel pannello.
Ora passiamo alla videata Appartamenti, faccio spazio e aggiungo un Command Button PrenotaOra e aggiungiamo subito una procedura.
Public void PrenotaOra() {
Appartamento docAppartamento = APPARTAMENTI.document
Prenotazione docPrenotazione = null
If (docAppartamento != null) {
docPrenotazione = docAppartamento.creaPrenotazione()
PRENOTAZIONI.show()
PRENOTAZIONI.ApriPer(docPrenotazione)
}
}
Compiliamo il progetto e vediamone il funzionamento.
Ricordiamoci dunque che quando istanziamo via codice un documento, e il documento è effettivamente un nuovo documento che vorremo poi salvare dobbiamo chiamare il metodo init().
Il metodo imposta nel documento i valori predefiniti previsti nella struttura database e crea il valore per la chiave primaria DOCID.
Andiamo per step: iniziamo implementando un metodo che effettui la creazione in memoria di un documento di tipo Prenotazione valorizzato con IdAppartamento e Servizi; il documento non verrà salvato ma ritornato dal metodo funzione così da poterlo utilizzare come meglio si creda.
Domanda: dove sarebbe logico creare un metodo creaPrenotazione con le funzionalità che vi ho esposto? Siccome si parte da un Appartamento e sulla base di questo si crea una Prenotazione il posto opportuno per la sua creazione è proprio il documento Appartamento.
Albero di progetto => Appartamento => Tasto destro => Aggiungi Procedura => chiamiamo il metodo creaPrenotazione.
Il metodo è un metodo di istanza, vuol dire che quando utilizzeremo il metodo potremo accedere a tutte le proprietà del documento:
Public Prenotazione creaPrenotazione() {
Prenotazione docPrenotazione = null //Creiamo la prenotazione
PrenotazioneServizio docSP = null //Aggiungeremo righe di servizi
//Inizio creazione Prenotazione
docPrenotazione = new()
docPrenotazione.init() //FONDAMENTALE PER I VALORI PREDEFINITI
docPrenotazione.IdAppartamento = Id //Siamo nell’istanza
}
Ora dobbiamo caricare la collection dei Servizi relativi all’Appartamento nel caso non sia caricata.
If (not(ServiziAppartamenti.loaded) and not(inserted)) {
loadCollectionFromDb(ServiziAppartamenti)
}
//Ora cicliamo sui Servizi presenti e intanto creiamo i documenti per la prenotazione For each ServiziAppartamenti recSA of ServiziAppartamenti {
docSP = new()
docSP.init()
//Aggiungo alla collection
docPrenotazione.PrenotazioneServizi.add(docSP)
docSP.idPrenotazione = docPrenotazione.Id
docSP.idServizio = recSA.idServizio
}
Il codice scritto negli eventi EndTransaction del documento Prenotazione e Prenotazione Servizi vengono emessi anche quando si modificano le proprietà via codice? Se ricordate gli eventi, o meglio il codice che abbiamo scritto negli eventi serviva a calcolare il totale della Prenotazione, ma ahimè gli eventi vengono emessi solo in presenza di una transazione documentale e la transazione documentale è una operazione che nasce quando i dati viaggiano tra client e server… quindi non in questo caso!! Il codice è eseguito lato server non lato client quindi non ci sono interazioni tra client e server.
Brutta notizia questa, vuol mica dire che dobbiamo riscrivere il codice che abbiamo già scritto? Assolutamente no, basta informare il framework di aprire una transazione documentale fittizia prima di modificare le proprietà e chiudere la transazione dopo la modifica.
Quindi la riga:
docSP.idServizio = recSA.idServizio
diventa:
docSP.beginTransaction()
docSP.idServizio = recSA.idServizio
docSP.EndTransaction()
Apriamo e chiudiamo la transazione documentale via codice.
Concludiamo il metodo con:
return docPrenotazione
Metodo pronto andiamo in interfaccia partiamo dalla videata Prenotazioni, aggiungiamo un metodo che chiamiamo ApriPer.
Public void ApriPer(Prenotazione docPrenotazione).
Il metodo riceve un documento e lo mostra nel pannello.
Ora passiamo alla videata Appartamenti, faccio spazio e aggiungo un Command Button PrenotaOra e aggiungiamo subito una procedura.
Public void PrenotaOra() {
Appartamento docAppartamento = APPARTAMENTI.document
Prenotazione docPrenotazione = null
If (docAppartamento != null) {
docPrenotazione = docAppartamento.creaPrenotazione()
PRENOTAZIONI.show()
PRENOTAZIONI.ApriPer(docPrenotazione)
}
}
Compiliamo il progetto e vediamone il funzionamento.
Ricordiamoci dunque che quando istanziamo via codice un documento, e il documento è effettivamente un nuovo documento che vorremo poi salvare dobbiamo chiamare il metodo init().
Il metodo imposta nel documento i valori predefiniti previsti nella struttura database e crea il valore per la chiave primaria DOCID.
Ultima modifica: 19/03/2021 / Validità: da 20.5.8000