Sunteți pe pagina 1din 49

Visual FoxPro Baza de date GESTIUNE Tabela CLIENTI cod_client den_client 1 ALFA SRL 2 GAMA SA 3 BETA SRL 4 DELTA

SRL 5 EPSILON SA 6 SIGMA SA 7 THETA SRL 8 OMEGA SA 9 PI SRL 10 OMICRON SRL Tabela FACTURI_EMISE Nr_factura cod_client 100 1 101 3 102 2 103 2 104 3 105 6 106 9 107 10 108 1 109 5 110 6 111 8 112 1 113 2 114 5 115 2 116 7 117 9 118 10 119 2 120 2 121 1 122 6 123 3 124 5 125 3 data 01/10/05 01/15/05 01/15/05 01/16/05 01/16/05 01/16/05 01/16/05 01/16/05 01/16/05 01/16/05 01/16/05 01/17/05 01/20/05 01/20/05 01/21/05 01/22/05 01/25/05 01/25/05 01/25/05 01/25/05 01/27/05 01/27/05 01/28/05 01/28/05 01/29/05 01/30/05 valoare 25150000 2500000 52500000 25000000 2000000 80000000 47000000 30000000 42000000 14000000 2000000 92500000 3000000 1500000 23000000 11000000 3000000 19000000 23000000 15500000 16250000 17500000 55000000 8200000 38500000 26000000
1

localitate IASI BACAU SUCEAVA BACAU IASI PIATRA NEAMT BACAU IASI BACAU BACAU

126 127 128 129 130

7 8 1 9 4

01/30/05 01/31/05 02/01/05 02/01/05 02/02/05

6500000 37400000 13000000 55000000 72000000

Tabela PRODUSE_DIN_FACTURI_EMISE Nr_factur cod_produs a 11 100 19 100 20 100 12 101 14 102 15 102 17 103 12 104 25 105 15 106 17 106 14 107 21 107 23 108 24 108 18 109 20 109 13 110 16 111 22 111 13 112 18 113 23 114 25 114 15 115 18 116 22 117 25 117 12 118 13 118 15 118 11 119 21 120 24 121

Pret_unitar cantitate 62000 52000 55000 10000 125000 110000 250000 10000 80000 110000 250000 125000 70000 35000 70000 15000 55000 10000 130000 55000 10000 15000 35000 80000 110000 15000 55000 80000 10000 10000 110000 62000 65000 70000 100 100 250 250 200 250 100 200 1000 200 100 100 250 200 500 200 200 200 500 500 300 100 200 200 100 200 200 100 100 100 200 250 250 250
2

22 25 14 16 16 21 11 14 16 20 15 17 Tabela PRODUSE Cod_produ s 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

122 123 124 124 125 126 127 127 128 129 130 130

55000 82000 125000 130000 130000 65000 62000 125000 130000 55000 110000 250000

1000 100 100 200 200 100 200 200 100 1000 200 200

den_produs vopsea alba Var Nisip tabla aluminiu geam sticla 5 mm geam sticla 10 mm tabla inox Ciment Adeziv vopsea neagra Diluant plasa sirma cuie 10 cm vopsea verde var lavabil

unit_masura kg kg kg kg mp mp kg kg kg kg litru kg kg kg cutie

Crearea bazelor de date n Visual FoxPro Visual FoxPro este un SGBD care aplic principiile teoriei relaionale, dispunnd de facilitile unui SGBD relaional performant. n Visual FoxPro se materializeaz conceptul de baz de date (Database Container) n accepiunea unei colecii de tabele sau relaii (Tables) ntre care se realizeaz legturi permanente prin intermediul cheilor primare i strine. Se pstreaz, din raiuni de compatibilitate, comanda SET RELATION care permite stabilirea de relaii temporare. Baza de date folosete un fiier cu extensia .DBC. De asemenea, aceasta posed un dicionar de date (fiier cu extensia .DCT) i un fiier index (cu extensia .DCX). Elementul central al bazei de date este tabela (table). O tabel corespunde noiunii teoretice de relaie. Coloanele tabelei sunt denumite atribute sau cmpuri (fields). Noiunii de tuplu i corespunde cea de nregistrare (record). Fiecare nregistrare are un numr intern (recno) care depinde de ordinea "fizic" n care nregistrrile au fost adugate n tabel. O mare parte din comenzile SGBD-ului au ca domeniu toate nregistrrile tabelei, n timp ce altele doar
3

nregistrarea curent. Caracteristic categoriei de SGBD-uri din care face parte FoxPro este prezena unui pointer intern (un fel de contoar) care memoreaz numrul nregistrrii curente. Informaii despre nregistrri sunt furnizate de funcii, precum: Recno() - furnizeaz numrul intern al nregistrrii curente; Reccount() - furnizeaz numrul total de nregistrri din tabel. O baz de date FoxPro, ca orice baz de date relaional, este alctuit din una sau mai multe tabele puse n legtur prin intermediul cheilor strine. Att declararea cheilor primare, ct i acelor strine (i implicit a restriciilor refereniale) se bazeaz n VFP pe indeci asociai tabelelor care sunt firesc inclui n baza de date. n Visual FoxPro o baz de date este alctuit nu numai din tabele, dar cuprinde i: tabele derivate (views) care pot fi locale sau la distan (remote - sunt utilizate pentru a face legtura cu baze de date gestionate de alte SGBD-uri); conexiuni cu alte baze de date; proceduri stocate care sunt blocuri de program pstrate n dicionarul de date. Cele mai utlizate tipuri de proceduri stocate n VFP sunt funcii i proceduri pentru validarea modificrilor n baza de date, funcii pentru calcularea valorilor implicite ale unor atribute i declanatoare (triggere). Numele tabelelor, atributele care o compun, restriciile de cheie, regulile de validare la nivel de atribut i nregistrare, legturile permanente dintre tabele (cheile strine), declanatoarele, precum i celelalte proceduri stocate sunt pstrate ntr-un fiier special, denumit dicionar de date care n VFP are extensia .DBC (DataBase Container). Tabelele au extensia .DBF, iar indecii .CDX. Mecanismul de baz n declararea domeniilor de valori ale unui atribut are la baz precizarea tipului i lungimii fiecrui cmp dintr-o tabel. Tipuri de date Visual FoxPro Datele sunt stocate pe suporturile de stocare ntr-un anumit format, n funcie de tipul fiecruia. Tipul unei date este o caracteristic ce stabilete modul n care data este nregistrat pe suportul de memorare i modul n care este interpretat i prelucrat. n VFP exist o serie de tipuri de date predefinite, ns exist posibilitatea definirii de ctre utilizator a altor tipuri de date pe baza celor deja existente. Tipurile de date predefinite implementate n VFP sunt numeric, ir de caractere, logic (boolean), dat calendaristic, memo i general. Tipul Character (ir de caracter) este cel mai uzual tip de date folosit n majoritatea tabelelor. Cmpurile caracter pot stoca ntre 1 i 254 caractere. Pot conine orice caracter ASCII. Pentru date de dimensiuni mai mari se recomand cmpurile memo. Exemplu: Den_client, C, 20 Localitate, C, 15 Tipul Numeric (real, n virgul fix) descrie datele reprezentate n virgul fix. Lungimea maxim este de 20 de cifre, din care maxim 19 poziii zecimale, fiecare cifr necesitnd un spaiu de stocare de un octet. n afar de cifre se pot folosi semnele +/- i marca zecimal. Exemplu: Cod_cl, N,3 Pret-unit, N,11,2 N, 11, 2 se interpreteaz astfel: 8 cifre pentru partea ntreag, 2 cifre pentru partea zecimal i marca zecimal. Tipul de dat Numerc este tipul clasic, implementat i n vesiunile anterioare de FoxPro, VFP oferind i urmtoarele tipuri de date numerice: Tipul Integer este destinat reprezentrii numerelor ntregi n cod complementar pe patru octei. Exempul: MARCA, I, 6 Tipul Float (real, n virgul mobil) este destinat reprezentrii numerelor foarte mici sau foarte mari. Este o reprezentare pe 8 octei.
4

Tipul Double (real, dubl precizie) presupune repreyentarea datelor numerice n virgul mobil dubl precizie i ste destinat reprezentrii numerelor foarte mari sau foarte mici. Tipul Currency (format monetar) este utilizat pentru memorarea datelor referitoare la tranzacii n uniti monetare. Tipul Dat calendaristic este implementat prin Date (dat) i DateTime (dat-or) Date este utilizat pentru memorarea datelor calendaristice cuprinse n domeniul 01/01/100 i 31/12/9999. Datele calendaristice se pot afia n diferite formate stabilite prin comanda SET DATE. DateTime permite o gestiune mai analitic a timpului prin includerea alturi de date calendaristic i a momentelor de timp din cadrul unei zile. Ora este stocat n formatul HHMMSS, unde HH reprezint ora n formatul de 24 de ore., ora variind n domeniul 00:00:00 a.m. i 11:59:59 p.m. Exemplu: Data_com, D Data_nast, DT Tipul Logical (logic) desemneaz date ce nu pot lua dect dou valori: True (adevrat) i Flase (fals). Are lungimea de un caracter. Pentru adevrat este asociat litera T sau cifra 1, iar pentru fals litera F sau cifra 0. Exemplu: taxabil, L, 1. Tipul Memo se folosete pentru date tip caracter care depesc 254 de caractere i prevede o dimensiune de stocare variabil de la nregistrare la alta. Un bloc reprezint un numr fix de caractere pe care FoxPro le rezerv pentru un cmp memo. n mod prestabilit, FoxPro utilizeaz 64 de octei pentru un bloc. FoxPro stocheaz valorile cmpurilor memo ntr-un fiier distinct care are extensia .FPT i cu acelai nume cu al tabelei. Utiliznd cmpurile memo se pot memora nu numai texte, ci i alte informaii: fiiere executabile DOS, imagini, bii de sunet etc. Tipul General apare ncepnd cu versiunea FoxPro 2.5 sub Windows. ntr-un cmp de tip general pot fi pstrate obiecte de diferite tipuri: grafic, imagine, sunet, foaie de calcul, adic obiecte create cu alte aplicaii Windows. Datorit folosirii mecanismului OLE (Object Linking and Embedding = legare i ncorporare de obiecte), un obiect poate fi pstrat ntr-un cmp de tip general prin legare sau prin ncorporare. n ambele cazuri ntre baza de date i aplicaia surs cu care a fost creat obiectul se realizeaz o legtur. Aceast legtur permite modificarea obiectelor ncorporate sau legate la baza de date, direct din FoxPro (apelarea apliciei surs cu care se modific obiectul se face din FoxPro). n cazul acestei relaii FoxPro este considerat client pentru c folosete obiecte create cu alte aplicii, acestea fiind servere.Un cmp General este un cmp Memo specializat. FoxPro stocheaz cmpurile General n acelai fiier .FPT utilizat de celelalte cmpuri Memo ale tabelului, ns acestea nu sunt utilizate n acelai fel. Cmpurile General sunt utilizate n primul rnd pentru stocarea referinelor la obiecte OLE legate. Prin legare obiectul nu este inclus fizic n document, ci se memoreaz doar referinele despre obiect necesare localizrii i descrierii obiectului. Prin ncorporare o copie a obiectului este inclus fizic n document. n VFP stocarea datelor se realizeaz de cele mai multe ori n tabelele care compun baza de date. n afar de acestea, n VFP se pot utiliza variabile sau constante. Dac datele memorate n tabele sunt stocate pe disc i le putem considera permante deoarece ele nu se pierd ntre dou sesiuni de lucru, datele memorate n variabile sunt stocate n memoria intern a calculatorului i au un caracter temporar deoarece la nchiderea sesiunii de lucru ele vor fi pierdute. Variabilele i constantele sunt utilizate mai ales n cadrul programelor. Variabilele de memorie pot fi simple sau structurate n tablouri. O variabil are asociat o locaie de memorie n care se poate scrie sau citi o valoare. Referirea la o locaie de memorie n vederea citirii/scrierii unei valori se face doar prin nume, n cazul variabilelor simple de memorie i prin nume urmat de indicii care indic numrul liniei i numrul coloanei (dac este un tablou bidimensional) pentru tablourile de date. De exemplu, tabloul IMP_SAL (2,3) poate stoca 6 valori n acelai timp.
5

