È una pratica comune dotare un modello di viste applicative multiple, ciascuna con lo scopo di gestire un sottoinsieme del dominio dei dati; da ciascuna vista si omettono le parti del modello che non sono strettamente necessarie o che si vogliono nascondere a certi gruppi di utenti.
Limitando la visibilità di specifici record in una vista applicativa si effettua il partizionamento orizzontale del modello; la struttura dei dati rimane inalterata in tutte le viste applicative, ma cambia l’insieme degli oggetti che è possibile vedere o associare a seconda della vista utilizzata.
I filtri definiscono condizioni booleane basate sulla sintassi per espressioni già usata per definire gli attributi derivati nel Database Schema. Maggiori informazioni sull’interfaccia dell’editor per espressioni sono disponibili qui.
Filtri sugli oggetti delle classi #
Sulle classi è possibile definire uno o più filtri che prendono il nome di Class filter; un Class filter descrive una condizione booleana su tutti gli oggetti di una classe, e serve a filtrare i record che non soddisfano tale condizione. È possibile creare più Class filter per ogni classe. In presenza di più filtri, le loro condizioni vengono messe in AND logico; in altre parole, un oggetto della classe sarà visibile nella vista applicativa se tutte le condizioni verranno valutate true
, mentre verrà filtrato se anche solo una condizione valutata su esso darà valore false
.
È possibile definire Class filter su tutte le classi abilitate nella vista applicativa, inclusa la classe di piattaforma __User; non è consentito invece filtrare le classi speciali di tipo Enum, Singleton e Form.
Creare un Class filter #
Dall’Application Schema , seleziona la classe sulla quale vuoi definire il filtro e fai click destro per aprire il suo Class menu
; da qui seleziona l’opzione Set filters...
per aprire il Class filters manager: da questo pannello, clicca sul tasto Add
per aprire il Class filter editor e definire la condizione del filtro.
il Class filters manager presenta due riquadri; il primo mostra i filtri attualmente applicati sulla classe. È possibile modificare ed eliminare i filtri precedentemente definiti con i tasti (Add
) e (Delete
). Un modo rapido per eliminare tutti i filtri definiti su una classe è fare click destro sull’icona nel footer e selezionare Delete filters
dal menu contestuale.
L’opzione Copy filters to other applications
consente di estendere il filtro selezionato ad altre viste applicative, selezionabili tramite le rispettive checkbox dal pannello contestuale (Link to other applications
). Come mostra la figura seguente, sono selezionabili le sole viste compatibili con il filtro (ad esempio, è incompatibile una vista in cui la classe su cui è definito il filtro è disabilitata).
Nel secondo riquadro del Class filters manager è possibile digitare il messaggio che verrà mostrato all’utente in fase di salvataggio di un oggetto della classe nel caso in cui l’oggetto interessato violi almeno una delle condizioni definite nei filtri della classe; per impedire di persistere tali oggetti all’interno dell’applicazione, è necessario spuntare l’opzione Reject save request
.
Quando viene definito un Class filter, tutti i ruoli entranti nella classe vengono contrassegnati con un puntino nero orientato verso la classe; questo accade anche per i ruoli entranti in eventuali classi part (con il puntino orientato verso la classe part).
Per disabilitare la propagazione di un Class filter su uno di questi ruoli, è necessario selezionarlo con il tasto destro, aprire il suo Role menu
e rimuovere la spunta alla voce Apply class filters
.
Una volta aggiunto un Class filter, l’icona corrispondente compare nel footer della classe.
Esempio di Class filter #
Immaginiamo di voler tenere traccia delle vendite di un negozio online. Nell classe Sale, il flag booleano completed
indica se una vendita è stata conclusa o meno.
Abbiamo creato due viste applicative (Administration
e Archive
), e vogliamo che la seconda mostri solo le vendite già completate. Per farlo, abbiamo dichiarato un Class filter sulla classe Sale, chiamato onlyCompletedOrders
, che referenzia il flag digitando semplicemente completed
, in quanto l’attributo stesso è booleano.
In questo modo l’applicazione valuterà per quali oggetti della classe Sale completed
vale true
, e mostrerà all’utente della vista applicativa Archive
unicamente gli oggetti che rispettano tale condizione, e cioè le vendite concluse. Poiché non abbiamo spuntato l’opzione Copy filters to other application
nel Class filters manager, il filtro sarà valido solo per questa vista applicativa, e gli utenti della vista Administration
potranno continuare a visualizzare tutti gli oggetti della classe Sale.
Filtri sugli associabili dei ruoli #
Sui ruoli delle associazioni è possibile definire uno o più filtri che prendono il nome di Selection filter; un Selection filter descrive una condizione booleana sull’insieme di oggetti associabili, ovvero gli oggetti della classe target che possono essere associati attraverso quel ruolo, e serve a restringere tale insieme filtrando tutti gli oggetti/record che non soddisfano la condizione. È possibile dichiarare più Selection filter per ogni ruolo. In presenza di più filtri, le loro condizioni vengono messe in AND logico; in altre parole, un oggetto target sarà associabile per quel ruolo nella vista applicativa se tutte le condizioni verranno valutate true
, mentre verrà filtrato se anche solo una condizione valutata su esso darà valore false
.
Creare un Selection filter #
Dall’Application Schema , seleziona il ruolo sul quale vuoi applicare il filtro e fai click destro per aprire il suo Role menu
; da qui seleziona l’opzione Set selection filters...
per aprire il Role filters manager: da questo pannello, clicca sul tasto Add
per aprire il Role filter editor e definire la condizione del filtro.
Come il Class filters manager, anche il Role filters manager consente di aggiungere (Add
), modificare (Edit
) e rimuovere (Delete
) condizioni, ed estendere il filtro ad altre applicazioni (attraverso l’opzione Copy filters to other applications
).
Quando viene definito un Selection filter, il ruolo viene contrassegnato con un puntino nero orientato verso la classe source.
Esempio di Selection filter #
Immaginiamo di tenere traccia di impiegati (Employee) e progetti (Project) di un’azienda e di voler gestire l’assegnazione degli impiegati ai vari progetti. Ciascun impiegato ricopre un ruolo nell’azienda, identificato dall’associazione della relativa classe con l’Enum Employee_type; questa informazione è riportata su Employee con l’attributo derivato /employee_type
. Tra Project e Employee sono presenti due associazioni per distinguere tra capi-progetto (managers
) e assegnatari generici (assignees
).
Supponendo di voler impedire al sistema di associare come capo-progetto impiegati privi di qualifiche manageriali, abbiamo dichiarato un Selection filter sul ruolo managers
, chiamato onlyManagers
, che tiene conto di questo requisito.
L’espressione usata è Employee.employee_type = Assignment[MANAGER].name
, e controlla se l’associazione tra Employee e l’Enum Employee_type punta al letterale MANAGER
, sfruttando il fatto che i letterali degli Enum sono costanti a visibilità globale su tutti gli Expression editor (maggiori informazioni sono disponibili qui).
Selection Path #
Nella sezione Creare un Selection filter avrai notato che, oltre alla voce Set selection filters
, sul menu contestuale dei ruoli (Role menu
) è presente anche la voce Set selection path...
: questa funzione consente di applicare un pattern di filtraggio noto su un ruolo di associazione, che tiene conto dei cammini che connettono due classi. Maggiori dettagli su questo comando sono disponibili alla seguente pagina: Selection Path.