10
A A A ............................................................................................................, 00.000 ... ma non li dimostrano Spesso, quando proviamo i vari prodotti di tipo OBMS, non abbiamo la possibilità, per i soliti problemi di spazio, di eseguire dei test con archivi molto voluminosi in modo da valutare anche le prestazioni dei prodotti in situazioni limite. Lo spazio a disposizione, in genere, viene occupato dalla descrizione delle varie funzionalità che, in un prodotto di tipo OBMS appartenente all'ultima generazione, sono sempre tantissime. In questo articolo vogliamo invece eseguire direttamente una serie di prove «di carico» usando Oatabase di grandi dimensioni di Francesco Petroni DPROVINCIA, una sigla che fa riferi- mento alla tabella Province, DBONUS, un campo numerico che indica una quantità che useremo nei calcoli, DSCONTO, uno sconto da usare nel calcolo di cui parleremo poi, DIMPORTO, un campo numerico da usare nel calcolo. I campi della tabella Province sono: PPROG, un progressivo in cui inseria- mo, per usi che spiegheremo poi, il pro- Gli obiettivi sono in pratica due: veri- ficare l'utilizzabilità dei vari prodotti in tali situazioni, e, soprattutto, dare delle regole di comportamento, ovvero delle indicazioni di come ci si debba regolare quando ci si trovi di fronte a data base di grosse dimensioni. Per le nostre prove useremo il dBA- SE III della Borland, il Clipper 87, il vec- chio, quello della Nantucket, poi Access 2.0 e Visual Basic 3.0 della Microsoft. In un successivo articolo estenderemo la prova ad altri prodotti. dBase e Clipper perché erano lo standard ... prima di Windows, MS Ac- cess e MS VB perché stanno diventan- do lo standard in Windows e perché, accettando di lavorare anche col forma- to dBase, permettono di fare dei con- fronti più diretti. /I nostro Database Abbiamo costruito un Database con tre tabelle, una principale, che abbiamo riempito con 100.000 record e che si chiama Persone, e due di appoggio, che si chiamano Province (con 95 record) e Qualifiche (che contiene solo 8 record). Da un punto di vista relazionale tra le due tabelle di appoggio e quella princi- pale ci sono relazioni «Uno a Molti». Data una provincia esistono molte per- sone di quella provincia, data una quali- fica esistono molte persone che hanno quella qualifica e una persona appartie- ne ad una sola provincia ed ha una sola qualifica. Si tratta in pratica di una situazione «monotabella» e di questo terremo conto in sede di considerazioni finali. Province e Qualifiche ci servono per eseguire dei calcoli e dei conteggi parti- colari. Analizziamo subito le strutture delle tre tabelle per vedere quali siano i cam- pi significativi per le valutazioni che in- tendiamo fare. I campi della Tabella Persone sono mostrati in figura 2, in cui vediamo an- che le strutture delle altre due tabelle, di cui vediamo, nella 3, anche il conte- nuto. I campi significativi delle tre tabelle sono: DMATRICOLA, il campo chiave che identifica il record, DCOGNOME, un campo indice sul quale fare frequentemente ricerche, DQUALIFICA, un codice che fa riferi- mento alla tabella Qualifiche, Ambienti Ambiente Software Hardware Borland dBase 111 Epson Action Desk 4000 Cllpper Summer 87 486 DX66 MS Access 2.0 256 cache record MS Visual Basic 3.0 16 MegaRam 10.000 100.000 Caratteristiche campi 13 della lungh.record 314 Tabella Principale dimensione DBF 3.140 kB 31.400 kB dimensione 3 NDX 773 kB 7.690 kB dimensione (tot) MDB 2.228 kB 18.842 kB Risultati List di due campi del file Persone 0.50 8.18 dBase 11I Creazione dei 3 Indici 0.36 8.03 Indirizzamento diretto 0.00 0.00 Seek della chiave del record 0.00 0.00 Locate del record 0.43 21.47 Programma Batch 1.23 56.15 Risultati Creazione dei 3 indici 0.30 5.10 Clipper 87 Indirizzamento diretto 0.00 0.00 Seek della chiave del record 0.00 0.00 Locate del record 0.39 21.35 Programma Batch 0.38 51.06 Risultati Creazione dei 3 Indici 0.25 6.21 MS Access Indiriuamento diretto' 0.00 0.00 Seek della chiave del record • 0.00 0.07 Locate del record MDB •• 0.16 18.20 Locate del record DBF •• 0.16 vedi testo Ricerca "navigata" 0.02 0.05 Prg. Batch tramite Query MDB 0.38 6.03 Prg. Batch tramite Query DBF 0.43 22.29 Incrocio tramite Query MDB 0.28 2.49 Incrocio tramite Query DBF 0.30 6.38 Aggiornamento Batch 1.39 14.43 Risultati Seek della chiave del record 0.00 0.00 MS Visual Basic Locate del record 0.08 2.57 Programma Batch diretto 5.00 1.14.42 Prg. Batch autoricerca conteggio 2.50 43.19 Prg. Batch autoricerca calcolo 3.17 48.00 Note . sia su MDB che su DBF •• sia su Tabella che su Scheda Figura l- Tabella rIas- suntiva del risultati del- le varie prove. La tabella con la sintesi dei risultati comprende varie sezioni. Nella pri- ma riportiamo I dati re- lativi all'ambiente ope- rativo in cui abbiamo eseguito le varie prove. Nella successiva mo- striamo i dati dimensio- nali dei vari Oatabase. Poi i risulratl delle varie prove, suddivisi per prodotto e per dimen- sione del Oatabase, prima quello con 10.000 record, pOI quello con 100.000 316 MCmicrocomputer n. 151 - maggio 1995

di Francesco Petroni

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: di Francesco Petroni

A A A•............................................................................................................•

, 00.000 ... ma non li dimostranoSpesso, quando proviamo ivari prodotti di tipo OBMS, non abbiamo la possibilità, per isoliti problemi di spazio, di eseguire dei test con archivi molto voluminosi in modo davalutare anche le prestazioni dei prodotti in situazioni limite. Lo spazio a disposizione,in genere, viene occupato dalla descrizione delle varie funzionalità che, in un prodotto

di tipo OBMS appartenente all'ultima generazione, sono sempre tantissime.In questo articolo vogliamo invece eseguire direttamente una serie di prove «di

carico» usando Oatabase di grandi dimensioni

di Francesco Petroni

DPROVINCIA, una sigla che fa riferi-mento alla tabella Province,

DBONUS, un campo numerico cheindica una quantità che useremo neicalcoli,

DSCONTO, uno sconto da usare nelcalcolo di cui parleremo poi,

DIMPORTO, un campo numerico dausare nel calcolo.

I campi della tabella Province sono:PPROG, un progressivo in cui inseria-

mo, per usi che spiegheremo poi, il pro-

Gli obiettivi sono in pratica due: veri-ficare l'utilizzabilità dei vari prodotti intali situazioni, e, soprattutto, dare delleregole di comportamento, ovvero delleindicazioni di come ci si debba regolarequando ci si trovi di fronte a data base digrosse dimensioni.

Per le nostre prove useremo il dBA-SE III della Borland, il Clipper 87, il vec-chio, quello della Nantucket, poi Access2.0 e Visual Basic 3.0 della Microsoft. Inun successivo articolo estenderemo laprova ad altri prodotti.

dBase e Clipper perché erano lostandard ... prima di Windows, MS Ac-cess e MS VB perché stanno diventan-do lo standard in Windows e perché,accettando di lavorare anche col forma-to dBase, permettono di fare dei con-fronti più diretti.

/I nostro DatabaseAbbiamo costruito un Database con

tre tabelle, una principale, che abbiamoriempito con 100.000 record e che sichiama Persone, e due di appoggio, chesi chiamano Province (con 95 record) eQualifiche (che contiene solo 8 record).Da un punto di vista relazionale tra ledue tabelle di appoggio e quella princi-pale ci sono relazioni «Uno a Molti».Data una provincia esistono molte per-sone di quella provincia, data una quali-fica esistono molte persone che hannoquella qualifica e una persona appartie-ne ad una sola provincia ed ha una solaqualifica.

Si tratta in pratica di una situazione«monotabella» e di questo terremoconto in sede di considerazioni finali.Province e Qualifiche ci servono pereseguire dei calcoli e dei conteggi parti-colari.

Analizziamo subito le strutture delletre tabelle per vedere quali siano i cam-pi significativi per le valutazioni che in-tendiamo fare.

I campi della Tabella Persone sono

mostrati in figura 2, in cui vediamo an-che le strutture delle altre due tabelle,di cui vediamo, nella 3, anche il conte-nuto.

I campi significativi delle tre tabellesono:

DMATRICOLA, il campo chiave cheidentifica il record,

DCOGNOME, un campo indice sulquale fare frequentemente ricerche,

DQUALIFICA, un codice che fa riferi-mento alla tabella Qualifiche,

