Tutorial di Livebase
Introduzione .................................................................................................................................. v
1. Panoramica generale ........................................................................................................... v
2. Per iniziare ....................................................................................................................... v
3. Riepilogo ........................................................................................................................ vii
A. Gestire il tuo account ................................................................................................................. 1
1. Gestire il tuo account ......................................................................................................... 2
1.1. Organizzazione del tuo account .................................................................................. 2
1.2. Dettagli sulla sottoscrizione ....................................................................................... 3
1.3. Fatturazione e metodi di pagamento ............................................................................ 4
1.4. Ordini .................................................................................................................... 4
1.5. Fatture ................................................................................................................... 5
1.6. Impostare i default per i nuovi Cloudlet ...................................................................... 6
1.7. Riepilogo ............................................................................................................... 7
B. Gestire modelli con una sola classe .............................................................................................. 8
2. Creazione di una semplice applicazione anagrafica .................................................................. 9
2.1. Creazione dell'applicazione ....................................................................................... 9
2.2. Inserire dati nell'applicazione ................................................................................... 12
3. Estendere la semplice applicazione ...................................................................................... 18
3.1. Modificare l'applicazione ........................................................................................ 18
3.2. Riallineare il database (problemi di media entità) ........................................................ 20
3.3. Salvare un engine nella Library ................................................................................ 21
3.4. Ripristinare un engine dalla Library .......................................................................... 21
4. Creare la stessa applicazione importando un file XLS ............................................................. 23
5. Lavorare con i dati nell'applicazione generata ........................................................................ 26
5.1. Ricercare una stringa .............................................................................................. 26
5.2. Ordinare la lista ..................................................................................................... 26
5.3. Restringere la lista a un insieme specifico di record ..................................................... 27
5.4. Statistiche sugli attributi .......................................................................................... 29
5.5. Dividere gli oggetti in gruppi ................................................................................... 30
5.6. Riepilogo .............................................................................................................. 33
6. Migliorare l'applicazione generata ....................................................................................... 34
6.1. Designare attributi come object title .......................................................................... 34
6.2. Attributi derivati definiti mediante espressioni matematiche ........................................... 35
6.3. Modificare il layout del form ................................................................................... 39
6.4. Modificare la rappresentazione della Livetable ............................................................ 40
6.5. Impostare valori di default per gli attributi di classe ..................................................... 41
6.6. Finalizzare e verificare le modifiche .......................................................................... 41
6.7. Riepilogo .............................................................................................................. 42
7. Imporre la qualità dei dati mediante class warning ................................................................. 43
7.1. Riepilogo .............................................................................................................. 46
C. Lavorare con più classi e relazioni .............................................................................................. 47
8. Lavorare con le associazioni .............................................................................................. 48
8.1. Aggiungere una nuova classe al modello .................................................................... 48
8.2. Rappresentare informazioni mediante classi distinte ..................................................... 49
8.3. Rendere le modifiche definitive ................................................................................ 52
8.4. Testare le modifiche ............................................................................................... 52
8.5. Aggiornare un engine archiviato ............................................................................... 53
8.6. Importazione di un file XLS complesso ..................................................................... 54
8.7. Ripristino di un engine dalla Libreria ........................................................................ 57
9. Lavorare con le composizioni ............................................................................................. 58
9.1. Introduzione alle composizioni multiple ..................................................................... 58
9.2. Introduzione alle composizioni singole ...................................................................... 59
9.3. Riepilogo .............................................................................................................. 61
ii
Tutorial di Livebase
10. Attributi derivati definiti mediante query ............................................................................ 62
10.1. Creare attributi di tipo query .................................................................................. 62
10.2. Riepilogo ............................................................................................................ 64
D. Tecniche di modellazione avanzate ............................................................................................. 65
11. Scomporre un modello esteso in diagrammi multipli ............................................................. 66
11.1. Espandere il modello con classi aggiuntive ............................................................... 66
11.2. Aggiungere nuovi diagrammi ................................................................................. 68
11.3. Ripulire il diagramma iniziale ................................................................................ 74
11.4. Riepilogo ............................................................................................................ 76
12. Personalizzazione delle applicazioni per specifici gruppi di membri ......................................... 77
12.1. Partizionamento verticale: abilitare e disabilitare classi ............................................... 77
12.2. Partizionamento per profilo utente ........................................................................... 87
12.3. Partizionamento orizzontale: filtrare i record ............................................................. 90
12.4. Riepilogo ............................................................................................................ 91
E. Localizzazione delle applicazioni generate .................................................................................... 92
13. Localizzazione dell'applicazione generata ............................................................................ 93
13.1. Personalizzare le stringhe generate automaticamente ................................................... 93
F. Gestire i Cloudlet ..................................................................................................................... 95
14. Lavorare con più Cloudlet ................................................................................................ 96
14.1. Esportare modelli in formato XML ......................................................................... 96
14.2. Clonare i Cloudlet ................................................................................................ 96
14.3. Copiare i singoli componenti .................................................................................. 97
14.4. Importare modelli in formato XML ......................................................................... 97
14.5. Eliminare i Cloudlet ............................................................................................. 97
14.6. Riepilogo ............................................................................................................ 98
15. Importare ed esportare i dati del Cloudlet ........................................................................... 99
15.1. Esportare il database da un Cloudlet come file SQL ................................................... 99
15.2. Popolare il database usando un file SQL ................................................................. 100
15.3. Esportare i dati nel formato Microsoft Access Database ............................................. 100
15.4. Riepilogo .......................................................................................................... 100
16. Configurare i default di un Cloudlet ................................................................................. 101
G. Lavorare con Excel ................................................................................................................ 104
17. Importare Flat e Star sheet ............................................................................................. 105
17.1. Preparazione dell'ambiente di lavoro ...................................................................... 105
17.2. Importare un semplice Flat sheet ........................................................................... 105
17.3. Importare un semplice Star sheet ........................................................................... 106
17.4. Star sheet con ruoli multipli ................................................................................. 106
17.5. Create sheet versus Append sheet ..................................................................... 107
17.6. Riepilogo .......................................................................................................... 107
18. Importare i Reference sheet ............................................................................................ 108
18.1. Struttura di un Reference sheet ............................................................................. 108
18.2. Create Reference sheet versus Append Reference sheet ......................................... 108
18.3. Testare un Reference sheet ................................................................................... 108
19. Importare i Relation sheet .............................................................................................. 110
19.1. Struttura di un Relation sheet ............................................................................... 110
19.2. Create Relation sheet versus Append Relation sheet ............................................. 110
19.3. Relation sheet all'opera ........................................................................................ 110
20. Connettersi ad un Cloudlet via Web ................................................................................. 113
20.1. Stabilire la connessione ....................................................................................... 113
20.2. Esplorare i dati .................................................................................................. 115
20.3. Selezionare i dati da importare .............................................................................. 115
20.4. Importare i dati selezionati ................................................................................... 116
20.5. Aggiornare i dati importati in modo automatico ....................................................... 117
iii
Tutorial di Livebase
20.6. Opzioni di una query Web ...................................................................................
20.7. Gestire query Web in file separati .........................................................................
H. Creare i report .......................................................................................................................
21. Creare un semplice report tabellare ..................................................................................
21.1. Costruire il modello ............................................................................................
21.2. Configurare il report ...........................................................................................
21.3. Stampare il report ...............................................................................................
21.4. Raggruppare i dati in sezioni multiple ....................................................................
22. Creare un report a campi incrociati ..................................................................................
22.1. Modificare il modello ..........................................................................................
22.2. Configurare il report ...........................................................................................
22.3. Stampare una versione preliminare del report ..........................................................
22.4. Raggruppare i dati per paese ................................................................................
22.5. Stampare il report ...............................................................................................
23. Creare grafici ...............................................................................................................
23.1. Rappresentare i dati in un grafico a torta ................................................................
23.2. Rappresentare i dati in un grafico a barre ................................................................
Glossario dei termini ..................................................................................................................
iv
118
119
121
122
122
123
124
125
127
127
131
132
132
133
134
134
136
139
Introduzione
In questo capitolo introduciamo la piattaforma Livebase. Descriviamo i componenti principali della piattaforma
fornendo una panoramica essenziale dei concetti che stanno alla base di Livebase e delle applicazioni costruite
con essa. Inoltre descriviamo l'interfaccia utente principale di Livebase (Dashboard).
1. Panoramica generale
Livebase è una piattaforma Web che consente di creare e gestire applicazioni database nel cloud. L'innovativa
tecnologia alla base di Livebase fornisce un valido ambiente in cui è possibile sviluppare e dispiegare applicazioni
database facilmente e velocemente. Non è necessario acquistare o installare nessun componente hardware o
software. Non sono necessari altri requisiti tecnici specifici se non una connessione ad Internet e un Web browser
aggiornati con Javascript e cookies abilitati. Tutte le applicazioni database create con Livebase sono eseguite online in un unico ambiente integrato, condividendo un modello di dati e un'interfaccia utente comune. Inoltre, per
ogni applicazione viene creata un'interfaccia REST per facilitarne l'integrazione con dati e applicazioni esterne
a Livebase.
Le applicazioni Livebase sono create e personalizzate utilizzando un approccio puramente concettuale, visuale e
model-driven ispirato al paradigma MDA. Questo approccio consente di focalizzarci solo sulle informazioni di
business che devono essere manipolate e di ottenere delle applicazioni di business funzionali ed efficaci molto
velocemente, utilizzando delle minime competenze tecniche. Mediante la definizione di classi e relazioni tra classi,
sarà possibile sviluppare applicazioni di business basate sul Web senza scrivere una sola riga di codice. Maggiori
dettagli sulle classi saranno forniti più avanti nel corso del tutorial.
2. Per iniziare
Una volta che hai effettuato il login, puoi avviare la Dashboard (Figura 1) dall'interfaccia della sezione My account
del portale. Ti verrà richiesto di scaricare un file JNLP: configura il tuo browser per aprirlo automaticamente per
avviare la Dashboard. Nella Dashboard puoi creare e gestire i tuoi sistemi informativi. Essa contiene tre sezioni
principali.
v
Introduzione
Figura 1. Dashboard
Cloudlets
Il riquadro Cloudlets mostra tutti i Cloudlet creati nel tuo account. Quando effettui il login per la prima volta,
non ci sono Cloudlet da mostrare. Il riquadro contiene sotto riquadri corrispondenti ai vari Cloudlet, disposti
verticalmente. In generale, un Cloudlet può essere considerato come un server virtuale composto da:
• l'insieme degli utenti finali che possono accedere al Cloudlet, chiamato registro dei membri del Cloudlet;
• l'insieme delle applicazioni in esecuzione sul server virtuale, chiamato Cloudlet engine;
• il database relazionale contenente i dati manipolati dall'engine, chiamato Cloudlet database.
L'engine consente ai membri di un Cloudlet di collaborare interrogando e aggiornando il database del Cloudlet in
maniera concorrente rispettando dei vincoli ben definiti in grado di assicurare l'integrità e la confidenzialità dei
dati. La tecnologia dei database relazionali consente ai membri di un Cloudlet di effettuare query complesse (non
semplici ricerche testuali) garantendo la sicurezza delle modifiche transazionali.
Ogni Cloudlet ha un nome univoco e una URI dedicata che dipende dal server di hosting dove l'applicazione
è stata dispiegata, dal tuo username e dal nome del Cloudlet. Per esempio, un Cloudlet chiamato
Workforce potrebbe avere come URI https://hs3.fhoster.com/your_username/Workforce,
dove hs3.fhoster.com identifica il server di hosting e your_username rappresenta lo username che hai
vi
Introduzione
utilizzato per effettuare il login in Livebase. Puoi accedere alla homepage del Cloudelt facendo click direttamente
sulla sua URI. La homepage si aprirà in una finestra separata del browser.
I Cloudlet che crei nel tuo account sono di tua proprietà. Il numero dei Cloudlet che puoi creare dipende dal
piano che hai sottoscritto. I membri di un Cloudlet vengono definiti da te, in quanto proprietario del Cloudlet
stesso. Anche il numero dei membri che puoi aggiungere a un Cloudlet dipende dal piano che hai sottoscritto. I
membri accedono al Cloudlet effettuando il login nella homepage del Cloudlet inserendo username e password, e le
password dei membri del Cloudlet non vengono mostrate al proprietario del Cloudlet. La gestione del tuo account
e delle risorse assegnate al piano sottoscritto verrà discussa più in dettaglio in Capitolo 1, Gestire il tuo account.
Un Cloudlet può essere avviato e arrestato in ogni momento dal suo proprietario. Lo stato in cui si trova il Cloudlet
è mostrato nella parte in basso a destra del riquadro del Cloudlet. Se il Cloudlet non è in esecuzione, la sua
homepage è accessibile ma i suoi membri non possono fare il login, mentre è possibile eseguire tutte le operazioni
di manutenzione. Invece, se il Cloudelt è in esecuzione i suoi membri possono effettuare il login, ma è possibile
eseguire solo alcune delle operazioni di manutenzione. Un Cloudlet non può essere avviato se non ha un engine o
il database, o se quest'ultimo è incompatibile con l'engine. I comandi che possono essere eseguiti su un Cloudlet
verranno descritti in dettaglio nel corso del tutorial.
Engines
Il riquadro Engines mostra gli engine che hai creato e archiviato precedentemente. Questa lista è la tua Libreria
privata. Gli engine presenti nella Libreria possono essere riutilizzati ed estesi in qualunque momento. Non c'è
praticamente limite al numero di engine che puoi memorizzare nella tua Libreria. L'archiviazione di un engine
nella Libreria sarà spiegata più avanti nel tutorial.
Trash
Il riquadro Trash è utilizzato per eliminare i componenti. L'eliminazione di un engine, di un database o addirittura
di un Cloudlet intero può essere fatta in modo molto semplice, e sarà mostrato nei capitoli successivi.
3. Riepilogo
In questo capitolo abbiamo introdotto la piattaforma Livebase ed alcuni dei suoi concetti di base. Nel corso
del tutorial mostreremo più in dettaglio come sia possibile usare la piattaforma per creare applicazioni database
personalizzate.
vii
Parte A. Gestire il tuo account
Capitolo 1. Gestire il tuo account
In questo capitolo descriviamo la sezione del portale Web di Fhoster in cui puoi gestire i dettagli relativi al tuo
account (il piano sottoscritto, le informazioni per la fatturazione e il metodo di pagamento scelto, gli ordini e le
ricevute) e personalizzare i default dei Cloudlet (impostazioni e preferenze utilizzate al livello di amministrazione).
L'accesso a questa sezione avviene automaticamente dopo il login, oppure cliccando sul link My account se hai
già effettuato il login.
1.1. Organizzazione del tuo account
Accendendo alla sezione My account viene mostrata lo sottosezione Home (Figura 1.1). Da qui puoi modificare i
tuoi dati personali, cioè l'indirizzo email (quello che hai fornito in fase di iscrizione) e la password (per motivi di
sicurezza i caratteri saranno sostituiti con degli asterischi *** o dei pallini •••). Sempre da questa pagina puoi
controllare lo stato del tuo account.
Figura 1.1. Pannello My account
Se il tuo account è attivo (Active), la tua sottoscrizione verrà rinnovata automaticamente alla fine di ogni mese. Puoi
disabilitare il rinnovo automatico in ogni momento facendo click sul bottone Disable automatic renewal. Facendo
ciò il tuo account passerà nello stato Active, automatic renewal disabled. Se non riattivi il rinnovo automatico
prima della fine dell'ultimo mese che hai già pagato, il tuo account verrà sospeso (Suspended). La sospensione
dell'account non elimina immediatamente tutte le informazioni ad esso associate ma non ti consente di accedere
alla Dashboard, di gestire i tuoi Cloudlet e di effettuare il download degli engine e dei database.
Nota
In caso di fallimento nei pagamenti il tuo account verrà automaticamente sospeso. Ciò potrebbe
essere dovuto al fatto che il metodo di pagamento specificato nella sezione del Billing non è valido.
Indipendentemente dal motivo per cui il tuo account è stato sospeso, hai 30 giorni (a partire dalla data di
sospensione) per riattivarlo. Terminati questi 30 giorni, al 31-esimo giorno dalla sospensione il tuo account sarà
eliminato definitivamente (irreversibilmente) e con esso saranno cancellati tutti i tuoi Cloudlet e le informazioni
2
Gestire il tuo account
in essi contenute. Ciò vuol dire che i membri dei tuoi Cloudlet perderanno irrimediabilmente tutti i dati che hanno
memorizzato nei Cloudlet. Invece, se riattivi il tuo account pagherai per il periodo intercorso dal momento in cui
hai sospeso l'account fino alla fine del mese corrente. Non sono previsti rimborsi per il periodo in cui l'account
è stato sospeso.
1.2. Dettagli sulla sottoscrizione
Al momento della registrazione su Livebase, ti è stato assegnato di default il piano gratuito che prevede risorse
sufficienti per valutare la piattaforma e per creare sia per uso personale che per uso commerciale piccole
applicazioni caratterizzate da pochi requisiti (ad esempio, meno di 1000 oggetti nel database). Puoi continuare ad
usare il piano gratuito quanto vuoi. Ricordati soltanto che la tua iscrizione verrà cancellata dopo due mesi di non
utilizzo. Un piano di sottoscrizione comprende un insieme di risorse del seguente tipo:
• Numero di membri del Cloudlet
• Numero di oggetti nel database
• Traffico dati mensile (espresso in MB)
• Spazio di archiviazione (espresso in MB)
• Numero di Cloudlet
• Spazio di backup (espresso in MB)
La quantità di risorse assegnate al tuo account e il loro livello di utilizzo sono mostrati nella sezione Subscription
(Figura 1.2). Puoi distribuire le risorse tra i vari Cloudlet del tuo account se è necessario. Livebase controllerà che
la quantità di risorse a te assegnate non venga superata impedendoti di utilizzare più risorse di quelle a disposizione
a meno di liberarne alcune o comprarne di nuove cambiando il tuo piano di sottoscrizione. In ogni momento
puoi modificare il tuo piano (upgrade/downgrade) e puoi comprare/dismettere risorse aggiuntive (extension pack).
Per esempio, puoi passare dal piano gratuito al piano team e comprare anche un extension pack che aggiunge 4
Cloudlet in più all'insieme delle risorse. Per cambiare il piano basta fare click sul bottone Change nella sezione
Subscription. Nota che se effettui dei cambiamenti al tuo piano è possibile che ti venga chiesto di inserire le
informazioni necessarie per la fatturazione e di specificare un metodo di pagamento valido (vedi la Sezione 1.3).
Figura 1.2. Sezione Subscription
3
Gestire il tuo account
1.3. Fatturazione e metodi di pagamento
Al momento della sottoscrizione, se hai utilizzato un voucher d'invito, ti è stato assegnato un credito promozionale
che può essere speso per valutare gratuitamente uno qualunque dei piani a pagamento disponibili. Il credito
promozionale può essere utilizzato per modificare il tuo piano facendo un upgrade o comprando degli extension
pack senza pagare nulla e senza che sia necessario fornire le informazioni per la fatturazione, almeno fintanto che
il credito promozionale rimanente sia sufficiente a coprire il costo dell'operazione di upgrade. Per inciso, il credito
promozionale è da considerarsi virtuale e dunque non ti verrà rimborsato se cancellerai la tua iscrizione.
Il tuo canone mensile è visualizzato nella sezione Subscription insieme al credito disponibile che verrà dedotto
dalle fatture successive. Il canone mensile viene pagato in anticipo il primo giorno del mese a cui si riferisce.
Se effettui un upgrade del piano gratuito, pagherai al momento dell'acquisto una rata proporzionata al periodo
rimanente fino alla fine del mese in corso (pagamento una-tantum), e successivamente pagherai il nuovo canone
complessivo il primo giorno di ogni mese (pagamento ricorrente). Se invece effettui un downgrade del tuo piano
o dismetti parzialmente degli extension pack nell'ambito di un ciclo mensile di fatturazione, ti verrà assegnato un
credito pari alla differenza tra l'ammontare del vecchio canone mensile e l'ammontare del nuovo canone per la
rimanente parte del ciclo di fatturazione. Puoi inserire le informazioni necessarie per la fatturazione nella pagina
del Billing (Figura 1.3) facendo click sul pulsante Edit e compilando il corrispondente form. Come avrai notato,
il form contiene dei campi diversi a seconda della tipologia di cliente (privato o business) e a seconda del paese di
riferimento. I pagamenti possono essere effettuati mediante PayPal o mediante una delle carte di credito supportate
da PayPal (Visa, MasterCard, Discover, American Express).
Figura 1.3. Pagina del Billing
1.4. Ordini
Ogni volta che modifichi il tuo piano (cioè ogni volta che fai un upgrade/dowgrade del piano o aggiungi/dismetti
un extesion pack) viene emesso un ordine. L'elenco degli ordini, a partire dalla tua iscrizione in poi, è visualizzato
nella pagina Orders (Figura 1.4). Ciascun ordine è identificato dalla data di emissione, un numero ed una breve
descrizione.
4
Gestire il tuo account
Figura 1.4. Pagina Orders
1.5. Fatture
Fhoster non emetterà alcuna fattura fintanto che il tuo piano è quello gratuito. Se passi da un piano gratuito ad uno a
pagamento, cominceremo a fatturare nel momento in cui ti addebiteremo dei soldi. Se ti è stato assegnato del credito
promozionale in fase di registrazione emetteremo fattura quando il credito residuo non sarà sufficiente a coprire
l'ammontare da pagare. A partire dal primo pagamento, noi emetteremo una fattura internazionale (comprensiva
di VAT, se applicabile) per ogni pagamento che effettuerai (anche se l'ammontare da pagare è € 0,00 perché avevi
già del credito). Ovviamente termineremo di emettere fattura qualora effettuerai un downgrade da un piano a
pagamento ad uno gratuito.
Le fatture possono riferirsi a pagamenti una-tantum (nel qual caso si riferiscono a degli ordini specifici) o a
pagamenti ricorrenti. La lista delle fatture è visibile nella pagina Invoices (Figura 1.5). Per ciascuna fattura sarà
disponibile un file PDF che potrà essere scaricato, stampato e avrà a tutti gli effetti il valore legale di una ricevuta.
5
Gestire il tuo account
Figura 1.5. Pagina Invoices
1.6. Impostare i default per i nuovi Cloudlet
I default di un Cloudlet sono impostazioni e parametri utilizzati di default da tutti i membri del Cloudlet. I default
sono visualizzati nella pagina Defaults nella sezione My account (Figura 1.6). Per personalizzare questi default
fai click sul pulsante Edit. I default possono essere impostati sia in Italiano che in Inglese. Per passare da una
lingua all'altra puoi fare click sul tab corrispondente Italiano/English. Tutto ciò che imposti in questa pagina sarà
applicato a tutti i Cloudlet che creerai nel tuo account. Nel Capitolo 16 mostreremo come invece sia possibile
impostare dei default per un Cloudlet specifico. I default di un Cloudlet si dividono in due categorie: i default
relativi alla homepage del Cloudlet e i defaults relativi ai template delle email.
6
Gestire il tuo account
Figura 1.6. Default per i nuovi Cloudlet
Homepage
Qui puoi specificare le informazioni che verranno visualizzate nella homepage del Cloudlet. Nel campo
Description puoi inserire una descrizione che sarà relativa a tutti i Cloudlet che creerai nel corso del tutorial (ad
esempio, Questo Cloudlet è stato creato utilizzando Livebase a scopi didattici).
Nel campo Warning and News, puoi digitare notifiche e comunicazioni per tutti i membri del Cloudlet (ad esempio,
Giovedì 20 Novembre il Cloudlet Workforce sarà in manutenzione). Infine nel campo
Terms and Conditions puoi specificare la polizza di accordo con i membri del Cloudlet. L'accordo è una sorta di
contratto tra te (proprietario del Cloudlet) e i membri del Cloudlet che regola l'utilizzo del Cloudlet da parte dei
suoi membri (ad esempio, La registrazione a questo Cloudlet consente l'inserimento,
la modifica e la cancellazione dei dati solo mediante le applicazioni fornite
con il Cloudlet stesso).
Mail templates
Qui puoi specificare il template delle email che verranno inviate ai membri del Cloudlet. Al momento sono
disponibili due tipi di template: Member account creation (quando viene creato un account per un
membro) and Member account data recovery (quando un membro deve recuperare la propria username/
password). In entrambi i casi viene visualizzata una email di esempio che può essere modificata e personalizzata
utilizzando gli elementi dalla lista Placeholders che trovi sulla destra, che a loro volta saranno sostituiti con i valori
effettivi relativi ai dettagli dell'account. Per esempio, nel template per l'email Member account creation,
${firstName} e ${lastName} saranno sostituiti con il nome ed il cognome del membro del Cloudlet per
il quale si sta creando l'account.
1.7. Riepilogo
In questo capitolo abbiamo spiegato gli aspetti relativi alla gestione del tuo account e della tua sottoscrizione
al servizio Livebase. Per ulteriori dettagli sulla nostra offerta commerciale (prezzi e piani di sottoscrizione) ti
invitiamo a visitare la pagina del pricing sul nosto sito Web aziendale (www.fhoster.com).
7
Parte B. Gestire modelli
con una sola classe
Capitolo 2. Creazione di una semplice
applicazione anagrafica
In questo capitolo mostriamo come sia possibile creare una semplice applicazione per gestire una lista di
dipendenti. Per fare ciò, dobbiamo creare un nuovo Cloudlet con un modello caratterizzato da una sola classe.
Successivamente, mostriamo come avviare il Cloudlet e provare l'applicazione generata.
2.1. Creazione dell'applicazione
Accedi a Livebase facendo il login. Una volta effettuato l'acceso, puoi avviare la Dashboard, nella quale sono
mostrati i vari Cloudlet che sono stati creati nel tuo account. Ovviamente al momento non ci sono Cloudlet.
Per crearne uno fai click sul bottone New cloudlet. Al nuovo Clouldet sarà assegnato il nome di default
NewCloudlet1. Rinomina il Cloudlet in Workforce facendo un doppio click su NewCloudlet1. Siccome
il Cloudlet Workforce è appena creato, nel riquadro ad esso relativo sarà mostrato No engine, ad indicare che
non c'è un engine e un database. Per creare un engine fai click su No engine. Ciò porterà alla creazione di un
engine vuoto e aprirà in una finestra separata del browser il Designer. Il Designer è quel componente di Livebase
che ti consente di progettare e modificare la struttura dell'applicazione. La finestra del Designer è divisa in tre
sezioni principali:
• una lista di viste e classi sulla sinistra;
• una panoramica in miniatura del diagramma disposta sotto di essa;
• il diagramma principale sulla destra.
Al momento ci focalizzeremo sulla vista Database ( ), che è attivata di default. A questo livello puoi definire il
modello dati dell'applicazione, cioè le classi e le relazioni tra le classi che ne formano la struttura.
Il concetto base nella nostra applicazione è persona. Quindi, creiamo una classe che rappresenti le persone e
aggiungiamo degli attributi per memorizzare le informazioni relative ad una persona che ci interessano, tipo nome
(first_name), cognome (last_name), titolo (title) e data di nascita (birthday). Fai click sull'icona
che trovi nella Palette toolbar (Figura 2.1) nella finestra del Designer. Una nuova classe chiamata Class1
viene creata. Il nome della classe è selezionato ad indicare il fatto che può essere cambiato immediatamente. Per
rinominare la classe in Person, scrivi semplicemente Person e premi Enter.
9
Creazione di una semplice applicazione anagrafica
Figura 2.1. La Palette toolbar
Aggiungiamo adesso degli attributi alla classe. Per fare ciò, fai click con il tasto destro del mouse sull'header della
classe Person e seleziona dal Class menu New attribute. Per ciascun attributo seleziona il tipo di dato
e assegna un nome. Una volta aggiunti i quattro attributi scelti per una persona (first_name, last_name,
title, birthday) la classe risultante dovrebbe essere come quella mostrata in Figura 2.2.
Figura 2.2. La classe Person
Perfezioniamo ulteriormente la definizione della classe Person imponendo dei vincoli sui valori che possono
memorizzati nei suoi attributi. Per come è stata definita attualmente la classe è ammissibile che gli attributi siano
vuoti, cioè non contengano valori. Potremmo quindi creare un oggetto della classe Person senza nome, cognome,
titolo e data di nascita, il che ovviamente non avrebbe senso. Per impedire queste situazioni dobbiamo imporre
che i campi degli attributi siano non nulli. A tale scopo, fai click con il tasto destro del mouse su first_name
e seleziona Required dall'Attribute menu. Osserva come in seguito a questa azione accanto al nome
dell'attributo compaia un asterisco rosso ad indicare appunto che l'attributo è richiesto. Fai la stessa cosa per
gli attributi last_name e birthday. Invece, per quanto riguarda title non è necessario impostarlo come
obbligatorio in quanto non è detto che una persona abbia un titolo.
Un altro aspetto che dobbiamo considerare è la presenza di duplicati. Potremmo ad esempio voler impedire
l'inserimento di due persone con medesimo nome, cognome e data di nascita (e.g. due oggetti della classe
Person aventi entrambi nome Bob, cognome Dole e data di nascita 15/03/1977). Per impedire ciò possiamo
aggiungere un vincolo di unicità. Seleziona contemporaneamente gli attributi first_name, last_name e
10
Creazione di una semplice applicazione anagrafica
birthday tenendo premuto il tasto Ctrl mentre fai click su di essi. A questo punto fai click con il tasto destro
del mouse su uno qualunque degli attributi e seleziona Make unique dall'Attribute menu. Al termine di
questa operazione apparirà sulla base del riquadro della classe un'icona ( ) ad indicare che sulla classe è stato
impostato un vincolo di unicità. Facendo click sull'icona gli attributi della classe coinvolti nel vincolo vengono
evidenziati. Il vincolo di unicità che abbiamo definito impedisce che due oggetti della classe Person abbiano lo
stesso nome, cognome e data di nascita, ma non impedisce che abbiano lo stesso valore per due dei tre attributi
(ad esempio, lo stesso nome e cognome ma diversa data di nascita). La classe Person così come risulta da queste
modifiche è mostrata in Figura 2.3.
Figura 2.3. La classe Person (cnt.)
A questo punto abbiamo una buona base di partenza per la nostra applicazione. Salva il tuo lavoro selezionando
File → Save (Ctrl+S). Osserva come in seguito al salvataggio la classe Person sia cambiata (Figura 2.4). In
particolare, l'attributo first_name è mostrato in neretto, ciò ad indicare che questo attributo è stato designato
come object title per la classe Person. Come spiegheremo più avanti, l'object title appare nel breadcrumb trail
ed è utilizzato per identificare l'oggetto della classe che si sta esaminando nell'applicazione generata. L'object title
è rappresentato dal valore di un singolo attributo. Se non viene indicato uno specifico attributo come object title
di una classe, Livebase di default definisce come object title il primo attributo che appare nella lista degli attributi
della classe nel momento in cui vengono salvate le modifiche per la prima volta (come è successo in questo caso).
Parleremo più in dettaglio degli object title nella Sezione 6.1.
Figura 2.4. La classe Person dopo il salvataggio
Chiudi la finestra del Designer selezionando File → Close (Ctrl+Q). Alla chiusura del Designer, si ritorna
alla Dashboard. Nel riquadro del Cloudlet Workforce adesso appare un engine chiamato NewEngine1 e No
database. Per rinominare l'engine fai doppio click su NewEngine1 e scrivi TutorialEngine. Alla base del
riquadro del Cloudlet è apparsa la scritta Cannot start (missing database) che ci informa che il Cloudlet ancora non
può essere avviato in quanto non è stato creato un database. Per creare un database avente la struttura necessaria
a supportare l'engine TutorialEngine è molto facile. Basta fare click su No database. In pochi istanti viene creato
il database e l'icona corrispondente appare nel riquadro del Cloudlet. Una volta creato il database, lo stato del
Cloudlet cambia in Stopped. A questo punto, facendo click sul comando Start in basso a destra nel riquadro del
Cloudlet, l'engine viene compilato e la corrispondente applicazione viene generata. Lo stato del Cloudlet al termine
della generazione passa a Running mentre il comando Start in basso a destra viene sostituito dal comando Stop
(Figura 2.5). Congratulazioni, la tua prima applicazione Livebase è ora in funzione!
11
Creazione di una semplice applicazione anagrafica
Figura 2.5. Il Cloudlet in azione
2.2. Inserire dati nell'applicazione
Ora che il Cloudlet è in esecuzione, fai click sulla sua URI (il link che si trova sotto il suo nome) per aprire
la homepage in una nuova finestra del browser. Nella homepage di Workforce sono visualizzati i defaults
Description, Warnings And News e Terms And Conditions oltre al form di login (Figura 2.6). Ogni Cloudlet ha
di default un membro auto-generato che ha la stessa username e password dell'account della piattaforma che lo
ha creato. Quindi, puoi effettuare il login nel tuo Cloudlet inserendo le stesse credenziali che usi per entrare in
Livebase.
12
Creazione di una semplice applicazione anagrafica
Figura 2.6. Homepage di Workforce
Una volta effettuato il login, verrà visualizzata una schermata divisa in tre pannelli (Figura 2.7):
• Applications sulla sinistra, in cui sono mostrate le applicazioni disponibili, in questo caso solo Application11
( );
• Members sulla destra, in cui sono elencati i membri del Cloudlet, in questo caso solo tu ( );
• Administration, in cui sono presenti due icone ( , e ) e facendo click su ciascuna di esse si aprirà una finestra
in cui è possibile rispettivamente configurare i default della homepage del Cloudlet, accedere al registro dei
membri del Cloudlet ed editare il css delle applicazioni disponibili nel Cloidlet.
1
Vedremo più avanti come cambiare ciò.
13
Creazione di una semplice applicazione anagrafica
Figura 2.7. Homepage di Workforce dopo il login
Fai click sull'icona di Application1 per far partire l'applicazione. Si apre una nuova schermata contente due
pannelli. A sinistra trovi la lista delle tabelle a cui l'applicazione può accedere (attualmente solo Open person).
Facendo click su Open person nel pannello di destra viene mostrato la Livetable relativa alla classe Person
(Figura 2.8)
14
Creazione di una semplice applicazione anagrafica
Figura 2.8. La Livetable di Person
Il nome della classe è mostrato nella parte alta della Livetable (Person). Immediatamente sotto è visualizzato
il breadcrumb che marca la posizione nella Livetable (in questo caso All instances) e, sulla destra, il bottone
Reload per ricaricare i dati dal database sottostante nel caso in cui più membri stiano utilizzando l'applicazione
contemporaneamente. La tabella ha quattro colonne che nel nostro caso corrispondono ai quattro attributi che
abbiamo aggiunto prima alla classe Person. Come puoi notare, i nomi degli attributi sono stati cambiati in modo
intellegibile per essere utilizzati come nomi delle colonne nella tabella.
Per aggiungere un record alla tabella, fai click sul bottone Create sulla destra. Quest'azione porta all'apertura
dell'Object editing panel dove puoi inserire i valori nei specifici campi dell'oggetto (Figura 2.9). In questo caso,
il pannello contiene quattro campi per il nome, cognome, titolo e data di nascita. Il breadcrumb è cambiato in All
instances > new object, indicando così che si sta creando un nuovo oggetto nella Livetable. Una volta che avrai
terminato di compilare i vari campi del form, fai click su Save per creare il record.
Suggerimento
Per muoverti velocemente da un campo all'altro del form puoi usare il tasto Tab.
15
Creazione di una semplice applicazione anagrafica
Figura 2.9. Object editing panel
Nel modello abbiamo specificato che i campi relativi al nome, cognome e data di nascita sono obbligatori. Se provi
a creare un record senza riempire uno di questi campi, una volta premuto Save ti verrà inviato un messaggio di Data
validation error con delle indicazioni in merito al tipo di errore. Inoltre, i campi vuoti (ma obbligatori) saranno
evidenziati con i contorni in rosso e accanto ad essi verrà visualizzata un'icona di errore ( ). Facendo click su
questa icona si aprirà una finestra in cui saranno forniti dei feedback in merito all'errore. Per esempio, prova ad
inserire John nel campo first_name e Doe nel campo last_name e a non scivere nulla nel campo birthday. A
questo punto facendo click su Ok dovresti ottenere l'errore indicato nella Figura 2.10.
Figura 2.10. Data Validation Error: campo Birthday vuoto
Inserisci cinque record in Person come in Figura 2.11. Una volta creato un record, l'Object editing panel si
chiude e si ritorna alla Livetable di Person. Il numero totale degli oggetti presenti nella Livetable è mostrato
in basso (in questo caso 5).
16
Creazione di una semplice applicazione anagrafica
Figura 2.11. La Livetable di Person con 5 oggetti
Se provi ad inserire un record duplicato, contenente per esempio gli stessi dettagli di John Doe, verrà visualizzato
il messaggio di errore mostrato in Figura 2.12. Il Data validation error è dovuto al fatto che sugli attributi
first_name, last_name e birthday è stato impostato un vincolo di unicità.
Figura 2.12. Data Validation Error: record duplicato
Per modificare un oggetto puoi fare semplicemente doppio click su di esso (oppure puoi selezionarlo e fare click
sul bottone Open sulla destra). Prima non abbiamo inserito un titolo per Bob Dole e Adam Snook. Inseriscilo
adesso. Ad esempio, fai doppio click su Adam Snook. Si apre il pannello relativo all'oggetto ed il breadcrumb
cambia in All instances > Adam ad indicare che stai modificando l'oggetto il cui object title è Adam (se ti ricordi
l'attributo first_name è stato designato come object title). Per modificare i valori nei campi dell'oggetto fai
click sul bottone Edit in alto a destra, in seguito al quale si apre l'Object editing panel dell'oggetto in cui puoi fare
le modifiche. Inserisci Mr. nel campo Title. Premendo su Save ritorni alla Livetable. Nota come per l'oggetto
appena modificato sia apparso il valore Mr. nella colonna Title. Ripeti queste operazioni per inserire il titolo Mr.
anche per l'oggetto Bob Dole. In realtà non abbiamo bisogno di così tanti oggetti. Prova ad eliminare ad esempio
Bob Dole. Selezionalo nella tabella e fai click sul bottone Delete sulla destra. L'oggetto verrà immediatamente
eliminato portando così il numero totale degli oggetti nella Livetable a 4 objects.
Come hai visto, con un minimo sforzo sei stato in grado di create un'applicazione funzionante corredata anche
di un'interfaccia grafica attraverso la quale è possibile creare, ispezionare, modificare ed eliminare oggetti nel
database sottostante. Questo è solo l'inizio. Livebase ti consente di fare molto di più, come avremo modo di spiegare
nei prossimi capitoli. Per terminare la sessione, fai il logout dal Cloudlet.
17
Capitolo 3. Estendere la semplice
applicazione
In questo capitolo mostriamo come sia possibile estendere l'applicazione TutorialEngine creata nel Capitolo 2
aggiungendo delle funzionalità più avanzate.
3.1. Modificare l'applicazione
Non è possibile modificare un'applicazione mentre è in esecuzione. Dunque, devi arrestare il Cloudlet
Workforce per modificare il suo modello. Fai click su Stop in basso a destra nel riquadro del Cloudelt. Lo stato
del Cloudlet cambierà in Stopped, e al posto di Stop apparirà Start.
Aggiungere nuovi campi
Perfezioniamo il modello dell'applicazione. Diciamo che in realtà siamo interessati non tanto alle persone in genere
quanto piuttosto ai dipendenti di un'azienda. Per ciascun dipendente vogliamo tenere traccia del suo ruolo in
azienda, della data di assunzione, del salario e dell'indirizzo di casa, comprensivo ad esempio di via, città, CAP
e paese. Per modificare TutorialEngine devi avviare il Designer facendo click sull'icona dell'engine stesso. Il
Designer si aprirà in una finestra separata del browser con il livello Database attivato. Rinomina la classe Person
in Employee. Semplicemente fai doppio click sul nome della classe, digita il nuovo nome e premi Enter.
Suggerimento
Altri modi per rinominare la classe sono: fai click con il tasto destro del mouse sull'header della
classe e seleziona la voce Rename dal Class menu; oppure seleziona la classe con il mouse e
successivamente premi il tasto F2.
A questo punto aggiungi gli attributi necessari per memorizzare le informazioni di cui abbiamo parlato prima
(postion, date_hired, salary, address, city, zip, country). Successivamente, rinomina l'attributo
birthday in date_of_birth per uniformità. Puoi rinominare un attributo in maniera analoga a come si
rinomina una classe, cioè facendo doppio click sul nome dell'attributo, digitando il nuovo nome e premendo Enter,
o alternativamente facendo click con il tasto destro del mouse sull'attributo e selezionando l'opzione Rename
dall'Attribute menu, oppure anche selezionando prima l'attributo con il mouse e premendo successivamente
il tasto F2. La classe risultante da queste modifiche è mostrata in Figura 3.1.
Figura 3.1. La classe Employee
18
Estendere la semplice applicazione
Per come è stata definita la classe Employee è possibile aggiungere qualunque valore nei nuovi attributi. Questo
può creare dei problemi soprattutto per due attributi in particolare: zip e position. Al fine di effettuare un
controllo più specifico su questi attributi, è necessario definire delle restrizioni sul dominio dei valori ammissibili.
Se sul dominio dei valori di un attributo sono state impostate delle restrizioni, tutte le volte che viene inserito
un valore specifico nell'attributo (indipendentemente dal fatto che tale valore sia inserito mediante l'applicazione
generata o importato da qualche altra parte), questo viene controllato e validato rispetto alla restrizioni impostate.
Valori non validi vengono dunque rigettati immediatamente.
Per cominciare, imponi delle restrizioni sul dominio dell'attributo position. Per i nostri scopi, sarebbe meglio
definire una lista di valori predefiniti di posizioni dalla quale scegliere quella specifica per il dipendente in esame.
Fai click con il tasto destro del mouse sull'attributo position e seleziona Edit domain.... Si apre la finestra
String domain editor che ti consente di impostare dei vincoli sul dominio dell'attributo. Seleziona il flag Value
must match any of the following patterns e fai click sul bottone Add per aprire la finestra String value editor.
Nel campo Allowed value digita CEO e seleziona il flag Match case (per indicare di tenere in considerazione
lettere maiuscole e minuscole) e fai click sul bottone OK. La stringa CEO verrà aggiunta alla lista degli schemi
ammissibili. In maniera analoga, aggiungi le seguenti stringhe: CTO, Software engineer, QA tester,
Salesperson, selezionando per ciascuno di essi il flag Match case. Una volta terminato di aggiungere i valori
alla lista, fai click su OK. La restrizione impostata assicura che per ogni oggetto della classe Employee il valore
per l'attributo position (se presente) deve essere uno dei possibili valori specificati nella lista predefinita. In
questo caso, visto che sono state fornite solo costanti, per l'attributo in questione il suo valore sarà sempre uno
di quelli specificati.
Suggerimento
Un modo veloce per aggiungere valori semplici tutti insieme è il seguente. Una volta fatto click sul
bottone Add per aprire la finestra String value editor, seleziona Set of constants dal menu
Pattern type. In questo modo, il campo di tipo testo verrà sostituito da uno spazio più grande dove
potrai scrivere i valori consentiti, uno per riga (digita il valore e poi premi Enter).
Da notare come in seguito alla definizione delle restrizioni sul dominio dell'attributo position, questo sia
visualizzato nella classe come position: [string]. Le parentesi quadre indicano appunto che sul dominio
sono stati definiti dei vincoli che restringono l'insieme dei valori ammissibili per quell'attributo. Per quanto
riguarda invece l'attributo zip, anche per esso dobbiamo imporre dei vincoli sull'insieme dei valori ammissibili.
Assumiamo che il CAP sia una stringa contenente non più di cinque caratteri. Apri lo String domain editor per
l'attributo zip, con lo stesso procedimento usato per position. Specifica 5 nel campo Min length e 5 nel campo
Max length field, e fai click su OK. Così facendo hai imposto che il valore dell'attributo zip (se presente) sia di
esattamente 5 caratteri. Tuttavia, osserviamo che un carattere può essere qualunque cosa: una lettera, un numero,
un simbolo e persino uno spazio. Per controllare in maniera più fine i valori del dominio, dobbiamo specificare
uno schema a cui i valori si devono conformare. Riapri nuovamente il domain editor per l'attributo zip. In questo
caso, seleziona il flag Value must match any of the following patterns e fai click su Add. Nel caso dell'attributo
position abbiamo aggiunto solo valori costanti. In questo caso non possiamo fare la stessa cosa: ci sono
troppe combinazioni di lettere e numeri che rappresentano CAP validi e non possiamo aggiungerli tutti. Piuttosto,
possiamo specificare un'espressione regolare. Nel menu Pattern type seleziona Regular Expression. Nello
spazio sottostante digita la seguente espressione ^[A-Za-z0-9]+$ mediante la quale stiamo specificando che
saranno ammissibili sequenze di caratteri alfanumerici, e fai click su OK. Per fare una verifica, inserisci nel campo
Test value dei valori di prova, come ad esempio ASD09, jfkdk, 55555, a, 123456. Come avrai notato gli
ultimi due valori della lista non sono ammissibili, ed infatti sono stati rifiutati (i contorni del campo di test sono
diventati di colore rosso). A questo punto fai click su OK per salvare le modifiche e chiudere la finestra del domain
editor. Una volta ritornato al Designer, nota come anche l'attributo zip sia cambiato in zip: [string] per
via delle restrizioni imposte sul suo dominio. La classe risultante da queste modifiche è mostrata in Figura 3.2
19
Estendere la semplice applicazione
Figura 3.2. La classe Employee (cnt.)
Salva le modifiche selezionando File → Save (Ctrl+S). Chiudi la finestra del Designer selezionando File
→ Close (Ctrl+Q) per ritornare alla Dashboard. Lo stato del Cloudlet Workforce è cambiato in Cannot start
(engine/database mismatch) ed è apparsa un'icona di warning sul database. Ciò è dovuto al fatto che abbiamo
effettuato dei cambiamenti nell'engine ma non abbiamo aggiornato conseguentemente il database sottostante.
Per riparare l'errore, fai click sull'icona del database per aprire la finestra di dialogo del database. Nel tab
Engine compatibility issues è mostrata la lista di tutti i problemi di allineamento del database, cioè relativi alla
compatibilità del database con l'engine, con l'indicazione del loro grado di gravità. Nel nostro caso abbiamo solo
low severity issue, cioè problematiche che Livebase può riparare automaticamente senza che vi sia perdita di dati.
Per consentire a Livebase di effettuare le dovute correzioni, fai click sul bottone Resolve all issues. Una volta che i
problemi sono state corretti, si riapre nuovamente la finestra di dialogo del database con il tab Engine compatibility
issues disabilitato e la lista dei problemi di allineamento vuota. Per ritornare alla Dashboard chiudi la finestra del
database. Nota come a questo punto, lo stato del Cloudlet Workforce sarà diventato Stopped e l'icona di warning
sarà scomparsa.
Inserire valori nei nuovi campi
Avvia il Cloudlet Workforce ed effettua il login dalla sua homepage. Fai click su Application1 per aprire
l'applicazione. Una volta partita l'applicazione, fai click su Open employees. La Livetable della classe Employee
si aprirà nel pannello di destra. Nella tabella saranno presenti delle nuove colonne corrispondenti agli attributi che
abbiamo aggiunto prima. Riempi i campi aggiuntivi per i pochi record presenti nella tabella. Fai doppio click su
uno dei record e poi premi il bottone Edit. Nota la presenza di un menu a tendina nel campo Position che mostra
la lista dei possibili valori che possono essere assegnati. Questo è il risultato del vincolo che abbiamo imposto
sul dominio dell'attributo position per restringere l'insieme dei valori ammissibili. Analogamente, se provi ad
inserire un CAP non valido nel campo Zip otterrai un errore di Data validation error. Questo perché abbiamo
definito un vincolo sul dominio dei valori ammissibili per l'attributo zip. Una volta terminato l'inserimento dei
dati nei nuovi campi, chiudi l'applicazione ed effettua il logout.
3.2. Riallineare il database (problemi di media
entità)
Eliminare un attributo
Siccome l'oggetto della nostra applicazione si è spostato dalle persone in generale ai dipendenti di un'azienda,
l'informazione relativa al titolo è superflua. Possiamo dunque eliminare l'attributo title dalla classe Employee.
20
Estendere la semplice applicazione
Ferma il Cloudlet Workforce ed avvia il Designer per modificare TutorialEngine. Per eliminare l'attributo title
fai click con il tasto destro del mouse sull'attributo stesso e seleziona Delete dall'Attribute menu. Fai click
su Yes nella finestra di conferma. Successivamente, salve le modifiche nel modello e chiudi il Designer.
Riallineare il database
Una volta tornato alla Dashboard dovresti trovare i seguenti cambiamenti:
• ci sarà un'icona di warning sul database ad indicare che ci sono dei problemi di allineamento tra il modello
ed il database;
• lo stato del Cloudlet Workforce è cambiato in Cannot start (engine/database mismatch).
Il database deve essere nuovamente riallineato con il modello. Fai click sull'icona del database per aprire la finestra
di dialogo relativa. Il tab Engine compatibility issues è selezionato, ma questa volta nella lista dei problemi di
allineamento sarà mostrato un solo medium severity issue. Il problema è di media severità ed è dovuto al fatto che
hai eliminato l'attributo title dalla classe Employee. Il che comporta la perdita di tutti i valori memorizzati
per l'attributo in questione negli oggetti del database. Fai click su Resolve all issues per fare in modo che Livebase
risolva il problema. Una volta risolto il problema, tornato alla Dashboard osserva come l'icona di warning sul
database sia scomparsa e lo stato del Cloudlet sia diventato Stopped.
Verificare i cambiamenti
Avvia nuovamente Workforce ed accedi facendo il login dalla sua homepage. Avvia Application1 e fai click su
Open employees per aprire la Livetable di Employee. Come puoi notare, nella Livetable manca la colonna Title.
Se fai click su uno dei record, osserva come il campo manchi anche nel form del singolo oggetto. A questo punto,
avendo verificato i cambiamenti nella Livetable, puoi chiudere l'applicazione e terminare la sessione facendo il
logout dal Cloudlet.
3.3. Salvare un engine nella Library
È utile fare un backup degli engine costruiti precedentemente, nella fattispecie se si prevede di apportare dei
cambiamenti radicali al modello. Per l'archiviazione degli engine Livebase fornisce la Library. Fare il backup
di TutorialEngine è molto semplice, basta trascinarne l'icona dell'engine e rilasciarla sulla Library nel pannello
Engines.
Suggerimento
Non è necessario arrestare il Cloudlet per fare il backup del suo engine.
Quando archivi un engine, ricordati di inserire anche la descrizione e un commento negli appositi campi. Ad
esempio, puoi scrivere come descrizione Engine creato per il tutorial e come commento Versione
iniziale. Una volta archiviato nella Library, all'engine viene assegnato un numero di versione, in questo caso
1.0.0 visto che è la prima versione archiviata dell'engine, ed un timestamp che indica la data e l'ora in cui è
stato effettuato il backup.
3.4. Ripristinare un engine dalla Library
Puoi ripristinare un engine dalla Library in ogni momento. Per dimostrare l'utilità di questa funzionalità, proviamo a
fare dei cambiamenti distruttivi nel modello. Arresta Workforce e avvia il Designer per modificare TutorialEngine.
Elimina gli attributi zip e address. Salva le modifiche e chiudi il Designer.
21
Estendere la semplice applicazione
Suggerimento
Una volta tornato alla Dashboard, noterai che al numero di versione di TutorialEngine è stato
aggiunto MODIFIED (seguito da data e ora). Questo per indicare che l'engine è stato modificato
rispetto alla versione indicata dal numero.
In seguito all'eliminazione degli attributi, il database presenterà dei problemi di allineamento di media entità che
possono essere risolti come hai fatto prima in Sezione 3.2. Ma cosa accade se ti rendi conto che non avresti dovuto
eliminare quegli attributi dal modello? L'unico modo per correggere quest'errore è ripristinare il modello che hai
archiviato nella Library. Per prima cosa, elimina il TutorialEngine che attualmente è nel Cloudlet Workforce.
Per fare ciò devi semplicemente trascinare l'icona dell'engine e rilasciarla sul pannello Trash1. A questo punto
trascina il TutorialEngine versione 1.0.0 dal pannello Engines e rilascialo su Workforce. In un attimo l'engine sarà
ripristinato nel Cloudlet con eventualmente alcuni problemi di allineamento del database da risolvere.
1
Nota che hai eliminato solo l'engine e non il database.
22
Capitolo 4. Creare la stessa
applicazione importando un file XLS
Fin qui abbiamo visto come creare un'applicazione da zero, cioè partendo dal disegno del modello nel Designer.
Alternativamente, è possibile creare un'applicazione importando un file XLS. Solitamente i dati sono disponibili
in un file Excel. Livebase è in grado di estrarre automaticamente il modello concettuale di un'applicazione che
consenta di gestire i dati memorizzati nel file, e di importare questo modello con tutti i dati del file in un Cloudlet,
unendolo con l'engine eventualmente già presente nel Cloudlet. Da osservare che l'operazione di importazione del
file XLS è atomica: o viene eseguita completamente o non viene eseguita affatto.
Il file XLS da importare deve avere un formato specifico in modo da consentire alla piattaforma di effettuare
l'importazione correttamente. Ciò vale in particolare nel caso in cui il Cloudlet nel quale si vuole importare il
file già possiede un engine. Se il modello concettuale dell'engine già esistente nel Cloudlet è compatibile con il
formato del documento XLS da importare, l'importazione del file nel Cloudlet comporterà semplicemente solo
l'importazione dei dati nel database. In questo capitolo, descriviamo il formato Flat sheet, il più semplice dei
formati ammessi in Livebase che consente di creare modelli caratterizzate da classi main, cioè classi che non sono
parti in una composizione. Un Flat sheet deve essere formattato secondo le seguenti regole:
• Un foglio di lavoro per classe: il file deve contenere un foglio di lavoro per ogni classe che si desidera creare
nel modello. Il nome della classe è dato dal nome del foglio di lavoro.
Suggerimento
I fogli il cui nome inizia con il prefisso # sono ignorati.
• Una riga per oggetto: ogni riga nel foglio di lavoro rappresenta un oggetto della classe.
• Una colonna per attributo: ogni attributo della classe è dato da una colonna di valori nel foglio di lavoro.
Suggerimento
Le colonne vuote che separano gruppi di attributi sono ignorate.
• Una riga d'intestazione opzionale in ogni foglio: ogni foglio di lavoro può avere come prima riga un'intestazione
in cui ci sono i nomi delle colonne di valori. Questi nomi sono usati come nomi per gli attributi della classe.
Nota
I nome delle colonne devono essere scritti secondo le stesse regole valide per gli identificatori.
Suggerimento
Le colonne il cui nome inizia con il prefisso # sono ignorate.
Se la classe (o le classi) descritta(e) nel file già sono presenti nel database, la classe (o le classi) importata nel
modello saranno rinominate nel seguente modo: Name_1, Name_2, ecc. Se vuoi sostituire le classi già esistenti,
devi eliminarle (se non addirittura eliminare l'intero engine) prima di fare l'import del file. I tipi di dato degli
attributi della classe sono dedotti automaticamente a partire dall'analisi del dato presente nella prima cella di ogni
colonna. In pratica, la sequenza (semplificata) di passi che viene eseguita è la seguente.
23
Creare la stessa applicazione importando un file XLS
1. Se la cella contiene solo numeri interi, l'attributo sarà di tipo integer.
2. Se la cella contiene un numero frazionario, l'attributo sarà di tipo real.
3. Se la cella è impostata come data con un componente di tipo tempo, l'attributo sarà di tipo datetime.
4. Se la cella è impostata come data, l'attributo sarà di tipo date.
5. Se la cella è impostata come tempo, l'attributo sarà di tipo time.
6. Se la cella contiene TRUE o FALSE, l'attributo sarà di tipo boolean.
7. In tutti gli altri casi, l'attributo sarà di tipo string.
Facciamo vedere come sia possibile utilizzare un foglio elettronico Excel per creare lo stesso modello che
abbiamo costruito precedentemente. A tale scopo, abbiamo preparato un file Excel Employee.xls. Questo
file contiene i dati di una lista di dipendenti. Come puoi notare, il file è stato formattato seguendo le regole
descritte prima. In particolare, il file contiene un singolo foglio di lavoro chiamato Employee. Ogni riga nel
foglio di lavoro corrisponde ad un oggetto di tipo Employee. Le colonne del foglio di lavoro corrispondono
agli attributi della classe Employee (first_name, last_name, date_of_birth, position, city,
date_hired, salary, country, address, zip). A questo punto, elimina dal Cloudlet Workforce sia
l'engine che il database. Trascina semplicemente con il mouse entrambe le icone e rilasciale sull'area Trash. Poi
importa in Workforce il file Excel. Ciò può essere fatto in due modi: trascinando e rilasciando il file sull'area di
Workforce, oppure utilizzando il comando Import Excel del Cloudlet in basso a destra nel box del Cloudlet. Il file
verrà prima analizzato e successivamente i dati in esso contenuti verranno importati. In particolare, nel Cloudlet
Workforce saranno creati un engine chiamato NewEngine11 un database contenente tanti oggetti quante sono le
righe presenti nel foglio di lavoro, esclusa la riga di intestazione (in questo caso 500). Puoi rinominare l'engine
appena creato ma devi utilizzare un nome mai usato finora, tipo per esempio TutorialEngine1. Infatti, in
Livebase non possono esistere due elementi con lo stesso nome. Nel nostro caso, se provi a dare all'engine appena
creato il nome TutorialEngine, otterrai un errore perché già esiste un engine con lo stesso nome (è quello
che abbiamo archiviato nella Libreria).
Se vuoi assegnare all'engine creato dall'importazione il nome TutorialEngine devi procedere in questo modo.
Elimina l'engine TutorialEngine1 e il database appena creati. Ripristina TutorialEngine dalla Libreria su
Workforce. Successivamente, avvia il Designer e modifica TutorialEngine eliminando tutte le classi nel modello,
cioè nel nostro caso solo la classe Employee. Salva le modifiche e chiudi il Designer. Una volta tornato
alla Dashboard, importa nuovamente il file Excel così come è stato precedentemente descritto. Essendo ora
TutorialEngine vuoto, l'importazione del file Excel ha come risultato l'aggiunta della classe Employee al
modello. In questo modo, abbiamo ottenuto un nuovo engine ma con lo stesso nome TutorialEngine. Nei capitoli
successivi del tutorial, parleremo più in dettaglio dell'importazione dei file Excel in Livebase.
Indipendentemente dal nome che hai assegnato all'engine, apri il Designer per modificarlo. Come puoi vedere
nel modello è presente una classe Employee che non è esattamente la stessa che abbiamo definito nel capitolo
precedente. Ci sono infatti delle differenze dovute al formato del foglio Excel:
• Non ci sono attributi richiesti. Definisci gli attributi first_name, last_name e date_of_birth come
richiesti.
• Non ci sono vincoli di unicità. Definisci un vincolo di unicità sugli attributi first_name, last_name e
date_of_birth.
• Non sono definite restrizioni sul dominio degli attributi. Definisci delle restrizioni sul dominio dell'attributo
zip imponendo come lunghezza minima e massima della stringa 5 e aggiungendo l'espressione regolare ^[AZa-z0-9]+$ come schema per i valori ammissibili. Restringi il dominio dell'attributo position al seguente
1
Il numero che appare alla fine del nome varia.
24
Creare la stessa applicazione importando un file XLS
insieme di valori costanti: CEO, CTO, Software engineer, QA tester, Salesperson. Ricordati di
impostare il flag Match case per distinguere le lettere maiuscole e minuscole.
Con queste modifiche a questo punto dovresti ottenere lo stesso modello elaborato nel precedente capitolo. Salva le
modiche e chiudi il Designer. Una volta tornato alla Dashboard, fai click sull'icona del database per aprire la finestra
di dialogo ad esso relativa. Le modifiche cha hai apportato nel modello hanno creato problemi di allineamento
nel database a bassa priorità che possono essere facilmente risolti facendo click sul bottone Resolve all issues. Al
termine, vedrai un singola tabella employee contenente 500 oggetti.
Avvia il Cloudlet Workforce ed effettua il login. Fai click Open Employee per aprire la Livetable della classe
Employee e fai una verifica sui dati (il file Excel che abbiamo preparato contiene dati significativi). Come puoi
notare, mediante l'importazione del file Excel siamo stati in grado di ottenere un modello molto simile a quello
desiderato, sul quale successivamente abbiamo dovuto apportare delle semplici modifiche. Nel prossimo capitolo
mostreremo come manipolare i dati nell'applicazione generata.
25
Capitolo 5. Lavorare con i dati
nell'applicazione generata
Al termine del Capitolo 4, abbiamo avviato il Cloudlet Workforce con un database di 500 oggetti. In questo
capitolo, facciamo vedere come sia possibile ispezionare e manipolare i dati mediante l'applicazione generata.
5.1. Ricercare una stringa
Apri la homepage di Workforce ed effettua il login. Fai click su Application1 e apri la Livetable di Employee
facendo click su Open employees. Supponiamo di voler ricercare un particolare oggetto della classe avente una
stringa specifica come valore di uno dei suoi attributi. Potresti ispezionare la lista dei 500 oggetti e ricercare la
stringa specifica manualmente, ricordandoti la posizione delle righe trovate. Livebase ti consente di effettuare la
ricerca in modo più semplice e veloce, grazie ad un meccanismo di ricerca più sicuro chiamato quick search.
Alla base della Livetable trovi un'icona per la ricerca ( ). Scrivi nel campo di testo accanto ad essa la stringa da
cercare (Morgan). Successivamente premi Enter per far partire la ricerca. Una volta terminata la ricerca dovresti
osservare quanto segue:
• Ogni oggetto corrispondente alla ricerca è evidenziato in giallo.
• La tabella è fatta scorrere fino al primo oggetto che corrisponde alla ricerca.
• Accanto al campo di ricerca c'è un numero (ad esempio, 1/7 indica che l'oggetto in esame è il primo di altri 7
che corrispondono alla ricerca) con delle frecce per andare su ( ) e giù ( ) e visionare i risultati della ricerca.
• A destra del campo di ricerca c'è anche un'icona (
) che consente di terminare la ricerca.
Usando le frecce, ispeziona i risultati fintanto che non trovi un dipendente chiamato Lesley Morgan nato il
6-Nov-1962.
Suggerimento
Grazie al vincolo di unicità impostato sulla combinazione dei campi name, surname e
data_of_birth, sei sicuro che ci sia un unico dipendente chiamato Lesley Morgan nato
il 6-Nov-1962.
Fai doppio click sull'oggetto trovato per aprire il pannello ad esso relativo ed ispezionarne i dettagli. Al termine,
ritorna alla Livetable chiudendo il pannello facendo click su All instances e fai click sulla croce per terminare
la ricerca.
5.2. Ordinare la lista
La lista degli oggetti mostrati nella Livetable è visualizzata in nessun ordine particolare. Probabilmente, l'ordine
mostrato è semplicemente quello in cui gli oggetti sono stati creati, che magari può non essere utile. Fortunatamente
puoi imporre un ordine specifico alla lista. Ad esempio, supponiamo di voler ordinare gli oggetti in ordine crescente
rispetto al nome. Per face ciò, fai click sull'intestazione della colonna First name. La lista verrà immediatamente
ordinata rispetto al criterio impostato. Se adesso fai click sull'intestazione del campo Last name, la lista verrà
ulteriormente ordinata in ordine crescente rispetto al valore del cognome, con gli oggetti caratterizzati dallo stesso
cognome ordinati a loro volta rispetto al nome. Così ad esempio, Paula Francis verrà dopo Brian Francis, ed
entrambi saranno posizionati tra Betty Francis e Von Francis.
26
Lavorare con i dati nell'applicazione generata
5.3. Restringere la lista a un insieme
specifico di record
La ricerca e l'ordinamento sono indubbiamente due strumenti utili. Tuttavia, qualche volta può essere utile riuscire
ad estrarre dalla lista un insieme specifico di record. A tale scopo, Livebase dispone di alcune funzionalità di
filtraggio. Fai click sull'icona a forma di imbuto ( ) per aprire la finestra di dialogo per la gestione dei filtri in
cui puoi definire delle condizioni di base o delle condizioni avanzate.
Filtri di base
Proviamo a definire un filtro di base che ci consenta di mostrare solo gli oggetti in cui position = Software
engineer. Fai click su Add basic. Un nuovo filtro verrà aggiunto alla lista con tre campi in cui specificare
la condizione da applicare: nome colonna (ad esempio, First name), operatore (ad esempio, =) e valore (ad
esempio Value se vuoto). La checkbox accanto al filtro controlla l'applicabilità del filtro (se c'è il flag il filtro è
applicato). Definisci la condizione del filtro selezionando dal menu a tendina del campo nome colonna Position
(eventualmente puoi scrivere il nome della colonna su cui vuoi definire la condizione direttamente nel campo).
L'operatore è =, mentre nel campo valore scrivi Software engineer (Figura 5.1).
Suggerimento
Naturalmente puoi anche scrivere il valore manualmente.
Fai click su Ok per applicare il filtro. Riapparirà la Livetable con un numero inferiore di righe, nella fattispecie
solo quelle contenenti oggetti la cui posizione è Software engineer. Nota che tutte le altre righe non sono
state eliminate dalla tabella bensì semplicemente non sono mostrate. Infatti se ci fai caso, sulla base della Livetable
viene visualizzato 96 of 500 objects e l'icona del filtro modificata ( ) ad indicare che sulla tabella è stato applicato
un filtro.
Figura 5.1. Filtro di base
27
Lavorare con i dati nell'applicazione generata
Filtri avanzati
Se hai la necessità di impostare un controllo maggiore sui filtri, puoi definire dei filtri avanzati in cui la condizione
è basata su un'espressione booleana. Proviamo ad esempio ad estrarre tutti i dipendenti che pagano 1.500.000
dollari o più di tasse. Apri nuovamente la finestra di gestione del filtro. Disattiva il filtro definito precedentemente
semplicemente togliendo il flag nella sua checkbox. A questo punto fai click sul bottone Add advanced. Un nuovo
filtro viene aggiunto alla lista, con in questo caso un unico campo (Expression) in cui scrivere l'espressione che
definisce il filtro. Accanto al campo è presente un'icona ( ). Facendo click su questa icona appare una lista di
possibili funzioni (Figura 5.2).
Figura 5.2. Expression wizard per un filtro avanzato
Scrivi nell'apposito campo, manualmente o usando l'expression wizard, la seguente espressione: salary * 0.2
>= 1500000 (Figura 5.3). Fai click su Ok per applicare il filtro. Anche in questo caso gli oggetti della Livetable
mostrati saranno quelli che soddisfano l'espressione del filtro: in tutto 122 oggetti il cui salario è appunto superiore
o uguale a 7.500.000 dollari.
28
Lavorare con i dati nell'applicazione generata
Figura 5.3. Filtro avanzato
Filtri combinati
Precedentemente abbiamo fatto vedere come è possibile definire un filtro e applicarlo separatamente. È
possibile fare in modo che i filtri attivi sulla Livetable siano più di uno. Nel nostro caso possiamo imporre
contemporaneamente il filtro di base ed il filtro avanzato che abbiamo appena definito. Apri nuovamente la finestra
di gestione dei filtri facendo click sull'icona del filtro a forma di imbuto. Noterai che il filtro avanzato appena
definito è attivo (c'è il flag nella sua checkbox). Applica anche il filtro di base mettendo il flag nella checkbox
relativa. Se adesso fai click sul bottone Ok noterai che gli oggetti della Livetable saranno ulteriormente filtrati. In
particolare verranno mostrati solo 21 oggetti corrispondenti in questo caso a dei fortunati software engineer che
guadagnano 7,500,000 o più dollari di stipendio.
Allo stesso modo puoi impostare una catena di filtri per far sì che nella Livetable vengano mostrati solo i dati che
ti interessano. Non c'è limite al numero dei filtri che puoi definire, così come non c'è limite al numero dei filtri
che possono essere attivati contemporaneamente sulla tabella. Per il momento non abbiamo bisogno di filtrare
gli oggetti, quindi puoi eliminare tutte e due i filtri appena definiti. Apri nuovamente la finestra di gestione dei
filtri e fai click sull'icona
i 500 oggetti originari.
per eliminare il corrispondente filtro. Facendo click su Ok la Livetable mostrerà tutti
5.4. Statistiche sugli attributi
Livebase consente di visualizzare in un colpo d'occhio delle statistiche per le colonne della tabella che contengono
valori numerici. Ad esempio, fai click sull'icona a forma di grafico ( ) che trovi nell'intestazione della colonna
Salary. Si apre una finestra nella quale è mostrato un grafico ad istogramma che fornisce la distribuzione dei valori
per il salario dei dipendenti. Sulla destra del grafico sono riportati la somma, la media e la deviazione standard. In
basso invece è riportato l'intervallo dei valori di salario presenti nella tabella. Per chiudere la finestra del grafico
fai click in un punto qualunque della finestra del browser.
29
Lavorare con i dati nell'applicazione generata
5.5. Dividere gli oggetti in gruppi
A volte è utile raggruppare gli oggetti nella tabella rispetto ad un valore specifico. Per esempio, supponiamo di
voler visualizzare insieme tutti i CEO, VP, e via dicendo, presenti nella lista dei dipendenti. Per fare questo, fai
click con il tasto destro del mouse sull'intestazione della colonna Position e seleziona Group by.
Suggerimento
Alternativamente, puoi trascinare la colonna rispetto alla quale vuoi raggruppare verso la sinistra
della tabella e rilasciarla nel momento in cui la barra all'estrema sinistra diventa arancione.
La colonna Position oltre a colorarsi di arancione viene posizionata davanti alla tabella ad indicare che viene
utilizzata per raggruppare gli oggetti. La lista degli oggetti viene collassata e vengono formati 5 gruppi, uno per
ciascun valore di position. Passando il mouse ad esempio su QA tester appare una piccola finestra che indicherà
che nel gruppo ci sono 109 oggetti. Stessa cosa per gli altri gruppi. Se fai click sul + accanto a un gruppo, il
gruppo viene espanso (il + si trasforma in un -) mostrando nella tabella sulla destra gli oggetti in esso contenuti.
Per collassare il gruppo fai semplicemente click sul - (che successivamente diventa nuovamente un +).
Suggerimento
Prova ad espandere il gruppo Salesperson e seleziona due oggetti qualunque. Successivamente
collassa nuovamente il gruppo. Nota come l'icona + a lato del gruppo è diventata parzialmente
ombreggiata. Ciò serve ad indicare che nel gruppo di sono degli oggetti selezionati.
Raggruppa adesso gli oggetti per paese (Country). Fai click con il tasto destro del mouse sull'intestazione della
colonna Country e seleziona Regroup by. La colonna Position diventa la prima colonna della tabella normale e
non è più utilizzata per raggruppare gli oggetti. Infatti il suo colore non è più arancione. Invece la colonna Country
si posiziona sul lato estremo della tabella diventando arancione ad indicare che il raggruppamento è fatto rispetto
ad essa.
Osserva la colonna Salary. Per ognuno dei quattro gruppi appena creati viene mostrata l'icona a forma di grafico.
Se fai click su ognuna di essa, verrà visualizzata la finestra con il grafico e le statistiche che abbiamo spiegato
prima, relative però solo ai valori dello specifico gruppo. Inoltre, alcune statistiche possono essere visualizzate
direttamente nella colonna. Fai click con il tasto destro del mouse sull'intestazione della colonna Salary e seleziona
Statistics.... Si apre la finestra delle statistiche (Figura 5.4) in cui puoi impostare le statistiche da mostrare
per ogni gruppo direttamente nella colonna. Seleziona min, max e avg e poi fai click su Ok. Per ogni gruppo nella
colonna Salary appaiono con un font diverso le statistiche selezionate (min, max, avg). Da notare che i numeri
delle statistiche sono mostrati solo quando il gruppo è collassato. Infatti, se provi ad espandere un gruppo noterai
che i valori di salary degli oggetti non sono cambiati.
30
Lavorare con i dati nell'applicazione generata
Figura 5.4. Finestra delle statistiche
Possiamo raggruppare ulteriormente gli oggetti della tabella usando lo stesso meccanismo. Ad esempio, trascina
la colonna City sulla sinistra della tabella e rilasciala immediatamente sulla destra della colonna Country nel punto
in cui la barra diventa arancione.
Suggerimento
Alternativamente fai click con il tasto destro del mouse sull'intestazione della colonna e seleziona
Subgroup by.
Gli oggetti della tabella saranno raggruppati prima per paese (country) e poi per città (city). Le statistiche
verranno mostrate corrispondentemente: per ogni paese verrà indicato il numero di oggetti contenuti nel gruppo,
mentre per ogni città verrà indicato il numero di oggetti contenuti nel sottogruppo.
Ogni livello di gruppo può essere ordinato separatamente. Fai click una volta sull'intestazione della colonna City
per ordinare in ordine crescente. A questo punto fai click due volte sull'intestazione della colonna Country per
ordinare in ordine decrescente. Corrispondentemente gli oggetti nella tabella vengono ordinati prima in ordine
decrescente rispetto al paese e quindi in ordine crescente rispetto alla città.
A questo punto elimina il gruppo rispetto alle città. Per fare ciò basta trascinare con il mouse l'intestazione della
colonna City verso destra e lasciarla in un qualunque punto in cui la barra diventa blu.
Suggerimento
Alternativamente per sciogliere il gruppo puoi fare click con il tasto destro del mouse
sull'intestazione della colonna e selezionare Ungroup.
Aggiungere colonne i cui valori sono calcolati da altre
colonne
È possibile aggiungere alla Livetable delle colonne che non esistono nella classe ma i cui valori sono calcolati
a partire dai valori presenti nelle colonne già esistenti. Proviamo ad esempio ad aggiungere alla tabella una
colonna che mostra l'ammontare delle tasse pagate da ogni dipendente. L'informazione sulle tasse può essere
31
Lavorare con i dati nell'applicazione generata
dedotta a partire dal valore del salario (ammettendo che le tasse incidano per il 20%). Fai click sull'icona delle
colonne calcolate ( ) per aprire la finestra di definizione delle colonne calcolate (Figura 5.5). Fai click su Add
column. Digita Tax nel campo Colum name (è il nome della colonna calcolata). Nel campo Expression digita la
seguente espressione: 0.2 * salary. Fai click Ok per tornare alla Livetable. La tabella adesso contiene una
nuova colonna (l'ultima sulla destra) chiamata Tax i cui valori sono calcolati automaticamente a partire dai valori
memorizzati nella colonna Salary. Corrispondentemente, l'icona delle colonne calcolate si colora di arancione ( )
ad indicare appunto la presenza di colonne calcolate nella tabella.
Figura 5.5. Finestra di definizione delle colonne calcolate
Questa colonna calcolata può essere utilizzata come una qualunque altra colonna. Ad esempio, fai click con il
tasto destro del mouse sulla sua intestazione e seleziona Subgroup by. In questo modo hai raggruppato gli
oggetti della tabella rispetto al paese e quindi rispetto alle tasse pagate. Per invertire l'ordine di raggruppamento
(prima rispetto alle tasse e poi rispetto al paese), posiziona la colonna Tax a sinistra di Country. Ed infine rimuovi
entrambi i raggruppamenti usando uno qualunque dei modi illustrati precedentemente.
Controllare la visibilità delle colonne
È possibile fare in modo che alcune colonne della Livetable non vengano mostrate. Ad esempio, fai click con
il tasto destro del mouse sull'intestazione della colonna City e seleziona Hide. La colonna delle città non verrà
mostrata nella tabella (attenzione: non viene eliminata ma semplicemente nascosta). Allo stesso modo nascondi
anche le colonne Address e Zip. Per visualizzare nuovamente la colonna City fai click sull'icona delle colonne
nascoste ( ). Si apre una finestra in cui sono elencate le tre colonne che hai appena nascosto. Se fai click su City,
la colonna riapparirà nuovamente nella Livetable in ultima posizione ma comunque prima di ogni altra colonna
calcolata (nel nostro caso prima di Tax).
Suggerimento
Se vuoi portare questa colonna in un'altra posizione semplicemente trascinala con il mouse e
rilasciala nel punto della tabella dove vuoi che appaia.
Esportare i dati dalla Livetable
È possibile esportare in un file di backup tutti i valori mostrati nella tabella. Fai click sull'icona per l'esportazione
dei dati ( ) che trovi in fondo alla Livetable. Si pare la finestra dell'export dei dati (Figura 5.6). Al momento
l'unico formato in cui possono essere esportati i dati è CSV. Selezionando i checkbox presenti nella finestra puoi
decidere se esportare anche i dati delle colonne calcolate (Include hidden columns) e se includere nei dati anche
32
Lavorare con i dati nell'applicazione generata
gli oggetti che sono stati filtrati in seguito all'applicazione di un filtro (Include filtered-out rows sarà abilitato solo
se sono attivati sulla tabella dei filtri). Per salvare il file contenente i dati fai click su Ok.
Figura 5.6. Finestra dell'export dei dati
5.6. Riepilogo
In questo capitolo abbiamo mostrato in quanti modi sia possibile lavorare sui dati mediante l'applicazione
generata. Nel prossimo capitolo mostreremo alcune tecniche per raffinare ulteriormente l'applicazione. Nota
che, rigenerando nuovamente l'applicazione dalla Dashboard, tutte le impostazioni personalizzate definite sulla
Livetable (l'ordine delle colonne, l'ordinamento dei dati, il raggruppamento, ecc.) verranno perse. Cosa che invece
non succede facendo semplicemente il logout. Quindi, per il momento chiudi l'applicazione e fai il logout per
terminare la sessione.
33
Capitolo 6. Migliorare l'applicazione
generata
Nel Capitolo 5 abbiamo creato un'applicazione versatile e completamente funzionante. Chiaramente, possiamo
migliorarla ulteriormente. In questo capitolo mostriamo come sia possibile apportare delle migliorie
all'applicazione generata impostando dei controlli specifici su alcuni dei suoi aspetti.
6.1. Designare attributi come object title
Come spiegato nella Sezione 2.1, quando salvi il modello per la prima volta, Livebase imposta di default il primo
attributo di una classe come suo object title, nel caso in cui non ne sia stato specificato ancora uno. In generale,
è possibile impostare come object title di una classe uno qualunque dei suoi attributi. Di seguito facciamo vedere
come.
Vogliamo fare in modo che nel momento in cui viene esaminato un oggetto di Employee nel breadcrumb
appaia il nome e cognome dell'impiegato corrispondente. Al momento appare solo il nome, visto che l'attributo
first_name è l'object title della classe. L'informazione sul cognome è disponibile ma in un altro attributo.
Siccome in Livebase è possibile impostare come object title un solo attributo abbiamo a questo punto un
problema. Fortunatamente questo problema può essere risolto facilmente facendo ricorso agli attributi derivati.
Gli attributi derivati sono simili alle colonne calcolate, nel senso che non esistono nel database e sono calcolati
nello strato applicativo. L'unica differenza è che mentre le colonne calcolate sono definite autonomamente da
ciascun utente finale e sono visibili solo da lui, gli attributi derivati sono definiti nel modello e quindi sono definiti
automaticamente per tutti i membri del Cloudlet.
Arresta il Cloudlet Workforce e apri il Designer per modificare TutorialEngine. Per creare l'attributo derivato,
seleziona contemporaneamente gli attributi first_name e last_name, fai click con il tasto destro del mouse
su uno dei due e seleziona dal menu Create object title. Si apre la finestra di editor per le espressioni
matematiche in cui è mostrata l'espressione concat(first_name, " ", last_name). Grazie a questa
espressione, ad esempio il valore nel breadcrumb per il dipendente John Smith diventa appunto John Smith
con lo spazio nel posto giusto (a separare il nome dal cognome). Al termine, fai click su OK. Come mostrato
nella Figura 6.1, nella classe Employee è comparso un nuovo attributo /title: string. Il carattere / (forward slash)
davanti al nome dell'attributo indica che l'attributo in questione è derivato. Inoltre è mostrato in neretto a indicare
che sarà utilizzato come object title.
Figura 6.1. La classe Employee (cnt.)
34
Migliorare l'applicazione generata
6.2. Attributi derivati definiti mediante
espressioni matematiche
Gli attributi derivati possono essere di due tipi: attributi derivati definiti medianti espressioni matematiche (nel
resto del tutorial semplicemente chiamati attributi di tipo math) e attibuti derivati definiti mediante query (nel
resto del tutorial chiamati semplicemente attributi di tipo query). In questo capitolo ci occuperemo degli attributi
di tipo math. Gli attributi di tipo query saranno trattati in dettaglio nel Capitolo 10.
Nella Sezione 6.1 abbiamo definito un attributo di tipo math mediante un'espressione piuttosto semplice basata
sulla concatenazione di stringhe. In generale, l'espressione che definisce un attributo di tipo math può essere
piuttosto complessa e può contenere riferimenti non solo agli attributi definiti dall'utente (come già descritto nella
Sezione 6.1), ma anche a:
• platform attributes, attributi gestiti dalla piattaforma e presenti in ciascuna classe;
• system properties, come ad esempio la data e l'ora corrente;
• user properties, proprietà del membro utente che sta usando l'applicazione (come ad esempio il suo
cognome o il suo profilo).
Inoltre, è possibile definire attributi di tipo math anche usando altri attributi derivati. Nel resto di questa sezione
saranno mostrati alcuni esempi di attributi di tipo math definiti mediante funzioni matematiche e altri attributi
di tipo math.
Attributi relativi alla piattaforma
Gli attributi relativi alla piattaforma sono gestiti automaticamente da Livebase per ogni classe, e pertanto
nel database schema non vengono mostrati a meno di aggiungerli esplicitamente alle classi. Questi attributi
contengono dei metadati relativi agli oggetti della classe. Li puoi aggiungere o rimuovere da una classe, ma non
li puoi modificare. Per aggiungere un attributo relativo alla piattaforma ad una classe, fai click con il tasto destro
del mouse sull'header della classe e seleziona l'attributo scelto dal sottomenu Add platform attribute
del mClass menu. L'attributo relativo alla piattaforma apparirà tra gli attributi della classe. Per rimuoverlo, fai
click con il tasto destro del mouse sull'attributo stesso e poi selziona Remove dall'Attribute menu.
Tabella 6.1. Attributi relativi alla piattaforma Livebase
Nome
Tipo
Descrizione
__id
integer
Numero gestito internamente che
indentifica in maniera univoca
l'oggetto
__createdby
string
Membro del Cloudlet che ha creato
l'oggetto
__createdon
datetime
Data e ora in cui l'oggetto è stato
creato
__lastmodifiedby
string
Membro del Cloudlet che ha
modificato che ha modificato per
ultimo l'oggetto
__lastmodifiedon
datetime
Data e ora in cui è stata effettuata
l'ultima modifica sull'oggetto
__ownedby
string
Membro a cui appartiene questo
oggetto
35
Migliorare l'applicazione generata
Nome
Tipo
Descrizione
__ownedon
datetime
Data e ora in cui il membro è
diventato proprietario dell'oggetto
Nota
L'attributo __id viene mostrato solo nelle classi senza attributi quando salvi il modello per la
prima volta.
Importante
Al momento le applicazioni create con Livebase non consentono di modificare l'utente possessore
di un oggetto. Pertanto __ownedby e __ownedon restano sempre rispettivamente uguali a
__createdby e __createdon.
Per usare un attributo relativo alla piattaforma, devi aggiungerlo preventivamente alla classe. Per ottenere ciò,
fai click con il mouse sull'intestazione della classe e seleziona l'attributo relativo alla piattaforma dal sottomenu
Add platform attribute del Class menu. L'attributo relativo alla piattaforma apparirà quindi tra gli
attributi della classe.
Proprietà di sistema
Queste proprietà possono essere considerate come attributi che appartengono al sistema nel suo insieme. Tra esse
vi sono quelle che hanno a che vedere con la data ed l'ora:
• __System.date
• __System.datetime
• __System.day
• __System.dayOfWeek
• __System.dayOfYear
• __System.month
• __System.time
• __System.year
Proprietà utente
I seguenti attributi si riferiscono al membro utente che sta usando correntemente l'applicazione.
• __User.eMail
• __User.firstName
• __User.isAdmin
• __User.isEnabled
36
Migliorare l'applicazione generata
• __User.isOnline
• __User.lastLogin
• __User.lastName
• __User.profile
• __User.skypeName
• __User.team
• __User.username
Definire attributi di tipo math
Puoi utilizzare gli attibuti relativi alla piattaforma, le proprietà di sistema e utente descritti precedentemente
per definire attributi di tipo math. Ad esempio, supponiamo di voler rappresentare anche l'età dei dipendenti.
L'informazione sull'età non è disponibile nella classe ma può essere dedotta a partire dalla data di nascita e dalla
data corrente.
Crea l'attributo derivato age. Questa volta fai click con il tasto destro del mouse sull'intestazione della classe
Employee e seleziona New derived attribute → Math. Si apre nuovamente la finestra di editor delle
espressioni matematiche. A partire dalla data di nascita e dalla data corrente, l'età può essere calcolata come
differenza tra le due date. L'espressione matematica da utilizzare è la seguente: dateDiff(__System.date,
date_of_birth, field.year). Puoi digitare la formula direttamente nell'area di testo della finestra di
dialogo. In alternativa, puoi utilizzare vari shortcut disponibili nei menu che trovi sotto l'area di testo della finestra
di dialogo che ti consentono di costruire e validare l'espressione matematica che definisce l'attributo di tipo math.
Il menu Functions ti aiuta ad individuare la funzione più appropriata da utilizzare nella espressione matematica.
Fai click su Choose... per aprire la lista delle funzioni disponibili. Selezionando una funzione nella lista ti viene
mostrata la sua descrizione. Puoi ridurre la lista delle funzioni utilizzando il menu Show che trovi in alto nella
finestra. Per calcolare l'età di un dipendente come differenza tra la data attuale e la sua data di nascita, abbiamo
bisogno di una funzione che consenta di manipolare valori di tipo Date. Quindi, seleziona Date dal menu Show.
Apparirà la lista delle funzioni che consentono di manipolare valori di tipo Date, Time e Datetime. Tra
queste funzioni, seleziona dateDiff(date1,date2,calendarField). Come puoi vedere dalla sua descrizione, questa è
la funzione che ci serve. Fai click su Insert per inserire la funzione nell'area di testo dell'editor. La finestra che
mostra la lista delle funzioni si chiuderà e la funzione dateDiff apparirà nell'area di testo.
Avendo selezionato dalla lista la funzione da utilizzare, essa conterrà come argomenti delle variabili generiche
che devono essere sostituite con i valori che servono effettivamente per il calcolo. Sostituisci date1 con l'attibuto
date_of_birth: date. Per fare ciò, seleziona date1 facendo ad esempio doppio click su di esso, e seleziona
date_of_birth: date dal menu Attributes. Allo stesso modo, sostituisci date2 con la proprietà di sistema date:
date che restituisce la data corrente (apparirà __System.date) scelta dal menu System properties. Ed infine,
scrivi field.year al posto di calendarField. Al termine vedrai apparire la scritta Expression has been
validated as INTEGER ad indicare che l'espressione così costruita è corretta (Figura 6.2). Fai click on OK. Un
nuovo attributo di tipo integer è aggiunto alla classe. Rinominalo in age.
37
Migliorare l'applicazione generata
Figura 6.2. Editor delle espressioni matematiche
Nello stesso modo puo aggiungere due ulteriori attributi di tipo math:
• senior, un attributo di tipo boolean che vale true se l'età dell'impiegato è superiore a 60. L'espressione da
usare è: age > 60;
• new_record, un attributo di tipo boolean che vale true se il record è stato creato negli ultimi 2 minuti.
L'espressione da usare è: dateDiff(__System.datetime, __createdon, field.minute) < 2.
Importante
Per definire l'attributo new_record devi prima aggiungere alla classe l'attributo relativo alla
piattaforma __createdon. Fai click sull'header della classe Employee. Nel Class menu,
seleziona Add platform attribute e poi seleziona __createdon dalla lista degli
attributi relativi alla piattaforma. L'attributo verrà aggiunto alla classe. Successivamente, procedi
come illustrato per definire l'attributo di tipo math new_record. Troverai l'attributo relativo
alla piattaforma __createdon nel menu Attributes della finestra dell'editor delle espressioni
matematiche.
38
Migliorare l'applicazione generata
Nota
Per quanto riguarda le costanti numeriche intere e reali, sono accettati tutti i letterali che rispettano
il formato Java standard.
Passando il mouse su un attributo di tipo math, apparirà un tooltip che mostra l'espressione matematica che
definisce l'attributo stesso. Inoltre, selezionando un attributo di tipo math tutti gli attributi della classe (derivati
e non) mostrati nel modello che sono usati per definire l'attributo di tipo math, saranno circoscritti con una linea
rossa. Ad esempio, in Figura 6.3 è mostrata la classe Employee con l'attributo /age di tipo math evidenziato e
l'attributo date_of_birth (usato nell'espressione matematica che definisce l'attributo di tipo math) circoscritto
in rosso.
Figura 6.3. La classe Employee con l'attributo /age di tipo math evidenziato
6.3. Modificare il layout del form
Puoi cambiare il layout del form che appare quando un oggetto viene creato o ispezionato. Per fare ciò devi operare
nell'Application layer. Sulla sinistra, appena sotto a Database appare una sola applicazione chiamata Application1
( ). Fai click su di essa per selezionarla. Sulla destra nella finestra principale del Designer verrà mostrato il livello
applicativo con i suoi comandi.
Passa il cursore sopra una classe. Sulla base del riquadro della classe Employee ci sono varie icone ( ,
,
, , ). Usa queste icone per visualizzare i vari aspetti della classe che puoi modificare. Fai click su
per
visualizzare il form layout della classe. Si apre l'editor del form layout in cui sono mostrati gli attributi nativi della
classe ma non quelli derivati. Proviamo a dividere i vari campi che appaiono nella pagina in sezioni in modo da
non confondere l'utente con un mare di campi. Fai click su New section. Una nuova sezione viene creata con il
nome Section1. Fai click con il tasto destro del mouse in un punto qualunque della sezione e seleziona Edit
per aprire la finestra di dialogo in cui settare le proprietà della sezione. Modifica il nome della sezione in Job.
Sposta nella sezione Job, trascinandoli con il mouse, i campi salary, position e date_hired. Analogamente, crea
una nuova sezione chiamata Address contenente i campi address, city, country e zip. Ed infine, aggiungi un
separatore tra i campi last_name e date_of_birth, prendendo il widget Separator dalla sezione Widgets sulla sinistra
e posizionandolo nel punto desiderato (Figura 6.4).
39
Migliorare l'applicazione generata
Figura 6.4. Editor del form layout
I widget HTML snippet possono essere utilizzati per inserire del codice di markup HTML arbitrario nel form. Ad
esempio, potresti inserire una breve descrizione sul formato degli input ammessi. Fai click su OK per salvare le
modifiche e per chiudere l'editor.
Suggerimento
Nota come una volta definito il form layout della classe, la corrispondente icona sia evidenziata.
In questo modo è possibile capire immediatamente che il form layout della classe è stato
personalizzato.
6.4. Modificare la rappresentazione della
Livetable
Così come puoi modificare la rappresentazione del form di un singolo oggetto, puoi modificare anche il modo in
cui vengono rappresentati più oggetti nella Livetable. Fai click su per aprire l'editor del list layout. Sulla sinistra
della finestra c'è la lista delle colonne nascoste (Hidden columns), in alto a destra la lista delle colonne rispetto
alle quali gli oggetti vengono raggruppati (GroupBy columns, vuota di default) e in basso a destra una lista di
colonne dati (Data columns, quelle definite mediante gli attributi della classe). A questo livello puoi impostare
il campo rispetto al quale gli oggetti nella Livetable debbano essere ordinati (in modo crescente o decrescente)
usando il menu a tendina order by.
Effettuiamo delle modifiche. Raggruppa i dipendenti per paese. Sposta la colonna country dalla lista Data
columns alla lista GroupBy columns. Poi ordina gli oggetti in ordine crescente rispetto al cognome selezionando
last_name dal menu order by. Nota la freccia blu rivolta verso il basso che appare nella lista delle colonne dati
40
Migliorare l'applicazione generata
accanto a last_name ad indicare che l'ordinamento è decrescente. Per ordinare in modo crescente basta fare
click sulla freccia (che diventa rivolta verso l'alto). Ed infine, nascondi l'indirizzo ed il cap tascinando le colonne
address e zip nella lista Hidden columns (Figura 6.5). Fai click su OK per salvare le modifiche e chiudi l'editor.
Figura 6.5. Editor del list layout
Anche in questo caso l'icona del list layout nella classe è evidenziata ad indicare che il list layout della classe è
stato personalizzato.
6.5. Impostare valori di default per gli attributi
di classe
In genere gli oggetti creati in un'applicazione possono avere dei valori di default per uno o più attributi. Livebase
consente di impostare ciò. Supponiamo che la maggior parte dei dipendenti viva a Claybay in Venezuela. Per
sfruttare questo fatto, possiamo impostare dei valori di dafault per gli attributi city e country. Fai click con il
tasto destro del mouse su city e seleziona Set default value.... Scrivi come valore di default Claybay
e fai click su OK. Allo stesso modo imposta Venezuela come valore di default per country.
6.6. Finalizzare e verificare le modifiche
La classe risultante da tutte queste modifiche è mostrata in Figura 6.6. Salva le modifiche nel modello e chiudi
il Designer. Nota come il database non sia stato toccato dalle modifiche fatte. Questo perché le varie modifiche
sono state apportate a livello applicativo e dunque si riflettono sull'applicazione costruita sopra il modello dati
esistente piuttosto che sul modello stesso.
41
Migliorare l'applicazione generata
Figura 6.6. La classe Employee nell'Application layer
Avvia il Cloudlet Workforce. Accedi alla sua homepage facendo il login. Fai click su Application1 e
successivamente apri la Livetable della classe Employee. Fai doppio click su uno qualunque degli oggetti della
tabella per aprire il pannello adesso relativo. Come puoi vedere i vari campi sono separati in sezioni proprio come
abbiamo impostato nel form layout. Puoi cambiare pannello passando da Job a Address e viceversa a piacimento.
Ritorna alla Livetable. Fai click su Create per creare un nuovo oggetto. Apri il pannello Address. Nota che,
come abbiamo definito, nei campi City e Country ci sono già dei valori preimpostati a Claybay e Venezuela
rispettivamente. Fai click su Cancel. Chiudi l'applicazione ed effettua il logout dal Cloudlet.
6.7. Riepilogo
In questo capitolo abbiamo descritto come sia possibile migliore alcuni aspetti particolari dell'applicazione
generata legati all'esperienza d'uso. Nel prossimo capitolo spiegheremo come impostare delle condizioni a livello
di classe che consentano un controllo sulla creazione degli oggetti ammissibili mediante l'applicazione generata.
42
Capitolo 7. Imporre la qualità dei dati
mediante class warning
Livebase consente di validare i dati inseriti in un'applicazione mediante due tipi di controlli:
• vincoli sul dominio degli attributi, che sono applicabili solo sugli attributi della classe modellati dall'utente
(come ad esempio la restrizione sul dominio che hai definito per l'attributo zip nella Sezione 3.1) e non sugli
attributi derivati (di tipo math e query), e tantomeno su gli attributi relativi alla piattaforma, le proprietà di
sistema e di utente;
• class warning, cioè condizioni di controllo basate su un'espressione booleana (chiamata condition) che può fare
riferimento ad attributi di qualsiasi tipo (anche derivati) e a combinazioni di più attributi anche quelli relativi
alla piattaforma, proprietà di sistema e proprietà utente.
Ad esempio, supponiamo di volere controllare che non venga assunto un dipendente di età inferiore a 21 anni.
Nel Capitolo 6 abbiamo definito un attributo di tipo math chiamato age per ottenere l'informazione sull'età di un
dipendente. Trattandosi di un attributo derivato, l'unico modo che abbiamo per imporre un controllo sul valore di
age è creare una class warning per la classe Employee, definita mediante un'espressione booelana che controlla
se il valore di age è inferiore a 21, e in caso di violazione della condizione impedisce la creazione di un oggetto
della classe.
Arresta il Cloudlet Workforce e apri il Designer per modificare TutorialEngine. Apri l'Application layer e
seleziona Application1. Fai click con il tasto destro del mouse sull'header della classe Employee e seleziona Set
Warnings.... Alternativamente puoi fare click sull'icona
posizionata in basso nel riquadro della classe. Si
apre la finestra di gestione dei class warning. Per aggiungere una condizione fai click su Add.
Una condizione è composta da un nome (utilizzato per indentificare univocamente la condizione), un'espressione
booleana (se l'espressione viene valutata a true é sollevato un warning/errore) e un messaggio (che viene
mostrato quando la condizione è violata). Quando la condizione è violata è possibile fare il modo che l'oggetto
non venga creato affatto oppure che venga creato comunque. Nel primo caso la condizione serve ad imporre dei
vincoli restrittivi, mentre nel secondo caso la condizione è flessibile e fornisce delle avvertenze sulla creazione
dell'oggetto.
Nel nostro esempio, scrivi under21 come nome della condizione e age < 21 come espressione. Nel campo del
messaggio scrivi Age is under 21!. Siccome vogliamo impedire che un oggetto della classe Employee sia
creato se la sua età è inferiore a 21 anni, devi specificare questa condizione come restrittiva. Per fare ciò metti un
flag nella checkbox accanto alla voce Blocking (object creation denied if warnings show up) (Figura 7.1). Facendo
click OK salvi la condizione.
43
Imporre la qualità dei dati mediante class warning
Figura 7.1. Editor dei Class warning
Analogamente, aggiungi una condizione che impedisce di creare un dipendente la cui data di assunzione è nel
futuro. Il controllo sulla data di assunzione è fatto confrontando il valore dell'attributo date_hired con la
data corrente, che può essere ottenuta mediante la proprietà di sistema __System.date. Anche in questo
caso devi definire un class warning, in quanto la condizione coinvolge una proprietà di sistema. Chiama questa
class warning hiredInFuture. L'espressione che definisce la class warning è la seguente: date_hired >
__System.date. Come messaggio puoi scrivere Date hired is in the future!. Disabilita la
creazione degli oggetti che violano la condizione. Se adesso provi a salvare questa condizione si aprirà una finestra
in cui verrà mostrato un messaggio che dice che siccome l'attributo date_hired non è stato definito come
obbligatorio, l'espressione non può essere valutata a runtime. In altre parole, l'attributo date_hired potrebbe
essere vuoto e quindi la condizione potrebbbe essere ignorata. A questo punto hai due opzioni: puoi lasciare le
cose come stanno ed ignorare il messaggio oppure puoi rendere l'attributo date_hired obbligatorio. Procedi
nel secondo modo e imposta date_hired come obbligatorio.
44
Imporre la qualità dei dati mediante class warning
Aggiungi un'altra condizione che impedisce di inserire un salario sbagliato per i dipendenti. Nel dominio di
riferimento per la nostra applicazione, il salario di un dipendente deve essere appropriato rispetto all'età del
dipendente stesso. La condizione da aggiungere alla classe non rappresenta un vincolo stretto tale da impedire la
creazione dell'oggetto. Tuttavia verrà mostrato un messaggio che avvisa che si sta creando un dipendente con un
valore per il salario non appropriato. L'informazione sul salario di un dipendente è data dall'attributo della classe
salary, mentre l'età è data dall'attributo di tipo math age. Anche in questo caso dobbiamo definire una class
warning in quanto l'espressione che definisce la condizione di controllo coinvolge un attibuto di classe (salary)
e un attributo derivato (age). Assegna a questa nuova condizione il nome lowSalary. Come espressione usa ad
esempio la seguente: salary < (30000 + age * 500); mentre come messaggio puoi scrivere Salary
is too low with respect to age. Anche in questo caso nel momento in cui salvi la condizione
verrai avvisato che l'attributo salary non è stato impostato come obbligatorio. A differenza di prima ignora
il messaggio e specifica di accettare l'espressione così come è stata definita. In Figura 7.2 sono mostrate le tre
condizioni appena definite. Fai click su OK per salvarle.
Figura 7.2. Finestra di gestione delle class warning per Employee
Nell'Application layer, la classe Employee mostrerà l'icona corrispondente alle condizioni di classe evidenziata
ad indicare appunto la presenza di tali condizioni (Figura 7.3). Salva le modifiche nel modello e chiudi il Designer.
Se vuoi puoi avviare il Cloudlet Workforce e verificare l'attivazione delle condizioni definite, ovviamente dopo
aver risolto gli eventuali problemi di allineamento del database.
45
Imporre la qualità dei dati mediante class warning
Figura 7.3. La classe Employee nell'Application layer (cnt.)
7.1. Riepilogo
Con questo capitolo concludiamo la prima parte del tutorial in cui abbiamo mostrato come creare e modificare
un'applicazione con una sola classe. Nella prossima parte del tutorial mostreremo come sia possibile lavorare con
applicazioni aventi più classi tra loro correlate con delle relazioni.
46
Parte C. Lavorare con
più classi e relazioni
Capitolo 8. Lavorare con le
associazioni
Nella prima parte del tutorial abbiamo spiegato come creare delle applicazioni il cui modello è formato da una
singola classe. In generale, però, è utile utilizzare più classi per rappresentare il dominio dell'applicazione. In questo
capitolo mostriamo come sia possibile aggiungere nuove classi al modello e ripartire in più classi le informazioni
presenti in una classe già esistente in modo da rappresentare meglio una categoria di dati. Inoltre, spieghiamo più in
dettaglio come usare la Libreria per memorizzare versioni multiple degli engine al fine di riutilizzarli agevolmente
in un momento successivo.
8.1. Aggiungere una nuova classe al modello
Arresta il Cloudlet Workforce se è in esecuzione e apri il Designer per modificare TutorialEngine. Vogliamo
rappresentare l'ufficio dove lavorano i dipendenti. Per fare ciò dobbiamo aggiungere una nuova classe chiamata
Office. In particolare, per ogni ufficio vogliamo rappresentare il nome e inserire delle note per descrivere
funzioni e caratteristiche dell'ufficio. Chiaramente, il nome dell'ufficio dovrà essere usato come object title della
classe e, visto che non vogliamo che esistano due uffici con lo stesso nome, questo deve essere impostato come
univoco.
Suggerimento
Nella Sezione 2.1 abbiamo spiegato come aggiungere una classe mediante l'icona
della Palette
toolbar. Altri modi per creare una classe sono i seguenti: fai click con il tasto destro del mouse in
un punto qualunque della finestra del Designer e seleziona dal menu New class; oppure premi
la combinazione dei tasti Ctrl+N. In entrambi i casi apparirà una nuova classe nella finestra del
Designer.
Suggerimento
Per aggiungere un vincolo di unicità sull'attributo name della classe Office, anziché selezionare
l'attributo e usare il menu (come mostrato nella Sezione 2.1), usiamo un metodo alternativo. Fai
click con il tasto destro del mouse sull'header della classe Office e seleziona Set unique
constraints.... Fai click su Add. Metti il flag nel box accanto a name: string e poi fai click
su OK. Il vincolo di unicità sull'attributo apparirà nella lista. A questo punto fai click su OK per
salvare le modifiche.
Adesso nel modello ci sono due classi Employee e Office che rappresentano due insiemi separati di dati relativi
al nostro dominio. Assumiamo che ogni dipendente possa lavorare in più uffici, (potendo anche essere nessuno nel
caso di dipendenti che lavorano da casa) ma che ogni ufficio abbia almeno un dipendente che in esso vi lavora. Per
rappresentare questo fatto dobbiamo collegare le classi Employee e Office usando una relazione. In questo
caso particolare utilizziamo un'associazione bidirezionale tra le due classi.
Dalla Palette toolbar fai click su . Con il mouse fai prima click sulla classe Employee e poi su Office
per aggiungere l'associazione tra le due. In questo caso specifico siccome stiamo aggiungendo un'associazione
bidirezionale l'ordine con cui selezioniamo le due classi è irrilevante. Agli estremi della linea che rappresenta
l'associazione compare un cerchio con dentro un asterisco (*). Il cerchio rappresenta il ruolo. Per esempio,
il cerchio al lato di Office rappresenta il ruolo office_ di Employee nell'ambito dell'associazione con
Office, cioè Employee.office_ (passando il mouse sul cerchio viene visualizzato il nome del ruolo).
L'asterisco all'interno del ruolo rappresenta la cardinalità del ruolo, cioè indica quanti sono gli oggetti di una classe
48
Lavorare con le associazioni
che sono associati ad un oggetto della classe a cui si riferisce il ruolo. Ad esempio, la cardinalità di default * indica
che ogni oggetto della classe Employee può essere associato ad un numero qualunque di oggetti della classe
Office (un dipendente può lavorare in più uffici). Per quanto riguarda la cardinalità del ruolo employee di
Office, il valore di default * deve essere cambiato in quanto vogliamo imporre che in un ufficio vi lavori almeno
un dipendente. Fai click con il tasto destro del mouse sul ruolo employee_ e seleziona One or more. Nel
ruolo al posto dell'asterisco apparirà 1N, ad indicare appunto che un oggetto della classe Office è associato ad
un insieme non vuoto di oggetti della classe Employee. I ruoli possono essere rinominati (i nomi che appaiono
passandoci sopra il mouse sono generati automaticamente dalla piattaforma). Fai click con il tasto destro del mouse
sul ruolo di Employee e seleziona su Rename. Scrivi offices e premi Enter per confermare. Allo stesso
modo rinomina il ruolo di Office in employees. Alternativamente, puoi rinominare un ruolo facendo doppio
click su di esso. Una volta terminato di fare le modifiche, dovresti ottenere un modello come quello in Figura 8.1.
Figura 8.1. Associazione tra Employee e Office
8.2. Rappresentare informazioni mediante
classi distinte
Miglioriamo il modello. Data la struttura attuale della classe Employee, l'informazione in merito alla posizione
deve essere inserita manualmente per ogni dipendente. Potremmo avere 40 software engineer ma ciascuno di essi
potrebbe ricoprire una posizione particolare a seconda delle competenze (software egnineer, QS tester,
ecc.). Inoltre, non c'è nessun controllo sulle posizioni speciali: dovremmo avere un solo CEO, CTO, ecc., mentre
al momento ce ne può essere più di uno.
Il problema nasce dal fatto che in realtà l'informazione sulla posizione non è parte integrante del concetto di
dipendente, ma per come abbiamo modellato il dominio di fatto lo è. L'approccio corretto in questo caso è
introdurre nel modello due classi: Area_of_expertise per rappresentare le aree di competenza dei dipendenti
e Chief_position per rappresentare le posizioni speciali. La classe Area_of_expertise dovrebbe essere
associata alla classe Employee facendo in modo che un'area di competenza corrisponda ad un numero qualunque
di dipendenti mentre un dipendente abbia al più, ad esempio, tre aree di competenza. Analogamente, la classe
Chief_position dovrebbe essere associata alla classe Employee facendo in modo che una posizione speciale
sia associata ad un solo dipendente mentre un dipendente possa essere associato ad al più una posizione speciale.
In questo modo saremmo sicuri che nel nostro ufficio vi possano essere più dipendenti con funzione di Software
engineer ma che non si possa avere più di un dipendente nei ruoli chiave di CEO, CTO, ecc. Inoltre, si potrebbe
fare in modo che sia l'area di competenza che la posizione siano scelti da una lista di valori minimizzando così
non solo lo sforzo ma anche gli eventuali errori di digitazione legati all'input dei valori nella lista.
49
Lavorare con le associazioni
Realizziamo le modifiche. Per prima cosa elimina l'attributo position dalla classe Employee. Poi, rinomina
l'attributo title in full_name. Successivamente crea la classe Chief_position. Aggiungi l'attributo
title di tipo string e impostalo come obbligatorio e come object title. Definisci inoltre su quest'attributo un
vincolo di unicità (dopotutto non avrebbe senso avere due posizioni chiamate CEO). A questo punto nasce un
altro problema. Di fatto non c'è limite al numero delle posizioni speciali che possono essere create nel sistema.
Praticamente ogni dipendente potrebbe creare una nuova posizione appositamente per se stesso. Per evitare la
proliferazione di posizioni, dobbiamo limitare il numero di oggetti della classe Chief_position che possono
essere creati settando opportunamente la cardinalità di classe. Come avrai notato, sopra il riquadro della classe
è presente un cerchio chiamato system role (ruolo di sistema). All'interno del cerchio è indicata la cardinalità del
ruolo che di default è * (è possibile creare un numero qualunque di oggetti della classe). Cambia il system role
della classe Chief_position. Fai click con il tasto destro del mouse sul ruolo e seleziona dal menu Custom
cardinality... (indicata con C). Si apre una finestra in cui puoi impostare la cardinalità. Lascia il valore
minimo inalterato e scrivi 10 come valore massimo. Avendo settato la cardinalità di classe a 10, Livebase non
consentirà di creare più di 10 oggetti per la classe Chief_position.
Ora che abbiamo la classe Chief_position possiamo creare l'associazione con la classe Employee. In
questo caso usiamo l'icona
dalla Palette toolbar per creare un'associazione unidirezionale da Employee
a Chief_position (l'ordine è importante). Un'associazione unidirezionale differisce da un'associazione
bidirezionale per il fatto che l'associazione è visibile solo a partire da una delle due classi. Nel nostro caso,
l'associazione è visibile da Employee verso Chief_position, cioè è possibile da un dipendente risalire alla
posizione al quale è associato, ma non è possibile il contrario, cioè da una posizione risalire al dipendente al quale
è associata. Imposta come cardinalità di entrambi i ruoli nell'associazione Zero or one (01). Cambia il nome
del ruolo di Employee da chief_position_ in chief_position
Ora crea la classe Area_of_expertise e aggiungi l'attributo label di tipo string. Imposta l'attributo
obbligatorio e come object title e definisci su di esso un vincolo di unicità. Crea un'associazione bidirezionale
tra Employee e Area_of_expertise. Imposta per il ruolo area_of_expertise_ di Employee una
cardinalità specifica da 0 a 3 e succesivamente rinomina il ruolo in areas_of_expertise. Il modello
risultante da tutte queste modifiche è mostrato in Figura 8.2.
Figura 8.2. La classe Employee e le associazioni con le classi satellite
50
Lavorare con le associazioni
Così come abbiamo fatto in Sezione 6.3, è possibile modificare il layout dei ruoli delle associazioni della classe
nell'applicazione generata. Come detto in precedenza, è necessario operare nell'Application layer: seleziona
l'applicazione sulla sinistra e fai click su
per visualizzare il form layout della classe. In corrispondenza dei
campi derivati dai ruoli delle associazioni, è possibile cliccare su
possibili per quel ruolo.
per visualizzare l'elenco delle rappresentazione
Le rappresentazioni disponibili per un dato ruolo dipendono dalla sua cardinalità. In particolare, se la cardinalità
massima è uno oppure è maggiore di uno, l'insieme delle rappresentazioni disponibili cambia di conseguenza. Ad
esempio, nel caso del ruolo appena rinominato in areas_of_expertise, è disponibile la rappresentazione Set
Of Checkbox mostrata in Figura 8.3. Tale rappresentazione non è disponibile per il ruolo chief_position,
per il quale è però disponibile, fra le altre, la rappresentazione denominata Dropdown mostrata in Figura 8.4.
Figura 8.3. La rappresentazione Set Of Checkbox
51
Lavorare con le associazioni
Figura 8.4. La rappresentazione Dropdown
8.3. Rendere le modifiche definitive
Salva le modifiche nel modello e chiudi il Designer. A causa delle modifiche apportate sul modello, il database
mostra un'icona di warning ad indicare che deve essere riallineato. Se fai click sull'icona del database si apre
la finestra con la lista delle problematiche da risolvere. L'eliminazione di Employee.position ha creato un
problema di media entità in quanto l'eliminazione dell'attributo comporta l'eliminazione di tutti i dati memorizzati
nella colonna corrispondente nella tabella stessa. Lascia che Livebase risolva tutte le problematiche e riallinei il
database. Chiudi la finestra del database e avvia il Cloudlet Workforce.
8.4. Testare le modifiche
Accedi alla homepage di Workforce, effettua il login e avvia Application1. Apri la Livetable relativa a Office
facendo click su Open office. Inserisci alcuni uffici. Ricorda che, in base alle cardinalità impostate sull'associazione
52
Lavorare con le associazioni
tra Office e Employee devi associare almeno un dipendente ad ogni ufficio. Infatti, se provi a creare un
ufficio senza dipendenti viene mostrato un Data validation error dovuto alla violazione del vincolo di cardinalità.
Successivamente, apri la Livetable relativa a Chief_position facendo click su Open chief position ed
inserisci delle posizioni. Poiché l'associazione che abbiamo inserito tra Employee e Chief_position è
unidirezionale non possiamo associare un dipendente ad una posizione speciale a partire dalla Livetable relativa a
Chief_position, mentre è possibile fare il contrario, cioè associare una posizione speciale ad un dipendente
a partire dalla Livetable di Employee.
Prova ad aggiungere più di 10 posizioni speciali nella Livetable di Chief_position. Livebase non ti
consentirà di creare l'undicesimo oggetto in quanto così facendo viene violata la cardinalità di classe impostata
su Chief_position (massimo 10 oggetti). Successivamente, apri la lista dei dipendenti e prova a modificare
alcuni dei dipendenti che sono stati inseriti precedentemente. Aggiungi gli uffici in cui lavorano i dipendenti. In
questo caso, siccome l'associazione tra Employee e Office è bidirezionale, puoi associare ad un dipendente
gli uffici in cui lavora direttamente dalla Livetable di Employee. Se adesso apri la lista degli uffici facendo
nuovamente click su Open offices vedrai che quei dipendenti appaiono negli uffici giusti.
Analogamente, puoi associare una posizione speciale ad un dipendente direttamente dalla Livetable di Employee.
Aprila facendo click con il mouse su Open employee. Prova, ad esempio ad assegnare ad un dipendente una
posizione speciale. Fai click sul bottone Set accanto al campo Chief position nell'Object editing panel. Si aprirà
la Livetable di Chief position. Nota che, a causa del vincolo impostato sulla cardinalità per la classe
Chief_position (non è possibile che più dipendenti ricoprano la posizione di CEO, CTO, ecc.), nella
Livetable di Chief_position verranno mostrate solo le posizioni speciale che ancora non sono state assegnate
ai dipendenti. Se tutte le posizioni speciali sono state assegnate, la lista sarà vuota. Sempre dalla Livetable di
Employee, puoi associare ad un dipendente le sue aree di competenza. Nota che se provi ad assegnare ad un
dipendente più di 3 aree di competenza otterrai nuovamente un errore dovuto in questo caso alla violazione del
vincolo di cardinalità per la classe Area_of_expertise.
Riapri per un momento la Livetable di Chief_position ed ispeziona le posizioni speciali che hai
precedentemente assegnato ai dipendenti. Come puoi notare questi dipendenti non sono mostrati nella Livetable
di Chief_position e ciò è dovuto al fatto che l'associazione tra Employee e Chief_position, essendo
undirezionale, è visibile solo da Employee. Una volta terminato le verifiche, chiudi l'applicazione ed effettua
il logout.
8.5. Aggiornare un engine archiviato
In alcuni casi è utile salvare delle copie di un engine soprattutto se questo deve subire delle modifiche sostanziali.
In questo modo, se ci siamo sbagliati possiamo ritornare indietro e ripristinare l'engine nel Cloudlet. Livebase
consente di fare questo grazie alla Libreria dove, come spiegato in Sezione 3.3, sono archiviati gli engine.
Per aggionare TutorialEngine, trascina l'icona ad esso associata dal box del Cloudlet e rilasciala su My library. Si
aprirà una finestra in cui puoi inserire una descrizione (il campo è precompilato con quanto inserito precedemente
quando hai archiviato l'engine) e un commento. Scrivi semplicemente nel campo commento: Aggiunto le
classi Office, Chief_position e Area_of_expertise . Fai click OK. Nota come il numero
di versione di TutorialEngine viene aggiornato a 2.0.0 1. Adesso nella Libreria ci sono due versioni dello stesso
engine. Passando il mouse su di esso, apparirà un nuovo link Versions. Facendo click su questo link si apre la
finestra di dialogo che mostra la lista delle versioni archiviate per l'engine, con il flag selezionato per quella
correntemente mostrata nella Library (nel nostro caso la versione 2.0.0.). Usando i bottoni in basso nella finestra
(che si attivano selezionando nella lista una delle versioni dell'engine archiviate) puoi visualizzare il modello nella
finestra del Designer (View), eliminare dalla lista la versione selezionata (Discard) o settare come corrente la
versione selezionata (Set as current). Chiudi la finestra di dialogo per tornare alla Dashboard.
1
Un aggiornamento nella prima parte del numero della versione indica che è stata apportata una modifica nel Database layer del modello.
53
Lavorare con le associazioni
8.6. Importazione di un file XLS complesso
In questa sezione mostriamo come sia possibile ottenere lo stesso engine che abbiamo costruito prima importando
nel Cloudlet un foglio di lavoro Excel già esistente. Nel Capitolo 4 abbiamo mostrato come sia possibile creare
un'applicazione importando un Flat sheet. Qui useremo per costruire il modello un foglio di lavoro Excel di tipo
Star sheet. Il formato Star sheet, a differenza del formato Flat sheet, definisce più classi simultaneamente. Il
modello ottenuto mediante l'importazione di uno Star sheet è costituito da una classe main che rappresenta il fulcro
del modello e alcune classi satellite ad essa connesse mediante delle associazioni in modo tale che il diagramma
risultante abbia una forma appunto a stella. La creazione delle classi satellite, così come la definizione degli
attributi della classe main, sono una conseguenza del modo in cui sono rappresentati i nomi delle colonne nel
foglio di lavoro. Nella fattispecie, uno Star sheet deve essere formattato secondo le seguenti regole:
• Un foglio di lavoro per la classe main: il file deve contenere un foglio di lavoro per la classe main. Il nome della
classe è dato dal nome del foglio di lavoro.
• Una colonna per attributo della classe main. Ogni attributo della classe main è dato da una colonna di valori
nel foglio di lavoro. I nomi che compaiono nell'header delle colonne sono scritti normalmente (come per i Flat
sheet).
• Una colonna per ciascun attributo delle classi satellite. Ad ogni attributo delle classi satellite corrisponde una
colonna di valori nel foglio di lavoro. I nomi che compaiono nell'header delle colonne sono scritti nel seguente
formato speciale: Nome_Classe.nome_attributo|nome_ruolo (il nome del ruolo può essere omesso
se c'è una sola associazione con quella classe).
Inoltre, la classe main deve avere almeno un attributo. Se poi ci sono più associazioni tra la classe main ed una
stessa classe satellite, è obbligatorio utilizzare i nomi dei ruoli nell'header delle colonne degli attributi delle classi
satellite per distinguere le associazioni.
Dai un'occhiata a questo file Excelche abbiamo preparato come esempio. Questo file contiene un foglio di
lavoro chiamato Employee. Osserva il modo in cui sono scritti i nomi degli header delle colonne. Nel folgio
di lavoro viene specificato un modello avente la classe Employee come classe main, e tre classi satellite:
Office, Chief_position e Area_of_expertise. Gli attributi propri della classe Employee sono
scritti normalmente, riportando nell'header della colonna corrispondente il nome dell'attributo stesso, mentre per
gli attributi delle classi Office, Chief_position e Area_of_expertise è stato adottato un formato
diverso. La corrispondenza fra le colonne del foglio di lavoro XLS e le classi del modello ottenuto dalla sua
importazione è mostrata nella seguente tabella.
Tabella 8.1.
Colonna nel foglio XLS
Classe nel modello
Attributo di classe nel modello
first_name
Employee
first_name
last_name
Employee
last_name
date_of_birth
Employee
date_of_birth
city
Employee
city
date_hired
Employee
date_hired
salary
Employee
salary
country
Employee
country
address
Employee
address
zip
Employee
zip
Office.name|offices
Office
name
54
Lavorare con le associazioni
Colonna nel foglio XLS
Classe nel modello
Attributo di classe nel modello
Office.notes|offices
Office
notes
Chief_position.title|
chief_position
Chief_position
title
Area_of_expertise.label| Area_of_expertise
areas_of_expertise
label
Prova ad importare il file Excel nel Cloudelt. Prima di fare ciò, elimina l'engine e il database presenti in modo
da iniziare con un Cloudlet vuoto. Una volta terminata l'importazione, sarà creato nel Cloudlet un nuovo engine
e un database con 109 oggetti: 50 oggeti di tipo Employee, 9 oggetti di tipo Office, 24 oggetti di tipo
Chief_position e 26 oggetti di tipo Area_of_expertise. Se apri l'engine nel Designer, dovresti vedere
il modello mostrato in figura Figura 8.5. Come puoi vedere, Employee è la classe main, mentre Office,
Chief_position, Area_of_expertise sono le classi satellite. Gli attributi delle classi sono definiti
automaticamente sulla base della corrispondenza sopra descritta.
Figura 8.5. La classe Employee e le classi satellite
Ti sarai accorto che il modello mostrato in Figura 8.5 non è uguale al modello mostrato in Figura 8.2. Ad
esempio, le cardinalità (sia quelle di classe che quelle di ruolo) e la navigabilità delle associazioni tra le classi
sono diverse. Inoltre, tutte le personalizzazioni sul form/list layout delle classi, la specifica degli attributi richiesti,
delle restrizioni sul dominio, degli attributi di tipo math, etc., che hai definito nel modello vecchio mancano in
quello nuovo.
Oltre a ciò, la classe Employee contiene quattro attributi di tipo query: /offices_name, /
offices_notes, /chief_position_title, /areas_of_expertise_label. Come accenato nel
Capitolo 6, gli attributi di tipo query sono attributi derivati definiti sulla base di una query. Gli attributi di
tipo query saranno descritti più in dettaglio nel Capitolo 10. In questo contesto, ti è sufficiente sapere che la
query alla base dell'attributo di tipo query estrae il valore di un attributo di una classe target collegata attraverso
un cammino di relazioni. Selezionando nel modello un attributo di tipo query, verranno evidenziati con una
evidenziato il cammino delle relazioni che specifica la query, la classe e l'attributo target. Per esempio, in Figura 8.6
55
Lavorare con le associazioni
è mostrato il cammino che specifica l'attributo di tipo query offices_name che estrae il valore dell'attributo
name della classe target Office. Gli attributi di tipo query aggiunti alla classe Employee class, sono definiti
automaticamente dall'importer XLS e corrispondono alle colonne nel foglio di lavoro XLS che hanno come
header Class.attribute|rolename. Il nome di un attributo di tipo query è specificato dall'espressione
rolename_attribute. Nel nostro esempio, la corrispondenza tra le colonne nel foglio di lavoro XLS che si
riferiscono alle classi satellite e gli attributi di tipo query nella classe main è descritta nella tabella seguente.
Tabella 8.2.
Colonna nel foglio XLS
Attributo di tipo query Classe satellite
nella classe main
Attributo
satellite
Office.name|
offices
/offices_name
Office
name
Office.notes|
offices
/offices_notes
Office
notes
Chief_position.title|
/
Chief_position
offices
chief_position_title
title
Area_of_experitse.label|
/
Area_of_expertise
areas_of_expertise areas_of_expertise
label
nella
classe
Nota
Gli attributi (di tipo query e non) della classe Employee sono stati definiti in modo da specificare
una corrispondenza tra la struttura della classe Employee e la struttura dello Star sheet utilizzato
per costruire il modello.
Figura 8.6. The path of relations that specifies the /offices_name query attribute in
Employee
56
Lavorare con le associazioni
Le differenze menzionate prima tra il modello della Figura 8.2 e il modello della Figura 8.5 ottenuto mediante
l'importazione del foglio XLS, hanno a che fare con la struttura dello schema. C'è però un altra questione che
dipende dai dati memorizzati nel foglio XLS e che non consente di allineare i due modelli. Infatti, prova ad
impostare la cardinalità di classe di Chief_position ad un valore massimo pari a 10. Una volta tornato alla
Dashboard noterai un disallineamento nel database. Se ora apri la finestra di dialogo del database troverai nella
lista delle problematiche di allineamento del database una high severity issue, cioè una problematica di grave entità
che non può essere risolta automaticamente da Livebase. Nel nostro caso la problematica è data dal fatto che non è
possibile applicare il vincolo di cardinalità di classe pari a 10 sulla classe Chief_position in quanto esistono
già 24 oggetti di classe. Chiudi la finestra di dialogo del database.
8.7. Ripristino di un engine dalla Libreria
Ripristiniamo nel Cloudelt l'engine costruito prima dell'importazione del file Excel (che fortunatamente abbiamo
salvato nella Libreria). Elimina l'engine che è stato creato con l'importazione ma non eliminare il database in quanto
vogliamo mantenere i dati. Ripristina il TutorialEngine dalla Libreria, trascinandolo da Engines e rilasciandolo
su Workforce. Una volta che l'engine sarà ripristinato, noterai che il database non è allineato. Se apri la finestra
di dialogo del database troverai che come prima, una high severity issue dovuta all'impossibilità di applicare il
vincolo di cardinalità di classe pari a 10 sulla classe Chief_position. Siccome vogliamo mantenere i dati nel
database, l'unico modo per risolvere questa problematica è modificare il vincolo di cardinalità di classe. Chiudi
la finestra di dialogo del database e apri il Designer per modificare TutorialEngine. Questa volta, ad esempio,
imposta 30 come valore massimo per la cardinalità di classe per Chief_position. Salva le modifiche e chiudi
il Designer. Una volta tornato alla Dashboard, nota come sul database sia ancora presente l'icona del warning.
Questa volta però, se apri nuovamente la finestra di dialogo del database troverai solamente low severity issue che
possono essere risolti automaticamente da Livebase. Fai click sul bottone Resolve all issues e successivamente
chiudi la finestra di dialogo del database.
Avvia il Cloudlet Workforce, accedi alla sua homepage ed effettua il login e avvia Application1. Controlla che
effettivamente l'applicazione non è cambiata rispetto a quella che abbiamo costruito precedentemente (a parte il
fatto che è possibile avere fino ad un massimo di 30 posizioni speciali). A questo punto puoi terminare la sessione
e fare il logout dal Cloudlet.
57
Capitolo 9. Lavorare con le
composizioni
Nel Capitolo 8 abbiamo mostrato come creare delle relazioni tra classi aventi uguale importanza. In questo capitolo
mostreremo come creare delle composizioni, relazioni tra una classe tutto e una classe parte in cui quest'ultima
appartiene o è parte dell'altra.
9.1. Introduzione alle composizioni multiple
Nella Sezione 8.7 apportando una semplice modifica a TutorialEngine, siamo stati in grado di allineare il database
con il modello così da mantenere i dati del file Excel importato in un passo precedente. In questo capitolo,
modificheremo l'engine in un modo tale da non consentire di allineare ulteriormente il database per via della
presenza di high severity issues. Di conseguenza, non possiamo mantenere i dati che sono memorizzati nel
database. Quindi prima di andare avanti è necessario eliminare il database. I dati potranno essere inseriti nel sistema
successivamente a mano una volta che l'applicazione sarà attiva.
Figura 9.1. Composizione tra Employee e Vacation
Arresta il Cloudlet Workforce. Elimina il database trascinando la sua icona e rilasciandola sull'area del Trash.
A questo punto apri TutorialEngine per effettuare delle modifiche. Crea una nuova classe chiamata Vacation
per rappresentare i periodi di ferie dei dipendenti dell'ufficio. Per ogni periodo di ferie, vogliamo memorizzare
la data di inizio (start_date), il numero dei giorni (num_days), e un commento opzionale (notes).
Designa l'attributo start_date come object title e definisci sia start_date che num_days come richiesti.
Successivamente, crea una relazione di composizione da Employee a Vacation. In questa composizione la
classe tutto è Employee mentre la classe parte è Vacation. Fai click sull'icona della Palette toolbar. Quindi
fai click prima su Employee e poi su Vacation. Una composizione tra le due classi apparirà nel modello.
Nota che è presente un solo ruolo nella composizione dalla parte di Vacation, ciò ad indicare che la classe
parte (Vacation) è accessibile solo dalla classe tutto (Employee). Infatti, non ha senso avere i periodi di ferie
come elementi a sé stanti nel sistema. Dopotutto, chi è che fa le ferie? I dipendenti. E quindi è utile fare in modo
che i periodi di ferie siano visibili solo a partire dai dipendenti a cui fanno riferimento. Rinomina questo ruolo
in vacations. Lascia la cardinalità di default * (ogni dipendente può prendere più periodi di ferie). Salva le
modifiche. La porzione del modello risultante è rappresentata in Figura 9.1. A Chiudi il Designer. Una volta
tornato alla Dashboard, crea il database e avvia Workforce.
58
Lavorare con le composizioni
Inserire dati nell'applicazione
Accedi alla homepage di Workforce, effettua il login e avvia Application1. Fai click su Open employees per aprire
la Livetable di Employee. Aggiungi vari dipendenti. Facendo click sul bottone Create si aprirà l'Object editing
panel della classe Employee. Inserisci dei dati significativi nei campi. Come puoi vedere, è apparso un nuovo
campo Vacations. Facendo click sul bottone Add si apre l'Object editing panel per aggiungere un periodo di ferie
alla classe Vacation.
Nota
Il breadcrumb in alto nella schermata mostra come se questo oggetto facesse parte della classe
Employee.
Inserisci la data di inizio ed il numero dei giorni relativi al periodo che si sta creando (ed eventualmente una nota).
Facendo clik su Ok si ritorna all'Object editing panel della classe Employee, in cui verrà mostrato nella lista
dei periodi di ferie quello appena inserito. Per salvare le modifiche apportate al dipendente, fai click su Ok. Allo
stesso modo puoi aggiungere quanti periodi di ferie vuoi sia a dipendenti già esistenti nel sistema, sia ai nuovi
dipendenti, contestualmente alla loro creazione. Una volta che avrai terminato di inserire i dati, effettua il logout
dall'applicazione.
9.2. Introduzione alle composizioni singole
La composizione definita nella Sezione 9.1 è caratterizzata da una cardinalità multipla (*). In questa sezione
introduciamo le composizioni caratterizzate da una cardinalità singola (01 o 1) le quali, come spiegheremo, sono
mostrate diversamente nell'applicazione generata.
Arresta il Cloudlet Workforce e apri il Designer per modificare TutorialEngine. Nella classe Employee abbiamo
introdotto quattro attributi che complessivamente servono a rappresentare l'indirizzo di un dipendente. Nella realtà,
un dipendente potrebbe avere sia un indirizzo di casa che un indirizzo di lavoro (quello dell'ufficio). A prima vista
non si capisce a quale dei due si riferisce l'informazione memorizzata nel sistema. Un approccio naïve potrebbe
essere quello di replicare gli attributi dell'indirizzo e distinguere quelli che si riferiscono all'indirizzo di casa
aggiungendo il prefisso home_ al nome (ad esempio home_address), e quelli relativi all'indirizzo dell'ufficio
con il prefisso office_ (ad esempio office_address). Chiaramente questa soluzione non è in grado di
scalare, perché adesso ogni dipendente ha due indirizzi, ma che succede se in futuro nel sistema sarà possibile
rappresentare indirizzi multipli per un dipendente? La soluzione migliore è quella di utilizzare una nuova classe
chiamata Address per rappresentare un indirizzo, e aggiungere una composizione da Employee a Address
e una composizione da Office a Address per rappresentare i due tipi di indirizzo.
Quindi, aggiungi al modello una nuova classe chiamata Address. Sposta gli attributi relativi all'indirizzo
(address, city, zip and country) dalla classe Employee alla classe Address. Per fare questo, basta
trascinare con il mouse ciascuno attributo dalla prima classe sulla seconda e selezionare Move here dal menu
che appare nel momento in cui si rilascia il mouse (in alternativa puoi spostare contemporaneamente tutti e quattro
gli attributi selezionandoli tenendo premuto il tasto Ctrl e trascinandoli tutti con il mouse sulla nuova classe).
Attenzione
Lo spostamento degli attributi comporta l'eliminazione degli stessi dalla classe d'origine. Ciò
implica che, se nei campi relativi a questi attributi sono memorizzati dei dati, questi verranno persi.
Definisci come obbligatori questi attributi nella classe Address. A questo punto, crea una composizione dalla
classe Employee alla classe Address. Rinomina il ruolo in home_address e modifica la cardinalità in 1.
59
Lavorare con le composizioni
Successivamente crea un'ulteriore composizione dalla classe Office alla classe Address impostando come
cardinalità del ruolo 1. Il modello risultante è illustrato in Figura 9.2. Salva le modifiche. Al momento del
salvataggio, l'attributo address della classe Address viene designato come object title per la classe stessa.
Chiudi il Designer per ritornare alla Dashboard.
Figura 9.2. La classe Employee con le classi satellite (cnt.)
Una volta tornato alla Dashboard, vedrai che il database è disallineato. Apri la finestra di dialogo del database. Ci
sono vari problemi di disallineamento del database, alcuni dei queli sono di tipo high severity issues. Per quanto
riguarda le high severity issue (che Livebase non può risolvere automaticamente), il problema nasce dalla presenza
di due composizioni caratterizzate da una cardinalità minima pari 1 che però non è rispettata per nessun record
presente nel database. Ci sono vari modi di risolvere questo problema:
• Rilassare il vincolo: se cambiamo la cardinalità delle due composizioni in 01, allora i dati attualmente presenti
nel database non violeranno più il vincolo.
• Svuotare il database: un database senza record non viola nessun vincolo.
Attenzione
Naturalmente, svuotare il database vuol dire perdere tutti i dati.
Una volta svuotato il database, puoi inserire nuovamente i dati sia manualmente usando l'applicazione generata,
sia usando il database filler.
60
Lavorare con le composizioni
Nella Sezione 8.7 per risolvere le high severity issue abbiamo rilassato il vincolo. In questa sede adottiamo la
seconda opzione e svuotiamo il database. Cambia tab e fai click sul bottone Clear. Anche in seguito a questa
operazione ci saranno degli altri problemi di allineamento del database però di tipo low. Lascia che la piattaforma
li risolva automaticamente. A questo punto avvia Workforce.
Verificare le composizioni singole
Accedi alla homepage di Workforce. Effettua il login e apri Application1, come al solito. Fai click su Open
employees per aprire la Livetable di Employee e prova a creare un nuovo dipendente. A differenza di quanto
visto per la classe Vacation, nel caso della classe Address è come se tutti i suoi campi fossero stati inglobati
nella classe Employee e quindi i campi relativi ai suoi attributi sono aggiunti direttamente al form di Employee.
Questa è una forma di riuso. Ogni volta che c'è l'esigenza di dover duplicare gli attributi tra le classi, bisogna
verificare se non sia più utile spostare questi attributi in una classe a parte e collegarli poi con una composizione.
Fai click su Open offices per aprire la Livetable di Office e prova a creare dei nuovi oggetti ufficio nel sistema.
Osserva come anche in questo caso i campi di Address siano apparsi direttamente nel form di Office. Una
volta terminato la creazione dei nuovi uffici, chiudi l'applicazione ed effettua il logout dal Cloudlet.
9.3. Riepilogo
In questo capitolo abbiamo descritto le composizioni. Nel prossimo, parleremo degli attributi di tipo query (altro
tipo di attributo derivato).
61
Capitolo 10. Attributi derivati definiti
mediante query
Nella Sezione 6.2, abbiamo visto come si possono creare degli attributi di tipo math, definiti sulla base di
un'espressione matematica che può comprendere operatori, funzioni di vario tipo, attributi di qualsiasi altro tipo
(purché presenti nella stessa classe) in cui si vogliono definire, user e system properties. Mediante gli attributi di
tipo query è possibile creare attributi i cui valori dipendono da altri attributi presenti in classi diverse da quelle in
cui vengono definiti, sfruttando le relazioni tra le classi nel modello. Come spiegato brevemente nella Sezione 8.6,
gli attributi di tipo query sono definiti sulla base di una query che estrae il valore di un attributo di una classe
target collegata attraverso un cammino di relazioni. Nel caso la query estragga più valori per l'attributo target (per
via delle cardinalità sulle relazioni attraversate), il modellatore deve definire un operatore di aggregazione che
fornisca il valore dell'attributo derivato a partire dai valori dell'attributo target. Gli attributi di tipo query descritti
nella Sezione 8.6 sono stati definiti automaticamente dall'importer XLS. In questo capitolo ti mostreremo come
creare i tuoi attributi di tipo query.
10.1. Creare attributi di tipo query
Arresta il Cloudlet Workforce e apri il Designer per modificare TutorialEngine. Seleziona il livello Database
nel Designer. Il primo attributo di tipo query che vogliamo definire è quello fornisce il ruolo di un impiegato.
Questa informazione è disponibile nell'attributo title della classe Chief_position, ma vogliamo che appaia
nella classe Employee. Per creare l'attributo di tipo query in Employee, trascina con il mouse title da
Chief_position su Employee. Nel menu che appare una volta rilasciato il mouse, seleziona Link here.
Assegna all'attributo il nome job_title e fai click su OK. Un nuovo attributo apparirà nella classe Employee: /
job_title: string. Mentre, nell'applicazione generata per ogni dipendente apparirà accanto ai campi definiti per
la classe, un nuovo campo chiamato job_title il cui valore sarà uguale a quello dell'oggetto della classe
Chief_position a cui il dipendente è associato.
Creiamo un altro attributo per memorizzare i giorni di ferie che un dipendente ha fatto. Il numero dei giorni relativi
ad un periodo di ferie è disponibile nell'attributo num_days della classe Vacation. Trascina questo attributo
da Vacation su Employee e seleziona nuovamente Link here dal menu che appare quando rilasci il mouse.
Assegna all'attributo il nome vacation_days. Nota che in questo caso nella finestra di dialogo devi selezionare
una funzione di aggregazione. Quando si definisce un attributo di tipo query a partire da un ruolo con cardinalità
superiore a 1, si deve specificare in che modo debbano essere combinati i valori letti dagli oggetti coinvolti in
quel ruolo. Siccome vogliamo tenere traccia del numero totale dei giorni di ferie presi da un dipendente, devi
selezionare dal menu Sum in modo che il valore di vacation_days sia ottenuto sommando tutti i valori di
num_days per ogni oggetto della classe Vacation che è associato al dipendente per cui è definito l'attributo
stesso. una volta fatto click su OK nella classe Employee apparirà l'attributo /vacation_days: integer.
Allo stesso modo possiamo mostrare per ogni dipendente il paese in cui abita. Questa informazione è disponibile
nell'attributo country della calsse Address. Per creare l'attributo di tipo query in Employee, trascina
l'attributo country dalla classe Address sulla classe Employee e seleziona dal menu Link here.
In questo caso il sistema mostrerà due percorsi possibili che collegano la classe Employee alla classe
Address. Il primo percorso è attraverso home_address.country e sfrutta la composizione tra Employee
e Address. Il secondo percorso invece è attraverso offices.address.country e sfrutta il cammino
composto dall'associazione tra Employee e Office e la composizione tra Office e Address. Passando
il mouse su un percorso tutte le classi coinvolte nel percorso verranno evidenziate in rosso. Ciò è molto utile
soprattutto in presenza di percorsi multipli anche complessi. Per definire l'attributo seleziona il percorso attraverso
home_country.address, assegna il nome home_address e fai click su OK.
Possiamo creare un ulteriore attributo per mostrare il paese in cui un dipendente lavora. Siccome un dipendente può
lavorare in più uffici dislocati in paesi diversi, in realtà avremmo a che fare con un insieme di valori per il paese.
62
Attributi derivati definiti mediante query
Allora possiamo pensare di creare un'unica stringa concatenando le stringhe dei vari paesi in cui il dipendente
lavora, separate mediante uno spazio bianco. Trascina l'attributo country dalla classe Address sulla classe
Employee, seleziona dal menu Link here e scegli il percorso via office.address.country. Assegna
a questo attributo il nome work_countries e seleziona Concatenation come funzione di aggregazione.
Infine, creiamo un attributo nella classe Office che mostri il numero di persone che lavorano in un ufficio. Si
tratta di contare il numero degli oggetti della classe Employee che sono associati ad ciascuno oggetto della classe
Office. Per indentificare in maniera univoca gli oggetti di Employee possiamo usare l'attributo relativo alla
piattaforma __id, che deve essere aggiunto alla lista degli attributi della classe. A tale scopo, fai click con il
tasto destro del mouse sull'header della classe Employee e seleziona Add platform attribute+__id.
Successivamente, definisci l'attributo di tipo query nella classe Office. Questa volta usiamo un metodo
alternativo. Fai click con il tasto destro del mouse sull'header della classe Office e seleziona New derived
attribute+Query. Si aprirà la finestra del query expression editor in cui puoi specificare l'espressione per il
calcolo della query, passo dopo passo. Facendo click su employees verranno mostrati tutti gli attributi della classe
Employee. Seleziona __id. Come funzione di aggregazione puoi scegliere indifferentemente sia Count distinct
che Count all. Visto che tutti gli __id sono unici entrambe le funzioni producono lo stesso risultato. Fai click su
OK. Assegna all'attributo il nome headcount. Salva le modifiche nel modello e chiudi il Designer. Il modello
risultante è mostrato in Figura 10.1.
Figura 10.1. La classe Employee con le classi satellite e gli attributi di tipo query
Tornato alla Dashboard, noterai che non ci sono problemi di allineamento del database da risolvere. Questo perché
gli attributi di tipo query sono calcolati nell'applicazione generata. Avvia nuovamente il Cloudlet Workforce.
63
Attributi derivati definiti mediante query
10.2. Riepilogo
Ciò che hai imparato su Livebase finora ti è sufficiente per verificare come vengono mostrati gli attributi di tipo
query nell'applicazione generata. Questo capitolo conclude la seconda parte del tutorial. Nei prossimi capitoli
mostreremo alcune tecniche di modellazione avanzate, a partire dalla possibilità di utilizzare diagrammi multipli
per rappresentare lo schema dei dati.
64
Parte D. Tecniche di
modellazione avanzate
Capitolo 11. Scomporre un modello
esteso in diagrammi multipli
Il modello su cui abbiamo lavorato finora è piuttosto semplice e composto da poche classi. A questo punto
proviamo ad espanderlo in modo da memorizzare più informazioni. Ad esempio, consideriamo i seguenti requisiti.
Vogliamo tener traccia dei visitatori e delle visite presso il nostro ufficio. Inoltre, vogliamo memorizzare nel
sistema anche le informazioni dei dispositivi presenti nell'ufficio (computer e stampanti) e dei loro produttori.
Vogliamo anche tener traccia delle richieste di supporto rappresentando lo stato in cui possono trovarsi, i clienti che
hanno inoltrato la richiesta, ed il prodotto a cui la richiesta si riferisce. Ed infine, vogliamo memorizzare i dettagli
dei prodotti e le loro parti presenti nei magazzini. Per soddisfare questi nuovi requisiti è necessario estendere il
modello con delle nuove classi. In questo capitolo mostreremo come sia possibile disegnare un modello piuttosto
complesso e suddividerlo in più diagrammi al fine di facilitarne la visualizzazione e comprensione.
11.1. Espandere il modello con classi
aggiuntive
Per iniziare, modifichiamo il modello in modo da memorizzare i visitatori e le visite fatte al nostro ufficio.
Per ogni visitatore dobbiamo memorizzare le informazioni personali (nome, cognome, e data di nascita). Invece
di replicare in una nuova classe gli attributi che memorizzano i dati personali che abbiamo già nella classe
Employee (first_name, last_name, date_of_birth), li riusiamo. A tale scopo, crea una nuova
classe chiamata Personal_data. Successivamente, come hai fatto nella Sezione 9.2 sposta gli attributi
first_name, last_name, date_of_birth da Employee a Personal_data. Lo spostamento di questi
attributi comporta la loro eliminazione dalla classe Employee. Di conseguenza, anche i class warning, i filtri, i
vincoli e gli attributi derivati definiti a partire da questi attributi in Employee, saranno comunque eliminati in
cascata. Una finestra di dialogo si aprirà avvisandoti di ciò (Figura 11.1).
Figura 11.1. Avviso di eliminazione di elementi
Puoi aggiungere nuovamente gli attributi derivati (nel nostro caso abbiamo definito soltanto full_name nella
classe Personal_data). Ed infine, crea una composizione da Employee a Personal_data con cardinalità
1 (Figura 11.2).
66
Scomporre un modello esteso in diagrammi multipli
Figura 11.2. Composizione tra la classe Employee e la classe Personal_data
A questo punto per rappresentare i visitatori, crea una classe chiamata Visitor. Per ogni visitatore vogliamo
memorizzare il tipo di documento d'identità presentato ed il numero del documento stesso. Aggiungi alla classe
Visitor due attributi di tipo string identification_type e identification_details. Marcali
entrambi come richiesti. L'attributo identification_type può assumere uno dei seguenti tre valori possibili:
Passport, Driving license, ID card. Per tenere traccia delle informazioni personali di un visitatore
aggiungi una composizione dalla classe Visitor alla classe Personal_data, come hai fatto precedentemente
tra Employee e Personal_data (Figura 11.3).
Figura 11.3. Composizione tra la classe Visitor e la classe Personal_data
Il nostro modello è ancora incompleto. Modifichiamolo per tenere conto dei seguenti requisiti. Innanzitutto, per
ogni visita vogliamo che sia memorizzato il giorno e l'istante di tempo (inizio e fine) in cui la visita è stata
organizzata, ed il motivo per cui è stata organizzata. Una visita viene effettuata presso un ufficio, mentre un ufficio
può essere oggetto di varie visite. Inoltre, ciascun visitatore può effettuare un numero qualunque di visite, mentre
ogni visita riguarda un solo visitatore. Infine, una visita è organizzata da un dipendente che rappresenta il contatto
di riferimento ed un dipendente può organizzare varie visite; ad una visita deve partecipare almeno un dipendente
per ricevere il visitatore, mentre un dipendente può partecipare ad un numero qualsiasi di visite.
Per modellare questi nuovi requisiti, crea una classe Visit e aggiungi gli attributi: date di tipo date,
start e end di tipo time (marcali tutti e tre come richiesti) e purpose di tipo text. A questo punto, crea
un'associazione bidireazionale tra Visit e Office; imposta la cardinalità del ruolo di Visit a 1; rinomina il
ruolo di Office in visits lasciando la sua cardinalità impostata al valore di default * (una visita viene effettuata
presso un ufficio, mentre un ufficio può essere oggetto di varie visite). Successivamente, crea un'altra associazione
bidirezionale tra Visit e Visitor; rinomia il ruolo di Visitor in visits e imposta la sua cardinalità a 1;
lascia invece la cardinalità del ruolo di Visitor impostata al valore di default * (ciascun visitatore può effettuare
un numero qualunque di visite, mentre ogni visita riguarda un solo visitatore).
67
Scomporre un modello esteso in diagrammi multipli
Ora dobbiamo mettere in relazione Visitor e Employee. I requisiti sopra menzionati indicano un doppio
ruolo per un dipendente rispetto ad una visita (partecipante e organizzatore). Per modellare questo fatto, dobbiamo
creare due associazioni bidirezionali tra le due classi. Nella prima associazione tra Employee e Visit,
rinomina il ruolo di Employee in visits_organized_by e lascia come valore per la sua cardinalità quello
di default *; rinomina il ruolo di Visit in responsible_employee ed imposta ad 1 la sua cardinalità
(una visita è organizzata da un dipendente che rappresenta il contatto di riferimento ed un dipendente può
organizzare varie visite). Nella seconda associazione tra Employee e Visit, rinomina il ruolo di Employee
in visits_participated_in e lascia come valore per la sua cardinalità quello di default *; rinomina il
ruolo di Visit in participants ed imposta a 1N la sua cardinalità (ad una visita deve partecipare almeno un
dipendente per ricevere il visitatore, mentre un dipendente può partecipare ad un numero qualsiasi di visite). La
porzione del diagramma risultante da tutte queste modifiche è mostrata in Figura 11.4.
Figura 11.4. La classe Visit con le classi satellite
11.2. Aggiungere nuovi diagrammi
Come abbiamo detto precedemente, vogliamo memorizzare nel sistema anche le informazioni dei dispositivi
presenti nell'ufficio (computer e stampanti) e dei loro produttori. A tale scopo, aggiungi al modello tre ulteriori
classi: Computer, Printer e Manufacturer, connesse tra loro mediante delle associazioni come spiegato
qui di seguito.
Nella classe Manufacturer aggiungi tre attributi per rappresentare il nome del produttore (name), il
nome e l'indirizzo email della persona incaricata di fornire il supporto (support_contact_name e
support_contact_email). Marca tutti e tre gli attributi come richiesti, designa il nome del produttore come
object title, ed imponi su di esso un vincolo di unicità. Per quanto riguarda l'attributo email, per come è stato
definito possiamo inserire un qualunque valore. Ma sappiamo che gli indirizzi email devono rispettare un formato
specifico. Per controllare i valori inseriti nel campo email, restringi il dominio dell'attributo usando la seguente
espressione regolare: [^@]+@[^@]+\.[^@]+1.
1
È consigliato che gli indirizzi email siano validati in modo lasco. Esempi di espressioni per validare in modo stringente indirizzi email sono
disponibili qui.
68
Scomporre un modello esteso in diagrammi multipli
Per quanto riguarda computer e stampanti, imponiamo delle ulteriori specifiche. Ogni dispositivo hardware è
caratterizzato da un indirizzo IP. Invece di aggiungere un attributo apposito per memorizzare questa informazione
nelle classi Computer e Printer, crea una nuova classe chiamata Hardware_address avente un solo
attributo IP_address di tipo string per rappresentare un indirizzo IP. Definisci questo attributo come object
title della classe, marcalo come richiesto ed imponi un vincolo di unicità su di esso. Infine, restringi il dominio dei
valori ammissibili usando la seguente espressione regolare: ^([0-9]{1,3}\.){3}[0-9]{1,3}$2.
A questo punto, crea la classe Printer. Aggiungi un attributo per rappresentare il suo nome (name), definiscilo
come object title, marcalo come richiesto e imponi su di esso un vincolo di unicità. Aggiungi un'associazione
bidirezionale tra Printer e Manufacturer (ogni stampante è prodotta da un solo produttore e un produttore
produce più stampanti), e un'associazione bidirezionale tra Printer e Office (in un ufficio ci possono essere
varie stampanti, e una stampante è posizionata in un solo ufficio).
Crea la classe Computer. Poi aggiungi due associazioni bidirezionali tra Computer e Manufacturer e
tra Computer e Office, impostando le cardinalità dei ruoli con gli stessi valori usati nelle corrispondenti
associazioni con Printer. Successivamente, aggiungi un'altra associazione bidirezionale tra Computer e
Employee impostando opportunamente le cardinalità dei ruoli (un computer è usato al più da un dipendente, e
un dipendente può usare più computer). A questo punto, ritornando alla classe Hardware_address, crea una
composizione da Computer a Hardware_address (ogni computer ha un indirizzo IP) e una composizione
da Printer a Hardware_address (ogni stampante ha un indirizzo IP). La porzione del modello ottenuto in
seguito alle modifiche descritte prima è mostrata in Figura 11.5.
2
Come prima, questa semplice espressione regolare ammette valida alcuni indirizzi IP in realtà non validi. Puoi trovare esempi di pattern
specifici per vari tipi di dati sono disponibili su questo sito Regular-Expressions.info’s examples page.
69
Scomporre un modello esteso in diagrammi multipli
Figura 11.5. Le classi per i dispositivi d'ufficio e Manufacturer
Tutte le classi che abbiamo aggiunto ci consentono di memorizzare le informazioni sui dispositivi hardware del
nostro ufficio. Tuttavia, come avrai notato è difficile visualizzare il modello in maniera chiara e ordinata. In
Livebase è possibile far fronte a questa esigenza utilizzando diagrammi multipli. In alto nella finestra di lavoro
trovi 3 tab: Diagram1, e . Il tab selezionato correntemente è Diagram1: è il diagramma che mostra il modello
che abbiamo costruito finora. Puoi suddividere il modello in vari diagrammi, visualizzando in ciascun diagramma
solo le classi rilevanti per quel diagramma. Ogni diagramma è mostrato in un tab separato.
Fai click con il mouse sul secondo tab
per creare un nuovo diagramma. Assegna il nome Resources e fai
click su OK. Alla finestra di lavoro verrà aggiunto un nuovo tab vuoto chiamato Resources, e sarà correntemente
mostrato nella finestra di lavoro. Se passi nuovamente al tab Diagram1, troverai tutte le tue classi e relazioni ancora
lì. Nel diagramma Resources vogliamo che siano mostrate le classi che rappresentano le risorse del nostro ufficio.
È possibile aggiungere al diagramma le classi in vari modi, come spiegato qui di seguito. Sulla parte sinistra della
finestra del Designer, seleziona il tab Classes. Ti verrà mostrata la lista delle classi presenti nel modello. Per
rendere visibile nel diagramma a Resources la classe Office, trascinala con il mouse dalla lista delle classi nel
diagramma. Nota che viene mostrata solo la classe e non le relazioni in cui essa è coinvolta. Piuttosto apparirà
attaccata alla classe una linea con un punto nero alla fine. Questo è un indicatore che la classe ha delle relazioni
che non sono mostrate nel diagramma. Se fai click con il tasto destro del mouse sul punto nero apparirà un menu
con la lista delle relazioni (per ogni relazione è mostrato il nome del ruolo e il nome della classe). Seleziona da
questo menu la voce printer_ --> Printer. Una versione trasparente della classe Printer apparirà sotto
il cursore del mouse. Posiziona il cursore nel punto del diagramma dove vuoi posizionare la classe e fai click
con il mouse. La classe Printer e l'associazione con Office verranno mostrate nel diagramma. Se adesso
70
Scomporre un modello esteso in diagrammi multipli
ritorni al diagramma Diagram1 vedrai che le classi e l'associazione sono ancora visibili in esso. Ciò vuol dire
che tutti i diagrammi in un modello fanno riferimento agli stessi dati. Essi fornisco semplicemente delle viste
del modello facilitandone la gestione. Come hai fatto precedentemente per visualizzare l'associazione printer
--> Printer, fai la stessa cosa per le associazioni computer_ --> Computer e employees -->
Employee. Una volta che verranno mostrate nel diagramma entrambe le classi Computer e Employee, anche
le associazioni tra esse verranno mostrate automaticamente.
Suggerimento
Puoi nascondere nel diagramma classi e relazioni facendo click con il tasto destro del mouse
e selezionando Hide dal menu. In alternativa, puoi nascondere le classi semplicemente
selezionandole e premendo il tasto Delete (purché vi sia almeno un diagramma in cui le classi
compaiono).
Per rendere la classe Manufacturer visibile, puoi selezionarla sia dalle relazioni con Printer o
con Computer, oppure trascinandola nel diagramma dalla lista Classes. Fai la stessa cosa per la classe
Hardware_address. Osserva per un momento il diagramma Resources (Figura 11.6). In esso sono mostrate
esattamente le classi che sono rilevanti per la gestione delle risorse hardware del nostro ufficio e nulla più. In questo
modo dunque siamo stati in grado di restringere la vista solo sulle parti del modello a cui siamo effettivamente
interessati.
Figura 11.6. Il diagramma Resources
Estendiamo ulteriormente il modello in modo da memorizzare anche le richieste di supporto. Dobbiamo introdurre
delle nuove classi per rappresentare i clienti, le richieste di supporto (ed ogni stato in cui possono trovarsi), ed
71
Scomporre un modello esteso in diagrammi multipli
i prodotti. Crea un altro diagramma chiamato Support per tutte queste classi. In questo diagramma, crea la
classe Customer per rappresentare i clienti. Invece di aggiungere degli attributi alla classe per memorizzare
le informazioni personali dei clienti, riusiamo la classe Personal_data. Mostra nel diagramma la classe
Personal_data facendo click con il tasto destro del mouse nel punto desiderato e selezionando dal menu Show
hidden class → Personal_data, e aggiungi una composizione da Customer a Personal_data
(imposta la cardinalità a 1). Le informazioni personali sono l'unica cosa che ci interessa sapere dei clienti.
Successivamente, aggiungi una nuova classa chiamata Support_request che servirà per rappresentare le
richieste di supporto pervenute al nostro ufficio. Non c'è bisogno di aggiungere alcun attributo a questa classe.
Piuttosto crea una composizione da Customer a Support_request (questa volta impostando la cardinalità
a * in quanto vogliamo che per ogni clienti siano memorizzate tutte le sue richieste di supporto), e un'associazione
bidirezionale tra Support_request e Employee (una richiesta di supporto sarà presa in carico da al più
un dipendente e un dipendente potrà gestire più richieste di supporto). Ovviamente per aggiungere quest'ultima
associazione devi rendere visibile la classe Employee nel diagramma.
Per memorizzare lo stato della richiesta di supporto, crea una classe Support_request_status con un
attributo chiamato label di tipo string (marcalo come richiesto e designalo come object title). Aggiungi
un'associazione bidirezionale tra Support_request e Support_request_status (una richiesta di
supporto è in un solo stato ma uno specifico stato può corrispondere a più richieste di supporto). Ed infine
crea un'ulteriore classe chiamata Product per rappresentare i prodotti. Aggiungi un attributo di tipo string
chiamato name, marcalo come richiesto e designalo come object title. Definiamo tra le classi delle associazioni per
modellare i seguenti requisiti: un prodotto può essere coinvolto in un numero qualunque di richieste di supporto; un
prodotto sarà lavorato da al più un dipendente; un prodotto può essere coinvolto in un numero qualunque di visite.
A tale scopo, crea un'associazione bidirezionale tra Product e Support_request, una seconda associazione
bidirezionale tra Product e Employee, ed un'ultima associazione tra Product e Visit. Nota che per creare
l'ultima associazione devi rendere visibile nel diagramma la classe Visit. Setta opportunamente le cardinalità
dei ruoli in modo da soddisfare i requisiti descritti in precedenza. Il diagramma risultante è mostrato in Figura 11.7.
72
Scomporre un modello esteso in diagrammi multipli
Figura 11.7. Il diagramma Support
Introduzione alle composizioni ricorsive
La nostra applicazione sarà utilizzata anche per gestire l'inventario, cioè per memorizzare i dettagli dei prodotti e
le loro parti presenti nei magazzini. Al modello abbiamo già aggiunto la classe Product. Ci mancano le classi
per rappresentare le parti di un prodotto, le sottoparti e i magazzini. Inoltre, abbiamo bisogno di una classe per
rappresentare il fatto che un prodotto è disponibile in una certa quantità presso uno specifico magazzino.
Crea un nuovo diagramma chiamato Products. Crea nel diagramma una nuova classe Product_part con un
solo attributo di tipo string chiamato name (marcalo come richiesto e designalo come object title). Aggiungi
una relazione bidirezioanle tra Product (rendila visibile nel diagramma) e Product_part (una prodotto è
composto da varie parti, mentre una parte fa riferimento ad un unico prodotto). Successivamente, crea una classe
Subpart e copia in essa l'attributo name di tipo string della classe Product_part. Per fare ciò trascina
l'attributo name dalla classe Product_part sulla classe Subpart e seleziona Copy here. Designa questo
attributo come object title di Subpart. Aggiungi un'associazione bidirezionale tra Subpart e Manufacturer
(un produttore produce vari sottoparti e una sottoparte è prodotto da un solo produttore). Ovviamente devi rendere
visibile la classe Manufacturer nel diagramma. In generale, i prodotti sono composti da parti costituite da
sottoparti che a loro volta hanno delle sottoparti, e così via. Il modo migliore per modellare ciò è creare una
composizione da Product_part a Subpart (con cardinalità * ad indicare che una parte è costituita da varie
sottoparti), e poi un'altra composizione da Subpart verso sè stessa (sempre con cardinalità * ad indicare che una
sottoparte è costituita da varie sottoparti). Questa ultima composizione è una composizione ricorsiva.
Crea una nuova classe chiamata Warehouse per rappresentare un magazzino, e definisci una composizione
da Warehouse a Address (ogni magazzino ha un solo indirizzo). Prima di fare ciò, ovviamente, rendi
visibile la classe Address nel diagramma. Per rappresentare il fatto che una parte sia disponibile in una certa
73
Scomporre un modello esteso in diagrammi multipli
quantità, crea un'ulteriore classe chiamata Part_availability caratterizzata da un unico attributo di tipo
integer chiamato quantity (marcalo come richiesto). Quindi, crea una composizione da Product_part a
Part_availability (impostando la cardinalità a *). Successivamente, per rappresentare il fatto che le parti di
un prodotto sono presenti in un vari magazzini definisci un'associazione bidirezionale tra Part_availability
e Warehouse. A questo punto abbiamo tutte le classi necessarie per gestire l'inventario. Il diagramma risultante
è mostrato in Figura 11.8.
Figura 11.8. Il diagramma Products
11.3. Ripulire il diagramma iniziale
I tre diagrammi che abbiamo creato prima sono ragionevolmente compatti. Tuttavia, il diagramma Diagram1 è
rimasto piuttosto disordinato. Bisogna spostare tutto ciò che ha a che fare con le visite in un diagramma a parte. A
tale scopo, crea un diagramma chiamato Visits. Visualizza nel diagramma le seguenti classi: Visit, Visitor,
Employee, Address, Personal_data, Office, Product. Successivamente, nascondi le seguenti
classi in Diagram1: Visit, Visitor, Computer, Printer, Manufacturer, Hardware_address. Il
diagramma Visits ottenuto è mostrato in Figura 11.9.
74
Scomporre un modello esteso in diagrammi multipli
Figura 11.9. Il diagramma Visits
Ed infine, rinomina Diagram1 in Employees facendo click con il tasto destro del mouse e selezionando Rename.
Il diagramma è riportato in Figura 11.10
75
Scomporre un modello esteso in diagrammi multipli
Figura 11.10. Il diagramma Employees
11.4. Riepilogo
In questo capitolo abbiamo mostrato come sia possibile organizzare il modello utilizzando diagrammi multipli.
Nel prossimo capitolo mostreremo come sia possibile personalizzare le applicazioni per diversi gruppi di membri.
76
Capitolo 12. Personalizzazione delle
applicazioni per specifici gruppi di
membri
L'applicazione che abbiamo creato può essere usata da tutti i membri del Cloudlet. Chiunque effettua l'accesso
al Cloudlet vedrà la lista completa dei dipendenti, dei periodi di ferie, le richieste di supporto, i prodotti, ecc. Ai
fini di una separazione delle responsabilità, possiamo partizionare i dati in modo tale che i membri del Cloudlet
accedano solo a quella parte dei dati che è rilevante per loro. Livebase consente di partizionare i dati in tre modi.
In questo capitolo spiegheremo tutti e tre questi modi.
12.1. Partizionamento verticale: abilitare e
disabilitare classi
Con il termine partizionamento verticale s'intende una restrizione dell'accesso per certi utenti a parti di un modello
ottenuta disabilitando classi, attributi e/o ruoli che non sono rilevanti in una specifica applicazione. Gli elementi
del modello vengono disabilitati nell'Application layer usando l'icona
della Palette (selezionata di default una
volta aperto l'Application layer). Facendo click con il mouse sull'elemento del modello da disabilitare, questo
viene colorato in grigio. A seconda di come è costruito il modello, può succedere che la disabilitazione di un
elemento comporti a casacata la disabilitazione di altri elementi nel diagramma. Gli elementi abilitati sono quelli
che rimangono colorati di giallo. Chiaramente, avendo noi diviso il modello in più diagrammi, ciò che viene
disabilitato in un diagramma lo sarà anche negli altri.
Ad esempio, definiamo un'applicazione che riguarda il supporto tecnico. Mediante questa applicazione sarà
possibile accedere a quella porzione di dati che riguarda le richieste di supporto. Arresta il Cloudlet Workforce
se è avviato e apri il suo engine per modificarlo. Apri l'Application layer e seleziona Application1. Rinominala in
Support_manager facendo doppio click su di essa.
Nota
Avrai notato che il ruolo Chief_position.employee è già disabilitato. Ciò è dovuto al fatto
che l'associazione tra la classe Employee e la classe Chief_position è unidirezionale (da
Employee a Chief_position). Infatti, nell'applicazione generata non sarà possibile visionare
i dependenti associati con una posizione speciale. Viceversa, a meno di disabilitare anche il ruolo
Employee.chief_position, sarà possibile visionare la posizione speciale ricoperta da un
dipendente.
La gestione del supporto tecnico comporta l'accesso alle informazioni relative al cliente che fa la richiesta di
supporto, la richiesta di supporto ed il suo stato, i dati del prodotto (ma non le parti, sottoparti, produttore,
disponibilità nei magazzini), i dipendenti coinvolti nelle visite per il prodotto (escluse le informazioni non rilevanti
tipo la data di assunzione, il salario, ecc.) e gli uffici in cui lavorano. Dunque, dobbiamo disabilitare quegli elementi
che non sono rilevanti per l'applicazione in tutti i diagrammi che compongono il nostro modello. A tale scopo, nel
diagramma Employees disabilita la classe Employee. Per disabilitare la classe devi fare click con il mouse (sul
quale compare l'icona ) sul ruolo di sistema della classe stessa. In questo caso, il ruolo di sistema della classe
Employee sarà colorato di grigio. Come ti sarai accorto, anche altri elementi nel diagramma sono diventati grigi.
In particolare, la disabilitazione della classe Employee ha comportato la disabilitazione dei seguenti elementi
nel diagramma.
77
Personalizzazione delle applicazioni per specifici gruppi di membri
• La classe Vacation: siccome la classe Vacation è accessibile soltanto a partire da Employee, questa
viene colorata completamente di grigio; di conseguenza in nessun modo sarà possibile visualizzare i periodi di
ferie degli impiegati nell'applicazione generata.
• Il ruolo Employee.personal_data_: visto che la classe Personal_data è in relazione con altre classi
nel modello che al momento non sono state disabilitate, rimane colorata in giallo; la disabilitazione del ruolo
implica che i dati personali di un dipendente non saranno vibili nell'applicazione generata.
• Il ruolo Employee.areas_of_expertise: l'associazione tra Employee e Area_of_expertise
diventa unidirezionale; ciò vuol dire che non sarà possibile visualizzare le aree di competenza di un dipendente
nell'applicazione generata.
• Il ruolo Employee.chief_position: l'associazione tra Employee e Chief_position è disabilitata
completamente; quindi non sarà più possibile visionare nell'applicazione generata la posizione ricoperta da un
dipedente.
• Il ruolo Employee.offices: l'associazione tra Employee e Office diventa unidirezionale; ciò implica
che nell'applicazione generata non sarà possibile visualizzare gli uffici in cui un dipendente lavora.
• Il ruolo Employee.address: visto che la classe Address è in relazione con altre classi nel modello che al
momento non sono state disabilitate, rimane colorata in giallo; la disabilitazione del ruolo implica che l'indirizzo
di un dipendente non sarà visibile nell'applicazione generata.
Allo stesso modo, disabilita le classi Area_of_expertise, Chief_position, Office. Anche in questo
caso, la disabilitazione delle classi comporterà la disabilitazione di altri elementi nel diagramma. Sempre nella
classe Employee disabilita i seguenti attributi:
• date_hired
• salary
• vacation_days
• home_country
• new_record
Per disabilitare un attributo in una classe basta semplicemente fare click con il mouse su di esso. Quando un
attributo in una classe viene disabilitato, i campi ad esso relativi non verranno mostrati nell'applicazione generata.
Il diagramma Employee modificato è visualizzato in Figura 12.1.
78
Personalizzazione delle applicazioni per specifici gruppi di membri
Figura 12.1. Support_manager: diagramma Employees
Analogamente, nel diagramma Resources disabilita le classi Printer, Computer e Manufacturer
(Figura 12.2).
79
Personalizzazione delle applicazioni per specifici gruppi di membri
Figura 12.2. Support_manager: diagramma Resources
Ed infine nel diagramma Products, disabilita le classi Product_part e Warehouse (Figura 12.3).
80
Personalizzazione delle applicazioni per specifici gruppi di membri
Figura 12.3. Support_manager: diagramma Products
Ora, creiamo un'altra applicazione chiamata Inventory_manager mediante la quale vogliamo gestire i
magazzini e i prodotti presenti in essi. Per creare una nuova applicazione fai click con il tasto destro del mouse
sul Database layer e seleziona New application dal Database menu. Un'applicazione verrà creata
sullo stesso modello dei dati. La gestione dell'inventario richiede che siano accessibili i dati relativi ai prodotti
(con parti e sottoparti) e alla loro disponibilità nei magazzini, ai produttori, e ai magazzini. A tale scopo, nel
diagramma Employees disabilita le classi Employee, Area_of_expertise, Chief_position e Office
(Figura 12.4).
81
Personalizzazione delle applicazioni per specifici gruppi di membri
Figura 12.4. Inventory_manager: diagramma Employees
Nel diagramma Resources disabilita le classi Printer, Computer (Figura 12.5).
82
Personalizzazione delle applicazioni per specifici gruppi di membri
Figura 12.5. Inventory_manager: diagramma Resources
Analogamente nel diagramma Support disabilita le classi Customer e Support_request_status. Inoltre
disabilita il ruolo Product.support_request_. Per fare ciò devi semplicemente fare click con il mouse
sul ruolo stesso (Figura 12.6).
83
Personalizzazione delle applicazioni per specifici gruppi di membri
Figura 12.6. Inventory_manager: diagramma Support
Ed infine nel diagramma Visits disabilita le classi Visit e Visitor (Figura 12.7).
84
Personalizzazione delle applicazioni per specifici gruppi di membri
Figura 12.7. Inventory_manager: diagramma Visits
Crea un'ultima applicazione chiamata Company_manager per gestire i dati relativi ai dipendenti. A tale
scopo nel diagramma Support disabilita le classi Customer, Support_request_status e i due ruoli
Product.support_request_, Employee.support_request_ (Figura 12.8).
85
Personalizzazione delle applicazioni per specifici gruppi di membri
Figura 12.8. Company_manager: diagramma Support
Mentre nel diagramma Products disabilita le classi Product, Product_part, Warehouse, e il ruolo
Manufacturer.subpart_ (Figura 12.9).
86
Personalizzazione delle applicazioni per specifici gruppi di membri
Figura 12.9. Company_manager: diagramma Products
Salva le modifiche nel modello e chiudi il Designer. Avvia il Cloudlet Workforce (non c'è bisogno di riallineare il
database poiché le modifiche sono state fatte a livello applicativo), effettua il login dall'homepage del Cloudlet e
dai un'occhiata alle tre applicazioni create prima. Nota come alcuni dettagli del modello non siano mostrati dalle
applicazioni. Per esempio, Area_of_expertise compare solo in Company_manager, e la classe Employee
può essere acceduta completamente in Company_manager, mentre attraverso le applicazioni Inventory_manager
e Support_manager è visibile nell'ambito delle relazioni con le altre classi ma con alcuni attributi oscurati. Quando
avrai terminato di fare le verifiche, effettua il logout e arresta il Cloudlet Workforce.
12.2. Partizionamento per profilo utente
Ogni membro del Cloudlet può accedere a qualunque delle applicazioni che abbiamo precedentemente creato.
Quindi, così come sono state pensate le applicazioni servono solo ad accedere ad una porzione specifica del
database. Sarebbe più utile poter restringere l'accesso anche in base al profilo utente dei membri del Cloudlet.
A tale scopo creiamo un profilo chiamato Admin per scopi di amministrazione, a cui consentiremo l'accesso a
tutte e tre le applicazioni. Successivamente creiamo tre nuovi profili utente chiamati Support, Inventory e
Company. Consentiamo a ciascun profilo di accedere solo all'applicazione che è rilevante per quel profilo:
• Support accederà all'applicazione Support_manager;
• Inventory accederà all'applicazione Inventory_manager;
• Company accederà all'applicazione Company_manager.
I profili utente sono mostrati nel Profile schema. Per visualizzarli devi fare click con il mouse su UserProfiles ( )
nella lista delle View disponibili sulla sinistra. Ad ogni profilo corrisponde un tab. Un profilo è caratterizzato da
un nome e una descrizione fornita nella parte del tab chiamata Profile description. Attualmente c'è un solo tab
corrispondente al profilo di default chiamato Profile1. Rinomina il profilo facendo click con il tasto destro del
87
Personalizzazione delle applicazioni per specifici gruppi di membri
mouse sul tab corrispondente e selezionando dal menu Rename. Digita come nome Admin e fai click su OK
(alternativamente puoi premere il tasto Enter). Scrivi nella finestra Profile description una breve descrizione del
tipo: Administration profile. Aggiungi un secondo profilo. Per aggiungere un nuovo profilo, fai click
sull'icona ( ). Scrivi il nome Support. Una volta fatto click su OK (o dopo aver premuto Enter) verrà creato un
nuovo tab per il profilo. Aggiungi come descrizione: Profile for support request management. Fai
la stessa cosa per creare gli altri due profili: Inventory avente come descrizione Profile for inventory
management, e Company avente come descrizione Profile for company management (Figura 12.10).
Suggerimento
Per eliminare un profilo dal modello basta semplicemente fare click con il tasto destro del mouse sul
tab del profilo e selezionare nel menu la voce Remove. Alternativamente, puoi fare click sull'icona
che compare a destra su tab del profilo quando passi il mouse.
Nota
Ci deve essere almeno un profilo definito nel Profile Schema. Se ce n'è solo uno, questo non può
essere eliminato.
Figura 12.10. I tab in UserProfiles
Affinché un profilo possa accedere ad una data applicazione è necessario assegnare all'applicazione i grant per
quel profilo. Una volta assegnati i grant questi saranno elencati sotto l'applicazione stessa. Assegna i grant del
profilo Admin alle applicazioni Support_manager, Inventory_manager e Company_manager. Per fare ciò fai
click con il tasto destro del mouse sul nome dell'applicazione Support_manager e seleziona dall'Application
menu la voce Add profile grants e poi Admin. Sotto l'applicazione apparirà Grants for Admin ad
indicare il fatto che utenti con il profilo Admin hanno i permessi sufficienti per accedere all'applicazione. Ripeti
la procedura sia per Inventory_manager che per Company_manager. Successivamente assegna i Grants for
Support all'applicazione Support_manager, Grants for Inventory all'applicazione Inventory_manager e i Grants
for Company all'applicazione Company_manager (Figura 12.11). Salva le modifiche apportate al modello e chiudi
il Designer.
88
Personalizzazione delle applicazioni per specifici gruppi di membri
Suggerimento
Per disabilitare un profilo in un'applicazione devi rimuovere i grant dall'applicazione. Fai click con
i tasto destro del mouse sul grant del profilo da disabilitare e seleziona Remove dal Profile
menu.
Figura 12.11. Grants per i profili utente
Adesso che sono stati definiti i profili utente, proviamo ad aggiungere dei nuovi membri al registro dei membri
del Cloudlet e assegnare loro gli opportuni profili. Una volta tornato alla Dashboard, apri il registro dei membri
di Workforce facendo click con il mouse sull'icona corrispondente. Nella finestra di dialogo, vedrai la lista dei
membri del Cloudlet. Attualmente c'è un solo membro avente come username il tuo (sei tu, appunto). Nella colonna
Profile viene mostrato il profilo assegnato all'utente. Nel tuo caso c'è Profile1 in quanto assegnato di default dalla
piattaforma al tuo account. Ora se provi ad avviare il Cloudlet, al termine della fase di avvio, ti verrà inviato un
messaggio di errore per informati che uno o più membri del Cloudlet hanno dei profili che non sono stati definiti
nel modello e dunque non potranno accedere a nessuna applicazione (Figura 12.12). Ed infatti, se accedi alla
homepage del Cloudlet ed effettui il login, non ti verrà mostrata alcuna applicazione.
Figura 12.12. Messaggio d'errore: profili non definiti nel modello
Nel modello il profilo Profile1 è stato ridenominato in Admin. Devi fare la stessa cosa nel registro dei membri
del Cloudlet. Riapri nuovamente la finestra di dialogo del registro dei membri (non c'è bisogno di arrestare il
89
Personalizzazione delle applicazioni per specifici gruppi di membri
Cloudlet). Seleziona la riga relativa al tuo account facendo click con il mouse in un campo qualunque. Vengono
attivati i bottoni nella parte bassa della finestra. Fai click su Edit per modificare l'utente selezionato. Si apre la
finestra di configurazione del membro del Cloudlet in cui puoi impostare una serie di campi relativi all'utente
(quelli obbligatori sono contrassegnati da un asterisco). Cambia solo il campo Profile, selezionando dal menu a
tendina Admin (alternativamente puoi scrivere direttamente nel campo il nome del profilo da assegnare). Fai click
su OK per chiudere la finestra. di configurazione. Se effettui nuovamente il login dalla homepage del Cloudlet,
verranno mostrate tutte e tre le applicazioni a cui hai accesso.
A questo punto aggiungi un nuovo utente chiamato John Doe il quale si occuperà di gestire le richieste di supporto.
Apri nuovamente la finestra di dialogo dei membri del Cloudlet. Fai click sul bottone Create in basso a sinistra.
Si apre nuovamente la finestra di configurazione. Nel campo Username digita JohnDoe, nel campo Email
digita [email protected], e in Profile seleziona il profilo Support. Una volta terminato fai click su OK per
ritornare alla lista dei membri del Cloudelt. Ripeti la stessa procedura per aggiungere altri due membri: Jane Doe
(JaneDoe, [email protected]) responsabile della gestione dell'inventario con profilo Inventory, e Bob
Miles (BobMiles, [email protected]) responsabile della gestione dei dipendenti con profilo Company.
Accedi nuovamente all'homepage di Workforce. Nota che nel pannello Members dell'homepage sono apparsi oltre
al tuo utente (attualmente online) altri tre utenti, per ciascuno dei quali è indicato il profilo corrispondente.
È possibile aggiungere i membri al Cloudlet direttamente dalla sua homepage. Una volta effettuato il login, fai
click sull'icona nel pannello Administration dell'homepage. Si aprirà la lista dei membri del Cloudlet in formato
tabellare (Figura 12.13). I bottoni Create, Edit, e Delete sulla destra consentono di creare, modificare ed eliminare
un membro nella lista, analogamente a quanto fatto prima dalla Dashboard.
Figura 12.13. Lista dei membri del Cloudlet
12.3. Partizionamento orizzontale: filtrare i
record
Cambia il profilo di Jane Doe a Company. In questo modo avremo due utenti con lo stesso profilo: Jane Doe e
Bob Miles. Supponiamo che Jane faccia parte del team A e che Bob appartenga al team B. Visto che i team di
cui fanno parte sono diversi, vogliamo fare in modo che ciascuno di essi veda solo una parte dei dati attraverso
la stessa applicazione Company_manager. Mediante il partizionamento orizzontale dei dati Livebase consente di
impedire l'accesso ad insiemi di record contenti dati che non rispettano certi criteri. Ovviamente, questo tipo di
90
Personalizzazione delle applicazioni per specifici gruppi di membri
partizionamento può essere utilizzato insieme agli altri due tipi (verticale e per profilo) discussi nella Sezione 12.1
e nella Sezione 12.2, rispettivamente.
Apri l'engine di Workforce per modificarlo. Nel diagramma Employee crea una classe Team con un solo attributo
chiamato name (di tipo string, marcato come richiesto e come object title, sul quale è definito un vincolo di
unicità). Crea un'associazione bidirezionale tra la classe Team e la classe Employee (un dipendente appartiene
ad un team e in un team ci sono vari dipendenti). Ed infine, crea un attributo di tipo query in Employee
chiamato teamName, mediante il percorso team.name. Salva le modifiche nel modello e chiudi il Designer.
Popola il database mediante il filler automatico. Dovrai riallineare prima il database. Se non fosse possibile farlo
automaticamente, ripulisci il database mediante il bottone Clear e poi popolalo usando il filler.
Una volta popolato automaticamente il database, chiudi la finestra di dialogo e avvia Workforce. Effettua il login
e, visto che puoi accedere a Company Manager, avvia questa applicazione. Apri la Livetable di Team e prendi
nota di alcuni nomi di team che sono stati generati automaticamente con il filler. A questo punto effettua il logout
e arresta il Cloudlet.
Apri nuovamente il Designer. Accedi all'Application layer e seleziona l'applicazione Company_manager. Fai click
con il tasto destro del mouse sulla classe Employee e seleziona Set Filters.... Si aprirà la finestra di
gestione dei filtri. Fai click su Add. Digita la seguente espressione: teamName = __User.team. Fai click su
OK per confermare. Un nuovo filtro verrà aggiunto alla lista dei filtri. Lascia selezionata la casella Reject object
creation. In questo modo, non sarà possibile creare oggetti che non soddisfano il filtro di classe. Al contrario,
deselezionando la casella sarà possibile creare nuovi oggetti che non soddisfano il filtro di classe. Fai click su
OK nuovamente per chiudere la finestra di gestione dei filtri. Per ogni associazione in cui la classe Employee è
coinvolta, su tutti i ruoli entranti della classe è apparso un cerchietto nero. Ciò indica appunto la presenza di un
filtro di classe. A questo punto salva le modifiche e chiudi il Designer.
Prima di continuare, modifica la lista dei membri di Workforce. Usando i nomi dei team che ti sei segnato prima,
assegna i membri ad alcuni dei team che hai segnato prima, purchè diversi e setta per tutti i membri (compreso
te stesso) lo stesso profilo (ad esempio Company). Successivamente, avvia Workforce ed effettua il login. Apri
Company Manager. Apri la Livetable di Employee. In essa sono mostrati solo quei dipendenti che appartengono
allo stesso team. Prova a creare un nuovo dipendente e ad assegnarlo ad un team diverso. Livebase non ti consentirà
di specificare nella form del dipendente un team diverso. Infatti se provi a fare click su Ok otterrai un errore.
Dovremmo fare in modo che l'unico team possibile sia quello a cui il membro appartiene. Effettua il logout,
arresta il Cloudlet e apri nuovamente il Designer per modificare l'engine. Seleziona nuovamente l'applicazione
Company_manager. Fai click con il tasto destro del mouse sul ruolo Right-click on the Employee.team_ e
seleziona dal menu Set relation role filters.... Come prima si aprirà la finestra di gestione dei
filtri, anche se senza i comandi specifici per le classi. Aggiungi l'espressione: name = __User.team. Fai click
on OK, e successivamente su OK di nuovo per chiudere le finestra di gestione del filtro. Salva le modifiche nel
modello e chiudi il Designer. Avvia il Cloudlet, effettua il login e apri nuovamente la Livetable di Employee
Livetable. Crea un nuovo dipendente. Nota come tra i team possibili appaia solo quello a cui tu appartieni.
In questo caso, il filtro che abbiamo definito si applica al ruolo e non alla classe. Quindi se apri la Livetable
di Team, vedrai la lista di tutti i team memorizzati nel sistema. Questo comportamento potrebbe non essere
quello desiderato. Dunque, potresti definire un filtro di classe su Team piuttosto che un filtro di ruolo su
Employee.teamName, nello stesso modo in cui abbiamo definito prima il filtro per la classe Employee.
Inoltre, è possibile disabilitare i filtri di classe su dei ruoli specifici.
12.4. Riepilogo
In questo capitolo abbiamo mostrato i tre modi in cui è possibile partizionare dati e membri del Cloudlet. Nel
prossimo capitolo parleremo della localizzazione, cioè della personalizzazione delle etichette dell'applicazione
generata in base alla lingua utilizzata.
91
Parte E. Localizzazione
delle applicazioni generate
Capitolo 13. Localizzazione
dell'applicazione generata
Come avrai notato, Livebase traduce automaticamente le stringhe nel modello in stringhe più intuitive per l'utente
nelle applicazioni finali. Per esempio, Personal_data.date_of_birth diventa Date of birth nella colonna
Personal data. Questa traduzione è realizzata nel Localization layer. Per ogni stringa del modello, nel momento in
cui viene creata, viene generata automaticamente la sua traduzione; è sempre possibile personalizzare la traduzione
generata automaticamente. Le localizzazioni attualmente supportate sono Inglese e Italiano. Il supporto per altre
lingue sarà disponibile nelle release future.
13.1. Personalizzare le stringhe generate
automaticamente
Arresta il Cloudlet Workforce e apri il suo engine per modificarlo. Seleziona l'elemento che indica la lingua
predefinita dalla lista sulla sinistra nella finestra del Designer. Sulla destra apparirà la lista delle classi e delle
applicazioni (Model item) e la localizzazione fornita per ciascun elemento della lista (Localization string).
Puoi anche aggiungere altre localizzazioni al tuo engine. Per farlo, clicca sull'icona Create new localization (
Viene mostrata la lista delle localizzazioni disponibili che ancora non sono stato aggiunte all'engine.
).
Solitamente, le stringhe della localizzazione generate automaticamente sono appropriate. A volte, però è
utile definirle diversamente. Proviamo a fare alcuni cambiamenti. Ad esempio cambia il nome plurale della
classe Part_availability in Parts available. Per fare questo, espandi la vista della classe
Part_availability facendo click sul pallino alla sua sinistra e poi fai doppio click con il mouse sul campo
plural name nella colonna Localization string. Cancella l'etichetta presente nel campo, scrivi Parts available
e premi Enter. Allo stesso modo, per la classe Employee cambia l'etichetta dell'attributo <new_record> in New
record? e l'etichetta del ruolo <product_> in Products worked on; per la classe Hardware_address
cambia l'etichetta dell'attributo IP_address in IP address; per la classe Subpart cambia l'etichetta del ruolo
subpart_Target in Subparts; ed infine per la classe Vacation cambia l'etichetta dell'attributo num_days in
Number of days.
Successivamente, espandi la vista dell'applicazione Company manager, facendo click con il mouse sul pallino alla
sua sinistra. Per ogni elemento della vista cambia l'etichetta come specificato nella seguente tabella:
Tabella 13.1.
Elemento
Stringa di localizzazione
Open class 'Employee'
Manage employees
Open class 'Office'
Manage offices
Open class 'Chief_position'
Manage chief positions
Open class 'Area_of_expertise'
Manage areas of expertise
Open class 'Visitor'
Manage visitors
Open class 'Visit'
Manage visits
Open class 'Printer'
Manage printers
Open class 'Computer'
Manage computers
Open class 'Manufacturer'
Manage manufacturers
93
Localizzazione dell'applicazione generata
A questo punto salva le modifiche nel modello e chiudi il Designer, avvia e accedi a Workforce, e apri
l'applicazione Company manager. Come puoi vedere le etichette sono state cambiate con le nuove che abbiamo
inserito prima. Ricorda che per usare una particolare localizzazione devi effettuare il login con un account
configurato per utilizzare tale lingua.
94
Parte F. Gestire i Cloudlet
Capitolo 14. Lavorare con più
Cloudlet
Finora abbiamo lavorato con un solo Cloudlet. A seconda del piano sottoscritto puoi gestire più Cloudlet nel tuo
account. Avere più Cloudlet può essere utile per vari scopi, come ad esempio per testare le modifiche e confrontare
soluzioni diverse. In questo capitolo mostriamo come lavorare con più Cloudlet.
14.1. Esportare modelli in formato XML
Prima di apportare delle modifiche, salva il tuo lavoro al fine di poterlo recuperare in futuro. Come spiegato
nella Sezione 3.3, puoi archiviare l'engine del tuo Cloudlet nella Libreria. In alternativa, puoi salvare solamente
il modello disegnato per l'engine esportandolo in formato XML. La versione XML dell'engine sarà salvata
localmente in un file in una directory sul file system del tuo computer. In questo modo, se ti sei sbagliato o hai
cambiato idea potrai sempre ritornare alla situazione inziale ripristinando il modello a partire dal file XML. Fai
click sull'engine del Cloudlet per aprire la finestra del Designer. Per esportare il modello correntemente mostrato
nel Designer, seleziona dal menu File la voce Export Xml... ( ). Specifica in quale punto del file system
vuoi salvare il modello e assegna il nome TutorialEngine.xml (l'estensione di default è .xml), e poi fai
click su Save.
Suggerimento
Per esportare il modello in formato XML puoi anche usare la combinazione dei tasti Ctrl+E.
Apri il file TutorialEngine.xml per esaminarne la struttura. Il tag <ENGINE MODEL> è alla radice del
documento XML. Comprende altri tag che descrivono gli elementi del modello. Il tag <DATABASE_SCHEMA>
descrive il modello al Database layer. I suoi sottoelementi descrivono le classi (e i loro attributi), le
associazioni e composizioni (insieme ai ruoli e le cardinalità). Analogamente il tag <APPLICATION_SCHEMA>
descrive l'Application layer (le impostazioni per il layout, gli elementi abilitati, i warning e filtri); il tag
<PROFILE_SCHEMA> descrive il Profile layer (con la lista per ogni profilo di tutti gli elementi su cui il profilo
è abilitato); e il tag <LOCALIZATION_SCHEMA> descrive il Localization layer (insieme a tutte le etichette
per ogni elemento dello schema). Nel momento in cui deciderai di ripristinare il tuo modello, il file XML verrà
interpretato opportunamente dalla piattaforma, senza che tu ti debba preoccupare nè di come il file è stato generato
nè del significato dei vari tag.
14.2. Clonare i Cloudlet
Un modo facile per testare delle modifiche senza toccare i dati esistenti è clonare il Cloudlet ed operare sul Cloudlet
clone. Nel momento in cui viene clonato un Cloudlet, viene creato un nuovo Cloudlet chiamato Cloudlet_Clone,
dove Cloudlet è il nome del Cloudlet originale. Il registro dei membri, l'engine ed il database del Cloudlet
originale vengono copiati nel Cloudlet clone.
A questo punto prova a clonare il Cloudlet Workforce: assicurati che il Cloudlet non sia in esecuzione, poi
apri il menu del Cloudlet facendo click con il mouse sulla freccia accanto a Start e seleziona il comando Clone
(Figura 14.1). Nel momento in cui il Cloudlet viene clonato, un nuovo Cloudlet chiamato Workforce_Clone
viene creato nella Dashboard. In esso saranno copiati il registro dei membri, l'engine ed il database del Cloudlet
Workforce.
96
Lavorare con più Cloudlet
Importante
Workforce_Clone è un Cloudlet a sè stante rispetto a Workforce anche se ha lo stesso registro dei
membri, engine e database. Quindi, qualunque cambiamento effettuato su Workforce_Clone non
si riflette su Workforce.
Figura 14.1. Il comando Clone
14.3. Copiare i singoli componenti
Piuttosto che clonare l'intero Cloudlet, puoi copiarne le singole parti. Per esempio, elimina l'engine da
Workforce_Clone. Poi trascina TutorialEngine da Workforce e rilascialo su Workforce_Clone. L'intero engine
sarà copiato nel secondo Cloudlet. Chiaramente, qualunque problematica di allineamento del database dovrà essere
risolta se il database è incompatibile con l'engine copiato. Analogamente, puoi copiare il registro dei membri e
il database.
14.4. Importare modelli in formato XML
Ripristina il vecchio modello TutorialEngine in Workforce_Clone. Elimina sia l'engine che il database
attualmente presenti nel Cloudlet. Fai click con il mouse sull'icona dell'engine per crearne uno nuovo ed aprire la
finestra del Designer. Per importare il modello TutorialEngine salvato precedentemente, seleziona Import
Xml... ( ) dal menu File. Accedi alla directory in cui hai memorizzato il file sul tuo computer, seleziona il
file TutorialEngine.xml e premi il bottone Open.
Suggerimento
Puoi importare un modello XML anche usando la combinazione dei tasti Ctrl+I.
La piattaforma leggerà il file XML e costruirà il corrispondente modello nell'engine del Cloudlet. Il modello verrà
mostrato nella finestra di lavoro del Designer con tutti i suoi elementi così come li avevi specificati nei vari livelli
(Database, Application, Profile, Localization). Salva le modifiche e chiudi il Designer. Una volta tornato alla
Dashboard puoi creare il database ed estendere il registro dei membri del Cloudlet come al solito.
14.5. Eliminare i Cloudlet
A questo punto possiamo ripulire quanto fatto finora. Elimina Workforce_Clone trascinandolo nell'area del Trash.
97
Lavorare con più Cloudlet
14.6. Riepilogo
In questo capitolo abbiamo mostrato alcune funzionalità che consentono di gestire più Cloudlet. Nel prossimo
capitolo mostreremo come sia possibile esportare/importare il database del Cloudlet.
98
Capitolo 15. Importare ed esportare i
dati del Cloudlet
Nella Sezione 14.2 abbiamo mostrato come clonare un Cloudlet mentre nella Sezione 14.1 abbiamo mostrato
come esportare solo il modello XML. In questo capitolo mostreremo come sia possibile gestire solo il database
del Cloudlet, indipendentemente da tutti gli altri suoi componenti.
15.1. Esportare il database da un Cloudlet
come file SQL
Per comodità, su un Cloudlet vuoto (uno nuovo appena creato oppure uno già esistente ma ripulito opportunamente
cancellando sia l'engine che il database) importa il file Excel Employee.xls che abbiamo già usato in un
capitolo precedente. In questo modo verrà creato un nuovo engine e un database contente 500 oggetti. Fai click
con il mouse sull'icona del database per aprire la sua finestra di dialogo (Figura 15.1). In basso a sinistra trovi il
bottone Download (SQL). Se fai click su di esso ti verrà chiesto di salvare un file localmente sul tuo computer
avente il nome di default Cloudlet_db.sql, dove Cloudlet è il nome del Cloudlet sul quale stai operando.
Se vuoi puoi cambiare questo nome. Facendo click sul bottone Save o premendo Enter il file verrà scaricato nel
punto del file system scelto.
Figura 15.1. Finestra di dialogo del database
Controlla il contenuto del file aprendolo con un editor SQL oppure con un semplice text editor. Come puoi vedere
per ogni tabella ci sono istruzioni SQL per creare la tabella e per popolarla con dei record. Nel file sono anche
presenti una serie di metadati che vengono utilizzati internamente da Livebase. Chiudi il file e ritorna alla finestra
di dialogo del database.
99
Importare ed esportare i dati del Cloudlet
15.2. Popolare il database usando un file SQL
Proviamo adesso a ricaricare nel sistema i dati. Cancella i dati nel database utilizzando il bottone Clear. Una volta
che nel database non ci saranno più oggetti fai click sul bottone Upload.
Importante
È possibile effettuare l'upload dei dati nel database solo quando questo è vuoto. Infatti, se nel
database sono presenti dei dati il bottone Upload sarà disabilitato.
Si apre una finestra di dialogo che ti consente di selezionare il file da caricare nel sistema. Il campo Files of Type
mostra come tipi di dato *.mdb, *.accdb (Microsoft Access Database files) e *.sql, *.txt. Seleziona
*.sql, *.txt. Tra i file mostrati nella finestra seleziona il file SQL che abbiamo esportato prima e premi il
tasto Enter oppure fai click su Open. In alternativa, puoi fare semplicemente doppio-click sul file. I dati specificati
nel file saranno importati nel database. Al termine dell'operazione il database conterrà nuovamente 500 oggetti.
15.3. Esportare i dati nel formato Microsoft
Access Database
Facendo click sulla freccia nera rivolta verso il basso del bottone Download (SQL) si apre un menu a tendina
nel quale ci sono due opzioni: Download (SQL) e Download (MDB). Seleziona la seconda opzione per effettuare
il download del database in formato MDB (Figura 15.2). Anche questa volta ti verrà chiesto di salvare il file in
un punto del file system del tuo computer. Per aprire il file devi usare Microsoft Access. Nota come la struttura
del database sia esattamente la stessa descritta nel file SQL che abbiamo esaminato prima. Analogamente a
quanto fatto precedentemente, puoi ripulire di nuovo il database, importare questo file e verificare che i dati siano
ripristinati correttamente.
Figura 15.2. Opzione Download (MDB)
15.4. Riepilogo
In questo capitolo hai visto come sia possibile importare ed esportare i dati di un Cloudlet in vari formati. Ciò, oltre
alla possibilità di importare ed esportare il modello in formato XML, rappresenta un utile strumento per salvare
localmente (a scopi di backup) i componenti di un Cloudlet.
100
Capitolo 16. Configurare i default di
un Cloudlet
Come spiegato nella prefazione Capitolo 1, Gestire il tuo account, i default dei Cloudlet sono configurazioni
e impostazioni usate per scopi relativi all'amministrazione dei Cloudlet. In questo capitolo descriveremo come
è possibile configurare un singolo Cloudlet usando il comando Configure del menu del Cloudlet (Figura 16.1).
I parametri di configurazione impostati da qui vengono applicati solo allo specifico Cloudlet, a differenza dei
parametri di configurazione impostati dalla pagina Defaults nella sezione My account, che vengono applicati a
ogni Cloudlet creato nel tuo account.
Figura 16.1. Il comando Configure
Ora torna alla Dashboard. Dal menu del Cloudlet Workforce seleziona il comando Configure. Si aprirà una finestra
di configurazione con tre tab: Home, Settings, Mail templates (Figura 16.2). In ogni tab è possibile configurare
i parametri corrispondenti. In particolare, in Home puoi specificare tutte le informazioni che saranno mostrate
nella homepage del Cloudlet; in Settings puoi specificare i parametri generali del Cloudlet; e in Mail templates
puoi definire i template delle email che saranno inviate in automatico a ogni membro del Cloudlet. Impostiamo
i default per ogni categoria.
101
Configurare i default di un Cloudlet
Figura 16.2. La finestra di configurazione dei default
Home
Nel campo Description digita una descrizione per il Cloudlet. Per esempio, puoi scrivere This is the
Workforce Cloudlet created using Livebase. Nel campo Warning and News puoi inserire
notizie e comunicazioni per gli utenti del Cloudlet. Per esempio, supponi di voler informare i membri del Cloudlet
Workforce che hai cambiato le etichette delle applicazioni (come hai fatto nel Capitolo 13). Perciò, puoi scrivere
Changed labels in English. Questa nota sarà mostrata nell'homepage del Cloudlet e vista da ogni
suo membro prima di effettuare il login in Workforce. Nel campo Terms and Conditions digita i termini e le
condizioni in base alle quali i membri usano il Cloudlet. Per esempio, supponi che il Cloudlet Workforce sia stato
installato per l'azienda AcmeStar Inc. per gestire dati interni relativi all'attività dell'azienda stessa. Per segnalare
che solo i membri autorizzati possono accedere e modificare i dati dell'azienda per mezzo delle applicazioni fornite
all'interno del Cloudlet, puoi scrivere: Registration to Workforce allows you to insert,
modify and delete data related to AcmeStar Inc.'s activity only by using
the applications provided with the Cloudlet. Any unauthorized disclosure of
data will be persecuted.
102
Configurare i default di un Cloudlet
Impostazioni
Qui puoi specificare alcune impostazioni generali che si applicano al Cloudlet Workforce, come la lingua, il
formato per data e ora, e il fuso orario. Al momento, l'unica scelta per la lingua è l'inglese, mentre per gli altri
parametri ci sono varie possibilità. Seleziona EEEE, MMMM d, yyyy per il campo Date format. In questo
modo, ogni data nell'applicazione generata sarà scritta in modo simile a Thursday, January 20, 2004.
Poi, imposta Time formata HH:mm in modo da rappresentare valori di tempo in modo simile a 08:55. Infine,
seleziona Europe/Rome come Time zone di riferimento. Considera che la scelta del fuso orario determina il
modo in cui i valori DateTime vengono calcolati e mostrati nell'applicazione generata.
Templates delle email
Qui puoi scrivere i template per le email che verranno inviate automaticamente ai membri del Cloudlet Workforce.
I template di default mostrati nella finestra rappresentano uno schema di base dai cui partire. Personalizziamoli
selezionando Member creation dal menu Template. Ora, scrivi il tuo indirizzo email nel campo From e cambia
il Subject in New Workforce Account. Infine, modifica il testo dell'email aggiungendo la frase finale: The
email address used for your subscription is ${mail} (clicca su ${mail} nella lista dei
marcatori sulla sinistra per inserirlo nel testo). Ora, seleziona Member data recovery dal menu Template.
Cambia semplicemente Livebase Team con Workforce Team.
103
Parte G. Lavorare con Excel
Capitolo 17. Importare Flat e Star
sheet
Nel Capitolo 4 abbiamo spiegato la struttura dei Flat sheet e i requisiti per la loro importazione. Le regole di base
per importare un file XLS sono:
• Un foglio di lavoro per classe
• Una riga per oggetto
• Una colonna per attributo
• Riga di intestazione opzionale in ogni foglio di lavoro
Hai già visto come usare queste regole. Ora estendiamo quanto mostrato.
17.1. Preparazione dell'ambiente di lavoro
Nell'ambito di questo capitolo importeremo vari fogli di lavoro Excel. Se li importassimo in dei Cloudlet già
esistenti potremmo avere dei problemi. Quindi è necessario utilizzare un nuovo Cloudlet da cui partire. Se il profilo
che hai sottoscritto ti consente di gestire più di un Cloudlet, allora creane uno nuovo al fine di utilizzarlo in questa
parte del tutorial. Se invece il tuo profilo ti consente di gestire solo un Cloudlet, esporta il modello in formato XML
(come mostrato nella Sezione 14.1) e esporta il database in formato SQL o MDB (come mostrato nel Capitolo 15)
in modo da poterli ripristinare in seguito. Una volta fatto ciò, elimina dal Cloudlet sia l'engine che il database,
così da partire da un Cloudlet vuoto.
17.2. Importare un semplice Flat sheet
Per cominciare, importa il file Excel Customer.xls. Nel foglio di lavoro sono memorizzati i dati personali
relativi ai clienti. In particolare, ci sono 100 record e cinque colonne: firstname, surname, birthdate,
phone, city. Importando il file nel Cloudlet, verranno creati un semplice engine e un database con 100 oggetti.
Apri il Designer facendo click con il mouse sull'icona dell'engine. Il modello dei dati ottenuto importando il file
è mostrato in Figura 17.1. Come puoi vedere, il modello contiene una sola classe chiamata Customer avente
cinque attributi. Il tipo degli attributi è dedotto automaticamente esaminando i dati nel file.
Figura 17.1. La classe Customer
Aggiungendo al nome di una o più colonne il postfisso (UC) la procedura di importazione provvederà a creare
una Unique Constraint per la classe, che comprenderà tutti e soli gli attributi corrispondenti alle colonne marcate.
Per maggiori informazioni sulle unique constraint fare riferimento alla Sezione 2.1.
105
Importare Flat e Star sheet
17.3. Importare un semplice Star sheet
Nel foglio di lavoro che abbiamo appena importato ci sono molti valori che si ripetono nella colonna city.
Sarebbe meglio se l'informazione sulla città venisse rappresentata mediante una classe separata. A tale scopo,
elimina l'engine ed il database creato prima. Successivamente, importa il file CustomerCity.xls. Questo file
è un esempio di Star sheet. Se lo apri noterai che le prime quattro colonne sono uguali alle prime quattro colonne
del file usato prima, mentre la quinta colonna riporta nell'intestazione City.name al posto di city. La presenza
di un punto per separare City e name, indica che l'attributo name appartiene alla classe City.
Al termine dell'importazione, nel Cloudlet verranno creati un nuovo engine ed il database. Se apri nuovamente
l'engine troverai il modello raffigurato in Figura 17.2. Il modello è formato da due classi (probabilmente è
necessario sistemare meglio le classi per visualizzarle correttamente): una classe City con un unico attributo
name di tipo string, e una classe Customer avente gli altri quattro attributi come prima. Inoltre, tra la classe
Customer e City c'è un'associazione bidirezionale con le cardinalità impostate opportunamente da Livebase.
In generale, Livebase sceglie la cardinalità più debole, per esempio 01 rispetto a 1, * rispetto a 1N, etc. Nel
nostro caso, la cardinalità di Customer è impostata a 01 (un cliente vive in al più una città), e la cardinalità di
City è impostata a * (in una città possono vivere più clienti). Per entrambe le classi i ruoli vengono generati
automaticamente come prima, cioè city_ e customer_. Invece il database questa volta contiene 121 oggetti:
100 oggetti customer e 21 oggetti city.
Figura 17.2. L'associazione fra le classi Customer e City
17.4. Star sheet con ruoli multipli
Quando specifichiamo attributi di altre classi, possiamo aggiungere |rolename nel nome delle colonne per
indicare che il ruolo generato deve avere il nome rolename. In questo modo possiamo ripetere gli attributi per
creare associazioni multiple. Per esempio, apri il file CustomerCity_residence_birthplace.xls. Se
lo confronti con quello usato prima, noterai che ci sono due colonne per la città: City.name|residence e
City.name|birthplace. Elimina di nuovo l'engine e il database creati prima. Successivamente importa il
file.
Come prima, saranno creati un engine e un database. Il modello creato a seguito dell'importazione è mostrato in
Figura 17.3. In questo caso sono state aggiunte due associazioni tra le classi Customer e City (anche in questo
caso potresti aver bisogno di sistemare meglio le classi per visualizzarle correttamente). I ruoli di City sono
chiamati residence e birthplace. Invece i ruoli di Customer hanno dei nomi generati automaticamente
come al solito. Visto che il numero dei clienti e delle città non è cambiato rispetto a quelli riportati nel foglio Excel
utilizzato precedentemente, il database conterrà sempre 121 oggetti: 100 oggetti customer e 21 oggetti city.
106
Importare Flat e Star sheet
Figura 17.3. Le associazioni fra le classi Customer e City
17.5. Create sheet versus Append sheet
La modalità di default dell'operazione di importazione dei file XLS è Create, ed è quella che abbiamo illustrato
finora. Un'altra modalità di importazione, disponibile solo per i Flat sheet, è Append, utilizzabile specificando
il prefisso + nel nome del foglio. Mediante questa modalità è possibile utilizzare i file XLS per aggiungere dati
ad un modello già esistente.
Ad esempio, apri il file Customer_Append.xls. Nota che le colonne riportano gli stessi nomi degli attributi
della classe Customer, ma il foglio di lavoro è chiamato +Customer. Importa questo file nel Cloudlet
mantenendo l'engine e il database creati prima. Al termine dell'importazione, apri il Designer per esaminare
nuovamente l'engine. Come vedi non è cambiato nulla nel modello. Invece, ciò che è cambiato è il numero degli
oggetti nel database. In particolare, visto che nel file che abbiamo importato ci sono 500 customer e nel database
c'erano 121 oggetti, dopo l'importazione del file avremo complessivamente 621 oggetti nel database: 600 oggetti
customer e 21 oggetti city.
17.6. Riepilogo
In questo capitolo abbiamo fatto un breve ripasso sui Flat e Star sheet, e abbiamo anche mostrato la modalità
Append per gli sheet. Nel prossimo capitolo descriveremo i Reference sheet.
107
Capitolo 18. Importare i Reference
sheet
Come abbiamo spiegato nel Capitolo 17, i Flat sheet e gli Star sheet consentono di creare delle classi e popolarle
con dei dati. I Flat sheet possono essere utilizzati anche in modalità Append, così da consentire l'aggiunta di nuovi
record a classi già presenti nel modello. I Reference sheet rappresentano un modo per creare delle nuove classi nel
modello ed eventualmente associarle a quelle già esistenti.
18.1. Struttura di un Reference sheet
I Reference sheet sono una generalizzazione degli Star sheet. La struttura è la stessa con l'unica differenza che il
nome delle colonne che si riferiscono ad attributi appartenenti a classi già esistenti nel modello, è preceduto da un
asterisco (*). Ad esempio *Person.name è il nome della colonna per l'attributo name della classe Person.
In questo modo è possibile distinguere queste colonne da quelle che si riferiscono ad attributi di nuove classi
da aggiungere al modello. L'associazione con le classi già esistenti non deve essere ambigua, nel senso che è
necessario specificare un attributo o un insieme di attributi per i quali è stato definito nel modello un vincolo di
unicità.
La possibilità di associare oggetti con classi già esistenti nel modello è l'unica caratteristica che differenzia
i Reference sheet dagli Star sheet. Dunque, un Reference sheet in cui non si referenziano classi esistenti è
semplicemente uno Star sheet. Nota che, gli attributi referenziati nel foglio di lavoro devono appartenere a delle
classi create nel modello prima dell'importazione del Reference sheet stesso (o mediante l'importazione di un Flat o
Star sheet, oppure usando il Designer). Non puoi referenziare attributi appartenenti a classi create contestualmente
all'importazione del foglio di lavoro. Per esempio, considera di nuovo la colonna *Person.name. In questo caso,
l'attributo name della classe Person può essere referenziato solo nel modello è già presente la classe Person.
18.2. Create Reference sheet versus Append
Reference sheet
Nel modalità Create, i Reference sheet specificano delle nuove classi da aggiungere a quelle esistenti nel
modello, e i dati con cui popolarle. Nella modalità Append, i Reference sheet specificano i dati che devono essere
aggiunti alle classi esistenti nel modello. Nota che in quest'ultimo caso puoi aggiungere dati ad una sola classe per
foglio di lavoro, mentre puoi referenziare un numero qualunque di attributi esterni. Se vuoi aggiungere dati a più
classi, devi creare un foglio di lavoro distinto per ogni classe (o utilizzare file diversi).
18.3. Testare un Reference sheet
Diamo un'occhiata ad un esempio di Reference sheet. Apri il file Sale.xls. Come puoi vedere c'è un foglio
di lavoro chiamato Sale con queste colonne: datetime (di tipo date & time), quantity (di tipo integer),
Product.name (di tipo string), *Customer.firstname (di tipo string, che fa riferimento alla classe
Customer già presente nel modello), *Customer.surname (di tipo string, che fa riferimento alla classe
Customer già presente nel modello), *Customer.birthdate (di tipo string, che fa riferimento alla classe
Customer già presente nel modello). Importando questo foglio di lavoro aggiungeremo due nuove classi al
modello: Sale e Product. Ogni vendita è associata a un prodotto e a un cliente.
Nota che nel foglio di lavoro sono referenziati tre attributi esistenti: Customer.firstname,
Customer.surname e Customer.birthdate. La classe Customer è già presente nel modello. Come
sottolineato prima, possono essere referenziati solo quegli attributi sui quali è imposto un vincolo di unicità. Quindi
108
Importare i Reference sheet
prima di importare il file, devi imporre un vincolo di unicità su tutti e tre gli attributi della classe Customer citati
prima. Per imporre il vincolo apri il Designer. Una volta creato il vincolo, dovrai riallineare il database. Fai click
con il mouse sull'icona del database per risolvere tutte le problematiche di compatibilità che possono essere sorte
a causa delle modifiche apportate sul modello.
Nota
Se non riesci a riallineare il database, elimina sia l'engine che il database e ricomincia
daccapo importando questa volta il file CustomerCity_residence_birthplace.xls
che abbiamo usato nel precedente capitolo. Dovresti ottenere il modello mostrato in Figura 17.3
e un database con 121 oggetti. Apri il Designer e imponi un vincolo di unicità sugli attributi
firstname, surname e birthdate della classe Customer. Risolvi tutte le problematiche
di allineamento del database.
Ora prova ad importare il file Sale.xls. Al termine dell'operazione di importazione apri il Designer facendo
click con il mouse sull'icona dell'engine per ispezionare il modello. Il modello creato è mostrato in Figura 18.1.
Come avrai notato, ci sono due nuove classi Sale e Product che sono state aggiunte al modello, insieme
alle corrispondenti associazioni con la classe Customer. Inoltre, anche il numero degli oggetti nel database è
aumentato.
Figura 18.1. Diagramma ottenuto importando il Reference sheet
109
Capitolo 19. Importare i Relation
sheet
Nel Capitolo 18, abbiamo mostrato come mediante l'uso dei Reference sheet è possibile aggiungere classi e dati
al modello senza sovrascrivere le classi già esistenti. In questo capitolo introduciamo i Relation sheet mediante i
quali è possibile definire delle associazioni tra oggetti.
19.1. Struttura di un Relation sheet
Il nome di un Relation sheet deve rispettare il seguente formato Class1-Class2|rolename, ad esempio
Family-Car|primary. Il rolename può essere omesso se non c'è ambiguità. Le due classi Class1 e
Class2 devono essere presenti nel modello prima dell'importazione del foglio di lavoro e non possono essere
definite come nuove classi nello stesso file XLS.
In un Reference sheet non vengono specificati nuovi attributi bensì vengono referenziati solo quelli che già
sono presenti nel modello. Quindi, l'intestazione di tutte le colonne nel foglio di lavoro deve avere il formato
*Class.attribute. Come per i Reference sheet, nella definizione dell'associazione non ci deve essere
ambiguità (cioè nel modello deve essere imposto un vincolo di unicità su gli attributi referenziati).
19.2. Create Relation sheet versus Append
Relation sheet
Un Relation sheet di tipo Create specifica una nuova associazione tra due classi e mette in relazione tra loro
gli oggetti già esistenti (Create è la modalità di default mode, e quindi può essere omessa). Invece, un Relation
sheet di tipo Append specifica solo le associazioni tra oggetti esistenti, e quindi presuppone che nel modello sia
già definita l'associazione in questione.
19.3. Relation sheet all'opera
Proviamo ad aggiungere un po' di clienti, prodotti e vendite in modo da poterli associare successivamente. Partiamo
da un Cloudlet vuoto, senza engine e database (puoi creare un nuovo Cloudlet se hai risorse sufficienti, oppure
archivia/elimina l'engine costruito precedentemente ed elimina il database). Poi, importa nel Cloudlet questi due
file: CustomerCity_residence_birthplace2.xls e Product2.xls. Dopodiché, apri il Designer e
definisci un vincolo di unicità sull'attributo name della classe Product e sugli attributi firstname, surname
e birthdate della classe Customer. Riallinea il database ed importa il terzo file Sale2.xls. In questo modo
hai costruito un engine e un database con 146 oggetti: 21 oggetti city, 50 oggetti customer, 47 oggetti product e
28 oggetti sale. Se apri il Designer dovresti vedere un modello come quello mostrato in Figura 19.1.
110
Importare i Relation sheet
Figura 19.1. Diagramma Customer-City-Product-Sale
Ora proviamo a definire un'associazione tra Customer e Product per tenere traccia di quali siano i prodotti
preferiti dai clienti. Apri il file CustomerProduct_prefBy2.xls. Questo è un esempio di Relation sheet
di tipo Create che aggiunge un'associazione tra la classe Customer e la classe Product e definisce il ruolo
prefPr di Customer e il ruolo preferredBy di Product, e mette in relazione gli oggetti delle due classi.
Importa il file nel Cloudlet. Una volta che l'importazione sarà terminata vedrai comparire la nuova associazione
nel modello (Figura 19.2). Nota che il numero degli oggetti nel database non è cambiato. Prova ad avviare il
Cloudlet, accedi e dai un'occhiata agli oggetti creati nel database. Fai click su Open product per aprire la Livetable
di Product. Ricerca un prodotto chiamato scissors. Fai doppio click su di esso con il mouse. Si apre l'Object
editing panel relativo all'oggetto selezionato che mostra che il prodotto chiamato scissors è il preferito del
cliente Ben Jobs. Successivamente, apri il file CustomerProduct_prefBy_Append2.xls. Questo file
è un Reference sheet di tipo Append che specifica semplicemente le associazioni tra gli oggetti delle due classi
(Customer e Product) visto che l'associazione tra le due classi è stata precedentemente definita. Importa
questo file nel Cloudlet e vedrai che non verranno apportate modifiche sia all'engine che il database; l'unica
modifica è a livello delle associazioni tra gli oggetti. Avvia il Cloudlet e verifica i cambiamenti. In particolare,
cerca nuovamente il prodotto scissors. In questo caso vedrai che il prodotto è il preferito non solo del cliente
Ben Jobs ma anche di altri tre clienti: Ben Miller, Ben Peterson e David Allan.
111
Importare i Relation sheet
Figura 19.2. Diagramma Customer-City-Product-Sale (cont.)
112
Capitolo 20. Connettersi ad un
Cloudlet via Web
Microsoft Excel permette di importare dati da sorgenti di diverso tipo, incluse pagine HTML scaricate attraverso il
protocollo HTTP. In questo modo è possibile importare i dati gestiti da un Cloudlet all'interno di un foglio Excel,
e tenere aggiornati tale dati in modo automatico. In questo capitolo, basato sulla versione 2010 di Excel, si offre
una panoramica sull'uso di questa funzionalità, che prende il nome di query Web.
Nota
Le immagini e le istruzioni sono relative ad Excel 2010, ma le query Web sono disponibili anche
in versioni antecedenti di Excel.
20.1. Stabilire la connessione
Con Excel 2010, è possibile definire una query Web in pochi semplici passi. Per prima cosa assicurati che il
Cloudlet con il quale vuoi collegarti sia in esecuzione, poi apri Excel, seleziona il foglio sul quale desideri importare
i dati provenienti dal Cloudlet e clicca sulla scheda Dati. In questa tale scheda, all'interno del gruppo Importa
dati esterni, clicca infine sull'icona Da Web: apparirà un browser Web speciale (che è parte di Excel) per
esplorare i dati forniti da fonti Web e per selezionare quali importare.
Figura 20.1. La scheda Dati
Inserisci nel campo indirizzo l'URL di accesso all'interfaccia REST del Cloudlet al quale vuoi collegarti. Questa
URL è composta dalla URL del Cloudlet (visibile sulla Dashboard) seguita dal postfisso /rest.
113
Connettersi ad un Cloudlet via Web
Figura 20.2. La finestra Excel per creare una query Web
Andando sulla Dashboard e cliccando sulla piccola icona spina ( ) che si trova nella intestazione del Cloudlet,
si apre una finestra che spiega come creare connessioni dati verso quel Cloudlet.
Figura 20.3. Il pulsante per ottenere informazioni riguardo all'API REST
Suggerimento
Da questa finestra è possibile selezionare e copiare negli appunti la URL da incollare nel campo
indirizzo del Web browser di Excel.
Una volta digitato (o copiato/incollato) l'URL dell'interfaccia REST del Cloudlet nel campo indirizzo, premi il
tasto Invio per stabilire il collegamento ed inserisci username e password di un membro del Cloudlet.
Suggerimento
Ogni Cloudlet alla creazione comprende di default un membro le cui credenziali (username e
password) sono le stesse usate dallo sviluppatore per accedere al portale Fhoster ed alla Dashboard.
In questo modo lo sviluppatore che crea un Cloudlet può immediatamente accedervi senza dover
creare un membro apposta.
Una volta autenticato con le credenziali di un certo membro, avrai accesso a tutti e soli i dati ai quali quel membro
avrebbe accesso utilizzando la normale interfaccia grafica del Cloudlet.
Il browser interno di Excel mostrerà inizialmente una semplice pagina HTML con il nome del Cloudlet ed i link
dai quali potrai cominciare la navigazione fino a individuare i dati da importare.
Nota
Excel utilizza le impostazioni di Microsoft Internet Explorer (MSIE) per connettersi a Internet.
In caso di problemi, verificare che il Cloudlet sia in esecuzione (stato Running) e che MSIE
consenta di navigare sul Web (provare una URL qualsiasi, ad esempio la home page di Google)
agendo eventualmente sulle proprietà di connessione (ad esempio impostando correttamente le
impostazioni dell’eventuale proxy).
114
Connettersi ad un Cloudlet via Web
20.2. Esplorare i dati
I dati del Cloudlet possono essere visualizzati e navigati utilizzando il browser interno di Excel semplicemente
cliccando i link visualizzati nelle varie pagine, esattamente come quando si navigano normali pagine Web con
un qualsiasi browser Web.
Nota
In funzione dello username utilizzato in fase di autenticazione è possibile che alcune delle pagine
non visualizzino alcun dato o link. In tal caso verificare, nel modello dell’Engine installato nel
Cloudlet, i diritti del profilo associato allo username.
Dalla pagina iniziale (cioè quella visualizzata subito dopo aver inserito username e password) clicca sul link
relativo a una delle applicazioni disponibili per visualizzare la pagina relativa.
La pagina relativa ad una applicazione contiene i link relativi alle classi di primo livello da essa gestite, cioè quelle
che nella interfaccia grafica interattiva compaiono nel menu a sinistra. Clicca sul link relativo a una delle classi
disponibili per visualizzare la pagina relativa.
La pagina relativa ad una classe conterrà la lista degli oggetti accessibili di quella classe, cioè gli oggetti che nella
interfaccia grafica interattiva compaiono in una LiveTable quando si clicca su una delle voci del menu principale
a sinistra. Clicca sul link relativo a uno degli oggetti per visualizzare la pagina relativa.
La pagina relativa ad un oggetto contiene informazioni sull’oggetto, il valore dei suoi attributi accessibili e le
tabelle degli oggetti collegati dalle relazioni di associazione o di composizione accessibili (cioè gli attributi e le
relazioni che compaiono nella maschera che la interfaccia grafica interattiva offre per creare o modificare oggetti
di quella classe).
Quali attributi e relazioni sono effettivamente accessibili nella pagina relativa ad un oggetto di una data classe
in una certa applicazione dipendono dal form layout definito per la classe nella specifica applicazione (come
spiegato in Sezione 6.3). Le colonne visualizzate in ciascuna tabella dipendono dai rispettivi list layout, definiti
come spiegato in Sezione 6.4.
Nella intestazione di ciascuna pagina sono presenti link per tornare ad una delle pagine precedenti (dall’oggetto
alla classe di appartenenza, dalla classe all’applicazione che la gestisce, etc.).
20.3. Selezionare i dati da importare
Il browser interno di Excel, per ciascuna pagina visualizzata, evidenzia i dati che possono essere importati (singoli
valori o tabelle di valori) con delle piccole icone ( ) sulle quali è possibile cliccare per selezionare/deselezionare
i dati relativi.
Selezionando più icone, i rispettivi dati sono importati sul foglio Excel di destinazione separati l’uno dall’altro da
una riga vuota, indipendentemente dalla loro posizione all’interno della pagina visualizzata dal browser Excel. È
anche possibile importare l'intera pagina.
Se preferisci importare dati su fogli Excel differenti, oppure in punti specifici di uno stesso foglio Excel, puoi
farlo definendo query Web distinte.
Volendo ad esempio importare la lista degli oggetti di una certa classe, basta navigare con il browser interno di
Excel sulla pagina relativa a quella classe e cliccare (selezionandola) la piccola icona (
Objects.
115
) relativa alla tabella
Connettersi ad un Cloudlet via Web
20.4. Importare i dati selezionati
Una volta selezionati i dati che ti interessano, clicca su Importa per importare i dati all'interno del tuo foglio di
lavoro.
Excel ti chiederà se vuoi importare i dati in un foglio esistente oppure in un nuovo foglio di lavoro. Una volta
confermato il loro posizionamento, i dati precedentemente selezionati vengono scaricati dal Cloudlet ed inseriti
nel foglio di lavoro in modo da essere disponibili anche in assenza di connessione.
Figura 20.4. Importazione dei dati
Figura 20.5. Posizionamento dei dati da importare
116
Connettersi ad un Cloudlet via Web
È comunque sempre possibile aggiornare i dati importati cliccando sul pulsante Aggiorna tutto del gruppo
Connessioni della scheda Dati. Nel caso in cui il Cloudlet risulti non raggiungibile (ad esempio perché non
in esecuzione, o per mancanza di connessione ad Internet) Excel mostrerà una notifica.
Figura 20.6. Il pulsante Aggiorna tutto
Nota
È sempre possibile modificare manualmente i dati importati, ma Excel sovrascriverà le modifiche in
caso di successivo aggiornamento. Ricorda anche che, se modifichi il modello e rigeneri il Cloudlet,
le query Web che hai definito potrebbero non essere più valide.
20.5. Aggiornare i dati importati in modo
automatico
Ad ogni singola query Web che hai definito corrisponde una connessione HTTP. Per visualizzarle, apri la scheda
Dati di Excel e, nel gruppo Connessioni, clicca sul pulsante Connessioni.
Figura 20.7. Il pulsante Connessioni
Si aprirà una finestra che mostra la lista di tutte le connessioni HTTP del tuo foglio Excel. Per modificare le
proprietà di una specifica connessione basta selezionarla e cliccare sul pulsante Proprietà. Dalla finestra che si
aprirà, è possibile definire molte opzioni utili.
117
Connettersi ad un Cloudlet via Web
Figura 20.8. La finestra per l'aggiunta delle connessioni
Fra le opzioni più utili di una connessione c’è quella di esecuzione automatica della query Web basata su di essa,
e quindi l’aggiornamento automatico dei dati importati da tale query Web. L'esecuzione automatica può essere
configurata per avvenire a intervalli predefiniti e/o in ogni caso a ogni apertura del foglio di lavoro.
Avvertimento
Eliminando una connessione utilizzata da una query Web i dati importati con tale query non
verranno più aggiornati.
20.6. Opzioni di una query Web
È possibile configurare le opzioni di una query Web sia durante la sua definizione, sia modificandola in seguito.
Se vuoi modificare una query Web già definita fai click destro su una cella qualsiasi di quelle importate e scegli
l'opzione Modifica query... dal menu contestuale. Apparirà una finestra per modificare la query Web con
la quale è stato importato il valore presente nella cella selezionata.
Nella finestra che appare, clicca sul pulsante Opzioni... per visualizzare le opzioni disponibili. Da questa finestra
è possibile, ad esempio, disabilitare il riconoscimento automatico delle date.
118
Connettersi ad un Cloudlet via Web
Figura 20.9. La finestra con le opzioni relative a una singola query Web
20.7. Gestire query Web in file separati
Excel permette di gestire una singola query Web in un file distinto. L'estensione che contraddistingue questo tipo
di file è .iqy. È possibile esportare in file distinti le single query Web definite in un foglio di lavoro. Per farlo,
è sufficiente cliccare sulla piccola icona a forma di dischetto posta in alto a destra nella finestra di configurazione
della query Web.
Figura 20.10. Il pulsante per il salvataggio di una query Web
Suggerimento
I file che definiscono le query Web sono salvati in chiaro: è quindi possibile modificarli anche
manualmente con un editor di testo per quanto riguarda le funzionalità più avanzate.
Per importare una query Web salvata in un file nel tuo foglio di lavoro, clicca su Connessioni nel gruppo
Connessioni della scheda Dati. Nella finestra che compare, clicca su Aggiungi... e poi su Sfoglia....
119
Connettersi ad un Cloudlet via Web
Figura 20.11. La finestra per la gestione delle connessioni
120
Parte H. Creare i report
Capitolo 21. Creare un semplice
report tabellare
Un report è un documento stampato che aggrega automaticamente dei dati dal database del Cloudlet e li presenta
in formati differenti. Livebase ti permette di costruire vari tipi di report, come tabellari, a campi incrociati, a torta
e a barre. I report sono stampati in formato PDF. Nota che, a seconda di come i dati nel Cloudlet siano stati alterati,
differenti record possono comparire nel report in momenti differenti. I report sono definiti nel Database layer e
su una singola classe del modello. I parametri e il layout (ovvero il formato) dei report sono configurati tramite
il Designer.
21.1. Costruire il modello
Abbiamo bisogno di dati da cui partire. Comincia con un Cloudlet privo di engine e database (puoi creare
un nuovo Cloudlet, o archiviare/cancellare l'engine che hai costruito in precedenza ed eliminare il database).
Successivamente, importa questi due fogli di lavoro: CustomerCity_residence_birthplace3.xls,
Product3.xls. Dopo di ciò, apri il Designer e definisci un vincolo di unicità sull'attributo name
della classe Product e sugli attributi firstname, surname e birthdate della classe Customer.
Riallinea il database e importa i fogli di lavoro Sale3.xls, CustomerProduct_prefBy3.xls e
CustomerProduct_prefBy_Append3.xls. Osserva un momento il modello. Il modello risultante
(Figura 21.1) è in qualche modo simile a quello ottenuto alla fine del precedente capitolo con qualche piccola
differenza, come ad esempio gli attributi state e country di City, che rappresentano lo stato e la regione
di una città, l'attributo age di Customer che rappresentà l'età di un cliente, e l'attributo price_per_unit di
Product che rappresenta il prezzo in Euro di una singola unità di prodotto. Il database contiene 146 oggetti: 21
oggetti città, 50 oggetti cliente, 47 oggetti prodotto e 28 oggetti vendita. Nel resto di questo capitolo descriveremo
come costruire un semplice report tabellare estraendo i dati dal database ottenuto con l'import dei file Excel. Un
report tabellare è il tipo più semplice di report che è possibile costruire. Le altre tipologie di report che possono
essere generate in Livebase saranno mostrate nei capitoli successivi.
122
Creare un semplice report tabellare
Figura 21.1. Il diagramma Customer-City-Product-Sale
21.2. Configurare il report
Un report tabellare mostra statistiche descrittive (come sum, min, max, avg, ecc.) in un formato tabellare. L'output
del report è organizzato in un formato multiriga e multicolonna, con ogni colonna che corrisponde a una colonna
di una tabella nel database del Cloudlet e ogni riga che corrisponde a un record di una tabella del database.
Il primo passo è quello di specificare i dati che devono essere estratti dal database. Supponiamo di voler mostrare
alcune statistiche sull'età dei clienti (minima, massima e media) oltre all'età di ogni cliente nel nostro insieme di
clienti. Tutte le informazioni di cui abbiamo bisogno sono contenute in Customer, perciò dobbiamo definire
un report su tale classe. Apri il Designer. Ora, fai click con il tasto destro del mouse sull'intestazione della classe
Customer e seleziona New report... dal Class menu. Comparirà una finestra di dialogo contenente i
quattro tipi di report che puoi definire in Livebase:
• Tabular report ( )
• Crosstab report ( )
• Piechart report (
)
• Barchart report ( )
Seleziona Tabular report. Si aprirà il pannello di configurazione del report, nel quale potrai specificarne il formato.
Come puoi vedere in Figura 21.2, il pannello è diviso in due aree. Sulla sinistra è mostrata la classe sulla quale
stai definendo il report (nel nostro caso Customer). Sulla destra ci sono i sottopannelli dove puoi definire il
layout del report.
123
Creare un semplice report tabellare
Figura 21.2. Pannello di configurazione del tabular report
Nel campo Title scrivi Customer's age statistics, mentre nel campo Description scrivi una
semplice descrizione per il documento, ad esempio Document reporting statistics about the
customers' age. Il titolo e la descrizione sono utili sono a fini descrittivi e non sono obbligatori. Saranno
mostrati nell'applicazione generata. Ora è il momento di specificare la colonna della tabella del database che deve
essere mostrata. Vogliamo mostrare il nome proprio, il cognome e l'età dei clienti. Inoltre, vogliamo mostrare
l'età minima, massima e media dei nostri clienti. Ora, nell'area Data columns seleziona l'attributo firstname
dal menu a tendina (dovrebbe essere mostrato di default, siccome firstname è il primo attributo della classe
Customer). Per aggiungere surname, fai click sull'icona . Fai lo stesso per aggiungere age e questa volta
seleziona i flag MIN, MAX, and AVG (siccome vogliamo mostrare statistiche sull'età).
Nota
Per rimuovere un campo dal formato del report, è sufficiente fare click sull'icona
accanto ad esso.
Infine, nell'area Grouping sections seleziona Just one per specificare che sarà stampata solo una tabella contenente
i dati estratti dal database. Nell'area Page options puoi indicare come la tabella sarà mostrata nella pagina. Nello
specifico, puoi scegliere fra due tipi di orientamento: portrait e landscape. Seleziona Portrait. Nota che l'icona
del report tabellare è apparsa nel pannello di navigazione della finestra del Designer sotto il livello database insieme
alle icone delle applicazioni definite per il modello. L'ultimo passo per la definizione del nostro semplice report
e quello di rinominarlo. È veramente semplice. Fai click sull'icona del report e seleziona Rename dal menu del
report. Dai al report il nome CustomerAge. In alternativa, puoi fare doppio click sull'icona del report e scrivere
il nome.
21.3. Stampare il report
Ora che hai completato la definizione del formato del report CustomerAge, salva i cambiamenti e chiudi il
Designer. Una volta tornato alla Dashboard avvia il Cloudlet. Appena il Cloudlet è in esecuzione, accedi alla sua
124
Creare un semplice report tabellare
homepage e autenticati nel Cloudlet. Dopo aver fatto il login, vedrai due tab sulla sinistra: Applications e Reports.
Fai click su Reports per vedere la lista dei report definiti per il Cloudlet (nel nostro caso solo CustomerAge).
Generare il report è veramente semplice. Fai click sull'incona del report. Dopo un paio di secondi, il report verrà
stampato in formato PDF e ti verrà chiesto di salvare il file. Salvalo e aprilo. Vedrai una tabella formattata come
specificato. Le righe della tabella conterranno i dati estratti dal database del Cloudlet, ovvero il nome di battesimo
e il cognome dei clienti del nostro insieme di clienti con la loro età. Nota che le statistiche (min, max e avg) sono
mostrate appena sotto l'intestazione della colonna. Il report generato per questo esempio può essere scaricato da
qui.
21.4. Raggruppare i dati in sezioni multiple
Ora modifichiamo il report CustomerAge. In particolare, vogliamo mostrare le statistiche sull'età dei nostri
clienti, per ogni città di residenza. Per farlo, abbiamo bisogno di conoscere la città di residenza di un cliente.
Questa informazione è ricavata dalla classe City. Arresta il Cloudlet e apri di nuovo il Designer.
Modificare il modello
L'informazione sulla città di residenza di un cliente è già disponibile nella classe Customer grazie all'attributo
di tipo query residence_name creato mediante l'import dei file Excel. Rinominalo in residence_city.
In Figura 21.3 è raffigurato il modello con il percorso usato per l'attributo di tipo query residence_city
evidenziato.
Figura 21.3. Il diagramma Customer-City-Product-Sale modificato
Modificare il report
Ora che abbiamo tutte le informazioni di cui abbiamo bisogno, modifichiamo il report CustomerAge. Fai click
sull'icona del pannello di configurazione del report. Dato che vogliamo dividere i dati dei clienti in tabelle multiple
125
Creare un semplice report tabellare
raggruppate secondo uno specifico attributo dobbiamo spuntare l'opzione Multiple sections, group by nell'area
Grouping sections. Fai click sull'icona
per aggiungere il campo i cui dati devono essere raggruppati. Dato
che vogliamo una tabella per ogni città seleziona residence_city. Ora siccome vogliamo mostrare per ogni
tabella la città di residenza, il numero di clienti residenti in tale città e le statistiche sull'età dei clienti per quella
città, dall'altro menu sulla destra seleziona Show section title, object count and statistics
(Figura 21.4). Salva i cambiamenti e chiudi il Designer. Avvia di nuovo il Cloudlet e genera il report CustomerAge.
Nota come gli stessi dati sui clienti sono stati divisi in 17 aree differenti, una per ogni città nella quale risiedono i
clienti. Come prima, il report generato per questo esempio può essere scaricato da qui.
Figura 21.4. Pannello di configurazione del tabular report modificato
126
Capitolo 22. Creare un report a campi
incrociati
I report a campi incrociati ti permettono di visualizzare informazioni su più dimensioni. Raggruppando gruppi e
record totali è possibile individuare pattern e ottenere risposte a domande di interesse. Come per i report tabellari,
i dati sono visualizzati in tabelle, ma in modo molto più flessibile. Infatti, in un report a campi incrociati, i record
sono raggruppati per righe e per colonne. Nello specifico, in Livebase puoi mostrare i dati secondo al più due livelli
di raggruppamento per le righe e le colonne. Ogni cella in un report a campi incrociati rappresenta un insieme di
record che soddisfano la combinazione di attributi che appaiono nelle intestazioni delle righe e delle colonne. In
questo capitolo descriveremo come creare un report a campi incrociati. Useremo il Cloudlet ottenuto alla fine del
Capitolo 21. Per praticità, in Figura 22.1 è riportato il modello che sarà usato in questo capitolo.
Figura 22.1. Il diagramma Customer-City-Product-Sale modificato
22.1. Modificare il modello
Vogliamo creare un documento che mostri i ricavi medi dalle vendine di prodotti nelle varie città divise per regione
e per paese. I dati sulle vendite sono riportati nella tabella corrispondente alla classe Sale. Tuttavia, avrai notato
che nella classe Sale manca parte delle informazioni di cui abbiamo bisogno per costruire il report (la città, la
regione e lo stato del cliente, il prodotto acquistato e il prezzo totale pagato). Queste informazioni, però, possono
essere derivate dalle classi Sale, Product, City e Customer per mezzo degli attributi derivati (di tipo math
e di tipo query).
127
Creare un report a campi incrociati
Arresta il Cloudlet, se è in esecuzione, e riapri nuovamente il Designer. Le informazioni sul prodotto coinvolto
nell'acquisto sono disponibili in Product. Perciò, trascina l'attributo name da Product e collegalo a Sale
selezionando il percorso product.name. Chiama la l'attributo di query purchased_product (Figura 22.2).
Figura 22.2. purchased_product derivato da Product
Ora abbiamo bisogno di rappresentare il prezzo totale pagato in una vendita. Conosciamo la quantità
di prodotti comprati in una vendita (attributo quantity in Sale) e il prezzo unitario di un prodotto
(attributo price_per_unit in Product). Perciò, trascina price_per_unit da Product e collegalo
a Sale selezionando il percorso product.price_per_unit. Chiama questo attributo di tipo query
product_price_per_unit. Successivamente, crea un nuovo attributo matematico su Sale di nome
total_price_paid usando questa espressione: quantity
*
product_price_per_unit
(Figura 22.3).
Figura 22.3. total_price_paid and product_price_per_unit derivato da
Product
Allo stesso modo, per ottenere la città, la regione e il paese nel quale la vendita ha avuto luogo (ovvero la città, la
regione e il paese dove il cliente risiede), crea i seguenti attributi di tipo query su Sale:
• customer_city trascinando name da City e selezionando il percorso customer.residence.name
(Figura 22.4)
• customer_state
trascinando
state
customer.residence.state (Figura 22.5)
da
• customer_country
trascinando
country
customer.residence.country (Figura 22.6)
128
City
da
City
e
selezionando
e
selezionando
il
percorso
il
percorso
Creare un report a campi incrociati
Figura 22.4. customer_city derivato da City e Customer
129
Creare un report a campi incrociati
Figura 22.5. customer_state derivato da City e Customer
130
Creare un report a campi incrociati
Figura 22.6. customer_country derivato da City e Customer
22.2. Configurare il report
A questo punto abbiamo tutte le informazioni necessarie e possiamo creare un report a campi incrociati. Fai click
con il tasto destro del mouse sull'intestazione di Sale e seleziona New report... dal Class menu. Facendo
click sull'icona del Crosstab report si apre il pannello di configurazione del report a campi incrociati (Figura 22.7).
Nell'area Structure of each crosstab devi selezionare l'intestazione per le colonne e le righe del report a campi
incrociati. Ci sono due tipi d'intestazione: il Master header e il Detail header. Dato che vogliamo che il nome del
paese appaia in alto nella tabella, seleziona come Master header per le colonne l'attributo customer_state.
Raggruppiamo ulteriormente le colonne considerando le città nel paese. Per farlo seleziona come Detail header
per le colonne l'attributo customer_city. Ora, dato che vogliamo visualizzare il prodotto acquistato, seleziona
come Master header per le righe l'attributo purchased_product. Non abbiamo bisogno di specificare ulteriori
sottogruppi per le righe. Perciò, seleziona <none> per il Detail header.
131
Creare un report a campi incrociati
Figura 22.7. Pannello di configurazione del crosstab report
In fine, nell'area Statistics seleziona Average come funzione statistica e total_price_paid come attributo
sul quale calcolare le statistiche. Lascia l'orientamento impostato su Portrait. Puoi scrivere un titolo e una
descrizione nei campi corrispondenti (ad esempio Products' average sales e Document reporting
the average sales revenue for each product, city and state, rispettivamente). Quando
hai fatto, chiama il report ProductAvgSales.
22.3. Stampare una versione preliminare del
report
Una volta completata la definizione del formato del report, salva i cambiamenti e chiudi il Designer. Avvia il
Cloudlet e effettua il login. Se fai click sul tab Report, vedrai una nuova icona che rappresenta il report a campi
incrociati che hai definito prima. Per generarlo, fai click sulla sua icona e attendi la preparazione del file PDF. A
scopo illustrativo, il report generato per questo esempio può essere scaricato da qui.
22.4. Raggruppare i dati per paese
Modifichiamo il report ProductAvgSales. Nello specifico, vogliamo visualizzare dati basati sul paese nel
quale il cliente risiede. Fortunatamente, l'informazione sul paese del cliente è già disponibile in Sale grazie
all'attributo derivato customer_state che abbiamo aggiunto in precedenza. Perciò, dobbiamo solo modificare
il formato del report.
Arresta il Cloudlet e apri nuovamente il Designer. Fai click sull'icona del report ProductAvgSales per aprire
il pannello di configurazione del report. Dato che vogliamo dividere i dati in tabelle multiple raggruppate secondo
il paese del cliente, dobbiamo spuntare l'opzione Multiple sections, group by nell'area Grouping sections. Fai click
132
Creare un report a campi incrociati
sull'icona
per aggiungere il campo i cui dati devono essere raggruppati. Seleziona customer_country
(vogliamo una tabella per ogni paese). Poi, dall'altro menu sulla destra seleziona Show section title,
object count and statistics (vogliamo mostrare per ogni tabella il paese e la regione di residenza, il
numero di tipi di prodotto acquistati dai clienti residenti nel paese, e le statistiche sulle vendite medie di prodotti in
ogni stato e città nell'ambito del paese). Lascia inalterate le altre opzioni e fai click sul pulsante OK (Figura 22.8).
Salva i cambiamenti e chiudi il Designer.
Figura 22.8. Il pannello di configurazione del crosstab report
22.5. Stampare il report
Avvia nuovamente il Cloudlet e genera il report ProductAvgSales. Nota come gli stessi dati sulle vendite medie
dei prodotti sono stati suddivisi in due differenti tabelle, una per ogni paese in cui i nostri clienti risiedono. Come
prima, per scopi illustrativi il report generato per questo esempio può essere scaricato da qui.
133
Capitolo 23. Creare grafici
I grafici presentano dati in formato visuale. Livebase offre due tipi di grafici: i grafici a torta e i grafici a barre. Ogni
tipo di grafico è progettato per comunicare un tipo specifico di informazione. Perciò, la scelta fra i due dipende
da quale informazione vuoi mostrare. In generale, i grafici a torta sono usati quando vuoi mostrare proporzioni
mentre i grafici a barre sono usati quando vuoi comparare valori. Questo capitolo descrive come puoi generare
report grafici in Livebase. Per comodità partiamo dal modello e dai dati che abbiamo costruito finora. Il modello
è raffigurato in Figura 23.1.
Figura 23.1. Il diagramma Customer-City-Product-Sales modificato (continua)
23.1. Rappresentare i dati in un grafico a torta
Siamo interessati a sapere (in percentuale) quanti clienti vivono nelle varie città. In questo caso è molto utile
rappresentare i dati in un grafico a torta. L'informazione sulla città nella quale risiedono i nostri clienti è già
disponibile nella classe Customer (nell'attributo di tipo query residence_city).
In Livebase un grafico a torta è definito come un Piechart report. Fai click destro sull'intestazione di Customer
e seleziona New report... dal Class menu. Facendo click sull'icona del grafico a torta si apre il pannello
di configurazione dei grafici a torta (Figura 23.2). Quando definisci una torta, devi specificare come costruire
le sue fette. Dato che i valori da mostrare nel grafico a torta sono le città, in Structure of each chart seleziona
134
Creare grafici
l'attributo residence_city per l'opzione Slice by. La dimensione di ogni fetta è determinata dal numero totale
di clienti residenti nella città. Per questa ragione, seleziona la funzione Count all per l'opzione Slice of each
size from. Infine, visto che siamo interessati semplicemente alla percentuale di clienti che vivono nella città,
seleziona Percentage size per l'opzione Slice label format. Come Chart width e Chart height spunta l'opzione
Force pie to be circular per configurare Livebase in modo da raffigurare una torta circolare. Nel campo Title puoi
scrivere Customers' distribution by city, mentre nel campo Description puoi scrivere una semplice
descrizione come Document reporting the distribution in percentage of customers
by city. Quando hai fatto, rinomina il report in CustomerDistribution. Salva e chiudi il Designer.
Nota
Puoi dividere i dati in grafici multipli raggruppandoli secondo specifici attributi. Per farlo
devi spuntare l'opzione Multiple charts, group by nell'area Number of charts e aggiungere i
campi rispetto ai quali effettuare il raggruppamento. Ad esempio, puoi raffinare ulteriormente la
distribuzione dei clienti raggruppando i dati secondo l'età dei clienti.
Figura 23.2. Pannello di configurazione del piechart report
Stampare il report
Avvia il Cloudlet e effettua il login. Nel tab Report vedrai una nuova icona che rappresenta il grafico a torta
che abbiamo definito in precedenza. Per generarlo, fai click sull'icona e attendi la preparazione del file PDF. A
fini illustrativi il report generato per questo esempio può essere scaricato da qui. Il grafico a torta è stato creato
recuperando i dati dal database del Cloudlet. Il grafico è diviso il fette. Ad ogni fetta corrisponde a un differente
colore. La percentuale è riferita al numero totale di clienti. Per esempio, la maggiore percentuale dei nostri clienti
vive a Denver (12%) e a Salt Lake City (10%), mentre pochi clienti vivono a Detroit (2%).
135
Creare grafici
23.2. Rappresentare i dati in un grafico a
barre
In questa sezione descriveremo l'ultima tipologia di report che è possibile definire in Livebase: il barchart report.
Come detto in precedenza, il grafico a barre è molto utile per comparare valori. Ad esempio, supponiamo di voler
mostrare per ogni prodotto l'età media dei clienti che lo preferiscono.
Modificare il modello
Per costruire il report, abbiamo bisogno di conoscere qual'è il prodotto preferito di un cliente. Come è possibile
vedere in Figura 23.1, questa informazione non è direttamente disponibile nella classe Customer, ma può
essere derivata dalla classe Product. Perciò, aggiungi un nuovo attributo di tipo query in Customer, di
nome preferred_product: trascina name da Product e collegalo a Customer selezionando il percorso
PrefPr.name (Figura 23.3).
Figura 23.3. preferred_product derivato da Product
Costruire il report
Per creare un Bartchart report, fai click con il tasto destro del mouse sull'intestazione di Customer e seleziona
New report... dal Class menu. Facendo click sull'icona del grafico a barre si apre il pannello di
configurazione per i grafici a barre (Figura 23.4). Il campo da visualizzare sull'asse x è impostato nell'area Show
one set of bars for each value of attribute. Per questo esempio, seleziona preferred_attribute dal menu.
Il valore da visualizzare sull'asse y è l'età media dei clienti. Perciò, in Bars displayed for each set of bars seleziona
prima Average e poi age. Imposta Chart width a 400 px e Chart height a 300 px. Configura Orientation su
Portrait. Quando hai fatto, fai click sul pulsante OK e rinomina il report in PreferredProductAvgAge. Salva
e chiudi il Designer.
136
Creare grafici
Nota
Puoi visualizzare barre aggiuntive nel grafico. Per farlo devi aggiungere altri campi nell'area Bars
displayed for each set of bars facendo click sull'icona
cancellare le barre di troppo.
. Al contrario,fai click sull'icona
per
Figura 23.4. Pannello di configurazione del barchart report
Stampare una versione preliminare del report
Come prima, se avvii il Cloudlet ed effettui il login, nel tab Report vedrai una nuova icona che rappresenta il report
grafico a barre che abbiamo definito in precedenze. Per generarlo, fai click sulla sua icona e attendi la preparazione
del file PDF. A fini illustrativi il report generato per questo esempio può essere scaricato da qui.
Raggruppare i dati per città
È utile dividere le preferenze sui prodotti per città. L'informazione sulla città nella quale il cliente vive è già
disponibile nella classe Customer grazie all'attributo di tipo query residence_city che abbiamo aggiunto in
precedenza. Perciò, dobbiamo solo modificare il formato del report PreferredProductAvgAge. Arresta il Cloudlet e
apri nuovamente il Designer. Fai click sull'icona del report PreferredProductAvgAge per aprire il pannello
di configurazione del report. Dato che vogliamo dividere i dati in grafici multipli raggruppati secondo la città dei
clienti, dobbiamo spuntare l'opzione Multiple charts, group by nell'area Number of charts e aggiungere i campi
secondo i quali effettuare il raggruppamento. Fai click sull'icona per aggiungere il campo residence_city
(vogliamo un grafico a barre per ogni città). Ora, dal menu sulla destra seleziona Show section title,
137
Creare grafici
object count and statistics (vogliamo visualizzare, per ogni grafico, la città di residenza, il nome
dei prodotti e l'età media dei clienti che preferiscono un prodotto). lascia le altre opzioni immutate e fai click sul
pulsante OK (Figura 23.5). Salva i cambiamenti e chiudi il Designer.
Figura 23.5. Pannello di configurazione del barchart report modificato
Stampare il report
Avvia nuovamente il Cloudlet e stampa il report PreferredProductAvgAge. Nota come gli stessi dati sulle
preferenze dei clienti sono stati suddivisi in grafici differenti, uno per ogni città nella quale i clienti risiedono.
Come prima, a fini illustrativi il report generato per questo esempio può essere scaricato da qui.
138
Glossario dei termini
Associazione
Relazione semplice tra due classi.
Vedi anche Relazione.
Attributo
Proprietà di una classe avente un valore specifico per ogni oggetto della classe.
Attributo derivato
Attributo di una classe il cui valore è calcolato a partire dal valore di altri
attributi.
Vedi anche Attributo.
Attributo di tipo math
Attributo il cui valore è calcolato mediante un'espressione matematica
contenente riferimenti ad altri attributi.
Attributo di tipo query
Attributo il cui valore è calcolato in base al valore di un attributo in una classe
correlata.
Vedi anche Attributo, Classe, Relazione, Attributo derivato.
Breadcrumb
Ausilio alla navigazione nell'interfaccia utente dell'applicazione generata.
Consente agli utenti di tenere traccia della loro posizione nell'ambito di
una classe. Il breadcrumb è disposto orizzontalmente nella parte superiore
della Livetable o dell'Object editing panel. Il nome deriva dal sentiero delle
molliche di pane lasciato da Hansel e Gretel nella nota favola.
Cambiamento distruttivo
Cambiamento sul modello che comporta perdita di dati (ad esempio,
eliminazione di un attributo che corrisponde ad un campo nel database
contente dei valori).
Carattere
Sequenza di byte che rappresenta ad esempio una lettera a.
Cardinalità
Numero di oggetti associati con un dato elemento.
Vedi anche Cardinalità di classe.
Cardinalità di classe
Numero di oggetti di una data classe che possono esistere simultaneamente.
Classe
Template per gli oggetti che verranno memorizzati nel database.
Classe parte
Classe contenuta in un'altra classe in una composizione.
Vedi anche Composizione, Classe tutto.
Classe tutto
In una composizione, la classe che contiene l'altra.
Vedi anche Composizione, Classe parte.
Cloudlet
Sistema informativo creato con Livebase che può essere gestito e utilizzato
nel cloud.
Composizione
Relazione tra due classi in cui una classe è considerata come parte dell'altra.
Vedi anche Classe tutto, Classe parte.
Composizione ricorsiva
Caso nel quale una classe è coinvolta in una composizione con se stessa.
Vedi anche Composizione.
Condizione filtro avanzato
Una condizione filtro che consiste in un'espressione arbitraria che ritorna un
valore di tipo boolean.
Condizione filtro di base
Una condizione di filtro che consiste in un campo, un operatore e un valore.
139
Glossario dei termini
Dashboard
Pagina principale di Livebase dove è possibile creare e gestire i Cloudlet.
Designer
È l'ambiente di modellazione di Livebase.
Diagramma
Vista di una specifica sezione di un modello.
Espressione regolare
Schema definito per le stringhe utilizzando una sintassi speciale. Maggiori
informazioni sono disponibili su Regular-Expressions.info e Wikipedia.
Flat sheet
Formato speciale di foglio Excel che rappresenta una singola classe main.
Funzione di aggregazione
Funzione usata per calcolare valori singoli sulla base di valori multipli da
classi correlate, ad esempio sum.
Vedi anche Attributo di tipo query.
High severity issue
Problema di allineamento del database che Livebase non può risolvere
automaticamente.
Identificatore
Nome di una parte di un programma, ad esempio first_name. Può
contenere solo lettere, numeri e underscore. Non può cominciare con un
underscore né contenerne due adiacenti (__).
Libreria
Archivio privato di engine pronti all'uso, mostrato nel riquadro Engines della
Dashboard.
Livetable
Componente interattivo di Livebase che unisce un aspetto familiare a tabella
con un insieme di funzionaità avanzate di business-intelligence (quali ad
esempio aggregazioni multi-livello, statistiche, definizione e applicazione di
filtri, elaborazione e visualizzazione di diagrammi, ecc.).
Low severity issue
Problema di allineamento del database che Livebase può risolvere
automaticamente senza alcuna perdita di dati.
Medium severity issue
Problema di allineamento del database che Livebase può risolvere
automaticamente ma solo con perdita di dati.
Object editing panel
Panello di una applicazione Livebase che consente di inserire in valori per un
oggetto di una classe.
Palette toolbar
Barra degli strumenti del Designer che contiene una serie di bottoni che
corrispondono ad elementi e funzionalità per disegnare un modello.
Partizionamento orizzontale
Restrizione dell'accesso a record (righe) di specifiche tabelle nel database
ottenuta definendo dei filtri sulle corrispondenti classi nell'Application
Schema di un modello.
Vedi anche Partizionamento verticale.
Partizionamento verticale
Restrizione dell'accesso a tabelle e colonne del database ottenuta disabilitando
attributi specifici e classi nell'Application Schema di un modello.
Vedi anche Partizionamento orizzontale.
Reference sheet
Formato speciale di foglio Excel che consente di creare nuove classi nel
modello e associarle a classi già esistenti. È una generalizzazione del formato
Star sheet.
Relation sheet
Formato speciale di foglio Excel che consente di definire associazioni tra
oggetti.
140
Glossario dei termini
Relazione
Relazione definita tra due classi, ad esempio un'associazione bidirezionale.
Vedi anche Classe, Cardinalità.
Restrizione sul dominio
Un insieme di restrizioni sull'insieme dei possibili valori per un attributo, ad
esempio intervallo [ 5 .. 10 ] per un attributo di tipo intero.
Ruolo
Rappresentazione di una classe in un dato contesto, ad esempio in una
relazione con un altra classe.
Vedi anche Classe, Relazione.
Ruolo di sistema
Rappresentazione di una classe nell'ambito del modello nel suo complesso.
Vedi anche Ruolo.
Star sheet
Formato speciale di foglio Excel che rappresenta una singola classe main con
almeno una classe satellite.
Trash
Pannello della Dashboard che viene utilizzato per eliminare gli elementi
(Cloudlet, engine, database).
141