Ho una struttura documentale padre-figlio tra le entità Order e OrderDetail e vorrei impedire il salvataggio se tento di inserire un ordine senza righe ma voglio che il messaggio di errore compaia solo se sto salvando.
Inoltre vorrei impedire gli sconti sulle righe se il cliente ha come nazionalità UK.
Vediamo insieme come fare utilizzando un progetto di esempio con il classico database Northwind di Microsoft.
Questo il progetto:
Validazione Documento.zip (1,6 MB)
Il primo controllo è nell’evento onValidate di Order dove verifico se ci sono delle righe d’ordine:
event Order.OnValidate(
int:validateReasons Reason
inout boolean Error
inout boolean Skip)
{
// Validazione al salvataggio
if (Reason == 0)
{
if (OrderDetails.count() == 0)
{
this.addDocumentError("Inserire almeno una riga per poter salvare l'ordine")
}
}
}
Utilizzando il parametro Reason posso testare se sono alla validazione scatenata dal salvataggio (valore = 0).
Inoltre da notare che è stato utilizzato il metodo addDocumentError per attaccare il messaggio di errore al documento e non ad un singolo campo.
Per il secondo controllo utilizziamo l’evento onValidate di OrderDetail nel quale si controlla che sia presente un padre (parent) e che sia un’istanza di Order, quindi si recupera la nazionalità del cliente dell’ordine e a questo punto si può effettuare il controllo se sulla riga d’ordine è stato applicato uno sconto.
event OrderDetail.OnValidate(
int:validateReasons Reason
inout boolean Error
inout boolean Skip
)
{
// Se ho un padre
if (parent != null)
{
// Se mio padre è un Order
if (Order.isMyInstance(parent))
{
Order ordPadre = parent
Customer cust = (Customer)ordPadre.getLinkedDocument(false, cust.className(...), ...)
if (cust != null)
{
// Nel caso il cliente sia di nazionalità UK non sono ammessi sconti sui prodotti
if (upper(cust.Country) == "UK")
{
if (Discount != 0)
{
this.setPropertyError("Per questo cliente non sono ammessi sconti", Discount)
}
}
}
}
}
}