Ciclare una collection di documenti
linkTrascrizione
Facciamo il punto della applicazione, o meglio del codice in sospeso:
Partiamo dal più semplice: calcolaTotaleServizi.
Esiste una istruzione denominata for each che consente l’iterazione di elementi di tipo Collection o di tipo Recordset: gli oggetti recordset sono un insieme di dati in arrivo dal database che non sono gestiti in modalità documentale.
Siccome nel metodo noi dobbiamo ciclare gli elementi della collection PrenotazioneServizi e fare una sommatoria usiamo l’istruzione for each.
Quando digitiamo l’istruzione compare il blocco relativo ai recordset, noi premiamo subito la barra spaziatrice e troviamo la collection da ciclare.
Ecco allora l’istruzione corretta.
For each PrenotazioneServizi recRiga of PrenotazioneServizi {
totServizi = totServizi + recRiga.Totale
}
Ad ogni iterazione la variabile recRiga rappresenterà l’elemento puntato e ne potremo recuperare i valori delle proprietà: l’iterazione si conclude quando si arriva all’ultimo elemento della collection.
L’istruzione come potete notare è la classica operazione presente anche in altri linguaggi per l’iterazione di liste.
Sistemiamo anche l’altro metodo Appartamenti.ServizioDuplicati: qui dobbiamo ciclare la collection ServiziAppartamenti e trovare se ci sono IdServizi duplicati; ci facciamo aiutare da un altro oggetto precisamente da un oggetto array che in Foundation è denominato IDArray: quindi cicliamo la collection, vediamo se idServizio non è nell’array lo aggiungiamo, se invece è già presente segnaliamo l’errore.
IDArray arElementi = null
arElementi = new()
for each ServiziAppartamenti recRigo {
if (length(recRigo.idServizio) != 0) {
if (arElementi.find (recRigo.idServizio) = -1) {
arElement.addValue(recRigo.idServizio)
Else {
bDuplicati = true
break
}
}
}
Ed in ultimo la funzione calcolaPrezzo() l’algoritmo era un po’ lungo così l ho gia scritto, analizziamolo insieme.
Quando dobbiamo recuperare il prezzo? nella EndTransaction del documento Prenotazione.
Quindi sarà:
event Prezzo.onEndTransaction {
if wasmodified(IdAppartamento or Arrivo or Partenza) {
TotaleSoggiorno = Prezzo.calcolaPrezzo(idAppartamento, Arrivo, Partenza)
loadCollectionFromDb(PrenotazioneServizio)
for each PrenotazioneServizio recRigo
recRigo.recuperaPrezzo()
recRigo.calcolaRigo()
}
calcolaTotale();
}
}
Mandiamo in esecuzione e testiamo l’applicazione.
- Prezzo.calcolaPrezzo.
- Appartamenti.ServizioDuplicati.
- Prenotazione.CalcolaTotaleServizi.
Partiamo dal più semplice: calcolaTotaleServizi.
Esiste una istruzione denominata for each che consente l’iterazione di elementi di tipo Collection o di tipo Recordset: gli oggetti recordset sono un insieme di dati in arrivo dal database che non sono gestiti in modalità documentale.
Siccome nel metodo noi dobbiamo ciclare gli elementi della collection PrenotazioneServizi e fare una sommatoria usiamo l’istruzione for each.
Quando digitiamo l’istruzione compare il blocco relativo ai recordset, noi premiamo subito la barra spaziatrice e troviamo la collection da ciclare.
Ecco allora l’istruzione corretta.
For each PrenotazioneServizi recRiga of PrenotazioneServizi {
totServizi = totServizi + recRiga.Totale
}
Ad ogni iterazione la variabile recRiga rappresenterà l’elemento puntato e ne potremo recuperare i valori delle proprietà: l’iterazione si conclude quando si arriva all’ultimo elemento della collection.
L’istruzione come potete notare è la classica operazione presente anche in altri linguaggi per l’iterazione di liste.
Sistemiamo anche l’altro metodo Appartamenti.ServizioDuplicati: qui dobbiamo ciclare la collection ServiziAppartamenti e trovare se ci sono IdServizi duplicati; ci facciamo aiutare da un altro oggetto precisamente da un oggetto array che in Foundation è denominato IDArray: quindi cicliamo la collection, vediamo se idServizio non è nell’array lo aggiungiamo, se invece è già presente segnaliamo l’errore.
IDArray arElementi = null
arElementi = new()
for each ServiziAppartamenti recRigo {
if (length(recRigo.idServizio) != 0) {
if (arElementi.find (recRigo.idServizio) = -1) {
arElement.addValue(recRigo.idServizio)
Else {
bDuplicati = true
break
}
}
}
Ed in ultimo la funzione calcolaPrezzo() l’algoritmo era un po’ lungo così l ho gia scritto, analizziamolo insieme.
Quando dobbiamo recuperare il prezzo? nella EndTransaction del documento Prenotazione.
Quindi sarà:
event Prezzo.onEndTransaction {
if wasmodified(IdAppartamento or Arrivo or Partenza) {
TotaleSoggiorno = Prezzo.calcolaPrezzo(idAppartamento, Arrivo, Partenza)
loadCollectionFromDb(PrenotazioneServizio)
for each PrenotazioneServizio recRigo
recRigo.recuperaPrezzo()
recRigo.calcolaRigo()
}
calcolaTotale();
}
}
Mandiamo in esecuzione e testiamo l’applicazione.
Ultima modifica: 21/10/2020 / Validità: da 20.5.8000