Filtri
Introduzione
In Vibecode viene utilizzata un'unica sintassi per filtrare i dati contenuti in una classe.
Attualmente questi comandi possono essere utilizzati nella gestione dei workflow per disabilitare\abilitare specifiche transizioni oppure nella gestione dei gruppi (clienti, clienti fidelizzati, prodotti, negozi, etc. )
Di seguito verranno riportati alcuni esempi utili su come creare un filtro, dal più semplice al più complesso.
Per poter impostare un filtro occorre innanzitutto conoscere le classi e proprietà definite in Vibecode.
Consultare la struttura del database di Vibecode
Tramite il menu di Vibecode è possibile consultare il repository di tutte le classi (tabelle) e relative proprietà (campi) che potranno poi essere utilizzate nei filtri.
Nella App Administrator si trova il menu Class repository\Vibecode classes
Tramite il tasto Modifica possiamo visualizzare le proprietà della classe selezionata.
I valori riportati nella colonna Nome Proprietà sono i valori da utilizzare per comporre i filtri.
Filtri
Filtri semplici
Il caso più semplice di filtro è campo uguale a valore costante.
La sintassi di Vibecode per questo tipo di filtro può essere schematizzata così:
field(<nomecampo>) eq(<valore>)
Occorre fare distinzione fra valori stringa, valori numerici e valori data.
Nel caso di stringhe il valore va messo fra apici singoli.
Esempio 1 (valori stringa):
si vogliono filtrare tutti i clienti fidelizzati che abitano nella città di Milano.
In questo caso la proprietà della classe (kLoyaltyCustomer) da utilizzare è Address.City .
Il valore è ovviamente 'Milano'.
Il filtro viene quindi composto come di seguito:
field(Address.City) eq('Milano')
Esempio 2 (valori numerici):
si vogliono filtrare tutti i clienti che hanno fornito il consenso al documento di privacy (proprietà PrivacyAgreed).
field(PrivacyAgreed) eq(1)
Esempio 3 (valori data):
nel caso di filtri su date, la data formattata secondo lo standard ISO (YYYY-MM-DD) e racchiusa tra apici singoli.
Quindi apice singolo, 4 cifre per l'anno, trattino, 2 cifre per il mese, trattino, 2 cifre per il giorno.
Ad esempio la data 31 gennaio 2000 viene scritta : '2000-01-31'.
Quindi se si vogliono filtrare tutti i clienti fidelizzati nati il 31 gennaio 2000 (proprietà DateOfBirth):
field(DateOfBirth) eq('2000-01-31')
Note importanti sulla composizione dei filtri
Riprendiamo il comando per i filtri riportato al capitolo precedente:
field(<nomecampo>) eq(<valore>)
Occorre notare che non ci sono spazi fra il parametro field e la parentesi aperta e nemmeno fra il parametro !FOARMAT=BOLD eq e la successiva parentesi.
Sono pertanto errati filtri come:
field (campo) eq('valore')
field(campo) eq ('valore')
field (campo) eq('valore')
In questi casi il filtro non viene applicato.
Lo spazio prima di eq, o delle altre tipologie di condizione che vedremo più avanti nei prossimi capitoli, invece è opzionale.
Filtro su tabelle esterne
Nel caso in cui la proprietà di una tabella si riferisca ad una altra tabella (esterna), occorre specificare la proprietà della tabella esterna da utilizzare come filtro.
Il motivo è che il valore della proprietà della tabella sorgente è un identificativo interno a Vibecode, non significativo per l'utente.
Esempio 1:
si vogliono filtrare tutti i clienti la cui professione (Occupation) ha il codice (Code) CAS (Casalinga).
La proprietà in questione è Occupation che è di tipologia kOccupation.
La tabella kOccupation tra le sue proprietà , il campo Code che utilizzeremo come filtro.
La sintassi del filtro è quindi la seguente:
field(Occupation.Code) eq('CAS')
Esempio 2:
si vogliono filtrare tutti i clienti residenti in Europa.
La tabella Nazioni (kCountry) ha una proprietà Continent che si riferisce alla tabella kContinent nella quale è presente la proprietà Code.
Possiamo quindi filtrare tutti i clienti europei nel modo seguente:
field(Country.Continent.Code) eq('EU')
Elenco filtri
Di seguito l'elenco delle tipologie di filtro applicabili in Vibecode.
Filtro uguale a
Parametro eq:
field(Address.City) eq('Milano')
Filtro diverso da
Parametro ne:
field(Address.City) ne('Milano')
Filtro maggiore di
Parametro gt:
In questo esempio vengono riportati tutti i clienti nati dopo il 31 dicembre 1999.
field(DateOfBirth) gt('1999-12-31')
Filtro minore di
Parametro lt:
In questo esempio vengono selezionati tutti i clienti nati prima del 1 gennaio 2000.
field(DateOfBirth) lt('2000-01-01')
Filtro maggiore o uguale a
Parametro ge:
In questo esempio vengono selezionati tutti i clienti nati dal 1 gennaio 2000 compreso.
field(DateOfBirth) ge('2000-01-01')
Filtro minore o uguale a
Parametro le:
In questo esempio vengono riportati tutti i clienti nati fino al 31 dicembre 1999 compreso.
field(DateOfBirth) le('1999-12-31')
Filtro presente nella lista
Parametro in:
Valore <valore 1>,<valore 2>,<valore 3>,...
La lista di valori è separata di virgole. Anche qui vale la convenzione descritta nel paragrafo “Filtri Semplici” per i tipi di campo.
Essa va applicata a ogni singolo valore.
In questo esempio vengono selezionati tutti i clienti che abitano a Milano, a Como o a Varese.
field(Address.City) in('Milano','Como','Varese')
In questo esempio vengono invece selezionati tutti i clienti che hanno un nucleo familiare composto da 4 o cinque membri.
field(FamilyMembers) in(4,5)
Filtro non presente nella lista
Parametro ni:
La sintassi è similare a quella del precedente esempio:
field(Address.City) ni('Milano','Como','Varese')
Filtro contiene
Parametro lk:
Valido solo per proprietà di tipo stringa.
Il campo valore deve essere formattato come nel caso di espressioni LIKE SQL, utilizzando i caratteri speciali '%' e '?'.
In questo esempio vengono selezionati tutti i clienti il cui nome comincia con la lettera A:
field(Name) lk('A%')
In questo esempio vengono selezionati tutti i clienti il cui nome finisce con la lettera A:
field(Name) lk('%A)
In questo esempio vengono selezionati tutti i clienti il cui nome contiene la lettera A:
field(Name) lk('%A%')
Filtro non contiene
Parametro nl:
La sintassi è similare a quella del precedente esempio.
In questo esempio vengono selezionati tutti i clienti il cui nome NON comincia con la lettera A:
field(Name) nl('A%')
Filtro compreso tra
Parametro bt:
I valori limite della selezione vengono separati da virgola.
Anche qui vale la convenzione descritta nel paragrafo “Filtri Semplici” per i tipi di campo.
In questo esempio vengono selezionati tutti i clienti con dimensione del nucleo familiare compreso tra 3 e 5:
field(FamilyMembers) bt(3,5)
Filtro non compreso tra
Parametro nb:
La sintassi è similare a quella del precedente esempio.
In questo esempio vengono selezionati tutti i clienti con numero componenti famiglia minore di 3 o maggiore di 5:
field(FamilyMembers) nb(3,5)
Filtri fra campi
Oltre a filtrare una proprietà in base ad un valore costante possiamo anche implementare filtri tra proprietà .
field(<prop 1>) eq(<prop 2>)
In questo esempio vengono selezionati tutti i clienti per i quali la citta di residenza è diversa dalla località del negozio preferito:
field(favoritestore.address.city) ne(address.city)
Non tutte le tipologie di filtri possono essere utilizzate per confrontare due proprietà .
Al momento non sono supportati i filtri di tipologia: compreso tra (bt), non compreso tra (nb), contiene (lk), non contiene (nl), nella lista (in) e non nella lista (ni).
Filtri composti (operatori logici)
Passiamo ora a illustrare l'utilizzo combinato di più condizioni in Vibecode utilizzando i normali operatori logici and , or e not .
Nota: l'operatore not non è utilizzabile direttamente in Vibecode ma viene specificato assieme agli operatori and e or.
Nei capitoli seguenti verrà utilizzato a titolo di esempio il comando eq (uguale a) ma tutti i filtri elencati nel capitolo “Filtri” possono essere utilizzati con tutti gli operatori logici.
Operatore AND
La sintassi per combinare due condizioni tramite l'operatore AND è la seguente.
field(<filtro 1>) and(<filtro 2>) and(<filtro 3>) ...
equivalente a, ad esempio:
field(<prop 1>) eq(<valore 1>) and(field(<prop 2>) eq(<valore 2>)) and(field(<prop 3>) eq(<valore 3>)) and(...) ...
La condizione che segue l'operatore AND deve essere inclusa fra parentesi.
Nel seguente esempio vengono selezionati tutti i clienti che abitano a Milano la cui professione è casalinga:
field(Address.City) eq('Milano') and(field(Occupation.Code) eq('CAS'))
Operatore OR
La sintassi per combinare due condizioni tramite l'operatore OR è equivalente a quella dell'operatore AND
field(<filtro 1>) or(<filtro 2>) or(<filtro 3>) ...
equivalente a:
field(<prop 1>) eq(<valore 1>) or(field(<prop 2>) eq(<valore 2>)) or(field(<prop 3>) eq(<valore 3>)) and(...) ...
Nel seguente esempio vengono selezionati tutti i clienti che abitano a Milano o a Como (alternativa all'utilizzo del filtro in):
field(Address.City) eq('Milano') or(field(Address.City) eq('Como'))
Combinare gli operatori
Possiamo combinare fra loro gli operatori OR e AND fra di loro.
field(<filtro 1>) ... or(<filtro 2>) and(<filtro 3>) and(<filtro 4>) or(<filtro 2>) ...
La precedenza fra gli operatori logici AND e OR è regolata come in SQL: vengono quindi prima valutate tutte le espressioni in AND e poi le espressioni in OR.
E' possibile innestare più espressioni fra di loro, a più livelli, per cambiare la precedenza degli operatori, mimando le parentesi utilizzate nella sintassi SQL:
field(<prop 1>) eq(<valore 1>) and(<filtro 2> or(<filtro 3>) or(<filtro 4>) )
oppure
field(<prop 1>) eq(<valore 1>) or(<filtro 2> and(<filtro 3>) )
Nel seguente esempio vengono selezionati tutti i clienti residenti a Milano con professione Casalinga o Pensionato:
field(Address.City) eq('Milano')
and( field(Occupation.Code) eq('CAS')
or(field(Occupation.Code) eq('PEN')) )
Casi particolari
Come si può notare una espressione non può cominciare con una parentesi aperta.
Pertanto se volessimo scrivere un filtro come tutti i clienti che abitano a Milano di professione Casalinga oppure abitano a Como e di professione Pensionati non potremmo scriverlo nel modo seguente.
Codice errato
(field(Address.City) eq('Milano') and(field(Occupation.Code) eq('CAS')))
or(field(Address.City) eq('Como') and(field(Occupation.Code) eq('PEN')))
Per ovviare a questo problema possiamo specificare come prima espressione una condizione sempre vera e combinare con l'operatore AND .
Per comodità possiamo utilizzare la proprietà Id presente in tutte le classi e sempre valorizzata.
Codice corretto
field(id) eq(id) and(field(Address.City) eq('Milano') and(field(Occupation.Code) eq('CAS')))
or(field(Address.City) eq('Como') and(field(Occupation.Code) eq('PEN')))
Data Documento | 07 Novembre 2016 |
Titolo Documento | VibeCodeFilterDoc.odt |
Revisione Documento | Revisione n. 1 |
Documento Redatto da | Fabio Radice |
Prodotto | Vibecode |