Ambienti AmbienteSoftware HardwareBorland dBase 111 Epson Action Desk 4000Cllpper Summer 87 486 DX66MS Access 2.0 256 cache recordMS Visual Basic 3.0 16 MegaRam 10.000 100.000Caratteristiche campi 13della lungh.record 314Tabella Principale dimensione DBF 3.140 kB 31.400 kB

dimensione 3 NDX 773 kB 7.690 kBdimensione (tot) MDB 2.228 kB 18.842 kB

Risultati List di due campi del file Persone 0.50 8.18dBase 11I Creazione dei 3 Indici 0.36 8.03

Indirizzamento diretto 0.00 0.00Seek della chiave del record 0.00 0.00Locate del record 0.43 21.47Programma Batch 1.23 56.15

Risultati Creazione dei 3 indici 0.30 5.10Clipper 87 Indirizzamento diretto 0.00 0.00

Seek della chiave del record 0.00 0.00Locate del record 0.39 21.35Programma Batch 0.38 51.06

Risultati Creazione dei 3 Indici 0.25 6.21MS Access Indiriuamento diretto' 0.00 0.00

Seek della chiave del record • 0.00 0.07Locate del record MDB •• 0.16 18.20Locate del record DBF •• 0.16 vedi testoRicerca "navigata" 0.02 0.05Prg. Batch tramite Query MDB 0.38 6.03Prg. Batch tramite Query DBF 0.43 22.29Incrocio tramite Query MDB 0.28 2.49Incrocio tramite Query DBF 0.30 6.38Aggiornamento Batch 1.39 14.43

Risultati Seek della chiave del record 0.00 0.00MS Visual Basic Locate del record 0.08 2.57

Programma Batch diretto 5.00 1.14.42Prg. Batch autoricerca conteggio 2.50 43.19Prg. Batch autoricerca calcolo 3.17 48.00

Note . sia su MDB che su DBF•• sia su Tabella che su Scheda

Figura l - Tabella rIas-suntiva del risultati del-le varie prove.La tabella con la sintesidei risultati comprendevarie sezioni. Nella pri-ma riportiamo I dati re-lativi all'ambiente ope-rativo in cui abbiamoeseguito le varie prove.Nella successiva mo-striamo i dati dimensio-nali dei vari Oatabase.Poi i risulratl delle varieprove, suddivisi perprodotto e per dimen-sione del Oatabase,prima quello con10.000 record, pOIquello con 100.000

316 MCmicrocomputer n. 151 - maggio 1995

Page 2: di Francesco Petroni

DATA BASE

~_-_.".'---~E~~~T QUALI PI C +Record QPROG QCODICE QDESCRIZ QDESDREUE QDONUS QTOTALI

1 1 AA COMMESSO COM 25200 02 2 DD OPERA I O I OPl 27900 03 3 CC OPERAIO Il OP2 31900 04 4 DD IMPIEGATO I Iltl 37500 05 5 EE IMPIEGATO Il 1M2 40800 06 6 PP IMPIEG. SUP. IItS 45B00 07 ? GG PUNZIONARIO PUN 54200 0B 8 HH DIRIGENTE DIR 67400 0

STRunURE DELLE TRE TABELLE StrutturA del fila , D,PROUI NCE.dbfHulltero totale record 95Data ultimA reuisione: 18/03/95Call1po Nome campo Tipo Di.

Struttura dI'l file : D, PERSONE. dbf 1 PPROG NUlllerico 3Numel"o totale •.ecord : 199999 2 PSIGLA Cai"attere 2Data ulti",a reuisione: 19/03195 3 PCAPOLUOGO Carattere 15Cafllpo ~t1AjRICO~A Tipo Di. 4 PSCONTO NUlltet'ico 5

1 Carattere 9 5 PCONTEGGIO Numerico 52 DCOGNOME Carattere 14 6 PTOTALE HUlllel"ico 193 DQUALIPICA Carattere 2 Totale: 414 DDATA Data 85 DPROUINCIA Carattere 2 Struttura del filtl : D:QUALIPIC.dbf6 DINDIRIZZO Carattere 39 Nunero totale record 87 DCITTA Carattere 16 Data ulti",,,, reuisione: 18/03/958 DNOTALUNG Carattere 299 Ca",po Mortleca ...•po Tipo Di.9 DCAP Carattere 5 1 QPROG NUlluu"ico 2

19 DBONUS Null1erico 4 2 QCODICE Cal"attere 211 DI MPORTO Numerico 9 3 QDESCRIZ Carattere 1212 DSCONTO HUlllcrico 5 4 QDESBREUE Carattere 313 DTOTALE NUlllcrico 9 5 QBONUS NUlllcrico 5

Totale: 314 6 QTOTALI NUlllcrico 12Totale : 37

PTOTALE

!I!I!ooo0~

PSCONTO PCONTEGGIO14.00 012.50 010.00 012.50 010.00 010.00 010.00 0

40 mega. In Access si risparmia. Ac-cess utilizza un sistema, non dichiarato,di compressione, per cui se i campi so-no riempiti parzialmente, lo spazio occu-pato risulta inferiore.

Come facciamo a procurarci una ta-bella con 100.000 record?

La cosa non è molto complicata, ba-sta disporre di un piccolo file iniziale, di-ciamo di un centinaio di record, che sipuò al limite alimentare a mano, poi sipuò copiare ed appendere a se stessopiù volte, fino a raggiungere la dimen-sione desiderata. Una volta raggiuntaquesta dimensione occorre intervenire,con dei metodi casuali, su alcuni campisignificativi, per modificarne il contenu-to. Nel nostro caso sono la Matricola,che deve essere assolutamente diffe-rente tra i vari record, la Provincia e laQualifica, che devono essere ridistribui-te per rendere significativi i calcoli suc-cessivi. È chiaro però che in questomodo, a meno che non si inseriscanodelle «forzature» a tale casualità, sihanno distribuzioni omogenee, cheperò non diminuiscono la significativitàdei test.

In figura 4 vediamo un programma

USE PROUINCELIST NEXT 7

Record PPROG PS I GLA PCAPOLUOGO1 1 AG AGRI GENTO2 2 AL ALESSANDRI A3 3 AN ANCONA4 4 AO AOSTA5 5 AP ASCOLI PICENO6 6 AQ L'AQUILA7 7 AR AREZZO

Figura 3 -xBase - La ta-bella Qualifiche e partedella tabella Province.In una tabella in forma-to DBF c'è sempre unasorta di campo nasco-sto, il RECNO(), che co-stituisce il progressivo« fisico» del record.Questo campo può es-sere usato per l'indiriz-zamento diretto al re-cord (il comando è GO90 000) /I RECNO()può anche risultare uti-le in qualche program-ma Batch particolare,come quello che ese-guiremo in Visual Basic,in cui dovremo puntare,usando l'indice numeri-co, le varie celle di una griglia. Nelle strutture Access il RECNO() non c'è, per cui bisogna ... arrangiarsi. Lasoluzione più semplice è quella di replicare, in un campo di tipo Numero Progressivo, il RECNO().

Ma chi ce li dà 100.000 record?Nella tabella in figura 1 descriviamo

l'ambiente in cui abbiamo lavorato. Indi-chiamo anche i dati dimensionali del no-stro database. 100.000 record, con unastruttura di 314 byte, fa oltre 30 megaai quali si devono aggiungere i tre indiciche superano i 6 mega. Tra annessi econnessi, in dBase, dobbiamo calcolare

serve per velocizzare le elaborazioniBatch, la cui formula è la seguente:

D PROVI NCIA+ DQUALI FICA+ DCO-GNOME.

Sia i prodotti basati sulla sintassi xBa-se (dBase e Clipper) che quelli che lavo-rano sulle strutture MDB di Access (Ac-cess stesso e VB) permettono ovvia-mente di creare degli indici. La differen-za fondamentale è che in Access gli in-dici vanno creati in fase di definizionedella struttura e che è Access stessoche decide di usarli nelle operazioni diricerca sulle Tabelle o sulle Schede onella costruzione delle Query. In xBaseinvece gli indici e le relazioni vannocreati con istruzioni separate e specifi-camente dichiarati quando occorre.

