Top Banner
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com - 1 “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide” © Microsoft Press Guida del Programmatore Traduzione in lingua italiana Cap 1 ÷ 6 www.foxitaly.com La presente traduzione a cura del gruppo Foxitaly, ha il solo scopo di aiutare chi desidera avvicinarsi a questo potente ambiente di sviluppo ma conosce poco la lingua inglese. Hanno collaborato: Alessandro Bindi - Alessandro Panighi - Annibale Freda - Dario de Santis - Gian-Carlo Baldarelli - Mirco Lucchini Non si assume nessuna responsabilità per errori e omissioni
128

“Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Sep 20, 2018

Download

Documents

lynguyet
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

1

“Microsoft Visual FoxPro ® 6.0

Programmer’s Guide”

© Microsoft Press

Guida del Programmatore Traduzione in lingua italiana

Cap 1 ÷ 6

www.foxitaly.com

La presente traduzione a cura del gruppo Foxitaly, ha il solo scopo di aiutare chi desidera avvicinarsi a questo potente ambiente di sviluppo ma conosce poco la lingua inglese.

Hanno collaborato: Alessandro Bindi - Alessandro Panighi - Annibale Freda - Dario de Santis - Gian-Carlo Baldarelli - Mirco Lucchini

Non si assume nessuna responsabilità per errori e omissioni

Page 2: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

2

Capitolo 1: Introduzione alla programmazione Traduzione di Alessandro Bindi

In Visual FoxPro, la programmazione di tipo procedurale e quella orientata agli oggetti sono integrate in maniera tale da permettere la realizzazione di applicazioni potenti e allo stesso momento flessibili. Concettualmente si pensa alla tecnica di programmazione come alla possibilità di scrivere una sequenza di istruzioni al fine di ottenere determinati risultati. A livello strutturale, programmare in VisualFoxPro comporta la manipolazione di informazioni memorizzate (in appositi contenitori N.D.T.)

(…)

Questo capitolo comprende:

?? Vantaggi della programmazione ?? I meccanismi della programmazione in VFP ?? Concetti di base ?? Il processo di programmazione ?? Utilizzo di procedure e funzioni definite dall’utente ?? Come procedere

Vantaggi della programmazione

Generalmente, avendo il tempo a disposizione, qualsiasi processo eseguito da un programma può essere replicato manualmente. Per esempio, ammettendo di voler trovare informazioni relative ad uno specifico cliente (ad esempio l’azienda “Ernst Handel “) all’interno di una tabella, è possibile procedere manualmente seguendo la specifica sequenza di istruzioni di seguito riportata.

Ricercare manualmente una informazione all’interno di una tabella

1. Dal menu File, selezionare Open.

2. Dalla finestra Files of type (tipo di file), selezionare Table.

3. Fare doppio click su Customer.dbf che appare nella lista dei files.

4. Dal menu View, selezionare Browse.

5. Sfogliare la tabella fino a trovare la voce “Ernst Handel.” nel campo Company

Utilizzando la tecnica di programmazione, si può ottenere lo stesso risultato componendo all’interno della finestra dei comandi (Command window) le seguenti istruzioni:

USE Customer LOCATE FOR Company = "Ernst Handel" BROWSE

Page 3: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

3

Supponiamo che, dopo aver individuato il record relativo all’azienda cercata, si voglia incrementare, ad esempio, del 3% il valore del massimo importo per ordine.

Incrementare manualmente il valore massimo importo per ordine

1. Spostarsi con il tasto Tab sul campo the max_ord_amt.

2. Moltiplicare il valore presente in max_ord_amt per 1.03 ed introdurre il nuovo risultato nel campo.

Utilizzando la tecnica di programmazione, si può ottenere lo stesso risultato componendo all’interno della finestra dei comandi le seguenti istruzioni:

REPLACE max_ord_amt WITH max_ord_amt * 1.03

Come si vede è relativamente semplice modificare il massimo importo per ordine di un singolo cliente, sia utilizzando la procedura manuale, sia utilizzando la tecnica di programmazione. Supponiamo, però, di dover effettuare la stessa operazione su tutti i clienti. L’esecuzione manuale risulterebbe alquanto laboriosa e fioriera di errori. Scrivendo, invece, un file di programma con le giuste istruzioni, Visual FoxPro sarà in grado di eseguire tutta l’operazione in maniera semplice, veloce e senza errori.

Esempio di programma per l’incremento del valore massimo importo per ordine su tutti i clienti.

Code Comments

USE customer Apre la tabella CUSTOMER.

SCAN Si predispone a scorrere tutta la tabella eseguendo i comandi presenti tra le istruzioni SCAN ed ENDSCAN, per ogni record.

REPLACE max_ord_amt WITH ; max_ord_amt * 1.03

Incrementa il valore del campo massimo importo per ordine di una quantità pari al 3%. (Il punto e virgola (;) a fine riga indica che il commando prosegue alla riga successiva.)

ENDSCAN Fine del ciclo che scandisce I records della tabella.

L’esecuzione di un programma comporta indubbi vantaggi rispetto alla esecuzione di singole istruzioni digitate all’interno della Finestra dei comandi ad esempio:

?? I programmi possono essere modificati e rieseguiti a piacimento. ?? Si può lanciare un programma dalla barra dei menu, da una maschera (form) o da una barra

di strumenti (toolbar). ?? Un programma può, a sua vo lta, lanciare l’esecuzione di un altro programma.

Le sezioni seguenti spiegheranno in dettaglio i meccanismi, i concetti ed i processi rispetto a questo e ad altri programmi scritti in Visual FoxPro.

Page 4: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

4

Il meccanismo di programmazione di Visual FoxPro

E’ possibile programmare in Visual FoxPro scrivendo codice, istruzioni sotto forma di comandi, funzioni, od operatori che VFP sia in grado di interpretare. Queste istruzioni possono essere inserite direttamente in:

?? Finestra dei comandi (Command window). ?? Files di programma. ?? Nelle finestre relative al codice da associare agli Eventi (Event) o ai metodi (method)

all’interno del Form Designer o del Class Designer. ?? Nella finestra del Menu Designer. dedicata alla scrittura del codice. ?? Nella finestra del Report Designer. dedicata alla scrittura del codice.

Utilizzare la finestra dei comandi (Command Window)

E’ possibile eseguire una istruzione di Visual FoxPro scrivendola all’interno della finestra dei comandi e premendo il tasto INVIO (ENTER). Per rieseguire un comando già dato è sufficiente spostarsi con il cursore sulla linea relativa e premere nuovamente il tasto INVIO (ENTER).

E’ persino possibile eseguire dalla finestra dei comandi più di una linea di codice alla volta

Eseguire più linee di codice all’interno della finestra dei comandi

1. Selezionare le linee del codice che si intende eseguire.

2. Premere INVIO (ENTER) o selezionare la voce Execute Selection dal menu dei comandi rapidi (shortcut menu).

Poiché la finestra dei comandi è una finestra di scrittura (editing window), è possibile modificare le istruzioni digitate, utilizzando le utility di scrittura (editing tools) disponibili all’interno dell’ambiente di sviluppo. E’ possibile quindi modificare, inserire, cancellare, tagliare, copiare o spostare del testo digitato all’interno della finestra dei comandi.

Il vantaggio principale che si ottiene dalla imputazione delle istruzioni all’interno della finestra dei comandi è che le istruzioni vengono eseguite immediatamente, senza la necessità di salvarle all’interno di un file di testo e di eseguirlo come programma.

Inoltre tutte le istruzioni date per mezzo dei menu e delle finestre di dialogo (dialog boxes) vengono riportate in chiaro all’interno della finestra dei comandi come se le avessimo scritte per esteso. Naturalmente è possibile copiare queste istruzioni all’interno dei programmi di Visual FoxPro che, eseguiti ripetutamente, rendono semplice e veloce l’esecuzione di migliaia di istruzioni per moltissime volte.

Creare i programmi

Un programma di Visual FoxPro non è altro che un file di testo contenente una serie di istruzioni. E’ possibile creare un programma in Visual FoxPro utilizzando uno dei seguenti metodi:

Per creare un programma

Page 5: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

5

1. In Project Manager, selezionare la voce Programs presente all’interno della sottovoce (tab) Code .

2. Scegliere New.

-oppure-

1. Dal menu File, selezionare la voce New.

2. All’interno della finestra di dialogo, selezionare Program.

3. Scegliere New File.

-oppure-

?? All’interno della finestra dei comandi scrivere: ?? MODIFY COMMAND

Visual FoxPro aprirà una nuova finestra di scrittura chiamata Program1, all’interno della quale sarà possibile scrivere il nuovo programma.

Il salvataggio di un programma

Una volta scritto un programma, bisogna essere sicuri di salvarlo.

Per salvare un programma

?? Dal menu File, scegliere Save.

Nel caso si cerchi di chiudere una finestra contenente un programma non salvato, apparirà puntualmente una piccola finestra di dialogo che chiederà di salvare o scartare le modifiche effettuate.

Un programma creato utilizzando Project Manager verrà salvato e, automaticamente, aggiunto al progetto in corso.

Nel caso in cui si cerchi di salvare un programma al quale non è stato assegnato un nome, verrà automaticamente aperta una finestra di dialogo del tipo “Salva con nome” in maniera da poterne specificare il nome. Una volta salvato il programma, sarà possibile eseguirlo o modificarlo successivamente.

Eseguire modifiche ad un programma

Come detto, una volta salvato, sarà possibile apportare modifiche al programma procedendo come di seguito:

Aprire il programma

?? Nel caso in cui il programma sia contenuto all’interno di un progetto, occorrerà selezionarlo all’interno del Project Manager e scegliere l’opzione Modify.

Page 6: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

6

-oppure-

?? Dal menù File, selezionare Open, apparirà all’interno di una finestra di dialogo l’elenco dei files disponibili. Scegliendo Program dalla lista dei tipi di file, sarà possibile selezionare il programma da modificare cliccando su Open.

-oppure-

?? Scrivere nella finestra dei comandi il nome del programma da modificare digitando:

MODIFY COMMAND myprogrm

-oppure-

?? Digitare nella finestra dei comandi

MODIFY COMMAND ?

Apparirà all’interno di una finestra di dialogo l’elenco dei files disponibili dai quali si potrà scegliere quello desiderato ed aprirlo cliccando su Open.

Una volta aperto il file di programma sarà possibile modificarlo. Una volta terminate le modifiche si potrà provvedere al successivo salvataggio.

Eseguire un programma

Una volta creato il programma è possibile mandarlo in esecuzione.

Per eseguire un programma

?? Nel caso in cui il programma sia contenuto all’interno di un progetto, occorrerà selezionarlo all’interno del Project Manager e scegliere l’opzione Run.

-oppure-

?? Dal menu Program, scegliere Do. Dall’elenco dei programmi disponibili, selezionare quello desiderato e cliccare su Do.

-oppure-

?? Dalla finestra dei comandi, digitare DO seguito dal nome del file di programma che si intende lanciare in esecuzione:

DO myprogram

Scrivere Codice per mezzo dei Design Tools di Visual FoxPro

Il Form Designer, Class Designer, ed il Menu Designer permettono di integrare facilmente il codice di programma con l’interfaccia utente, in maniera tale da rispondere alle azioni dell’utente con le corrette procedure. Il Report Designer permette, invece, di realizzare delle stampe ( report ) complesse e personalizzabili, potendo anche integrare del codice all’interno del file di report..

Page 7: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

7

Al fine di sfruttare appieno la potenza di Visual FoxPro, è sempre raccomandabile utilizzare i design tools. Per ottenere maggiori informazioni sul Report Designer, consultare il Capitolo 7, Designing Reports and Labels, della Guida Utente. Per maggiori informazioni sul Class Designer, consultare il Capitolor 3, Object Oriented Programming, di questa guida. Per maggiori informazioni sul Form Designer, consultare il Capitolo 9, Creating Form, mentre per ciò che concerne il Menu Designer, è raccomandata la lettura del Capitolo 11, Designing Menus and Toolbars.

I concetti di base della programmazione

Quando si programma non si fa altro che creare dati e manipolarli attraverso una seri di istruzioni. I dati ed i loro contenitori sono il materiale grezzo del programmatore. Gli strumenti che servono per manipolare questo materiale grezzo sono i comandi, le funzioni e gli operatori.

Immagazzinare i dati

I dati sui quali si lavora probabilmente contengono quantità in tempo, denaro e voci contabili, come probabilmente date, nomi, descrizioni, eccetera. Ogni porzione di dati è di un determinato tipo, ovvero appartiene ad una categoria che offre la possibilità di manipolarli in modo similare.

Naturalmente è sempre possibile lavorare direttamente con questi dati senza memorizzarli, ma così facendo si perderebbe la maggior parte della flessibilità e della potenza di Visual FoxPro; Visual FoxPro, infatti, fornisce numerosi tipi di contenitori per i dati, così da semplificarne la gestione.

Le varie tipologie di dati sono determinanti per come poi andremo a gestirli ed immagazzinarli. E’ infatti possibile eseguire la moltiplicazione tra due numeri, ma non si possono moltiplicare tra loro due caratteri. Si possono stampare caratteri in maiuscolo, ma non si possono stampare in maiuscolo dei numeri !

Le più importanti categorie di dati che Visual FoxPro è in grado di gestire sono elencati nella seguente tabella:

Categorie di dati

Tipo Esempi

Numerico 123 3.1415 – 7

Carattere “Stringa di testo” “123” “01/01/98”

Logico .T. .F.

Data

DataTempo

{^1998-01-01}

{^1998-01-01 12:30:00 p}

Page 8: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

8

Contenitori

I contenitori permettono di eseguire le stesse operazioni su diverse porzioni di dati. Ad esempio è possibile eseguire la somma di tutte le ore lavorate da un impiegato, moltiplicarle per la paga oraria e, dedotte le tasse, determinare lo stipendio percepito. E’ possibile eseguire questo calcolo per ogni impiegato ed ogni mese di paga. Memorizzando questa informazione in un apposito contenitore, ed eseguendo direttamente le operazioni su tale contenitore, saremo in grado di sostituire automaticamente i vecchi valori con i nuovi ogni volta che il programma rieseguirà il calcolo.

Le più importanti categorie di contenitori di dati che Visual FoxPro è in grado di gestire sono elencati nella seguente tabella:

Tipo Descrizione

Variabile Singoli elementi di dati contenuti nella memoria RAM (Random Access Memory) del calcolatore.

Tabella Record Righe contenenti campi, ognuno dei quali può immagazzinare una predefinita quantità di dati. Le tabelle vengono salvate su disco.

Matrici (Array) Elementi multipli di dati contenuti nella memoria RAM del calcolatore.

Manipolare i dati

Contenitori e categorie rappresentano, insieme agli operatori alle funzioni ed ai comandi, i mattoni necessari per la manipolazione dei dati.

Utilizzare gli Operatori

Gli operatori legano i dati l’uno all’altro. Di seguito vengono elencati gli operatori più comunemente utilizzati in Visual FoxPro.

Operatore Categorie di dati utilizzati

Esempio Risultato

= Tutte ? n = 7 Stampa .T. se il valore memorizzato nella variabile n vale 7, altrimenti stampa .F.

+ Numeric, Character, Date, DateTime

? "Fox" + "Pro" Stampa “FoxPro”

! o NOT Logical ? !.T. Stampa .F.

*, / Numeric ? 5 * 5 ? 25 / 5

Stampa 25 Stampa 5

Page 9: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

9

Note L’inserimento di un punto interrogativo (?) davanti ad una espressione, provoca la stampa del risultato della espressione all’interno della finestra correntemente attiva (usualmente la finestra principale di Visual Foxpo) preceduta da un carattere di ritorno a capo (CR).

Occorre tener presente che è necessario, con ogni operatore, utilizzare sempre lo stesso tipo di dati. I seguenti comandi immettono due valori numerici all’interno di due variabili. In questo esempio, alle variabili sono stati assegnati nomi che iniziano con la lettera ‘n’, in maniera tale da capire immediatamente che il loro contenuto è di tipo numerico, anche se naturalmente è possibile definirle con qualsiasi combinazione di caratteri alfanumerici o caratteri di sottolineatura (underscore).

nFirst = 123 nSecond = 45

In quest’altro caso, invece, vediamo come inserire all’interno di variabili dei valori di tipo carattere. Alle variabili sono stati assegnati nomi che iniziano con la lettera ‘c’, in maniera tale da capire immediatamente che il loro contenuto è di tipo carattere.

cSecond = "45"

Le seguenti due operazioni, addizione e concatenazione, forniranno risultati diversi, proprio a causa del diverso tipo di variabili utilizzate.

? nFirst + nSecond ? cFirst + cSecond

Risultato

168 12345

Dal momento che la variabile cFirst è di tipo carattere, mentre nSecond è di tipo numerico, otterremo un errore di tipo mismatch (accoppiamento non valido) se si tentasse la seguente operazione:

? cFirst + nSecond

E’ possibile aggirare questo problema utilizzando le funzioni di conversione. Per esempio, la funzione STR( ) convertirà in stringa di caratteri un dato numero, mentre la funzione VAL( ) restituirà il valore numerico equivalente ad una stringa di caratteri contenente numeri. Queste funzioni, insieme alla LTRIM( ), che rimuove tutti gli spazi a sinistra della stringa, permetteranno, ad esempio, di effettuare le seguenti operazioni:

? cFirst + LTRIM(STR(nSecond)) ? VAL(cFirst) + nSecond

Risultato

12345 168

Page 10: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

10

Utilizzo delle Funzioni

Le funzioni restituiscono sempre un determinato tipo di dati. Ad esempio, le funzioni STR( ) e VAL( ), utilizzate negli esempi precedenti, restituiscono, rispettivamente, stringhe di caratteri e valori numerici. Come tutte le funzioni, le varie tipologie di dati restituiti verranno specificate di volta in volta.

In Visual FoxPro, esistono cinque sistemi per chiamare una funzione:

?? Assegnare il risultato della funzione ad una variabile. Ecco l’esempio con il quale assegnare la data di sistema ad una variabile chiamata dToday:

dToday = DATE( )

?? Includere la chiamata alla funzione in un comando Visual FoxPro. La seguente istruzione setta la directory di default in base al valore restituito dalla funzione GETDIR( ):

CD GETDIR( )

?? Stampare il valore restituito dalla funzione. La seguente linea di codice stampa l’ora di sistema all’interno della finestra attiva:

? TIME( )

?? Chiamare la funzione senza memorizzarne il valore restituito da nessuna parte. Il seguente comando disabilita la visualizzazione del cursore:

SYS(2002)

?? Includere la funzione all’interno di un’altra. Il seguente comando, ad esempio, stampa il giorno della settimana:

? DOW(DATE( ))

Alcuni altri esempi di funzioni utilizzate in questo capitolo sono:

Funzione Descrizione

ISDIGIT( ) Restituisce vero (.T.) se il primo carattere a sinistra di una stringa rappresenta un numero; in caso contrario, restituisce falso (.F.).

FIELD( ) Restituisce il nome di un campo.

LEN( ) Restituisce il numero di caratteri contenuti in una stringa.

RECCOUNT( ) Restituisce il numero di records presenti all’interno della tabella attiva.

SUBSTR( ) Estrae uno specifico numero di caratteri da una stringa, partendo da una determinata posizione.

Utilizzare i comandi

Page 11: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

11

Un comando provoca l’esecuzione di una determinata azione. Ogni comando ha una sintassi specifica che occorre rispettare affinché possa essere correttamente compiuta l’azione. Esistono, inoltre, delle proposizioni associate ai comandi che permettono di specificare con maggiore esattezza ciò che si vuole eseguire.

Ad esempio, il comando USE, che permette di aprire e chiudere tabelle, può essere utilizzato in diverse maniere:

Sintassi del comando USE

Descrizione

USE Chiude la tabella aperta nell’area di lavoro corrente.

USE customer Apre la tabella CUSTOMER nell’area di lavoro corrente chiudendovi, contemporaneamente, ogni altra tabella aperta.

USE customer IN 0 Apre la tabella CUSTOMER nella successiva area di lavoro disponibile.

USE customer IN 0 ; ALIAS mycust

Apre la tabella CUSTOMER nella successiva area di lavoro disponibile ed assegna all’area l’alias mycust.

Alcuni esempi di comandi mostrati in questo capitolo sono:

Comando Descrizione

DELETE Attiva il marcatore di cancellazione in uno specifico record all’interno di una tabella.

REPLACE Sostituisce il valore di un record con uno nuovo.

Go Posiziona il puntatore su uno specifico record all’interno di una tabella.

Controllare il flusso di un programma

Visual FoxPro include una speciale categoria di comandi che racchiudono “wrap around” altri comandi o funzioni, determinando quando e quante volte questi altri comandi e funzioni verranno eseguiti. Questi comandi permettono la scelta condizionale (conditional branching) ed i cicli (looping), due potentissimi strumenti di programmazione. Successivamente verranno mostrati programmi in grado di attivare scelte condizionali e cicli.

Questi concetti sono descritti in maggior dettaglio nel seguente esempio.

Supponiamo di avere 10,000 dipendenti e di volere aumentare lo stipendio del 6%, a quelli che guadagnano fino a $30,000 e del 3% a tutti gli altri. Nell’esempio seguente vediamo l’applicazione in grado di effettuare l’operazione.

Page 12: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

12

Questo programma parte dal presupposto di avere, nell’area corrente, una tabella aperta contenente un campo numerico chiamato salary. Per avere maggiori informazioni sull’utilizzo delle aree di lavoro si può consultare il paragrafio “Using Multiple Tables” del Capitolo 7, Working with Tables.

Programma esemplificativo su come applicare un incremento di salario

Codice Commenti

SCAN Il codice che si trova tra SCAN ed ENDSCAN viene eseguito per ogni record presente in tabella. Dopo l’esecuzione del ogni blocco di codice che si trova tra SCAN ed ENDSCAN , il puntatore di record viene posizionato su record successivo.

IF salary >= 30000.00 REPLACE salary WITH ; salary * 1.03

Per ogni record, nel caso in cui il salario sia di un valore maggiore od uguale a 30,000, il valore stesso viene aumentato del 3%. Il punto e virgola (;) posto dopo l’istruzione WITH, sta ad indicare che il comando prosegue sulla riga successiva.

ELSE REPLACE salary WITH ; salary * 1.06

Per ogni altro record il salario viene maggiorato del 6%.

ENDIF ENDSCAN

Dichiarazione di fine della condizione (IF).

Istruzione che termina la sequenza di codice da eseguire per ogni record presente in tabella.

L’esempio di cui sopra utilizza sia la scelta condizionale (IF), sia il looping (SCAN…ENDSCAN) al fine di controllare il flusso del programma.

Scelta Condizionale (Conditional Branching)

La scelta condizionale permette di verificare delle condizioni e, in base ai risultati, eseguire differenti operazioni. Esistono due comandi in Visual Foxpro di effettuare questa operazione:

?? IF ... ELSE ... ENDIF ?? DO CASE ... ENDCASE

Il codice che compare tra la prima istruzione (IF o CASE) e l’ultima (ENDIF o ENDCASE) verrà eseguito solo nel caso in cui la condizione logica risultante da tali istruzioni risulterà vera (.T.).

Nell’esempio appena visto, l’istruzione IF viene utilizzata per distinguere due situazioni: quella in cui il salario sia uguale o maggiore a $ 30,000, e quella in cui il salario sia inferiore a $30,000. In base al verificarsi di una condizione o dell’altra, verranno eseguite diverse operazioni..

Nell’esempio seguente, nel caso in cui il valore memorizzato nella variabile nWaterTemp sia inferiore a 100, non verrà eseguita alcuna operazione:

Page 13: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

13

* imposta una variabile logica a vero (.T.), nel caso in cui sia soddisfatta una * condizione (if). IF nWaterTemp >= 100 lBoiling = .T. ENDIF

Nota L’asterisco posto all’inizio di una riga di programma indica che si tratta di un commento. Le righe di commento aiutano il programmatore a ricordare lo scopo di un determinato segmento di programma e sono completamente ignorate da Visual FoxPro.

Nel caso in cui ci si trovi a dover valutare diverse possibilità di scelta, l’utilizzo del comando DO CASE ... ENDCASE può risultare più efficiente e semplice da verificare rispetto alla implementazione di molte istruzioni di tipo IF.

I Cicli (Looping)

Il Looping permette di eseguire una o più linee di codice in maniera ricorsiva. Esistono tre comandi in Visual FoxPro che permettono questo:

?? SCAN ... ENDSCAN ?? FOR ... ENDFOR ?? DO WHILE ... ENDDO

SCAN viene utilizzato nel caso in cui si debbano eseguire una serie di operazione per ogni record presente in una tabella, come nell’esempio appena descritto. Il ciclo di SCAN permette di scrivere del codice che verrà eseguito per ogni record, spostando ogni volta il puntatore del record in avanti di una posizione all’interno della tabella.

E’ possibile utilizzare, invece, l’istruzione FOR nei casi in cui si sappia già quante volte è necessario eseguire un determinato blocco di istruzioni. Per esempio, nel caso in cui si sappia a priori quanti campi sono presenti in una determinata tabella. Siccome in Visual FoxPro la funzione FCOUNT( ) restituisce proprio questo valore, sarà possibile utilizzare un ciclo di tipo FOR per, ad esempio, stampare i nomi di tutti i campi presenti in una tabella:

FOR nCnt = 1 TO FCOUNT( ) ? FIELD(nCnt) ENDFOR

Il DO WHILE, invece, è utilizzato nelle situazioni in cui si voglia eseguire una porzione di codice per tutto il periodo in cui venga rispettata una determinata condizione. Può darsi che non si sappia affatto quante volte verrà eseguito il codice, si deve solo decidere quando terminarne l’esecuzione. Per esempio, ammettiamo di avere una tabella contenente nomi ed iniziali di alcune persone e di avere la necessità di cercare un determinato nominativo attraverso le iniziali.

La prima volta che ci troveremmo di fronte alla necessità di inserire il nominativo di una persona che ha le stesse iniziali di una già presente in tabella … inizieremmo ad avere i primi problemi.

Per toglierci d’impaccio potremmo decidere di aggiungere un numero alle iniziali. Per esempio, il codice identificativo di Michael Suyama potrebbe essere MS. La prima persona con le stesse iniziali, Margaret Sun, potrebbe essere identificata con il codice MS1. Quando andremo ad aggiungere Michelle Smith alla tabella, il suo codice identificativo dovrebbe essere MS2.

Page 14: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

14

Un ciclo DO WHILE ci permetterà di trovare il giusto numero da aggiungere alle iniziali.

Esempio di programma in grado di generare un identificativo univoco utilizzando un ciclo DO WHILE

Codice Commenti

NHere = RECNO() Salva il numero di record.

cInitials = LEFT(firstname,1) + ; LEFT(lastname,1) nSuffix = 0

Desume le iniziali della persona in base alla prima lettera dei campi firstname e lastname.

Crea una variabile dove memorizzare il numero da aggiungere alle iniziali, se necessario.

LOCATE FOR person_id = cInitials Verifica se in tabella esistono altre persone con le stesse iniziali.

DO WHILE FOUND( ) Nel cao in cui venga trovato un altro record contenente un person_id uguale al valore memorizzato in cInitials, la funzione FOUND( ) restituirà il valore vero (.T.) e verrà eseguito il codice contenuto all’interno del ciclo DO WHILE. In caso contrario la riga di codice eseguita sarà la prima presente dopo l’istruzione ENDDO.

nSuffix = nSuffix + 1 cInitials = ; LEFT(cInitials,2); + ALLTRIM(STR(nSuffix))

Prepara un nuovo suffisso e lo inserisce in coda alle iniziali.

