9
w N w ............................................................................................................Il Data Control di Visual Basie 3.0 •• primi approccI Ricordate? Avevamo un appuntamento. Nel numero scorso di Me nel presentare la prova del Visual Basic 3.0 vi abbiamo avvertito del fatto che in un successivo articolo, questo, avremmo approfondito uno degli aspetti più interessanti di questa nuova versione di VB, la gestione dei Database di Francesco Petroni ...................... Record D l•••.• Ilv•••• I Sequenziale 1 456000 I IPlUTO IIVEROI Rcrndom 1501...., 1+1 II I-I Si tratta di un tema vasto per due motivi. Il primo è che comunque l'argomen- to DB è enorme per conto suo, il secon- do è che Visual Basic dispone, nei con- fronti della gestione dei file con i dati, di svariati strumenti operativi (control, istruzioni, funzioni) e alcuni di questi in certi casi si sovrappongono. In questo articolo iniziamo a trattare il tema. Iniziamo nel senso che non po- tremo mai arrivare ad un punto in cui potremo dire «questo è tutto». Il taglio dell'articolo è molto pratico. Insomma vi proponiamo una serie di esercizi che sarebbe meglio per voi, per una migliore comprensione dei vari co- mandi, rieseguire passo passo. Si tratta di esercizi «sintetici» nel senso che vengono evitate tutte le parti non strettamente inerenti la funzionalità che si sta esaminando e questo riduce le operazioni a pochissime e le istruzio- ~iIi'I!I..!!!!!!.~' I!;~. !!!!!!!!!'~EI~ 0_ Il_al) 1.1 p,,,,,, Ildedoo ••••••) 1.1 Type RI Ho. As String • 8 Cog As String •8 IIlIp As Currency [nd Type Figura 1- Visual Basic 3.0 - Ripasso dei metodi tra- dizionali - Form. Visual Basic non rinnega la sua di- scendenza diretta dai vari Basic, GWBasic, Quick Basic, ecc. Dai suoi avi ha ereditato le classiche istruzioni di accesso ai file sequenziali e Random. In questa e nella successiva figura riassumiamo i due metodi. Qui vediamo la dichiarazione della va- riabile RT che identifica la struttura del record del fi- le Random e la Form che visualizza i dati. 314 ni, quando occorre scriverle, a poche ri- ghe. Cosa faremo Dapprima riepilogheremo i metodi tradizionali di accesso ai file, realizzabili anche con Visual Basic versioni 1.0 e 2.0. Poi passeremo al nuovo Control Da- taControl (solo VB 3.0) con il quale «ag- grediremo», nel senso che lo accerchie- remo e attaccheremo da tutte le parti, un Database dBase 111. Dapprima un so- lo archivio DBF, poi un insieme di tre ar- chivi. Dopo una pausa di riflessione, nella quale tireremo le somme e cercheremo di schematizzare il rapporto Visual Basic e DB, passeremo ad Access, al formato Access che è il formato «nativo» per i Database di Visual Basic. Alla fine una serie di piccoli «trucchi» utili quando si realizzano delle Form che dialogano con Database. L'accesso ai Dati. Ripasso delle origini Questo è un file testuale FixedLen- ght: Pippo Rossi 345000 Pluto Verdi 456000 PaperinoBlu 567000 Questo è un file testuale Delimited: "Pippo"," Rossi" ,345000 "Pluto", "Verdi" ,456000 "Paperino"," Blu" ,567000 Visual Basic legge e scrive file se- quenziali di questi due tipi. Il migliore dei due è il secondo nel senso che è più facile individuarne la struttura, sia per noi che per qualsiasi prodotto software. Sui file sequenziali sono possibili solo tre tipi di operazioni: - lnput. lettura a iniziare dal primo re- cord; - Append, scrittura a iniziare dall'ulti- mo record (e quindi accodamento); - Output. scrittura a iniziare dal primo record (e quindi sostituzione dell'even- tuale file preesistente). È chiaro che si tratta di operazioni ru- dimentali, che permettono solo una ge- stione «tutto dentro, tutto fuori» dell'ar- chivio. Tale tecnica può essere comoda per caricare e magari parcheggiare in vettori piccoli archivi, oppure per eseguire ela- borazioni Batch, nel senso che il file vie- ne letto riga per riga, la riga subisce un calcolo, viene scaricata e viene subito dopo sostituita dalla riga successiva. La gestione dei file ad accesso casua- le è più sofisticata soprattutto per il fatto che è possibile leggere direttamente un singolo Record, individuato da un nume- ro, senza necessariamente dover legge- re tutti i precedenti. Questo comporta la necessità intuitivo) di disporre di una lunghezza del Record fissa e dichiarata, in modo che VB possa eseguire il calco- lo che dato il numero del record ne indi- vidua la posizione nel file. La struttura del record Random va di- chiarata all'inizio e va appoggiata su una variabile (Type Var) che può essere ma- neggiata con grande facilità. I dati numerici vanno dichiarati non in termini di numero di caratteri, ma in ter- mini di tipo (Intero, Lungo, Valuta). Que- sto perché il Basic tramuta il valore da decimale a binario. In questo modo vie- ne risparmiato qualche byte, ma viene persa la possibilità di leggere facilmente il file anche fuori del programma. Nelle prime due figure dell'articolo vediamo un esercizio di ripasso che contiene le seguenti parti: - dichiarazione del Record per il file Random, MCmicrocomputer n. 134 - novembre 1993

N Il Data Controldi Visual Basie 3.0 primi • •approccI• · in modo che VB possa eseguire il calco- ... Valuta). Que-sto perché ilBasic tramuta valore da decimale a ... rv.cog

Embed Size (px)

Citation preview

w N w•............................................................................................................•

Il Data Control di Visual Basie 3.0• • •primi approccIRicordate? Avevamo un appuntamento.

Nel numero scorso di Me nel presentare la prova del Visual Basic 3.0 vi abbiamoavvertito del fatto che in un successivo articolo, questo, avremmo approfondito uno

degli aspetti più interessanti di questa nuova versione di VB, la gestione dei Database

di Francesco Petroni......................

Record Dl•••.•• Ilv•••• ISequenziale

1456000 I

IPlUTO IIVEROIRcrndom 1501....,

1+1 I I I-I

Si tratta di un tema vasto per duemotivi.

Il primo è che comunque l'argomen-to DB è enorme per conto suo, il secon-do è che Visual Basic dispone, nei con-fronti della gestione dei file con i dati, disvariati strumenti operativi (control,istruzioni, funzioni) e alcuni di questi incerti casi si sovrappongono.

In questo articolo iniziamo a trattare iltema. Iniziamo nel senso che non po-tremo mai arrivare ad un punto in cuipotremo dire «questo è tutto».

Il taglio dell'articolo è molto pratico.Insomma vi proponiamo una serie diesercizi che sarebbe meglio per voi, peruna migliore comprensione dei vari co-mandi, rieseguire passo passo.

Si tratta di esercizi «sintetici» nelsenso che vengono evitate tutte le partinon strettamente inerenti la funzionalitàche si sta esaminando e questo riducele operazioni a pochissime e le istruzio-

~iIi'I!I..!!!!!!.~'I!;~.!!!!!!!!!'~EI~0_ Il_al) 1.1 p,,,,,, Ildedoo••••••) 1.1Type RI