Figura 2 - xBase - Lastruttura dei tre file informato DBF.Il nostro Database com-prende tre tabelle (chein formato dBase coin-cidono con i tre fileDBF mentre in Accesssono parte dell'unico fi-le MDB). Due sono pic-colissime e solo una,quella chiamata Perso-ne, è quella grande,con 100 000 record Sitratta quindi di un Data-base praticamente mo-notabellare. Le due ta-belle piccole contengo-no dati riferiti alle Provincie e alle Qualifiche. Ogni record della tabella Persone fa riferimento ad una provin-cia e ad una qualifica.

gressivo del record,PSIGLA, la sigla della provincia (vi ri-

cordate le targhe con la sigla delle pro-vince?), campo Chiave,

PCAPOLUOGO, il nome del capoluo-go della provincia,

PSCONTO, una percentuale di scon-to per quella provincia da usare per ilcalcolo,

PTOTALE, un campo che useremo,alla fine, per un calcolo Batch.

I campi della tabella Qualifiche sono:QPROGR, un progressivo in cui inse-

riamo, per usi che spiegheremo poi, ilprogressivo del record,

QCODICE, il codice che identifica laqualifica, uguale a quella usata nella ta-bella Persone,

QDESCRIZ, descrizione della qualifi-ca,

QDESBREVE, descrizione breve dellaqualifica in tre caratteri,

QBONUS, serve per i calcoli,QTOTALI, un campo che useremo

per il calcolo Batch.Le relazioni (che vediamo in figura 7

disegnate in Access) sono del tipo"Uno a Molti» e sono due:

tra il campo PSIGLA della Province eil campo DPROVINCIA delle Persone

tra il campo QCODICE della Qualifi-che e il campo DQUALIFICA delle Per-sone.

Per ogni persona eseguiremo un cal-colo la cui formula comprende campidelle tre tabelle:

DIMPORTO+DBONUS*QBONUS acui toglieremo uno sconto la cui percen-tuale è data dalla somma (DSCON-TO+PSCONTO) In pratica un calcoloche coinvolge campi da tre tabelle.

I calcoli batch serviranno per totaliz-zare questo calcolo per Provincia, o perQualifica, e per memorizzarlo nei campiPTOTALE e QTOT ALI di queste due ta-belle.

I campi dichiarati Indice nelle struttu-re delle tabelle in Access sono:

PSIGLA, per la tabella Province. È ilcampo chiave (indice principale) indi-spensabile per attivare la relazione conla tabella Persone, campo DPROVIN-CIA.

QCODICE, per la tabella Qualifiche. Èil campo chiave (indice principale) indi-spensabile per attivare la relazione conla tabella Persone, campo DQUALlFI-CA.

La tabella Persone ne ha tre (li vedia-mo in figura 5 e in figura 6).

DMATRICOLA, è il campo chiave (in-dice principale) che individua univoca-mente il record,

DCOGNOME, è un campo indice ne-cessario per le ricerche veloci dato uncognome.

Creiamo poi un indice composto, che

MCmicrocomputer n. 151 - maggio 1995 317

Page 3: di Francesco Petroni

DATA BASE=~----------dB-a-se-----------a=a1

dBase che serve proprio per dare unamischiata ai nostri record. Subito dopova eseguita la reindicizzazione delle ta-belle.

Il metodo Locatee il metodo Seek

Un utilizzatore di un prodotto di tipoDBMS deve saper utilizzare gli indiciche servono per velocizzare le operazio-ni di ricerca e di scorrimento.

Se si cerca un certo record infatti sipossono usare due differenti tipi di co-mando, uno veloce, che pretende l'esi-stenza di un indice sul campo, e unolento, che può essere eseguito su qual-siasi campo ed usando qualsiasi crite-rio.

In xBase il comando veloce. sonodue SEEK oppure FINO, ad esempio:

FINO ROSSI.

t~~~n~~LC:AGGI02.prgSE PERSONEELE 2SE PROUINCEELE 3SE QUALIFICELE 1O WHILE .NOI. EOF()X- RECN()*UAL(SUBS(II"E().?2»*123A-SUBS(DCIIIA.3.1).SUBS(DCOGNO"E.2.1)A=A.RIGHI("0000000".LIRI"(SIR(RECN(»). 6).SUBS(DCOGNO"E.4.1)P="OD(X.95)·1Q-INI("OD(X/P.8)·1)SELE 2

GO PPP-PSIGLASELE 3GO QQQ-QCODICESELE 11 A.PP.QQ* REPLACE D"AIRICOLA WIIH A.DPROUINCIA WIIH PP.DQUALIFICA WIIH QQSKIP

+...Figura 4 - xBase - Un programmino che modifica in modo casuale iRecord.Una tabella OBF con 100.000 record e con un tracciato di 314 bVte occupa 31,4 mega. Senon si dispone di una tabella così voluminosa la si può creare partendo da una più piccola (di-ciamo un centinaio di record) che poi si incicciottisce con una serie di COPY TO PIPPO e AP-PENO FROM PIPPO, che ne raddoppiano via via le dimensioni, 100,200, 400, BOO, 1600 re-cord, ecc. Il problema è che poi i dati sono tutti uguali. Allora si può creare un programma,come questo scritto in dBase, che in maniera un po' casuale modifica idati più significativi inrelazione ai Test che si vogliono eseguire.

dBase

Figura 5-xBase - Gli indici.In dBase gli indici, che sono dei file NOX esterni, vanno creati all'inizio (INOEX ON ...) e pOI vanno tenutiaperti ogni volta che si aggiornano idati per fare in modo che dBase possa tenerli allineati (USE ... INOEX..!. Una delle cause di errore più frequente nelle applicazioni dBase consiste proprio nel disallineamento trafile dati e file indicI. L'indice disallineato si può sempre rimettere a posto con l'istruzione REINOEX, che inpratica equivale ad una creazione ex novo del file NOX Significativo è il tempo di riindicizzazione che dipen-de dalla dimensione della tabella. C'è un rapporto quadratico tra dimensione della tabella e tempo di nindi-clzzazione.

Caps

Area di lavoro: 1. file di database: C:PERSONE.dbf. alias: PERSONEPile indice principale: C:PERSON1.ndx. chiave: D"AIRICOLAPile indice: C:PERSON2.ndx. chiave: DCOGNO"EPile indice: C:PERSON3.ndx. chiave: DPROUINCIA.DQUALIPICA.DCOGNO"EArea di lavoro: 2. file di database: C:PROUINCE.dbf. alias: PROUINCEPile indice principale: C:PROUINCE.ndx. chiave: PSIGLAAREA DI LAUORO AIIIUAArea di lavoro: 3. file di database: C:QUALIPIC.dbf. alias: QUALIPICPile indice principale: C:QUALIFIC.ndx. chiave: QCODICE

Sempre in xBase il comando lento èLocate e accetta qualsiasi criterio, edesempio:

LOCATE FOR DCOGNOME="ROS-SI"

LOCATE FOR "SS"$DCOGNOME.La differenza tra FINO e LOCATE sta

nel fatto che il primo scorre l'indice perraggiungere il record, e lo raggiunge, in-dipendentemente dalla dimensione del-la tabella, pressoché istantaneamente.Il secondo legge tutti i record e quindiimpiega un tempo proporzionale alla di-mensione della tabella e alla posizionedel record cercato.

Il vantaggio del Locate è che accetta(lo vediamo nel secondo esempio) qual-siasi criterio, anche non traducibile in unindice.

In Access il discorso è analogo, nelsenso che ci sono metodi veloci e me-todi lenti. Definiti gli indici al momentodella definizione delle strutture, è Ac-cess che li utilizza nelle varie possibilioperazioni, sia sulle Tabelle, che sulleSchede, sia per realizzare le Query cheper realizzare i Report.

Se ci si avventura nella programma-zione, ad esempio accedendo diretta-mente ai Data Access Objects (DAO), sipossono usare comandi del tutto analo-ghi a quelli di xBase. In Access, ed inVisual Basic, che utilizza gli stessi DAO,i comandi che agiscono sugli oggetti sichiamano Metodi e quindi avremo i duemetodi:

Metodo SEEK, veloce, che corrispon-de al SEEK del xBase;

Metodo FINDFIRST, lento, che corri-sponde al LOCATE del xBase; seguitoda:

Metodo FINDNEXT, lento, che COrri-sponde al CONTINUE del xBase.

T'C,escenteC,escenteC,escenteuescenl.euescente

Un l'lOIMci CMl)O pUÒ allele massino S4 cala1tefÌ.COl'J1)feSl r;# spaZI. Pef lo GIÀda premere F1.

Spec:ilìcare il nome derrdice.~scun indice JlU'Ò utizz~lIe

manimo lOc«Jlli

ProplÌetA indice

Nane.oMATRICoLAoPRoVINCIAOQUAUFICAOCOGNOMEOCOGNOME

Nomeìncice

COMPOSTO

COGNOME

Microsoft Access -

"

NoNo51 {Duplicati possibili)

~lsualizZ8 Fjnestr8 1IIl2i'I r~1m1••~Is»1