CONTINUE CONTINUE riesegue l’ultimo comando LOCATE ed il programma verificherà nuovamente la presenza del valore contenuto in cInitials (appena calcolato) nel campo person_id di un altro record. In caso positivo, FOUND( ) riporterà un valore vero (.T.) e verrà eseguito nuovamente il codice presente all’interno del ciclo DO WHILE; in caso contrario FOUND( ) riporterà un valore falso(.F.) ed il programma potrà procedere nella esecuzione della riga successiva all’istruzione ENDDO.

ENDDO Fine del ciclo DO WHILE.

GOTO nHere REPLACE person_id WITH cInitials

Torna al numero di record (memorizzato all’inizio del programma) e registra il codice identificativo univoco nel campo person_id.

Ecco come, non sapendo a priori quante volte troveremo in tabella la corrispondenza ad un determinato valore, sia necessario utilizzare il ciclo DO WHILE.

Page 15: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

15

Il processo di programmazione

Una volta compresi i concetti di base, programmare si riduce ad un processo iterativo. Sarà sufficiente eseguire i passi necessari tante volte quante ne necessiterà la messa a punto del programma. All’inizio si eseguiranno molte verifiche, spendendo molto tempo in prove ed errori; via che, però, si acquisirà familiarità con il linguaggio, si procederà sempre più speditamente e si imparerà ad eseguire a mente i test preliminari..

I passi necessari per eseguire un buon programma:

?? Dichiarare il problema. ?? Suddividere il problema nei suoi elementi fondamentali. ?? Realizzare le varie parti del programma. ?? Testare e mettere a punto ogni parte realizzata. ?? Assemblare le varie parti. ?? Testare tutto il programma.

Ci sono però alcune cose che è necessario ricordare quando si inizia:

?? Cercare di delineare chiaramente il problema prima di tentarne la risoluzione. In caso contrario rischieremmo di dover eseguire un sacco di modifiche, buttando via codice già scritto, ripartendo daccapo molte volte o dovendoci, alla fine, accontentarci di un prodotto di molto inferiore alle nostre aspettative.

?? Suddividere il problema in parti più facilmente gestibili, invece di cercare di risolvere tutto in una volta.

?? Testare e correggere (debug) il codice non appena scritto. Verificare sempre che il codice faccia esattamente quello per cui lo abbiamo scritto. Il debugging è il processo di ricerca e correzione dei problemi che impediscono ai programmi di fare quello per cui sono stati realizzati.

?? Perfezionare la struttura dei dati ed i loro contenitori affinché il programma riesca a manipolarli agevolmente ed efficientemente. Questo spesso significa dover strutturare correttamente le proprie tabelle.

Il rimanente di questa sezione mostrerà i vari passi necessari a costruire un piccolo applicativo in Visual FoxPro.

Asserire il Problema

Prima di tentare di risolvere un problema, è necessario formularlo in maniera corretta. Qualche volta, trovando il giusto modi di formulare un problema, si è in grado di individuare strade migliori o diversificate per poterlo risolvere.

Supponiamo di ricevere molti dati da diverse sorgenti. Benché la maggior parte di questi dati sia strettamente numerica, alcuni di questi contengono, insieme ai numeri, trattini e spazi. Abbiamo la necessità di rimuovere tutti i trattini e gli spazi dai campi e salvare solo i dati numerici.

Invece di partire tentando subito di rimuovere i caratteri indesiderati dai dati originali, si può cercare di formulare l’obiettivo del programma come segue:

Page 16: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

16

Obiettivo (Goal) Sostituire i valori esistenti in un campo con altri contenenti tali valori epurati dagli spazi e dai trattini.

Questa formulazione evita di scontrarsi con la difficoltà di manipolare stringhe di caratteri la cui lunghezza può cambiare durante la nostra elaborazione.

Suddividere il problema

Siccome abbiamo la necessità di fornire specifiche istruzioni a Visual FoxPro in termini di operazioni, comandi e funzioni, è necessario suddividere il problema in elementi discreti. Il passo più semplice per affrontare il problema che ci siamo posti è quello di verificare ogni caratteri presente nella stringa. Finché non valuteremo ogni carattere individualmente non saremo in grado di decidere se salvarlo o meno.

Una volta individuato un carattere, sarà necessario verificare se si tratta di un trattino ad uno spazio. A questo punto, saremo in grado di rifinire la dichiarazione del problema. E se, in futuro, si ricevessero dati contenenti parentesi aperte o chiuse? E come fare per sbarazzarsi di simboli di valuta, virgole e punteggiatura? Più ampio sarà il campo di azione del programma, più lavoro ci potremo risparmiare in futuro. Allora possiamo riformulare gli obiettivi in maniera da poter lavorare, in futuro, con una maggiore varietà di dati:

Ridefinizione dell’obiettivo Sostituire i valori esistenti in un campo con altri contenenti tali valori epurati da tutti i caratteri diversi da cifre.

Con questo nuovo obiettivo si è in grado di riformulare il problema a livello di carattere: se il carattere è numerico, va salvato; se il carattere non è numerico si passa al successivo. Una volta costruita la stringa contenente solo i caratteri numerici di quella di partenza, sarà possibile salvarla e procedere con il record successivo fino alla completa elaborazione di tutti i dati.

Per riassumere, il problema può essere suddiviso nelle seguenti parti:

1. Valutare ogni carattere.

2. Verificare se rappresenta un numero oppure no.

3. Se numerico, copiarlo nella seconda stringa.

4. Una volta valutati tutti i caratteri della stringa originale, sostituirla con la seconda generata

5. Ripetere le operazioni per tutti i records dell’archivio.

Page 17: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

17

Costruire le varie parti

Una volta che abbiamo ben chiaro quello che esattamente si intende realizzare, si può finalmente iniziare a costruire le varie parti del programma, assemblando i comandi, le funzioni e gli operatori che Visual FoxPro mette a disposizione.

Dal momento che i comandi e le funzioni saranno utilizzati per manipolare dati, sarà necessario realizzare delle basi dati di prova sulle quali eseguire le simulazioni. Naturalmente sarà opportuno realizzare basi dati le più somiglianti possibili a quelle su cui il programma dovrà in futuro lavorare.

Nell’esempio successivo vediamo come immagazzinare una stringa di caratteri all’interno di una variabile, utilizzando l’istruzione direttamente dalla finestra dei comandi di FoxPro:

cTest = "123-456-7 89 0"

Lavorare sul singolo carattere

Per valutare ogni singolo carattere di una stringa è necessario utilizzare alcune particolari funzioni che possiamo trovare elencate nel paragrafo relativo, funzioni di manipolazione dei caratteri (Character Functions).

Le funzioni in grado di restituire specifiche sezioni di una stringa sono tre, e precisamente: LEFT( ), RIGHT( ), e SUBSTR( ).

La funzione SUBSTR( ) restituisce i caratteri di una qualsiasi porzione di stringa. SUBSTR( ) necessita dei seguenti tre argomenti (o parametri): la stringa, la posizione dalla quale si intende partire ed il numero di caratteri che intendiamo estrarre, ad iniziare dalla prima posizione a sinistra. Per verificare il funzionamento della funzione SUBSTR( ) sulla variabile appena realizzata, proviamo a scrivere le seguenti istruzioni dalla finestra dei comandi:

? SUBSTR(cTest, 1, 1) ? SUBSTR(cTest, 3, 1) ? SUBSTR(cTest, 8, 1)

In uscita avremo …

1 3 -

Si può notare come il primo, il terzo e l’ottavo carattere siano stati visualizzati nella finestra principale di Visua l FoxPro.

Per eseguire lo stesso tipo di operazione possiamo ricorrere alla tecnica del loop. Siccome conosciamo la lunghezza della stringa di testo (14 caratteri), possiamo utilizzare un loop di tipo FOR. Il contatore che controlla il ciclo viene incrementato ogni volta che viene rieseguito il loop stesso, così siamo in grado di utilizzarlo come parametro della funzione SUBSTR( ). E’ possibile provare il funzionamento del loop all’interno della finestra dei comandi, ma a questo punto potremmo sentire la necessità di salvare il nostro lavoro per poterlo riutilizzare successivamente. E’ arrivato il momento di realizzare il nostro primo programma !

Page 18: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

18

Creare un programma

1. All’interno della finestra dei comandi, digitare le seguenti righe di istruzione: 2. MODIFY COMMAND numonly 3. All’interno della nuova finestra, digitare le seguenti linee di codice: 4. FOR nCnt = 1 TO 14 5. ? SUBSTR(cTest, nCnt, 1) 6. ENDFOR

Adesso che abbiamo realizzato il nostro programma, possiamo mandarlo in esecuzione.

Eseguire un programma

1. Dalla finestra del programma, premere CTRL+E.

2. All’interno della finestra di dialogo (Save dialog box), scegliere OK.

In fase di esecuzione del programma, i singoli caratteri estratti dalla stringa di partenza, verranno visualizzati uno ad uno in linee separate, all’interno della finestra principale di Visual FoxPro (main Visual FoxPro window).

Testare una parte di programma

La prima operazione è compiuta. Adesso è possibile visualizzare ogni carattere della stringa.

Page 19: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

19

Verificare se il carattere è numerico o meno.

Una volta estratto un carattere dalla stringa, si può verificare se si tratti di un numero o no. Questa verifica la possiamo eseguire utilizzando la funzione ISDIGIT( ).

Proviamo a digitare i seguenti comandi dalla Command window:

? ISDIGIT('2') ? ISDIGIT('-') ? ISDIGIT(SUBSTR(cTest, 3, 1))

In uscita avremo …

.T.

.F.

.T.

I risultati ottenuti testimoniano che ‘2’ è un numero, ‘– ’ non è un numero, mentre il terzo carattere della stringa cTest, 3, è nuovamente un numero.

Se il carattere è numerico, lo possiamo copiare nella Seconda Stringa

Una volta appurato che il carattere è di tipo numerico, avremo bisogno di una nuova variabile all’interno della quale poterlo memorizzare: la nuova variabile si chiamerà, ad esempio, cNumOnly.

Per creare cNumOnly, sarà sufficiente assegnarle come valore iniziale una stringa di lunghezza pari a zero:

cNumOnly = ""

Mentre il nostro ciclo FOR si sposta all’interno della nostra stringa di partenza, può risultare utile creare una nuova variabile per memorizzare ogni nuovo carattere estratto dalla stringa al fine di poterlo valutare:

cCharacter = SUBSTR(cTest, nCnt, 1)

Suggerimento: spesso è consigliabile memorizzare il risultato di un calcolo, di una scelta (valutazione) o di una funzione all’interno di una variabile, in maniera da poterlo elaborare e modificare senza dovere ogni volta ripetere l’operazione di calcolo.

La seguente linea di codice può essere utilizzata ogni volta che troviamo un carattere di tipo numerico all’interno della stringa (e che dobbiamo trasferire nella nuova):

cNumOnly = cNumOnly + cCharacter

Il programma scritto fino ad ora, quindi, è:

