Un Class warning è composto da un nome univoco, una condizione (l’espressione booleana) e un messaggio che viene mostrato quando la condizione è soddisfatta. Nel caso in cui il Designer impedisca la creazione o la modifica di un oggetto di una classe si parla di Class warning bloccante.
Creare un Class warning #
Dall’Application Schema , fai click destro su una classe per aprire il suo Class menu
e seleziona Set warnings...
per aprire il Class warnings manager. Clicca su Add per aprire il Class warning editor.
In alternativa, clicca sull’icona nel footer della classe e clicca su Add per aprire il Class warning editor.
Per rimuovere tutti i Class warning dichiarati (senza eliminarli singolarmente dall’editor) è sufficiente cliccare con il tasto destro sull’icona nel footer della classe e selezionare l’opzione Delete warnings
.
Class warnings manager #
Il Class warnings manager è il gestore dei Class warning definiti per una determinata classe. Attraverso i pulsanti Add
, Edit
e Delete
è possibile aggiungere, modificare o eliminare un Class warning. L’opzione Copy warnings to other applications
consente di estendere tutti i warning presenti ad altre viste applicative, selezionabili tramite le rispettive checkbox dal pannello contestuale (Link to other applications
).
I Class warning bloccanti sono evidenziati in arancione, mentre quelli non bloccanti sono evidenziati in verde.
Nell’esempio in figura è mostrato il Class warnings manager della classe Product_batch_component: sono stati aggiunti due Class warning, uno bloccante (insufficientQuantity
) e uno non bloccante (endDateInPast
).
Class warning editor #
Il campo Condition
del Class warning editor contiene al suo interno un Expression editor, nel quale è possibile digitare un’espressione, la quale deve essere necessariamente una condizione booleana. Quando l’espressione è riconosciuta come valida, l’editor mostra il messaggio Validated as BOOLEAN
.
A seconda della configurazione delle checkbox nella sezione Evaluated on
, l’editor determina in quale momento valutare la condizione:
- SaveNew: quando un nuovo oggetto è salvato per la prima volta;
- SaveExisting: quando sono salvate delle modifiche a un oggetto preesistente;
- Delete: quando un oggetto viene eliminato.
Infine, nella sezione Message
è possibile definire l’avvertimento che viene mostrato al verificarsi della condizione: Spuntando l’opzione Block action when message is displayed
, si può decidere di bloccare l’azione dell’utente nel momento in cui viene mostrato il messaggio; questo può essere utile per impedire agli utenti di effettuare modifiche che introdurrebbero inconsistenze nell’applicazione.
Esempio #
Nel prossimo esempio la classe Employee è utilizzata per memorizzare i dati degli impiegati assunti da un’azienda. L’attributo date_joined
rappresenta la data di assunzione, mentre /age
è un derivato che calcola l’età dell’impiegato in base alla data di nascita (date_of_birth
).
Al momento vi sono due casi che potrebbero dare luogo a inconsistenze nei dati:
- compilando il campo
date_joined
è possibile inserire una data qualunque, anche una data futura; - l’attributo
/age
può avere un valore inferiore a 20; un impiegato con meno di vent’anni è troppo giovane per poter essere assunto.
È chiaro che per evitare questi due scenari non possiamo procedere restringendo il dominio degli attributi a livello di Database schema, perché questo ci consentirebbe solo di definire staticamente valori minimi e massimi per date_joined
e date_of_birth
(/age
è una math calcolata su un altro attributo, e dunque non è possibile imporre direttamente su di essa alcuna restrizione di dominio); saremmo così costretti ad aggiornare continuamente l’applicazione a livello database.
Il modo più appropriato di procedere è modellare queste restrizioni a livello applicativo, attraverso dei Class warning:
joinedInFuture
verifica che la data di assunzione (date_joined
) sia precedente alla data attuale (__System.date
); l’espressione utilizzata è quindidate_joined > __System.date
.under20
appare quando l’attributo/age
assume un valore inferiore a 20; la condizione è dunqueage < 20
.
Abbiamo reso entrambi i warning bloccanti, in modo da impedire l’inserimento di dati errati nell’applicazione al momento del salvataggio e della modifica degli oggetti della classe (spuntando le opzioni SaveNew
e SaveExisting
).
Un terzo Class warning è stato aggiunto per avvisare l’utente se il salario dell’impiegato (hourly_cost
) è troppo basso, confrontando la cifra inserita con un riferimento adeguato agli anni di anzianità maturati in azienda. A tale scopo abbiamo inserito nel Class warning editor la seguente espressione: hourly_cost < (25 + dateDiff(__System.date, date_joined, field.year) * 10)
; il warning appare quando il salario è minore di 25 più gli anni trascorsi all’interno dell’azienda (calcolati sottraendo il campo year
di date_joined
all’anno della data corrente __System.date
), il tutto moltiplicato per 10. In questo caso non abbiamo reso il warning bloccante, ma abbiamo aggiunto un semplice avvertimento, scrivendo nel box dedicato il messaggio “Hourly cost is too low with respect to the employee’s experience”, come mostrato in figura.