T' dotiT ••• oTeololo""Del:aJOI'~TestoTestoTestoT ••• oTestoN""""coNOOIericoNumericoNumerico

Modifica

Nane.OMATRICOLAOCOGNOMEoQUAlIFICADDATADPAOVINOADINOIRIZZODOTTAONOTAlUNGDCA?OBONUSOIMPOATOOSCONTOOTOTALE

Per cambiare pamelo: f6. Per 16 Guida: Fl.

Dmensione campoFormeloMMch&r~inputTitoloVelorepredefiriloValido 'eMeueogioenOfeNecenarioCOIl$enti lunghezze telO

Auocioloeindice

- [lie

1~lmnl

Figura 6 - MS Access2.0 - Gli indicI.Gli indici in Access van-no dichiarati in sede didefinizIOne della struttu-ra. Si può, anzi in gene-re si fa, creare un cam-po chiave, che costitui-sce l'indice principale(primary kev). Si posso-no definire deglt Indicicomposti da più campiusando la box specifica,che si vede nella figura.Non dovrebbe esseremai necessario reindi-cizzare, in quanto filedati e file indici vengo-no sempre aperti insie-me. Se l'indice SI defini-sce a Tabella già pienaAccess deve costruirlofisicamente. I tempi in-dica ti nella tabella si ri-feriscono alla creazio-ne ... dal nulla dei tre in-dici sulla tabella 10.000 e quella 100000.

318 MCmicrocomputer n. 151 - maggio 1995

Page 4: di Francesco Petroni

DATA BASEMicrosoft Acces$ - Relazioni

~ISU811zzll Belazioni Finestra 1

lo per una sola Provincia. Se si toglie ilparametro (è quello nella riga dei criteri)il calcolo viene eseguito per tutte le pro-vince.

Se interessa un solo dato numerico,calcolato per ciascuna accoppiata Pro-vincia + Qualifica, si può ricorrere allaQuery di tipo Campi Incrociati. Anche inquesto caso, documentato dalla figura12, i tempi di esecuzione sono interes-santissimi.

Le prove con Access le abbiamo con-dotte sia usando file MDB che file DBF«aggiunti». In pratica abbiamo realizzatouna seconda applicazione Access, privadi dati propri, che utilizza gli stessi filedati e gli stessi file indice usati in dBasee in Visual Basic e gli stessi file dati di

+j.•

c::::K:lI Annulla"· I• Ilipoioin ... 1

r AggiQrna campi conelati in tucce •• ione

r C~etla lecord correlati in wcce •••one:

li' APPlica integlit' ,eferentiate

,UnoaCIl.noIi~

r

PERSONEDMATAlallADCDGNDMEDQUAURCADDATA _

OQ DPROVINOA

DlNDIRIZZO TabeJkt/quelf;DOTTA QUALIRCDNDTALUNG QCODICEDCAPDBONUSDIMPORTODSCONTODTOTALE

Modifica

PROVINCEPPAOGPSIGlAPCAPOLUOGOPSCONTOPCONTEGGIOPTOTALE

QUALIRCQPROGQalOiCEQDESCRIZQDESBREVEQBONUSQTQTALI

Poorlo

- .ElleFigura 7 - MS Access -Aspetti relazionali.Le relazioni tra le tre ta-belle sono due e ambe-due di tipo Uno a Molti.Data una Provincia cisono molte persone diquella provincia, datauna Qualdica ci sonomolte persone di quellaqualifica. Una personaappartiene ad una solaprovincia ed ad una solaqualdica. Access nonsolo permette la dichia-razIOne delle relazioni,che diventano parte in-tegrante della strutturadel Database, ma si as-sume anche l'fncom-benza di garantire la in-tegrità referenziale trale due tabelle, ovvero digarantire l'allineamentotra le due tabelle coin-volte nella relazione. IndBase questa incombenza spetta al programmatore.

+= dBase aa

Figura 9 - xBase - Calcolo Batch in Clipper - Output.Abbiamo creato un indice composto dalla sigla della provincia, dal codice della qualifica e dal cognome dellapersona. Il programma di calcolo Batch usa tale indice e scorre tutta la tabella, esegue dei calcoli, recordper record, totalizza per qualifica e per provincia, e mostra i risultati in questa schermata. Nella poma rigavediamo tre valori temporali. Il primo è riferito alla partenza del programma, il secondo ad un tempo inter-medio, preso alla fine di ciascuna provincia, ed il terzo è il tempo finale preso alla fine del calcolo Batch. Ab-biamo eseguito un programma del genere anche con Access e con Visual Basic. Nella Tabella in figura l irisultati complessivi.

.•.•.•Figura 8-xBase - Metodo Locate e metodo Seek.Questo articolo è destinato a lettori che conosconoil concetto di indice e che quindi sanno che esisto-no due sistemi per cercare i dati. Sistemi veloci chesi possono utilizzare quando si esegue la ricerca suicampi indice, sui quali è possibile un puntamentodiretto, e sistemi lenti, o sequenziali, che, in man-canza di campo indice, oppure in caso di ricerca((strana)), comportano la lettura di tutti idati.

r=----------- ........................-.--...-dBase aa

ELABORAZIONE BATCH - Ti :17:48:49: +T2 :17:50:13: T3 : :

PROUINCIA ALESSANDRIA QUALIFICA NUI1 TOTALE II1PORTO ArAA COI1I1ESSO 131 2.336.446 ;GBB OPERAIO I 131 2.349.732 Qf'CC OPERAIO II 131 2.319.632DD II1PIEGATO I 131 2.381. 764 )ffEE II1PIEGATO II 132 2.368.226 r~rFF II1PIEG. SUP. 132 2.395.162 ifGG FUNZIONARIO 132 2.335.858HH DIRIGENTE 132 2.369.416 rr

1.052 18.856.236 :~ll.TT

.•--'H- ,,- }t <t,:;:.: '#f m:;~ i::t§' ::<;:~ .•

cord, puntiamo, con le due relazioni, letabelle Province e Qualific, per preleva-re dati numerici che servono per i calco-li. Lo scorrimento avviene usando un in-dice composto, sulla Provincia e sullaQualifica, per poter eseguire i calcoli a«rottura» di chiave.

Per quanto riguarda Access le varieprove sono state scelte in funzione del-le possibilità offerte da Access, adesempio la possibilità di eseguire calcolispinti direttamente con le Query, lapossibilità di creare varie tipologie dischede e di oggetti nelle schede.

Ad esempio, la Query proposta in fi-gura 11 esegue esattamente lo stessocalcolo visto ora in dBase. Nella figurapossiamo vedere anche l'uso di un Pa-rametro che serve per eseguire il calco-

Le nostre prove

Abbiamo costruito dapprima le duetabelle di appoggio. Poi, con il metododescritto poc'anzi, abbiamo costruitodue versioni della tabella Persone, quel-la da 10.000 record e quella da 100.000record. Abbiamo poi definito le prove daeseguire in modo che venissero testatele situazioni operative più significative,per i vari prodotti coinvolti. Abbiamoquindi eseguito i test con la tabella pic-cola e poi, gli stessi identici test, con latabella grande. I risultati sono, comedetto, in figura 1.

Le prime prove le abbiamo eseguitecon dBase e Clipper. Nelle prime figure,dalla 8 alla 10, vedete listati e videatedelle varie esecuzioni. I risultati, abba-stanza vicini tra dBase e C1ipper, dipen-dono dal fatto che i test eseguono inprevalenza accessi al disco anziché cal-coli (che avrebbero favorito il Clipper,che è un compilatore), e dal fatto chenon abbiamo specializzato le macchineper tipo di prodotto. Abbiamo in praticausato la stessa configurazione per DOSe per Windows, per dBase e C1ipper. In-terventi mirati sulla configurazione pos-sono migliorare in modo abbastanzasensibile questo o quel test.

In figura 8 dunque due ricerche diret-te in dBase, la prima punta al record90.000, la seconda e la terza alla chiaveMARINACCI (un nome a caso), corri-spondente al record 90.000. Nei tre casiil tempo necessario alla ricerca è.istantaneo. La ricerca lenta, eseguitacon l'istruzione Locate, legge tutti i re-cord, e quindi impiega un tempo dipen-dente dalla posizione del record all'in-terno della tabella. E MARINACCI, re-cord 90.000, sta quasi alla fine.

Nelle figure 9 e 10 un classico pro-gramma di scorrimento di una tabella al-lo scopo di eseguire dei calcoli. Scorria-mo la tabella Persone e, record per re-

MCmicrocomputer n. 151 - maggio 1995 319

Page 5: di Francesco Petroni

DATA BASE

++

MA

~~~.132 2132 2.390.990.000131 2.J54.04UXXJ, 31 2.:ni968.000132 2.353.116.000131 234~Bn.OOJ."

I ,

UAlIFICA eo TCOMMESSODIAIGENTEFUNZIONARIOIMPIEG. SUPIMPIEGATO IIMPIEGATO IlOPERAIO I

BARI OPERAIO Il

I~ • Record:1 di B

Le Schede di AccessLe Query lavorano su insiemi di dati.

Le Schede possono far vedere un re-cord per volta, come nel caso di figura14, o un gruppo ristretto di record, pro-vienienti da più tabelle, come in figura15. Ma procediamo con ordine.

La Scheda di figura 14 è poggiata sul-la tabella Persone e mostra il record diuna persona. Alcuni campi, provenientidalle tabelle Province e Qualifiche, sonocalcolati con delle funzioni di LookUp.Altri campi contengono dei calcoli con-dotti sui vari dati a disposizione. Questaè la Scheda che abbiamo usato per le ri-cerche veloci, per numero record (si

Basic che si dimostra in grado di colla-borare produttivamente con i file DBF eche permette, con i suoi «oggetti», adesempio la Griglia, di proporre in s''lriatimodi i dati elaborati.

Se si usa Access si possono costrui-re altre modalità di accesso ai dati sfrut-tando i suoi strumenti di facile utilizzo.In figura 13 vediamo una Scheda condue Caselle Combinate (le abbiamochiamate Cl e C2) che propongonol'elenco delle qualifiche e quello delleprovince e in basso una lista, con piùcolonne, contenente le persone di quel-la provincia e qualifica. In primo piano laformula SQL da indicare come Originedella Lista. I tempi di estrazione, datal'esistenza di un indice su Provincia eQualifica, sono eccezionali (che ne ditedi 2 secondi per estrarre un centinaio direcord dai 100.000?).

• I

QUALIFlC

OPAOGQCODICEODESCAQODESBAEVEOBONUS

Pronto

PPAOGPSIGlAPrAPOlUOGPSCONTO

c..roo: ~E~D~E'~PCAPO;~LU~O~~UAU!F~'CAo!' O~D~ES~'!D~CO~GN~D~ME~~~D~'M~PO~A~TO~~!~" ~S!~.Forl'l'l!J« A o A o ConI: Sorrma euioneO,drwnerto:

MoslJa:Criteri: (QUALE DTTA')

Oppure;

•• file Modifica ~Isuallzza Q.uery FInestra 1

1Gi'1"m>1II: IQII~;;;I"l'llf.;j:f-,I" .•.I"'x11 @I Glimi[§!

Figura IO - xBase - Cal-colo Batch in Clipper -ListatoQuesto è un classicoprogramma di scorri-mento basato sull'uti-lizzo di un Indice. L'in-dice, come detto, hacome chiave la Provin-cia, la Qualifica e il Co-gnome. Le istruzionixBase del ciclo esternosono il DO WHILE.NOT. EOF() e la ENO-DD. All'interno. ed in-nestati uno dentro l'al-tro, ci sono i due cicli aparità di provincia e aparità di qualifica. Unsistema del generefunziona solo se si uti-lizza un indice adegua-to alle regole di scorri-mento. L'istruzione,unica, che produce loscorrimento, che inxBase è SKIP e in VB èMoveNext, deve esse-re messa nel ciclo in-terno. L'istruzione didefinizione de/le rela-zioni vale per il C1ippere per il dBase IV. Per ildBase /Il occorre spez-zar/a in due inserendola relazione per la Qua-lifica più (la valle».

Figura 11 - MS Access Calcolo Batch con una Query Access.In Access la Query è uno strumento che serve un po' a tutto. Può servire per icalcoli Batch. come nel nostro esempio. può servire per aggiornare campi di ta-belle, può servire per alimentare Report. può servire per alimentare Schede. Inquest'ultimo caso occorre stare attenti, specie se le tabelle sono molto piene.in quanto l'apertura della Scheda provoca l'esecuzione della Query e i tempinecessari per tale elaborazione devono essere contenuti. Nella figura la Queryche abbiamo usato per le prove. arricchita di una condizione che serve a sele-zionare la Provincia.

le informazione va a finire in un file*.INF il cui nome è uguale a quello dellatabella DBF e che deve essere postonella sua stessa directory Il file INF èidentico in Access e in VB (nel caso ri-petiamo si usino file DBF e NDX ester-ni)

Interessanti anche i test con Visual

TOTALE IMPORTO"

USE PERSONE I NOEX PERSON3, PERSON 1, PERSON2

SE LE 2USE PROVINCE INOE PROVINCESELE 3

USE QUAlIFIC INOE QUAlIFIC

SELE 1

*

*@ 0,1 SAY "CALCOLO DEI TOTALI PER PROVINCIA E QUALIFICA"@ 0,0 TO 0,79@ 1, 1 SAY "ELABORAZ IONE BATCH - "@ 1,25 SAY "T1 : T2 : 13 :"@ 1,29 SAY TIME()

@ 2,0 TO 2,79@ 4,0 TO 4,79@ 20,0 TO 20,79@ 22,0 TO 22,79

*

CLEAR ALLSET TALK OFFSET SCOR OFFCLEAR

@ 1,45 SAY TIME()DO WHILE .NOl. EOF()

SET RELA TO OPROVINCIA INTO B, TO OQUAlIFICA INTO C && ClIPPER

P=OPROVINCIA@ 3,1 SAY "PROVINCIA "+B->PCAPOLUOGO@ 3,25 SAY "QUALIFICA NUMSTORE O TO C, TP,CTR=5DO WHILE P=OPROVINCIA

Q=OQUAlI FICA@ R,25 SAY Q@ R,28 SAY C->QOESCRIZSTORE O TO TQ, CQDO WHI LE Q=OQUAlI FICA

C=C+1TQ=TQ+O I MPORTO/1 000CQ=CQ+1

SKIPENOOOTP=TP+TQCT=CT+CQ

@ R,40 SAY CQ PICTURE "#It#,#It#,#It#"@ R,51 SAY TQ PICTURE "#It#,#It#,#It#,#It#,#It#"R=R+2

ENOOO@ 1,45 SAY TIME()

@ 21,40 SAY CT PICTURE "#It#,#It#,#It#"@ 21,51 SAY TP PICTURE "#It#,#It#,#It#,#It#,#It#"

ENOOO@ 1,61 SAY TIME()@ 23,0

Clipper (che invece usa propri file indi-ce).

È bene sapere che in caso di utilizzodi un file DBF, come Tabella Allegata, enel caso in cui questa tabella dispongadi indici occorre dichiararli (in figura 16 ilmomento «topico» della indicazione deifile NDX da usare nell'applicazione). Ta-

320 MCmicrocomputer n. 151 - maggio 1995

Page 6: di Francesco Petroni

DATA BASE

, , 'I; • . . , , .~-I fUe ,Moditlca ~Isua!lzza Record Finestra 1 ~1~lglm:l'Ié9Ii:~'~·11~ '~'l!J,I@!lI~''%.'I:.rP4't,·1 @ 1'<>'- 11ll1l\?'~ IcoMMEsso It[§D

OPR ;UNO

t IEJ•OMATRICOLA OCOGNOME OOATA BL ORTO .

:11 • .' BENEVENTO BN10000291U ARREOI 01/12130 BA BERGAMO BG UOO.OOIOO151~ BONASSISI 01/12130 DA BOLOGNA BO 000.00100161611 COLORNO 01112130 DA BOlZANO BZ 000.00ET011m... FANTINI 01112/43 DA BRESOA BS 000.001001124JU ANOCCHIAAO 01112130 DA BRINDISI BR ·000.001T00076lU GIUSTI 01/12130 BA w.uv 000.00IUOO730lU LUCIOI 01112130 BA 121.00 B.OOO.OOO.OOI0010259U MARRADI 01112130 BA 851.00 16.200.000.00IN010751U MONEllI 01/12130 DA 669.00 H.DI.OOO.OOIMC0J419U MONTESI 01/12130 BA 851.00 n340.000,OOICOO1799J MORRESI 01/12130 DA 851.00 7.600.000.00IN

"IQ -IN

SELECT DMATRICOLADCOGNOME.DDATADPROVINOA • I 'me I~ DBONUS.DIMPORTO FROM PERSONE WHERE.

- OQUAUFlCA-[C1 J ANO DPROVlNCtA-[C2} ORDER BY I Ann"" I -OCOGNOMEj

•cm;;:. --~ • RecOld:11 &1 ."M_~Soh"" MA

Figura 13 - MS AccesI'2.0 - Navigazione alla ri-cerca del dato giusto.Questa è una tipica FormAccess per la navigazionetra idati. Abbiamo siste-mato in alto due ComboBox, la prima alimentatadalla Tabella delle Provin-ce e la seconda dalla Ta-bella dalle Qualifiche.Scelta una Provincia euna Qualifica viene ese-guita una Query (si puòeseguire un calcolo auto-matico, con un minipro-gramma, o uno manualecon F9) che alimenta la li-sta posta nella parte infe-riore, con r elenco dellepersone di tale provinciae tale qualifica. I tempi diesecuzione sono ottimi.La ciliegina sulla tortasarà costituita dall'apertu-ra, all'evento doppio c1ick, della Scheda relativa al record puntato sulla lista.

Intett&Zione r9aInl:esl~zione coIoM~

(Non visua~zz&to

OCOGNOMEc;;;;:--"""""