cNumOnly = "" FOR nCnt = 1 TO 14 cCharacter = SUBSTR(cTest, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR

Page 20: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

20

Testare le varie parti

Aggiungendo un paio di comandi alla fine del programma, si può vedere come esso lavori via via con la nostra stringa:

cNumOnly = "" FOR nCnt = 1 TO 14 cCharacter = SUBSTR(cTest, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR ? cTest ? cNumOnly

In uscita avremo …

123-456-7 89 0 1234567890

Il risultato sembra corretto. Però cambiando la stringa di prova durante il collaudo si può incappare in qualche problema …

Digitiamo il seguente comando nella finestra dei comand i:

cTest = "456-789 22"

(Command window) e lanciamo nuovamente l’esecuzione del programma.

Il programma mostrerà un messaggio di errore. Il ciclo FOR proverà, infatti, ad eseguire 14 cicli anche se la nuova stringa contiene solo 10 caratteri. Per ovviare al problema è necessario trovare un sistema per poter adattare l’esecuzione del programma a stringhe di diversa lunghezza. Per fare questo è necessario ricorrere alla funzione LEN( ), in grado di restituire proprio la lunghezza di una stringa di caratteri. Inserendo questa funzione nel ciclo FOR, si potrà verificare la correttezza dell’esecuzione con ambedue le stringhe:

cNumOnly = "" FOR nCnt = 1 TO LEN(cTest) cCharacter = SUBSTR(cTest, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR ? cTest ? cNumOnly

Assemblare le varie parti

Per completare la soluzione del problema si può impostare la lettura dei dati, invece che da una variabile, direttamente da una tabella. Infatti, una volta selezionata la tabella da utilizzare, sarà possibile leggere i vari record che la compongono, prelevando da essi le stringhe da elaborare.

Per iniziare, occorre creare una tabella temporanea contenente una certa varietà di stringhe di esempio. Una tabella siffatta può contenere anche un solo campo di tipo carattere chiamato, ad esempio, TestField e quattro o cinque record:

Page 21: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

21

Contenuto del campo TestField

123-456-7 89 0 -9221 9220 94321 99-

456-789 22 000001 98-99-234

Sostituendo il nome del campo a quello della stringa, creeremo un nuovo programma che avrà la seguente struttura:

FOR nCnt = 1 TO LEN(TestField) cCharacter = SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR ? TestField ? cNumOnly

E’ possibile posizionarsi manualmente su di un certo record scorrendo la tabella (browsing) sui vari records. Quando il puntatore si trova su di un certo record, il programma può eseguire le proprie istruzioni sulla base dei dati che, via via, vi trova. E’ possibile anche istruire il programma in maniera tale da fargli effettuare automaticamente la scansione della tabella:

SCAN cNumOnly = "" FOR nCnt = 1 TO LEN(TestField) cCharacter = SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR ? TestField ? cNumOnly ? ENDSCAN

In uscita avremo …

123-456-7 89 0 1234567890 456-789 22 45678922 -9221 9220 94321 99- 922192209432199 000001 98-99-234 0000019899234

Page 22: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

22

Testare tutto il programma

Invece di stampare la stringa generata, si può voler salvare il contenuto all’interno della tabella stessa. Per fare ciò si può utilizzare la seguente linea di codice:

REPLACE TestField WITH cNumOnly

Quindi il nuovo programma diventa:

SCAN cNumOnly = "" FOR nCnt = 1 TO LEN(TestField) cCharacter = SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR REPLACE TestField WITH cNumOnly ENDSCAN

Una volta completato il programma, prima di iniziare ad utilizzarlo, è necessario testarlo su un modello di prova della futura base dati.

Rendere il programma più affidabile.

Un programma affidabile, oltre a fare ciò per cui è stato progettato, deve anche essere in grado di prevedere, ed eventualmente gestire, eventuali errori. Il programma utilizzato nell’esempio precedente esegue effettivamente tutte le elaborazioni necessarie, ma da per scontate alcune condizioni che devono necessariamente verificarsi affinché tutto possa procedere senza errori.

Le condizioni necessarie sono le seguenti:

?? La tabella deve essere già aperta nell’area di lavoro corrente. ?? La tabella deve contenere un campo di tipo carattere chiamato TestField.

Se nell’area di lavoro corrente la tabella non fosse già presente o quest’ultima non avesse un campo di tipo carattere con il nome specificato, il programma genererebbe un messaggio di errore e non potrebbe proseguire con le operazioni.

Esempio di programma in grado di eliminare, per tutti i records di una tabella, i caratteri non numerici presenti all’interno di un campo

Codice Commenti

LFieldOK = .F. Questa variabile è necessaria per determinare se esistono le condizioni necessarie per far funzionare correttamente il programma. La variabile viene inizializzata a falso (.F.), assumendo quindi che le condizioni necessarie al funzionamento del programma non sono rispettate.

Page 23: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

23

FOR nCnt = 1 TO FCOUNT( ) IF FIELD(nCnt) = ; UPPER("TestField") IF TYPE("TestField") = "C" lFieldOK = .T. ENDIF EXIT ENDIF ENDFOR

In questa porzione di codice si procede alla verifica di ogni campo della tabella corrente alla ricerca di un campo di tipo carattere chiamato TestField. Una volta trovato il campo, la variabile lFieldOK viene settata a vero (.T.) e, tramite l’istruzione EXIT, il ciclo si interromperà (Infatti non ci sarebbe motivo di continuare una ricerca che ha già dato esiti positivi). Nel caso in cui, invece, non si trovi il campo specificato, la variabile lFieldOK resterà settata al valore falso (.F.).

IF lFieldOK La porzione di codice deputata alla conversione verrà eseguita solo se sarà stato precedentemente trovato il campo di tipo carattere (chiamato TestField) all’interno della tabella nell’area di lavoro corrente.

SCAN cNumOnly = "" FOR nCnt = 1 TO LEN(TestField) cCharacter = ; SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + ; cCharacter ENDIF ENDFOR

Questa è la porzione di codice deputata alla conversione.

REPLACE TestField WITH ; cNumOnly ENDSCAN

ENDIF Fine della condizione (IF) applicata al contenuto della variabile lFieldOK.

La caratteristica più limitativa di questo programma è data dal fatto che può essere utilizzato solo per operare su di uno specifico campo di una tabella. Nel caso si volesse estenderne la funzionalità ad un campo diverso da TestField , saremmo obbligati a riscrivere il programma sostituendo tutte le istruzioni relative al campo TestField con altre contenenti il nome del nuovo campo.

Convertendo il programma appena visto in una funzione, come vedremo in seguito, potremo renderne il campo di applicazione più generico, rendendolo riutilizzabile in vari altri casi, risparmiandoci in futuro del nuovo lavoro.

Page 24: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

24

L’utilizzo delle Procedure e delle funzioni utente

Le Procedure e le Funzioni hanno il grosso vantaggio di poter accorpare, all’interno di una singola porzione di codice, le funzionalità più comunemente utilizzate nel nostro programma, richiamandole al momento opportuno. Questo dà la possibilità di scrivere programmi più leggibili e più facili da manutenere in quanto la modifica di una routine può essere fatta una volta per tutte all’interno della Procedura e resa automaticamente disponibile a tutte le nostre applicazioni..

In Visual FoxPro, una procedura viene scritta con la seguente sintassi:

PROCEDURE myproc * This is a comment, but it could be executable code ENDPROC

Normalmente una procedura contiene del codice che viene scritto per eseguire delle operazioni e delle funzioni che restituiscono dei valori. In Visual FoxPro, le Funzioni sono simili alle Procedure:

FUNCTION myfunc * This is a comment, but it could be executable code ENDFUNC

Si possono includere Procedure e Funzioni in un programma a sé stante oppure, indifferentemente, alla fine di un normale programma che contiene già del codice. Nel secondo caso, però, Procedure e Funzioni devono necessariamente essere poste alla fine del file di programma, ovvero dopo di esse non è consentito scrivere altre istruzioni.

Nel caso in cui si decida di includere Procedure e Funzioni all’interno di un file a sé stante è necessario, per renderle accessibili agli altri programmi, utilizzare il comando SET PROCEDURE TO. Per esempio, nel caso in cui si accorpino le nostre funzioni nel file FUNPROC.PRG, dovremo utilizzare la seguente sintassi:

SET PROCEDURE TO funproc.prg

Richiamare una Procedura od una Funzione

Ci sono due modi per richiamare una procedura od una funzione dal nostro programma:

?? Utilizzare il comando DO. Per esempio: ?? DO myproc

-oppure-

?? Inserire una coppia di parentesi dopo il nome della funzione. Per esempio: ?? myfunc( )

Ognuno di questi due metodi può essere impostato in maniera tale da inviare o ricevere valori dalla Procedura o dalla Funzione chiamate.

Inviare valori ad una Procedura o ad una Funzione

Per inviare valori alle procedure od alle funzioni, è necessario utilizzare l’istruzione parameters . La procedura mostrata di seguito, per esempio, accetta un singolo parametro:

Page 25: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

25

PROCEDURE myproc( cString ) * The following line displays a message MESSAGEBOX ("myproc" + cString) ENDPROC Nota Inserendo i parametri tra parentesi nella riga di definizione di una funzione o di una procedura, per esempio PROCEDURE myproc(cString), indica che il parametro è una variabile locale, cioè accessibile solo dall'interno della procedura/funzione stessa.

E’ anche possibile fare accettare dalla funzione o dalla procedura parametri locali utilizzando l’istruzione LPARAMETERS.

I Parametri funzionano allo stesso modo in una funzione. Per inviare un valore come parametro alla procedura o alla funzione si può utilizzare una stringa od una variabile che la contiene, come mostrato nell’esempio seguente:

Passare i parametri

Codice Commenti

DO myproc WITH cTestString DO myproc WITH "test string"

Chiama una procedura e le passa una stringa di caratteri o una variabile.

myfunc("test string") myfunc( cTestString )

Chiama una funzione e le passa la copia di una variabile contenente caratteri ed una stringa di caratteri.

Nota Richiamando una procedura od una funzione senza utilizzare il comando DO, il settaggio di UDFPARMS determinerà come tali parametri saranno passati. Per default, UDFPARMS è settato a ‘VALUE’, in questo modo viene trasferita una copia dei parametri. Utilizzando l’istruzione DO, viene utilizzato il parametro attuale (trasferimento per referenza), ed ogni modifica all’interno della procedura o della funzione, viene applicata al valore originale, in base al indipendentemente dall’impostazione di UDFPARMS.

E’ possibile trasferire alla funzione o alla procedura più parametri contemporaneamente, separandoli l’uno dall’altro tramite delle virgole. Per esempio, la seguente procedura si aspetta di ricevere tre parametri: una data, una stringa di caratteri, ed un numero.

PROCEDURE myproc( dDate, cString, nTimesToPrint ) FOR nCnt = 1 to nTimesToPrint ? DTOC(dDate) + " " + cString + " " + STR(nCnt) ENDFOR ENDPROC

Questa procedura può essere chiamata utilizzando la seguente linea di codice:

DO myproc WITH DATE(), "Hello World", 10

Page 26: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

26

Ricevere valori da una Funzione

Il valore restituito di default da una funzione è vero (.T.), ma utilizzando l’istruzione RETURN si può restituire valori di qualsiasi genere. Per esempio, la seguente funzione restituirà una data di due settimane successiva a quella passatale come parametro.

FUNCTION plus2weeks PARAMETERS dDate RETURN dDate + 14 ENDFUNC

La seguente riga di codice memorizza il valore restituito dalla funzione, all’interno di una variabile:

dDeadLine = plus2weeks(DATE())

La tabella successiva elenca le varie modalità con cui si possono memorizzare o visualizzare i valori restituiti da una funzione:

Gestire i valori restituiti

Codice Commenti

var = myfunc( ) Memorizza in una variabile il valore restituito dalla funzione

? myfunc( ) Visualizza, nella finestra attiva, il valore restituito dalla funzione.

Verificare i parametri di una Procedura o di una Funzione

E’ buona abitudine verificare che i parametri inviati alla nostra procedura o alla nostra funzione siano effettivamente come ce li aspettiamo. A tale scopo si può utilizzare la funzione TYPE( ) e la funzione PARAMETERS( ) per verificare il tipo ed il numero di parametri inviati alla funzione (o procedura).

Nell’esempio appena visto, si richiede di ricevere un parametro di tipo Data. Utilizzando la funzione TYPE( ) è possibile effettivamente verificare se tale parametro sia del tipo specificato.

FUNCTION plus2weeks( dDate ) IF TYPE("dDate") = "D" RETURN dDate + 14 ELSE MESSAGEBOX( "You must pass a date!" ) RETURN { - - } && Return an empty date ENDIF ENDFUNC

Nel caso in cui una procedura si aspetti un numero minore di parametri rispetto a quanti effettivamente ne riceve, Visual FoxPro genererà un messaggio di errore. Per esempio, nel caso si specifichino due parametri, ma si chiami la funzione con tre parametri, si otterrà un messaggio di errore. Nel caso in cui, invece, la procedura riceva meno parametri di quanti ne possa accettare,

Page 27: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

27

semplicemente inizializzerà a falso (.F.) quelli non esplicitamente ricevuti. Siccome non c’è sistema per vedere se l’ultimo parametro è stato settato a falso(.F.) od omesso, possiamo utilizzare la seguente procedura per verificare se sono stati inviati tutti i parametri richiesti:

PROCEDURE SaveValue( cStoreTo, cNewVal, lIsInTable ) IF PARAMETERS( ) < 3 MESSAGEBOX( "Too few parameters passed." ) RETURN .F. ENDIF IF lIsInTable REPLACE (cStoreTo) WITH (cNewVal) ELSE &cStoreTo = cNewVal ENDIF RETURN .T. ENDPROC

Convertire il programma NUMONLY in una Funzione

NUMONLY.PRG, il programma di esempio che abbiamo esaminato precedentemente nella sezione Il processo della programmazione, può essere reso più flessibile creando una funzione contenente la parte di programma che rimuove i caratteri non numerici da una determinata stringa.

Procedura che restituisce un carattere numerico da una stringa

Codice Commenti

FUNCTION NumbersOnly( cMixedVal ) Dichiara la funzione, che accetta la stringa di caratteri.

cNumOnly = "" FOR nCnt = 1 TO LEN(cMixedVal) cCharacter = ; SUBSTR(cMixedVal, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = ; cNumOnly + cCharacter ENDIF ENDFOR

Crea una stringa che contiene solo i caratteri numeri estratti dalla stringa originale.

RETURN cNumOnly Restituisce la stringa appena calcolata (solo caratteri numerici).

ENDFUNC Fine della funzione.

In aggiunta, per permettere l’utilizzo del codice in svariate situazioni, questa funzione rende il programma più semplice da leggere:

SCAN REPLACE FieldName WITH NumbersOnly(FieldName) ENDSCAN

Oppure, ancora più semplicemente:

Page 28: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

28

REPLACE ALL FieldName WITH NumbersOnly(FieldName)

Come procedere

L’utilizzo della programmazione di tipo procedurale (procedural programming), insieme a quella orientata agli oggetti (object-oriented programming) ed agli strumenti di sviluppo di Visual FoxPro può permettere la realizzazione di applicazioni Visual FoxPro assai versatili. Il rimanente di questo libro si soffermerà sui vari argomenti che incontrerete durante lo sviluppo di applicazioni Visual FoxPro.

Per maggiori informazioni sull’approccio alla programmazione orientata agli oggetti (object-oriented), si può consultare il Capitolo 3, mentre per vedere l’utilizzo della utility Form Designer, si può consultare il Capitolo 9,

Page 29: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

29

Capitolo 2: Sviluppare un’ applicazione Traduzione di Alessandro Panighi Una tipica applicazione in Visual FoxPro include uno o più DATABASE, un programma principale (main) che imposta l’ambiente di sistema dell’applicazione e genera l’interfaccia utente composta di Maschere (FORM) Barre strumenti (TOOLBARS) e Menu (MENU). Le Interrogazioni (QUERY) e le Stampe (REPORT) consentono agli utenti di ottenere le informazioni estrapolate dai loro dati.

In questo capitolo verranno trattati:

?? Pianificazione dell’applicazione

?? Creazione di un database

?? Creazione di classi

?? Fornire accesso alla funzionalità

?? Fornire accesso alle informazioni

?? Fare test e debugging

Pianificare l’applicazione Pianificare attentamente serve per risparmiare tempo, sforzi, denaro e giudizio. Con più viene coinvolto l’utilizzatore finale nel processo di pianificazione meglio è. Non ha importanza quanto attentamente pianificate, perché mentre procederete tornerete spesso sul progetto e i vostri consumatori finali vi forniranno un feedback.

Alcune delle decisioni che prenderete avranno un forte impatto sulla creazione degli elementi della applicazione. Chi utilizzerà questa applicazione? Qual è il centro della attività dell’utilizzatore? Quanto sarà grande il campo dati sul quale lavorerete? Saranno utilizzati i back-end data o saranno ad uso esclusivo di un singolo utilizzatore o di molteplici utenti in un network? Tenete conto di questi fattori prima di addentrarvi troppo nella stesura del progetto.

Attività di uso comune Anche se gli utenti finali stanno lavorando con clienti, ordini e parti, il modo in cui lavoreranno con questi informazioni determinerà il modo in cui la vostra applicazione dovrà elaborare i dati. Un formulario per l’immissione di dati, come quello in Tastraded.app (in Visual Studio…\Samples\Vfp98\Tastrade directory) potrebbe essere necessario per alcune applicazioni, ma potrebbe non essere un buon strumento per trattare inventari, vendite, etc

Dimensioni del Database Sicuramente vorrete soffermarvi più a lungo sulle performance se state trattando con una grande quantità di dati. Il Capitolo 15 Optimizing Applications spiega il modo in cui si possono ottimizzare le perfomance. Potreste anche voler aggiustare le modalità in cui permettere all’utilizzatore di usare i dati. Se avete 20 o 30 records in una tabella, va bene lasciar spostare all’utilizzatore il pointer dei record in una tabella un record alla volta. Se avete invece 20 o 30 mila records, dovrete fornire un altro tipo di gestione per ottenere i dati desiderati: aggiungendo liste di ricerca o dialogs, filtri, ricerche e così via. Il capitolo 10, Using Controls , spiega come usare una lista per selezionare specifici records. Il capitolo 8, Creating Views, spiega il modo per creare ricerche per parametri.

Monoutente o Multiutente

Page 30: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

30

E’ una buona idea quella di creare una applicazione con la possibilità di prevedere che più utenti potranno accedere ai dati nello stesso momento. Visual Fox Pro facilita la programmazione per accessi condivisi. Il Capitolo 17, Programming for shared Access, descrive le tecniche per permettere a più utenti di accedere contemporaneamente al vostro database.

Considerazioni Internazionali Se sapete che la vostra applicazione sarà utilizzata da utenti di una sola lingua, non dovete preoccuparvi dell’internazionalizzazione. Se invece volete espandere il vostro mercato, o se i vostri utenti potrebbero avere a che fare con dati o ambienti internazionali, dovrete prendere in considerazioni questi aspetti nella creazione della vostra applicazione. Il Capitolo 18, Developing International Applications , prende in considerazione le problematiche che potrete incontrare mentre sviluppate delle applicazioni per uso internazionale.

Dati Locali o Dati Remoti Se la vostra applicazione tratta con dati remoti, dovrete immaginarli in maniera diversa rispetto al Native Visual Fox Pro data. Il Capitolo 8, Creating Views, spiega come creare views da dati locali o remoti. La parte 6 del Programmer’s Guide, Creating Client/Server Solutions, tratta come disegnare delle applicazioni che trattino similmente i dati interni con quelli remoti.

Page 31: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

31

Panoramica di una procedura

La procedura per creare una applicazione è molto iterativa. Poiché non ci sono due applicazioni che siano uguali tra loro, probabilmente svilupperete dei prototipi e ridefinirete alcune componenti parecchie volte prima di completare un lavoro. Le aspettative dell’utilizzatore finale o di chi commissiona il lavoro possono anche cambiare, richiedendovi di ridefinire alcuni aspetti dell’applicazione. E nessuno scrive codice senza errore (bug-free), così fare prove e debugging solitamente porta a delle revisioni e modifiche.

La procedura per creare una applicazione

Oltre a prendere in considerazione le parti principali nella fase di pianificazione, dovrete decidere quale funzionalità è necessaria, quali dati sono coinvolti, e come dovrebbe essere strutturato il database. Avrete la necessità di disegnare una interfaccia per fornire all’utente un accesso alle funzioni della applicazione. Potete creare stampe (reports) e interrogazioni (queries) in modo che l’utente possa estrapolare informazioni utili da questi dati.

Iniziare a sviluppare

Dopo avere pianificato di quali componenti avete bisogno per la vostra applicazione, potreste voler disegnare una struttura di cartelle e progettare i files che volete creare per la vostra applicazione. Potete costruirvi la struttura (framework) da soli in Windows Explorer e il progetto in Project Manager, o utilizzare Application Wizard per farli entrambi nello stesso momento. Application Wizard apre l’ Application Builder in modo che possiate adattare ulteriormente un progetto e i componenti che avviate con Wizard. Per una compatibilità a ritroso, potete anche scegliere Application Wizard (5.0).

Utilizzare Project Manager

Progetto del database Definizione dei requisiti

Creazione del database Tabelle Viste Relazioni

Fornire all’utente l’accesso alle funzioni del programma

?? ?? Form (Maschere) ?? ?? Menu ?? ?? Toolbars (Barre

strumenti)

Fornire all’utente l’accesso alle informazioni

?? ?? Query (interrogazioni )

?? ?? Report (stampe) ?? ?? Graphs (grafici ) Verifica e Collaudo Applicazione

Page 32: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

32

Il Projetc Manager vi permette di compilare la vostra applicazione completata, ma nella fase di sviluppo della applicazione, Project Manager facilita la progettazione, la modifica e l’esecuzione dei singoli componenti della vostra applicazione.

Project Manager

Quando utilizzate Project Manager potete:

I. Modificare e far avanzare parti della vostra applicazione (maschere, menu, programmi) con pochi click

II. Trascinare classi, tabelle e campi da Project Manager in Form Designer o Class Designer.

III. Trascinare classi tra librerie di classi.

IV. Visualizzare e modificare facilmente le vostre tabelle e database.

V. Aggiungere descrizioni ai componenti nella vostra applicazione.

VI. Trascinare e togliere elementi tra I progetti.

Per informazioni dettagliate sul modo di utilizzo di Project Manager vedi il Capitolo 1, Getting Started, nella User’s Guide. Per informazioni su come compilare applicazioni, vedi il Capitolo 13, Compiling an Application, in questo volume.

Page 33: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

33

Creare Databases Poiché una applicazione di database è fortemente dipendente dai dati principali, il modo migliore per iniziare a definire la vostra applicazione è di iniziare con i dati. Potete formare il vostro database e determinare quali relazioni ci sono tra le tabelle, quali regole volete implementare e così via, prima di disegnare qualsiasi interfaccia o componenti per la manipolazione dei dati. Un database solido rende molto più semplice lo sviluppo del lavoro.

Il Capitolo 5, Designing Databases, Capitolo 6, Creating Databases, e Capitolo 7, Working with Tables, trattano gli argomenti di progettazione e spiegano come usare Visual FoxPro per disegnare tabelle e database efficienti.

Creare classi Potete creare una applicazione solida, orientata all’oggetto, usando solamente classi base di Visual FoxPro. Potreste anche non dover mai creare una classe, ma potreste volerne creare una. Oltre a creare un codice più maneggevole e facile da mantenere, una libreria di classi solida vi permette di creare rapidamente prototipi e di aggiungere velocemente funzionalità ad una applicazione. Potete creare classi in un file di programma, nel Form Designer, (utilizzando il comando Save as a class dal File menu) o nel Class Designer.

Il capitolo 3, Object-Oriented Programming, tratta di alcuni vantaggi nel creare classi e dettagli di come crearli sia con il Class Designer che attraverso la codifica.

Accedere alla Funzionalità La soddisfazione del cliente sarà fortemente influenzata dall’interfaccia che voi fornirete per la funzionalità della vostra applicazione. Potete avere un modello molto chiaro di classe, un codice elegante, e anche soluzioni ad hoc per problemi difficili nella vostra applicazione, ma questi sono quasi sempre sconosciuti al vostro cliente. Ciò che risulta visibile è l’interfaccia che voi gli fornite. Fortunatamente gli strumenti di Visual FoxPro facilitano la creazione di interfaccia attraenti e caratteristiche.

L’interfaccia dell’utente consiste in particolare di maschere, barre strumenti, menu a tendina. Potete associare il funzionamento della vostra applicazione a controlli o comandi di menu nell’interfaccia. Il capitolo 9, Creating Forms, descrive come scrivere form sets. Come utilizzare i controlli di Visual FoxPro nelle vostre maschere è trattato nel Capitolo 10, Using Controls. Vedi Capitolo 11, Designing Menus and Toolbars, per dare gli ultimi ritocchi alla vostra applicazione.

Accedere alle informazioni Probabilmente mostrerete alcune informazioni per I vostri utenti nelle maschere, ma vorrete anche dare la possibilità ai vostri utenti di specificare esattamente quali informazioni vogliono vedere e l’opzione per stamparli sotto forma di report o etichette. Le queries, specialmente le queries che accettano parametri di definizione da parte dell’utente, permettono all’utente di avere un controllo maggiore sui dati. I reports permettono agli utenti di stampare completamente o parzialmente i dati.

IL Query Designer e il Report Designer sono trattati dal Capitolo 4 al Capitolo 7 della User’s Guide. Il Capitolo 12 di questo libro, Adding Queries e Reports, discute l’integrazione delle queries e i rapporti nell’applicazione. Il capitolo 16, Adding OLE, descrive l’integrazione OLE in una applicazione.

Page 34: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

34

Testing and Debugging

La verifica, l’individuazione e correzione degli errori (Testing e Debugging) è qualcosa che molti programmatori fanno ad ogni passo del procedimento di sviluppo. E’ una buona idea fare un test e debug a mano a mano che si prosegue nello sviluppo. Se create una maschera, vorrete essere sicuri che faccia quello che voi volete, prima di passare ad un altro elemento della vostra applicazione.

Il Capitolo 14, Testing and Debugging Applications, spiega come usare gli strumenti di debugging di Visual FoxPro per fare il debug delle vostre applicazioni e fornisce consigli su come rendere più veloce il procedimento di debugging.

Page 35: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

35

Capitolo 3: Programmazione Object-Oriented Traduzione di Baldarelli Gian-Carlo

Mentre Visual FoxPro mantiene il supporto per la programmazione strutturale, sono state introdotte nuove estensioni al linguaggio che consentono di ottenere la potenza e flessibilità offerta dalla programmazione orientata agli oggetti.

La progettazione orientata agli oggetti e la programmazione orientata agli oggetti rappresenta una variazione dalla metodo standard di programmazione procedurale. Al posto di pensare ad un programma che scorre dalla prima riga di codice fino all’ultima, dovete pensare come creare degli oggetti: contenitori di componenti di una applicazione che hanno funzionalità interne così come funzionalità che possono essere esposte all’utente

Questo capitolo tratta:

?? Capire gli oggetti in VFP ?? Capire le classi in VFP ?? Far corrispondere una classe allo scopo ?? Creare una classe ?? Aggiungere una classe ad una maschera ( form ) ?? Definizione di classe attraverso il codice

Gli Oggetti in Visual FoxPro

In VFP, Maschere e controlli sono oggetti che vengono inclusi nelle vostre applicazioni. Voi manipolate questi oggetti attraverso le loro proprietà, eventi e metodi

Le estensione del linguaggio orientato agli oggetti di VFP, forniscono un elevato grado di controllo sugli oggetto nelle vostre applicazioni. Queste estensioni rendono semplice la creazione e la manutenzione delle librerie di codice riutilizzabile, fornendovi:

?? Codice più compatto. ?? Semplicità nell’incorporare codice nelle applicazioni senza complessi processi di rinomina

degli schemi. ?? Minore complessità nell’integrazione di codice da differenti file in una applicazione.

La programmazione OOP è principalmente un modo di impacchettare il codice in modo che possa essere riutilizzato e mantenuto in modo più semplice. Il pacchetto principale è chiamato classe.

Classi e Oggetti: I mattoni principali delle applicazioni

Classi e Oggetti sono in stretta relazione, ma non sono la stessa cosa. Una classe contiene informazioni sul come un oggetto deve apparire e su come si deve comportare. Una classe è la fotocopia dello schema di un oggetto. Lo schema elettrico e di design di un telefono, ad esempio, può rappresentare una classe. L’oggetto, o una istanza di una classe, sarà l’apparecchio telefonico.

Page 36: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

36

Le classi determinano le caratteristiche di un oggetto.

Gli oggetti hanno proprietà

Un oggetto possiede alcune proprietà o attributi. Ad esempio, un telefono è di un certo colore e forma. Quando inserite un telefono in un ufficio, esso avrà una certa posizione sulla scrivania. La cornetta potrà essere sollevata o abbassata.

Gli oggetti che create in VFP hanno anche proprietà che vengono determinate dalla classe su cui si basano. Queste proprietà possono essere impostate in fase di progettazione o in fase di esecuzione.

Ad esempio, alcune proprietà che una casella di selezione può avere sono indicate nella seguente tabella:

Proprietà Descrizione

Caption Il testo descrittivo a fianco della casellina.

Enabled Specifica se la casella può essere selezionata dall’utente.

ForeColor Il colore del testo descrittivo.

Left La posizione della parte sinistra della casella di selezione.

MousePointer La forma del puntatore mouse quando passa sopra la casella.

Top La posizione della parte alta della casella.

Visible Indica se la casella deve essere visibile.

Gli Oggetti hanno eventi e metodi associati

Ogni oggetto riconosce e reagisce a determinate azioni che si definiscono eventi. Un evento è una attività specifica e predeterminata, iniziata dall’utente o dal sistema. Gli eventi, nella maggior parte dei casi, sono generati dall’iterazione dell’utente. Ad esempio, con il telefono, un evento viene

Page 37: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

37

innescato quando l’utente solleva la cornetta, o quando preme i tasti per comporre il numero di telefono.

In VFP, le azioni che l’utente provoca sono il movimento del mouse, il click del mouse, la pressione dei tasti della tastiera. L’inizializzazione di un oggetto, l’incontro di una linea di codice che causa un errore, sono esempi di eventi di sistema.

I metodi sono procedure associate con un oggetto. I metodi sono differenti dalle normali procedure di VFP, i metodi sono inestricabilmente confinati con un oggetto e vengono invocati in modo differente da come si richiamano le normali procedure.

Gli eventi possono avere metodi con loro associati. Ad esempio, se scrivete il codice per il metodo di gestione dell’evento click, questo codice viene eseguito quando avviene l’evento click. I metodi possono tuttavia esistere indipendentemente da qualsiasi evento. Questi metodi devono essere richiamati in modo specifico attraverso il codice.

L’elenco degli eventi, anche se vasto, è fisso. Voi non potete creare nuovi eventi, L’elenco dei metodi invece può essere estesa in modo infinito.

La seguente tabella elenca alcuni eventi associati con la solita casella di controllo (check box):

Evento Descrizione

Click L’utente clicca nella casella.

GotFocus L’utente seleziona la casella con un click o con il tasto TAB.

LostFocus L’utente Seleziona una casella differente.

La tabella seguente elenca I metodi associati con la medesima casella di controllo:

Method Description

Refresh Il valore della casella di controllo viene aggiornato per evidenziare qualsiasi cambiamento che possa essere accaduto alla sotto struttura del codice sorgente.

SetFocus Il fuoco viene impostato sulla casella sebbene l’utente abbia premuto il TAB mentre la casella era selezionata.

Nel capitolo 4 viene discusso il modello degli eventi e l’ordine in cui gli eventi accadono.

Capire le classi in Visual FoxPro

Tutte le proprietà, gli eventi ed I metodi di un oggetto sono specificate nella definizione della classe. In aggiunta, le classi hanno le seguenti caratteristiche che le rendono specialmente utili per il riutilizzo e la manutenzione:

Page 38: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

38

?? Incapsulamento ?? Sottoclasse ?? Eredità

Nascondere la complessità non necessaria

Quando inserite un telefono nel vostro ufficio, probabilmente non vi preoccupate del come faccia il telefono internamente a ricevere una chiamata, inizia e termina una connessione con la centrale di commutazione, o traduce la pressione di un tasto in un segnale elettrico. Quello che dove semplicemente sapere è che dovete sollevare la cornetta, comporre il numero e parlare con la persona con cui volete parlare, La complessità per raggiungere lo scopo è nascosta. Il beneficio di poter nascondere i dettagli interni di un oggetto in modo da concentrasi solo sull’oggetto viene definita Astrazione.

La complessità interna può essere nascosta

L’incapsulamento, che coinvolge: metodo di impacchettare e codice delle proprietà in un oggetto, contribuisce all’astrazione. Ad esempio, la proprietà che determina le voci di una casella di selezione (List Box) e il codice che viene eseguito quando selezionale una voce della lista, possono essere incapsulate insieme in un singolo controllo che aggiungete ad una maschera (form).

Utilizzare la potenza delle classi esistenti

Una sottoclasse può avere tutta la funzionalità di una classe esistente, più qualsiasi controllo o funzionalità aggiuntiva che le vogliate aggiungere. Se la vostra classe è un semplice telefono, voi potete creare una sottoclasse del telefono che possiede tutte le funzionalità di base del telefono stesso, con in aggiunta tutte quelle che vorrete aggiungere voi.

La creazione di sottoclassi consente il riutilizzo del codice

Page 39: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

39

La creazione di sottoclassi è un modo di ridurre la quantità di codice da scrivere. Iniziate con la definizione dell’oggetto che sia vicino a quello che desiderate e poi personalizzatelo.

Migliorare la manutenzione del codice

Attraverso l’eredità, se voi modificate una classe, la modifica si trasmetterà su tutte le sottoclassi di quella classe. Questo aggiornamento automatico consente di risparmiare tempo e fatica. Ad esempio, se il produttore dell’apparecchio telefonico, modifica l’apparecchio dal selettore a disco alla tastiera, risparmierà molto tempo se potrà apportare la modica in base allo schema di costruzione principale in modo che tutti i telefoni prodotti, basati su questo schema, possano ricevere automaticamente la modifica, senza dover intervenire su ogni telefono per ricevere la nuova tastiera.

L’eredità rende semplice la manutenzione del codice.

L’eredità non si applica all’Hardware, ma si può utilizzare nel software. Se scoprite un errore in una classe, invece di dover correggere l’errore in tutte le sottoclassi, basterà correggerlo nella classe e il modifica si ripercuoterà su tutte le sottoclassi di quella classe.

La gerarchia di classi di Visual FoxPro

Quando create delle classi definite, è importante conoscere la gerarchia adottata in VFP

Page 40: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

40

Page 41: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

41

La gerarchia delle classi in VFP

Page 42: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

42

Contenitore e Non contenitore

Le due principali di classi in VFP, e, per estensione, degli oggetti, sono le classi contenitore e le classi dei controlli

Classi contenitore e Classi controlli

Classi Contenitore

I contenitori possono contenere altri oggetti e consentire l’accesso agli oggetti contenuti. Ad esempio, se create una classe contenitore che consiste in due menu a tendina (list Box) e due tasti di comando ( command button) e quindi aggiungete un oggetto basato su questa classe ad una maschera (form), ogni singolo oggetto può essere manipolato sia in fase di progettazione che in fase di esecuzione. Potete facilmente modificare la posizione dei menu a tendina o dei titoli dei tasti di comando. Potete anche aggiungere oggetti al controllo in fase di progettazione, ad esempio potete aggiungere etichette che identificano i menù a tendina.

La seguente tabella elenca cosa può contenere ogni classe contenitore.:

Container Can contain

Gruppo tasti di comando Tasti di comando (Command buttons)

Contenitore (Container) Qualsiasi controllo

Controllo (Control) Qualsiasi controllo

(personalizzato) Custom Qualsiasi controllo, cornice, contenitore, personalizzati

Form sets Maschere (Forms), Barre strumenti (toolbars)

Page 43: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

43

Forms Cornici, qualsiasi controllo, contenitori, og.personalizzati

Colonne (Grid columns) Titoli Intestazioni e qualsiasi oggetto eccetto gruppi di maschere, maschere, barre strumenti, contatori, e altre colonne.

Griglie (Grids) Colonne (Grid columns)

Gruppi tasti opzioni (Option button groups)

Tasti opzioni (Option buttons)

Cornici (Page frames) Pagine

Pagine Qualsiasi controllo, contenitore, og. Personalizzato

Progetto Files, servers

Barre strumenti (Toolbars) Qualsiasi controllo, cornici, contenitore

Classi Controllo

Le classi controllo sono più incapsulate delle classi contenitore, ma possono risultare meno flessibili per questa ragione. Le classi controllo non dispongono del metodo AddObject

Adattare le classi ai compiti

Il vostro obiettivo è quello di essere in grado di utilizzare le classi in molti e svariati contesti. Una pianificazione intelligente vi consentirà di decidere in modo preciso quale classe progettare e quale funzionalità includere nella classe.

Decidere quando creare le classi

Potreste creare classi per ogni controllo e per ogni maschera che intendiate utilizzare, ma questo non è il metodo migliore per progettare una applicazione. Finireste per avere classi che fanno pressappoco la medesima cosa ma che devono essere mantenute separatamente.

Incapsulare le funzionalità generiche

Potete creare controlli per le funzionalità generiche. Ad esempio, tasti di comando che consentano all’utente di spostare il puntatore di una tabella, un tasto per la chiusura di una maschera, uno per l’help , possono essere tutti salvato in una classe e aggiunti alle maschere ogni volta che vorrete disporre di queste funzionalità.

Potete esporre le proprietà ed I metodi di una classe in modo che l’utente possa integrarle nell’ambiente dati di una maschera o di un gruppo di maschere.

Fornire un valido e gradevole aspetto all’applicazione

Potete creare gruppi di maschere, maschere e classi di controllo con un aspetto comune in modo che tutta l’applicazione abbia il medesimo aspetto. Per esempio potreste aggiungere grafica e colori ad

Page 44: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

44

una classe maschera e utilizzarla come cornice di base per tutte le maschere che creerete. Potreste creare una classe casella di testo con un preciso aspetto, come un effetto ombra, e quindi utilizzarla come una classe in tutta l’applicazione ogni colta che dovrete aggiungere una casella di testo.

Decidere che tipo di classe creare

VFP vi consente di creare diversi tipi di classe, ognuna con le sue proprie caratteristiche. Potete specificare il tipo di classe che intendete creare nella finestra di dialogo NewClass oppure con la clausola AS del comando CREATE CLASS nella finestra di comando.

Le classi di base di VFP

Potete creare sottoclassi della maggior parte delle classi di VFP attraverso il Class Designer.

Le classi di base di Visual FoxPro

ActiveDoc Custom Label PageFrame

CheckBox EditBox Line ProjectHook

Column* Form ListBox Separator

CommandButton FormSet OLEBoundControl Shape

CommandGroup Grid OLEContainerControl Spinner

ComboBox Header* OptionButton* TextBox

Container Hyperlink Object OptionGroup Timer

Control Image Page* ToolBar

* Queste classi sono una parte integrante di un contenitore genitore e quindi non si possono creare sottoclassi nel Class Designer.

Tutte le classi di base di VFP riconoscono di base tutti i seguenti eventi:

Evento Descrizione

Init Avviene quando un oggetto è creato.

Destroy Avviene quando un oggetto viene scaricato dalla memoria.

Error Avviene ogni volta che accade un errore in un evento o metodo della classe.

All Visual FoxPro base classes have the following minimum set of properties:

Page 45: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

45

Proprietà Descrizione

Class Che tipo di classe è.

BaseClass Da quale classe di base è derivata, come ad es. Una maschera, un modulo, un tasto di comando, un oggetto personale ecc.

ClassLibrary In quale libreria è salvato.

ParentClass La classe genitrice dalla quale è stato derivato. Se la classe è derivata da una classe di base VFP, la proprietà di ParentClass è la medesima di BaseClass.

Estendere le classi di base di VFP

Potete creare delle sottoclassi di queste classi in modo da impostare le vostre proprietà di controllo di base. Ad esempio, se volete che il nome di un controllo che aggiungete ad una maschera rifletta automaticamente la vostra convenzione dei nomi, potete creare delle classi basate su quelle di base di VFP allo scopo. Potete creare classi con un particolare aspetto o comportamento che servano da stampo per tutte le maschere che creerete.

Potete anche creare delle sottoclassi di quelle di base per creare dei controlli con delle funzionalità incapsulate. Se volete che un click su un tasto chiuda una maschera , potete creare una classe basata sulla classe command button di VFP, impostare la proprietà captino su Quit e includere il seguente comando associato all’evento click

THISFORM.Release

Potete quindi aggiungere questo tasto a qualsiasi maschera della vostra applicazione.

Tasto personalizzato aggiunto ad una maschera.

Creare controlli con componenti multipli

Le vostre sottoclassi non sono limitate ad una singola classe di base. Potette aggiungere controlli multipli ad una singola definizione di classe. Molti delle classi di VFP della libreria di esempi ricadono in questa categoria. Ad esempio la classe VCR nel Buttons.vcx che si trova nella cartella

Page 46: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

46

Visual Studio …\Samples\Vfp98\Classes, contenente 4 tasti di comando per la navigazione fra i record di una tabella.

Creare classi non visuali

Una classe basata sulla classe custom di VFP non ha elementi visuali di funzionamento. Potete creare metodi e proprietà per la vostra classe utilizzando l’ambiente Class Designer. Ad esempio, potreste creare una classe personale chiamata StrMethods e includere un numero di metodi per manipolare le stringhe di carattere.

THISFORM.txtCount.Value = ; THISFORM.StrMethods.WordCount(THISFORM.edtText.Value)

Le classi non visuali ( come ad esempio controlli, timer ) hanno una rappresentazione visuale solamente in fase di progettazione nel FormDesigner. Impostate la proprietà picture (immagine) della classe personale con il file .bmp che volete mostrato nel FormDesigner quando la classe viene aggiunta ad una maschera.

Creare delle classi

Potete creare delle nuovi classi nel ClassDesigner e potete vedere come ogni singolo oggetto apparirà all’utente mentre lo progettate.

Per creare una nuova classe

?? Nel Project Manager, selezionate la linguetta Classes e cliccate su New.

-or-

?? Dal menu File, scegliete New, selezionate Class, e scegliete New File.

-or-

?? Utilizzate il comando CREATE CLASS nella finestra di comando.

La finestra di dialogo New Class vi consentirà di specificare come chiamare la nuova classe, su quale classe di base si basa e in quale libreria salvarla.

Creare una nuova classe

Page 47: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

47

Cambiare la definizione di una classe

Appena avete creato una classe, potete modificarla. Le modifiche apportate ad una classe hanno effetto su tutte le sottoclassi e tutti gli oggetti basati su quella classe. Potete aggiungere miglioramenti alla classe o correggere un errore, tutte le sottoclassi e gli oggetti basati erediteranno le modifiche.

Per modificare una classe nel Project Manager

1. Selezionate una classe che volete modificare.

2. scegliete Modify.

Si aprirà il Class Designer .

Potete modificare la definizione di una classe visuale attraverso il commando MODIFY CLASS.

Importante. Non cambiate la proprietà nome della classe se la classe è già stata utilizzata in altri componenti di applicazioni . Altrimenti VFP non sarà in grado di localizzare la classe quando necessario.

Creare una sottoclasse della definizione

Potete creare una sottoclasse di una classe personale (user defined) in uno o due modi..

Per creare una sottoclasse di una classe user-defined

1. Nella finestra di dialogo New Class, cliccate il tasto alla destra della casella di Based On.

2. Nella finestra Open che si è aperta, scegliete la classe su cui volete basarvi.

-oppure-

?? Utilizzate il commando CREATE CLASS .

Ad esempio, per creare una nuova classe x basata sulla classe genitrice (parentclass) nella Mylibrary.vcx, utilizzate il seguente codice:

CREATE CLASS x OF y AS parentclass ; FROM mylibrary

Utilizzare il Class Designer

Quando specificate la classe su cui si basa la vostra nuova classe e la libreria dove salvare la classe, si apre il Class Designer.

Page 48: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

48

Class Designer

Il Class Designer mostra la stessa interfaccia del Form Designer. Consentendovi di visualizzare e editare le proprietà della vostra classe nella finestra Properties. La finestra per l’editing vi consente di scrivere codice da eseguire quando vengono richiamati metodi o accadono eventi.

Aggiungere Oggetti alla classe Control o Container

Se basate la nuova classe sulla classe controlli o contenitori, potete aggiungere controlli nello stesso modo in cui aggiungete controlli al Form Designer: selezionate il tasto di controllo dalla barra strumenti Form Controls e trascinatelo nella dimensione voluta nel Class Designer.

Non importa che tipo su quale tipo di classe vi state basando, potete impostare proprietà e scrive re metodi. Potete anche creare nuove proprietà e metodi per la classe.

Aggiungere Proprietà e metodi alla classe

Potete aggiungere tutte le proprietà e metodi che volete alla nuova classe. Le proprietà conterranno i valori; i metodi conterranno il codice procedurale che verrà eseguito quando verrà invocato il metodo.

Creare nuove proprietà e metodi

Quando create nuove proprietà e metodi per una classe, le proprietà ed I metodi sono estesi a tutta la classe e non solo ad un singolo componete.

Per aggiungere una nuova proprietà ad una classe

1. Dal menu Class, scegliete New Property.

2. Nella finestra di dialogo New Property, scrivete il nome della nuova proprietà.

Page 49: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

49

3. Indicate la visibilità: Public, Protected, or Hidden. (pubblica protetta nascosta)

Una proprietà pubblica può essere disponibile ovunque nell’applicazione. Le proprietà e i metodi protetti o nascosti vengono discussi nella parte Proteggere e Nascondere membri di una classe.

La finestra di dialogo New Property

4. Cliccare su Add.

Potete anche aggiungere una descrizione della proprietà che sarà mostrata nella parte basse della finestra delle proprietà nel Class Designer e nel Form Designer quando il controllo viene aggiunto alla maschera.

Problematiche – Quando aggiungete una proprietà ad una classe che può essere impostata dall’utente della classe, l’utente potrebbe inserire un valore non valido e quindi provocare un errore di esecuzione. Dovete specificare i valori validi per la proprietà. Se la proprietà può essere impostata a 0, 1, o 2, ad esempio, specificatelo nella casella Descrizione della finestra di dialogo New Property. Dovreste anche verificare il valore attraverso il codice che si riferisce a quella proprietà.

Per creare un array ( insieme, matrice ) di dati proprietà

?? Nella casella Name della finestra di dialogo New Property, specificate il nome, la grandezza e la dimensione della matrice.

Ad esempio, per creare una proprietà di nome Myarray con 10 colonne e dieci righe scrivete quanto segue nella casella Name.

myarray[10,2]

La proprietà matrice e solo in lettura in fase di progettazione e viene mostrata nella finestra di dialogo delle Properties in corsivo. La proprietà matrice può essere gestita e ridimensionata in fase di esecuzione. Un esempio si trova nel capitolo 9 “Gestione di istanze multiple in una maschera.”

Page 50: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

50

Per aggiunger un nuovo metodo ad una classe

Dal menu Class. Scegliete New Method.

1. Nella finestra di dialogo New Method, scrivete il nome del metodo.

2. Specificate la visibilità: Public, Protected, or Hidden.

3. Selezionate la casella di selezione Access per specificare un metodo di accesso, selezionate la casella Assign per creare una metodo di assegnazione.

I metodi Access e Assign vi consentono di eseguire del codice quando il viene richiesto il valore della proprietà o quando tentate di modificare il valore della proprietà.

Il codice di un metodo access viene eseguito quando si interroga il valore della proprietà, di solito quando si riferisce alle proprietà di un oggetto, immagazzinando il valore della proprietà in una variabile, oppure stampando il valore della proprietà con il punto interrogativo.

Il codice in un metodo Assign viene eseguito quando tentate di modificare il valore di una proprietà, si solito utilizzando il commando STORE per assegnare un nuovo valore alla proprietà.

Potete anche aggiungere una descrizione del metodo.

Proteggere e Nascondere I membri di una classe

Le proprietà ed i metodi in una classe sono Public per definizione: il codice in altre classi e procedure possono impostare o richiamare i metodi. Le proprietà ed i metodi che voi impostate come Protected possono essere acceduti solo da altri metodi della definizione di classe o nelle sottoclassi della classe stessa. Proprietà e metodi di classi definite Hidden possono essere accedute solo da altri membri della definizione di classe, sottoclassi della classe non possono vedere o riferirsi a membri nascosti.

Per assicurare il corretto funzionamento in alcune classi, avete bisogno di prevenire il fatto che l’utente possa modificare le proprietà o richiamare metodi dall’esterno della classe.

Il seguente esempio mostra come proteggere le proprietà ed I metodi di una classe..

La classe orologio inclusa nel Samples.vcx, nella cartella Visual Studio …\Samples\Vfp98\Classes, include un timer e 5 Labels per mostrare il tempo trascorso.

La classe stopwatch del Samples.vcx

Page 51: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

51

La classe Stopwatch contiene etichette e un timer.

L’impostazione delle proprietà della classe Stopwatch

Controllo Proprietà Impostazione

lblSeconds Caption 00

lblColon1 Caption :

lblMinutes Caption 00

lblColon2 Caption :

lblHours Caption 00

tmrSWatch Interval 1000

Questa classe possiede anche tre proprietà nascoste, nSec, nMin, nHour e un metodo nascosto UpdateDisplay.

Tip Cliccate su Class Info del menu Class per visualizzare la visibilità di tutte le proprietà e metodi di una classe.

Le proprietà protette vengono utilizzate per calcoli interni nel metodo UpdateDisplay e l’evento Timer. Il metodo UpdateDisplay imposta i titoli delle etichette sul valore del tempo trascorso.

Il metodo UpdateDisplay

Code Comments

cSecDisplay = ALLTRIM(STR(THIS.nSec)) cMinDisplay = ALLTRIM(STR(THIS.nMin)) cHourDisplay = ALLTRIM(STR(THIS.nHour))

Converte le proprietà numeriche nel tipo carattere per la visualizzazione nei titoli delle etichette.

THIS.lblSeconds.Caption = ; IIF(THIS.nSec < 10, ; "0" ,"") + cSecDisplay THIS.lblMinutes.Caption = ; IIF(THIS.nMin < 10, ;

Imposta il titolo delle etichette, mantenendo il valore zero se il tempo è inferiore a 10.

Page 52: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

52

"0", "") + cMinDisplay THIS.lblHours.Caption = ; IIF(THIS.nHour < 10, ; "0", "") + cHourDisplay

La seguente tabella elenca il codice del tmrSWatch.Timer:

L’evento timer

Code Comments

THIS.Parent.nSec = THIS.Parent.nSec + 1 IF THIS.Parent.nSec = 60 THIS.Parent.nSec = 0 THIS.Parent.nMin = ; THIS.Parent.nMin + 1 ENDIF

Incrementa la proprietà nSec ogni volta che accade l’evento timer: ogni secondo Se nSec è uguale a 60, settala a 0 e incrementa la proprietà nMin.

IF THIS.Parent.nMin = 60 THIS.Parent.nMin = 0 THIS.Parent.nHour = ; THIS.Parent.nHour + 1 ENDIF THIS.Parent.UpdateDisplay

Se nMin ha raggiunto 60, settala a zero e incrementa la proprietà nHour.

Richiama il metodo UpdateDisplay quando vengono impostate le nuove proprietà..

La classe stopwatch ha tre metodi che non sono protetti: Start, Stop e Reset. Un utente può chiamare questi metodi direttamente per controllare il cronometro.

Il metodo Start contiene le seguenti linee di codice:

THIS.tmrSWatch.Enabled = .T.

Il metodo Stop contiene la seguente linea di codice:

THIS.tmrSWatch.Enabled = .F.

Il metodo Reset imposta le proprietà protette a zero e richiama il metodo protetto:

THIS.nSec = 0 THIS.nMin = 0 THIS.nHour = 0 THIS.UpdateDisplay

L’utente non può impostare direttamente queste proprietà o richiamare questo metodo, ma il codice del metodo reset lo può fare.

Page 53: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

53

Specificare il valore di base di una proprietà

Quando create una nuova proprietà, il valore di base è falso .F. per indicare un valore di base diverso, utilizzate la finestra delle proprietà. Nella scheda Other, scegliete la vostra proprietà ed inserite il valore desiderato. Questo sarà il valore iniziale quando la classe viene aggiunto ad una maschera o ad un set di maschere.

Potete assegnare qualsiasi proprietà nel Class Designer. Quando un oggetto basato su quella classe viene aggiunto ad una maschera, l’oggetto rifletterà le proprietà assegnate da voi piuttosto che quelle delle classi di base di VFP

Tip Se volete impostare come valore di base di proprietà come stringa vuota, selezionate la casella Property e utilizzate il tasto BACKSPACE

Specificare l’apparenza in fase di progettazione

Potete specificare la barra degli strumenti e il contenitore delle icone della vostra classe nella finestra di dialogo Class Info.

Per impostare la barra degli strumenti delle icone di una classe

1. Nel Class Designer, scegliete Class Info dal menu Class.

2. Nella finestra di dialogo Class_Info , scrivete il nome ed il percorso del file .BMP nella casella Toolbar icon.

Tip L’immagine .bmp è di dimensione 15 x 16 pixel. Se è maggiore viene automaticamente ridimensionata e quindi potrebbe essere visualizzata in modo differente.

L’icona della barra strumenti che specificate viene mostrata nella barra degli strumenti Form Control quando riempite la barra strumenti con le classi nella vostra libreria di classi.

Potete specificare l’icona che deve essere mostrata nel Project Manager e Class Browser

Per impostare una icona container per una classe

1. Nel Class Designer, scegliete Class Info dal menu Class.

2. Nella casella Container icon, scrivete il nome ed il percorso del file .bmp che deve essere mostrata sul tasto della barra strumenti Form Controls.

Utilizzare la libreria di classi

Ogni classe visualizzabile viene salvata in una libreria di classi con estensione .vcx

Creare una libreria di classi

Potete creare una libreria di classi in uno di questi tre metodi.

Page 54: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

54

Per creare una libreria di classi

?? Quando create una classe, specificate un nuovo file nella casella Store In della finestra di dialogo New Class.

-or-

?? Utilizzare il commando CREATE CLASS specificando il nome del file nuova lebreria.

Ad esempio, la seguente dichiarazione crea una nuova classe di nome myclass e una nuova libreria di nome new_lib:

CREATE CLASS myclass OF new_lib AS CUSTOM

-or-

?? Utilizzate il commando CREATE CLASSLIB .

Ad esempio, scrivete il seguente commando nella finestra di commando per creare una nuova libreria di classi new_lib:

CREATE CLASSLIB new_lib

Copiare e cancellare librerie di classi

Una volta creata una libreria potete velocemente copiare classi da una libreria ad un altra o semplicemente rimuovere classi dalla libreria.

Per copiare una classe da una libreria ad un’altra

1. Assicuratevi che entrambe le librerie siano nel progetto ( non necessariamente lo stesso ).

2. Nel Project Manager, selezionate la scheda Classes.

3. cliccate sul segno (+) alla sinistra della libreria in cui si trova la classe.

4. Trascinate la classe dalla libreria originale alla nuova libreria.

Tip Per convenienza e rapidità potreste voler mantenere una classe e tutte le sottoclassi in una unica libreria. Se avete una classe che contiene elementi di diverse librerie, tutte le librerie devono essere aperte, così occorrerà per caricare inizialmente la classe in fase di esecuzione o progettazione.

Per rimuovere una classe da una libreria

?? Selezionate la classe nel Project Manager e scegliere Remove.

-or-

?? Utilizzate il commando REMOVE CLASS.

Page 55: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

55

Per modificare un nome di una classe nella libreria, utilizzate il commando RENAME CLASS. Ricordatevi tuttavia che quando cambiate un nome di una classe, le maschere che contengono quella classe e le sottoclassi in altri .vcx continueranno a riferirsi al vecchio nome e non funzioneranno quindi correttamente.

VFP include un Class Browser per facilitare la gestione delle classi e delle librerie.

Aggiungere classi ad una maschera (Form)

Potete aggiungere una classe dal Project Manager al Form Designer a al Class Designer. Potete anche registrare la vostra classe in modo che possa essere mostrata direttamente nella barra degli strumenti del Form Controls del Class Designer e aggiungerle ai contenitori così come allo stesso modo vengono aggiunti i controlli standard

Per registrare un a libreria di classi

1. Dal menu Tools, selezionate Options .

2. Nella finestra di dialogo Options , scegliete la scheda Controls.

3. Selezionate Visual Class Libraries e cliccate su Add.

4. Nella finestra di dialogo Open, scegliete una libreria da aggiungere al registro e cliccare su Open.

5. Ciccate su Set as Default se desiderate che la libreria sia disponibile nella barra degli strumenti Form Controls per le prossime sessioni di VFP.

Potete anche aggiungere la vostra libreria alla barra degli strumenti del From Controls scegliendo Add dal sottomenù del tasto View Class. Per rendere disponibile questa classe nella barra degli strumenti del Form Controls per le prossime sessioni di VFP, dovete impostarla anche come default nella casella Options

Ignorare le proprietà di base (default)

Quando aggiungete oggetti basati su una classe personale ad una maschera, potete modificare le impostazioni delle proprietà delle classi che non sono protette, ignorando le impostazioni di default. Se successivamente modificate le proprietà delle classi nel Class Designer, le impostazioni dell’oggetto nella maschera non vengono influenzati. Se non avete modificato le impostazioni delle proprietà in una maschera e cambiate le impostazioni in una classe, la modifica avrà effetto anche sull’oggetto.

Ad esempio, un utente può aggiungere un oggetto basato sulla vostra classe in una maschera e cambiare la proprietà del colore dello sfondo da bianco a rosso. Se modificate la proprietà BackColor della classe a verde, l’oggetto nella maschera dell’utente avrà ancora il colore di fondo rosso. Se d’altra parte, l’utente non cambia la proprietà del colore di fondo dell’oggetto e voi avete cambiato il colore della classe a verde, la proprietà dell’oggetto sulla maschera erediterà la modifica e sarà verde.

Page 56: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

56

Chiamare il metodo della classe genitore

Un oggetto o classe basato su un’altra classe automaticamente eredita la funzionalità dell’originale. Tuttavia, potete facilmente ignorare il metodo ereditato. Ad esempio, potete scrivere nuovo codice per ‘evento Click di una classe dopo averla creata come sottoclasse oppure dopo che avete aggiunto un oggetto basato sulla classe ad un contenitore. In entrambi i casi, il nuovo codice viene eseguito in fase di esecuzione, il codice originale non viene eseguito.

Molto più spesso, tuttavia, vorrete aggiungere funzionalità alla nuova classe o oggetto piuttosto che mantenere quelle originali. In effetti, una delle decisioni chiave che dovete fare nella programmazione ad oggetti è quale funzionalità aggiungere a livello di classe, a livello di sottoclasse, e, a livello di oggetto. Potete ottimizzare la progettazione delle classi utilizzando la funzione DODEFAULT() oppure attraverso l’operatore per la portata di risoluzione (::) per aggiungere codice a differenti livelli nella classe o nella gerarchia dei contenitori

Aggiungere funzionalità alla sottoclasse

Potete richiamare il codice della classe genitrice da una sottoclasse utilizzando la funzione DODEFAULT().

Ad esempio, cmdOK è una classe di tasti di commando della libreria Button.vcx, localizzata nella cartella …\Samples\Vfp98\Classes del Visual Studio. Il codice associato con l’evento click di cmdOk rilascia la maschera in cui si trova il tasto. CmdCancel è una sottoclasse di cmdOk della stessa libreria di classe. Per aggiungere funzionalità a cmdCancel per rifiutare le modifiche, ad esempio, potete aggiungere il seguente codice all’evento click:

IF USED( ) AND CURSORGETPROP("Buffering") != 1 TABLEREVERT(.T.) ENDIF DODEFAULT( )

Poiché le modifiche sono aggiunte comunemente alla tabella in memoria, quando la tabella viene chiusa, non avete bisogno di aggiungere la funzione TABLEUPDATE() a cmdOk. Il codice aggiuntivo in cmdCancel annulla le modifiche prima di chiamare il codice cmdOk, classe genitrice, per scaricare la maschera.

Classi e Gerarchie di contenitori

La gerarchie di classi e I contenitori sono due entità separate. VFP cerca il codice deglil eventi per tutta la gerarchia delle classi, per gli oggetti invece cerca nella gerarchia dei contenitori. La seguente sezione tratta la gerarchia dei container. Più avanti viene spiegata la gerarchia di classi nella sezione Chiamare il codice evento nella gerarchia di classi.

Riferirsi ad oggetti nella gerarchia dei container

To manipulate an object, you need to identify it in relation to the container hierarchy. For example, to manipulate a control on a form in a form set, you need to reference the form set, the form, and then the control.

Page 57: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

57

Per manipolare un oggetto, avete bisogno di identificarlo nella relazione alla gerarchia dei container. Ad esempio per manipolare un controllo di una maschera di una serie di maschera, dovete prima riferirvi alla serie delle maschere, poi alla maschera, e quindi al controllo.

You can compare the referencing of an object within its container hierarchy to giving Visual FoxPro an address to your object. When you describe the location of a house to someone outside your immediate frame of reference, you need to indicate the country, the state or region, the city, the street, or just the street number of the house, depending on how far they are from you. Otherwise, there could be some confusion

Potete confrontare il relazione ad un oggetto all’interno della sua gerarchia di contenitori per fornire a VFP un indirizzo al vostro oggetto. Quando decidete di descrivere la posizione di una casa a qualche persona al di fuori della vostra cerchia di conoscenza, avete bisogno di indicare la nazione, la regione oppure solo la strada ed il numero civico della casa, dipendentemente da quanto lontano la persona è lontana da voi

La seguente illustrazione mostra un possibile contenitore di situazioni annidate.

Contenitore annidato

Per disattivare il controllo nella colonna di una griglia, dovete fornire il seguente indirizzo:

Formset.Form.PageFrame.Page.; Grid.Column.Control.Enabled = .F.

La proprietà ActiveForm dell’oggetto dell’applicazione (_VFP) consente di manipolare la maschera attiva ance se non conoscete il suo nome. Ad esempio, la seguente linea di codice cmodifica il colore di sfondo della maschera attiva, non importa a quale serie appartiene:

_VFP.ActiveForm.BackColor = RGB(255,255,255)

In modo simile, la proprietà ActiveControl vi consente di manipolare il controllo attivo nella mascera attiva. Ad esempio, la seguente espressione inserita nella finestra di controllo (Wath window) mostra il nome del controllo sulla maschera nel momento in cui voi iterativamente scegliete alcuni controlli:

_VFP.ActiveForm.ActiveControl.Name

Page 58: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

58

Relative Referencing

Quando fate riferimento a oggetti all’interno della gerarchia dei contenitori (ad esempio, nell’evento click del tasto di comando su una maschera appartenente ad una serie), potete utilizzare alcune scorciatoie per identificare l’oggetto che volete manipolare. La seguente tabella elenca le proprietà o chiavi che semplificano la relazione ad un oggetto all’interno della gerarchia di oggetti:

Proprietà o Chiavi Riferimento

Parent Fa riferimento all'oggetto contenitore di un controllo

THIS Fornisce un riferimento ad un oggetto prima che venga creato

THISFORM Fornisce un riferimento ad un oggetto maschera (Form) prima che venga creato

THISFORMSET Fornisce un riferimento ad un oggetto FormSet prima che venga creato

Note Potete utilizzare THIS, THISFORM, e THISFORMSET solo in codice metodo o evento

La seguente tabella fornisce una esempio di utilizzo di THISFORMSET, THISFORM, THIS, e Parent per impostare le proprietà di un oggetto:

Command Dove includere il commando

THISFORMSET.frm1.cmd1.Caption = "OK" Nel codice dell’evento o metodo di qualsiasi controllo in qualsiasi maschera di una serie.

THISFORM.cmd1.Caption = "OK" Nel codice dell’evento o metodo di qualsiasi controllo nella stessa maschera dove si trovi cmd1.

THIS.Caption = "OK" Nel codice dell’evento o metodo del controllo di cui volete modificare il titolo.

THIS.Parent.BackColor = RGB(192,0,0) Nel codice dell’evento o metodo di un controllo in una maschera. Il comando cambia il colore da scuro a rosso..

Impostare le proprietà

Potete impostare le proprietà sia in fase di esecuzione che in fase di progettazione

Page 59: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

59

Per impostare una proprietà

?? Utilizzare questa sintassi:

Container.Object.Property = Value

Ad esempio, la seguente dichiarazione imposta varie proprietà di una casella ti testo di nome txtDate in una maschera di nome frmPhoneLog:

frmPhoneLog.txtDate.Value = DATE( ) && Mostra la data corrente frmPhoneLog.txtDate.Enabled = .T. && Il controllo viene attivato frmPhoneLog.txtDate.ForeColor = RGB(0,0,0) && Testo in nero frmPhoneLog.txtDate.BackColor = RGB(192,192,192) && Sfondo grigio

Per l’impostazione delle proprietà nell’esempio precedente, frmPhoneLog è l’oggetto contenitore al più alto livello. Se frmPhoneLog fosse contenuto in una serie di maschere, avreste anche dovuto includere la serie nel percorso genitore

frsContacts.frmPhoneLog.txtDate.Value = DATE( )

Impostare proprietà multiple

Con la struttura WITH ... ENDWITH si semplifica l’impostazione delle proprietà multiple. Ad esempio, per impostare le proprietà multiple delle colonne di una griglia di una maschera di una serie, potete utilizzare la seguente sintassi:

WITH THISFORMSET.frmForm1.grdGrid1.grcColumn1 .Width = 5 .Resizable = .F. .ForeColor = RGB(0,0,0) .BackColor = RGB(255,255,255) .SelectOnEntry = .T. ENDWITH

Chiamare metodi

Una volta che sia creato l’oggetto, potete chiamare I metodi di quell’oggetto da qualsiasi punto della vostra applicazione.

Per chiamare un metodo

?? Utilizzate questa sintassi:

Parent.Object.Method

La seguente dichiarazione chiama I metodi per mostrare una maschera e impostare il la partenza (focus) in una casella di testo.:

frsFormSet.frmForm1.Show frsFormSet.frmForm1.txtGetText1.SetFocus

Page 60: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

60

I metodi che restituiscono valori sono utilizzati in espressioni, devono terminare con le doppie parentesi (). Ad esempio, la seguente dichiarazione imposta il titolo di una maschera al valore che viene restituito dal metodo definito dall’utente GetNewCaption:

Form1.Caption = Form1.GetNewCaption( )

Note I parametric passati ad un metodo devono essere racchiusi fra parentesi dopo il nome del metodo; ad esempio, Form1.Show(nStyle). Passa nStyle al metodo mostra di Form1.

Rispondere agli eventi

Il codice che includete in una procedura gestione eventi viene eseguito quando accade un evento. Ad esempio, il codice che includete nel codice per gestire l’evento click di una tasto di commando viene eseguito quando l’utente clicca sul tasto.

Un evento può essere provocato artificialmente anche attraverso la programmazione: Click, DblClick, MouseMovi e DragDrop attraverso il comando mouse, oppure utilizzare il comando ERROR per generare un evento errore e il comando KEYBOARD per generare l’evento KeyPress. Non potete creare altri eventi tramite la programmazione, ma potete richiamare la procedura associata con l’evento. Ad esempio la seguente istruzione esegue il codice di attivazione dell’oggetto frmPhoneLog, ma non attiva la maschera:

frmPhoneLog.Activate

Se volete attivare la maschera, utilizzate il metodo Show della maschera. Richiamare il metodo show provoca la visualizzazione e attivazione della maschera nel punto in cui l’evento Activate viene eseguito.

frmPhoneLog.Show

Definire le classi attraverso la programmazione

Potete definire delle classi visualmente attraverso il ClassDesigner e il FormDesigner o attraverso la programmazione in file .prg . Questa sezione descrive come scrivere definizioni di classi. Per informazioni sui comandi, funzioni, operatori specifici utilizzate l’help

In a program file, you can have program code prior to the class definitions, but not after the class definitions, in the same way that program code cannot come after procedures in a program. The basic shell for class creation has this syntax:

In un file programma, potete avere il codice del programma prima della definizione della classe, ma non dopo, allo stesso modo in cui non potete avere il codice programma dopo le procedure. L’impostazione di base per la creazione di una classe ha la seguente sintassi:

DEFINE CLASS ClassName1 AS ParentClass [OLEPUBLIC] [[PROTECTED | HIDDEN PropertyName1, PropertyName2 ...] [Object.]PropertyName = eExpression ...] [ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT] [WITH cPropertylist]]... [[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name[_ACCESS | _ASSIGN] [NODEFAULT]

Page 61: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

61

cStatements [ENDFUNC | ENDPROC]]... ENDDEFINE

Proteggere e nascondere I membri di una classe

Potete proteggere o nascondere proprietà e metodi in una definizione di classe con le chiavi PROTECTED e HIDDEN del commando DEFINE CLASS

Ad esempio, se create una classe per mantenere le informazioni degli impiegati, e non volete che l’utente possa modificare il giorno di paga, potete proteggere la proprietà HireDate.(GiornoDiPaga). Se l’utente necessita quando è stato pagato un dipendente, potete includere un metodo che restituisca il giorno di paga

DEFINE CLASS employee AS CUSTOM PROTECTED HireDate First_Name = "" Last_Name = "" Address = "" HireDate = { - - } PROCEDURE GetHireDate RETURN This.HireDate ENDPROC ENDDEFINE

Creare oggetti da una classe

Quando avete salvato una classe visuale, potete creare un oggetto basato su quella classe attraverso la funzione CREATEOBJECT( ) . Il seguente esempio mostra come eseguire una maschera salvata come definizione di una classe nella libreria Forms.vcx:

Creare e visualizzare un oggetto maschera la cui classe è stata progettata nel Form Designer

Codice Commento

SET CLASSLIB TO Forms ADDITIVE Imposta la libreria sul file .vcx in cui la definizione di maschera è stata salvata. La chiave ADDITIVE previene questo comando dal chiudere qualsiasi libreria che risulti aperta.

frmTest = CREATEOBJECT("TestForm") Il codice assume che il nome della classe della maschera salvata nella libreria sia TestForm.

frmTest.Show Mostra la maschera

Aggiungere un oggetto ad una classe contenitore

Potete utilizzare la clausola ADD OBJECT del comando DEFINE CLASS oppure il metodo AddObject per aggiungere un oggetto al contenitore.

Page 62: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

62

Ad esempio, la seguente definizione di classe si basa su una maschera. Il comando ADD OBJECT aggiunge due tasti di comando alla maschera:

DEFINE CLASS myform AS FORM ADD OBJECT cmdOK AS COMMANDBUTTON ADD OBJECT PROTECTED cmdCancel AS COMMANDBUTTON ENDDEFINE

Utilizzate il metodo AddObject per aggiungere oggetti al contenitore dopo che questo è stato creato. Ad esempio il seguente codice crea una maschera e aggiunge due tasti di comando:

frmMessage = CREATEOBJECT("FORM") frmMessage.AddObject("txt1", "TEXTBOX") frmMessage.AddObject("txt2", "TEXTBOX")

Potete anche utilizzare il metodo AddObject nel codice metodo di una classe. Ad esempio, la seguente definizione di classe utilizza AddObject nel codice associato all’evento Init per aggiungere un controllo alle colonne di una griglia.

DEFINE CLASS mygrid AS GRID ColumnCount = 3 PROCEDURE Init THIS.Column2.AddObject("cboClient", "COMBOBOX") THIS.Column2.CurrentControl = "cboClient" ENDPROC ENDDEFINE

Aggiungere e creare classi nel codice metodo

Potete aggiungere oggetti ad un contenitore attraverso la programmazione con il metodo AddObject. Potete anche creare oggetto con la funzione CREATEOBJECT() nei metodi Load, Init o qualsiasi altro metodo della classe.

Quando aggiungete un oggetto mediante il metodo AddObject, l’oggetto diventa un metodo del contenitore. La proprietà Parent dell’oggetto aggiunto si riferisce al contenitore. Quando un oggetto basato sul contenitore o sulla classe controllo viene scaricato dalla memoria, viene scaricato anche l’oggetto aggiunto.

Quando create un oggetto con la funzione CREATEOBJECT(), l’oggetto è esteso ad una proprietà della classe o a una variabile della classe metodo che chiama questa funzione

Attribuire metodi e codice eventi

In aggiunta alla scrittura di codice per I metodi e gli eventi di un codice, potete estendere la serie di metodi alle sottoclassi di quelle di base di VFP. Ecco alcune regole per scrivere codice eventi e metodi:

?? La serie di eventi della classi base di VFP non può essere estesa. ?? Ogni classe riconosce una serie di eventi fissi di base, fra cui si include i metodi Init, Destry

e Error. ?? Quando create un metodo nella definizione di classe con lo stesso nome dell’evento che la

classe può riconoscere, il codice del metodo viene eseguito quando accade l’evento.

Page 63: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

63

?? Potete aggiungere metodi alle vostre classi attraverso la creazione di procedure e funzioni all’interno della definizione di classe.

?? Potete creare metodi Access e Assign per le vostre classi attraverso procedure o funzioni con lo stesso nome della proprietà della classe com _ACCESS e _ASSIGN aggiunte al nome della procedura o della funzione.

Richiamare il codice gestione eventi attraverso la gerarchia di classe

Quando create una sottoclasse, la classe eredita automaticamente tutte le proprietà, metodi ed eventi della classe genitore. Se il codice è scritto per un evento della classe genitore, quel codice viene eseguito quando accade un evento in relazione ad un oggetto nella sottoclasse. Voi potete tuttavia ignorare il codice della classe genitore scrivendo codice per quel evento nella sottoclasse.

Per chiamare in modo specifico un codice di evento in una classe genitore anche quando una sottoclasse possiede il codice per lo stesso evento, utilizzate la funzione DODEFAULT().

Per esempio, potreste avere una classe che si chiama cmdBottom che si basa sulla classe di base dei tasti di commando che ha il seguente codice per gestire l’evento click:

GO BOTTOM THISFORM.Refresh

Quando aggiungete un oggetto basato su questa classe in una maschera, chiamata, ad esempio, cmdBottom1, potreste decidere che volete anche mostrare un messaggio per l’utente in modo che lui o lei sappia che il puntatore dei record di una tabella si trova alla fine. Potete aggiungere il seguente codice all’evento click dell’oggetto per mostrare il messaggio:

WAIT WINDOW "At the Bottom of the Table" TIMEOUT 1

Quando lanciate la maschera, tuttavia, il messaggio viene mostrato, la il puntatore del record non si muove perché il codice per la gestione dell’evento click della classe madre non viene eseguito. Per assicurarsi che venga eseguito anche il codice della classe madre, includete le seguenti linee di codice per l’evento click dell’oggetto:

DODEFAULT( ) WAIT WINDOW "At the Bottom of the Table" TIMEOUT 1

Note Potete utilizzare la funzione ACLASS() per determinare tutte le classi appartenenti ad una gerarchia.

Impedire l’esecuzione del codice di una classe di base

Alcune volte potreste voler evitare il comportamento delle classi di base sia eseguito in un evento o metodo. Potete ottenerlo includendo la chiave NODEFAULT nel codice del metodo. Ad esempio, il seguente programma utilizza la chiave NODEFAULT nell’evento KeyPress di una casella di testo per impedire che il carattere premuto sia mostrato nella casella.

frmKeyExample = CREATEOBJECT("test") frmKeyExample.Show READ EVENTS DEFINE CLASS test AS FORM ADD OBJECT text1 AS TEXTBOX PROCEDURE text1.KeyPress

Page 64: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

64

PARAMETERS nKeyCode, nShiftAltCtrl NODEFAULT IF BETWEEN(nKeyCode, 65, 122) && between 'A' and 'z' This.Value = ALLTRIM(This.Value) + "*" ACTIVATE SCREEN && invia il risultato nella finestra principale di windows ?? CHR(nKeyCode) ENDIF ENDPROC PROCEDURE Destroy CLEAR EVENTS ENDPROC ENDDEFINE

Creare una serie di tasti di navigazione per una tabella

Una caratteristica di molte applicazioni è la tipica serie di tasti che consente di navigare all’interno di una tabella. Questa di solito include dei tasti per muovere il puntatore dei record al record successivo o a quello precedente, così come al primo record o all’ultimo.

Tasti di navigazione

Progettare I tasti di navigazione

Ogni tasto avrà delle caratteristiche e funzionalità comuni, così è una buona idea creare una classe di tasti. Quindi ogni tasto potrà essere derivato da questa classe. La classe genitrice è la NavButton definita più avanti.

Una volta definite la classe genitrice, le sottoclassi seguenti definiscono la funzionalità e aspetto specifico per ogni tasto di ogni tasto di navigazione: navTop, navPrior, navNext, navBottom.

Infine, la classe contenitore, vcr, viene creata e ogni tasto di navigazione viene aggiunto al contenitore. Il contenitore viene aggiunto alla maschera o alla barra strumenti per fornire le funzioni di navigazione alla tabella.

Definizione della classe NAVBUTTON

Per creare Navbutton, salvate in un file programma Navclass.prg le seguenti sei definizioni di classi (Navbutton, navTop, navBottom, navPrior, navNext, and vcr)

Definizione della classe generica di tasti di navigazioni

Code Comments

DEFINE CLASS Navbutton AS COMMANDBUTTON Height = 25 Width = 25 TableAlias = ""

Definisce la classe genitrice dei tasti di navigazione Fornisce alla classe alcune dimensioni.

Include una proprietà personale, TableAlias, per memorizzare l’alias in cui navigare.

Page 65: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

65

PROCEDURE Click IF NOT EMPTY(This.TableAlias) SELECT (This.TableAlias) ENDIF ENDPROC

Se è stato impostato TableAlias , la procedura della classe genitrice seleziona l’alias prima che I codice di navigazione nella sottoclasse venga eseguito. Altrimenti, assume che l’utente voglia navigare nella tabella nell’area di lavoro attualmente selezionata.

PROCEDURE RefreshForm _SCREEN.ActiveForm.Refresh ENDPROC

Utililzzando _SCREEN.ActiveForm.Refresh al posto di THISFORM.Refresh vi consente di aggiungere la classe ad una maschera o ad una barra degli strumenti avendo la stessa funzionalità.

ENDDEFINE Termina la definizione della classe.

Tutti I tasti di navigazione sono basati sulla classe Navbutton. Il seguente codice definisce il tasto principale della serie. I restanti tre tasti sono definiti nella seguente tabella. Le quattro classi sono simili, quindi solo la prima a tutti i commenti.

Definizione del tasto principale della classe di tasti di navigazione

Code Comments

DEFINE CLASS navTop AS Navbutton Caption = "|<"

Definisce il tasto principale e imposta la proprietà Caption ( didascalia ).

PROCEDURE Click Crea il codice per gestire il metodo quando accade l’evento click del controllo.

DODEFAULT( ) GO TOP THIS.RefreshForm

Richiama il codice dell’evento click della classe genitrice., Navbutton, in modo che l’appropriato alias venga selezionato se la proprietà TableAlias è stata selezionata. Include il codice per impostare il puntatore dei record sul primo record della tabella: GO TOP. Chiama il metodo RefreshForm nella classe genitrice. Non è necessario utilizzare l’operatore di accesso all’area di validità (::)* in questa classe perché non esiste alcun metodo nella sottoclasse con lo stesso nome della classe genitrice. D’altra parte, sia la classe genitrice che la sottoclasse hanno metodi per gestire l’evento click.

ENDPROC Termina la procedura Click.

ENDDEFINE Termina la definizione della classe.

Gli altri tasti di navigazione hanno una definizione della classe simile.

Page 66: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

66

* (::) Esegue un metodo della classe principale all'interno di un metodo della sottoclasse.

Sintassi cNomeClasse::cMetodo

Osservazioni

L'operatore :: viene utilizzato per eseguire un metodo della classe principale all'interno di un metodo della sottoclasse. Quando si crea una sottoclasse, i relativi metodi vengono ereditati automaticamente dalla classe principale. L'operatore :: consente di eseguire un metodo della classe principale nel metodo della sottoclasse, quindi di eseguire un'ulteriore elaborazione per il metodo della sottoclasse. Le definizioni della sottoclasse fornite nell'esempio mostrano come viene utilizzato l'operatore :: per eseguire il metodo della classe principale all'interno di un metodo della sottoclasse.

Definizione delle altre classi di tasti di navigazione

Codice Commento

DEFINE CLASS navNext AS Navbutton Caption = ">"

Definisce la classe del tasto Next (successivo) e imposta la proprietà didascalia.

PROCEDURE Click DODEFAULT( ) SKIP 1 IF EOF( ) GO BOTTOM ENDIF THIS.RefreshForm ENDPROC ENDDEFINE

Include il codice per impostare il puntatore al record successivo nella tabella. Termina la definizione della classe.

DEFINE CLASS navPrior AS Navbutton Caption = "<"

Definisce la classe del tasto Prior (precedente) ed imposta la proprietà didascalia.

PROCEDURE Click DODEFAULT( ) SKIP –1 IF BOF( ) GO TOP ENDIF THIS.RefreshForm ENDPROC ENDDEFINE

Include il codice per impostare il puntatore al record precedente nella tabella. Termina la definizione della classe.

DEFINE CLASS navBottom AS Navbutton Caption = ">|"

Definisce la classe del tasto Bottom (ultimo) ed imposta la proprietà didascalia.

PROCEDURE Click DODEFAULT( ) GO BOTTOM THIS.RefreshForm

Include il codice per impostare il puntatore

Page 67: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

67

ENDPROC ENDDEFINE

all’ultimo record della tabella. Termina la definizione della classe.

La seguente definizione di classe contiene tutti I Quattro tasti di navigazione in modo da essere aggiunti come un tutt’uno in una maschera

Definizione di una classe di controlli di navigazione di una tabella

Code Comments

DEFINE CLASS vcr AS CONTAINER Height = 25 Width = 100 Left = 3 Top = 3

Inizia la definizione della classe. La proprietà altezza è impostata alla stessa altezza del tasto di comando che conterrà.

ADD OBJECT cmdTop AS navTop ; WITH Left = 0 ADD OBJECT cmdPrior AS navPrior ; WITH Left = 25 ADD OBJECT cmdNext AS navNext ; WITH Left = 50 ADD OBJECT cmdBot AS navBottom ; WITH Left = 75

Aggiunge I tasti di navigazione.

PROCEDURE SetTable(cTableAlias) IF TYPE("cTableAlias") = 'C' THIS.cmdTop.TableAlias = ; cTableAlias THIS.cmdPrior.TableAlias = ; cTableAlias THIS.cmdNext.TableAlias = ; cTableAlias THIS.cmdBot.TableAlias = ; cTableAlias ENDIF ENDPROC

Questo metodo viene utilizzato per impostare la proprietà TableAlias del tasto. TableAlias è definito nella classe genitrice Navbutton. Potete anche utilizzare il metodo SetAll per impostare le proprietà: IF TYPE ("cTableAlias") = 'C' This.SetAll("TableAlias", "cTableAlias") ENDIF Tuttavia, causerà un errore se un oggetto che venga aggiunto alla classe non possiede la proprietà TableAlias.

ENDDEFINE Termina la definizione della classe.

Una volta definite la classe, potete creare delle sottoclassi o aggiungerle ad una maschera.

Creare una sottoclasse basati sulla nuova classe

Potete anche creare sottoclassi basate sulla classe vcr con dei tasti in più ad esempio Search, Edit, Save, and Quit. Ad esempio la, vcr2 include il tasto Quit:

Tasti di navigazione con un tasto per chiudere la maschera

Page 68: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

68

Definizione di una sottoclasse di controlli di navigazione

Codice Commento

DEFINE CLASS vcr2 AS vcr ADD OBJECT cmdQuit AS COMMANDBUTTON WITH ; Caption = "Quit",; Height = 25, ; Width = 50 Width = THIS.Width + THIS.cmdQuit.Width cmdQuit.Left = THIS.Width - ; THIS.cmdQuit.Width

Definisce una classe basata sulla vcr e aggiunge un tasto di commando.

PROCEDURE cmdQuit.CLICK RELEASE THISFORM ENDPROC

Quando l’utente clicca sul tasto, cmdQuit, chiude la maschera.

ENDDEFINE Termina la definizione di classe.

Vcr2 possiede ogni cosa che appartiene a vcr, con in più il nuovo tasto di commando, e voi non dovrete riscrivere nessuna istruzione del codice esistente.

Le modifiche a vcr si riflettono anche nella sottoclasse

Grazie all’ereditarietà. Le modifiche sulla classe genitrice si riflettono in tutte le sottoclassi della classe. Ad esempio, potete far sapere all’utente che è stato raggiunto la fine della tabella sostituendo il codice IF EOF( ) nella navNext.Click con il seguente:

IF EOF( ) GO BOTTOM SET MESSAGE TO "Fine della tabella" ELSE SET MESSAGE TO ENDIF

Potete far sapere all’utente che ha raggiunto la cima della tabella modificando il codice IF BOF ( ) in navPrior.Click con il seguente:

IF BOF() GO TOP SET MESSAGE TO "Inizio della tabella" ELSE SET MESSAGE TO ENDIF

Se la modifica viene eseguita su navNext e navPrior, verranno applicate automaticamente ai tasti appropriati in vcr e vcr2.

Page 69: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

69

Aggiungere VCR ad una classe maschera

Una volta definito vcr come controllo, il controllo può essere aggiunto in una definizione di contenitore. Ad esempio, il seguente codice aggiunge a Navclass.prg definisce una maschera con i l’aggiunta dei tasti di navigazione:

DEFINE CLASS NavForm AS Form ADD OBJECT oVCR AS vcr ENDDEFINE

Avvio della maschera che contiene il VCR

Una volta definita la sottoclasse maschera, potete mostrarla facilmente con I comandi appropriati.

Per mostrare una maschera

1. caricare la definizione della classe: 2. SET PROCEDURE TO navclass ADDITIVE 3. Creare un oggetto basato sulla classe navform: 4. frmTest = CREATEOBJECT("navform") 5. invoca il metodo Show della maschera:

frmTest.Show

Se non richiamate il metodo SetTable del oVCR ( l’oggetto vcr del NavForm) quando l’utente clicca i tasti di navigazione. Il puntatore dei record si sposata nella tabella nell’area di lavoro corrente. Potete richiamare l’evento SetTable per specificare a quale tabella fare riferimento.

frmTest.oVCR.SetTable("customer")

Note Quando l’utente chiude la maschera, frmTEst viene impostato a valore nullo .NULL. Per scaricare la variabile oggetto dalla memoria, utilizzate il comando RELEASE. Variabili oggetto create in un programma vengono scaricate dalla memoria quando il programma è completato.

Definizione di un controllo griglia

Una griglia contiene colonne, che a turno possono contenere intestazioni e qualsiasi altro controllo. Il controllo di base contenuto in una colonna è la casella di testo, così come la funzionalità di base di una griglia è una finestra di scorrimento. Tuttavia, l’architettura sottostante della griglia offre una estendibilità senza fine.

Controlli griglia con una casella di controllo in una colonna

Page 70: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

70

Definizione di una classe griglia con una casella di controllo in una colonna della griglia

Code Comments

DEFINE CLASS grdProducts AS Grid Left = 24 Top = 10 Width = 295 Height = 210 Visible = .T. RowHeight = 28 ColumnCount = 2

Inizia la definizione e imposta le proprietà che determinano l’aspetto della griglia. Quando definite la proprietà ColumnCount a 2, aggiungete due colonne alla griglia. Ogni colonna contiene una intestazione non il nome Header1.In aggiunta, ogni colonna ha un gruppo indipendente di proprietà che determinano l’aspetto ed il comportamento.

Column1.ControlSource ="prod_name" Column2.ControlSource ="discontinu"

Quando impostate il ControlSource di una colonna, la colonna mostra il valore di quel campo per tutti I record della tabella. Discontinu è un campo logico.

Column2.Sparse = .F. Column2 conterrà la casella di controllo. Impostate la proprietà Sparse della colonna a .F. in modo che la casella sia visibile in utte le righe, non solo nella cella selezionata.

Procedure Init THIS.Column1.Width = 175 THIS.Column2.Width = 68 THIS.Column1.Header1.Caption = ; "Product Name" THIS.Column2.Header1.Caption = ; "Discontinued" THIS.Column2.AddObject("chk1", ; "checkbox") THIS.Column2.CurrentControl = ; "chk1" THIS.Column2.chk1.Visible = .T. THIS.Column2.chk1.Caption = ""

Imposta la larghezza della colonna e l’intestazione. Il metodo AddObject vi consente di aggiungere un oggetto ad un container. In questo caso, una casella di controllo di nome

Page 71: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

71

ENDPROC questo caso, una casella di controllo di nome chk1. Imposta il CurrentControl della colonna alla casella di controllo in modo che questa venga mostrata. Assicura che la casella di controllo sia visibile. Imposta la didascalia ad una stringa vuota in modo che quella di default chk1 non venga mostrata.

ENDDEFINE Fine della definizione della classe.

The following class definition is the form that contains the grid. Both class definitions can be included in the same program file.

La seguente definizione di classe è la maschera che contiene la griglia. Entrambi le definizioni possono essere incluse nello stesso file.

Definizione di una classe maschera che contiene la classe griglia

Codice Commento

DEFINE CLASS GridForm AS FORM Width = 330 Height = 250 Caption = "Grid Example" ADD OBJECT grid1 AS grdProducts

Create una classe form e aggiunge un oggetto, basato sulla classe griglia..

PROCEDURE Destroy CLEAR EVENTS ENDPROC ENDDEFINE

Il programma che crea l’oggetto basato su questa classe userà READ EVENTS. Includendo CLEAR EVENTS nell’evento Destroy della maschera consente al programma di terminare quando l’utente chiude la maschera. . Fine della definizione di classe.

Il seguente programma apre la tabella con I campi da mostrare nelle colonne, crea un oggetto basato sulla classe GridForm, e esegue il comando READ EVENT:

CLOSE DATABASE OPEN DATABASE (HOME(2) + "data\testdata.dbc") USE products frmTest= CREATEOBJECT("GridForm") frmTest.Show READ EVENTS

Questo programma può essere incluso nello stesso file con la definizione della classe se si trova all’inizio del file. Potete anche utilizzare il comando di SET PROCEDURE TO per specificare il programma con la definizione di classe e includere questo codice in un programma separato.

Page 72: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

72

Creare una riferimento ad un oggetto

Al posto di fare una copia di un oggetto, potete creare un riferimento (collegamento) all’oggetto. Un riferimento occupa meno memoria che l’eventuale oggetto aggiunto, può essere passato fra diverse procedure.

Restituire una relazione ad un oggetto

Alcune volte, potreste voler manipolare un oggetto attraverso uno o più riferimenti a quell’oggetto. Ad esempio, il seguente programma definisce una classe, crea un oggetto basato su questa classe e restituisce una relazione all’oggetto.

*--NEWINV.PRG *--Returns a reference to a new invoice form. frmInv = CREATEOBJECT("InvoiceForm") RETURN frmInv DEFINE CLASS InvoiceForm AS FORM ADD OBJECT txtCompany AS TEXTBOX * code to set properties, add other objects, and so on ENDDEFINE

IL seguente programma stabilisce una relazione con l’oggetto creato nel programma Newinv.prg. La variabile di relazione può essere manipolata nell’esatto modo in cui lo può essere una variabile oggetto.

frmInvoice = NewInv() && store the object reference to a variable frmInvoice.SHOW

Potete anche creare riferimenti ad oggetto in una maschera, come nel seguente esempio:

txtCustName = frmInvoice.txtCompany txtCustName.Value = "Fox User"

Tip Una volta creato un oggetto, potete utilizzare il commando DISPLAY OBJECT per mostrare la gerarchia di classe, le impostazioni delle proprietà, gli oggetti contenuti, i metodi ed eventi disponibili. Potete riempire una matrice con le proprietà ( non le impostazioni ), eventi, metodi e gli oggetti contenuti in un oggetto con la funzione AMEMBERS().

Scaricare oggetti e riferimenti dalla memoria

Se esiste un riferimento ad un oggetto, il rilascio dell’oggetto non lo scarica dalla memoria. Per esempio, il seguente comando scarica frmInvoice: l’oggetto originale:

RELEASE frmInvoice

Tuttavia poiché i riferimenti ad un oggetto appartenenete a frmInvoice esistono ancora, l’oggetto non è scaricato dalla memoria fino a che txtCustName non viene rilasciato con il seguente comando

RELEASE txtCustName

Page 73: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

73

Verifica dell’esistenza di un oggetto

Potete utilizzare le funzioni TYPE() ISNULL() VARTYPE() per determinare l’esistenza di un oggetto. Ad esempio, le seguenti linee di codice verificano l’esistenza dell’oggetto oConnection:

IF TYPE("oConnection") = "O" AND NOT ISNULL(oConnection) * Object exists ELSE * Object does not exist ENDIF

Note ISNULL( ) è necessario perché .NULL. è salvata nella variabile dell’oggetto maschera quando un utente chiude la maschera, ma il tipo di variabile resta “O”

Creare una matrice di membri

Potete definire I membri di una classe in una matrice. Il seguente esempio, le scelte sono una matrice di controlli::

DEFINE CLASS MoverListBox AS CONTAINER DIMENSION choices[3] ADD OBJECT lstFromListBox AS LISTBOX ADD OBJECT lstToListBox AS LISTBOX ADD OBJECT choices[1] AS COMMANDBUTTON ADD OBJECT choices[2] AS COMMANDBUTTON ADD OBJECT choices[3] AS CHECKBOX PROCEDURE choices.CLICK PARAMETER nIndex DO CASE CASE nIndex = 1 * code CASE nIndex = 2 * code CASE nIndex = 3 * code ENDCASE ENDPROC ENDDEFINE

Quando l’utente clicca un controllo di una matrice di controlli, VFP passa l’indice del controllo all’evento click. In questa procedura, potete utilizzare una dichiarazione CASE per eseguire codice diverso in base al tasto che è stato ciccato.

Creare una matrice di oggetti

Potete creare anche una matrice di oggetti, ad esempio MyArray possiede 5 tasti di comando:

DIMENSION MyArray[5] FOR x = 1 TO 5 MyArray[x] = CREATEOBJECT("COMMANDBUTTON") ENDFOR

Ci sono alcune considerazioni da ricordare con le matrici di oggetti:

Page 74: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

74

?? Potete assegnare un oggetto ad una intera matrice con un commando. Dovete assegnare l’oggetto ad ogni elemento della matrice individualmente.

?? Non potete assegnare un valore alla proprietà dell’intera matrice. IL seguente commando riporterebbe un errore:

MyArray.Enabled = .F.

?? Quando ridimensionate una matrice di oggetti in modo che sia più grande della matrice originale, i nuovi elementi sono inizioalizzati a .F. come nel caso di tutte le matrici in VFP. Quando ridimensionate un oggetto della matrice in modo che sia più piccolo dell’originale, l’oggetto con un subscrip più grande del più grande viene rilasciato.

Utilizzare un oggetto per memorizzare dati

Nel linguaggio orientato agli oggetti, una classe offer un utile e conveniente veicolo per memorizzare dati e procedure relaziomnati ad una identità. Ad esempio, potete definire una classe customer per memorizzare i dati di un customer così come il metodo per calcolare l’età di un customer.

DEFINE CLASS customer AS CUSTOM LastName = "" FirstName = "" Birthday = { - - } PROCEDURE Age IF !EMPTY(THIS.Birthday) RETURN YEAR(DATE()) - YEAR(THIS.Birthday) ELSE RETURN 0 ENDIF ENDPROC ENDDEFINE

Tuttavia, I dati memorizzati in un oggetto basato sulla classe customer sono memorizzati solo nella memoria. Se questi dati erano in una tabella, la tabella sarà memorizzata sul disco. Se avevate più di un cliente su cui memorizzare i dati, la tabella la tabella vi darà l’accesso a tutti i comandi di gestione dei database forniti da VFP. Così potrete facilmente localizzare le informazioni, organizzarle, raggrupparle, ed eseguire calcoli su di essi, creare stampe e interrogazioni ecc.

Salvare e manipolare dato in un database o in una tabella è quello che fa meglio VFP. CI sono delle volte tuttavia, quando vorrete memorizzare dati in un oggetto, di solito, quando i dati sono significativi solamente quando i la vostra applicazione è in funzione si riferiscono ad una singola entità.

Ad esempio, in una applicazione che include sistemi di sicurezza, avrete di solito una tabella di utenti che hanno accesso all’applicazione. LA tabella includerà identificazioni dell’utente, password, e livelli di accesso. Quando l’utente è entrato, non avrete bisogno di tutte le informazioni della tabella. Tutto quello che vi servirà, sono le informazioni dell’utente corrente, e queste informazioni possono essere facilmente memorizzate in un oggetto manipolato. La seguente definizione di classe, attiva un accesso (logon) quando un oggetto basato su quella classe viene creato:

Page 75: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

75

DEFINE CLASS NewUser AS CUSTOM PROTECTED LogonTime, AccessLevel UserId = "" PassWord = "" LogonTime = { - - : : } AccessLevel = 0 PROCEDURE Init DO FORM LOGON WITH ; && assuming you have created this form This.UserId, ; This.PassWord, ; This.AccessLevel This.LogonTime = DATETIME( ) ENDPROC * Create methods to return protected property values. PROCEDURE GetLogonTime RETURN This.LogonTime ENDPROC PROCEDURE GetAccessLevel RETURN This.AccessLevel ENDPROC ENDDEFINE

Nel programma principale della vostra applicazione, potrete creare un oggetto basato su NewUserclass:

oUser = CREATEOBJECT('NewUser') oUser.Logon

In tutte le parti della vostra applicazione, quando avrete bisogno delle informazioni circa l’utente, le poterete avere dall’oggetto oUsert. Ad esempio:

IF oUser.GetAccessLevel( ) >= 4 DO ADMIN.MPR ENDIF

Integrare oggetti e dati

Nella maggior parte delle applicazioni, potete utilizzare la potenza di VFP integrando oggetti e dati. La maggior parte delle classi VFP hanno proprietà e metodi che vi consentono di integrare la potenza di gestione database relazionale e sistema orientato agli oggetti.

Proprietà di integrare le classi VFP e i dati di un database

Classi Proprietà dati

Grid RecordSource, ChildOrder, LinkMaster

Tutti gli altri controlli ControlSource

List box and combo box ControlSource, RowSource

Form e form set DataSession

Page 76: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

76

RecordSource - Specifica l'origine dati a cui è associato il controllo Grid.

ChildOrder - Specifica il tag indice per l'origine record del controllo Grid o dell'oggetto Relation

LinkMaster - Specifica la tabella principale collegata alla tabella secondaria visualizzata in un controllo Grid.

ControlSource - Specifica l'origine dati a cui è associato un oggetto.

RowSource - Specifica l'origine dei valori in un controllo ComboBox o ListBox.

DataSession - Restituisce l'ID della sessione dati che identifica la sessione dati privata dell'oggetto FormSet, Form o ToolBar.

Se la proprietà DataSession dell'oggetto Form, FormSet o ToolBar è impostata a 1 (Sessione dati predefinita), restituisce l'ID della sessione dati predefinita.

Poiché queste proprietà possono essere modificate in fase di progettazione o in fase di esecuzione, potete creare controlli generici con funzionalità incapsulate che operano su dati diversi.

Page 77: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

77

Capitolo 4: Capire il modello a eventi Traduzione di Dario de Santis

Visual FoxPro fornisce un vero sistema non modale, in modo che possiate facilmente coordinare maschere multiple automaticamente ed eseguire simultaneamente istanze multiple di una maschera. Visual FoxPro gestisce per voi anche l’elaborazione degli eventi, così potrete dare ai vostri utenti un ambiente iterativo molto piu’ ricco.

Questo capitolo descrive:

?? Gli eventi in Visual FoxPro ?? Individuazione della sequenza di eventi ?? Assegnazione del codice agli eventi

Gli eventi in Visual FoxPro

Il codice associato all’evento e’ automaticamente eseguito dal sistema in risposta a qualche azione dell’utente. Per esempio, il codice scritto per l’evento Click e’ eseguito automaticamente dal sistema quando l’utente clicca su di un cont rollo. Il codice dell’evento puo’ anche essere attivato dagli eventi del sistema, come nel caso dell’evento Timer in un controllo di tipo Timer.

Gli eventi fondamentali

La seguente tabella contiene una lista del gruppo base di eventi del Visual FoxPro, che valgono per la maggior parte dei controlli.

Gruppo base di eventi

Evento Quando si attiva l’evento

Init L’oggetto viene creato.

Destroy L’oggetto e’ rilasciato dalla memoria.

Click L’utente clicca l’oggetto usando il tasto primario del mouse.

DblClick L’utente fa doppio clic sull’oggetto usando il tasto primario del mouse.

RightClick L’utente clicca l’oggetto usando il tasto secondario del mouse.

GotFocus

L’oggetto riceve il focus, o a causa dell’azione dell’utente che avanza con il Tab o clicca con il mouse, oppure cambiando il focus da programma con il il metodo SetFocus..

Page 78: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

78

LostFocus

L’oggetto perde il focus, o a causa dell’azione dell’utente che avanza con il Tab o fa clic con il mouse su un altro oggetto, oppure cambiando il focus da programma con il metodo SetFocus.

KeyPress L’utente preme e rilascia un tasto.

MouseDown

L’utente preme il tasto del mouse mentre il cursore del mouse e’ sopra l’oggetto.

MouseMove L’utente muove il mouse sopra l’oggetto.

MouseUp L’utente rilascia il tasto del mouse mentre il cursore del mouse si muove sopra l’oggetto.

Eventi di contenitori e di oggetti

Ci sono due regole fondamentali da tenere presente quando si scrive del codice evento per i controlli:

?? I contenitori non elaborano eventi associati ai controlli che essi contengono. ?? Se nessun codice evento e’ associato al controllo, Visual FoxPro verifica se esiste del codice

associato all’evento del controllo che lo precede nella gerarchia delle classi.

Quando l’utente interagisce con un oggetto in un qualsiasi modo – passando su di esso con il Tab, cliccandoci sopra e cosi’ via – hanno luogo gli eventi dell’oggetto. Ogni oggetto riceve i suoi eventi indipendentemente. Ad esempio, anche se un CommandButton e’ su di un form, l’evento Click del form non viene intercettato quando l’utente clicca sul CommandButton; viene intercettato solamente l’evento Click del CommandButton.

Il codice evento del contenitore e’ separato dal codice evento del controllo

Se non vi e’ alcun codice evento associato al CommandButton non accade nulla quando l’utente clicca sul pulsante, anche se c’e’ del codice associato all’evento Click del form.

Questa regola e’ altrettanto vera per i controlli griglia. La griglia contiene colonne che a loro volta contengono headers e controlli. Quando avvengono gli eventi soltanto l’oggetto piu’ interno implicato nell’evento riconosce l’evento stesso. I contenitori a livello piu’ alto non riconoscono

Page 79: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

79

l’evento. La seguente illustrazione mostra quali oggetti gestiscono gli eventi MouseMove che vengono generati quando l’utente muove il cursore del mouse attraverso la griglia.

Gli eventi MouseMove in una griglia

Esiste tuttavia un’eccezione a questa regola. Se avete scritto del codice evento per un gruppo OptionButton o gruppo CommandButton ma non vi e’ alcun codice per l’evento in uno specifico pulsante nel gruppo, viene eseguito il codice evento del gruppo quando avviene l’evento del pulsante.

Per esempio, potete avere un gruppo OptionButton con del codice associato all’evento Click. Soltanto uno dei due pulsanti nel gruppo ha del codice associato all’evento Click:

Il codice evento per i gruppi di pulsanti puo’ essere usato come predefinito

Se l’utente clicca su Option1, viene eseguito il codice associato all’evento Click di Option1. Il codice associato all’evento Click del gruppo di OptionButton non viene eseguito.

Page 80: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

80

Dato che non vi e’ alcun codice associato all’evento Click di Option2, se l’utente clicca Option2 viene eseguito il codice associato all’evento Click del gruppo.

Nota Quando si inizia una sequenza di eventi per un controllo, come il MouseDown ed il MouseUp, l’intera sequenza di eventi appartiene al controllo.

Ad esempio, se cliccate con il tasto sinistro del mouse su di un CommandButton e trascinate il cursore del mouse lontano da esso, l’evento MouseMove del CommandButton continua a verificarsi, anche se il cursore del mouse viene mosso fuori dal form. Se rilasciate il tasto sinistro del mouse all’interno del form invece che sul CommandButton, l’evento MouseUp che si verifica e’ associato al CommandButton invece che al form.

Classi ed eventi di controlli

Se il controllo su di un form è derivato da una classe definita dall’utente (il quale, a sua volta, potrebbe essere derivato da un’altra classe definita dall’utente) Visual FoxPro verifica il codice evento nel controllo gerarchicamente piu’ vicino quando avviene l’evento. Se esiste del codice in tale procedura Visual FoxPro lo esegue. Se non esiste codice nella procedura per l’evento Visual FoxPro controlla nel livello gerarchico immediatamente superiore alla classe. Se Visual FoxPro trova del codice per quell’evento, in un qualsiasi punto nella gerarchia delle classi, viene eseguito quel codice. Qualsiasi codice gerarchicamente piu’ in alto non viene eseguito.

Se non vi e’ alcun codice associato all’oggetto, Visual FoxPro verifica la classe superiore.

Si puo’, tuttavia, includere del codice in una procedura per eventi e chiamare esplicitamente il codice nelle classi dalle quali e’ derivato il controllo usando la funzione DODEFAULT( ).

Tracciamento della sequenza di eventi

Il modello a eventi di Visual FoxPro e’ esteso, consentendovi un enorme controllo sui componenti della vostra applicazione in risposta ad una vasta varieta’ di azioni dell’utente. Alcune delle sequenze di eventi sono fisse, come per esempio quando un form viene creato o distrutto. Alcuni eventi avvengono indipendentemente, ma la maggior parte si verificano in concomitanza con diversi altri eventi derivati dall’interazione con l’utente.

Page 81: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

81

Attivazione del tracciamento eventi

Il miglior modo di vedere le sequenze di eventi di Visual FoxPro e’ attivando il tracciamento eventi nel debugger. Il tracciamento eventi vi consente di vedere ogni evento associato ai vostri form e controlli avvenire in relazione ad altri eventi, cosi’ da poter decidere la posizione piu’ efficiente dove inserire il vostro codice.

Attivare il tracciamento eventi

1. Dal menu Tools della finestra del Debugger, selezionare Event Tracking. 2. Nella finestra di dialogo Event Tracking, selezionare Turn event tracking on.

Gli eventi presenti nella lista Events to track vengono inviati alla finestra Output del Debugger o scritti in un file man mano che si verificano.

La finestra di dialogo Event Tracking

Nota In questo esempio gli eventi MouseMove e Paint sono stati tolti dalla lista Events to track perche’ tali eventi si verificano cosi’ di frequente che rendono piu’ difficile vedere la sequenza degli altri eventi.

Page 82: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

82

Osservazione degli eventi che si verificano

A volte viene innescato un singolo evento dall’azione dell’utente, come l’utente che muove il cursore del mouse su di un controllo. Spesso, tuttavia, l’azione dell’utente innesca eventi multipli.

Questo paragrafo descrive l’ordine con cui avvengono gli eventi in risposta all’interazione dell’utente, prendendo il seguente form come esempio.

Un form di esempio che illustra le sequenze di eventi

In questo schema d’esempio l’utente compie le seguenti azioni sul form:

1. Lancia il form. 2. Scrive del testo in Text1. 3. Seleziona il campo e lo copia nella clipboard. 4. Passa su Text2. 5. Incolla il testo su Text2. 6. Chiude il form cliccando su Command2.

Queste azioni scatenano uno o piu’ eventi di sistema per ciascun oggetto. Le seguenti tabelle mettono in risalto gli eventi innescati in risposta ad ogni azioni dell’utente.

Azione 1

L’utente lancia il form digitando il seguente comando nella finestra Command:

DO FORM form1 NAME frmObject

Visual FoxPro carica il form, inizializza ciascun oggetto, poi inizializza il form; il form viene attivato ed in seguito il primo campo riceve il focus.

Ogetto Evento

DataEnvironment BeforeOpenTables

Form1 Load

Page 83: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

83

DataEnvironment Init

Text1 Init

Text2 Init

Command1 Init

Command2 Init

Form1 Init

Form1 Activate

Form1 GotFocus

Text1 When

Text1 GotFocus

Azione 2

L’utente digita Test in Text1. La pressione di ogni tasto genera due eventi. L’evento KeyPress riceve 2 parametri: il tasto premuto e lo stato dei tasti SHIFT, ALT e CTRL.

Oggetto Evento

Text1 KeyPress(84, 1) “T”

Text1 InteractiveChange

Text1 KeyPress(101, 0) “e”

Text1 InteractiveChange

Text1 KeyPress(115,0) “s”

Text1 InteractiveChange

Text1 KeyPress(116,0) “t”

Text1 InteractiveChange

Azione 3

L’utente fa un doppio clic su Text1 per selezionarne il testo, poi preme CTRL+C per copiarlo nella clipboard. Gli eventi del mouse ed un evento Click accompagnano l’evento DblClick. Gli eventi MouseMove e MouseDown ricevono quattro parametri: un numero indica quale tasto e’ stato premuto, lo stato dello Shift e le posizioni X ed Y. Le posizioni X ed Y sono relative al form e riflettono l’unita’ di misura (pixels, per esempio) usata per esso. Viene indicato soltanto un evento MouseMove per ogni controllo. In realta’ questo evento scattera’ una mezza dozzina di volte o piu’.

Page 84: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

84

Oggetto Evento

Form1 MouseMove(0, 0, 100, 35)

Text1 MouseMove(0,0,44,22)

Text1 MouseDown(1, 0, 44, 22)

Text1 MouseUp(1, 0, 44, 22)

Text1 Click

Text1 MouseDown(1, 0, 44, 22)

Text1 MouseUp(1, 0, 44, 22)

Text1 DblClick

Azione 4

L’utente preme TAB per muoversi su Text2.

Oggetto Evento

Text1 KeyPress(9, 0)

Text1 Valid

Text1 LostFocus

Text2 When

Text2 GotFocus

Azione 5

L’utente incolla il testo copiato su Text2 premendo CTRL+V.

Oggetto Evento

Text2 InteractiveChange

Azione 6

L’utente clicca Command2, il quale chiude il form.

Page 85: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

85

Oggetto Evento

Form1 MouseMove

Command2 MouseMove

Text2 Valid

Command2 When

Text2 LostFocus

Command2 GotFocus

Command2 MouseDown(1, 0, 143, 128)

Command2 MouseUp(1, 0, 143, 128)

Command2 Click

Command2 Valid

Command2 When

Quando viene chiuso il form e l’oggetto viene rilasciato hanno luogo questi ulteriori eventi, in ordine inverso rispetto a quelli in Azione 1.

Oggetto Evento

Form1 Destroy

Command2 Destroy

Command1 Destroy

Text2 Destroy

Text1 Destroy

Form1 Unload

DataEnvironment AfterCloseTables

DataEnvironment Destroy

La sequenza di eventi del Visual FoxPro

La tabella seguente illustra la completa sequenza di eventi Visual FoxPro che si genera. La proprieta’ AutoOpenTables del data environment si suppone posta a true (.T.). Altri eventi possono verificarsi a seconda dell’interazione dell’utente ed alla risposta del sistema.

Page 86: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

86

Oggetto Evento

Data environment BeforeOpenTables

Form set Load

Form Load

Data environment cursor(s)

Init

Data environment Init

Objects 1 Init

Form Init

Form set Init

Form set Activate

Form Activate

Object1 2 When

Form GotFocus

Object1 GotFocus

Object1 Message

Object1 Valid 3

Object1 LostFocus

Object2 3 When

Object2 GotFocus

Object2 Message

Object2 Valid 4

Object2 LostFocus

Form QueryUnload

Form Destroy

Object 5 Destroy

Form Unload

Form set Unload

Data environment AfterCloseTables

Page 87: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

87

Data environment Destroy

Data environment cursor(s)

Destroy

1. Per ciascun oggetto, da quello piu’ interno al contenitore piu’ esterno. 2. Il primo oggetto nell’ordine del tab. 3. L’oggetto successivo che prende il focus 4. Quando l’oggetto perde il focus 5. Per ciascun oggetto, dal contenitore piu’ esterno all’oggetto piu’ interno

Assegnazione del codice agli eventi

A meno che non associate del codice ad un evento nulla accade quando esso si verifica. Non scriverete quasi mai codice per tutti gli eventi associati ad un qualsiasi oggetto Visual FoxPro, magari vorrete incorporare della funzionalita’ in risposta a certi eventi chiave nelle vostre applicazioni. Per aggiungere del codice da eseguirsi quando avviene l’evento usate la finestra Properties nel Form Designer.

La sequenza di eventi ha influenza su dove dovreste mettere il codice. Tenete presente i seguenti suggerimenti:

?? Gli eventi Init di tutti i controlli di un form vengono eseguiti prima dell’evento Init del form stesso, in modo che possiate inserire del codice nell’evento Init del form per maneggiare uno qualsiasi dei controlli del form prima che esso venga visualizzato.

?? Se volete che del codice venga eseguito ogni volta che cambia il valo re di una list box, combo box o check box associatelo all’evento InteractiveChange. L’evento Click potrebbe non avvenire o potrebbe essere chiamato anche se il valore non e’ cambiato.

?? Quando trascinate un control gli eventi del mouse vengono sospesi. Ad esempio gli eventi MouseUp e MouseMove non si verificano durante un’operazione di drag-and-drop.

?? Gli eventi Valid e When ritornano un valore. True (.T.) e’ il predefinito. Se ritornate false (.F.) o 0 dall’evento When il controllo non potra’ ricevere il focus. Se ritornate false (.F.) o 0 dall’evento Valid il focus non potra’ lasciare il controllo.

Per maggiori informazioni sull’uso del Form Designer guardate il Capitolo 9, Creazione dei form. Per informazioni sulla stesura di codice per le classi ed aggiunta di codice eventi guardate il Capitolo 3, Programmazione orientata agli oggetti.

Nella seguente tabella viene elencato una serie di eventi di Visual FoxPro, che è valido per la maggior parte dei controlli.

Page 88: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

88

Set di eventi centrali Evento

L'evento viene attivato quando

Load Viene caricato un form o un set di form in memoria.

Unload Viene rilasciato un form o un set di form dalla memoria. Init Viene creato un oggetto. Destroy Viene rilasciato un oggetto dalla memoria. Click L'utente fa clic sull'ogge tto utilizzando il pulsante primario del mouse. DblClick L'utente fa doppio clic sull'oggetto utilizzando il pulsante primario del

mouse. RightClick L'utente fa clic sull'oggetto utilizzando il pulsante secondario del mouse. GotFocus L'oggetto diventa l'elemento attivo, in seguito ad azioni dell'utente come

la tabulazione o il clic oppure in seguito alla modifica nel codice dell'elemento attivo con il metodo SetFocus.

LostFocus L'oggetto non è più l'elemento attivo, in seguito ad azioni dell'utente come la tabulazione o il clic su un altro oggetto, oppure in seguito alla modifica nel codice dell'elemento attivo con il metodo SetFocus.

KeyPress L'utente preme e rilascia un tasto. MouseDown

L'utente preme un pulsante del mouse mentre il puntatore del mouse si trova sopra l'oggetto.

MouseMove L'utente sposta il mouse sopra l'oggetto. MouseUp L'utente rilascia un pulsante del mouse mentre il puntatore del mouse si

trova sopra l'oggetto. InteractiveChange

Il valore dell'oggetto viene modificato in modo interattivo.

ProgrammaticChange

Il valore dell'oggetto viene modificato in fase di programmazione.

Page 89: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

89

Capitolo 5: Progettare i Database Traduzione di Mirco Lucchini Form = maschere di inserimento Report = modulo di stampa Con Visual Fox Pro, utilizzate i database per organizzare e mettere in relazione tabelle e viste. I database forniscono l’architettura per immagazzinare dati ed avere anche vantaggi aggiuntivi. Usando un database, si possono creare estensioni a livello di tabella, come regole per campo e regole per record, valori iniziali di campo, e triggers. Potrete anche creare procedure memorizzate e relazioni permanenti tra tabelle. Potete usare il vostro database per creare connessioni a sorgenti di dati remote e creare viste di tabelle locali e remote. Questo capitolo fornisce le linee guida per organizzare le tabelle che saranno usate in un database di Visual Fox Pro. Esso vi guiderà attraverso la progettazione dell’esempio di database Tasmanian Traders e fornirà degli esempi aggiuntivi sulla progettazione del database. L’esempio del database Tasmanian Traders si trova nella cartella di Visual Studio ..\samples\Vfp98\Tastrade\data. Per informazioni sulla creazione di database di Visual Fox Pro dopo averli progettati, vedere il Capitolo 6, “Creare Database”. Per informazioni sulla creazione di tabelle di Visual Fox Pro, vedere il Capitolo 7, “Lavorare con le Tabelle”. Questo capitolo tratterà i seguenti argomenti: ?? Usare un metodo per la progettazione del database

?? Analizzare i requisiti dei dati

?? Raggruppare i requisiti in tabelle

?? Determinare i campi necessari

?? Identificare le relazioni

?? Rifinire il progetto

?? Diagrammi del database d'esempio

(NDT riportiamo qui una definizione di alcuni termini presenti nei paragrafi di questo capitolo) Terminologia

Indice primario primary index

Un indice che non permette valori duplicati nel campo specificato o nell’espressione. Gli indici primari sono utilizzati principalmente nella tabella principale o referenziata per stabilire una integrità referenziale in una relazione persistente. Si può creare solamente un indice primario in una tabella. VFP restituisce un errore se viene indicato come indice primario un campo che contiene valori duplicati.

Page 90: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

90

Indice candidato candidate index

Un indice che può diventare chiave primaria, perché non contiene valori nulli o duplicati

Indice regolare regular index

Un indice che non è unico, primario, o candidato. Gli indici regolari determinano l'ordine di elaborazione dei record ma consentono l'immissione in un campo di valori duplicati (quindi escludono il controllo di unicità). È possibile aggiungere ad una tabella più indici regolari. Si possono utilizzare indici regolari per ogni lato di una relazione persistente uno-a-molti

Indice univoco unique index

E’ possibile creare un indice univoco che seleziona e ordina una parte di record in base alla prima ricorrenza di un valore nel campo specificato. Se si desidera selezionare i record in questo modo, è possibile che invece si desideri creare una query o una vista.

Chiave primaria primary key

La colonna o le colonne I cui valori identificano in modo univoco una riga in una tabella

Chiave esterna foreign key

Una colonna o combinazioni di colonna, i cui valori devono corrispondere a quelli di una chiave primaria in un’altra tabella. Viene utilizzata per unire in relazione le tabelle.

Integrità referenziale referential integrity (RI)

Le regole che governano la consistenza dei dati, specificatamente le relazioni fra le chiavi primarie e le chiavi esterne di tabelle differenti. VFP indirizza l’integrità referenziale con un campo definito dall’utente e regole a livello di record. Il Referential Integrity Builder consente l’impostazione delle regole con cui controllare l’inserimento, l’aggiornamento e la cancellazione di record nelle tabelle.

Relazione persistente persistent relationship

Relazione fra tabelle la cui persistenza esiste anche quando il programma non è in funzione, devono essere collocate in un database per consentire questo tipo di relazione.

Usare un metodo per la progettazione del database

Se usate un metodo predefinito per la progettazione del database, potrete creare effettivamente e velocemente un database ben progettato che vi fornirà un accesso vantaggioso alle informazioni che vi interessano. Con una solida progettazione, impiegherai meno tempo nella costruzione del database, e otterrai velocemente risultati più precisi. Nota Il termine database e tabella non sono sinonimi in Visual Fox Pro. Il termine database (.dbc File) si riferisce a un database relazionale che è un contenitore di informazioni riguardanti una o più

Page 91: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

91

tabelle (.dbf files) o viste. La chiave di un efficace progetto di database, sta nel capire esattamente quali informazioni si vogliono immagazzinare e il modo in cui un database relazionale, come Visual Fox Pro, le memorizza. Per fornire efficientemente ed accuratamente le informazioni di cui necessitate, Visual Fox Pro ha bisogno di informazioni riguardanti soggetti differenti organizzate in tabelle separate. Per esempio, potete avere una tabella che contiene solo informazioni riguardanti gli impiegati e un'altra che contiene informazioni riguardanti le vendite. Organizzando le vostre informazioni in maniera appropriata, renderete flessibile il vostro database in modo da poter combinare e presentare i fatti in modi diversi. Per esempio, potrete stampare report dove potrete combinare fatti riguardanti gli impiegati e fatti riguardanti le vendite. Separare le informazioni in tabelle aggiunge flessibilità al database.

Quando progettate un database, per prima cosa dovrete spezzare le informazioni che desiderate mantenere in soggetti separati, e poi dire a Visual Fox Pro come i soggetti sono collegati agli altri cosicché Visual Fox Pro possa produrre le giuste informazioni quando ne avete bisogno. Per mantenere le informazioni in tabelle separate, dovrete organizzare e gestire i vostri dati come se costruiste un’applicazione ad alte prestazioni. Ecco i passi necessari alla progettazione del database. Ogni passo è trattato dettagliatamente nella sezione rimanente di questo capitolo. 1. Determinare lo scopo del database La conoscenza dello scopo vi aiuterà a decidere quali

informazioni volete che Visual Fox Pro immagazzini. 2. Determinare le tabelle necessarie Quando è chiaro lo scopo del vostro database, potrete

dividere le informazioni in soggetti separati, come “Impiegati” o “Ordini”. Ogni soggetto sarà una tabella nel vostro database.

3. Determinare i campi necessari Decidete quali informazioni volete mantenere in ogni

Page 92: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

92

tabella. Ogni categoria di informazione in una tabella è chiamato campo ed è visualizzato come una colonna quando scorrerete una tabella. Per esempio, un campo in una tabella Impiegati potrebbe essere Last_name (cognome); ed un altro potrebbe essere Hire_date (data_salario).

4. Determinare le relazioni Visualizzare ogni tabella e decidere come i dati di una tabella sono in relazione con i dati di un'altra tabella. Aggiungere campi alle tabelle o creare nuove tabelle per semplificare le relazioni, se necessario.

5. Rifinire il progetto Controllate il progetto per eventuali errori. Create le tabelle e aggiungete un po’ di dati. Vedete se si ottengono i risultati voluti dalle tabelle. Effettuate le modifiche necessarie al progetto.

Non vi preoccupate se ci saranno errori o se dimenticate qualche cosa rispetto al progetto iniziale. Pensate ad esso come ad una bozza grezza che potrete rifinire più avanti. Eseguite delle prove con dati di esempio, prototipi dei vostri forms e reports. Con Visual Fox Pro, è facile cambiare la struttura del vostro database rispetto a come è stato creato. In ogni caso, diventerà molto più difficile effettuare cambiamenti alle tabelle dopo averle riempite di dati e dopo aver creato forms e reports. Per questa ragione assicuratevi di avere una solida struttura prima di continuare nella costruzione della vostra applicazione.

Analizzare i requisiti dei dati

Il primo passo nella progettazione di un database di Visual Fox Pro è quello di analizzare i requisiti per i vostri dati determinando lo scopo del database e come esso sarà utilizzato; vale a dire quali informazioni vorrete recuperare dal database. Da questo, potrete determinare di quali soggetti avrete bisogno per immagazzinare informazioni riguardo alle tabelle e quali informazioni avrete bisogno di memorizzare riguardo ad ogni soggetto (i campi nelle tabelle). Parlare con le persone che utilizzeranno il database. Domandatevi a quali domande il database dovrà risposta. Impostate i reports che vorrete che esso produca. Raccogliete i forms che usate correntemente per registrare i vostri dati. Utilizzerete tutte queste informazioni nei rimanenti passi del processo di progettazione. Esempio: Controllare le vendite e l’Inventario Supponiamo che Tasmanian Traders, una società di import/export che vende specialità gastronomiche di tutto il mondo, voglia un database che possa tenere sotto controllo le informazioni riguardanti le vendite e l’inventario dell’azienda. Partiamo scrivendo una lista di domande alle quali il database dovrebbe rispondere. Quante vendite del nostro prodotto abbiamo fatto il mese scorso? Chi è il fornitore del prodotto più venduto? Proseguiamo riunendo tutti i forms ed i reports che contengono le informazioni che il database dovrebbe produrre. La società attualmente utilizza un report stampato per tenere una traccia dei prodotti che sono stati ordinati, e un form di ordini per prendere nuove ordini.

Page 93: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

93

Forms e reports mostrano alcuni dati richiesti per il database.

Tasmanian Traders necessita anche di stampare delle etichette per l’invio di posta a clienti, impiegati e fornitori. Dopo aver raccolto queste informazioni siamo pronti per il prossimo passo.

Raggruppare i requisiti in tabelle Decidere le tabelle del vostro database può essere un passo strategico nella progettazione del database. Questo perché i risultati che si vogliono ottenere dal database – i reports che volete stampare, i forms che volete usare, e le risposte alle vostre domande – non forniscono necessariamente degli indizi riguardo alla struttura delle tabelle che produrranno tali oggetti. Essi vi dicono quello che voi volete sapere ma non come disporre le informazioni nelle tabelle.

Page 94: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

94

Guardate il precedente form degli ordini come esempio. Esso include notizie riguardanti i clienti – l’indirizzo e il numero di telefono del cliente – insieme a notizie riguardanti l’ordine. Questo form vi fornisce un numero di informazioni che sapete di voler immagazzinare nel vostro database. Sebbene le notizie siano tutte sullo stesso form, potete facilmente prevenire i problemi di integrità dei dati comuni, memorizzandole in tabelle separate. Immagazzinare informazioni una volta riduce le possibilità di errore. Per esempio, se utilizzate una sola tabella per salvare le informazioni per un form degli ordini, supponendo che un cliente vi invii tre ordini differenti, voi dovreste aggiungere l’indirizzo e il numero di telefono del cliente tre volte, una volta per ogni ordine, ma questo moltiplica le possibilità di errori in fase di inserimento dei dati. La tabella dei Clienti memorizza l’indirizzo una sola volta.

Inoltre, se il cliente cambiasse indirizzo, dovreste accettare informazioni contraddittorie oppure cercare e cambiare tutti i records delle vendite per quel cliente nella tabella. E’ molto meglio creare una tabella clienti che immagazzina l’indirizzo del cliente una sola volta nel database. In seguito se dovesse essere necessario cambiare i dati di un cliente, lo si farebbe una sola volta. Prevenire la cancellazione di informazioni preziose. Supponiamo che un nuovo cliente faccia un ordine e poi lo annulli. Quando cancellate l’ordine dalla tabella che contiene informazioni sia riguardanti il cliente sia il suo ordine, voi cancellereste anche i dati del cliente anche se voi vorreste tenere questo nuovo cliente nel database in modo da potergli spedire il vostro prossimo catalogo. Allora, è meglio mettere le informazioni riguardanti il cliente in una tabelle Clienti separata. In questo modo potrete eliminare gli ordini senza cancellare le informazioni del cliente. Controllate le informazioni che volete ottenere dal database e dividetele in soggetti fondamentali da avere sotto controllo, come clienti, impiegati, prodotti in vendita, fornitura di servizi e così via. Ognuno di questi soggetti sarà una tabella separata. Consiglio Una strategia per dividere le informazioni in tabelle è quella di guardare ai singoli avvenimenti e determinare di cosa trattano. Per esempio, nel form degli ordini di Tasmanian Traders, l’indirizzo del cliente non interessa i dati della vendita, interessa i dati del cliente. Questo

Page 95: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

95

suggerisce che avete bisogno di tabelle separate per i clienti. Nel report Prodotti dell’ordine, il numero di telefono del fornitore non riguarda la scorta del prodotto; riguarda il fornitore. Questo suggerisce che avete bisogno di una tabella separata per i fornitori. Esempio: Progettare le tabelle nel database Tasmanian Traders Il form degli ordini e il report dei Prodotti in ordine di Tasmanian Traders, includono informazioni riguardanti questi soggetti: ?? Impiegati ?? Clienti ?? Fornitori ?? Prodotti ?? Ordini Da questa lista, potete abbozzare le tabelle del database ed alcuni dei campi per ogni tabella. Bozza delle tabelle e dei campi necessari per il database di Tasmanian Traders.

Nonostante il database finale di Tasmanian Traders contenga altre tabelle, questo elenco è un buon inizio. Più avanti in questo capitolo, vedrete come aggiungere altre tabelle per rifinire il progetto.

Determinare i campi necessari Per determinare i campi in una tabella, decidete che cosa avete bisogno di sapere riguardo alle persone, cose, o eventi registrati nella tabella. Potete pensare ai campi come ad attributi della tabella. Ogni record (o riga) nella tabella contiene lo stesso gruppo di campi o attributi. Per esempio, un campo indirizzo in una tabella clienti contiene gli indirizzi dei clienti. Ogni record nella tabella contiene dati riguardanti un cliente, e il campo indirizzo contiene l’indirizzo per quel cliente.

Page 96: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

96

Identificare i campi Ecco alcuni consigli per determinare i vostri campi: Correlate ogni campo direttamente al soggetto della tabella Un campo che descrive il soggetto di una tabella diversa può andare bene anche ad un'altra tabella. Più avanti, quando definirete le relazioni tra le vostre tabelle, vedrete come potrete combinare i dati da campi in tabelle multiple. Per adesso, siate sicuri che ogni campo nella tabella descriva direttamente il soggetto della tabella. Se trovate delle stesse informazioni ripetute in molte tabelle, significa che avete dei campi inutili in alcune delle tabelle. Non includete dati calcolati o derivati In molti casi, non si vogliono memorizzare i risultati nelle tabelle. Visual Fox Pro eseguirà per voi i calcoli quando vorrete visualizzare i risultati. Per esempio, il form degli ordini mostrato in precedenza in questo capitolo, mostra il prezzo esteso per ogni linea dell’ordine del database di Tasmanian Traders, nonostante il campo subtotale per il prezzo esteso non sia presente in alcuna tabella di Tasmanian Traders. Invece, la tabella Order_Line_Items contiene un campo quantità che immagazzina le unità nell’ordine per ogni singolo prodotto, ed anche il prezzo unitario di ogni oggetto ordinato. Usando questi dati Visual Fox Pro calcola i subtotali ogni volta che stampate un ordine, quindi il subtotale non ha bisogno di essere memorizzato nella tabella. Includete tutte le informazioni di cui avete bisogno E’ facile trascurare le informazioni importanti. Tornate alle informazioni che avete raccolto al primo passo del progetto. Controllate i forms e i reports su carta per essere sicuri che tutte le informazioni richieste precedentemente siano incluse nelle tabelle di Visual Fox Pro o che possano essere prelevate da esse. Pensate alle richieste che farete a Visual Fox Pro. Potrà Visual Fox Pro trovare tutte le risposte utilizzando le informazioni nelle vostre tabelle? Avete identificato i campi che conterranno dati unici come l’ID del cliente? Quali tabelle contengono informazioni che unirete in un report o in un form? Per maggiori informazioni riguardanti l’identificazione di campi chiave e tabelle correlate, vedere le sezioni Usare Campi Chiave Primari e Identificare le Relazioni più avanti in questo capitolo. Memorizzare le informazioni nelle relative più piccole parti logiche Potreste essere tentati di utilizzare un singolo campo per il nome completo, o il nome di un prodotto insieme alla sua descrizione. Combinare più di un tipo di informazione in un singolo campo renderà più difficile recuperare dei risultati più avanti. Provate a spezzare le informazioni in parti logiche; per esempio, create campi separati per il nome ed il cognome, o per il nome del prodotto, la sua categoria e la sua descrizione. Esempio: Aggiunta di campi alla Tabelle Prodotti Tasmanian Traders vende specialità gastronomiche importate da tutto il mondo. Gli impiegati utilizzano il report Products On Order per tenere una traccia dei prodotti ordinati. Report per controllare l’inventario dei prodotti

Page 97: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

97

Il report indica che la tabella prodotti, che contiene dati riguardanti i prodotti venduti, ha bisogno di campi aggiuntivi per il nome del prodotto, le unità immagazzinate, le quantità in ordine. Ma come fare per i campi per il nome del fornitore ed il suo numero di telefono? Per ottenere il report Visual Fox Pro ha bisogno di sapere qual è il fornitore di un determinato prodotto. Bozza della tabella fornitori contenente i campi per il nome ed il numero di telefono del fornitore

Potete risolvere il problema senza memorizzare dati ridondanti nelle vostre tabelle creando una tabella fornitori con campi separati per il nome ed il numero di telefono. Il prossimo passo vi farà aggiungere un campo alla tabella prodotti che identificherà le informazioni del fornitore. Utilizzare i Campi Chiave Primari La potenza in un sistema di gestione con un database relazionale come Visual Fox Pro deriva dalla sua capacità di trovare e raccogliere insieme informazioni memorizzate in tabelle separate. Per fare in modo che Visual Fox Pro possa lavorare al meglio, ogni tabella nel vostro database dovrà includere un campo o una serie di campi che identifichino univocamente ogni singolo record immagazzinato nella tabella. Spesso questo è un unico numero di identificazione, come un numero

Page 98: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

98

ID per ogni impiegato o un numero di serie. Nella terminologia dei database questa informazione è chiamata chiave primaria della tabella. Visual Fox Pro usa i campi chiave primari per associare velocemente dei dati da tabelle multiple e riportare insieme i dati per voi. Se già avete un identificativo unico per una tabella, come un gruppo di numeri del prodotto che avete generato per identificare gli oggetti nel vostro magazzino, lo potete utilizzare come chiave primaria della tabella. Ma siate sicuri che i valori in questo campo siano sempre diversi per ogni record –Visual Fox Pro non permette valori duplicati in un campo chiave primario. Per esempio, non utilizzate il nome di qualcuno come chiave primaria, perché i nomi non sono unici. Potete facilmente avere due persone con lo stesso nome nella stessa tabella. Quando scegliete i campi chiave primari, tenete presente questi punti: ?? Visual Fox Pro non permette valori duplicati o nulli in un campo chiave primario. Per questo

motivo non dovrete scegliere un a chiave primaria che possa contenere tali valori. ?? Potete utilizzare un valore in un campo chiave primario per identificare record, così esso non

dovrà essere troppo lungo da ricordare o da digitare. Potrete decidere di assegnargli un certo numero di lettere o numeri oppure che sia contenuto in un range di valori.

?? La dimensione della chiave primaria influisce sulla velocità delle operazioni nel vostro database. Quando create un campo chiave primario, utilizzate la più piccola dimensione che soddisfi i valori che immagazzinerete nel campo.

Esempio: Impostazione della chiave primaria per la tabella dei prodotti La chiave primaria della tabella prodotti di Tasmanian Traders contiene il numero ID del prodotto. Siccome ogni numero del prodotto identifica un diverso prodotto, voi non vorrete due prodotti con lo stesso numero. La chiave primaria per la tabella prodotti è il campo Product_id.

In alcuni casi potreste volere utilizzare due o più campi che insieme formino la chiave primaria di una tabella. Per esempio, la tabella Order_line_items nel database Tasmanian Traders usa due campi come sua chiave primaria: Order_id e Product_id. Più avanti vedrete perché.

Identificare le relazioni Ora che avete suddiviso le informazioni in tabelle, avete bisogno un sistema per fare si che Visual Fox Pro le riunisca in modo comprensibile. Per esempio, il form seguente include informazioni provenienti da diverse tabelle.

Page 99: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

99

Il Form Order Entry utilizza informazioni provenienti da diverse tabelle.

Visual Fox Pro è un database relazionale, questo significa che i dati correlati saranno immagazzinati in tabelle diverse; poi definirete le relazioni tra le tabelle e Visual Fox Pro utilizzerà le relazioni per trovare le informazioni associate contenute nel vostro database. Per esempio, supponiate di voler telefonare ad un impiegato per avere informazioni riguardanti le sue vendite. Il numero di telefono dell’impiegato è registrato nella tabella impiegati e le vendite sono registrate nella tabella Ordini. Quando chiedete a Visual Fox Pro la vendita che vi interessa, Visual Fox Pro può consultare il numero di telefono basato sulla relazione tra le tabelle. Esso funziona perché Employee_id, la chiave primaria della tabella impiegati, è anche un campo nella tabella ordini. Nella terminologia dei database, il campo Employee_id nella tabella ordini è chiamato chiave esterna, perché si riferisce ad una chiave primaria di una tabella diversa o esterna. Il campo Employee_id come chiave primaria per la tabella Impiegati e come chiave esterna per la tabella Ordini

Page 100: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

100

Così per impostare una relazione tra due tabelle – Tabella A e Tabella B – verrà aggiunta una chiave primaria all’altra tabella cosicché essa appaia in entrambe le tabelle. Ma quale sarà la chiave primaria della tabella da utilizzare?. Per impostare la relazione correttamente, dovrete determinare la natura della relazione. Esistono tre tipi di relazioni tra tabelle. ?? Relazione uno-a-molti ?? Relazione molti-a-molti ?? Relazione uno-a-uno La parte rimanente di questa sezione mostra un esempio di ogni tipo di relazione e spiega come progettare le vostre tabelle in modo che Visual Fox Pro possa associare i dati correttamente. Lo scopo di ogni esempio è quello di spiegare come possiate determinare le relazioni tra le tabelle e come decidere quali campi appartenenti alle tabelle possano essere idonei per queste relazioni – esso non descrive come usare l’interfaccia di Visual Fox Pro per relazionare le tabelle. Esempio: creare una relazione Uno-a-molti Una relazione uno-a-molti, è il tipo di relazione più comune in un database relazionale. . In una relazione uno-a-molti, un record nella Tabella A può avere più di un record correlato nella Tabella B, ma un record nella Tabella B puo avere al massimo un solo record correlato nella Tabella A. Per esempio, le tabelle Categorie e Prodotti nel database Tasmanian Traders hanno una relazione di tipo uno-a-molti.

Page 101: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

101

Le tabelle Categorie e Prodotti rappresentano una relazione uno-a-molti.

Per impostare la relazione, aggiungete il campo o i campi, che rappresenteranno la chiave primaria, dalla parte “uno” della relazione alla tabella dalla parte “molti” della relazione. Utilizzerete una chiave primaria o a indice candidato per la parte “uno” della relazione e una chiave ad indice regolare per la parte “molti”. In questo caso dovrete aggiungere il campo Category_id dalla tabella Categorie alla tabella Prodotti, perché una categoria contiene molti prodotti. Visual Fox Pro utilizza il numero identificativo della categoria per trovare la corretta categoria per ogni prodotto. Per informazioni riguardo alla creazione di chiavi indice, vedere il Capitolo 7, Lavorare con le tabelle Esempio: Creare una relazione Molti-a-Molti Nella relazione molti-a-molti, un record nella Tabella A può avere più di un record corrispondente nella Tabella B. e un record nella Tabella B può avere più di un record corrispondente nella Tabella A. Questo tipo di relazione richiede delle modifiche al vostro database prima che possiate specificare correttamente la relazione a Visual Fox Pro. Per riconoscere le relazioni molti-a-molti tra le vostre tabelle, è importante dare uno sguardo ad entrambe le direzioni della relazione. Per esempio, considerate la relazione tra ordini e prodotti dell’azienda Tasmanian Traders. Un ordine può contenere più di un prodotto. Così per ogni record nella tabella degli ordini, potrebbero esserci più record nella tabella prodotti; ma non è tutto, ogni prodotto potrebbe apparire in molti ordini; così per ogni record della tabella prodotti, potrebbero esserci molti record nella tabella ordini.

Page 102: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

102

Le tabelle Ordini e Prodotti rappresentano una relazione molti-a-molti.

I soggetti delle due tabelle –ordini e prodotti- hanno una relazione ,molti-a-molti; ciò costituisce una sfida nella progettazione del database. Per capire il problema, immaginate cosa potrebbe succedere se cercaste di impostare la relazione tra le due tabelle aggiungendo il campo Product_id alla tabella Ordini. Per avere più di un prodotto per ordine, avreste bisogno più di un record nella tabella ordini per ogni ordine. Dovreste ripetere le informazioni riguardanti l’ordine più e più volte, cioè per ogni record relativo allo stesso ordine –una progettazione inefficiente che potrebbe portarvi ad avere informazioni non corrette. Incorrereste nello stesso problema se venisse aggiunto il campo Order_id nella tabella Prodotti- avreste più di un record nella tabella prodotti per ogni prodotto. Come risolvereste il problema? La risposta è quella di creare una terza tabella che divida la relazione molti-a-molti in due relazioni uno-a-molti. Questa terza tabella è chiamata tabella di congiunzione, perché essa rappresenta l’unione tra due tabelle. Metterete la chiave primaria da ognuna delle due tabelle nella tabella di congiunzione.

Page 103: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

103

La tabella Order_line_items crea un legame uno-a-molti tra gli Ordini e i Prodotti.

Una tabella di congiunzione potrebbe contenere solo le due chiavi primarie che collegano insieme le tabelle oppure come nelle tabella Order_line_items, potrebbe contenere informazioni aggiuntive. Ogni record nella tabella Order_line_items rappresenta una singola voce in un ordine. La chiave primaria della tabella Order_line_items è composta da due campi –le chiavi straniere dalle tabelle Ordini e Prodotti. Il campo Order_id da solo non funziona come chiave primaria per questa tabella, perché un ordine può contenere più voci. L’ order_id è ripetuto per ogni voce in un ordine perciò il campo non conterrà valori univoci. Il campo Product_id allo stesso modo non potrà essere usato come chiave primaria perché un prodotto potrebbe essere presente in diversi ordini. Insieme i due campi nella tabella di congiunzione genereranno sempre un valore unico per ogni record. La tabella di congiunzione non richiede una sua chiave primaria. Nel database Tasmanian Traders, la tabella Ordini e la tabella Prodotti non sono correlate direttamente. Esse sono correlate indirettamente tramite la tabella Order_line_items. La relazione molti-a-molti tra ordini e prodotti è rappresentata nel database utilizzando due relazioni uno-a-molti. ?? Le tabelle Ordini e Order_line_items hanno una relazione uno-a-molti. Ogni ordine può

avere più di una voce, ma ogni voce è collegata solo ad un ordine. ?? Le tabelle Prodotti e Order_line_items hanno una relazione uno-a-molti. Ogni prodotto può

avere più voci associate ad esso, ma ogni voce si riferisce solo ad un prodotto. Esempio: Creare una relazione Uno-a-Uno In una relazione uno-a-uno, un record della Tabella A non può avere più di un record corrispondente nella Tabella B, ed un record della Tabella B non può avere più di un record corrispondente nella Tabella A. Questo tipo di relazione è insolito e potrebbe essere richiamata per alcuni cambiamenti nella progettazione del vostro database. La relazione uno-a-uno tra tabelle è insolita perché in molti casi, l’informazione nelle due tabelle potrebbe semplicemente essere combinata in una tabella. Per esempio, supponete di creare una

Page 104: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

104

tabella chiamata Giocatori di Ping-Pong per controllare le informazioni riguardanti il torneo di Ping-Pong di Tasmanian Traders. Siccome i giocatori di ping-pong sono tutti impiegati di Tasmanian Traders, questa tabella ha una relazione uno-a-uno con la tabella Impiegati del database Tasmanian Traders. Le tabelle Impiegati e Giocatori di Ping-Pong rappresentano una relazione uno-a-uno.

Potreste aggiungere tutti i campi della tabelle Giocatori di Ping-Pong alla tabella Impiegati. Ma la tabella Giocatori di Ping-Pong controlla un evento momentaneo e non si desiderano altre informazioni una volta che l’evento si è verificato. In aggiunta, non tutti gli impiegati giocano a ping-pong, così se questi campi fossero inclusi nella tabella Impiegati, potrebbero non contenere niente per diversi record. Per questi motivi ha senso creare una tabella separata. Quando identificate la necessità di una relazione uno-a-uno nel vostro database, considerate di poter mettere insieme le informazioni in una sola tabella. Per esempio, nella tabella impiegati, un impiegato può avere un direttore che è anche un impiegato. Potete aggiungere un campo numero identificativo del direttore. Per ottenere le informazioni più avanti potrete creare un auto collegamento ne lle vostre query o nelle viste. Non avete bisogno di tabelle separate per risolvere una relazione uno-a-uno. Se per qualche motivo non volete farlo, ecco come impostare una relazione uno-a-uno tra due tabelle: ?? se le due tabelle anno il medesimo soggetto, potrete probabilmente impostare la relazione

usando lo stesso campo chiave primaria in entrambe le tabelle. ?? Se le due tabelle hanno soggetti diversi con chiavi primarie diverse, prendete una delle

tabelle( o l'altra) e mettete il suo campo chiave primaria nell’altra tabella come chiave esterna.

Page 105: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

105

Rifinire il progetto Quando avrete le tabelle, i campi e le relazioni che vi servono, sarà il momento di studiare il progetto e determinare ogni difetto o mancanza rimaste. Potrete incontrare diverse insidie mentre progettate il vostro database. Questi problemi comuni, potrebbero causare difficoltà di utilizzo e manutenzione dei vostri dati. ?? Avete una tabella con un gran numero di campi che non si riferiscono allo stesso soggetto?

Per esempio, una tabella potrebbe contenere campi relativi ai fornitori come anche campi contenenti informazioni sulle vendite. Siate certi che ogni tabella contenga dati riguardanti solo un soggetto.

?? Avete dei campi che sono stati lasciati intenzionalmente vuoti in molti record perché non sono inerenti a quei record? Questo generalmente significa che appartengono ad un'altra tabella.

?? Avete un gran numero di tabelle, molte delle quali contengono lo stesso campo? Per esempio, avete tabelle separate per le vendite di Gennaio e Febbraio, o per clienti locali o lontani, nelle quali immagazzinate lo stesso tipo di informazioni. Provate a consolidare tutte le informazioni relative ad uno stesso soggetto in una tabella. Potreste avere anche bisogno di aggiungere un campo extra, per esempio, per identificare la data delle vendite.

Create le vostre tabelle, specificate le relazioni tra le tabelle e inserite pochi record di dati in ogni tabella. Osservate se potete utilizzare il database per ottenere le risposte che volete. Create degli schizzi grossolani dei vostri forms e report e vedete se mostrano i dati che vi aspettate. Cercate dati duplicati non necessari ed eliminateli. Quando proverete il vostro database, probabilmente scoprirete spazio per dei miglioramenti. Ecco alcune cose da controllare: ?? Avete dimenticato qualche campo? Ci sono informazioni di cui avete bisogno che mancano?

Se sì, appartengono ad altre tabelle esistenti? Se è un informazione riguardante qualcosa d’altro probabilmente avrete bisogno di creare un’altra tabella.

?? Avete scelto una buona chiave primaria per ogni tabella? Se la utilizzate per cercare dei record, è semplice da ricordare e da digitare? Siate sicuri che non dovrete inserire un valore nel campo chiave primario che è uguale ad un altro valore nel campo.

?? Avete inserito ripetutamente informazioni duplicate in una delle vostre tabelle? Se è così, probabilmente avrete bisogno di dividere la tabella in due tabelle legate da una relazione uno-a-molti.

?? Avete delle tabelle con molti campi, un numero limitato di record e molti campi vuoti in ogni record? Sarebbe meglio ricreare la tabella con meno campi e più record.

Una volta identificati i cambiamenti da effettuare, potrete modificare le tabelle e i campi per rispettare i miglioramenti apportati al progetto. Per informazioni riguardanti la modifica delle tabelle vedere il capitolo 7, Lavorare con le tabelle. Esempio: perfezionare la tabella Prodotti Ogni prodotto della scorta della Tasmanian Traders appartiene ad una categoria, come Bevande, Condimenti o Frutti di mare. La tabella Prodotti potrebbe includere un campo che mostra la categoria di ogni prodotto.

Page 106: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

106

Tabella Prodotti con il campo Category_name

Supponete che esaminando e perfezionando il database Tasmanian Traders decidiate di conservare una descrizione della categoria insieme al suo nome. Se aggiungete il campo Descrizione categoria alla tabella prodotti, ripeterete ogni descrizione di categoria per ogni prodotto che appartiene a quelle categoria –non è una buona soluzione. Una soluzione migliore è rendere Categoria un nuovo soggetto da controllare per il database con la sua tabella e la sua chiave primaria. Poi potrete aggiungere la chiave primaria dalla tabella Categoria alla tabella Prodotti come chiave esterna. La tabella Categoria fornisce una posizione dove conservare efficientemente le informazioni riguardanti la categoria.

Le tabelle Categoria e prodotti hanno una relazione uno-a-molti: una categoria può avere più di un prodotto collegato ad essa, ma ogni prodotto può appartenere ad una sola categoria.

Diagramma del Modello di Database Il diagramma del database in questa sezione potrebbe darvi un’idea per il progetto del vostro database. Questi database non sono inclusi in Visual Fox Pro, sono stati messi qui come esempi di tipi di database e tabelle che potete creare.

Page 107: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

107

Database di Appuntamenti Questa struttura di database memorizza gli appuntamenti per un ufficio professionale e può facilmente essere modificato per l’utilizzo in uno studio medico, dentistico, di un avvocato, o di un ragioniere. La tabella appuntamenti ha un campo-multiplo chiave primaria per identificare univocamente ogni appuntamento. Questa chiave primaria, l’indice “client_sta” è stato creato indicizzando una espressione che unisce i campi client_id e date_start_time. Esempio di un database appuntamenti

Database del personale Questa struttura di database immagazzina informazioni riguardanti le risorse umane. La tabella Job History memorizza i dati riguardanti il salario o le promozioni, così essa potrà contenere molti record per ogni impiegato. Esempio di database del personale

Page 108: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

108

Page 109: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

109

Database per una libreria Questo database immagazzina dati riguardo ai libri di una libreria e al prestito ai lettori. Osservate la relazione molti-a-molti tra le tabelle Libri ed Autori e tra le tabelle Libri e Soggetti. Esempio di database per una libreria

Page 110: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

110

Capitolo 6: Creazione di un database Traduzione di Annibale Freda

Dopo aver progettato il database, è possibile generare lo stesso attraverso l’interfaccia o il linguaggio. E’ possibile aggiungere tabelle esistenti al proprio database, e poi modificarle per poter usufruire dei vantaggi caratterizzanti il Data Dictionary ( una tabella contenente le informazioni di tutte le tabelle in un database ) in Visual FoxPro. Se si lavora con un progetto nel Project Manager, si può direttamente aggiungere o creare tabelle.

Per maggiori informazioni sulla creazione di un database per ambiente multiutente, vedi il capitolo 17.:

?? Creazione di un Database

?? Visualizzare e modificare una struttura Database

?? Amministrare un Database

?? Relazionare Multipli Database

?? Trattamento errori Database

Creare un Database

Quando si crea un database, si raccolgono insieme le tabelle in un gruppo guadagnando dei benefici del data dictionary.

Un data dictionary fornisce una grande flessibilità nella progettazione e modifica del database e libera dalla scrittura di codice nella creazione di criteri di validità a livello di campo o di record assicurando l’unicità dei valori nell’utilizzo di chiavi indici primarie. Il data dictionary di Visual FoxPro permette di creare o stabilire:

?? Chiavi primarie e candidate

?? Relazioni permanenti tra tabelle database.

?? Nomi lunghi per tabelle e campi

?? Intestazioni dei campi quando vengono visualizzati in finestre di Browser e nel controllo Griglia.

?? Valori predefiniti nei campi.

?? Predefinire le control class usate nelle maschere (forms).

?? Maschere di inserimento e visualizzazione del formato dei campi.

?? Regole di campo e Regole di record

?? Attivatori (trigger)

?? Procedure memorizzate (stored procedure).

?? Connessioni a dati remoti.

?? Viste Locali e remote.

?? Commenti per ogni campo, tabella e database.

Page 111: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

111

Alcune caratteristiche del dizionario dati, come i nomi lunghi dei campi, gli indici primari e candidati, i valori iniziali, criteri di validità di campo e di record, e gli attivatori, sono memorizzati nel file .dbc a seguito del processo di costruzione di una tabella o di una vista. Per informazioni su queste caratteristiche, vedere il Capitolo 7, Lavorare con le Tabelle, e il Capitolo 8, Creazione delle Viste.

Raccogliere le Tabelle in un Database.

Per raccogliere le tabelle in un database, è necessario creare un contenitore database per mantenere uniti tutti gli oggetti come viste, connessioni, e procedure memorizzate associate con le tabelle che compongono il database.

Creare un nuovo database

?? Nel Gestore dei progetti, selezionare l’etichetta Data, poi selezionare Databases dalla lista e scegliere New.

- oppure -

?? Utilizzare il comando CREATE DATABASE .

Per esempio, il seguente codice crea e apre esclusivamente un nuovo database chiamato Sample:

CREATE DATABASE Sample

Quando si crea un nuovo database, lo stesso è vuoto, e non contiene nessuna tabella associata o altri oggetti al suo interno. Aggiungendo una tabella si crea un collegamento tra la tabella e il contenitore database. Le informazioni della tabella collegata sono memorizzate nel database. Questo tipo di informazioni sono denominate backlink.

Page 112: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

112

I collegamenti specificano le relazioni fra un contenitore database e le tabelle.

In programmazione è possibile usare i seguenti comandi e funzioni per poter lavorare con un database.

Comandi e funzioni che gestiscono i database e gli oggetti database.

ADATABASES( ) CREATE VIEW MODIFY CONNECTION ADBOBJECTS( ) DBC( ) MODIFY DATABASE ADD TABLE DBGETPROP( ) MODIFY PROCEDURE ALTER TABLE DBSETPROP( ) MODIFY STRUCTURE APPEND PROCEDURES DELETE CONNECTION MODIFY VIEW CLOSE DATABASE DELETE DATABASE OPEN DATABASE COPY PROCEDURES DELETE VIEW PACK DATABASE CREATE CONNECTION DISPLAY DATABASE RENAME TABLE CREATE DATABASE DROP TABLE REMOVE TABLE CREATE SQL VIEW INDBC( ) SET DATABASE CREATE TABLE LIST DATABASE VALIDATE DATABASE

Page 113: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

113

Aggiungere Tabelle a un Database

Ogni tabella di Visual Fox Pro può avere due caratteristiche: la prima è quella di essere usata come tabella libera, cioè un file .dbf non associato a nessun database, oppure come una tabella database, cioè un file .dbf associato ad un database. Le tabelle associate con un database possono avere proprietà che le tabelle libere non hanno, come Regole di campo e Regole di record , attivazioni, e relazioni permanenti.

Si possono associare le tabelle con un database creandole quando il database è aperto oppure aggiungendole a tabelle già esistenti nel database. Per informazioni sulla creazione di nuove tabelle, vedere il Capitolo 7, Uso delle Tabelle.

Aggiungere una tabella libera ad un database

?? Nel Gestore di Progetti, selezionare Tables dall’etichetta All oppure da quella Data , poi scegliere Add.

- oppure -

?? Utilizzare il commando ADD TABLE.

Per esempio, il successivo codice apre il database testdata e aggiunge la tabella orditems: OPEN DATABASE testdata ADD TABLE orditems

E’ necessario aggiungere esplicitamente una tabella libera ad un database per far si che la tabella sia contenuta nel database. La modifica della struttura di una tabella libera non provocherà l’aggiunta della stessa ad un database, anche se un database è aperto quando si attiva il comando MODIFY STRUCTURE relativo alla tabella libera in uso.

Usare le Tabelle Libere

Si può associare una tabella ad un solo database. Tuttavia, si possono usare i dati contenuti in un file .dbf esistente senza incorporarlo all’interno del database.

Accedere ad una tabella contenuta in un altro database.

?? Creare una vista nel database con riferimento alla tabella.

- oppure -

?? Aprire la tabella con il commando USE ed il simbolo “!”

Page 114: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

114

Si può usare il simbolo “!” per riferirsi ad una tabella presente in un altro database. Per esempio, se si vuole visualizzare la tabella orditems nel database testdata , è possibile digitare:

USE testdata!orditems BROWSE

Nel precedente esempio, il database testdata viene aperto automaticamente quando si esegue il comando USE, ma Visual FoxPro non imposta testdata come corrente database. Un database aperto automaticamente, come ne l precedente esempio, è automaticamente chiuso quando la tabella è chiusa, a meno che non si apra esplicitamente il database prima di chiudere la tabella.

Per informazioni circa l’uso di una vista per accedere alle informazioni esternamente al database in uso, vedere il Capitolo 8, Creazione delle Viste.

Rimuovere una Tabella da un Database

Quando si aggiunge una tabella ad un database, Visual Fox Pro modifica il record di intestazione del file nella tabella per indicare il percorso ed il nome di file al database che ora è collegato alla tabella stessa.

Le informazioni sul percorso e sul nome del file vengono denominate backlink, collegamento al database, in quanto collegano la tabella al relativo database. Il processo di rimozione di una tabella da un databse non solo rimuove la tabella e le informazioni associate nel data dictionary del file database, ma aggiorna le informazioni del record di testata della tabella al nuovo stato di tabella libera.

Si può rimuovere una tabella da un database attraverso l’interfaccia o con il comando REMOVE TABLE . Oltre alla rimozione della tabella dal database è possibile rimuovere fisicamente la tabella dal disco cancellandola.

Rimuovere una tabella da un database

?? Nel Gestore di Progetti, selezionare il nome della tabella, poi scegliere Remove.

- oppure -

?? Dal Database Designer, selezionare la tabella e scegliere Remove dal menù Database.

- oppure -

?? Usare il comando REMOVE TABLE .

Per esempio, il seguente codice apre il database testdata e rimuove la tabella orditems :

OPEN DATABASE testdata REMOVE TABLE orditems

Rimuovendo una tabella da un database la stessa non viene automaticamente cancellata dal disco. Se si desidera rimuovere la tabella dal database che eliminarla dal disco, bisogna usare la clausola DELETE del comando REMOVE TABLE oppure il comando DROP TABLE . Per esempio, il seguente codice apre il database testdata e cancella la tabella orditems dal disco:

Page 115: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

115

OPEN DATABASE testdata REMOVE TABLE orditems DELETE

Il seguente codice apre il database testdata, poi cancella la tabella orditems senza spostare una copia della stessa nel Cestino di Windows:

OPEN DATABASE testdata DROP TABLE orditems NORECYCLE

Aggiornare Tabelle e Collegamenti al Database

Se si effettua lo spostamento di un file database (.dbc, .dct, e .dcx), oppure di una tabella associata con un database, il relativo percorso cambia interrompendo il backlink e i relativi collegamenti che Visual FoxPro usa per associare database e tabelle:

?? Il backlink collega la tabella al corrispondente database. Esso è composto del relativo percorso e nome di file del .dbc associato con la tabella, ed è memorizzato nella testata del file tabella di Visual FoxPro ( .dbf) .

?? Il forward link distingue il database alla quale la tabella è collegata. I Forward links sono memorizzati nel file database ( .dbc ) , e consistono nell’indicazione del percorso e del nome di file per ogni file tabella associata.

?? Si può ristabilire il collegamento e aggiornare le informazioni del relativo percorso per considerare la nuova locazione del file.

?? Aggiornare i collegamenti dopo lo spostamento di una tabella o di un database.

?? Usare la clausola RECOVER nel comando VALIDATE DATABASE .

Per esempio il seguente codice apre il database testdata e visualizza la casella di dialogo che permette di individuare le tabelle che non sono nelle posizioni incluse nel database:

OPEN DATABASE testdata VALIDATE DATABASE RECOVER

Tip Se si vuole usare una tabella senza dover ristabilire i collegamenti per tutte le tabelle nel database, si può aprire la tabella con il comando USE Visual FoxPro visualizza la Open dialog box che permette di individuare il relativo database o cancellare i collegamenti.

Per informazioni sulla rimozione del backlink di una tabella collegata ad un database cancellato accidentalmente dal disco, vedere TABELLE LIBERE.

Creare Relazioni Permanenti

Si possono creare relazioni permanenti fra le tabelle di un database. Le relazioni permanenti sono relazioni tra tabelle che sono memorizzate nel file database e sono:

?? Automaticamente usate come condizioni predefinite nelle Query and View Designers.

?? Visualizzate nel Database Designer come linee di connessione agli indici delle tabelle.

Page 116: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

116

?? Visualizzate nel Data Environment Designer come relazioni predefinite per forms e reports.

?? Usate per memorizzare informazioni relative all’ integrità referenziale.

A Differenza delle relazioni temporanee create con il comando SET RELATION , le relazioni permanenti non hanno bisogno di essere ricreate ogni volta che si usano le tabelle. Tuttavia, poiché le relazioni permanenti non controllano le relazioni fra i record nelle tabelle, si potrà usare contemporaneamente sia la relazione temporanea ( SET RELATION ) sia la relazione permanente quando si sviluppano applicazioni Visual FoxPro.

In Visual FoxPro, si possono usare gli indici per stabilire relazioni permanenti fra tabelle in un database. E’ possibile creare una relazione permanente fra indici piuttosto che fra campi, in quanto è possibile mettere in relazione tabelle basate su espressioni semplici o complesse.

Creare una relazione permanente fra tabelle

?? Nel Database Designer, scegliere il nome del file indice che si vuole mettere in relazione, poi trascinarlo sul nome del file indice della tabella da relazionare.

-oppure-

?? Usare la clausola FOREIGN KEY con il comando CREATE TABLE oppure con il comando ALTER TABLE.

Per esempio, il seguente comando aggiunge una relazione permanente uno a molti tra la tabella customer e la tabella orders, basata sulla chiave G cust_id nella tabella customer, e una nuova chiave esterna, cust_id, nella tabella orders :

ALTER TABLE orders; ADD FOREIGN KEY cust_id TAG ; cust_id REFERENCES customer

Se poi si esaminerà lo schema del database nel Database Designer, si vedrà una linea di congiunzione fra orders e customer, rappresentante la nuova relazione permanente.

Gli indici impongono le basi per le relazioni permanenti

Il tipo di indice determina il tipo di relazione permanente che si può creare. Si può usare una chiave indice primaria o candidata per ‘uno’ dei lati di una relazione uno a molti, mentre per il

Page 117: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

117

lato ‘molti’ si può usare una chiave indice regolare . Per maggiori informazioni sui tipi di indice e lal creazione degli indici, vedere il Capitolo 7, Uso delle Tabelle.

Cancellare una relazione permanente fra le tabelle.

1. Nel Database Designer, cliccare sulla linea fra le due tabelle.

La linea diventerà più grande per indicare che si è selezionata una relazione.

2. Premere il tasto DELETE o CANC

-oppure-

Usare la calusola DROP FOREIGN KEY con il comando ALTER TABLE .

Per esempio il seguente comando cancella una relazione permanente fra la tabella customer e la tabella orders, basata sulla chiave primaria cust_id nella tabella customer, e una chiave esterna, cust_id, nella tabella orders:

ALTER TABLE orders DROP FOREIGN KEY TAG cust_id SAVE

Page 118: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

118

Generazione dell’Integrità Referenziale

Stabilire l’integrità referenziale impegna a costruire una serie di regole per proteggere le relazioni definite fra le tabelle quando si inseriscono o cancellano records.

Se si applica l’integrità referenziale, Visual FoxPro impedisce di:

?? Aggiungere records a una tabella relazionata quando non ci sono record associati nella tabella primaria.

?? Modificare valori in una tabella primaria che potrebbe successivamente risultare priva di records nella tabella relazionata.

?? Cancellare record da una tabella primaria quando vi sono records nella tabella relazionata.

Si può scegliere di scrivere propri attivatori (trigger) e codice di Procedure Memorizzate (stored procedure) per rispettare l’integrità referenziale. Tuttavia, il Referential Integrity (RI) Builder permette di determinare le regole da rispettare, le tabelle sulla quale si vuole che le regole siano rispettate, e gli eventi di sistema che costringeranno Visual FoxPro a controllare le righe di integrità referenziale.

Il sistema RI Builder a livelli multipli gestisce cancellazioni ed aggiornamenti a più livelli ed è raccomandato come strumento per la generazione dell’integrità referenziale.

Aprire il Generatore di Integrità Referenziale

1. Aprire il Database Designer.

2. Dal Menù Database, scegliere Referential Integrity.

Quando si usa il Generatore di Integrità Referenziale per costruire le regole del database, Visual FoxPro genera codice per imporre le regole dell’integrità relazionale, il codice viene salvato come trigger che fa riferimento a stored procedure. E’ possibile visualizzare il codice aprendo nel database l’editor di testo delle procedure memorizzate. Per informazioni sulla creazione della programmazione delle attivazioni, vedere “Uso delle Attivazioni” nel Capitolo 7, Uso delle Tabelle.

Attenzione Quando si modifica un database, modificando le tabelle del database stesso o modificando gli indici usati in relazione permanente, è necessario rilanciare il Generatore di Integrità Referenziale prima di usare il database. Ripetendo l’operazione descritta il Generatore di Integrità Referenziale modifica le procedure memorizzate il codice ed i triger delle tabelle usate per rispettare l’integrità referenziale affinché essi possano aggiornare la nuova situazione. Se non si riavvia il Generatore di Integrità Referenziale si potrebbero avere risultati inattesi, perché le procedure memorizzate ed i trigger non sono aggiornati alle nuove modifiche.

Creazione di Procedure Memorizzate

E’ possibile creare procedure memorizzate per le tabelle contenute nel database. Una procedura memorizzata (Stored Procedure) è del codice scritto in Visual Fox Pro e memorizzato nel file .dbc. Le procedure memorizzate sono righe di codice che operano specificatamente sui dati del database.

Page 119: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

119

Memorizzare le procedure può migliorare le prestazioni perchè esse sono caricate nella memoria quando il database è aperto.

Creare, modificare, o rimuovere una procedura memorizzata

?? Nel Project Manager, selezionare un database e scegliere Stored Procedures, poi selezionare New, Modify, o Remove.

-oppure-

?? Nel Database Designer, scegliere Edit Stored Procedures dal menu Database.

-oppure-

?? Nella finestra Command, usare il comando MODIFY PROCEDURE.

Ognuna di queste opzioni apre l’editor di testi di Visual Fox Pro, per permettere di poter creare, modificare, o cancellare le procedure memorizzate nel corrente database.

Si possono usare le procedure memorizzate per creare funzioni definite dall’utente alle quali viene fanno riferimento nelle regole di convalida a livello di campi- e di record. Quando si salva una funzione personalizzata com una procedura memorizzata nel database, il codice per la funzione è salvato nel file .dbc e automaticamente segue il database anche se lo stesso cambia percorso di allocazione. Usando le procedure memorizzate costruite nell’applicazione rende la stessa più trasportabile non dovendo gestire le funzioni personalizzate separatamente dal database.

Visualizzazione e impostazione proprietà Ambiente Database

Ogni database di Visual Fox Pro contiene le proprietà Version e Comment. Si può visualizzare e mettere a punto queste proprietà con le funzioni DBGETPROP( ) e DBSETPROP( ) .

Per esempio, il seguente codice visualizza il numero di versione del database testdata :

? DBGETPROP('testdata', 'database', 'version')

Il valore restituito rappresenta il numero di versione di un file .dbc di Visual Fox Pro, ed è un valore di sola lettura. Usando la stessa funzione, si può visualizzare il commento, nel caso ne esistesse uno, per il database:

? DBGETPROP('testdata', 'database', 'comment')

A differenza della proprietà Version, la proprietà Comment può essere assegnata. Si può usare la funzione DBSETPROP( ) e digitare una descrizione o altro testo che si vuole memorizzare con il database.

Assegnare la proprietà commento al database corrente

?? Nel Database Designer, scegliere Properties dal menù Database e digitare un commento nel riquadro Comment

-oppure-

Page 120: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

120

?? Usare l’opzione comment della funzione DBSETPROP( ).

Per esempio, il seguente codice modifica il commento per il database testdata :

? DBSETPROP('testdata', 'database', 'comment', ; 'TestData is included with Visual FoxPro')

Si possono anche usare le funzioni DBGETPROP( ) e DBSETPROP( ) e visualizzare e mettere a punto le proprietà su altri oggetti del database come connessioni (connections) e viste (views).

Visualizzare e Modificare l’Architettura di un Database

Quando si crea un database, Visual FoxPro crea e apre esclusivamente un file .dbc (DataBase Container). Il file .dbc memorizza tutte le informazioni sul database, inclusi i nomi dei file e gli oggetti associati con esso. Il file .dbc non contiene fisicamente oggetti principali come tabelle o campi. Più propriamente, Visual FoxPro memorizza il percorso dei file tabella nel file .dbc.

Per esaminare l’architettura del database, è possibile effettuare lo scorrimento (browse) del file database, visualizzare lo schema, visualizzare gli oggetti del database, validare il database, e persino estendere il file .dbc.

Visualizzare lo Schema del Database

Lo schema del database è una rappresentazione visuale della struttura della tabella e delle relazioni persistenti stabilite nel database. La finestra del Database Designer visualizza lo schema del database aperto.

Visualizzare lo schema del database

?? Usare il comando MODIFY DATABASE .

Per esempio, il seguente codice apre il database testdata e visualizza lo schema nel Database Designer:

MODIFY DATABASE testdata

Uno schema del database è una rappresentazione degli oggetti presenti in un database.

Page 121: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

121

Dal Database Designer, si può usare la barra degli strumenti del Database per creare una nuova tabella, aggiungere una tabella esistente al database, rimuovere una tabella dal database, o modificare la struttura di una tabella. Puoi anche creare connessioni e modificare le procedure memorizzate.

Visualizzare il File Database

Il file database contiene un record per ogni tabella, vista, indice, tag indice, relazioni permanenti, e connessioni associati al database, così come per ogni campo della tabella o della vista si avranno proprietà estese. E’ incluso anche un singolo record che contiene le procedure memorizzate per il database.

Per informazioni circa la struttura del file .dbc, vedere Struttura File Tabella.

Mentre il Database Designer provvede ad una concettuale rappresentazione dello schema del database, a volte si potrebbe avere bisogno di effettuare la visualizzazione di ciò che è contenuto nel database. E’ possibile visualizzare un database chiuso eseguendo il comando USE sul file .dbc. Il seguente esempio apre una finestra Browse visualizzando il contenuto del database sales in formato tabella.

CLOSE DATABASE sales USE sales.dbc EXCLUSIVE BROWSE

Attenzione Non usare il commando BROWSE per alterare il file database a meno che non si conosca perfettamente la struttura del file .dbc. Se si compie un errore mentre si prova a modificare il file .dbc si può invalidare il database e potenzialmente perdere i dati.

Estendere i File Database

Ogni file .dbc contiene un campo Memo denominato User che è possibile usare per memorizzare le proprie informazioni circa ogni record incluso nel database. E’ possibile anche estendere un file

Page 122: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

122

.dbc aggiungendo campi per favorire le necessità di programmazione. I campi possono essere aggiunti alla fine della struttura. Si deve avere accesso esclusivo a un file .dbc per poterne modificare la sua struttura.

Aggiungere un campo a un file .dbc

1. Aprire il file .dbc per uso esclusivo con il comando USE .

2. Usare il commando MODIFY STRUCTURE .

Per esempio, il seguente codice apre il Table Designer così è possibile aggiungere un campo alla struttura di Testdata.dbc:

USE TESTDATA.DBC EXCLUSIVE MODIFY STRUCTURE

Quando si aggiunge un nuovo campo a un file database, il nome del campo inizia con “U” per indicarlo come un campo definito dall’Utente. Questa assegnazione protegge il campo da conflitti con altre future estensioni del file .dbc.

Attenzione Non cambiare le definizioni già esistenti dei campi di Visual Fox Pro nel file file .dbc. Ogni modifica eseguita su un file .dbc potrebbe influire sull’integrità del database.

Convalidare un Database

La convalida di un database assicura che le righe che lo compongono sono un’esatta rappresentazione dei meta-dati dello stesso . E’ possibile controllare l’integrità del corrente database con il comando VALIDATE DATABASE .

Convalidare un database

?? Usare il comando VALIDATE DATABASE .

Per esempio, il seguente codice usa e convalida il file .dbc per il database testdata :

OPEN DATABASE testdata EXCLUSIVE VALIDATE DATABASE

Amministrare un Database

Dopo la creazione di un database, è possibile che si voglia aggiungere lo stesso ad un progetto nel caso non ne facesse già parte. Se invece il database è parte di un progetto, è possibile rimuoverlo dallo stesso. Inoltre, se il database non è più necessario per i propri scopi, è possibile cancellarlo dal disco fisso.

Un database nel Gestore di Progetti

Page 123: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

123

Aggiungere un Database a un Progetto

Quando si crea un database con il comando CREATE DATABASE , il database non è inserito automaticamente nel progetto, anche se il Project Manager è aperto. E’ possibile aggiungere il database ad un progetto per facilitarne la sua gestione, visualizzarlo e manipolare gli oggetti del database attraverso l’interfaccia, come pure per semplificare il processo di costruzione di un’applicazione. E’ possibile aggiungere un database a un progetto solamente attraverso il Project Manager.

Aggiungere un database a un progetto

?? Nel Project Manager, selezionare Databases e scegliere Add.

Rimuovere un Database da un Progetto

E’ possibile rimuovere un database da un progetto solamente attraverso il Project Manager.

Rimuovere un database da un progetto

?? Nel Project Manager, selezionare il database e scegliere Remove, e poi scegliere ancora Remove.

Cancellare un Database

E’ possibile cancellare un database da un disco usando il Project Manager o il comando DELETE DATABASE.

Page 124: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

124

Cancellare un database

?? Nel Project Manager, selezionare il database e scegliere Remove, e poi scegliere Delete.

-oppure-

?? Usare il comando DELETE DATABASE .

Per esempio, il seguente codice cancella il database sample:

DELETE DATABASE sample

Usare uno dei metodi sopradescritti per cancellare un database dal disco. Usando il Project Manager o il comando DELETE DATABASE si abilita Visual FoxPro a rimuovere i backlink, collegamenti, al database dalle tabelle di un database. Se si cancella un file database, così come il Windows Explorer, questi backlink non sono rimuovere.

Nota Il comando DELETE DATABASE non cancella le tabelle associate con un database dal disco che invece diventano tabelle libere. Se si vogliono cancellare sia il database e tutte le relative tabelle associate dal disco, usare la clausola DELETETABLES con il comando DELETE DATABASE.

Riferimento a più Database

E’ possibile avere più database di Visual FoxPro sul proprio sistema per migliorare l’organizzazione in un ambiente multiutente. I database multipli offrono i seguenti vantaggi:

?? Controllo dell’accesso utente a un sottosistema di tabelle contenute nel complessivo del sistema.

?? Organizzare i dati efficientemente ed in modo appropriato le informazioni necessarie presenti nel proprio sistema informativo.

?? Permettere l’uso esclusivo di un sottosistema di tabelle per creare viste locali e remote a run time.

Per esempio, si potrebbe avere un database Vendite contenente le informazioni relative alle vendite e che viene usato principalmente dal reparto vendite che lavora con i Clienti ed un altro database che contiene le informazioni relative al magazzino usate principalmente nel rapporto fra il Reparto Acquisti ed i Fornitori. A volte le informazioni di questi gruppi potrebbero essere sovrapposte. Questi database possono essere aperti contemporaneamente e accessibili a piacere ma essi contengono differenti tipi di informazione.

I Database multipli aggiungono flessibilità al sistema

Page 125: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

125

E’ possibile usare simultaneamente database multipli aprendo più di un database contemporaneamente o riferendosi alle tabelle collegate ad un database chiuso. Una volta che i database multipli sono aperti, è possibile scegliere il database corrente e selezionare le tabelle in esso contenute.

Aprire più di un Database

Quando un database è aperto, le tabelle e le relazioni fra le tabelle sono controllate nelle informazioni memorizzate nel database aperto. E’ possibile avere più di un database aperto contemporaneamente. Per esempio, è possibile usare database multipli aperti quando si lavora su più applicazioni, ognuna basata su un differente database. E’ possibile anche aprire database multipli per utilizzare informazioni, come ad esempio controlli personalizzati che sono memorizzati in database separati da quelli dell’applicazione corrente.

Per aprire più di un database

?? Nel Project Manager, selezionare un database e scegliere Modify oppure Open.

-oppure-

?? Usare il commando OPEN DATABASE

Aprendo un nuovo database non si chiudono gli altri database che precedentemente erano stati aperti. Gli altri database rimangono aperti, e il database appena aperto diventa il database corrente.

Assegnare il Corrente Database

Page 126: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

126

Quando si aprono database multipli, Visual FoxPro predispone il database aperto per ultimo come il database corrente. Ogni tabella o altri oggetti che vengono creati o aggiunti al database diventano parte del corrente database per convenzione. I comandi e le funzioni che manipolano database aperti, come ADD TABLE e DBC( ), operano nel corrente database.

E’ possibile scegliere un differente database come corrente database attraverso l’interfaccia o con il comando SET DATABASE.

Per assegnare il corrente database

?? Sulla barra degli strumenti standard, selezionare un database dal riquadro Databases.

-oppure-

?? Usare il comando SET DATABASE.

Per esempio, il seguente codice apre tre database, assegnando il primo database come il corrente database, poi usa la funzione DBC( ) per visualizzare il nome del corrente database:

OPEN DATABASE testdata OPEN DATABASE tastrade OPEN DATABASE sample SET DATABASE TO testdata ? DBC( )

Tip Visual FoxPro può aprire uno o più database automaticamente quando si esegue una query o un form che richiedono che i database siano aperti. Per essere sicuri che si sta operando sul corretto database, assegnare esplicitamente il corrente database prima che vengano utilizzati comandi che operano sul corrente database.

Selezionare Tabelle nel Corrente Database

E’ possibile scegliere da una lista di tabelle presenti nel corrente database attraverso il comando USE.

Scegliere una tabella dal corrente database

?? Utilizzare il comando USE con il simbolo “?”

Verrà visualizzato il box di dialogo del comando Use in modo da poter selezionare una tabella da aprire.

Per esempio, il seguente codice apre il database sales e attende che venga selezionata una tabella dalla lista delle tabelle presenti nel database.

OPEN DATABASE SALES USE ?

Se si vuole selezionare una tabella che non è associata con il database aperto, è possibile scegliere Other nel box di dialogo del comando Use.

Page 127: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

127

Chiudere un Database

E’ possibile chiudere un database aperto attraverso il Project Manager oppure con il comando CLOSE DATABASE.

Per chiudere un database

?? Dal Project Manager, selezionare il database e scegliere Close.

-oppure-

?? Usare il comando CLOSE DATABASE

Per esempio, il seguente codice chiude il database testdata :

SET DATABASE TO testdata CLOSE DATABASE

Entrambi le opzioni chiudono il database automaticamente. E’ possibile anche chiudere i database e tutti gli altri oggetti aperti con la clausola ALL del comando CLOSE .

Utilizzando il comando CLOSE DATABASE dalla finestra Command non viene chiuso un database se il database era stato aperto:

?? Dal Project Manager quando viene estesa la struttura per visualizzare il contenuto di un database.

?? Da un form che sta lavorando proprio in quella data session.

In queste circostanze, il database rimane aperto fino a che il Project Manager non chiude il database, o fino a che il database in uso nel form non venga chiuso.

Area di validità

Visual FoxPro usa il corrente database come area di validità per l’identificazione di oggetti, come le tabelle. Quando un database è aperto, Visual FoxPro per prima cosacerca all’interno del database aperto la presenza dell’oggetto richiesto, come tabelle, viste, connessioni, e così via. Se l’oggetto non è nel database, Visual FoxPro guarda nel percorso di ricerca predefinito.

Per esempio, se la tabella customer è associata con il database sales, Visual FoxPro vuole sempre la presenza della tabella customer nel database quando vengono utilizzati i seguenti comandi:

OPEN DATABASE SALES ADD TABLE F:\SOURCE\CUSTOMER.DBF USE CUSTOMER

Se invece si utilizza il seguente comando, Visual FoxPro guarderà prima nel corrente database per la tabella products.

USE PRODUCTS

Page 128: “Microsoft Visual FoxPro ® 6.0 Programmer’s Guide ... · Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © - 3 Supponiamo che, dopo

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © www.foxitaly.com -

128

Se products non è nel corrente database, Visual FoxPro ricercherà esternamente al database, usando il percorso di ricerca predefinito.

Nota E’ possible specificare l’esatto percorso per una tabella se si vuole essere in grado di accedere all’interno o all’esterno di un database come, per esempio, nel caso si preveda un cambiamento nella locazione di una tabella. Comunque è possibile aumentare la prestazione indicando il solo nome della tabella, perché Visual FoxPro accede ai nomi delle tabelle nel database più velocemente indicando il solo nome della tabella che non specificando l’intero percorso.

Trattamento degli Errori dei Database

Gli errori dei Database, anche chiamati “engine errors,” avvengono nel momento in cui gli errori di run-time sono presenti nel codice contenuto a livello di record. Per esempio, un errore del database può avvenire quanto un Utente tenta di memorizzare un valore null in un campo che non accetta valori null.

Quando avviene un errore in un database, la parte del database che rileva l’errore visualizza un messaggio di errore. Comunque, l’esatta natura del messaggio di errore dipende dal database al quale si sta accedendo. Per esempio, i messaggi di errore prodotti da un database remoto ( come Microsoft SQL Server) sarà probabilmente differente da quello prodotto se l’errore del database avviene in una tabella locale di Visual FoxPro.

Inoltre, il livello degli errori è spesso generico, perché il gestore interno del database non ha informazioni riguardo al record che si sta aggiornando Di conseguenza, i messaggi di errore prodotti dal gestore interno del database sono spesso poco utili all’Utente finale di un’applicazione di Visual Fox Pro.

Per curare gli errori dei database più specificatamente, è possibile creare attivazioni usando il comando CREATE TRIGGER. L’attivazione viene chiamata quando si tenta di aggiornare un record ( cancellazione, inserimento, modifica). Il codice personalizzato nell’attivazione può cercare una specifica condizione di errore per l’applicazione e relazionare su questa.

Se si sta usando il proprio sistema di attivazione degli errori del database, dovrebbe essere attivo il buffering. In questo modo, quando un record è aggiornato la propria attivazione viene chiamata, ma il record non è immediatamente inviato al corrispondente database. Perciò si evita la possibilità di produrre due messaggi di errore: uno proveniente dall’attivazione e l’altro dal gestore interno del database.

Come creare messaggi di errore personalizzati usando le attivazioni

1. All’interno di una procedura definita dall’utente o nelle procedure memorizzare, scrivendo un proprio messaggio di testo personalizzato.

2. Abilitando il buffering con la funzione CURSORSETPROP( ) per visualizzare il proprio personale testo. Se il buffering è off, l’utente vedrà sia il messaggio personalizzato che quello proveniente dal gestore interno dei messaggi di errore.