Sunteți pe pagina 1din 231

1 Baze de date

UNIVERSITATEA TEHNIC DE CONSTRUCII

BUCURETI

BAZELE INFORMATICII

SI

LIMBAJE DE PROGRAMARE

BAZE DE DATE RELAIONALE

Romic TRANDAFIR

Mihai NISTORESCU Ion MIERLU-MAZILU

Bucureti

2007
2007 Cuprins 2

Cuprins

Cuprins................................................................................................................................................1
1. Bnci i baze de date ......................................................................................................................5
1.1. Noiuni generale ....................................................................................................................5
1.2. Sisteme de baze de date.........................................................................................................6
1.3. Organizarea datelor ntr-o baz de date.................................................................................7
1.4. Modelarea la nivel logic a datelor ntr-o baz de date...........................................................8
1.5. Sistem de gestiune a bazelor de date ...................................................................................10
1.5.1. Interfee SGBD ..........................................................................................................11
1.5.2. Funcii i servicii oferite de un SGBD.......................................................................12
1.5.3. Activitile asigurate de SGBD..................................................................................14
1.5.4. Obiectivele unui SGBD .............................................................................................15
2. Etapele de realizare a unei bnci de date...................................................................................17
2.1. Etapa de analiz...................................................................................................................17
2.2. Etapa de programare............................................................................................................17
2.3. Punerea n funciune i exploatarea bazei de date ...............................................................18
2.4. Documentaia aplicaiei .......................................................................................................19
3. Sisteme de gestiune a bazelor de date relaionale .....................................................................20
3.1. Modelul relaional al datelor ...............................................................................................20
3.1.1. Structura relaional a datelor ....................................................................................20
3.1.2. Operaii n algebra relaional....................................................................................21
3.1.3. Optimizarea cererilor de date.....................................................................................28
3.1.4. Baze de date relaionale .............................................................................................30
3.1.5. Tipuri de relaii ..........................................................................................................31
3.1.6. Restricia de cardinalitate...........................................................................................33
3.2. Regulile lui Codd.................................................................................................................34
3.3. Normalizarea datelor ...........................................................................................................37
3.4. Cerinele minimale de definire a SGBDR ...........................................................................37
4. Componentele funcionale ale sistemului Visual FoxPro .........................................................39
4.1. Programarea orientat pe obiecte ........................................................................................39
4.2. Ierarhia claselor n Visual FoxPro.......................................................................................44
4.2. Arhitectura VFP 6.0.............................................................................................................45
4.3. Moduri de lucru n VFP.......................................................................................................46
4.3.1. Modul de lucru meniu sistem.....................................................................................47
4.3.2. Modul de lucru prin comenzi.....................................................................................52
5. Organizarea datelor nVisual FoxPro ........................................................................................53
5.1. Manipularea bazei de date i a tabelelor n VFP .................................................................53
5.1.1. Crearea bazei de date .................................................................................................53
5.1.2. Crearea tabelelor ........................................................................................................54
5.1.3. Validarea cmpurilor unei nregistrri la introducere................................................55
5.2. Deschiderea bazei de date/tabelei........................................................................................61
5.3. Consultarea i modificarea bazei de date/tabelei.................................................................62
5.3.1. Modificarea structurii de date a tabelelor n modul asistat........................................62
5.3.2. Deplasri n tabel. Cutri secveniale.....................................................................64
5.4. nchiderea bazei de date/tabelei...........................................................................................65
6. Utilizarea asistentului Wizard n VFP .......................................................................................67
6.1. Table Wizard .......................................................................................................................67
6.2. Form Wizard........................................................................................................................68
6.3. Report Wizard .....................................................................................................................69
3 Baze de date

6.4. Label Wizard .......................................................................................................................70


6.5. Query Wizard ......................................................................................................................70
6.6. Mail Merge Wizard .............................................................................................................72
6.7. Editorul de texte n VFP 6.0 ................................................................................................73
6.7.1. Lansarea editorului ....................................................................................................73
6.7.2. Lucrul cu blocul de linii din fiier .............................................................................73
7. Elemente ale limbajului propriu Visual FoxPro 6.0 .................................................................74
7.1. Simboluri .............................................................................................................................74
7.2. Variabile de sistem ..............................................................................................................74
7.3. Comentariul .........................................................................................................................74
7.4. Tipuri de date, operaii i funcii .........................................................................................74
7.4.1. Date de tip numeric. Funcii aritmetice i financiare.................................................77
7.4.2. Aplicaii ale funciilor financiare...............................................................................78
7.4.3. Date i funcii de tip caracter .....................................................................................81
7.4.4. Date i funcii de tip calendaristic..............................................................................83
7.4.5. Date de tip memo.......................................................................................................84
7.5. Variabile i masive ..............................................................................................................84
7.5.1. Variabile.....................................................................................................................84
7.5.2. Macrosubstituia.........................................................................................................85
7.5.3. Masive de date ...........................................................................................................86
7.6. Funcii de prelucrare a masivelor ........................................................................................87
8. Accesul i actualizarea datelor....................................................................................................92
8.1. Manipularea structurii unei tabele .......................................................................................92
8.2. Ordonarea datelor ................................................................................................................93
8.3. Accesul la date.....................................................................................................................98
8.4. Actualizarea datelor...........................................................................................................103
8.4.1. Adgarea de noi nregistrri.....................................................................................103
8.4.2. Modificarea nregistrrilor.......................................................................................106
8.4.3. tergerea nregistrrilor ...........................................................................................110
8.4.5. Relaii ntre tabele....................................................................................................113
9. Programarea procedural.........................................................................................................120
9.1. Programarea structurat.....................................................................................................120
9.1.1. Structura liniar........................................................................................................121
9.1.2. Structura alternativ.................................................................................................124
9.1.3. Structura repetitiv...................................................................................................126
9.2. Modularizarea programelor ...............................................................................................129
9.2.1. Proceduri..................................................................................................................130
9.2.2. Funcii ......................................................................................................................131
10. Comenzi ale nucleului SQL.....................................................................................................135
11. Proiectarea meniurilor i a barelor de instrumente .............................................................146
12. Aplicaii .....................................................................................................................................147
12.1. Evidena rezultatelor activitii studenilor ntr-o facultate.............................................147
12.1.1. Formularea i analiza problemei............................................................................147
12.1.2. Crearea, actualizarea, modificarea i interogarea tabelelor ...................................149
12.1.3. Crearea structurii unui fiier ..................................................................................150
12.1.4. Adresarea prin macrosubstituie ............................................................................151
12.1.5. Crearea unui meniu................................................................................................151
12.2. Gestionarea unei magazii ................................................................................................153
12.2.1. Proiectarea i realizarea aplicaiei..........................................................................153
12.2.2. Realizarea documentaiei i a aplicaiei n format executabil................................220
2007 Cuprins 4

12.2.3. Utilizarea Setup Wizard.........................................................................................225


A. Anexa..........................................................................................................................................227
Index de termeni.............................................................................................................................229
Bibliografie .....................................................................................................................................231
5 Baze de date

1. Bnci i baze de date

1.1. Noiuni generale

O baz de date reprezint un ansamblu de date integrat, anume structurat i dotat cu o descriere
a acestei structuri. Descrierea structurii poart numele de dicionar de date sau metadate i creaz o
interdependen ntre datele propriu-zise i programe.

Baza de date poate fi privit ca o colecie de fiiere interconectate care conin nucleul de date
necesare unui sistem informatic. Astfel, poate fi considerat drept un model al unor aspecte ale
realitii unei uniti economice, modelat prin intermediul datelor. Diferitele obiecte din cadrul
realitii, ce prezint interes, sunt denumite clase sau entiti. Pentru aceste obiecte sunt
achiziionate i memorate date referitoare la diferite caracteristici (atribute). Baza de date se
constituie ca un ansamblu intercorelat de colecii de date, prin care se realizeaz reprezentarea unei
realiti.

Datele constituie orice mesaj primit de un receptor, sub o anumit form.

Informaiile reprezint cantitatea de noutate adus de un mesaj din exterior (realitate).

Un fiier este un ansamblu de nregistrri fizice, omogene din punct de vedere al coninutului
i al prelucrrii.

O nregistrare fizic este o unitate de transfer ntre memoria intern i cea extern a
calculatorului.

O nregistrare logic este unitatea de prelucrare din punct de vedere al programului utilizator.
O nregistrare se compune din cmpuri (atribute) care descriu anumite aspecte ale realitii.
Cmpurile sunt nregistrri logice.

O baz de date trebuie s asigure:


abstractizarea datelor (baza de date fiind un model al realitii),
1. Bnci i baze de date 6

integrarea datelor (baza de date este un ansamblu de colecii de date intercorelate, cu


redundan controlat),
integritatea datelor (se refer la corectitudinea datelor ncrcate i manipulate astfel
nct s se respecte restriciile de integritate),
securitatea datelor (limitarea accesului la baza de date),
partajarea datelor (datele pot fi accesate de mai muli utilizatori, eventual n acelai
timp),
independena datelor (organizarea datelor s fie transparent pentru utilizatori,
modificrile n baza de date s nu afecteze programele de aplicaii).

1.2. Sisteme de baze de date

Sistemele de baze de date, sau bncile de date, reprezint un sistem de organizare i prelucrare,
respectiv teleprelucrare (prelucrare la distan) a informaiei, constituit din urmtoarele trei
elemente:
colecie de date aflate n interdependen creare baza
descrierea datelor i a relaiilor dintre ele de date

un sistem de programe care asigur exploatarea bazei de date (actualizare, interogare).


Arhitectura sistemului de baze de date este format din urmtoarele componente (Figura 1):
baza/bazele de date reprezint componenta de tip date a sistemului (coleciile de date
propriu-zise, indecii);
sistemul de gestiune a bazei/bazelor de date ansamblul de programe prin care se asigur
gestionarea i prelucrarea complex a datelor i care reprezint componenta software a
sistemului de baze de date (Sistem de Gestiune a Bazelor de Date SGBD);
alte componente proceduri manuale sau automate, inclusiv reglementri administrative,
destinate bunei funcionri a sistemului, dicionarul bazei de date (metabaza de date) care
conine informaii despre date, structura acestora, elemente de descriere a semanticii,
statistici, documentaii, mijloacele hardware utilizate, personalul implicat.

APLICAII
BAZA DE
UTILIZATORI SGBD DATE
ALTE ELEMENTE
Fig. 1
7 Baze de date

1.3. Organizarea datelor ntr-o baz de date

Arhitectura intern a unui sistem de baze de date conform standardului ANSI/X3/SPARC


(1975) conine trei niveluri funcionale. O caracteristic fundamental a bazelor de date este aceea
c produce cteva niveluri de abstractizare a datelor prin ascunderea (transparena) detaliilor legate
de stocarea datelor, utilizatorilor.
Se definete modelul datelor, ca un set de concepte utilizat n descrierea structurii datelor. Prin
structura bazei de date se nelege tipul datelor, legtura dintre ele, restriciile aplicate datelor. O
structur de date asociat unei baze de date poate fi reprezentat pe trei niveluri, Figura 2, astfel:
Nivelul intern constituit din schema intern ce descrie structura de stocare fizic a datelor
n baza de date, utiliznd un model al datelor fizice. La acest nivel se descriu detaliile
complete ale stocrii i modul de acces la date.
Nivelul conceptual sau schema conceptual, descrie structura ntregii baze de date pentru o
cumunitate de utilizatori. La nivel conceptual se face o descriere complet a bazei de date
ascunzndu-se detaliile legate de stocarea fizic i detaliind descrierea entitilor, tipurilor
de date, relaiile dintre ele i restriciile asociate.

Vizualizare Vizualizare
Nivel extern
grup utilizatori 1 grup utilizatori n

Nivel conceptual Schema conceptual

Nivel intern Schema intern

Date memorate

Fig. 2
1. Bnci i baze de date 8

Nivelul extern sau nivelul vizual (utilizator), include o colecie de scheme externe ce
descriu baze de date prin prisma diferiilor utilizatori.

n multe SGBD nu se poate face o distincie clar ntre cele trei niveluri, de multe ori nivelul
conceptual este puternic dezvoltat i suplinete aparent celelalte niveluri. De asemenea, la
dezvoltarea aplicaiilor se remarc o contopire a nivelului extern cu cel conceptual.

De la modelul conceptual, cererile sunt adresate modelului intern pentru a fi procesate i


aplicate datelor stocate. Procesul de transfer a cererilor i rezultatelor ntre nivele se numete
cartografiere (mapping).

n funcie de categoria de personal implicat n folosirea bazei de date, datele dintr-o baz de
date pot fi structurate pe trei niveluri:
nivelul conceptual (global) exprim viziunea administratorului bazei de date asupra datelor.
Acestui nivel i corespunde structura conceptual (schema) a bazei de date, prin care se
realizeaz o descriere a tuturor datelor, ntr-un mod independent de aplicaii, ce face posibil
administrarea datelor.
nivelul logic exprim viziunea programatorului de aplicaie asupra datelor. La acest nivel
se realizeaz o descriere a datelor corespunztoare unui anumit program de aplicaie.
nivelul fizic care exprim viziunea inginerului de sistem asupra datelor. Corespunde
schemei interne a bazei de date prin care se realizeaz o descriere a datelor pe suport fizic de
memorie.

1.4. Modelarea la nivel logic a datelor ntr-o baz de date

Modelul de date reprezint ansamblul de concepte i instrumente necesare pentru a construi o


schem a bazei de date. Modelarea datelor poate viza totalitatea datelor din cadrul bazei de date
(schema/arhitectura datelor) sau o parte a acestora (subscheme ale bazei de date). Schema i
subschema bazei de date sunt modelele logice ale bazei de date, care au asociate principii generale
pentru gestionarea/definirea (structurarea) datelor, manipularea i asigurarea integritii datelor, fr
a reflecta modul de reprezentare i stocare a acestor date pe suportul de memorie (care sunt ele
modelului fizic).
Se cunosc mai multe tipuri de baze de date dup modul de organizare, modul de dispunere pe
suport magnetic a informaiei i a elementelor componente:
9 Baze de date

modele primitive datele sunt organizate la nivel logic n fiiere, structura de baz este
nregistrarea, mai multe nregistrri fiind grupate n structuri de tip fiier;
baze de date ierarhice legturile dintre date sunt ordonate unic, accesul se face numai prin
vrful ierarhiei, un subordonat nu poate avea dect un singur superior direct i nu se poate
ajunge la el dect pe o singur cale;
baze de date n reea datele sunt reprezentate ca ntr-o mulime de ierarhii, n care un
membru al ei poate avea orici superiori, iar la un subordonat se poate ajunge pe mai multe
ci;
baze de date relaionale structura de baz a datelor este aceea de relaie tabel, limbajul
SQL (Structured Query Language) este specializat n comenzi de manipulare la nivel de
tabel. Termenul relaional a fost introdus de un cercettor al firmei IBM, dr. E. F. Codd, n
1969, cel care a enunat cele 13 reguli de baz necesare pentru definerea unei baze de date
relaionale. Baza de date relaional reprezint o mulime structurat de date, accesibile prin
calculator, care pot satisface n timp minim i ntr-o manier selectiv mai muli utilizatori.
Aceast mulime de date modeleaz un sistem sau un proces din lumea real i servete ca
suport unei aplicaii informatice;
baze de date distribuite sunt rezultatul integrrii tehnologiei bazelor de date cu cea a
reelelor de calculatoare. Sunt baze de date logic integrate, dar fizic distribuite pe mai multe
sisteme de calcul. Integrarea bazei de date distribuite se face cu ajutorul celor trei tipuri de de
scheme care sunt implementate:
1. schema global definete i descrie toate informaiile din baza de date distribuit n
reea;
2. schema de fragmentare descrie legturile dintre o colecie global i fragmentele
sale. Ea este de tipul unu la mai muli i are forma unei ierarhii;
3. schema de alocare descrie modul de distribuire a segmentelor pe calculatoarele
(nodurile) din reea. Fiecare segment va avea o alocare fizic pe unul sau mai multe
calculatoare. Schema de alocare introduce o redundan minim i controlat: un
anumit segment se poate regsi fizic pe mai multe calculatoare.
Utilizatorul unei asemenea baze de date o vede ca pe o baz de date unic, compact (nivel
logic), cu toate c n realitate ea este distribuit pe mai multe calculatoare legate n reea (nivel
fizic). Aceast organizare a dus la o cretere substanial a vitezei de acces la o baz de date ntr-o
reea de calculatoare. Anumite date stocate pe un server local sunt mult mai rapid accesate dect
1. Bnci i baze de date 10

dac ele s-ar afla pe un server la distan, unde baza de date ar fi fost stocat n ntregime
(nedistribuit);
modele semantice orientate spre obiecte. Aceste modele sunt orientate pe reprezentarea
semnificaiei datelor. Structura de baz folosit pentru reprezentarea datelor este cea de clas
de obiecte definit prin abstractizare din entitatea fizic pe care o regsim n lumea real.
Aici exist entiti simple i clase de entiti care se reprezint prin obiecte simple sau clase
de obiecte, ordonate n ierarhii de clase i subclase. Acest tip de baz de date a aprut din
necesitatea gestionrii obiectelor complexe: texte, grafice, hri, imagini, sunete (aplicaii
multimedia) i a gestionrii obiectelor dinamice: programe, simulri.

1.5. Sistem de gestiune a bazelor de date

Sistemele de gestiune a bazalor de date (DBMS DataBase Management System) sunt sisteme
informatice specializate n stocarea i prelucrarea unui volum mare de date, numrul prelucrrilor
fiind relativ mic.
Termenul de baz de date se va referi la datele de prelucrat, la modul de organizare a acestora
pe suportul fizic de memorare, iar termenul de gestiune va semnifica totalitatea operaiilor ce se
aplic asupra datelor din baza de date.
n arhitectura unui sistem de baze de date SGBD ocup locul central.
Un SGBD este ansamblul software interpus ntre utilizatori i baza de date i este un interpretor
de cereri de acces sau regsire de date n baza de date, execut cererea i returneaz rezultatul.
SGBD este un sistem de programe care faciliteaz procesul definirii, construcei, organizrii i
manipulrii datelor pentru diverse aplicaii. Utilizatorul are acces la SGBD prin intermediul unei
interfee (aplicaie) cu ajutorul creia stabilesc parametrii interogrii i se primete rspuns; ntreg
ansamblul este descris n Figura 3.

Aplicaie SGBD
Utilizator Baza de
date

Fig. 3

Organizarea pe trei niveluri a sistemelor de baze de date este strns legat de conceptul de
independen a datelor, n sensul c sistemul bazei de date poate fi modificat la orice nivel fr a
11 Baze de date

afecta nivelurile superioare. Independena datelor poate fi privit n dou moduri, corespunztoare
nivelurilor conceptual (logic) i intern (fizic).

Independena logic a datelor reprezint capacitatea modificrii schemei conceptuale fr a


provoca modificri n schema extern sau n programele de aplicae. Schema conceptual se poate
modifica prin mrirea bazei de date datorit adugrii de noi tipuri de nregistrri (o nou coloan
ntr-o tabel) sau date (nregistrri) sau micorarea bazei de date n cazul tergerii unor nregistrri.

Independenafizic a datelor este dat de capacitatea de schimbare a schemei interne fr


modificarea schemei conceptuale sau externe.

Funcionarea unui SGBD se realizeaz prin comenzi specifice limbajului SQL. Nivelele
conceptual i intern nefiind distinct delimitate sunt adresate printr-un limbaj comun numit DDL
Data Definition Language, utilizat pentru administrarea i proiectarea bazei de date n definirea
ambelor scheme. Dac SGBD are o delimitare clar ntre nivelul conceptual i cel intern, atunci
DDL se folosete pentru comenzile la nivel conceptual, iar pentru specificarea schemei interne se
folosete limbajul SDL Storage Definition Language. Pentru cel de al treilea nivel, extern, se
folosete limbajul VDL View Definition Language, destinat utilizatorilor i pentru interfaa
acestora cu nivelul conceptual. Pentru operaiile tipice legate de cutare, inserare, tergere i
modificarea datelor, SGBD dispune de un limbaj de manipulare numit DML - Data Manipulation
Language.

1.5.1. Interfee SGBD

Un SGBD este un ansamblu complex de programe care asigur interfaa ntre o baz de date i
utilizatorii acesteia. SGBD este componenta software a unui sistem de baze de date care
interacioneaz cu toate celelalte componente ale acestuia asigurnd legtura i interdependena
ntre ele.
Un SGBD ofer interfeele corespunztoare tuturor categoriilor de utilizatori pentru a facilita
legtura acestora cu baza de date. Principalele tipuri de interfee:
Interfee pe baz de meniuri care ofer utilizatorilor o list de opiuni (meniuri) pentru
formularea interogrilor.
1. Bnci i baze de date 12

Interfee grafice afieaz utilizatorului un set de diagrame, cererile sunt formulate prin
manipularea acestor diagrame. De cele mai multe ori interfeele grafice sunt asociate cu
meniurile.
Interfee bazate pe videoformate se utilizeaz pentru introducerea de noi date,
actualizarea bazei de date i cutare.
Interfee n limbaj natural accept comenzi scrise n limba englez sau alte limbi de
circulaie internaional. Interpretarea cererilor se face pe baza unui set de standard de
cuvinte cheie ce sunt interpretate pe baza schemei interne.
Interfee specializate pentru cereri repetate (limbaj de comand) sunt destinate unei
anumite categorii de utilizatori, de exemplu pentru angajaii unei bnci se
implementeaz un mic set de comenzi prescurtate pentru a micora timpul necesar
introducerii comenzii.
Interfee pentru administrarea bazei de date se utilizeaz pentru comenzile privilegiate
utilizate de administratorii bazei de date i se refer la crearea de conturi, parole, setarea
parametrilor sistemului, autorizarea intrrii pe un anumit cont, reorganizarea structurii de
stocare a datelor din baza de date, accsul la e, nregistrri.

Exemple de SGBD: MySQL, Microsoft SQL, Microsoft Access, Visual FoxPro, Oracle.

1.5.2. Funcii i servicii oferite de un SGBD

Un SGBD trebuie s asigure funciile (Figura 4):


funcia de descriere a datelor se face cu ajutorul LDD, realizndu-se descrierea atributelor
din cadrul structurii bazei de date, legturile dintre entitile bazei de date, se definesc
eventualele criterii de validare a datelor (5.1.3.), metode de acces la date, integritatea
datelor. Concretizarea acestei funcii este schema bazei de date.
funcia de manipulare este cea mai complex i realizeaz actualizarea i regsirea datelor.
funcia de utilizare asigur mulimea interfeelor necesare pentru comunicare a tuturor
utilizatorilor cu baza de date.
Categorii de utilizatori:
neinformaticieni beneficiarii informaiei, nu trebuie s cunoasc structura bazei de date, nu
trebuie s programeze aplicaii, ci doar s le foloseasc prin intermediul unei interfee suficient
de prietenoase.
13 Baze de date

informaticieni creaz structura bazei de date i realizeaz procedurile complexe de exploatare


a bazei de date;
administratorul bazei de date utilizator special, cu rol hotrtor n funcionarea optim a
ntregului sistem.
funcia de administrare administratorul este cel care realizeaz schema conceptual a
bazei de date, iar n perioada de exploatare a bazei de date autorizeaz accesul la date, reface
baza n caz de incident.
funcia de protecie a bazei de date ansamblul de msuri necesare pentru asigurarea
integritii (semantic, acces concurent, salvare/restaurare) i securitii datelor (autorizare
acces, utilizare viziuni, criptare).

UTILIZATORI

FUNCIILE
SGBD UTILIZARE

MANIPULARE DESCRIERE ADMINISTRARE

BAZA DE
DATE

Fig. 4
Prin acestea, un SGBD trebuie s asigure:
definirea crearea bazei de date;
introducerea (adugarea) datelor n baza de date;
modificarea structurii sau a unor date deja existente n baza de date;
tergerea datelor din baza de date;
consultarea bazei de date interogare/extragerea datelor.
1. Bnci i baze de date 14

n plus un SGBD mai asigur i alte servicii:


suport pentru limbaj de programare;
interfa ct mai atractiv pentru comunicarea cu utilizatorul;
tehnici avansate de memorare, organizare, accesare a datelor din baza de date;
utilitare ncorporate: sistem de gestiune a fiierelor, listelor, tabelelor etc.;
help pentru ajutarea utilizatorului n lucrul cu baza de date.

Apariia i rspndirea reelelor de calculatoare a dus la dezvoltarea SGBD-urilor n direcia


multiuser: mai muli utilizatori folosesc simultan aceeai baz de date.
Principalul avantaj al reelelor a fost eficiena mult sporit de utilizare a resurselor sistemelor de
calcul: la o baz de date aflat pe un server central au acces simultan mai muli utilizatori, situai la
distan de server, de unde rezult o bun utilizare a resurselor server-ului i o economie de
memorie datorat memorrii unice a bazei de date.
Un SGBD este dotat cu un limbaj neprocedural de interogare a bazei de date SQL care
permite accesul rapid i comod la datele stocate n baza de date.

1.5.3. Activitile asigurate de SGBD

Un SGBD trebuie s asigure urmtoarele activiti:


definirea i descrierea structurii bazei de date se realizeaz printr-un limbaj propriu, limbaj
de definire a datelor (LDD), conform unui anumit model de date;
ncrcarea datelor n baza de date se realizeaz prin comenzi n limbaj propriu, limbaj de
manipulare a datelor (LMD);
accesul la date se realizeaz prin comenzi specifice din limbajul de manipulare a datelor.
Accesul la date se refer la operaiile de interogare i actualizare.

Interogarea este complex i presupune vizualizarea, consultarea, editarea de situaii de


ieire (rapoarte, liste, regsiri punctuale).
Actualizarea presupune trei operaiuni: adugare, modificare (efectuate prin respectarea
restriciilor de integritate ale bazei de date) i tergere;
ntreinerea bazei de date se realizeaz prin utilitare proprii ale SGBD;
reorganizarea bazei de date se face prin faciliti privind actualizarea structurii bazei de
date i modificarea strategiei de acces. Se execut de ctre administratorul bazei de date;
15 Baze de date

securitatea datelor se refer la asigurarea confidenialitii datelor prin autorizarea i


controlul accesului la date, criptarea datelor, realiarea de copii ale programelor i fiierelor
de baz.

1.5.4. Obiectivele unui SGBD

Un SGBD are rolul de a furniza suportul software complet pentru dezvoltarea de aplicaii
informatice cu baze de date.
El trebuie s asigure:
minimizarea costului de prelucrare a datelor,
reducerea timpului de rspuns,
flexibilitatea aplicaiilor i
protecia datelor.

Pentru satisfacerea performanelor enumerate, SGBD trebuie s asigure un minim de obiective.


1. Asigurarea independenei datelor trebuie privit din dou puncte de vedere:
independena logic se refer la posibilitatea adgrii de noi tipuri de nregistrri de date
sau extinderea structurii conceptuale, fr a determina rescrierea programelor de
aplicaie;
independena fizic modificarea tehnicilor fizice de memorare fr a determina rescrierea
programelor de aplicaie.
2. Asigurarea redundanei minime i controlate a datelor stocarea informaiilor n bazele de
date se face astfel nct datele s nu fie multiplicate. Totui, pentru a mbunti
performanele legate de timpul de rspuns, se accept o anumit redundan a datelor,
controlat, pentru a asigura coerena bazei de date i eficiena utilizrii resurselor
hardware.
3. Asigurarea facilitilor de utilizare a datelor presupune ca SGBD-ul s aib anumite
componente specializate pentru:
folosirea datelor de ctre mai muli utilizatori n diferite aplicaii datele de la o aplicaie
trebuie s poat fi utilizate i n alte aplicaii.
accesul ct mai simplu al utilizatorilor la date fr ca ei s fie nevoii s cunoasc
structura ntregii baze de date; aceast sarcin cade n seama administratorului bazei de date.
existena unor limbaje performante de regsire a datelor care permit exprimarea
interactiv a unor cereri de regsire a datelor.
1. Bnci i baze de date 16

sistemul de gestiune trebuie s ofere posibilitatea unui acces multicriterial la informaiile


din baza de date spre deosebire de sistemul clasic de prelucrare pe fiiere unde exist un
singur criteriu de adresare, cel care a stat la baza organizrii fiierului.
4. Asigurarea securitii datelor mpotriva accesului neautorizat.
5. Asigurarea coerenei i integritii datelor mpotriva unor tergeri intenionate sau
neintenionate se realizeaz prin intermediul unor proceduri de validare, a unor protocoale
de control concurent i a unor proceduri de refacere a bazei de date.
6. Asigurarea partajabilitii datelor se refer pe de o parte la asigurarea accesului mai
multor utilizatori la aceleai date i de asemenea la posibilitatea dezvoltrii unor aplicaii
fr a se modifica structura bazei de date.
7. Asigurarea legturilor ntre date corespund asocierilor care se pot realiza ntre obiectele
unei aplicaii informatice. Orice SGBD trebuie s permit definirea i descrierea structurii
de date, precum i a legturilor dintre acestea, conform unui model de date (de exemplu,
modelul relaional).
8. Administrarea i controlul datelor sunt asigurate de SGBD, n sensul c datele pot fi
folosite de mai muli utilizatori n acelai timp, iar utilizatorii pot avea cerine diferite i care
pot fi incompatibile. SGBD trebuie s rezolve probleme legate de concuren la date,
problem care apare mai ales n lucrul n mediu de reea de calculatoare.
17 Baze de date

2. Etapele de realizare a unei bnci de date

2.1. Etapa de analiz

Proiectarea unei baze de date const din proiectare logic i fizic a acesteia astfel nct s
rspund cerinelor utilizatorilor pentru un anumit set de aplicaii specifice. n general, proiectarea
corect a unei baze de date parcurge etapele de analiz i programare. Pentru etapa de analiz se
recomand parcurgerea pailor:
1. Studierea problemei de rezolvat const din studiul i descrierea activitilor pentru care se
va organiza baza de date (cerine i resurse);
2. Proiectarea structurii bazei de date are ca principale activiti alegerea modelului de
SGBD, proiectarea funciilor bazei de date, stabilirea intrrilor i ieirilor aplicaiilor;
3. Stabilirea modului de memorare a datelor n memorie (temporare) sau pe disc n baza de
date, pentru care trebuie stabilit i structura;
4. Stabilirea algoritmului general de rezolvare a problemei la nivel de schem bloc;
5. Stabilirea structurii meniului principal al aplicaiei acesta trebuie s conin opiuni
pentru toate funciunile sistemului informatic care sunt accesibile utilizatorului.
6. mprirea aplicaiei pe programe fiecare program urmrete rezolvarea unei pri a
problemei generale.

2.2. Etapa de programare

n etapa de programare se recomand urmrirea pailor:


1. Elaborarea programelor: realizarea componentelor logice programe/aplicaii ncepnd
cu programul monitor (principal), continund cu cele de introducere/actualizare a datelor, cu
cele de prelucrare i terminnd cu programele de interogare baza de date i extragere de
informaii.
2. Testarea funcionrii corecte a programelor individuale i a sistemului n ansamblu
pentru ct mai multe situaii posibile (ideal ar fi testarea n toate situaiile posibile, dar
numrul acestora este foarte mare) incluznd n mod obligatoriu i situaiile limit.
3. nlturarea erorilor depistate i reluarea pasului 2. Dac nu mai sunt erori, se continu cu
urmtoarea etap.
2. Etapele de realizare a unei bnci de date 18

2.3. Punerea n funciune i exploatarea bazei de date

1. ncrcarea i manipularea datelor operaii de actualizare i consultare, ntreinere


(dezvoltare) a bazei de date.
2. Elaborarea documentaiei de utilizare care se pred beneficiarului, ct i documentaia
tehnic a sistemului (de preferat ca fiecare program s aib cte o fi tehnic, pentru o mai
uoar depanare, ntreinere).

Introducere date Aplicaie Extragere de date

Meniuri utilizator Rapoarte statistice


Baze de date
Ferestre utilizator Consultri curente

Ecrane utilizator Programe ------

Schema bloc a unei aplicaii din punct de vedere utilizator


Fig. 5

Date de la Rezultate
utilizator Programul utilizator

Meniul principal

Rapoart
Programe de
Programe de
Programe Ecrane de Filtre extragere
pentru introducere date
introducere
date Export
Import Baza de date

Schema bloc a unei aplicaii din punct de vedere al proiectantului


Fig. 6
Not: Programele de extragere date pot fi elaborate de programator sau pot fi obinute cu
generatoarele incluse n SGBD.
19 Baze de date

ntreaga activitate din sistem este controlat de programul monitor care conine un meniu
principal definit de utilizator. Programele aplicaiei pentru introducerea datelor, prelucrare,
actualizare i extragere de date sub form de rapoarte se afl sub controlul programului monitor.

2.4. Documentaia aplicaiei

Deoarece etapa de analiz este proprie fiecrei aplicaii n parte, nu se recomand detalierea
etapelor 1 6. De aceea n cele ce urmeaz este detaliat documentarea programelor prin fia
tehnic, fi care trebuie s conin rubricile:
Program nume;
Scop;
Parametri;
Variabile de intrare, de ieire;
Ce programe apeleaz;
Care sunt programele care l apeleaz;
Ce fiiere utilizeaz;
Explicaii - sub form de comentarii n programele surs;
Programul surs.

n 12.2.2 se arat cum se obine n mod automat, cu ajutorul VFP, documentarea unei aplicaii
realizat cu acest sistem.
3. Sisteme de gestiune a bazelor de date relaionale 20

3. Sisteme de gestiune a bazelor de date relaionale

3.1. Modelul relaional al datelor

Un sistem de gestiune a bazelor de date relaionale se definete ca fiind un sistem de gestiune


care utilizeaz organizarea datelor conform modelului relaional. Conceptul de baz al modelului
relaional este acela de relaie/tabel (limbajul SQL specializat n comenzi de manipulare la nivel de
tabel).

3.1.1. Structura relaional a datelor

Structura relaional a datelor cuprinde urmtoarele componente.

Domeniul este ansamblul de valori caracterizat printr-un nume (domeniu de valori). El poate fi
precizat explicit prin enumerarea tuturor valorilor care aparin domeniului sau implicit prin
precizarea proprietilor pe care le au valorile din domeniu. Pentru un ansamblu de valori D1 ,..., Dn

produsul cartezian al acestora reprezint ansamblul tuplurilor (v1 ,..., vn ) , unde v1 este o valoare din

D1, v2 este o valoare din D2, etc., iar tuplura corespunde unei linii din tabel.

Relaia (tabela) este un subansamblu al produsului cartezian al mai multor domenii, caracterizat
prin nume i care conine tupluri cu semnificaie (tabel). ntr-o relaie, tuplurile trebuie s fie
distincte nu se admit duplicate. O reprezentare a relaiei este tabelul bidimensional (tabela de date)
n care liniile reprezint tuplurile, iar coloanele corespund domeniilor. Numrul tuplurilor dintr-o
tabel este cardinalul tabelei, numrul valorilor dintr-un tuplu este gradul tabelei. Pentru a
diferenia coloanele care conin valori ale aceluiai domeniu, eliminnd dependena de poziie, se
asociaz fiecrei coloane un nume distinct atribut. n timp ce tuplurile sunt unice, un domeniu
poate aprea de mai multe ori n produsul cartezian pe baza cruia este definit tabela.
Tabelul 1 prezint comparativ conceptele utilizate n organizarea datelor n fiiere, n baze de
date, conceptele din teoria relaional i din SGBDR.
21 Baze de date

Tabelul 1
Fiiere Teoria BD Teoria relaional SGBDR
Fiier Colecie de date Relaie Tabel
nregistrare Familie de caracteristici Tuplu Linie
Cmp Caracteristic Atribut Nume coloan
Valoare Domeniu de Valori Domenii Domeniu coloan

3.1.2. Operaii n algebra relaional

Reuniunea operaie n algebra relaional, definit pe dou relaii R1 i R2, ambele cu aceeai
schem (structur), ce const din construirea unei noi relaii R3, cu schema identic cu R1 i R2,
avnd drept extensie (nregistrrile) tuplurile din R1 i R2 luate mpreun, o singur dat.

Diferena definit pe dou relaii R1 i R2, cu aceeai schem, avnd drept extensie tupluri ale
relaiei R1 care nu se regsesc n relaia R2.

Produs cartezian definit pe dou relaii R1 i R2, operaie care const din construirea unei noi
relaii R3, a crei schem se obine din concatenarea schemelor relaiilor R1 i R2, i a crei extensie
cuprinde toate combinaiile tuplurilor din R1 cu cele din R2.

Proiecia operaie din algebra relaional definit asupra unei relaii R, ce const din construirea
unei noi relaii P, n care se regsesc numai acele atribute din R specificate explicit n cadrul
operaiei. Suprimarea unor atribute din R nsemn efectuarea unor tieturi verticale asupra lui R i
pot avea ca efect apariia unor tupluri duplicate, care se cer a fi eliminate. n practic, operaia de
proiecie se face considernd i un cmp care conine o cheie unic, astfel nct fiecare nregistrare
devine unic.

Selecia operaie n algebra relaional definit asupra unei relaii R, care const din construirea
unei relaii S, a crei schem este identic cu cea a relaiei R i a crei extensie este constituit din
acele tupluri din R care satisfac o condiie explicit n cadrul relaiei. Deoarece nu toate tuplurile din
R satisfac condiia, selecia nseamn efectuarea de tieturi pe orizontal asupra relaiei R, adic
eliminarea de tupluri. Condiia precizat n cadrul operaiei de selecie este de forma:

<Atribut> <operator de compataie> <Valoare>


3. Sisteme de gestiune a bazelor de date relaionale 22

Jonciunea (join-ul) operaie n algebra relaional definit pe dou relaii R1 i R2, care const din
construirea unei noi relaii R3, prin concatenarea unor tupluri din R1 cu tupluri din R2. Se
concateneaz acele tupluri din R1 i R2 care satisfac o anumit condiie, specificat explicit n cadrul
operaiei. Extensia relaiei R3 va conine combinaiile acelor tupluri care satisfac condiia de
concatenare. Cel mai important tip de join din punct de vedere al utilizrii este equijoin-ul, care este
o jonciune dirijat de o condiie de forma:

<Atribut din R1> = <Atribut din R2>

Jonciunea natural se refer la equijoin-ul aplicat tuturor cmpurilor comune. Operatorul pentru
jonciunea natural este * .

Jonciunea exterioar (outer join) include trei tipuri de jonciune:


Jonciunea exterioar stnga care include toate tuplurile din partea stng a relaiei,
iar n partea dreapt a relaiei include numai acele tupluri care au corespondent.
Jonciunea exterioar dreapta care include toate tuplurile din partea dreapt a
relaiei, iar n partea stng a relaiei include numai acele tupluri care au corespondent.
Jonciunea exterioar complet care include toate tuplurile din stnga i din dreapta
relaiei.

Intersecia operaie din algebra relaional definit pe dou relaii R1 i R2, ambele cu aceeai
schem, care const din construirea unei noi relaii R3, cu schema identic cu a operanzilor i cu
extensia format din tuplurile din R1 i R2.

Diviziunea operaie din algebra relaional definit asupra unei relaii R, care const din
construirea cu ajutorul unei relaii r a relaiei Q. Tuplurile relaiei Q concatenate cu tuplurile relaiei
r permit obinerea tuplurilor relaiei R.

Exemple
Pentru a nelege mai bine aceste operaii s presupunem c avem urmtoarele trei structuri de
date:
23 Baze de date

1. Y1 fiier nchirieri maini


Sofer_id Auto_id Ziua
22 101 10/10/2004
58 103 11/12/2004

2. S2 fiier clieni
Sofer_id Sofer _nume Permis_ani
22 Ionescu Paul 7
31 Leahu Mihai 8
58 Arsene Ion 10

3. S3 fiier clieni
Sofer_id Sofer _nume Permis_ani
28 Doncea Horia 5
31 Leahu Mihai 8
44 Coman Stefan 12
58 Arsene Ion 10

Semnificaia structurilor de date este urmtoarea:


- n relaia Y1 se stocheaz informaii referitoare la mainile rezervate cu atributele: Sofer_id
codul oferului, Auto_id codul mainii nchiriate, Ziua data la care a fost nchiriat;
- n relaiile S2 i S3 se stocheaz informaii referitoare la oferi (fragmentat), cu urmtoarele
atribute: Sofer_id codul oferului (pentru a stabili o legtur ntre structura de date Y1 i
S2, S3), Sofer_nume numele oferului, Permis_ani vechimea permisului de conducere.
Principalele operaii:
- Reuniunea R3 = S2 S3

Sofer_id Sofer _nume Permis_ani


22 Ionescu Paul 7
31 Leahu Mihai 8
58 Arsene Ion 10
44 Coman Stefan 12
28 Doncea Horia 5
3. Sisteme de gestiune a bazelor de date relaionale 24

- Intersecia R3 = S2 S3

Sofer_id Sofer _nume Permis_ani


31 Leahu Mihai 8
58 Arsene Ion 10

- Diferena S2 - S3

Sofer_id Sofer _nume Permis_ani


22 Ionescu Paul 7

- Produs cartezian, Y 1 S 2 . Fiecare linie din relaia Y1 se combin cu fiecare linie din
relaia S2; ca rezultat al produsului cartezian, apare un conflict deoarece ambele relaii Y1 i
S2 au cte un cmp cu numele sofer_id, care poate fi rezolvat prin operaia de redenumire.

Comanda SQL pentru pentru produs cartezian Y 1 S 2 este dat n Figura 1.

Operatorul redenumire se utilizeaz sub forma:


(C(1Sofer_id1,5Sofer_id2), Y1 S2)
cu urmtoare interpretare: se redenumete coloana 1 n Sofer_id1 i coloana 5 n Sofer_id2, n
relaia dat de produsul cartezian obinut din relaiile Y1 i S2.

- Proiecia. Deoarece valorile dintr-un domeniu se pot repeta este necesar eliminarea
repetrilor:
25 Baze de date

Sofer_nume,Permis_ani(S3)
Sofer _nume Permis_ani
Doncea Horia 5
Leahu Mihai 8
Coman Stefan 12
Arsene Ion 10

- Selecia Permis_ani > 8(S3)

Sofer_id Sofer _nume Permis_ani


44 Coman Stefan 12
58 Arsene Ion 10

Din relaia S3 au fost selectate numai acele nregistrri care satifac condiia de vechime a
permisului (mai mult de 8 ani).

Operaia de proiecie se poate combina cu cea de selecie pentru optimizarea cererilor de date;
de exemplu dac dorim extragerea datelor din relaia S3 numai pentru cmpurile Sofer_nume i
Permis_ani mai mare de 8 ani:
Sofer_nume,Permis_ani(Permis_ani > 8(S3))

Sofer _nume Permis_ani


Coman Stefan 12
Arsene Ion 10

Jonciunea (join-ul). Operaia de jonciune condiionat a dou relaii este echivalent cu


selecia condiionat a produsului cartezian al celor dou relaii.
S2 S2.Sofer_id < Y1. Sofer_id Y1

(Sofer_id) Sofer _nume Permis_ani (Sofer_id) Auto_id Ziua


22 Ionescu Paul 7 58 103 11/12/2004
31 Leahu Mihai 8 58 103 11/12/2004
3. Sisteme de gestiune a bazelor de date relaionale 26

Operaia de jonciune condiionat mai poart uneori i numele de theta-join.


Pentru acest exemplu, equijoin-ul, caz special al jonciunii condiionate n care condiia c
conine doar egalitai, devine
S2 Sofer_id Y1

Sofer_id Sofer _nume Permis_ani Auto_id Ziua


22 Ionescu Paul 7 101 10/10/2004
58 Arsene Ion 10 103 11/12/2004

Noua relaie rezultat din equijoin este similar cu produsul cartezian dintre S2 i Y1, dar
numai o copie a cmpului pentru care este specificat egalitatea, va fi specificat n noua relaie (nu
mai apare duplicarea cmpului).
Exemple de jonciuni exterioare
jonciune exterioar stnga
Y1 Y1.Sofer_id=S2.Sofer_id S2

jonciune exterioar dreapta

Y1 Y1.Sofer_id=S2.Sofer_id S2

jonciune exterioar compet

Y1 Y1.Sofer_id=S2.Sofer_id S2
27 Baze de date

De remarcat prezena cmpurilor cu valoarea NULL utilizat n jonciuni pentru a specifica


lipsa de date.
Presupunnd c tabele au fost create, programul surs pentru testarea celor trei tipuri de
jonciuni exterioare este prezentat n Figura 1.

Fig. 1

Diviziunea Se utilizeaz la exprimarea interogrilor de tipul: Gsete automobilistul care a


rezervat toate automobilele.
{
A / B = x x, y A, y B }
3. Sisteme de gestiune a bazelor de date relaionale 28

relaia obinut prin diviziune va conine toate tuplurile x care pentru fiecare tuplur y din B nu
are asociat un tuplu xy n A. Pentru a nelege mai bine operaia de diviziune vom considera
urmtorul exemplu, n care considerm tabelul A1 (cmpuri xx_no, yy_no) i tablele B1, B2, B3
(un singur cmp yy_no, corespondent cu cel din tabelul A) i realizm operaiile de diviziune
A1/B1, A1/B2, A1/B3:

Secvena de program care realizeaz cele trei operaii de diviziue se gsete n figura 1, ultima
seciune *Diviziune. Rezultatul celor trei comenzi SQL este:

A1/B1 A1/B2 A1/B3

3.1.3. Optimizarea cererilor de date

Se realizeaz n dou etape:


1. exprimarea cererilor de date sub forma unor expresii algebrice relaionale care au la baz
echivalena dintre calculul relaional i algebra relaional,
29 Baze de date

2. aplicarea unor transformri algebrice asupra expresiilor obinute n etapa precedent, n


scopul obinerii unor expresii echivalente cu cele iniiale, dar care s fie executate mai
eficient.

Proprieti
Comutativitatea operaiilor de join i produs cartezian:
E1 >< E 2 = E 2 >< E1
E1 E 2 = E 2 E1
Asociativitatea operaiilor de join i produs cartezian:
( E1 >< E 2 ) >< E3 = E1 >< ( E 2 >< E3 )
( E1 E 2 ) E3 = E1 ( E 2 E3 )
Compunerea proieciilor
Compunerea seleciilor F1 ( F2 ( E )) = F1 F2 ( E ) , deoarece F1 I F2 = F 2 I F1 , seleciile se pot

comuta:
F 1 ( F 2 ( E ) ) = F 2 ( F 1 ( E ) )
Comutarea seleciei cu proiecia
Comutarea seleciei cu produsul cartezian
Comutarea seleciei cu reuniunea
Comutarea seleciei cu diferena
Comutarea proieciei cu produsul cartezian
Comutarea proieciei cu reuniunea
Prin deplasarea operaiilor de selecie ct mai la stnga expresiilor algebrice se reduce numrul
de tupluri care trebuie manipulate n procesul de executare a cererii.
Se pot meniona urmtoarele strategii de optimizare a cererilor de date:
Deplasarea operaiei de selecie naintea operaiei de jonciune jonciunea i produsul
cartezian acioneaz ca generatori de tupluri. Prin selecie se reduce dimensiunea relaiilor la
care se aplic aceti generatori de tupluri. Se ine seama c operaia de jonciune poate fi
exprimat sub forma unui produs cartezian urmat de o selecie, iar n cazul jonciunii
naturale printr-un produs cartezian urmat de de o selecie i de o proiecie.
Deplasarea operaiilor de proiecie naintea operaiilor de jonciune se realizeaz prin
folosirea proprietii de comutare a seleciei cu produsul cartezian
Combinarea seleciilor multiple se realizeaz cu ajutorul relaiei de compunere a
seleciilor.
3. Sisteme de gestiune a bazelor de date relaionale 30

Deplasarea operaiilor de selecie naintea operaiilor de proiecie- realizat pe baza


proprietii de comutare a seleciei cu proiecia. Eliminarea tuplurilor duplicate obinute prin
proiecie se face prin ordonarea tuplurilor. Selecia reduce numrul tuplurilor ce trebuiesc
ordonate facilitnd operaia de proiecie.

3.1.4. Baze de date relaionale

Conceptul bazelor de date relaionale este axat pe metodologia entitate-tabel (E-T).


Entitile modeleaz obiectele care sunt implicate ntr-o organizaie, de exemplu studenii,
profesorii i cursurile dintr-o universitate.
Tabelele modeleaz legturile dintre entiti, de exemplu profesorii predau cursuri. n plus,
restriciile de integritate aplicate entitilor i relaiilor formeaz o parte important a specificaiilor
E-T, de exemplu, un profesor poate preda un singur curs la o anumit or dintr-o anumit zi.
Entitile similare pot fi agregate n tipuri de entiti. De exemplu, Ionescu, Popescu, Albu,
pot fi agregai n tipul de entitate PERSOAN, pe baza faptului c aceste entiti sunt oameni.
Ionescu i Albu pot aparine tipului de entitate STUDENT, deoarece aceste obiecte sunt studeni.
La fel ca tabelele, entitile sunt descrise utiliznd atribute. Fiecare atribut specific o
particularitate semnificativ a entitii. De exemplu, atributul Nume al unei entiti de tip
PERSOAN specific irul de caractere care alctuiete numele persoanei din lumea real. De
asemenea, Vrsta este atribuitul care specific de cte ori Pmntul a nconjurat Soarele fa de
momentul n care o anumit persoan s-a nscut. Pentru fiecare atribut, se asociaz un domeniu care
specific setul de valori pe care le poate lua atributul. n principiu, este posibil ca dou entiti
diferite ale aceluiai tip s posede valori identice pentru toate atributele.
Atributelor li se asociaz valori care au drept scop identificarea entitii, realizndu-se o
nregistrare n tabela respectiv. Atribute pot fi:
- complexe - cele care pot fi divizate n mai multe pri cu semnificaie independent. De
exemplu, atributul Adresa poate fi divizat n mai multe atribute: Ora, Cod potal, Strad, Numr,
Bloc, Etaj, Nr_Apartament. Una din cerinele importante referitoare la valorile din domeniu se
refer la atomicitatea datelor. Atomicitatea datelor nu nseamn c aceste valori nu se pot
descompune, datele pot fi iruri de caractere, ceea ce nseamn c pot fi descompuse. Cerina de
atomicitate se refer la faptul c modelul relaional nu specific nici un mijloc pentru a privi n
interiorul structurii valorilor, astfel c valorile sunt invizibile pentru operatorii relaionali;
31 Baze de date

- cu o singur valoare din setul de valori ale atributului pentru fiecare entitate exist numai
o singur valoare, nerepetabil la o alt entitate. De exemplu, CNP (Codul Numeric Personal)
pentru o persoan este unic i nici o alt persoan nu mai are atribuit aceeai valoare a CNP;
- cu set de valori atributul poate lua orice valoare din set i care se poate repeta pentru o alt
entitate. Este cazul culorilor (dou mrci de main diferite pot avea aceai culoare) sau gradul
cadrelor didactice;
- derivate sunt cele ce se pot determin din alte atribute, de exemplu vrsta unei persoane se
poate determina scznd din data curent data naterii persoanei respective, sau determinarea valorii
unei entiti prin produsul dintre preul unitar i cantitate. Prezena atributelor derivate mpreun cu
cele primare cresc gradul de redundan al datelor din baza de date i trebuie evitat;
- fr valoare (NULL) bazele de date accept i posibilitatea lipsei datelor pentru cmpurile
anumitor nregistrri, de exemplu, din atributul Adres, poate lipsi Numele_blocului sau Nr_Scara.
Cheile de restricie introduse n modelul relaional sunt asociate cu tipurile de entiti, de
exemplu, dou persoane diferite nu pot avea aceleai valori pentru atributele Nume i Adresa.

Schema n modelul relaional se definete ca fiind un tip de entitate compus din numele
tipului de entitate, colecia de atribute (cu domeniile asociate i indicaii n cazul n care un atribut
este complex sau cu valori unice) i cheile de restricie.

Reprezentarea diagramelor E-T tipurile de entiti reprezentate n diagramele E-T sunt sub
form de dreptunghiuri i atributele sub form de elipse. Atributele tip set de de valori (modelul
relaional permite atributelor s posede un set de valori din domeniu) sunt reprezentate n elipse
duble. Sublinierea unui atribut n diagram l desemneaz ca fiind cheie primar, adic un atribut cu
valoare unic. Figura 2 descrie o diagram E-R pentru entitatea PERSOANA:

PERSOANA

Nume Adresa CNP Copii

Fig. 2

3.1.5. Tipuri de relaii


3. Sisteme de gestiune a bazelor de date relaionale 32

Relaia unu-la-unu (1-1) este tipul cel mai simplu de relaie, prin care unui element din tabela
R1 i corespunde un singur element din tabela R2 i reciproc. Relaia 1-1 este mai rar folosit, n
general pentru a reduce numrul de atribute dintr-o tabel, de exemplu dac vrem s desprim
elementele fixe care se modific mai rar (datele personale) fa de cele care se modific mai des
(situaia colar anual).
Relaia unu-la-mai muli (1-N) este tipul de relaie prin care unui element din tabela R1 i
corespund unul sau mai multe elemente din tabela R2, iar unui element din tabela R2 i corespunde
un singur element din tabela R1. De exemplu, presupunem c avem:
- tabela FACULTATE cu atributele CodFac, Denumire, Adresa, NumeDecan;
- tabela STUDENTI cu atributele CodStud, CodFac, An, Grupa, Medie, Bursa;
ntre cele dou tabele exist o relaie 1-N prin intermediul cmpului CodFac.
Relaia mai muli-la-mai muli (M-N) prin care unui element din tabela R1 i corespunde unul
sau mai multe elemente din tabela R2 i reciproc. De exemplu, un student frecventeaz mai multe
cursuri i o disciplin este frecventat de mai muli studeni. Acest tip de relaie este frecvent
ntlnit, dar nu se poate implementa direct n bazele de date relaionale. Pentru modelare se
folosete o relaie suplimentar, de tip 1-N pentru fiecare din tabelele iniiale. Presupunnd c avem
dou tabele MATERII i STUDENTI se introduce suplimentar tabela NOTE care face legtura ntre
tabelele MATERII i STUDENTI:
- tabela MATERII are atributele CodMaterie, Denumire, An, NumeProfesor;
- tabela STUDENTI cu atributele: CodStud, CodFac, An, Grupa, Medie, Bursa;
- tabela NOTE cu atributele: CodStud, CodMaterie, Nota, Data.
Relaia unar este acea relaie care folosete o singur tabel care este asociat cu ea nsi.
Exemplul clasic este cel al managerului unei companii, care la rndul su este tot un angajat al
acestei companii.
Pentru fiecare tip de entitate participant n cadrul relaiei se definete un rol care primete un
nume pentru tipul relaiei. n diagramele E-T, tipul relaiei se reprezint sub forma unui romb. De
exemplu, tipul de relaie LUCREAZ cu atributul Data, definit n Figura 3, are dou roluri
Profesor i Departament:

Data

LUCREAZA
PROFESOR DEPARTAMENT
33 Baze de date

Fig. 3

Rolul Profesor identific entitatea PROFESOR implicat n relaia LUCREAZ, iar rolul
Departament identific entitatea DEPARTAMENT n cadrul relaiei.

n Figura 4 este prezentat o relaie ntre trei entiti: PROIECT (cu rolul Client),
PARTENER (cu rolul Produs), FURNIZOR (cu rolul Furnizor), cu tipul de relaie SOLD i
atributele Data i Pret.

Data
PRET

PROIECT PARTENER
SOLD
Produs
Client

Chei: Client, Produs, Data

FURNIZOR

Fig. 4

3.1.6. Restricia de cardinalitate

Fie C un tip de entitate i A tipul de relaie conectat la C prin intermediul rolului R.


Restricia de cardinalitate a rolului R este o declaraie de forma min..max ataat la R, care
restricioneaz numrul de instane a relaiilor de tip A n care o singur entitate de tip C poate
participa n rolul R i este un numr n intervalul min..max, Figura 5.

C
1..2 c
R

A
a1 a2 a3

D E d1 e1 d2 e2 d13 e3

Fig. 5
3. Sisteme de gestiune a bazelor de date relaionale 34

Figura 5 prezint i o diagram cu restricia de cardinalitate pentru rolul R. n partea dreapt


se prezint o instan valid a diagramei, unde entitatea C particip n dou relaii de tip A. Relaia
a3 este tiat deoarece violeaz limitele de cardinalitate 1..2 ale rolului R.

n general, modelul E-T suport restricia de cardinalitate de forma min..max, unde min este
un numr mai mare sau egal cu zero, max este un numr mai mare dect zero cu condiia
min max . n plus, max poate fi simbolizat i prin caracterul *, care reprezint infinitul. Astfel, o
restricie de forma 3..* asupra rolului R care conecteaz un tip de entitate C, cu un tip de relaie A,
nseamn c fiecare entitate de tip C trebuie s participe n rolul R, cu cel puin trei relaii de tip A
(fr limit superioar). Pentru restriciile de cardinalitate de forma N..N (unde min=max) este
adesea abreviat cu N, iar caracterul * se folosete pentru sintagma mai muli.

C
0..1

*
D B F
0..1

E
Fig. 6

n Figura 6 sunt prezentate tipuri de relaii de grad superior (4). Tipul relaiei este determinat
de restricia de cardinalitate a rolurilor unei relaii. De exemplu, relaia de tip B implic o
coresponden unu-la-unu ntre entitatea C i D. Aceasta nsemn c o entitate de tip C poate fi
asociat cu cel puin o entitate de tip D i vice versa. n acelai timp, relaia B implic o
corespunden unu-la-mai muli pentru entitile E la C i D (ca i pentru F la C i D). Aceasta
nseamn c o entitate de tip E poate fi asociat cu orice numr (inclusiv zero) de eniti de tip C i
D, dar o entitate de tip C (sau D) poate fi asociat cu cel mult o entitate de tip E. Relaia de
coresponden unu-la-mai muli nu este simetric; inversa acestei corespondene (C la E) este
numit mai muli-la-unul. Corespondena ntre E i F este numit mai muli-la-mai muli, adic o
entitate de tipul E poate fi asociat cu orice numr de entiti F i vice versa.

3.2. Regulile lui Codd


35 Baze de date

Detalierea caracteristicilor, pe care trebuie s le prezinte un SGBD pentru a fi considerat


relaional, s-a facut de E. F. Codd n 1985, sub forma a 13 reguli.

R0 Gestionarea datelor la nivel de relaie.


Toate informaiile din baza de date sunt gestionate numai prin mecanisme relaionale. Rezult c
SGBD-ul trebuie s-i ndeplineasc toate funciile utiliznd ca unitate de informaie mulimea,
adic s utilizeze limbaje (SQL) care s opereze la un moment dat pe o ntreag relaie.

R1 Reprezentarea logic a datelor


Informaiile din baza de date relaional trebuie s fie reprezentate explicit la nivel logic ntr-un
singur mod i anume ca valori n tabelele de date. Rezult c toate datele trebuie s fie memorate i
prelucrate n acelai mod. Informaiile privind numele de tabele, coloane, domenii, definiiile
tabelelor virtuale, restriciile de integritate trebuie s fie memorate tot n tabele de date (catalog).

R2 Garantarea accesului la date


Accesarea informaiilor din baza de date relaional se va face prin specificarea numelui tabelei, a
valorii cheii primare i numelui de coloan.

R3 - Valorile NULL
SGBD trebuie s permit declararea i manipularea valorilor null, cu semnificaia unor date lips
sau inaplicabile. Valorile NULL, care difer de irurile de caractere spaiu sau de irurile vide de
caractere sunt importante n implementarea restriciilor de integritate (integritatea entitii i
integritatea referenial) din modelul relaional.

R4 - Metadatele
Informaiile despre descrierea bazei de date, metadatele, trebuie s se prezinte la nivel logic n
acelai mod cu descrierea datelor propriu-zise, utilizatorul aplicnd asupra descrierii bazei de date
aceleai operaii ca i la datele obinuite. Sistemul nu trebuie s fac diferene ntre descrierea
datelor i a metadatelor utiliznd o singur structur, cea relaional.

R5 Facilitile limbajelor utilizate


Un sistem relaional trebuie s fac posibil utilizarea mai multor limbaje, n mai multe moduri.
Trebuie s existe cel puin un limbaj de nivel nalt ale crui instruciuni s poat exprima oricare din
3. Sisteme de gestiune a bazelor de date relaionale 36

urmtoarele operaii: definirea tabelelor de baz, definirea tabelelor virtuale, manipularea datelor,
definirea restriciilor de integritate, autorizarea accesului, precizarea limitelor tranzaciilor.

R6 Actualizarea tabelelor virtuale


Nu toate atributele din cadrul unei tabele virtuale, deci nu toate tabelele virtuale, sunt teoretic
actualizabile.

R7 Actualizrile n baza de date


SGBD trebuie s ofere posibilitatea manipulrii unei tabele (de baz sau virtuale) nu numai n
cadrul operaiilor de regsire, ci i n cazul celor de adugare, modificare i tergere a datelor. n
cursul operaiilor prin care se schimb coninutul bazei de date s se lucreze la un moment dat pe o
ntreag relaie.

R8 Independena fizic a datelor


Programele de aplicaie nu trebuie s fie afectate de schimbrile efectuate n modul de reprezentare
a datelor sau n metodele de acces. O schimbare a structurii fizice a datelor nu trebuie s blocheze
funcionarea programelor de aplicaie.

R9 Independena logic a datelor


Programele de aplicaie nu trebuie s fie afectate de schimbrile efectuate asupra relaiilor bazei de
date.

R10 Restriciile de integritate


Restriciile de integritate trebuie s poat fi definite n limbajul utilizat de SGBD pentru definirea
datelor i s fie memorate

R11 Distribuirea geografic a datelor


n situaia n care datele sunt distribuite, programele de aplicaie s fie logic aceleai cu cele
utilizate n cazul n care datele sunt fizic centralizate. Utilizatorul trebuie s perceap datele ca fiind
centralizate. Localizarea i recompunerea datelor distribuite cade n seama sistemului.

R12 Prelucrarea datelor la nivel de baz


37 Baze de date

Dac SGBD posed un limbaj de baz de nivel sczut orientat pe prelucrarea de nregistrri
(tupluri) i nu pe prelucrarea mulimilor (relaiilor) acest limbaj nu trebuie folosit, pentru a se evita
restriciile de integritate sau restriciile introduse prin utilizarea limbajelor relaionale de nivel nalt

3.3. Normalizarea datelor

Este procesul prin care se elimin redundana datelor n proiectul bazei de date i se
construiete un model de baz de date care susine diverse cerine funcionale i structuri alternative
ale bazei de date. Sunt aplicate n normalizarea unei baze de date urmtoarele trei reguli.

N1. Toate atributele trebuie specificate o singur dat. Aceasta este forma inti normal.

N2. Un atribut trebuie s depind n ntregime de identificatorul unic al entitii pe care o descrie.
Aceasta este forma a doua normal. Se pun atributele ntr-o tabel n care depind exclusiv de o
cheie principal. Nu se utilizeaz tabele n care atributele s nu depind exclusiv de o singur cheie!

N3. Pentru a fi n forma normal a treia, fiecare tabel trebuie s posede o singur cheie primar, iar
datele din tabel trebuie s depind exclusiv de cheia primar a tabelei.

3.4. Cerinele minimale de definire a SGBDR

Dintre primele versiuni aprute, practic nici un sistem de gestiune a bazelor de date nu reuea
s acopere n ntregime regulile lui Codd. De aceea s-au formulat o serie de criterii minimale pe
care trebuie s le satisfac un sistem de gestiune a bazelor de date pentru a putea fi considerat
relaional.
Pentru ca un SGBD s fie minimal relaional:
1. toate datele din cadrul bazei de date sunt reprezentate prin valori n tabele;
2. ntre tabele nu exist pointeri observabili de ctre utilizatori operaiile cu relaii nu fac apel
la pointeri, indeci, fiiere inverse etc.;
3. sistemul suport operatori relaionali de proiecie, selecie i jonciune natural, fr limitri
impuse. Unitatea de informaie n cadrul acestor operaii trebuie s fie relaia.
SGBD este complet relaional dac este minimal relaional i satisface n plus urmtoarele
condiii:
sistemul suport toate operaiile de baz ale algebrei relaionale;
3. Sisteme de gestiune a bazelor de date relaionale 38

sistemul suport dou dintre restriciile de integritate de baz ale modelului relaional i anume
unicitatea cheii unei relaii i restricia referenial;
SGBD este pseudorelaional dac satisface condiiile 1 i 3 de mai sus;
SGBD este cu interfa relaional dac satisface condiiile 1 i 3 de mai sus i condiia 3 este
ndeplinit numai n raport cu operaia de interogare.
39 Baze de date

4. Componentele funcionale ale sistemului Visual FoxPro

Sistemul de gestiune a bazelor de date este componenta unui sistem de baze de date, care are
rolul de a permite descrierea i manipularea datelor conform unui model de date. La acest moment,
n lume, cea mai mare parte a SGBD-urilor utilizate sunt bazate pe modelul relaional.
Visual FoxPro este un SGBD complet relaional, cu limbaj propriu, care suport un nucleu
extins din limbajul relaional SQL. Varianta Visual de FoxPro (VFP) a ajuns la versiunea 6.0
lansat n 1998 n cadrul pachetului de programe Visual Studio 6.0, care mai conine urmtoarele
programe: Visual C++, Visual Basic 6.0 i Visual Java 6.0. VFP este un sistem rapid, modularizat,
flexibil, care nu necesit resurse de calcul foarte mari, mbin programarea procedural (prin limbaj
propriu) cu cea descriptiv, pe obiecte (programare vizual).
Utilizatorii neinformaticieni au la dispoziie o gam larg de generatoare pentru ecrane,
meniuri, rapoarte etc.
Utilizatorii de specialitate (informaticieni) pot dezvolta programe n limbaj propriu i n SQL,
aplicaii (prin componentele Designer i Application).
Administratorul bazei de date are la dispoziie instrumente oferite de VFP pentru asigurarea
securitii i integritii datelor, pentru refacerea bazei de date etc.

4.1. Programarea orientat pe obiecte

n programarea orientat pe obiecte, implementat n Visul FoxPro, se utilizeaz conceptele


descrise n continuare.

Clasa de obiecte reprezint un tip abstract de date care definete structura obiectelor din acea
clas (proprietile) i mulimea de metode (operaii) pentru obiectele respective.
O clas este un model sau o schi care definete caracteristicile unui obiect i n care este
descris modul n care trebuie s arate i s se comporte obiectul. Se poate crea o clas nou
utiliznd comanda CREATE CLASS sau modulul de proiectare a clasei (Class Designer). Rezult
un fiier cu extensia .vcx (Visual Class Library) care va conine clasele definite de utilizator.
Subclass este folosit pentru definirea unei noi clase, pentru un obiect care are ca punct de
plecare definirea din alt clas (clas printe). Noua definire va moteni orice modificare din clasa
printe. O subclas poate avea toate funcionalitile unei clase existente i n plus orice control sau
funcionalitate care se dorete a fi inclus. Dac, de exemplu, clasa de baz este telefonul, se poate
4. Componentele funcionale ale sistemului Visual 40

construi o subclas care are toate funcionalitile telefonului original i n plus se pot aduga
caracteristici speciale. Astfel, subclasele permit reutilizarea secvenei de instruciuni surs
(reutilizarea codului). Utilizarea subclaselor este una din cile de reducere a mrimii codului care
trebuie scris. Se ncepe cu definirea unui obiect care este apropiat de cel dorit i se gestioneaz.

Obiectele reprezint o colecie de proprieti care se refer la aceeai entitate. Aceste


proprieti descriu structura de date a obiectului. Un obiect are un nume, prin care este referit, un
identificator unic, metode, o implementare (privat utilizatorul nu are acces) i o interfa (care
este public). Cererile adresate unui obiect pentru a returna o valoare sau pentru a schimba o stare
se numesc mesaje.
Obiectul este o instan a unei clase, care combin att date, ct i proceduri. De exemplu, un
control ntr-un videoformat (Form) este un obiect.
Clasele i obiectele sunt entiti apropiate i nrudite, dar nu se identific n totatlitate. O clas
conine informaii despre modul n care un obiect trebuie s arate i s se comporte, dar nu este
obiectul ca atare. O clas este o schi, o schem a unui obiect.
Operatorii modelului orientat pe obiecte se refer la actualizarea metodelor, a proprietilor, a
claselor, a instanelor. La baza operaiilor dintr-un astfel de model stau mesajele, care ajut
obiectele s comunice ntre ele.

Restriciile de integritate a datelor:


orice obiect respect restriciile impuse clasei din care face parte;
identificatorul obiectului asigur integritatea referirii la acesta;
accesul la obiect este limitat la folosirea protocolului de mesaje definit pentru clasa din care
face parte.

Metoda definete operaiile permise (operatorii) asupra obiectului, adic definete


comportamentul acestuia. Metoda este o aciune pe care un obiect este capabil s o realizeze. De
exemplu, obiectele de tip List Boxes au atate ca metode: AddItem, RemoveItem, Clear pentru a
gestiona coninutul listelor.

Proprietatea este un atribut al unui control, cmp sau obiect dintr-o baz de date, pe care
programatorul l stabilete pentru a defini una din caracteristicile obiectului sau un aspect al
comportrii acestuia. De exemplu, proprietatea Visible dac este fixat pe True, face ca obiectul
respectiv s fie vizibil la momentul rulrii videoformatului. Proprietile obiectului pot fi schimbate
41 Baze de date

n fereastra de proprieti, n general, n timpul proiectrii videoformatului; exist situaii cnd


anumite proprieti pot fi schimbate i n momentul execuiei videoformatului, ca urmare a apariiei
unor evenimente.

Evenimentul reprezint o aciune, recunoscut de un obiect pentru care se poate scrie o


secven de cod pentru rspuns. Evenimentele pot fi generate de o aciune a utilizatorului, cum este
apsarea butonului stng al mouse-ului (Click event) sau apsarea unei taste (Keypress event), prin
secvenele de program sau de ctre sistem (timers).

Un obiect are anumite proprieti, de exemplu, un telefon are o anumit culoare i mrime.
Cnd instalm un telefon pe birou, el are o anumit poziie. Receptorul poate fi pus sau nu n furca.
Obiectele create au de asemenea proprieti care sunt determinate de clasa din care face parte
obiectul. Aceste proprieti pot fi stabilite n momentul proiectrii sau la momentul execuiei
aplicaiei. De exemplu, anumite proprieti pe care le poate avea un obiect de tip Check Box sunt
enumerate mai jos:

Proprietate Descriere
Caption Textul descriptiv de pe lng Check Box
Enabled Specific dac un obiect Check Box poate fi adresat de utilizator.
ForeColor Culoarea textului stabilit prin Caption.
Left Poziia fa de marginea din stnga a obiectului Check Box.
MousePointer Forma pointer-ului cnd trecem pe deasupra obiectului cu mouse-ul.
Top Poziia fa de marginea de sus a obiectului Check Box.
Visible Specific cnd un obiect Check Box este vizibil.

Fiecare obiect recunoate i rspunde la anumite aciuni numite evenimente. Un eveniment este
o activitate specific i predeterminat iniiat de utilizator sau de sistem. Evenimentele, n
majoritatea cazurilor, sunt generate de interaciunea cu utilizatorul. De exemplu, la telefon, un
eveniment este declanat n momentul n care un utilizator ridic receptorul din furc. Evenimentele
sunt declanate i atunci cnd utilizatotul apas pe butoane pentru a forma un numr de apel.
n Visula FoxPro aciunile utilizatorului care declaneaz evenimente includ: apsarea
butonului stng de la mouse (Click), micarea mouse-ului (MouseMove) i apsarea unei taste
4. Componentele funcionale ale sistemului Visual 42

(Keypress). Sistemul poate iniia evenimente n cazul n care ntlnete o linie de cod care cauzeaz
eroare, cum ar fi mesaje specifice i chiar ntreruperea execuiei aplicaiei.
Metodele sunt proceduri care sunt asociate cu un obiect. Metodele sunt diferite de procedurile
normale din Visual FoxPro: metodele sunt legate intrinsec de evenimente.
Evenimentele pot avea asociate metode. De exemplu, dac se scrie un cod pentru o metod
pentru evenimentul Click, acel cod este executat atunci cnd are loc evenimentul Click. De
asemenea, metodele pot exista independent de orice eveniment. Metodele trebuie s fie apelate
explicit n cod. Setul de evenimente este fix, nu se pot crea evenimente noi!
S considerm cteva evenimente asociate cu un obiect de tip check box:

Eveniment Descriere
Click Utilizatorul face click pe check box.
Utilizatorul selecteaz check box cu mouse-ul sau
GotFocus
apsnd tasta [TAB].
LostFocus Utilizatorul selecteaz un alt obiect.

n tabelul de mai jos sunt date cteva metode asociate cu obiectul de tip check box:

Metod Descriere
Valoarea din check box este actualizat pentru a reflecta orice
Refresh
modificare aprut n datele surs.
Controlul este dat ctre check box ca i cum utilizatorul ar
SetFocus
apsa tasta TAB pentru a selecta check box.

Toate proprietile, evenimentele i metode asociate unui obiect sunt specificate n definirea clasei.

Programarea orientat spre obiecte este un sistem de programare care permite abstractizarea i
organizarea modular de tip ierarhie i are caracteristici polimorfice, de motenire i ncapsulare.

Polimorfismul este abilitatea de a avea metode cu acelai nume, dar cu un coninut diferit pentru
clasele nrudite. Procedura de utilizare este determinat n momentul execuiei de ctre clasa unui
obiect. De exemplu, obiectele nrudite pot avea amndou metode Draw. O procedur transmite un
astfel de obiect ca parametru poate apela metoda Draw fr a mai fi nevoie s tie ce tip de obiect
43 Baze de date

este parametrul transmis. Polimorfismul reprezint posibilitatea ca diferitele obiecte s poat


rspunde diferit la aceleai mesaje.

Motenirea este un termen din programarea orientat spre obiecte i reprezint abilitatea unei
subclase de a prelua caracteristicile clasei printe (clasa de baz). Cnd caracteristicile clasei printe
se modific, subclasa derivat motenete noile modificri. De exemplu, dac se adaug o nou
proprietate IsBold la un control de editare, orice subclas care are la baz clasa acestui control va
avea de asemenea proprietatea IsBold. Asadar, motenirea reprezint capacitatea unui obiect de a-i
deriva datele i funcionalitatea din alte obiecte.
Prin intermediul motenirii dac se face o modificare ntr-o clas, modificarea se reflect n
toate subclasele care aparin clasei respective. Aceast actualizare automat facut prin motenire
aduce beneficii n privina timpului i a efortului de proiectare. De exemplu, dac un productor de
telefoane dorete s schimbe modul de formare a numrului prin trecerea de la sistemul bazat pe
disc la sistemul de telefon cu butoane, va economisi mult munc dac va fi capabil s fac
modificrile n schema principal i dac toate telefoanele realizate anterior pe baza acestei scheme
principale vor moteni automat modificrile aduse comparativ cu situaia n care ar trebui s fac
modificrile individual la toate telefoanele existente.
Dac se descoper o greeal n clasa de baz, n loc s fie modificat codul pentru fiecare
subclas se remediaz eroarea n clasa de baz i noua modificare se propag n toate subclasele
aferente.

ncapsularea n programarea orientat spre obiecte este legat de abilitatea de a conine i


ascunde informaiile despre un obiect, cum sunt cele referitoare la structura intern a datelor i
codul surs. ncapsularea izoleaz complexitatea intern a modului de operare a obiectului de restul
aplicaiei. De exemplu, cnd se fixeaz proprietatea Caption la un buton de comand nu este
necesar cunoaterea modului de stocare a irului de caractere. Se spune c obiectul din acest punct
de vedere este transparent. ncapsularea permite ca descrierea obiectelor s se fac astfel nct s nu
existe acces din afara obiectului la datele sale (black box).

Abstractizare este procesul de identificare a caracteristicilor distinctive a unei clase sau obiect fr
a fi nevoie de a procesa toate informaiile referitoare la clas sau obiect. Cnd se creaz o clas, de
exemplu, un set de butoane pentru navigare ntr-o tabel, setul se poate utiliza ca o singur entitate
n loc de a ine evidena componentelor individuale (butoane) i modul n care acestea
interacioneaz.
4. Componentele funcionale ale sistemului Visual 44

Proiectarea i programarea orientat spre obiecte reprezint o schimbare a focalizarii activitii


fa de programarea procedural standard. n loc de a gndi schema logic i algoritmul de la prima
linie la ultima linie de cod surs, trebuie s ne concentrm asupra crerii de obiecte autoconinute
ntr-o aplicaie care s posede att o funcionalitate privat ct i o funcionalitate expus
utilizatorului. ntre cele dou tipuri de funcionalitate exist o interfa prin care utilizatorul poate
schimba anumite proprieti, dar nu are acces la codul surs intrinsec al obiectului.

n Visula FoxPro videoformatele (Form) i controalele (Control) sunt obiecte care sunt
incluse n aplicaii. Aceste obiecte pot fi manipulate prin intermediul proprietilor, evenimentelor
i metodelor.
4.2. Ierarhia claselor n Visual FoxPro

La crearea unei noi clase este de mare ajutor cunoaterea ierarhiei obiectelor din Visual
FoxPro, preluat din [8]:
45 Baze de date

4.2. Arhitectura VFP 6.0

Arhitectura SGBD VFP 6.0 (Figura 1) corespunde unui model complet relaional,
componentele sale fiind structurate pe trei niveluri: nucleul (kernel), interfeele (interfaces) i
instrumentele (toolkit).
1. Nucleul este componenta central a sistemului. Din nucleu fac parte:
Limbajul FoxPro care este propriu sistemului, este de tip procedural. El coine comenzi
att pentru descrierea datelor (LDD) ct i pentru manipularea datelor (LMD). Tot aici sunt
incluse comenzile pentru programarea vizual din tehnologia orientat spre obiecte.
Nucleul extins SQL este un subset din standardul SQL. Acesta este un limbaj relaional
descriptiv, care conine att comenzi pentru descrierea datelor ct i pentru manipularea datelor.
2. Interfeele sunt produse VFP pentru dezvoltarea aplicaiilor cu baze de date relaionale.
Ele au urmtoarele componente:
Designer permite crearea de diferite obiecte VFP: tabele (Table), cereri de regsire
(Query), videoformate (Form), rapoarte (Report), etichete (Label), meniuri (Menu).

2 INTERFEE

DESIGNER BUILDER WIZARD

EXPORT/IMPORT Generatoar e API

1 NUCLEU

Limbajul FoxPro Nucleul extins SQL BD

3 INSTRUMENTE

EDITOR TEXTE UTILITARE DEBUG


de ntreinere

HELP/DEMO INTERNET

Fig. 1
4. Componentele funcionale ale sistemului Visual 46

Un produs Designer se apeleaz printr-o comand CRETE/MODIFY aferent obiectului


respectiv. Comanda poate fi generat de sistem sau scris de utilizator.
Builder permite adgarea rapid a unor noi elemente la obiectele tip VFP create deja cu
produsul Designer.
Wizard permite realizarea complet i rapid a obiectelor de tip VFP. Utilizarea modulului
Wizard presupune asistarea utilizatorului de ctre sistem n proiectarea obiectelor. Generarea lor
se face automat, pe baza opiunilor exprimate de utilizator, sub form de rspuns la diferite
ntrebri. Acest modul face parte din categoria instrumentelor de proiectare asistat de calculator.
Export/Import permite schimbul de date ntre VFP i alte sisteme.
Generatoare specializate pentru realizarea proiectelor (PROJECT), a aplicaiilor (APP), a
documentaiei (DOC).
API (Application Programmers Interface) permite apelarea din aplicaia VFP a unor rutine
scrise n limbajul C sau limbaj de asamblare.
3. Instrumentele sunt produse VFP pentru ntreinerea i exploatarea bazei de date.
Instrumentele includ:
Editor de texte permite ncrcarea i editarea programelor surs (fiiere cu extensia .PRG),
precum i a fiierelor ASCII. Apelarea editorului se poate face prin comanda dat n fereatra
Command:
MODIFY COMMAND <nume_fiier>
UTILITARE de ntreinere permit gestiunea fiierelor, setarea unor parametri de lucru,
activiti desfurate de administratorul bazei de date.
debug permite depanarea interactiv a programelor scrise n FoxPro.
Help/Demo permite instruirea interactiv a utilizatorilor.
Internet permite utilizarea unor sevicii de Internet (mail, transfer de fiiere etc.).

4.3. Moduri de lucru n VFP

Dup intrarea n VFP utilizatorul poate lucra n dou moduri: cu meniul sistem i prin comenzi.
Ecranul principal VFP conine o fereastr de tip Microsoft cu urmtoarele elemente (Figura 2):
47 Baze de date

Fig. 2
bara de titlu pe care este scris Microsoft Visual FoxPro (n stnga) i butoanele pentru
minimizare/maximizare i nchidere fereastr (dreapta).
bara meniului sistem care conine un meniu orizontal cu opiunile de lucru (modul de lucru
meniu sistem): File, Edit, View, Format, Tools, Program, Window, Help. La selectarea unei
opiuni apare un submeniu vertical, de unde se alege mai departe subopiunea dorit.
bara cu instrumente care conine butoane (icon-uri) dispuse orizontal. Acestea pot fi active sau
nu, n funcie de starea curent de lucru. Prin aceste butoane se poate apela, sub o alt form, o
suboperaiune din meniul sistem.
fereastra de comand care conine un cursor i permite introducerea unei comenzi VFP sau
apelul unui program (modul de lucru prin comenzi).
aria de ieire este format din restul spaiului neocupat din fereastra principal unde vor fi
afiate rezultatele execuiei unei comenzi sau a unui program VFP.

4.3.1. Modul de lucru meniu sistem

Este modul de lucru care permite apelarea tuturor instrumentelor i interfeelor sistemului VFP.
Soluia este adoptat de utilizatorii care prefer dezvoltarea aplicaiilor cu ajutorul generatoarelor.
Efortul depus este redus i nu se programeaz n cod surs. Opiunile din meniul principal ca i cele
din submeniuri pot fi apelate prin mouse, sau cu o combinaie de taste. De exemplu, apelarea
meniului File (Figura 3) se face tastnd secvena [ALT] + [F] (litera subliniat din componena
numelui meniului).
4. Componentele funcionale ale sistemului Visual 48

Fig. 3 Fig. 4
Funciile opiunilor din meniul principal al sistemului sunt:
File apeleaz instrumente pentru ntreinerea fiierelor aferente unei baze de date VFP (Figura
3):
New creaz un obiect nou. Apare o list din care putem selecta: Project (crearea unui proiect),
Database (crearea de baz de date), Table (crearea unei tabele), Query (crearea unei cereri),
Connection (realizeaz oconexiune), View (crearea unei viziune local), Remote View (crearea
unei viziune la distan), Form (crearea unui videoformat), Report (crearea unui raport), Label
(crearea etichetelor), Program (pentru crearea unui program surs), Class (crearea unei clase de
obiecte), Text file (crearea de fiier de tip text - ASCII), Menu (crearea unui meniu utilizator). n
partea dreapt exist dou butoane, pentru crearea unui fiier nou (New) i pentru utilizarea
asistentului (Wizard) (Figura 4).
Open (deschide) apare o fereastr din care se alege tipul fiierului, directorul i numele, cu
opiunile New, Open, Cancel.
Close nchide fiierul deschis.
Save/Save As salvare, respectiv salvare cu redenumire.
Import/Export permite importul respectiv exportul de date cu alte sisteme de gestiune a bazelor
de date.
Print Preview vizualizare nainte de ieire la imprimant.
Print ieire la imprimant.
Send trimite prin e-mail.
49 Baze de date

Exit ieire din program.

Edit ofer faciliti de lucru obinuite ntr-o fereastr de editare de


texte (Figura 5):
Undo/Redo renu la ultima modificare n text / repet ultima aciune n
text.
Cut/Copy/Paste tiere, memorare n memoria tampon, copiere la o nou
locaie n fiier a unui text.
Clear tergere text.
Select all selecteaz ntreg textul.
Find/Find again/Replace caut/caut n continuare un ir de caractere
sau nlocuiete irul gsit cu un altul. Cutarea se poate face cu
activarea/dezactivarea opiunii de difereniere ntre litere mari/litere mici.
Fig. 5
View permite setarea unor parametri privind bara curent de instrumente de lucru.
Format permite setarea unor parametri privind literele (Font),
spaierea etc.
Tools permite apelul interfeelor i instrumentelor VFP.
Program permite lansarea sau oprirea unuia din paii ce se parcurg la
execuia unui program VFP (Figura 6).
Fig. 6
Do lanseaz n execuie un program.
Cancel anuleaz execuia programului.
Resume reia execuia programului.
Suspend suspend execuia programului.
Compile compileaz programul.
Window permite setarea parametrilor ferestrei curente de lucru (inclusiv fereastra de comand).
Help apeleaz instrumentele pentru autodocumentare.

Datele pot fi introduse n dou moduri, utiliznd fie tabele independente (File/New/Table) care
nu aparin unei baze de date, fie crend o baz de date (File/New/Database), n care se pot
introduce tabele existente sau se pot crea noi tabele.
4. Componentele funcionale ale sistemului Visual 50

Relaiile ntre tabele se pot stabili n ambele cazuri. Exist trei tipuri de relaii ntre datele unor
tabele: 1 1 , 1 n , m n .
Deschiderea unei tabele individuale, cu secvena File/Open/Table/nume_tabel nu duce
automat la afiarea coninutului acesteia n spaiul de lucru. Pentru aceasta trebuie activat icon-ul
care corespunde opiunii Data Session, care va afia ntr-o fereastr o serie de opiuni legate de
tabel (Figura 7):
Properties pentru modificarea/consultarea structurii tabelei (nume, tip, poziie cmp).
Browse pentru afiare date/nume cmpuri.
Open pentru deschidere altor tabele.
Close nchidere fiier selectat.
Relation stabilirea relaiilor ntre tabele independente, deschise n sesiunea curent.

Fig. 7 Fig. 8

La alegerea opiunii Browse (rsfoire), fie din meniul View fie din fereastra Data Session, va
apare meniul Table n bara de meniuri cu urmtoarele subopiuni (Figura 8):
Go to Record regsirea unei nregistrri dup diferii parametri: numr nregistrare, deplasare la
nceputul/sfritul tabelei, localizare nregistrare dup valoarea unui cmp etc.
Append New Record adgarea unei noi nregistrri.
Append Records adugarea de noi nregistrri dintr-un alt fiier
Delete Records marcare pentru tergere (la nivel logic).
Recall Records anularea marcrii pentru tergere.
Remove Deleted Records tergerea definitiv din tabel a nregistrrilor marcate (la nivel fizic).
Replace Field actualizarea cmpului unei nregistrri (schimbarea valorii cmpului).
51 Baze de date

Size Field modificarea limii de afiare a cmpului n browser.


Move Field schimbarea poziiei de afiare a cmpului n browser.

n cazul n care se construiete o aplicaie n care va fi folosit o gam larg de obiecte din
VFP, (baze de date, tabele independente, cereri, videoformate, rapoarte, etichete, programe surs,
clase de obiecte, meniuri utilizator, iconu-uri etc.) se va construi un proiect (Project), n seciunile
cruia se pot declara aceste obiecte (Figura 9). ntreg proiectul se va finaliza ntr-un program
executabil care va conine toate obiectele declarate ca fiind utilizate n aplicaie. Pentru a realiza
proiectul n form executabil, n prealabil se folosete opiunea Build, pentru a realiza compilarea
i link-editarea (12.2.2.).

Fig. 9
4. Componentele funcionale ale sistemului Visual 52

4.3.2. Modul de lucru prin comenzi

Activitatea n acest mod de lucru se desfoar n fereastra de comand din ecranul principal al
VFP (Command). Aici se gsete poziionat cursorul i utilizatorul poate lucra n stil interpretor
sau compilator.
53 Baze de date

5. Organizarea datelor nVisual FoxPro

5.1. Manipularea bazei de date i a tabelelor n VFP

Manipularea presupune urmtoarele operaii care pot fi executate fie n modul asistat, fie n
modul comand, fie n modul procedural:
Crearea bazei de date/tabelei
Deschiderea bazei de date/tabelei. Deschiderea unei tabele presupune rezervarea n memoria
intern a calculatorului a unei zone, numit zon de lucru, n care VFP va memora toate informaiile
necesare utilizrii acestei tabele (structur, numr de nregistrri etc).
ntr-o zon de lucru, la un moment dat, este deschis o singur tabel, iar simultan pot fi
deschise 32767 tabele. Identificarea zonelor de lucru de face printr-un numr natural cuprins ntre 1
i 32767, iar primele 10 zone i prin litere, A-J. La lansarea sistemului VFP, automat este selectat
zona de lucru A (sau 1).
Cu comanda
SELECT litera|cifra
se poate selecta o alt zon de lucru.
Efectuarea operaiilor de consultare, actualizare (adgare, modificare, tergere) asupra bazei de
date/tabelei
nchiderea bazei de date/tabelei

5.1.1. Crearea bazei de date

Sistemul VFP permite crearea unei baze de date i introducerea tabelelor care vor face parte
din baza de date:
definirea structurii acestora;
crearea fiierului (fiierelor) n care se pot stoca datele;
stabilirea relaiilor ntre tabelele bazei de date,
Crearea se face o singur dat, nainte de utilizare.
Not Secvenele din linia de comand care apar ntre paranteze drepte au semnificaia de
element opional.
Crearea unei baze de date se face cu comanda:
CREATE DATABASE [<nume_baz_de_date>]?
5. Organizarea datelor nVisual FoxPro 54

nume_baz_de_date specific numele bazei de date care va fi creat.


? afieaz o fereastr de dialog pentru specificarea numelui bazei de date.

Fiierul corespunztor bazei de date are extensia .DBC. La crearea bazei de date se face
automat i deschiderea ei. Adugarea unei tabele n baza de date se face cu comanda ADD TABLE
sau folosind bara de instrumente DATABASE DESIGNER.

5.1.2. Crearea tabelelor

Crearea tabelelor se realizaz n funcie de modul de lucru, astfel:


1. modul asistat se utilizeaz secvena de adresare a meniului sistem: File/New se alege
opiunea Table din fereastra de dialog i se apas butonul New. Aceast secven are ca efect
apariia unei ferestre de dialog Create, n care se specific discul logic, directorul i numele
tabelei care va fi creat. Deplasarea pn la poziia dorit n fereastr, se face utiliznd tasta
[TAB] sau mouse-ul. Dup introducerea numelui tabelei se apas butonul Save (fiierul va fi
salvat cu extensia .DBF) i se afieaz o nou fereastr Table Designer. n acest fereastr, se
selecteaz opiunea Fields afiat sus, utilizatorul trebuie s introduc structura tabelei.
Fereastra conine urmtoarele cmpuri de preluare a informaiilor structurale: Name, Type,
Width, Dec, Index, NULL i patru butoane pentru opiunile: OK, Cancel, Insert, Delete. Sub
Name se tasteaz numele cmpului, format din maxim 10 caractere, ncepnd cu o liter, iar sub
Type se declar tipul cmpului nou creat sau se alege o opiune din meniul pop-up afiat.
Cmpul poate fi de tip:
caracter admite un ir de maxim 254 caractere (caractere alfanumerice i spaii goale);
numeric admite maxim 20 de caractere, numere, caracterele +/-, punctul zecimal;
logic admite maxim un caracter (T sau Y, F sau N);
dat admite maxim 8 caractere i are formatul implicit ll/zz/aa. Formatul poate fi schimbat
cu comanda SET DATE TO ( de exemplu BRITISH i are ca efect schimbarea n formatul
zz/ll/aa);
memo admite implicit 10 caractere, ns sistemul poate stoca blocuri mari de text pentru
fiecare nregistrare. Dimensiunea blocurilor de text este limitat de spaiul pe hard disk. Tabelele
care au declarate n structur cmpuri de tip memo sunt stocate sub forma a dou fiiere, unul cu
extensia .DBF i cellalt cu extensia .FTP n care se salveaz cmpurile memo ale tabelei.
general se folosete pentru memorarea elementelor de tip OLE (Object Linking and
Embededing), texte, foi de calcul tabelar (Excel), imagini, sunete etc.
55 Baze de date

Not: Introducerea datelor n cmpurile memo i general este diferit de introducerea datelor n
alte cmpuri. Se poziioneaz cursorul pe cmpul memo, se apas simultan tastele
[Ctrl]+[PgDown] i apare o fereastr cu acelai nume ca al cmpului memo n care poate fi
introdus textul. Textele introduse se salveaz apsnd tastele [Ctrl]+[W], fereastra memo se nchide
i cursorul revine n fereastra de adugare a datelor. Cu [Ctrl]+[Esc] se iese din fereastra memo
fr salvarea datelor introduse n fiierul memo.

Width opiune care specific numrul maxim de poziii ale cmpului.


Dec specific mrimea prii zecimale, n cazul cmpurilor numerice.
Index specific dac atributul (cmpul) respectiv este index (ascendent/descendent) sau nu
(8.2.).
NULL specific dac atributul respectiv admite sau nu valori de tip NULL (cu semnificaia unor
date lips sau inaplicabile).
Dac se dorete schimbarea poziiei unui cmp n structur, se apas tasta [Tab] pn cnd
cursorul se pozioneaz pe cmpul respectiv i se apas simultan tastele [Ctrl] + [PgDown], [Ctrl]
+ [PageUp]. Aceasta va avea ca efect deplasarea cmpului selectat cu o poziie n jos, sau n sus.
Operaia se poate efectua i cu mouse-ul: se selecteaz rndul care conine cmpul a crei
poziie se modific, cursorul de poziie se mut pe acest rnd; innd apsat butonul stng de la
mouse pe cursor i deplasnd mouse-ul sus/jos se va muta cmpul selectat, n cadrul structurii
generale.
Butonul cu opiunea Insert se folosete pentru adugarea unui nou cmp.
Butonul cu opiunea Delete se folosete pentru tergerea unui cmp (cel marcat de cursor).
Butonul Cancel anuleaz modificrile fcute, iar butonul OK valideaz modificrile (sau
folosind combinaia de taste [Ctrl] +[Enter]).
Dup ce structura este salvat, fiierul fiind nou creat, apare un mesaj:
Input data records now? (Y/N)_
Dac se rspunde cu Y este afiat un ecran n care se introduc datele n ordinea stabilit n
structur.

5.1.3. Validarea cmpurilor unei nregistrri la introducere


5. Organizarea datelor nVisual FoxPro 56

n exemplul care urmeaz se creaz o baz nou de date GESTIUNE.DBC (dbc - data base
container), Figura 10, care va conine tabelele: FURNIZOR.DBF i MATERIALE.DBF cu
urmtoarele cmpuri:

FURNIZOR.DBF MATERIALE.DBF
Cod_furn N(5) Cod_mat N(5)
Denumire C(20) Denumire C(20)
Adresa Memo Data_exp D
Cod_mat N(5) UM C(5)
Cant N(7) PU N(5)
Data_livr D

Dup definirea structurii nregistrrilor n tabela FURNIZOR.DBF se selectraz cmpul


cod_furn i se completeaz cele trei cmpuri Rule, Message, Default value (Figura 11), astfel:
- la opiunea Rule se introduce condiia logic de filtrare pentru acceptarea valorii nscrise n
cmp. n acest caz se consider c pentru cmpul cod_furn valorile acceptate sunt ntre 1 i
5000. Condiia este:
cod_furn<=5000 and cod_furn>=1
- la opiunea Message se introduce ntre apostrof mesajul:
Cod furnizor eronat !
- la opiune Default Value se introduce valoarea 1. Dac se omite declararea unei valori
implicite, la introducerea datelor pentru cmpul cod_furn, se va afia mesajul de eroare la
orice ncercare de introducere a datelor.
57 Baze de date

Fig. 10 Fig. 11

Dup definirea structurii nregistrrilor n tabela MATERIALE.DBF se selectraz cmpul um


i se completeaz cele trei cmpuri Rule, Message, Default Value (Figura 12), astfel:
- la opiunea Rule se introduce condiia logic de filtrare pentru acceptarea valorii nscrise n
cmp. n acest caz se consider c pentru cmpul um valorile acceptate sunt doar trei: kg, ml,
buc. Condiia este:
um=kg or um=ml or um=buc
- la opiunea Message se introduce ntre apostrof mesajul:
Eroare unitate de masura !!
- la opiune Default Value se introduce ntre apostrof valoarea buc. Dac nu se declar
nimic, practic, nu se pot introduce datele la fel ca mai sus.
5. Organizarea datelor nVisual FoxPro 58

Fig. 12

2. modul comand: implic utilizarea comenzii CREATE TABLE din nucleul SQL:
CREATE TABLE nume_tabel [FREE]
(nume_cmp1 tip_cmp1 [ (lungime_cmp [,precizie] )]
[,nume_cmp2]
..............
)
unde:
- nume_tabel numele tabelei create;
- FREE specific c tabela nu va fi adugat la baza de date deschis;
- nume_cmp1 tip_cmp1 (lungime_cmp ,precizie) specific numele cmpului 1, tipul cmpului
1, - lungimea maxim i numrul de zecimale pentru cmpurile numerice. O tabel poate conine
pn la 255 de cmpuri. Dac unul sau mai multe cmpuri accept i valoarea NULL atunci
numrul de cmpuri se reduce cu 1 (254).
Tipul cmpului se declar cu una din urmtoarele litere:

Tip_cmp Lungime_cmp Precizie Descriere

C n cmp tip caracter de lungime n


59 Baze de date

D cmp de tip dat calendaristic

T cmp de tip timp (hh/mm/ss)

N n d cmp numeric de lungime n cu d zecimale

F n d cmp numeric n virgul mobil de lungime n cu d zecimale

I cmp numeric ntreg

B d cmp numeric dubl precizie

Y moneda

L cmp de tip logic

M cmp de tip memo

G cmp de tip general

Exemplu. Folosind modul comand se creaz o tabel cu evidena studenilor, cu numele ESTUD,
cu urmtoarele cmpuri:
- numr matricol: MATR de tip numeric, lungime maxim 5
- nume i prenume: NUME de tip caracter, lungime maxim 40
- adres: ADRESA de tip caracter, lungime maxim 30
- anul de studii: ANS de tip numeric, lungime maxim 1
- anul intrrii n facultate: ANIF de tip numeric, lungime maxim 4
- data naterii: DATAN de tip dat.
Comanda:
CREATE TABLE ESTUD (MATR N(5), NUME C(40), ADRESA C(30), ANS N(1), ANIF N(4),
DATAN D)

Alte comenzi utilizate n crearea tabelelor


Pentru crearea unei tabele se pot utiliza i comenzile COPY STRUCTURE EXTENDED TO sau
CREATE ... FROM ...cu sintaxa

COPY STRUCTURE EXTENDED TO <nume_tabel> [FIELDS<list_cmpuri>] [DATABASES


<nume_baz_de_date> [NAME] <b_nume_tabel>]
5. Organizarea datelor nVisual FoxPro 60

unde:
- nume_tabel numele tabelei nou create;
- FIELDS <list_cmpuri> specific cmpurile care urmeaz s apar n noua tabel. Dac nu se
specific nimic, implicit sunt luate toate cmpurile din tabel surs;
- DATABASE <nume_baz_de_date> numele unei bazei de date existente la care va fi adgat
noua tabel;
- NAME <b_nume_tabel> specific numele tabelei aa cum apare n baza de date.
Fiierul de structur creat are urmtoarele cmpuri:

FIELD_NAME cmpul nume (10 caractere)


FIELD_TYPE cmpul tip (maxim 1 caracter): C, N, F, D, L, M, G
FIELD_LEN lungimea cmpului (maxim 3 caractere)
FIELD_DEC numr de zecimale admis (maxim 3 caractere)

Comanda CREATE... FROM...creaz o tabel dintr-un fiier de structur (realizat cu comanda


anterioar COPY STRUCTURE EXTENDED TO...). Sintaxa comenzii:
CREATE [<nume_tabela_1>] FROM <nume_tabela_2>
nume_tabela_1 numele tabelei care va fi creat;
nume_tabela_2 numele fiierului care conine structura care va fi utilizat la creare.

Exemplu. Folosind tabela creat anterior (ESTUD), s se realizeze o nou tabel (ESTUD1), care
s conin suplimentar un cmp numeric (lungimea maxim 5 caractere, din care 2 la partea
zecimal) cu media de la bacalaureat (MBAC). Secvena de comenzi:

SELECT 2 && selecteaz zona de lucru 2


USE ESTUD && se deschide tabela ESTUD n zona de lucru 2
COPY STRUCTURE EXTENDED TO && copiaz structura tabelei ESTUD n fiierul TEMP
TEMP
USE TEMP && se deschide tabela TEMP
APPEND BLANK && se adaug o nregistrare goal
REPLACE FIELD_NAME WITH && se adaug un nou cmp MBAC
MBAC
REPLACE FIELD_TYPE WITH N && tip numeric
61 Baze de date

REPLACE FIELD_LEN WITH 5 && de lungime maxim 5 poziii


REPLACE FIELD_DEC WITH 2 && 2 poziii pentru partea zecimal
&& la fiecare REPLACE se afieaz mesajul 1
replacements
CREATE ESTUD1 FROM TEMP && se creaz tabela ESTUD1 cu structura dat de
fiierul TEMP
USE ESTUD1 && se deschide tabela ESTUD1
APPEND FROM ESTUD && se adaug nregistrrile din tabela iniial ESTUD
BROWSE && afiarea coninutului tabelei ESTUD1 n browser
CLOSE DATABASES && se nchid toate tabelele
DELETE FILE TEMP.DBF && terge fiierul TEMP.DBF

5.2. Deschiderea bazei de date/tabelei

Deschiderea bazei de date se face cu comanda:


OPEN DATABASE [<nume_bd>] [EXCLUSIVE | SHARED] [NOUPDATE]

unde:
nume_bd numele bazei de date care trebuie deschis;
EXCLUSIVE ali utilizatori nu pot s acceseze aceast baz de date;
SHARED deschide baza de date n modul partajat, ceilali utilizatori au acces;
NOUPDATE specific faptul c nu se pot face schimbri n baza de date (deschis doar pentru
citire).

Comanda pentru deschiderea unei tabele ntr-o zon de lucru:


USE <nume_fiier> IN <nr_zon_de_lucru> INDEX <list_fiiere_index> ALIAS <alias_tabel>
[EXCLUSIVE | SHARED] [NOUPDATE]

unde:
nume_fiier numele tabelei pe care vrem s o deschidem.
nr_zon_de_lucru numrul zonei de lucru asociate la deschiderea tabelei (numere 0, 1, 2.. sau
litere A, B...).
INDEX <list_fiiere_index> - specific un set de indeci care se deschid odat cu tabela. Dac
tabela are un fiier de index structural compus, fiierul de index este deschis automat odat cu
5. Organizarea datelor nVisual FoxPro 62

fiierul. Lista de fiiere index conine orice fel de nume de fiier de index, simplu (.IDX) sau
nestructural compus (.CDX), separate prin virgul, fr specificarea extensiei. Primul fiier de index
din list este cel care controleaz accesarea i afiarea datelor din tabel (8.2.).
ALIAS <alias_tabel> - creaz un nou nume pentru tabel, diferit de numele extern. Referirea la
fiier se poate face prin intermediul alias-ului, n funcii sau comenzi care cer sau suport alias-ul.
Specificarea zonei de lucru poate fi fcut i separat asociind comanda SELECT la comanda USE.

SELECT <nr_zon_de_lucru> | <nume_alias>


USE <nume_fiier>

Not Semnul | n sintaxa unei comenzi marcheaz alternana unor clauze care se exclud.

n modul asistat, deschiderea se face utiliznd meniul File/Open, se selecteaz Database sau
Table din meniul pop-up afiat i se specific discul logic, subdirectorul i numele bazei de date sau
tabelei, precum i modul de deschidere (se bifeaz sau nu, opiunea Exclusive). Cnd toate aceste
informaii sunt specificate se apas butonul OK.
Dup operaia de deschidere n meniul View avem subopiunile Browse (vizualizare coninut),
Database Designer (proiectantul pentru baza de date), Table Designer (proiectantul pentru tabele).
Se pot face consultri cu Browse, modificri ale structurii cu Database Designer (adugare,
eliminare de tabele din baz, stabilirea/anularea relaiilor ntre tabele) sau Table Designer
(actualizare cmpuri).

5.3. Consultarea i modificarea bazei de date/tabelei

5.3.1. Modificarea structurii de date a tabelelor n modul asistat

Modificarea structurii logice a unei tabele se poate face fie cu ajutorul comenzii MODIFY
STRUCTURE, din fereastra de comand, fie activnd butonul Data Session din bara de
instrumente
63 Baze de date

n primul caz, dup lansarea comenzii MODIFY STRUCTURE, se va afia fereastra de dialog
Open. Cu ajutorul sgeilor direcionale se poziioneaz cursorul pe tabela dorit a fi modificat. Se
apas tasta [Enter] i va aprea fereastra de dialog Structure, utilizat i la definirea structurii
tabelelor.
n cel de al doilea caz, din fereastra Data Session se alege opiunea Open, care deschide
fereastra de selectare a discului logic, a subdirectorului i a numelui de fiier. Se selecteaz fiierul
i se apas butonul OK. n fereastra Data Session va fi afiat numele tabelei deschise. Pot fi
deschise mai multe tabele simultan, numele lor fiind afiat n fereastra Data Session. Se alege
opiunea Properties care va activa fereastra de dialog Structure.
n ambele cazuri operaia Open se va face cu opiunea Exclusive pentru a putea face
modificri.
n fereastra Structure, poziionarea cursorului se face apsnd tasta [Tab] pentru deplasare
nainte sau [Shift] + [Tab] pentru deplasare napoi, n zona ce cuprinde descrierea structurii, unde
vrem s inserm un nou cmp. n partea dreapt a ferestrei vor fi active opiunile Insert, Delete
(adgare/tergere). Se apas tasta [Insert] sau butonul cu opiunea Insert i va fi afiat urmtoarea
linie:

New field character 10

Cmpurile ce urmeaz vor fi mpinse cu un rnd n jos. Se introduce numele cmpului n prima
csu, se alege tipul i lungimea maxim din meniurile pop-up. Pentru tergere se poziioneaz
cursorul pe cmpul respectiv i se apas tasta [Delete] sau se folosete butonul cu opiunea Delete].
Salvarea modificrilor se face selectnd opiunea OK (buton), sistemul afind urmtorul mesaj:
Make structure changes permanent ?

YES NO

Opiunea YES salveaz noua structur a tabelei, fereastra de dialog Structure se nchide i
controlul (cursorul) trece n fereastra de comand.

Not Modificarea structurii tabelelor se poate face i cu comanda ALTER TABLE din nucleul
SQL.

La alegerea opiunii Browse (rsfoire), fie din meniul View fie din fereastra Data Session, va apare
opiunea Table n bara de meniuri cu urmtoarele subopiuni:
5. Organizarea datelor nVisual FoxPro 64

Go to Record regsirea unei nregistrri dup diferii parametri: numr articol, deplasare la
nceputul/sfritul tabelei, localizare nregistrare dup valoarea unui cmp etc.
Append New Record adgarea unei noi nregistrri.
Append Records adugarea de noi nregistrri dintr-un alt fiier
Delete Records marcare pentru tergere (la nivel logic).
Recall Records anularea marcrii pentru tergere.
Remove Deleted Records tergerea definitiv din tabel a nregistrrilor marcate (la nivel fizic).
Replace Field actualizare cmp nregistrare (schimbarea valorii cmpului).
Size Field modificarea limii de afiare a cmpului n browser.
Move Field schimbarea poziiei de afiare a cmpului n browser.

Vizualizarea datelor cu opiunea Browse, se face ntr-o fereastr de tip Windows care cuprinde
o tabel, coloanele reprezentnd cmpurile, iar liniile reprezentnd nregistrrile. Trecerea de la un
cmp la altul se face apsnd tasta [Tab] (nainte), [Shift] + [Tab] (napoi); pe vertical deplasarea
se face cu sgeile [Sageata sus], [Sageata jos]. nchiderea ferestrei Browse se face apsnd
simultan tastele [Ctrl] + [End].

5.3.2. Deplasri n tabel. Cutri secveniale

Odat cu deschiderea tabelei, acesteia i se asociaz o locaie de memorie n care este stocat
numrul nregistrrii curente (pointer-ul de nregistrare).
Exist 2 tipuri de deplasri:
criteriul utilizat este numrul nregistrrii, care se realizeaz utiliznd din submeniul Go to
Record subopiunile: Top, Bottom, Next, Previous, Record n (prima nregistrare, ultima
nregistrare, urmtoarea nregistrare, nregistrarea anterioar, la nregistrarea n).
criteriul utilizat se obine pe baza specificrii unei condiii de tip For sau While aplicat
unui cmp. Se utilizez opiunea Locate din submeniul Go to Record.

Pentru a modifica o nregistrare din tabel se alege opiunea Browse i apoi din meniul Table,
subopiunea Replace Field din meniul sistem. Apare o fereastr de dialog (Replace Field) cu
urmtoarele specificaii:
Field - numele cmpului ale crui valori vrem s le modificm;
With noua valoare.
65 Baze de date

Scope domeniul (Next n, All, Record n, Rest): toate nregistrrile, urmtoarele n nregistrri,
numai pentru nregistrarea n, restul nregistrrilor inclusiv cea curent pe care este poziionat
cursorul.
For / While vor fi modificate doar nregistrrile care satisfac condiia. For este o condiie
construit cu Expression Builder (constructorul de expresii) i vor fi modificate acele nregistrri
care au valoarea True pentru expresia dat. Clauza While este de asemenea o expresie logic i
nregistrrile selectate trebuie s verifice condiia pentru a se realiza modificarea.

Constructorul de expresii are o regiune de editare n care vor fi introduse condiiile, manual sau
asistat de calculator.
Prin apsarea butonului Replace are loc operaia de modificare.

5.4. nchiderea bazei de date/tabelei

Cu comanda CLOSE se nchid diferite tipuri de fiiere:


CLOSE DATABASES [ALL] nchide baza de date curent i tabelele sale. Dac nu este deschis
nici o baz de date, vor fi nchise toate tabelele libere, fiierele de index, din toate zonele de lucru i
se va selecta zona de lucru 1. Clauza ALL specific c vor fi nchise toate bazele de date i tabelele
lor, toate tabelele libere i toate fiierele de index.
CLOSE INDEX nchide toate fiierele de index pentru zona de lucru curent (fiiere .IDX i
nestructurale .CDX). Un fiier de index structural (.CDX, compus care se deschide automat cu
tabela) nu va fi nchis.
CLOSE ALL nchide toate bazele de date i tabelele lor, toate tabelele libere, toate fiierele de
index din toate zonele de lucru i se selecteaz zona de lucru 1. Comanda nu va nchide fereastra de
comenzi, fereastra Help, fereastra Debug.
5. Organizarea datelor nVisual FoxPro 66

CLOSE TABLES [ALL] nchide toate tabelele din baza de date curent, sau toate tabelele libere
din toate zonele de lucru dac nu exist o baz de date deschis. Includerea clauzei ALL nchide
toate tabelele din toate bazele de date i tabelele libere, dar bazele de date rmn deschise.
67 Baze de date

6. Utilizarea asistentului Wizard n VFP

VFP este nsoit de peste 20 de programe de tip Wizard, care asigur funcia de proiectare
asistat de calculator. Acestea sunt programe interactive care ajut la crearea de videoformate,
interogri/cereri (Query), importarea i redimensionarea datelor, grafice, rapoarte cu date din
diferite tabele, baze de date, tabele, etichete, viziuni, kit-uri de instalare, documentaie, aplicaii,
documente pentru pagini de WEB. Programul Wizard are forma unei serii de ecrane, n care
utilizatorul rspunde la ntrebri sau alege o serie de opiuni, n urma crora se va realiza o operaie
sau se va genera un fiier. Lansarea programului Wizard se poate face:
Cnd: se alege opiunea New din meniul sistem File sau selectnd submeniului Wizards din meniul
sistem Tools.

6.1. Table Wizard

Creaz tabele bazate pe structura tipic a tabelelor. Asistentul pentru tabele pune la dispoziia
utilizatorului modele de tabele, acesta alegnd pe cel care rspunde necesitilor sale. Se poate
modifica structura tabelelor i cmpurilor, fie n derularea etapelor din Wizard sau mai trziu dup
ce asistentul a salvat fiierul. Dac sunt deschise una sau mai multe baze de date, asistentul adaug
automat noua tabel la baza curent. Dac nu este deschis nici o baz de date asistentul creaz
tabele libere (free tables).
Lansarea asistentului se face din submeniul Wizards din meniul sistem Tools, opiunea Table:
n urmtorii pai
pasul 1 selectarea cmpurilor: din fereastra Sample tables se pot alege una sau mai multe
tabele prin opiunea Add. Pentru fiecare tabel sunt afiate cmpurile disponibile (Available
Fields) care pot fi adugate n selecia cmpurilor utilizatorului (Selected Fields) folosind

butoanele: - adaug cmpul selectat, - adaug toate cmpurile tabelei, - elimin


cmpul selectat - elimin toate cmpurile selectate.
pasul 2 selectarea unei baze de date: tabela creat poate fi de sine stttoare sau poate fi
adugat la o baz de date. Dac se creaz tabela ntr-o baz de date asistentul va furniza opiunile
de formatare n pasul urmtor.
pasul 3 modificarea setrilor cmpurilor: se pot schimba setrile cmpurilor pentru tabela
creat. De exemplu, se poate modifica lungimea maxim a unui cmp de tip caracter.
pasul 4 indexarea tabelei : se selecteaz cmpul care va fi cheie primar de indexare n noua
tabel. Se pot desemna de asemenea alte cmpuri drept chei secundare.
6. Utilizarea asistentului Wizard n VFP 68

pasul 5 setarea relaiilor: dac tabela aparine unei baze de date, se pot stabili relaiile ntre
cmpuri, ntre tabela nou creat i tabelele existente n baz. Pentru definirea relaiei se face click cu
mouse-ul pe butonul radio care identific tipul relaiei, se selecteaz cmpul care se leag n baza de
date (dac se selecteaz New Field, se va tipri numele) i operaia se termin cu click pe butonul
OK.
pasul 6 terminare (butonul Finish): noua tabel va fi afiat ntr-o fereastr de tip Browse. Se
poate alege opiunea Append New Record din meniul sistem Table, pentru a aduga nregistrri
noi n tabel. Dup salvarea fiierului, acesta poate fi deschis mai trziu pentru a modifica structura
cu aplicaia Table Designer.

6.2. Form Wizard

Form Wizard creaz un videoformat pentru date extrase dintr-o singur tabel. Lansarea
asistentului se face utiliznd meniul sistem Tools, submeniul Wizard, opiunea Form, n urmtorii
pai:
pasul 1 selectarea cmpurilor: se face pe baza opiunilor utilizatorului exprimate n trei
ferestre: Databases and Tables, Available Fields, Selected Fields, la fel ca n cazul Wizard
Table.
pasul 2 selectarea stilui videoformatului specific stilul controalelor din videoformat. n
fereastra Style este afiat o list cu tipurile de videoformate: Standard, Chiseled, Shadowed,
Boxed, Embossed, Fancy etc. Se poate alege din panoul cu butoane radio (Button Type) tipul
butoanelor utilizate: Text Buttons, Picture Buttons, No Buttons, Custom Bbuttons. Tipul de
butoane ales va genera n videoformat, butoane pentru navigare n fiier (Top, Previous, Next,
Bottom), Find (afieaz cutia de dialog Search - caut), Print (tiprete un raport), Add (adaug o
nou nregistrare), Delete (terge nregistrarea curent), Exit (nchide videoformatul).
pasul 3 sortarea nregistrrilor: se vor selecta acele cmpuri care dorim s fie sortate. Se poate
alege de asemenea o etichet (intrare) pentru un index (TAG).
pasul 4 terminare (butonul Finish): dac s-a ales un numr mare de cmpuri la pasul 1 i
pentru a fi siguri c toate cmpurile vor ncpea n videoformat se poate alege opiunea Add pages
for fields that do not fit. n caz contrar, dac numrul cmpurilor depete dimensiunea
videoformatului, VFP va afia formatul cu bare de deplasare (Scroll Bars). Videoformatul poate fi
vizualizat nainte de salvare cu opiunea Preview. Dup salvarea videoformatului, acesta poate fi
deschis mai trziu i modificat cu aplicaia Form Designer.
69 Baze de date

6.3. Report Wizard

Creaz rapoarte utiliznd o singur tabel liber sau o viziune ntr-o baz de date. Asistentul
pune ntrebri ntr-o succesiune de pai, prin care se specific sursa i cmpurile ce vor fi utilizate
pentru a crea controalele raportului. Pentru lansarea asistentului, se alege din meniul sistem Tools,
submeniul Wizard, opiunea Report. Din caseta de dialog Wizard Selection se alege Report
Wizard i se urmeaz paii:
pasul 1 selectarea cmpurilor: se introduc opiunile n cele trei ferestre de dialog: Databases
and Tables, Available Fields, Selected Fields. Selecia poate fi fcut dintr-o tabel sau o viziune.
pasul 2 gruparea nregistrrilor: se poate folosi gruparea datelor pentru a mpri pe categorii
i a sorta nregistrrile, pentru a fi mai uor de citit (de exemplu situaia ncasrii impozitelor pe
familie, pe sectoare i centralizat pe municipiu). Dup alegerea unui cmp n csua Group by, se
pot alege opiunile Grouping Options i Summary Option pentru a mbuntii selecia. Alegnd
Grouping Options se va deschide caseta de dialog Grouping Intervals care permite selectarea
nivelurilor de filtrare relevante pentru tipul de date coninute n cmpurile selectate pentru grupare.
Alegnd Summary Options se deschide o cutie de dialog n care utilizatorul poate specifica tipul
de calcul care se va aplica unui cmp numeric:

Tipuri de Rezultat
calcul
SUM Suma valorilor din cmpul numeric specificat
AVG Media valorilor din cmpul numeric specificat
COUNT Numrarea nregistrrilor care conin valori non-NULL din cmpul
specificat
MIN Valoarea minim n cmpul numeric specificat
MAX Valoarea maxim n cmpul numeric specificat

Se pot alege de asemenea opiunile Summary only sau No Totals pentru raport. Cmpurile
care sunt selectate pentru grupare nu vor fi disponibile la pasul 3.
pasul 3 alegerea stilului pentru raport : sunt disponibile urmtoarele stiluri: Executive,
Ledger, Presentation, Banded, Casual, asistentul prezentnd ntr-un grafic, sub o lup, un
exemplu al stilului ales.
pasul 4 definirea formatului raportului: cnd se specific un numr de coloane sau se
selecteaz una din opiunile pentru format, asistentul prezint ntr-un grafic, sub o lup, un exemplu.
6. Utilizarea asistentului Wizard n VFP 70

Dac s-a fcut opiunea de grupare la pasul 2, opiunile Columns i Field Layout nu mai sunt
disponibile.
pasul 5 sortarea nregistrrilor: se pot selecta unul sau mai multe cmpuri sau o etichet de
index (TAG) n ordinea n care se dorete s se sorteze nregistrrile (ascendent, descendent).
pasul 6 terminare (butonul Finish): dac numrul cmpurilor selectate nu ncap pe o singur
linie pe limea paginii de raport, acest cmp va fi nglobat pe linia urmtoare. Dac nu vrem s fie
nglobat cmpul pe linia urmtoare, se deselecteaz opiunea Wrap fields that do not fit. Cu
butonul Preview se poate vizualiza raportul fr a prsi asistentul. Dup salvarea raportului, acesta
poate fi deschis ulterior i modificat cu aplicaia Report Designer.

6.4. Label Wizard

Acesta este asistentul pentru generarea etichetelor cu date preluate dintr-o tabel. Pentru
lansarea asistentului se alege din meniul sistem Tools, submeniul Wizard, opiunea Label i se
urmresc paii:
pasul 1 selectarea tabelelor: se selecteaz o tabel sau o viziune.
pasul 2 alegerea tipului de etichet: asistentul ofer o list cu tipurile de etichete standard care
sunt instalate odat cu VFP. Asistentul afieaz de asemenea lista cu tipurile de etichete care au fost
create de utilizator, prin folosirea aplicaiei AddLabel.
pasul 3 - definirea formei etichetei: se adaug cmpurile n ordinea n care trebuie s apar pe
etichet. Se pot folosi semne de punctuaie, spaii, pentru a formata eticheta. Se folosete csua
Text pentru a adga textul. Pe msur ce se adaug elemente n etichet, asistentul va arta
modificrile fcute. Utilizatorul poate verifica imaginea etichetei pentru a vedea dac cmpurile
introduse se ncadreaz n dimensiuni. De asemenea, se poate folosi butonul Font pentru a schimba
stilul i mrimea literelor folosite n etichet.
pasul 4 sortarea nregistrrilor: se selecteaz cmpurile sau etichetele de index (TAG) n
ordinea n care dorete s sorteze nregistrrile.
pasul 5 terminare (butonul Finish): utilizatorul poate activa opiunea Preview pentru a
verifica restriciile impuse, nainte de terminare. Dup salvarea etichetei, aceasta poate fi deschis i
modificat cu aplicaia Label Designer.

6.5. Query Wizard


71 Baze de date

Asistentul de interogare, care pe baza tabelelor sau viziunilor selectate pentru a furniza
informaii, extrage nregistrrile care ndeplinesc criteriile de filtrare i direcioneaz rezultatele
ctre tipul de ieire specificat: fereastr Browse, raport, tabel, etichet etc. Pentru lansarea
asistentului se alege din meniul sistem Tools, submeniul Wizard, opiunea Query Wizard i se
urmresc paii:
pasul 1 selectarea cmpurilor: se pot selecta cmpuri din diferite tabele sau viziuni. Mai nti
se selecteaz cmpurile dintr-o tabel sau viziune, se mut n csua Selected fields, utiliznd
butoanele de adugare; apoi se selecteaz cmpurile din alt tabel sau viziune etc.
pasul 2 stabilirea relaiilor ntre tabele: utilizatorul poate selecta cmpurile comune mai multor
fiiere din lista afiat, pentru a stabili relaiile ntre tabele sau viziuni.
pasul 3 includerea nregistrrilor: se poate limita interogarea (Query) alegnd din dou tabele,
numai liniile care coincid, sau toate liniile dintr-unul din tabele. Implicit numai nregistrrile care
coincid sunt incluse. Dac se dorete crearea unei jonciuni interne se selecteaz opiunea Only
matching row (numai nregistrrile care coincid). Dac se dorete crearea unei jonciuni externe, se
selecteaz toate nregistrrile din unul din cele dou tabele.
pasul 4 filtrarea nregistrrilor: se poate reduce numrul nregistrrilor selectate n interogare,
prin crearea de expresii logice care s filtreze nregistrrile din tabelele sau viziunile alese. Se pot
crea dou expresii logice, legate cu operatorul And, care va permite selectarea numai a acelor
nregistrri care satisfac ambele criterii. Utilizarea operatorului Or face ca n selecia nregistrrilor,
s intre acelea care satisfac doar unul din criterii. Opiunea Preview permite vizualizarea
nregistrrilor care vor fi incluse n interogare (Query), pe baza aplicrii criteriilor de filtrare.
pasul 5 sortarea nregistrrilor: se pot selecta pn la 3 cmpuri (chei de sortare) sau o etichet
de index (TAG) pentru a stabili ordinea n care rezultatele interogrii vor fi sortate (ascendent sau
descendent).
pasul 6 limitarea nregistrrilor: se poate limita suplimentar numrul de nregistrri n
interogare, fie indicnd un procent de vizualizare din numrul de nregistrri cu valorile cele mai
mari (sortare descendent) / mai mici (sortare ascendent), fie indicnd numrul de nregistrri cu
valorile cele mai mari/mai mici, care vor fi afiate. De exemplu, pentru a vedea doar primele 10
nregistrri cu valoarea cea mai mare din interogare (sortare descendent), se introduce la opiunea
Number of records valoarea 10 n csua Portion value. Cu opiunea Preview se pot vizualiza
rezultatele interogrii pe baza restriciilor impuse.
pasul 7 terminare (butonul Finish): dup ce interogarea a fost salvat, ea poate fi deschis
ulterior, lansnd aplicaia Query Designer.
6. Utilizarea asistentului Wizard n VFP 72

6.6. Mail Merge Wizard

Acesta este asistentul pentru documente interclasate (fuziune / unire) de tip Word sau fiiere de
tip text care sunt compatibile cu orice procesor de text. Pentru a executa aplicaia, trebuie s fie
instalat o versiune Microsoft Word curent pecum i protocolul standard pentru servere baze de
date, ODBC (Open Database Connectivty). ODBC se instaleaz pentru diferite tipuri de baze de
date i va permite programului VFP 6.0 s se conecteze la baza de date i s acceseze datele. Pentru
lansarea asistentului se alege din meniul sistem Tools, submeniul Wizard, opiunea Mail Merge i
se continu cu paii:
pasul 1 selectarea cmpurilor: se pot selecta cmpuri doar dintr-o singur tabel sau viziune.
pasul 2 alegerea procesorului de text: trebuie s fie instalat o versiune curent de Microsoft
Word n cazul n care se alege opiunea Microsoft Word. Dac se selecteaz opiunea Comma-
delimited text file, asistentul va sri peste paii 3 i 4 i va merge direct n ecranul de terminare.
pasul 3 selectarea tipului de document: se creaz un nou document sau se adaug date la un
document existent.
pasul 4 selectarea stiluilui documentului: se selecteaz unul din tipurile de fiiere pe care le
recunoate editorul Word. Dac se creaz un document nou, se va specifica tipul documentului
Form Letter, Label, Envelope, Catalog.
pasul 5 terminare (butonul Finish): dac s-a selectat crearea unui document nou n Word,
asistentul va deschide documentul n Microsoft Word. Dac s-a selectat opiunea de creare a unui
fiier de tip text, asistentul l va salva.

Introducerea unui cmp al bazei de date n documentul Word se face astfel:


se poziioneaz cursorul n locul din document unde se dorete inserarea cmpului;

pe bara de instrumente pentru interclasare din opiunea pop-up Insert Merge Field se alege numele
cmpului ce trebuie inserat;

activnd opiunea - View Merged Data (vizualizarea datelor care au fuzionat), se


poate vedea efectiv valoarea cmpului selectat pentru inserare. Butoanele pentru deplasare la
nceputul / sfritul fiierului sau secvenial nainte / napoi, vor muta pointerul de fiier pe
nregistrarea corespunztoare, afind noua valoare a cmpului, n documentul Word.
73 Baze de date

6.7. Editorul de texte n VFP 6.0

Mediul VFP 6.0 pune la dispoziia utilizatorului un editor de texte, pentru crearea fiierelor de
tip text, aplicaie care se deschide ntr-o fereastr de tip Windows.

6.7.1. Lansarea editorului

Lansarea editorului se face fie cu una din comenzile:


MODIFY FILE <nume_fiier> && modificare fiier de tip text;
MODIFY COMMAND <nume_program> && modificare program surs.

introduse n fereastra de comenzi, fie din meniul sistem se alege meniul File, submeniul New,
opiunea Program / Text File. n editor se pot folosi pentru deplasare: tastele cu sgei direcionale,
[Page Up] - o pagin ecran n sus, [Page Down] - o pagin ecran n jos, [Home] - la nceputul
rndului, [End] - la sfritul rndului curent.

6.7.2. Lucrul cu blocul de linii din fiier

Asupra unei linii sau unui bloc de linii de text se pot executa urmtoarele operaii:
marcarea blocului se ine tasta [Shift] apsat i cu una din sgeile direcionale, sau tastele
[Home], [End], [Page Up], [Page Down] se marcheaz liniile de text (care vor apare n video-
invers).
copierea blocului de linii marcat n Clipboard se face:
folosind opiunea Cut din meniul Edit sau apsnd simultan tastele [Ctrl] + [X], textul selectat
va fi ters din fiier;
folosind combinaia de taste [Ctrl]+[C], caz n care textul rmne n fiier.
inserarea la o nou poziie n fiier a textului din Clipboard se face utiliznd opiunea Paste
din fereastra Edit sau combinaia de taste [Ctrl] + [V].
deselectarea unui bloc de linii se face fie apsnd una din sgeile direcionale sau butonul
stng de la mouse.

Programele n VFP au ca regul general, scrierea instruciunilor pe o singur linie (255


caractere). Dac totui o instruciune trebuie sa fie scris pe mai multe rnduri, la sfritul fiecrei
linii se pune un caracter de continuare ; .
7. Elemente ale limbajului propriu Visual FoxPro 6.0 74

7. Elemente ale limbajului propriu Visual FoxPro 6.0

7.1. Simboluri

Pentru scrierea comenzilor (instruciunilor) se folosesc:


literele alfabetului latin, litere mari / litere mici, compilatorul nefcnd diferen ntre cele
dou tipuri;
cifrele 0..9;
caractere speciale: +, -, *, /, (, ), <, >, =, &, @, !, , , #, $, %, ^, \, |, _, spaiu, ;, virgula, ?.

7.2. Variabile de sistem

Sunt variabile proprii sistemului, predefinite, la care utilizatorul are acces. Folosirea lor n
program nu implic operaii de iniializare, incrementare. De exemplu, variabila _PAGENO=n
conine numrul paginii n dintr-un raport, cu ajutorul ei putndu-se controla afiarea paginii n la
monitor sau la imprimant.

7.3. Comentariul

Se folosete pentru a da lmuriri asupra a ceea ce face programul surs, explicaii asura
aciunilor programului, numelor variabilelor etc, pentru a indicanceputul unei linii neexecutabile n
program. Sunt admise pentru comentariere:
caracterul * plasat la nceputul liniei va comentaria ntreagul rnd (fr spaiu de demarcare);
caracterele && plasate la nceputul / sfritul liniei, cu cel puin un spaiu de demarcare fa de
textul propriu-zis;
cuvntul rezervat NOTE, pentru a comentaria mai multe rnduri de text, se introduce n
continuare prima linie de comentariu (la distan de minim un spaiu), se marcheaz continuarea
comentariului pe rndul urmtor cu caracterul punct i virgul (;), nchiderea comentariului se face
cu caracterul punct.

7.4. Tipuri de date, operaii i funcii


75 Baze de date

Datele (variabile sau constante) utilizate n programare pot fi simple sau sub form de masiv de
date (vectori, matrici, care presupun o ordonare a datelor dup un criteriu de poziie). La rndul lor
aceste dou categorii pot fi alctuite din date de tip:
logic, care nu pot lua dect dou valori: .T. | .Y. (adevrat) i .F. | .N.(fals);
numeric, numere ntregi sau fracionare;
ir de caractere, reprezint o mulime ordonat de caractere, fiecare caracter avnd un
numr de ordine n ir, numerotarea ncepnd cu 1. irurile de caractere (constante) se scriu
ntre apostrof sau ghilimele;
calendaristic, de exemplu 01/12/2007.

Se pot construi expresii, combinnd datele (operanzi) cu operaii specifice (operatori).


Operatorii la rndul lor sunt de tip:
logic, lucreaz cu toate tipurile de date i returneaz o valoare logic (.T. / .F.)

Operator Aciune Cod

() gruparea expresiilor logice Cvar1 AND (Cvar2 AND Cvar3)

NOT, ! negare logic IF NOT CvarA = CvarB sau IF ! Nvar1 = Nvar2

AND I logic LvarX AND LvarY

OR SAU logic LvarX OR LvarY

unde Cvar variabil de tip caracter, Nvar variabil de tip numeric, Lvar variabil de tip logic.
relaional, lucreaz cu toate tipurile de date, expresia este evaluat i se returneaz o valoare
logic .T. / .F.(adevrat / fals).

Operator Aciune Cod

< mai mic dect ? 23 < 54

> mai mare dect ? 1 > 2 sau ?.t.>.f.

= egal cu ? cVar1 = cVar

<>, #, != diferit de ? .T. <> .F.


7. Elemente ale limbajului propriu Visual FoxPro 6.0 76

<= mai mic egal cu ? {^1998/02/16} <=


{^1998/02/16}

>= mai mare egal ? 32 >= n_ani


cu

== comparare iruri ? status == "Open"


de caractere

n cazul variabilelor de tip caracter operatorii relaionali funcioneaz prin compararea


codurilor ASCII corespunztoare caracterelor din cele dou iruri, comparaia fcndu-se caracter
cu caracter, de la stnga la dreapta.
Dac irurile care se compar nu au aceeai lungime, implicit se completeaz irul mai scurt cu
codul ASCII pentru caracterul 0.
Operaia de egalitate a dou iruri de caractere este controlat de comanda:
SET EXACT ON|OFF
prin clauza OFF, implicit, se consider c cele dou iruri sunt egale, n cazul cnd caracterele
coincid pe lungimea celui mai scurt.
prin clauza ON, egalitatea se verific pe lungimea irului mai lung, spaiile de la sfritul
irurilor sunt ignorate.

numeric, lucreaz cu toate tipurile de date numerice.


Operator Aciune Cod

() gruparea subexpresiilor (4-3) * (12/Nvar2)

**, ^ exponent (putere) ? 3 ** 2 sau ? 3 ^ 2

*, / nmulire, mprire ? 2 * 7 sau ? 14 / 7

% restul mpririi (modulo) ? 15 % 4

+, - adunare, scdere ? 4 + 15

Ordinea operatorilor din tabel este cea folosit n matematic.


77 Baze de date

Operaia modulo (%) se mai poate executa apelnd funcia MOD(n1,n2) care va calcula restul
mpririi numrului n1 la numrul n2.

caracter, care permite concatenarea, compararea datelor de tip ir de caracatere, utiliznd


urmtorii operatori:

Operator Aciune Cod

+ Concatenare. Se unesc dou iruri de caractere, un ir i un ? 'Bun ' + 'ziua'


cmp dintr-o nregistrare sau un ir de caractere i o variabil

- Concatenare. Se ndeprteaz spaiile goale de la sfritul ? 'Bun ' + 'seara'


elementului care precede operatorul, apoi se unesc cele dou
elemente.

$ Comparare. Se caut un ir de caractere n interiorul altui ir ? 'punct' $ contrapunct'


de caractere. ? 'principal' $
clienti.adresa

7.4.1. Date de tip numeric. Funcii aritmetice i financiare

Expresiile de tip numeric pot fi:


cmpuri de tip numeric (N), ntreg (I), virgul mobil (F) dintr-o tabel;
funcii care returneaz o variabil (constant) numeric;
variabile i constante de tip numeric.

Scop / reprezentare matematic Funcie VFP


restul mpririi exacte a lui n1 la n2 mod (n1,n2)
x abs(x)

partea ntreag a lui x int(x)


urmtorul ntreg mai mare sau egal cu x (plafon) ceiling(x)
urmtorul ntreg care este mai mic sau egal cu x (podea) floor(x)
rotunjirea unei expresii numerice la un numr specificat de round(nExpr,nr_zecimale)
zecimale
ex exp(x)
ln(x) log(x)
7. Elemente ale limbajului propriu Visual FoxPro 6.0 78

log10 x log10(x)

x sqrt(x)

sin x sin(x)
cos x cos(x)
tg x tan(x)
arcsin x asin(x)
arccos x acos(x)
arctg x atan(x)
trecerea din grade n radiani dtor(x)
trecerea din radiani n grade rtod(x)
alegerea numrului de zecimale n set decimals to n
valoarea constantei PI()

Funcii financiare

Scop Funcie VFP


returneaz valoarea ratei necesare pentru achitarea unui PAYMENT(s,d,nr)
mprumut s, cu dobnda d*, pe perioada nr** (annual sau lunar)
returneaz suma ce trebuie depus n cont pentru a plti o rat s, PV(s,d,nr)
pe o perioad nr (ani sau luni), dac dobnda acordat este d (Present Value)
returneaz suma ce se poate strnge n cont, dup o perioad nr FV(s,d,nr)
(ani sau luni), dac dobnda este d iar rata depunerii este s (Future Value)

*Argumentul d (dobnda) este utilizat n form zecimal (d=0.06 | 6%). Dac dobnda se preia sub
form procentual se va mprii la 100. Implicit este dobnda anual.
**Argumentul nr (perioada) este implicit exprimat n ani. Dac calculul se efectueaz pentru o
perioad exprimat n luni, va terbui modificat corespunztor i dobnda (anual | lunar).

7.4.2. Aplicaii ale funciilor financiare

A. Funcia PAYMENT returneaz valoarea fiecrei pli, dintr-o serie periodic de pli (rat), a
unui mprumut s, cu dobnda fix d, pe o perioad nr.
Sintaxa funciei: PAYMENT(s,d,nr)
79 Baze de date

Exemplul 1. Firma DAEWOO vinde autoturisme marca MATIZ care pot fi achitate n rate lunare,
pe o perioad de trei ani. mprumutnd de la BRD suma de 6000 $ cu dobnda anual de 5.3%, s
se stabileasc care este rata lunar pe care trebuie s o achite un client.

n fereastra de comenzi introducem comanda pentru crearea fiierul surs IMPR:

MODI COMM IMPR


se lanseaz editorul de programe VFP i se introduc liniile de comenzi (instruciuni):
SET TALK OFF && anuleaz afiarea rezultatelor comenzilor
CLEAR && cur spaiul de afiare
SET CURRENCY TO '$' && definirea simbolului monedei
STORE 0 TO S,NR && iniializarea variabilelor S, NR cu 0
D=0.00 && iniializarea variabilei D
@5,20 SAY 'STABILIREA RATEI LUNARE PENTRU UN IMPRUMUT'
@7,15 SAY 'SUMA IMPRUMUTATA ?:' GET S
NOTE afiarea la coordonate fixate de carcaterul @ (linia 7, coloana 15) a mesajului dintre apostrof
i editarea variabilei S.
@9,15 SAY 'DOBANDA ANUALA (%) ?:' GET D
@11,15 SAY 'IN CATE LUNI TREBUIE ACHITAT IMPRUMUTUL ?:' GET NR
READ && citirea ntregului ecran variabilele editate cu @.. GET
D=D/12/100 && transformare dobnd anual procentual, n dobnd lunar, exprimat zecimal
@15,20 SAY 'RATA LUNARA ESTE DE '
SET CURRENCY RIGHT && setarea afirii simbolului monedei la dreapta
@15,45 SAY PAYMENT(S,D,NR) FUNCTION '$9999.99' && afiarea rezultatului funciei i a
monedei
WAIT WINDOW 'APASATI ENTER' && pstreaz ecranul cu rezultate pn se apas Enter

Fereastra de editare se nchide cu [CTRL] + [W] sau din butonul de nchidere i se salveaz
fiierul. Lansarea n execuie a programului se face fie din meniul sistem Program/Do, fie din bara
de instrumente se activeaz icon-ul cu semnul exclamrii, sau n fereastra de comenzi se introduce
comanda
DO IMPR
Rata lunar este 180.63 $.
7. Elemente ale limbajului propriu Visual FoxPro 6.0 80

B. Funcia PV returneaz valoarea sumei care trebuie s existe n cont, pentru a putea plti o
rat s, pe o perioad nr, pentru o dobnd anual d acordat de banc la depozit.
Sintaxa funciei: PV(s,d,nr)

Exemplul 2. O firm trebuie s achite o chirie lunar de 300 $ pentru sediu, pe o perioad de 5 ani.
Ci bani trebuie depui n cont la banca BCR, dac dobnda la acest tip de depozit este de 4% pe
an.

n fereastra de comenzi se introduce comanda pentru crearea fiierului CONT:

MODI COMM CONT


se lanseaz editorul de programe VFP i se introduc liniile de comenzi:
SET CLOCK ON && afiarea cesul cu ora dat de sistemul de operare
CLEAR
STORE 0 TO S,NR
D=0.00
@5,25 SAY STABILIREA SUMEI NECESARE IN CONT PENTRU PLATA UNEI RATE
LUNARE
@7,20 SAY RATA LUNARA ?: GET S
@9,20 SAY DOBANDA ANUALA (%) ?: GET D
@11,20 SAY PERIOADA (LUNI) DE ACHITARE A RATEI ?: GET NR
READ
D=D/12/100
@13,25 SAY SUMA INITIALA DIN CONT TREBUIE SA FIE DE ;
+ALLTRIM(STR(PV(S,D,NR),10,2))+ $
NOTE funcia STR() transform o valoare numeric ntr-un ir de caractere;
funcia ALLTRIM() elimin spaiile de la nceputul i sfritul irului.
WAIT WINDOW APASATI ENTER

Se salveaz programul i se lanseaz n execuie cu comanda:


DO CONT
Suma necesar este 16289.72$.
81 Baze de date

C. Funcia FV returneaz valoarea sumei ce se strnge ntr-un cont, n cazul n care se depune
o rat s, banca ofer o dobnd anual d, pe o perioad nr.
Sintaxa funciei: FV(s,d,nr)

Exemplu. Ce sum va strnge n cont un copil, care primete pensie alimentar timp de 10 ani, cte
50 $ pe lun, la o banc ce ofer o dobnd de 4% pe an ?

n fereastra de comenzi se introduce comanda pentru crearea fiierului SUMA:

MODI COMM SUMA


se lanseaz editorul de programe VFP i se introduc liniile de comenzi:
CLEAR
STORE 0 TO S,NR
D=0.00
@5,25 SAY STABILIREA SUMEI STRANSE IN CONT DUPA O PERIOADA DE TIMP
@7,20 SAY RATA LUNARA ?: GET S
@9,20 SAY DOBANDA ANUALA ?: GET D
@11,20 SAY PERIOADA (LUNI) DE DEPUNERE A RATEI ?: GET NR
READ
D=D/12/100
@13,25 SAY SUMA STRANSA IN CONT ESTE +ALLTRIM(STR(FV(S,D,NR),10,2))+ $
WAIT WINDOW APASATI ENTER

Se salveaz programul i se lanseaz n execuie cu comanda:


DO SUMA
Suma strns n cont este 7462.49$.

7.4.3. Date i funcii de tip caracter

Operanzii de tip caracter pot fi:


cmpurile de tip CHARACTER ale unei tabele;
funciile care returneaz un ir de caractere;
variabile i constante de tip ir de caractere.
7. Elemente ale limbajului propriu Visual FoxPro 6.0 82

Dac irul de caractere conine n componena sa caracterul () atunci pentru definirea irului
se folosesc caracterele ().
Scop Funcie VFP
Returneaz caracterul corespunztor codului ASCII n (I=1...127) CHR(n)
Returneaz codul ASCII pentru un caracter c ASC(c)
Extragerea unui subir de de caractere, de lungime n2, din irul s, SUBSTR(s,n1,n2)
ncepnd cu poziia n1
Extragerea unui subir de n caractere, ncepnd din stnga irului s LEFT(s,n)
Extragerea unui subir de n caractere, ncepnd din dreapta irului s RIGHT(s,n)
Returnarea unui ir de caractere s, n mod repetat de n ori REPLICATE(s,n)
Obinerea unui ir de n spaii goale SPACE(n)
Eliminarea spaiilor ntr-un ir de caractere:
de la nceputul i sfritul irului s ALLTRIM(s)
de la nceputul irului s LTRIM(s)
de la sfritul irului s RTRIM(s)
Adugarea de spaii, sau a unui caracter c_pad, ntr-un ir s pentru
a ajunge la lungimea n:
la ambele capete PADC(s,n[, c_pad])
la stnga PADL(s,n[,c_pad])
la dreapta PADR(s,n[,c_pad])
Returneaz lungimea unui ir de caractere s LEN(s)
Returneaz poziia de nceput, la a n-a apariie, a unui subir de AT(s,ss,n)
caractere ss ntr-un ir de caractere s
Returneaz poziia de nceput, la a n-a apariie, a unui subir de ATC(s,ss,n)
caractere ss ntr-un ir de caractere s, fr a se ine seama de litere
mari/mici
Returneaz poziia numeric, la a n-a apariie, a unui subir de RAT(s,ss,n)
caractere ss ntr-un ir de caractere s, ncepnd cutarea de la dreapta
Transformarea caracterelor unui ir s n litere mari UPPER(s)
Transformarea caracterelor unui ir s n litere mici LOWER(s)
Transformarea primului caracter al unui ir s, dac este o liter, PROPER(s)
n majuscul
83 Baze de date

7.4.4. Date i funcii de tip calendaristic

Expresiile de tip dat calendaristic pot fi:


cmpuri de tip dat calendaristic (DATE), dintr-o tabel;
funcii care returneaz data calendaristic;
constante de tip dat calendaristic.
O dat de tip dat calendaristic precizeaz ziua, luna, anul, ordinea acestor 3 elemente poate fi
aleas din 11 moduri, cu ajutorul comenzii:
SET DATE TO <tip_dat>
unde:
tip_dat Format
AMERICAN ll/zz/aa
ANSI aa.ll.zz
BRITISH zz/ll/aa
FRENCH zz/ll/aa
GERMAN zz.ll.aa
ITALIAN zz-ll-aa
JAPAN aa/ll/zz
USA ll-zz-aa
MDY ll/zz/aa
DMY zz/ll/aa
YMD aa/ll/dd

Cele 3 elemente pot fi separate cu /, -, .. Implicit se consider formatul: ll/zz/aa.


Cu comanda:
SET CENTURY ON|OFF
se poate preciza dac anul este este afiat cu 2 cifre (ON) sau 4 cifre (OFF).
Comanda:
SET MARK TO <caracter>
precizeaz ce caracter se va folosi ca separator ntre cele 3 elemente ale datei.
Funcii pentru datele de tip dat calendaristic sunt date n tabelul urmtor:
7. Elemente ale limbajului propriu Visual FoxPro 6.0 84

Scop Funcie VFP


Returneaz data din sistem(calculator) DATE()
Numele zilei dintr-o expresie de tip dat d CDOW(d)
A cta zi din sptmn dintr-o expresie de tip dat d DOW(d)
Numele lunii dintr-o expresie de tip dat d CMONTH(d)
A cta lun din an dintr-o expresie de tip dat d MONTH(d)
Izolarea anului dintr-o expresie de tip dat d YEAR(d)
Returneaz ora din sistem (calculator) TIME()
Returnarea sub form de ir de caractere, n format aaaallzz DTOS(d)
a unei expresii de tip dat calendaristic d

Folosirea ntr-un program a unei constante de tip dat calendaristic, se face ntre acolade
({^31/01/01}).

7.4.5. Date de tip memo

Acest tip de date este asemntor tipului ir de caractere. Este indicat folosirea datelor de tip
memo n cazul n care un cmp al unei nregistrri dintr-o tabel, nu are o lungime cunoscut (sau
care nu poate fi aproximat). Utilizarea unui cmp memo ntr-o tabel, are ca efect asocierea la
tabel a unui fiier suplimentar n care se depun datele cmpului memo. n tabel, n cmpul memo
sunt stocate informaii referitoare la tabela suplimentar. Lungimea unui cmp memo este 10 octei.

7.5. Variabile i masive

7.5.1. Variabile

O variabil are asociate urmtoarele elemente:


numele
coninutul (valoarea)
tipul variabilei
zon de memorie
Din punct de vedere al utilizrii lor, variabilele pot fi:
locale, acioneaz ntr-o funcie sau procedur. Declararea utilizrii lor se face cu comanda:
LOCAL <list_variabile>
<list_variabile> - variabilele se declar prin nume i sunt separate n list prin virgul.
85 Baze de date

globale, acioneaz la nivelul ntregului program, inclusiv n funcii i proceduri. Declararea


utilizrii lor se face cu comanda:
PUBLIC <list_variabile>
Atribuirea de valori unei variabile se face cu sintaxa:
<nume_var>=<expresie>
Efectul comenzii: se evaluaez expresia din dreapta, se caut dac variabila a fost definit i i se
atribuie valoarea i tipul expresiei.
Atribuirea se mai poate face utiliznd comanda:
STORE <expresie> TO <list_variabile>
Efectul comenzii: se evaluaz expresia i se atribuie variabilelor din list, valoarea i tipul ei.
Eliberarea zonelor de memorie ocupate de variabile care nu mai sunt necesare n program se face
cu una din comenzile:
RELEASE [ALL] <list_variabile>
CLEAR [ALL] <list_variabile>
Afiarea coninutului variabilelor existente n memorie se face cu comenda:
DISPLAY MEMORY [TO PRINTER[PROMPT] | TO FILE nume_fiier] [NOCONSOLE]
unde:
TO PRINTER[PROMPT] ieirea la imprimant. Clauza PROMPT se folosete pentru a confirma
imprimarea, ntr-o fereastr de dialog;
TO FILE nume_fiier ieirea direcionat ctre un fiier;
[NOCONSOLE] mpiedic afiarea n fereastra principal VFP, a rezultatelor comenzii.

7.5.2. Macrosubstituia

Macrosubstituia trateaz coninutul unei variabile ca un ir de caractere n sens literal (cmpul


unei nregistrri dintr-o tabel, nume de fiier etc.), ca i cum n locul variabilei respective ar fi pus
irul de caractere fr apostrofuri.
Sintaxa comenzii:
& nume_variabil

Exemplu. Presupunem c exist 2 fiiere ESTUD1.DBF i ESTUD2.DBF. Se dorete s li se


vizualizeze coninutul ntr-un ciclu FOR.

PUBLIC FIS C(20)


7. Elemente ale limbajului propriu Visual FoxPro 6.0 86

FOR I=1 TO 2
FIS='ESTUD'+ALLTRIM(STR(I))+'.DBF'
USE &FIS
BROWSE
ENDFOR
CLOSE DATABASES

7.5.3. Masive de date

Masivele de date (vectori i matrice) pot fi privite ca variabile sau constante, care au o structur
compus, identificarea n cadrul structurii fcndu-se pe baza unui criteriu de poziie. Pentru vector
criteriul de poziie este numrul de ordine al elementului, pentru matrice, criteriul de poziie este fie
numrul liniei i al coloanei, fie liniariznd matricea, se poate adresa un element prin poziia care o
ocup n masiv (de exemplu, ntr-o matrice A de dimensiune 3x3, elementul A(3,2) este al 8-lea
element din matrice i se poate adresa cu A(8)). Prin liniarizare o matrice poate fi adresat ca un
vector. Calculul poziiei n matricea liniarizat (vector), pe baza coordonatelor linie/coloan se
poate face cu formula:
poziie=(linie-1)*Nr_linii+coloan
Utilizarea masivelor de date comport urmtoarele aspecte:
atribuirea unui nume pentru identificare;
declararea tipului de masiv: vector sau matrice (rezervare zon de memorie);

Masivele de date pot fi declarate n dou moduri:


fie la nceputul programului sau al subprogramului, utiliznd comanda PUBLIC (variabi
global) sau LOCAL (variabil local):

PUBLIC [ARRAY] nume_masiv1(n_linie[,n_col])[, nume_masiv2(n_linie[,n_col])...


LOCAL [ARRAY] nume_masiv1(n_linie[,n_col])[, nume_masiv2(n_linie[,n_col])...

Variabilele create cu PUBLIC / LOCAL sunt iniializate cu valoarea fals (.F.). Variabilele
locale sunt legate de funcia sau procedura n care au fost declarate, dar pot fi transmise prin
referin;
fie n interiorul programului utiliznd una din comenzile:
87 Baze de date

DIMENSION [ARRAY] nume_masiv1(n_linie[,n_col])[, nume_masiv2(n_linie[,n_col])...


DECLARE [ARRAY] nume_masiv1(n_linie[,n_col])[, nume_masiv2(n_linie[,n_col])...

Elementele masivului sunt iniializate cu valoarea fals ca i n primul caz.


Dup declarare, masivul poate fi iniializat global (toate elementele capt aceeai valoare) i
cu aceast operaie se stabilete tipul de date al elementelor masivului:
STORE <val_init> TO <nume_masiv>

Exemplu
DIMENSION MAT(5,7)
STORE 0 TO MAT

Tipul i dimensiunile unui masiv de date pot fi modificate n cadrul aceluiai program, prin noi
declaraii DIMENSION, DECLARE.

7.6. Funcii de prelucrare a masivelor

Funcia ALEN (nume_masiv,n)


Returneaz urmtoarele informaii:
numrul de elemente, dac n=0;
numrul de linii, dac n=1;
numrul de coloane, dac n=2.

Funcia AINS(nume_masiv,n[,2])
Are ca efect:
inserarea unui element nou ntr-un vector, inaintea elementului de pe poziia n,dac
argumentul 2 lipsete;
inserarea unei linii ntr-o matrice, naintea liniei cu numrul n, dac argumentul 2 lipsete;
inserarea unei coloane ntr-o matrice, naintea coloanei cu numrul n, dac argumentul 2
apare.
Funcia returneaz valoarea 1 dac inserarea s-a efectuat cu succes.

Observaie. Inserarea unui element, a unei linii sau coloane ntr-un masiv nu modific dimensiunea
masivului, ci duce la pierderea elementelor de pe poziia n.
7. Elemente ale limbajului propriu Visual FoxPro 6.0 88

Funcia ADEL(nume_masiv,n,[2])
Are ca efect operaia invers comenzii AINS, deci tergerea elementului, liniei, coloanei de pe
poziia n. Argumentul 2 trebuie s apar n cazul n care tergem o coloan dintr-o matrice.
Prin cele dou funcii, elementele unui masiv sunt translatate cu o poziie la dreapta (AINS) sau
la stnga (ADEL). Funcia va returna valoarea 1 dac tergerea liniei/coloanei s-a efectuat cu
succes.
Funcia ACOPY(masiv_surs,masiv_destinaie[,nr_ncep_surs[,nr_elem_copiate[,
nr_ncep_destin]]])
Este comanda de copiere a elementelor unui masiv (surs) n elementele altui masiv (destinaie),
unde:
masiv_surs, masiv_destinaie numele masivelor surs/destinaie;
nr_ncep_surs numrul elementului din surs de la care ncepe copierea;
nr_elem_copiate numrul de elemente ce vor fi copiate din masivul surs, dac are
valoarea 1 toate elementele ncepnd cu poziia nr_ncep_surs vor fi copiate;
nr_ncep_destin numrul elementului din masivul destinaie de la care ncepe inserarea.
Funcia returneaz numrul elementelor copiate n masivul destinaie.

Funcia ASORT(nume_masiv[,nr_ncep[,nr_elem_sortate[,nr_ordine_sortare]]])
Comanda are ca efect sortarea elementelor unui masiv, putnd preciza primul element de la care
ncepe sortarea (nr_ncep), cte elemente vor fi sortate (nr_elem_sortate). Ordinea de sortare
(nr_ordine_sortare) va fi ascendent dac argumentul este 0 sau omis, sau descendent dac
argumentul este 1 sau orice valoare diferit de 0.
Funcia va returna valoarea 1 dac sortare s-a efectuat cu succes, sau 1 n caz contrar.

Exemplul 1. Secvena urmtoare de comenzi va crea o matrice cu 3 linii i 2 coloane, elementele


masivului se identific prin numrul de ordine n matricea liniarizat:

DIMENSION LIT(3,2)
LIT(1) = 'G'
LIT(2) = 'A'
LIT(3) = 'C'
LIT(4) = 'Z'
LIT(5) = 'B'
89 Baze de date

LIT(6) = 'N'

Elementele din matrice vor fi distribuite astfel:

Linia Coloana 1 Coloana 2


1 G A
2 C Z
3 B N

Se sortez masivul cu comanda ASORT(LIT,1)


Sortarea ncepe cu primul element al masivului (1,1). Elementele din prima coloan a masivului
sunt plasate n ordine ascendent prin rearanjarea liniilor masivului.

Linia Coloana 1 Coloana 2


1 B N
2 C Z
3 G A

Apoi masivul este sortat ncepnd cu elementul 4 (2,2) din masiv cu comanda ASORT(LIT,4)
Elementele din coloana a 2-a sunt plasate n ordine ascendent prin rearanjarea liniilor masivului,
ncepnd cu elementul 4 din masiv.

Linia Coloana 1 Coloana 2


1 B N
2 G A
3 C Z

Dac sortarea se efectueaz cu succes funcia returneaz valoarea 1, n caz contrar valoarea 1.
Pentru a putea fi sortate, elementele masivului trebuie s fie de acelai tip.

Exemplul 2.

PUBLIC DIMENSION LIT(3,2)


CLEAR
7. Elemente ale limbajului propriu Visual FoxPro 6.0 90

LIT(1) = 'G'
LIT(2) = 'A'
LIT(3) = 'C'
LIT(4) = 'Z'
LIT(5) = 'B'
LIT(6) = 'N'
@1,1 SAY "MATRICEA INITIALA"
K=1
FOR I=1 TO 3
@I+K,1 SAY LIT(I,1)
@I+K,2 SAY ""
@I+K,3 SAY LIT(I,2)
ENDFOR
@6,1 SAY "MATRICEA SORTATA INCEPAND CU PRIMUL ELEMENT"
K=6
ASORT(LIT,1)
FOR I=1 TO 3
@I+K,1 SAY LIT(I,1)
@I+K,2 SAY ""
@I+K,3 SAY LIT(I,2)
ENDFOR
@11,1 SAY "MATRICEA SORTATA INCEPAND CU ELEMENTUL 4"
K=11
ASORT(LIT,4)
FOR I=1 TO 3
@I+K,1 SAY LIT(I,1)
@I+K,2 SAY ""
@I+K,3 SAY LIT(I,2)
ENDFOR
@16,1 SAY "INSERAREA UNEI LINII INAINTE DE LINIA 3"
AINS(LIT,3)
LIT(3,1)="2"
LIT(3,2)="5"
K=16
91 Baze de date

FOR I=1 TO 3
@I+K,1 SAY LIT(I,1)
@I+K,2 SAY ""
@I+K,3 SAY LIT(I,2)
ENDFOR
@21,1 SAY "STERGEREA LINIEI 3"
K=21
ADEL(LIT,3)
FOR I=1 TO 3
@I+K,1 SAY LIT(I,1)
@I+K,2 SAY ""
@I+K,3 SAY LIT(I,2)
ENDFOR

n urma execuiei programului de mai sus, se obin rezultatele din Figura 1.

Fig. 1
8. Accesul i actualizarea datelor 92

8. Accesul i actualizarea datelor

Lucrul cu baze de date i tabele n cadrul limbajului propriu VFP, presupune trei activiti, care
segmenteaz construcia unei aplicaii:
deschiderea/crearea bazei de date, a tabelelor, a fiierelor asociate (index);
exploatarea bazei de date i a tabelelor, ceea ce implic operaii de actualizare i consultare,
la nivel de structur sau nregistrri;
nchiderea/tergerea bazei de date, a tabelelor sau a fiierelor asociate (index).
Comenzile pentru operaiile de deschidere, creare, nchidere a unei baze de date (OPEN
DATABASES..., CREATE DATABASES, CLOSE DATABASES), a unei tabele de date
(USE..., CREATE TABLE..., CLOSE TABLES, USE), a unor fiiere de index (USE...INDEX...,
INDEX ON..., CLOSE INDEX) n modul de lucru comand (interpretor), au aceeai sintax i n
cadrul programelor scrise n limbajul propriu VFP.

8.1. Manipularea structurii unei tabele

Modificarea structurii unei tabele se face cu comanda

MODIFY STRUCTURE

Dac nu este deschis nici o tabel n zona de lucru curent, se deschide caseta de dialog Open
care permite utilizatorului selectarea (deschiderea) unei tabele. Comanda are ca efect lansarea
aplicaiei Table Designer (proiectantul de tabele) cu ajutorul cruia se fac modificrile de structur
(adugare i tergere de cmpuri, modificare nume cmp, mrime, tip, adugarea / tergerea /
modificarea etichetelor de index, specificarea valorilor de tip NULL).

Vizualizarea structurii unei tabele se face cu comanda

DISPLAY STRUCTURE [IN <nr_zon_de_lucru> | <alias_tabel>] [TO PRINTER [PROMPT]


[TO FILE <nume_fiier>] [NOCONSOLE] IN <nr_zon_de_lucru> | <alias_tabel>

Are ca efect afiarea structurii tabelei dintr-o zon de lucru, alta dect cea curent, sau a unei
tabele adresat prin alias. Semnificaia clauzelor este urmtoarea:
TO PRINTER [PROMPT] direcioneaz informaiile la imprimant.
93 Baze de date

Clauza PROMPT determin afiarea unei casete de dialog nainte de ieirea la imprimant
(se pot face setri legate de imprimant).
TO FILE <nume_fiier> - direcioneaz ieirea informaiilor ntr-un fiier.
NOCONSOLE suprim afiarea datelor n ferestra principal a VFP.

Se mai poate folosi i comanda LIST STRUCTURE care are aceleai clauze.

Copierea structurii unei tabele


Crearea unei noi tabele care va conine structura tabelei active se face cu comanda

COPY STRUCTURE EXTENDED TO <nume_fiier> [FIELDS <list_cmpuri>]

Numai cmpurile din lista de cmpuri vor fi incluse n nregistrarea din noul fiier. Dac clauza
FIELDS este omis, vor fi incluse toate cmpurile tabelei surs.

8.2. Ordonarea datelor

Datele dintr-o tabel se pot ordona dup un singur criteriu sau dup mai multe (ordonare
multicriterial) . Ordonarea poate fi ascendent, dac fiecare cmp dup care se face ordonarea are
o valoare mai mare dect cmpul corespunztor din nregistrarea anterioar, sau descendent. Dac
ordonarea se face multicriterial, se definete o cheie primar, care este principalul criteriu de
ordonare i chei secundare. n cazul n care dou sau mai multe nregistrri au aceai valoare pentru
cheia principal, se utilizeaz cheile secundare pentru departajare, n ordinea n care au fost
declarate. n VFP ordonarea unui fiier se poate face n dou moduri:
folosind comanda SORT, prin care se creaz un nou fiier cu nregistrrile sortate dup
criteriul ales.
folosind metoda indexrii, care const n crearea unui fiier de index, n care se stocheaz
ordinea nregistrrilor din tabela surs.

Comanda SORT are sintaxa:

SORT TO <nume_tabela>ON <nume_cmp_1> [/A | /D] [/C] [, <nume_cmp_2> [/A | /D] [/C] ...]
[ASCENDING | DESCENDING] [Scope] [FOR <expresie_1>] [WHILE <expresie_2>] [FIELDS
<lista_cmpurilor>]
8. Accesul i actualizarea datelor 94

unde:
nume_tabela numele fiierului sortat.
nume_cmp_1 specific cmpul din tabela nesortat asupra creia se aplic procedura.
Implicit sortarea este ascendent. Nu se pot sorta cmpuri memo sau general. Este cheia
primar dup care se face sortarea.
/A, /D, /C specific ordinea: A: ascendent, D: descendent, C: fr a se ine cont de litere
mari/mici.
nume_cmp_2 specific un cmp cu rol de cheie secundar.
ASCENDING specific o sortare ascendent pentru cmpurile care nu sunt urmate de
opiunea /D.
DESCENDING specific o sortare descendent pentru cmpurile care nu sunt urmate de
opiunea /A.
Scope specific domeniul de sortare (tot fiierul sau doar o parte din nregistrri) All, Next
n, Record n, Rest.
FOR expresie_1 precizeaz care nregistrri particip la sortare, respectiv acelea pentru
care expresie_1 are valoarea True
WHILE expresie_2 precizeaz condiia pentru care atta vreme ct au valoarea True,
nregistrrile vor fi sortate.
FIELDS lista_cmpurilor precizeaz cmpurile din tabela original care vor fi incluse n
noul fiier sortat. Dac se omite clauza, toate cmpurile din tabela original vor fi incluse n
tabela sortat.

Exemplu. S se sorteze fiierul ESTUD1, ntr-un nou fiier SESTUD1, dup cmpul NUME,
ascedent, fr s se in seama de litere mici/mari, lund doar studenii cu media peste 8.00 i
cmpurile MATR, NUME, MBAC.

USE ESTUD1
SORT TO SESTUD1 ON NUME/A/C FOR MBAC>8.00 FIELDS MATR,NUME,MBAC
USE SESTUD1
BROWSE
CLOSE DATABASES
DELETE FILE SESTUD1.DBF
95 Baze de date

Sortarea este un procedeu care, n cazul tabelelor mari, duce la mrirea timpului de execuie i
a spaiului solicitat pe hard disk. Se consider c este mai eficient folosirea metodei indexrii.
Prin metoda indexrii se creaz un fiier de index, care va conine cel puin un cmp al tabelei
de date, sortat dup un criteriu alfabetic, numeric sau cronologic. Fiierul de index este o sortare
virtual a unei tabele, nregistrrile din tabela de date rmnnd nesortate. Fiierul de index conine
informaii de localizare a nregistrrilor dintr-o tabel.
Fiierele index sunt de 2 tipuri:
simple au extensia IDX, conin o singur cheie de indexare i deci un singur criteriu de
ordonare.
compuse au extensia CDX (Compound Index File), n care se stocheaz mai multe criterii
de ordonare, fiecare avnd asociat un nume ( TAG - eticheta de index), corespunztor mai
multor chei de indexare.
Crearea unui fiier de index se face cu comanda:

INDEX ON <expr> TO <.IDX file>|TAG<tag_name>[OF<.CDX file>] [FOR <exprL>]


[ASCENDENT | DESCENDENT] [UNIQUE] [ADDITIVE]
unde:
<expr> - expresia indexului care include cmpuri din tabela ce va fi indexat. Tipurile de
expresii admise sunt: C, D, N.
TO <.IDX file> - specific numele fiierului de index care va fi creat.
TAG<tag_name> OF<.CDX file> - permite crearea unui fiier cu mai multe intrri (etichete
de index TAG-uri), numrul lor fiind limitat doar de spaiul pe hard disk.
Fiierele cu extensia .CDX pot fi:
structurale se deschid automat odat cu deschiderea tabelei de date i au acelai
nume.
nestructurale deschiderea se face indicnd un nume la clauza OF<.CDX file>, diferit
de cel al tabelei de date.
FOR <exprL> - permite ca indexul creat s acioneze ca un filtru asupra tabelei.
ASCENDENT|DESCENDENT specific ordinea de sortare n fiierul de index.
UNIQUE pentru valori repetate ale cheii, specific includerea n fiierul de index numai la
prima apariie.
ADDITIVE permite crearea unui fiier de index pentru o tabel, chiar dac mai sunt
deschise alte fiiere de index.
8. Accesul i actualizarea datelor 96

Indexarea dup mai multe cmpuri este similar sortrii multiple. Nu se pot face indexri
multiple pe cmpuri cu tipuri diferite, deci trebuie aduse la o form comun (ir de caractere).
Comanda

INDEX ON <cmp_car> + STR(cmp_numeric,nc) + DTOS(cmp_dat) TO <fiier_index>

permite indexarea dup 3 cmpuri diferite.


Semnificaia parametrilor i a clauzelor:
STR(cmp_numeric,nc) transform un numr ntr-un ir de caractere,
nc numrul maxim de caractere pe care se reprezint cmpul numeric.
DTOS(cmp_data) transform o variabil de tip dat n ir de caractere.

Pentru deschiderea simultan a tabelei de date i a fiierelor de index asociate se folosete


comanda:
USE <nume_tabel> INDEX <list_fiiere_index>

Exemplul 1. Presupunem c este creat o tabel (STUD) cu urmtoarea structur:

matricola N(5)
nume C(40)
data_n D
adresa C(40)

S se indexeze dup cmpul matricola. Tabela are urmtoarele nregistrri:

nr_nreg matricola nume data_n adresa


1 215 Aldea I. Dan 22/03/79 Bucureti
2 110 Barbu A. Vasile 10/05/80 Craiova
3 300 Alexandru F. Ion 13/07/80 Iai
4 200 Dinu A. Adrian 25/08/79 Bucureti
5 210 Cornea C. Ilie 16/07/80 Ploeti
6 250 Ene V. Dan 24/03/80 Bucureti
97 Baze de date

Secvena de comenzi

CLEAR
USE STUD
BROWSE
INDEX ON MATRICOLA TO IMATR.IDX
* Obinerea numelui fiierului IDX deschis pentru baza de date curent sau cea specificat
?? NDX(1)
* Afieaz primul fiier index activ
BROWSE
* nregistrrile din fiierul de date apar sortate dup cmpul matricola.
CLOSE DATABASES
CLEAR

creaz fiierul index IMATR.IDX. Acesta are structura:

matricola nr_nreg
110 2
200 4
210 5
215 1
250 6
300 3

Exemplul 2. S se indexseze tabela STUD dup cmpul NUME i s se creeze un fiier structural
STUD.CDX.

USE STUD
INDEX ON UPPER(NUME) TAG NUME
BROWSE
CLOSE DATABASES

Exemplul 3. S se indexeze tabela ESTUD1 dup cmpul NUME, s se creeze un fiier nestructural
INUM.CDX, ordonat ascendent dup valorile cheii:
8. Accesul i actualizarea datelor 98

USE ESTUD1
INDEX ON UPPER(NUME) TAG NUME OF INUM.CDX ASCENDING
BROWSE
CLOSE DATABASES

Exemplul 4. Utiliznd tabela ESTUD1 s se indexeze tabela dup o cheie compus (NUME,
MBAC), fr a permite existena dublurilor, ntr-un fiier de index INM.IDX. Structura tabelei este:
MATR N(5), NUME C(40), ADRESA C(30), ANS N(1), ANIF N(4), DATAN N(4), MBAC
N(5,2).

USE ESTUD1
INDEX ON UPPER(NUME)+STR(MBAC,5) TO INM.IDX UNIQUE
BROWSE
CLOSE DATABASES

Exemplul 5. S se indexeze tabela ESTUD1 dup cmpul numeric MATR, ntr-un fiier de index
IMATR.IDX, numai pentru nregistrrile care au cmpul MBAC (medie bacalaureat) >8.00:

USE ESTUD1
INDEX ON MATR TO IMATR.IDX FOR MBAC>8.0
BROWSE
CLOSE DATABASES

8.3. Accesul la date

n funcie de tipul accesului la date, comenzile sunt:


pentru acces secvenial : GO, SKIP, LOCATE, CONTINUE.
pentru acces direct: SEEK, caz n care tabela trebuie indexat.

Comanda GO
GO [RECORD] <nr_nreg> [IN <nr_zon_de_lucru> | IN <alias_tabel>]
sau
GO TOP | BOTTOM [IN <nr_zon_de_lucru> | IN <alias_tabel>]
99 Baze de date

Comanda are ca efect mutarea pointer-ului de pe nregistrarea curent pe nregistrarea nr_nreg.


IN nr_zon_de_lucru specific zona de lucru n care este mutat pointer-ul.
IN alias_tabel specific alias-ul tabelei n care este mutat pointer-ul.
TOP poziioneaz pointer-ul pe prima nregistrare din fiier.
BOTTOM poziioneaz pointer-ul pe ultima nregistrare.

Funcia RECNO()
Returneaz numrul curent al nregistrrii pe care este poziionat pointer-ul n fiierul curent sau
specificat. Apelul funciei
RECNO(<nr_zon_de_lucru> | <alias_tabel>)

unde: nr_zon_de_lucru reprezint zona de lucru n care este activ tabela. Dac s-a lansat o
comand SEEK pentru a cuta o nregistrare i aceasta nu a fost gsit, se poate utiliza comanda GO
RECNO(0) pentru a returna numrul nregistrrii cu cea mai apropiat valoare cutat. Funcia
RECNO(0) va returna valoarea 0 dac nu s-a gsit nici o valoare apropiat.

Funcia RECCOUNT()
Returneaz numrul de nregistrri din tabela curent sau specificat. Apelul funciei
RECCOUNT(<nr_zon_de_lucru> | <alias_tabel>)

Funcia EOF()
Este funcia logic care returneaz valoarea adevrat (.T.), dac pointer-ul de fiier este
poziionat pe ultima nregistrare, n fiierul curent. n caz contrar, valoarea returnat este fals (.F.).
Apelul funciei
EOF ([<nr_zon_de_lucru> | <alias_tabel>])

Funcia BOF()
Este o funcia logic i returneaz valoarea adevrat (.T.), dac pointer-ul de fiier este
poziionat pe prima nregistrare, n fiierul curent. n caz contrar, valoarea returnat este fals (.F.).
Apelul funciei
BOF ([<nr_zon_de_lucru> | <alias_tabel>])

Comanda SKIP
8. Accesul i actualizarea datelor 100

SKIP [<nr_nreg>] [IN <nr_zon_de_lucru> | IN <alias_tabel>]

unde: nr_nreg specific numrul de nregistrri peste care se mut pointer-ul n fiier. Dac nu se
specific, pointer-ul se va muta la urmtoarea nregistrare. Dac valoarea lui nr_nreg este pozitiv,
pointer-ul se mut ctre sfritul fiierului. Dac valoarea este negativ, pointer-ul se mut ctre
nceputul fiierului.

Comanda SET FILTER TO


Precizeaz condiia pe care trebuie s o ndeplineasc nregistrrile din tabela curent pentru a
putea fi accesate.
SET FILTER TO [<expr_L>]

unde: expr_L condiia de accesare a nregistrrilor. Numai nregistrrile care satisfac expresia
logic expr_L sunt disponibile i toate comenzile care vor accesa tabela, vor respecta condiia
declarat n comanda SET FILTER TO. Dac este omis expresia logic, toate nregistrrile sunt
accesibile.

Comanda LOCATE
Realizeaz cutarea secvenial ntr-o tabel, a primei nregistrri care ndeplinete condiiile
specificate n expresia logic de cutare, expr_L .

LOCATE FOR <expr_L_1> [Scope] [WHILE <expr_L_2>]

unde:
FOR expr_L _1 este condiia pentru care are loc cutarea secvenial.
Scope specific domeniul nregistrrilor n care are loc cutarea. Numai nregistrrile din
interiorul domeniului vor fi evaluate. Clauza poate lua valorile ALL, NEXT n, RECORD
n, REST. Clauza implicit este ALL (toate nregistrrile).
WHILE expr_L_2 specific condiia pentru cutarea nregistrrilor, atta vreme ct
expr_L_2 este adevrat.

Comanda CONTINUE
101 Baze de date

Se utilizeaz dup o comand LOCATE, pentru a continua cutarea, dup gsirea primei
nregistrri care ndeplinete condiiile specificate. Comanda CONTINUE mut pointer-ul de fiier
la urmtoarea nregistrare pentru care expresia logic din comanda LOCATE este adevrat.

Exemplu. Presupunem c exist o tabel CLIENTI i trebuie s se afle numrul clienilor care sunt
din Frana.

USE CLIENTI
STORE 0 TO TOTAL
LOCATE FOR ALLTRIM(UPPER(TARA))=FRANTA
DO WHILE FOUND()
TOTAL=TOTAL+1
CONTINUE
ENDDO
?TOTAL CLIENTI DIN FRANTA: +LTRIM(STR(TOTAL))
CLOSE DATABASES

Comanda SEEK
Caut ntr-o tabel o nregistrare la prima apariie, a crei cheie de index se potrivete cu
expresia general i mut pointer-ul pe nregistrarea gsit.

SEEK <expr_gen> [ORDER nr_index | nume_fiier_IDX | [TAG] nume_etichet_index [OF


nume_fiier_CDX] [ASCENDING | DESCENDING]] [IN <nr_zon_de_lucru> | IN
<alias_tabel>]
unde:
expr_gen specific cheia de index pentru care se caut cu comanda SEEK;
ORDER nr_index specific numrul fiierului index care conine cheia de indexare. Dac
s-au deschis odat cu tabela i fiierele de index, este numrul care indic poziia din lista de
fiiere de index;
ORDER nume_fiier_IDX - specific numele fiierului de index;
ORDER [TAG] nume_etichet_index [OF nume_fiier_CDX] specific o etichet de
index dintr-un fiier .CDX care conine cheia de indexare. Numele etichetei de index (TAG)
poate fi dintr-un fiier .CDX structural sau dintr-un fiier .CDX independent (nestructural);
8. Accesul i actualizarea datelor 102

[ASCENDING | DESCENDING] specific dac nregistrrile sunt cutate n ordine


ascendent sau descendent.

Exemplu. S se indexeze fiierul ESTUD2 dup cmpul NUME i s se caute nregistrrile care
ncep cu literele BAR. Structura tabelei ESTUD2 este: MATR N(5), NUME C(40), ADRESA
C(30), ANS N(1), DATAN D, MBAC N(5,2)

USE ESTUD2
INDEX ON UPPER(NUME) TAG NUME
STORE 'BAR' TO CAUTL
SEEK CAUTL
IF FOUND( )
BROWSE FIELDS NUME, ADRESA FOR UPPER(NUME)=CAUTL
ELSE
WAIT WINDOW 'NU EXISTA '
ENDIF
CLOSE DATABASES

Funcia FOUND()
Returneaz valoarea logic adevrat (.T.), dac comenzile CONTINUE, LOCATE sau SEEK
s-au executat cu succes.
FOUND(<zon_de_lucru> | <alias_tabel>)

Dac argumentele zon_de_lucru, alias_tabel sunt omise, funcia va returna rezultatul pentru
fiierul deschis n zona de lucru curent.

Vizualizarea coninutului unei tabele


Comanda afieaz informaii (nume cmpuri, date) despre tabela activ n ferestra principal
VFP sau ntr-o ferestr definit de utilizator. Sintaxa este

DISPLAY[[FIELDS] <list_cmpuri>] [Scope] [FOR <expr_L_1>] [WHILE <expr_L_2>]


[NOCONSOLE] [TO PRINTER [PROMPT] | TO FILE <nume_fiier>]
unde:
103 Baze de date

[FIELDS] <list_cmpuri>] specific cmpurile care vor fi afiate. Dac se omite clauza
se vor afia toate cmpurile.
Scope domeniul de adresare a nregistrrilor (ALL, NEXT n, RECORD n, REST);
FOR <expr_L_1> - vor fi afiate doar nregistrrile care satisfac condiia logic;
WHILE <expr_L_2> - atta vreme ct condiia este ndeplinit, nregistrrile vor fi afiate.
Se mai poate utiliza i comanda LIST care are aceleai clauze.

8.4. Actualizarea datelor

Operaia de actualizare const n adugarea de noi nregistrri, modificarea nregistrrilor


existente, tergerea logic i/sau fizic a nregistrrilor. Operaiile fac parte din limbajul de
manipulare a datelor (LMD).

8.4.1. Adgarea de noi nregistrri

Adugarea se poate face utiliznd comenzile de tip APPEND, prin preluarea datelor din alte
tabele, masive de date i variabile de memorie.

APPEND [BLANK] [IN nr_zon_de_lucru | alias_tabel]

Comanda are ca efect adugarea unei nregistrri vide la sfritul unei tabele.

APPEND FROM <nume_fiier> [FIELDS <list_cmpuri>] [FOR <expr_L>] [TYPE]


[DELIMITED [WITH <delimitator> | WITH BLANK | WITH TAB]]

Comanda are ca efect adugarea unei nregistrri preluat din alt tabel, sau dintr-un fiier de
tip text, n tabela curent, unde:
nume_fiier specific numele fiierului din care se face adugarea;
FIELDS <list_cmpuri> - specific lista cmpurilor n care vor fi adugate datele;
FOR <expr_L> - se va aduga cte o nou nregistrare, din nregistrrile tabelei selectate
pentru adugare, cele care ndeplinesc condiia dat de expresia logic expr_L;
TYPE specific tipul fiierului surs din care se adaug. Se folosete n cazul n care nu
este o tabel VFP;
8. Accesul i actualizarea datelor 104

DELIMITED fiierul surs din care se adaug datele n tabela VFP este un fiier de tip
ASCII n care fiecare nregistrare se termin cu <CR> i <LF> (Enter i Line Feed - salt la
linie nou). Cmpurile coninute sunt implicit separate prin virgul, iar cele de tip caracter
sunt declarate ntre apostrof;
DELIMITED WITH <delimitator> - cmpurile de tip carcater, sunt separate cu un caracter
diferit de apostrof;
DELIMITED WITH BLANK - cmpurile sunt separate cu spaii n loc de virgul;
DELIMITED WITH TAB - cmpurile sunt separate cu cu TAB-uri n loc de virgul.

APPEND FROM ARRAY <nume_masiv> [FOR <expr_logic>] [FIELDS <list_cmpuri> |


FIELDS LIKE <ablon> | FIELDS EXCEPT <ablon>]

Comanda are ca efect adugarea unei nregistrri n tabela curent, pentru fiecare linie de masiv,
datele scrise n fiecare cmp corespund coloanelor din masiv. Semnificaia parametrilor i a
clauzelor este urmtoarea:
nume_masiv specific numele masivului care conine datele ce vor fi copiate ca
nregistrri noi;
FOR <expr_logic> - specific condiia pentru adugarea nregistrrilor n tabel. Expresia
logic trebuie s conin i o condiie pentru un cmp al nregistrrii. nainte de a fi adugat
o linie din masiv n tabel sub form de nregistrare, n expresia logic se verific dac
elementele liniei de masiv respect condiia;
FIELDS <list_cmpuri>- specific faptul c numai anumite cmpuri (cele din list) din
noua nregistrare vor fi actualizate cu date din linia masivului;
FIELDS LIKE <ablon> - specific faptul c doar cmpurile care se potrivesc ablonului
vor fi actualizate.
FIELDS EXCEPT <ablon>- specific faptul c toate cmpurile vor fi actualizate, cu
excepia celor care se ncadreaz n ablon.
Dac masivul este unidimensional, comanda APPEND FROM ARRAY adaug o singur
nregistrare n tabel, coninutul primului element trece n primul cmp al nregistrrii, coninutul
celui de al doilea element trece n cel de al doilea cmp etc., cmpurile MEMO i GENERAL sunt
ignorate.

Exemplu comanda:
105 Baze de date

APPEND FROM ARRAY NUME FIELDS LIKE M*, A* EXCEPT NUM*

are ca efect adugarea din masivul NUME, a cmpurilor care ncep cu litera M i A mai puin cele
care au primele trei litere NUM. Caracterul asterisc (Wildcard) are semnificaia de orice
combinaie de caractere.

Not Utilizarea clauzelor FIELDS LIKE i EXCEPT trebuie s se fac ntr-o tabel ale crui
nregistrri au cmpuri care accept valori de tip NULL (pentru a putea fi exceptate de la
scriere).

Exist i comanda invers, cu care putem aduga datele din nregistrarea curent a unei tabele
ntr-un masiv:

SCATTER [FIELDS <list_cmpuri>] | [FIELDS LIKE <ablon>] | [FIELDS EXCEPT <ablon>]


[MEMO] TO ARRAY <nume_masiv> [BLANK]

Semnificaia clauzelor este aceai ca i la comanda APPEND FROM ARRAY ..., clauza
BLANK determin crearea masivului cu elemente vide, care sunt de aceai mrime i tip cu
cmpurile din tabel. Clauza MEMO specific existena unui cmp de tip MEMO n list; implicit
cmpurile MEMO sunt ignorate.

Exemplu. S se creeze un masiv cu numele MASIV1, s se ncarce cu date vide, de acelai tip i
mrime cu cele ale cmpurilor tabelei ESTUD1 (MATR N(5), NUME C(40), ADRESA C(30),
ANS N(1), DATAN D, MBAC N(5,2)). S se introduc datele cmpurilor n masiv i s se adauge
sub form de nregistrare nou n tabela ESTUD1.

USE ESTUD1
* se deschide tabela ESTUD1
SCATTER TO MASIV1 BLANK
* se creaz vectorul MASIV1, cu elemente vide i de acelai tip i mrime
* cu cmpurile din tabela ESTUD1
FOR I=1 TO ALEN(MASIV1)
@I,1 SAY FIELD(I) GET MASIV1(I)
8. Accesul i actualizarea datelor 106

* se afieaz numele cmpului i se editeaz elementul I din masiv


ENDFOR
READ
* se citesc valorile introduse cu GET
IF READKEY()!=12
* dac nu s-a apsat tasta <ESC>
APPEND FROM ARRAY MASIV1
* se adaug din elementele masivului o nou nregistrare n tabela
ENDIF
BROWSE
* vizualizare tabela ESTUD1
CLOSE TABLE
* nchidere tabela ESTUD1
CLEAR

APPEND GENERAL <nume_cmp_general> FROM <nume_fiier> DATA <expr_c> [LINK]


[CLASS <nume_clas>]

Comanda realizeaz importul unui obiect OLE dintr-un fiier i l plaseaz ntr-un cmp de tip
general. Semnificaia parametrilor i a clauzelor este urmtoarea:
nume_cmp_general specific numele cmpului general n care obiectul OLE va fi plasat.
FROM <nume_fiier> - specific numele fiierului care conine obiectul OLE;
DATA <expr_c> - expresie de tip caracter care este evaluat i trecut sub form de ir de
caractere ctre obiectul OLE din cmpul general. Obiectul OLE trebuie s fie capabil s
primesc i s proceseze irul de caractere. De exemplu, nu poate fi trimis un ir de caractere
ctre un obiect grafic creat cu Paint Brush;
LINK - creaz o legtur ntre obiectul OLE i fiierul care conine obiectul. Obiectul OLE
apare n cmpul general, dar definirea obiectului rmne n fiierul care-l conine. Dac se
omite clauza, obiectul este nglobat n cmpul general;
CLASS <nume_clas> - specific o clas pentru un obiect de tip OLE, alta dect clasa
implicit.

8.4.2. Modificarea nregistrrilor


107 Baze de date

Comanda CHANGE afieaz cmpurile unei tabele pentru editare (modificare).

CHANGE [FIELDS <list_cmpuri>][Scope] [FOR <expresie_L_1>] [WHILE <expresie_L_2>]


[FONT <nume_liter> [,<mrime_liter>]] [FREEZE <nume_cmp>] [NOAPPEND]
[NODELETE] [NOEDIT]
Semnificaia clauzelor este urmtoarea:
FIELDS <list_cmpuri> - specific cmpurile care vor apare n fereastra de editare;
Scope specific domeniul de afiare a nregistrrilor (ALL, NEXT n, RECORD n,
REST);
FOR <expresie_L_1> - specific faptul c doar nregistrrile care satisfac condiia logic
dat de expresie_L_1, vor fi afiate n fereastra de editare;
WHILE <expresie_L_2> - atta vreme ct expresie_L_2 este adevrat vor fi afiate
nregistrrile n fereastra de editare pentru modificare;
FONT <nume_liter> [,<mrime_liter>] specific pentru fereastra de editare, tipul de
liter i mrimea, cu care vor fi afiate datele;
FREEZE <nume_cmp> - permite ca modificrile s fie fcute doar n cmpul specificat cu
nume_cmp. Celelalte cmpuri vor fi afiate dar nu pot fi editate (modificate);
NOAPPEND mpiedic utilizatorul de a aduga noi nregistrri (se blocheaz Append
Mode din meniul sistem View sau combinaia de taste [Ctrl] + [Y]);
NODELETE mpiedic marcarea nregistrrilor pentru tergere din interiorul ferestrei de
editare. Includerea clauzei nu inhib comanda de marcare pentru tergere din interiorul unei
proceduri;
NOEDIT mpiedic un utilizator s modifice o tabel. Includerea clauzei permite cutarea
sau rsfoirea tabelei dar fr a-l putea modifica (edita).
Se poate folosi i comanda EDIT cu aceiai parametri ca i CHANGE.

Comanda BROWSE este una dintre cele mai utilizate comenzi pentru afiarea i editarea
nregistrrilor dintr-o tabel. Cu ajutorul tastelor [TAB] sau [SHIFT] + [TAB] se poate face
deplasarea n cmpul urmtor sau anterior. Cu tastele [Page Up], [Page Down] se pot face deplasri
pe vertical n tabel.
Apsarea simultan a tastelor: [Ctrl] + [End] sau [Ctrl] + [W] - ieire cu salvare din fereastra
de BROWSE; [Ctrl] + [Q] sau [Esc] ieire fr salvarea modificrilor.
8. Accesul i actualizarea datelor 108

BROWSE [FIELDS <list_cmpuri>] [FONT <nume_font>[,<mrime_font>]]


[STYLE <stil_font>] [FOR <expr_L_1>] [FREEZE <nume_cmp>] [LOCK <nr_cmpuri>]
[NOAPPEND] [NODELETE] [NOEDIT | NOMODIFY] [VALID <expr_L_2>] [ERROR <mesaj>]
[WHEN <expr_L_3>] [WIDTH <lime_afiare_cmp>] [IN [WINDOW] <nume_fer>]

unde:
FIELDS <list_cmpuri> - specific care cmpuri vor aparea n fereastra BROWSE.
Cmpurile vor fi afiate n ordinea specificat n list;
FONT <nume_font>[,<mrime_font>] specific tipul literei i mrimea utilizate n
fereastra Browse (de exemplu Font Courier, 16);
STYLE <stil_font> - specific stilul literelor folosite n fereastra Browse (B- ngroat, I-
italic, U- subliniat);
FOR <expr_L_1> - vor fi afiate numai acele nregistrri care ndeplinesc condiia dat de
expresia logic expr_L_1;
FREEZE <nume_cmp> - permite modificri doar ntr-un singur cmp, specificat prin
nume_cmp;
LOCK <nr_cmpuri> - specific numrul cmpurilor care pot fi afiate n partea stng, n
fereastra Browse, fr a fi necesar deplasarea cu [TAB]-uri sau cursorul ferestrei (Scroll
Bar);
NOAPPEND mpiedic utilizatorul s adauge noi nregistrri (se inhib aciunea tastelor
[Ctrl] + [Y] i opiunea Append new record din meniul Table);
NODELETE mpiedic marcarea nregistrrilor pentru tergere n interiorul ferestrei
BROWSE;
NOEDIT | NOMODIFY mpiedic utilizatorul s fac modificri n fereastra Browse.
VALID <expr_L_2> [ERROR <mesaj>] realizeaz o validare la nivel de nregistrare.
Clauza se execut doar dac se fac modificri i se ncearc trecerea la o alt nregistrare.
Dac expr_L_2 returneaz valoarea .T. (adevrat) utilizatorul se poate deplasa la urmtoarea
nregistrare. n caz contrar, se genereaz un mesaj de eroare;
WHEN <expr_L_3> - se evaluaez condiia dat de expresia logic expr_L_3 atunci cnd
utilizatorul mut cursorul la o alt nregistrare. Dac expresia returneaz valoarea .F. (fals)
nregistrarea nu mai poate fi modificat (devine read-only);
WIDTH <lime_afiare_cmp> - limiteaz numrul de caractere afiate pentru toate
cmpurile din fereastr;
109 Baze de date

IN [WINDOW] <nume_fer> - specific fereastra printe n interiorul creia va fi deschis


fereastra Browse. Dac fereastra printe este mutat, se va muta i fereastra Browse.

Comanda REPLACE realizeaz actualizarea cmpurilor dintr-o nregistrare.

REPLACE <nume_cmp_1> WITH <expr_1> [ADDITIVE] [,<nume_cmp_2> WITH <expr_2>


[ADDITIVE]] ... [Scope] [FOR <expr_L_1>] [WHILE <expr_L_2>] [IN nr_zon_de_lucru |
alias_tabel]
unde:
<nume_cmp_1> WITH <expr_1> [,<nume_cmp_2> WITH <expr_2>] precizeaz c
datele din nume_cmp_1 vor fi nlocuite cu valorile expresiei expr_1, datele din
nume_cmp_2 cu valorile expresiei expr_2 etc.
[ADDITIVE] pentru cmpurile de tip memo, adaug valoarea expresiei la sfritul
cmpului memo (n continuare). Dac clauza lipsete, atunci cmpul memo va fi rescris cu
valoarea dat de expresie;
Scope specific domeniul nregistrrilor care vor fi nlocuite (NEXT n, ALL, REST,
RECORD n);
FOR <expr_L_1> - specific faptul c vor fi nlocuite cmpurile desemnate, doar din
nregistrrile pentru care evaluarea expresiei logice expr_L_1 are valoarea .T. (adevrat);
WHILE <expr_L_2> - precizeaz condiia pentru care atta vreme ct expresia logic are
valoarea .T., cmpurile desemnate vor fi modificate;
IN nr_zon_de_lucru | alias_tabel specific zona de lucru sau alias-ul tabelei, n care
nregistrrile vor fi actualizate.

Exemplu. n fiierul ESTUD2, s se modifice a treia nregistrare, cmpul ADRESA, cu o nou


valoare Cluj.

USE ESTUD2
REPLACE ADRESA WITH "Cluj" FOR RECNO()=3
BROWSE
CLOSE DATABASE
8. Accesul i actualizarea datelor 110

Comanda SET SAFETY ON | OFF determin afiarea de ctre sistemul VFP a unei casete de
dialog nainte de a suprascrie un fiier.

SET SAFETY ON | OFF

Clauza ON este implicit i determin afiarea unei casete de dialog, pentru confirmarea de
ctre utilizator a suprascrierii fiierului.
Clauza OFF mpiedic afiarea casetei de confirmare a suprascrierii.

8.4.3. tergerea nregistrrilor

tergerea nregistrrilor se poate face la nivel logic sau fizic.

Comanda DELETE realizeaz tergerea la nivel logic. nregistrrile continu s existe n fiier
dar sunt marcate ca fiind terse.

DELETE [Scope] [FOR <expr_L_1>] [WHILE <expr_L_2>] [IN <nr_zon_de_lucru> |


<alias_tabel>]
unde:
Scope specific domeniul n care se face marcarea pentru tergere a nregistrrilor;
FOR <expr_L_1> - specific condiia pentru care vor fi marcate pentru tergere acele
nregistrri pentru care expr_L_1 este adevrat;
WHILE <expr_L_2> - vor fi marcate pentru tergere nregistrri, atta vreme ct condiia
expr_L_2 este adevrat.

Funcia DELETED() returneaz o valoare logic care indic dac nregistrarea curent a fost
marcat pentru tergere.
DELETED ([nr_zon_de_lucru | alias_tabel])

Comanda RECALL deselecteaz nregistrrile marcate pentru tergere.

RECALL [Scope] [FOR <expr_L_1>] [WHILE <expr_L_2>]


unde:
Scope precizeaz domeniul n care se aplic deselectarea;
111 Baze de date

FOR <expr_L_1> - doar nregistrrile pentru care expr_L_1 este adevrat (.T.) vor fi
deselectate;
WHILE <expr_L_2> - atta vreme ct expr_L_2 este adevrat, nregistrrile vor fi
deselectate.

Comanda PACK face parte din comenzile de tergere la nivel fizic; va terge toate nregistrrile
marcate pentru tergere din tabela curent.

PACK [MEMO] [DBF]


unde:
MEMO permite tergerea fiierului MEMO ataat tabelei curente, dar nu i nregistrrile
marcate pentru tergere (fiierul MEMO are acelai nume cu tabela, dar extensia este .FPT);
DBF se vor terge nregistrrile marcate pentru tergere din tabela curent, dar nu
afecteaz fiierul MEMO.

Comanda ZAP terge fizic toate nregistrrile din tabel, rmnnd doar structura tabelei. Este
echivalent cu comanda DELETE ALL, urmat de comanda PACK, dar este mult mai rapid.

ZAP [nr_zon_de_lucru | alias_tabel]

Comanda DELETE FILE terge un fiier de pe disc.

DELETE FILE [<nume_fiier>] [RECYCLE]


unde:
nume_fiier specific numele fiierului i extensia. Numele fiierului poate conine i
caracterul asterisc: DELETE FILE *.BAK va avea ca rezultat tergerea tuturor fiierelor cu
extensia .BAK de pe disc. Comanda se execut pentru fiierele care nu sunt deschise
(active);
RECYCLE fiierul nu va fi ters imediat de pe disc ci mutat n directorul RECYCLE BIN
din sistemul WINDOWS 9x. Se mai poate folosi i comanda ERASE care are aceleai
clauze.
8. Accesul i actualizarea datelor 112

Comanda SET DELETED specific dac sistemul VFP va procesa (terge) nregistrrile
marcate pentru tergere sau dac acestea sunt disponibile pentru a fi utilizate n alte comenzi.

SET DELETED ON | OFF


Semnificaia clauzelor:
Clauza OFF este implicit. nregistrrile marcate pentru tergere pot fi accesate de alte
comenzi care opereaz cu nregistrri;
Clauza ON are ca efect ignorarea nregistrrilor marcate pentru tergere, de comenzile care
opereaz cu nregistrri.

Comanda COPY TO creaz un nou fiier cu acelai coninut ca i cel al tabelei curente.

COPY TO <nume_fiier> [FIELDS <list_cmpuri> | FIELDS LIKE <ablon> | FIELDS EXCEPT


<ablon>][Scope] [FOR <exprL_1>] [WHILE <exprL_2>] [[WITH] CDX] | [[WITH]
PRODUCTION]
unde:
nume_fiier specific numele noului fiier care se creaz cu comanda COPY TO;
FIELDS <list_cmpuri> - specific n list cmpurile ce vor fi copiate n noul fiier. Dac
clauza se omite, atunci toate cmpurile din tabela activ vor fi copiate. Prin declararea
clauzei FIELDS se realizeaz operaia de proiecie (se selecteaz numai anumite cmpuri -
coloane - din tabel);
FIELDS LIKE <ablon> - specific cmpurile din tabela surs care se potrivesc unui ablon
i vor fi copiate n noul fiier. Se poate folosi i caracterul asterisc (de exemplu comanda
COPY TO TABELA1 FIELDS LIKE P*, A* va avea ca efect copierea n noul fiier a
tuturor cmpurilor care ncep cu litera P i A);
FIELDS EXCEPT <ablon> - vor fi copiate toate cmpurile, mai puin cele care se
ncadreaz n ablonul specificat;
Scope specific domeniul din care vor fi selectate nregistrrile care vor fi copiate.
FOR <exprL_1> - vor fi copiate doar acele nregistrri pentru care evaluarea expresiei logice
exprL_1 are valoarea adevrat (.T.)
WHILE <exprL_2> - specific condiia pentru care atta vreme ct expresia logic exprL_2
este adevrat, nregistrrile vor fi copiate n noul fiier.
113 Baze de date

Not Dac se utilizeaz clauzele [Scope], FOR sau WHILE, fr clauza FIELDS, se va
implementa operatorul relaional de selecie (se aleg doar o parte din nregistrri, cu toate
cmpurile). Dac se folosete clauza FIELDS n combinaie cu clauzele [Scope], FOR sau
WHILE, va rezulta o operaie compus: proiecie i selecie.

[WITH] CDX] | [[WITH PRODUCTION] la copiere se va crea i un fiier de index


structural pentru noua tabel, care este identic cu cel al tabelei surs. Etichetele de index
(TAG-urile) vor fi copiate n noul fiier de index structural. Cele dou clauze sunt identice.
Clauzele nu se folosesc dac se creaz un fiier care nu este tabel VFP (extensia .DBF).

Comanda SET ALTERNATE direcioneaz la ecran sau la imprimant, ieirea rezultat din
folosirea comenzilor DISPLAY sau LIST.

SET ALTERNATE ON | OFF


sau
SET ALTERNATE TO [<nume_fiier> [ADDITIVE]]
unde:
ON direcioneaz ieirea ctre un fiier de tip text;
OFF clauza implicit, dezactiveaz ieirea ctre un fiier de tip text;
TO nume_fiier creaz un fiier de tip text, cu extensia implicit .TXT ;
ADDITIVE clauz prin care ieirea este adugat la sfritul fiierului specificat cu
nume_fiier. Dac se omite clauza, coninutul fiierului de ieire este suprascris.

Comanda CLOSE ALTERNATE nchide un fiier deschis cu comanda SET ALTERNATE.


Sintaxa comenzii este
CLOSE ALTERNATE

8.4.5. Relaii ntre tabele

Comanda SET RELATION TO stabilete o legtur ntre dou tabele deschise.

SET RELATION TO [<expresie1> INTO <nr_zon_de_lucru> | <alias_tabel> [, <expresie2>


INTO <nr_zon_de_lucru> | <alias_tabel>...] [IN <nr_zon_de_lucru> | <alias_tabel>]
[ADDITIVE]]
8. Accesul i actualizarea datelor 114

unde:
expresie1 specific expresia relaional care stabilete legtura ntre tabela-printe i
tabela-fiu. Expresia relaional este de obicei cmpul indexat din tabela-fiu. Indexul pentru
tabela-fiu poate proveni dintr-un fiier simplu de index (.IDX) sau un fiier de index compus
(.CDX);
INTO nr_zon_de_lucru | alias_tabel specific numrul zonei de lucru sau alias-ul
tabelei-fiu;
IN nr_zon_de_lucru | alias_tabel specific zona de lucru sau alias-ul tabelei-printe;
ADDITIVE clauza pstreaz toate celelalte relaii stabilite anterior n zona de lucru
specificat.
Pentru a stabili o relaie ntre dou tabele trebuie ndeplinite urmtoarele condiii:
cele dou tabele ntre care se stabilete relaia tata-fiu trebuie s fie indexate dup aceeai
cheie (cmp), care face legtura ntre ele;
cele dou tabele trebuie deschise n zone de lucru diferite.

Exemplul 1.
Tabelele legate printr-o relaie au n general un cmp comun. De exemplu presupunem c avem
o tabel STUDENT, care conine informaii despre studeni i are cmpuri pentru nume, adres, i
un cod unic al studentului (matr). O a doua tabel, NOTE, conine informaii despre notele
studentului (matr, cod_disc, nota), care va avea de asemenea un cmp pentru codul unic al
studentului (matr). Se pot uni astfel informaiile despre studeni cu cele despre note. Comanda SET
RELATION leag cele dou tabele prin cmpul comun matr. Pentru a stabili relaia, tabela-fiu
(NOTE) trebuie s fie indexat dup cmpul comun. Dup stabilirea relaiei, de cte ori mutm
pointer-ul pe o nregistrare n fiierul STUDENT, pointer-ul din fiierul NOTE (fiu) se va muta pe
nregistrarea care are acelai cod matr corespunztor n fiierul STUDENT.

Fiier discipline.dbf Fiier student.dbf Fiier note.dbf


Cod_disc N(3) Matr N(5) Matr N(5)
Denumire C(60) Nume C(50) Cod_disc N(3)
Exam L Adresa m Nota N(2)
Coloc L An_stud C(2)
Tip_curs C(1) Grupa N(2)
Media N(5,2)
115 Baze de date

Integr L

Programul pentru calculul mediilor generale


PUBLIC MEDG, INTEGRAL
SELECT 2
USE STUDENT
SELECT 3
USE NOTE
FOR I=1 TO RECCOUNT(2)
GOTO I
MATRICOLA=MATR
INTEGRAL=.T.
MEDG=0
K=0
SELECT 3
LOCATE FOR MATR=MATRICOLA
DO WHILE FOUND(3)
K=K+1
MEDG=MEDG+NOTA
IF NOTA<5 THEN
INTEGRAL=.F.
ENDIF
CONTINUE
ENDDO
MEDG=MEDG/K
SELECT 2
REPLACE MEDIA WITH MEDG, INTEGR WITH INTEGRAL
ENDFOR
SELECT 2
SORT TO TEMP1 ON NUME/A
CLOSE DATABASE
DELETE FILE 'STUDENT.DBF'
RENAME 'TEMP1.DBF' TO 'STUDENT.DBF'
SELECT 2
8. Accesul i actualizarea datelor 116

USE STUDENT
REPORT FORM MEDIIG PREVIEW
CLOSE DATABASES

Programul pentru stabilirea relaiilor


SELECT 2
USE STUDENT
SELECT 3
USE DISCIPLINE
SELECT 4
USE NOTE
SELECT 2
INDEX ON MATR TAG MATR ADDITIVE
&& se indexeaz dup cmpul matr
SELECT 3
INDEX ON COD_DISC TAG COD_DISC
&& se indexeaz dup cmpul cod_disc
SELECT 4
SET ORDER TO TAG MATR OF STUDENT.CDX IN STUDENT
&& se stabilete indexul principal
SET RELATION TO MATR INTO STUDENT ADDITIVE
&& SE stabilete relaia ntre student i note
SET ORDER TO TAG COD_DISC OF DISCIPLINE.CDX IN DISCIPLINE
&& se stabilete indexul principal
117 Baze de date

SET RELATION TO COD_DISC INTO DISCIPLINE ADDITIVE


&& se stabilete relaia ntre discipline, note
REPORT FORM REPORT1 PREVIEW
SET RELATION OFF INTO STUDENT
SET RELATION OFF INTO DISCIPLINE
CLOSE DATABASE

Pentru crearea raportului REPORT1.FRX se deschid tabelele: STUDENT, NOTE,


DISCIPLINE, se acceseaz meniul File/New opiunea Report.
Pagina de raport este structurat n trei seciuni: Page Header (antet), Detail (coninut), Page
Footer (subsol pagin). Datele pot fi grupate dup una sau mai multe variabile, introducndu-se n
GroupHeader; Detail sau Group Footer (Figura 1).
In raport se includ urmtoarele cmpuri de date (Figura 1):
- recno() numrul nregistrrii din tabel,
- student.nume,
- student.media,
- note.nota,
- discipline.denumire.
Raportul poate conine i elemente grafice: linii / chenare utilizate pentru construcia de tabele
sau imagini.

Fig. 1

Exemplul 2.
Presupunem c avem o tabel CLIENI, care conine informaii despre clieni, cmpuri pentru
nume, adres, i un cod unic al clientului (cod_client). O a doua tabel, FACTURI, conine
8. Accesul i actualizarea datelor 118

informaii despre facturi (numr, cantitate, produse etc.), care va avea de asemenea un cmp pentru
codul clientului. Se pot uni astfel informaiile despre clieni cu cele despre facturi. Comanda SET
RELATION leag cele dou tabele prin cmpul comun cod_client. Pentru a stabili relaia, tabela-fiu
(FACTURI) trebuie s fie indexat dup cmpul comun. Dup stabilirea relaiei, de cte ori se mut
pointer-ul n fiierul CLIENI pe o nregistrare, pointer-ul din fiierul FACTURI (fiu) se va muta
pe nregistrarea care are acelai cod_client n fiierul CLIENI.

SELECT 2
USE CLIENTI
SELECT 3
USE FACTURI
INDEX ON COD_CLIENT TAG COD_CLIENT ADDITIVE
&& se indexeaz cmpul cod_client
SELECT 2
SET ORDER TO TAG COD_CLIENT OF FACTURI.CDX IN FACTURI
&& se stabilete indexul principal
SET RELATION TO COD_CLIENT INTO FACTURI ADDITIVE
&& se stabileste relatia intre clieni, facturi

Comanda RENAME redenumete un fiier.

RENAME <nume_fiier_vechi> TO <nume_fiier_nou>


unde:
nume_fiier_vechi TO nume_fiier_nou2 specific numele fiierului surs i noul nume. Se
va include extensia pentru fiecare fiier, dac nu, implicit se va atribui extensia .DBF.
Comanda RENAME nu se folosete pentru o tabel care aparine unei baze de date. Pentru a
schimba numele unei tabele dintr-o baz de date se folosete comanda RENAME TABLE.
Numele fiierului surs i cel al fiierului nou creat poate cuprinde i caracterul asterisc
(RENAME *.PRG TO *.BAK).

Comanda DISPLAY FILES


Afieaz informaii despre un fiier.
DYSPLAY FILES [ON <drive>] [LIKE <ablon>] [TO PRINTER [PROMPT]] | TO FILE
<nume_fiier>]
119 Baze de date

Unde:
ON <drive> - specific calea ctre fiiere;
LIKE <ablon> - specific condiia pentru care vor fi afiate informaii, doar despre acele
fiiere care se ncadreaz n ablon;
TO PRINTER [PROMPT] | TO FILE <nume_fiier> - direcioneaz informaiile la
imprimant (cu afiarea unei casete de dialog, clauza PROMPT) sau ntr-un fiier.

Informaii identice se pot obine i cu comanda DIR care are aceleai clauze.
9. Programarea procedural 120

9. Programarea procedural

Mediul VFP ofer pe lng modul de lucru n fereastra de comand (stil interpretor de comenzi)
i posibilitatea de a dezvolta programe surs n limbajul propriu sistemului (stil compilator), prin
comenzi i funcii care descriu datele i pot efectua prelucrrile necesare dezvoltrii aplicaiei.
Programul surs folosete att tehnica de programare procedural (structurat, modular) ct i
cea de programare pe obiecte. ntr-un program surs pot fi utilizate de asemenea i comenzile din
nucleul SQL, care permit o programare descriptiv i de manipulare a datelor la nivel de tabel.

9.1. Programarea structurat

Maniera de programare care folosete numai cele trei structuri de baz: structura liniar,
structura alternativ i structura repetitiv, este cunoscut sub numele de programare structurat. Se
poate demonstra ca orice program poate fi realizat utiliznd numai cele trei structuri de baz
Limbajul VFP are comenzi specifice pentru implementarea celor trei structuri de program
fundamentale: secvenial, alternativ (IF i CASE) i repetitiv (WHILE, FOR i SCAN), dar nu
are comenzi pentru salt necondiionat.
Tehnica programrii modulare se utilizeaz la rezolvarea unor probleme complexe i implic
descompunerea problemei n pri componente (module), conform unei metode (top-down, bottom-
up) i analiza lor, care stabilete:
caracteristicile principale ale fiecrui modul;
legturile dintre module;
alegerea unui modul principal (program, meniu sau videoformat);
ierarhizarea modulelor fa de ansamblu.
Aceste subprobleme sunt apoi programate utiliznd tehnica programrii structurate.
Limbajul VFP ofer facilitatea de creare a unui proiect (12.2. Figura 1), n care aceste module
pot fi declarate n una din categoriile implementate:
Data se pot declara baze de date (Databases), tabele libere (Free Tables), interogri
(Query);
Class Libraries librrii de clase;
Documents - se pot declara videoformate (Forms), rapoarte (Reports), etichete (Labels);
Code programe (Programs), aplicaii (Applications);
Other alte componente: meniuri (Menus), fiiere de tip text (Text Files);
Other Files alte fiiere utilizate: icon-uri, fiiere .BMP etc.
121 Baze de date

Toate aceste componente sunt nglobate n proiect, care constituie baza pentru crearea aplicaiei
n format executabil.

9.1.1. Structura liniar

O structur liniar este constituit dintr-o succesiune de comenzi, dintre cele admise i n modul
de lucru interpretor (n fereastra de comenzi). O astfel de structur este o secven de comenzi care
nu conine structuri alternative sau repetitive, ci doar comenzi, funcii i atribuiri de valori unor
variabile.

Comenzi de afiare/citire la monitor


Comanda utilizat pentru afiarea la monitor, a unei variabile/constante de tip caracter sau
numeric este:
@<linie>,<coloana> SAY <expr> [PICTURE <exp_c1>] | [FUNCTION <exp_c2>] [FONT
<exp_c3>[,<exp_n>]] [STYLE <exp_c4>]
unde:
@<linie>,<coloana> - caracterul @ fixeaz coordonatele de afiare, date sub form de linie
i coloan.
SAY <expr> - comanda de afiare pe ecran, la coordonatele fixate, a unei expresii sau a unei
funcii.
PICTURE <expr_c1> - formatul de afiare (se utilizez codurile din tabel indicndu-se
formatul ntre apostrof: 9999.99, pentru date de tip numeric).
FUNCTION<exp_c2> - ofer o alternativ la stabilirea formatului.

exp_c2 Semnificaie

A Caractere alfabetice

L Date de tip logic (.T., .F., .Y., .N.)

N Litere i cifre

X Orice caractere

9 Cu date de tip caracter permite numai numere. Cu date de tip


numeric permite numere i semne algebrice
9. Programarea procedural 122

# Permite cifre, semne algebrice i spaii

$ Afieaz semnul curent al monedei (definit cu SET CURRENCY)

FONT <exp_c3>[,<exp_n>] specific numele tipului de liter (font) utilizat i mrimea


acesteia.
[STYLE <exp_c4> - definirea stilului de afiare (B bold, I italic, N normal, U -
subliniat).

Exemplu. Urmtoarea secven de comenzi:


@1,1 SAY 'TEST' FUNCTION 'A' FONT 'ARIAL',14 STYLE 'BIU'
S=10
@3,1 SAY S PICTURE '99.99'
WAIT WINDOW && afiarea unei ferestre de continuare
CLEAR

are ca efect afiarea n spaiul de lucru, n linia 1, coloana 1, a cuvntului TEST (ngroat, nclinat,
subliniat), iar n linia 3, coloana 1, valoarea variabilei S cu formatul ales.
Se pot afia n spaiul de lucru sau tipri obiecte de tip BMP (imagini) cu comanda

@<linie>,<coloana> SAY <fiier_imag>BITMAP|<cmp_GEN> [STYLE <exprC>] [CENTER]


[ISOMETRIC] | [STRETCH] [SIZE <expN1>,<expN2>]
unde:
<fiier_imag>BITMAP|<cmp_GEN> - clauza care face referire la fiierul de tip BMP
(Bitmap Picture) sau imaginea coninut ntr-un cmp general dintr-un fiier. <fiier_imag>
este o expresie de tip caracter, delimitat de apostrof sau ghilimele;
STYLE <exprC> asigneaz atributul de opac Q sau transparent T, pentru obiectele
inserate;
CENTER clauza pentru plasarea obiectului BMP n centrul unei arii determinate prin
clauza SIZE sau delimitate de coordonatele linie, coloan;
ISOMETRIC | STRETCH clauze pentru cazul n care zona de afiare a obiectului BMP
este mai mic dect dimensiunea real a acestuia. ISOMETRIC redimensioneaz obiectul la
dimensiunea ariei, cu pstrarea proporiilor. STRECH creaz un raport separat pentru fiecare
coordonat Ox, Oy, cu care obiectul se poate distorsiona pe vertical sau orizontal.
123 Baze de date

SIZE <expN1>,<expN2>] stabilete coordonatele colului din dreapta jos al zonei de


afiare.

Exemplu.
@1,1 SAY "1.JPG" BITMAP CENTER ISOMETRIC
WAIT WINDOW
CLEAR

Comanda
@<linie>,<coloana> GET <var> [PICTURE <expr_c>]

permite editarea variabilei de memorie var (pentru a introduce o nou valoare), unde:
PICTURE <expr_c> - reprezint formatul de editare.
Se poate combina operaia de afiare cu cea de editare a unei variabile, caz n care vom utiliza
comanda:
@<linie>,<coloana> SAY <mesaj> GET <var>

ntotdeauna o comand (sau mai multe comenzi) @...GET va fi nsoit de o comand READ.
Practic se poate construi o machet cu cmpuri de afiare @SAY i cmpuri de citire @GET,
cursorul se deplaseaz de la o linie la alta apasnd tasta [ENTER] sau [TAB] i napoi cu [SHIFT]
+ [TAB] (permite reactualizarea unor cmpuri nainte de citirea efectiv). La apsarea tastei
[ENTER] la ultima linie GET se va executa comanda READ i se va citi ntreg ecranul.

Comanda READ realizeaz citirea tuturor cmpurilor editate cu comanda GET.

READ [CYCLE] [MODAL] [VALID <expr_L>|<expr_N>] [WHEN <expr_L1>]


unde:
CYCLE clauz care mpiedic ncheierea citirii variabilelor editate, atunci cnd cursorul
depete primul sau ultimul obiect creat cu GET. Dac utilizatorul se plaseaz pe ultimul
obiect GET i apas [ENTER] sau [TAB], cursorul se va deplasa pe primul obiect GET.
Pentru a ncheia o comand READ ciclic, se apas tasta [Esc] sau tastele [CTRL] + [W] ;
MODAL este clauza care previne activarea ferestrelor care nu sunt implicate n execuia
comenzii READ;
9. Programarea procedural 124

VALID expr_L | expr_N clauz care valideaz valorile introduse n cmpul GET, la
terminarea comenzii READ. Dac expresia logic returneaz valoarea adevrat (.T.)
comanda READ se ncheie;
WHEN expr_L1 clauza condiioneaz execuia comenzii READ de evaluarea expresiei
logice. Dac expresia returneaz valoarea fals comanda READ este ignorat.

9.1.2. Structura alternativ

Structura alternativ este implementat n cele dou forme:


cu dou ramuri (comenzile IF, IIF);
cu mai multe ramuri (comanda DO CASE).

Comanda IFENDIF execut condiionat un set de comenzi, n funcie de valoarea logic


returnat de o expresie evaluat. Expresia evaluat nu furnizeaz dect dou alternative (ramuri)
corespunztoare valorilor adevrat (THEN) sau fals (ELSE).

IF <exprL> [THEN] <comenzi> [ELSE <comenzi>] ENDIF


unde:
exprL specific expresia logic ce este evaluat. Dac cele dou clauze THEN i ELSE
sunt prezente i expresia este adevrat vor fi executate comenzile de pe ramura THEN,
dac expresia este fals, vor fi executate comenzile de pe ramura ELSE;
Dac expresia logic este fals i ramura ELSE nu este inclus, va fi executat prima
comand care urmeaz clauzei ENDIF;
Clauza ENDIF trebuie inclus la orice declarare a unui IF. O comand IF poate include mai
multe blocuri IFENDIF pe ramurile sale (imbricare), cu condiia ca nchiderea lor (cu
ENDIF) s se fac n aceai ordine ca i deschiderea (nu se admite intersecia blocurilor).

Exemplu. n fiierul PRODUSE, s se caute un anumit produs; dac este gsit s se afieze
cmpurile PRODUS, CANT, PU, dac nu, s se afieze un mesaj.

CLEAR
USE PRODUSE
GET EXPR 'INTRODUCETI CONDITIA DE LOCALIZARE' TO
GTEMP;
125 Baze de date

TYPE 'L' DEFAULT 'PRODUS = ""'


LOCATE FOR &gctemp
&& caut produsul cu comanda LOCATE

IF FOUND( )
&& dac este gsit
DISPLAY FIELDS PRODUS,CANT,PU&& afieaz cmpurile PRODUS, CANT, PU
ELSE
&& dac nu
? 'CONDITIA ' + GTEMP + ' NU A FOST GASITA '
&& afieaz mesajul
ENDIF
CLOSE TABLE

Funcia IIF returneaz pe baza evalurii unei expresii logice, una din cele dou valori ale unei
expresii de tip numeric, caracter, moned, dat calendaristic sau timp.

IIF(expr_L, expr_1, expr_2)

unde: expr_L specific expresia logic pe care funcia o evalueaz.


Dac expresia logic este adevrat, va returnat valoarea expresiei expr_1.
Dac expresia logic este fals va fi returnat valoarea dat de expr_2.
Aceast funcie este cunoscut i sub numele de IF scurt (imediat). Este folosit mai ales la
expresiile care condiioneaz afiarea coninutului unui cmp, n rapoarte sau etichete. Execuia sa
este mai rapid dect echivalentul su IFENDIF.

Comanda DO CASEENDCASE
Execut primul set de comenzi ale cror expresie condiional este adevrat. Comanda este
echivalentul unor instruciuni IF n cascad.
DO CASE
CASE <expr_L_1>
<comenzi1>
CASE <expr_L_2>
<comenzi2>
9. Programarea procedural 126

....
CASE <expr_L_n>
<comenzi_n>
[OTHERWISE
<comenzi>]
ENDCASE

Aciunea comenzii:
CASE <expr_L_1> <comenzi1>... - cnd prima expresie logic CASE ntlnit, are
valoarea adevrat, blocul de comenzi va fi executat pn la apariia unei noi comenzi CASE
sau a clauzei ENDCASE. Execuia programului continu cu prima instruciune executabil
care urmeaz lui ENDCASE;
Dac expresia din prima clauza CASE este fals, blocul de comenzi aferent este ignorat i se
trece la evaluarea expresiei logice a urmtoarei clauze CASE;
Dup gsirea primei expresii logice adevrat, orice alt clauz CASE pentru care expresia
logic este adevrat, va fi ignorat;
OTHERWISE <comenzi> - dac toate expresiile logice CASE au returnat valoarea fals,
clauza ofer o alternativ pentru introducerea unui bloc de comenzi.

Exemplu
@1,1 SAY DATI N= GET N
READ
DO CASE
CASE N = 0
? 'ZERO'
CASE N > 0
? 'POZITIV'
OTHERWISE
? 'NEGATIV'
ENDCASE
WAIT WINDOW Apasati Enter

9.1.3. Structura repetitiv


127 Baze de date

Pentru descrierea structurilor repetitive limbajul pune la dispoziie urmtoarele tipuri de


comenzi:
ciclul de repetiie cu numr finit de pai - comanda FOR...ENDFOR;
ciclu cu numr nedefinit de pai, condiionat anterior - comanda DO WHILE...ENDDO;
o comand de parcurgere a nregistrrilor unei tabele de la nceput la sfritul fiierului
comanda SCAN...ENDSCAN.

Comanda FOR...ENDFOR execut un bloc de comenzi de un numr de ori precizat.

FOR <var>=<val_iniial> TO <val_final> [STEP <val_increment>] <comenzi> [EXIT]


[LOOP] ENDFOR | NEXT
unde:
var specific o variabil sau un element de masiv, de tip ntreg, care acioneaz ca un
contor (variabil de ciclare);
val_iniial, val_final valoarea iniial, respectiv final a contorului;
STEP <val_increment> - domeniul dat de valoarea iniial / final poate fi parcurs cu
incrementul 1 (implicit) sau cu un pas (increment) precizat prin val_increment. Dac
val_increment este negativ contorul este decrementat;
comenzi specific blocul de comenzi care vor fi executate n interiorul ciclului.
EXIT permite ieirea forat din ciclu (nainte de atingerea valorii finale a variabilei de
ciclare). n program va fi executat prima comand care urmeaz clauzei ENDFOR;
LOOP returneaz controlul comenzii FOR, fr a se mai executa comenzile dintre LOOP
i ENDFOR. Contorul este incrementat sau decrementat ca i cum s-ar ajunge la clauza
ENDFOR.

Exemplu. Din fiierul CLIENTI, se vor afia la monitor, din primele 10 nregistrri, din doi n doi,
clienii.
USE CLIENTI
STORE 2 TO VI,K && valoarea iniial i pasul contorului
STORE 10 TO VF && valoarea final a contorului
FOR I=VI TO VF STEP K && I variabila contor
GOTO I && poziionare pe nregistrarea I
DISPLAY FIRMA && se afieaz numele firmei de pe poziia I din fiierul CLIENI
9. Programarea procedural 128

ENDFOR && sfritul ciclului FOR


CLOSE TABLE

Comanda DO WHILE ... ENDDO execut un bloc de comenzi n interiorul unui ciclu
condiionat anterior.
DO WHILE <expr_L> <comenzi> [LOOP] [EXIT] ENDDO
unde:
expr_L specific o expresie logic a crei valoare de adevr determin dac blocul de
comenzi cuprins ntre DO WHILE i ENDDO va fi executat. Atta vreme ct condiia logic
este adevrat, comenzile vor fi executate;
LOOP returneaz controlul comenzii DO WHILE. Comenzile ntre LOOP i ENDDO nu
vor fi executate;
EXIT transfer controlul, din interiorul ciclului DO WHILE, ctre prima comand care
urmeaz clauzei ENDDO. Clauza este echivalent cu o ieire forat din ciclu;
Fiecare comand DO WHILE trebuie s aib un corespondent (s se nchid) ENDDO.

Exemplu. Din fiierul PRODUSE s se afieze totalul produselor n stoc, care au preul mai mare de
30$.

CLEAR
USE PRODUSE
STOC=0
DO WHILE !EOF()
IF PU<30
SKIP
ENDIF
STOC=STOC+CANT
? PRODUS,CANT
SKIP
ENDDO
CLOSE TABLES
?STOC
129 Baze de date

Comanda SCAN...ENDSCAN realizeaz mutarea pointer-ului prin toate nregistrrile din


tabela curent i execut un bloc de comenzi pentru nregistrrile care corespund condiiilor
specificate.
SCAN [Scope] [FOR <expr_L_1>] [WHILE <expr_L_2>] [comenzi] [LOOP] [EXIT]
[ENDSCAN]
unde:
Scope specific domeniul nregistrrilor care vor fi scanate (clauze: ALL, NEXT n,
RECORD n, REST). Clauza implicit este ALL;
FOR expr_L_1 execut comenzile doar pentru nregistrrile pentru care expresia logic
expr_L_1 este adevrat. Includerea clauzei permite filtrarea nregistrrilor, eliminnd pe
cele pe care nu trebuie s fie scanate;
WHILE expr_L_2 specific o condiie pentru care blocul de comenzi va fi executat atta
vreme ct valoarea expresiei logice expr_L_2 este adevrat;
LOOP returneaz controlul napoi la comanda SCAN (se reia execuia comenzii);
EXIT transfer programului controlul din interiorul buclei SCAN...ENDSCAN, la prima
comand care urmeaz clauzei ENDSCAN;
ENDSCAN indic sfritul procedurii de scanare.

Exemplu. Utiliznd comanda SCAN, s se afieze din fiierul CLIENI, numele firmei, oraul i
persoana de contact, cu care o firm are contracte n FRANA.

USE CLIENTI
SCAN FOR UPPER(TARA)=FRANTA
? FIRMA,ORAS,CONTACT
ENDSCAN
CLOSE TABLES

9.2. Modularizarea programelor

Modularizarea programelor, n cazul unor aplicaii complexe, se poate realiza prin proceduri i
funcii definite de utilizator.
Definirea unei funcii utilizator, reprezint un bloc de comenzi independent, care primete un set
de parametrii de la programul apelant i returneaz acestuia o valoare ca rezultat al prelucrrii
parametrilor de intrare.
9. Programarea procedural 130

Definirea unei proceduri de ctre utilizator, este de asemenea un bloc de comenzi, care
prelucreaz parametrii transmii din programul apelant. Dup prelucrare controlul este redat
programului apelant.
Din punct de vedere al locaiei, funciile se pot defini fie n programul apelant, fie ntr-o librrie
sau pot fi salvate n fiiere externe, de tip .PRG.

9.2.1. Proceduri

Asocierea procedurilor cu programul apelant se face cu comanda:

SET PROCEDURE TO [<fiier_1> [,<fiier_2>,...]] [ADDITIVE]


unde:
fiier_1, fiier_2 specific succesiunea n care vor fi deschise fiierele. Se pot declara mai
multe nume de fiiere care conin proceduri. Aceast opiune permite crearea unor librrii de
sine stttoare de funcii care pot fi specificate separat.
ADDITIVE se deschid fiierele cu proceduri din lista specificat, fr a fi nchise fiierele
cu proceduri, deja deschise.

Cu comanda RELEASE PROCEDURE [<fiier_1> [,<fiier_2>,...]] se nchid fiierele


individuale.
Variabilele definite n interiorul procedurilor i funciilor utilizator, sunt la nivel local (nu se vd
din afara procedurilor sau funciilor).

Structural o procedur, cuprinde urmtoarele elemente:

PROCEDURE nume_procedur specific numele procedurii create


PARAMETERS list_parametri declararea parametrilor formali de intrare
Bloc de comenzi bloc de comenzi, corpul procedurii
RETURN [expresie] ieirea din procedur, opional cu returnarea
unei expresii calculate.
unde:
PROCEDURE este o declaraie n interiorul unui program, care specific nceputul unei
proceduri i definete numele procedurii. Numele procedurii poate ncepe cu o liter sau
131 Baze de date

caracterul _ (underscore) i poate conine orice combinaie de litere, numere i caractere


underscore. Lungimea maxim a numelui este de 254 caractere;
PARAMETERS asigur trecerea parametrilor din programul apelant n procedur. Se pot
transmite maxim 27 de parametri n procedur. Lista parametrilor poate cuprinde: expresii,
variabile de memorie, nume de tabele, nume de cmpuri din tabele de date, constante, care
sunt transmise prin referin;
RETURN [expresie] returneaz controlul i opional o expresie, n programul apelant;
Parametrii pot fi transmii n procedur, prin includerea clauzei PARAMETERS n
procedur, sau prin plasarea unei liste de parametri imediat dup PROCEDURE
nume_procedur. Lista se inchide ntre paranteze, iar parametrii sunt separai cu virgul.

Apelul unei proceduri sau program se face cu comanda

DO <nume_procedur> | <nume_program> WITH <list_parametri>

Observaii
Metoda folosit la transmiterea parametrilor la proceduri sau funcii este implicit prin
valoare, iar la programe prin referin;
Variabilele transmise ctre procedur cu comanda DO...WITH sunt transmise prin referin.

Sistemul VFP are anumite restricii legate de utilizarea comenzii DO:


pot fi imbricate maxim 32 de apeluri DO (program principal | procedura1 | procedura2 |...);
nu se poate face apel dintr-o procedur la ea nsi (nu admite recursivitatea direct);
din interiorul unei proceduri nu poate fi apelat programul/procedura apelant (nu admite
recursivitatea indirect).

9.2.2. Funcii

Elementele unei funcii definite de utilizator (UDF) sunt:

FUNCTION nume_funcie specific numele funciei create


Bloc de comenzi bloc de comenzi, corpul funciei
9. Programarea procedural 132

RETURN [expresie] ieirea din funcie, opional cu returnarea unei expresii


calculate.
Implicit parametrii sunt transmii n funcie prin valoare. Numrul maxim de parametri care
poate fi transmis, este 27. Parametrii pot fi transmii n funcie, prin includerea clauzei
PARAMETERS n funcie, sau prin plasarea unei liste de parametri imediat dup FUNCTION
nume_funcie. Lista se inchide ntre paranteze, parametrii sunt separai cu virgul.

Comanda
SET UDFPARAMS TO VALUE | REFERENCE

specific dac parametrii sunt transmii ctre o funcie definit de utilizator (UDF) prin valoare sau
prin referin.
Cnd o variabil este transmis prin valoare, valoarea variabilei poate fi modificat n funcia
definit de utilizator, dar valoarea original a variabilei n programul apelant nu se modific.
Cnd o variabil este transmis prin referin i funcia definit de utilizator modific valoarea
variabilei transmise, valoarea original a variabilei n programul apelant de asemenea se modific.
Implicit parametrii sunt transmii prin valoare. Se poate fora transmiterea parametrilor ctre o
funcie utilizator, n funcie de opiunea aleas n comanda SET UDFPARAMS. Variabilele se
nchid ntre paranteze pentru a fora transmiterea prin valoare. Forarea transmiterii unui parametru
prin referin se face punnd n faa parametrului caracterul @.

Exemplul 1.
*** Transmiterea Variabilelor Prin Valoare ***
CLEAR
SET TALK OFF
WAIT 'APASATI O TASTA PENTRU A TRANSMITE VARIABILA PRIN VALOARE
WINDOW
SET UDFPARMS TO VALUE
STORE 1 TO GNX
*** Valoarea Lui Gnx Este Neschimbata ***
@ 2,2 SAY 'VALOARE UDF: ' + STR(PLUSUNU(GNX))
@ 4,2 SAY 'VALOARE GNX: ' + STR(GNX)
*** TRANSMITEREA VARIABILEI PRIN REFERINTA***
133 Baze de date

WAIT ' APASATI O TASTA PENTRU A TRANSMITE VARIABILA PRIN REFERINTA'


WINDOW
CLEAR
SET UDFPARMS TO REFERENCE
STORE 1 TO GNX
*** Valoarea Lui Gnx Se Schimba ***
@ 2,2 SAY 'VALOARE UDF: ' + STR(PLUSUNU(GNX))
@ 4,2 SAY 'VALUE OF GNX: ' + STR(GNX)
SET UDFPARMS TO VALUE

*** Functie Utilizator (Udf) Care Aduna Unu La Un Numar ***


FUNCTION PLUSUNU
PARAMETER GNZ
GNZ = GNZ + 1
RETURN GNZ

Urmtorul exemplu arat cum sunt transmise variabilele prin valoare i prin referin, utiliznd
parantezele i caracterul @.

Exemplul 2.
*** Transmiterea Variabilei Prin Valoare ***
CLEAR
SET TALK OFF
WAIT ' APASATI O TASTA PENTRU A TRANSMITE VARIABILA PRIN VALOARE '
WINDOW
STORE 1 TO GNX
@ 2,2 SAY 'VALOARE UDF: ' + STR(PLUSUNU((GNX)))
@ 4,2 SAY 'VALOAREA GNX: ' + STR(GNX)
*** Transmiterea Variabilei Prin Referinta ***
WAIT ' APASATI O TASTA PENTRU A TRANSMITE VARIABILA PRIN REFERINTA '
WINDOW
CLEAR
STORE 1 TO GNX
@ 2,2 SAY 'VALOARE UDF: ' + STR(PLUSUNU(@GNX))
9. Programarea procedural 134

@ 4,2 SAY 'VALOARE GNX: ' + STR(GNX)

FUNCTION PLUSUNU(GNZ)
GNZ = GNZ + 1
RETURN GNZ
135 Baze de date

10. Comenzi ale nucleului SQL

Sistemul VFP suport comenzile SQL care opereaz la nivel de tabel (relaie) i o singur
comand SQL poate fi folosit pentru a nlocui o ntreag secven de comenzi.
Sistemul VFP poate executa urmtoarele comenzi SQL:

1. Comanda SELECT SQL


Comanda specific criteriile pe baza crora se bazeaz i lanseaz interogarea (Query). Sistemul
VFP interpreteaz interogarea i extrage datele cerute din tabel (tabele). Comanda SELECT pentru
interogare poate fi lansat din urmtoarele zone:
n fereastra de comenzi (modul de lucru interpretor);
din interiorul unui program VFP;
utiliznd asistentul de proiectare pentru interogare (Query Designer).

Sintaxa comenzii:
SELECT [ALL | DISTINCT] [TOP expr_num [PERCENT]] alias.]art_selectat [AS nume_coloan]
[[alias.]art_selectat [AS nume_coloan]] ROM [FORCE] nume_baz_de_date!]tabel [[AS]
alias_local] [INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN
nume_baz_de_date!]tabel [[AS] alias_local] [ON condiie_join [[INTO destinaie] | [TO FILE
nume_fiier [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN ]] [NOCONSOLE] [PLAIN]
[WHERE condiie_join [AND condiie_join [AND | OR condiie_filtrare [AND | OR
condiie_filtrare]] [GROUP BY coloan_grup [,coloan_grup] [HAVING condiie_filtrare]
[UNION [ALL] comand_selectare] [ORDER BY articol_ordonat [ASC | DESC]
[,articol_ordonat [ASC | DESC]]]

Semnificaia clauzelor:
SELECT precizeaz cmpurile, constantele i expresiile care vor fi afiate n urma
interogrii;
ALL implicit se vor afia toate nregistrrile din tabel care ndeplinesc condiiile de
selecie n rezultatul interogrii;
DISTINCT se exclud duplicatele din nregistrrile care ndeplinesc condiiile de selecie.
Argumentul se poate folosi o singur dat n cadrul unei clauze SELECT;
10. Comenzi ale nucleului SQL 136

TOP expr_num [PERCENT] rezultatul interogrii va conine un numr specificat de


nregistrri sau un anumit procent din nregistrri. Dac se folosete clauza TOP trebuie
inclus i clauza ORDER BY, care specific coloana din care clauza TOP, va determina
numrul de nregistrri (linii) care vor fi incluse n rezultatul interogrii. Se pot specifica
nregistrrile n domeniul 1..32767. nregistrrile care au valori identice pentru coloanele
specificate cu clauza ORDER BY sunt incluse n rezultatul interogrii. De exemplu, dac se
specific valoarea 10 pentru expr_num, rezultatul interogrii poate conine mai mult de 10
nregistrri dac exist n tabel mai mult de 10 linii care au valori identice n coloanele
specificate cu clauza ORDER BY;
alias. se folosete pentru identificarea numelui cmpurilor (coloanelor) prin calificare.
Fiecare cmp specificat cu art_selectat va genera o coloan n rezultatul interogrii. Dac
dou sau mai multe cmpuri au acelai nume, se va include alias-ul tabelei i caracterul
punct (.) n faa numelui cmpului, pentru a preveni duplicarea coloanei (calificare cu
punct);
art_selectat specific cmpul care trebuie inclus n rezultatul interogrii. Acesta poate fi:
o numele unui cmp din tabela care apare n clauza FROM;
o constant care specific o valoare, care va apare n fiecare nregistrare din rezultatul
interogrii;
o expresie care poate fi numele unei funcii utilizator;
AS nume_coloan specific numele coloanei care va apare la ieire, n rezultatul
interogrii. Aceast opiune este util atunci cnd art_selectat este o expresie sau conine un
cmp calculat i vrem s dm un nume sugestiv coloanei respective. Nu sunt admise dect
caracterele care se folosesc la stabilirea numelui cmpurilor la proiectarea tabelelor (de
exemplu nu se folosesc spaii);
FROM se declar tabelele care conin datele pe care vrem s le extragem n urma
interogrii. Dac nu este deschis nici o tabel, VFP va deschide caseta de dialog Open
pentru a specifica locaia fiierului care conine datele;
FORCE clauza prin care specific c tabele sunt unite (join) n ordinea n care ele apar n
clauza FROM;
nume_baz_de_date![tabel] specific numele unei baze de date, care nu este deschis,
care conine tabela cu date. Clauza se folosete n cazul n care tabela cu date nu face parte
din baza de date curent (deschis). Semnul ! se folosete pentru adresarea tabelei prin
calificare;
137 Baze de date

[AS] alias_local specific un nume temporar pentru tabela menionat n argumentul


tabel;
INNER JOIN rezultatul interogrii va conine numai nregistrrile din tabel care coincid
cu una sau mai multe nregistrri, din alt tabel (jonciune intern);
LEFT [OUTER] JOIN rezultatul interogrii va conine toate nregistrrile din tabel n
stnga cuvntului JOIN i nregistrrile care coincid vor fi afiate la dreapta cuvntului
JOIN. Clauza OUTER (exterior) este opional, se include pentru a sublinia faptul c se
creaz o jonciune exterioar;
RIGHT [OUTER] JOIN rezultatul interogrii va conine toate nregistrrile din tabel la
dreapta cuvntului JOIN i nregistrrile care coincid n stnga;
FULL [OUTER] JOIN rezulatul interogrii va conine att nregistrrile care coincid, ct
i cele care nu coincid, din cele dou tabele;
[nume_baz_de_date!]tabel [[AS] alias_local] specific numele tabelei (baza de date) cu
care se realizeaz jonciunea (eventual definit ca alias local);
ON condiie_join specific condiia pentru care tabelele sunt unite (fac jonciune);
INTO destinaie .- specific locul unde vor fi stocate rezultatele interogrii. Destinaia poate
fi una din urmtoarele clauze:
o ARRAY nume_tablou va stoca rezultatele ntr-o variabil de memorie de tip
matrice. Variabila nu se creaz dac rezultatul interogrii furnizeaz 0 nregistrri;
o CURSOR nume_cursor stocheaz rezultatele interogrii ntr-un cursor (fiier
temporar). Dup executarea comenzii SELECT, cursorul temporar rmne deschis
(read-only) i este activ. Dup nchiderea cursorului temporar, fiierul este ters;
o DBF | TABLE nume_tabel stocheaz rezultatele interogrii ntr-o tabel;
o TO FILE nume_fiier clauz prin care rezultatele interogrii sunt direcionate ctre
un fiier de tip ASCII (text);
o ADDITIVE adaug rezultatele interogrii la coninutul existent al fiierului de tip
text specificat la clauza TO FILE;
o TO PRINTER [PROMPT] direcioneaz ieirea ctre imprimant;
o TO SCREEN direcioneaz ieirea n fereastra principal a sistemului VFP sau n
fereastra activ definit de utilizator;
o NOCONSOLE mpiedic afiarea rezultatelor interogrii trimise ctre un fiier,
imprimant sau fereastra principal;
PLAIN mpiedic afiarea capului coloanei (numele coloanei) la ieirea din interogare;
10. Comenzi ale nucleului SQL 138

WHERE - specific includerea doar a anumitor nregistrri n rezultatele interogrii;


condiie_join [AND condiie_join] precizeaz cmpurile care leag tabele din clauza
FROM. Se include operatorul AND pentru a lega condiii multiple de unire (jonciune);
AND | OR condiie_filtrare [AND | OR condiie_filtrare] specific criteriile pe care
trebuie s le ndeplineasc nregistrrile pentru a fi incluse n rezultatul interogrii. Se pot
declara mai multe condiii de filtrare, legate prin operatorii AND i/sau OR. Se poate folosi
de asemenea i operatorul NOT pentru a inversa valoarea expresiei logice;
GROUP BY coloan_grup [,coloan_grup] grupeaz nregistrrile pe baza valorilor din
una sau mai multe coloane; coloan_grup poate fi numele unui cmp dintr-o tabela
obinuit, sau un cmp care include o funcie SQL, sau o expresie numeric care indic
locaia coloanei n tabela rezultat;
HAVING condiie_filtrare specific o condiie de filtrare pe care grupul trebuie s o
ndeplineasc pentru a putea fi inclus n rezulatele interogrii. HAVING trebuie utilizat
mpreun cu clauza GROUP BY. Clauza HAVING fr clauza GROUP BY acioneaz ca i
clauza WHERE;
UNION [ALL] comand_selectare - combin rezultatele finale ale unei clauze SELECT cu
rezultatele finale ale altei clauze SELECT. Implicit UNION verific rezultatele combinate i
elimin nregistrrile duplicat. Clauza ALL mpiedic aciunea clauzei UNION de a elimina
nregistrrile duplicat.
ORDER BY articol_ordonat ASC | DESC sorteaz rezultatele interogrii pe baza datelor
din una sau mai multe coloane. Fiecare articol_ordonat trebuie s corespund unei coloane
din rezultatele interogrii. ASC respectiv DESC specific ordinea sortrii (ascendent,
descendent).

Exemplu. Din tabelele CLIENI i COMENZI s se selecteze firma (CLIENI), data comenzii i
mijlocul de transport (COMENZI), sortate ascendent dup dat. Rezultatul se va scrie n fiierul
TRANSPORT.DBF.

OPEN DATABASES (TEST)


SELECT A.FIRMA, B.DATA_CDA, B.MIJLOC FROM CLIENTI A, COMENZI B ;
WHERE A.COD_FIRMA=B.COD_FIRMA ;
ORDER BY B.DATA_CDA ASC INTO TABLE TRANSPORT
BROWSE
CLOSE DATABASES
139 Baze de date

2. Comanda ALTER TABLE SQL modific o tabel existent.

Sintaxa comenzii :
ALTER TABLE nume_tabel_1 ADD | ALTER [COLUMN] nume_cmp1, tip_cmp
[(mrime_cmp [,precizie])] [NULL | NOT NULL] [PRIMARY KEY | UNIQUE]
[REFERENCES nume_tabel_2 [TAG nume_etichet]]

unde:
nume_tabel_1 specific numele tabelei a crei structur se modific;
ADD [COLUMN] nume_cmp1 specific numele cmpului care se adaug;
ALTER [COLUMN] nume_cmp1 specific numele unui cmp existent care se modific;
tip_cmp[(mrime_cmp[,precizie])] specific tipul cmpului, mrimea i precizia pentru
un cmp nou sau pentru modificarea unui cmp existent;
NULL | NOT NULL permite declararea unui cmp care accept sau nu valori de tip
NUL;
PRIMARY KEY creaz o o etichet primar de index. Eticheta de index are acelai nume
cu cel al cmpului;
UNIQUE creaz o etichet de index candidat, cu acelai nume cu cel al cmpului;
REFERENCES nume_tabel_2 TAG nume_etichet specific tabela printe ctre care se
stabilete o relaie persistent. TAG nume_etichet specific eticheta de index din tabela
printe pe baza creia se stabilete relaia.

3. Comanda UPDATE SQL actualizeaz nregistrrile dintr-o tabel. nregistrrile pot fi


actualizate pe baza rezultatelor unei declaraii SELECT SQL.

Sintaxa comenzii:
UPDATE [nume_BD!]nume_tabel SET nume_coloan=exprL_1 [, nume_coloan=exprL_2]
WHERE condiie_filtrare_1[AND | OR condiie_filtrare_2]]

unde:
[nume_BD!]nume_tabel specific tabela n care vor fi actualizate nregistrrile, cu noile
valori;
10. Comenzi ale nucleului SQL 140

SET nume_coloan=exprL_1[, nume_coloan=exprL_2] specific coloanele care sunt


actualizate i noile valori. Dac se omite clauza, fiecare nregistrare din coloan va fi
actualizat cu aceai valoare;
WHERE condiie_filtrare_1[AND | OR condiie_filtrare_2]] specific nregistrrile
care vor fi actualizate cu noile valori; condiie_filtrare_1 specific criteriul pe care trebuie
s-l ndeplineasc nregistrrile pentru a fi actualizate. Se pot include mai multe condiii de
filtrare legate prin operatorii logici AND i/sau OR. Se poate folosi de asemenea operatorul
NOT pentru a inversa valoarea expresiei logice.

Exemplu. n fiierul CLIENI din baza de date TEST, s se modifice cmpul cantitate maxim
(CANT_MAX) la valoarea 25.

OPEN DATABASES (TEST)


USE CLIENTI
UPDATE CLIENTI SET CANT_MAX=25
BROWSE FIELDS FIRMA,CANT_MAX
CLOSE DATABASES

4. Comanda INSERT SQL adaug o nou nregistrare la sfritul unei tabele existente. Noua
nregistrare conine date descrise n comanda INSERT sau pot fi preluate dintr-un masiv.

Sintaxa comenzii:
INSERT INTO tabel [(nume_cmp_1[, nume_cmp_2,...])] VALUES (valoare_1, valoare_2,...])
sau
INSERT INTO tabel FROM ARRAY nume_masiv | FROM MEMVAR

unde:
tabel specific numele tabelei n care se adaug o nou nregistrare;
(nume_cmp_1[, nume_cmp_2,...]) specific numele cmpurilor din din noua nregistrare
n care vor fi inserate valori;
(valoare_1, valoare_2,...]) specific valorile cmpurilor care vor fi inserate n noua
nregistrare;
nume_masiv specific numele masivului din care vor fi inserate datele n noua nregistrare;
141 Baze de date

FROM MEMVAR coninutul variabilelor va fi inserat n cmpurile care au acelai nume


cu variabilele.

Exemplu. n tabela CLIENI din baza de date TEST coninutul nregistrrii curente va fi transmis
n memorie ca variabile i structura tabelei va fi copiat ntr-un noua tabel CLIENI2.

CLOSE DATABASES
CLEAR
OPEN DATABASES (TEST)
USE CLIENTI
* Se transmite nregistrarea curent n memorie ca variabile
SCATTER MEMVAR
* Se copiaz structura tabelei curente n tabela CLIENTI2
COPY STRUCTURE EXTENDED TO CLIENTI2
* Se insereaz nregistrarea memorat n variabile
INSERT INTO CLIENTI2 FROM MEMVAR
SELECT CLIENTI2
BROWSE
USE
DELETE FILE CLIENTI2.DBF

5. Comanda CREATE CURSOR SQL creaz o tabel temporar. Fiecare cmp din tabela
temporar este definit cu nume, tip, precizie, numr zecimale, valoare NULL i reguli de integritate
referenial. Aceste definiii pot fi obinute din comand sau dintr-un masiv.

Sintaxa comenzii:
CREATE CURSOR nume_alias(nume_cmp_1 tip_cmp [precizie[,nr_zecimale])
[NULL | NOT NULL] [CHECK expr_L [ERROR mesaj_eroare]] [DEFAULT expresie]
[UNIQUE] [NOCPTRANS]] [, nume_cmp_2...]) | FROM ARRAY nume_masiv

unde:
nume_alias specific numele tabelei temporare creat, care poate fi i numele unei
expresii;
nume_cmp_1 specific numele unui cmp din fiierul temporar;
10. Comenzi ale nucleului SQL 142

tip_cmp prin intermediul unei singure litere, specific tipul fiecrui cmp;
precizie[,nr_zecimale] specific mrimea i dac este cazul, numrul de zecimale pentru
cmpuri numerice;
NULL | NOT NULL aloc sau nu valori de tip NULL cmpului;
CHECK expr_L specific regula de validare pentru valorile care se vor nscrie n cmp.
Expresia logic expr_L poate fi i o funcie definit de utilizator;
ERROR mesaj_eroare specific mesajul de eroare pe care sistemul VFP l va afia n
cazul n care validarea datelor genereaz eroare;
DEFAULT expresie specific valoarea implicit pentru cmp. Tipul de dat dat de
expresie trebuie s fie de acelai fel cu tipul cmpului.
UNIQUE creaz un index candidat pentru cmp. Eticheta de index candidat are acelai
nume cu cel al cmpului. Valorile NULL i nregistrrile duplicat nu sunt permise ntr-un
cmp utilizat ca index candidat;
NOCPTRANS previne trecerea la o alt pagin de cod pentru caractere i cmpuri de tip
memo. Dac cursorul este convertit la o alt pagin de cod, cmpurile pentru care a fost
specificat clauza NOCPTRANS nu vor fi translatate;
FROM ARRAY nume_masiv specific numele unui masiv existent care conine numele,
tipul, precizia, numrul de zecimale pentru fiecare cmp din tabela temporar.

Exemplu. Se creaz un cursor cu nume alias ANGAJAI cu urmtoarea structur:


ID N(5) identificator angajat;
NUME C(25);
ADRESA C(30);
ORAS C(20);
TELEFON C(8) care accept i valori de tip Null;
SPEC M specialitatea, cmp de tip memo.
Se va aduga o nregistrare goal, dup care se vor nscrie valori n cmpurile tabelei.

CLOSE DATABASES
CLEAR
CREATE CURSOR ANGAJATI ;
(ID N(5), NUME C(25), ADRESA C(30), ORAS C(20), TELEFON C(8) NULL, SPEC M)
DISPLAY STRUCTURE
143 Baze de date

WAIT WINDOW Apasati o tasta pentru a introduce o inregistrare


INSERT INTO ANGAJATI (ID, NUME, ADRESA, ORAS, MARCA, SPECIALITATE);
VALUES (1004,DR. ION GARCEA,B-DUL LACUL TEI 124, SECTOR 2, BUCURESTI,;
88567902,PAZA SI PROTOCOL)
BROWSE
* n acest punct se poate copia nregistrarea ntr-o tabel permanent.
CLOSE ALL && odat ce cursorul s-a nchis, toate datele sunt golite din memorie.
CLEAR

6. Comanda CREATE TABLE SQL determin crearea unei tabele. La fiecare tabel nou creat, i
se specific numele cmpurilor din nregistrare i caracteristicile lor: tip, mrime, zecimale (pentru
tipurile numerice), valori de tip NULL i regulile de integritate refereniale. Definirea cmpurilor se
poate obine fie prin descriere n comand, fie dintr-un masiv.

Sintaxa comenzii:
CREATE TABLE | DBF nume_tabel_1 [NAME nume_lung] [FREE] (nume_cmp_1 tip_cmp
[mrime[(,mrime_cmp[,precizie])] [NULL | NOT NULL] [CHECK expr_L_1 [ERROR
mesaj_eroare_1]] [DEFAULT expr_1] [PRIMARY KEY | UNIQUE] [REFERENCES
nume_tabel_2 [TAG etich_1_index]] [NOCPTRANS] [nume_cmp_2 ]
[PRIMARY KEY expr_2 TAG etich_2_index|, UNIQUE expr_3 TAG etich_3_index]
[, FOREIGN KEY expr_4 TAG etich_4_index [NODUP] REFERENCES nume_tabel_3 [TAG
etich_5_index]]
[,CHECK expr_L_2[ERROR mesaj_eroare_2]]) | FROM ARRAY nume_masiv

unde:
nume_tabel_1 specific numele tabelei care va fi creat. Opiunile TABLE i DBF sunt
identice;
NAME nume_lung specific un nume lung pentru tabel. Acest nume poate fi specificat
numai dac este deschis o baz de date, el fiind stocat (memorat) n cadrul bazei de date.
Numele lung poate conine pn la 128 caractere i poate fi folosit numai n cadrul bazei de
date;
FREE noua tabel nu va fi adugat la baza de date curent (deschis);
(nume_cmp_1 tip_cmp [mrime[(,mrime_cmp[,precizie])] specific numele cmpului,
tipul, mrimea i precizia (numrul de poziii zecimale). O tabel poate conine pn la 255
10. Comenzi ale nucleului SQL 144

cmpuri. Dac unul sau mai multe cmpuri accept valori de tip NULL, limita se reduce la
254;
NULL | NOT NULL permite / mpiedic introducerea de valori de tip NULL n cmp;
CHECK expr_L_1 specific o regul de validare pentru cmp. Expresia logic expr_L_1
poate fi o funcie definit de utilizator. La adugarea unei nregistrri vide, se verific regula
de validare. Dac regula de validare nu prevede acceptarea de valori vide n cmp, se
genereaz eroare;
ERROR mesaj_eroare_1 specific mesajul de eroare pe care sistemul VFP l afieaz la
apariia unei erori, generate de clauza CHECK, care verific regula de validare;
DEFAULT expr_1 specific valoarea implicit pentru cmp. Expresia expr_1 trebuie s
fie de acelai tip cu tipul cmpului;
[PRIMARY KEY creaz un index primar pentru cmp. Eticheta de index primar are
acelai nume cu cel al cmpului;
UNIQUE creaz un index candidat pentru cmp. Numele etichetei de index candidat este
acelai cu cel al cmpului.
REFERENCES nume_tabel_2 [TAG etich_1_index] specific numele tabelei printe, la
stabilirea unei relaii persistente. Dac se omite clauza TAG etich_1_index, relaia se
stabilete utiliznd cheia primar de index a tabelei printe. Dac tabela printe nu are un
index de cheie primar, sistemul va genera eroare. Se include clauza TAG etich_1_index
pentru a stabili o relaie bazat pe existena etichetei de index pentru tabela printe;
NOCPTRANS previne trecerea la o alt pagin de cod pentru caractere i cmpuri memo.
Dac tabela este convertit la o alt pagin de cod, cmpul pentru care a fost specificat
clauza NOCPTRANS, nu va fi translatat;
[nume_cmp_2 ] urmtorul cmp din structura tabelei. Are aceleai caracteristici de
descriere ca i primul cmp;
PRIMARY KEY expr_2 TAG etich_2_index specific indexul primar care va fi creat.
Expresia expr_2 poate specifica orice cmp sau combinaie de cmpuri din tabel. TAG
etich_2_index specific numele etichetei de index primar. Deoarece o tabel nu poate avea
dect o singur cheie primar de indexare, nu se poate include aceast clauz dac deja
exist definit o cheie primar;
UNIQUE expr_3 TAG etich_3_index creaz un index candidat. Expresia expr_3 specific
orice cmp sau combinaie de cmpuri din tabel. Clauza TAG etich_3_index specific
numele etichetei de index pentru eticheta de index candidat, care va fi creat;
145 Baze de date

FOREIGN KEY expr_4 TAG etich_4_index [NODUP] creaz un index extern (non-
primar) i stabilete o relaie cu tabela printe. expr_4 specific expresia indexului extern.
Clauza TAG etich_4_index specific numele etichetei de index externe. Clauza NODUP se
include pentru a crea un index candidat extern;
REFERENCES nume_tabel_3 [TAG etich_5_index] specific tabela printe ctre care se
stabilete o relaie persistent. Includerea clauzei TAG etich_5_index determin stabilirea
relaiei pe baza unei etichete de index a tabelei printe. Dac este omis clauza, relaia se
stabilete utiliznd implicit cheia primar de indexare din tabela printe;
CHECK expr_L_2[ERROR mesaj_eroare_2] specific regula de validare pentru tabel;
FROM ARRAY nume_masiv specific numele unui masiv existent care conine numele,
tipul, mrimea i precizia pentru fiecare cmp al tabelei. Coninutul masivului poate fi
definit cu funcia AFIELDS().

7. Comnda DELETE SQL realizeaz tergerea la nivel logic (marcarea pentru tergere) a
nregistrrilor dintr-o tabel.

Sintaxa comenzii:
DELETE FROM [nume_BD!]nume_tabel [WHERE condiie_filtrare_1 [AND | OR
condiie_filtrare_2...]]

unde:
FROM [nume_BD!]nume_tabel specific numele tabelei n care nregistrrile sunt
marcate pentru tergere la nivel logic;
WHERE condiie_filtrare_1 [AND | OR condiie_filtrare_2...] vor fi marcate pentru
tergere numai anumite nregistrri, cele care ndeplinesc condiiile de filtrare.

tergerea fiind la nivel logic, nregistrrile vor fi terse fizic din tabel doar dup utilizarea
comenzii PACK.
11. Proiectarea meniurilor i a barelor de instrumente 146

11. Proiectarea meniurilor i a barelor de instrumente

Meniurile (Menus) i barele de instrumente (Toolbars) furnizeaz o cale structurat i


accesibil pentru mnuirea comenzilor aplicaiei. Prin planificarea i proiectarea judicioas a
meniurilor i barelor de instrumente, se poate crete calitatea aplicaiilor.

O bun parte din activitatea de creare a unui meniu sistem este realizat cu ajutorul
proiectantului de meniuri (Meniu Designer), n care se creaz meniul principal, submeniurile i
opiunile din meniu.
147 Baze de date

12. Aplicaii

12.1. Evidena rezultatelor activitii studenilor ntr-o facultate

12.1.1. Formularea i analiza problemei

Enunul problemei
Tema abordat este Evidena rezultatelor activitii studenilor ntr-o facultate.

Datele de intrare
Fia de nscriere;
Cataloagele de note;
Planul de nvmnt;
Programele analitice.

Datele de ieire
Componena grupelor;
Situaia dup o sesiune normanal;
Situaia statistic asupra repartiiei notelor la o disciplin;
Situaia statistic asupra repartiiei mediilor.

Actualizarea datelor
Adugarea de noi studeni;
Modificarea datelor despre studeni;
tergerea unui student;
Adugrea de note;
Modificarea notelor;
tergerea studentului din fiierul de note;
Adugarea de noi discipline;
Modificarea numelui unei discipline;
tergerea unei discipline.

Coduri adoptate
12. Aplicaii 148

Codul judeului;
Codurile disciplinelor;
An studii 1-6, an calendaristic 2006-2007.

Interfaa cu utilizatorul
Stabilirea meniurilor i a videoformatelor pentru programul monitor i a programelor subordonate.

Proiectarea intrrilor
Cererea de nscriere;
Cataloage;
Formularele cu codurile i denumirile disciplinelor.

Proiectarea ieirilor
Lista studenilor pe grupe;
Situaia dup sesiune;
Statistica la o disciplin;
Statistica medii;
List bursieri;
List integraliti.
Stabilirea cadrului pentru:

Operaiile de actualizare
Obinerea rapoartelor finale.
149 Baze de date

Schema general propus

CATALOAGE CEREREA DE PLAN PROGRAME


NSCRIERE NVMNT ANALITICE

VIDEOFORMAT INTRODUCERE DE LA
STUDENT TASTATUR
STUDENT

VIDEOFORMAT NOTE
PROGR. MONITOR NOTE

DISCIPLINE
VIDEOFORMAT
DISCIPLINE

LISTA SITUAIA DUP STATISTICA LA O STATISTIC LISTA BURSIERI


STUDENILOR PE SESIUNE DISCIPLIN MEDII
GRUPE

12.1.2. Crearea, actualizarea, modificarea i interogarea tabelelor

STUDENT NOTE DISCIPLINE


RELAIE
MATR C(5) MATR C(5) RELAIE COD_DIS C(3)
NUME_PRE C(30)
1 COD_DIS C(3) DENUMIRE
ADRESA MEMO NOTA N(2) 1 MEMO
TEL C(9) EXAMEN L
AN_STUDII C(1) COLOCVIU L
GRUPA C(2) TIP_CURS C(1)
TIP_PROMO C(1)

CODIFICARI

O - OBLIGATORIU

TIP_CURSF - FACULTATIV
P - OPTIONAL

O - OBLIGATORIU
TIP_PROMO
N - Nu este obligatoriu pentru promovare

Meniul programului ar putea fi de forma


150

BARA DE MENIURI

CREARE_BD ACTUALIZARE_BD RAPOARTE IESIRE

STUDENTI ADAUGARE LISTA STUDENTI


NOTE MODIFICARE STUDENTI INTEGRALISTI
DISCIPLINE STERGERE NOTE RESTANTIERI
DISCIPLINE STATISTICA DISCIPLINA
STATISTICA MEDII
LISTA BURSIERI

SUBMENIU
NIVELUL 2

SUBMENIURI
NIVELUL 1

12.1.3. Crearea structurii unui fiier

n fereastra de
comenzi se introduc comenzile de creare a unui fiier i vizualizare:
CREATE TABLE STUD1 (MATR C(3), NUME C(30), AN C(1), GRUPA C(2))
BROWSE

Se lanseaz comenzile [CTRL] + [Y] i se populeaz cu 3-4 nregistrri. Se salveaz cu [CTRL] +


[W].
Se deschide fereastra Data Session i se nchide fiierul STUD1 de la butonul Close.
Se va crea programul de modificare a structurii fiierului anterior pentru adugarea unui nou cmp
cu numele mbac (medie bacalaureat): File/New/Program/New File i introduc urmtoarele linii:

SELECT 2
USE STUD1
COPY STRUCTURE EXTENDED TO TEMP
USE TEMP
BROWSE
APPEND BLANK
REPLACE FIELD_NAME WITH MBAC
REPLACE FIELD_TYPE WITH N
REPLACE FIELD_LEN WITH 5
REPLACE FIELD_DEC WITH 2
151 Baze de date

BROWSE
USE TEMP
CREATE STUD2 FROM TEMP
USE STUD2
APPEND FROM STUD1
BROWSE
CLOSE DATABASES

Se salveaz i se ruleaz programul.

12.1.4. Adresarea prin macrosubstituie

Se va crea un program care va folosi macrosubstituia pentru numele de fiiere STUD1 i


STUD2. Se vor introduce urmtoarele linii de program:

PUBLIC FIS C(20)


FOR I=1 TO 2 DO
GOTO I
FIS=STUD+ALLTRIM(STR(I))+.DBF
USE &FIS
BROWSE
ENDFOR
CLOSE DATABASES

Se salveaz i se ruleaz programul.

12.1.5. Crearea unui meniu

Menu Bar va avea urmtoarele componente:


Creare BD Results Submenu Create Studenti/Note Results - Procedure
Actualizare - Results Submenu Create Studenti/Note Results - Procedure
Media Mesults- Procedure
Iesire Results- Procedure
152

a) Procedurile pentru crearea BD


Pentru fiierul Studenti

CREATE TABLE STUD (MATR C(3), NUME C(30), AN C(1), GRUPA C(2))
CLOSE DATABASES

Pentru fiierul Note

CREATE TABLE NOTE (NOTA1 N(2), NOTA2 N(2), MEDIA N(5,2))


CLOSE DATABASES

b) Procedurile de actualizare
Pentru fiierul Studenti

USE STUD
BROWSE
CLOSE DATABASES

Pentru fiierul Note

USE NOTE
BROWSE
CLOSE DATABASES

n fiecare fereastr Browse cu [CTRL] + [Y] se populeaz fiierele cu 3-4 nregistrri. La


fiierul Note nu se completeaz cmpul media.

c) Procedura de calcul a mediei

USE NOTE
FOR I=1 TO RECCOUNT()
GOTO I
REPLACE MEDIA WITH (NOTA1+NOTA2)/2
ENDFOR
153 Baze de date

BROWSE
CLOSE DATABASES

d) Procedura de ieire

CLEAR EVENTS
CLOSE DATABASES
SET SYSMENU TO DEFAULT

12.2. Gestionarea unei magazii

S se realizeze o aplicaie n Visual Fox Pro 6 prin care s se gestioneze intrrile de materiale,
furnizorii i materialele ntr-o magazie a unei secii de producie.

12.2.1. Proiectarea i realizarea aplicaiei

Aplicaia va cuprinde un modul pentru definirea bazei de date, un modul pentru actualizare
(adugare, modificare, tergere) i un modul de exploatare a bazei de date prin rapoarte.
Sunt prevzute trei tabele independente care au urmtoarea structur:

Fiierul materiale.dbf Fiierul furnizori.dbf Fiierul intrari.dbf


Denumire Tip Denumire Tip Denumire Tip
Denumire C(40) Denumire C(40) Cod_mat N(5)
Cod_mat N(5) Cod_furn N(4) Cod_furn N(4)
Um C(6) Adresa M Cant N(6)
Tel C(10) Pu N(8,2)
Data_in D

Existena cmpurilor comune din fiierul intrari.dbf cu cele ale celorlalte fiiere ofer
posibilitatea ca n etapa de proiectare a rapoartelor s se poat stabili relaii ntre tabele pentru a
extrage date corelate din toate sursele.
Se vor realiza dou rapoarte:
154

- pentru obinerea unei liste de intrri de materiale sortat ascendent dup data calendaristic
cu cteva comenzi SQL de manipulare a tabelelor;
- pentru obinerea unei liste cu furnizori i materiale folosind facilitatea de grupare a
modulului de rapoarte. Se vor utiliza date extrase din toate cele trei fiiere (stabilind relaii
ntre acestea), calculndu-se valoarea pltit fiecrui furnizor.

Aplicaia conine proceduri pentru ntreinerea i exploatarea bazei de date fiind construit cu o
interfa accesibil i logic. Structura proiectului este prezentat n Figura 1.
Se va utiliza programare vizual, orientat spre obiecte i procedural n realizarea aplicaiei
care rezolv problema formulat mai sus.
n programul principal init_var sunt declarate i iniializate variabilele globale, se deschid sau
se creaz fiierele utilizate i se lanseaz meniul aplicaiei.

Fig. 1

Programul principal Init_var din seciunea Programs

PUBLIC CODF, DEN, ADR, TL, CODM, DENM, PUN, DATAIN, CANTIT
155 Baze de date

SET DATE TO BRITISHCODF=0


* INITIALIZARI
DEN=' '
ADR=' '
TL=' '
CODM=0
DENM=' '
PUN=0
DATAIN={ / / }
CANTIT=0
CLOSE DATABASES
IF EMPTY(SYS(2000,'MATERIALE.DBF'))
CREATE TABLE MATERIALE (COD_MAT N(5),DENUMIRE C(40),UM C(6))
ELSE
USE MATERIALE
ENDIF

INDEX ON COD_MAT TAG COD_MAT ADDITIVE


IF EMPTY(SYS(2000,'INTRARI.DBF'))
CREATE TABLE INTRARI (COD_MAT N(5), COD_FURN N(4), CANT N(6), PU N(8,2),
DATA_IN D)
ELSE
USE INTRARI
ENDIF

IF EMPTY(SYS(2000,'FURNIZORI.DBF'))
CREATE TABLE FURNIZORI (COD_FURN N(4), DENUMIRE C(40), ADRESA M, TEL
C(10))
ELSE
USE FURNIZORI
ENDIF
INDEX ON COD_FURN TAG COD_FURN ADDITIVE

CLOSE DATABASE
156

SELECT 2
USE MATERIALE
SELECT 3
USE FURNIZORI
SELECT 4
USE INTRARI
DO MENU1.MPR
READ EVENTS

n continuare se definete bara de meniuri. n Figura 2 sunt prezentate Meniul principal i


submeniul Vizualizare BD.

Meniul principal Submeniu Vizualizare BD

Fig. 2
Crearea submeniului Vizualizare BD
* Vizualizarea tabelei Materiale
SELECT 2
BROWSE FIELDS COD_MAT, DENUMIRE, PU, DATA_IN NOEDIT

* Vizualizarea tabelei Furnizori


SELECT 3
BROWSE FIELDS COD_FURN, DENUMIRE NOEDIT

* Vizualiarea tabelei Intrari


SELECT 4
BROWSE NOEDIT

Crearea submeniu Actualizare BD


157 Baze de date

Submeniul este prezentat n Figura 3.

Fig. 3
Opiunea Adaugare
DO FORM ADAUG

Opiunea Modificare/Stergere
DO FORM MODIFICARE

* Crearea submeniu Rapoarte

Submeniul este prezentat n Figura 4:

Fig. 4

Opiunea Lista materiale/Data


DO FORM MAT_DATA

Opiunea Lista Furnizori/Materiale


Se declar urmtoarea procedur:

SELECT 4
SET ORDER TO TAG COD_MAT OF MATERIALE.CDX IN MATERIALE
SET RELATION TO COD_MAT INTO MATERIALE ADDITIVE
158

SET ORDER TO TAG COD_FURN OF FURNIZORI.CDX IN FURNIZORI


SET RELATION TO COD_FURN INTO FURNIZORI ADDITIVE
REPORT FORM FURNIZ_MATER PREVIEW
SET RELATION OFF INTO MATERIALE
SET RELATION OFF INTO FURNIZORI

care stabilete o relaie ntre nregistrrile fiierului materiale.dbf i intrari.dbf prin intermediul
cmpului comun cod_mat i pe de alt parte o relaie ntre nregistrrile fiierului furnizori.dbf i
intrari.dbf prin intermediul cmpului comun cod_furn.

Pentru stabilirea relaiilor ntre fiiere trebuie ca n prealabil fiierele copil s fie indexate dup
cmpul de legtur (cod_mat n fiierul materiale, cod_furn n fiierul furnizori), etap realizat n
programul principal init_var.
Dup vizualizarea raportului furniz_mater cele dou relaii sunt anulate.

Opiunea Iesire
CLEAR EVENTS
CLOSE DATABASE
SET SYSMENU TO DEFAULT

* Videoformat Adaug
Aceast videoformat are numele intern Form1, numele extern Adaug.scx, iar pentru proprietatea
Caption se alege textul Adaugare, Figurile 5a i 5b.

Butonul Iesire este primul strat i se aplica deasupra obiectului PageFrame1 (de tip container)
avnd proprietatea PageCount =3 (pagini). Pe butonul Iesire la evenimentul Click se asociaza
comanda THISFORM.RELEASE.

Se face click cu butonul din dreapta al mouse-ului i se alege opiunea Edit pentru a accesarea
elementelor containerului, respectiv cele trei pagini: Furnizori, Materiale, Intrari. Numele extern i
grosimea de caracter a paginilor se stabilete utiliznd proprietile Caption i FontBold= True.
Adresarea paginilor se realizeaz fcnd click cu butonul stng al mouse-ului pe fiecare pagin.
Numele intern poate fi schimbat, dar vor fi pstrate cele implicite (Page1, Page2, Page3), respectiv
adresarea paginii Furnizori n procedurile ataate va fi una ierarhic, prin calificare:
159 Baze de date

THISFORM.PAGEFRAME1.PAGE1.proprietate
Tabela Furnizori

Fig. 5a Fig.5b

Urmeaz stabilirea obiectelor pentru pagina Page1 (cu proprietatea caption=Furnizori). Sunt
patru regiuni de tip text, notate de la Text1 la Text4, un buton de comand (Command1) i patru
etichete, de la Label1 la Label4. Ordinea lor se stabilete din meniul View, submeniul TabOrder.
Dac se dorete trecerea de la vizualizarea interactiv a ordinii obiectelor la vizualizarea de tip list,
se selecteaz meniul Tools, submeniul Options, submeniul Forms, opiunea Tab Ordering i se
alege By list.

n continuare se stabilesc cteva proprieti referitoare la obiectele alese:


pentru obiectul Page1 (Furnizori) se acceseaz codul procedurilor ataate diferitelor
evenimente utiliznd butonul dreapta al mouse-ului i alegnd din meniu opiunea Code. Se
selecteaz evenimentul Activate i se adug urmtoarele linii de cod n editorul deschis:

* SE SELECTEZ ZONA DE LUCRU 3 (FURNIZORI.DBF)


SELECT 3
* SE TRIMITE FOCUSUL (PROMPTERUL) PE TEXT1
THISFORM.PAGEFRAME1.PAGE1.TEXT1.SETFOCUS
CODF=0
DEN =''
160

ADR=' '
TL=''
* ACTUALIZAREA REGIUNILOR DE EDITARE CU NOILE VALORI
THISFORM.PAGEFRAME1.PAGE1.REFRESH

pentru obiectele de tip text la proprieti, seciunea Data, se declar variabilele n


ControlSource, care vor prelua datele ce se vor scrie n fiier: Text1- codf, Text2- den,
Text3- adr, Text4- tl.
Etichetele vor avea trecute la proprietatea Caption denumirile explicite a variabilelor
utilizate: Cod furnizor (Label1), Denumire (Label2), Adresa (Label3), Telefon (Label4).
Proprietatea FontBold se seteaz True.
Butonul de validare (nume intern Command1, proprietatea Caption=Validare,
FontBold=True) va avea ataate urmtoare linii de cod pentru evenimentul Click:

LOCATE FOR CODF=COD_FURN


IF FOUND(3) THEN
WAIT WINDOW 'COD FURNIZOR DUPLICAT !'
ELSE
LOCATE FOR UPPER(ALLTRIM(DEN))=UPPER(ALLTRIM(DENUMIRE))
IF FOUND(3) THEN
WAIT WINDOW 'DENUMIRE DUPLICAT !'
ELSE
APPEND BLANK
REPLACE COD_FURN WITH CODF, DENUMIRE WITH DEN, ADRESA WITH
ADR, TEL WITH TL
ENDIF
ENDIF
CODF=0
DEN=' '
ADR=' '
TL=' '
THISFORM.PAGEFRAME1.PAGE1.REFRESH
THISFORM.PAGEFRAME1.PAGE1.TEXT1.SETFOCUS
161 Baze de date

Secvena de cod realizeaz dou validri, una pentru codul de furnizor i una pentru denumirea
firmei, verificnd dac mai exist o nregistrare similar. Verificarea se face pentru a pstra
caracterul de unicitate al codului i denumirii. n caz ca se gsete un duplicat se afieaz un mesaj
specific. Dac codul i denumirea sunt valide din punct de vedere al unicitii, se trece la scrierea n
fiierul de furnizor.dbf a noilor informaii. Se reiniializeaz variabilele, se actualizeaz cmpurile
afiate i se trimite focusul (prompter-ul) pe obiectul Text1.

Tabela Materiale

Fig. 6

Se stabilesc obiectele pentru pagina Page2 (proprietatea Caption=Materiale): Text1, Text2,


Text3, List1 (list), un buton de comand (Command1) i trei etichete Label1, Label2, Label3,
(Figura 6). Ordinea obiectelor se stabilete din meniul View, submeniul TabOrder.
n continuare se stabilesc cteva proprieti referitoare la obiectele alese:
pentru obiectul Page2 (Materiale) se acceseaz codul procedurilor ataate diferitelor
evenimente utiliznd butonul dreapta al mouse-ului i alegnd din meniu opiunea Code. Se
selecteaz evenimentul Activate i se adug urmtoarele linii de cod n editorul deschis:

SELECT 2
CODM=0
DENM=' '
THISFORM.PAGEFRAME1.PAGE2.REFRESH
THISFORM.PAGEFRAME1.PAGE2.TEXT1.SETFOCUS
162

pentru obiectul Page2 (Materiale) se selecteaz procedura Init la care se ataeaz


urmtoarele linii de cod (se iniializeaz i introduc valorile ntr-un vector care va fi utilizat
ulterior pentru obiectul list1 referitor la unitatea de msur)

PUBLIC UMAS(6)
UMAS(1)='BUC'
UMAS(2)='KG'
UMAS(3)='TO'
UMAS(4)='MC'
UMAS(5)='MP'
UMAS(6)='ML'

pentru obiectul Page2 se selecteaz procedura Activate la care se ataeaz urmtorul cod

SELECT 2
CODM=0
DENM=' '
THISFORM.PAGEFRAME1.PAGE2.REFRESH
THISFORM.PAGEFRAME1.PAGE2.TEXT1.SETFOCUS

pentru obiectul text1 se specific n fereastra de proprieti, seciunea Data, proprietatea


ControlSource, variabila codm.
pentru obiectul Text2 se specific la proprietatea ControlSource variabila denm.
pentru obiectul text3 se specific n fereastra de proprieti: ReadOnly=.T. i FontBold=.T.
care va fi utilizat pentru verificarea alegerii unitii de msur din obiectul list1.
pentru obiectul List1 se alege din fereastra de proprieti RowSource, unde se declar
variabila umas, iar la RowSourceType se alege Array i se ata urmtotorul cod pe
evenimentul Click:

WITH THISFORM.PAGEFRAME1.PAGE2
TEXT3.VALUE=.LIST1.VALUE
TEXT3.REFRESH
COMMAND1.SETFOCUS
163 Baze de date

ENDWITH

prin care se preia valoarea selectat n List1 i se afieaz n Text3. S-a folosit combinaia
With...EndWith pentru a adresa proprietile obiectelor List1, Text3 i Command1 din Page2
ntr-o form mai scurt (calificare global).
pentru obiectul command1 din lista de proprieti se stabilesc valorile pentru
Caption=validare i Fontbold= True. Din lista de evenimente se selecteaz Click Event
pentru care se ataeaz urmtoarele linii de cod:

LOCATE FOR CODM=COD_MAT


IF FOUND(2) THEN
WAIT WINDOW 'COD MATERIAL DUPLICAT !'
ELSE
LOCATE FOR UPPER(ALLTRIM(DENM))=UPPER(ALLTRIM(DENUMIRE))
IF FOUND(2) THEN
WAIT WINDOW 'DENUMIRE DUPLICAT !'
ELSE
APPEND BLANK
REPLACE COD_MAT WITH CODM,DENUMIRE WITH DENM,;
UM WITH THISFORM.PAGEFRAME1.PAGE2.LIST1.VALUE
ENDIF
ENDIF
CODM=0
DENM=' '
THISFORM.PAGEFRAME1.PAGE2.REFRESH
THISFORM.PAGEFRAME1.PAGE2.TEXT1.SETFOCUS

Secvena de program realizeaz adugarea n fiierul de materiale a valorilor introduse, care se


face n uma validrii codului i denumirii materialului. Se verific existena duplicatelor, dac
acestea exist vor fi semnalate prin mesaje specifice i adugarea nu se efectueaz.

Tabela Intrari
164

Stabilirea obiectelor pentru ultima pagin Page3 (proprietatea Caption=Intrari, FontBold=


True) din setul de pagini PageFrame1. Se vor insera urmtoarele obiecte: List1, List2, Text1,
Text2, Text3, Text4, Text5, Command1 i apte etichete, de la Label1 la Label7, Figura 7.

Fig. 7

Se stabilesc proprietile pentru obiectele declarate n videoformat:


pentru obiectul Page3 (Intrari) se acceseaz codul procedurilor ataate diferitelor
evenimente utiliznd butonul dreapta al mouse-ului i alegnd din meniu opiunea Code. Se
selecteaz procedura Activate i se adug urmtoarele linii de cod n editorul deschis

SELECT 2
GO TOP
SELECT 3
GO TOP
SELECT 4
PUN=0
CANTIT=0
CODM=MATERIALE.COD_MAT
CODF=FURNIZORI.COD_FURN
DATAIN={ / / }
THISFORM.PAGEFRAME1.PAGE3.LIST1.SETFOCUS
THISFORM.PAGEFRAME1.PAGE3.REFRESH
165 Baze de date

Procedura selecteaz tabelele care vor fi folosite, iniializeaz variabilele pentru cantitate, pre
unitar, cod material, cod furnizor i data intrrii. Se trimite focusul pe obiectul List1 i se
actualizeaz pagina cu noile valori.
pentru obiectul List1 se alege din fereastra de proprieti RowSource, unde se declar
materiale, RowsourceType, se alege fields, ControlSource, se declar denumire (cmpul
cu acelai nume ca n fiierul materiale.dbf). Pentru evenimentul Click se asociaz
urmtoarele linii de cod

SELECT 2
CODM=COD_MAT
THISFORM.PAGEFRAME1.PAGE3.TEXT1.REFRESH

pentru obiectul List2 se alege din fereastra de proprieti RowSource, aici se declar
furnizori, RowsourceType, se alege Fields, ControlSource se declar denumire (cmpul cu
acelai nume al fiierului furnizori.dbf). Evenimentul Click are ataate urmtoarele linii de
cod

SELECT 3
CODF=COD_FURN
THISFORM.PAGEFRAME1.PAGE3.TEXT2.REFRESH
THISFORM.PAGEFRAME1.PAGE3.TEXT3.SETFOCUS

pentru obiectul text1 se introduce n fereastra de proprieti la ControlSource valoarea


codm (variabila n care se preia din lista List1 codul materialului), FontBold= True i
ReadOnly True.

pentru obiectul Text2 se introduce n fereastra de proprieti la ControlSource valoarea


codf (variabila n care se preia din lista List2 codul furnizorului), FontBold= True i
ReadOnly True.

pentru obiectul Text3 se introduce n fereastra de proprieti la ControlSource valoarea


cantit (variabila n care se preia cantitatea);
166

pentru obiectul text4 se introduce n fereastra de proprieti la ControlSource valoarea pun


(variabila n care se preia preul unitar);
pentru obiectul Text5 se introduce n fereastra de proprieti la ControlSource valoarea
datain (variabila n care se preia data intrrii);
pentru obiectul Command1 la proprietatea Caption se introduce validare, FontBold=
True, iar la evenimentul Click se introduce secvena de cod

SELECT 4
APPEND BLANK
REPLACE COD_FURN WITH CODF, COD_MAT WITH CODM, CANT WITH CANTIT, PU
WITH PUN,;
DATA_IN WITH DATAIN
PUN=0
CANTIT=0
SELECT 2
GO TOP
CODM=MATERIALE.COD_MAT
SELECT 3
GO TOP
CODF=FURNIZORI.COD_FURN
DATAIN={ / / }
THISFORM.PAGEFRAME1.PAGE3.REFRESH
THISFORM.PAGEFRAME1.PAGE3.LIST1.SETFOCUS

Secvena de program realizeaz selectarea fiierului intrari.dbf i adugarea coninutului


variabilelor ataate obiectelor din videoformat la cmpurile fiierului. Se reiniializeaz variabilele,
se actualizeaz cmpurile cu noile valori i se trimite focus-ul pe obiectul List1.

Etichetele vor avea fixate valorile pentru urmtoarele proprieti:

Obiect Caption FontBold ForeColor


Label1 Cod material true 0,0,0
167 Baze de date

Label2 Cod furnizor true 0,0,0


Label3 Cantitate true 0,0,0
Label4 Pret unitar true 0,0,0
Label5 Data intrarii true 0,0,0
Label6 Denumire material true 0,64,0
Label7 Denumire furnizor true 255,0,0

Videoformatul Modificare pentru tabela Furnizori

Fig. 8

Aceast videoformat are numele intern Form1, numele extern este modificare.scx, iar pentru
proprietatea Caption se alege textul Modificare, Figura 8.
Butonul Iesire este primul strat i se aplica deasupra obiectului PageFrame1 (de tip container
avnd proprietatea PageCount =3); pe butonul Iesire la evenimentul Click se asociaz comanda
THISFORM.RELEASE.

Se face click cu butonul din dreapta al mouse-ului i se alege opiunea Edit pentru a accesa
elementele containerului, respectiv cele trei pagini: Furnizori, Materiale, Intrari. Numele extern i
grosimea de caracter a paginilor se stabilete utiliznd proprietile Caption i FontBold= True.
Adresarea paginilor se realizeaz fcnd click cu butonul stng al mouse-ului pe fiecare pagin.
168

La fel ca i la videoformatul precedent numele intern al paginii poate fi schimbat, dar vor fi pstrate
cele implicite (Page1, Page2, Page3).

Pentru stabilirea obiectelor pentru prima pagin Page1 (proprietatea caption=Furnizori) din
setul de pagini PageFrame1 se procedeaz astfel: se insereaz urmtoarele obiecte Text1, Text2,
Text3, Text4, Ttext5, cinci butoane de comand (Command1..Command5) i cinci etichete
(Label1..Label5).

Stabilirea proprietilor pentru obiectele alese se realizeaz astfel:


pentru obiectul Page1 (Furnizori) se acceseaz codul procedurilor ataate diferitelor
evenimente utiliznd butonul dreapta al mouse-ului i alegnd din meniu opiunea Code. Se
selecteaz evenimentul Activate i se adug urmtoarele linii de cod n editorul deschis:

SELECT 3
GO TOP
DENF=' '
THISFORM.PAGEFRAME1.PAGE1.REFRESH
THISFORM.PAGEFRAME1.PAGE1.TEXT1.SETFOCUS

pentru obiectele de tip text la proprieti, seciunea Data, se aleg pentru ControlSource
numele cmpurilor din fiiserul furnizori.dbf: Text1- cod_furn, Text2- denumire, Text3-
adresa, Text4- tel, iar pentru Text5- denf, care este variabila de preluare a irului de
caractere utilizat pentru cutarea n fiier a denumirii furnizorului.
Obiectul Text5 va avea ataat pe procedura Valid urmtoarele linii de cod pentru cutarea
irului de caractere preluat n variabila codf

LOCATE FOR UPPER(LEFT(DENF, LEN(ALLTRIM(DENF))))=UPPER(LEFT(DENUMIRE,


LEN(ALLTRIM(DENF))))
IF FOUND(3) THEN
THISFORM.PAGEFRAME1.PAGE1.REFRESH
ELSE
MESSAGEBOX('NU EXISTA !',64)
ENDIF
169 Baze de date

Etichetele vor avea trecute la proprietatea Caption denumirile explicite ale variabilelor
utilizate: Cod furnizor (Label1), Denumire (Label2), Adresa (Label3), Telefon (Label4) i
Cauta furnizor (Label5). Proprietatea FontBold se seteaz pe valoarea True.
Butonul de tergere (nume intern Command1, proprietatea Caption=Stergere,
FontBold=True, ForeColor=255,0,0) va avea ataate urmtoare linii de cod pentru
evenimentul Click

* VARIABILA CODF CAPTA VALOAREA CURENT A CODULUI FURNIZORULUI


CODF=COD_FURN
* STERGE LOGIC NREGISTRAREA CURENT
DELETE
* STERGE FIZIC NREGISTRAREA CURENT
PACK
* SELECIA FIIERULUI DIN ZONA 4(INTRARI.DBF)
SELECT 4
* CAUT NREGISTRRILE CU CODF=COD_FURN
LOCATE FOR CODF=COD_FURN
* ATTA VREME CT GASETI CODF
DO WHILE FOUND(4)
* TERGE LOGIC NREGISTRAREA
DELETE
CONTINUE
* SFRIT CICLU
ENDDO
* TERGE FIZIC NREGISTRAREA
PACK
* SELECIE FIIER DIN ZONA 3 (FURNIZORI.DBF)
SELECT 3
* ACTUALIZARE CMPURI PAGINA 1
THISFORM.PAGEFRAME1.PAGE1.REFRESH
* FOCUSUL(CONTROLUL) ESTE TRIMIS LA TEXT1.
THISFORM.PAGEFRAME1.PAGE1.TEXT1.SETFOCUS
170

urmeaz grupul de patru butoane (Command2..Command5), utilizate pentru navigarea n


cadrul fiierului furnizori.dbf, cu urmtoarele valori pentru declararea numelui icon-lui care
va fi ataat (proprietatea Picture)

Obiect Picture
Command2 c:\proiect_ex\top.bmp
Command3 c:\proiect_ex\prev.bmp
Command4 c:\proiect_ex\next.bmp
Command5 c:\proiect_ex\end.bmp

Fiecare buton are ataat cte o procedur pe evenimentul Click care execut deplasarea.
Butonul Command2 deplasare pe prima nregistrare

GO TOP
THISFORM.PAGEFRAME1.PAGE1.REFRESH

Butonul Command3 deplasare o nregistrare napoi

SKIP -1
IF BOF(3)
GO TOP
MESSAGEBOX('INCEPUT FISIER !',64)
ENDIF
THISFORM.PAGEFRAME1.PAGE1.REFRESH

Butonul Command4 deplasare o nregistrare nainte


SKIP 1
IF EOF(3)
GO BOTTOM
MESSAGEBOX('SFRSIT FISIER !',64)
ENDIF
THISFORM.PAGEFRAME1.PAGE1.REFRESH
171 Baze de date

Butonul Command5 deplasare la ultima nregistrare


GO BOTTOM
THISFORM.PAGEFRAME1.PAGE1.REFRESH

Videoformatul Modificare pentru tabela Materiale

Fig. 9

Stabilirea obiectelor pentru pagina Page2 (proprietatea Caption=Materiale, FontBold=


True): Text1, Text2, Text3, Text4, List1 (list), patru butoane de comand
(Command2..Command5) i patru etichete Label1, Label2, Label3, Label4, Figura 9. Aciunile
ataate se reazlizeaz dup cum urmeaz.
pentru obiectul Page2 (Materiale) se acceseaz codul procedurilor ataate diferitelor
evenimente utiliznd butonul dreapta al mouse-ului i alegnd din meniu opiunea Code. Se
selecteaz procedura Init i se adug urmtoarele linii de cod n editorul deschis

PUBLIC UMAS(6)
UMAS(1)='BUC'
UMAS(2)='KG'
UMAS(3)='TO'
UMAS(4)='MC'
UMAS(5)='MP'
172

UMAS(6)='ML'

pentru obiectul Page2 se selecteaz procedura Activate la care se ataeaz urmtorul cod
SELECT 2
GO TOP
DENM=' '
THISFORM.PAGEFRAME1.PAGE2.REFRESH
THISFORM.PAGEFRAME1.PAGE2.TEXT1.SETFOCUS

pentru obiectele de tip text se stabilesc urmtoarele valori pentru prorietatile


ControlSource i ReadOnly:

Obiect ControlSource ReadOnly


Text1 Cod_mat .F.
Text2 Denumire .F.
Text3 denm .F.
Text4 Um .T.

Proprietatea ReadOnly=.F. este implicit.

Obiectul Text3 va avea ataat urmtorul cod la procedura Valid

LOCATE FOR UPPER(LEFT(DENM,LEN(ALLTRIM(DENM))))=;


UPPER(LEFT(DENUMIRE,LEN(ALLTRIM(DENM))))
IF FOUND(2) THEN
THISFORM.PAGEFRAME1.PAGE2.LIST1.VALUE=UM
THISFORM.PAGEFRAME1.PAGE2.REFRESH
ELSE
MESSAGEBOX('NU EXISTA !',64)
ENDIF

Obiectul Text4 se utilizeaz pentru a afia unitatea de msur care este declarat n cmpul
um al fiierului materiale.dbf i pentru a afia noua modificare n cazul operrii n List1.
173 Baze de date

Secvena de cod realizezaz cutarea materialului dup irul de caractere preluat n variabila
denm, dac gsete o nregistrare cu valoarea cmpului denumire=denm se afieaz datele, dac nu,
apare un mesaj specific.

pentru obiectul List1 vom alege din fereastra de proprieti RowSource unde declarm
variabila umas iar la RowsourceType alegem Aarray i atam urmtorul cod pe
evenimentul Click:

WITH THISFORM.PAGEFRAME1.PAGE2
TEXT4.VALUE=.LIST1.VALUE
UM=.TEXT4.VALUE
TEXT4.REFRESH
TEXT3.SETFOCUS
ENDWITH

Secvena realizeaz actualizarea valorii stocate n obiectului Text4 cu valoarea selectat din
List1 n cazul unei modificri, noua valoare se scrie n cmpul um din fiierul intrari.dbf i
trimiterea controlului la urmtorul obiect Text3 (cutare material).
pentru cele patru etichete se stabilesc valorile pentru proprietile Caption i FontBold

Obiect Caption FontBold


Label1 Cod material true
Label2 Denumire true
Label3 Unitate de masura true
Label4 Cauta material true

cele patru butoane de comand (Command2..Command5) se utilizeaz pentru navigarea n


fiierul materiale.dbf au urmtoarele valori pentru declararea numelui icon-lui care va fi
ataat:

Obiect Picture
Command2 c:\proiect_ex\top.bmp
Command3 c:\proiect_ex\prev.bmp
174

Command4 c:\proiect_ex\next.bmp
Command5 c:\proiect_ex\end.bmp

Se ataeaz urmtoarele linii de cod la evenimentul Click

Command2 deplasare la nceputul fiierului:


GO TOP
THISFORM.PAGEFRAME1.PAGE2.REFRESH

Command3 deplasare o nregistrare napoi:

SKIP -1
IF BOF(2)
GO TOP
MESSAGEBOX('INCEPUT FISIER !',64)
ENDIF
THISFORM.PAGEFRAME1.PAGE2.REFRESH

Command4 deplasare o nregistrare nainte:

SKIP 1
IF EOF(2)
GO BOTTOM
MESSAGEBOX('SFRSIT FISIER !',64)
ENDIF
THISFORM.PAGEFRAME1.PAGE2.REFRESH

Command5 deplasare la sfritul fiierului:

GO BOTTOM
THISFORM.PAGEFRAME1.PAGE2.REFRESH

Videoformatul Modificare pentru tabela Intrari


175 Baze de date

Fig. 10

n continuare se stabilesc obiectelor pentru ultima pagin Page3 (proprietatea


Caption=Intrari, FontBold=True) din setul de pagini PageFrame1. Urmtoarele obiecte vor fi
inserate n acest videoformat : List1, List2, Text1, Text2, Text3, Text4, Text5, cinci butoane de
comand (Command1..Command5) i apte etichete Label1..Label7, Figura 10.
Pentru stabilirea proprietilor pentru obiectele declarate n videoformat se procedeaz astfel:
pentru obiectul Page3 (Intrari) se acceseaz codul procedurilor ataate diferitelor
evenimente Se selecteaz procedura Activate i se adug urmtoarele linii de cod n
editorul deschis

SELECT 2
GO TOP
SELECT 3
GO TOP
SELECT 4
GO TOP
THISFORM.PAGEFRAME1.PAGE3.REFRESH

pentru obiectul List1 - se alege din fereastra de proprieti RowSource, unde se declar
materiale, RowsourceType, se alege Fields, ControlSource, se declar denumire (cmpul
cu acelai nume ca n fiierului materiale.dbf) i se ataez la evenimentul Click codul:
176

SELECT 2
CODM=COD_MAT
THISFORM.PAGEFRAME1.PAGE3.TEXT1.REFRESH

pentru obiectul List2 se alege din fereastra de proprieti RowSource, unde se declar
furnizori, RowsourceType, se alege Fields, ControlSource, se declar denumire (cmpul
cu acelai nume ca n fiierul furnizori.dbf) i se ataeaz la evenimentul Click codul:

SELECT 3
CODF=COD_FURN
THISFORM.PAGEFRAME1.PAGE3.TEXT2.REFRESH
THISFORM.PAGEFRAME1.PAGE3.TEXT3.SETFOCUS

pentru obiectul Text1 se introduce n fereastra de proprieti la ControlSource valoarea


cod_mat (cmpul din fiier corespunztor codului de material), FontBold= True i
ReadOnly=True.
Pentru obiectul Text2 se introduce n fereastra de proprieti la ControlSource valoarea
cod_furn (cmpul din fiier corespunztor codului de furnizor), FontBold=True i
ReadOnly= True.
pentru obiectul Text3 se introduce n fereastra de proprieti la ControlSource valoarea
cant (cmpul n care este stocat cantitatea);
pentruobiectul Text4 se introduce n fereastra de proprieti la ControlSource valoarea pu
(cmpul n care este stocat preul unitar);
pentru obiectul Text5 se introduce n fereastra de proprieti la ControlSource valoarea
data_in (cmpul n care este stocat data intrrii);
pentru butonul Command1 se stabilesc urmtoarele proprieti: Caption=Stergere,
FontBold= True, Forecolor=255,0,0 i se ataeaz urmtorul cod la evenimentul Click:

BTNVALUE=0
BTNVALUE=MESSAGEBOX('STERGERE ?',4+32+256)
IF BTNVALUE=6 THEN
DELETE
PACK
177 Baze de date

ENDIF
THISFORM.PAGEFRAME1.PAGE3.REFRESH

Secvena de cod realizeaz tergerea nregistrrii curente n urma unei confirmri suplimentare
solicitate prin cutia de dialog Messagebox; valoarea returnat de cutia de dialog preluat n
variabila btnvalue este testat i dac s-a ales butonul OK se realizeaz tergerea. Parametrii cutiei
de dialog Messagebox sunt:
MESSAGEBOX(cMessageText [, nDialogBoxType [, cTitleBarText]])
cMessageText -textul care va fi afiat;
nDialogBoxType specific tipurile de butoane ,butonul implicit i icon-ul afiat n antet;
cTitleBarText titlul cutiei de dialog (antet) .
Valorile pentru nDialogBoxType sunt date n tabelul de mai jos:

Valoare Tipuri butoane


0 Numai butonul OK
1 OK i Cancel
2 Abort, Retry, and Ignore
3 Yes, No i Cancel
4 Yes i No
5 Retry i Cancel

Valoare Icon
16 Stop
32 Semnul ntrebrii
48 Semnul exclamrii
64 Semnul Informaie (I)

Valoare Buton implicit


0 Primul buton
256 Al doilea buton
512 Al treilea buton
178

(4- butoanele YES i NO, 32- tipul de icon afiat- semnul ntrebrii i 256- butonul doi, NO este
implicit).

cele patru butoane (Command2..Command5) se utilizeaz pentru parcurgerea


nregistrrilor din fiierul intrari.dbf avnd proprietatea Picture cu urmtoarele valori:

Obiect Picture
Command2 c:\proiect_ex\top.bmp
Command3 c:\proiect_ex\prev.bmp
Command4 c:\proiect_ex\next.bmp
Command5 c:\proiect_ex\end.bmp

la care se ataeaz urmtorul cod:

Command2 -deplasare la nceputul fiierului:


SELECT 4
GO TOP
THISFORM.PAGEFRAME1.PAGE3.REFRESH

Command3 deplasare o nregistrare napoi:

SELECT 4
SKIP -1
IF BOF(4)
GO TOP
MESSAGEBOX('INCEPUT FISIER !',64)
ENDIF
SELECT 4
THISFORM.PAGEFRAME1.PAGE3.REFRESH

Command4 deplasare o nregistrare nainte:

SELECT 4
SKIP 1
179 Baze de date

IF EOF(4)
GO BOTTOM
MESSAGEBOX('SFRSIT FISIER !',64)
ENDIF
SELECT 4
THISFORM.PAGEFRAME1.PAGE3.REFRESH

Command5 deplasare la sfritul fiierului:

SELECT 4
GO BOTTOM
THISFORM.PAGEFRAME1.PAGE3.REFRESH

cele apte etichete au stabilite urmtoarele proprieti:

Obiect Caption FontBold ForeColor


Label1 Cod material true 0,0,0
Label2 Cod furnizor true 0,0,0
Label3 Cantitate true 0,0,0
Label4 Pret unitar true 0,0,0
Label5 Data intrarii true 0,0,0
Label6 Denumire material true 0,64,0
Lab6el7 Denumire furnizor true 255,0,0

Videoformatul mat_data.scx pentru lista materiale/Data

Fig. 11
180

Acest videoformat are 5 obiecte: dou obiecte TextBox (Text1, Text2), dou etichete (Label1,
Label2) i un buton de comand (Command1) , Figura 11.

Proprietile pentru aceste obiecte sunt fixate astfel:


procedura ataat evenimentului Init este:

PUBLIC DATAIN1,DATAIN2
DATAIN1={ / / }
DATAIN2={ / / }

Se utilizeaz dou variabile pentru a prelua intervalul calendaristic pentru care se face selecia
nregistrrilor din fiierul intrari.dbf.

procedura ataat evenimentului Activate este:

DATAIN1={ / / }
DATAIN2={ / / }
THISFORM.TEXT1.SETFOCUS
THISFORM.REFRESH

Se iniializeaz cele dou variabile declarate anterior i se trimite controlul catre obiectul
Text1.

cele dou etichete Label1 i Label2 vor avea stabilite urmtoarele proprietati:

Obiect Caption FontBold ForeColor


Label1 De la data true 0,0,0
Label1 La data true 0,0,0

Text1 i Text2 vor avea declarat pentru ControlSource datain1 i datain2.


Command1 va avea ataat pe evenimentul Click urmtoarea secven de cod

IF DATAIN1>DATAIN2 THEN
181 Baze de date

MESSAGEBOX('A DOUA DAT CALENDARISTIC TREBUIE S FIE MAI MARE


DECT PRIMA !',48)
DATAIN2={ / / }
THISFORM.TEXT2.SETFOCUS
THISFORM.REFRESH
ELSE
SELECT * FROM INTRARI INTO TABLE TEMP1 HAVING
BETWEEN(DATA_IN,DATAIN1,DATAIN2) ORDER BY DATA_IN ; ASC
ALTER TABLE TEMP1 DROP COLUMN COD_FURN
ALTER TABLE TEMP1 ADD COLUMN DENUMIRE C(40)
USE
SELECT 5
USE TEMP1
FOR I=1 TO RECCOUNT(5)
GOTO I
CODM=COD_MAT
SELECT 2
LOCATE FOR CODM=COD_MAT
IF FOUND(2) THEN
DENM=DENUMIRE
ENDIF
SELECT 5
REPLACE DENUMIRE WITH DENM
ENDFOR
SELECT 5
REPORT FORM MATER_INTR PREVIEW
USE
DELETE FILE 'TEMP1.DBF'
THISFORM.RELEASE
ENDIF

Secvena de cod realizeaz validarea intervalului de timp comparnd datain1 cu datain2. n


cazul n care datain1 > datain2 intervalul nu este valid, se afieaz un mesaj explicativ, se
reiniializeaz variabila datain2 i controlul este trimis la obiectul Text2.
182

n cazul n care perioada este validat se realizez o selecie din fiierul intrari.dbf n fiierul
temp1.dbf a tuturor nregistrrilor care respect condiia ca data calendaristic stocat n cmpul
data_in s fie cuprins n perioada care este preluat n variabilele datain1 i datain2, ordonate
ascendent dup cmpul data_in.

Se terge coloana cod_furn din fiierul temp1.dbf i se adaug o nou coloan cu numele
denumire de tip caracter (se utilizeaz comanda SQL ALTER TABLE).

Se selecteaz zona de lucru 5 i se deschide tabela temp.dbf i ntr-un ciclu FOR se parcurg
secvenial nregistrrile din acest fiier concomitent cu cutarea denumirii materialului n fiierul
materiale.dbf deschis n zona de lucru 2 (pe baza cmpului comun cod_mat). Se transfer coninutul
cmpului denumire din fiierul materiale.dbf n cmpul denumire din fiierul temp1.dbf.

La ieirea din ciclu se lanseaz execuia raportului mater_intr.frx cu datele fiierului temp1.dbf.
Dup terminarea execuiei raportului, se terge fiierul temp1.dbf i se d controlul meniului
menu1.mpr.

Raportul n Design View are urmtoarea structur, Figura 12.

Fig. 12
183 Baze de date

n meniul Report se alege opiunea Title/Summary i n fereastra aprut, Figura 13, se


selecteaz Summary band care va asigura tiprirea cmpurilor imediat ce se termin raportul; n
caz contrar afiarea se va face n josul paginii (Page Footer).

Fig. 13

n meniul Report la opiunea Variables, se definete variabila valoare n care se va stoca suma
produselor pu*cant, obinute de la fiecare nregistrare pentru a afia o valoare total a materialelor
achiziionate ntr-o anumt perioad de timp, Figura 14.

n seciunea Page Header sunt ase etichete corespunztoare titlului raportului i capului de
tabel pentru care se afieaz datele din fiierul temp1.dbf.

n seciunea Detail sunt patru cmpuri de editare corespunztoare datelor din fiier (data_in,
denumire, cant, pu) i un cmp utilizat pentru a afia valoarea mrfii (pu*cant) pentru fiecare
nregistrare.
n seciunea Page Footer nu se trece nimic.

n seciunea Summary se declar cmpul pentru afiarea variabilei valoare care sumeaz
produsele pariale pu*cant.
184

Fig. 14

Opiunea Lista Furnizori/Materiale apeleaz n secvena de cod ataat raportul


furniz_mater.frx care are urmtoarea structur n modul Design View, Figura 15:

Fig. 15

n meniul Report, opiunea Data Grouping, se declar cmpul denumire din fiierul
materiale.dbf, dup care se va face gruparea datelor, utilizndu-se adresarea prin calificare
185 Baze de date

(nume_fiier.cmp, respectiv materiale.denumire) Figura 16. Opiunea se folosete pentru a


parcurge secvenial nregistrrile din fiier la care se vor asocia i tipri, pe baza relaiilor definite n
celelalte dou fiiere, datele corespunztoare.

Fig. 16

Din meniul Report se selecteaz opiunea Variables i se definete variabila NR, iar la
opiunea Calculations, se selecteaz Count, Figura 17. Variabila se utilizeaz pentru numrarea
nregistrrilor tiprite obinndu-se astfel numrul curent.

Fig. 17
186

Ca efect al opiunii selectate (Data Grouping), raportul se mparte n mai multe seciuni,
astfel:
- seciunea Header n care este declarat sub form de etichet denumirea raportului (se alege
din meniul Format opiunea Font i se stabilete Verdana, iar pentru FontStyle=Bold,
Size=20);
- seciunea Group Header1: denumire n care se declar variabila NR i cmpul de grupare,
respectiv materiale.denumire. Pentru aceste cmpuri din meniul Format, la opiunea Font,
se alege Verdana i FontStyle=Regular i Bold (pentru materiale.denumire). Se observ
c exist posibilitatea de a definii mai multe cmpuri de grupare;
- seciunea Detail se prevd patru etichete pentru (furnizor, pret unitar, cantitate, valoare) i
patru cmpuri pentru afiarea datelor din fiierele ntre care s-au stabilit relaii:
furnizori.denumire, intrari.pu, intrari.cant i produsul intrari.pu*intrari.pu. Pentru aceste
cmpuri caracterul de tiprire este Verdana i stilul caracterului Regular;
- n seciunea Group Footer1: denumire nu se trece nimic.

n continuare este prezentat codul surs generat de wizard pentru aplicaia de mai sus.

***** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY


DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\INIT_VAR.PRG
*:******************************************************************************
*:
*: Procedure File C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\DOC\INIT_VAR.PRG
*:
*:
*:
*:
*:
*:
*:
*:
*:
*:
*:
*:
*:
*:
*:
187 Baze de date

*: Documented using Visual FoxPro Formatting wizard version .05


*:******************************************************************************
*: INIT_VAR
PUBLIC codf,denf,adr,tl,codm,denm,pun,datain,cantit
SET date to british
codf=0
denf=''
adr=' '
tl=''
codm=0
denm=''
pun=0
datain={ / / }
cantit=0
CLOSE databases
IF empty(sys(2000,'materiale.dbf'))
CREATE table materiale (cod_mat n(5),denumire c(40),um c(6))
ELSE
USE materiale
ENDIF
INDEX on cod_mat tag cod_mat additive

IF empty(sys(2000,'intrari.dbf'))
CREATE table intrari (cod_mat n(5),cod_furn n(4),cant n(6), pu
n(8,2),data_in d)
ELSE
USE intrari
ENDIF

IF empty(sys(2000,'furnizori.dbf'))
CREATE table furnizori (cod_furn n(4),denumire c(40),adresa m,tel c(10))
ELSE
USE furnizori
ENDIF
INDEX on cod_furn tag cod_furn additive

CLOSE database
SELECT 2
USE materiale
SELECT 3
USE furnizori
188

SELECT 4
USE intrari
DO MENU1.MPR
READ EVENTS
****** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\ADAUG.SCX
Name = "Dataenvironment"
Top = -1
Left = -1
Height = 272
Width = 408
DoCreate = .T.
Caption = "Adaugare"
Name = "Form1"
ErasePage = .T.
PageCount = 3
Top = 3
Left = 4
Width = 400
Height = 266
TabIndex = 1
Name = "Pageframe1"
Page1.FontBold = .T.
Page1.Caption = "Furnizori"
Page1.Name = "Page1"
Page2.FontBold = .T.
Page2.Caption = "Materiale"
Page2.Name = "Page2"
Page3.FontBold = .T.
Page3.Caption = "Intrari"
Page3.Name = "Page3"
PROCEDURE Page1.Activate
SELECT 3
codf=0
den=''
adr=' '
tl=''
thisform.Pageframe1.Page1.refresh
thisform.Pageframe1.Page1.text1.setfocus
ENDPROC
PROCEDURE Page2.Activate
189 Baze de date

SELECT 2
codm=0
denm=''
thisform.Pageframe1.Page2.refresh
thisform.Pageframe1.Page2.text1.setfocus
ENDPROC
PROCEDURE Page2.Init
PUBLIC umas(6)
umas(1)='BUC'
umas(2)='KG'
umas(3)='TO'
umas(4)='MC'
umas(5)='MP'
umas(6)='ML'

ENDPROC
PROCEDURE Page3.Activate
SELECT 2
GO top
SELECT 3
GO top
SELECT 4
pun=0
cantit=0
codm=materiale.cod_mat
codf=furnizori.cod_furn
datain={ / / }
thisform.Pageframe1.Page3.list1.setfocus
thisform.Pageframe1.Page3.refresh
ENDPROC
ControlSource = "codf"
Height = 21
Left = 104
TabIndex = 1
Top = 22
Width = 81
Name = "Text1"
ControlSource = "den"
Height = 23
Left = 103
190

TabIndex = 2
Top = 55
Width = 250
Name = "Text2"
ControlSource = "adr"
Height = 38
Left = 106
TabIndex = 3
Top = 96
Width = 245
Name = "Text3"
ControlSource = "tl"
Height = 23
Left = 106
TabIndex = 4
Top = 144
Width = 113
Name = "Text4"
Top = 157
Left = 337
Height = 26
Width = 53
FontBold = .T.
Caption = "Validare"
TabIndex = 5
Name = "Command1"
PROCEDURE Click
LOCATE for codf=cod_furn
IF found(3) then
WAIT window 'Cod furnizor duplicat !'
ELSE
LOCATE for upper(alltrim(den))=upper(alltrim(denumire))
IF found(3) then
WAIT window 'Denumire duplicat !'
ELSE
APPEND blank
REPLACE cod_furn with codf,denumire with den,adresa with adr,tel
with tl
ENDIF
ENDIF
codf=0
191 Baze de date

den=''
adr=' '
tl=''
thisform.Pageframe1.Page1.refresh
thisform.Pageframe1.Page1.text1.setfocus
ENDPROC
FontBold = .T.
Caption = "Cod furnizor"
Height = 21
Left = 19
Top = 22
Width = 72
TabIndex = 6
Name = "Label1"
FontBold = .T.
Caption = "Denumire"
Height = 21
Left = 18
Top = 54
Width = 80
TabIndex = 7
Name = "Label2"
FontBold = .T.
Caption = "Adresa"
Height = 22
Left = 15
Top = 94
Width = 85
TabIndex = 8
Name = "Label3"
FontBold = .T.
Caption = "Telefon"
Height = 20
Left = 14
Top = 146
Width = 74
TabIndex = 9
Name = "Label4"
ControlSource = "codm"
Height = 25
Left = 115
192

TabIndex = 1
Top = 16
Width = 76
Name = "Text1"
ControlSource = "denm"
Height = 27
Left = 115
TabIndex = 2
Top = 64
Width = 256
Name = "Text2"
PROCEDURE Valid
thisform.Pageframe1.Page2.list1.setfocus
ENDPROC
Top = 165
Left = 330
Height = 29
Width = 53
FontBold = .T.
Caption = "Validare"
TabIndex = 4
Name = "Command1"
PROCEDURE Click
LOCATE for codm=cod_mat
IF found(2) then
WAIT window 'Cod material duplicat !'
ELSE
LOCATE for upper(alltrim(denm))=upper(alltrim(denumire))
IF found(2) then
WAIT window 'Denumire duplicat !'
ELSE
APPEND blank
REPLACE cod_mat with codm,denumire with denm,;
um with thisform.Pageframe1.Page2.list1.value
ENDIF
ENDIF
codm=0
denm=''
thisform.Pageframe1.Page2.refresh
thisform.Pageframe1.Page2.text1.setfocus
ENDPROC
193 Baze de date

FontBold = .T.
Caption = "Cod material"
Height = 24
Left = 10
Top = 20
Width = 82
TabIndex = 5
Name = "Label1"
FontBold = .T.
Caption = "Denumire"
Height = 21
Left = 10
Top = 70
Width = 81
TabIndex = 6
Name = "Label2"
RowSourceType = 5
RowSource = "umas"
Height = 108
Left = 125
TabIndex = 3
Top = 110
Width = 100
Name = "List1"
PROCEDURE Click
WITH thisform.Pageframe1.Page2
.Text3.value=.list1.value
.Text3.refresh
.Command1.setfocus
ENDWITH

ENDPROC
FontBold = .T.
Caption = "Unitate de masura"
Height = 22
Left = 10
Top = 120
Width = 105
Name = "Label3"
FontBold = .T.
Height = 25
194

Left = 11
ReadOnly = .T.
Top = 142
Width = 102
Name = "Text3"
FontBold = .T.
ControlSource = "codm"
Height = 25
Left = 86
ReadOnly = .T.
TabIndex = 1
Top = 85
Width = 84
Name = "Text1"
FontBold = .T.
ControlSource = "codf"
Height = 25
Left = 85
ReadOnly = .T.
TabIndex = 3
Top = 204
Width = 82
Name = "Text2"
ControlSource = "cantit"
Height = 25
Left = 276
TabIndex = 5
Top = 30
Width = 84
Name = "Text3"
ControlSource = "pun"
Height = 25
Left = 276
TabIndex = 6
Top = 67
Width = 107
Name = "Text4"
ControlSource = "datain"
Height = 25
Left = 276
TabIndex = 7
195 Baze de date

Top = 102
Width = 75
Name = "Text5"
BoundColumn = 1
RowSourceType = 6
RowSource = "materiale"
ControlSource = "denumire"
Height = 51
Left = 5
Sorted = .F.
TabIndex = 2
Top = 28
Width = 164
BoundTo = .T.
Name = "List1"
PROCEDURE Click
SELECT 2
codm=cod_mat
thisform.Pageframe1.Page3.text1.refresh
ENDPROC
RowSourceType = 6
RowSource = "furnizori"
ControlSource = "denumire"
Height = 52
Left = 4
Sorted = .F.
TabIndex = 4
Top = 142
Width = 163
Name = "List2"
PROCEDURE Click
SELECT 3
codf=cod_furn
thisform.Pageframe1.Page3.Text2.refresh
thisform.Pageframe1.Page3.Text3.setfocus
ENDPROC
Top = 156
Left = 280
Height = 27
Width = 77
FontBold = .T.
196

Caption = "Adaugare"
TabIndex = 8
Name = "Command1"
PROCEDURE Click
SELECT 4
APPEND blank
REPLACE cod_furn with codf, cod_mat with codm, cant with cantit,pu with
pun,;
data_in with datain
pun=0
cantit=0
SELECT 2
GO top
codm=materiale.cod_mat
SELECT 3
GO top
codf=furnizori.cod_furn
datain={ / / }
thisform.Pageframe1.Page3.refresh
thisform.Pageframe1.Page3.list1.setfocus
ENDPROC
FontBold = .T.
Caption = "Cod material"
Height = 23
Left = 7
Top = 87
Width = 81
TabIndex = 9
Name = "Label1"
FontBold = .T.
Caption = "Cod furnizor"
Height = 24
Left = 8
Top = 207
Width = 69
TabIndex = 10
Name = "Label2"
FontBold = .T.
Caption = "Cantitate"
Height = 28
Left = 204
197 Baze de date

Top = 34
Width = 57
TabIndex = 11
Name = "Label3"
FontBold = .T.
Caption = "Pret unitar"
Height = 28
Left = 204
Top = 72
Width = 66
TabIndex = 12
Name = "Label4"
FontBold = .T.
Caption = "Data intrarii"
Height = 26
Left = 204
Top = 105
Width = 69
TabIndex = 13
Name = "Label5"
FontBold = .T.
Caption = "Denumire material"
Height = 16
Left = 14
Top = 7
Width = 125
TabIndex = 14
ForeColor = 0,64,0
Name = "Label6"
FontBold = .T.
Caption = "Denumire furnizor"
Height = 22
Left = 7
Top = 122
Width = 142
TabIndex = 15
ForeColor = 255,0,0
Name = "Label7"
Top = 235
Left = 348
Height = 25
198

Width = 49
FontBold = .T.
Caption = "Iesire"
TabIndex = 2
Name = "Command1"
PROCEDURE Click
thisform.release
ENDPROC
****** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\END.BMP
****** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\FURNIZ_MATER.FRX
****** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\MAT_DATA.SCX
Name = "Dataenvironment"
Top = 1
Left = 67
Height = 94
Width = 214
DoCreate = .T.
Caption = "Materiale-Data"
Name = "Form1"
PROCEDURE Activate
datain1={ / / }
datain2={ / / }
thisform.text1.setfocus
thisform.refresh
ENDPROC
PROCEDURE Init
PUBLIC datain1,datain2
datain1={ / / }
datain2={ / / }
ENDPROC
Top = 39
Left = 170
Height = 21
Width = 45
FontBold = .T.
Caption = "OK"
TabIndex = 3
Name = "Command1"
199 Baze de date

PROCEDURE Click
IF datain1>datain2 then
MESSAGEBOX('A doua data calendaristica trebuie sa fie mai mare dect
prima !',48)
datain2={ / / }
thisform.Text2.setfocus
thisform.refresh
ELSE
SELECT * from intrari into table temp1 having
between(data_in,datain1,datain2) order by data_in asc
ALTER table temp1 drop column cod_furn
ALTER table temp1 add column denumire c(40)
USE
SELECT 5
USE temp1
FOR i=1 to reccount(5)
GOTO i
codm=cod_mat
SELECT 2
LOCATE for codm=cod_mat
IF found(2) then
denm=denumire
ENDIF
SELECT 5
REPLACE denumire with denm
ENDFOR

SELECT 5
REPORT form mater_intr preview
USE
Delete file 'temp1.dbf'
thisform.release
ENDIF
ENDPROC
ControlSource = "datain1"
Height = 25
Left = 80
TabIndex = 1
Top = 23
Width = 84
Name = "Text1"
200

ControlSource = "datain2"
Height = 25
Left = 80
TabIndex = 2
Top = 55
Width = 84
Name = "Text2"
FontBold = .T.
Caption = "De la data"
Height = 22
Left = 11
Top = 25
Width = 61
TabIndex = 4
Name = "Label1"
FontBold = .T.
Caption = "La data"
Height = 22
Left = 11
Top = 60
Width = 61
TabIndex = 5
Name = "Label2"
****** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\MATER_INTR.FRX
****** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\MENU1.MNX
****** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\MENU1.MPR
*:******************************************************************************
*:
*: Procedure File C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\DOC\MENU1.MPR
*:
*:
*:
*:
*:
*:
*:
*:
201 Baze de date

*:
*:
*:
*:
*:
*:
*:
*: Documented using Visual FoxPro Formatting wizard version .05
*:******************************************************************************
*: MENU1
*: _1j10vft5m
*: _1j10vft5n
*: _1j10vft5o
*: _1j10vft5p
*: _1j10vft5q
*: _1j10vft5r
*: _1j10vft5s
* *********************************************************
* *
* * 26/05/05 MENU1.MPR 14:40:05
* *
* *********************************************************
* *
* * Author's Name
* *
* * Copyright (C) 2005 Company Name
* * Address
* * City, Zip
* *
* * Description:
* * This PROGRAM was automatically generated BY GENMENU.
* *
* *********************************************************

* *********************************************************
* *
* * Menu Definition
* *
* *********************************************************
202

SET SYSMENU TO
SET SYSMENU AUTOMATIC

DEFINE PAD _1j10vft5i OF _MSYSMENU PROMPT "Vizualizare BD" COLOR SCHEME 3 ;


KEY ALT+V, ""
DEFINE PAD _1j10vft5j OF _MSYSMENU PROMPT "Actualizare BD" COLOR SCHEME 3 ;
KEY ALT+A, ""
DEFINE PAD _1j10vft5k OF _MSYSMENU PROMPT "Rapoarte" COLOR SCHEME 3 ;
KEY ALT+R, ""
DEFINE PAD _1j10vft5l OF _MSYSMENU PROMPT "Iesire" COLOR SCHEME 3 ;
KEY ALT+i, ""
ON PAD _1j10vft5i OF _MSYSMENU ACTIVATE POPUP vizualizar
ON PAD _1j10vft5j OF _MSYSMENU ACTIVATE POPUP actualizar
ON PAD _1j10vft5k OF _MSYSMENU ACTIVATE POPUP rapoarte
ON SELECTION PAD _1j10vft5l OF _MSYSMENU ;
DO _1j10vft5m ;
IN LOCFILE("PROIECT_EX\MENU1" ,"MPX;MPR|FXP;PRG" ,"WHERE is MENU1?")

DEFINE POPUP vizualizar MARGIN RELATIVE SHADOW COLOR SCHEME 4


DEFINE BAR 1 OF vizualizar PROMPT "Materiale"
DEFINE BAR 2 OF vizualizar PROMPT "Furnizori"
DEFINE BAR 3 OF vizualizar PROMPT "Intrari"
ON SELECTION BAR 1 OF vizualizar ;
DO _1j10vft5n ;
IN LOCFILE("PROIECT_EX\MENU1" ,"MPX;MPR|FXP;PRG" ,"WHERE is MENU1?")
ON SELECTION BAR 2 OF vizualizar ;
DO _1j10vft5o ;
IN LOCFILE("PROIECT_EX\MENU1" ,"MPX;MPR|FXP;PRG" ,"WHERE is MENU1?")
ON SELECTION BAR 3 OF vizualizar ;
DO _1j10vft5p ;
IN LOCFILE("PROIECT_EX\MENU1" ,"MPX;MPR|FXP;PRG" ,"WHERE is MENU1?")

DEFINE POPUP actualizar MARGIN RELATIVE SHADOW COLOR SCHEME 4


DEFINE BAR 1 OF actualizar PROMPT "Adaugare"
DEFINE BAR 2 OF actualizar PROMPT "Modificare/Stergere"
ON SELECTION BAR 1 OF actualizar ;
DO _1j10vft5q ;
IN LOCFILE("PROIECT_EX\MENU1" ,"MPX;MPR|FXP;PRG" ,"WHERE is MENU1?")
ON SELECTION BAR 2 OF actualizar ;
DO _1j10vft5r ;
IN LOCFILE("PROIECT_EX\MENU1" ,"MPX;MPR|FXP;PRG" ,"WHERE is MENU1?")
203 Baze de date

DEFINE POPUP rapoarte MARGIN RELATIVE SHADOW COLOR SCHEME 4


DEFINE BAR 1 OF rapoarte PROMPT "Lista materiale/Data"
DEFINE BAR 2 OF rapoarte PROMPT "Lista Furnizori/Materiale"
ON SELECTION BAR 1 OF rapoarte do form mat_data
ON SELECTION BAR 2 OF rapoarte ;
DO _1j10vft5s ;
IN LOCFILE("PROIECT_EX\MENU1" ,"MPX;MPR|FXP;PRG" ,"WHERE is MENU1?")

* *********************************************************
* *
* * _1J10VFT5M ON SELECTION PAD
* *
* * Procedure Origin:
* *
* * From Menu: MENU1.MPR, Record: 16
* * Called By: ON SELECTION PAD
* * Prompt: Iesire
* * Snippet: 1
* *
* *********************************************************
PROCEDURE _1j10vft5m
Clear events
CLOSE database
SET sysmenu to default

* *********************************************************
* *
* * _1J10VFT5N ON SELECTION BAR 1 OF POPUP vizualizar
* *
* * Procedure Origin:
* *
* * From Menu: MENU1.MPR, Record: 5
* * Called By: ON SELECTION BAR 1 OF POPUP vizualizar
* * Prompt: Materiale
* * Snippet: 2
* *
* *********************************************************
PROCEDURE _1j10vft5n
204

SELECT 2
BROWSE fields cod_mat, denumire noedit

* *********************************************************
* *
* * _1J10VFT5O ON SELECTION BAR 2 OF POPUP vizualizar
* *
* * Procedure Origin:
* *
* * From Menu: MENU1.MPR, Record: 6
* * Called By: ON SELECTION BAR 2 OF POPUP vizualizar
* * Prompt: Furnizori
* * Snippet: 3
* *
* *********************************************************
PROCEDURE _1j10vft5o
SELECT 3
BROWSE fields cod_furn, denumire noedit

* *********************************************************
* *
* * _1J10VFT5P ON SELECTION BAR 3 OF POPUP vizualizar
* *
* * Procedure Origin:
* *
* * From Menu: MENU1.MPR, Record: 7
* * Called By: ON SELECTION BAR 3 OF POPUP vizualizar
* * Prompt: Intrari
* * Snippet: 4
* *
* *********************************************************
PROCEDURE _1j10vft5p
SELECT 4
BROWSE noedit

* *********************************************************
* *
* * _1J10VFT5Q ON SELECTION BAR 1 OF POPUP actualizar
205 Baze de date

* *
* * Procedure Origin:
* *
* * From Menu: MENU1.MPR, Record: 10
* * Called By: ON SELECTION BAR 1 OF POPUP actualizar
* * Prompt: Adaugare
* * Snippet: 5
* *
* *********************************************************
PROCEDURE _1j10vft5q
DO form adaug

* *********************************************************
* *
* * _1J10VFT5R ON SELECTION BAR 2 OF POPUP actualizar
* *
* * Procedure Origin:
* *
* * From Menu: MENU1.MPR, Record: 11
* * Called By: ON SELECTION BAR 2 OF POPUP actualizar
* * Prompt: Modificare/Stergere
* * Snippet: 6
* *
* *********************************************************
PROCEDURE _1j10vft5r
DO form modificare

* *********************************************************
* *
* * _1J10VFT5S ON SELECTION BAR 2 OF POPUP rapoarte
* *
* * Procedure Origin:
* *
* * From Menu: MENU1.MPR, Record: 15
* * Called By: ON SELECTION BAR 2 OF POPUP rapoarte
* * Prompt: Lista Furnizori/Materiale
* * Snippet: 7
* *
* *********************************************************
206

PROCEDURE _1j10vft5s
SELECT 4
SET order to tag cod_mat of materiale.cdx in materiale
SET relation to cod_mat into materiale additive
SET order to tag cod_furn of furnizori.cdx in furnizori
SET relation to cod_furn into furnizori additive
REPORT form furniz_mater preview
SET relation off into materiale
SET relation off into furnizori
****** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\MODIFICARE.SCX
Name = "Dataenvironment"
Top = 0
Left = -1
Height = 294
Width = 424
DoCreate = .T.
Caption = "Modificare / Stergere"
Name = "Form1"
ErasePage = .T.
PageCount = 3
Top = 9
Left = 10
Width = 400
Height = 266
TabIndex = 1
Name = "Pageframe1"
Page1.FontBold = .T.
Page1.Caption = "Furnizori"
Page1.Name = "Page1"
Page2.FontBold = .T.
Page2.Caption = "Materiale"
Page2.Name = "Page2"
Page3.FontBold = .T.
Page3.Caption = "Intrari"
Page3.Name = "Page3"
PROCEDURE Page1.Activate
SELECT 3
GO top
denf=''
thisform.Pageframe1.Page1.refresh
207 Baze de date

thisform.Pageframe1.Page1.text1.setfocus
ENDPROC
PROCEDURE Page2.Init
PUBLIC umas(6)
umas(1)='BUC'
umas(2)='KG'
umas(3)='TO'
umas(4)='MC'
umas(5)='MP'
umas(6)='ML'

ENDPROC
PROCEDURE Page2.Activate
SELECT 2
GO top
denm=''
thisform.Pageframe1.Page2.refresh
thisform.Pageframe1.Page2.text1.setfocus
ENDPROC
PROCEDURE Page3.Activate
SELECT 2
GO top
SELECT 3
GO top
SELECT 4
GO top
thisform.Pageframe1.Page3.refresh
ENDPROC
ControlSource = "cod_furn"
Height = 21
Left = 92
TabIndex = 1
Top = 11
Width = 81
Name = "Text1"
ControlSource = "denumire"
Height = 23
Left = 92
TabIndex = 2
Top = 44
208

Width = 250
Name = "Text2"
ControlSource = "adresa"
Height = 38
Left = 92
TabIndex = 3
Top = 85
Width = 245
Name = "Text3"
ControlSource = "tel"
Height = 23
Left = 92
TabIndex = 4
Top = 133
Width = 113
Name = "Text4"
Top = 174
Left = 246
Height = 21
Width = 62
FontBold = .T.
Caption = "Stergere"
TabIndex = 5
ForeColor = 255,0,0
Name = "Command1"
PROCEDURE Click
codf=cod_furn
Delete
PACK
SELECT 4
LOCATE for codf=cod_furn
DO while found(4)
Delete
CONTINUE
ENDDO
PACK
SELECT 3
thisform.Pageframe1.Page1.refresh
thisform.Pageframe1.Page1.text1.setfocus
ENDPROC
FontBold = .T.
209 Baze de date

Caption = "Cod furnizor"


Height = 21
Left = 3
Top = 11
Width = 72
TabIndex = 6
Name = "Label1"
FontBold = .T.
Caption = "Denumire"
Height = 21
Left = 3
Top = 43
Width = 80
TabIndex = 7
Name = "Label2"
FontBold = .T.
Caption = "Adresa"
Height = 22
Left = 3
Top = 83
Width = 85
TabIndex = 8
Name = "Label3"
FontBold = .T.
Caption = "Telefon"
Height = 20
Left = 3
Top = 135
Width = 74
TabIndex = 9
Name = "Label4"
Top = 135
Left = 239
Height = 20
Width = 31
Picture = top.bmp
Caption = ""
Name = "Command2"
PROCEDURE Click
GO top
thisform.Pageframe1.Page1.refresh
210

ENDPROC
Top = 135
Left = 317
Height = 20
Width = 31
Picture = next.bmp
Caption = ""
Name = "Command3"
PROCEDURE Click
Skip 1
IF eof(3)
GO bottom
MESSAGEBOX('Sfrsit fisier !',64)
ENDIF
thisform.Pageframe1.Page1.refresh
ENDPROC
Top = 135
Left = 361
Height = 20
Width = 31
Picture = end.bmp
Caption = ""
Name = "Command4"
PROCEDURE Click
GO bottom
thisform.Pageframe1.Page1.refresh

ENDPROC
Top = 135
Left = 278
Height = 20
Width = 31
Picture = prev.bmp
Caption = ""
Name = "Command5"
PROCEDURE Click
Skip -1
IF bof(3)
GO top
MESSAGEBOX('Inceput fisier !',64)
ENDIF
211 Baze de date

thisform.Pageframe1.Page1.refresh
ENDPROC
ControlSource = "denf"
Height = 24
Left = 92
Top = 173
Width = 145
Name = "Text5"
PROCEDURE KeyPress
LPARAMETERS nKeyCode, nShiftAltCtrl

ENDPROC
PROCEDURE Valid
LOCATE for upper(left(denf,len(alltrim(denf))))=;
upper(left(denumire,len(alltrim(denf))))
IF found(3) then
thisform.Pageframe1.Page1.refresh
ELSE
MESSAGEBOX('Nu exista !',64)
ENDIF
ENDPROC
FontBold = .T.
Caption = "Cauta furnizor"
Height = 22
Left = 3
Top = 176
Width = 78
Name = "Label5"
ControlSource = "cod_mat"
Height = 25
Left = 115
TabIndex = 1
Top = 16
Width = 76
Name = "Text1"
ControlSource = "denumire"
Height = 25
Left = 115
TabIndex = 2
Top = 64
212

Width = 256
Name = "Text2"
FontBold = .T.
Caption = "Cod material"
Height = 24
Left = 10
Top = 20
Width = 82
TabIndex = 5
Name = "Label1"
FontBold = .T.
Caption = "Denumire"
Height = 21
Left = 10
Top = 70
Width = 81
TabIndex = 6
Name = "Label2"
RowSourceType = 5
RowSource = "umas"
Enabled = .T.
Height = 71
Left = 115
TabIndex = 3
Top = 110
Width = 100
Name = "List1"
PROCEDURE Click
WITH thisform.Pageframe1.Page2
.Text4.value=.list1.value
um=.Text4.value
.Text4.refresh
.Text3.setfocus
ENDWITH

ENDPROC
FontBold = .T.
Caption = "Unitate de masura"
Height = 22
Left = 10
Top = 120
213 Baze de date

Width = 105
Name = "Label3"
ControlSource = "denm"
Height = 25
Left = 115
Top = 191
Width = 198
Name = "Text3"
PROCEDURE Valid
LOCATE for upper(left(denm,len(alltrim(denm))))=;
upper(left(denumire,len(alltrim(denm))))
IF found(2) then
thisform.Pageframe1.Page2.list1.value=um
thisform.Pageframe1.Page2.refresh
ELSE
MESSAGEBOX('Nu exista !',64)
ENDIF
ENDPROC
FontBold = .T.
Caption = "Cauta material"
Height = 24
Left = 10
Top = 197
Width = 102
Name = "Label4"
Top = 160
Left = 236
Height = 20
Width = 31
Picture = top.bmp
Caption = ""
Name = "Command2"
PROCEDURE Click
GO top
thisform.Pageframe1.Page2.refresh
ENDPROC
Top = 160
Left = 314
Height = 20
Width = 31
Picture = next.bmp
214

Caption = ""
Name = "Command3"
PROCEDURE Click
Skip 1
IF eof(2)
GO bottom
MESSAGEBOX('Sfrsit fisier !',64)
ENDIF
thisform.Pageframe1.Page2.refresh
ENDPROC
Top = 160
Left = 358
Height = 20
Width = 31
Picture = end.bmp
Caption = ""
Name = "Command4"
PROCEDURE Click
GO bottom
thisform.Pageframe1.Page2.refresh

ENDPROC
Top = 160
Left = 275
Height = 20
Width = 31
Picture = prev.bmp
Caption = ""
Name = "Command5"
PROCEDURE Click
Skip -1
IF bof(2)
GO top
MESSAGEBOX('Inceput fisier !',64)
ENDIF
thisform.Pageframe1.Page2.refresh
ENDPROC
FontBold = .T.
ControlSource = "um"
Enabled = .T.
Height = 24
215 Baze de date

Left = 18
ReadOnly = .T.
Top = 144
Width = 83
Name = "Text4"
FontBold = .T.
ControlSource = "cod_mat"
Height = 25
Left = 86
ReadOnly = .T.
TabIndex = 1
Top = 85
Width = 84
Name = "Text1"
FontBold = .T.
ControlSource = "cod_furn"
Height = 25
Left = 85
ReadOnly = .T.
TabIndex = 3
Top = 204
Width = 82
Name = "Text2"
ControlSource = "cant"
Height = 25
Left = 276
TabIndex = 5
Top = 30
Width = 84
Name = "Text3"
ControlSource = "pu"
Height = 25
Left = 276
TabIndex = 6
Top = 67
Width = 107
Name = "Text4"
ControlSource = "data_in"
Height = 25
Left = 276
TabIndex = 7
216

Top = 102
Width = 75
Name = "Text5"
BoundColumn = 1
RowSourceType = 6
RowSource = "materiale"
ControlSource = "denumire"
Height = 51
Left = 5
Sorted = .F.
TabIndex = 2
Top = 28
Width = 164
BoundTo = .T.
Name = "List1"
PROCEDURE Click
SELECT 2
codm=cod_mat
thisform.Pageframe1.Page3.text1.refresh
ENDPROC
RowSourceType = 6
RowSource = "furnizori"
ControlSource = "denumire"
Height = 52
Left = 4
Sorted = .F.
TabIndex = 4
Top = 142
Width = 163
Name = "List2"
PROCEDURE Click
SELECT 3
codf=cod_furn
thisform.Pageframe1.Page3.Text2.refresh
thisform.Pageframe1.Page3.Text3.setfocus
ENDPROC
FontBold = .T.
Caption = "Cod material"
Height = 23
Left = 7
Top = 87
217 Baze de date

Width = 81
TabIndex = 9
Name = "Label1"
FontBold = .T.
Caption = "Cod furnizor"
Height = 24
Left = 8
Top = 207
Width = 69
TabIndex = 10
Name = "Label2"
FontBold = .T.
Caption = "Cantitate"
Height = 28
Left = 204
Top = 34
Width = 57
TabIndex = 11
Name = "Label3"
FontBold = .T.
Caption = "Pret unitar"
Height = 28
Left = 204
Top = 72
Width = 66
TabIndex = 12
Name = "Label4"
FontBold = .T.
Caption = "Data intrarii"
Height = 26
Left = 204
Top = 105
Width = 69
TabIndex = 13
Name = "Label5"
FontBold = .T.
Caption = "Denumire material"
Height = 16
Left = 14
Top = 7
Width = 125
218

TabIndex = 14
ForeColor = 0,64,0
Name = "Label6"
FontBold = .T.
Caption = "Denumire furnizor"
Height = 22
Left = 7
Top = 122
Width = 142
TabIndex = 15
ForeColor = 255,0,0
Name = "Label7"
Top = 156
Left = 213
Height = 20
Width = 31
Picture = top.bmp
Caption = ""
Name = "Command2"
PROCEDURE Click
SELECT 4
GO top
thisform.Pageframe1.Page3.refresh
ENDPROC
Top = 156
Left = 291
Height = 20
Width = 31
Picture = next.bmp
Caption = ""
Name = "Command3"
PROCEDURE Click
SELECT 4
Skip 1
IF eof(4)
GO bottom
MESSAGEBOX('Sfrsit fisier !',64)
ENDIF
thisform.Pageframe1.Page3.refresh
SELECT 2
LOCATE for intrari.cod_mat=materiale.cod_mat
219 Baze de date

IF found(2)
thisform.Pageframe1.Page3.list1.value=denumire
ENDIF
SELECT 4
thisform.Pageframe1.Page3.refresh

ENDPROC
Top = 156
Left = 335
Height = 20
Width = 31
Picture = end.bmp
Caption = ""
Name = "Command4"
PROCEDURE Click
SELECT 4
GO bottom
thisform.Pageframe1.Page3.refresh

ENDPROC
Top = 156
Left = 252
Height = 20
Width = 31
Picture = prev.bmp
Caption = ""
Name = "Command5"
PROCEDURE Click
SELECT 4
Skip -1
IF bof(4)
GO top
MESSAGEBOX('Inceput fisier !',64)
ENDIF
thisform.Pageframe1.Page3.refresh
SELECT 3
LOCATE for intrari.cod_furn=furnizori.cod_furn
IF found(3)
thisform.Pageframe1.Page3.List2.value=denumire
ENDIF
SELECT 4
220

thisform.Pageframe1.Page3.refresh
ENDPROC
Top = 195
Left = 222
Height = 25
Width = 63
FontBold = .T.
Caption = "Stergere"
ForeColor = 255,0,0
Name = "Command1"
PROCEDURE Click
btnvalue=0
btnvalue=messagebox('Stergere ?',4+32+256)
IF btnvalue=6 then
Delete
PACK
ENDIF
thisform.Pageframe1.Page3.refresh
ENDPROC
Top = 236
Left = 345
Height = 25
Width = 49
FontBold = .T.
Caption = "Iesire"
Name = "Command2"
PROCEDURE Click
thisform.release
ENDPROC
****** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\NEXT.BMP
****** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\PREV.BMP
****** * C:\DOCUMENTS AND SETTINGS\MIHAI\MY
DOCUMENTS\CURS_BD\APLICATII_CURS_BD\PROIECT_EX\TOP.BMP

12.2.2. Realizarea documentaiei i a aplicaiei n format executabil

Pentru obinerea documentaiei referitoare la sursele proiectului se parcurg urmtorii pai:


a) Se nchide aplicaia Project Manager;
221 Baze de date

b) Din meniul Tools se alege opiunea Wizards / Documenting. Aplicaia Documenting


Wizard parcurge 6 pai pentru elaborarea documentaiei proiectului:
1. Se alege fiierul surs (proiectul magazie.pjx) inclusiv calea ctre acesta. Se apas
butonul Next;
2. Se seteaz caractere mari pentru cuvinte cheie (Keywords) i simboluri;
3. Se seteaz identare text (Tab sau Space);
4. Se adug antet;
5. Se selecteaz tipuri de rapoarte;
6. Se ncheie cu specificarea subdirectorului n care vor fi generate rapoartele (existent
sau nou creat).

Fiierul MAGAZIE.LST va conine codul surs (fiier de tip text care poate fi ulterior trecut
ntr-un fiier Word) pentru toate programele i procedurile ataate obiectelor componentelor folosite
n proiect.
Se genereaz un tabel care va conine toate toate fiierele proiectului, generate, primare i
implicite (videoformate, rapoarte, meniuri), fiierele de tip BMP etc.

De exemplu, videoformatele (Forms) sunt salvate ntr-un fiier cu extensia .scx. La crearea
videoformatului, tabelul cu extensia .scx conine o nregistrare pentru videoformat, o nregistrare
pentru datele de mediu i dou nregistrri pentru uz intern. Pentru fiecare obiect adugat n
videoformat se adaug o nou nregistrare.

Anumite componente ale Visual FoxPro constau din fiiere multiple: un fiier primar i unul
sau mai multe fiiere implicite.

De exemplu, cnd se creaz un videoformat, Visual FoxPro creaz un fiier .scx (fiier primar)
i un fier .sct (fiier implicit)

Urmtoarele componente au fiiere multiple (Tabelul 1)


Tabelul 1

Component Fiiere primare Fiiere implicite


Form .scx .sct

Report .frx .frt


222

Label .lbx .lbt

Class Library .vcx .vct

Menu .mnx .mnt

Table .dbf .fpt, .cdx, .idx

Database .dbc .dct, .dcx

Tabelul 2 prezint extensiile i tipurile de fiiere asociate care sunt utilizate n Visual FoxPro
Tabel 2

Extensie Tip fiier


.act Documenting Wizard action diagram

.app Generated application or Active Document

.cdx Compound index

.chm Compiled HTML Help

.dbc Database

.dbf Table

.dbg Configuraie debugger

.dct memo database

.dcx index database

.dep Fiier dependen (creat de Setup Wizard)

.dll Windows Dynamic Link Library

.err Eroare de compilare

.esl Visual FoxPro suport bibliotec

.exe Program executabil

.fky Macro

.fll Visual FoxPro Dynamic Link Library

.fmt Format Fiier

.fpt Table memo

.frt Report memo

.frx Report
223 Baze de date

.fxp Program compilat

.h Antet fiier (pentru includere n Visual


FoxPro or C/C++ program)

.hlp WinHelp

.htm HTML

.idx Index, compact index

.lbt Label memo

.lbx Label

.log Coverage log

.lst Documenting Wizard list

.mem Salvare variabile

.mnt Menu memo

.mnx Menu

.mpr Program menu generat

.mpx Program menu compilat

.ocx ActiveX control

.pjt Project memo

.pjx Project

.prg Program

.qpr Program query generat

.qpx Program query compilat

.sct Form memo

.scx Form

.spr Screen Program generat (numai pentru


versiunile anteriaore FoxPro)

.spx Screen Program compilat (numai pentru


versiunile anteriaore FoxPro)

.tbk Memo backup

.txt Text

.vct Visual class library memo


224

.vcx Clas de biblioteci Visual

.vue FoxPro 2.x view

.win Fiier Window

Pentru a genera programul executabil al aplicaiei, se deschide Project Manager pentru


aplicaia magazie.pjx i se apas butonul Build i se specific opiunile pentru construire, Figura 1.

Fig. 1
Opiunile de construire se referer la urmtoarele aciuni:
- reconstruirea proiectului (Rebuild Project);
- construirea aplicaiei (Build Application);
- construirea programului executabil (Build Executable);
- construirea componentelor COM (Component Object Model pentru includerea
controalelor ActivX sau dac s-a creat un Automation server) sub form de DLL (librrie
de legtur dinamic).

Aciune de construire a executabilului are un subset de opiuni:


225 Baze de date

- recompilarea tuturor fiierelor;


- afiarea erorilor;
- lansare n execuie dup construire;
- regenerarea identificrii obiectelor.
Pentru celelalte aciuni numrul opiunilor din subset poate varia n funcie de aciune. De
exemplu, pentru construirea elementelor COM vor fi active doar trei opiuni, fr cea de rulare dup
construire (un DLL nu poate fi lansat n execuie fiind o librrie dinamic).

Programul executabil generat poate fi rulat pe acelai calculator sau pe un altul, cu condiia ca
acesta s aib Visual FoxPro instalat.

12.2.3. Utilizarea Setup Wizard

Pentru a mri portabilitatea aplicaiei se folosete Setup Wizard, n vederea realizrii de


subrutine de instalare a aplicaiei pe un alt calculator.

Din meniul Tools se alege submeniul Wizard, apoi opiunea Setup. Se parcurg 7 pai:
1. Localizarea fiierelor se specific subdirectorul care conine fiierele i subdirectoarele ce
trebuie distribuite. Nu se poate folosi Distrib ca nume de subdirector n care se afl fiierele
i subdirectoarele ce se vor distribui;
2. Specificarea componentelor care vor fi incluse n pachetul de distribuie, i anume:
- Visual FoxPro 6.0 Runtime librriile Visual FoxPro;
- Microsoft 8.0 Graph Runtime;
- ODBC Drivers;
- COM Components;
- ActiveX Controls;
- HTML help engine;
3. Crearea subdirectorului pentru Disk Image:
- 1.44 MB 3.5 wizard-ul creaz imagini pentru floppy disk;
- Websetup (compressed) wizard-ul creaz un program de instalare dens compresat
proiectat pentru descrcare rapid de pe un web site;
- Netsetup wizard-ul creaz un singur director care va conine toate fiierele.
4. Specificarea opiunilor de instalare referitoare la:
- Setup dialog box caption titlul ferestrei de Setup, opional;
226

- Copyright information obligatoriu;


- Post-setup executable specificarea unei aciuni post instalare, opional;
5. Identificarea destinaiei implicite pentru fiier rutina setup va plasa aplicaia n directorul
care se specific n Default directory . Opiunea Program group va crea un grup de
programe pentru aplicaia instalat care se va regsi n meniul Start al calculatorului
utilizatorului. Opiunea User can modify, ofer posibilitatea modificrii subdirectorului
implicit de instalatre;
6. Schimbarea setrilor fiierelor se afieaz fiierele i opiunile fcute pentru ele cu
posibilitatea de a se opera modificri legate de nume, destinaie sau alte modificri;
7. Terminarea procesului Setup Wizard la acest pas se poate crea un fiier de dependen
(.dep) care permite folosirea altor utiliti la instalarea aplicaiei. Dup apsarea butonului de
Finish, Setup Wizard realizeaz urmtoare aciuni:
- nregistreaz configuraia pentru urmtoarea utilizare a distribuiei din aceeai cale;
- lanseaz procesul de creare a imaginilor disc.
Imaginile disc pot fi copiate pe orice mediu de stocare i poate fi distribuit utilizatorilor
aplicaiei.
227 Baze de date

A. Anexa
Limite ale SISTEMULUI VFP 6.0

Caracteristic Valoare
Nr. maxim de nregistrri ntr-o tabel 1 miliard
Mrimea maxim a unei tabele 2 Gb
Nr. maxim de caractere pe nregistrare 65.500
Nr. maxim de cmpuri pe nregistrare 255
Nr. maxim de tabele deschise simultan 255
Nr. maxim de caractere pentru un cmp 254
Nr. maxim de bytes pentru cheia de index compus 100
Nr. maxim de bytes pentru cheia de index simplu 240
Nr. maxim de fiiere de index deschise pentru o tabel nelimitat
Nr. maxim de fiiere de index deschise pentru toate zonele de lucru nelimitat
Nr. maxim de legturi nelimitat
Lungimea maxim a unei expresii relaionale nelimitat
Valoarea maxim pentru ntregi 2.147.483.647
Precizia n calculul numeric 16
Mrimea maxim pentru un cmp de tip caracter 254
Mrimea maxim pentru un cmp de tip numeric 20
Nr. maxim de caractere pentru un cmp dintr-o tabel liber 10
Nr. maxim de caractere pentru un cmp dintr-o tabel care aparine unei BD 128
Nr. maxim de variabile 65.000
Nr. maxim de masive 65.000
Nr. maxim de elemente ntr-un masiv 65.000
Nr. maxim de linii surs ntr-un program nelimitat
Mrimea maxim a modulului de program compilat 64 Kb
Nr. maxim de proceduri (subprograme) nelimitat
Nr. maxim de apeluri DO imbricate 128
Nr. maxim de comenzi de ciclare 384
Nr. maxim de parametri transmii 27
Nr. maxim de tranzacii 5
Nr. maxim de obiecte la definirea unui raport nelimitat
A. Anexa 228

Nr. maxim de niveluri de grupare ntr-un raport 128


Nr. maxim de ferestre deschise nelimitat
Nr. maxim de ferestre BROWSE deschise 255
Nr. maxim de caractere ntr-un ir de caractere 16.777.184
Nr. maxim de caractere ntr-o linie de comand 8.192
Nr. maxim de fiiere limit sistem
deschise
Nr. maxim de cmpuri selectate prin comanda SELECT- 255
SQL
229 Baze de date

Index de termeni
accesul la date funcie utilizator, 129
direct, 97 nchiderea bazei de date/tabelei, 64
secvential, 97 Independena datelor
actualizarea bazei de date, 13 fizic, 10
algebr relaional logic, 10
diferen, 20 indexarea tabelei, 92
diviziunea, 21 nregistrare, 4
intersecia, 21 fizic, 4
jonciune, 21 logic, 4
jonciune exterioar, 21 interclasarea documentelor, 71
jonciune exterioar complet, 21 interogarea bazei de date, 13
jonciune exterioar dreapta, 21 legtura ntre tabele, 113
jonciune exterioar stnga, 21 matrice, 85
jonciune natural, 21 metadate, 4
produs cartezian, 20 model de date, 6, 7
proiecia, 20 distribuit, 8
reuniunea, 20 ierarhic, 8
selecia, 20 in reea, 8
anularea marcrii pentru tergere fizic, 49 primitiv, 8
apelul unui (sub)program, 130 semantic (orientat obiect), 9
arhitectura sistemului de baze de date, 6 modificarea nregistrrilor, 106
atribut, 4 modificarea structurii, 91
complex, 29 bazei de date, 62
cu o singur valoare, 29 tabelei, 62
cu set de valori, 29 procedur utilizator, 129
derivat, 29 programare
fr valoare, 29 modular, 119
bnci de date, 5 orientat pe obiecte, 37
baz de date, 4 procedural, 119
baz de date relaional, 28 structurat, 119
cmp, 4 programarea orientat pe obiecte
crearea etichetelor, 69 abstractizarea, 42
crearea interogrilor, 70 clasa, 37
crearea rapoartelor, 68 clasa parinte, 38
crearea structurii unei tabele, 149 evenimentul, 39
crearea tabelelor, 66 ncapsularea, 41
crearea videoformatelor, 67 mesaj, 38
de date metoda, 38
relaional, 8 motenirea, 41
deschiderea bazei de date, 52, 60 obiect, 38
deschiderea unei tabele, 49 polimorfism, 41
dictionar de date, 4 proprietatea, 39
domeniu, 19 restricii de integritate, 38
entitate, 4 subclasa, 37
fiier index, 94 redenumire fiier, 117
compus, 94 redundan minim, 14
simplu, 94 relaie, 19
Index de termeni 230

reorganizarea bazei de date, 14 structura unei functii, 130


Schema n modelul relaional, 29 structura unei funcii, 130
securitatea datelor, 14 structura unei proceduri, 129
sistem de gestiune a bazelor de date, 5, 9 subprograme imbricate, 130
complet relaional, 36 tabel, 19
minimal relaional, 36 transmiterea parametrilor, 130
relaionale, 19 prin referin, 131
prin valoare, 131
sisteme de baze de date, 5
validarea cmpurilor, 55
sortarea tabelei, 92
variabil
tergerea fiierelor, 110
global, 85
tergerea nregistrrilor, 109
local, 85
fizic, 50, 63, 110, 144
vectori, 85
logic, 49, 63, 109, 144
zon de lucru, 52
structura bazei de date, 6
231 Baze de date

Bibliografie
1. Dima, G., Dima M. FoxPro, Editura Teora, Bucureti, 1993.
2. Dima, G., Dima M. FoxPro Meniuri, Editura Teora, Bucureti, 1994.
3. Kifer, M., Bernstein, A., Lewis, Ph. Database Systems An Application-Oriented Approach,
State University of New York, Stony Brook, 2005.
4. Lungu, I. i al. Sistemul FoxPro Prezentare i Aplicaii, Editura All, Bucureti, 1993.
5. M. Velicanu, i al. Sisteme de Gestiune a Bazelor de Date, Editura Petrion, Bucureti, 2000;
6. Velicanu, M., Lungu, I., Muntean, M. Dezvoltarea Aplicaiilor cu Baze de Date n Visual
FoxPro, Editura All, Bucureti, 2001.
7. *** Visual FoxPro 6.0 Manualele Microsoft
8. *** MSDN Library, April 2003.

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