Figura 12 - MS Access 2.0 - Query di tipo CalcoloCampi Incrociati.La nostra struttura si presta particolarmente ad es-sere usata in una Query di tipo «Campi Incrociati"nella quale contiamo o calcoliamo qualcosa per Pro-vincia e per Qualifica. I tempi di esecuzione dipen-dono, ovviamente, anche dal tipo di calcolo che siesegue. Abbiamo fatto delle elaborazioni presso-ché analoghe in xBase, che non dispone però dellostrumento Campi Incrociati, e in Visual Basic.

Campo: PCAPOLUOGOFotrrt.k R O

Can1lim.:lntett&Zione'O.cinarnento:

C.~eri:

- rU!GiT'f'III'" Ili3ili3fP1If['Uq"["&ljln?I~,,!.nll ",al'i" [I.

PROVINCE PERSONE QlIAI.lAC

PPROG . QPROGPSIGLAl QO)DICEPCAPOLUOGO

QOESCRIZPSCONTOQDESBAEVEPCONTEGGIDQBONUSPTOTALEQTOTAll

identiche tra VB ed Access. Le istruzio-ni sono esattamente le stesse.

Ciò precisato vediamo come condur-re con VB i nostri esperimenti.

Iniziamo con una Form che visualizzaun singolo record della tabella Persone,con la quale sperimentiamo sia il meto-do Seek che il metodo Locate nel solocaso di utilizzo di file dati DBF. In figura17 la Form nel suo aspetto esteriore edin figura 18 tutte le routine sottostanti.