Definirea unei variabile de memorie se poate face prin simpla atribuire a unei valori, iar n cazul tablourilor de date se utilizeaz comanda DIMENSION. Exemplu: SAL_BRUT=1000000 DIMENSION IMP_SAL(2,3) IMP_SAL(1,1)=0.15 IMP_SAL(1,2)=0.20 IMP_SAL(1,3)=0.22 IMP_SAL(2,1)=0.25 IMP_SAL(2,2)=0.30 IMP_SAL(2,3)=0.40 ? SAL_BRUT*IMP_SAL(2,1) n plus, FoxPro dispune de numeroase funcii de conversie care dau posibilitatea transformrii datelor de diferite tipuri astfel nct acestea s fie compatibile pentru a fi utilizate n expresii. De exemplu, conversia este necesar la specificarea expresiei indexului compus pentru o tabel, expresie care s combine o dat de tip ir de caractere cu date numerice sau date de tip i de caractere cu date calendaristice. n astfel de expresii toate datele trebuie s fie compatibile din punct de vedere al tipului de dat. Cele mai utilizate funcii de conversie a tipului de dat sunt: Conversia datelor numerice n date de tip ir de caractere STR(expresie numeric [,lungime [, numr_zecimale]]), n care lungime reprezint numrul de caractere pe care-l va conine irul de caractere returnat, iar numr_zecimale num[rul de cifre de la partea fracionar care-l va conine irul de caractere returnat. Conversia datelor de tip ir de caractere n date numerice VAL(expresie_caracter) Conversia datelor calendaristice n date de tip ir de caractere DTOC(expresie_dat[,1], n care parametrul '1' permite conversia unei date calendaristice ntr-un ir de caractere potrivit pentru indexare, n sensul c se pstraz succesiunea cronologic a nregistrrilor din tabel. Conversia datelor de tip ir de caractere n date calendaristice CTOD(expresie_caracter) Crearea unei baze de date se realizeaz cu comanda CREATE DATABASE. Crearea bazei de date O baz de date poate fi creat n oricare din cele trei moduri de lucru ale VFP: asistat, prin comenzi sau prin program. Cel mai simplu mod de lucru este cel asistat. Din proiect se alege cadrul de pagin Data. Dup selectarea pictogramei Databases se acioneaz butonul New, iar dintre cele dou butoane afiate apoi - DataBase Wizard i New Database - se execut clic pe al doilea. n continuare sistemul solicit numele bazei de date - n cazul nostru Gestiune (salvat ntr-un fiier cu extensia .DBC). Drept rezultat, pe ecran apare proiectantul bazei de date Database Designer. n continuare, apelnd la butonul New Table se trece la definirea structurii fiecrei tabele. Definirea minimal a structurii presupune indicarea numelui fiecrui atribut, a tipului i lungimii acestuia. Pentru atributele de tip numeric real se poate preciza i numrul de poziii zecimale.

Insereaz un cmp nou deasupra cmpului selectat

terge cmpul selectat din tabel

Fig. nr..1. Caseta de dialog pentru crearea tabelelor n Visual FoxPro utiliznd Table Designer Din cele trei cadre de pagin - Fields, Indexes i Table este utilizat mai nti primul. Cadrul de pagin Fields este utilizat pentru definirea cmpurilor din tabel, prin intermediul urmtoarelor elemente: Name specific numele cmpului. Spaiile nu sunt acceptate. n Visual FoxPro numele atributelor asociate tabelelor din baza de date container (Database Container) pot depi 10 caractere. Tabelele independente (free tables) trebuie s respecte ns limita de 10 caractere pentru numele cmpurilor, specific versiunilor anterioare lui 3.0. Type specific tipul cmpului. Width specific numrul de caractere sau de cifre pentru fiecare cmp. Decimal precizeaz numrul de cifre de la dreapta punctului zecimal. Se precizeaz doar la datele numerice, cu excepia celor de tip ntreg Index specific dac valorile cmpului sunt ordonate cresctor sau descresctor. NULL - cnd este specificat, atributul respectiv poate accepta valori nule. Imediat dup declararea ultimului cmp, dup salvarea structurii, pe ecran apare mesajul "Input data records now?" . Dac se rspunde cu Yes atunci se pot introduce nregistrri n tabela nou creat. ATENIE! Este recomandat ca introducerea nregistrrilor s se fac dup definirea tuturor tabelelor, a restriciilor i a relaiilor dintre ele, pentru a asigura astfel consistena i corectitudinea datelor introduse. Declararea cheii primare Att n mecanismul de declarare a cheilor primare, ct i n cel de declarare a cheilor strine (relaii sau legturi permanente ntre tabele), un rol esenial l au indecii. Declararea cheii primare n VFP se face crend un index de tip primar.Un index are un nume (tag) i o expresie pe baza cruia este construit. n expresia indexului primar se introduce atributul (sau expresia de atribute dac cheia primar este compus). Declararea indecilor n modul asistat se realizeaz prin utilizarea cadrului de pagin Indexes al proiectantuuli de tabele. Pentru tabela Clieni numele indexului primar este cod_client, tipul acestuia este Primary, iar expresia de indexare este alctuit din atributul-cheie primar al tabelei, cod_client. Sgeile din stnga numelui indexului arat dac indexul este n ordine ascendent sau descendent. Tipul indexului poate fi obinuit (regular), unic sau candidat. Regular indic faptul c VFP stocheaz n index valoarea generat de expresia indexului pentru fiecare linie a tabelului. Dac mai multe nregistrri au aceeai expresie, FoxPro stocheaz expresia de mai multe ori, cu
7

pointeri distinci pentru fiecare nregistrare. n cazul tipului Unique sunt incluse doar valorile distincte ale expresiei de construire a indexului. Dac mai multe nregistrri genereaz aceeai valoare a expresiei indexului, este stocat numai prima ntlnit. Candidate indic faptul c expresia indexului respectiv este o cheie candidat (cheie alternativ), deci creeaz un index unic care include fiecare nregistrare din tabel. FoxPro nu limiteaz expresiile indecilor la un singur cmp. Orice combinaie de cmpuri poate fi folosit drept expresie a unui index. Pentru a crea o expresie complex se folosete caseta de text Expression din Table Designer. Dezavantajul comenzii INDEX este c nu permite declararea unui index primar i, implicit, a cheii sale de indexare ca i cheie primar a tabelei curente. Din acest punct de vedere de mare folos poate fi comanda SQL ALTER TABLE. Spre exemplu, pentru tabela CLIENTI se poate crea indexul cod_client ce poate fi declarat index primar i implicit atributul cod_client este declarat cheie primar astfel: ALTER TABLE CLIENTI ADD PRIMARY KEY COD_CLIENT TAG COD_CLIENT sau ALTER TABLE CLIENTI ALTER COLUMN COD_CLIENT N(5) PRIMARY KEY. Indecii creai prin ALTER TABLE fac obligatoriu parte din indexul structurat al tabelei. Declararea legturilor permanente ntre tabele i a restriciilor refereniale i declararea restriciilor refereniale se bazeaz pe indeci. In baza de date luat ca exemplu pentru tabela Clieni cheia primar este cod_client, pentru tabela Facturi_emise este numr_factur, pentru tabela Produse este cod_produs, iar pentru tabela Produse_din_facturi_emise este i, o cheie compus din atributele cod_produs i numr_factur. Restriciile refereniale se instituie ntre tabelele Facturi_emise i Clieni, ntre tabelele Produse_din_facturi_emise i Produse, respectiv ntre tabelele Produse_din_facturi_emise i Facturi_emise: ntre tabelele Facturi_emise (copil)i Clieni (printe) atributul de legtur este cod_client; ntre tabelele Produse_din_facturi_emise (copil) i Produse (printe) atributul de legtur este cod_produs; ntre tabelele Produse_din_facturi_emise (copil) i Facturi_emise (printe) atributul de legtur este numr factur. Pentru stabilirea legturilor permanente (suportul restriciilor refereniale) este necesar crearea n tabelele printe a indecilor primari i n tabelele copil a indecilor de tip Regular pentru fiecare atribut cheie strin. Pentru tabela Produse_din_facturi_emise, de exemplu, acest lucru este reflectat n fig. nr. Pentru simplificare, numele indecilor obinuii au acelai nume ca i al atributului din expresie.

Fig.nr.2. Indecii tabelei Produse_din_facturi_emise Cel mai simplu mod de creare a legturilor permanente ntre tabele este pornind de la proiectantul bazei de date (Database Designer) printr-o sinpl "tragere" de mouse ntre numele indexului primar din tabela printe i numele indexului regular (obinuit) corespondent din tabela copil. Fig. nr. ilustreaz acest lucru.

Fig. nr. 3. Legturile permanente ntre tabelele bazei de date Linia care unete tabelele Clieni i Facturi_emise este simpl nspre Clieni i trifurcat spre tabela Facturi_emise. Aceasta nseamn c relaia ntre cele dou tabele este de tip one-tomany (una la mai multe). Pentru declararea regulilor de urmat ntr-o restricie referenial se realizeaz un dubluclic pe linia dintre cele dou tabele, n urma cruia va aprea fereastra Edit Relationship (vezi fig. nr.4).

Fig. nr. 4. Fereastra Edit Relationship Tabela printe este Clieni, indexul participant la relaie fiind cod_client, iar tabela copil este Facturi_emise, indexul participant fiind tot cod_client. Dup acionarea butonului Referential Integrity sunt definite regulile pentru: modificarea cheii primare n tabela printe; tergerea unei nregistrri n tabela printe; inserarea unei nregistrri sau modificarea valorii cheii strine n tabela copil. n constructorul de integritate referenial prezentat n figura nr. s-au instituit urmtoarele reguli: modificarea valorii cod_client n tabela Clienti atrage modificarea n cascad a tuturor liniilor-copil (linii n care cod_client avea valoarea dinaintea modificrii) n tabela Facturi_emise;
9

modificarea valorii nr_factura n tabela Facturi_emise atrage modificarea n cascad a tuturor liniilor-copil n tabela Produse_din_facturi_emise; modificarea valorii cod_produs n tabela Produse atrage modificarea n cascad a tuturor liniilor-copil n tabela Produse_din_facturi_emise; nu se terg linii din tabela Clieni dac exist linii-copil corespondente n tabela Facturi_emise; nu se terg linii din tabela Facturi_emise dac exist linii-copil corespondente n tabela Produse_din facturi_emise; nu se terg linii din tabela Produse dac exist linii-copil corespondente n tabela Produse_din facturi_emise; nu se permite inserarea sau modificarea unei linii n tabela Facturi_emise dac valoarea cheii strine, cod_client nu exist n tabela printe Clieni; nu se permite inserarea sau modificarea unei linii n tabela Produse_din_facturi_emise dac valoarea cheii strine, nr_factur nu exist n tabela printe Facturi_emise; nu se permite inserarea sau modificarea unei linii n tabela Produse_din facturi_emise dac valoarea cheii strine, cod_produs nu exist n tabela printe Produse.

Fig. nr.5. Constructorul de integritate referenial Crearea bazei de date prin comenzi/program Crearea bazei de date prin program se poate realiza prin comenzile CREATE DATABASE i CREATE TABLE. CREATE DATABASE GESTIUNE CREATE TABLE CLIENTI (COD_CLIENT N(3), DEN_CLIENT C(15), LOCALITATE C(15),; PRIMARY KEY COD_CLIENT TAG COD_CLIENT) CREATE TABLE PRODUSE (COD_PRODUS N(4), DEN_PRODUS C(25),UNIT_MASURA C(5),;
10

PRIMARY KEY COD_PRODUS TAG COD_PRODUS) CREATE TABLE FACTURI_EMISE (NR_FACTURA N(8), COD_CLIENT N(3), DATA D, VALOARE N(10),; PRIMARY KEY NR_FACTUR[ TAG NR_FACTURA,; FOREIGN KEY COD_CLIENT TAG COD_CLIENT,; REFERENCES CLIENTI TAG COD_CLIENT) CREATE TABLE PRODUSE_DIN_FACTURI_EMISE (COD_PRODUS N(4), NR_FACTURA N(8), PRET_UNITAR N(6), CANTITATE N(4),; PRIMARY KEY STR(COD_PRODUS)+STR(NR_FACTURA) TAG I; FOREIGN KEY NR_FACTURA TAG NR_FACTURA; REFERENCES FACTURI_EMISE TAG NR_FACTURA; FOREIGN KEY COD_PRODUS TAG COD_PRODUS; REFERENCES PRODUSE TAG COD_PRODUS) Prin comanda CREATE TABLE nu pot fi definite restriciile refereniale, ci doar precizate relaiile permanante dintre tabele. Definirea modului de reacie la adugarea /modificarea n tabelele copil sau modificarea /tergerea n tabelele printe presupune utilizarea comenzii CREATE TRIGGER. De exemplu, n tabela FACTURI_EMISE dorim s actualizm nr_factur, adugnd doar facturi cu numr mai mare sau egal cu 120. USE FACTURI_EMISE CREATE TRIGGER ON FACTURI_EMISE FOR UPDATE AS NR_FACTURA>=1200 REPLACE NR_FACTURA WITH 90 && se afieaz un mesaj de eroare Trigger failed REPLACE NR_FACTURA with 130 Structura unei tabele din baza de date poate fi modificat prin comanda MODIFY STRUCTURE, iar vizualizarea acesteia se poate face cu comanda LIST STRUCTURE. Deschiderea unei baze de date se face cu comanda OPEN DATABASE care are urmtoarea sintax: OPEN DATABASE [FileName | ?] [EXCLUSIVE | SHARED] [NOUPDATE] [VALIDATE] Accesul la datele din tabelele bazei de date este permis numai dup deschiderea lor, adic dup asocierea zonei de lucru prin comanda USE. n Visual Fox Pro formatul acestei comenzi este: USE [[DatabaseName.]Table | SQLViewName | ?] [IN nWorkArea | cTableAlias] [ONLINE] [ADMIN] [AGAIN] [NOREQUERY [nDataSessionNumber]] [NODATA] [INDEX IndexFileList | ? [ORDER [nIndexNumber | IDXFileName | [TAG] TagName [OF CDXFileName] [ASCENDING | DESCENDING]]]] [ALIAS cTableAlias] [EXCLUSIVE]
11

[SHARED] [NOUPDATE] nchiderea tabelei se face tot prin comanda USE sau prin comenzile CLOSE TABLES, CLOSE DATABASES sau CLOSE ALL. Fiecare tabel al bazei de date are asociat o zon de lucru prin intermediul creia are loc accesul la date. Gestionarea zonelor de lucru se realizeaz prin comanda SELECT care are urmtoarea sintax: SELECT nWorkArea | cTableAlias Exemplu: SELECT 1 USE CLIENTI SELECT 2 USE FACTURI_EMISE SELECT 3 USE PRODUSE Ultima zon deschis se numete zon curent. Asupra tabelei din zona curent au efect comenzile date. Dac se utilizeaz cmpuri ale tabelelor din alte zone, numele cmpurilor va fi precedat de un prefix ce reprezint numele sau alias-ul tabelului. Exemplu: SELECT 1 USE clienti SELECT 2 USE facturi_emise LIST FOR facturi_emise.cod_client=clienti.cod_cl Actualizarea bazelor de date Actualizarea unei baze de date (respectiv a unei tabele) se realizeaz dup deschiderea acesteia i are n vedere trei aciuni: adugarea de noi nregistrri la cele existente n tabel; tergerea unor nregistrri; modificarea valorii unor atribute. 1.1. Adugarea de nregistrri Adugarea de nregistrri se poate face n dou moduri n funcie de poziia pe care o va ocupa noua nregistrare n baza de date: adugarea de nregistrri noi la sfritul bazei de date introducerea de nregistrri noi n interiorul bazei de date. Prima metod se realizeaz prin comenzile APPEND, APPEND FROM i APPEND FROM ARRAY. La comanda APPEND informaiile sunt furnizate de utilizator, n mod interactiv. Excepie face clauza BLANK cnd se adaug o nregistrare vid la sfritul bazei de date. Comanda APPEND FROM se folosete cnd informaiile sunt luate dintr-o alt baz de date sau din alt fiier. Comanda APPEND FROM ARRAY preia informaiile dintr-un masiv (tablou) i le introduce n baza de date. Cea de-a doua metod perimite inserarea de nregistrri n interiorul bazei de date, folosind comanda INSERT. Comanda INSERT are ca efect inserarea unei nregistrri noi dup nregistrarea curent. Clauza BEFORE din comand permite inserarea unei nregistrri naintea nregistrrii curente. Utiliznd modul asistat, adugarea de nregistrri se realizeaz utiliznd meniul Table, opiunile Append New Record (CTRL/Y) sau Append Records.

12

Exemplu: Actualizai tabela CLIENI prin adugarea unei nregistrri, a unei nregistrri vide i inserarea unei nregistrri vide dup nregistrarea a doua a tabelei. USE CLIENTI APPEND APPE BLANK GOTO 2 INSERT BLANK Creai tabela CLIENTI1 care cuprinde cmpurile COD_CLIENT i DEN_CLIENT. USE CLIENTI COPY STRUCTURE EXTENDED TO INTERM USE INTERM LIST STRU LIST DELETE RECORD 3 PACK CREATE CLIENT1 FROM INTERM LIST STRU APPEND FROM CLIENT 1.2. tergerea nregistrrilor tergerea unei nregistrri se poate realiza n dou etape: La nivel logic cnd nregistrarea nu este propriu-zis tears din baza de date, ci ea este marcat pentru tergere (comanda DELETE). Exist comenzi i funcii FoxPro care nainte de accesarea unei nregistrri testeaz marcajul de tergere al acesteia i n funcie de el consider nregistrarea absent sau prezent n fiier (de exemplu, funcia DELETED() care returneaz valoarea adevrat dac nregistrarea curent este marcat pentru tergere sau fals dac nregistrarea nu este marcat); La nivel fizic cnd nregistrarea este tears efectiv din baza de date, ea nemaiputnd fi accesat sau refcut (comanda PACK). Marcarea pentru tergere a uneia sau a mai multor nregistrri se face cu ajutorul comenzii DELETE. Accesul la nregistrrile marcate pentru tergere este controlat de comanda SET DELETED (cu sintaxa SET DELETED ON/OFF). Astfel, nregistrrile marcate pentru tergere nu vor fi accesibile celorlalte comenzi care folosesc domeniul nregistrrilor dac se alege opiunea ON a acestei comenzi. Exemplu: Actualizai tabela CLIENI prin tergerea clienilor care au codul mai mare dect 7. USE CLIENTI CLEAR SET DELETED OFF DELETE FOR COD_CLIENT>7 NOTE se marcheaz pentru tergere nregistrarile pentru care codul clientului este; mare dect 7 LIST NOTE toate nregistrrile din baza de date sunt afiate, cele marcate pentru tergere avnd un asterisc n dreptul lor USE Exemplu: Actualizai tabela CLIENI prin tergerea nregistrrilor al cror numr de nregistrare este mai mare dect 8. USE CLIENTI DELETE FOR RECNO()>8 && sunt marcate pentru tergere nregistrrile ;
13

cu numrul de nregistrare mai mare dect 8 SET DELETED ON LIST && nregistrrile marcate pentru tergere nu pot fi accesate prin aceast comand USE O nregistrare marcat pentru tergere nu este tears fizic din baza de date. Eliminnd marcajul de tergere, nregistrarea este refcut, ea redevenind accesibil pentru toate comenzile. nlturarea marcajului de tergere se realizeaz prin comanda RECALL. Exemplu: Actualizai tabela CLIENTI prin tergerea logic a nregistrrilor cu numrul de nregistrare mai mic dect 3. Dup aceea refacei toate nregistrrile marcate logic. USE CLIENTI DELETE FOR RECNO()<3 LIST RECALL ALL && sunt refcute toate nregistrrile LIST USE tergerea la nivel fizic se realizeaz prin comanda PACK care efectueaz tergerea fizic a tuturor nregistrrilor marcate pentru tergere din baza de date. n acest caz trebuie folosite succesiv comenzile DELETE i PACK. Exemplu: Actualizai tabela CLIENI prin eliminarea definitiv a nregistrrii numrul 4. USE CLIENTI DELETE RECORD 4 && se marcheaz pentru tergere nregistrarea a 4-a PACK && se terge fizic a 4-a nregistrare LIST USE O alt comanda cu privire la tergerea nregistrrilor din baza de date este comanda ZAP care terge toate nregistrrile din baza de date activ. Comanda ZAP realizeaz tergerea fizic a nregistrrilor din tabelele bazei de date ntr-o singur etap. Astfel secvena de comenzi: USE CLIENTI ZAP este echivalent cu: USE CLIENTI DELE ALL PACK Utiliznd modul asistat, tergerea nregistrrilor se realizeaz cu opiunile Delete Records..., Recall Records... i Remove Deleted Records din meniul Table. 1.3. Modificarea coninutului tabelelor din bazele de date Modificarea informaiilor stocate n baza de date se realizeaz cu comenzile CHANGE, EDIT, BROWSE. Fiecare lucreaz cu o fereastr de editare n care utilizatorul va modifica informaiile din baza de date. n modul BROWSE afiarea se face sub form tabelar i permite accesul la mai multe nregistrri. n modul EDIT se afieaz o singur nregistrare. Aceste comenzi permit i adugarea de noi nregistrri n baza de date. Exemplu: USE CLIENTI CHANGE FREEZE cod_client && n tabela CLIENTI se poate modifica doar cmpul cod_client CHANGE FIELDS COD_CLIENT :r && n tabela CLIENTI cmpul cod_client poate fi vizualizat, fr a putea fi modificat. Pe lng modificarea manual a coninutului unei baze de date, FoxPro mai ofer i o metod automat de modificare. Prin aceast metod se pot modifica valori ale anumitor cmpuri, calculate automat de FoxPro pe baza unor expresii furnizate de utilizator. Pentru
14

aceasta se alege opiunea Replace Field a meniului Table pentru a fi deschis pe ecran fereastra cu acelai nume.

Fig. nr. 6. Fereastra Replace Field Din lista ascuns Field se selecteaz cmpul care va fi modificat. Valorile care vor fi introduse n cmpul selectat vor fi precizate prin intermediul comutatorului With. Scope, For i While permit stabilirea nregistrrilor afectate de aceast comand. Interogarea bazelor de date Prin interogarea bazelor de date utilizatorii pot s aib acces la datele stocate corespunztor cerinelor informaionale specifice. Comenzile de interogare cel mai des folosite sunt: LIST, DISPLAY, LOCATE, CONTINUE, CREATE QUERY. Cea mai simpl metod de interogare a datelor coninute ntr-o tabel este utilizarea comenzilor LIST sau DISPLAY. Acestea afieaz coninutul tabelei din zona de lucru curent. Cele dou comenzi au aceeai sintax cu deosebirea c la comanda LIST domeniul implicit este ALL, iar la DISPLAY domeniul implicit este nregistrarea curent. De asemenea, comanda LIST nu afieaz nregistrrile marcate pentru tergere cnd SET DELETED ON este activ, pe cnd DISPLAY le afieaz. Sintaxa acestor comenzi este urmtoarea: LIST [FIELDS <expr list> | FIELDS LIKE <skel> | FIELDS EXCEPT <skel>] [<scope>] [FOR <expL1>] [WHILE<expL1>] [OFF] [NOCONSOLE] [NOOPTIMIZE] [TO PRINTER [PROMPT] | TO FILE <file>] Exemplu: Interogai tabela FACTURI_EMISE i obinei o list care s cuprind date privind numrul facturii, data i valoarea facturilor emise pentru clientul cu codul 5. S se interogheze tabela pn cnd se gsete prima factur a crei dat de emitere este anterior datei de 16 ianuarie 2005. S se afieze apoi doar date referitoare la nregistrarea cu numrul 5 din tabela Facturi_Emise. USE FACTURI_EMISE LIST FIELDS NR_FACTURA, DATA, VALOARE FOR COD_CLIENT=5 NOTE se listeaz valorile cmpurilor din list (numr factur, data facturii ; i valoare factur) doar pentru clientul cu codul 5. GO TOP && pointer-ul de nregistrare este poziionat pe prima nregistrare

15

LIST while data <{01/16/05} TO PRINTER && rezultatul listrii se trimite la imprimant DISPLAY RECORD 5 && se afieaz doar valorile pentru nregistrarea numrul 5 Cutarea nregistrrilor dintr-o tabel care respect o anumit condiie se mai poate face utiliznd comenzile LOCATE i CONTINUE. Comanda LOCATE are sintaxa: LOCATE FOR <expL1> [<domeniu>] [WHILE <expL2>] [NOOPTIMIZE] La gsirea unei nregistrri care respect condiia <expL1>, indicatorul de nregistrri se va poziiona pe nregistrarea respectiv, iar funcia FOUND() va returna valoarea .T. Dac n tabela respectiv exist mai multe nregistrri care respect o condiie dat, cutarea acestora se va realiza utiliznd prima oar comanda LOCATE i apoi comanda CONTINUE. Exemplu: S se gseasc toate nregistrrile din tabela FACTURI_EMISE pentru care codul clientului este egal cu 9. USE FACTURI_EMISE LOCATE FOR COD_CLIENT=9 && se caut prima nregistrare pentru care ; codul clientului este egal cu 9 ?FOUND() .T. DISP DO WHILE .NOT. EOF() CONTINUE && se caut urmtoarea nregistrare care satisface criteriul ?FOUND() DISP ENDDO FoxPro pune la dispoziia utilizatorului faciliti importante referitoare la extragerea informaiilor din tabele. O tehnic simpl i eficient este reprezentat de generatorul de filtre (query). Visual FoxPro a dezvoltat noiunea de interogare introducnd mijloace de facilitare a obinerii unui query; de asemenea s-a introdus noiunea de vizualizare (view). Spre deosebire de query cu ajutorul unui view se realizeaz o interogare activ a tabelelor dintr-o baz de date n sensul c modificarea rezultatului unui cmp al unui view atrage dup sine modificarea valorii respective n tabela iniial. FoxPro cuprinde n compilatorul su un set de comenzi ale limbajului SQL utilizat pentru interogarea bazelor de date i a tabelelor. Comanda SQL SELECT este o comand cu o sintax foarte complex care permite interogarea tabelelor i trimiterea rezultatului acestor interogri la o destinaie prestabilit (ntr-o nou tabel, ntr-un raport, ntrun grafic erc). Un query este o modalitate prevzut de limbajul FoxPro pentru a scrie fr btaie de cap o comand SELECT. Crearea interogrilor se realizeaz n Visual FoxPro cu Query Designer. ntruct interogrile se fac asupra mai multor tabele mai nti sunt selectate acestea n fereastra de dialog care va aprea, dup care se stabilesc relaiile ntre tabele (condiiile de join). Se definesc apoi cmpurile incluse n query cu Fields, criteriile de selectare (cu Filter n Query Designer), iar rezultatele sunt ordonate cu Order By. nregistrrile similare sunt grupate dup unul sau mai multe cmpuri (utiliznd Group By), dup care se stabilete destinaia rezultatelor interogrii (o fereastr de browse, o tabel temporar read-only, o tabel read-write, un grafic, un raport, o etichet). n orice moment se poate vizualiza comanda SQL SELECT corespunztoare operaiunilor efectuate. O alt modalitate de interogare a bazelor de date este realizarea de rapoarte sau etichete utiliznd comenzi specifice sau generoatorele corespunztoare (Report Designer sau Label Desiner). Se pot obine rapoarte rapide (selectnd opiunea Quick Report) sau personalizate n funcie de cerinele utilizatorului. Interogarea datelor utiliznd rapoarte sau etichete se realizeaz
16

n dou etape: crearea acestora utiliznd comanda CREATE REPORT, respectiv CREATE LABEL sau utiliznd modul asistat (File/New/Report sau Label), dup care se realizeaz afiarea datelor n formatul creat, utiliznd comenzile REPORT FORM, respectiv LABEL FORM. n raport datele pot fi grupate utiliznd opiunea Data Grouping. Sortarea i indexarea bazelor de date Sortarea i indexarea sunt legate de dou elemente foarte importante n lucrul cu bazele de date. Pe de o parte, informaiile cuprinse n baza de date trebuie prezentate diferit, ordonate dup criterii multiple, n funcie de inteniile utilizatorului sau de aplicaiile care le consult/prelucreaz. n al doilea rnd, atunci cnd baza de date capt proporii serioase, iar numrul celor care lucreaz simultan cu baza este considerabil, viteza de acces la date este vital. Sortarea este operaiunea prin care dintr-o tabel se obine o alt tabel care va avea nregistrrile (liniile) ordonate dup o anumit cheie de sortare (un atribut al tabelei). Tabela rezultat poate avea aceeai structur ca tabela surs, ns exist i situaii n care sunt selectate numai anumite atribute sau generate altele noi, prin expresii. Spre deosebire de sortare, prin indexare nu se creeaz o alt tabel, ci se asociaz un tabel special care conine indecii, respectiv cheia de indexare dup care se ordoneaz nregistrrile i adresa corespunztoare nregistrrilor. Cheia de indexare poate fi un atribut sau o expresie format din atributele tabelei. Un fiier tip index nu conine nregistrri, ci ordinea acestora, n funcie de o anumit cheie (atribut/combinaie de atribute). 1 Sortarea bazelor de date Formatul general al comenzii SORT este: SORT TO <file> ON <field1> [/A | /D] [/C] [, <field2> [/A | /D] [/C] ...] [ASCENDING | DESCENDING] [<scope>] [FOR <expL1>] [WHILE <expL2>] [FIELDS <field list> | FIELDS LIKE <skel> | FIELDS EXCEPT <skel>] [NOOPTIMIZE] Argumente: file reprezint numele tabelei destinaie care va conine nregistrrile sortate. Pe disc se va crea un nou fiier cu extensia .DBF. field1 specific atributul din tabela surs pe baza valorilor cruia se face sortarea, altfel spus, cheia de sortare. Implicit, ordinea de sortare este cresctoare. Nu pot fi chei de sortare atribute de tip Memo sau General. field2, field3 reprezin cheia secundar, teriar etc. de sortare, i au importan la ordonarea liniilor atunci cnd valorile lui field1 (field2. etc.) sunt egale. [/A | /D] [/C] Pentru fiecare cmp dup care se face sortarea se poate preciza modul de ordonare a valorilor: ascendent /A sau decendent /D. Prin opiunea /C, la ordonare nu se face distincie ntre literele mici i majusculele atributului de sortare. Se pot utiliza i opiuni compuse: /AC sau /DC. [scope] reprezint domeniul comenzii. Pentru comanda SORT domeniul implicit este ALL. FOR <expL1> determin sortarea, din tabela surs, numai a nregistrrilor care ndeplinesc condiia exprimat n expL1. WHILE <expL2> specific o condiie prin care nregistrrile din tabela surs sunt incluse n tabela rezultat atta timp ct este ndeplinit expL2. field list sunt atributele din tabela surs ce vor apare n tabela sortat. Dac acest clauz lipsete, vor fi preluate toate atributele.
17

FIELDS LIKE <skel> specific o masc pe care numele atributelor din tabela surs trebuie s o verifice pentru a incluse n tabela sortat. FIELDS EXCEPT <skel> specific care din atributele care verific masca introdus n clauza FIELDS LIKE nu vor fi totui incluse n tabela sortat (excepiile de la masc). Caracterele de tip specificator multiplu (sau joker) - wildcards sunt * sau ?. NOOPTIMIZE dezactiveaz motorul de optimizare FoxPro (Rushmore) Avantajul sortrii l constituie prezentarea nregistrrilor ntr-o ordine dorit de un utilizatori/aplicaie. Tabela sortat nu face parte din structura bazei de date, deci nu exist riscul alterrii neautorizate a bazei, ns nici posibilitatea de a o actualiza. Dezavantajul principal al sortrii este legat de volumul mare de disc ocupat, care, atunci cnd tabela surs este voluminoas iar tabela-destinaie are acelai numr de atribute i de liniii ca i cea surs, poate ncrca periculos discul. Exemplul 1 Se d tabela CLIENTI. S se obin o tabel numit ClientiS cu aceeai structur ca i Clienti, dar cu nregistrrile ordonate descresctor n funcie de valoarea atributului cod_client. USE CLIENTI SORT TO ClientiS ON cod_client /D Tabela rezultat al sortrii, ClientiS, este prezentat n fig. nr. 7.

Fig. nr.7. Sortarea tabelei CLIENTI dup cod_client Exemplul 2 Pornind de la tabela CLIENTI, s se obin o tabel denumit ClientiS2 cu nregistrrile ordonate n ordinea descresctoare a valorilor atributului Cod_Client, dar care conine numai clienii care i au sediul n municipiul Iai, iar n structura sa sunt incluse numai atributele care se termin cu urmtoarele trei caractere: _cl (respectiv Cod_client i Den_client). SELECT CLIENTI SORT TO ClientiS2 ON Cod_client /D for localitate="Iasi" fields like "*_cl" ClientiS2 va conine deci numai dou atribute i trei linii (cele pentru care valoarea atributului (cmpului) Localitate este Iai.

18

2. Indexarea bazelor de date Indexarea este o facilitate frecvent folosit pentru afiarea datelor ntr-o anumit ordine, dar i pentru un acces rapid la date. n plus, indexarea este util i pentru crearea unor relaii temporare ntre tabele. n FoxPro exist dou tipuri de indeci: simpli i compui. Indecii simpli sunt creai pe disc sub forma unor fiiere cu extensia .IDX i conin o singur tabel de indexare. Indecii compui sunt alctuii din mai muli indeci elementari (tag-uri). .2.1. Crearea indecilor Cea mai cunoscut modalitate de creare a indecilor este utilizarea comenzii INDEX ON a crei sintax este: INDEX ON <expr> TO <idx file> | TAG <tag name> [OF <cdx file>] [FOR <expL>] [COMPACT] [ASCENDING | DESCENDING] [UNIQUE] [ADDITIVE] Argumente: <expr> reprezint cheia de indexare, alctuit din unul sau mai multe atribute ale tabelei curente. Pe baza cheii de indexare se afieaz nregistrri sau se face accesul la date. Atributele de tip Memo nu pot face parte singure din cheia de indexare, ci trebuie combinate cu cele de tip caracter. Nu se recomand utilizarea, n construirea cheii de indexare, a variabilelor de memorie sau a atributelor din alte tabele. Lungimea unei chei de indexare poate fi ntre 1 i 100 de caractere pentru indeci simpli i ntre 1 i 240 de caractere pentru indecii elementari ce fac parte dintr-un fiier .CDX. TO <idx file > creaz un fiier de tip .IDX. TAG <tag name> [OF <cdx file] creeaz un index elementar (tag) inclus ntr-un index compus (fiier cu extensia .CDX). Fiecare index elementar are un nume unic, alctuit din pn la 10 caractere (litere, cifre i liniua de subliniere (undescore)). Numrul indecilor elementari este limitat numai de memorie i spaiul disponibil pe disc. Indecii compui sunt compactai, deci pentru ei nu se utilizeaz clauza COMPACT. Exist dou tipuri de indeci compui: structurali i nestructurali. Prin neutilizarea clauzei OF <cdx file> va fi creat un index compus structural, care are ntotdeauna acelai nume ca cel al tabelei creia i este asociat i este deschis automat la deschiderea tabelei. Prin includerea clauzei OF <cdx file> se creaz un index compus nestructural ce trebuie deschis explicit prin comanda SET INDEX sau utilizarea clauzei INDEX la comanda USE. Dac fiierul-index compus este deja creat i deschis, atunci orice comand INDEX ... TAG <tag name> adaug un index elementar la cele existente n indexul compus. <cdx file> este numele unui index compus nestructurat asociat FOR <expl> Prin utilizarea acestei clauze, n index sunt incluse numai nregistrrile care satisfac condiia specificat. COMPACT permite crearea unui index compact de tip .IDX. ASCENDING are ca efect dispunerea valorilor cheii de indexare n ordinea cresctoare n tabela de indexare pentru un index CDX. Utiliznd DESCENDING ordinea se inverseaz. Clauza DESCENDING nu poate fi utilizat n cazul indecilor simpli (.IDX). Ordinea descresctoare poate fi totui specificat prim comenzile SET INDEX i SET ORDER. UNIQUE Utilizarea acestei opiuni are ca efect includerea n index numai a unei valori a cheii de indexare (atunci cnd sunt dubluri). ADDITIVE pstreaz deschise orice indeci deschii anterior, care, altminteri ar fi nchii automat, cu excepia indecilor elementari din indexul compus structural.
19

Obs. Numrul indecilor deschii simultan este limitat numai de resursele sistemului (memoria, n principal). Exemplu: Lum n discuie tabela CLIENI. Realizai indexarea dup valorile atributului (cmpului) Localitate cu un index simplu i dup valorile atributelor Cod_client i Den_client utiliznd indexul structural. Indexul simplu (.IDX), denumit Localit este obinut pe baza atributului Localitate prin secvena: SELECT CLIENTI INDEX ON Localitate to Localit n timp ce indexul structural compus, ce are doi indeci elementari, cod_client i den_client, este obinut prin comenzile INDEX urmtoare: INDEX ON cod_client tag codcl INDEX ON den_client tag dencl 2.2. Deschiderea indecilor, stabilirea indexului principal, actualizarea indecilor Deschiderea indecilor i stabilirea indexului principal Deschiderea indecilor se realizeaz diferit, n funcie de tipul acestora. n orice caz, un index nu poate fi deschis dect mpreun cu tabela din care provine. Pentru indecii compui structurali, deschiderea este automat i simultan cu deschiderea tabelelor crora le sunt asociai. Pentru ceilali indeci, cel mai simplu mod pentru deschidere este la utlizarea comenzii USE. USE [INDEX <index file list> | ? [ORDER [<expN> | <idx index file> | [TAG] <tag name> [OF <cdx file>] [ASCENDING | DESCENDING]]]] USE ... [INDEX IndexFileList | ? [ORDER [nIndexNumber | IDXFileName | [TAG] TagName [OF CDXFileName][ASCENDING | DESCENDING]]]] INDEX <index file list> specific un set de indeci ce se dorete a fi deschii odat cu tabela. <index file list> poate conine orice combinaie de indeci simpli i compui. Primul din setul enumerat va fi indexul principal, n funcie de care vor fi accesate i afiate nregistrrile tabelei. Atunci cnd primul n list este un fiier index compus, ntregistrrile sunt afiate i accesate n ordinea lor fizic. INDEX ? afieaz un dialog pe baza cruia utlizatorul poate alege indexul dorit. ORDER [<expN>] specific indexul principal, care este simplu (.IDX) sau compus (.CDX), altul dect primul din lista din clauza INDEX <index file list>. Indecii simpli (.IDX) sunt numerotai n funcie de ordinea enumerrii lor n <index file list>, iar indecii elementari sunt numerotai n funcie de ordinea crerii lor. Dac <expN> este 0, nregistrrile sunt accesate i afiate n ordinea lor fizic, dei indecii elementari rmn activi. ORDER [<idx index file>] declar un index simplu, de tip .IDX, ca index principal al tabelei. ORDER [TAG <tag name>] [OF <cdx file>] specific indexul elementar, din cele aflate ntr-un index compus (.CDX). Dac exist indeci elemenrari cu acelai nume, aflai n indeci comui diferii, atunci este necesar clauza OF <cdx file>. ASCENDING respectiv DESCENDING determin modul n care vor fi accesate i afiate nregistrrile tabelei. Exemple: USE CLIENI INDEX Localit sau
20

USE CLIENI ORDER TAG CodCl Pentru deschiderea unuia sau mai multor fiiere de tip index pentru tabela curent, se poate folosi i comanda SET INDEX TO. SET INDEX TO [<index file list> | ?] [ORDER <expN> | <idx index file> | [TAG] <tag name> [OF <cdx file>] [ASCENDING | DESCENDING]] [ADDITIVE] Obs. SET INDEX TO fr nici un argument nchide toate fiierele index deschise pentru tabela curent, cu expecia celui structural. Stabilirea indexului principal al tabelei curente se realizeaz prin comanda SET ORDER TO TAG. SET ORDER TO [<expN1> | <idx index file> | [TAG] <tag name> [OF <cdx file>] [IN <expN2> | <expC>] [ASCENDING | DESCENDING]] Argumente: <expN1> - vezi USE, SET INDEX... IN <expN2> | <expC>. Aceast clauz stabilete indexul principal pentru o tabel deschis ntr-o alt zon dect cea curent. Obs. O tabel poate avea mai muli indeci deschii simultan. Cu toate acestea, numai unul este principal, n funcie de care are loc accesul i afiarea. SELECT CLIENI SET INDEX TO Localitate sau SET ORDER TO TAG dencl Reindexarea Indecii pierd ultimele actualizri, cnd, la modificarea tabelei (modificri ale atributelorcheie de indexare), acetia nu sunt deschii. n asemenea situaii, actualizarea se realizeaz prin comanda REINDEX. Aceasta actualizeaz toi indecii deschii n zona curent. 2.3. Accesul la date pe baza indecilor Principalul atu al utilizrii indecilor ine de posibilitatea accesului la nregistrrile dorite cunoscndu-se valoarea cheii de indexare. Comanda care permite acest lucru este SEEK. SEEK <expr> SEEK caut ntr-o tabel prima apariie a unei nregistrri a crei cheie de indexare corespunde expresiei de cutare, apoi deplaseaz pointerul tabelei pe respectiva nregistrare. <expr> specific cheia dup care SEEK efectueaz cutarea. Obs. n tabela se va identifica prima nregistrare pentru care valoarea atributului (atributelor) cheie se potrivesc exact valorii expresiei de cutare, cu excepia cazurilor n care parametrul SET EXACT este setat pe OFF. Dac SEEK gsete o nregistrare pentru care cheia se potrivete, funcia RECNO( ) ntoarce numrul respectivei nregistri, iar funcia FOUND( ) ntoarce true (.T.), iar EOF( ) false (.F.). Cnd nici o nregistrare tabelei nu prezint a valoarea potrivit expersiei de cutare, RECNO( ) ntoarce numrul total al nregistrrilor din tabela curent plus 1, FOUND( ) ntoarce false (.F.), iar EOF( ) ntoarce true (.T.).

21

Dac parametrul SET NEAR este pe ON, pointerul este poziionat pe nregistrarea care se aproie cel mai mult de expresia specificat. Dac SET NEAR este OFF, pointerul este poziionat la sfritul fiierului. Exemple: SELECT CLIENTI SET ORDER TO TAG CODCL SEEK 10 SGBD-ul v cuta n tabela de indeci a indexului elementar CODCL, pe prima coloann (cea a cheii), valoarea 10. O gsete i preia numrul nregistrrii (Record_no). Cutarea dup o valoare de tip ir de caractere se face astfel: SELECT CLIENTI SET ORDER TO TAG DENCL SEEK Gama SRL SQL. Fraza SELECT Exemplul 1 Care sunt clienii din Iai ? SELECT COD_CLIENT, DEN_CLIENT ; FROM CLIENTI; WHERE LOCALITATE = "IASI Exemplul 2 Care sunt produsele facturate dup 23 ianaurie 2005?Rezultatul se va regsi n tabela prodfact.. SELECT Produse.den_produs, FACTURI_EMISE.data; FROM FACTURI_EMISE INNER JOIN produse_din_FACTURI_EMISE; INNER JOIN produse ; ON Produse.cod_produs = Produse_din_FACTURI_EMISE.cod_produs ; ON FACTURI_EMISE.nr_factura = Produse_din_FACTURI_EMISE.nr_factura; WHERE FACTURI_EMISE.data >= {^2005/01/23}; INTO TABLE prodfact.dbf USE prodfact LIST Exemplul 3 Care sunt produsele facturate ntre 23.01.2005 i 31.01.2005 ? SELECT Produse.den_produs, FACTURI_EMISE.data; FROM FACTURI_EMISE INNER JOIN Produse_din_FACTURI_EMISE; INNER JOIN Produse ; ON Produse.cod_produs = Produse_din_FACTURI_EMISE.cod_produs ; ON FACTURI_EMISE.nr_factura = Produse_din_FACTURI_EMISE.nr_factura; WHERE FACTURI_EMISE.data BETWEEN {^2005/01/23} AND {^2005/01/31} Exemplul 4 Care sunt clienii al cror nume ncepe cu litera S i sunt societi pe aciuni ? SELECT *; FROM CLIENTI; WHERE den_cl LIKE "S%SA" Exemplul 5 Care sunt clienii din localitile Iai i Bacu ? SELECT cod_client, den_client FROM CLIENTI WHERE localitate = "Iai" OR localitate = "Bacau"
22

sau SELECT * FROM CLIENTI WHERE localitate IN ("Iai", "Bacau") Exemplul 6 Care sunt localitile n care firma are clieni ? SELECT DISTINCT localitate FROM CLIENTI Exemplul 7 Care sunt localitile n care firma are clieni, ordonate dup localitate? SELECT DISTINCT Localitate FROM CLIENTI ORDER BY Localitate SELECT * FROM CLIENTI ORDER BY localitate ASC, den_client DESC Exemplul 8 Care este valoarea facturilor emise pentru clientul cu codul 5 ? SELECT sum(valoare) FROM FACTURI_EMISE WHERE Cod_client =5 Exemplul 9 Care sunt facturile emise clienilor din municipiul Iai ? SELECT nr_factura, CLIENTI.cod_client, CLIENTI.den_client; FROM FACTURI_EMISE, CLIENTI; WHERE FACTURI_EMISE.cod_client= CLIENTI.cod_client; And localitate="IASI" Exemplul 10 Care sunt facturile emise n alte zile dect cea n care a fost ntocmit factura cu numarul 105? SELECT * FROM FACTURI_EMISE WHERE Data not IN (SELECT Data FROM FACTURI_EMISE WHERE Nr_factura=105) Exemplul 11 Care sunt clienii pentru care s-au facturat produse dup data de 18.01.2005 ? SELECT DISTINCT den_client; FROM CLIENTI; WHERE Cod_Client IN ; (SELECT Cod_Client; FROM FACTURI_EMISEi; WHERE Data>{^2005/01/18}) sau SELECT DISTINCT den_client; FROM CLIENTI, FACTURI_EMISE; WHERE CLIENTI.Cod_Client=FACTURI_EMISEi.Cod_Client; AND Data IN (SELECT Data;
23

FROM FACTURI_EMISE; WHERE Data>{^2005/01/18}) Exemplul 12 Ci clieni are firma ? SELECT COUNT (Cod_client) AS Nr_CLIENTI; FROM CLIENTI Exemplul 13 Pentru ci clienii s au emis facturi dup 25.01.2005 ? SELECT COUNT (); FROM CLIENTI; WHERE Cod_Client IN ; (SELECT Cod_Cl ient FROM FACTURI_EMISE WHERE DATA>{^2005/01/25}) sau SELECT COUNT (DISTINCT Cod_client); FROM FACTURI_EMISE; WHERE DATA>{^2005/01/25} Exemplul 14 Care este valoarea total a facturilor emise n luna ianaurie 2005? SELECT SUM (valoare) AS Total_val; FROM FACTURI_EMISE; Where data>={^2005/01/01} and data<{^2005/02/01} Exemplul 15 Care este totalul valorii facturilor emise clientului ALFA SRL ? SELECT SUM (valoare) AS Total_val; FROM FACTURI_EMISE, CLIENTI; Where CLIENTI.cod_client = FACTURI_EMISE.cod_client; AND den_client = "ALFA SRL" Exemplul 16 Care este cea mai mic valoare a unei facturi emise? SELECT MIN (valoare) AS valmin; FROM FACTURI_EMISE Exemplul 17 Care este cea mai mare valoare a unei factutri ? SELECT MAX (valoare) ; FROM FACTURI_EMISE Exemplul 18 Care este totalul zilnic al facturilor emise? SELECT Data, SUM (valoare) ; FROM FACTURI_EMISE; GROUP BY Data Exemplul 19 Care este numrul facturilor emise pentru fiecare client ? SELECT Den_client, count(nr_factura); FROM CLIENTI, FACTURI_EMISE; WHERE CLIENTI.Cod_Client=FACTURI_EMISE.Cod_client; ORDER BY den_client; GROUP BY FACTURI_EMISE.Cod_Client Exemplul 20 Care este numrul facturilor emise n fiecare zi? SELECT Data, count(nr_factura);
24

FROM FACTURI_EMISE; GROUP BY Data Exemplul 21 Cte facturi au fost emise n luna februarie 2005? SELECT COUNT(Nr_factura); From FACTURI_EMISE; Where data>{^2005/01/31} Exemplul 22 Care este totalul vnzrilor pe localiti? SELECT CLIENTI.localitate, sum(FACTURI_EMISE.valoare); FROM CLIENTI inner join FACTURI_EMISE; ON CLIENTI.cod_client=FACTURI_EMISE.cod_client; GROUP BY CLIENTI.localitate; ORDER BY CLIENTI.localitate Exemplul 23 Care sunt produsele cu preul unitar cel mai mare? SELECT DISTINCT(cod_produs), pret_unitar; FROM produse_din_FACTURI_EMISE; WHERE pret_unitar=SELECT(MAX(pret_unitar); FROM produse_din_FACTURI_EMISE)

ELABORAREA DE PROGRAME FOXPRO

1. Codificarea structurilor de control fundamentale Cele trei structuri de control fundamentale (secvena, selecia, iteraia) se codific n mod direct prin comenzi specifice. Structurile de control secveniale se descriu prin specificarea unor comenzi cum sunt: LIST, REPLACE, GOTO etc. Structurile de control alternative i repetitive presupun ns comenzi cu o sintax ceva mai complicat. 1.1. Structuri de control alternative 1.1.1. Structura alternativ dubl (IF THEN ELSE) Structura alternativ dubl i structura pseudoalternativ se codific prin comanda IF care are urmtorul format general: IF <expresieL> <comenzi1> [ELSE <comenzi2>] ENDIF Exemplu: Dispunei de nomenclatorul de clieni (CLIENTI.DBF cod_cl, den_cl, localitate, strada, nrstrada, distanta). ntocmii lista clienilor pe categorii de distan. Lista va cuprinde: cod client, denumire client, categorie. Categoria de distan va fi determinat astfel: pn la 100 de Km - aproape; de la 100 Km la 160 Km - departe; peste 160 Km - foarte departe.
25

Rezolvarea problemei este expus n programul EX_IF.PRG prezentat mai jos. Se observ c o comand IF ENDIF poate conine la rndul ei o alt comand IF ENDIF. Pentru urmrirea rapid a combinrii comenzilor IF n momentul depanrii programelor se recomand scrierea indentat. Structura pseudoalternativ se codific tot prin IF ENDIF dar fr ELSE. * EX_IF.PRG * Program listare clienti pe categorii distanta close all clear use clienti alias clienti ? 'Lista clientilor dupa distanta' ? ? 'Cod client Denumire client categorie distanta' do while not eof() if distanta < 100 ? str(cod_cl,3)+' ' ?? den_cl+' ' ?? 'Aproape' else if distanta <= 160 ? str(cod_cl,3)+' ' ?? den_cl+' ' ?? 'Departe' else ? str(cod_cl,3)+' ' ?? den_cl+' ' ?? 'foarte departe' endif endif skip enddo ? '_________________' ? 'Terminat' return 1.1.2. Structura alternativ generalizat (DO CASE) Structura alternativ generalizat se codific prin DO CASE ENDCASE care are urmtorul format general: DO CASE CASE <expresieL1> <comenzi> [CASE <expresieL2> <comenzi> ] [OTHERWISE <comenzi>] ENDCASE Comanda DO CASE ENDCASE este asemntoare altor implementri ale structurii DO CASE din limbaje de programare cum sunt C, PASCAL, BASIC etc. Fiecare alternativ este exprimat printr-o expresie logic scris imediat dup CASE. Dac se ndeplinete condiia specificat prin <expresieL> atunci se execut comenzile scrise pe rndurile urmtoare pn la o
26

nou linie CASE. Dac nici una din expresiile logice de dup CASE nu iau valoarea adevrat, atunci se vor executa comenzile scrise dup OTHERWISE sau se va trece la urmtoarea comand de dup ENDCASE. Programul EX_DO.PRG exemplific modul de utilizare a comenzii CASE ENDCASE. i aici se recomand scrierea indentat. * EX_DO.PRG * program de determinare a trimestrului pe baza datei curente close all clear set date to dmy data_c = date() do case case month(data_c) <= 3 ? 'Trimestrul 1' case month(data_c) >= 4 and month(data_c) <= 6 ? 'Trimestrul 2' case month(data_c) >= 7 and month(data_c) <= 9 ? 'Trimestrul 3' case month(data_c) = 10 or month(data_c) = 11 or month(data_c) = 12 ? 'Trimestrul 4' endcase return 1.2. Structuri de control repetitive 1.2.1. Structura repetitiv condiionat anterior (DO WHILE) Structura repetitiv condiionat anterior (DO WHILE) se codific direct prin comanda DO WHILE ENDDO care are formatul general prezentat mai jos. Programul EX_IF.PRG utilizeaz pentru prelucrarea nregistrrilor din tabelul CLIENTI.DBF comendai DO WHILE ENDDO. DO WHILE <expresieL> <comenzi> [LOOP] [EXIT] ENDDO Modul de funcionare a comenzii DO WHILE ENDDO este urmtorul: Se evalueaz <expresieL>; Dac <expresieL> are valoarea adevrat se execut comenzile scrise pe liniile urmtoare pna la ENDDO; Cnd se ajunge la ENDDO se revine la evaluarea <expresieL>. Dac <expresieL> are iari valoarea adevrat se execut din nou comenzile scrise pe liniile urmtoare pna la ENDDO. Operaiunile de mai sus se repet pn cnd <expresieL> ia valoarea fals. Dac <expresieL> ia valoarea fals atunci se trece la urmtoarea comand de dup ENDDO.

Clauza LOOP determin ieirea forat din execuia secvenei de comenzi i trecerea la reevaluarea condiiei exprimat de <expresieL>. Asfel se parcurge doar o parte din operaiunile specificate prin comenzile scrse ntre DO WHILE i ENDDO. Clauza EXIT determin, la fel, ieirea forat din execuia secvenei de comenzi dar transfer controlul la urmtoarea comand de dup ENDDO. Deci se iese din structura repetitiv. 1.2.2. Comanda SCAN Comanda SCAN codific tot structura repetitiv condiionat anterior ca i DO WHILE ENDDO dar se aplic doar pentru prelucrrile repetitive referitoare la nregistrrile din tabelele
27

bazei de date. Prin comanda SCAN se gestioneaz i indicatorul de nregistrri (pointer-ul) nemaifiind necesar comanda SKIP. Formatul general al comenzii SCAN este urmtorul: SCAN [<domeniu>] [FOR <expresieL1>] [WHILE <expresieL2>] <comenzi> [LOOP] [EXIT] ENDSCAN Domeniul implicit este reprezentat de toate nregistrrile tabelului activ. Restricionarea domeniului se poate face prin clauzele FOR, respectiv WHILE. Exemplul de la IF ENDIF i DO WHILE ENDDO poate fi exprimat i prin SCAN ENDSCAN. Clauzele LOOP i EXIT au acelai rol ca n DO WHILE ENDDO. * EX_SCAN.PRG * Program listare clienti pe categorii distanta close all clear use clienti alias clienti ? 'Lista clientilor dupa distanta' ? ? 'Cod client Denumire client categorie distanta' scan if distanta < 100 ? str(cod_cl,3)+' ' ?? den_cl+' ' ?? 'Aproape' else if distanta <= 160 ? str(cod_cl,3)+' ' ?? den_cl+' ' ?? 'Departe' else ? str(cod_cl,3)+' ' ?? den_cl+' ' ?? 'foarte departe' endif endif endscan ? '_________________' ? 'Terminat' return 1.2..3. Structura repetitiv cu un numr definit de pai (DO FOR) Structura de tip DO FOR se codific prin comanda FOR ENDFOR. Variabila de control este o variabil de memorie (<variabila_mem>). Comanda are urmtorul format general: FOR <variabila_mem> = <exprN1> TO <exprN2> [STEP <exprN3>] <comenzi> [LOOP] [EXIT] ENDFOR NEXT Expresia numeric <exprN1> reprezint valoarea iniial a variabilei de control, expresia numeric <exprN2> este valoarea final a variabilei de control, iar <exprN3> reprezint incrementul.
28

Exemplu: Datele relative la stocurile de produse finite se gestioneaz prin intermediul tablourilor de date. S se determine produsul cu stocul maxim. Programul de mai jos descrie algoritmul de determinare a stocului maxim. * ST_MAX.PRG * program de determinare a stocului maxim CLEAR SET TALK OFF INPUT "Nr. de produse: " to n DIMENSION denp(n) denp = space(25) DIMENSION cant(n) cant = 0 FOR i = 1 TO n ACCEPT "Denumire produs: " to denp(i) INPUT "Cantitate: " to cant(i) ENDFOR B=0 STORE 0 TO j FOR i = 1 TO n IF B < cant(i) B = cant(i) j=i ENDIF ENDFOR ? 'Produsul cu stocul maxim:' ? denp(j) ?? cant(j) SET TALK ON RETURN 2. Aplicaii, programe i proceduri O aplicaie FoxPro este format din unul sau mai multe programe. La rndul lor programele pot conine una sau mai multe proceduri. Delimitarea program - procedur nu este absolut. De obicei exist un program coordonator (principal) care apeleaz subprogramele sau procedurile dup o anumit schem. Comanda pentru executia programelor/ procedurilor este DO cu urmtorul format general: DO <nume_fiier1> [WITH <lista-parametri>] [IN <nume_fiier2>] Numele specificat dup DO trebuie s numele unui fiier cu extensia .PRG; .EXE; .FXP; .SPR; .MPR; .QPR sau numele unei proceduri locale sau externe. Dac nu este precizat extensia fiierului sistemul caut automat un fiier cu extensia.EXE; .FXP; .PRG. Extensiile .SPR, .MPR; .QPR trebuie s fie preznte n specificatorul de fiier. Cnd este lansat un program/ o procedur cu ajutorul comenzii DO execuia continu pn la apariia unuia din evenimentele urmtoare: ntlnirea unie comenzi CANCEL; ntlnirea unie comenzi QUIT; ntlnirea unie comenzi RETURN; sfritul procedurii Procedurile locale sunt definite chiar n programul care le apeleaz. Procedurile pot fi i fiiere separate cu extensia .PRG. n acest caz este vorba de proceduri externe. n practic
29

procedurile se reunesc ntr-un fiier cu extensia .PRG de unde sunt apoi accesate, dup comanda SET PROCEDURE. Cnd se ntlneste o comand DO cutarea procedurii de executat se face astfel: mai nti se caut procedura local, din programul n curs de execuie; se ceceteaz apoi fiierul indicat n comanda SET PROCEDURE; se caut procedura ca un fiier independent, cu extensia: .EXE; .APP; .FXP; .PRG. CLOSE ALL CLEAR SET TALK OFF USE CLIENTI N=RECCOUNT() STORE 0 TO I,CC,NS, DIST STORE SPACE(15) TO DC, LC, STR STORE .T. TO MODIFICARE STORE " " TO RASP1,RASP2 DO WHILE MODIFICARE=.T. CLEAR @2,1 SAY "NR. INREGISTRARII PENTRU MODIFICARE" GET I READ IF I<=N GO I DISPLAY @3,1 SAY "SUNTETI SIGUR?(D/N)" GET RASP1 READ IF RASP1="D" CLEAR @2,1 SAY "COD CLIENT" GET CC PICT "999999" @3,1 SAY "DENUMIRE CLIENT" GET DC @4,1 SAY "LOCALITATE" GET LC @5,1 SAY "STRADA" GET STR PICT 9999 @6,1 SAY "NUMAR STRADA" GET NS PICT 99999 @7,1 SAY "DISTANTA GET DIST PICT9999 READ REPLACE COD_CL WITH CC REPLACE DEN_CL WITH DC REPLACE LOCALITATE WITH LC REPLACE STRADA WITH STR REPLACE NRSTRADA WITH NS REPLACE DISTANTA WITH DIST ENDIF ELSE @3,1 SAY "INREGISTRAREA NU EXISTA" ENDIF @12,1 SAY "MAI MODIFICATI O INREGISTRARE?(D/N)" GET RASP2 READ IF RASP2="N" STORE .F. TO MODIFICARE USE ENDIF ENDDO
30

CLEAR CLOSE ALL Crearea rapoartelor n Visual Fox Pro Visual FoxPro este dotat cu un instrument puternic pentru crearea formularelor (forms) cu scopul de a pune la dispoziia utilizatorului mijloace de introducere a datelor ntr-o baz de date. Visual FoxPro dispune de numeroase instrumente pentru a extrage date dintr-o baz de date. Utilizatorii pot nva cteva comenzi simple pentru afiarea datelor, pot lista (cu ajutorul comenzii LIST) coninutul unei tabele, pot deschide simple ferestre "browse", pot executa simple fraze SELECT sau pot utiliza tehnologia ODBC pentru a deschide datele Visual FoxPro n alte aplicatii. Majoritatea utilizatorilor ns utilizeaz rapoartele ca forma de colectare i prezentare a informaiilor. Report Designer-ul din Visual FoxPro este o interfa vizual pentru proiectarea "manual" a rapoartelor i etichetelor. Putei crea un raport prin plasarea a diferite obiecte cum ar fi cmpuri, text, imagini i expresii "pe suprafaa" respectivului raport. Opiunea Quick Report din meniu poate grbi ntreg procesul prin stabilirea unui stil implicit pentru rapoarte. Mai mult, Report Wizard-ul poate asista utilizatorul n prototipizarea i crearea rapid a unor rapoarte ce pot fi ulterior modificate cu uurin. TIPURI DE RAPOARTE n Visual FoxPro rapoartele pot prezenta informaiile n mai multe moduri. De exemplu, datele pot fi aliniate n coloane distincte ntr-un format reminiscent de la spreadsheet-uri (fig. nr.1). O alt modalitate ar fi prezentarea datelor ce constituie o nregistrare unele sub altele ca ntr-un formular (fig.nr.2). Datele pot fi prezentate aa cum sunt sau pot fi grupate, agregate (adunate, numrate, calculat media, calculate subtotaluri etc.). Pentru reprezentarea datelor se pot include diverse grafice sau chart-uri. Sursa datelor pentru rapoarte este reprezentat de tabele, interogri sau vederi (views). ntr-un raport pot apare chiar i cmpuri calculate (cmpuri a cror valoare este calculat cu ajutorul unei expresii) sau cmpuri ce conin rezultatele unor funcii (operaii de prelucrare a datelor) definit de ctre utilizator.

31

Fig. nr.1. Raport "pe coloane"

Fig. nr. 2. Raport cu datele unei nregistrri aranjate una sub alta CREAREA RAPOARTELOR VIA QUICK REPORT Opiunea Quick Report asigur o modalitate uoar i rapid de creare a rapoartelor, lsnd Visual FoxPro s se ocupe de detaliile de proiectare. Utilizarea opiunii Quick Report este uoar: 1. Deschidei tabela ce conine datele pe care dorii s le includei n raport (Selectai File, Open i apoi alegeti numele tabelei din fereastra de dialog deschis sau apelai la comanda USE <nume tabel> n fereastra de comenzi. 2. Din meniul principal, alegei File, New i apoi Report. Selectai apoi New File. (n mod alternativ putei utiliza comanda CREATE REPORT n fereastra de comenzi). 3. Selectai Report, Quick Report. Apare fereastra de dialog Quick Report (fig. nr. 3). 4. Alegei stilul (layout) pe care l preferai i efectuai click, selectnd alte opiuni pe care le dorii pentru raportul dvs. Apoi click OK.

Fig.nr.3. Fereastra Quick Report Fereastra de dialog Quick Report include cteva opiuni principale privind stilul raportului ce urmeaz a fi creat. Butoanele Field Layout permit utilizatorului s aleag ntre un stil column-style sau row-style. Csua de validare Titles (csua de validare = check box) include numele cmpului, deasupra sau lng valoarea cmpului (depinznd de stilul adoptat). n majoritatea rapoartelor utilizatorul va dori s dispun de un marker de identificare pentru fiecare cmp aa nct aceast csu de validare va fi selectat. Dac ns, de exemplu, raportul este o simpl list de nume i adrese, probabil nu se va dori i numele cmpului. Csua de validare Add alias indic dac numele alternative (nume alternativ = alias) sunt adugate n mod automat la expresiile pentru fiecare cmp. Cu alte cuvinte, aceast opiune indic dac numele cmpului va fi afiat. Probabil, utilizatorii vor dori ca numele alias s fie selectate, mai ales dac se intenioneaz crearea unor rapoarte pe baza mai multor tabele. Opiunea Add table to data environment adaug tabelul curent la fereastra Data Environment. Dar, despre Data Environment mai trziu, n seciunea intitulat "S profitm de Data Environments i Data Sessions."

32

REPORT DESIGNER-UL Chiar dac v-ai obinuit s utilizai opiunea Quick Report, vei dori probabil s apelai la facilitile oferite de Report Designer n aplicaiile dvs. Ai vazut deja cum se creeaz un simplu raport cu ajutorul opiunii Quick Report. Un raport poate fi creat ns n mai multe moduri. Iat cele mai comune modaliti: Alegei File, New. Click butonul Report, apoi click New Report. Din fereastra Project Manager, click tab-ul (eticheta) Documents, selectai icon-ul Report n lista de documente, apoi click pe butonul New. Apoi selectai New Report. n fereastra de comenzi introducei comanda Create Report sau comanda Modify Report <numele raport>. Utitlizai Report Wizard-ul (asistentul) pentru a crea un raport, salvai-l i modificai-l apoi dup dorin. Vei nva despre utilizarea Report Wizard n seciunea intitulat "Crearea unui raport cu Report Wizard". n continuare, explorm Report Designer-ul. Nu conteaz cum creai un nou raport, Visual FoxPro va lansa n mod automat Report Designer-ul (fig. nr. 5). Report Designer-ul are cteva componente:

Fig. nr. 5. Report Designer-ul ("Proiectantul" de rapoarte) "Suprafaa" raportului este reprezentarea vizual a raportului pe care l proiectai, suprafaa pe care plasai cmpuri, etichete sau grafice. Toolbar-ul (linia de instrumente) Report Designer toolbar v permite s accesai cu uurin toate liniile de instrumente specifice rapoartelor i alte functii importante. SFAT Liniile de instrumente specifice rapoartelor n Visual FoxPro au ToolTips (texte explicative) ataate pentru a v ajuta s v amintii sau reamintii scopul lor. inei cursorul mouse-ului deasupra pictogramelor de pe o linie de instrumente cteva secunde i vei beneficia de acest ajutor. Linia de instrumente Report Controls toolbar v permite s "amplasai" n raportul dvs. ase tipuri de controale: etichete, cmpuri, linii, dreptunghiuri, dreptunghiuri cu coluri rotunjite i imagini "legate" sau alte controale "legate". Paleta Color palette v permite s specificai culorile de fundal sau proprii oricrui control. PRECAUII Nu v jucai cu culorile ntr-un raport. report. Nu toi utilizatorii au imprimante color i, chiar i cei care au, apreciaz mai degrab un raport obinut rapid, dect un raport cu un fundal de culoare galben lmi. Utilizai culorile doar dac dorii s atragei atenia asupra unui rezultat.

33

Paleta Layout palette permite alinierea sau dimensionarea unuia sau mai multor controale (vezi "Formatarea controalelor unui raport"). Butoanele Data Grouping i Data Environment asigur controlul rapid asupra modalitii de prezentare a datelor dvs. SFAT Putei amplasa liniile de instrumente specifice rapoartelor imediat sub zona meniului principal al aplicaiei. Putei, de asemenea, s le redimensionai (n limite rezonabile) pentru a fi pe placul dvs. - tot ce trebuie s facei este s plasai cursorul mouse-ului deasupra "marginilor" liniilor de instrumente i s "tragei" n direcia n care dorii.

Lucrul cu controalele unui raport Report Designer-ul suport trei tipuri de obiecte sau controale: obiecte text, obiecte cmp i obiecte grafice. Aceste obiecte sunt similare obiectelor ce apar ntr-un formular, ns prezint i unele diferene. n primul rnd, controalele unui raport prezint un set mult mai limitat de proprieti privind formatarea i caracteristicile datelor. n al doilea rnd, nu pot fi apelate n cadrul codului surs (prin program). Mai mult, prin natura lor, nu sunt interactive: astfel, utilizatorii nu vor putea introduce text ntr-un raport. Cu obiectele unui raport se lucreaz relativ uor i sunt suficient de flexibile pentru a permite design-ul unor rapoarte sofisticate i/sau profesionale. Obiectele text conin text pe care l tastai direct n Report Designer. Obiectele cmp sunt utilizate pentru afiarea datelor stocate n cmpuri ale nregistrrilor sau a datelor calculate prin expresii, formule sau funcii ale utilizatorilor. Obiectele grafice sunt imaginile, liniile sau dreptunghiurile. Imaginile dintr-un raport Visual FoxPro pot fi stocate n cmpurile unui tabel sau pe disc n diverse formate grafice: .BMP, .ICO, .ANI, .JPG, .GIF, sau .CUR. Aceast capabilitate constituie pentru Visual FoxPro un plus fa de versiunile anterioare ale programului, ce nu suportau dect fiiere Windows Paintbrush cu extensia .BMP. Pe msur ce adaugai obiecte pe suprafaa raportului, le putei manipula dup cum dorii. Selectarea unui obiect al unui raport Pentru a selecta un obiect, asigurai-v mai nti c butonul Select Objects (sgeata) este selectat n linia de instrumente Report Controls. Executai click pe tipul de obiect dorit. Obiectul va fi vizibil "selectat" cu dreptunghiuri sau puncte de manevrare (handles). Executai click pe suprafaa raportului unde dorii s apar obiectul (sau, mai clar, click n punctul unde va fi amplasat colul din stnga sus al obiectului). Obiectul va avea o mrime implicit asignat de Visual FoxPro; obiectul va putea fi ulterior redimensionat dup necesiti. Exist posibilitatea de a aduga un control ntr-un raport i de a-l dimensiona n acelai timp. Pentru aceasta, click i selectai tipul de obiect pe care dorii s-l adugai. "Dragai" mouse-ul pe suprafaa raportului pentru a stabili dimensiunea dreptunghiului n care se va ncadra obiectul, apoi eliberai butonul stng al mouse-ului. Controlul va fi adugat la raport i va avea dimensiunea specificat. tergerea unui obiect Pentru a terge un obiect, selectai obiectul pe suprafaa raportului i apsai tasta Delete sau alegei Edit, Cut. Aceast procedur funcioneaz i pentru mai multe obiecte. Copierea unui obiect Pentru a duplica un obiect, selectai obiectul pe suprafaa raportului, alegei Edit, Copy (sau Ctrl+C), apoi Edit, Paste (sau Ctrl+V). Dac procedai astfel, o copie a obiectului apare lng
34

obiectul original. Putei selecta cu un click obiectul i, utiliznd tastele sgei sau mouse-ul, s-l deplasai ntr-o nou locaie. SFAT Cea mai uoar modalitate de a redimensiona un obiect al unui raport este de a selecta obiectul, de a ine apsat tasta Shift i de a apsa i o tast sgeat. Cu fiecare apsare a tastei sgeat, obiectul este expandat sau contractat cu un pixel sau unitate de scar. De asemenea, putei ine apsat tasta Shift i putei utiliza mouse-ul pentru redimensionarea unui obiect, dar este dificil s lucrai cu precizie. Lucrul cu cmpurile Obiectele de tip text i graficele sunt importante, ns utilizatorii sunt mai degrab interesai de datele incluse ntr-un raport. Pentru a afia datele ntr-un raport, utilizai obiectul text box pentru a aduga un cmp, o variabil, o expresie sau o funcie definit de utilizator. Pentru a aduga un cmp pe suprafaa raportului, selectai controlul text box / field din linia de instrumente Report Controls. Cnd efectuai click pe suprafaa raportului pentru a aduga controlul, apare fereastra de dialog intitulat Report Expression (Fig.nr 6). De notat ca putei accesa aceast fereastr de dialog i mai trziu, efectund click dreapta pe un control de tip cmp (field) i selectnd Properties din meniul shortcut.

Fig. nr. 6. Fereastra de dialog Report Expression n fereastra de dialog Report Expression, putei introduce sau construi o expresie ce va evalua datele prezentate n raport. De asemenea, putei specifica o serie de proprieti cheie, descrise n seciunile urmtoare. Modificarea expresiilor cmpurilor Caseta de text Expression include expresia, numele cmpului sau apelul la funcia ce va evalua datele ce se doresc a fi prezentate. Putei introduce un cmp (numele acestuia) sau o expresie n caseta de text sau putei utiliza butonul pentru a afia fereastra Expression Builder (Fig nr. 7). Expression Builder-ul include un numr de instrumente ce va ajuta n adugarea datelor la un raport, inclusiv o list a cmpurilor disponibile, a funciilor Visual FoxPro i a variabilelor de sistem Visual FoxPro.

35

Fig nr. 7. Fereastra Expression Builder. Putei include orice nume de variabil sau apel la funcie n Expression, ns aceste variabile i funcii trebuie s fie utilizate atunci cnd raportul este rulat; n caz contrar, obinem o eroare. SFAT Putei include IF-uri imediate n formatul urmtor n caseta de text expression: IIF(condiie,rezultat dac este true, rezultat dac nu este true) Aceste "statements" (IIf-urile) pot fi deosebit de utile. Putei modifica valoarea True sau False a unui cmp logic, de exemplu, n ceva mult mai informativ sau "ochios" cu ajutorul urmtoarei expresii: IIF(situatie = .T.,"Asta e!","Sorry, sucker!")

Modificarea formatului cmpurilor n cmpul Format al ferestrei de dialog Report Expression, putei specifica tipul de formatare a textului sau datelor numerice rezultate. Executnd click pe butonul pentru aceast proprietate se acceseaz fereastra de dialog Format prezentat n fig nr.8 . Putei utiliza aceast fereastr de dialog pentru a formata rapid datele pe care le dorii n raportul dvs., dup care v ntoarcei la fereastra de dialog Report Expression.

Fig nr. 8. Opiunile de formatare a unui cmp n fereastra Format. Field Position indic unde dorii s fie amplasat cmpul relativ la "banda" sa. Putei opta pentru un cmp flotant (float) ceea ce nseamn c poziia sa este relativ la alte cmpuri din cadrul
36

benzii. Sau putei stabili ca poziia cmpului s rmn relativ la marginea de sus sau de jos a benzii intitulate Detail, ceea ce nseamn c acesta va fi ntotdeauna la o distan fixat fa de una din marginile benzii, indiferent de dimensiunile oricror alte controale. Caseta de validare Stretch with Overflow (check box) indic dac un control de tip cmp poate "crete" pe vertical destul pentru a afia tot textul dintr-un cmp sau o variabil. n caz contrar, doar o poriune a rezultatului expresiei va fi afiat i implicit imprimat. Aceast opiune este util mai ales atunci cnd se lucreaz cu date din cmpuri de tip Memo. Butonul Calculations permite specificarea unui subtotal sau a unui calcul. Pentru a crea un subtotal pentru un cmp, click pe acest buton, iar apoi, n fereastra de dialog Subtotal sau Calculate Field, indicai tipul calculului i unde s apar. n fig. nr. 9, de exemplu, se specific faptul c se dorete s se calculeze cte valori au fost n cmpuri, la sfritul fiecrei pagini. Acest control se amplaseaz n banda intitulat Page Footer.

Fig. nr. 9. Stabilirea calculelor n fereastra Calculate Field. Butonul Print When din fereastra de dialog Report Expression permite a se stabili dac un cmp dintr-un raport este imprimabil sau nu. Efectnd click pe acest buton se deschide fereastra de dialog Print When (Fig nr. 10). Implicit, un obiect este imprimat ori de cte ori continutul benzii n care se afla este imprimat, dar aceasta comportare implicita se poate schimba. De exemplu, puteti alege sa nu imprimati valori care se repeta, sau intr-un raport in care exista gruparea datelor, puteti alege sa imprimati un cmp doar atunci cnd baza de grupare se modifica. Caseta de text Print Only When Expression Is True permite definirea altei expresii ce determina cnd un cmp se imprima sau nu. Puteti utiliza acest cmp, de exemplu, pentru a limita imprimarea unor cmpuri in anumite conditii de securitate.

Fig. nr. 10.Fereastra de dialog Print When


37

n fereastra de dialog Print When putei specifica n ce condiii vor apare expresiile dintr-un raport la imprimant. Putei utiliza poriunea Comment din fereastra de dialog Report Expression pentru a introduce comentarii comments pentru dvs. sau pentru ali utilizatori. Comentariile nu apar nicieri n raport. Lucrul cu variabile ntr-un raport Putei defini variabile ce vor fi utilizate n raportul dvs. prin slectarea opiunilor Report, Variables (fig nr.11). De ce s utilizai variabile n rapoarte? Ei bine, ai putea dori s stocai anumite valori sau rezultate ale raportului pe care s le utilizai i dup ncetarea rulrii raportului.

Fig. nr.11. Fereastra de dialog pentru definirea variabilelor. Dac selectai caseta de validare Release After Report din fereastra de dialog, variabilele raportului au caracter privat (ceea ce nseamn c orice funcie definit de ctre utilizator pe care o apelai le poate accesa). Dac nu selectai caseta de validare, variabilele vor rmne n memorie ca variabile publice, avnd caracter global. Lucrul cu forme i text Putei aduga cu uurin o form geometric sau o linie de text la un raport Visual FoxPro: nu trebuie dect s selectai controlul dorit i s-l amplasai n raport. De asemenea, putei controla comportamentul formelor i textului ntr-un raport, la fel cum stabilii proprietile cmpurilor. Efectund dublu-click pe un obiect de tip text dintr-un raport; apare fereastra de dialog Text (fig. nr. 12.

Fig. nr 12. Fereastra de dialog Text n fereastra de dialog Text, putei controla stilul i comportamentul unui obiect de tip text dintrun raport. Dac efectuai click pe butonul Print When se deschide fereastra de dialog Print When (prezentat anterior). Utiliznd aceast fereastr de dialog, putei exercita acelai control asupra
38

textului i formelor ca i n cazul cmpurilor. Acelai lucru este valabil i n cazul controlului poziiei unui obiect de tip text sau a poziiei unei forme geometrice: utilizai grupul de butoane de opiune Object Position pentru a determina aceste proprieti. Controalele Rectangle i Line au o serie de opiuni suplimentare fa de cele ale obiectelor de tip text (fig nr.13). Dac efectuai dublu-click pe o linie dintr-un raport, putei indica i cum se dimensioneaz aceasta relativ la banda de care aparine. Opiunea No Stretch restricioneaz redimensionarea liniilor verticale sau dreptunghiurilor. Opiunea Stretch Relative to Tallest Object in Group permite unei linii verticale sau unui dreptugnhi s se "ntind" pn la nalimea celui mai "nalt" obiect din cadrul grupului, n timp ce opiunea Stretch Relative to Height of Band permite unei linii verticale sau dreptunghi s se "ntind" n funcie de nlimea benzii sale.

Fig. nr. 13. Fereastra de dialog Rectangle/Line n fereastra de dialog Rectangle/Line putei controla stilul i comportamentul dreptunghiurilor i liniilor din cadrul unui raport. Controlul Round Rectangle are o fereastr de dialog similar, dar conine cinci butoane diferite pentru a indica diverse stiluri (fig. nr. 14).

Fig. nr. 14. Fereastra de dialog Round Rectangle n fereastra de dialog Round Rectangle putei controla stilul i comportamentul dreptunghiurilor rotunjite din cadrul unui raport.

39

LUCRUL CU IMAGINI I GRAFICE Adugarea obiectelor de tip text sau a formelor este util dar dac se dorete ca raportul s "ia ochii" n sensul de a atrage atenia la anumite informaii cum ar fi, de exemplu, logo-ul companiei, este necesar s se lucreze cu imagini i grafice. Putei adauga grafice la un raport dintr-un cmp general al unui tabel Visual FoxPro sau dintr-un fiier de pe disc. De exemplu, fig. nr. 15 prezint un raport ce include o imagine.

Fig. nr. 15. Exemplu de raport ce include o imagine Putei aduga o imagine la un raport cu uurin, urmnd aceti pai: 1. Selectai controlul Picture / OLE Bound din linia de instrumente Report Controls. 2. Click punctul de start al imaginii i tragei pn ce cadrul este suficient de mare pentru a include imaginea dorit. Cnd eliberai butonul mouse-ului, apare fereastra de dialog Report Picture (Fig. nr. 16).

Fig. nr. 16. Fereastra de dialog Report Picture 3. Stabilii opiunile (discutate n urmtoarele paragrafe) pentru a-i "spune" Visual FoxProului unde se gsete imaginea i cum s o dimensioneze relativ la banda n care va fi amplasat. 4. Click OK. Imaginea dorit apare unde ai stabilit. Zona Picture From din fereastra de dialog include butoanele File i Field i cmpurile corespunztoare pentru a specifica sursa imaginii. Pentru a include o singur imagine dintr-un fiier n raport, click pe butonul File i alegei fiierul dorit. Pentru a alege o imagine dintr-un cmp al unei tabele, click Field, dup care selectai cmpul dorit. Zona If Picture and Frame Are Different Sizes are trei opiuni diferite: Clip Picture; Scale Picture, Retain Shape; i Scale Picture, Fill the Frame. Cnd imaginea este mai mare dect cadrul pe care l-ai adugat raportului, opiunea Clip Picture "spune" Visual FoxPro-ului s decupeze imaginea la dreapta i jos n aa fel nct s se ncadreze n cadrul specificat. Opiunea Scale
40

Picture, Retain Shape "spune" Visual FoxPro-ului s afieze ntreaga imagine "umplnd" pe ct posibil cadrul specificat i meninnd proporiile imaginii. n fine, opiunea Scale Picture, Fill the Frame afieaz imaginea complet, "umplnd" complet cadrul, chiar dac acest lucru distorsioneaz imaginea. Caseta de validare Center Picture este utilizat pentru imaginile stocate n cmpurile generale ale unei tabele. Imaginile din fiiere de pe disc nu sunt afectate de aceast opiune. Dac imaginea dintr-un cmp este mai mic dect cadrul specificat, validarea casetei de validare va face ca imaginea s fie centrat n respectivul cadru. Butonul Print When lucreaz n mod similar cu imagini ca i cu alte controale. Putei opta pentru afiarea unei imagini doar dac sunt ndeplinite anumite condiii. Zona Object Position a ferestrei de dialog are trei opiuni: Fix Relative to Top of Band, Fix Relative to Bottom of Band, and Float. Opiunea Fix Relative to Top of Band menine poziia textului n legtur cu marginea de sus a benzii i nu permite redimensionarea cmpului pentru a afia o alt imagine cu alt dimensiune. Opiunea Fix Relative to Bottom of Band va permite redimensionarea cmpului pentru a accepta date mai "mari" (sau mai lungi), dar va menine poziia imaginii relativ la marginea de jos a benzii. Opiunea Float permite textului s "floteze" n relaie cu poziia benzii. Putei utiliza poriunea Comment a ferestrei de dialog pentru a aduga comentarii despre imagine, pentru dvs. sau pentru ali utilizatori. Comentariile nu afecteaz n nici un fel raportul imprimat. FORMATAREA CONTROALELOR UNUI RAPORT Atunci cnd lucrai cu Report Designer apare un nou submeniu n meniul principal: Reports. n plus, anumite opiuni din alte meniuri pop-up sunt activate sau au valori speciale. Unele din aceste opiuni sunt disponibile i prin liniile de instrumente. De exemplu, meniul Format include cteva instrumente pentru alinierea i dimensionarea datelor, ce "copie" din funcionalitatea liniei de instrumente Layout. Alinierea Pentru a alinia o serie de casete de text, de exemplu, ncepei prin a selecta casetele de text (putei face acest lucru innd apasat tasta CTRL n timp ce efectuai click sau inei apsat butonul stng al mouse-ului i "desenai" o zon dreptunghiular n jurul controalelor pe care dorii s le selectai). Apoi, cu controalele selectate, alegei Format, Align. Putei alege cum dorii s aliniai controalele selectate: la stnga, la dreapta, sus, jos, centrate vertical sau centrate orizontal. Acest proces de aliniere nu are nici un efect asupra alinierii textului caracteristic fiecrui control. n loc de acest lucru, determin modul n care controalele sunt amplasate unul fa de altele. Mrimea Meniul Format include un numr de opiuni Size ce permit proiectantului s dimensioneze cu usurin mai multe controale. Alegnd Format, Size, To Grid unul sau mai multe controale sunt dimensionate la aceeai dimensiune fiind "legate" (amplasate) la cea mai apropiat linie de ghidare (grid line) din fereastra Report Designer. Celelalte opiuni determin mrimea mai multor controale pe baza celui mai "scund", "nalt", "scurt" sau "ngust" control selectat. Spaierea Opiunile Format, Spacing v permit spaierea a trei sau mai multe controale la distane egale, fie vertical, fie orizontal. De exemplu, ai putea s nu observai dac o caset de text dintr-o serie de casete de text este la civa pixeli distan fa de celelalte. Un contabil, ns, care "msoar datele cu ublerul" va observa cu siguran acest lucru. ncercai s utilizai toate opiunile de formatare. Astfel, rapoartele dvs. vor arta profesional. Gruparea Opiunea Format, Group option v permite s tratai dou sau mai multe controale ca pe unul singur. Aceasta posibilitate este n special util atunci cnd centrai controale. Dac selectai mai multe controale n Report Designer i selectai una din proprietile de centrare, fiecare control este centrat, ceea ce nsemn c exist posibilitatea ca acestea s se suprapun. dac mai nti le
41

grupai i apoi le centrai, vei obine rezultatul dorit: controalele, ca grup, vor fi centrate n cadrul paginii. Dac selectai un control care a fost deja "grupat" opiunea se modifica n Ungroup. Snap to Grid i Grid Scale Opiunea View, Grid Lines "umple" suprafaa raportului cu linii de ghidare verticale i orizontale, permitndu-v s "simii" i s apreciai distanele dintre controale. Cele dou opiuni din Format - Snap to Grid i Grid Scale - v permit s modificai lungimea i limea zonelor de ghidare, i s aliniai un control la cea mai apropiat linie orizontal sau vertical. Opiuni Text Opiunea Format, Font v permite s specificai un font pentru un control sau un grup de controale. Putei utiliza orice font disponibil specific Windows. Alinierea textului determin alinierea textului n cadrul unui control. Opiunile Format, Align determin poziionarea controalelor unele fa de altele. Opiunile de aliniere a textului v permit s aliniai textul la stnga, la dreapta, centrat sau justify. Opiunile Fill i Pen Opiunile Fill i Pen options asigur un mecanism intern de modificare a abloanelor de umplere i realizare a chenarelor. Opiunea Fill afieaz un submeniu ce include o serie de abloane de umplere sau o opiune implicit de non-umplere. Opiunea Pen lanseaz un submeniu de limi ale conturului i tipuri de linii. Opiunea Mode determin dac background-ul (fundalul) unui control este transparent sau opac, afectnd doar obiectele text, dreptunghiurile i dreptunghiurile rotunjite. Benzile Rapoartelor Report Designer-ul din Visual FoxPro utilizeaz abordarea orientat pe benzi ce a devenit att de popular n crerea rapoartelor n ultimii ani. Diferitele benzi reprezint diferite seciuni ale raportului. Principalele benzi ale unui raport. Aproape fiecare raport pe care l proiectai va avea o aanumit detail band (banda detaliilor), ce conine datele afiate n poriunea principal a raportului. Controalele din aceast seciune reprezint probabil "inima" raportului. Controalele amplasate n aceast banda vor fi afiate imediat pentru fiecare nregistrare din sursa de date. Controalele din title band sunt afiate doar odat, pe prima pagin a raportului n timp ce controalele din "summary band" vor apare doar la sfritul raportului. Benzile de titlu sunt utilizate n mod curent pentru titluri. Benzile de sumar sunt utilizate pentru informaii de "sumar" cum ar fi totaluri de cmpuri numerice, "numrri" de nregistrri incluse n raport etc. SFAT Spre deosebire de marea majoritate a produselor de realizare a rapoartelor, Visual FoxPro permite "dragarea" controalelor dintr-o banda n alta. Banda page header band va fi afiat n partea de sus a fiecrei pagini, iar banda page footer band ar trebui s includ doar acele obiecte pe care dorii s le vedei afiate n partea de jos a fiecrei pagini. SFAT Page footers sunt cel mai bun loc pentru numere de pagin, date, nume ale rapoartelor sau orice alt informaie de care utilizatorii ar avea nevoie n eventualitatea pierderii accidentale a unor pagini sau a ntregului raport. Alte benzi ale rapoartelor. Dac alegei s grupai datele, vei fi capabili s amplasai informaiile n aa-numitele benzi group header i group footer. Benzile group header i group footer v permit s aranjai rapoartele prin gruparea datelor i s precizai informaii privind aceste grupuri. De exemplu, ai putea sorta lista pacienilor unui spital dup tipul asigurrii medicale. O posibilitate ar fi s afiai fiecare nume i fiecare tip de asigurare dar o alt opiune mai bun ar fi s grupai datele, afind tipul asigurrii doar o dat pentru mai multe nume.
42

Dac alegei s creai un raport cu coloane multiple, ai putea dori s includei headere i footere. Pentru a crea un raport cu coloane multiple, selectai File, Page Setup i introducei numrul de coloane n fereastra de dialog, precum i limea coloanelor i spaiul dintre acestea. Tabelul 1. Controalele ferestrei de dialog Page Setup Control Descriere Number spinner Utilizai acest "spinner" (contor) pentru a crete sau descrete numrul de coloane din raportul dvs. Width spinner Utilizai acest spinner pentru a stabili limea coloanelor. Spacing spinner Utilizai acest spinner pentru a stabili limea spaiului dintre coloane. Print Area options Utilizai aceste opiuni pentru a determina modul n care marginile de imprimare sunt "manevrate" de ctre raport. Dac selectai Printable Page, zona imprimabil a paginii este determinat n concordan cu specificaiile implicite ale imprimantei i este afiat n zona Page Layout a ferestrei de dialog. Dac selectai Whole Page, raportul dvs. va "umple" ntreaga pagin. Print Setup button Utilizai acest buton pentru a deschide fereastra de dialog Windows Print Setup, unde putei modifica setrile implicite ale imprimantei instalat implicit sub Windows. Print Order buttons Utilizai aceste butoane pentru a determina umplerea coloanelor verticale de sus n jos i de la stnga la dreapta ncepnd din partea de sus a paginii. Left Margin spinner Utilizai acest spinner pentru a stabili limea marginii din stnga. ORDONAREA I GRUPAREA DATELOR N RAPOARTE Datele din raport vor fi afiate n ordinea furnizat de sursa de date. Nu putei stabili o ordine special de afiare a datelor ntr-un raport, ns putei stabili ordinea sau indexarea n tabela sau vederea pe care se bazeaz raportul. Avnd n vedere majoritatea rapoartelor "columnare", vei subdiviza datele n grupuri. Putei aduga un grup efectund un click asupra butonului Insert. Tastai expresii n caseta de text sau efectuai click asupra butonului elips pentru a deschide Expression Builder-ul din Visual FoxPro. Atunci cnd se utilizeaz grupuri, raportul ncepe un nou grup ori de cte ori se modific expresia de baz pentru grup. Din acest motiv, sursa de date trebuie s fie ordonat n concordan cu criteriul de grupare: Visual FoxPro nu poate cuta toate nregistrrile relative la un grup. De ndat ce rezultatele expresiei de grupare se modific, se calculeaz subtotaturi de grup, se imprim banda grupului i ncepe un nou grup . SFAT Expresia Group va fi cel mai adesea un cmp, dar poate fi i o variabil sau o funcie definit de ctre utilizator. De fapt, poate fi i o expresie concatenat ce combin dou cmpuri. Zona Group Properties indic comportamentul modificrii fiecrui grup. Dac raportul dvs. are mai mult de o coloan, caseta de text Start Group asupra New Column afieaz o nou coloan de fiecare dat cnd se modific expresia de grupare. Startnd Each Group ntr-o New Page insereaz un "page break" ori ce cte ori expresia grup se modific. Resetai Page Number la 1 pentru Each Group pentru a indica faptul c contorul de pagin va fi restartat pentru fiecare nou grup. Acest utilitate este suficient dar un raport urmeaz a fi "mprit" i trimis la mai muli recipieni. Header-ul Reprint Group pe fiecare Each Page box, atunci cnd este selectat, "spune" Visual FoxPro-ului s afieze header-ul grupului pe fiecare pagin pe care este afiat. Controlul Start Group pe New Page When Less Than spinner control ajut n prevenirea unui header de grup s fie prea aproape de josul unei pagini. Atunci cnd ai terminat definirea
43

grupurilor, click OK pentru a nchide fereastra de dialog. Benzile pentru noile grupuri vor apare n raport. Cu toate acestea, implicit, acestea nu ocup nici un fel de spaiu. S PROFITM DE AVANTAJELE LUI DATA ENVIRONMENTS I DATA SESSIONS Pentru a deschide fereastra Data Environment, alegei View, Data Environment sau efectuai right-click pe suprafaa raportului, selectai opiunea Environment din meniul shortcut. n oricare mod vei obine o reprezentare vizual a mediului datelor (Data Environment) i vei putea alege s adugai tabele, cursoare sau vederi dup cum dorii. Fiecare obiect este adugat ca un obiect de tip cursor, mpreun cu setul complet de proprieti, evenimente i metode. Putei stabili relaii vizuale ntre obiectele cursor sau putei accesa proprietile, evenimentele i metodele tabelelor, cursoarelor i relaiilor via ferestrele Code (pentru cod) i Properties (pentru proprieti). Pentru a aduga tabele sau vederi la Data Environment, selectai Data Environment, Add, sau efectuai click dreapta pe designer-ul Data Environment i selectai Add. Dac o baz de date este deja deschis,acea baz de date i tabelele sau vederile sale vor apare n fereastra de dialog Add Table or View . Dac nu exist o baz de date curent deschis, sau dac alegei Other, o fereastra de dialog GetFile va apare pentru dvs. pentru a alege o tabel.. Dac selectai o tabel ce aparine unei baze de date ce nu a fost nc deschis, Visual FoxPro leag tabela la baza de date i deschide tabela n mod automat. Dac dorii s lucrai ntr-o vedere n loc de o tabel selectai butonul de opiune View iar lista tabelelor va fi nlocuit de lista vederilor din baza de date.. Odat ce o tabel sau o vedere a fost adugat la Data Environment, o putei browsi efectund right-click pe tabela sau vedere i selectnd Browse din shortcut menu. De asemenea, putei selecta Data Environment, Browse din meniul principal, dar doar dac tabela sau vederea a fost deja selectat (selectai-o prin clicking it). De aici, putei drag and drop cmpuri pe suprafaa raportului. Dup adugarea unei tabele sau vederi la Data Environment, putei accesa proprietile sale prin fereastra Properties. Lucrul cu relaii n Data Environment Designer Crearea unei relaii ntre obiectele cursor din Data Environment este uoar. Selectai cmpul relaie din sursa de date printe, apoi dragai-l peste sursa de date copil..Tabelul copil trebuie s posede un index pe acest cmp. n caz contrar, Visual FoxPro se ofer s creeze un index pentru dvs. Aa cum Data Environment face ca raportul dvs. s ruleze mai uor, sesiunile private de date fac ca procesul de "curare" dup rularea raportului s fie banale. O sesiune privat de date este o zona mic, relativ protejat a aplicaiei dvs, permind unui raport s modifice pointerii (indicatorii ctre nregistrri), ordinea indecilor, relaiilor sau a oricror alte setri fr a afecta formularul curent sau mediul datelor. Putei asigna cu uurin un raport sesiunii sale de date. Alegei doar Report, Private Data Session din meniul sistem. Astfel se stabilete atributul sesiunii private de date on sau off. STRATEGII DE PROIECTARE O planificare adecvat v poate ajuta s economisii mult timp i efort, evitnd totodat rapoartele ce nu furnizeaz utilizatorilor informaiile necesare. Atunci cnd proiectai rapoarte, sarcina dvs. este de a prelua datele furnizate de o tabel sau de o interogare i s le transformai ntr-un raport ce asigur informaiile ntr-o manier ce are sens pentru utilizator. Iat civa pai sau etape utile n proiectarea unui raport: Discutai forma raportului cu utilizatorii i, dac este posibil, cutai s examinai copii ale unor rapoarte existente. Proiectai forma pe hrtie i specificai orice operaii de grupare, calculare a unor subtotaluri sau de formatare.

44

Decidei dac putei utiliza o sesiune privat de date i Data Environment sau dac vei crea un "cursor" n una curent nainte de rularea raportului. Proiectai raportul n Visual FoxPro. Previzualizai sau tiprii raportul, apoi cutai feed-back-ul din partea utilizatorilor.

CREAREA UNUI RAPORT CU REPORT WIZARD Asistentul Visual FoxPro Report Wizard asigur o modalitate automat de creare a unui raport ntr-o diversitate de stiluri i moduri. Pentru a lansa Report Wizard-ul, selectai Tools, Wizards, Report. Va apare fereastra de dialog prezentat n fig. nr. 17.

Fig. nr. 17. Fereastra de dialog de selectare a tipului de raport Rapoartele One-to-many sunt utilizate pentru a crea rapoarte "relaionale", ce afieaz o nregistrare din tabela primar (sau tabela "printe") mpreun cu toate nregistrrile asociate din tabela secundar sau tabela "copil". Raportul standard "one-source report" afieaz datele aa cum apar acestea ntr-o singur surs de date. Executnd click pe butonul OK sau dublu-click pentru a alege tipul raportului pe care dorii s l creai va apare fereastra de dialog prezentat n fig. nr. 18:

Fig. nr. 18. Primul pas al asistentului Report Wizard Selectai baza de date dorit i tabela asociat din opiunile Databases i Tables din stnga. Vei observa o list de cmpuri disponibile. Putei efectua click pe butonul de comand "sgeat spre dreapta" pentru a muta cmpurile pe care dorii s le selectai n ordinea n care dorii. Butonul "Sgeat dubl" va deplasa toate cmpurile disponibile n lista intitulat Selected fields. Urmtoarea fereastra de dialog prezentat n fig. nr. 19 permite selectarea tabelei "copil" pe baza creia se va realiza raportul.

45

Fig. nr. 19. Al doilea pas al asistentului Report Wizard Fereastra de dialog din fig. nr. 20 permite stabilirea modalitii de legtur dintre cele dou tabele utilizate pentru realizarea raportului.

Fig. nr. 20. Al treilea pas al asistentului Report Wizard n fereastra de dialog asociat pasului 4 putei selecta ordinea pentru raportul dvs. (fig. nr. 21). Reamintii-v c ordinea pe care o alegei trebuie s corespund criteriilor dvs. de grupare pentru ca acestea s funcioneze corect.

46

Fig. nr. 21 Pasul patru al asistentului Report Wizard n urmtoarea fereastr de dialog putei selecta un stil pentru raportul dvs., din cele cinci stiluri disponibile i putei stabili dac raportul va fi imprimat n modul landscape sau portrait (Fig. nr. 22).

Fig. nr. 22. Al cincilea pas al asistentului Report Wizard Utiliznd butonul Summary Options din fereastra pasului 5 al asistentului putei solicita unul sau mai multe tipuri de calcule asupra unuia sau mai multor cmpuri ale raportului creat (Fig. nr.23).

47

Fig. nr. 23. Fereastra de dialog Summary Options Ultima fereastr de dialog ntreab dac dorii s salvai raportul n vederea unei utlizri ulterioare, s-l salvai i s-l rulai imediat sau s-l salvai i s-l modificai imediat (fig. nr. 24). SFAT Asistentul Report Wizard poate fi un instrument util pentru crearea unui simplu form, prototipizarea unui form sau nvarea mai multor lucruri despre obiectele Report Designer i modul n care acestea lucreaz.

. Fig. nr. 24. Ultimul pas al asistentului Report Wizard RULAREA RAPORTELOR Putei imprima un raport completat utiliznd una din urmtoarele metode: Din Project Manager, click tab-ul Document, click i selectai un raport, apoi click butonul Print din linia de instrumente Standard. Din fereastra de comenzi (sau din cod program), utilizai comanda Report Form. Aceast comand are urmtoarea sintax:

48

REPORT FORM nume_raport TO PRINT | PREVIEW | TO filename | FOR filter expression Reinei c rapoartele dvs. vor fi formatate pentru imprimanta instalat implicit. Pentru a rula aceleai rapoarte la o imprimant diferit unele alinieri i spaieri ar trebui reactualizate. Visual FoxPro face o treab bun n general n rezolvarea diferenelor dac imprimantele utilizate sunt relativ standardizate i nu foarte diferite una fa de alta. Alegerea unei destinaii Utiliznd comanda Report Form putei direciona "ieirea" unui raport ctre una sau mai multe destinaii. Dac dorii s imprimai raportul comanda va arta astfel: REPORT FORM Raportul_meu TO PRINT Dac dorii s previzualizai raportul n loc s-l trimitei direct la imprimant utilizai urmtoarea comand: REPORT FORM Raportul_meu TO PRINT PREVIEW Dac dorii s salvai textul raportului ntr-un fiier ASCII: REPORT FORM Raportul_meu TO FILE Fiierul_meu.txt ASCII n mod implicit, rapoartele rezultate sunt afiate i pe ecran n timp ce sunt generate. Pentru a preveni acest lucru, utilizai opiunea NOCONSOLE.

49

S-ar putea să vă placă și