Visual dBASE 7.01 Tutorial

Fase III - La Gestione del Database

Ultima modifica: 5 febbraio, 1999
Ken Mayer, TeamB 

 

  Traduzione in Italiano di: Antonio Campagna - Luglio 2000

Mete ed Obiettivi

Lettura Richiesta: Scarica, se non lo hai già fatto, BEGDATA.ZIP, dal mio sito web e comincia a leggerlo. Questo documento affronta l'argomento degli Oggetti Dati in Visual dBASE 7. La parte importante del documento, per ora è la sezione Alias BDE, ma dovresti leggerlo per intero.

Creiamo il Database

Ciò che necessita al nostro progetto, è la creazione di alcune tabelle. Un insieme di tabelle è "un database". I precedenti manuali di dBASE /DOS, hanno confuso non poco, gli sviluppatori definendo le singole tabelle "Files database" (in seguito nel documento li indicheremo come .DBF), e tuttora  molta gente chiama le tabelle individuali (files .DBF) "database". Non lasciarti confondere, un database è realmente un gruppo di tabelle.
In un Server SQL(Interbase, Oracle, ...) questo insieme di tabelle potrebbe essere memorizzato in un singolo file. Comunque, per quel che ci riguarda, useremo tabelle locali, e questi sono tutti singoli  files, infatti, un .DBF locale tipicamente usa al meno due files (un .DBF ed un .MDX) e può essercene un terzo se stai usando campi memo o altri campi Binari (.DBT).

Per il nostro progetto lavoreremo nella directory "TUTORIAL", ma non terremo tutte le tabelle nella directory dove si trova il codice sorgente. Invece, per esse, creeremo una sotto directory di "TUTORIAL".

Il modo più semplice per fare quanto suddetto, è assicurarti tramite il "Centro di Controllo" che ti trovi nella directory TUTORIAL. (nel combobox "Cerca in" dovresti vedere "C:\ TUTORIAL" o altra locazione dove hai deciso di mettere il tutorial). Se così non fosse, tramite il pulsante a destra del combobox spostati nella corretta directory.

Una volta là, nella finestra comandi digita:

MD TABLES

e premi il tasto < Invio>.

Creiamo un Alias BDE

Creare un Alias BDE, significa "dire" a dBASE, di considerare le tabelle nella cartella TABLES, come un database.Questo potrebbe sembrare complicato, ma, in effetti non lo è.

Per prima cosa, dovresti uscire da dBASE. (Se crei un alias BDE e dBASE è in esecuzione, l'alias non sarà riconosciuto, fino a quando dBase non "riparte").  

Lancia BDE Administrator. (In seguito nel documento lo indicheremo con BDE)

Sul pannello sinistro del BDE, vedrai un controllo "Notebook" con due separatori (tab), in uno si legge "Database" e sull'altro "Configurazione." Assicurati che sia attiva l'opzione "Database", se necessario clicca sul separatore per selezionarla.

Clicca il pulsante destro del mouse e seleziona "Nuovo" dal menu popup.

Apparirà la finestra di dialogo "Nuovo alias di database" (vedi figura)  la quale visualizza un combobox "Nome del driver di database" che conterrà la scelta "STANDARD". Clicca su "OK."

Il nome del nuovo alias dovrebbe essere "STANDARD1" (benché potrebbe essere "STANDARD2" o qualche cosa di simile, se precedentemente hai effettuato operazioni con il BDE ). Tale nome sarà evidenziato nel pannello sinistro, cliccaci su e cambialo in "TUTORIAL" (e premi "Invio"). Nel  pannello destro del BDE, cambia il "DEFAULT DRIVER" da "Paradox" a "DBASE." Nella opzione "PATH", clicca sul pulsante che visualizza qualcosa di simile ai tre puntini di sospensione (...), e imposta il percorso relativo alle tabelle che dovrai inserire nel tutorial ad es. "TUTORIAL\TABLES"

  

Prima di finire dovresti verificare se stai lavorando con tabelle di livello 7.

Clicca sul separatore "Configurazione" del BDE,  espandi la vista ad albero: Configurazione|Driver|Nativo|DBASE. Il pannello destro deve mostrare fra le altre cose, l'opzione "LEVEL", con un valore uguale a 7. Se così non fosse cambialo al valore 7.

Infine clicca sul separatore "Database", e premi < Ctrl> + A apparirà la finestra di dialogo "conferma" la quale ti da la possibilità di salvare il tutto, clicca su "OK" , ed esci dal BDE.

Complimenti, hai appena creato un Alias BDE!!!

Letture Suggerite: MISCCODE.ZIP e BEGDATA.ZIP  trattano l'argomento degli Aliases BDE e dei Database. In più MISCCODE.ZIP parla dei "Driver di Lingua" e spiega perché dovresti usare Drivers ANSI per le tue tabelle.

N.B. C'è un metodo che consente di creare (cancellare) programmaticamente un Alias BDE, è contenuto nella Libreria di Funzioni "dUFLP" nel file "BDEALIAS.CC." Qui non useremo questa possibilità. Ritengo, sia una buona idea  (per questo tutorial) familiarizzare con BDE Administrator, ma considera questa possibilità in futuro.

Creiamo le Tabelle 

Per la nostra applicazione abbiamo bisogno di diverse tabelle. Andando avanti, tenterò di spiegare i perché delle diverse informazioni che memorizzeremo in queste tabelle.

NOTA: E' piuttosto importante, affinché l'applicazione sviluppata con il tutorial lavori correttamente, che tu imposti i campi nelle tabelle come descritto in questa fase, senza variare nulla per evitare di incorrere in problemi di diversa natura.

Una volta che abbiamo impostato il nostro Alias BDE, verifica che Visual dBASE punti sulla directory TUTORIAL (non sulla directory TABLES).

Attiviamo il database

Clicca sul separatore "Tabelle" nel Centro di Controllo, e nel combobox "Cerca in" , seleziona l'alias TUTORIAL (dovrebbe essere in fondo all'elenco visualizzato). Nota che un alias BDE, ha un'icona diversa da quella usata per le cartelle . Tale icona rappresenta un "database", e quando il centro di questa icona è di colore "verde", significa che il database è attivo. Questo ci garantirà che le tabelle che creeremo, saranno salvate nell'ubicazione corretta. (puoi fare la stessa cosa digitando nelle finestra comandi: OPEN DATABASE TUTORIAL )