In VB il metodo Seek si può esegui-re solo sulle Tabelle e il metodo Find-First sui Dynaset (che grosso modocorrispondono alle Query di Access).Infatti per visualizzare il dato trovatocon un FindFirst abbiamo subito dopoeseguito una Seek sulla Matricola, in

SCONTO DA PROV1NCIA:

SCONTO AD PERSONAM:

OTOTAlE:

IMPORTO DA PERSONE:

QUESTA E' UNA PAOVADITESTO WNGO IN UN CAMPODI2OOCAAATTEAI.PUO'ESSEAE OGGETTO 01RICERCA GENERAUZZATACON IL METODO LOCATE (OANOFIASTl

NOTA:

[UM090021G

COGNOME: [MARINACa

DATA NASaTk I 01101152

INDIRIZZO: f\iiA--TD-R-a-UA-T-0-T-A-SS-0-.2-'-

CIHA: IBARLETTA [!rol9

Figura 14 - MS Access2.0 - Scheda Anagraficacon dati da tre tabelle.Questa Scheda lavorasulla tabella delle Per-sone. Puntata una per-sona, con delle formuleLookUp (molto utili equindi da padroneggia-re assolutamente) ven-gono prelevati i dati ne-cessari dalle due tabel-le di appoggio. Dopodi-ché si possono esegui-re tutti i calcoli che sivuole. L'uso delle fun-zioni di LookUp prescin-de dall'uso delle Rela-zioni ed è comodoquando le tabelle da cuiprelevare i dati sono dipiccole dimensioni. Unastrada alternativa è

".·IRoe<><d:197481 Icl99999 ' •• "1 I·' I .- quella dello sfruttamen-ModIM1Scilodo c-r-r-w;r-i:lr,3 to di una Query che

. prepara, in un «ogget-tO» Dynaset, i dati per la Scheda, ma è una strada improponibile per tabelle di grosse dimensioni.

tipo Random. Ora però dispone di altree ben più sofisticate modalità.

VB può accedere direttamente ai fileAccess (versione 2.0 se si disponedell'upgrade Compatibility Layerl. puòaccedere, tramite specifici driver ISAM,ai file DBF, Paradox, bTrieve e, tramitei driver ODBC, a tutti gli altri formati.

Le modalità sono due, la prima, chepassa attraverso il Data Contrai, è lapiù elementare e limitata.

La seconda modalità, più sofisticata,consiste nell'utilizzo di DAO, Data Ac-cess Objects, e può essere messa inpratica solo scrivendo righe di codice (enon solamente impostando proprietà dioggetti, come si fa con il Data Contrai).

Le tecniche di utilizzo dei DAO sono

Visual Basic e i datiSoltanto a partire dalla versione 3.0

Professional il Visual Basic della Micro-soft si è ... messo a trattare bene i dati.

In quanto Basic può comunque utiliz-zare tutte le vecchie modalità di acces-so ai file di tipo Sequenziale ed ai file di

scrive in basso il numero), per chiave (siusa il binocolo), e per le ricerche lente(sempre con il binocolo, che però nonlavora sugli indici).

La Box proposta dallo strumento Bi-nocolo propone due possibilità: Cerca ilPrimo e Cerca il Successivo, proprio co-me il Locate e il Continue del dBase,che servono per cercare il primo e poi isuccessivi record che rispettano un da-to criterio. Le corrispondenti istruzionidi programmazione, sia In Access chein VB, sono i due «metodi» FindFirst eFindNext.

La figura successiva, siamo alla 15,mostra una Scheda con sottoscheda.Per ogni Provincia, la sottoscheda mo-stra tutte le «sue» persone. I caso digrossi volumi (nel nostro caso media-mente più di 1.000 persone per provin-cia) il riempimento della sottoscheda èlento. In questo caso risulta penososcorrere record per record, in quantoogni volta occorre attendere che siriempia la sottoscheda.

In ogni caso, quando si maneggianotabelle di grosse dimensioni, è sconsi-gliabile creare delle Schede alimentateda Query (la cui esecuzione può richie-dere troppo tempo). Occorre quindi ri-correre ad una programmazione un po'più tradizionale.

MCmicrocomputer n. 151 - maggio 1995 321

Page 7: di Francesco Petroni

DATA BASE

modo da spostarci fisicamente sul re-cord voluto.

È bene precisare a scanso di equivo-ci che la finalità del nostro esercizio èquella di testare le prestazioni nelle va-rie possibili modalità di accesso ai file.Non si tratta quindi di programmi com-pleti. Tanto per dirne una, un program-ma del genere non può essere utilizza-to per inserire dati, ma solo per vi sua-lizzarli. Per inserire dati nella nostraForm occorre utilizzare il metodo Upda-te (corrispondente al Replace in xBa-se), interessante da esaminare, maestraneo all'argomento dell'articolo.

Per quanto riguarda il programmaBatch che esegue calcoli « raggruppati»per provincia e per qualifica, con VB lodovremmo realizzare seguendo strademolto tradizionali, anche se poi i datisaranno mostrati in una griglia. In figura19 vediamo l'aspetto iniziale della no-stra griglia. Prevediamo quattro pulsan-ti ognuno dei quale scatena un suo pro-cesso.

Il primo (evento C1_Click()) è la pre-disposizione della Griglia, con definizio-ne delle intestazioni di colonna, con lequalifiche, e di riga, con le province, econ l'azzeramento di tutte le casellecon i dati.

Il primo calcolo (evento C2_Click())esegue due loop nestati uno dentrol'altro. Poiché viene usato il terzo indiceche fa vedere i dati in ordine di provin-cia e di qualifica, la griglia viene riempi-ta a partire dalla prima colonna e primariga. In questo modo la procedura evitadi dovere cercare, per ogni record, lacella in cui inserire il dato. Il calcolo inquesto caso è il semplice conteggiodelle ricorrenze e quindi è eseguitosommando 1 al precedente contenutodella cella.

Tale sistema ha un tallone di Achille:funziona solo se effettivamente perogni provincia c'è almeno una personadi ciascuna qualifica. Se questo nonpuò essere garantito occorre inventarsiun sistema che permetta a ciascun re-cord della tabella Persone (ogni perso-na appartiene ad una provincia e ad unaqualifica) di andare a pescare la cellagiusta.

In questo caso si può rinunciare adusare l'indice e le celle si riempiono a«pelle di leopardo».

La ricerca della cella giusta è sempli-ce (la vediamo nell'evento C3_Click() difigura 18). Dato un record di una perso-na se ne legge sigla della provincia e si-gla della qualifica, con tali codici si ese-guono delle Seek alle due tabelle ester-ne e si estrae il numero di record checorrisponde al numero di riga e di co-lonna da puntare.

Facciamo alcune precisazioni.

lli7~x~

Figura 16 - MS Access2.0 - Uso in Access 2.0di tabelle allegate.Una delle caratteristi-che principali di Accessconsiste nella possibi-lità di lavorare con ta-belle allegate li famosi"attachment))). Questepossono essere tabellepresenti in un altro fileMOB IAccess) oppuretabelle ... qualsiasi, sesi sfruttano i canaliOOBC. Possono esse-re tabelle OBF, ed intal caso si possono uti-lizzare anche i relativiindici NOX. Le presta-zioni sono in quasi tuttii test leggerementepenalizzate rispetto aquelle rilevate lavoran-do con database intera-mente Access.

All•••

~

+1 r Etck.llivo

.IM

.IM

1IIlMAili

<155

Selezl.!:'tna file

•••••TRICOtA.1118010199ll

I00082S1Uiiiiii5iF.iiiWi161iiiIET011:mLII0011243UnOO916roIUOO7J07U10010259UIN8101S1U'iiiiiiiii'iii'iiiiirniiiiiiiii5ii'iiU..

H 4 Reoonll

H 4 Re<Xlld: 10

WodatiSdedo

-I file Modifico ~suallzzo Heconl FlflCS"" 1

~1.H~I··I~~lt*lIl'!1IY.-I;;.1

~Sl([FloW(.~•p_.

B.BNP

....•• L'ASiiii2PEASON3

I Nuovo ![lllD~mn

.!!:!!:!g~

~!.IIIEro ~ndtci

.:t Pm

Dea lI'l collegamento con una tabella estefM.

I M/erosoll Atee.. I.;J ~file Modifica ~isuallzza Sicurezza Finestra 1

~~IIJjlj)~litl~I$!!S1 ~~~ EImDataba •• : Pl DDDDDD 831 ~

I &,1 Il ~truttura IR

Figura 15 - MS Access2. O - Scheda con sotto-scheda.La scheda con sotto-scheda è uno strumen-to utilissimo per pre-sentare in forma sinteti-ca dati provenienti dadue tabelle poste in rap-porto di "Uno a Molti)).È anche possibile farecalcoli "a cavallo)) tra latestata e la sottosche-da. Il problema sta nelfatto che scorrendo idati della testata, i datidella sottoscheda ven-gono "ricalcolati)). Inpratica viene eseguitauna Query che potreb-be essere molto impe-gnativa se le tabelle so-no di grosse dimensio-ni. Anche qui occorrequindi rispettare alcuneregole di comportamen-to di cui parliamo nel testo.

Figura 17 - MS VB3 -Metodo Locate e meto-do Seek - La Form.In questo esercizio veri-fichiamo i due metoditradizionali per la ricercadi un dato record, quel-lo basato sull'istruzioneSeek, che lavora sull'in-dice della tabella e"becca)) istantanea-mente il record deside-rato, e quello basatosull'istruzione FindFirst,che sfrutta un criterio eche, leggendo sequen-zialmente i dati, è il me-todo lento. Purtropposia in Access che in VBil metodo Locate agiscesolo sui Oynaset. Co-munque, una volta rag-giunto il record, vieneeseguita una routineche si occupa di riempi-re le varie caselle di te-sto o con dati direttamente provienienti dalle tabelle o con dati calcolati.

322 MCmicrocomputer n. 151 - maggio 1995

Page 8: di Francesco Petroni

DATA BASE

Dim DB Ae Database, PER Ae table, QUA As table, PRO As table, SNP As SNAPSHOT

Sub FOrln_Load ()

Bet DD '" OpenDatabase("D:\KKKK", False, False, "dBASE 111;'1)Set PER '" DB. OpenTable ( Il PERSONE Il )

Set QUA •• DB. OpenTable (ltQUALIFIC")

Set PRO '" DB. OpenTable ( "PROVINCE Il )

Set SNP = DB. CreateSnapshot ("SELECT DCOGNOME, DMATR!COLA FROM PERSONE")

PER.lndex ~ "PERSON1": TO", "": Tl '" ""

End Sub

Sub SCRIVI () , ROUTINE GENERALIZZATA DI SCRITTURA

Fl. "###,###", F2 • "###,###,###,###"TO "" PER ("DMATRICOLAIl) : T1 '" PER("DCOGNOME")

T3 ::: PER("OQUALIFICAtI) I RICERCA NELLA TABELLA QUALIFICHE

QUA.Index::: "QUALIFICIl: QUA.Seek "=", T3

T31 '" QUA("QDESCRIZ"): V9 - QUA("QBONUS")

T4 "" PER ("DPROVINCIA") I RICERCA NELLA TABELLA PROVINCEPRO.Index = "PROVINCE": PRO.Seek Il,,,'', T4

I DATI DALLA TABELLA PERSONE

T41 '" PRO("PCAPOLUOGO"): V10 '" PRO ("PSCONTO")TS •• PER("DDATA"): T6 = PER ("DINDIRIZZO")T7 "" PER("DCITTA"): T8 •• PER (tIONOTALUNG")

I CALCOLI VARI

V1 '" PER("DIMPORTO"): V2 •• PER("0SCONTO"): V3 •• PER ("DBONUSII)

V4 • V3 .• V9: VS = V4 + Vl: V6 •• V2 + V10: V7 •• VS • (100 - V6) / 100

T13 = Format (VS, F2): T14 •• Format (V6, F2)

T42 '" Fonnat (V2, F2): T2 •• Format (Vl, F2)

T12 •• Format (V4, F2): T1S •• Format (V7, F2)

T32 ::: Format (V9, Fl): T9 •• Format (V3, Fi)

TiO = Format (V10, Fl): T1S '" Format (Vl, F2)

End Sub

METODO FIND ~ NON NECESSITA DI INDICE

METODO LENTO

APPLICABILE CON QUALSIASI CRITERIO

METODO SEEK - NECESSITA DI INDICE

METODO VELOCE

, PRECEDENTE

I PROSSIMO

~ ..•.....•"""--

CR ::: Il (DCOGNOME] LlKE 'Il + Tl +

SNP. FindFirst CR

If SNP.NoMateh Then

MsgBox ("NON TROVATO")

ElseKY • SNP{"DMATRICOLAII)

PER. Seek ">=", KY: SCRIVI

End IfEnd Sub

Sub Cl_Click ()PER.Seek ">=tl, TO

I f PER. NoMatch ThenMegBox ("NON TROVATO")

EleeSCRIVI

End lfEnd Sub

Sub C2_CIiek ()

Sub C3_Cliek ()

PER .MovePrevious SCRIVI

End Sub

Sub C4_Cliek ()

PER.MoveNext : SCRIVI

End Sub

Figura 19 - MS VB3 -Calcolo Batch ... in gri-glia.Grosso modo si trattadelle stesso calcoloBatch eseguito in dBa-se e in Clipper. Le dif-ferenze sono due. Laprima è che vengonoeseguiti anche conteg-gi di quante persone cisiano in ogni provinciae qualifica, la secondaè che il risultato va a fi-nire nella Griglia. Ab-biamo due versioni delcalcolo, a seconda chesi possano usare gli in-dici, oppure no. I risul-tati sono interessanti.

C'è un altro tallone d'Achille checonsiste nel fatto che, nella program-mazione DAO, per uscire dai tre ciclioccorre testare tre volte se si è rag-giunta la fine del file. Una istruzione IF,comunque sia scritta, all'interno di unciclo rallenta molto l'esecuzione. Que-sto avviene perché se si raggiunge la fi-ne del file, con un MoveNext sull'ulti-mo record, e si cerca di leggere uncampo, si provoca un errore del tipo«No Current Record». Va detto che illinguaggio xBase non ha un comporta-mento analogo.

Se si usano questi metodi di acces-so ai dati, parliamo dei DAO, non si haa disposizione il RECNOO della tabella,ovvero dato un record non se ne cono-sce il progressivo.

Abbiamo quindi, per permettere il ti-po di ricerca ora visto, inserito in ambe-due le tabelle un progressivo che forni-sce il numero del record.

Altra precisazione riguarda la decisio-ne su cosa deve accadere durante l'ela-borazione dei 100.000 record. Cioè sevogliamo che i dati vengano via via sca-ricati sulla griglia per vederli, oppurescaricati solo alla fine, oppure ogni tan-to. VB aggiornerebbe la griglia solo allafine del programma, per cui ricorriamoall'istruzione DoEvents per causare,quando vogliamo noi, lo scarico e quin-di la visualizzazione dei dati, ad esem-pio alla fine di ogni ciclo sulla provincia.È chiaro che anche il refresh del videoè una sia pur leggera perdita di tempo,meno volte si fa più veloce è il pro-gramma.

Una successiva precisazione riguar-da il tipo di calcolo eseguito che è unsemplice conteggio e quindi è fin trop-po elementare. Abbiamo provato conun calcolo molto più complicato delsemplice conteggio (la nostra formulache lavora sulle tre tabelle).

Il tempo necessario è stato di pocosuperiore a dimostrazione del fatto chel'impegno maggiore è quello richiestodal movimento sulle tabelle e non daicalcoli.

I risultati di tale calcolo appaiono nel-la ultima riga della Tabella di figura l,ma non ne mostriamo il listato.

Figura 18 - MS VB3 - Metodo Locate e metodoSeek - IIlistato.Si lavora con tre tabelle che vanno definite in fasedi apertura della Form (Sub Form Load). Poi occorreo scrivere una Matricola nella prima Casella di Te-sto o un Cognome (o parte di un cognome es.ROSSO) nella seconda. Il metodo Seek cerca la ma-tricola sfruttando il primo indice. Il metodo FindFirst(che corrisponde al Locate del dBase) cerca, in unDynaset di appoggio, il primo dei record che soddi-sfa il criterio. La ricerca è lenta. Per cercare il suc-cessivo record che rispetta il criterio il metodo èFindNext (che sarebbe il Continue del dBase).

MCmicrocomputer n. 151 - maggio 1995 323

Page 9: di Francesco Petroni

DATA BASE

Cim DB As Database, PER As table, QUA As table, PRO As table

Sub Form Load Cl8et DD sa OpenDatabase("D:\JOOO(", False, False, tldBASE 111:")Set PER la DB.OpenTable("pERSONE")Set QUA - DB.OpenTable(IIQUALIFIClI)

Set PRO m DB.OpenTable("PROVINCE")2nd Sub

Sub C3 Cl1ck ClLl-. Tlme: R" 1: T •.•O: DoEventsPER.lndex _ Il PERSON111PRO.lndex _ Il PROVINCE ti

QUA.lnd.ex CI Il QUALIFIC"Do Whl1e Not PER.BOF

PRO.Seek "all, PER("OPROVINCIA"): KR =: PRO("PPROG")QUA. Seek "1lI1t I PBR("DQUALIFlCA"): XC """QUA("QPROG")Gl.Row •• KR: G1.Col CI KC: al - c + Val(Gl)PER. HoveNext

LocpL3 1:1 Tlme

2nd Sub

Sub Cl Cl1ck ClGl-:-Rows - PRO.RecordCount + 1: 01.Co18 = gUA.RecordCount + 1Far I a l To Gl.Cola - 1: Gl.F1xedAlignment(I) ... 1G1.ColA11grunent(I) = 1: Next IFor C - O To G1.Cola - 1: Gl.Col .•• c: Far R'" O To Gl.Rows - lGl.Row la R: 01 = O: Next R: Next CR la 1: G1.Col •••O: PRO.HoveF1rstDo Wh11e Not PRO.BOF

Gl.Row • R: 01" PRO("PSIGLAtI)

PRO.HoveNext : R = R + 1LoopC al 1: Gl.Row a O: gUA.HoveFirstDo Wh11e Not QUA.20F

01.Co1 = C: 01 ••• QUA("QDESBREVEIl)

gUA.H:oveNext : C = C + 1Loop

2nd Sub

Sub C2 Cl1ck Cll1-C:: Time: DoEventsR - 1: PER. Index _ ti PERSON3"Do Wh11e Not PER.20F

C :I:S 1: KP •• PER("DPROVINCIAtI): LOl ••• XPDo Whl1e KP - PER(IlDPROVINCIA")

KQ = P2R("DQUALIFICA"): L02 = KQDo Whl1e KQ •.• PER("DQUALIFlCA")

Gl.Row •• R: Gl.Col • CGl • al + l: PER.MoveNextIf PER. EOF Then Bxlt Do

LocpC D C + 1: DoEvents: L2 •• TlmeIf PER.EOF Then Bxlt Do

LoopR" R + 1

LocpL3 •• Tlme

2nd Sub

Figura 20 - MS VB3 -Calcolo Batch .. in gri-glia - Listato dei tre cal-coli.Diciamo subito chefacciamo delle sempli-ficazioni inaccettabili inun programma reale.Nel primo calcolo utiliz-ziamo il terzo indiceche mette idati in ordi-ne di Provincia e diQualifica Scorriamotutta la tabella, poi aparita di provincia scor-riamo tutte le qualifi-che, e a parita di pro-vincia e di qualifica,contiamo i record. Lasemplificazione sta nelfatto che quando cam-bia la qualifica faccia-mo scattare una colon-na e quando cambia laprovincia facciamoscattare una riga, sen-za controllare che rigae colonna siano quellegiuste. Il programmafunziona solo se cia-scuna accoppiata pro-vincia+qualifica contie-ne almeno un dato. Glialtri due calcoli prescin-dono dall'indice Sono isingoli record che van-no a trovarsi provinciae qualifica, e quindi cel-Ia della griglia, di appar-tenenza.

record) ci si può limitare ad un uso ab-bastanza disinvolto degli oggetti pre-confezionati, ad esempio le Schede diAccess o il DataControl di VB.

Se si superano tali dimensioni occor-re una maggiore attenzione rivolta adusare gli strumenti giusti. In ogni casosi potranno usare con meno disinvolturagli oggetti preconfezionati e si dovrannonecessariamente scrivere proprie routi-ne di accesso veloce ai dati, specie sesi usano tabelle ed indici allegati.

Non va sottovalutata la possibilità diprodurre due stesure dell'applicazione.La prima che si basa su oggetti precon-fezionati e che può essere usata comeprototipo, facilmente costruibile, adesempio per verificare il funzionamentodel Database (ovvero che siano statepreviste tutte le tabelle, tutti i campi,tutti i controlli sui dati, ecc.). Quella de-finitiva, da realizzare una volta approva-to dall'utente il prototipo, nella quale ivari oggetti precostruiti vengono sosti-tuiti con altri oggetti «fatti su misura» equindi ottimizzati.

rM@,

me funzionano le regole relazionali, ecc.Per quanto riguarda le «regole di

comportamento» possiamo dire che seil Database non è molto voluminoso(poche tabelle, dimensione max. 10.000

- t"il'H'·!'·!;;;! -I~file Modifica Yisualizza ~uery FInestra l1~llllqliiil~IQ'I'bIl, 1611~"'Wr'lI'll.I:h,I~.I"'x11~I .••I illl[!.ill O ~. Querv di selezione: Query2 I- •

PSIG PCAPOLUOG PTOTAlE •AG AGRIGENTO 7.016.651AL ALESSANDRI,ll 8.689.086AN ANCONA 10.625.192AO AOSTA 11.517.198M' ASCOU PlCEN 13.369.569All . l' I;· - .AR l 1.11 I , .AT .AV PROVINCE PERSONE QUAlIFlCDA . . QPROG •BG PPAOG g~~~o~~V QllJOICEBL PSIGLA \N QOESCAIZBN PCAPOLUOGO OqUALlFICA QOESBREVEBO PSCONTO ODATA QBONUSBR PCONTEGGIO . TOTALI •BS PTOTALEBZIr. .

I~ • Ree • +

Ib=C"""" PTOTAlE !.!

Aggiom« PTOTALE + OTOTALE + DBONU$· 80NUS 100 SCONTO· PSCONTO 10C0X1o~~::l r.iPronto MA

Figura 21 - MS Access2.0 - Query di aggiorna-mento Batch. Nella ta-bella Province c'è uncampo che abbiamo deltutto ignorato. È il cam-po PTOTALE, nel qualevogliamo inserire, conuna procedura Batch, iltotale del nostro calcoloeseguito per tutte lepersone della Provincia.Si tratta quindi di ali-mentare campi di unatabella con risultati dicalcoli eseguiti su cam-pi di altre tabelle. Que-sto processo, non bana-le, può essere eseguitoda una Query di Aggior-namento di Access equindi, ancora una volta,senza scrivere una rigadi programma.

Conclusioni

Prima di concludere vi invitiamo adanalizzare l'interessantissima Query diaggiornamento di figura 21 e a leggernela didascalia. In pratica con una Query diquesto tipo si possono aggiornare icampi di una tabella con il risultato dicalcoli complessi eseguiti su campi dialtre tabelle. Operazioni che un temposi facevano solo con complicate elabo-razioni Batch.

Ecco le conclusioni che possiamotrarre dai nostri esperimenti.

I moderni prodotti che manipolanoDatabase, sia quelli ora citati che gli altriche vedremo in seguito, permettono di-verse tipologie di utilizzo: da quelle chefanno riferimento a modalità nuove, inparticolare citiamo l'uso degli oggetti diAccess (esempio Query, Schede, Sche-de con Sottoschede, Report) per i qualinon è prevista la programmazione, aquelle che fanno riferimento a modalitàclassiche di programmazione. Abbiamoad esempo visto come, con istruzioniAccess Basic o Visual Basic, si possa si-mulare completamente una program-mazione alla xBase che aggisca su og-getti DAO.

Inoltre molte operazioni che un tem-po di facevano solo con la programma-zione ora sono state trasferite alla fasedi definizione della struttura del Databa-se. Parliamo della impostazione degli in-dici, del «disegno» delle relazioni, dellacostruzione delle regole per il controllo,ai vari livelli, della correttezza dei dati.

Queste facilitazioni operative che ve-locizzano la realizzazione di un'Applica-zione, non debbono far credere che iproblemi sottostanti possano essereignorati. In altre parole l'utilizzatoreesperto o professionale, deve comun-que sapere a cosa servono gli indici, co-

324 MCmicrocomputer n. 151 - maggio 1995

Page 10: di Francesco Petroni

little computer people © Multi S.r.l. - Viale Berti Pichat, 28/A - 40127 Bologna - Tel. 051/251338 - Fax 051/6570349