Ho. As String • 8Cog As String • 8IIlIp As Currency

[nd Type

Figura 1 - Visual Basic 3.0 - Ripasso dei metodi tra-dizionali - Form. Visual Basic non rinnega la sua di-scendenza diretta dai vari Basic, GWBasic, QuickBasic, ecc. Dai suoi avi ha ereditato le classicheistruzioni di accesso ai file sequenziali e Random.In questa e nella successiva figura riassumiamo idue metodi. Qui vediamo la dichiarazione della va-riabile RT che identifica la struttura del record del fi-le Random e la Form che visualizza i dati.

314

ni, quando occorre scriverle, a poche ri-ghe.

Cosa faremoDapprima riepilogheremo i metodi

tradizionali di accesso ai file, realizzabilianche con Visual Basic versioni 1.0 e2.0.

Poi passeremo al nuovo Control Da-taControl (solo VB 3.0) con il quale «ag-grediremo», nel senso che lo accerchie-remo e attaccheremo da tutte le parti,un Database dBase 111. Dapprima un so-lo archivio DBF, poi un insieme di tre ar-chivi.

Dopo una pausa di riflessione, nellaquale tireremo le somme e cercheremodi schematizzare il rapporto Visual Basice DB, passeremo ad Access, al formatoAccess che è il formato «nativo» per iDatabase di Visual Basic.

Alla fine una serie di piccoli «trucchi»utili quando si realizzano delle Form chedialogano con Database.

L'accesso ai Dati.Ripasso delle origini

Questo è un file testuale FixedLen-ght:

Pippo Rossi 345000Pluto Verdi 456000PaperinoBlu 567000

Questo è un file testuale Delimited:

"Pippo"," Rossi" ,345000"Pluto", "Verdi" ,456000"Paperino"," Blu" ,567000

Visual Basic legge e scrive file se-quenziali di questi due tipi. Il miglioredei due è il secondo nel senso che èpiù facile individuarne la struttura, siaper noi che per qualsiasi prodottosoftware.

Sui file sequenziali sono possibili solotre tipi di operazioni:

- lnput. lettura a iniziare dal primo re-cord;

- Append, scrittura a iniziare dall'ulti-mo record (e quindi accodamento);

- Output. scrittura a iniziare dal primorecord (e quindi sostituzione dell'even-tuale file preesistente).

È chiaro che si tratta di operazioni ru-dimentali, che permettono solo una ge-stione «tutto dentro, tutto fuori» dell'ar-chivio.

Tale tecnica può essere comoda percaricare e magari parcheggiare in vettoripiccoli archivi, oppure per eseguire ela-borazioni Batch, nel senso che il file vie-ne letto riga per riga, la riga subisce uncalcolo, viene scaricata e viene subitodopo sostituita dalla riga successiva.

La gestione dei file ad accesso casua-le è più sofisticata soprattutto per il fattoche è possibile leggere direttamente unsingolo Record, individuato da un nume-ro, senza necessariamente dover legge-re tutti i precedenti. Questo comporta lanecessità (è intuitivo) di disporre di unalunghezza del Record fissa e dichiarata,in modo che VB possa eseguire il calco-lo che dato il numero del record ne indi-vidua la posizione nel file.

La struttura del record Random va di-chiarata all'inizio e va appoggiata su unavariabile (Type Var) che può essere ma-neggiata con grande facilità.

I dati numerici vanno dichiarati non intermini di numero di caratteri, ma in ter-mini di tipo (Intero, Lungo, Valuta). Que-sto perché il Basic tramuta il valore dadecimale a binario. In questo modo vie-ne risparmiato qualche byte, ma vienepersa la possibilità di leggere facilmenteil file anche fuori del programma.

Nelle prime due figure dell'articolovediamo un esercizio di ripasso checontiene le seguenti parti:

- dichiarazione del Record per il fileRandom,

MCmicrocomputer n. 134 - novembre 1993

WINDOWS

- dimensionamento dei vettori di ap-poggio, per i dati del file sequenziale, edefinizione della variabile rv, che contie-ne l'intero record, necessaria per il fileRandom,

- al caricamento del Form, scritturadel file Sequenziale:

Print #1, variabili

e scrittura del file Random:

Put #2, i, rv

sima, anche per il fatto che è totalmen-te guidata, nel senso che via via, nellevarie List Box, Visual Basic propone fileDBF e campi disponibili.

Ricordiamo la presenza, nel materialedel Visual Basic 3.0, del programminoaccessorio Data Manager, che permet-te accedere ad un file DBF, sia per leg-gerne o modificarne la struttura, sia perleggerne o modificarne i dati.

Questo consente di creare un file,magari dotandolo di un indice, e di inse-

rirvi un po' di dati, in modo che si possatestare efficacemente il DataControl dasubito (fig. 4).

1/DataControl?Non è indispensabile

In figura 5 vediamo invece come sipossa aprire un file DBF senza doverusare lo strumento DataControl.

In questo caso, come in buona partedegli altri esercizi, occorre definire gli

Dim n$(3), c$(3), s(3), rv As rt dimens. vettori

Figura 2 - Visual Basic 3.0 - Ripasso dei metodi tradizionali - Listati. La miniapplicazione comporta due even-ti. La fase di caricamento, in cui i tre record vengono trasferiti dai vettori N$, C$ e 1$ agli archivi DA TlS, se-quenziale, e DA TlR, random. Poi, all'evento «change" della Serali Bar, insomma al variare della ScrollBar,viene associata la visualizzazione dei relativi record nei due file.

Sub HScrolll_Change ()nr = Val(hscrolll.Value)text4.Text = nr: textl.Text = n$(nr)text2.Text = c$(nr): text3.Text = s(nr)Open "C:\PARKS\DATIR. DAT" For Random As 2 Len = 24Get '2, nr, rv: Close '2text5.Text = UCase(rv.nom): text6.Text = UCase(rv.cog)text7.Text = Format(rv.imp * 1.1, ""',"',"''')

End Sub

Alct'iviodelePscf3ASE 11I~\pook.(none)O· MaruaiT •••r••••T,,,,,r••••MS SansSell8.25r••••r••••&H1IOODXllll.

-,l70

120O·DeldDatalor••••PERSONE

Cao6onCornOCtDatebaseNarneDraglconDragModeEnabledE,.,.".,.rorllloldFontIl.ror<N ••••Font$izeFontStràettvuFontUndtriner",oCobHe9"Indo><L••••MousePoirtefNno",,",Roac[)nIyAecordScuceTag•

O·l••••J""'"&Hmxm;&, . Foed S •••••

DatalDataScuce0, con

Figura 3 - Visual Basic3.0 - Data Contrai -Connessione dBase. IlData Contrai si concre-tizza in una specie diSerali Bar, all'internodella quale si può inse-rire una Caption, unascritta, che ai marginipresenta due coppie difrecce, che servonoper spostarsi sul primorecord, sul precedente,sul successivo, sull'ul-timo. Le properties delContrai con le quali siattiva il collegamentosono «dBase Name",che identifica la SubDi-rectory, Connect, cheidentifica il tipo di colle-gamento e il Record-Source, che identifica ilFile vero e proprio.

Sub Form Load ()a = Chr$(34): b = Chr$(44): ab = a + b ' separatorin$(l) = "Pippo": c$(l) = "Rossi": s(l) = 345000 def.datin$(2) = "Pluto": c$(2) = "Verdi": s(2) = 456000n$(3) = "Paperino": c$(3) = "Blu": s(3) = 567000Open "C:\PAlUal\DATIS.=" For OUtput As l scrive sequenzialeOpen "C:\PAlUal\DATIR.DAT" For Random As 2 Len = 24 ' apre randomFor i = l To 3Print 'l, a + n$(i) + ab + a + c$(i) + ab + Str$(s(i» , scrive seq.lerv.nom = n$(i): rv.cog = c$(i): rv.imp = sIi)Put '2, 1, rv ' scrive randomNext i: Close l: Close 2 due chiusurehscrolll.Min = l: hscrolll.Max = 3l = l: Open "C:\PARKS\DATIS.=" For Input As l'apre sequenzialeDo While Not EOF(l)Input 'l, n$(l), c$(l), s(l) alimenta vettoril = l + l: Loop: Close l

End Sub

Eccoci ai file in formato dBaseNella ToolBox esiste in nuovo Data-

Control, quello a destra nella penultimariga di figura 3. Portato sul Form apparecome una ScrollBar con due frecce agliestremi. Per agganciare tale Control adun file dBase 111, occorre definire le se-guenti «properties» (a destra nella fig. 3):

- Nome: il nome da usare per riferirsial Database (default Data 1);

- Caption: la scritta che appare sullaparte interna della barra;

- DatabaseName: sarebbe la direc-tory in cui sono i file DBF, nel mio casoC: PARKS;

- Connect: dBASE 111, che indica il ti-po di file agganciato;

- RecordSource: il nome del file;- ReadOnly: per definire la scrivibilità

o meno del file DBF.Le altre «properties» sono analoghe

a quelle degli altri Control.Si può lanciare il programma. Se non

vengono segnalati errori l'Archivio è col-legato ... solo che non si vede nulla.

Per vedere i dati occorre definire del-le Control che ricevano i dati. Possonoricevere i dati le TextBox, le Label (noneditabilil, le ListBox, le CheckBox, leImageBox, ecc.

Ad esempio nel caso si voglia cheuna TextBox contenga un dato campooccorre definire le sue seguenti «pro-perties»:

- DataSource: ovvero il nome del Da-taControl cui collegarsi;

- DataField: il nome del campo, pre-sente nella struttura.

L'operazione di aggancio è semplicis-

- chiusura dei due file,- apertura e lettura del file sequenziale etrasferimento di tutti i dati nei vettorid'appoggio.

A questo punto il gioco è comandatodalla Scroll Bar cui è delegato il compitodi mandare avanti ed indietro il recordcorrente. Nella Form in alto appaiono idati del file sequenziale, in basso quellidel file Random, modificati con dellefunzioni.

MCmicrocomputer n. 134 - novembre 1993 315

WINDOWS

oggetti, DataBase e Table, che verran-no utilizzati, cosa che si può fare nellasezione Declaration dell'Object GeneraI.La riga da scrivere è:

Dim miodb as DataBase, miatb as Table

AI verificarsi dell'evento Load dellaForm viene aperto l'archivio PERSO-NE.DBF, che si posiziona sul primo re-cord.

Vengono attivate una serie di ({pro-perties» che descrivono struttura e con-tenuto dell'archivio e vengono attivateuna serie di istruzioni che agisconosull'archivio. Ad esempio:

~ ••••••••••• 'i!t!1l!"lt~F:Ill.fEl·imuè••••••••••• L·:.b1 ~Lfile 'ffindow llelp

-I T.ble: PERSONE 1·1- - Database: c:\narks .' -Iables:

Fieldli:New I li.- ll!.•••••1 Dc!el. Il

àdd I I

DATITRE

IFfttName FeldT~ FeldS' + DATIDUECOO Ooo.t>le DATlUNO

NOME Te>d 13COGNOME Te>d 15aTTA Te>d 9L Te>d 2 - "," I .-DATA Do!lIelTirne

A'" Uod ••• D••••• F'" R."•••.• I .

F".eIdN.-.e: VaIue:

COD: 11022 I +,!ndexes:

NONE: ILUIGI I

A,ld I Oelete 1 COGNOME: IROSSI IIf'lde)cName 1nde><F- aTTA: IROMA II~- .coo

L: Is I

DATA: 109105/0' I• I Q: IH I +

I•• IEdiling Reco,d ~~I

Figura 4 - Visual Basic3.0 - Data Manager -Preview sul File.Attraverso la voce dimenu Data Manager siaccede ad un 'applica-zione (è un eseguibilea tutti gli effetti) checonsente di vedere glioggetti inerenti al Data-base. Si può notare co-me nel caso del dBase1/1 il Database sia inrealtà una subdirectoryche può con tenere piùarchivi DBF. Sfruttandola tecnica MDI SI puòaccedere sia alle strut-ture che ai dati dei variarchivi. Le une e gli al-tri sono, in caso di ne-cessità, modificabili.

• I

~.II!!~~~~~~•• ~~tl~,~"f.~*~j;~'t~~~•••••••• Il·~It.=.-~objectl ,Fo<__• __ ,It-.IPtoc: Iload Itl

NOME COGNOME aTTA L OATA QUAL IMPORTO PERe +t ~ROSSI ROMA S ll9i\!5104 H 6S3llOOO.12~3 MARIANO MARRONI ROMA S 25101/28 G 6059000 ~:!..- WDovtCO ROSA ROMA N 23107103 B D;2OOJ ,li~ VALERIO AZZURRI ROMA S 10/07JU; A 3lCWXJ .07

t- ;:~RO=ETO=~:~=~~=:~;~ MARTINO NOcaOlA ROMA N 28J01/11 C 3l16OOl.16 •

+

Figura 6 - Visual Basic3. O - Accesso allaStruttura.Una volta stabilito ilcollegamento sono uti-lizzabili decine di istru-ZIOni che servono nonsolo per accedere aidati ma anche per ac~cedere alla strutturadei record. Un uso piùevoluto di tali istruzioniè quello che prevede lacreazione o la manipo-lazione della struttura.

iC:j-------le-n-u-'.-in-G-n-'g-h-.------aa

~- Slrultur. DB aa'

Sub Funll load ()Set .iodb - OpenDatabase("c :\par-ks". False. False. "dBASE I I I ;")Seot •.•iatb - lUodb .OpenT able("Persone"): C1.Ro. • U&1.Col • 1: C1.Text - "HOME": C1.Col - 2: G1.Text - "COCHOME"G1.Col - 3: C1.Text - "CITTA": G1.Col - a.: C1.Text - "l"C1.Col • 5: CL Text - "DATA": C1.Col - 6: G1. Text - "QUAL"C1.Col • 7: C1. Text - "IMPORTO": G1.Col - 8: C1. Text - "PERC"C1. Col - 9: C1. Text - "CALCOLO"r ., 1: t - l: F1.C1.CoHlidth(5) - 2Uau: T1. Text - "ROMA"While Hot lIlIiatb.EOF

If lIlIiatb(3) - T1. Text ThenF1.G1.Ro. - r: F1.C1.Col - O: G1.Text - rFor c -1 To 9: F1.C1.Col" c: C1.Text - lIlIiatb(c)Hext c: r - r + 1

End Ifniatb. HoueHext""nd

End Sub

~LI

Figura 5 - Visual Basic3.0 - Accesso diretto alfile DBFL'accesso al file DBFpuò essere ottenuto in-dipendentemente dallapresenza sul Form diun oggetto Data Con-trol. In altre parole VB3.0 dispone di una co-spicua dotazione dInuove istruzioni dedi-cate alla gestione deifile dati in formato in-terno (Access), esterno(OBF, Paradox, BTRIE-VE), che si aggiungonoa quelle tradizionali,presenti anche nei vec-chi Basic, di accesso aifile testuali, sequenzialio Random, e binari.

Le funzionalità che agiscono sui Da-tabase DBF sono numerosissime, inquanto permettono in pratica di simula-re tutti i comandi dBASE, sia per lacreazione delle strutture che per la ma-nipolazione dei dati.

Dim SDB as Database, STB as Table, SDFas TableDefs, SFL as Fields

Con queste poche istruzioni siamo ingrado di leggere tutto l'archivio. Nel ca-so presentato poi il contenuto dell'archi-vio viene riversato in una Griglia.

La griglia è un altro Control, presentegià dalla versione 2.0, che dispone diistruzioni di vario tipo che permettonodi spostarsi sulle celle della griglia, chepermettono di leggere il contenutq del-le celle o, al contrario, di definirlo. E uti-lissima quando si vogliano organizzaredati per riga e per colonna.

Nella figura successiva (fig. 6) vedia-mo invece una serie di istruzioni checonsentono di analizzare la strutturadell'archivio DBF.

In questo esercizio i dimensionamen-ti debbono essere:

miatb(l) dà il valore del secondo campo delrecord correntemiatb.Eof dà il valore logico True se ci si tro-va a fine filemiatb. MoveNext posiziona sul record suc-cessivo

/I ruolo dell'SOLFino ad ora abbiamo parlato di opera-

zioni su un solo archivio.Per trattare più archivi Visual Basic si

appoggia all'SOL, confermando ancorauna volta il fatto che questo linguaggiodi interrogazione e di manipolazione de-gli archivi è ormai standard.

Nella figura 7 vediamo sulla destrauna piccola Form, che mostra in alto laistruzione SOL con la quale si seleziona-no quattro campi dell'archivio, sempreDBF, Persone e si filtrano con la condi-

zio ne Città="ROMA".In basso nella figura vediamo la defi-

nizione degli oggetti. In pratica per uti-lizzare il risultato di un'interrogazioneSOL bisogna dapprima dimensionareuna variabile:

Dim DB as Database, OD as Dynaset

poi per eseguire materialmente laistruzione SOL occorre l'istruzione VB

Set DB = OpenDatabase ... (come prima)

316 MCmicrocomputer n. 134 - novembre 1993

WINDOWS

alla figura, abbiamo concentrato in unaSub «scrivi», e i comandi di movimentotra i record della tabella.

Verificata la possibilità di eseguireun'istruzione SOL «facile», ci proponia-mo subito l'obiettivo di eseguire unaistruzione SOL più complessa.

Usiamo questa volta tre archivi DBFe l'istruzione la riprendiamo da un eser-cizio proposto in uno degli articoli pub-blicati da MC su MS Access (figg. 8 e9). Il caso studio è quello presentato nelnostro minicorso di Access al quale virimandiamo per una comprensione delsignificato dei tre archivi.

In effetti, con alcune piccole varianti,l'SOL riconosciuto da Visual Basic è al-trettanto efficiente.

Nella figura 8 vediamo l'ambiente Ac-cess con, sullo sfondo, la struttura deitre archivi usati, e i segmenti che rap-presentano le relazioni, in basso lastruttura della tabella virtuale «Dyna-set» in uscita, e in primo piano l'istru-zione.

Nella figura 9 vediamo la stessa istru-zione eseguita su tre archivi DBF (analo-ghi a quelli usati per Access, solo in for-mato DBF) posta in una Text.Box, as-sieme ad una serie di campi in uscita,riempiti dalla routine Scrivi, mostrata insecondo piano. La routine Scrivi viene«azionata» dai due Bottoni con le frecceche fanno scorrere nelle due direzioni ilrecord corrente.

La sezione dichiarazioni è identica aquella dell'esercizio precedente, inquanto la dichiarazione del Dynaset èindipendente dalla complessitàdell'istruzione e dal numero dei campi.Per chi non conoscesse l'SOL precisia-mo che l'istruzione comprende più«clausole»:

SELECT, che serve per indicare icampi desiderati,

Cl *C2 AS NOME, esempio di cam-po calcolato, che non c'è negli archivima viene prodotto solo in uscita, e alquale in uscita viene attribuito un No-me,

WHERE A lCl =A2.C2, che mette inrelazione i due archivi A 1 e A2, tramiteii loro rispettivi campi Cl e C2,

aRDER BY Cl, per mettere in ordi-ne i dati del Dynaset rispetto ad uncampo di uno degli archivi.

Su SOL dobbiamo dire due o tre co-se. La prima è che a pagina 125 del ma-nuale Professional Features Book 2 c'èuna sezione intitolata Microsoft AccessSOL, che illustra tutte le caratteristichedell'SOL di Access e le confronta anchecon ANSI SOL, quello ufficiale.

La seconda è che SOL in realtà con-sente anche delle operazioni di gestio-ne del Database, con creazione di Ta-belle e loro alimentazione, mentre nei

121.00ij

91.30ij

1. 630. ooij

1.147.31<51

I I OPERAIO II 1

I Qualirtea

Totale

Figura 8 - Visual Basic3.0 - SOL di AccessIl formato DB «nativo»del Visual Basic 3. O èl'Access, inteso comeformato dati e non co-me prodotto. Ci sem-bra quindi logico speri-mentare anche l'alli-neamento delle funzio-nalità che agiscono suldatabase tra Access,prodotto, e VB. Adesempio andiamo a ri-pescare questa interro-gazione SOL, descrittanegli articoli rela tivi adAccess (da MC 128 aMC 130) e vediamoquanto si può riutilizza-re in Visual Basic 3. O.

D~I[TI~I

Base I

Sbaordinario

Anrianita'

SO Matricola 112",1 IACCORSIsCfiv;

I TORINO

••

un oggetto ad una variabile.A questo punto esiste l'oggetto OD,

che è il Dynaset. una tabella «virtuale»creata dalla istruzione SOL. Su tale ta-bella possono agire i comandi di visua-lizzazione, che noi, sempre riferendoci

Nuovo 1"m1fl;)1~10!J

I

dm~jj;itI~Ip,,,,,, ILoad

. .Finestra 1

Dbject: I(generai)

~ELECT OATlOUE.COO. OATlUNO.COGNONE.OATlTAE.COESCR. OATlUNO.Q. DATlUNO.CITTA.OATlOULOAE.DATlDUE.ANNI. OATITALOAA.OATITAE.ANNO.OATITRE.BASE. lANNOJ"(ANNI)AS ANZT • (OAA)"(OAE) AS STAD FAON DATIUNO.OATIDUE. OAlITAE \rIHERE DAlIUNO.eoo •.OATlDUE.COO ANO OATlUNO.Q •. DATITRE.CQUAlOAOER BY COGNOME;

Sub scriui ()text2.Text •. qd("Cod")text3. Text •. qd( ..Cogno •... )textll. Text •. qd("Q")text5. Text •. qd ("Cdescr")text6. Text •. qd("Citta")labe11.Caption • Fot'"lQat(qd("ot'"e") Ill1labe12.Caption ., FOt'"lIl<1t(qd("ora") ~ ~labe13.Caption 'E Fot'"•.•.•.t(qd("·stt'"d··label_.Caption • Fot'"lQat(qd("anni") •..•••.. )labe15.Caption 'E Fot'"lIlilt(qd(··anno··) •..•••••••.. )labe16.Caption • FOt'"fIlat(qd("Anzt··) •..•••••••••••.. )labe17.Caption •• FOt'"Rat(qd("base··) •..•••••••••••.. )tot • qd("anni") + qd("anzt .. ) .• qd("base")labe18.Caption • FOt'"nat(tot. ··•••• 11 •••••.. )

End Sub

Sub Fo •..", Load ()Set Ob-. OpenDatabaseC"c :\parks". FalsI!'. False. "dBASE I I I ;")S$ • "Select persone.cognoN!. persone.nORe. persone.citta.persone.i"Porto ftext1. Text • S$: Seot qd • Db.CreateDynaset(S$): scriui

Eod Sub-I I-l-Piccolo sal

I fe,ecl persone. cognome. ]" - - persone.nome.

Object IPictUfel I~Ip,,,,,, [Clickpersone.citte.persone-importo Irompersone where citta-'ROMA'

Sub Picture1 Click () .qd. MouePreuious IAOSA I 1

30620001scriui

[od Sub . ILUOOVlCO I IAOIIA I. +

~ ~- " - -

Obiect: hgeneral) I~I P,oc: I(decloratior •• ) I~IDilll Ob As Databasl!'. qd As Oynaset. So As Snapshot. I As Integer ~

• I +1

•ll.uery

I.esto SQl:

SELECT DISTINCTROW OATIDUE.COO. OAlIUNO.COGNONE. +OATITAE.COESCA.IANNI)"(ANNOI AS ANZT. [OAE)"(OAA) ASSTRO. OATITRE.BASE.IBASEI+(STROI+(ANZT] AS TOTAlEFRa •• OATlOUE. DATITAE. OATIUNO.OATIUNO INNEA JOIN OATIDUE ON OATIUNO.COD -OATlOUE.COO.OATITRE INNER JOIN DATIUNO OH DATlTAE.CQUAl.OATlUNO.QOADEA BY DATlDUE.COOW1TH DWNERACCESS OPTION;

Per aggiungere una nuova riga pre.ere CTRl+lNV10.

OATIUNO I.11 +.

~ NOME I ICOGNOME HaTTALDATAW-~

aJOOAEANNI

DATITRE

OATlOUE

CQUALCOESCRBASEORAANNO

c""""': ~11IiIlI~~~IT~!l~ (CO~GN~O~M~E~CO~ES~CA~~~ANZ~T'~ 1AN~'NII~1AN~'NO~ÌS~T~AO~:~O:AE~OA.<~~BAS~E~HOrdinamento: Ufm:en:eMo;tra: lX:'l l'X'l

Dì""Oppue:

"'orio

-I file Modifica Y:isuallzzlI

~11!liD1 1l:1~1[I]

.1 I

Figura 9 - Visual Basic3 O - Istruzione SOL«pesante".L'esperimento è riusci-to. In pratica l'istruzio-ne, che vedete nel ri-quadro in alto, apre trearchivi, li collega conrelazioni, ne estrae deidati, altri ne calcola.Poi il VB tradizionale sipreoccupa di piazzarequesti dati nelle varieTextBox e Label.

In pratica bastano due comandi.Ricordiamo che l'istruzione Set è

quella che assegna le caratteristiche di

Set OD DB.CreateDynaseHespressioneSOl)

Figura 7 - Visual Basic3.0 - Accesso via SOL.Il linguaggio SOL si staaffermando come lin-guaggio comune ai variprodotti. Anche VisualBasic 3. O lo riconosceal punto che si posso-no facilmente crearedei Dynaset o degliSnapshot (tabelle vir-tuali di dati, aggiornabilio meno) con delleistruzioni eseguibili suvari tipi di file. In que-sta figura vediamoun'istruzione SOL leg-gera, ma vediamo so-prattutto la semplicitàdelle istruzioni inizialiche servono per defini-re i vari oggetti utilizza-ti (il Database) o creati(il Dynaset).

MCmicrocomputer n. 134 - novembre 1993 317

WINDOWS

Dbjod: Ie-.nd1 Itl p,,,,,, ICict - ..Sub Co-and1 Click () DATO SEDI CONTEGGI

. scot"d.,ntiWIIUe Hot tb .EOF

~ RDIlA ~ 1 239331lDllt2. Te.t • tbC Ilt3.Te.t· tb(1)

IMARIAIIO I GENOVA 131 1381SSlDlIt_o Te.t • tb(2)tS.Te.t· tb(3)

ICREDA I WILANO ~ I 173915(0)1t6. Text • FDr~t(tb(7) •..•••••••••••• ')i • I. indiuiduazione citta' 1'''lANO I TORINO ~ I '28111lDllDo

If labe11 (i) .CapUan • t5. Text Then I 427SlDll NAPOLI ~ I 149m'" 1t1(1).hxt· Ual(t1(1).Trxt) + 1t7(i). Te.t • Ual(t7(i). Te.t) • tb(7) PALERllD ~ 1 121671lDllExit Do

End If BARI 131 129734lDl1i • i • 1loop FIRENZE ~ I ',39S2OOl1. pt"ossillMJ recordtb .HoueHextWond I E••••• I ~ I ll!U6/lDll' conteggio dei totaliFor i - • To 7tI. Tnt - Ual(ta.Text) + Ual(t1(i).Text)t9.Text - Ual(t9.Text) + Ual(t7(i).Teoxt)

Hext iEnd Sub ..+L I I-

nostri due esercizi ci siamo lir.nitati adinterrogazioni.

La terza e ultima considerazione èche siamo un po' agli inizi, non per nullal'articolo è intitolato Primi Approcci. Perusare SOL pesantemente occorre unaperfetta padronanza di tutte le sue nu-merose sfaccettature, padronanza chesi ottiene con il tempo e con l'ausilio ditesti che ancora non esistono. Anche ilmanuale VB dedica a tale complesso ar-gomento poche pagine, destinate peral-tro a chi già conosce SOL, e del tuttoprive di esempi pratici.

/I ruolo degli Array di Control

Facciamo un piccolo intervallo nelquale vi proponiamo un programma di

-I S007.FR1.4 Figura IO - Visual Basic3.0 - Un programma diCalcolo. In questoesercizio vi proponia-mo un programma dicalcolo molto dinami-co. L'interesse del pro-gramma. anche questodescritto con maggiordettaglio nel testo, stanella brillante gestionedegli Array. ContraI.L 'Array. Control è un in-sieme di Control omo-genei ai quali si può as-sociare un unico even-to che riguarda tutti icomponenti che ven-gono identificati da unindice. Le propertiesdei vari componentidell'Array possono a lo-ro volta essere consi-derati dati riferibiliall'Array stessa.

+1 I

Sub Forli Click ()Di•. db As databaseo, tb As tableo, lf As snapshotSeot db - OpeonDatabaseo("c:\ub3\biblio.adb". Trueo. Falseo)tt - db.TableoDeofs.Count - 1 . nUII. di TabeollE!'tc - • . contatoreo tabdleo non di sisteolllaDo

If Hid$(db.TableoDeofs(tc).HaIlM!', 1, tJ) - "HSys" Th~e~n~!lII~"I!fE!lIE~Elseo . tabdla buonat$ - db. TableoDeofs(tc) .Ha_ . definizionePrint "Tabella n."; Tab(12); tc; Tab(16); t$ &bella n. O Author.Set tb _ db.OpeonTablE!'(t$) c"..o n. D Au_IDft _ db.TableoDeofs(t$).F1elds.Count - 1 C.-.po n. 1 AuthorSeot lf _ tb.listFiE!'lds() . lista callpi abella n. 1 PuhU.harfc - • C-.po n .. O PtlbIDDo Whileo Hot lf.EOF c-,o n. 1 PulIll.-h.r

Print" CallpO n."; Tab(12); CaIIlpo n. 2 C~tsPrint fc; Tab(16); lf("Ha_") &bella n. 8 Puh1Uhar:fc - fc + 1 C.-.po n. O PuhIDlf .HoueHext C-sto n. 1 I •••

loop C.-.po n. 2 Ca.vanr I.tb.Closeo C.-po n. 3 Addre ••

~~d _ I~c + 1 CaIIlltO n. 4. Ci.ty

If tc )_ tt TheonExit Do C.-.po n. .5 Sta.teloop C.-.po n. 6 ZipEnd Sub CaIIlpo n. 1 Te1ephone

C.-po n. 8 ru:

C:\pARKS\SD10.FRIo4

Itl p,,,,,, IClick Itl.!..-

una serie di Text.Box con il conteggiodelle frequenze della città, indicate inuna Array di Label, e del totale dell'im-porto per città.

Il valore della città, ad esempio Ro-ma, è una delle «properties» della La-bel. Insomma si può scrivere un'istru-zione del tipo:

If label1(indexl.caption = "ROMA" then ..

senza dover, ad esempio, creare del-le Array tradizionali con il valore dellasingola Città.

E chiaro che il programma diventapiù snello, nel nostro caso invece di ot-to subroutine ne abbiamo una sola.

Il programma esegue come detto loscorrimento dell'archivio, record per re-cord. Poi per ogni record viene eseguitoun ciclo per individuare quel record aquale città corrisponde. Trovata la cittàvengono incrementati sia il contatore

-ID_: IF",.

che simili. Tracciata la prima la si puòcopiare. VB chiede se si vuole creareuna Array.

Se i vari Control attivano la stessaSubroutine è conveniente creare l'Ar-ray. In pratica invece di n Control:

T1.TextT2.TextT3.Text

se ne avrebbe uno solo

identificato da un index che viene de-finito dal VB stesso.

Ne vediamo un esempio chiarificato-re in figura 10. Nel nostro programmavogliamo eseguire uno scorrimento delsolito archivio Persone, del quale ci in-teressano i campi Città e Importo. Du-rante lo scorrimento vogliamo riempire

Figura 12 - Visual Basic ~3.0 - Vivisezione di unfile Access.Questo programma in-dividua l'organizzazionedi un qualsiasi DB Ac-cess (basta cambiare ilnome del file nell'istru-zione OpenDatabase).Ne individua e visualiz-za sia le Tabelle e perciascuna Tabella i cam-pi.

T1(index).Text

calcolo molto dinamico (fig.1 O).L'interesse del programma sta nella

brillante gestione degli Array.Controls.L'Array.Control è un insieme di Controlomogenei ai quali si può associare ununico evento che riguarda tutti i compo-nenti, che vengono identificati da un in-dice.

Le « properties» dei vari componentidell' Array possono a loro volta essereconsiderate parti in causa dell'Arraystessa.

Ad esempio si supponga di dover uti-lizzare otto TextBox, dalle caratteristi-

Figura 11 - Visual Basic 3.0 - Schema della gerar-chia degli oggetti. Nel trattare i Database (non par-liamo più di singolo archivio) occorre capire comesono organizzati gli oggetti. Esiste l'oggetto Data-base, che contiene una "collezione" di oggetti Ta-bella. Ogni oggetto Tabella contiene una collezionedi oggetti Campo e una collezione di oggetti Indice.Ognuno di questi oggetti dispone di "properties"che ne individuano sia le caratteristiche (es. nome,tipo, lunghezza di un campo) sia il contenuto (es.valore del campo).

Oggetto Database

Esistono una serle di Data Access Objed che descrtvono I vari "oggetti'"del Database.l'oggetto principale ,'Il D:Iltabase, poi ci sono le Tabelle, I Campi, I Recordglllndicl.

318 MCmicrocomputer n. 134 - novembre 1993

WINDOWS

un programmino generalizzato che ana-lizza la struttura di un qualsiasi Databa-se Access, individuandone le Tabelle eper ciascuna Tabella i Campi.

In questo caso le definizioni, che ab-biamo, scorrettamente, legate cometutto il programma all'evento Click sulForm, riguardano il Database, la Tabellagenerica e lo SnapShot che è un Tabellavirtuale, risultato di una Query, che dif-ferisce dal Dynaset, per il fatto che nonè aggiornabile.

Aperto il Database c'è un Ciclo cheva avanti fin quando ci sono Tabelle (ilnumero delle tabelle non è noto a prio-ri). Vengono, con un'istruzione IF, salta-te le Tabelle di sistema (interne al fileMDB il cui nome comincia con«MSys»).

Per ogni tabella individuata ne vieneletta la lunghezza in termini di numerodi campi (dbTableDefs(nomtab)Fileds-Count) necessaria per poter scorrere ed

• •

10.838.0001.817.0006.019.0002.211.8201.760.0704.&63.5401.786.8202.380.2006.5<0.0001.!lBB.6401.5<3.1002.697.3302.U6.1301.451.6301.381.1005.005.5102.076.760

Figura 14 - Visual Basic3.0 - Da tre ArchiviSenza programmare Vi·sta dal Data Control.Come d'accordo non siprogramma. L'unicacosa da fare è costrui·re nella property Re-cordSource dell'ogget-to Data Control l'istru-zione 501 che genera ilDynaset. Poi al mo·mento di definire il Re-cordSource di ciascunaText Box si potrà attin·gere alla List Box chemostra tutti i campi re-si disponibili dalla rigaSOL. L'unico appuntosta nella ristrettezzadella riga dell'editordelle properties.

I.,6 FUNZIONARIO8 OPERAIO'O '''PIEGATO'O ,,,PIEGATO'C OPERAIOIlG FUNZIONAR'O8 OPERAIO'C OPERAIO IlH DIRIliENTEC OPERAIO Il8 OPERAIO'E '''PIEGATO IlE '''PIEGATO IlA CO••••ESSOA CO••••ESSO6 FUNZIONARIOO '''PIEGATO'

C:\PARKS\SDll.FRM

I~JPr.", ICick I~ISub For. Cliek ()· di. da- .ttere nella sezione GeneraI· 01. Ob As DatahaSl!'. T1 As Table. T2 As Table, Dio f1(11) As Hold. f2(11) As F10ldSet Dh .• OpenDatabaseC"c:\parks\casost.lMlb") _· prillta tabella OSSISet T1 .• Ob .OpenTableC"Datiuno") RDISet f1(1) .• T1("Cogno.") 1AN0f1Set f1(2) .• T1("I.-porto") CSlASet f1(3) .• T1C"Perc") IAUJSot f1(k) • T1("Q") ROH'· prillil: tabella ~:Set T2 .• Db.OpenTableCIODatitreOl) OSSISot f2(1) • T2("Cquol") URrnESESet f2(2) .• T2C"Cdescrto

) 00Set f2(3) .• 12("8"5e") OLA· chiaue della seconda tabella lU12.Index .• "Pl"'b,aryKey" RIGI~RI· ciclo ORDEAUXDo While Hot T1.EOF OSSI

k$ • f1(k): T2.Sook •••••• k$Print f1(1); Tob(15); fl(k); Tob(ll); f2(2);u • f1(2) • f1(3) • f2(3)Print Tab(35); For...at(u •..•••••••••••.. )T1.HoueHext

loopEnd Sub

-IOb;ect: IF•••

DatabaseN«ne C:IPAAKSICASOSTU.MOB• Il. •

Draglcan (none)Dr~ode O·M......,

DIPENDENTE IAl.BERTIEnoblod T•••E><elniYe Fais.

QUALIFICA~ 1'''PlEG. SUPF_old T,,,"FontHaic False

13.401.000

F__

MS S«ISSed 8ASEFontSize 8.25

13.200.000FonIS.l<••••• F~•• GRATIFICAFonIU_ F~••

STRAORO. EJ ~ 1166.600F"eCok>f &H !lXXXXXl8&H,q; 271l

ANZIANlTA'~ 136.000 11396•000lnolo><Lo/I 120MousePorier 0·001'" TOTAlE 17.1&3.GOON..". Data1Opticns O 1•• 1.10 ••• 1 I~IHIR...IJ'" F'"

T••

In realtà da Visual Basic non si puòaccedere a tutti gli oggetti di un DB Ac-cess, ad esempio non si può utilizzareuna Macro, non si può utilizzare diretta-mente una Form o un Report, e non sipossono eseguire alcuni dei comandieseguibili con Access.

D'altra parte se si deve da Visual Ba-sic usare Form e Report realizzati conAccess diventa inutile il Visual Basicstesso, tanto è fare tutto con Access.

Lo sfruttamento totale delle possibi-lità comporta un discorso molto com-plesso, in quanto occorre valutare cosasi riesce a fare con Visual Basic, e cosanon si riesce a fare con Visual Basic diquanto invece si riesce a fare con Ac-cesso

Per ora, in attesa dei dovuti ap-profondimenti che stiamo facendo e suiquali vi informeremo, limitiamoci ad al-cune cose essenziali.

La prima cosa che facciamo (fig.12) è

Figura 13· Visual Basic3.0-Seek.Oui vediamo come sipossano aprire due Ta-belle e come, partendoda un campo di colle·gamento, si possa ri-cercare il corrisponden·te valore sull'altro Ar·chivio. Insomma il pro-blema del collegamen-to tra due file urelazio·nati" si può risolvere oricorrendo all'SOL, op-pure ricorrendo a que·sta istruzione Seek, ilcui uso è del tutto ana·logo alla Seek del dBa·se 111.

/I formato datidi Visual Basic Access

Come specificato nella prova, dellaquale questo articolo rappresenta il se-guito, il formato «nativo» del Databasedi Visual Basic è Access, inteso comeformato file e non come prodotto Mi-crosoft.

Lo studio delle funzionalità di Databa-se va quindi fatto riferendosi a tale for-mato che deve essere capito soprattut-to nella sua organizzazione.

Con Access si gestiscono Database,composti di varie tipologie di oggetti, leTabelle, le Query, le Schede, i Report.le Macro e le Procedure. Il tutto vienememorizzato in un unico grosso file,che ha desinenza MDB.

Anche Visual Basic utilizza file MDB.Può generare e gestire file MDB, puògestire file MDB realizzati con Access.

delle frequenze, sia il totalizzatore degliimporti. Dopodiché si passa al prossimorecord.

Alla fine vengono calcolati anche Idue totali con un piccolissimo ciclo.

Organizzazione per OggettiCon Visual Basic per maneggiare I

Database (non parliamo più di singoloarchivio) occorre assolutamente capirecome sono organizzati i vari oggetticoinvolti (fig.11).

Esiste l'oggetto Database, che con-tiene una «collezione» di oggetti Tabel-la. Se si usa il formato dBase il Databa-se è la directory con i file, e le Tabelle ifile DBF. Invece Access non usa singoliarchivi ma definisce, nel file MDB, l'in-sieme degli archivi e delle loro caratteri-stiche.

Ogni oggetto Tabella contiene unacollezione di oggetti Campo e una colle-zione di oggetti Indice, identificabili, de-finibili, manipolabili ciascuno con speci-fiche istruzioni.

Ognuno di questi oggetti dispone in-fatti di «properties» che ne individuanosia le caratteristiche (es. nome, tipo,lunghezza di un Campo) sia il contenuto(es. valore del campo).

Il tutto rientra nella filosofia della pro-grammazione Object Oriented, in cuiesistono oggetti, esistono proprietà de-gli oggetti, esistono gerarchie tra gli og-getti. Ad esempio un Campo è un com-ponente di una Tabella, a sua voltacomponente del Database, così comeuna TextBox può essere un componen-te di una Form.

Ancora una volta occorre riferirsi aconcetti generali, riutilizzabili, per cuiuna volta «capiti la prima volta» riman-gono validi per sempre.

MCmicrocomputer n. 134 - novembre 1993 319

WINDOWS

Controllo .•. I .•.

ConclusioniAI solito non abbiamo parlato di tante

cose. Non abbiamo parlato molto di ge-stione (modifica, inserimento, cancella-zione), non abbiamo parlato per nientedell'uso degli Indici.

Abbiamo comunque visto un bel po'di cose per cui possiamo affermare chei nostri primi approcci sono stati positi-vi, vedremo in seguito di renderli ancorapiù produttivi.

Con Visual Basic è possibile gestire,in vario modo, i Database.

Se i Database sono in formato ester-no, DBF, Paradox, BTRIEVE, oppure Ac-cess, l'utente deve padroneggiare in-nanzitutto tale formato, deve sapere co-me è fatto, cosa contiene, quali tipi didati, ecc. Può studiare questa « mate-ria)}, se non dispone di altri prodotti piùvicini ai formati di suo interesse, diretta-mente dal Data Manager (fig.16). rr;rs

moltiplicazione dei due valori (fig.15).Semplicissimo, però vogliamo risolve-

re questi problemi:- i numeri debbono apparire nel forma-

to ###,###,### e debbono essere alli-neati a destra. La soluzione è usarel'istruzione Forma!, che converte un nu-mero in una stringa del formato deside-rato. L'allineamento a destra è una pro-perty della TextBox, che si attiva solo sela property MultiLine è True,

- il prodotto è accettato solo se dà unrisultato superiore a 1.000.000. In casonegativo viene mandato una MsgBox diavvertimento dal quale si esce con il bot-tone OK,

- nel caso in cui il risultato non sia ac-cettato il cursore deve tornare sulla se-conda Text.Box. È l'istruzione SetFocusche porta il cursore nel punto desidera-to,

- vogliamo gestire una Label in cui di-namicamente inseriamo un messaggiorelativo alla situazione in cui ci si trova,

- in ogni caso entrando in una Text-Box vogliamo che il contenuto prece-dente sia già selezionato. Questo che èil comportamento standard nelle DialogBox di Windows si ottiene, un po' mac-chinosamente, usando le specificheSetStart e SelLength, che però attivia-mo sul valore delle Text.Box depuratodei caratteri di separazione.

Gli eventi gestiti sono, in questo caso,il GotFocus, che indica l'entrata nel Con-trol, e il LostFocus, che indica l'uscita.

In entrata si seleziona il contenuto, inuscita si eseguono i calcoli, si sistemanoi formati, si eseguono i test sui valori.

È chiaro che se le TextBox sono tan-te e se subiscono operazioni analoghepuò essere opportuno usare delle Arraydi Control.

Figura 15 - Visual Basic3. O. Oui vediamo comesi possa addomestica-re una Text.Box pergestire un'immissionenumerica controllata.In caso di campi calco-lati o di campi che deb-bano subire dei con-tro/li risultano moltoutili alcuni .. eventi. IlGetFocus, quando ilcursore «entra)) nellaText.Box e quindi oc-corre attribuirgli il valo-re inizia/e, e se del ca-so, selezionar/o, il Lo-stFocus, quando si«esce), e sì possonoesegUIre le istruzioni dicontrollo. L'istruzioneT2.SetFocus, riporta ilcursore nella TextBoxT2.

Valore t.4inimo 1.000.000

Senza programma

Nella figura 14 vediamo invece comesia possibile inserire un'istruzione SQLcome property RecordSource di un Da-ta Control. Questo consente, senza do-ver scrivere una sola riga di programma,si accedere ad un Database con più ta-belle. Poi, continuando a non scriverepezzi di programma, è possibile aggan-ciare gli oggetti del Form ai singoli cam-pi, siano essi campi esistenti o campicalcolati, per vederne il contenuto.

Piccoli trucchi del mestierePrima di chiudere vediamo un piccolo

programma nel quale vengono affronta-ti quei piccoli problemi che si incontra-no quando, in fase di input di dati, oc-corre fare un po' di estetica e un po' dicontrollo sui campi.

Supponiamo di avere tre TextBox,nelle prime due digitiamo dei numeri,nella terza mettiamo il risultato della

Prezzo 200 I

Quantità 1.200 I

Importo 240,000 I

--I Dotobose: C:\pARKS\CASOSTU.Io4DB ~ -Il •Iables: -I Table: DATITRE ~ 1-11

~l-Il Il- -I Toble: DATIUNOli- Relds.: - .' I .= ...

add I Relds.:DATIUNO Relds.:

FleIdName FoIdT &del ICllUAl Te><! FteidN.vne IFoid add ICOEsrn Te><!CBASE o"'"

aTTA T,~ FteldName FoeI •CORA CU"er

L Bro BCOO Te>CANNO Cw"

DATA O'" BORE lnl,a Te><! SANNI I""IMPORTO O"",,. . Pl:RC Sno. . •

- lndexes: . .AlId I Del

lndexes:lndexes:

IrdelcNMle AlId I DelPTinalyK•• IndexName AlId I DeIe1.

Indexl IndexNMlI!PTinalyK•• PTinaIyK••. Aefelence Refelet"Ce .

I. .

=.I ••••••••• E"!IJ!1·"!I. mM!Il;"'I!I!:U!l!li§ •••••••••• l:~ll~=-Ble Window Help

S•• Fot1l Load ()"11..-.: y2 - .: y] •• : f$ = ·fHHt, •••• ,IIft·

End SubS•• T1 GotFoC'u ()

tl-:-Tl!Xt • Stri(Yal("I1.))tl.5elStart •• : tl. Sa1IAulqU • Laa(t1. Tllxt)l4.Captloa - ·Digitan il aumRrO di pci!zzi "M.ti·

ENI S1IbS1II:I T1 LostFoC'u ()

"11.-. Ya.l(t1.Text): tl.Tut - FoDWlt("I1., f$)y) • Y1 • Y2:t).Text - Fonaat(y], f$):14.CaptioJl - ••

ENl S1lbSllb T2 GotFocu ()

t2~Tlllxt • Stri(YaJ.(Y2»12.SalStart - .: 12.5elLaNjtJl .•. Laa(12.Tl!Xt)l4.Captioa. ·Digitan la. qlIaJltita' vu.du.ta..

Eod .""'S1II:I12 Los tFoca ()

.,:; - Yal(U.Tllxt): U.TlIxt - Fonlilt(y2, 1$) ~

;: :]~ :.:~.:]~~. Fonaat(Y3, f$): 14.Captioa.·· 01

MsgBox (·.alOrl! XiaiJllO 1 .•••.••• ·)t2.5et!'ocu

Ead If

Eod .""'

Figura 16 - Visual Baslc3.0 - Da tre ArchiviSenza programmareVista del Database.Volete risolvere tutti ivostri problemi dal Da-ta Control e senza do-ver scrivere una riga diprogramma (o quasi).La prima cosa da fare econoscere bene lastruttura del Databaseche si intende manipo-lare. Per far questousiamo ancora una vol-ta il DataManager, che,rispettando la tecnolo-gia MDI, permette diaprire più oggetti incontemporanea.

elencare tutti i campi.Nella figura vediamo sia il listato tut-

to concentrato sotto l'evento Click sulForm che il risultato sul Form stesso.

Nel successivo esercizio lavoriamocon due archivi. Ci ripromettiano di ana-lizzare il funzionamento dell'istruzioneSeek (fig.13).

In pratica scorriamo un archivio (il so-lito del caso studio) che si chiama Da-tiuno. Questo archivio contiene un cam-po Q, che è in corrispondenza con ilcampo Cqual, dell'archivio Datitre. Ilcampo Cdescr di tale archivio costitui-sce in pratica la descrizione del codiceQ presente nel primo archivio.

L'istruzione Seek, del tutto analoga aquella presente nel linguaggio dBase,permette di localizzare direttamente ilrecord nel file che deve essere neces-sariamente dotato di un Indice.

Insomma si può fare anche questo,collegare due archivi, un po' rudimental-mente (senza scomodare in SQl), maaltrettanto efficacemente.

320 MCmicrocomputer n. 134 - novembre 1993

* PREZZO UTENTE IVA ESClUSA

•per Windows

e Applicazioni Cad

ANCORA?!

Lire 980.000*

SCANMAN?!

((.-MIXEL36040 - Torri di Quartesolo (VI) - Via Roma, 171Te!. 0444/583998 - 380799 r.a.

Pe, en'""e nel

mondo delle tecnologie e dei

prodotti dedicati all'ascolto in

automobile c'è una strada si-

cura: le pagine di Audiocar-

stereo. Recensioni dagli alti

contenuti tecnici, prove di in-

stallazione, un vasto panora-

ma di aggiomamenti mensili -

anche sui prezzi - sono una

lettura obbligata per i profes-

sionisti del settore come per

i semplici appassionati, e co-

stituiscono il migliore osser-

vatorio per ascoltare al meglio.

Infine le sezioni dedicate alla

telefonia cellulare, ai test su-

gli antifurto, alle recensioni mu-

sicali completano Audiocarste-

reo, accompagnando chiun-

que voglia percorrere in auto

la strada dell'alta fedeltà.

technimediaPagina dopo pagina, le nostre passioni.

La stradamigliore

per l'alta fedeltàin auto.

Ti

ìo