Creiamo la tabella Customer (Clienti)

Le informazioni  sui clienti, sono evidentemente molto importanti per qualsiasi organizzazione di vendita. Queste  informazioni potrebbero essere molto complesse, ma, nel nostro caso non saranno molto dettagliate.

Come minimo hai bisogno di conoscere i nomi dei clienti, un indirizzo per le fatture ed uno per le spedizioni (nel nostro esempio stabiliamo che siano identici, anche se un'applicazione reale potrebbe avere due o più indirizzi), un campo per le note, ed un codice cliente univoco. La ragione per avere un codice cliente sta nel fatto, che è abbastanza probabile avere due clienti con l'identico nome.

Creare una tabella in Visual dBASE 7 è piuttosto facile. Nel Centro di Controllo clicca sul separatore "Tabelle", e fai un doppio clic sull'icona   (puoi creare anche una nuova tabella con il menu "File" (seleziona "Nuovo"), o dalla finestra comandi, digitando CREATE e premi il tasto <Invio>).

Se viene visualizzata una finestra di dialogo che ti chiede di scegliere tra l'opzioni "Wizard" o "Imposta", clicca su quest'ultima. Per questa applicazione non useremo "Wizard" (Mago) per generare le tabelle.

Sei adesso nel modulo "Impostazione tabella". Puoi osservare che i menu e le barre strumenti sono cambiate. Vedrai anche un componente chiamato "Ispezione" che sarà usato per "Ispezionare" ed in molti casi, per cambiare le proprietà, gli eventi e i metodi di vari oggetti

 

Lettura suggerita: Ci sono molto cose che possono essere fatte qui, e piuttosto che cercare di spiegare o mostrare tutto ciò che puoi fare, dovresti esaminare la "Guida alla programmazione" Capitoli 13 e 14 (quel piccolo libro in dotazione con Visual dBASE). Per favore prendi un po' di tempo e consultalo.

Lavoreremo con le prime tre colonne per definire i campi della tabella, torneremo più tardi sull'ultima colonna (indice). Per questa applicazione, relativamente ai campi numerici useremo solamente i tipi "autoincremento" e "long", i quali non hanno la parte decimale e di conseguenza non ci preoccuperemo per questi campi della colonna "decimali".
Il primo campo indicherà il codice cliente, lo chiameremo "Customer ID", e per quanto detto prima, dovrà essere un codice univoco. Come faremo? 

Nelle versioni precedenti di dBASE, hai dovuto scrivere un mucchio di codice, per fare in modo che un campo contenga un valore univoco. Le tabelle di Visual dBASE 7, hanno uno speciale tipo di campo chiamato autoincremento. Questo tipo di campo può gestire valori numerici fino al di sopra di 2 miliardi, ma la cosa più importante, è ogni volta che aggiungi una nuova riga alla tabella questo campo viene aggiornato automaticamente, ed il valore in esso contenuto sarà maggiore di una unità rispetto alla riga precedente. Questo significa che non potrai mai duplicare un valore in questo campo. Gli altri campi che faranno parte di questa tabella sono in maggioranza di tipo "standard" (la maggior parte di loro sono di tipo carattere, l'ultimo è un campo memo).

In "impostazione tabella" nella colonna "Nome" , inserisci "Customer ID" (ovviamente senza le doppie virgolette), premi il tasto <Tab> per spostarti alla colonna "Tipo". Nel combobox che appare seleziona "Autoincremento" o digita la lettera "A" , e vedrai che nella colonna "Dim." la lunghezza sarà impostata automaticamente a 4.

NOTA: "Perché 4 ? Ma hai detto che questo campo può gestire valori numerici superiori a 2 miliardi... quattro cifre non sono sufficienti!" Sì, capisco... ma 4 per il campo autoincremento si riferisce a 4 BYTE e 4 BYTE significano qualcosa in più di quattro "cifre." Il valore attuale qui è un numero intero LUNGO, il quale permette un ampiezza approssimativa di 4 miliardi di caratteri (256^ 4= 4,294,967,296 caratteri), ma metà di essi sono negativi ed il campo autoincremento non gestisce numeri negativi.

Al momento non immetteremo informazioni nelle colonne "Decimali" e "Indice" (parleremo degli indici più avanti), così usa il tasto <Tab> per saltarli. Così facendo ti sposterai sul secondo campo, nuovamente nella colonna "Nome". Imposta la tabella con le seguenti informazioni:

CampoNome Campo Tipo Dim
1Customer IDAUTOINCREMENTO4
2Last Name CARATTERE 20
3First Name CARATTERE  20
4Phone CARATTERE  20
5Street1 CARATTERE  40
6Street2 CARATTERE 40
7City CARATTERE 30
8State ID CARATTERE 2
9Postal CARATTERE 10
10Country ID CARATTERE 2
11Comment MEMO 10

 

NOTA: Molti libri o tutorial avrebbero creato gl'indici contestualmente alla creazione della tabella. Essendo questa un'applicazione solo per scopi di studio, parleremo degli indici più avanti. Durante lo sviluppo di una "reale" applicazione probabilmente creerai gl'indici nello stesso momento che crei la tabella.

Salva la tabella premendo i tasti <Ctrl> e "W". Apparirà la finestra di dialogo "Salva tabella" che ti chiederà di inserire un nome, immetti: 

"Customer" e premi <Invio>. 

Puoi notare che in fondo alla finestra di dialogo c'è un combobox "Database" che è disabilitato e visualizza "TUTORIAL" (cioè le nostre tabelle sono pertinenti al database "tutorial" e se vorresti cambiare la destinazione devi chiudere il database attivo prima di lanciare il modulo "Impostazione tabella"). C'è anche un combobox "Salva con nome" anch'esso disabilitato, questo perché l'alias è stato definito come tabelle dBASE.

 

Creiamo la tabella Inventory (Articoli - Inventario)

La tabella inventario non sarà molto grande, ma questo dipende dal progetto. Memorizzeremo alcune informazioni che potrebbero essere memorizzate in un'altra tabella. La ragione per questo è che alcune informazioni sono ridondanti. Per esempio, le informazioni sui fornitori non dovrebbero essere memorizzate nella tabella inventario. Molto probabilmente diversi tipi di merci saranno presi dallo stesso fornitore. Memorizzare questa informazione per ciascun articolo che proviene dallo stesso fornitore è una cattiva idea, se i dati del fornitore cambiano, dovrai cambiarli in ciascun articolo dell'inventario.

NOTA: Il processo di "spezzettare" i dati in tabelle più piccole è chiamato "normalizzazione". La normalizzazione tra le altre cose, può farti risparmiare anche spazio su disco perché riduci notevolmente le ridondanze. Ci sono libri che "scavano" profondamente sul problema della normalizzazione, ed approfondire questo argomento esula dagli scopi di questo tutorial. Comunque, basta dire che se hai molti dati duplicati, dovresti probabilmente normalizzare i dati spezzettandoli in tabelle più piccole. Se da una parte questo significa molto lavoro per definire i dati e le relazioni tra essi dall'altra salverà te ed i tuoi clienti da una TONNELLATA di lavoro successivamente.

Al fine di relazionare  tra loro le tabelle (Inventory e Supplier, per esempio), useremo un campo "comune" (ad es. "Supplier ID").  Il campo "Supplier ID" nella tabella Inventory sarà un collegamento per associare "Supplier ID" nella tabella Supplier.
Creiamo la nuova tabella nello stesso modo utilizzato sopra: 

 
CampoNome CampoTipoDim
1Item ID AUTOINCREMENTO4
2Supplier IDLONG 4
3DescriptionCARATTERE 40
4Qty LONG 4
5Picture BINARY 10

Nota che ciascun articolo ha un unico codice identificativo ( "Item ID"), un collegamento alla tabella fornitore (Supplier ID), una descrizione articolo, la quantità, ed un campo binario usato per memorizzare l'immagine dell'articolo.

Salva la tabella e chiamala "Inventory".

Creiamo la tabella Invoice (Fatture)

Ciascuna fattura può contenere diversi articoli, ed avrai bisogno di un modo per collegare il cliente che ha ordinato la merce. Quando arriveremo più avanti nel progetto, vedremo come realizzare questa relazione. Una caratteristica molto utile di questa relazione, è che se impostata propriamente, aggiungendo una nuova riga, automaticamente si riempirà il campo collegato... parleremo di ciò quando arriveremo alla parte riguardante le schede.

Il campo "Invoice ID" sarà usato per collegare "gli articoli" alla fattura. Il campo "Customer ID" sarà usato per collegare i dati del cliente a ciascuna fattura. Quando progetteremo le schede vedrai in che modo useremo il campo "Pay Type"  (faremo una scheda "field morphing") e così via. E' piuttosto elegante, ma un po' complicato discuterlo qui.

Nel nel frattempo, completiamo la tabella:

CampoNome CampoTipoDim
1Invoice ID AUTOINCREMENTO4
2Customer IDLONG 4
3Order Date DATA 8
4Pay Type  CARATTERE 2
5Card Number CARATTERE 20
6Card Exp  CARATTERE 10
7Card Name  CARATTERE 40
8Check NumberLONG 4

Salva la tabella, e chiamala "INVOICE". 

Creiamo la tabella Line Item (Articoli)

La tabella Line Item sarà usata per memorizzare le informazioni di ciascun articolo ordinato. La cosa interessante è che due dei tre campi saranno riferimenti ad altre tabelle.

Il primo campo, "Invoice ID," è un collegamento alla tabella delle fatture (Invoice.dbf) Il secondo, "Item ID" è un collegamento alla tabella Inventario (Inventory.dbf) -- visualizzeremo  il nome (descrizione) dell'articolo. Il campo "Qty" è la quantità di merce ordinata.

Crea la tabella:  

CampoNome CampoTipoDim
1Invoice ID LONG4
2Item ID LONG4
3Qty LONG4

Salvala e chiamala "LineItem".

Creiamo la tabella State

La tabelle "State" è semplicemente usata per operazioni di lookup. Le tabelle "Customer" (clienti) e "Supplier" (Fornitore) memorizzeranno un riferimento allo stato (paese) (un campo caratteri di dimensione 2, tale che "CA" significa "California"). Comunque, per convenienza degli utenti la scheda mostrerà l'intero nome dello stato anziché la sigla. Questo sarà realizzato impostando una speciale istruzione "lookup" per queste tabelle nei Moduli Dati...

per fare quanto suddetto abbiamo bisogno di una tabella molto semplice: 

 
CampoNome CampoTipoDim
1State ID CARATTERE2
2State CARATTERE32

Salvala e chiamala "State" 

Creiamo la tabella Country (Paese)

Questa tabella a prima vista è quasi identica alla tabella "State" e serve per gli stessi scopi. Crea una nuova tabella ed immetti le informazioni seguenti:

CampoNome CampoTipoDim
1Country IDCARATTERE2
2Country CARATTERE20

Salvala con il nome di "Country"

Creiamo la tabella Supplier (Fornitore)

Per questa applicazione è necessaria un ultima tabella, quella relativa ai Fornitori. abbiamo bisogno di conoscere il nome della persona nostro contatto nella compagnia, come contattarlo (e-mail, telefono, ecc.):

CampoNome CampoTipoDim
1Supplier ID AUTOINCREMENTO4
2Contact CARATTERE 30
3Company  CARATTERE 40
4Phone  CARATTERE 20
5Fax  CARATTERE 20
6EMail  CARATTERE 40
7Street1  CARATTERE 40
8Street2  CARATTERE 40
9City  CARATTERE 30
10State ID  CARATTERE 2
11Postal  CARATTERE 10
12Country ID  CARATTERE 2

Salva la tabella, e chiamala "Supplier" 

 


Creiamo gli Indici

Ora abbiamo un gruppo di tabelle vuote... comunque, una volta che cominceremo ad usarle avremo bisogno di visualizzare i dati in sequenze diverse dall' "ordine naturale" (cioè nell'ordine in cui i dati sono stati immessi).
Per questo scopo, avremo bisogno degli indici.

Ci sono diversi modi per aggiungere indici alle tue tabelle in Visual dBASE.  

NOTA: Per il tutorial creeremo "marcatori" (tags) indice che non useremo per il progetto sviluppato con il tutorial. Questi comunque possono essere utili. Qualche volta potrebbe essere una buona idea pensare in "prospettiva". Puoi sempre rimuovere un marcatore indice se decidi di non usarlo nella tua applicazione. (questo può essere fatto in diversi modi, incluso l'utilizzo del modulo "Gestione Indici").

Puoi creare un indice e utilizzando "Impostazione tabella" 

Un indice è un modo affinché le informazioni memorizzate in una tabella siano visualizzate in un ordine specifico. dBASE ha usato, sin dalla versione "dBASE IV 1.0", quelli che sono chiamati indice di produzione(.MDX). Il file .MDX principale di una tabella è chiamato "file di produzione degli indici". Questo file si apre automaticamente quando si apre la tabella, per cui gli indici che contiene sono immediatamente disponibili, sebbene nessun indice imposti l'ordine delle righe fino a quando non lo si seleziona come indice principale. Via via che si aggiornano le righe di una tabella, anche gli indici collegati del file di produzione degli indici vengono aggiornati. Se si usano file .MDX diversi da quelli di produzione, occorre aprirli espressamente inserendo i comandi nella finestra Comandi.

Il file di produzione degli indici ha lo stesso nome della tabella più l'estensione .MDX. Questi sono un insieme di espressioni indice memorizzati in un singolo file (.MDX). Gl'indici individuali sono chiamati "marcatori" (tags) o "marcatori indice."

NOTA: Puoi creare indici che si basano su singoli campi, in questo caso si chiamano "indici semplici". Puoi creare anche indici complessi. Un indice complesso (o composito) usa un insieme di uno o più campi o un'espressione di dBASE.
Puoi includere lo stesso campo in marcatori indice multipli. Tieni presente che mentre nelle prime versioni di dBASE, avresti potuto usare funzioni definite dall'utente nell'espressione dell'indice, in Visual dBASE 7 è stata  rimossa questa capacità (nessun altro software database fa questo, ed il BDE non lo supporta. Questa fu una decisione degli sviluppatori del BDE, non del team di Visual dBASE).

Il grande vantaggio di avere i marcatori indice rispetto al vecchio metodo che memorizzava ciascun indice in un proprio file (.NDX) è che dBASE può aggiornare automaticamente ciascun marcatore indice quando necessario (ad es.quando si aggiungono,si editano,si cancellano... righe nella tabella) Il metodo più vecchio ti costringeva ad aggiornare ciascun indice (.NDX) uno alla volta o aprirli tutti ed lanciare il comando "REINDEX" il quale ricostruiva le informazioni memorizzate nell'indice.

In Visual dBASE 7, il comando "REINDEX" è solo necessario per ricostruire indici danneggiati. (esiste un metodo OODML reindex() dell'oggetto Database per la gestione di questo problema  vedi X2OODML.ZIP nel mio sito web.).

NOTA: Se hai usato la finestra comandi per creare gli indici (il prompt punto), puoi continuare ad usare questa maniera. Comunque, questo ti richiede che la tabella sia aperta (USE nometabella EXCLUSIVE) immetti il comando INDEX ON, e così via. In più se i tuoi "nomi campo" contengono degli spazi hai bisogno di usare i due punti per delimitarli come mostrato più avanti.
Questo è il "vecchio" metodo XDML che non useremo in questo tutorial, ma ancora valido in Visual dBASE 7.

Indicizzare la Tabella Customer (Usando "Impostazione tabella")

Un modo per indicizzare una tabella è utilizzare il modulo "imposta tabella".

Per portare una tabella in modalità impostazione, la via più semplice è selezionarla (nel centro di controllo), premere il tasto destro del mouse, e nel menu popup che apparirà seleziona "Imposta Tabella"" (oppure clicca sulla tabella e premi i tasti <Shift>+< F2> ).

Seleziona "Struttura" dal menu in cima allo schermo. Questo ti permette di cambiare la struttura della tabella, e gestire gli indici (in fondo al menu). Per prima cosa definiamo la "Chiave Primaria" per questa tabella, così seleziona l'opzione "Definisci Chiave Primaria." 

La finestra di dialogo che appare dovrebbe essere simile:

Clicca su "Customer ID" nel pannello a sinistra denominato "Campi disponibili" e poi premi il pulsante con il simbolo  

Vedrai che il campo si sposterà sul pannello di destra "Campi della Chiave". Nell'entryfield "Nome dell'Indice:" immetti "Customer ID" (senza le doppie virgolette).

Clicca su pulsante "OK".

Adesso che abbiamo definito la "Chiave Primaria", che cosa è una "Chiave Primaria" ? Le informazioni seguenti sono tratte dalla guida in linea:

Gli indici primari richiedono valori unici. Non permettono valori chiave duplicati. Per esempio se una tabella dBASE ha un indice primario su ORDER_NO, non puoi aggiungere due ordini con lo stesso numero d'ordine, solo uno può esistere nella tabella. In un indice composito i valori dei singoli campi possono essere duplicati, ma il valore combinato di tutti campi chiave deve essere unico. (gli indici secondari permettono invece di avere valori duplicati.)

Quando si crea l'indice primario occorre usare un campo che conterrà un valore unico per ogni riga, come un campo codice cliente.
Una tabella può avere un solo valore vuoto nel campo chiave, dato che valori vuoti in successione sono considerati duplicati. Quindi, solitamente i campi chiave necessitano di dati.

Mentre il campo di tipo autoincremento è per default un valore unico, questo è un modo per assicurarci che il valore sia unico (usando le funzioni file a basso-livello è possibile azzerare il valore del campo autoincremento, non affronteremo in questa sede questa eventualità. Ma il problema è che così facendo potrebbe essere davvero possibile che un campo autoincremento abbia un valore duplicato e, esso stesso non effettua il controllo per evitare i valori duplicati. Creando con esso una chiave primaria si risolve questo problema e forza il campo autoincremento al controllo dei valori duplicati).

Ora che abbiamo creato la chiave primaria (una sola per tabella), abbiamo bisogno di creare gli altri indici che useremo nella nostra tabella. Gli indici per la tabella Customer saranno fatti con l'altra opzione del menu "Struttura" e cioè "Gestione Indici.."

Una volta selezionata questa opzione, dovresti vedere una schermata simile

Clicca sul pulsante "Nuovo", e vedrai una finestra di dialogo molto simile a quella usata per la definizione della chiave primaria. Comunque, non creiamo una chiave primaria ma un "indice secondario."

Per costruire il primo indice "secondario" , useremo questa finestra di dialogo.Il criterio di indicizzazione sarà basato sul campo "Last Name" (Cognome). Per fare questo assicurati che nell'angolo più basso a sinistra il "radio button" che dice "Specifica dall'elenco campi" sia selezionato. Clicca sul campo "Last Name" nell'elenco "campi disponibili", clicca sul pulsante con il simbolo , ed il campo apparirà nel pannello di destra "campi della chiave" . Inserisci "Last Name" come nome indice nell' entryfield "Nome dell'Indice", e clicca su "OK."

Una volta che hai cliccato sul pulsante "OK", ti troverai nuovamente sulla finestra "Gestione indici". Clicca sul pulsante "Chiudi", e ritornerai in "impostazione tabella". Nota che nella colonna relativa agli indici (l'ultima) la maggior parte dei campi mostrati, non ha impostato nessun indice, mentre per  i campi "Customer ID" e "Last Name"  dovresti vedere "Ascendente"

Clicca sul campo "Country ID" e spostati sulla colonna "indice". nell'elenco delle opzioni scegli "Ascendente" (la sequenza normale per un indice) o digita la lettera "A" e spostati con il tasto <Tab> , avrai specificato  "un  indice" il quale avrà  il nome di "Country ID",  e l'ordine ascendente. Questo è molto più facile rispetto l'uso della finestra di dialogo vista sopra.

Fa' lo stesso per i campi "Postal" e "State ID". Questo ti darà quattro "marcatori indice" (o semplicemente indici) secondari, ed una chiave primaria.

Possiamo anche creare un marcatore indice "complesso" , sempre in impostazione tabella utilizziamo nuovamente "Gestione Indici". (Struttura|Gestione indici) e poi clicca sul pulsante "Nuovo".

Nella finestra "definisci Indice", nel rettangolo "chiave dell'indice" seleziona il radio button che indica "Specifica tramite espressione", ed nell'entryfield sotto ("espressione della chiave") immetti:

left( upper( trim(:last name:) + "," + :first name: ) + space(40), 40)  

La ragione per i due punti nell'espressione indice è che gli spazi nei nomi campo sono normalmente "delimitatori", e così dobbiamo specificare che tutto quello compreso tra i due punti è un nome campo. Stiamo combinando cognome e nome, che può essere utile per eventuali ricerche , e tali dati saranno indicizzati sulla "versione maiuscola" di cognome e nome.

L'uso della funzione Upper() fa in modo che l'espressione dell'indice sia "insensibile" dal punto di vista dei caratteri (maiuscoli o minuscoli) affinché impostiamo le nostre operazioni di  ricerca propriamente. 

NOTA: Quello che facciamo con la funzione left() combinata con la funzione space() evita un problema conosciuto come "lunghezza variabile" dei marcatori indice. Per esempio ciascun elemento che costituisce l'indice potrebbe essere di lunghezza diversa. Usarli così come sono possono "confondere" realmente dBASE (ed il BDE) e causare la presenza di  indici inattendibili. Con l'istruzione  precedente ci garantiamo che l'espressione indice sia di 40 caratteri. 

La virgola nell'espressione è per rendere le operazioni di lookups più intuitive, per un utente è più probabile che digiti  "Mayer,Ken" al posto di  "MayerKen" in un controllo "seeker" (maggiori dettagli più avanti nel tutorial)

Chiama questa espressione indice "Names" (devi specificare questo nell'entryfield  "Nome dell'Indice", altrimenti "impostazione tabella" creerà un nome indice di default, che non puoi cambiare senza cancellare l'indice e ricominciare come abbiamo visto sopra), clicca sul pulsante "OK" (questo chiuderà la schermata "Definisci Indice" ), ed infine sul pulsante "Chiudi"  (questo chiuderà la finestra "Gestione Indici"). Nota che questo indice non apparirà  colonna indice della tabella. Nessuna espressione indice apparirà là, inclusa un'espressione che semplicemente include l'uso della funzione upper()...

Ora che abbiamo finito con questa tabella, salvala ed esci da "impostazione tabella" (<Ctrl> + W)

Creiamo gli Indici usando "l'Oggetto Indice"

Puoi creare indici per tabelle dBASE usando l'oggetto DBFINDEX ed il metodo dell'oggetto database createIndex(). Queste caratteristiche non sono documentate ne nella guida in linea, ne nel manuale di riferimento al linguaggio. Creeremo solo un marcatore indice utilizzando questa caratteristica, per vedere come lavora.

Letture Suggerite: "MISCCODE.ZIP," "BEGDATA.ZIP," ed in "ICon 98 paper" su "Caratteristiche non documentate".

Creeremo un indice utilizzando il campo codice fornitore (Supplier ID) nella tabella inventory usando il codice seguente:

I passi fondamentali sono: (digita il seguente codice nella finestra comandi): 

d = new database()

d.databaseName := "TUTORIAL"

d.active:= true

 i = new DBFIndex()

 i.indexName  := "Supplier ID"

 i.expression := "Supplier ID"

d.createIndex( "Inventory", i )

Non è molto ovvio che l'indice sia stato creato. Non sarà ovvio fino a quando non apri la tabella in modalità impostazione, a quel punto potrai vedere "Ascendente" nella colonna indice per il campo "Supplier ID"

Non appare esserci un modo per creare un indice primario su un .DBF senza usare il modulo "impostazione tabella" (a meno che usi il comando SQL locale "CREATE INDEX"). Questo significa tornare  indietro ed impostare la chiave primaria sul campo "Item ID" nella stessa maniera di come abbiamo fatto per il campo Customer ID nella  tabella Customer. 

In più aggiungi  un indice "complesso" o una "espressione" indice (usa "Gestione Indici." e esegui le stesse azioni fatte per l'indice che abbiamo definito per la tabella customer, chiamato "names") su  "upper(description)" e chiamalo  "Description".

Le altre Tabelle nella Applicazione

Per definire gli indici per le altre tabelle utilizza sempre "Impostazione tabella". Se l'indice è "primario" usa il menu Stuttura|Definisci Chiave Primaria.

per l'espressioni indice, usa l'opzione "Gestione Indice" come abbiamo fatto sopra, infine salva ed esci con < Ctrl>+ W. Nota che il nome per ciascun indice è il campo "nome" (nella prima colonna), e tutti indici che creiamo sono in ordine crescente (Ascendente):

Tabella Country:
Country IDPrimario
CountryEspressioneupper( Country )

Tabella Invoice:
Invoice IDPrimario
Customer IDSecondario
Order DateSecondario
Pay TypeSecondario

Tabella LineItem (nessuna chiave primaria):
Invoice IDSecondario
Item IDSecondario
QtySecondario
InvoiceItemEspressionestr( :invoice id:, 7 ) + str( :item id:, 7 )

Questo ultimo indice per questa tabella sarà necessario quando lavoreremo sulle schede relative a questa applicazione. Praticamente utilizzeremo questo indice per trovare un articolo nella tabella , ma avrà bisogno di essere uno specifico articolo relativo ad una specifica fattura (questo perché in questa espressione il codice fattura (invoice ID) viene prima del codice dell'articolo (Item ID)). 

Tabella State:

State IDPrimario
StateEspressioneupper( State )

Tabella Supplier:
Supplier IDPrimario
ContactEspressioneupper( Contact )
CompanyEspressioneupper( Company )
State IDSecondario
PostalSecondario
Country IDSecondario


Inserire i dati nelle Tabelle

A questo punto mancano i dati nelle tabelle.

Potremmo sederci e generare i dati in modo casuale, le alternative sono:

Ma questi dati potrebbero essere non significativi  per testare l'applicazione (e inservibili per quelle tabelle collegate tra loro). 

La soluzione che propongo e quella di duplicare i dati  da un'altra applicazione, per fare ciò hai bisogno di copiare il programma "COPYDATA.PRG" ed i file di classi custom "BFILE.CC" e "DBF7FILE.CC" nella directory TUTORIAL\TABLES (questi file sono forniti con il tutorial).   

(N.B. come detto nella sezione start di questo tutorial se non hai installato il database MUGS, il programma "COPYDATA.PRG",  non potrà funzionare e non avrai i dati per testare l'applicazione).

Questo programma userà una combinazione di oggetti OODML e comandi XDML per copiare i dati dal database MUGS nelle tabelle che abbiamo appena creato. Puoi esaminare il codice  aprendolo nell'editor di sorgenti.

Per usare il programma assicurati di essere nella directory TUTORIAL\TABLES

Quando hai finito, cambia la directory di lavoro tornando a indietro alla directory TUTORIAL

Metti le Tavole nel Progetto

Vai nel Centro di Controllo, clicca sul separatore "Progetti", doppio clic sul file progetto "Visual dbase 7 Tutorial". Clicca il pulsante destro del mouse nel pannello di sinistra, e seleziona "Aggiungi file al progetto..."

Nella finestra di dialogo che apparirà seleziona nel combobox in fondo l'opzione "tabelle".  Doppio clic sulla cartella Tables e vedrai le tabelle che hai creato. Selezionale e clicca su apri  

Chiudi il progetto (la piccola 'x' nella barra del titolo) e clicca sul pulsante  "Sì"  per salvare le modifiche.

Fase IV - La gestione dei Moduli Dati

Tutorial menu

  Fine del file: DATABASE.HTM  12 Febbraio 1999  KJM

Avvertimento Legale: Questo documento è parte del Visual dBASE 7 Tutorial creato da Ken Mayer. Questo materiale è © proprietà letteraria riservata 1999, da Ken Mayer. Visual dBASE 7 e Visual dBASE 7.01, il BDE (Borland Database Engine) e BDE Administrator sono tutelati in base ai diritti d'autore e marchio di fabbrica da Inprise, International. Questo documento non può essere esposto altrove senza il permesso esplicito dell'autore, il quale si riserva tutti diritti sul documento.