module 1-6 foxpro

175
1 UNIVERSITATEA ROMANO-AMERICANA FACULTATEA DE INFORMATICA MANAGERIALA Prof. univ. dr. Virgil Chichernea Lect. univ. drd. Gabriel Eugen Garais Asist. univ. drd. Cristina Maria Titrade BAZE DE DATE I SUPORT DE CURS Baze de date si programarea aplicatiilor economice ANUL II Semestrul 1 Bucuresti 2010

Upload: bogdan-baltaretu

Post on 25-Jul-2015

190 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Module 1-6 FoxPro

1

UNIVERSITATEA ROMANO-AMERICANA

FACULTATEA DE INFORMATICA

MANAGERIALA

Prof. univ. dr. Virgil Chichernea

Lect. univ. drd. Gabriel –Eugen Garais Asist. univ. drd. Cristina

Maria Titrade

BAZE DE DATE I

SUPORT DE CURS

Baze de date si programarea aplicatiilor

economice

ANUL II

Semestrul 1

Bucuresti 2010

Page 2: Module 1-6 FoxPro

2

INFORMATII GENERALE 1.1. Date de identificare a titularilor de curs si seminar

Nume titular curs: Prof. Univ. Dr. Virgil Chichernea

E-mail: [email protected]

Consultatii: saptamanal vineri ora 12 -14 (sala 501) sau prin e-mail

Nume titulari Lect. Univ Drd. Gabriel-Eugen Garais

laborator: [email protected]

Asist. Univ. Drd. Cristina Maria Titrade

1.2. Conditionari si prerechizite obligatorii

Acest curs presupune parcurgerea cursurilor Arhitectura calculatoarelor si

sisteme de operare si Algoritmi de calcul si bazele programarii din anul I.

Pentru cele doua materii se recomanda revederea bibliografiei obligatorii

propuse in anul I.

1.3. Descrierea cursului

In orice domeniu de activitate, din economia mondiala globalizata, se cer

informatii exacte obtinute in timp util. Aceste informatii se obtin din datele

primare, culese si organizate sub forma unor Baze de Date (BD), in urma unor

procese ample de prelucare si transmitere de date, efectuate cu ajutorul

produselor software complexe numite Sisteme de Gestiune a Bazelor de Date

(SGBD). In acest Suport de curs insusirea si utilizarea notiunilor si conceptelor

referitoare la BDR/SGBDR este organizata pe urmatoarele nivele :

1. Utilizatori baze de date şi SGBD (Modulul 1 si 2);

2. Programatori în limbaje de programare 4 GL (Modulul 3 si 4);

3. Insusirea MTI disponibile pentru proiectarea BDR (Modulul 5 si 6);

Pentru partea practica, in cadrul suportului de curs sunt date exemple dupa care

trebuie intocmite proiectele de semestru, iar in partea finala se afla Pliantul cu

sintaxa comenzilor SGBDR.

1.4. Materiale bibliografice obligatorii

- V. Chichernea, G. Garais: Baze de Date - Sistemul FoxPro/Visual FoxPro;

Univ. Româno-Americană. Editura PROUNIVERSALIS, Bucureşti 2009

- David M. Kroenke: Database Processing: Fundamentals Design

and Implementation.; 6th

Edition, Pretice Hall, 1997

- I.Lungu, N. Muşat, M. Velicanu: FoxPro, Prezentare şi aplicaţii; Editura

ALL, Bucureşti 1997

- David M. Kroenke: Textbook: Database Processing: Fundamentals,

Design, and Implementation, , 6th Edition, Prentice Hall, 1997

Page 3: Module 1-6 FoxPro

3

CUPRINS:

MODULUL I

ARHITECTURA BAZELOR DE DATE RELAŢIONALE ....................... 6 1.1. Noţiuni si concepte utilizate în organizarea datelor ................................ 6 1.2. Modele conceptuale pentru Sisteme de Gestiune a Bazelor de Date ...... 12

1.3 Relaţii (tabele) .......................................................................................... 13 1.4 Tipuri de chei şi identificarea înregistrărilor prin chei ............................ 13 1.5. Diagrama (modelul) entitate - legătură (asociere) (DEA) ...................... 15

Tema nr. 2 ......................................................................................................... 18 Tema nr. 3 ...................................................................................................... 19 1.6. Tipuri de restricţii şi integritatea restricţiilor .......................................... 19

1.7. Dependenţe şi determinări în mulţimea atributelor (câmpurilor) .......... 21 1.8 Anomalii intalnite in proiectarea Tabelelor ............................................. 23

1.9 NORMALIZAREA - Ameliorarea succesiva a schemei conceptuale a BD

........................................................................................................................ 24 1.10 Etape in realizarea aplicatiilor informatice cu baze de date ................... 26

MODULUL II

PREZENTAREA SGBD-ULUI FOXPRO ................................................... 28 2.1. Componentele funcţionale ale sistemului............................................ 28 2.2. Lansarea şi modul de lucru sub SGBD Foxpro ................................... 30

2.3. Tipuri de fişiere în FOXPRO ................................................................. 33 2.4. Consideraţii generale privind comenzile Foxpro .................................... 34

Semnificaţie....................................................................................................... 35 ALL ................................................................................................................ 35 Comanda acţionează asupra tuturor înregistrărilor din tabela activă ............. 35

2.5. Elemente ale limbajului de descriere şi interogare a bazei de date ..... 36 2.5.1. Constante ...................................................................................... 36

2.5.2. Variabile ........................................................................................... 36 2.5.3. Operatori .......................................................................................... 37 2.5.4. Expresii ............................................................................................ 39 2.5.5. Funcţii .............................................................................................. 39

2.5.5.1. Funcţii destinate lucrului cu baze de date şi fişiere asociate: .. 39

2.5.5.2. Funcţii destinate prelucrării datelor numerice: ........................ 40 2.5.5.3. Funcţii destinate prelucrării şirurilor de caractere .................... 41 2.5.5.4. Funcţii de tip dată calendaristică ............................................... 42 2.5.5.5. Funcţii financiare ...................................................................... 43 2.5.5.6. Funcţii cu caracter general ........................................................ 43

2.5.5.7. Funcţii utilizator ........................................................................ 43

MODULUL III

Page 4: Module 1-6 FoxPro

4

COMENZI FOXPRO PENTRU CREAREA SI GESTIONAREA BAZEI

DE DATE .......................................................................................................... 44 3.1. Comenzi pentru crearea bazei de date ..................................................... 44

3.1.1 Crearea tabelelor ............................................................................... 44 3.2. Comenzi pentru actualizarea conţinutului şi structurii bazei de date ..... 45

3.2.1. Comenzi pentru actualizarea structurii ........................................ 45

3.2.2. Comenzi pentru actualizarea conţinutului bazei de date .................. 47 3.2.2.1. Comenzi pentru adăugare de noi înregistrări ........................ 47

Adăugarea se poate face în orice moment pentru o tabelă care a fost creată, deci

care conţine cel puţin structura definită. Adăugarea de noi date se poate face: .. 47 3.2.2.2. Comenzi pentru modificarea datelor dintr-o tabelă ............. 48 3.2.2.3. Comenzi pentru ştergerea datelor dintr-o tabelă ................... 51

Alte comenzi de ştergere ............................................................................ 52 3.3. Comenzi pentru interogarea bazei de date ............................................. 52

3.4. Comenzi pentru afişarea bazei de date (vizualizarea înregistrărilor) 54 3.5. Comenzi pentru ordonarea înregistrărilor bazei de date ..................... 58

3.5.1. Comenzi pentru sortarea înregistrărilor ........................................... 58

3.5.2.Comenzi pentru indexarea unei baze de date .................................... 59

3.6. Comenzi pentru deschiderea şi închiderea tabelelor. Zone de lucru ... 62

3.7. Comenzi pentru stabilirea legăturilor dintre tabelele bazei de date .... 63 3.8. Comenzi pentru lucru cu variabile de memorie .................................. 65

MODULUL IV

LIMBAJUL DE PROGRAMARE FOXPRO................................................ 74 4.1. Realizarea şi gestionarea programelor sub Foxpro ................................. 74

4.2. Comenzi pentru elaborarea programelor sub FOXPRO ......................... 74 4.3. Structura secvenţială ............................................................................... 76

4.4. Structura alternativă ................................................................................ 76 4.5. Structura repetitivă .................................................................................. 79

4.6. Programarea pe evenimente .................................................................... 84 4.7. Comenzi pentru afişarea formatată a datelor .......................................... 84

4.7.1. Format de afişare .............................................................................. 84 4.7.2. Format de afişare şi citire ................................................................ 88 4.7.3. Afişare formatată şi lucrul cu butoane de control ........................... 92

4.8. Proceduri şi funcţii definite de utilizator................................................. 99 4.9. Comenzi pentru lucru cu ferestre ............................................................ 99 4.10. Comenzi pentru definirea şi gestionarea meniurilor ........................... 102 4.11. Comenzi pentru setarea parametrilor de lucru sub SGBD Foxpro ..... 107

MODULUL V

GENERATOARE AUTOMATE .................................................................. 123 5.1. Generatorul de rapoarte ......................................................................... 123

Page 5: Module 1-6 FoxPro

5

5.2. Crearea Formularelor (alcătuirea formularelor) .................................... 133

5.3. Generatorul de etichete ......................................................................... 138 5.4. Generatorul de filtre (QUERY) ............................................................. 140 5.5. Generatorul de meniuri ......................................................................... 144 5.6. Generatorul de aplicaţii ......................................................................... 148

MODULUL VI

PROGRAMARE ORIENTATA PE OBIECTE IN VISUAL FOXPRO .. 150 6.1 Facilităţi oferite de Visual FoxPro ........................................................ 150

6.1.1 O cale rapidă de a îmbunătăţi vechile aplicaţii FoxPro : ................ 150

6.1.2 Creşterea productivităţii şi flexibilizarea produselor software ...... 151 6.1.3 Transfer uşor pe 32-biţi .................................................................. 152

6.2 Programarea orientată obiect in Visual FoxPro .................................... 153

6.2.1 Proprietăţile ..................................................................................... 153 6.2.2 Metodele.......................................................................................... 154

6.2.3 Evenimentele ................................................................................... 154 6.2.4 Clasele ............................................................................................. 154 6.2.5 Instanţierea obiectelor ..................................................................... 156

6.2.6 Referirea unei Metode sau a unei Proprietăţi într-o clasă ............... 156

6.2.7 Subclasarea unei clase unei altei clase ............................................ 156

6.2.8 Protejarea metodelor şi a proprietăţilor ........................................... 159 6.2.9 Polimorfismul.................................................................................. 160

6.3 Sistem de mentenanta în POO ............................................................... 161 6.4 Realizarea claselor in Visual FoxPro ..................................................... 161

6.4.1 Diferenţele designului de suprafaţă ................................................. 163

6.4.2 Diferenţele de meniu ....................................................................... 163 6.4.3 Adăugarea proprietăţilor şi a metodelor.......................................... 163

6.4.4 Accesarea Informaţiilor clasei ........................................................ 163

ANEXA NR. 1 ................................................................................................. 167

ANEXA NR. 2 ................................................................................................. 171

Page 6: Module 1-6 FoxPro

6

MODULUL I

ARHITECTURA BAZELOR DE DATE

RELAŢIONALE

În informatica de gestiune sunt preferate bazele de date relaţionale,

datorită performanţelor oferite de acest tip de organizare. Prin utilizarea pe

scară largă a calculatoarelor personale (PC) utilizatorii au posibilitatea de a

realiza rapid operaţiile de întreţinere şi regăsire a datelor conţinute în acest tip

de baze de date. Pentru a putea utiliza şi mai ales pentru a putea proiecta astfel

de baze de date relaţionale este necesar să ne însuşim mai întâi o serie de

termeni şi concepte.

1.1. Noţiuni si concepte utilizate în organizarea datelor

D1: Datele se obţin prin efectuarea unor observaţii/masuratori

asupra obiectelor, fenomenelor, imaginilor, sunetelor, textelor. Asupra

datelor, reprezentate într-un cod convenţional, se pot face operaţii de stocare,

prelucrare, transmitere fie prin mijloace manuale, fie prin mijloacele

informatice. Prin conceptul de dată se înţelege cuplul atribut-valoare (A,V).

Orice dată se identifică prin atributul ei. Valoarea concretă pe care o ia acest

atribut constituie o reprezentare a sa.

D2: Informatiile se obtin prin prelucrarea datelor. Informaţiile

rezultă din semnificaţiile şi legăturile ce se pot deduce din ansamblul de date.

D3: Un fişier este un ansamblu de date ce poate fi manipulat de un

mare număr de utilizatori într-o viziune unică asupra datelor. Datele

memorate într-un fişier sunt structurate în înregistrări, o înregistrare se compune

din mai multe câmpuri, un câmp are o lungime de unul sau mai multe caractere

(octeţi), un caracter (byte sau octet) se memorează în opt biţi. Un fişier se

identifică, de regulă, de către sistemul de operare, printr-un nume şi o extensie.

D4: Baza de date este o colecţie de date şi informaţii necesară şi

suficientă pentru a satisface cerinţele informaţionale ale conducerii unei

unităţi economico-sociale (agent economic, instituţii publice etc.). BD este

formata dintr-un ansamblu de fisiere corelate.

Page 7: Module 1-6 FoxPro

7

Din punct de vedere tehnic o bază de date este formată din unul sau mai

multe fişiere în care datele sunt memorate într-o structură de date specifică

software-ului utilizat la crearea bazei de date.. O bază de date grupează un

ansamblu de fişiere corelate.

O bază de date este un ansamblu de date ce poate fi manipulat de mai

mulţi utilizatori în viziuni diferite asupra datelor Structura acestui ansamblu de date se realizează prin schema bazei de

date. Schema bazei de date, în sens CODASYL, descrie toate datele şi

structurile luate în evidenţă în cadrul unei baze de date.

D5: Schema BD reprezintă structura globală a bazei de date

(unii autori o numesc structură globală, alţii structură virtuală).

Subschema BD reprezinta viziunea particulara a fiecărui

utilizator. În exploatarea bazei de date fiecare utilizator are propria viziune

asupra structurării datelor relevante pentru el. De fapt fiecare utilizator va avea

acces la o bază de date particulară, în realitate fictivă, iar descrierea acestei baze

de date particulare se numeşte subschema bazei de date.

Constituirea SCHEMEI BD se realizează în patru etape după cum

urmează:

Etapa 1: Identificarea mulţimilor de entităţi din cadrul sistemului

Etapa 2: Identificarea asocierilor (legăturilor) care există între

mulţimile de entităţi

Etapa 3: Determinarea condiţiilor care se impun asocierilor identificate

Etapa 4: Determinarea caracteristicilor (atributelor) entităţilor şi

asocierilor care au rezultat în urma etapelor precedente.

D6: Sistemul de Gestiune a Bazelor de date (SGBD) este format dintr-un Sistem de programe care permite construirea unor

baze de date, încărcarea datelor şi dezvoltarea de aplicaţii privind

valorificarea datelor memorate în bazele de date. SGBD-ul este în fond o

interfaţă între utilizatori şi sistemul de oparare.

- Orice SGBD conţine un limbaj de descriere a datelor (LDD), care permite

descrierea structurii unei baze de date şi un limbaj de cereri (LC) sau limbaj de

prelucrare a datelor (LPD)ce permite efectuarea de operaţii asupra datelor aflate

în baza de date cum ar fi:

crearea; actualizarea; interogarea;listarea si intretinerea bazei de date.

S.G.B.D. este un sistem de programe care asigură independenţa

programelor aplicative faţă de modul de structurare a datelor.

Page 8: Module 1-6 FoxPro

8

Conform metodologii ANSI fiecărei baze de date i se asociază trei

nivele funcţionale şi anume:

- nivelul conceptual care este depozitarul semantic al bazei de date.

Acest nivel reprezintă o abstracţie a sistemului modelat şi serveşte

ca referire globală pentru viziunile particulare ale utilizatorilor

(schema bazei de date);

- nivelul extern (logic) cuprinde viziunile specifice definite pentru

manipularea (prelucrarea) datelor. Necesităţile de date ale

utilizatorilor sunt exprimate la acest nivel. O viziune externă a bazei

de date reprezintă, într-o manieră cât mai aproape de realitate, un tip

de utilizator al bazei de date (subschemele bazei de date);

- nivelul intern (fizic), corespunde reprezentării datelor pe suporturile

de date. Acest nivel contribuie la eficacitatea transpunerii şi

implementării sistemului conceptual.

D7: Banca de date reprezintă un sistem de organizare,

prelucrare şi teletransmisie de date şi informaţii care este format dintr-o

baza de date, un sistem de programe pentru gestiunea fişierelor bazei de

date, echipamentele de calcul implicate şi procedurile de lucru utilizate.

D8: Sistemul informaţional este sistemul de culegere,

prelucrare, transmitere şi stocare a datelor şi informaţiilor care circulă în

cadrul unei unităţi economico-sociale. Sistemul informaţional face legătura

între sistemul condus şi sistemul de conducere fiind subordonat acestora.

D9: Sistemul informatic este un ansamblu structurat de

elemente intercorelate funcţional pentru automatizarea procesului de obţinere

a informaţiilor şi fundamentarea deciziilor.

Sistemul informatic este inclus în sistemul informaţional şi conţine procesul

de culegere, verificare, transmitere, stocare şi prelucrare automată a datelor.

Sistemul informatic se compune din baza de date, echipamente de calcul şi

transmisie de date, software-ul şi utilizatorii.

SISTEM INFORMAŢIONAL

SISTEM INFORMATIC

Subsistem BANCA DE DATE

Baza

de date

SGBD

Echip.

de calcul

Proceduri

Page 9: Module 1-6 FoxPro

9

Schema nr. 1 – Relaţiile dintre sistemul informaţional, sistemul informatic

şi banca de date

Categorii de personal implicate in realizarea si exploatarea sistemelor

informatice cu BD: Administratorul bazei de date, Programatorii de

aplicaţii, Utilizatorii finali.

- Administratorul bazei de date care este gestionarul responsabil cu

buna funcţionare a SGBD şi cu menţinerea în permanenţă în stare de

funcţionare a bazei de date. Administratorul bazei de date ( o persoană sau un

grup) are următoarele responsabilităţi:

- proiectarea bazei de date (definirea schemei şi a subschemelor);

- asigurarea securităţii datelor;

- ameliorarea performanţelor bazei de date;

- asigurarea integrităţii şi extinderii bazei de date.

- Programatorii de aplicaţii - specialiştii care realizează programe in

LC, acestea fiind apoi compilate şi memorate în fisiere ce pot fi lansate în

execuţie de către utilizatori prin apelarea numelui asociat de utilizator şi

efectuează unele prelucrări specifice de date;

- Utilizatorii finali – persoane care exploatează baza de date si ruleaza

inclusiv programele elaborate de programatorii de aplicaţii. Acesti utilizatori

pot să obţină informaţiile memorate în baza de date fără să aibă cunoştinţe de

programare. Ei obţin informaţiile dorite prin comenzi cunoscute şi eventual

răspunzând la diferite opţiuni pe care le indică sistemul la un moment dat.

Deoarece datele dintr-o unitate economico-socială sunt într-o

permanentă schimbare, atunci şi asupra datelor memorate în baza de date

asociată sistemului informatic al unităţii economico-sociale se efectuează

operaţii de creare, modificare, adăugare. ştergere, prelucrare (interogare,

listare, transfer) etc.

OPERATII ASUPRA BD:

-CREARE

-ACTUALIZARE (Modificare valori; adăugare înregistrări; ştergere

înregistrări)

- INTEROGARE

- LISTARE

- INTRETINERE

D10: Prin entitate înţelegem un obiect, un fenomen, un proces din

lumea reală despre care ne interesează să avem informaţii în cadrul

sistemului.

Page 10: Module 1-6 FoxPro

10

O entitate poate fi o persoană, un loc, un obiect, eveniment sau idee

pentru care dorim să memorăm şi prelucrăm datele. De exemplu pentru

activitatea de aprovizionare a unui agent economic putem identifica următoarele

entităţi: FURNIZORI, CONTRACTE, ARTICOLE, etc. Entităţile pot forma

relaţii între ele.

D11: O relaţie este o asociere între două sau mai multe entităţi.

D12: Obiectul (câmpul, atributul) este o componentă a unei

entităţi. El nu are o existenţă proprie, ci există ca o caracteristică a entităţii.

De exemplu entitatea CONTRACT, cu care se lucrează în sistemul de

aprovizionare din cadrul unui agent economic (vezi figura 4), este caracterizată

prin obiectele următoare: cod_furnizor, cod_articol contractat, cantitate, termen

de livrare, clauze, etc.

Figura nr. 2 – Structura datelor din subsistemul aprovizionare

Pentru exemplificarea conceptelor de entitate, obiect şi dată precum şi a

legaturilor dintre ele, să mai analizăm şi activitatea de gestiune date din cadrul

secretariatului unei facultăţi. În cadrul acestei aplicaţii putem identifica

următoarele entităţi: PROFESORI, MATERII, STUDENTI, SALI_CLASA etc.

Reprezentarea grafică a acestor concepte şi a legăturilor dintre acestea este

reprezentată în figura 5.

Însă numai aceste noţiuni nu sunt suficiente pentru modelarea

organizării datelor în baza de date, deoarece lipsesc legăturile semantice între

entităţi şi în interiorul acestora.

D13

Page 11: Module 1-6 FoxPro

11

Pentru descrierea unei activităţi pentru care s-au cules deja datele

se foloseşte aşa numitul MODEL ENTITATE-LEGĂTURĂ (MEL).

În cadrul modelului entitate-legătură sunt puse în evidenţă

componentele importante ale sistemului (entităţile), proprietăţile acestor

componente (atributele) şi legăturile dintre entităţi (asocierile).

Figura nr. 3 – Exemplificări ale conceptelor: entităţi, obiecte, date.

Principalele tipuri de asocieri între entităţi sunt reprezentate în fig. 4.

Asociere 1:1 A B

Asociere 1:m A B

Asociere m:n A B

Asocieri exclusive A B

Asocieri recursive

A C

Page 12: Module 1-6 FoxPro

12

Figura nr. 4 - Tipuri de asocieri între entităţi

1.2. Modele conceptuale pentru Sisteme de Gestiune a Bazelor de

Date

Modelul conceptual pentru un Sistem de Gestiune al Bazei de Date

este modelul utilizat pentru descrierea structurii conceptuale (schemei) şi

structurii logice (subschemei) a datelor, precum şi a legăturilor dintre acestea,

existente într-o bază de date. El se particularizează prin modul de definire al

entităţilor, câmpurilor, tipurilor de înregistrări, legăturilor dintre colecţiile de

date şi prin terminologia utilizată. Modelul conceptual nu trebuie confundat cu

structura de reprezentare a datelor, deoarece pentru aceeaşi structură de

reprezentare pot exista mai multe modele conceptuale şi desigur că pentru

diferite structuri de reprezentare, se poate elabora un singur model conceptual.

În practica prelucrării automate a datelor, s-au consacrat următoarele modele

conceptuale: modelul conceptual “ierarhic”, modelul conceptual “reţea”,

modelul conceptual “relaţional”.

D14: Modelul conceptual "ierarhic" se bazează pe structuri

de reprezentare "arborescente" şi tipuri de legături 1:1, 1:n.

Cu ajutorul modelului conceptual "ierarhic", schema bazei de date poate fi

reprezentată sub forma unui graf arborescent (cu un nod rădăcină) în care nodurile

exprimă colecţiile de date, iar arcele reflectă legăturile de asociere între

înregistrările colecţiilor de date superioare şi inferioare.

D15: Modelul conceptual "reţea" se bazează pe structura

de reprezentare "reţea" şi pe tipurile de legături 1:1, 1:n şi m:n.

Prin acest model schema bazei de date poate fi reprezentată sub forma

unui graf general, fără limite, în care nodurile exprimă colecţii de date, iar

arcele reflectă relaţiile de asociere. Acest model conceptual stă la baza SGBD-

urilor TOTAL(UNIVAC), DBMS(DEC) şi SOCRATE.

D16: Modelul relaţional permite o descriere simplă a bazei de

date sub forma unor tabele în care actualizarea datelor în tabele se face

fără anomalii de stocare. În modelul relaţional o colecţie de atribute

(câmpuri) formează o relaţie (numită şi tabelă).

Modelul conceptual relaţional a fost elaborat de matematicianul

C.F.Codd de la firma I.B.M. În acest model conceperea schemei depinde

exclusiv de legăturile dintre obiecte. O relaţie poate fi reprezentată printr-o

tabelă, în care fiecare rând reprezintă un tuplu (înregistrare) distinct, iar fiecare

coloană reprezintă un câmp al înregistrării, câmp ce ia valori într-un anumit

Page 13: Module 1-6 FoxPro

13

domeniu. Cu ajutorul modelului relaţional structura conceptuală a bazei de date

poate fi reprezentată sub forma unei mulţimi de tabele, care se asociază între ele

prin intermediul unor chei. Modelul conceptual relaţional prezintă o serie de

avantaje:

- este uşor accesibil pentru utilizatorii mai puţin iniţiaţi în informatică,

prin faptul că baza de date este reprezentată ca o colecţie de tabele;

- este un model omogen de reprezentare a legăturilor dintre colecţiile

de date (prin relaţii);

- asigură independenţa programelor faţă de structura datelor;

- permite proiectarea unei structuri conceptuale optime a datelor, cu

ajutorul operaţiei de normalizare;

- admite satisfacerea cerinţelor întâmplătoare ale utilizatorilor, prin

intermediul unor limbaje bazate pe algebra relaţiilor sau a unor

limbaje neprocedurale bazate pe teoria predicatelor.

-

1.3 Relaţii (tabele)

O bază de date relaţională este memorată în tabele. O tabelă are o

structură bidimensională formată din rânduri şi coloane.

Termenii tabelă, rânduri şi coloane sunt mai frecvent întâlniţi decât

termenii echivalenţi: relaţie pentru tabelă, tuplu pentru rând şi atribut pentru

coloană. O relaţie conţine tuple (rânduri) şi atribute (câmpuri).

Scrierea prescurtata (forma canonica) a unei relatii (tabele):

CLIENTI (Cod_Client, Nume_Client, Telefon)

În figura 5 se prezintă un fragment din tabela CLIENŢI:

CLIENŢI:

Cod_clent Nume_client Telefon

2121 Ion Popescu 6305643

3456 Gergeta Pana 6267892

4612 Ana Grigore 3128867

7562 Victor Avram 3245276

Fig. 5 – Fragment din tabela CLIENŢI

1.4 Tipuri de chei şi identificarea înregistrărilor prin chei

Cheia primară asigură unicitatea fiecărui rând dintr-o relaţie.

Page 14: Module 1-6 FoxPro

14

O cheie primară este un atribut, sau o colecţie de atribute, a cărui

valoare identifică unic fiecare rând al unei relaţii. Pe lângă unicitate, cheia

primară trebuie să fie şi minimală (adică să nu conţină atribute în plus) şi să nu-

şi schimbe valorile în timpul prelucrării.

Fie tabela:

JUDETE (CodJudet, NumeJudet,NrJudet, Populatie,ResedintaJudet)

Un atribut sau o colecţie de atribute care poate servi ca şi cheie primară

se numeşte cheie candidată. De exemplu atributele Cod_judeţ şi Nr_judeţ sunt

chei candidate. În proiectarea bazei de date relaţionale se poate alege una din

cheile candidate ca şi cheie primară iar celelalte candidate ca şi cheie

alternante.

Să analizăm tabela LOCALITĂŢI

LOCALITATI(CodJudet, NumeLocalitate, Populatie)

În această tabelă ce atribut poate fi cheie primară? Atributul Populaţie

nu poate fi deoarece valoarea câmpului se schimbă şi nu poate să asigure

unicitatea. Nume_judet nu poate fi cheie primară deoarece pot fi localităţi cu

acelaşi nume în două judeţe. Numai colecţia Cod_judeţ + Nume_localitate

asigură identificarea unică şi minimală pentru fiecare rând din relaţia

LOCALITĂŢI. Un atribut multiplu folosit ca şi cheie primară se mai numeşte şi

cheie compusă (concatenată sau compozită).

Atributul Cod_judeţ în relaţia LOCALITĂŢI este o cheie externa (sau

cheie străină). O cheie externă este un atribut sau o colecţie de atribute a unei

relaţii a cărui valoare trebuie să fie valoare pereche a cheii primare din cadrul

unei relaţii. Spre exemplu dacă avem două tabele: LOCALITĂŢI şi JUDEŢE,

în care un atribut apare în ambele tabele. Atributul Cod_judet în tabela

JUDEŢE este cheie primară iar în tabela LOCALITĂŢI este cheie externa.

(Atenţie!!! Cheia într-o relaţie poate fi cheie primară, cheie candidat,

cheie alternantă, cheie externă şi de aceea în exprimare trebuie să se specifice

întotdeauna tipul cheii din relaţia analizată. Dacă în exprimare apare numai

cuvântul cheie atunci se referă la cheie primară).

Observatii 1:

Atentie!!!! Exista Nomenclatoare unice pe economie:

La I.N.S se gestioneaza Nomenclatoarele:

- SIRUTA (Nomenclatorul cu localitatile din Romania)

- SIRUES (Nomeclatorul unitatilor economico-sociale din Romania)

La M.E.C se gestioneaza Nomenclatoarele:

- SPEC (Nomenclatorul specializarilor obtinute prin studii)

La M.M.P.S. (Nomenclatorul de meserii)

Observatii 2:

Page 15: Module 1-6 FoxPro

15

Pentru Modelul Relational se utilizeaza frecvent urmatorii termeni

echivalenti:

TABELA = RELATIE

ATRIBUT = Coloana a tabelei;

TUPLU = Inregistrare (linie a tabelei)

DOMENIU = Multimea de valori admisibile pentru un atribut;

STRUCTURA RELATIEI = Multimea de atribute care compun structura

relatiei;

SCHEMA RELATIEI = Structura relatiei + restrictii privind valorile

admise;

CHEIE PRIMARA= Atribut sau grup de atribute care pot identifica un

tuplu in mod unic;

CHEIE SIMPLA (FORMATA DINTR-UN SINGUR ATRIBUT)

CHEIE COMPUSA (formata din mai multe atribute)

CHEIE CANDIDATA = Atribut sau grup de atribute care pot identifica

un tuplu in mod unic; Din multimea cheilor candidate se alege cheia

primara

CHEIE EXTERNA = Cheia care asigura legatura intre tabele (putem avea

legaturi de tip 1: 1; 1: m; n:m). Se realizaeaza de regual prin campuri

comune intre doua tabele.

Exemplu:

CLIENT (CodClient, Denumire, Adresa,...)

FACTURI (NrFact, DataFact, Emitent, CodClient, Cantitate, PU, Valoare,

DataScadenta,...)

PRODUS(CodProdus, DenProd, Um, Pret,...)

FACTURISCADENTE(NrFact, CodClient, Data, CodProdus,Cant, Pu,

Valoare,....)

Chei externe:

-CodClient pentru legatura dintre tabelele CLIENT si FACTURI;

-CoProdus pentru legatura dintre tabele PRODUS si

FACTURISCADENTE

1.5. Diagrama (modelul) entitate - legătură (asociere) (DEA)

O metodă practică pentru identificarea relaţiilor ce constituie o bază de

date constă în a scrie numele relaţiei (cu litere mari) urmat în paranteză de

Page 16: Module 1-6 FoxPro

16

numele atributelor (prima literă din numele atributului este literă mare).

Atributele subliniate din paranteză reprezintă chei primare, iar cheile externe

din relaţie, se scriu imediat după paranteza care defineşte relaţia. Folosind

aceasta metodă relaţiile folosite mai sus se pot scrie astfel:

ŢĂRI (Cod_ţară, Nume_ţară, Populaţie)

CAPITALE (Nume_capitală, Cod_ţară, Anul, Populaţie)

Cheie externă: Cod_tara , pentru legătura cu tabela ŢĂRI.

ORAŞE(Cod_ţară, Cod_oraş, Cod_judeţ, Nume_oraş,

Populaţie)

Cheie externă: Cod_ţară, pentru legătura cu tabela ŢĂRI.

CULTURI ( Nume_cultură, Export, Import)

PRODUCŢIE ( Cod_ţară, Nume_cultură, Producţie)

Cheie externă: Cod_ţară, pentru legătura cu tabela ŢĂRI

Cheie externă: Nume_cultură, pentru legătura cu tabela

CULTURI

TRANSPORT (Cod_ţară, Litoral, Export, Import)

Cheie externă: Cod_ţară, pentru legătura cu tabela ŢĂRI

O altă formă uzuală folosită pentru descrierea entităţilor şi a legăturilor

este Diagrama Entitate – Legătură (DEL). O diagramă entitate - legătură

exprimă grafic legăturile dintre entităţi. În diagrama entitate – legătură o

entitate şi o relaţie (tabela) sunt echivalente. Spre exemplificare să urmărim

diagrama entitate - relaţie din figura 6.

Diagramele entitate-relaţie au următoarele caracteristici:

- Entităţile, sau relaţiile, sunt reprezentate prin dreptunghiuri iar

legăturile prin romburi, adică numele entităţii apare în interiorul

dreptunghiului şi verbul care descrie legăturile apare în interiorul

rombului. De exemplu dreptunghiul “Oraş” este legat de

dreptunghiul “Ţară” prin rombul “Se află” şi se citeşte “ un Oraş se

află în Ţară”;

- Cifra 1 scrisă la intrarea legăturii în dreptunghiul Ţară şi litera M

scrisă la ieşirea legăturii din dreptunghiul Oraş semnifică o legătură

de tip 1: M între cele două entităţi. Similar se reprezintă relaţia de

tip M:N dintre entităţile Ţări şi Culturi şi relaţii de tip 1:M relaţiile

existente între entităţile (tabelele) Ţări şi Capitale şi între relaţiile

Ţări şi Transport;

Page 17: Module 1-6 FoxPro

17

- Un romb înscris în interiorul unui dreptunghi defineşte o entitate

compusă. O entitate compusă este o legătură care are caracteristicile

unei entităţi. Spre exemplu entitatea Producţie leagă entităţile Ţări şi

Culturi prin legături de tip M:N şi figurează în acelaşi timp ca şi

entitate deoarece conţine atributul cantitate pentru cheia compozită

formată din Cod_ţară şi Nume_cultură;

- O entitate subtip apare scrisă într-un dreptunghi dublu (înscris unul

în altul) şi nu este conectată prin intermediul nici unui romb la

entitatea Ţări.

Fig. 6 - Diagrama entitate - legătură

Se pot marca de asemenea atribute în diagrama entitate-relaţie prin

plasarea fiecărui atribut individual în cadrul unei buline conectate la o entitate

M

Culturi Producţia

Transport-

maritim

1

Capitala

Localizat

Ţara

Oraş

Aflat în

M

1

1

1 1

N

Page 18: Module 1-6 FoxPro

18

sau relaţie. Totuşi o diagrama entitate-relaţie tipică are de regulă un număr mare

de entităţi şi relaţii aşa că includerea şi a atributelor în această diagramă poate

provoca mai degrabă confuzii decât aduce anumite clarităţi.

Teme de laborator:

Tema nr. 1

I. Pentru evidenta consumului de materii prime aferent comenzilor de

produse lansate in fabricatie se cunosc urmatoarele:

1. In comanda se precizeaza sectia de productie si cantitatea de fabricat

din produsul respectiv;

2. Eliberarea materiilor prime pentru consum se face pe baza bonului

de consum in care se precizeaza: Nr-bon; Dta; Gestiunea; Nr-Cda;

Cod-mat; Cant-mat; pret-mat;

3. Orice produs din nomenclatorul de fabricatie se defineste prin: Cod-

p; Den-P; Pret-livrare;

4. Materiile prime se definesc prin: Cod_mat; Den_mat; UM;

Gestiunea in care se depoziteaza;

5. Intrarile de materii prime in gestiune se face pe baza de NIR in care

se consemneaza: Nr-NIR; Data; Furnizor; Gestiune-primitoare; Mat-

prima-receptionata; Cantitatea; Pret-aprov.

Restrictii:

- O comanda se refera la un singur produs;

- O materie prima poate fi stocata in mai multe depozite;

- Pretul fiecarei materii prime difera de la un furnizor la altul;

- Un depozit are un singur gestionar.

Se cere:

- Identificati multimea atributelor din problema;

- Realizati diagrama dependentelor functionale;

- Realizati diagrama entitate asociere (DEA) pe baza dependentelor

functionale identificate.

Tema nr. 2

O firma are ca obiect de activitate comercializarea de produse (

achizitionare produse de la furnizorori, depozitarea lor si vanzarea lor catre

clienti).

Stiind ca:

-Marfurile sunt stocate in mai multe depozite si fiecare depozit are un singur

gestionar;

Page 19: Module 1-6 FoxPro

19

-Marfurile sunt achizitionate de la diversi furnizori in cantitati si preturi diferite

de la furnizor la furnizor;

-Pretul de vanzare al unui produs este unic si difera de pretul de achizitionare;

-Pentru fiecare produs se cunoaste stocul initial la inceputul perioadei,

Se cere:

1. Identificati multimea atributelor apartinand acestei aplicatii

informatice;

2. Elaborati matricea simplificata a dependentelor functionale;

3. Realizati modelul entitate asociere (MEA) pe baza dependentelor

functionale identificate.

Tema nr. 3

III. Baza de date a unei firme contine tabelele:

STOCURI (CodA(N6), DenA(C20), UM(C3), Stoc(N8.2)), Stocmin, Stocmax)

FURNIZORI (CodF(N4), NumeF(C25), Strada(C25), Oras(C20), Judet(C2),

TelefonF(N9), ContF(C12))

CLIENTI(CodCl(N4), NumeCl(C25), Strada(C25), Oras(C20), Judet(C2),

Telefon(N9), Cont(C12));

COMENZI(Nr-Cda(N10), CodF/CodCl(N4), CodA(N6), Achitat(C2),

Cantitate(N4), PretU(N6), Valoare (N(10), Data_Scadenta(D8))

Cheie externa: CodA pentru legatura cu tabela STOCURI

Cheia externa: CodF/CodCl pentru legatura cu tabela FURNIZORI/CLIENTI

Se cere:

- Trasati diagrama entitate asociere pentru aceasta BD;

- Analizati posibilitatea aparitiei unor anomalii

- Eliminati aceste anomalii

1.6. Tipuri de restricţii şi integritatea restricţiilor

O bază de date are proprietatea de integritate dacă datele conţinute în ea

respectă reguli certe numite restricţii de integritate. Ideal ar fi să avem un

SGBD care să aplice toate restricţiile de integritate. Dacă un SGBD poate să

aplice numai anumite restricţii de integritate atunci celelalte restricţii de

integritate trebuie să fie aplicate prin alte programe sau prin procedurile

manuale efectuate de utilizatorii SGBD-ului.

Restricţiile de integritate se pot împărţi în trei grupe:

a) restricţii asupra chei primare,

Page 20: Module 1-6 FoxPro

20

b) restricţii asupra integrităţii criteriului de adresare (restricţii de

integritate referenţială)

c) restricţii de integritate a domeniului.

a) O restricţie asupra cheii primare provine din definiţia unei chei

primare care spune că cheia primară trebuie să fie unică.

Restricţia de integritate a entităţii spune că cheia primară nu

poate fi nulă. Pentru o cheie compozită nici unul din atributele

individuale nu poate fi nul. Proprietăţile de unicitate şi nenul a unei chei

primare asigură că se poate referi (adresa) orice valoare dintr-o bază de

date prin specificarea numelui tabelei, numelui atributului şi valoarea

cheii primare.

b) Cheile externe stau la baza mecanismului de formare a legăturilor

dintre două tabele iar restricţiile de integritate referenţială asigură că

numai legăturile valide există.

O restricţie de integritate referenţială este o restricţie care

specifică că fiecare cheie externă nenulă dintr-o relaţie trebuie să

aibă un corespondent (o pereche) cu valoarea unei chei primare din

relaţia cu care este legată.

c) Un domeniu este un set de valori din care una sau mai multe coloane

iau valorile lor actuale.

Restricţiile de integritate ale domeniului sunt reguli specifice

pentru un atribut.

Prin alegerea unui tip de dată pentru un atribut se impune o

restricţie asupra unui set de valori acceptate pentru acel atribut. Se pot

crea reguli specifice de validare pentru un atribut prin delimitarea unui

nou domeniu inclus în primul. Pentru a defini un domeniu unui atribut

mai precis se pot exclude din ce în ce mai multe valori neacceptate

pentru acel atribut. Spre exemplu în tabela ŢĂRI se poate defini un

domeniu pentru atributul denumirea tarii astfel încât acesta să conţină

cel mult 25 de caractere.

I: Tipuri de restrictii:

1. a. Restrictii asupra cheii primare (cheia primara nu poate fi nula)

b. Restrictii de integritate a entitatii

2. a. Restrictii asupra cheilor externe (Fiecare cheie externa nenula dintr-o

relatie trebuie sa aiba un corespondent (o pereche) cu valoarea unei chei

primare din relatia cu care este legata)

b. Restrictie de integritate referentiala

Page 21: Module 1-6 FoxPro

21

3. a. Restrictii asupra domeniului de valori ale atributelor (Reguli de

validare pentru un atribut

1.7. Dependenţe şi determinări în mulţimea atributelor (câmpurilor)

Relaţiile (tabelele) sunt conectate prin legături. Atributele sunt de

asemenea conectate cu alte atribute. Fie tabela ŢARĂ_CULTURI descrisă prin:

ŢARĂ_CULTURI (Cod_tara, Nume_cultura, Cod_judet, Nume_judet,

Populatia, PU-Export, Cantitate)

Tabela ŢARĂ_CULTURI combină diverse atribute din tabelele ŢĂRI,

CULTURI şi POPULAŢIE.

De exemplu atributele Cod_tara, Cod_judet, Populatia sunt luate din

tabela TARI, atributele Nume_cultura şi Export sunt luate din tabela CULTURI

iar atributele Cod_tara, Nume_cultura şi Cantitate se regăsesc în tabela

PRODUCŢIE. De remarcat că în tabela TARA_CULTURI apare un nou atribut

Nume_judet iar cheia primară a acestei tabele este o combinaţie a atributelor

Cod_tara+Nume_cultură.

Se observă valoarea nulă atribuită atributului Cantitate pentru ţara

Andora (Cod_tara=AD). Dacă căutam în cele trei tabele putem vedea că nu

avem nici o înregistrare în tabela PRODUCŢII pentru ţara Andora. Totuşi în

tabela CULTURI_ŢĂRI se cere să existe o înregistrare cu numele culturii

deoarece ea face parte din cheia compozită a relaţiei. Dacă dorim ca statul

Andora să fie în tabela CUTURI_ŢĂRI trebuie să atribuim o cultură fictivă

pentru câmpul Nume_culturi pentru aceasta ţară (în acest caz cultura porumb).

În tabela TARA_CULTURI fiecare atribut este legat de alte atribute.

Spre exemplu valoarea câmpului Cod_ţară determină valoarea câmpului

Populaţie_ţară şi o valoare a câmpului Populaţie_ţară depinde de valoarea

câmpului Cod_ţară.

În limbajul utilizat în literatura de specialiate se spune “Cod_ţară

determină funcţional Populaţie_ţară” şi “Populaţie_ţară este funcţional

dependent de Cod_ţară”.

În acest caz Cod_ţară este numit un determinat. Un determinat este

un atribut, sau o colecţie de atribute, a cărui valori determină valorile altor

atribute. Se mai spune că atributul A este funcţional dependent de

atributul B dacă atributul B este un determinant pentru atributul A.

Aceste tipuri de relaţii de dependenţă şi relaţii de determinanţi se pot

reprezenta grafic printr-o diagramă cu buline. Diagramele cu buline se mai

Page 22: Module 1-6 FoxPro

22

numesc diagramele modelului de date sau diagramele de dependenţă

funcţională. În figura 10 se prezintă diagrama cu buline pentru tabela

TARA_CULTURI.

3

2

1

Fig. 7 - O diagramă cu buline pentru relaţia ŢARA_CULTURI

În această diagramă avem:

- Câmpul Cod_tara este un determinant pentru câmpurile

Populaţia_ţării, moneda, paritate;

- Câmpul Nume_cultură este un determinant pentru Export;

- Câmpul Cod_ţară este un determinat pentru câmpul Paritate.

Numai câmpul Cantitate este funcţional dependent de întreaga cheie

primară a relaţiei care este Cod_ţară+Nume_cultură.

Câmpurile Populaţie_ţară, Moneda, Paritate au o dependenţă parţială

deoarece ele sunt funcţional dependente de câmpul Cod_ţară care este numai o

parte din cheia primară.

O dependenţă parţială este o dependenţă funcţională faţă de o parte

a cheii primare în loc de întreaga cheie primară.

Există oare şi o altă dependenţă parţială în tabela CULTURI_STATE?

Da. Câmpul Export este dependent parţial de Nume_cultură.

Deoarece Cod_ţară este un determinat atât pentru câmpul Moneda cât şi

pentru câmpul Paritate iar câmpul Moneda este la rândul sau un determinant

pentru câmpul Paritate, câmpurile Moneda şi Paritate au o dependenţă

tranzitivă.

Cantitate

PU-export

Nume judeţ

Populaţie

Cod_judet Cod_tara

Nume cultura

Page 23: Module 1-6 FoxPro

23

O dependenţă tranzitivă este o dependenţă funcţională între două

atribute non-cheie care sunt ambele dependente de al treilea atribut.

Cum ştim ce dependenţe funcţionale există într-o colecţie de atribute şi

cum recunoaştem dependenţele parţiale şi tranzitive? Răspunsul depinde de

cererile pe care le formulăm pentru baza de date a aplicaţiei informatice.

Pentru fiecare atribut şi relaţie trebuie să definim precis atât semnificaţia

cât şi legăturile existente în cadrul aplicaţiei.

Studiul dedicat înţelegerii semnificaţiei datelor dintr-o bază de date şi a

legăturilor stabilite între ele, poartă numele Modelarea semantică a obiectelor.

Datele dintr-o aplicatie informatica cu baze de date intra intr-un

proces de modelare in care se parcurg etapele:

- Modelul conceptual al datelor;

- Modelul logic al datelor

- Modelul fizic al datelor

Tema nr. 1: In baza de date UZINA se memoreaza atributele:

Cod_Mat, Den_Mat, UM -Mat, Nr_Contract, Cod_Cl, Nume_Client,

Localitate-Cl, Cont_Cl, Nr-Contract, Data-Contract, Cantitate-Contract,

Cant-Livrata, PU-Contract, Nr-Livrare , Data-Livrare.

Se cere:

1. Creati si scrieti relatiile bazei de date utilizand metoda prescurtata;

2. Trasati diagrama entitate-asociere;

Tema 2:

Analizati sistemul obiect dintr-o universitate si stabiliti modelul datelor

acestui sistem informatic.

Observati dependentele partiale si dependentele tranzitive din DB:

1. Dependenta; 2. Dependenta partiala 3. Dependenta tranzitiva

1.8 Anomalii intalnite in proiectarea Tabelelor

Problemele de inconsistenta a BD se numesc anomalii:

Anomaliile sunt date de:

- datele redundante

- dependentele partiale

- dependentele tranzitive

EXEMPLE DE ANOMALII IN B.D.

Fie Tabela:

Page 24: Module 1-6 FoxPro

24

CLIENTI (CodCl, NumeCl, NumeCopil, CodFr,NumeFr, CodPet,

NumePet, Animal)

Tipuri de anomalii:

1. Anomalii de inserare: Nu se pot adauga inregistrari in tabela

deoarece nu stim Valoarea intregii chei primare

Ex: Cheie primara: CodCl,NumeCopil, NumePet

Nu putem insera o noua inreg. daca nu cunoastem valoarea intregii chei primare

2. Anomalii de stergere: Se sterg date dintr-o Tabela si neintentionat se

pierd date din aceea tabela.

Ex: Daca sterg CodCl= 812 deoarece Ionescu nu mai este Client se sterge

CodFirma si riscam sa nu mai stim NumeFirma.

3. Anomalii de actualizare: Nu putem schimba valoarea unui atribut

din cheia copozita – (daca schimbam valoarea unui atribut atunci BD devine

inconsistenta)

Ex: Daca schimbam CodCl=812 cu CodCl= 445 numai in unele inregistrari

atunci riscam ca sa avem un Client cu doua coduri

1.9 NORMALIZAREA - Ameliorarea succesiva a schemei

conceptuale a BD

Procesul de identificare si eliminare a anomaliilor se numeste

normalizarea BD.

Pentru proiectarea corecta a unei BD trebuie:

- sa intelegem dependentele functionale ale tuturor atributelor

- sa recunoastem anomaliile cauzate de datele redundante, dependentele

partiale si dependentele tranzitive;

- sa cunoastem modul in care se elimina aceste anomalii(normalizarea BD).

FORMA NORMALA 1 (FN1)

Fie tabela:

CLIENTI(CodCl, NumeCl, NumeCopil, CodFirma,NumeFirma,

CodPet, NumePet, Animal)

Deoarece fiecare inregistrare (intrare) trebuie trebuie sa contina o

singura valoare a cheii primare (CodCl), aceasta structura nu indeplineste

aceasta conditie.

Aceasta relatie se numeste nenormalizata.

Observam ca fiecare familie poate avea mai multi copii si mai multe

animale de casa.

Rezulta ca aceasta structura contine doua grupuri repetitive (NumeCopil

respectiv NumePet) care induc date redundante in tabel (anomalii).

Page 25: Module 1-6 FoxPro

25

O tabela (relatie/entitate) este in FN1 daca nu contine grupuri repetitive.

Aducerea unei relatii in FN1

Pentru a aduce o relatie in FN1 trebuie sa inlaturam grupurile repetitive

din relatie. Acest lucru se face prin expandarea cheii primare astfel incat ea sa

includa grupul repetitiv.

Observam ca grupul repetitiv NumeCopli este independent de grupul

NumeAnimal.

Executarea conversiei pentru fiecare grup repetitiv conduce la obtinerea

a doua tabele:

COPII(CodCl, NumeCopil, NumeCl, CodFirma, NumeFirma)

CLIENTI (CodCl, CodPet, CodFirma, NumeFirma, NumePet, Animal)

Cele doua relatii nu mai contin grupuri repetitive, insa ambele relatii au

anomalii de stergere si de actualizare

FORMA NORMALA 2 (FN2)

O relatie este in FN2 daca este in FN1 si nu contine nici o dependenta

partiala.

Eliminarea dependentelor partiale se face in doi pasi:

• - se identifica dependentele functionale pentru fiecare atribut

• - se creaza noi tabele si se plaseaza fiecare atribut intr-o tabela astfel

ca fiecare atribut sa fie functional dependent de intreaga cheie

primara.

Obs: O tabela in FN1 cu un singur atribut in cheia primara este automat in

FN2.

Aducerea unei tabele in FN2

Pas 1: Se observa ca cele doua relatii din FN1 contine cheia compozita

CodCl-NumeCopil respectiv CodCl, CodAnimal

Pas 2: Construirea de noi relatii astfel ca fiecare atribut sa fie functional

dependent de intreaga cheie primara.

Rezulta tabelele:

CLIENTI (CodCl, NumeCl, CodFirma, NumeFirma)

COPII(CodCl,NumeCopil)

Cheie externa: CodCl pentru legatura cu tabela CLINETI

ANIMALE (CodCl, CodPat, NumePat, Animal)

Cheie externa: CodCl pentru legatura cu tabela CLIENTI

Cele trei tabele nu mai contin acum dependente partiale, dar contin

dependente tranzitive:CodCl…CodFirma….NumeFirma

FORMA NORMALA 3 (FN3)

Page 26: Module 1-6 FoxPro

26

O relatie este in FN3 daca este in FN2 daca orice camp determinant este

un camp candidat la cheie primara.

Pentru a aduce o relatie in FN3 trebuie sa inlaturam atributele care

depind de determinantii care nu candideaza la cheie si sa plasam aceste atribute

intr-o noua relatie care are atributul determinant ca si cheie primara.

In tabela CLIENTI atributele CodCl…CodFirma…NumeFirma…sunt

tranzitive…si atunci transformam tabela CLIENTI in doua tabele care sa nu mai

contina atribute tranzitive:

Celelalte tabele nu contin atribute transitive

Rezulta: CLIENTI (CodCl, NumeCl, CodFirma)

FIRME( CodFirma, NumeFirma)

Cheie externa: CodFirma pentru legatura cu CLIENTI

COPII (CodCl, NumeCopil)

Cheie externa: CodCl pentru legatura cu tabela CLIENTI

ANIMALE(CodCl,CodPet, NumepPet, Animal)

Cheie externa : CodCl pentru legatura cu CLIENTI

Cele 4 tabele nu mai au anomalii

1.10 Etape in realizarea aplicatiilor informatice cu baze de date

1. Analiza cerintelor aplicatiei

2. Proiectarea aplicatiei si normalizarea bazei de date

3. Realizarea aplicatiei

4. Implementarea si exploatarea aplicatiei

În procesul de elaborare a unei aplicaţii informatice cu baze de date se

parcurg următoarele etape:

a) Analiza cerinţelor aplicaţiei

Orice aplicaţie informatică se proiectează pentru a răspunde cerinţelor

unui beneficiar. Procesul de analiză a cerinţelor începe cu înţelegerea corectă şi

completă a solicitărilor beneficiarului şi continuă cu analiza detaliată a

funcţiunilor sistemului analizat şi a modului de structurare a datelor. În urma

acestui proces rezultă punctele critice (problemele şi deficienţele) ale

sistemului existent, generate de regulă de redundanţa datelor, duplicarea

proceselor de prelucrare şi de timpul mare de răspuns datorat prelucrărilor

manuale. Aceste puncte critice ale sistemului existent trebuie să fie înlăturate prin

realizarea de aplicaţii informatice cu baze de date. În urma acestei etape rezultă

Page 27: Module 1-6 FoxPro

27

specificarea în detaliu a cerinţelor funcţionale şi a restricţiilor de realizare a

aplicaţiei informatice cu baza de date.

b) Proiectarea aplicaţiei

În această etapă se specifică componentele aplicaţiei: ieşiri, intrări,

baza de date, fluxul de informaţii, modulele aplicaţiei, proceduri de

încărcare, actualizare şi exploatare a bazei de date. În cadrul acestei etape

accentul cade pe proiectarea structurii bazei de date în scopul asigurării

eficienţei aplicaţiei, eficienţă raportată la criteriul cost-performanţe.

c) Elaborarea aplicaţiei

Modulele aplicaţiei informatice cu baza de date, definită în etapa de

proiectare, urmează să fie testate şi integrate în ansamblul aplicaţiei.

Dezvoltarea acestor module se face de regulă folosind fie limbajul de

programare oferit de SGBD-ul ales fie utilizând generatoarele de aplicaţii puse

la dispoziţie de acest SGBD.

d) Implementarea şi exploatarea aplicaţiei informatice

În cadrul etapei de implementare a aplicaţiei informatice cu baze de date

se disting următoarele faze:

- punerea în funcţiune a aplicaţiei, fază în care trebuie să se asigure

resursele hardware şi software necesare rulării aplicaţiei;

- încărcarea bazei de date şi testarea aplicaţiei în ansamblul ei;

- asigurarea condiţiilor de exploatare curentă a aplicaţiei la parametrii

prevăzuţi;

- adaptarea structurii bazei de date şi a aplicaţiei la dinamica

cerinţelor utilizatorilor, la schimbările tehnice şi organizatorice care

pot interveni.

Page 28: Module 1-6 FoxPro

28

MODULUL 2:

PREZENTAREA SGBD-ULUI FOXPRO

FOXPRO este un Sistem de Gestiune a Bazelor de Date (SGBD) de tip

relaţional. El este un instrument performant pentru toate aplicaţiile de gestiune

cu baze de date. Pentru a marca cateva date semnificative din evolutia

sistemului FOXPRO amintim ca la sfarsitul anilor ‟70 firma Asthon-Tate a

realizat produsl dBASE II care a constituit punctul de plecare al SGBD-urilor

din gama xBASE. In anii ‟80 se dezvolta produsul FOX , produs

pseudorelational dar deosebit de rapid, dezvoltat de catre firma Fox Software.

In anul 1991 apare FoxPro 2.0 care devine lider autoritar al produselor de acest

gen. In anul 1992, firma Fox Software este preluata de catre Microsoft, care a

dezvoltat versiunile 2.5 si 2.6 ale produsului FoxPro sub MS-DOS, Windows,

Mac si UNIX, utilizate pe microcalculatoare ca statii de lucru individuale sau in

retea locala LAN. In anul 1995, Microsoft lanseaza versiunea Visual Foxpro 3,

care a fost urmata in 1997 de versiunea 5 si in anul 1998 apare versiunea

Visual FoxPro 6 ca parte componenta a pachetului Visual Studio 6.0, alaturi de

alte produse de tip Visual ca: Basic, C++, Java++, InterDev. Toate aceste

produse ofera compilari rapide, depanare eficienta si interactiva, HTML ca

interfata pentru aplicatii tip multimedia si compatibilitate cu toate produsele din

pachetele VISUAL STUDIO si OFFICE precum si dezvoltarea aplicatiilor in

retea structurata pe trei nivele (date, procese, interfata utilizator). Evolutia

Sistemelor de Gestiune a Bazelor de date este prezentata schematic in fig. nr. 1.

2.1. Componentele funcţionale ale sistemului

Principalele componente funcţionale ale sistemului Foxpro sunt

următoarele:

Nucleul Foxpro, care conţine cele două limbaje ;

- de descriere a datelor (DDL);

- de manipulare a datelor (DML).

Pentru manipularea datelor FOXPRO pune la dispoziţia utilizatorilor:

- Comenzi pentru crearea, actualizarea, interogarea, listarea şi

întreţinerea bazelor de date ;

- Meniuri pentru gestionarea bazelor de date ;

Page 29: Module 1-6 FoxPro

29

Limbajul de programare FoxPro, un limbaj procedural care permite

crearea, actualizarea, interogarea, listarea şi exploatarea bazelor de

date;

Limbajul SQL, un limbaj neprocedural, care este standardul pentru

clasa limbajelor relaţionale şi care permite , de asemenea, crearea,

actualizarea şi interogarea bazelor de date.

Generatoarele sistemului, care permit, printr-un dialog interactiv cu

utilizatorul şi un efort minim de programare, realizarea unor module sau

aplicaţii complexe, cum sunt:

Figura nr 1 The evolution. Database Technologies

Generatorul de Rapoarte (REPORT WRITER) ;

Generatorul de Ecrane ( SCREEN BUILDER);

Data Collection and

Database creation (60‟s and earlier)

Database Management System (70‟s and early 80‟s)

Hierarchical DBMS

Relational Database Systems

Query Language: SQL, etc

Advanced Database Systems

(middle 80‟s - present)

Web-based Database Systems (90‟s

– present)

Web - Mining

Data Warehousing and Data Mining

(late 80‟s - present)

New generation of integrated information Systems (2000)

Page 30: Module 1-6 FoxPro

30

Generatorul de meniuri (MENU BUILDER);

Generatorul de Aplicaţii (Foxpro APPLICATION)

Generatorul de etichete (LABEL DESIGNER)

Generatorul de Proiecte (PROJECT MANAGER)

Generatorul de Interogări (RQBE/SQL)

FOXPRO dispune de un set de Instrumente pentru instruirea şi

asistarea utilizatorului (programul Tutorial al lui Foxpro, sistemul Help,

facilităţile de lucru cu programele tip Wizard, etc.);

Utilitarele sistemului Foxpro, care sunt specializate pentru realizarea

unor anumite funcţii, cum sunt :

Utilitarul pentru gestionarea fişierelor;

Utilitarul pentru formatarea programelor sursă;

Utilitarul pentru generarea documentaţiei.

FOXPRO are urmatoarele tipuri de Kituri:

Distribution Kit , care permite realizarea aplicaţiilor Foxpro şi livrarea

lor în format executabil (fişiere de tip .EXE), în variantele Runtime şi

Standalone.

Connectivity Kit, care permite realizarea de aplicaţii Client-Server prin

conectarea la un server Oracle, SQL.

Library Construction Kit, care permite utilizarea sau crearea

bibliotecilor de funţii C.

Trace /Debug, care permite programatorului să urmărească şi să

depaneze relativ uşor codul programului sursă, afişând într-o fereastră Debug

valorile expresiilor şi variabilelor de lucru utilizate, pe parcursul execuţiei

programului.

2.2. Lansarea şi modul de lucru sub SGBD Foxpro

Lansarea în execuţie a SGBD-ului Foxpro se poate face într-unul din

următoarele moduri:

sub Windows, se poziţionează indicatorul mouse pe iconul Foxpro

şi dublu click.

sub Windows 95...98 , 2000 se mai poate lansa în modul de lucru

obişnuit cu orice program, adică: Start, de aici se selectează

Programs şi apoi din lista afişată , click mouse pe numele

programului dorit – Foxpro.

Page 31: Module 1-6 FoxPro

31

Dacă totul decurge normal, Foxpro este încărcat în memorie şi se

prezintă utilizatorului afişând un ecran de forma:

Fig. 2. Ecranul principal FoxPro

Moduri de lucru in FoxPRO

Dupa lansarea produsului FoxPro utilizatorul poate lucra in urmatoarele

moduri: prin comenzi, prin meniuri ale sistemului, prin limbajul de programare

FOXPRO, prin generatoare automate, prin limbajul SQL, sau o combinatie a

tuturor acestor moduri de lucru.

Ecranul principal FoxPro contine o fereastra tip Microsoft (vezi fig. 2)

cu urmatoarele elemente:

- bara de titlu (cu numele produsului ) si butoanele de

minimizare,maximizarea ferestrei , iesirea de sub FoxPro;

- bara meniului sistem care contine un meniu orizontal cu optiunile de

lucru : File, Edit, View, Format, Tools, program, Windows, Help. La

selectarea unei optiuni apare un submeniu vertical, de unde se se

selecteaza optiunea dorita (in modul de lucru prin meniu sistem);

- bara de unelte care contine butoane dispuse orizontal , care sunt sau

nu active functie de starea curenta de lucru. Prin aceste butoane se

poate apela (pe o alta cale, prin modul de lucru prin meniu sistem) o

anumita optiune din sistem;

- fereastra de comanda care contine cursorul si care permite tastarea

unei comenzi sau apelul unui program (in modul de lucru prin

comenzi)

Page 32: Module 1-6 FoxPro

32

- bara de stare situata in partea de jos a ferestrei principale, unde se

afiseaza starea executiei curente. Bara lipseste daca a fost executata

comanda SET STATUS OFF;

- aria de iesire (formata din restul spatiului neocupata) este destinata

afisarii rezultatelor obtinute in urma executiei unei comenzi sau a

unui program.

Corespunzător imaginii de pe ecran, Foxpro permite utilizatorului mai

multe modalităţi de lucru, şi anume:

Modul de lucru prin Comenzi se desfasoara in fereastra de comanda

din ecranul principal. Aici se afla cursorul si utilizatorul poate lucra in stil

intrpreter sau in stil compilator.

Stilul interpreter, inseamna ca se tasteaza o comanda FoxPro si apoi se

apasa tasta Enter. Sistemul preia comanda , o interpreteaza si daca nu sunt erori

o lanseaza in executie. Rezultatul este afisat in aria de iesire din ecranul

principal. Daca se detecteaza o eroare la interpretarea comenzii, atunci se

afiseaza un mesaj explicativ si comanda trebuie corectata corespunzator.

Stilul compilator permite dezvoltarea programelor scrise in codul sursa

al limbajului FoxPro. Se apeleaza editorul de texte (MODI COMM) care ne

plaseaza intr-o fereastra specifica, unde se tasteaza codul sursa al aplicatioei, iar

la iesire (prin apasarea tastei CTRL/W) rezulat un fisier cu extensia .PRG. In

continuare se apleaza programul sursa ( DO nume) care este compilat, link-

editat si rulat. Pentru a obtine un fisier executabil (de tip .EXE) este nevoie de

componenta RUN TIME . Progamul executabil poate fi rulat pe orice tip de

calculator, sub sistemul de operare Windows, fara a mai fi nevoie de sistemul

FoxPro. Acest mod de lucru este dedicat îndeosebi specialiştilor,

programatorilor de aplicaţii Foxpro, care cunosc facilităţile şi performanţele

limbajului de programare Foxpro.

Modul de lucru meniu sistem – permite utilizatorului sa apeleze

toate instrumentele si intrfetele sistemului FoxPro. Acest mod de lucru se

recomanda utilizatorilor care prefera dezvoltarea aplicatiilor cu ajutorul

generatoarelor. Efortul depus pe aceasta cale este redus si nu se programeaza in

cod sursa. Optiunile de lucru sunt dispuse intr-un meniu principal orizontal si

fiecare genereaza un submeniu vertical, rezultand astfel un sistem de meniuri.

Observaţii:

1. Trecerea de la modul de lucru comanda la cel tip meniu este

echivalentă cu trecerea controlului de la fereastra de comenzi la meniul

principal şi invers. Acest lucru se realizează uşor prin intermediul tastei F10

sau efectuând un click mouse pe meniu sau în fereastra de comenzi.

Page 33: Module 1-6 FoxPro

33

Saltul de pe bara de meniu în fereastra de comenzi se poate face astfel:

- apăsând tasta F10 sau

- click mouse în fereastra de comenzi sau

- apăsând tasta Esc sau Alt

Saltul din ferestra de comenzi pe bara meniului principal se poate face

astfel:

- apăsând tasta F10 sau

- click mouse pe opţiunea dorită din meniu (sau pe oricare

dintre ele) sau

- apăsând tasta Alt sau

- apăsând tasta Alt şi litera “fierbinte” din opţiunea dorită

2. Ferestrele Foxpro pot fi deschise, închise, ascunse, mărite sau

micşorate (redimensionate), mutate, activate sau inhibate, dotate cu

posibilitatea de defilare a imaginii în interiorul lor, colorate sau desenate după

imaginaţia şi personalitatea programatorilor de aplicaţii sub Foxpro. Pentru

toate aceste operaţii, Foxpro pune la dispoziţia utilizatorilor o serie de comenzi

“de lucru cu ferestre”.

2.3. Tipuri de fişiere în FOXPRO

FOXPRO lucrează cu un mare număr de tipuri de fişiere dintre care

trebuie să reţinem pe cele mai importante:

Baze de date (DBF);

Fişier index multiplu (.MDX);

Fişier index simplu (.NDX);

Fişier catalog (.CAT);

Fişier cu viziuni (.VUE);

Fişier ecran (.SCR);

Program sau fişier de comenzi (.PRG);

Fişier de tip memo (.DBT);

Fişier format de raport (.FRM);

Fişier format de etichetă (.LBL);

Fişier de extracţie (.QBE);

Fişier de salvare (.BAK).

Pentru baza de date propriu zisă, cu extensia .DBF se va utiliza noţiunea

de bază de date , celelalte vor fi denumite fişiere.

Page 34: Module 1-6 FoxPro

34

2.4. Consideraţii generale privind comenzile Foxpro

O comandă Foxpro este o acţiune ce se cere a fi executată de SGBD-ul

Foxpro, prin intermediul limbajului pus de acesta la dispoziţia utilizatorului.

Sintaxa generală a unei comenzi Foxpro este:

<comandă> [<listă de expresii>] [<domeniu>] [FOR <condiţie>]

[WHILE <condiţie>]

unde:

<comandă> reprezintă un nume de comandă Foxpro;

- parantezele drepte indică aspectul de facultativ al elementului

nominalizat.în interiorul lor;

- parantezele unghiulare arată că trebuie să se precizeze valoarea

specifică elementului respectiv;

- bara oblică indică posibilitatea unei alegeri;

- <lista> reprezintă un grup de elemente separate de regulă prin virgulă;

- <domeniu> defineşte înregistrările asupra cărora se aplică comanda.

Asupra comenzilor Foxpro se fac următoarele precizări:

- Linia de comandă conţine o singură comandă Foxpro şi se încheie

prin acţionarea tastei Enter;

- Lungimea unei linii de comandă lansată în fereastra de comenzi sau

în program poate fi de maximum 254 caractere;

- Linia de comandă poate fi scrisă cu majuscule sau cu litere mici sau

cu orice combinaţie a acestora;

- Cuvintele cheie ale comenzilor Foxpro pot fi abreviate (prescurtate)

la cel puţin primele 4 caractere. Dacă se scriu mai multe caractere,

acestea trebuie să fie corecte.

- Cuvintele sunt separate prin unul sau mai multe spaţii.

- Foxpro dispune de o memorie tampon (numită şi istoricul

comenzilor), unde se păstrează ultimele comenzi transmise.

Vizualizarea comenzilor memorate în istoric se realizează prin

comenzile DISPLAY HISTORY şi LIST HISTORY.

Prin utilizarea tastelor direcţionale (cu săgeţi) se pot apela comenzile

anterioare. Astfel, fără a mai tasta din nou o linie de comandă anterioară, o

căutăm în fereastra de comenzi şi ne poziţionăm pe ea cu ajutorul tastelor cu

săgeţi, apoi apăsăm Enter. - Fiecare comandă Foxpro prelucrează în mod implicit un anumit tip de

fisier (Ex. Use , Copy - fişiere tip .DBF, Report form ... – fişier tip .FRM,

Modify command – fişier .PRG, etc). De aceea, în mod normal, utilizatorul va

Page 35: Module 1-6 FoxPro

35

specifica, atunci când se cere, doar numele fişierului, tipul acestuia fiind

automat gestionat de sistem. Dacă însă utilizatorul va specifica nume.tip pentru

fişierul cerut, atunci acesta va fi luat în considerare şi va trebui precizat de

fiecare dată când se face referire la fişierul respectiv.

Domeniul de acţiune al comenzilor Foxpro

Comenzile Foxpro de prelucrare a datelor au câte un domeniu de acţiune

implicit, care poate fi: fie înregistrarea curentă, fie toate înregistrările tabelei

active.

Acest domeniu poate fi modificat, astfel încât comanda să acţioneze asupra

domeniului dorit de utilizator, prin 2 metode:

a) Prin specificarea expresă a domeniului dorit, cu ajutorul

următoarelor cuvinte cheie:

Cuvinte cheie Semnificaţie

ALL Comanda acţionează asupra tuturor înregistrărilor din

tabela activă

NEXT n Comanda acţionează asupra următoarelor n înregistrări,

începând cu cea curentă, din tabela activă

RECORD n Comanda acţionează asupra înregistrării cu numărul n

(specificat) din tabela activă

REST Comanda acţionează asupra tuturor înregistrărilor rămase,

de la cea curentă şi până la sfârşit, din tabela activă

Se impun următoarele precizări:

- Pentru a avea acces la datele dintr-o tabelă, ea trebuie să fie mai întâi

deschisă. O tabele deschisă se numeşte activă.

- Se numeşte înregistrare curentă – înregistrarea supusă prelucrării la

un moment dat şi pe care se află pointerul tabelei .

b) Prin introducerea, în cadrul comenzii Foxpro, a unei expresii

condiţionale, cu ajutorul cuvintelor cheie FOR sau WHILE.

Comanda va putea avea astfel formatul:

- <comandă> FOR <condiţie>

În acest caz, comanda va acţiona asupra acelor înregistrări din tabela

activă (sau numai din domeniul specificat) pentru care condiţia

specificată este adevărată (are valoarea logică TRUE-adevărat).

Page 36: Module 1-6 FoxPro

36

- <comandă> WHILE <condiţie>

În acest caz, comanda va acţiona asupra înregistrărilor , atâta timp cât

condiţia specificată rămâne adevărată. Se observă că o astfel de

cerinţă poate fi utilă doar dacă înregistrările tabelei active sunt

grupate, ordonate după criteriul specificat în condiţie.

2.5. Elemente ale limbajului de descriere şi interogare a bazei de

date

Limbajul Foxpro utilizează următoarele elemente:

constante, variabile şi operatori

funcţii

comenzi

2.5.1. Constante

Constantele sunt entităţi cu valoare invariabilă, autodefinită. Foxpro

utilizează următoarele tipuri de constante:

- constante numerice ( ex. numere 7 5.4 -452.85);

- constante de tip şir de caractere, cuprise între ghilimele, apostroafe

sau paranteze drepte, ca delimitatori (exemplu: 'PROGRAM DE

GESTIUNE A STOCURILOR')

- constante logice cu valorile logice:

.T. (True), .Y. (Yes) - pentru Adevărat

.F. (False), .N. (No) - pentru Fals.

- constante de tip dată calendaristică, cuprinse între paranteze de tip

acoladă ca delimitatori ( ex 10/30/99)

2.5.2. Variabile

Sub SGBD-ul Foxpro, variabilele de memorie sunt de 2 tipuri:

- variabile de memorie create de utilizator

- variabile de memorie sistem

Variabilele create de utilizator pot fi:

câmpuri de date din înregistrările tabelelor active (create odată cu

tabelele şi descrise în structura acestora)

variabile de memorie (independente)

Variabilele de memorie sunt entităţi a căror valoare poate fi

modificată, servind pentru memorarea temporară a datelor. Spre deosebire de

Page 37: Module 1-6 FoxPro

37

câmpurile de date, care sunt descrise de utilizator la crearea tabelei, variabilele

de memorie se alocă şi se eliberează în mod dinamic, funcţie de natura şi

lungimea datelor memorate în ele.

Asemenea câmpurilor de date, variabilele se caracterizează prin cele 3

elemente de descriere:

- nume

- tip

- lungime

Numele variabilei serveşte pentru identificarea sa şi respectă regula

numelui de câmp de date, adică este un cuvânt alfanumeric, format din cel mult

10 caractere şi având primul caracter o literă. De regulă el sugerează conţinutul

informaţional al variabilei.

Tipul variabilei defineşte tipul datei memorate temporar. Ca şi

constantele şi câmpurile de date, ele pot fi de tip:

- numeric – memorează o dată numerică;

- şir de caractere – memorează orice combinaţie de caractere;

- logic – memorează o valoare logică de Adevărat sau Fals;

- dată calendaristică – memorează o dată calendaristică, sub formatul

standard american de LL/ZZ/AA;

- masiv – memorează date structurate sub forma unui tablou (definite

sub forma unui vector sau matrice).

Lungimea variabilei este dată de mărimea locaţiei de memorie alocată,

exprimată în număr de caractere. Spre deosebire de câmpurile de date din

tabele, a căror lungime este definită de proiectant, lungimea variabilelor de

memorie de tip numeric sau caracter este alocată automat, funcţie de lungimea

datei înscrise în ea. O variabilă de tip logic are automat lungimea =1, iar cea de

tip dată calendaristică lungimea =8.

Aceste variabile pot fi create cu comenzile ACCEPT, INPUT, WAIT,

STORE, COUNT, SUM, AVERAGE, CALCULATE, DECLARE, PRIVATE,

PUBLIC etc.şi pot fi salvate în fişiere de tip .MEM cu comanda SAVE .

Readucerea lor în memorie se face cu comanda RESTORE.

Pentru crearea structurilor de date de tip masiv pot fi folosite comenzile

DECLARE, DIMENSION, SCATTER.

Ştergerea sau eliberarea variabilelor de memorie se poate face atunci

când datele respective nu mai sunt necesare, cu comenzile CLEAR MEMORY ,

RELEASE.

2.5.3. Operatori

Principalele tipuri de operaţii efectuate sub Foxpro sunt:

Page 38: Module 1-6 FoxPro

38

- matematice

- de comparare

- logice

- pe şiruri de caractere

fiecărui tip corespunzându-i operatori specifici.

Astfel, operatorii matematici sunt:

+ adunare

- scădere

* înmulţire

/ împărţire

** ridicare la putere

() gruparea operaţiilor, dacă este cazul.

Ordinea de prioritate a acestor operatori în expresii este: ridicarea la

putere, înmulţirea şi împărţirea, adunarea şi scăderea.

Operatorii de comparare sunt utilizaţi pentru compararea expresiilor

de tip logic, caracter, numeric sau dată calendaristică. Cele două expresii

trebuie să fie de acelaşi tip, iar rezultatul va fi de tip logic, adevărat (.T) sau fals

(.F).

Operatorii de comparare sunt:

< mai mic

> mai mare

= egal

<> sau # diferit de

<= mai mic sau egal

>= mai mare sau egal

$ operator de subşir, cu următoarea definire: Dacă A şi B

sunt de tip caracter, A$B este adevărat, dacă A este

identic cu B sau A este inclus în B.

Operatorii logici sunt:

.AND. Şi logic

.OR. Sau logic

.NOT. Negare

() pentru gruparea operaţiilor în cadrul expresiilor

Ordinea de prioritate la evaluarea expresiilor este: .NOT., .AND., .OR.,

iar rezultatul este de tip logic.

Operatori pentru şiruri de caractere se utilizează pentru concatenarea

mai multor şiruri de caractere într- unul singur, astfel:

+ pentru concatenare cu menţinerea spaţiilor de la sfârşitul fiecărui

şir

Page 39: Module 1-6 FoxPro

39

- pentru concatenare cu eliminarea spaţiilor de la sfârşitul primului

şir,dacă există şi plasarea lor la sfârşitul şirului rezultat.

2.5.4. Expresii

O expresie se constituie din combinaţii de elemente din următoarea listă:

nume de câmpuri din structura înregistrărilor de date din tabela activă, variabile

de memorie, elemente de tablou, constante, funcţii, operatori, variabile de

sistem.

O expresie poate fi simplă sau complexă (compusă). Expresia complexă

este formată din mai multe expresii simple, legate între ele prin operatorii logici

AND, OR sau NOT.

2.5.5. Funcţii

Funcţiile sunt prelucrări predefinite, care pot fi utilizate în expresii,

asemănător operatorilor. O funcţie returnează întotdeauna o valoare, care

reprezintă rezultatul ei. După natura acestui rezultat, funcţiile pot fi de tip:

- numeric

- şir de caractere

- logic

- dată calendaristică.

Funcţiile cele mai utilizate sub Foxpro se pot grupa după cum urmează:

2.5.5.1. Funcţii destinate lucrului cu baze de date şi fişiere asociate:

ALLIAS() sau ALLIAS(expN)

Are ca rezultat alias-ul bazei de date deschise în zona de lucru

specificată sau, dacă expN lipseşte , alias-ul zonei de lucru curente.

DBF() sau DBF( <alias> )

Returnează numele tabelei de date deschisă în zona de lucru specificată.

Dacă nu există nici o tabelă de date deschisă, funcţia întoarce fişierul nul.

EOF() sau EOF ( <alias> )

Returnează valoarea logică True dacă este întâlnit sfârşitul de fişier şi

False în caz contrar. Ea este poziţionată pe valoarea logică de True dacă în urma

unei comenzi de căutare a unei anumite înregistrări (Locate, Find, Continue sau

Seek) înregistrarea căutată nu a fost găsită şi False în caz contrar. De aceea,

această funcţie se foloseşte în programe pentru a asigura utilizatorul dacă

Page 40: Module 1-6 FoxPro

40

înregistrarea căutată a fost găsită sau nu şi de asemenea pentru a controla ciclul

de parcurgere a unei întregi tabele de date.

FOUND() sau FOUND( <alias> )

Returnează valoarea logică True dacă ultima comandă CONTINUE,

FIND, LOCATE sau SEEK s-a încheiat cu succes, adică înregistrarea căutată a

fost găsită , iar în caz contrar întoarce valoarea False.

ORDER() sau ORDER( <alias> )

Returnează numele fişierului index activ din zona de lucru curentă.

Pentru a se obţine numele fişierului index master dintr-o zonă de lucru se

foloseşte opţiunea <alias>.

RECNO() sau RECNO( <alias> )

Returnează numărul înregistrării curente din tabela activă. Pentru a

obţine numărul înregistrării curente din tabela deschisă în altă zonă de lucru se

utilizează opţiunea <alias>.

SEEK() sau SEEK( exp,alias )

Returnează valoarea logică True dacă expresia căutată este găsită în

indexul activ. Dacă expresia căutată este găsită, pointerul înregistrării este

poziţionat pe înregistrarea găsită, iar în caz contrar funcţia întoarce valoarea

logică False şi pointerul este plasat la sfârşitul fişierului. Opţiunea <alias>

permite căutarea expresiei într-o tabelă deschisă în zona de lucru specificată.

DELETED() sau DELETED( <alias> )

Returnează valoarea logică True dacă înregistrarea curentă din zona

selectată sau din cea precizată cu <alias> este marcată pentru ştergere şi False

în caz contrar.

2.5.5.2. Funcţii destinate prelucrării datelor numerice:

CHR() sau CHR( <expN> )

Returnează caracterul al cărui cod zecimal este echivalent cu expN.

INT() sau INT(expN)

Returnează partea întreagă a exp N prin ignorarea părţii zecimale

(trunchiere).

ROUND() sau ROUND(exp1, exp2)

Page 41: Module 1-6 FoxPro

41

Rotunjeşte numărul specificat sau rezultat din evaluarea expresiei exp1

la un număr de zecimale specificat în exp2. Dacă exp2 este negativă, numărul

rotunjit va fi un număr întreg.

STR() sau STR(expN1, expN2, expN3 )

Converteşte o expresie numerică, specificată prin expN1 într-un şir de

caractere. Valoarea lui expN2 specifică lungimea şirului rezultat, iar expN3

specifică numărul poziţiilor zecimale (dacă este cazul). Această funcţie se

foloseşte ori de câte ori avem nevoie ca un câmp de date sau variabilă de

memorie de tip numeric să fie folosit în expresii de tip şir de caractere (cum ar

fi la formarea unei chei multiple de indexare sau la concatenarea mai multor

câmpuri pentru afişare, etc.)

2.5.5.3. Funcţii destinate prelucrării şirurilor de caractere

CTOD() sau CTOD(expC)

Returnează valoarea datei care corespunde argumentului de tip caracter,

în formatul dată calendaristică MM/DD/YY (Luna/Zi/An).

LOWER() sau LOWER(expC)

Converteşte toate literele mari din expC în litere mici corespunzătoare

(dacă există). Caracterele nealfabetice nu sunt afectate.

UPPER() sau UPPER(expC)

Converteşte toate caracterele alfabetice mici din expC în majuscule

(dacă există). Caracterele nealfabetice nu sunt afectate.

VAL() sau VAL(expC)

Converteşte o expresie de tip caracter care conţine cifre într-o valoare

numerică corespunzătoare. Practic, ea extrage primele caractere numerice din

expC , până la primul caracter nenumeric sau punct zecimal şi le transformă în

valoare numerică corespunzătoare. Dacă primul caracter al expC nu este cifră,

Val returnează valoarea 0.

SUBSTR( expC, Poz, Lungime)

Extrage din şirul specificat sau rezultat din evaluarea expC un subşir,

începând cu poziţia indicată prin Poz şi de lungime egală cu cea specificată prin

Lungime.

LTRIM (expC)

Page 42: Module 1-6 FoxPro

42

Returnează şirul de caractere specificat sau rezultat din evaluarea

expresiei date cu toate spaţiile din stânga şterse.( elimină spaţiile din stânga

şirului).

RTRIM (expC)

Returnează şirul de caractere specificat sau rezultat din evaluarea

expresiei date cu toate spaţiile din dreapta şterse.( elimină spaţiile din dreapta

şirului).

SPACE(expN)

Returnează un şir de atâtea spaţii câte au fost specificate prin expN.

2.5.5.4. Funcţii de tip dată calendaristică

CDOW(<expD>)

Returnează numele zilei săptămânii pentru expresia dată.

DATE()

Returnează data sistemului.

DTOC(<expD>[,1])

Returnează un şir conţinând data care corespunde argumentului, sub

formatul standard american LL/ZZ/AA (dacă nu au fost selectate alte opţiuni

prin comenzile Set Date şi Set Century). Transformă deci o dată calendaristică

într-un şir de caractere corespunzător. Clauza opţională 1 cere returnarea datei

în formatul AAAA/LL/ZZ, pentru a putea ordona înregistrările funcţie de dată.

DTOS(<expD>)

Returnează un şir conţinând data care corespunde argumentului, sub

forma aaaa/ll/zz..Această funcţie este utilă pentru indexarea tabelelor după un

câmp de tip dată calendaristică şi este echivalentă cu funcţia DTOC cu

argumentul opţional 1.

DMY (<expD>)

Returnează data calendaristică în formatul european zz/ll/aa.

MDY (<expD>)

Returnează data calendaristică în formatul standard american ll/zz/aa.

YEAR (<expD>)

Returnează anul din data specificată ca un număr de 4 cifre.

Page 43: Module 1-6 FoxPro

43

TIME()

Returnează ora curentă din sistem în formatul hh:mm:ss.

2.5.5.5. Funcţii financiare

FV(<depunere>,<dobândă>,<perioadă>)

Calculează valoarea viitoare a unei investiţii.

PAYMENT(expN1,expN2,expN3)

Calculează plata regulată cerută pentru amortizarea unui credit, unde

expN1 este valoarea iniţială a creditului, expN2 este dobânda iar expN3 este

numărul perioadelor.

PV(<expN1,expN2,expN3)

Returnează valoarea prezentă a unei investiţii sau suma care trebuie

investită pentru a atinge o anumită valoare viitoare. ExpN1 este plata facută în

fiecare perioadă, expN2 este dobânda, iar expN3 este numărul de perioade.

2.5.5.6. Funcţii cu caracter general

& Macrosubstituţia

Funcţia de macrosubstituţie este utilizată pentru specificarea unei

variabile de memorie în locul unei valori concrete aşteptate . Se utilizează în

comenzile FIND, USE, GO şi în alte comenzi care cer precizată o valoare.

Funcţia serveşte pentru a da un grad mai mare de generalizare a problemei

rezolvate (parametrizarea unor informaţii).

TRANSFORM(expr, expC)

Formează şiruri de caractere sau numere cu opţiuni PICTURE fără

folosirea comenzii @...SAY. Variabila sau câmpul care va fi formatat se

declară prin expr, iar expresia care conţine clauza PICTURE prin exprC.

TYPE (<exp>)

Returnează unul din caracterele N,C,L,D corespunzător tipului

rezultatului evaluării expresiei specificate.

USER()

Afişază numele utilizatorului conectat la sistemul protejat.

2.5.5.7. Funcţii utilizator

SGBD Foxpro permite utilizatorului să-şi definească funcţii proprii. O

funcţie constă dintr-o procedură care începe cu comanda FUNCTION şi care

returnează o valoare.

Page 44: Module 1-6 FoxPro

44

MODULUL 3

COMENZI FOXPRO PENTRU CREAREA SI

GESTIONAREA BAZEI DE DATE

3.1. Comenzi pentru crearea bazei de date

SGBDR-ul FoxPro permite crearea tabelelor unei baze de date

relationale in care se stocheaza structura si datele acestor tabele. Se prezinta in

continuare implementarea LDD in FoxPro.

CREATE DATABASE [ <nume_ baza_ de_ date>] | ?

unde:

- nume_ baza_ de_ date specifica numele bazei de date care va fi

creata. Fisierul bazei de date are extensia .DBC;

- ? afiseaza o fereastra de dialog in care se specifica numele

bazei de date care va fi creata.

3.1.1 Crearea tabelelor

Crearea unei tabele a bazei de date presupune definirea structurii sale şi

memorarea (salvarea) ei pe disc, urmată eventual şi de introducerea unui număr

de înregistrări de date. În Foxpro, structura tabelei – adică descrierea câmpurilor

de date ce compun înregistrările – este memorată chiar în tabelă, ca primă

înregistrare a acesteia. De aceea, ori de câte ori ne referim la o tabelă a bazei de

date, va trebui să avem în vedere cele două elemente componente : Structura şi

inregistrările de date.

Crearea unei tabele în FoxPro se poate face :

cu comanda CREATE sau

prin intermediul meniului, opţiunea NEW din submeniul FILE.

prin intermediul comenzii CREATE TABLE din nucleul SQL

Comanda CREATE are două formate, şi anume:

a) CREATE [nume_tabelă [.DBF]?]

Pentru câmpul numeric admite cel mult 20 poziţii (incluzând şi

caracterele pentru punct zecimal).

Pentru câmpul de tip caracter, lungimea maximă poate fi de 254

caractere.

Page 45: Module 1-6 FoxPro

45

b) CREATE TABLE nume_tabelă[.DBF] (nume_câmp1,tip(lungime,

[,nume_câmp2, tip(lungime),...] [FROM ARRAY nume_masiv

FROM nume_tabelă]

Comanda permite crearea structurii tabelei cu numele specificat direct

prin program, având descrierea câmpurilor de date specificată chiar prin

comandă. Dacă se precizează clauza FROM ARRAY , atunci descrierea

câmpurilor se preia din masivul cu numele respectiv, iar dacă se foloseşte

clauza FROM nume_tabelă atunci tabela care se crează va avea aceeaşi

structură cu cea existentă în tabela cu numele specificat după FROM.

Comanda COPY STRUCTURE TO permite crearea unei noi tabele, prin

copierea structurii sau a anumitor campuri dintr-o tabela activa in zona de lucru

curenta. Sintaxa comenzii este:

COPY STRUCTURE TO <nume_tabela> [FIELDS <lista_campuri>

[WITH ] CDX [WITH] PRODUCTION ]DATABASES

<nume_baza_de_date>[NUME <nume_tabela>]

Unde:

. <nume-tabela> este numele tabelei nou create

<lista_campuri> specifica campurile din noua tabela ;

<nume_baza_de_date> este numele bazei de date;

<NAME <nume_tabela>] este numele tabelei.

3.2. Comenzi pentru actualizarea conţinutului şi structurii bazei de

date

Actualizarea unei baze de date presupune o serie de acţiuni prin care

aceasta se întreţine corectă şi la zi . Având în vedere faptul că o tabelă a bazei

de date conţine practic două componente:

- Structura

- Datele (înregistrările de date)

actualizarea unei tabele va trebui să permită atât actualizarea structurii,

cât şi pe cea a datelor propriu-zise. De aceea vom trata diferit cele 2 categorii

de comenzi:

Comenzi pentru actualizarea structurii

Comenzi pentru actualizarea datelor

3.2.1. Comenzi pentru actualizarea structurii

Structura unei tabele, odată creată, va putea fi ulterior actualizată, prin

operaţii care să permită:

Page 46: Module 1-6 FoxPro

46

- Adăugarea unui nou câmp în structură, atunci când se constată o

asfel de necesitate;

- Modificarea descrierii unui câmp existent, în sensul schimbării

numelui său, a tipului sau chiar a lungimii, după caz;

- Ştergerea unui câmp din structură, atunci când acesta nu mai este

necesar.

Toate aceste operaţii sunt permise sub Foxpro printr-o singură comandă,

anume:

MODIFY STRUCTURE

Dacă în zona de lucru curentă există o tabelă de date deschisă, atunci

comanda se va referi la aceasta, altfel pe ecran va apare o fereastră de dialog

care va permite utilizatorului să-şi deschidă tabela dorită. Acesta va putea

actualiza apoi structura afişată pe ecran în regim interactiv. Ieşirea din editare

cu salvarea noii structuri pe disc se face fie cu tastele Ctrl/W , fie acţionând

butonul Save.

Precizăm că sistemul va aduce conţinutul tabelei la noua sa structură,

lăsând poziţionate pe valori nule câmpurile nou definite.

Structura unei tabele poate fi şi copiată simplu, dintr-o altă tabelă

existentă, cu comanda:

COPY TO nume_tabelă STRUCTURE [FIELDS nume_câmp1,

nume_câmp2..]

Ca efect, se copiază din tabela activă într-o tabelă cu numele specificat

întreaga structură sau numai câmpurile precizate prin clauza Fields. Practic, se

poate crea astfel o nouă tabelă pe baza structurii uneia existente.

Dacă se doreşte afişarea pe ecran a structurii tabelei active, se pot folosi

comenzile:

DISPLAY STRUCTURE [IN nr_zonă] [TO PRINTERTO FILE

nume_fis] [NO CONSOLE]

LIST STRUCTURE [IN nr_zonă] [TO PRINTERTO FILE

nume_fis] [NO CONSOLE]

unde:

- Nr_zonă specifică numărul zonei de lucru în care se află tabela

dorită

- To Printer solicită afişarea la imprimantă, iar To File precizează

numele fişierului de tip text în care să fie memorată structura tabelei,

în vederea afişării ei ulterioare sau a prelucrării ei cu un editor de

texte.

- No Console inhibă afişarea structurii la ecran

Page 47: Module 1-6 FoxPro

47

3.2.2. Comenzi pentru actualizarea conţinutului bazei de date

Actualizarea datelor unei tabele presupune operaţii de :

1. Adăugare de noi înregistrări

2. Modificarea unora dintre datele existente

3. Ştergerea înregistrărilor care nu mai sunt necesare

3.2.2.1. Comenzi pentru adăugare de noi înregistrări

Adăugarea se poate face în orice moment pentru o tabelă care a fost creată,

deci care conţine cel puţin structura definită. Adăugarea de noi date se poate face:

- fie după ultima înregistrare existentă în tabelă

- fie prin inserarea lor între înregistrările deja existente

Celor două posibilităţi le corespund comenzile APPEND şi INSERT.

Comanda APPEND are următoarele formate:

a) APPEND

Permite adăugarea de noi înregistrări la sfârşitul tabelei deschisă în zona

selectată, prin intermediul unei machete afişată pe ecran. Utilizatorul poate

adăuga una sau mai multe înregistrări, terminând precesul de adăgare fie cu

Ctrl/W, fie activând butonul Save.

b) APPEND BLANK

Adaugă automat, la sfârşitul tabelei active, o nouă înregistrare, vidă, care va

putea fi ulterior completată cu date prin comenzi de modificare, calcul sau

afişare formatată (Change, Browse, @ cu Say şi Get, Replace, etc).

c) APPEND FROM nume_fişier[.ext] [FIELDS <listă

câmpuri>]FOR <exp_logică>] [TYPE] [DELIMITED [WITH

TABWITH <delimitator>WITH BLANK DIF

FW2MODWKSSDFWK1WK3XLS]

Comanda adaugă, la sfârşitul tabelei active, înregistrări de date preluate

în mod automat din fişierul cu numele specificat. Dacă se doreşte preluarea

datelor doar din anumite câmpuri, atunci acestea vor fi precizate prin clauza

FIELDS. Clauza FOR permite selectarea şi deci preluarea din fişierul specificat

doar a acelor înregistrări care satisfac condiţia pusă.

Clauza TYPE defineşte tipul fişierului, dacă acesta nu este .DBF , ceea

ce înseamnă că este posibilă preluarea datelor într-o tabelă Foxpro din fişiere

create sub alte sisteme de gestiune sau limbaje de programare. Astfel, opţiunea

Page 48: Module 1-6 FoxPro

48

Delimited specifică delimitatorul dintre câmpurile înregistrării, ştiind că cel

implicit este virgula.

Tipurile specificate semnifică:

SDF – fişier format ASCII, cu înregistrări de lungime fixă şi terminate

prin CR şi LF.

WK1, WK3 – fişier format Lotus

FW2 – Frame Work II

MOD – MicroSoft Multiplan

WKS – foaie de calcul Lotus 1-2-3

XLS – Foaie de calcul MicroSoft Excel

d) APPEND FROM ARRAY <nume_tablou>

[FOR <exp_logică>] [FIELDS <listă câmpuri>]

Permite copierea, la sfârşitul tabelei active, a valorilor înscrise într-un

tablou cu numele specificat, în totalitate sau numai a acelora care

îndeplinesc condiţia pusă. Dacă sursa este un vector, se va adăuga o singură

înregistrare, iar dacă este o matrice, se vor adăuga atâtea înregistrări câte

linii are matricea. Dacă numărul de elemente ale vectorului sau numărul de

coloane ale matricei este mai mare decât numarul de câmpuri din structura

tabelei, atunci cele în plus vor fi ignorate, iar dacă este mai mic, câmpurile

rămase vor fi vide.

Comanda INSERT are formatul:

INSERT [BEFORE] [BLANK] Ea permite adăugarea unei/unor nou înregistrări prin inserarea ei după

înregistrarea curentă, dacă nu există Before şi înaintea acesteia cu opţiunea

BEFORE. Înregistrarea adăugată va fi completată de la tastatură, asemenea

adăugării cu Append, sau va fi automat completată cu câmpuri vide dacă s-a

precizat opţiunea BLANK.

3.2.2.2. Comenzi pentru modificarea datelor dintr-o tabelă

Modificarea datelor se poate face în regim interactiv, de la tastatură,

afişând câte o înregistrare pe ecran, cu ajutorul comenzilor :

- EDIT

- CHANGE

sau afişând un grup de mai multe înregistrări, cu comanda:

- BROWSE

sau, în mod automat, fără intervenţia utilizatorului, prin specificarea unei

valori sau reguli de calcul cu ajutorul comenzii :

Page 49: Module 1-6 FoxPro

49

- REPLACE.

Comenzile EDIT şi CHANGE au format şi acţiune asemănătoare, astfel că

le vom trata împreună; ele se prezintă astfel:

EDIT [FIELDS <listă câmpuri>] [ scope] [FOR <exp_logică>]

[WHILE <exp_logică>] [FREEZE câmp] [NOAPPEND] [NOMODIFY]

[NOCLEAR] [NODELETE] [NOOPTIMIZE] [NOWAIT] [ REST]

[SAVE] [TITLE nume_fer] [VALID exp] [ERROR exp_C] [WIDTH

exp_N] [ WINDOWS nume_fer IN SCREEN] [COLOR SCHEME

exp_C]

CHANGE [FIELDS <listă câmpuri>] [ scope] [FOR <exp_logică>]

[WHILE <exp_logică>] [FREEZE câmp] [NOAPPEND] [NOMODIFY]

[NOCLEAR] [NODELETE] [NOOPTIMIZE] [NOWAIT] [ REST]

[SAVE] [TITLE nume_fer] [VALID exp] [ERROR exp_C] [WIDTH

exp_N] [ WINDOWS nume_fer IN SCREEN] [COLOR SCHEME

exp_C]

Domeniul implicit de acţiune este înregistrarea curentă, pe care o

afişează pe ecran, pemiţând utilizatorului să modifice valorile din câmpurile

dorite. Semnificaţia clauzelor ce pot apare în formatul comenzii este

următoarea:

- FIELDS specifică numele câmpurilor care să fie afişate şi deci

disponibile pentru a fi modificate, dacă se doreşte acest lucru;

- Scope - precizează domeniul de acţiune dorit, altul decât

înregistrarea curentă;

- FOR specifică condiţia de selectare a înregistrărilor la care se

doreşte accesul pentru modificare, dacă este cazul;

- WHILE introduce condiţia ca această comandă să acţioneze doar

atâta timp cât ea este îndeplinită;

- FREEZE precizează câmpul unic care să poată fi modificat;

- NOAPPEND nu permite adăugarea de noi înregistrări cu ajutorul

acestei comenzi;

- NOMODIFY nu permite efectuarea de modificări ăn tabela activă

şi afişată;

- NOCLEAR nu permite marcarea înregistrărilor din tabelă pentru

ştergere;

- NOOPTIMIZE inhibă tehnologia Rushmore

- NOWAIT este folosită doar în programe, pentru a cere continuarea

execuţiei programului după ce fereastra de editare a fost deschisă;

Page 50: Module 1-6 FoxPro

50

- REST nu permite poziţionarea cursorului în tabela activă la

începutul acesteia;

- SAVE cere menţinerea ferestrei de editare pe ecran chiar după

ieşirea din editare;

- TITLE nume_fer specifică un titlu pentru fereastra de editare, dacă

se doreşte acest lucru;

- VALID exp [ERROR exp_C] face controlul condiţiei specificate

prin exp şi, dacă rezultatul este valoarea logică de True, atunci se

poate trece la o altă înregistrare, altfel se afişează mesajul specificat

prin clauza ERROR şi se aşteaptă corectarea valorii introduse;

- WIDTH exp_N stabileşte numărul limită de caractere cu care să fie

afişate câmpurile;

- WINDOWS nume_fer IN SCREEN face ca ferestra de editare să

fie deschisă într-o altă fereastră definită anterior cu numele specificat

sau direct pe ecran; Ecranul reprezintă valoarea implicită.

- COLOR SCHEME exp_C defineşte lista de culori pentru fereastra

de editare; Valoarea ei implicită este schema cu numărul 10.

Comanda BROWSE are formatul general:

BROWSE [FIELDS <listă câmpuri>] [ scope] [FOR <exp_logică>]

[WHILE <exp_logică>] [FREEZE câmp] [NOAPPEND] [NOMODIFY]

[NOCLEAR] [NODELETE] [NOOPTIMIZE] [NOWAIT] [ REST]

[SAVE] [TITLE nume_fer] [VALID exp] [ERROR exp_C] [WIDTH

exp_N] [ WINDOWS nume_fer IN SCREEN] [COLOR SCHEME

exp_C]

Trebuie menţionat faptul că, spre deosebire de Edit şi Change, comanda

BROWSE afişează pe ecran un grup de mai multe înregistrări, sub formă

tabelară. De aceea , ea se foloseşte adeseori şi ca o comandă de afişare a

datelor, având facilităţile de actualizare inhibate.

Comanda REPLACE permite modificarea valorilor din câmpurile

specificate în mod automat, prin precizarea valorii concrete sau a formulei de

calcul necesară, fără ca utilizatorul să mai introducă valori de la tastatură. Este

practic comanda care permite efectuarea de calcule în mod automat, în tabela

activă.

Formatul general al comenzii este:

REPLACE <câmp1> WITH <expr1> [ADDITIVE] [,<câmp2>

WITH <expr2> [ADDITIVE]]... [Scope] [FOR <exp_logică1>] [WHILE

<exp_logică2>] [NOOPTIMIZE]

Page 51: Module 1-6 FoxPro

51

Domeniul de acţiune implicit este înregistrarea curentă. Scope

precizează domeniul dorit pentru comanda Replace.

Practic , comanda înlocuieşte valoarea din câmp1 cu cea obţinută din

evaluarea expresiei expr1, valoarea din câmp2 cu cea din evaluarea expresiei

exp2, etc. Clauza ADDITIVE acţionează doar asupra câmpurilor de date de tip

Memo, indicând adăugarea valorii expresiei la conţinutul curent al câmpului.

Clauza FOR introduce condiţia de selectare a înregistrărilor ce vor fi

modificate, iar WHILE cere execuţia comenzii doar atâta timp cât condiţia este

îndeplinită.

3.2.2.3. Comenzi pentru ştergerea datelor dintr-o tabelă

Stergerea înregistrărilor dintr-o tabelă se face sub Foxpro în două etape,

şi anume:

- Stergerea logică , care presupune doar marcarea în vederea

ştergerii a înregistrărilor dorite. Acest lucru înseamnă că înregistrările marcate

continuă să existe în tabelă, atâta timp cât nu au fost eliminate fizic şi deci mai

pot fi recuperate, dacă este cazul. Ştergerea logică se face cu comanda

DELETE, iar anularea marcajului de ştergere se poate face cu comanda

RECALL.

- Ştergerea fizică înseamnă practic eliminarea din tabelă a

înregistrărilor care au fost marcate. Înregistrările şterse fizic nu mai pot fi

recuperate. Stergerea fizică se face cu comanda PACK.

Comanda DELETE are formatul general:

DELETE [Scope] [FOR <exp_logică1>]

[WHILE <exp_logică2>] [NOOPTIMIZE]

Domeniul implicit de acţiune este înregistrarea curentă. Clauza Scope

poate preciza domeniul dorit, iar FOR şi WHILE introduc condiţii de selectare a

înregistrărilor ce trabuie şterse. Marcarea pentru ştergere înseamnă practic

plasarea unui * în dreptul înregistrărilor de şters.

Comanda RECALL are un format asemănător, dar are ca efect

anularea marcajului de ştergere, dacă există. Ea poate fi folosită pentru

înregistrări care nu au fost încă şterse fizic.

RECALL [Scope] [FOR <exp_logică1>] [WHILE <exp_logică2>]

[NOOPTIMIZE]

Comanda PACK are formatul:

PACK [MEMO]

Page 52: Module 1-6 FoxPro

52

Comanda Pack elimină, din tabela activă, la o singură trecere, toate

înregistrările pe care le găseşte marcate pentru ştergere. Dacă se precizează

opţiunea MEMO, atunci se va şterge fişierul memo asociat tabelei (care are

acelaşi nume cu tabela, dar este de tip .FPT), dar nu şi înregistrările din tabela

curentă marcate pentru ştergere.

Alte comenzi de ştergere Comanda ZAP, al cărei format este acesta simplu, fără opţiuni,

realizează ştergerea fizică a tuturor înregistrărilor din tabela activă. Ea este

echivalentă succesiunii de comenzi:

DELETE ALL

PACK

dar este mai rapidă şi, în acelaşi timp mai riscantă.

Trebuie să remarcăm însă, că, după ştergerea fizică a înregistrărilor (cu

Zap sau Pack) tabela continuă să existe pe disc, conţinând numai structura sa.

Comanda DELETE FILE permite ştergerea, de sub sistemul Foxpro, a

unui fişier de orice tip existent pe disc. Formatul general al comenzii:

DELETE FILE [<nume_fişier[.DBF]>?]

Comanda şterge fişierul cu numele specificat sau pe cel ales din

fereastra de fişiere, dacă a fost folosită clauza ?. Tipul implicit de fişiere şterse

este tipul DBF, celelalte fiind necesar să fie precizate.

3.3. Comenzi pentru interogarea bazei de date

Interogarea bazei de date implică realizarea succesivă a două operaţii şi

anume:

regăsirea înregistrării sau înregistrărilor dorite;

afişarea lor pe ecran şi/sau imprimantă

Regăsirea unei/unor înregistrări într-o tabelă presupune căutarea, în

tabelă, a unei/unor anumite înregistrări, pentru care se cunoaşte:

a) fie numărul ei de ordine (pointerul)

b) fie valoarea unui câmp sau grup de mai multe câmpuri de date

a) Regăsirea unei înregistrări pentru care se cunoaşte numărul de

ordine în tabelă constă în simpla poziţionare pe înregistrarea dorită,

cu comanda GO sau GOTO.

Comanda GO (GOTO) are următoarele formate:

GO [RECORD] <exp_N1> [IN <exp_N2><exp_C>]

Page 53: Module 1-6 FoxPro

53

Ca efect, se realizează poziţionarea pe înregistrarea cu numărul

specificat sau rezultat din evaluarea expresiei exp_N1, din tabela deschisă în

zona curentă sau în cea specificată prin exp_N2 sau exp_C ( exp_N2 indică

zona, iar exp_C indică alias-ul tabelei deschisă).

GO TOP [IN <exp_N2><exp_C>]

Comanda realizează poziţionarea pe prima înregistrare (logică) din

tabela deschisă în zona curentă sau în cea precizată prin exp_N1 sau exp_C.

GO BOTTOM [IN <exp_N2><exp_C>]

Comanda realizează poziţionarea pe ultima înregistrare (logică) din

tabela deschisă în zona curentă sau în cea precizată prin exp_N1 sau exp_C.

De la înregistrarea astfel localizată , deplasarea relativă spre înainte sau

înapoi se poate face cu comanda SKIP, al cărei format este:

SKIP [ <exp_N1>] [IN <exp_N2><exp_C>]

unde exp_N1 specifică poziţia relativă în raport cu cea curentă, printr-un

număr sau o expresie numerică din evaluarea căreia se determină saltul.

Valoarea implicită este 1, indicând salt la înregistrarea următoare.

b). Regăsirea unei înregistrări pentru care se cunoaşte valoarea

unui/unor câmpuri de date se poate face în două moduri:

prin consultare în acces secvenţial

prin consultare în acces direct, dacă tabela este indexată

Consultarea în acces secvenţial constă în parcurgerea secvenţială a

tabelei active şi poziţionarea pe prima înregistrare care îndeplineşte criteriul

cerut. Ea se realizează cu comanda LOCATE, al cărei format este:

LOCATE FOR <exp_L1> [Scope] [WHILE <exp_L2>]

[NOOPTIMIZE]

Exp_L1 este o expresie de tip logic, simplă sau compusă prin care se

precizează câmpul sau câmpurile cu valorile cerute. Scope specifică, opţional,

dacă să se restrângă căutarea la un anume domeniu, iar WHILe poate cere să

continue căutarea cât timp este îndeplinită condiţia pusă.

Trebuie precizat că, dacă înregistrarea căutată nu a fost găsită, funcţia

EOF() este poziţionată pe valoarea logică de True, iar FOUND() pe valoarea

False şi invers. Aceste funcţii ne vor permite în programe să ne asigurăm de

existenţa înregistrărilor căutate.

Dacă se doreşte continuarea căutării unei eventuale următoare

înregistrări care îndeplineşte aceeaşi condiţie, atunci se poate utiliza comanda

CONTINUE. Ea funcţionează însă numai asociată cu LOCATE, pentru a

continua căutarea iniţiată de aceasta.

Page 54: Module 1-6 FoxPro

54

Consultarea în acces direct se poate face numai pentru tabele indexate

după câmpul sau combinaţia de câmpuri după care se doreşte căutarea. Ea se

face cu comenzile FIND şi SEEK , al căror format este :

FIND <expC>

SEEK <varC>

Comanda FIND caută în indexul tabelei active prima înregistrare cu

cheia specificată prin expC, în timp ce Seek aşteaptă să fie precizat numele

variabilei în care se află memorată valoarea cheii dorite. Căutarea se realizează

prin intermediul indexului şi este foarte rapidă. Dacă înregistrarea căutată a fost

găsită, funcţia EOF() este poziţionată pe False, iar FOUND() pe True şi invers.

Saltul la o eventuală următoare înregistrare care îndeplineşte aceeaşi condiţie se

poate face de data aceasta cu comanda SKIP (salt la următoarea înregistrare).

Cele două comenzi pot fi utilizate numai dacă tabela a fost deschisă

împreună cu un index.

3.4. Comenzi pentru afişarea bazei de date (vizualizarea

înregistrărilor)

Vizualizarea înregistrărilor se poate realiza pe ecran sau imprimantă,

parţial sau în totalitate, în mod secvenţial sau într-un format controlat de

utilizator. Forma cea mai rapidă, uşor accesibilă şi permanent la dispoziţia

utilizatorului este afişarea realizată cu comenzile LIST, DISPLAY, ? şi ??.

Cele două comenzi, LIST şi DISPLAY au formate şi acţiuni

asemănătoare, cu deosebirea că pe ecran List afişează înregistrările cu defilarea

continuă a imaginii, în timp ce Display opreşte imaginea după fiecare ecran

plin.

DISPLAY [FIELDS <listă_câmpuri>] [Scope] [FOR <exp_L1>]

[WHILE <exp_L1>] [OFF] [NOCONSOLE] [NOOPTIMIZE][TO

PRINTER TO FILE <nume_fis>]

LIST [FIELDS <listă_câmpuri>] [Scope] [FOR <exp_L1>]

[WHILE <exp_L1>] [OFF] [NOCONSOLE] [NOOPTIMIZE][TO

PRINTER TO FILE <nume_fis>]

unde:

- FIELDS precizează câmpurile de date din înregistrări care să fie

afişate; în lipsă, sunt afişate toate;

- Scope defineşte domeniul înregistrărilor ce trebuie afişate

- FOR introduce condiţia de selectare a înregistrărilor ce se vor afişa;

- WHILE introduce condiţia cât timp se va produce afişarea;

Page 55: Module 1-6 FoxPro

55

- OFF inhibă afişarea pe ecran a numarului de ordine al înregistrării

în tabelă;

- NOCONSOLE inhibă afişarea pe ecran sau în fereastra activă;

- NOOPTIMIZE dezactivează tehnica Rushmore.

- TO PRINTER direcţionează afişarea la imprimantă; în lipsă

afişarea se produce la ecran;

- TO FILE direcţionează afişarea către un fişier, unde se memorează,

pentru a fi listată la imprimantă ulterior.

Alte formate ale comenzilor LIST şi DISPLAY sunt:

LIST STATUS [NOCONSOLE] [TO PRINTERTO FILE

<nume_fis>]

DISPLAY STATUS [NOCONSOLE] [TO PRINTERTO FILE

<nume_fis>]

Aceste formate servesc pentru a afişa pe ecran , la imprimantă sau într-

un fişier informaţii de stare, cum sunt: numele tabelelor active în momentul

respectiv; fişierele index active; cheile de indexare ale fişierelor index; alias-

urile folosite; relaţiile între tabele; fişierele de tip program şi de tip memo

active; calea curentă, discul implicit; valorile parametrilor stabiliţi prin

comanda SET; setările ecranului,etc.

LIST MEMORY [LIKE <specif_fis>][NOCONSOLE] [TO

PRINTERTO FILE <nume_fis>]

DISPLAY MEMORY [LIKE <specif_fis>][NOCONSOLE] [TO

PRINTERTO FILE <nume_fis>]

Afişează pe ecran, la imprimantă sau într-un fişier, numele , tipul şi

valoarea tuturor variabilelor de memorie curente, lungimea lor în bytes,

numărul de bytes rămaşi disponibili.

LIST STRUCTURE [NOCONSOLE] [TO PRINTERTO FILE

<nume_fis>]

DISPLAY STRUCTURE [NOCONSOLE] [TO PRINTERTO

FILE <nume_fis>]

Acest format al comenzilor serveşte pentru afişarea structurii tabelei

active.

Comanda ? afişează, în mod normal la ecran, valoarea obţinută din

evaluarea expresiei specificate, cu salt la rând nou. . Formatul general este:

? <expresie>

Comanda ?? are format şi acţiune asemănătoare, numai că produce

afişarea în continuare, fără salt la rând nou. Formatul este:

Page 56: Module 1-6 FoxPro

56

?? <expresie>

Dacă se doreşte direcţionarea afişării către imprimantă, atunci aceasta

trebuie să fie mai înainte activată, printr-o comandă de forma:

SET PRINTER ON

Când se doreşte revenirea la ecran pentru comanda ? sau ??, se va

specifica o comandă de forma:

SET PRINTER OFF

Exemple:

Fiind dată tabela STUDENT, să se scrie secvenţele de comenzi prin care

se satisfac următoarele cerinţe:

1. Să se afişeze studenţii de la facultatea de Informatică.

USE STUDENT

LIST FOR FACULT=‟INF‟

sau, pentru a ne asigura că identificarea se face corect, indiferent de modul în

care au fost introduse datele în tabelă:

USE STUDENT

LIST FOR UPPER(FACULT)= ‟INF‟

2. Să se afişeze studenţii din facultatea de Informatică, anul II, grupa 620.

USE STUDENT

LIST FOR UPPER(FACULT)= ‟INF‟ AND AN1=1 AND GRUPA1=601

3. Să se afişeze la imprimantă studenţii născuţi în 30 noiembrie 1979.

USE STUDENT

LIST FOR DATAN={11/30/79} TO PRINT

4. Să se afişeze studenţii născuţi în anul 1980 (condiţie compusă).

USE STUDENT

LIST FOR DATAN>={01/01/80} AND DATAN<={12/31/80}

sau, utilizănd funcţiile Foxpro:

USE STUDENT

LIST FOR SUBSTR(DTOC(DATAN),7,2))=‟80‟

sau

LIST FOR val(SUBSTR(DTOC(DATAN),7,2)))=80

5. Să se identifice, pentru a fi corectată, înregistrarea corespunzătoare

studentului ZAVOI.

USE STUDENT

LOCATE FOR UPPER(NUME)=‟ZAVOI‟

EDIT

sau, în programe

USE STUDENT

LOCATE FOR UPPER(NUME)=‟ZAVOI‟

Page 57: Module 1-6 FoxPro

57

IF NOT EOF()

EDIT

ELSE

? „Înregistrarea cu studentul dorit nu există‟

ENDIF

6. Să se şteargă din tabela STUDENT toţi studenţii de la Informatică şi să se

creeze cu ei o tabelă separată numită INFORM.

USE STUDENT

COPY TO INFORM STRUCTURE

&Se copiază structura pentru INFORM

USE INFORM

&Se deschide noua tabelă INFORM

APPE FROM STUDENT FOR UPPER(FACULT)= ‟INF‟

&Se preiau datele din STUDENT

USE STUDENT

&Se deschide tabela STUDENT

DELETE FOR UPPER(FACULT)= ‟INF‟

&Se marchează pentru ştergere înreg.din STUDENT

PACK

&Se şterg fizic înregistrările din STUDENT

CLOSE ALL

&Se închid toate fişierele

7. Să se afişeze toate înregistrările marcate pentru ştergere din tabela

STUDENT.

USE STUDENT

LIST FOR DELETED()

8. Să se afişeze, pentru corecţii, toţi studenţii (băieţi) de la facultatea de

TURISM. Ne interesează în mod deosebit numele, marca, data naşterii şi

media.

USE STUDENT

EDIT FOR UPPER(FACULT)= ‟TURISM‟ AND UPPER(SEX)= ‟B‟

sau

USE STUDENT

EDIT FOR UPPER(FACULT)= ‟TURISM‟ AND UPPER(SEX)= ‟B‟

FIELDS MARCA, NUME, PRENUME, DATAN, MEDIA

&Se afişează doar câmpurile cerute

9. Să se recalculeze media de absolvire a studenţilor, ştiind că media existentă

se măreşte cu 0.50 pentru toţi cei care au media peste 5 şi devine 10 pentru

cei care aveau între 9 şi 10.

USE STUDENT

Page 58: Module 1-6 FoxPro

58

REPLACE MEDIA WITH 10 FOR (MEDIA>=9 AND MEDIA<=10)

REPLACE MEDIA WITH MEDIA+0.50 FOR MEDIA>5 AND MEDIA

#10

10. Ştiind că avem o tabelă PERS cu cîmpul SAL pentru salariul cuvenit, să se

calculeze noul salariu cuvenit după o indexare de 50%. (o mărire cu 50%)

USE PERS

REPL ALL SAL WITH SAL*1.5

sau

REPL ALL SAL WITH SAL+SAL*50/100

3.5. Comenzi pentru ordonarea înregistrărilor bazei de date

Se ştie că încărcarea datelor într-o tabelă poate fi făcută aleator, deoarece

Foxpro pune la dispoziţia utilizatorului comenzi prin care poate realiza

ordonarea acestora după unul sau mai multe criterii, uşor şi rapid.

Ordonarea (sortarea) datelor sub Foxpro poate fi făcută în două moduri:

ordonare fizică (sortare) , care constă în crearea unei alte tabele, în

care înregistrările din tabela curentă sunt fizic copiate şi dispuse în

ordinea cerută.

ordonare logică (indexare), care constă în crearea unei tabele de

index prin intermediul căreia se stabileşte ordinea de parcurgere a

înregistrărilor din tabela curentă, astfel încât ele să apară ordonate

după criteriul dorit, deşi, fizic, au rămas neschimbate.

Corespunzător celor două moduri, Foxpro pune la dispoziţie comenzile

SORT şi respectiv INDEX.

3.5.1. Comenzi pentru sortarea înregistrărilor

Comanda SORT are formatul general:

SORT ON <nume_câmp1> [/A/C/D], <nume_câmp2> [/A/C/D],...

[A/C/D] TO <nume_tabelă_sortată> [FIELDS <listă câmpuri>]

[FOR <expr_L>]

unde:

- nume_câmp1, nume_câmp2... reprezintă , în ordine, numele

câmpurilor după valorile cărora se doreşte ordonarea;

- /A cere ca ordonarea să fie Ascending (crescătoare); Ea este

implicită.

- /D cere ca ordonarea să fie Descending (descrescătoare);

Page 59: Module 1-6 FoxPro

59

- /C cere să nu se facă diferenţiere la sortare între literele mici şi cele

mari (pentru câmpuri de tip caracter);

- nume_tabelă_sortată este numele tabelei noi, de tip .DBF care se va

crea şi va conţine înregistrările ordonate.

- FIELDS precizează, dacă se doreşte acest lucru, lista câmpurilor de

date care să fie preluate în structura noii tabele;

- FOR introduce, opţional, condiţia de selectare a înregistrărilor ce se

vor sorta şi prelua în noua tabelă.

Pentru a avea acces la înregistrările ordonate, va trebui deschisă noua

tabelă creată.

Atunci când se cere ordonarea după mai multe câmpuri (chei de sortare)

trebuie să avem grijă, deoarece ea se justifică numai dacă există mai multe

înregistrări cu valori identice după prima cheie, eventual şi după a doua, etc.

3.5.2.Comenzi pentru indexarea unei baze de date

Ordonarea logică sau indexarea este procedeul de ordonare a datelor

cel mai indicat sub Foxpro, deoarece înlătură deficienţele sortării fizice, fiind

mai rapidă, necesitând un consum foarte mic de spaţiu disc şi asigurând

corelaţia permanentă între datele tabelei iniţiale şi modificările ulterioare.

Prin indexare nu este afectată tabela de date curentă şi nici nu se crează

o nouă tabelă de date, ci doar o tabelă index. Aceasta va memora doar adresele

înregistrărilor din tabela de date activă, astfel încât să permită parcurgerea lor în

ordinea cerută de cheia de indexare, deşi, fizic, au rămas neschimbate (ordonare

logică).

Orice tabelă poate fi ordonată logic dacă are asociată o tabelă index.

Pentru o tabelă de date se pot crea oricâte tabele index dorim, fiecare câmp de

date, subcâmp sau combinaţie de câmpuri putând servi drept cheie de indexare.

O cheie multiplă de indexare se poate constitui prin concatenarea

câmpurilor sau subcâmpurilor respective.

Tabela index, odată creată, va trebui să fie permanent în concordanţă cu

baza de date căreia îi este asociată, adică să preia toate corecţiile făcute. Dintre

tabelele index existente la un moment dat pentru o tabelă de date, numai cele

active se vor actualiza odată cu aceasta. Celelalte vor trebui puse de acord cu

tabela de date prin operaţia de reindexare sau refacere.

Dintre tabelele index active la un moment dat, doar una – şi anume

prima din comanda de deschidere – stabileşte ordinea de parcurgere a tabelei de

date. Ea se numeşte Index principal sau criteriu curent de ordonare.

Sub SGBD Foxpro , tabela index poate fi, după modalitatea de creare:

fişier individual, cu extensia .IDX

Page 60: Module 1-6 FoxPro

60

tabelă în cadrul unui fişier index multiplu, cu extensia .CDX

Fiecare tabelă se numeşte TAG şi se identifică în cadrul fişierului

multiplu printr-un nume, dat de utilizator la crearea sa.

Există, sub Foxpro, două tipuri de fişiere .CDX, şi anume:

a) Fişierul index multiplu structural, care:

are nume identic cu numele tabelei de date

se activează automat, odată cu activarea tabelei de date

este permanent activ, neputând fi dezactivat (deci poate prelua

automat corecţiile din tabela de date)

este permanent în concordanţă cu tabela de date, toate tabelele

lui fiind automat actualizate odată cu tabela de date (căci sunt

active)

b) Fişierul index multiplu nestructural, care:

are nume diferit de tabela de date

trebuie activat explicit, ca şi fişierele index individuale

se poate dezactiva în orice moment

odată activat, menţine active doar tabelele (tag-urile) pe care le

conţine.

Crearea unei fişier index individual se face cu comanda:

INDEX ON <expr_cheie> TO <nume_fis_index> [FOR <expr_L>]

[UNIQUE]

Crearea unui index multiplu se face cu comanda:

INDEX ON <expr_cheie> TAG <nume_tag> [OF

<nume_fis[.CDX]>] [ASCENDINGDESCENDING] [FOR <expr_L>]

[UNIQUE] [ADDITIVE]

Comanda crează o tabelă index inclusă într-un fişier index multiplu, care

este fie fişierul .CDX structural cu nume_tag, fie fişierul .CDX nestructural

specificat prin nume_fis din clauza OF. Tabela de index este un TAG cu

numele specificat.

În formatul comenzii opţiunile au semnificaţia:

- ON <expr_cheie> specifică cheia de indexare, care poate fi un

câmp, subcâmp sau concatenare de câmpuri

- FOR introduce condiţia de selectare a înregistrărilor ce se vor indexa

- ASCENDINGDESCENDING specifică modul de ordonare

(crescător sau descrescător)

- UNIQUE cere valori unice pentru fiecare valoare a cheii de

ordonare. Dacă se încearcă introducerea mai multor valori identice,

doar prima dintre ele va fi preluată, celelalte fiind ignorate;

Page 61: Module 1-6 FoxPro

61

- ADDITIVE precizează că fişierele index deschise anterior rămân în

continuare deschise.

O tabelă poate avea asociaţi indecşi de orice tip, alegerea acestora ţinând

de complexitatea aplicaţiei, de numărul de fişiere index ce trebuie să fie

permanent deschise şi, în legătură directă cu aceasta, de sistemul de operare

utilizat.

Activarea unei tabele index existente se poate face, în orice moment,

în mod implicit chiar prin comanda de indexare INDEX ON sau, în mod

explicit, astfel:

a) odată cu deschiderea tabelei de date, cu comanda:

USE <nume_tabelă> [IN <zonă_lucru>] [ALIAS <nume_alias>]

[INDEX f1,f2,...] [ORDER <nume_tabelă_index>] [ORDER TAG

<nume_tag>] [EXCLUSIVE] [NOUPDATE]

Ca efect, se deschide tabela cu numele specificat, în zona curentă sau în

cea specificată prin zonă_lucru împreună cu toţi indecşii din clauza INDEX şi

se stabileşte drept index principal cel indicat prin clauza ORDER.

Precizăm că acesta este de fapt formatul general de deschidere a unei

tabele de date.

b) printr-o comandă specială de activare, valabilă pentru tabela de date

curentă, cu comanda:

SET INDEX TO f1,f2,... [ORDER <nume_tabelă_index>] [ORDER

TAG <nume_tag>]

Ca efect, se deschid indecşii precizaţi prin f1,f2, iar dintre aceştia se

specifică indexul principal, care dictează ordinea de parcurgere a înregistrărilor

din tabela de date.

Stabilirea indexului principal asociat tabelei de date active se poate

face şi separat, printr-o comandă de forma:

SET ORDER TO <nume_tabelă_index> [IN <zonă_lucru>]

sau

SET ORDER TO TAG <nume_tag> [IN <zonă_lucru>]

[OF <nume_fis>]

Reactualizarea (refacerea) unei tabele index se poate face , atunci când

este necesar, cu comanda:

REINDEX

Page 62: Module 1-6 FoxPro

62

Comanda reconstruieşte toate tabelele de index active la momentul

respectiv, asociate cu tabela de date; este folosită pentru a actualiza tabelele de

index care nu au fost actualizate împreună cu tabela de date.

3.6. Comenzi pentru deschiderea şi închiderea tabelelor. Zone de

lucru

Se ştie că, pentru a fi prelucrată, o tabelă trebuie să fie activă (deschisă).

În mod normal, fără alte precizări, Foxpro lucrează cu o zonă de lucru şi

permite deschiderea unei singure tabele. În acest caz, orice comandă de

deschidere a unei noi tabele atrage după sine închiderea automată a celei

anterior deschise.

De aceea, atunci când mai multe tabele trebuie să se afle în acelaşi timp

active, sistemul Foxpro permite acest lucru, cu condiţia ca ele să fie deschise în

zone de lucru diferite. Precizăm deasemenea, că orice comandă Foxpro vom da,

ea se va referi la tabela din zona selectată sau specificată în mod expres prin

comandă.

Am văzut deja comanda de deschidere a unei tabele prezentată la

INDEX, şi anume:

USE <nume_tabelă> [IN <zonă_lucru>] [ALIAS <nume_alias>]

[INDEX f1,f2,...] [ORDER <nume_tabelă_index>] [ORDER TAG

<nume_tag>] [EXCLUSIVE] [NOUPDATE]

unde:

zonă_lucru reprezintă un număr cuprins între 1 şi 25 , numărul maxim

de zone şi deci de tabele ce pot fi folosite simultan.

Idenficarea unei zone se poate face deci prin numărul asociat sau printr-

o literă de la A la J (suficiente numai dacă se lucrează cu cel mult 10 zone de

lucru).

Comutarea de la o zonă la alta şi deci practic de la o tabelă la alta , se va

face în orice moment cu comanda :

SELECT <număr_zonă><nume_zonă>

După această comandă, orice comandă de prelucrare a tabelei care

urmează, se va referi la tabela deschisă în ultima zonă selectată.

Deasemenea, o tabelă poate fi referită prin numele său, sau printr-un alt

nume, de regulă mai scurt, numit ALIAS, care rămâne valabil numai pe

parcursul programului respectiv.

Închiderea unei tabele se poate face cu comenzile:

USE – închide tabela din zona curentă de lucru

CLOSE ALL – închide toate fişierele, din toate zonele de lucru

Page 63: Module 1-6 FoxPro

63

CLOSE DATABASES – închide tabelele de date deschise

Deschiderea unei tabele poate fi făcută şi prin intermediul meniului,

activând opţiunea OPEN din submeniul FILE şi alegând ca tip de fişier pe cele

de tip baze de date (.DBF).

Exemple USE PERS

LIST - afişează toate înregistrările din tabela Pers

USE PONTAJ

LIST - afişează toate înregistrările din tabela Pontaj

sau:

SELECT 1

USE PERS

SELE 2

USE PONTAJ

LIST - afişează toate înregistrările din tabela Pontaj (ultima selectată)

SELE 1

LIST - afişează toate înregistrările din tabela Pers, căci e activă zona1

USE - închide tabela deschisă în zona 1, deci PERS

3.7. Comenzi pentru stabilirea legăturilor dintre tabelele bazei de

date

Se ştie că o bază de date este alcătuită din mai multe tabele de date, între

care se stabilesc relaţii, legături.

De cele mai multe ori, utilizatorul are nevoie să-şi preia date din mai

multe tabele simultan, tabele între care trebuie să fie definite relaţiile, pe baza

câmpurilor comune.

Realizarea relaţiilor între 2 tabele se face cu comanda SET RELATION

TO, după un câmp de date comun, parcurgând următorii paşi:

a) Se deschide tabela principală. Ea poate fi ordonată, indexată după

câmpul comun.

b) Se deschide, într-o altă zonă de lucru, tabela secundară, care trebuie

să fie în mod obligatoriu indexată după câmpul comun. Se înţelege

că se activează indexul corespunzător câmpului comun sau se

indexează acum după acest câmp

c) Se cere execuţia comenzii SET RELATION TO, al cărei format

este:

SET RELATION TO <expr>

Page 64: Module 1-6 FoxPro

64

INTO <număr_zonă/nume_tabelă> [ADDITIVE] [,<expr2> INTO

<număr_zonă/nume_tabelă> [ADDITIVE] ...]

unde:

expr este numele câmpului comun, după care se stabileşte legătura.

număr_zonă este numărul zonei în care a fost deschisă tabela secundară

nume_tabelă este numele tabelei secundare, cu care se face relaţia

ADDITIVE este o clauză opţională, utilizată dacă se realizează o

joncţiune pe mai multe tabele.

Exemplu Se dau 2 tabele, PERS şi PONTAJ. şi se ştie că fiecare om are un pontaj

corespunzător. Câmpul de legătură între tabele este NUME.

Să se afişeze numele fiecărei persoane şi numărul de ore lucrate (cămpul

OREL din PONTAJ).

SELE 1

USE PERS

SELE 2

USE PONTAJ

INDEX ON NUME TAG NUME

SET ORDER TO TAG NUME

SELE 1

SET RELATION TO NUME INTO PONTAJ

DO WHILE NOT EOF()

? PERS.NUME

?? ” “

?? PONTAJ.OREL

SKIP

ENDDO

CLOSE ALL

Exemplu:

SELE A

USE PERS

PERS.nume sau A.NUME sau A->NUME

Renunţarea la o relaţie se poate face în orice moment cu comanda :

SET RELATION OFF INTO <nume_tabelă>

Page 65: Module 1-6 FoxPro

65

3.8. Comenzi pentru lucru cu variabile de memorie

Variabilele de memorie se alocă şi se eliberează dinamic, în orice

moment al sesiunii de lucru, prin comenzi corespunzătoare. Alocarea unei

variabile se face automat, de tipul şi lungimea valorii care se memorează în ea.

Comenzile de lucru cu variabile de memorie pot fi grupate astfel:

a) Atribuirea (scrierea) unei valori într-o variabilă de memorie se face

cu comenzile de forma:

STORE <expresie> TO <nume_var>

sau

<nume_var>=<expresie>

Ca efect se alocă variabila cu numele specificat, de tipul şi lungimea

valorii rezultate din evaluarea expresiei specificate.

Variabila va fi deci de tip caracter, numeric, logic sau dată

calendaristică, funcţie de tipul expresiei specificate.

Exemplu:

STORE “ABC” to var1 var1 de tip caracter

STORE 1247 to var2 var2 de tip numeric

var3=17.5 var3 de tip numeric

var4=15*var3 var4 de tip numeric

var5=.F. var5 de tip logic

var6={10/29/98} var6 de tip dată calendaristică

b) Introducerea unei valori de la tastatură într-o variabilă de

memorie se face cu comenzile INPUT, ACCEPT sau WAIT, care se

aseamănă ca format şi funcţiuni, având mici deosebiri. Formatul

general este:

ACCEPT [“mesaj”] TO <nume_var>

INPUT [<expresie>] TO <nume_var>

WAIT [“mesaj”] TO <nume_var>

Cele trei comenzi afişează pe ecran mesajul specificat sau rezultatul

obţinut din evaluarea expresiei şi apoi aşteaptă ca utilizatorul să introducă de la

tastatură o valoare (terminată prin Enter).

Valoarea tastată va fi scrisă în variabila cu numele specificat, care acum

se alocă automat (nu trebuie să existe definită anterior).

Page 66: Module 1-6 FoxPro

66

Deosebirile dintre comenzi sunt:

- ACCEPT defineşte variabila în mod automat de tip caracter,

indiferent de natura datelor introduse. Se foloseşte pentru valori

introduse de la tastatură de tip caracter, deoarece nu mai necesită

demarcarea şirului între “ “( e mai rapidă).

- INPUT analizează natura datelor introduse şi declară variabila

funcţie de această natură: de tipul Caracter, Numeric, Logic sau Dată

calendaristică. Comanda e mai lentă căci necesită demarcarea

datelor între delimitatorii cunoscuţi, cu excepţia celor de tip numeric

sau a expresiilor de calcul ce vor fi mai întîi evaluate. Se recomandă

pentru date numerice.

- WAIT seamănă cu ACCEPT, cu deosebirea că alocă în mod

automat variabila de lungime=1 şi deci nu mai aşteaptă apăsarea

tastei Enter la sfârşitul introducerii datei. Este deci mult mai rapidă,

dar poate fi folosită pentru date de tip caracter şi lungime suficientă

de un caracter.

c) Extragerea de informaţii statistice dintr-o tabelă de date, cu

memorarea lor sau nu în variabile de memorie

Dacă o bază de date a fost creată, formată din mai multe tabele de date

cu legături între ele, atunci ea va putea servi adeseori furnizării unor informaţii

detaliate sau sintetizate, sub formă de liste, tabele, rapoarte, simple valori

rezultate din însumări, calcule matematice, statistice, etc.

Comenzile care ne permit astfel de prelucrări permit memorarea, dacă

dorim, a rezultatelor obţinute, în variabile de memorie al căror nume îl specifică

utilizatorul şi care nu trebuie să existe anterior definite.

Dintre aceste comenzi enumerăm:

COUNT [Scope] [FOR <exp_L>] [WHILE <exp_L>]

[TO <nume_var>]

Comanda numără înregistrările care îndeplinesc condiţia specificată prin

FOR sau WHILE, eventual numai din domeniul specificat prin Scope.

Rezultatul numărării este memorat în variabila cu numele precizat, care se alocă

acum şi va fi de tip numeric.

SUM [<listă_câmpuri/expresii>] [Scope] [FOR <exp_L>]

[WHILE <exp_L>] [TO <listă_var>]

Comanda însumează valorile din câmpul, câmpurile sau expresiile în

care intervin câmpuri din tabela activă pentru toate înregistrările (dacă nu e

Page 67: Module 1-6 FoxPro

67

precizat un domeniu), sau numai pentru înregistrările din domeniul specificat

prin Scope sau numai pentru acelea care îndeplinesc condiţia introdusă prin

FOR sau WHILE. Rezultatul însumării este afişat pe ecran, în mod poziţional,

eventual fiind memorat şi în variabilele specificate după TO.

Dacă nu se specifică câmpurile de date ce trebuie însumate, comanda va

însuma automat valorile din toate câmpurile numerice şi le va afişa poziţional

pe ecran.

AVERAGE [<listă_câmpuri/expresii>] [Scope]

[FOR <exp_L>] [WHILE <exp_L>] [TO <listă_var>]

Comanda este asemănătoare cu SUM, numai că ea calculează media

aritmetică a valorilor specificate din înregistrările selectate.

Apelată din meniul principal, comanda afişează o fereastră de forma:

CALCULATE [<listă_câmpuri/expresii>] [Scope]

[FOR <exp_L>] [WHILE <exp_L>] [TO <listă_var>]

Comanda funcţionează ca şi SUM şi AVERAGE, calculând valoarea

expresiilor specificate, permiţând în plus, şi evaluarea unor funcţii, cum ar fi:

CALCULATE MAX(val) to mval

CALCULATE AVG(val) to aval

d) Sintetizarea tabelelor de date se face cu comanda TOTAL, al cărei

format este:

TOTAL TO <nume_tabelă> ON <expresie_cheie>

[FIELDS <listă_câmpuri>] [Scope] [FOR <exp_L>]

[WHILE <exp_L>]

Tabela de date sursă trebuie să fie activă şi ordonată după câmpul

indicat prin cheie. Comanda permite însumarea valorilor numerice, sau doar a

celor specificate prin clauza FIELDS , pe grupe de înregistrări cu aceeaşi

valoare a cheii. Rezultatele obţinute se depun în tabela destinaţie al cărei nume

s-a precizat prin TO nume_tabelă. Se crează deci o tabelă destinaţie, în care, va

exista câte o singură înregistrare cu totalurile calculate la nivelul fiecărei valori

a cheii de ordonare Tabela rezultată va fo sortată după câmpul cheie.

Operatorul relaţional de proiecţie în FoxPro este implementat prin

comanda COPY TO care copiază date în mod selectiv dintr-o tabela curentă în

alta tabelă rezultată.

Sintaxa comenzii este:

Page 68: Module 1-6 FoxPro

68

COPY TO <nume_fis> [DATEBASE <nume> [FIELDS

<lista_câmpuri>][<domeniu>[FOR <expL1>][WHILE <expL2>][[WITH]

CDX][WITH NOOPTIMIZE][TYPE][WITH BLANK ]

Unde: <nume_fis> = numele fişierului (tabelei) care va rezulta;

FIELDS …. Specifică atributele (câmpurile) care vor fi copiate în noua tabelă;

<domeniu> indica înregistrările care vor fi copiate;

FOR/WHILE ….copiază înregistrările care satisfac conditia data de

expL1>/<expL2>

Exemplu: Să se realizeze o proiecţie din tabela CONTRACTE în tabela

PRODUSE după câmpul CODP. (Se cere deci o selectare acodurilor de produse

care au făcut obiectul contractelor cu beneficiarii).

USE CONTRACTE

INDEX ON CODP TO P1 UNIQUE

COPY TO PRODUSE FIELDS CODP

Comanda JOIN implementeaza operatorul relaţional de joncţiune, dintre

doua tabele care au cel puţin un câmp comun, rezultând o noua tabela.

Sintaxa comenzii este:

JOIN WITH <tabela secundara> FOR <conditie> [FIELDS <lista-

campuri> [NOOPTIM]

Pentru a se face joncţiunea, una din tabele trebuie deschisă într-o zonă

de lucru curentă, iar tabela secundară într-o alta zonă.

Exemplu:

Să se realizeze joncţiunea între tabelele CONTRACTE şi PRODUSE

astfel încât să rezulte o nouă tabelă care să continue informaţii despre produsele

din nomenclator care fac obiectul contractelor din evidenţa curentă. Tabela

rezultată se va numi CONTRPROD.DBF

SELECT A

USE PRODUSE INDEX IP_CODP

SELECT B

USE CONTRACTE INDEX IC_CODP

JOIN WITH PRODUSE TO CONTRACTE FOR CODP=A.CODP;

FIELDS CODP, PRODUSE.DENP, PRODUSE.UMP;CODB, CANTL,

PLN,CL

USE CONTRPROD

LIST.

Page 69: Module 1-6 FoxPro

69

Aplicaţii rezolvate:

APLICATIA 1:

Fie baza de date cu evidenta creditelor acordate de filiala unei banci, cu

urmatoarea structura:

BANCA (SUCURSALA C(10), BENEFICIAR C(15), VAL_CREDIT N(8),

VAL_ACHIT N(8), TERMEN N(2), DATA_ACORDARII D)

Cerinte:

- 1. Sa se introduca 8 inregistrari

- 2. Sa se caute beneficiarii cu numele “Popa”

- 3. Sa se afiseze beneficiarii care au de achitat creditul in mai putin de 24

luni

- 4. Sa se verifice daca la sucursala Militari sunt acordate credite mai mari

de 500.000 lei. Sa se afiseze numarul curent al primei inregistrari gasite

si continutul acesteia

- 5. Sa se caute beneficiarii care nu au achitat nici o suma si sa se afiseze

- 6. Sa se afiseze beneficiarii care au achitat mai mult de jumatate din

credit, de la sucursala Titan

- 7. Sa se steargă logic toți beneficiarii care au achitat creditul

- 8. Sa se afiseze toti beneficiarii cu Val_credit mai mica de 10.000 lei.

- 9. Sa se afiseze inregistrarile marcate pentru stergere si apoi sa se

renunte la marcaj

- 10. Sa se afiseze creditele acordate cu vechime mai mare de 3 ani

- 11. Sa se afiseze creditele acordate in ultima luna

- 12. Sa se marcheze pentru stergere creditele acordate in lunile august si

octombrie si sa se stearga definitive aceste inregistrari.

Rezolvare:

2. LOCATE FOR BENEFICIAR = “Popa”

DISPLAY

CONTINUE

DISPLAY

3. LIST FOR TERMEN < 24 4. LOCATE FOR SUCURSALA = “Militari” AND VAL_CREDIT > 500000

?FOUND()

?RECNO()

DISPLAY

5. LOCATE FOR VAL_ACHIT=0

Page 70: Module 1-6 FoxPro

70

DISPLAY

CONTINUE

DISPLAY 6. LIST FOR VAL_ACHIT>VAL_CREDIT/2 AND SUCURSALA = “Titan”

7. DELETE FOR VAL_ACHIT=VAL_CREDIT

8. LIST FOR VAL_CREDIT<10000

9. LIST FOR DELETED()

RECALL ALL

10. LIST FOR YEAR(DATE()) – YEAR(DATA_ACORDARII) > =3

11. LIST FOR MONTH(DATE()) – MONTH(DATA_ACORDARII) = 1

AND YEAR(DATE())=YEAR(DATA_ACORDARII)

12. DELETE FOR MONTH(DATA_ACORDARII) = 08 OR

MONTH(DATA_ACORDARII) = 10

PACK

APLICATIA 2:

Fie baza de date DEPOZIT cu urmatoarea structura:

STOCURI (COD N(3), DENUMIRE C(20), STOC_INITIAL N(4),

CANTITATE_INTRATA N(4), CANTITATE_IESITA N(4), STOC_FINAL

N(6), PRET N(5))

Cerinte:

- 1. Introduceti 8 inregistrari in baza de date

- 2. Sa se indexe baza de date dupa campul “COD”

- 3. Sa se calculeze totalul pentru cantitatea intrata si pentru cantitatea

iesita

- 4. Sa se calculeze pretul mediu

- 5. Determinati cel mai mare stoc intrat si cel mai mic stoc iesit

- 6. Afisati numarul produselor al caror stoc final este mai mare de 100

- 7. Determinate numarul de produse al caror pret este cuprins intre 10 si

100 lei

- 8. Sa se afiseze primele trei produse in ordinea descrescatoare a

preturilor

- 9. Sa se calculeze valoarea produselor din depozit

- 10. Afisati numele produsului care se afla in cantitatea cea mai mare in

depozit

Page 71: Module 1-6 FoxPro

71

Rezolvare:

2. INDEX ON COD TAG COD OF IND_COD

3. SUM CANTITATE_INTRATA TO A

?‟CANTITATEA INTRATA ESTE‟,A

SUM (CANTITATE_IESITA)

4. AVERAGE (PRET)

5. CALCULATE MAX(STOC_INITIAL)

CALCULATE MIN(STOC_FINAL)

6. CALCULATE CNT() FOR STOC_FINAL > 100

7. CALCULATE CNT() FOR PRET>=10 AND PRET <= 100

8. SORT TO STOCURI1 ON PRET/D

USE STOCURI1

GO TOP

LIST NEXT 3

9. CALCULATE SUM (STOC_FINAL*PRET) TO VAL

?‟VALOAREA PRODUSELOR DIN DEPOZIT ESTE‟, VAL

10. CALCULATE MAX (STOC_FINAL)

APLICATIA 3:

Fie baza de date cu evidenta salariilor angajatilor unei patiserii, cu

structura alaturata:

SALARIATI (COD_ANGAJ N(3), NUME C(20), FUNCTIA C(10),

SALARIU N(8), INDEXARE N(3), SAL_IND N(8), PRIMA_ANG N(8),

NR_ORE N(5))

Cerinte:

- 1. Sa se realizeze completarea automata a campului “Indexare” cu

valoarea 5, ce reprezinta procentul cu care va fi indexat salariul

angajatilor

- 2. Completarea automata a campului “Sal_ind“ ce reprezinta salariul

dupa indexare

- 3. Completarea campului “Prima_ang” astfel: pentru cei care au 200 ore

lucrate cu valoarea 400, iar pentru cei care au 150 ore cu valoarea 200

- 4. Sa se marcheze pentru stergere cei cu functia de sofer, sa se afiseze

baza de date si apoi sa se renunte la marcaj

- 5. Sa se sorteze angajatii cu functia de sofer dupa campul “Salariu”

crescator si dupa campul “Prima_ang” descrescator

- 6. Sa se caute inregistrarea cu codul 12 si sa se afiseze

Page 72: Module 1-6 FoxPro

72

Rezolvare:

1. REPLACE ALL INDEXARE WITH 5

2. REPLACE ALL SAL_IND WITH SALARIU+(SALARIU*INDEXARE)/100

3. REPLACE PRIMA_ANG WITH 400 FOR NR_ORE=200

REPLACE PRIMA_ANG WITH 200 FOR NR_ORE=150

4. DELETE FOR FUNCTIA = “SOFER”

LIST

RECALL ALL

5. SORT TO SALARIATI1 ON SALARIU/A, PRIMA_ANG/D FOR

FUNCTIA=”SOFER”

USE SALARIATI1

LIST

6. USE SALARIATI

INDEX ON COD_ANGAJ TAG COD OF IND_COD

?SEEK(12)

DISPLAY

Lucrări practice propuse

1. Fiind dată tabela PERS (marca, nume, funct, sal, adresa, tel,datan,

sex, stareciv, locm) să se calculeze noul salariu cuvenit după

indexare, ştiind că acesta se măreşte pe tranşe, astfel:

- cu 55% pentru cei cu salariu mai mic de 750000lei;

- cu 40% pentru cei cu salariu mai mare de 750000lei şi mai mic de

1500000lei

- cu 25% pentru cei cu salariu mai mare de 1500000lei şi mai mic de

3000000lei

- cu 15% pentru cei cu salariu mai mare de 3000000 lei

2. Să se calculeze impozitul aferent fiecărui salariat, presupunând că

grila de impozitare ar fi următoarea:

- pentru salariu ≤450000 lei, impozitul=0

- pentru salariu >450000 lei şi ≤750000 impozitul=50000 plus încă

15% din ce depăşeşte 450000

- pentru salariu >750000 lei şi ≤1500000 impozitul=90000 plus încă

20% din ce depăşeşte 750000

- pentru salariu >1500000 lei şi ≤2500000 impozitul=240000 plus

încă 25% din ce depăşeşte 1500000

- pentru salariu >2500000 lei şi ≤4000000 impozitul=500000 plus

încă 30% din ce depăşeşte 2500000

Page 73: Module 1-6 FoxPro

73

- pentru salariu >4000000 lei impozitul=950000 plus încă 40% din ce

depăşeşte 4000000

Observaţie:

Pentru că tabela PERS nu conţine câmpul IMPOYIT, se va modifica

întâi structura acesteia, după care se va proceda la calcul.

3. Să se afişeze rapid suma fondului de salarii (suma câmpului SAL)

după indexare şi suma impozitului cuvenit.

4. Să se calculeze şi să se afişeze salariul mediu pentru un salariat al

instituţiei.

5. Să se afişeze toţi salariaţii, în ordinea alfabetică a numelui lor.

6. Să se afişeze toţi salariaţii care au salariu sub salariul mediu pe

instituţie şi apoi cei care au un salariu sub salariul mediu pe

economie (presupunem că salariul mediu pe economie este de

1600000 lei).

7. Să se afişeze fondul de salarii aferent salariaţilor cu salariu sub

salariul mediu pe instituţie.

8. Să se afişeze salariaţii (bărbaţi) care sunt ingineri şi sunt căsătoriţi.

9. Să se afişeze toţi salariaţii, pe locuri de muncă şi în ordine

alfabetică.

10. Să se afişeze toţi salariaţii din secţia cu codul 4211, în ordinea

descrescătoare a salariilor lor.

11. Să se afişeze salariul minim şi salariul maxim din cadrul societăţii.

12. Să se afişeze, pentru corectarea unor date personale(nume, adresa,

telefon) toţi salariaţii cu numele POPESCU.

13. Să se determine numărul salariaţilor de sex feminin, necăsătoriţi.

14. Să se calculeze salariul mediu al salariaţilor de sex masculin (M) şi

respectiv de sex feminin (F), pentru a se face o analiză a acestor

date.

15. Să se afişeze pentru salariaţii cu salariul mai mic decât 700000 lei,

doar numele, locul de muncă, salariul, data naşterii şi starea civilă la

ecran şi imprimantă.

Page 74: Module 1-6 FoxPro

74

MMOODDUULLUULL 44

LIMBAJUL DE PROGRAMARE FOXPRO

4.1. Realizarea şi gestionarea programelor sub Foxpro

Sistemul Foxpro oferă un mediu integrat şi deosebit de performant de

programare, care asistă utilizatorul pe tot parcursul activităţii de realizare şi

dezvoltare a programelor, cuprinzând etapele:

- scrierea şi corectarea (editarea) programului sursă;

- compilarea;

- execuţia;

- depanarea şi testarea .

Un program reprezintă o succesiune de comenzi Foxpro, memorată pe

disc ca un fişier, prin care se descrie un algoritm de rezolvare a unei probleme

date. De aceea, un program Foxpro se mai numeşte “fişier de comenzi” şi este

salvat cu extensia implicită .PRG.

Sub Foxpro au fost implementate toate cele trei tipuri de structuri

fundamentale ale programării structurate şi modulare, şi anume:

structura secvenţială

structura alternativă

structura repetitivă

4.2. Comenzi pentru elaborarea programelor sub FOXPRO

Un program Foxpro reprezintă o succesiune de comenzi realizată în

conformitate cu regulile limbajului Foxpro, memorată pe disc sub un nume şi

care rezolvă o anumită problemă, îndeplineşte o anumită sarcină, printr-un

anumit algoritm.

Programele FOXPRO, numite şi fişiere de comenzi, se crează cu orice

editor de texte sau, cel mai comod, cu editorul propriu al sistemului Foxpro,

care se accesează :

- fie cu comanda MODIFY COMMAND

- fie prin intermediul meniului

Comanda are formatul general:

MODIFY COMMAND <nume_fişier> [NOEDIT] [NOWAIT]

[RANGE <expN1>,<expN2>] [WINDOW <nume_fer1>]

[IN [WINDOW] <nume_fer2>SCREEN] [SAVE]

Page 75: Module 1-6 FoxPro

75

unde:

nume_fişier – este numele fişierului sursă care se va crea sau al celui

care se va afişa pe ecran pentru editare

NOEDIT – permite vizualizarea fişierului de comenzi fără a permite

modificarea lui

NOWAIT – permite derularea în continuare a execuţiei programului,

fără a ţine seama de afişarea lui în fereastra de editare

RANGE <expN1>,<expN2> cere selectarea şi deci afişarea în fereastra

de editare, numai a porţiunii din text cuprinsă între poziţia indicată prin expN1

şi cea specificată prin expN2.

WINDOW <nume_fer1>] –determină afişarea ferestrei cu numele

specificat, ca fereastră de editare

IN [WINDOW] <nume_fer2>SCREEN – face ca fereastra de

editare să apară în interiorul ferestrei cu numele specificat prin nume_fer2 sau

pe ecran (SCREEN).

SAVE –face ca fereastra de editare să rămână afişată pe ecran chiar şi

după ieşirea din fereastra de editare.

Execuţia unui program poate fi cerută în orice moment în două moduri:

- cu comanda DO

- prin intermediul meniului Foxpro

Comanda Do are formatul general:

DO <nume_fişier><nume_procedură>

[WITH <listă_parametri>] [IN <fişier>]

Comanda cere execuţia programului sau a procedurii cu numele

specificat. Dacă fişierul nu are extensia specificată, atunci comanda va căuta pe

disc fişierul cu numele respectiv şi, în ordine, cu extensia: .EXE; .APP;

.FXP; .PRG

Opţiunea WITH oferă posibilitatea transmiterii parametrilor

programului. Opţiunea IN permite execuţia unei proceduri din fişierul cu

numele specificat (practic specifică fişierul în carea fost memorată procedura,

pentru a grăbi execuţia).

Deschiderea unui program existent în vederea corectării se poate face

fie:

- cu comanda MODIFY COMMAND

- activând opţiunea OPEN din submeniul FILE, alegând apoi tipul de

fişier PROGRAM şi apoi selectând fişierul cu numele căutat.

Efectul acestor acţiuni similare va fi deschiderea ferestrei de editare în

cadrul căreia este afişat conţinutul programului dorit, utilizatorul putând efectua

orice corecţie crede de cuviinţă.

Compilarea programelor

Page 76: Module 1-6 FoxPro

76

Compilarea (traducerea unui program sursă în cod obiect) se face sub

Foxpro în mod automat, la execuţia unei comenzi DO, atunci când programul

nu a fost compilat anterior.

Compilarea se poate cere şi în mod explicit, printr-o comandă de forma:

COMPILE <nume_fişier><mască> [ENCRYPT] [NODEBUG]

unde:

- nume_fişier – este numele fişierului care se compilează; Dacă se

compilează mai multe fişiere, atunci <mască> reprezintă specificatorul

multiplu , conţinând caracterele * şi ?.

- opţiunea ENCRYPT determină blocarea posibilităţii de

refacere ulterioară a programului sursă din codul obiect generat.

- opţiunea NODEBUG cere compilarea programului fără

includerea informaţiilor de depanare, rezultând astfel un program mai mic ca

dimensiune.

Comanda SET LOGERRORS ONOFF determină, la compilare ,

crearea unui fişier în care se memorează toate mesajele de eroare apărute în

timpul compilării (ON), sau inhibă acest lucru (OFF).

Fişierul creat va avea acelaşi nume cu cel sursă, dar extensia .ERR.

4.3. Structura secvenţială

Este reprezentată de o secvenţă liniară de comenzi Foxpro care se

execută una după alta, în ordinea în care urmează. Aceste comenzi au fost

descrise la modul de lucru direct, prin fereastra de comenzi. O astfel de

structură nu conţine comenzi pentru structuri alternative sau repetitive. Ea poate

conţine comenzi: de introducere şi actualizare a datelor, de sortare, ordonare a

datelor, de afişare la ecran sau imprimantă, de calcul, atribuire, de consultare,

regăsire a înregistrării dorite, de modificare sau afişare a structurii, de copiere,

ştergere sau redenumire a tabelelor, de salt în cadrul tabelei, de calcul cu

ajutorul funcţiilor Foxpro , etc.

4.4. Structura alternativă

Se ştie că adeseori, rezolvarea unor probleme de complexitate mare nu

poate fi făcută numai prin executarea secvenţială a instrucţiunilor, astfel încât

sunt necesare comenzi şi funcţii care să schimbe această ordine.

Astfel, sub SGBD Foxpro au fost implementate principalele comenzi şi

structuri ale programării structurate, care permit:

Page 77: Module 1-6 FoxPro

77

- executarea condiţionată a unei secvenţe de comenzi, în funcţie de

rezultatul evaluării unei expresii logice - structura alternativă;

- executarea repetată a unei secvenţe de comenzi, sub controlul unei

condiţii stabilită de programator – structura repetitivă.

Structura alternativă este implementată sub Foxpro în cele două forme

din programarea structurată, şi anume:

- Structura cu 2 ramuri ( comanda IF )

- Structura cu mai multe ramuri (comanda DO CASE ).

Comanda IF

Formatul general al comenzii este:

IF <expL>

<comenzi1>

[ELSE

<comenzi2>]

ENDIF

Comanda funcţionează astfel: Se evaluează condiţia.

- Dacă este adevărată, se execută toate comenzile care urmează,

până la ELSE sau până la ENDIF (dacă lipseşte ELSE) şi apoi se sare la prima

comandă de după ENDIF.

- Dacă este falsă, se execută toate comenzile care urmează după

ELSE, până la ENDIF şi apoi se trece mai departe, la următoarea comandă.

Exemplu:

IF OPT=”A”

DO ADAUG

ELSE

IF OPT =”M”

DO MODIF

ELSE

IF OPT =”S”

DO STERG

ELSE

?”OPTIUNE ERONATA”

ENDIF

ENDIF

ENDIF

Acelaşi exerciţiu se poate scrie şi astfel:

IF OPT=”A”

DO ADAUG

Page 78: Module 1-6 FoxPro

78

ENDIF

IF OPT=”M”

DO MODIF

ENDIF

IF OPT=”S”

DO STERG

ENDIF

Comanda DO CASE

Are formatul general:

DO CASE

CASE <expresie1>

<comenzi1>

CASE <expresie2>

<comenzi2>

.

.

[OTHERWISE

<comenziN>

ENDCASE

Comanda funcţionează astfel:

Se evaluează prima expresie care urmează clauzei CASE.

- Dacă aceasta este adevărată, se execută secvenţa de comenzi

care îi urmează, până la următorul CASE, după care se trece la prima comandă

de după ENDCASE.

- Dacă aceasta nu este adevărată, se trece şi se evaluează

expresia2, corespunzătoare următorului CASE şi se procedează la fel şi aşa

mai departe.

- Dacă nici una din condiţii (expresii) nu este adevărată se execută

secvenţa de comenzi care succede fraza OTHERVISE (dacă aceasta există),

sau se transferă controlul după ENDCASE. Oricum, se va executa doar

secvenţa de comenzi aferentă condiţiei adevărate, după care se va trece după

ENDCASE.

Se observă deci, că la prima expresie găsită adevărată se execută

comenzile corespunzătoare după care se iese din comandă şi se continuă

programul cu prima comandă de după ENDCASE.

Acest lucru înseamnă că expresiile, condiţiile trebuie să fie formulate

corect, trebuie să se excludă reciproc. Dacă mai multe condiţii ataşate clauzelor

CASE sunt adevărate, se execută doar grupul de comenzi aferent primeia dintre

Page 79: Module 1-6 FoxPro

79

ele, în ordinea în care efectiv au fost scrise - ceea ce probabil că nu este foarte

corect.

Exemplu:

DO CASE

CASE OPT‟=‟A‟

DO ADAUG

CASE OPT‟=‟M‟

DO MODIF

CASE OPT‟=‟S‟

DO STERG

OTHERWISE

? „OPŢIUNE ERONATĂ‟

ENDCASE

4.5. Structura repetitivă

Structura repetitivă, denumită şi ciclu de program, permite reluarea

execuţiei unei secvenţe de comenzi de un număr de ori.

În Foxpro au fost implementate numai două din cele 3 structuri

repetitive din programarea structurată, şi anume cele condiţionate anterior.

Structura repetitivă condiţionată posterior nu are corespondenţă în

Foxpro, dar poate fi simulată.

Astfel, au fost implementate sub SGBD Foxpro următoarele tipuri de

structuri repetitive:

a) structura repetitivă condiţionată anterior – comanda DO WHILE

b) structura repetitivă condiţionată anterior cu numărător – comanda

FOR

c) structura specifică sistemului Foxpro, care parcurge automat o

tabelă de date, în mod condiţionat – comanda SCAN

a) Structura repetitivă condiţionată anterior

Comanda DO WHILE

Are sintaxa:

DO WHILE <expL>

<comenzi>

[LOOP]

[EXIT]

ENDDO

Comanda funcţionează astfel:

Page 80: Module 1-6 FoxPro

80

Se evaluează expresia (condiţia) specificată.

- Dacă este adevărată, se execută secvenţa de comenzi care urmează,

până la ENDDO, după care controlul trece din nou la DO WHILE,

pentru a testa condiţia.

- Dacă este falsă, ciclul se încheie şi controlul este trecut la prima

instrucţiune de după ENDDO.

Opţiunea LOOP cere reluarea ciclului iniţiat prin DO WHILE - fără a se

mai parcurge deci comenzile care ar mai exista până la sfârşitul ciclului.

Opţiunea EXIT cere ieşirea forţată din ciclu , cu salt necondiţionat la

prima comandă de după ENDDO.

Exemplu:

1. Se afişează din tabela PERS numele şi salariul tuturor persoanelor

existente.

CLEAR

USE PERS

DO WHILE NOT EOF()

? NUME

?? „,‟

?? SAL

SKIP

ENDDO

CLOSE ALL

2. Să se indexeze salariile personalului astfel: pentru cei cu salariul mai

mic decât 400000 cu 50%, pentru ceilalţi cu 25%.

USE PERS

DO WHILE NOT EOF()

IF SAL<400000

REPL SAL WITH SAL*1.50

ELSE

REPL SAL WITH SAL*1.25

ENDIF

SKIP

ENDDO

3. Să se mărească salariul persoanelor care au mai puţin de 500000 cu

250000.

USE PERS

DO WHILE NOT EOF()

Page 81: Module 1-6 FoxPro

81

IF SAL < 500000

REPL SAL WITH SAL+250000

ENDIF

SKIP

ENDDO

4. Fiind dată tabela PERS (nume, functie, sal, adresa, tel, locm) să se

calculeze şi să se afişeze suma fondului de salarii pe locuri de muncă.

- Problema se poate rezolva elegant şi uşor cu generatorul de rapoarte,

cu opţiune de obţinere a unor subtotaluri la nivel de loc de muncă, cu condiţia

ca tabela să fie indexată după valorile câmpului LOCM.

- Se poate scrie însă şi un program de listare, cu totalizarea valorilor

câmpului SAL pentru fiecare loc de muncă, astfel:

USE PERS

INDEX ON LOCM TO IPERS

USE PERS INDEX IPERS

TOTG=0

DO WHILE NOT EOF()

WLOC=LOCM

TOTAL=0

DO WHILE NOT EOF() AND LOCM=WLOC

TOTAL=TOTAL+SAL

SKIP

ENDDO

?WLOC

?? “ “

??”TOTAL SALARII:”

?? TOTAL

TOTG=TOTG+TOTAL

ENDDO

?”TOTAL GENERAL”

?? TOTG

CLOSE ALL

b) Structura repetitivă condiţionată anterior cu numărător

Comanda FOR Are sintaxa:

FOR <variabilă>=<exp1> TO <exp2> [STEP <exp3>]

Page 82: Module 1-6 FoxPro

82

<secvenţă_de_comenzi>

[EXIT]

[LOOP]

ENDFORNEXT

unde:

- Variabilă este o variabilă de memorie cu rol de contor, care va

număra de câte ori se execută ciclul cuprins între FOR şi ENDFOR. Contorul

va fi iniţializat automat prin valoarea precizată prin exp1 şi va fi mărit, după

fiecare execuţie a ciclului, cu o valoare egală cu cea precizată prin exp3

(valoare numită pas).

- Pasul este opţional, deci poate lipsi; atunci el este considerat

automat egal cu 1.

- Exp2 precizează valoarea finală a contorului şi deci stabileşte

până când are loc reluarea ciclului.

Comanda funcţionează astfel:

- Se iniţializează (variabila cu valoarea iniţială, precizată prin exp1.

- Se compară valoarea contorului cu cea finală, definită prin exp3.

- Dacă este mai mică sau egală se va executa secvenţa de comenzi

cuprinsă între FOR şi ENDFOR sau NEXT.

- Dacă este mai mare decât valoarea finală, atunci execuţia comenzii

FOR încetează şi se continuă cu următoarea comandă din program de după

ENDFOR sau NEXT.

- Opţiunea EXIT cere ieşirea forţată din ciclu, indiferent de valoarea

contorului

- Opţiunea LOOP determină reluarea comenzii FOR , fără a mai

executa restul comenzilor cuprinse între LOOP şi ENDFOR.

Exemplu:

1. Să se calculeze suma primelor 20 de numere naturale .

CLEAR

S=0

FOR I=1 TO 20

S=S+I

ENDFOR

?”SUMA PRIMELOR 20 NUMERE NATURALE ESTE “

?? S

2. Să se calculeze suma salariilor pentru primele 20 de persoane din

tabela PERS.

CLEAR

Page 83: Module 1-6 FoxPro

83

USE PERS

S=0

FOR I=1 TO 20

S=S+SAL

SKIP

ENDFOR

?”SUMA SALARIILOR PENTRU PRIMELE 20 PERSOANE ESTE “

?? S

CLOSE ALL

c). Structura specifică sistemului Foxpro, care parcurge automat o

tabelă de date, în mod condiţionat

Comanda SCAN

Are sintaxa:

SCAN [NOOPTIMIZE] [<Scop>] [FOR <expL1>] [WHILE

<expL2>]

<secvenţă_de_comenzi>

[EXIT]

[LOOP]

ENDSCAN Ca efect al acestei comenzi, se parcurge tabela activă executându-se

secvenţa de comenzi cuprinsă între SCAN şi ENDSCAN pentru fiecare

înregistrare sau numai pentru cele din domeniul specificat prin Scope sau numai

pentru cele care îndeplinesc condiţia specificată prin FOR sau WHILE.

Comanda SCAN incrementează automat pointerul de înregistrare cu 1 şi

asigură astfel automat trecerea la următoarea înregistrare.

Opţiunea LOOP cere reluarea execuţiei comenzii SCAN fără a mai

parcurge comenzile cuprinse între SCAN şi ENDSCAN.

Opţiunea EXIT asigură ieşirea forţată din ciclul realizat cu SCAN.

Exemplu:

Să se afişeze din tabela PERS , pentru persoanele care au salariul mai

mare de 3000000, numele şi salariul.

USE PERS

SCAN

IF SAL>3000000

? nume

?? „ „

??sal

Page 84: Module 1-6 FoxPro

84

ENDIF

ENDSCAN

4.6. Programarea pe evenimente

Pentru fiecare eveniment care poate să apară în execuţia unei aplicaţii

există un mecanism care tratează unitar aceste evenimente şi asociază fiecărui

eveniment acţiunile care trebuie executate. Există mecanisme pentru tratarea

următoarelor categorii de evenimente:

a) Evenimente legate de lucru cu meniuri. Aceste mecanisme

permit asocierea fiecărei opţiuni dintr-un meniu complex cu efectuarea unei

acţiuni care va fi executată atunci când opţiunea respectivă a fost selectată.

Aceste acţiuni se definesc în acest caz prin comenzile ON PAD, ON BAR sau

ON SELECTION;

b) Evenimente legate de lucru cu ferestre (activarea, dezactivarea,

afişarea, redimensionarea sau mutarea unei ferestre).

c) Evenimente legate de apăsarea unei taste sau a unei combinaţii

de taste. La apăsarea unei taste pentru care a fost definită o acţiune, programul

se întrerupe, indiferent de secvenţa care se derulează în momentul respectiv şi

se execută acţiunea asociată tastei. După execuţia acţiunii se va relua execuţia

programului din punctul în care a fost întrerupt. Acţiunile care se pot executa la

apăsarea unei taste se declară cu ajutorul comenzilor ON KEY, ON KEY

LABEL şi ON ESCAPE;

d) Evenimente legate de detectarea etichetei de sfârşit de fişier EOF.

Detectarea acestei etichete se face cu funcţia EOF() şi în momentul detectării ei

programul execută o acţiune definită anterior.

4.7. Comenzi pentru afişarea formatată a datelor

Afişarea formatată constă în principal în plasarea informaţiilor pe ecran

şi/sau imprimantă în poziţiile indicate de utilizator. Ea se realizează cu comanda

@, care poate avea mai multe formate generale, dintre care le vom descrie pe

cele mai uzuale.

4.7.1. Format de afişare

@ L,C SAY <expresie> [PICTURE <exprC1>] [FUNCTION

<exprC2>] [COLOR SCHEME <expN>COLOR <listă_culori>]

unde:

Page 85: Module 1-6 FoxPro

85

L,C reprezintă coordonatele punctului de pe ecran sau imprimantă de

unde dorim să înceapă afişarea., exprimate prin:

L – număr linie

C – număr coloană

Facem următoarele precizări:

Dacă afişarea se face pe ecran:

- L poate lua valori cuprinse între 1 şi 23.

- C poate lua valori cuprinse între 0 şi 79.

Dacă afişarea se face la imprimantă:

- L poate lua valori cuprinse între 0 şi 254.

- C poate lua valori cuprinse între 0 şi 254.

Indicarea coordonatelor se poate face :

- în mărime absolută, sub formă de constante numerice

- sub formă relativă, prin variabile de memorie sau expresii din

evaluarea cărora rezultă valorile aşteptate.

Exemplu:

@ 2,7 Say “Curs baze de date”

L=2

@ L,7 Say “Curs baze de date”

@ L+1,7 Say “Curs baze de date”

În mod normal, fără nici o precizare, comanda @ se adresează

ecranului. Pentru ca afişarea cu comanda @ să se transmită şi la

imprimantă, e necesar ca în prealabil să fie dată comanda:

SET DEVICE TO PRINT

@ 3,5 Say “Afişarea a fost direcţionată către imprimantă”

@ 4,5 Say “Afişarea se produce şi la imprimantă”

Revenirea la ecran pentru comanda @ se va face cu comanda:

SET DEVICE TO SCREEN

@ 3,5 Say “Afişarea a fost direcţionată către ecran”

@ 4,5 Say “Afişarea se produce numai la ecran”

Clauza SAY permite deci afişarea pe ecran sau imprimantă, începând

din punctul indicat prin coordonate, a valorii expresiei specificate, după ce

aceasta a fost evaluată. Expresia poate fi : un şir de caractere care se va afişa ca

atare, o variabilă de orice tip al cărei conţinut va fi afişat, o expresie de tip

numeric sau şir de caractere al cărei rezultat se va afişa.

Formatul de afişare poate fi :

- formatul implicit

- formatul specificat prin clauza PICTURE sau FUNCTION

Page 86: Module 1-6 FoxPro

86

Dacă se specifică o variabilă, aceasta poate fi:

- un câmp de date din tabela activă

- o variabilă de memorie independentă

Dacă a fost specificat un câmp de date, atunci formatul de afişare

implicit va fi cel din structură (deci se cunoaşte şi nu mai trebuie precizat prin

clauza Picture, decât dacă se doreşte schimbarea lui).

Dacă a fost specificată o variabilă de memorie sau o expresie de calcul

numeric, atunci formatul de afişare nu se cunoaşte, nu este definit şi va fi

imprevizibil, funcţie de conţinutul actual al variabilei sau de rezultatul obţinut

din calcul. În aceste cazuri este bine să precizăm noi formatul de afişare dorit

prin clauza PICTURE.

Exemple:

@ 5,7 Say sal formatul de afişare va fi cel din structură

@ 5,7 Say sal/3 formatul de afişare va fi imprevizibil, funcţie de

rezultat

@ 5,7 Say sal/3 PICTURE “999999” formatul de afişare pe 6 cifre,

numai parte întreagă

Opţiunea PICTURE <expr_C> specifică formatul de afişare dorit de

utilizator.

Formatul de afişare precizează, prin intermediul codurilor de afişare:

- natura datei afişate

- lungimea de afişare, exprimată în număr de poziţii

Coduri de afişare tip PICTURE:

Cod Semnificaţie

A Caractere alfabetice

W Date de tip logic

N Litere şi cifre

X Orice fel de caractere sau combinaţie a acestora

Y Constantele logice Y,y N sau n (convertite în litere mari)

9 Ca date de tip caracter permite numere, iar ca date de tip numeric

numai numere şi eventual semne algebrice şi punct zecimal.

# Permite cifre, semne algebrice şi spaţii

! Converteşte literele mici, dacă există, în litere mari

corespunzătoare

$ Afişează semnul monetar curent, aşa cum a fost definit prin SET

CURRENCY)

* Afişează caracterul * în locul spaţiilor rămase libere în faţa

Page 87: Module 1-6 FoxPro

87

numerelor

. precizează poziţia punctului zecimal

, Separă, dacă se doreşte, grupele de cîte 3 cifre de la întregi.

Opţiunea FUNCTION <expr_C2> permite specificarea formatului de

afişare dorit prin intermediul unor coduri globale , pe care le prezentăm în

tabelul de mai jos:

Coduri de afişare tip FUNCTION:

Cod Semnificaţie

A Permite numai caractere alfabetice

B Aliniază la stânga datele numerice (în câmpul de ieşire)

C Afişează CR (CRedit) după un număr pozitiv. Se utilizează doar pentru

SAY şi date numerice.

D Afişează data calendaristică în formatul curent, cerut prin SET DATE.

E Afişează data calendaristică în format european

I Centrează textul în interiorul câmpului.

J Aliniază la dreapta textul afişat

K Selectează întregul câmp pentru editare atunci când se mută cursorul în

el

L Afişează zerourile de la începutul datelor numerice

M<lis

tă>

Specifică alegerea funcţiilor multiple (în listă funcţiile fiind separate prin

virgulă)

R Permite ca, atunci cînd se folosesc şi alte combinaţii de caractere decât

codurile PICTURE permise, acestea să fie afişate pe ecran, fără a fi

memorate în variabila respectivă

S<n> Limitează afişarea la un număr de caractere egal cu n, unde n este număr

natural.

T Elimină la afişare spaţiile de la început şi de la sfârşit

X Afişează DB (DeBit) după un număr negativ. Se utilizează doar pentru

SAY şi date numerice.

Z Afişează numai spaţii dacă valoare câmpului este 0. Se utilizează doar

pentru date numerice.

( Numerele negative vor fi cuprinse între paranteze. Se utilizează doar

pentru SAY şi date numerice.

! Converteşte literele mici, dacă există, în majuscule.

^ Afişează numerele în format ştiinţific.

$ Afişează simbolul curent al monedei.

Page 88: Module 1-6 FoxPro

88

Codurile de tip FUNCTION pot fi incluse în şirul de caractere al clauzei

PICTURE, dacă se află la începutul acestui şir şi sunt precedate decaracterul @.

Codurile FUNCTION se despart de cele PICTURE printr-un spaţiu.

Opţiunea COLOR <listă_culori> permite alegerea culorilor dorite la

afişare.

Opţiunea COLOR SCHEME <expN> permite precizarea unui număr

prin care se alege o combinaţie (chemă) de culori prestabilită.

Exemple:

a. Să se afişeze pe ecran un şir de caractere alfabetice , în litere mari.

Se poate specifica formatul de afişare în mai multe forme, echivalente

ca efect.

SIR=”Buna ziua” Şir cu lungimea de 9 caractere

@ 5,7 SAY SIR PICTURE „aaaaaaaaa‟ FUNCTION „!‟

@ 5,7 SAY SIR PICTURE „aaaaaaaaa‟ FUNCTION „a!‟

@ 5,7 SAY SIR PICTURE „@! aaaaaaaaa‟

@ 5,7 SAY SIR PICTURE „@a !!!!!!!!!‟

@ 5,7 SAY SIR PICTURE „!!!!!!!!!‟

b. Să se afişeze pe imprimantă înregistrarea numărul 3 din tabela PERS

(numai numele,adresa şi telefonul):

USE PERS

GO 3

SET DEVICE TO PRINT Se activează imprimanta

@ 5,7 SAY “Înregistrarea dorită este “

@ 7,7 SAY NUME

@ 7,30 SAY ADRESA

@ 7,60 SAY TEL

SET DEVICE TO SCREEN Se dezactivează imprimanta

CLOSE ALL

4.7.2. Format de afişare şi citire

@ L,C [SAY <opţiuni>] GET <variabilă> [PICTURE <exprC1>]

[FUNCTION <exprC2>] [DEFAULT <exp1>] [ENABLEDISABLE]

[MESSAGE <exprC3>] [[OPEN] WINDOW <nume_fereastră>] [RANGE

[<exp2>] [,<exp3>]] [SIZE <expN1>,<expN2>] [VALID

<expL1><expN3>] ERROR <expC4>]] [WHEN <expL2>] [COLOR

SCHEME <expN4>COLOR <listă_culori>]

Page 89: Module 1-6 FoxPro

89

Clauza GET are ca efect afişarea în videoinvers a conţinutului curent al

variabilei specificate, permiţând şi editarea (modificarea) acesteia, dacă este

urmată de comanda READ.

Ea este admisă numai pentru ecran, spre deosebire de SAY care

permitea şi afişarea la imprimantă.

Afişarea se realizează din punctul de coordonate precizat, dacă nu există

SAY, sau din punctul de unde a rămas poziţionat cursorul după execuţia clauzei

SAY.

Celelalte opţiuni au următoarea semnificaţie:

DEFAULT <exp1> specifică valoarea implicită pentru variabila

asociată lui GET. Dacă ea a fost iniţializată înainte de @ ...GET, atunci clauza

Default va fi ignorată.

ENABLE - permite accesul la câmpul afişat cu GET.

DISABLE – nu permite accesul la câmpul afişat cu GET.

MESSAGE <exprC3> - permite afişarea expresiei (mesajului)

specificate. Afişarea se face pe ultima linie a ecranului, iar când este specificată

comanda:

SET MESSAGE TO <expN>, mesajul este afişat pe linia al cărui

număr a rezultat după evaluarea expresiei precizate.

[OPEN] WINDOW <nume_fereastră> - permite editarea unui câmp

de tip memo în fereastra cu numele specificat, care trebuie să fi fost definită

anterior. Cu OPEN se cere ca ferestra respectivă să fie în mod implicit deschisă.

RANGE [<exp2>] [,<exp3>] – precizează, dacă se doreşte acest lucru,

limitele intervalului de valori în care trebuie să se încadreze valoarea introdusă

de la tastatură în variabila asociată cu GET.

SIZE <expN1>,<expN2> - precizează dimensiunile spaţiului de editare,

exprimate în număr de linii pentru înălţime (expN1) şi în număr de coloane

pentru lăţime (expN2).

VALID <expL1><expN3> [ ERROR <expC4>] –permite validarea

valorilor introduse în variabila asociată lui GET conform expresiei specificate

(logică sau numerică). Astfel, dacă expL1 este adevărată, atunci valoarea

introdusă se consideră corectă şi invers. Dacă valoarea nu este corectă şi dacă a

fost precizată cluza ERROR, atunci pe ecran se afişează mesajul specificat şi

procesul de introducere/verificare a valorii continuă până când condiţia este

îndeplinită sau se apasă tasta Escape.

WHEN <expL2> - precizează condiţia de acces la variabila asociată lui

GET. Dacă expresia este adevărată, cursorul se poziţionează pe câmpul

respectiv şi permite accesul la el, altfel, accesul nu e permis iar cursorul sare la

câmpul următor.

Page 90: Module 1-6 FoxPro

90

COLOR SCHEME <expN4>COLOR <listă_culori> - au aceeaşi

semnificaţie ca şi la @ ...SAY.

Comanda READ are ca efect activarea ieşirilor comenzilor GET sau

EDIT pentru a realiza citirea propriu-zisă a noilor valori în câmpurile

specificate. Practic, comanda Read întrerupe execuţia programului şi, pe

imaginea afişată pe ecran cu ajutorul comenzilor SAY şi GET sau EDIT

poziţionează cursorul pe câmpul asociat primului GET, aşteptând introducerea

de la tastatură a unei valori ce va fi eventual şi validată.

Formatul general al comenzii READ este:

READ [CICLE] [ACTIVATE <expL1>] DEACTIVATE <expL2>]

[MODAL] [WITH <listă_nume_ferestre>] [VALID <expL3><expN1>]

[WHEN <expL4>] [TIMEOUT <expn2>] [NOCONSOLE] [NOMOUSE]

[LOCKNOLOCK] [COLOR SCHEME <expN3>COLOR

<listă_culori>]

unde:

CICLE – determină continuarea comenzii READ chiar după ieşirea din

ultimul câmp asociat cu GET, cu un salt pe primul câmp asociat cu GET

(reluarea execuţiei). În acest caz, terminarea execuţiei comenzii se va face

apăsând pe tasta <Esc> sau Ctrl/W sau controlată de clauza VALID sau

TIMEOUT.

ACTIVATE <expL1> - determină, funcţie de valoarea expresiei logice

specificate, trecerea sau nu la citirea câmpurilor definite într-o altă fereastră.

DEACTIVATE <expL2> - stabileşte, funcţie de valoarea expresiei

specificate, dacă READ este sau nu terminat.

MODAL – inhibă afişarea altor ferestre , cu excepţia celor implicate în

READ.

WITH <listă_nume_ferestre> - permite ca ferestre care nu conţin

câmpuri asociate cu GET să poată participa la READ. Aşa pot fi ferestre

Browse, ferestre de editare, etc. Ca efect, vor fi afişate pe ecran ferestrele

implicate în READ şi cele specificate în lista WITH.

VALID <expL3><expN1> - permite controlul asupra reluării, dacă

este cazul, a execuţiei comenzii READ, cu ajutorul unei expresii logice sau

numerice, astfel:

Pentru expresie logică:

- dacă valoarea este .T. atunci comanda READ se încheie iar

programul continuă cu prima comandă de după Read;

- dacă valoarea este .F. atunci comanda READ se continuă, cursorul

rămânând pe acelaşi câmp asociat cu GET sau pe primul.

Page 91: Module 1-6 FoxPro

91

Pentru expresie numerică, aceasta se evaluează şi returnează un număr

care va reprezenta numărul câmpului (obiectului) Get pe care se va poziţiona

cursorul.Dacă nu există un astfel de obiect (cu acest număr), atunci Read se

încheie şi se va trece la prima comandă de după Read.

WHEN <expL4> - permite execuţia comenzii READ numai dacă

valoarea expresiei logice specificate este .T. (adevărat). Altfel, comanda READ

este ignorată (nu se execută deloc) şi se trece la comanda imediat următoare din

program.

TIMEOUT <expn2> - serveşte pentru a limita timpul cât comanda

READ aşteaptă de la utilizator introducerea unor valori de la tastatură în

câmpul asociat cu GET curent. Acest timp, exprimat în secunde, este dat de

expresia numerică specificată . Dacă utilizatorul nu apasă nici o tastă în

întervalul respectiv de timp, comanda READ este automat terminată.

NOMOUSE – împiedică selectarea obiectelor prin intermediul mouse-

ului, permiţând accesul la ele doar prin intermediul tastaturii.

LOCKNOLOCK – permite blocarea automată sau nu a accesului la

câmpurile citite cu READ pentru lucrul în reţea.

COLOR SCHEME <expN3>COLOR <listă_culori> - permite, aşa

cum se ştie, alegerea culorilor la afişare

Exemple:

Să se afişeze pe ecran prima înregistrare din tabela PERS pe o machetă

de forma:

NUME: MARCA: LOC MUNCĂ:

DATA NAŞTERII: ADRESA: TELEFON:

FUNCTIA: SALARIUL DE ÎNCADRARE:

şi să permită modificarea oricăreia dintre datele afişate.

CLEAR

USE PERS

@ 5,1 SAY “NUME:” GET NUME

@ 5,30 SAY “MARCA:” GET MARCA

@ 5,50 SAY “LOC MUNCA:” GET LOCM

@ 7,1 SAY “DATA NAŞTERII:” GET DATAN

@ 7,24 SAY “TELEFON:” GET TEL

@ 7,47 SAY “ADRESA:” GET ADRESA

@ 9,1 SAY “FUNCŢIA:” GET FUNCT

@ 5,40 SAY “SALARIUL DE ÎNCADRARE:” GET SAL

READ

CLOSE ALL

Page 92: Module 1-6 FoxPro

92

4.7.3. Afişare formatată şi lucrul cu butoane de control

Se ştie că videoformatele pentru citirea şi afişarea dorită a datelor pe

ecran pot conţine şi diverse butoane (obiecte) de control. Un buton reprezintă o

zonă de pe ecran prin care sistemul Foxpro comunică cu utilizatorul într-un

mod eficient, elegant, plăcut.

Butoanele se definesc cu ajutorul comenzii @ cu GET şi PICTURE

şi/sau FUNCTION şi se activează efectiv cu comanda READ.

Pentru a defini un buton trebuie precizate următoarele elemente:

Textul explicativ al butonului – care se specifică în mod explicit

într-o clauză de tip PICTURE sau FUNCTION. Acest text poate

conţine, la început sau în interiorul său, caractere speciale cu

următoarea semnificaţie:

\<literă> litera respectivă va fi literă luminoasă în textul afişat şi

tastă directă de selectare;

\\ dezactivează butonul respectiv;

\! declară butonul implicit ( la cele de tip PUSH)

\? declară butonul de ieşire

Caracteristicile butonului se stabilesc prin codurile de format din

clauzele PICTURE sau FUNCTION. Acestea pot fi:

1) tipul butonului, care se specifică prin opţiunile:

* reprezintă un buton de acţiune (declanşator);

*R reprezintă un buton de tip Radio;

C reprezintă un comutator (Check Box);

& reprezintă o listă;

^ reprezintă un meniu vertical;

I reprezintă un buton invizibil.

2) modul de citire pe care o controlează, exprimată prin:

T reprezintă citire terminală;

N reprezintă citire neterminală.

3) modalitatea de afişare pe ecran, care poate fi:

H afişare pe orizontală;

V afişare pe verticală.

Tipul de acţiune declanşat de selectarea butonului

În acest sens trebuie făcute următoarele precizări:

Dacă butonul a fost cu citire terminată, atunci acţiunea se defineşte după

comanda READ de citire a butonului. Pentru butonul cu citire neterminată,

acţiunea se defineşte în clauza VALID asociată butonului.

Page 93: Module 1-6 FoxPro

93

După selectarea butonului, în variabila asociată butonului se va memora

fie textul butonului, fie poziţia acestuia sau starea lui în cazul în care este

comutator.

Sub Foxpro au fost implementate următoarele tipuri de astfel de

butoane:

Check box sau buton Check este de fapt un comutator cu două

stări – folosit pentru a alege între două valori posibile: adevărat sau

fals. El apare pe ecran cu [] având un text explicativ în dreapta.

Dacă este activat apare [x], altfel apare [ ].

Comanda pentru crearea unui comutator are formatul:

@ L,C GET <variabilă> [PICTURE <exprC1>] [FUNCTION

<exprC2>] [DEFAULT <exp1>] [ENABLEDISABLE] [MESSAGE

<exprC3>] [SIZE <expN1>,<expN2>] [VALID <expL1><expN3>]

[WHEN <expL2>] [COLOR SCHEME <expN4>COLOR <listă_culori>]

READ

unde:

L,C reprezintă coordonatele punctului de pe ecran unde va apare

comutatorul.

Efectul alegerii făcute de utilizator se va memora în variabila

specificată, care va trebui să fie de tip logic sau numeric, la execuţia comenzii

READ.

Dacă este de tip numeric, valoarea nulă înseamnă buton neselectat, în

timp ce o valoare diferită de 0 va însemna buton activat. Dacă este de tip logic,

valoarea de “adevărat” înseamnă buton selectat, în timp ce “fals” ănseamnă

buton neactivat.

Precizarea faptului că definim un buton check sau comutator se va face

astfel:

- FUNCTION „*C Activ„ sau

- PICTURE „@*C Activ„ sau

- FUNCTION „*C „ PICTURE „Activ‟

Opţiunea SIZE stabileşte dimensiunea butonului pe ecran . Înălţimea

acestuia va fi totdeauna = un caracter, dar a doua expresie va preciza lăţimea

butonului.

Celelalte opţiuni au acelaşi efect ca la comanda de afişare formatată cu

citirea datelor.

Exemple:

CLEAR

Page 94: Module 1-6 FoxPro

94

ACTIV=.T.

@ 2,5 GET ACTIV FUNCTION „*C Activ‟

READ

Sau

@ 2,5 GET ACTIV PICTURE „@*C Activ‟

READ

Sau

@ 2,5 GET ACTIV FUNCTION „*C‟ PICTURE „Activ‟

READ

Butonul listă sau pe scurt, lista – este un element similar unei liste

obişnuite, care permite selectarea unui singur element dintr-o listă

afişată total sau parţial pe ecran, în interiorul unui cadran, având

elementele dispuse în plan vertical.

Dacă lista e parţială, în dreapta apare o bară de defilare, care va permite

defilarea listei în cadran. În acest caz, comanda @ se prezintă astfel:

@ L,C GET <variabilă><câmp> FROM <masiv> [POPUP

<nume_submeniu>] [PICTURE <exprC1>] [FUNCTION <exprC2>]

[DEFAULT <exp1>] [ENABLEDISABLE] [MESSAGE <exprC3>] [SIZE

<expN1>,<expN2>] [VALID <expL1><expN3>] [WHEN <expL2>]

[COLOR SCHEME <expN4>COLOR <listă_culori>]

READ

unde:

L,C – reprezintă coordonatele punctului din stânga sus al cadranului în

care se va afişa lista

Elementele listei pot fi preluate fie dintr-un masiv, caz în care se

foloseşte opţiunea FROM masiv, fie dintr-un submeniu, caz în care se utilizează

opţiunea POPUP nume_submeniu.

Variabila sau câmpul de date precizate la GET servesc pentru a

memora selecţia făcută de utilizator şi trebuie să fie de tip numeric sau şir de

caractere.

Dacă este de tip numeric, va memora poziţia din listă a elementului

selectat. Dacă este de tip şir de caractere, va memora chiar textul elementului

selectat.

Opţiunile specifice:

- FUNCTION „&T‟ sau „&N‟ pentru listă Terminată sau

Neterminată;

- PICTURE „@&T‟ sau „@&N‟ pentru listă Terminată sau

Neterminată;

Page 95: Module 1-6 FoxPro

95

Exemple:

Dintr-o listă de opţiuni posibile, să se scrie secvenţa de comenzi pentru

alegerea unei opţiuni. Realizaţi o listă ascunsă cu opţiunile respective.

CLEAR

DIMENSION OPTIUNI[4]

OPTIUNI[1]= „Adaugare‟

OPTIUNI[2]= „Modificare‟

OPTIUNI[3]= „Stergere‟

OPTIUNI[4]= „Terminare‟

OPT=„Terminare‟

@ 10,2 SAY “Alegeţi opţiunea dorită:” GET OPT FUNCTION „&‟ FROM

OPTIUNI SIZE 20,2 MESSAGE „OPTIUNI‟

READ

CLEAR

@ 15,10 SAY „OPTIUNEA ALEASA ESTE „

@ 15,33 SAY OPT

Buton popup sau Lista ascunsă – este asemănător listei simple, cu

deosebirea că pe ecran apare afişat, în orice moment dinaintea

activării, elementul curent selectat, cuprins într-un chenar cu

marginea inferioară dublă. La activare, lista se prezintă sub forma

unui meniu vertical, din care elementul dorit se selectează cu tastele

Enter sau Space.

Formatul comenzii se prezintă astfel:

@ L,C GET <variabilă> [PICTURE <exprC1>] [FUNCTION

<exprC2>] [DEFAULT <exp1>] [FROM <masiv>] [ENABLEDISABLE]

[MESSAGE <exprC3>] [SIZE <expN1>,<expN2>] [VALID

<expL1><expN3>] [WHEN <expL2>] [COLOR SCHEME

<expN4>COLOR <listă_culori>]

READ

unde:

- L,C - reprezintă coordonatele colţului din stânga sus al listei

- variabila – poate fi o variabilă de memorie, un element al unui masiv

sau un câmp de date din tabela activă, în care se va memora fie poziţia

elementului selectat în listă fie chiar textul corespunzător al acestuia,

după cum este de tip numeric sau şir de caractere.

Opţiuni specifice:

- FUNCTION „^‟

Page 96: Module 1-6 FoxPro

96

- PICTURE „@^‟

Exemple:

1. Listă ascunsă terminală

CLEAR şterge ecranul

n=1

@ 5,5 GET n FUNCTION „^T Luni,Marţi,Miercuri,Joi,Vineri‟

READ

2. Listă ascunsă neterminală

CLEAR şterge ecranul

a=‟Luni‟

@ 5,5 GET a FUNCTION „^N Luni,Marţi,Miercuri,Joi,Vineri‟

READ

3. Listă ascunsă neterminală cu taste directe de selectare

CLEAR şterge ecranul

a=‟Luni‟

@ 5,5 GET a PICTURE „@^N

\<Luni,\<Marţi,Mie\<rcuri,\<Joi,\<Vineri‟

READ

4 Listă ascunsă cu două elemente dezactivate (Miercuri şi Joi)

CLEAR şterge ecranul

a=‟Luni‟

@ 5,5 GET a PICTURE „@^N Luni,Marţi,\Miercuri,\Joi,Vineri‟

READ

Butonul PUSH sau declanşator – are ca efect declanşarea unei acţiuni

şi apare pe ecran sub forma a două paranteze unghiulare care încadrează

un text explicativ. Pot fi definite mai multe declanşatoare, pentru care se

precizează atributele cu ajutorul opţiunilor PICTURE şi FUNCTION. În

plus, un declanşator poate fi:

- declanşator implicit , care este selectat în mod automat la apăsarea

tastelor Ctrl/Enter şi care apare pe ecran marcat între paranteze

unghiulare duble <<text>>.

- declanşator Escape, care se prezintă ca unul normal, dar care este

selectat automat la acţionarea tastei Escape.

Page 97: Module 1-6 FoxPro

97

Se defineşte cu comanda @ având următorul format general:

@ L,C GET <variabilă> [PICTURE <exprC1>] [FUNCTION

<exprC2>] [DEFAULT <exp1>] [ENABLEDISABLE] [MESSAGE

<exprC3>] [SIZE <expN1>,<expN2>] [VALID <expL1><expN3>] [WHEN

<expL2>] [COLOR SCHEME <expN4>COLOR <listă_culori>]

READ

unde:

- L,C reprezintă coordonatele primului buton definit

- variabila poate fi o variabilă de memorie sau un câmp de date din

tabela activă

Opţiuni specifice:

- FUNCTION „*‟

- PICTURE „@*‟

Exemple:

1.

CLEAR

a=‟Start‟

@ 5,5 GET a FUNCTION „* Start,Stop‟

READ

2 Declanşatoare cu taste directe de selectare

CLEAR

a=‟Start‟

@ 5,5 GET a FUNCTION „* \<Start,S\<top‟

READ

3

CLEAR

a=‟Start‟

@ 5,5 GET a PICTURE „@* Start,Stop‟

READ

Butonul invizibil sau declanşatorul invizibil – este un declanşator

care nu apare pe ecran, deşi există acolo. De regulă deasupra lui se

afişează un text cu ajutorul comenzilor @ cu SAY, fără să i se

afecteze caracterul de declanşator.

Se defineşte cu comanda @ cu formatul general asemănător cu cel de la

declanşatorul simplu, dar se specifică caracterele de control aferente:

- FUNCTION „*!‟

- PICTURE „@*!‟

Page 98: Module 1-6 FoxPro

98

Variabila va memora poziţia declanşatorului invizibil selectat (numărul

lui de ordine în cadrul listei).

Printr-o comandă @ cu GET cu codul FUNCTION *! se poate creea un

buton invizibil sau mai multe astfel de butoane. Pentru a crea mai multe

butoane, se ataşează, la distanţă de un spaţiu de codul specific *! câte un

caracter ; pentru fiecare declanşator suplimentar.

Butonul radio – permite selectarea unui singur element dintr-o listă

de elemente afişate pe ecran. Selectarea unui astfel de buton atrage

deselectarea automată a vechiului element selectat.

Se prezintă sub forma a două paranteze () urmate de un text explicativ.

Butonul selectat este marcat cu (.)

Se defineşte cu comanda @ cu GET, cu formatul asemănător celorlalte

butoane, numai că se vor preciza caracterele de control specifice şi anume:

- FUNCTION „*R‟

- PICTURE „@*R‟

Se pot defini şi celelalte atribute ale unui buton: Terminal, Neterminal,

(H) orizontal,Vertical, dezactivat sau cu tastă directă de selectare.

Exemplu:

CLEAR

@ 5,5 SAY „Alegeţi ziua convenabila‟

zi=‟Luni‟

@ 8,8 GET zi FUNCTION „*RTV

\<Luni;\<Marti;mie\<Rcuri;\<Joi;\<Vineri;\\ \<Simbata;\\ \<Duminica‟

READ

Precizări:

Variabila ZI va conţine numele zilei selectate prin poziţionare sau prin

acţionarea tastei luminoase. Se ştie că R semnifică un buton Radio, T un buton

de tip terminal, iar V butoane dispuse vertical. Ele vor apare pe ecran astfel:

() Luni

() Marti

() MieRcuri

() Joi

() Vineri

() Simbata

() Duminica

Page 99: Module 1-6 FoxPro

99

4.8. Proceduri şi funcţii definite de utilizator

Complexitatea din ce în ce mai mare a problemelor ce se impun rezolvate

cu calculatorul, dimensiunea tot mai mare a colecţiilor de date ce trebuie prelucrate

impun un efort de analiză, proiectare, programare şi implementare a aplicaţiilor tot

mai mare şi mai costisitor. De aceea, descompunerea problemei, a algoritmului de

rezolvare în elemente funcţionale de sine stătătoare, stabilirea corectă a relaţiilor

dintre aceste elemente şi ierarhizarea lor faţă de ansamblu constituie o prioritate în

activitatea de proiectare.

Abordarea modulară a problemelor duce la realizarea procedurilor, ca

secvenţe logice de comenzi Foxpro, apelabile prin nume dintr-un program, care

pot realiza diverse funcţii.

O procedură returnează controlul programului apelant, la comanda

imediat următoare celei care a apelat-o. Se returnează simultan şi rezultatele de

natură locală sau globală obţinute din prelucrare.

Procedura se defineşte cu comanda:

PROCEDURE <nume_procedură>

şi se termină totdeauna cu

RETURN

Apelul unei proceduri se face cu comanda

DO <nume_procedură> [WITH <listă_parametri>]

[IN <nume_fişier_proceduri>]

unde:

- nume_procedură – este numele cu care a fost denumită procedura în

comanda PROCEDURE.

- clauza IN este opţională şi specifică, dacă este cazul, numele

fişierului în care a fost memorată procedura.

-

4.9. Comenzi pentru lucru cu ferestre

Fereastra este un element important al sistemului Foxpro, reprezentând

o porţiune de ecran tratată ca un un tot unitar, cu anumite caracteristici, care fac

posibilă realizarea unei interfeţe plăcute, atractive şi uşor de manipulat pentru

utilizatorul de orice tip.

Sistemul Foxpro lucrează cu ferestre proprii, cum sunt cea de comenzi,

de editare, de tip Browse, etc... dar permite şi definirea unor ferestre de către

utilizator.

Lucrul cu ferestre presupune parcurgerea următorilor paşi:

Page 100: Module 1-6 FoxPro

100

- se definesc ferestrele, cu comanda DEFINE WINDOW, când se

precizează şi caracteristicile lor;

- se afişează pe ecran cu comenzile ACTIVATE WINDOW sau

SHOW WINDOW

- se înlătură de pe ecran cu comenzileDEACTIVATE WINDOW sau

HIDE WINDOW

- se înlătură din memorie şi de pe ecran cu comenzile CLEAR

WINDOWS sau RELEASE WINDOWS

Definirea unei ferestre:

DEFINE WINDOW <nume_fer> FROM <l1,c1> TO <l2,c2> [IN

[WINDOW] <nume_fer2>IN SCREEN] [FOOTER <expC1>]

[TITLE<expC2>] [DOUBLEPANELNONE<listă_chenare>]

[CLOSENOCLOSE] [FLOATNOFLOAT] [MINIMIZE]

[SHADOW] [FILL <expC3>] [COLOR <listă_culori>COLOR

SCHEME <expN>]

unde:

- nume_fer reprezintă numele dat ferestrei care se defineşte, cu care

va fi apelată şi care trebuie să fie un cuvânt de maxim 10 caractere.

- l1,c1 – coordonatele colţului din stânga sus al ferestrei, relative la

ecran sau la fereastra părinte (dacă există).

- l2,c2 – coordonatele colţului din dreapta jos al ferestrei, relative la

ecran sau la fereastra părinte (dacă există).

- TITLE – specifică titlul pe care să-l afişeze fereastra

- DOUBLE – cere chenar cu linie dublă

- PANEL - chenar plin

- NONE – fără chenar

- <listă_chenar> - caracterele din care să fie realizat chenarul, sub

forma: c1,12,c3,c4,c5,c6,c7,c8, cu semnificaţia:

c1 – Latura superioară

c2 – Latura inferioară

c3 – Latura stângă

c4 – Latura dreaptă

c5 – Colţul din stânga sus

c6 - Colţul din dreapta sus

c7 - Colţul din stânga jos

c8 - Colţul din dreapta jos

- CLOSENOCLOSE -specifică de a închide sau nu fereastra

- FLOATNOFLOAT – permite sau nu ca fereastra să fie mutată pe

ecran sau în interiorul ferestrei părinte.

Page 101: Module 1-6 FoxPro

101

- MINIMIZE – permite reducerea dimensiunilor ferestrei la

dimensiunea minimă

- SHADOW – specifică prezenţa umbrei la afişarea unei ferestre

- FILL <expC3> - specifică un caracter dorit folosit la afişarea

fondului ferestrei

- COLOR <listă_culori>COLOR SCHEME <expN> - specifică,

aşa cum se ştie, combinaţia de culori pentru fereastră

Activarea şi deci afişarea pe ecran a ferestrei anterior definite se face cu

comanda:

ACTIVATE WINDOW <nume_fer1> [,<nume_fer2>...][ALL] [IN

WINDOW <nume_fer3>SCREEN] [TOPBOTTOM]

[ NOSHOW]

unde:

- nume_fer1 – este fereastra care se activează; eventual şi

nume_fer2,etc sau toate dacă s-a specificat ALL

- IN WINDOW – numele ferestrei părinte, în care se afişează

fereastra acum activată ( sau pe ecran dacă este SCREEN)

- TOP sau BOTTOM – specifică dacă fereastra se va afişa în faţa

tuturor ferestrelor existente pe ecran (TOP) sau în spatele acestora.

- NOSHOW- fereastra este activată, există, dar nu apare pe ecran

Afişarea unei ferestre, fără a afecta locul de transmitere a comenzilor de

ieşire Foxpro se va face cu comanda:

SHOW WINDOW <nume_fer1> [,<nume_fer2>...] [ALL]

[IN WINDOW <nume_fer>IN SCREEN] [TOPBOTTOM]

unde:

nume_fer1,nume_fer2.. sunt numele ferestrei/ferestrelor care se vor

afişa, fără a deveni însă ferestre active de lucru.

Opusă comenzii SHOW deoarece elimină de pe ecran una sau mai multe

ferestre, după cum dorim, fără a le şterge însă din memorie, este comanda

HIDE WINDOW, cu formatul:

HIDE WINDOW <nume_fer1> [,<nume_fer2>...] [ALL]

[IN WINDOW <nume_fer>IN SCREEN] [SAVE]

unde:

ALL – ascunde toate ferestrele existente pe ecran în acel moment

SAVE – pentru a păstra pe ecran imaginea ferestrei şi după ascunderea sa

Pentru a modifica fereastra curentă, se foloseşte comanda:

DEACTIVATE WINDOW <nume_fer1> [,<nume_fer2>...]

[ALL]

Ca efect va deveni fereastră curentă fereastra activată anterior, dacă

există, sau ecranul în caz contrar.

Page 102: Module 1-6 FoxPro

102

Înlăturarea ferestrelor , din memorie şi de pe ecran, se face cu comanda:

RELEASE WINDOWS <listă_fer>

Pentru a elimina de pe ecran şi din memorie toate ferestrele, se poate

folosi comanda:

CLEAR WINDOWS

Exemple:

define wind sus from 3,0 to 9,79 title " Emitere aviz expeditie "

define wind mijloc from 10,0 to 22,79

define wind total from 22,0 to 24,79 color b/b

acti wind total

@ 0,20 say "Pentru a termina apasati tasta END" color g+/b

activate wind sus

@ 0,1 say "Numarul Avizului: "

@ 0,20 say nrc

@ 0,40 say "Nr inregistr fiscala: "

4.10. Comenzi pentru definirea şi gestionarea meniurilor

Sistemul FOXPRO pune la dispoziţia utilizatorului propriul său meniu,

numit meniu sistem, dar permite utilizatorului sau programatorului să-şi

definească propriile meniuri, pe care să le includă apoi în programele de

aplicaţii.

Se ştie că un meniu reprezintă practic o listă de opţiuni posibile la un

moment dat, afişate pe ecran total sau parţial, utilizatorul având posibilitatea să

selectezs acţiunea dorită. În funcţie de opţiunea selectată, se va declanşa o

acţiune corespunzătoare.

Practic, pentru a lucra cu meniuri, se parcurg următorii paşi:

- Se defineşte meniul respectiv, prin etapele:

a) definirea barei meniului , căruia i se dă un nume

b) definirea opţiunilor bară

c) definirea submeniurilor

d) definirea opţiunilor pentru fiecare submeniu

e) definirea acţiunilor care se execută la alegerea unei opţiuni

- Se activează meniul, urmând a se selecta opţiunea dorită a acestuia

(de către utilizator)

- În final, se elimină meniul din memorie ( se şterge)

Meniurile pot fi:

- orizontale (tip MENU)

- verticale (tip POPUP)

Page 103: Module 1-6 FoxPro

103

Meniuri verticale ( POPUP )

Un meniu POPUP conţine o listă de opţiuni ce vor fi definite prin

comanda DEFINE POPUP. Aceste opţiuni se apelează prin deplasarea unei bare

de selecţie sau prin tastarea literei evidenţiate (tastă directă) din cadrul opţiunii.

Selectarea unei opţiuni din cadrul meniului Popup este urmată :

- fie de execuţia unei operaţii

- fie de afişarea unui submeniu ierarhizat, care implică utilizarea

comenzii ON BAR.

Definirea opţiunilor se face cu comanda DEFINE BAR, iar definirea

acţiunilor ce vor urma selectării unei opţiuni a meniului cu comenzile ON

SELECTION BAR.

Activarea meniului se va face cu comanda ACTIVATE POPUP, iar

dezactivarea lui cu comanda DEACTIVATE POPUP.

Descrierea comenzilor

DEFINE POPUP <nume_popup> [FROM <l1,c1>] [TO <l2,c2>] [

IN [WINDOW] <nume_fer>IN SCREEN] [KEY <def_tastă>]

[MESSAGE <expC>] [PROMPT <specificaţie>] [TITLE <expC2>]

[MARGIN] [SCROLL] [SHADOW] [COLOR

<listă_culori>COLOR SCHEME <expN>]

unde:

- nume_popup – este numele submeniului care se defineşte, de tip vertical

- l1,c1 – indică poziţia colţului din stânga sus al submeniului

- l2,c2 – indică poziţia colţului din dreapta jos

- IN WINDOW – defineşte submeniul în interiorul ferestrei specificate, altfel

ea apare pe ecran sau automat în fereastra activă în acel moment

- KEY – defineşte o cale directă (o combinaţie de taste) de acces direct la

submeniu

- MESSAGE – cere afişarea mesajului specificat pe ultima linie a ecranului

sau a ferestrei active, ca text explicativ sau suplimentar ataşat meniului

- PROMPT stabileşte de fapt tipul submeniului vertical. Astfel, dacă lipseşte,

opţiunile meniului urmează să fie definite cu comenzi DEFINE BAR. Dacă

există PROMPT, atunci ea poate fi de forma:

a) PROMPT FIELD <expr> – caz în care opţiunile submeniului vor

fi preluate din tabele activă , din câmpul sau combinaţia de câmpuri stabilită

prin <expr>

b) PROMPT FILES [LIKE <mască>] – caz în care opţiunile sunt

numele fişierelor de pe disc sau dintr-un anumit director, eventual care

corespund specificatorului multiplu definit prin mască.

Page 104: Module 1-6 FoxPro

104

c). PROMPT STRUCTURE – caz în care opţiunile din submeniu sunt

numele câmpurilor definite în structura tabelei active

- TITLE <expC2> specifică titlul afişat pentru meniu

- MARGIN – cere ca opţiunile să fie separate de chenar printr-un spaţiu

- SCROLL – are ca efect afişarea unei bare de defilare verticală pe marginea

din dreapta a chenarului submeniului.

- SHADOW – cere afişarea cu efectul de umbră a submeniului

Comanda DEFINE BAR

Permite definirea şi crearea opţiunilor din cadrul unui meniu vertical,

altele decât cele de tip PROMPT.

DEFINE BAR <nr> OF <nume_popup> PROMPT <expC1> [KEY

<def_tastă>[,<expC2>]] [MESSAGE <expC3>] [COLOR

<listă_culori> COLOR SCHEME <expN>]

unde:

- nr – este un număr asignat opţiunii respective din meniu

- OF nume_popup – precizează numele meniului popup din care face parte

opţiunea

- PROMPT – specifică textul care se va afişa în meniu, ca opţiune

- KEY – defineşte combinaţia de taste prin care se accesează opţiunea

- MESSAGE – afişează mesajul specificat ca urmare a poziţionării cursorului

pe opţiunea respectivă

- COLOR – combinaţia de culori dorită

Selectând o opţiune din meniul descris, se poate cere:

a). activarea unui alt submeniu (de regulă tot vertical) cu comanda ON

BAR

b). executarea unei anumite comenzi cu comanda ON SELECTION

BAR

ON BAR <nr> OF <nume_popup>

[ACTIVATE MENU <nume_meniu_oriz>] sau

ACTIVATE POPUP <nume_popup>]

unde:

- nr – reprezintă numărul opţiunii din meniul POPUP la care se referă

- ACTIVATE – specifică numele şi tipul submeniului activat prin selectarea

opţiunii

ON SELECTION BAR <nr> OF <nume_popup> <comandă>

unde:

- nr- reprezintă numărul de ordine al opţiunii

Page 105: Module 1-6 FoxPro

105

- comanda – comanda ce va fi executată prin selectarea respectivei opţiuni.

Afişarea şi activarea, pe ecran sau într-o fereastră, a unui meniu vertical

definit anterior se face cu comanda:

ACTIVATE POPUP <nume_popup>]

Dezactivarea meniurilor verticale şi renunţarea la afişarea lor pe ecran

sau într-o fereastră se face cu comanda:

DEACTIVATE POPUP <nume_popup1> [,<nume_popup2>...]

[ALL]

Ca efect se dezactivează meniul sau meniurile cu numele specificate,

eventual toate cele existente active, dacă s-a specificat ALL.

Afişarea unui meniu vertical sau a mai multora , pe ecran sau într-o

fereastră, fără a le activa însă se face cu comanda:

SHOW POPUP <nume_popup1> [,<nume_popup2>...] [ALL]

[SAVE]

unde: SAVE permite păstrarea pe ecran a imaginii meniurilor popup până la

prima comandă CLEAR.

Ascunderea unui meniu sau a mai multora , afişate pe ecran sau într-o

fereastă, astfel încât să rămână active în memorie se face cu comanda:

HIDE POPUP <nume_popup1> [,<nume_popup2>...] [ALL]

Meniuri orizontale – tip MENU

Un meniu MENU conţine o listă de opţiuni afişate orizontal. Uzual, un

meniu orizontal apelează meniuri verticale, afişate ca urmare a selectării

opţiunilor componente.

Pentru aceasta, se defineşte mai întâi meniul orizontal, cu comanda

DEFINE MENU, apoi se definesc opţiunile sale cu comanda DEFINE PAD.

Selectarea unei opţiuni din cadrul meniului orizontal este urmată :

- fie de execuţia unei operaţii, precizată cu comanda ON

SELECTION PAD

- fie de activarea unui submeniu vertical, care implică utilizarea

comenzii ON PAD.

Urmează apoi definirea meniurilor verticale (DEFINE POPUP), a

opţiunilor componente (DEFINE BAR) şi a acţiunilor ce vor urma selectării

unei opţiuni a meniului cu comenzile ON SELECTION BAR. sau ON BAR.

Activarea meniului orizontal se va face cu comanda ACTIVATE

MENU, iar dezactivarea lui cu comanda DEACTIVATE MENU.

Descrierea comenzilor

Page 106: Module 1-6 FoxPro

106

DEFINE MENU <nume_meniu> [BAR [AT LINE <expN>]]

[IN [WINDOW] <nume_fer>IN SCREEN] [KEY <def_tastă>]

[MESSAGE <expC>] [NO MARGIN]

[COLOR <listă_culori>COLOR SCHEME <expN>]

unde:

- nume_meniu – este numele meniului care se defineşte, de tip orizontal

- AT LINE – indică linia pe care să fie afişată bara orizontală a meniului

- IN WINDOW –cere ca meniul să apară în interiorul ferestrei specificate,

altfel ea apare pe ecran sau automat în fereastra activă în acel moment

- KEY – defineşte o cale directă (o combinaţie de taste) de acces direct la

meniu

- MESSAGE – cere afişarea mesajului specificat pe ultima linie a ecranului

sau a ferestrei active, ca text explicativ sau suplimentar ataşat meniului

- COLOR –precizează combinaţia de culori dorită

Comanda DEFINE PAD

Permite definirea şi crearea opţiunilor din cadrul unui meniu orizontal.

DEFINE PAD <nume_opţiune> OF <nume_meniu> PROMPT

<expC1> [KEY <def_tastă>[,<expC2>]] [MESSAGE <expC3>]

[COLOR <listă_culori> COLOR SCHEME <expN>]

unde:

- nume_opţiune – este numele opţiunii respective din meniu

- OF nume_meniu – precizează numele meniului orizontal din care face

parte opţiunea

- PROMPT – specifică textul care se va afişa în meniu, ca opţiune

- KEY – defineşte combinaţia de taste prin care se accesează opţiunea

- MESSAGE – afişează mesajul specificat ca urmare a poziţionării cursorului

pe opţiunea respectivă

- COLOR – combinaţia de culori dorită

Selectând o opţiune din meniul descris, se poate cere:

a) activarea şi afişarea unui alt meniu, de regulă vertical, cu comanda ON PAD

b) executarea unei anumite comenzi cu comanda ON SELECTION PAD

ON PAD <nume_opt> OF <nume_meniu>

[ACTIVATE MENU <nume_meniu>] sau

ACTIVATE POPUP <nume_popup>]

unde:

nume_opt – reprezintă numele opţiunii din meniul orizontal la care se referă

ACTIVATE – specifică numele şi tipul submeniului activat prin selectarea

opţiunii

Page 107: Module 1-6 FoxPro

107

ON SELECTION PAD <nume_opt> OF <nume_meniu>

<comandă>

unde:

nume_opt - reprezintă numele opţiunii din meniul orizontal

comanda – comanda ce va fi executată prin selectarea respectivei opţiuni

Afişarea şi activarea, pe ecran sau într-o fereastră, a unui meniu

orizontal definit anterior se face cu comanda:

ACTIVATE MENU <nume_meniu>]

Dezactivarea meniurilor orizontale şi renunţarea la afişarea lor pe ecran

sau într-o fereastră se face cu comanda:

DEACTIVATE MENU <nume_meniu> [,<nume_meniu2>...] [ALL]

Ca efect se dezactivează meniul sau meniurile cu numele specificate,

eventual toate cele existente active, dacă s-a specificat ALL.

Afişarea unui meniu orizontal sau a mai multora , pe ecran sau într-o

fereastră, fără a le activa însă, se face cu comanda:

SHOW MENU <nume_meniu1> [,<nume_meniu2>...] [ALL]

[SAVE]

unde SAVE permite păstrarea pe ecran a imaginii meniurilor orizontale până la

prima comandă CLEAR.

Ascunderea unui meniu sau a mai multora , afişate pe ecran sau într-o

fereastră, astfel încât să rămână active în memorie se face cu comanda:

HIDE MENU <nume_meniu1> [,<nume_meniu2>...] [ALL]

4.11. Comenzi pentru setarea parametrilor de lucru sub SGBD

Foxpro

Comanda SET

Această comandă, fără specificarea unor argumente, determină afişarea

meniului principal (vizualizarea ferestrei View). Acelaşi efect se obţine prin

intermediul meniului principal FoxPro, activând meniul Window şi apoi

selectând View. Meniul principal are 5 variante posibile de alegere după cum

urmează:

Meniul OPTIONS prezintă parametrii implicati ai majoritatii

comenzilor. Aceştia pot fi modificaţi în funcţie de cerinţele utilizatorului.

Meniul DISPLAY permite modificarea parametrilor de afişare a testului,

a liniilor de titlu, a liniei de stare şi a liniei câmpurilor, precum şi a parametrilor

privind culoarea şi intensitatea.

Meniul KEYS permite programarea anumitor taste de funcţii şi

combinaţii de taste.

Page 108: Module 1-6 FoxPro

108

Meniul DISK este utilizat pentru a schimba unitatea de disc implicită şi

calea de acces.

Meniul FILES permite să se aleaga fişiere dintre urmatoarele tipuri:

ALTERNATE, DEVICE, FORMAT, INDEX.

Ieşirea din meniuri se realizează cu <CTRL>+<END> (când se doreşte

să se menţină toate schimbările efectuate unei comenzi SET pe parcursul unei

sesiuni de lucru) sau <ESC> (când nu sunt salvate selecţiile operate).

În Anexa nr. 2 se prezintă comenzile SET cele mai frecvent utilizate în

FOXPRO.

PRODUSE PROGRAM REALIZATE IN LIMBAJUL DE

PROGRAMARE FOXPRO

*************************************************************

* FOXPRO APLICAŢIA NR. 1

*************************************************************

* Baza de date TELOFON ( NUME, TELEFON) se afla pe discul C. Realizaţi

o aplicaţie şi scrieţi * un program care să afişeze numărul de telefon al

persoanei căutate.

*************************************************************

* Nume Program : ap1.prg; * Fişiere folosite : telefon.dbf

*************************************************************

SET TALK OFF

SET COLOR TO BG/N

USE telefon IN 1 ORDER nume

STORE SPACE(15) TO Num

@2,2 SAY "Tastaţi numele căutat:" GET Num

READ

SEEK Num

IF .NOT. FOUND()

@5,2 SAY "Numele căutat nu se află în baza de date telefon.dbf"

WAIT " "

ELSE

@5,2 SAY " Numărul de telefon este: "+Telefon

WAIT " "

ENDIF

CLEAR

CLOSE ALL

Page 109: Module 1-6 FoxPro

109

*************************************************************

FOXPRO: APLICAŢIA NR. 2 ap2.prg

*************************************************************

Baza de date PERSONAL(NUME, ADRESA, TELEFON, DATA_ANGAJ)

se află pe discul C *în directorul STUDIU. Scrieţi un program care să listeze:

numele, adresa şi numărul de telefon al persoanelor angajate în ultimul an.

*************************************************************

setari iniţiale

set talk off

set status off

set scoreboard off

set color to gr+/n

set clock off

clear all

*

nr=0

use personal in 1

scan for data_angaj>date() - 365

display nume, adresa, telefon

nr=nr+1

endscan

?

? "Exista " +LTRIM(STR(NR))+"muncitori angajaţi în ultimul an"

?

wait

clear

*************************************************************

FOXPRO: APLICAŢIA NR. 3 ap3.prg

*************************************************************

Proiectaţi şi scrieţi un program DBASE care să permită listarea înregistrărilor

bazei de date PERSONAL.DBF ordonate după un câmp specificat.

* *************************************************************

SET TALK OFF

CLEAR

CLOSE ALL

ACCEPT " Tastaţi numele bazei de date: " to bd

USE &bd IN 1

R = " "

DO WHILE .T.

Page 110: Module 1-6 FoxPro

110

CLEAR

* afisare meniu

@1,1 SAY "1). Nume"

@2,1 SAY "2). Varsta"

@3,1 SAY "3). Vechime"

@4,1 SAY "4). Salar"

@5,1 SAY "5). Terminare"

optiune=1

@7,5 SAY " Tastaţi număr opţiune:" get optiune PICTURE "9"

RANGE1,5

READ

CLEAR

* analiză opţiune tastata

DO CASE

CASE optiune=1

câmp="NUME"

CASE opţiune=2

câmp="VARSTA"

CASE opţiune=3

câmp="VECHIME"

CASE opţiune=4

câmp="SALAR"

OTHERWISE

CANCEL

CLEAR

ENDCASE

* indexare după câmpul indexat

INDEX ON &camp TAG &camp

LIST OFF

WAIT

CLEAR

@3,3 SAY " Doriţi o altă listare? (D/N) " GET R PICTURE "A"

* VALID UPPER(R) = "D" .OR. UPPER(R) = "N"

READ

* continuare listări

IF UPPER(R) ="D"

LOOP

* terminare listări

ELSE

CLEAR

Page 111: Module 1-6 FoxPro

111

RETURN

ENDIF

ENDDO

* *************************************************************

* FOXPRO: APLICAŢIA NR. 4 : AP4.PRG

* *************************************************************

* Baza de date PRODUSE.DBF are structura: SORTIM, FIRMA, PREŢ,

BUCĂŢI Scrieţi un program care măreşte preţurile la macaroane"Spaghette"

cu 20%, la Ulei Măsline cu 65% şi la *ţigările "Marlboro" cu 78%. Preţul

celorlalte sortimente, indiferent de firmă, cu 150 lei. Se cere *valoarea mărfii

existente în stoc înainte şi după mărirea preţurilor

* *************************************************************

SET TALK OFF

CLEAR

USE PRODUSE

* calcularea valorii stocului de marfa înainte de scumpire

SUM(PRET * BUCATI) TO valinit all

? "VALOAREA INITIALA A STOCULUI :"

? valinit

WAIT " "

* majorări

REPLACE ALL PRET WITH PRET + 150

REPLACE ALL FOR SORTIM = "Macaroane" .AND. FIRMA ="Spaghette";

PRET WITH (PRET - 150)*1.2

REPLACE ALL FOR SORTIM = "Ulei" .AND. FIRMA = "Masline";

PRET WITH (PRET - 150)*1.65

REPLACE ALL FOR SORTIM = "Tigari" .AND. FIRMA ="Marlboro";

PRET WITH (PRET - 150) * 1.78

LIST

WAIT " "

* Calculul valorii stocului după majorări

SUM (PRET*BUCATI) TO valfinala ALL

? " VALOAREA FINALA = :"

? valfinală

?

? " MAJORAREA VALORII = :"

?? valfinală - valinit

WAIT " "

CLOSE ALL

Page 112: Module 1-6 FoxPro

112

* *************************************************************

* FOXPRO: APLICAŢIA NR. 5 ap5.prg

*************************************************************

* Baza de date PERS.DBF are structura: NUME, ADRESĂ, TELEFON Scrieţi

un program care *crează un nou fişier baza de date numit PERS1.DBF care are

aceleaşi câmpuri cu PERS.DBF dar *cu lungimea egală cu lungimea maximă

exitentă în câmpurile memorate. Copiaţi înregistrările din *fişierul iniţial şi

apoi ştergeţi fişierul PERS.DBF

* ****************************************

SET TALK OFF

CLEAR

USE pers

COPY STRUCTURE EXTENDED TO pers1.dbf

USE pers1

* STERGERE BAZA DE DATE

ZAP

USE pers

DO calc_lun

* SE CALCULEAZĂ LUNGIMEA MAXIMĂ A ÎNREGISTRĂRILOR ŞI SE

INLOCUIEŞTE

* LUNGIMEA CÂMPURILOR

USE PERS1

APPEND BLANK

REPLACE FIELD_NAME WITH "Nume", FIELD_TYPE WITH "C",

FIELD_LEN;

WITH MaxN

APPEND BLANK

REPLACE FIELD_NAME WITH "Adresa", FIELD_TYPE WITH "C",

FIELD_LEN;

WITH MaxA

APPEND BLANK

REPLACE FIELD_NAME WITH "Telefon", FIELD_TYPE WITH "N",

FIELD_LEN;

WITH MaxT

CREATE pers1 FROM pers

LIST STRUCTURE

APPEND FROM pers

LIST

WAIT

DELETE FILE baza.dbf

Page 113: Module 1-6 FoxPro

113

SET CURSOR ON

PROCEDURE calc_lun

PUBLIC MaxN, MaxA, MaxT

STORE 0 TO MaxN, MaxA, MaxT

SCAN

IF MaxN < LEN(LTRIM(RTRIM(NUME)))

MaxN= LEN(LTRIM(RTRIM(NUME)))

ENDIF

IF MaxA < LEN(LTRIM(RTRIM(ADRESA)))

MaxA= LEN(LTRIM(RTRIM(ADRESA)))

ENDIF

IF MaxT < LEN(LTRIM(RTRIM(TELEFON)))

MaxT= LEN(LTRIM(RTRIM(TELEFON)))

ENDIF

ENDSCAN

RETURN

*************************************************************

* FOXPRO: APLICAŢIA NR. 6 ap6.prg

*************************************************************

* În directorul STOCURI există bazele de date STOC.dbf şi TRANZACTII.dbf

* Listaţi structura acestor fişiere şi scrieţi un program pentru realizarea

tranzacţiilor zilnice. Dialogul cu utilizatorul trebuie proiectat corespunzător (

adică codurile de material se selectează din STOC.DBF iar restul câmpurilor

se introduc prin intermediul unui videoformat)

********************************************************

set talk off

public cod1

clear

@3,15 say "MISCARE MATERIALE DIN STOC"

@4,16 SAY "(CREARE FISIER TRANZACTII)"

sele 1

use stoc

define popup ferestr1 from 5,5 to 10,65 prompt field stoc->den

on sele popup ferestr1 do salv1

sele 2

use tranzact

sele 1

activate popup ferestr1

close data

Page 114: Module 1-6 FoxPro

114

procedure salv1

store 0 to mag1, i_e1,cant1,data1,pu1

store space(4) to um1

store space(6) to data1

sele 2

append blank

sele 1

loca for den=prompt()

cod1=codm

pu1=pu

repl tranzact->codmt with cod1

repl tranzact->put with pu1

SELE 2

brow

@14, 12 SAY "UNITATE DE MASURA(xxxx) ="

@14,37 GET um1

@14,44 SAY "COD MAGAZIE(n) ="

@14,62 GET MAG1 pict '9'

@16,12 SAY "INTRARI/IESIRI(1,2) ="

@16,34 GET I_E1 PICT '9'

@16, 36 SAY "DATA (ZZLLAA)="

@16,56 GET DATA1 PICT '999999'

@18,12 SAY "CANTITATE ="

@18,56 GET CANT1 PICT '999999'

read

repl umt with um1

repl magt with mag1

repl i_e with i_e1

repl data with data1

repl cant with cant1

sele 1

return

*************************************************************

* FOXPRO: APLICAŢIA NR. 7 ap7.prg

*************************************************************

* Modul de lucru cu meniuri orizontale şi verticale

*************************************************************

SET TALK OFF

CLEAR

Page 115: Module 1-6 FoxPro

115

DO def

ACTI MENU m1

RETURN

* MENIURI ORIZONTALE

procedure def

defi menu m1

defi pad v1 of m1 prom 'FISIERUL STOC.DBF ' AT 5,20

on sele pad v1 of m1 acti popup mv1

* MENIURI VERTICALE

@2,5 TO 18,79 DOUBLE

defi popup mv1 from 6,20 mess ' '

defi bar 1 of mv1 prom 'HELP '

defi bar 2 of mv1 prom 'CREERE FISIER'

defi bar 3 of mv1 prom 'ACTUALIZARE FISIER'

defi bar 4 of mv1 prom 'LISTARE'

defi bar 5 of mv1 prom 'QUIT'

on sele popup mv1 do mv1

*

PROCEDURE mv1

if bar()=1

do s1

endif

if bar()=2

do s2

endif

if bar()=3

do s3

endif

if bar()=4

do s2

endif

if bar()=5

quit

endif

*

procedure s1

clear

? "procedura nr.1"

return

procedure s2

Page 116: Module 1-6 FoxPro

116

clear

? "procedura nr.2"

return

procedure s3

clear

? "procedura nr.3"

return

procedure s4

clear

? "procedura nr.4"

return

*************************************************************

*FOXPRO: APLICAŢIA NR. 8 ap8.prg

*************************************************************

ACEST PROGRAM ESTE O VERSIUNE A LUI AP7.PRG SI

LUCREAZĂ CU MENIURI

* ORIZONTALE ŞI VERTICALE ŞI DETALIAZĂ O PARTE DIN

PROCEDURI

*************************************************************

set talk off

clear

do def

acti menu m1

retu

procedure def

defi menu m1

defi pad v1 of m1 prom "FISIERUL STOC.DBF " at 5,20

on sele pad v1 of m1 acti popup mv1

*

@2,5 to 18,79 double

defi popup mv1 from 6,20 mess ' '

defi bar 1 of mv1 prom "HELP "

defi bar 2 of mv1 prom "CREARE FISIER"

defi bar 3 of mv1 prom "ACTUALIZARE (ADAUGARI INREG."

defi bar 4 of mv1 prom "ACTUALIZARE (MODIFICARI INREG.)"

defi bar 5 of mv1 prom "LISTARE"

defi bar 6 of mv1 prom "QUIT"

*

on sele popup mv1 do mv1

Page 117: Module 1-6 FoxPro

117

*

PROCEDURE mv1

if bar()=1

do s1

endif

if bar()=2

do s2

endif

if bar()=3

do s3

endif

if bar()=4

do s4

endif

if bar()=5

do s5

endif

if bar()=6

quit

endif

*

procedure s1

? "procedura nr.1"

return

*

procedure s2

CREATE STOC.DBF

? "procedura nr.2"

return

*

procedure s3

CLEAR

STORE 0 TO CODMM,PUM,MAGM,STOCM

STORE SPACE(20) TO DENM

STORE SPACE(4) TO UMM

USE STOC

APPEND BLANK

@6,6 SAY "ACTUALIZARE FISIER STOC.DBF (ADAUGARE DE

INREGISTRARI)"

@8,3 SAY "COD MATERIAL"

Page 118: Module 1-6 FoxPro

118

@8,16 GET CODMM PICT '999'

@8,22 SAY "DENUMIRE:"

@8,30 GET DENM

@10,3 SAY "PRET UNITAR:"

@10,16 GET PUM PICT '999999'

@10,30 SAY "UNITATE DE MASURA:"

@10,50 GET UMM

@12,3 SAY "COD MAGAZIE:"

@12,16 GET MAGM PICT '9'

@12,30 SAY "CANTITATE:"

@12,50 GET STOCM PICT '9999999999'

READ

REPLA CODM WITH CODMM

REPLA DEN WITH DENM

REPLA PU WITH PUM

REPLA UM WITH UMM

REPLA MAG WITH MAGM

REPLA STOC WITH STOCM

? "procedura nr.3"

return

*

procedure s4

CLEAR

STORE 0 TO CODMM,PUM,MAGM,STOCM

STORE SPACE(20) TO DENM

STORE SPACE(4) TO UMM

USE STOC

go top

@4,6 SAY "ACTUALIZARE FISIER STOC.DBF (MODIFICARI DE

INREGISTRARI)"

@6,3 SAY "COD MATERIAL pentru înregistrarea dorită:"

@6,46 get CODMM PICT '999'

read

loca for codm=codmm

@8,3 SAY "COD MATERIAL"

@8,16 get CODMM PICT "999"

@8,22 SAY "DENUMIRE:"

@8,30 SAY DEN

@10,3 SAY "PREŢ UNITAR:"

@10,16 SAY PU PICT "999999"

Page 119: Module 1-6 FoxPro

119

@10,30 SAY "UNITATE DE MASURĂ:"

@10,50 SAY UM

@12,3 SAY "COD MAGAZIE:"

@12,16 SAY MAG PICT "9"

@12,30 SAY "CANTITATE:"

@12,50 SAY STOC PICT "9999999999"

READ

@8,3 SAY "COD MATERIAL"

@8,16 get CODM PICT "999"

@8,22 SAY "DENUMIRE:"

@8,30 get DEN

@10,3 SAY "PREŢ UNITAR:"

@10,16 GET PU PICT "999999"

@10,30 SAY "UNITATE DE MASURĂ:"

@10,50 GET UM

@12,3 SAY "COD MAGAZIE:"

@12,16 GET MAG PICT "9"

@12,30 SAY "CANTITATE:"

@12,50 GET STOC PICT "9999999999"

READ

? "procedura nr.4"

return

*

procedure s5

? "procedura nr.5"

USE STOC

BROW

return

*************************************************************

* FOXPRO: APLICAŢIA NR. 9 ap9.prg

*************************************************************

* Să se proiecteze şi să se scrie un program prin care să se realizeze următorul

dialog cu *utilizatorul: MENIU PRINCIPAL: F - fişiere; R - rapoarte; T -

terminare; MENIU FIŞIERE : *B - Bonuri de materiale; C - Comenzi; F -

Furnizori; N - N.I.R. S - Stoc; R - Retur; MENIU *RAPOARTE: 1. Listă

furnizori; 2. Listă materiale *din stoc; 3. Listă bonuri materiale pe *comenzi;

4. Listă NIR pe furnizori; 5. Return; MENIU OPERAŢII: A - Adaugare; M -

*Modificare; S _ Ştergere; V - Vizualizare; R - Return.

*************************************************************

Page 120: Module 1-6 FoxPro

120

set talk off

set color to w/b

clear

@0,0 to 18,79 double

do def

acti menu m1

return

procedure def

defi menu m1

defi pad v1 of m1 prom "GESTIUNE STOCURI" at 5,20

on sele pad v1 of m1 acti popup mv1

@2,5 to 18,79 double

defi popup mv1 from 6,20 mess ' '

defi bar 1 of mv1 prom ' F fisiere'

defi bar 2 of mv1 prom ' R rapoarte'

defi bar 3 of mv1 prom ' T terminare'

on sele popup mv1 do mv1

procedure mv1

if bar()=1

do mfisiere

endif

if bar()=2

do mrapoarte

endif

if bar()=3

quit

endif

procedure mfisiere

do def1

acti menu m2

return

procedure def1

defi menu m2

defi pad v2 of m2 prom 'MENIU FISIERE' at 7,55

on sele pad v2 of m2 acti popup mv2

@5,41 to 17,78 double

defi popup mv2 from 7,46 mess " "

defi bar 1 of mv2 prom "B - Bonuri de materiale"

defi bar 2 of mv2 prom "C - Comenzi de fabricatie"

defi bar 3 of mv2 prom "F - furnizori"

Page 121: Module 1-6 FoxPro

121

defi bar 4 of mv2 prom "N - NIR"

defi bar 5 of mv2 prom "S - Stoc"

defi bar 6 of mv2 prom "R - retur"

on sele popup mv2 do mv2

procedure mv2

if bar()=1

do s1

endif

if bar()=2

do s2

endif

if bar()=3

do s3

endif

if bar()=4

do s4

endif

if bar()=5

do s5

endif

if bar()=6

do s6

endif

procedure mrapoarte

do def3

acti menu m3

return

procedure def3

defi menu m3

defi pad v3 of m3 prom "MENIU RAPOARTE" at 7,55

on sele pad v3 of m3 acti popup mv3

@5,41 to 17,78 double

defi popup mv3 from 7,46 mess " "

defi bar 1 of mv3 prom "1. Lista furnizori"

defi bar 2 of mv3 prom "2. Lista materialelor"

defi bar 3 of mv3 prom "3. Lista bonuri materialelor"

defi bar 4 of mv3 prom "4. Lista NIR pe furnizori"

defi bar 5 of mv3 prom "5. Return"

on sele popup mv3 do mv3

defi bar 6 of mv2 prom "R - retur"

Page 122: Module 1-6 FoxPro

122

on sele popup mv2 do mv2

*************************************************************

*Aplicatia nr.10: Ştergere înregistrări din tabela TARIFE

*************************************************************

SET TALK OFF

SET STATUS OFF

USE tarife

DEFINE WINDOW tarife FROM 3,10 TO 18,60 TITLE “Actualizare

TARIFE”;

FOOTER “Marcaţi înregistrările pentru ştergere cu CTRL+T”;

COLOR SCHEME 10

USE tarife

mTipTarif=‟ „

@7,10 SAY “Tip tarif:”GET mTipTarif FUNCTION”!”

READ

ACTIVATE WINDOW tarife

BROWSE FOR TipTarif=mTipTarif NOAPEND NOEDIT IN WINDOW tarife

DEACTIVATE WINDOW tarife

PACK

USE

SET TALK ON

SET STATUS ON

Page 123: Module 1-6 FoxPro

123

MODULUL 5

GENERATOARE AUTOMATE

Sistemul de generatoare automate poate fi apelat atat utilizand facilitati

wizzard cat si prin lansarea mediilor de proiectare a spatiului de lucru pentru

fiecare din elementele enumerate mai sus. Meniul de acces la facilitatile

wizzard pentru generatoare automate se prezinta figura urmatoare.

5.1. Generatorul de rapoarte

Dezvoltatorul de rapoarte este o interfaţă orientată vizual pentru proiectarea

manuală a rapoartelor şi etichetelor. Se poate creea un raport prin plasarea

diferitelor obiecte precum câmpuri, texte, grafice şi expresii oriunde în raport.

Opţiunea “Quick Report menu” permite grabirea procesului prin realizarea unei

machete implicite pentru raport. Iar „Report Wizard” ajută la realizarea rapidă

a unui prototip ce poate fi motificat ulterior.

Page 124: Module 1-6 FoxPro

124

Tipuri de rapoarte

Datele pot fi aşezate în coloane distincte, într-un format tabelar precum foile de

calcul sau grilele (fig.10.1), sau datele unei înregistrări pot fi afişate de sus în

jos (fig.10.2). Datele se pot afişa ca atare sau pot fi grupate, totalizate sau

subtotalizate. Se pot include grafice reprezentative pentru valori diferite. La

rularea raportului, datele subliniază valori din tabele, vederi, interogări sau

cursori, dar şi câmpuri calculate, ca rezultat al unor funcţii definite de utilizator.

Raport ce reprezintă informaţiile succesiv, asemănător foii de cacul

Raport liniar, înregistrările sunt reprezentate succesiv, pe linii separate

Report Designer

Un nou raport se poate crea în mai multe moduri:

Page 125: Module 1-6 FoxPro

125

- Se alege opţiunea New din meniul File, click pe butonul Report, apoi

click pe New Report

- din Project Manager, click pe extensia Documents, se selectează

pictograma Report din listă şi click pe butonul New, apoi se selectează

New Report.

- Din fereastra de comandă, se tastează Create Report sau Modify Report

numenou

- Se crează raportul cu utilitarul Report Wizard, se salvează şi se revine

pentru modificare

Indiferent de modalitate, Visual FoxPro va lansa Report Designer (fig.10.4)

Modul de proiectare a unui raport cu “Report Designer”

Elementele componente:

Zona de lucru canvas a raportului este reprezentarea vizuală a raportului

proiectat, zona în care se aduc câmpurile, etichetele sau graficele.

Bara de unelte Report Designer permite accesul uşor la toate barele pentru

raport şi la câteva funcţii importante.

Bara de controale Report Controls permite introducerea în raport a şase

tipuri de controale şi obiecte: etichete, câmpuri, linii, dreptunghiuri, cercuri şi

controale imagine ActiveX/OLE de legătură.

Page 126: Module 1-6 FoxPro

126

Paleta de culori “Color Palette” permite atribuirea de culori pentru fundal

sau pentru controalele din prim plan.

Paleta machetei , “Layout palette”, permite alinierea sau dimensionarea unei

sau mai multor controale.

Butoanele “Data Grouping” (gruparea datelor) şi “Data Environment” (

mediu de date) permite controlul afişării datelor.

Lucrul cu Controale in zona “Report canvas“

Utilitarul ”Report Designer” suportă trei tipuri de obiecte: text, câmpuri şi

grafice, similare celor din formulare, dar cu unele diferenţe. Controalele din

raport nu pot fi derivate din subclase, ele includ un set mult mai limitat de setări

de format şi proprietăţi de date. Nu se poate face referire la ele în codul sursă,

iar prin natura raportului, controalele nu pot fi interactive, adică utilizatorul nu

poate introduce text în raport.

Obiectele raportului sunt relativ de manevrat, dar destul de flexibile în

proiectarea de rapoarte profesioniste şi sophisticate. Obiectele câmpuri se

utilizează în afişarea datelor stocate în câmpuri sau a datelor rezultate în urma

unor calcule, expresii sau funcţii definite de utilizator. Obiectele grafice constau

în poze, linii sau dreptunghiuri.

Pe măsură ce se adaugă obiecte în zona de lucru canvas acestea se pot

manipula în diverse moduri:

- selectarea unui obiect din raport: se selectează butonul Select Objects

(săgeata în sus) din caseta de unelte, apoi se selectează obiectul dorit, acesta

fiind subliniat cu dreptunghiuri mici

- click în zona de lucru canvas în care se doreşte afişarea controlului, iar

pentru a modifica dimensiunea implicită pe care Visual FoxPro o alocă

controlului se eliberează mouse-ul concomitent cu trasarea dimensiunii

dorite pentru control, apoi mouse-ul se eliberează.

- Stergerea unui obiect al raportului: se selectează obiectul din zona de

lucru canvas, apoi se apasă tasta Delete sau se alege opţiunea Cut din

meniul Edit. Comanda se poate realiza şi pe o selecţie multiplă de obiecte.

- Copierea unui obiect din raport: se selectează obiectul din zona de lucru

canvas, se alege opţiunea Copy(CTRL+C) din meniul Edit, apoi se alege

opţiunea Paste(CTRL+V) din meniul Edit.

- Lucrul cu câmpurile: pentru afişarea datelor în raport se utilizează

obiectul text box pentru adăugarea unui câmp, a unei variabile, a unei

Page 127: Module 1-6 FoxPro

127

expresii sau a unei funcţii definită de utilizator; acest lucru se face prin

selectarea controlului textbox/field din caseta de unelte “Report Controls” şi

click în zona de lucru canvas. Apare o casetă de dialog ca în fig.10.5 ce

poate fi apelată şi ulterior, prin click dreapta pe control şi selectarea opţiunii

Properties.

-

În caseta de dialog “Report Expression” se introduce o expresie ce

evaluează datele specificate în raport

Tot în caseta de dialog Report Expression se pot stabili următoarele proprietăţi:

- Schimbarea expresiei câmpului: în caseta expresiei se poate introduce o

expresie, numele unui câmp sau o funcţie de evaluare a datei respective, fie

prin tastare sau prin apelarea elipsei din dreapta pentru apelarea

contructorului de expresie „Expression Builder”, fig.10.6. Acesta include o

serie de instrumente pentru aducerea datelor în raport, o listă de câmpuri

disponibile, funcţii Visual FoxPro si variabile de sistem Visual Foxpro

Page 128: Module 1-6 FoxPro

128

Fereastra Expresion Builder

- Includerea unei variabile sau funcţii în expresie necesită corelarea cu

tipul de dată asupra căreia se face evaluarea, altfel rezultă o eroare la rularea

raportului.

- Schimbarea formatului câmpului: în câmpul Format din caseta de dialog

Expression Builder se pot introduce specificaţii de formatare pentru textul

sau data numerică rezultantă, prin click pe elipsă, şi setarea proprietăţilor

din caseta de dialog “Format”.

-

Caseta de dialog Format

- Field position indică locul unde să apara câmpul faţă de zona de

referinţă. Se poate alege aspectul float, adică poziţia câmpului este relativă

faţă de alte câmpuri din linie, sau se poate alege să rămână relativ faţă de

Page 129: Module 1-6 FoxPro

129

partea superioară sau inferioară a zonei de detaliu, astfel va rămâne mereu o

distanţă fixă faţă de chenarul zonei, indiferent de dimensiunea câmpurilor.

- Câmpul de validare Stretch with Overflow indică dacă controlul

câmp(field) se va extinde cât să cuprindă întreaga valoare. Altfel, la

imprimare se va vedea numai o porţiune. Aceasta opţiune este utilă în

special pentru printarea câmpurilor de tip memo.

- Butonul de calcule(Calculation button) permite aplicarea unui subtotal

sau a unui calcul. Click pe acest buton, apoi se indică tipul şi scopul

calculului în caseta de dialog “Subtotal or Calculate Field”. În figura

următoare se calculează suma unui câmp şi se specifică afişarea acesteia la

finalul fiecărei pagini, iar acest control se plasează în zona Page Footer.

Fig.10.8 Caseta de dialog Calculate Field, permite calcule numerice.

-Butonul Print din caseta de dialog Report Expression permite limitarea

printării câmpului în raport. Prin click pe acest buton se deschide caseta de

dialog Print When. Implicit, un obiect se imprimă odată cu conţinutului zonei

aferente, insă, se poate alege să nu se imprime valorile care se repetă, sau într-o

grupare a unui raport, se poate alege imprimarea câmpului doar când se

schimbă zona de grupare. Caseta text Print Only When Expression Is True

(imprimă doar când expresia este adevarată), permite definirea altei expresii ce

determină daca se imprimă câmpul. Aceasta opţiune poate limita imprimarea

unor câmpuri pe anumite nivele de securitate sau se poate imprima rezultzatul

unui câmp memo când alt câmp din sursa de date este adevărat.

Page 130: Module 1-6 FoxPro

130

Caseta de dialog Print When specifică condiţiile de afişare

Se poate utiliza opţiunea Comment din caseta de dialog Report

Expression pentru introducerea de comentarii ca indicaţii sau notiţe pentru alţi

programatori sau dezvoltatori ai aplicaţiei. Acestea nu vor apărea în raportul

printat. Lucrul cu variabile în raport

Se pot defini variabile pentru a fi folosite în raport, prin selectarea Report,

Variables, şi care să se ruleze calculul în afara zonei de calculare a câmpului.

Caseta de dialog Report Variables pentru utilizarea de variabile raport

Page 131: Module 1-6 FoxPro

131

La selectarea casetei de validare Release After Report, variabilele sunt tratate

separat, ceea ce înseamnă că pot fi accesate de orice apel a unei funcţii definită

de utilizator. Dacă această casetă de validare nu este selectată variabilele vor

rămâne în memorie ca variabile publice .

Lucrul cu figuri geometrice şi text

Pentru adăugarea unei figuri sau linii se selectează din Report Controls şi se

eliberează în zona de lucru ca orice control; în plus se pot stabili atribuţiile unei

figuri sau text într-un raport, la fel ca proprietăţile unui câmp: dubluclick pe

obiectul din raport şi apare caseta de dialog Text.

Caseta de dialog Text pentru stabilirea stilului şi acţiunii unui obiect text

– Prin click pe butonul Print When se revine la caseta de dialog Print When

descrisă în figura anterioară. Prin caseta de dialog Text se poate aplica

acelaşi control asupra textului sau figurii la fel cum s-a aplicat şi asupra

câmpurilor. Acelaşi lucru este valabil şi pentru poziţia unui obiect text sau

figură prin utilizarea proprietăţilor din caseta de opţiuni Object Position.

– Controalele linie şi dreptunghi au în plus câteva opţiuni. Prin dubluclick pe o

linie din raport se poate indica extinderea acesteia faţă de zona în care se

află. Opţiunea No Stretch inhibă extinderea verticală a liniilor sau

dreptunghiurilor. Opţiunea Stretch Relative to Tallest Object in Group

permite extinderea pe verticală a unei linii sau a unui dreptunghi până la

dimensiunea cea mai mare dintre obiectele grupului, iar opţiunea Stretch

Relative to Height of Band permite extinderea pe verticală a liniei sau

dreptunghiului, proporţional cu înălţimea zonei.

Page 132: Module 1-6 FoxPro

132

Caseta de dialog Rectangle/Line dialog box

Controlul Round Rectangle are o casetă dwe dialog asemănătoare, dar conţine

cinci butoane diferite ce indică diferite stiluri.

Caseta de dialog Round Rectangle dialog box

Page 133: Module 1-6 FoxPro

133

Execuţia rapoartelor Se poate imprima întregului raport prin următoarele metode:

Din Project Manager, click pe extensia Documents, click pe un raport şi

click pe butonul Print din bara Standard

Din fereastra de comandă, sau din codul sursă, se tastează comanda Report

Form care are sintaxa:

REPORT FORM numeraport TO PRINT | PREVIEW | TO numefişier | FOR

expresia de filtrare

Rapoartele sunt formatate pentru a rula pe imprimanta implicit selectată, iar

dacă acelaşi raport se rulează pe o altă imprimantă, aliniamentul şi spaţierea

vor diferi, dacă cele două imprimante nu au acelaşi standard.

Alegerea destinaţiei Folosind comanda Report Form, ieşirea poate fi direcţionată către diferite

destinaţii. Pentru imprimarea raportului se utilizează comanda:

REPORT FORM MyReport TO PRINT

Pentru previzualizarea pe ecran a raportului se utilizează comanda:

REPORT FORM MyReport TO PRINT PREVIEW

Iar pentru salvarea raportului într-un fişier text, în format ASCII se utilizează

comanda:

REPORT FORM MyReport TO FILE MyFile.txt ASCII

5.2. Crearea Formularelor (alcătuirea formularelor)

Majoritatea utilităţilor scrise în Visual FoxPro includ cel puţin un formular,

acestea fiind predecesoarele ecranelor din versiunile vechi şi sunt folosite ca

interacţiune a utilizatorului atât cu datele semnificante cât şi cu gândirea

economică din majoritatea aplicaţiilor. Interfaţa cu utilizatorul client s-a

schimbat o dată cu cerinţele acestuia de a avea grafică condusă pe evenimente şi

controale utilizator. Astfel, s-a renunţat la ecranul albastru al versiunii de DOS

şi a fontului alb Courier de dimensiune 12. Visual FoxPro 6 este un puternic

utilitar de proiectare a formularelor, ce-l ajută pe utilizator la crearea unor

formulare perfecte, flexibile, în totalitate orientate obiect, indiferent de

dimensiunea aplicaţiei.

Formularul Visual FoxPro este o clasă container, ce cuprinde numeroase

controale şi containere precum casete text, butoane de comandă, casete de

validare, chenare pagină sau grile. Formularele au peste 100 de proprietăţi de

bază şi 60 de metode principale, permiţând adăugarea de metode sau proprietăţi

nelimitate. Formularele pot fi moştenite din subclase de formulare specializate

sau pot fi utilizate ca superclase pentru alte formulare. Diferenţa dintre

formulare şi alte clase container este că pe de o parte îşi adoptă aspectul vizual

Page 134: Module 1-6 FoxPro

134

pe desktop-ul utilizatorului şi pe de altă parte îşi alocă informaţiile dintr-o

sesiune de date privată. Un exemplu de formular simplu este prezentat în

fig.9.1, având două elemente vizuale componente: formularul propriu zis şi

controalele formularului.

Un formular simplu prezintă informaţii în mod uşor-de-citit

Formularul în sine constă în fundal, pe care se află majoritatea funcţionalităţilor

formularului, precum răspunsul la evenimentele: click mouse, activare,

redimensionare şi mutare. Însă majoritatea funcţionalităţilor sunt apelate de

controalele din formular. În versiunile anterioare controalele se plasau in

ferestre definite prin comenzile @SAY şi GET, cu capacitate limitată de răspuns la

evenimentele utilizatorului, dar începând cu versiunea 3, Visual FoxPro permite

încorporarea de elemente ActiveX. Tabelul 9.1 include o listă de controale

native folosite în formulare şi o scurtă descriere:

Tabelul 9.1 Controalele unui formular Visual FoxPro

Nume Control Descriere

Check box Casetă de validare ce afişează starea On/Off.

Combo box Casetă combinată - un control sub formă de listă . Este

afişată numai valoarea curentă selectată, restul listei

poate fi extinsă de utilizator .

Command button Buton de comandă pe care utilizatoul dă click pentru a

induce o acţiune.

Command button group Un grup de butoane de comandă ce funcţionează

împreună.

Edit box Casetă de editare ce permite utilizatorului sa introducă

informaţii sub formă de şir de caractere.

Grid Grila este un control ce deschide o tabelă într-un

formular.

Page 135: Module 1-6 FoxPro

135

Image Imagine - un control ce afişează o poză în formular.

Label Etichetă - afişează un text.

Line O line desenată în formular.

List box Casetă derulantă ce afişează o listă de articole.

OLE bound control Control OLE de legătură - a cărui sursă este un câmp

general din tabelă.

OLE container control Un container de obiecte şi controale de tip OLE.

Option group Grup de opţiuni - o serie de opţiuni, din care utilizatorul

poate selecta doar una singură.

Page frame Chenar de pagină- permite utilizatorului să aleagă una

din extensiile de pagină, fiecare având un set diferit de

controale.

Shape O formă geometrică ce se poate trasa în formular.

Spinner Filator - o combinaţie de casetă text şi controale sus-jos,

ce permite incrementarea unei date numerice.

Text box Casetă text – permite utilizatorului să introduc

informaţii, salvate de obicei într-un câmp de tip caracter,

numeric sau dată.

Timer Cronometru – un control ce rulează o comandă sau o

serie de comenzi la intervale prestabilite.

Pentru crearea formularelor se utilizează următoarele metode:

- Prin comanda CREATE FORM nume fişier sau

CREATE FORM nume fişier AS nume superclasă FROM nume librărie

principală

Din meniul File->New->Form

- Se tastează comanda MODIFY FORM numeformular, sau MODIFY FORM urmată

de selecţia numelui formularului în caseta de dialog File, Open

-Se selectează butonul New din bara de unelte şi Form caseta de dialog

-Se selectează extensia Docs din Project Manager, click pe Forms, şi se

selectează New (apar opţiunile de creare automată cu utilitarul Form Wizard

sau manual, pas cu pas)

-Se utilizează Component Gallery sau Class Browser

-Se tastează comanda MyForm = CREATEOBJECT(<numele subclasei

formularului sau "Form" pentru clasa de bază>) urmată de MODIFY FORM

"MyForm"

-Se foloseşte un asistent Visual FoxPro Form sau dezvoltator-definit de genul

Form Wizard.

Page 136: Module 1-6 FoxPro

136

Utilitarul Visual FoxPro de proiectare

Clasa şablon de formular se setează din extensia Forms a casetei de dialog

Options

Lucrul cu Form Designer

După crearea unui formular nou se lansează utilitarul Form Desginer (Fig.9.3).

Cele mai importante elemente: Form Canvas, reprezentarea vizuală a

containerului formularului, Fereastra de Proprietăţi, ce afişează toate

proprietăţile disponibile, evenimentele şi setările metodelor(PEM) pentru

formular şi controalele sale; şi bara de unelte cu controale, care permite

apelarea acestora prin drag and drop in zona canvas (aria de lucru).

Page 137: Module 1-6 FoxPro

137

În Form Designer se specifică locul informaţiei, textul si graficele în formular.

Caseta de unelte Color palette – permite alegerea culorilor formularului şi

controalelor sale

Caseta de unelte Layout – permite alinierea şi dimensionarea controalelor,

modificând ordinea de încărcare şi suprapunere a obiectelor

Caseta de unelte Form Designer – stabileşte afişarea altor bare de tip Form

Designer, acest lucru mai poate fi realizat şi din meniul View sau dublu click pe

butonul close.

Fereastra Data Environment – cuprinde elementele specificate de mediul de

date al formularului

Fereastra Code – afişează codul atribuit metodelor şi controalelor din formular

Adăugarea de controale într-un formular se face prin click pe control apoi click

în zona canvas de lucru unde se doreşte plasarea acestuia, a cărui dimensiune

implicită se modifică prin click pe colţ sau pe latura controlului şi tragere până

la dimensiunea dorită.

Page 138: Module 1-6 FoxPro

138

Caseta de unelte “Form Controls” este afişată în fig.9.4 ce constă în următoarele

secţiuni: cele două butoane de sus nu sunt controale, dar în locul lor sunt unelte

care controlează setările pentru restul barei.

Caseta de unelte Form Controls include diferite tipuri de

controale

Butonul de selecţie obiecte (pictograma săgeată, stânga sus)

indică dacă un control este selectat şi pregătit de eliberare(drop).

Dacă nu este selectat nici un control, butonul săgeată este în

poziţia jos sau on, indicând că mouse-ul este folosit ca indice

către zona de lucru canvas(drag). După selecţia unui control, în

timpul deciderii eliberării controlului, butonul săgeată este

poziţia sus sau off(drop).

Butonul View Class - (cel sub formă de sertar-pictograma

biblioteca din caseta de unelte cu controale, dreapta sus) permite

comutarea între bibliotecile de clase. Sunt disponibile trei opţiuni: Standard,

include controale aplicabile din clasele de bază ale FoxPro, ActiveX include

controale predefinite in Visual Foxpro, precum cel de calendar şi bara de

progres Microsoft şi Add ce permite adăugarea de biblioteci de clase în lista

existentă. Controalele disponibile: secţiunea din mijloc a barei de unelte cu

controale include toate clasele disponibile din biblioteca curentă selectată.

Butonul “Builder Lock”, pictograma baghetă, controlează lansarea automată a

asistentului asociat controlului.

Butonul “Lock” –Visual FoxPro permite implicit alegerea şi eliberarea unei

instanţe pentru un control la un moment dat. Pictograma repreyentativă este

lacătul; când este setat on, se poate face click şi adăuga în formular orice

număr de controale asemănătoare, fără a mai fi necesară întoarcerea la caseta de

unelte cu controale şi click din nou pe control. Acest lucru este util când sunt

necesare, de exemplu, zece casete text într-un formular, însă nu şi atunci când

se eliberează accidental mai multe controale de tip chenare de pagină pe acelaşi

formular.

5.3. Generatorul de etichete

În aplicatiile informatice se poate pune, adeseori, problema afişării

datelor dintr-o bază de date existentă sub forma unor etichete, cărţi de vizită sau

invitaţii. Acest lucru se realizează utilizând generatorul de etichete sau, altfel

spus componenta LABEL DESIGNER a acestuia. Eticheta – denumită aşa

generic, se consideră o zonă de pe ecran sau imprimantă bine delimitată, în

Page 139: Module 1-6 FoxPro

139

care sunt plasate într-un format dorit date extrase din înregistrările unei baze de

date. Fişierul care memorează informaţiile privind eticheta va avea extensia

.LBX. Practic, pentru a realiza o etichetă, se parcurg următorii paşi:

1. Pornirea generatorului de etichete

2. Definirea obiectelor în fereastra de descriere a ecranului şi stabilirea

proprietăţilor acestora

3. Obţinerea, la ecran sau imprimantă, a etichetelor proiectate, pe baza

datelor din tabelele active

Pornirea efectivă a generatorului se poate face fie pentru crearea unei etichete noi, fie pentru modificarea uneia existente. Pornirea generatorului pentru crearea unei etichete noi se poate face în două moduri, astfel:

- Cu comanda Foxpro: CREATE LABEL <nume_fişier_etichetă > unde nume_fişier_etichetă reprezintă numele fişierului în care se vor memora opţiunile utilizatorului legate de ecranul nou, care se crează .

Page 140: Module 1-6 FoxPro

140

- Prin intermediul meniului principal, activând submeniul FILE şi apoi opţiunea NEW, cu tipul de fişier selectat din lista afişată LABEL şi OK. Pornirea generatorului pentru modificarea unei etichete existente,

anterior create, se poate face în două moduri, astfel: - Cu comanda Foxpro: MODIFY LABEL <nume_fişier_etichetă> unde nume_fişier_etichetă reprezintă numele fişierului de tip etichetă, care se modifică.

- Prin intermediul meniului principal, activând submeniul FILE şi apoi opţiunea OPEN, cu tipul de fişier selectat din lista afişată LABEL şi alegerea fişierului dorit.

În ambele cazuri, pe ecran apare fereastra de configurare a ecranului, având specificat, în partea de sus a ecranului, numele fişierului indicat sau numele generic UNTITLED.LBX – care va putea fi schimbat la salvarea fişierului cu opţiunea SAVE AS...Fereastra de configurare de pe ecran conţine o etichetă generică, ale cărei dimensiuni şi format vor fi stabilite de utilizator. Pe o pagină apare, în mod implicit, o singură etichetă. Precizarea dimensiunilor dorite se face modificând valorile din căsuţele de text (Height, Width, Margin, Number Across, Spaces Between, Lines Between, Remarks) apar în fereastra de configurare.

Execuţia efectivă şi deci obţinerea etichetelor se va putea realiza fie:

- prin intermediul meniului, activând, din submeniul DATABASE,

opţiunea LABEL...

- prin comanda :

LABEL FORM <nume_fişier_etichetă>

Generarea automată a unei etichete se poate mai rapid folosind

facilităţile programului WIZARD, prin intermediul submeniului RUN,

opţiunea WIZARD şi apoi opţiunea LABEL. Astfel, în mod interactiv şi

printr-un dialog cu sistemul, utilizatorul îşi poate descrie şi genera eticheta

dorită. Opţiunea LABEL din submeniul RUN va permite apoi obţinerea

etichetelor, ori de câte ori dorim acest lucru

5.4. Generatorul de filtre (QUERY)

Etape de realizare:

- pornirea generatorului de filtre ( afişarea pe ecran a ferestrei de

dialog prin intermediul căreia utilizatorul îşi poate exprima

opţiunile);

Page 141: Module 1-6 FoxPro

141

- precizarea tabelelor din care se vor extrage datele;

- precizarea eventualelor legături între tabelele utilizate, dacă e

nacesar;

- specificarea câmpurilor din care se vor extrage datele;

- sortarea datelor extrase şi eventual gruparea lor, dacă este necesar;

- definirea formatului de afişare a datelor obţinute;

- precizarea criteriului de selecţie a datelor;

- execuţia propriu-zisă a filtrului, cu salvarea lui sub un nume;

- eventual, modificarea filtrului respectiv, dacă este cazul.

Pornirea generatorului de filtre se poate face :

- fie printr-o comandă corespunzătoare:

CREATE QUERY <nume_fişier> dacă acum se crează filtrul,

sau

MODIFY QUERY <nume_fişier> dacă filtrul există şi trebuie

modificat

- fie prin intermediul meniului, selectând din submeniul FILE,

opţiunea NEW şi apoi activând

butonul radio QUERY urmat de

OK

Ca efect, pe ecran apare o fereastră de

configurare şi modificare a filtrelor, iar dacă

în momentul apelării exista deschisă şi o

tabelă de date, atunci la meniul principal se

mai adaugă o opţiune specifică, cu numele

Query. Dacă nici o tabelă nu era activă, atunci

utilizatorul va alege, din fereastra de dialog

afişată, tabela sau tabelele dorite. Dacă se vor

mai multe tabele deschise simultan, atunci cu

opţiunea Add table din submeniul nou

apărut Query sau cu declanşatorul ADD din

fereastra Query Designer se permite acest

lucru. Oricum, tabelele deschise vor avea

numele afişat în fereastra Databases. Pe ecran

apare apoi fereastra de dialog denumită RQBE Join Condition, care va permite

specificarea relaţiilor, a câmpurilor de legătură între tabelele respective.

Selectarea câmpurilor din care urmează să fie preluate datele în filtrul ce se va

crea se face activând declanşatorul SELECT FIELDS din fereastra de

configurare a filtrului sau selectând opţiunea FIELDS din submeniul RQBE.

Page 142: Module 1-6 FoxPro

142

Selectarea se face poziţionând cursorul pe câmpul dorit şi apoi se apasă

comutatorul Add > .

În lista care se va obţine se pot afişa câmpurile respective, dar şi funcţii

sau expresii incluse de utilizator prin activarea listei ascunse

Functions/Expressions din fereastra SELECT FIELDS.

Comutatorul ORDER BY sau opţiunea cu acelaşi nume din submeniul

RQBE permite deschiderea unei ferestre speciale prin intermediul căreia

utilizatorul poate indica modul de ordonare a informaţiilor obţinute în urma

filtrării. Pentru aceasta, el trebuie să selecteze din secţiunea Select Output

numele câmpurilor funcţie de valorile cărora se face ordonarea şi să precizeze,

pentru fiecare, modul de ordonare: crescător sau descrescător (în fereastra

Ordering Criteria).

Sistemul oferă utilizatorului şi posibilitatea de a grupa datele obţinute,

dacă acestea au fost ordonate, funcţie de unul sau mai multe câmpuri. Acest

lucru se realizează fie selectând declanşatorul GROUP BY din fereastra de

configurare, fie selectând opţiunea cu acelaşi nume din submenizul RQBE. Ca

efect apare o fereastră de dialog specifică, cu numele RQBE GROUP BY.

Page 143: Module 1-6 FoxPro

143

Modul de afişare al datelor obţinute în urma execuţiei filtrului se

stabileşte prin intermediul listei ascunse OUTPUT Settings, care va pune la

dispoziţia utilizatorului

următoarele opţiuni:

- Browse - datele se

afişează într-o fereastră de tip

Browse, pentru care se poate

specifica şi un titlu

- Report / Label – datele

se sfişează în mod normal pe

ecran; activând însă butonul

Options sau opţiunea cu acelaşi

nume din submeniul RQBBE, apare o fereastră de dialog denumită RQBE

DISPLAY OPTIONS, prin intermediul căreia se pot preciza opţiuni

suplimentare legate de modul de afişare al rezultatelor. Există aici două

secţiuni:

Formatting Options si Output Destinations

- Table / DBf - permite salvarea rezultatelor obţinute într-o tabelă al

cărei nume se va specifica (tip .DBF).

- Graph - permite prezentarea rezultatelor obţinute sub formă

grafică, numai dacă în prealabil, a fost instalat şi deci există componenta

FOXGRAPH a SGBD-ului FOXPRO.

Condiţia sau condiţiile de selectare se specifică în partea de jos a

ferestrei de configurare a filtrului, putând fi scrise de la tastatură sau cu ajutorul

constructorului de expresii . Mai multe condiţii se vor lega între ele cu ajutorul

operatorilor logici OR, AND sau NOT. Ca efect al creerii filtrului se generează

automat un program SQL, care va conţine o comandă SELECT care poate fi

văzută fie cu declanşatorul See SQl, fie cu opţiunea cu acelaşi nume din

submeniul RQBE.

Opţiunea Comments permite introducerea, în programul generat, a unor

eventuale comentarii dorite de utilizator. Pentru a executa filtrul astfel definit,

se poate activa declanşatorul Do Query sau se poate alege opţiunea cu acelaşi

nume din submeniul RQBE.

Filtrul poate fi salvat sub un nume, cu opţiunea SAVE sau SAVE AS

din submeniul FILE, fişierul rezultat având automat extensia .QPR.

Un astfel de fişier poate fi oricând executat astfel:

- fie cu comanda:

DO <nume_fişier> .QPR

Page 144: Module 1-6 FoxPro

144

- fie prin intermediul meniului, activând opţiunea DO din submeniul

PROGRAM şi alegând fişierul ce se va executa.

Generarea automată a unui filtru se poate realiza mai rapid folosind

facilităţile programului WIZARD, prin intermediul submeniului RUN, opţiunea

WIZARD şi apoi opţiunea QUERY. Astfel, în mod interactiv şi printr-un dialog

cu sistemul, utilizatorul îşi poate descrie şi genera filtrul dorit. Opţiunea

QUERY din submeniul RUN va permite apoi obţinerea filtrelor, ori de câte ori

dorim acest lucru.

5.5. Generatorul de meniuri

Meniul reprezintă un element al limbajului Foxpro prin care se oferă

utilizatorului o mulţime de opţiuni posibile de lucru, afişate pe ecran, astfel

încât acesta să-şi selecteze, în fiecare moment, opţiunea dorită. În funcţie de

alegerea făcută, se declanşează automat anumite acţiuni, asociate cu opţiunea

aleasă. Activitatea de proiectare şi realizare a meniurilor este o activitate

laborioasă, necesitând scrierea unor secvenţe mari de cod (programe). Din

această cauză pe de o parte, dar şi pentru a permite nespecialiştilor să realizeze

mici aplicaţii, într-o manieră de lucru simplificată, Foxpro pune la dispoziţia

utilizatorilor un generator automat de meniuri.

Meniurile pot fi realizate fie prin comenzi Foxpro, fie cu generatorul de

meniuri (componenta MENU BUILDER). După forma lor de prezentare,

meniurile pot fi: meniuri orizontale ( tip MENU ); meniuri verticale ( tip

POPUP ).

Meniurile definite cu generatorul de meniuri au structura meniului

standard, adică pe primul nivel au obligatoriu un meniu de tip orizontal, fiecare

opţiune a sa putând să aibă asociate meniuri verticale în cascadă.

Etape de realizare:

1. Definirea meniului principal, orizontal ( MENU PAD) , a meniurilor

verticale (MENU POPUP) şi a submeniurilor asociate

(SUBMENU), memorate într-un fişier cu extensia implicită .MNX. 2. Apelarea generatorului automat de cod program sursă, necesar apoi

apelării şi execuţiei sistemului de meniuri definit anterior (programul sursă generat este memorat în fişier cu extensia implicită .MPR).

3. Lansarea în execuţie a programului realizat. Pornirea generatorului pentru crearea unui meniu sistem nou se poate

face în două moduri, astfel: - Cu comanda Foxpro:

Page 145: Module 1-6 FoxPro

145

CREATE MENU [<nume_fişier_menu >?] [WINDOW <nume_fer >] [IN WINDOW <nume_fer >IN SREEN] unde nume_fişier_menu reprezintă numele fişierului în care se vor

memora opţiunile utilizatorului legate de meniul definit, care se crează ( cu extensia.MNX).

- Prin intermediul meniului principal, activând submeniul FILE şi apoi opţiunea NEW, cu tipul de fişier selectat din lista afişată MENU şi OK.

Pornirea generatorului pentru modificarea unui meniu existent, anterior creat, se poate face în două moduri, astfel:

- Cu comanda Foxpro: MODIFY MENU [<nume_fişier_menu >?] [WINDOW <nume_fer >] [IN WINDOW <nume_fer >IN SREEN] [NOWAIT] unde nume_fişier_menu reprezintă numele fişierului de tip menu, care

se modifică. - Prin intermediul meniului principal, activând submeniul FILE şi

apoi opţiunea OPEN, cu tipul de fişier selectat din lista afişată MENU şi alegerea fişierului dorit.

În ambele cazuri, pe ecran apare fereastra de definire a meniului, având specificat, în partea de sus a ecranului, numele fişierului indicat sau numele generic UNTITLED. MNX – care va putea fi schimbat la salvarea fişierului cu opţiunea SAVE AS.

Page 146: Module 1-6 FoxPro

146

Se observă că fereastra de configurare a meniului conţine, în

dreptunghiul mare, 4 coloane de informaţii ce trebuie specificate:

Coloana PROMPT se completează cu numele opţiunilor. Dacă în

butonul din dreapta este selectată opţiunea MENU BAR, atunci opţiunile sunt

cele de nivel 0 , adică opţiunile meniului principal orizontal. Din lista ascunsă

de Menu Bar se poate schimba nivelul de referinţă, adică se asigură trecerea la

descrierea opţiunilor pentru submeniuri.

Textul RESULT are 2 coloane corespunzătoare, prin care se precizează

tipul de acţiune ce va fi declanşată prin alegerea opţiunii de pe aceeaşi linie ,

atunci când se va executa programul.

Aceste acţiuni pot fi de tip:

- Command – comandă Foxpro ce va trebui executată

- Pad Name – numele ataşat opţiunii, pentru a le putea regăsi atunci

când sunt selectate

- Submenu – submeniu de tip vertical, ce va trebui definit

- Proc... – procedură Foxpro ce va trebui definită.

Coloana OPTIONS serveşte pentru definirea unor clauze suplimentare

elementelor definite. Caracteristicile suplimentare pentru o opţiune bară sau de

submeniu pot fi precizate cu ajutorul comutatorului din coloana Options, care

determină apariţia unei ferestre de dialog cu opţiuni legate de : COMMENT,

SHORTCUT, MARK, SKIP FOR.

Opţiunea TRY IT permite testarea, încercarea opţiunilor definite în

fereastra de configurare, care vor fi afişate în partea de sus a ecranului sau doar

a acelora selectate, pentru care se afişează proprietăţile.

INSERT şi DELETE din fereastra de configurare servesc pentru a

insera, respectiv a şterge o opţiune din cadrul meniului definit. Cu alte cuvinte,

un meniu care a fost definit într-o primă formă, va putea fi ulterior completat,

corectat, actualizat.

Submeniul MENU se adaugă automat la bara de meniu, odată cu

pornirea generatorului şi permite operaţii legate de un meniu care a fost creat.

Meniul se prezintă ca în fereastra de mai jos, cu urmatoarele semnificaţii:

Page 147: Module 1-6 FoxPro

147

GENERAL OPTIONS – determină apariţia unei ferestre de dialog care

va permite precizarea următoarelor operaţii:

- definirea unei proceduri globale, care să fie executate atunci când

pentru o opţiune bară nu a fost definită o procedură specifică.

- scrierea codului de iniţializare a meniului (SETUP)

- scrierea codului de încheiere a meniului (CLEANUP)

- specificarea unui caracter de marcare specific barei de meniu

(MARK)

- stabilirea poziţiei de pe ecran unde va apare meniul creat de

utilizator

Location - conţine 4 butoane radio, cu următoarea semnificaţie:

- Replace – meniul creat îl va înlocui pe cel principal al sistemului

Foxpro (este butonul implicit)

- Append - meniul creat se va adăuga la cel al sistemului Foxpro, în

dreapta lui

- Before – meniul creat se va introduce în faţa meniului sistem

Page 148: Module 1-6 FoxPro

148

- After – meniul creat se va introduce după bara meniului sistem

MENU BAR OPTIONS – determină apariţia unei ferestre de dialog

care va permite specificarea caracteristicilor pentru fiecare submeniu

definit, prin intermediul următoarelor opţiuni:

- Name – permite schimbarea opţiunii, a submeniului activat, pentru

care se vor defini caracteristicile

- Procedure – permite introducerea unei proceduri care să fie

executată la selectarea opţiunii sau meniului căruia i-a fost asociată.

- Color Scheme – permite alegerea, din lista ascunsă

corespunzătoare, a combinaţiei de culori asociate meniului,

submeniului sau opţiunii asociate.

- Mark – permite alegerea unui caracter de marcare pentru tot meniul,

submeniul sau opţiunea asociată.

INSERT/DELETE Item – permit inserarea unei opţiuni noi şi

respectiv ştergerea uneia existente.

Salvarea unui meniu creat se va putea face fie tastând simultan Ctrl/W, fie cu

click mouse pentru a închide fereastra de configurare, fie prin intermediul

meniului, cu opţiunea SAVE sau SAVE AS din meniul FILE.

Pe disc fişierul astfel salvat va avea extensia .MNX. Pentru a genera

automat programul corespunzător meniului definit, se apelează opţiunea

GENERATE din submeniul PROGRAM. Fişierul creat va avea acelaşi nume

şi extensia .MPR şi va fi tratat ca orice program Foxpro, care va putea fi

depanat, verificat şi executat.

5.6. Generatorul de aplicaţii Apelarea se poate face direct, în fereastra de comenzi, cu comanda:

DO FOXAPP.APP

Urmare a acestei comenzi apare fereastra de dialog cu numele FOXPRO

APPLICATION GENERATOR, în care utilizatorul va trebui să specifice:

- numele tabelei care se prelucrează (scris sau selectat din lista

tabelelor afişată)

- numele videoformatului (ecranului) de introducere şi actualizare

a datelor . Dacă nu a fost creat anterior un astfel de videoformat,

generatorul activat permite crearea unui videoformat pentru tabela

selectată (butonul CREATE). Tot acum poate fi modificat un videoformat

existent, cu butonul MODIFY şi apoi salvat cu SAVE sau Ctrl/W.

Page 149: Module 1-6 FoxPro

149

Se activează apoi opţiunea GENERATE pentru a crea aplicaţia pentru

tabela selectată şi videoformatul specificat sau creat. Cu opţiunea SAVE se

salvează aplicaţia astfel creată, care va avea numele specificat şi extensia .APP.

Odată cu generarea aplicaţiei, în partea de sus a ecranului apare un

meniu cu opţiunile:

- SYSTEM - asemănător meniului System pentru Foxpro

- EDIT – asemănător meniului Edit pentru Foxpro

- APPLICATION – pune la dispoziţia utilizatorului comenzi pentru

actualizarea tabelei prin adăugare, modificare şi ştergere de

înregistrări, indexare, interogare şi obţinere rapoarte.

- UTILITIES

Ieşirea din aplicaţie se face cu Quit din meniul SYSTEM.

Page 150: Module 1-6 FoxPro

150

MMOODDUULLUULL 66

PROGRAMARE ORIENTATA PE OBIECTE IN

VISUAL FOXPRO

Microsoft Visual FoxPro

Microsoft Visual FoxPro oferă instrumente pentru crearea şi gestiunea

de aplicaţii şi componente de baze de date pe 32-biţi de înaltă performanţă.

Instrumentele sale robuste şi limbajul orientat obiect sunt ideale pentru a

construi aplicaţii moderne, scalabile, pe mai multe nivele ce încorporează

elemente de tip client-server şi Internet. Visual FoxPro, ca SGBDR complet

relaţional, oferă utilizatorilor (de toate categoriile) un mediu performant de

dezvoltare a aplicaţiilor cu baze de date.

6.1 Facilităţi oferite de Visual FoxPro

6.1.1 O cale rapidă de a îmbunătăţi vechile aplicaţii FoxPro :

- VFP permite integrarea tehnologiilor client-server şi Web prin construirea de

aplicaţii bazate pe componente şi multi-nivel. Visual FoxPro 6.0 suportă

Component Object Model(COM), prin care obiectele interacţionează local între

ele, şi Distributed COM (DCOM), prin care obiectele interacţioneză în reţele.

De asemenea Visual Foxpro suportă ODBC, OLE DB şi alte standarde de

comunicare cu baze de date de înaltă performanţă

- Se construiesc aplicaţii client-server de înaltă performanţă prin utilizarea

Remote Views şi Upsizing Wizard, interogarea facilă şi modificări de la

distanţă a datelor prin SQL, folosind Remote Views şi ODBC. Datele din

FoxPro se pot migra uşor pentru a rula pe Microsoft SQL Server™ folosind

Upsizing Wizard.

Page 151: Module 1-6 FoxPro

151

- Se construiesc obiecte bazate pe Visual Foxpro pentru datele de afaceri ce pot

fi uşor reutilizate prin COM şi DCOM. O aplicaţie Microsoft Excel poate rula o

componentă de tip Visual FoxPro COM pentru a căuta, a compara şi returna

datele local sau la distanţă în reţea.

- Se construiesc aplicaţii robuste cu baze de date WEB prin componentele

Visual Foxpro COM împreună cu Microsoft Internet Information Server (IIS),

aplicaţii WEB ce creează pagini WEB dinamice prin contopirea datelor cu

HTML.

-Aplicaţiile Visual FoxPro se transferă automat pe server deoarece suportă

tranzacţii de tip Microsoft Transaction Server, nemai fiind necesară scrierea de

cod la gestionarea, desfăşurarea şi transferul componentelor Visual FoxPro

COM pentru mai mulţi utilizatori.

- Transferul rapid al datelor pe Internet prin Microsoft Visual InterDev™

oferind un mediu RAD şi instrumente de gestiune a site-urilor integrate, prin

care se creează, publică şi gestionează aplicaţii WEB dinamice. Include

instrumente de baze de date puternice compatibile cu Visual FoxPro şi alte baze

de date ODBC.

- Se pot partaja datele din Visual FoxPro pentru alte aplicaţii prin driver-ul

Visual FoxPro ODBC, pentru acces deplin la datele din Visual FoxPro în

aplicaţiile de tip Microsoft Office, Microsoft BackOffice şi produsele sistem de

dezvoltare Microsoft Visual Studio™

- Facilitatea de integrare cu Microsoft Visual Studio Enterprise Edition

simplifică analiza, proiectarea şi implementarea soluţiilor bazate pe

componente, prin Visual Modeler.

6.1.2 Creşterea productivităţii şi flexibilizarea produselor software

- Se reduce timpul de dezvoltarea prin programarea orientată obiect, se

simplifică programarea prin utilizarea tehnologiilor de dezvoltare orientate-

obiect. Se construiesc biblioteci puternice şi flezibile pentru obiecte reutilizate

prin crearea unor clase de cod şi elemente de interfaţă. Se foloseşte moştenirea

ca modalitate de aplicare a modificărilor dintr-o clasă în toate subclasele

- Se folosesc instrumente built-in pentru gestionarea claselor şi a bibliotecilor,

regăsirea, vizualizarea şi utilizarea claselor în aplicaţii prin Class Browser şi

Component Gallery. Coverage Profiler se utilizează în construirea de aplicaţii

mai stabile şi mai performante. Panoul de jos afişează fiecare linie de cod şi

indică dacă se execută, de câte ori, cât timp a luat prima dată, şi ce tip mediu de

execuţie a fost necesar. Aceste valori ajută la depistarea blocajelor de

performanţă din codul sursă şi încadrarea în planificare.

Page 152: Module 1-6 FoxPro

152

-Instrumentele RAD facilitează scurtarea timpul de dezvoltare şi efortul printr-

un editor de cod cu culori şi depanator intuitiv de genul sistemului de

dezvoltare Microsoft Visual C++.

- Integrarea Microsoft Visual SourceSafe™ cu sistemul de control Visual

SourceSafe permite o mai bună gestionare a codului sursă, indiferent dacă

proiectul se lucrează în echipă sau independent.

Componenta Gallery uşurează regăsirea, şi utilizarea componentelor precum

biblioteci de clase , formulare, rapoarte şi cod. Se pot muta rapid clasele din

Component Gallery în formulare şi rapoarte prin drag&drop.

- Sunt extinse controale de tip ActiveX în clasele VisualFoxpro; se pot adăuga

şi schimba proprietăţi şi metode pentru atribuirea caracteristicilor controalelor.

6.1. 3 Transfer uşor pe 32-biţi

Caracteristicile Windows pe 32 biţi sunt compatibile cu viteza şi

familiaritatea FoxPro ca urmare a implementării extensiilor de tehnologii de

dezvoltare orientată obiect şi a instrumentelor robuste, păstrându-se totodată

tradiţionalitatea FoxPro.

Aplicaţiile Visual FoxPro se construiesc rapid pe baza claselor, fără a mai

rescrie cod de fiecare dată, versiunea 6.0 livrându-se cu peste 100 de clase

predefinite, testate şi reutilizabile, oferind funcţionalităţi precum manipularea

datelor, detectarea conflictelor de actualizare, regăsirea datelor şi căutări, şi

dezvoltare WEB.

Dezvoltarea de aplicaţii orientate obiect este facilitată cu utilitarele

Application Wizard şi Application Builder, ce oferă un cadru de implementare

pentru toate sistemele.

Formularele se pot crea rapid prin obiecte, spe deosebire de FoxPro 2.x ce

necesită limbaj procedural pentru crarea de formulare şi controale. Visual

Foxpro permite construirea acestora în mod vizual ca obiecte cu proprietăţi

depline, metode şi evenimente. Se selectează controalele necesare din caseta de

unelte toolbox, se plasează în formular, se atribuie proprietăţi de afişare şi

comportament, se scrie cod pentru evenimente şi se rulează formularul.

Prin tehnologia Microsoft Rushmore™ se construiesc aplicaţii rapide pe 32

biţi, prin tehnologia de obtimizare interogări

Se pot adăuga funcţii unice prin utilizarea controalelor ActiveX, ce reprezintă

componente software reutilizabile implementate cu puţin cod sursă, existând

mai mult de 6000 de controale ActiveX disponibile pentru implementare în

aplicaţii.

Asistenţii (Wizards) finalizează rapid sarcini obişnuite şi complexe, Visual

Foxpro 6.0 include mai mult de 20 de asistenţi ce îndeplinesc automat sarcini

Page 153: Module 1-6 FoxPro

153

diverse. De exemplu, Database Wizard oferă şabloane şi opţiuni pentru crearea

de baze de date şi tabele precum contacte, gestiunea timpului şi facturilor,

introducere de comenzi, gestiunea cheltuielilor. Alţi asistenţi oferă ajutor pentru

crearea formularelor, rapoartelor, graficelor şi etichetelor, import de date, mail

merge, publicare pe Web etc

Codul Foxpro 2.x, ferestre-ecrane şi rapoarte pot fi reutilizate, ceea ce

costurile şi timpul necesar migrării datelor şi depanarea aplicaţiilor. După

rularea codului FoxPro2.x Visual Foxpro converteşte automat rapoartele şi

formularele în format Visual Foxpro la momentul deschiderii acestora.

6.2 Programarea orientată obiect in Visual FoxPro

Programarea Orientata Obiect (PrgOO) revoluţionează aproape fiecare

aspect al programării de aplicaţii sub Visual FoxPro, de la fazele de analiză şi

design până la scrierea codului sursă şi testarea aplicaţiilor şi a componentelor.

PrgOOO a fost introdusa în Visual FoxPro versiunea 3.0 şi a devenit unul din

standardele cel mai des folosite. Primul şi cel mai important concept cheie în

PrgOO este un obiect. Un obiect este un pachet de informaţii şi acţiuni. Spre

exemplu, considerăm un ascensor ca fiind un obiect conţinând proprietăţi

(maxim de greutate), produce acţiuni (ca închiderea şi deschiderea uşilor), şi are

o interfaţă publică (butoanele de control) care facilitează interacţiunea cu

mediul care îl înconjoară.

6.2.1 Proprietăţile

Datele dintr-un obiect se numesc proprietăţi. O proprietate (în termeni

Visual FoxPro) este o variabilă de memorie care este ataşată unui obiect.

Valoarea poate fi interogată şi modificată folosind numele obiectului urmat de

un punct (.) şi de numele proprietăţii (proprietăţile mai sunt numite şi variabile

membru în unele texte). Proprietăţile pot avea date de orice tip care sunt valide

pentru variabilele de memorie Visual FoxPro. O proprietate există atâta timp cât

obiectul căruia îi este ataşat există.

De exemplu, daca avem o proprietate denumită lIsNew care este ataşată

unui obiect numit oCust, am putea interoga valoarea proprietăţii scriind

urmatoarea linie:

? oCust.lIsNew

Page 154: Module 1-6 FoxPro

154

6.2.2 Metodele

În afară de posibilitatea de a avea date ataşate, obiectele trebuiesc să

desfaşoare acţiuni. Aceste acţiuni sunt codate sub formă de proceduri care sunt

ataşate obiectului, denumite metode. Există puţine diferenţe între o procedură

obişnuită şi o metoda cu excepţia modului prin care sunt chemate. O metodă

este chemată scriind numele obiectului urmat de un punct şi apoi numele

metodei. Spre exemplu, următoarea linie ilustrează modul de apelare a metodei

denumită Print ataşată fiind de obiectul oCust:

oCust.Print()

Tehnic vorbind, parantezele de la sfârşitul numelui metodei este

necesară dacă se aşteaptă întoarcerea unei valori sau dacă se apeleasa metoda cu

parametrii. E de sfătuit folosirea întotdeauna a parantezelor pentru consistenţă,

şi se menţionează şi faptul că se apelează o metodă.

6.2.3 Evenimentele

Evenimente sunt elemente care se întâmplă. Spre exemplu apăsarea pe

mouse este un eveniment. Evenimentele pot fi cauzate de acţiunea unui

utilizator (ca şi apăsarea pe mouse) sau de însuşi sistemul (ca atunci când apare

o eroare). Când se creează o clasă (asemeanea unui buton) în Visual FoxPro, se

pot ataşa cod (metode) evenimentelor . Când evenimentul are loc, metoda

asociată (metoda de click) este apelată automat. Se poate ataşa cod chiar şi

evenimentelor care se execută automat când obiectul este creat (evenimentul

Init) şi când evenimentul este şters (evenimentul Destroy).

6.2.4 Clasele

În programare orientată obiect, obiectele nu sunt niciodată codate, în

locul acestora se foloseşte o variantă îmbunătăţită denumită clasă de obiecte.

După aceea obiectele sunt instanţiate (create) din acea clasă. Toată programarea

se face la nivelul clasei. Odată ce obiectul a fost instanţiat dintr-o clasă tot ce

ramâne de făcut este să se interacţioneze cu el. Nu se vor adăuga metode sau

modifica cele existente dintr-un obiect, ci mai degrabă se vor adăuga sau

schimba metode într-o clasă.

Exemplu:

DEFINE CLASS myClass AS Custom

cName = ""

cType = ""

Page 155: Module 1-6 FoxPro

155

lIsNew = .F.

PROCEDURE ShowVals

? this.cName

? this.cType

IF this.lIsNew

? "I'M NEW"

ELSE

? "I'M OLD"

ENDIF

ENDPROC

ENDDEFINE

Paragrafele următoare vor descrie codul de mai sus.

Define Class myClass as Custom

Această linie de cod transmite programului Visual FoxPro faptul că se defineşte

o clasă nouă denumită MyClass care se bazează pe o altă clasă denumită

Custom, care va fi descrisă mai tarziu în acest capitol.

cName = ""

cType = ""

lIsNew = .F.

Aceste linii de cod sunt cunoscute sub numele de cod de declaraţie. În

această parte a definirii clasei, se listează variabilele membre (proprietăţile) ale

obiectului şi ale datelor iniţiale. Dacă unul dintre variabilele membre este un

vector, partea de DECLARE va fi amplasată aici

PROCEDURE ShowVals

? this.cName

? this.cType

IF this.lIsNew

? "I'M NEW"

ELSE

? "I'M OLD"

ENDIF

ENDPROC

Aceasta este definiţia unei metode. Apelarea unei metode execută tot

codul sursă începând cu PROCEDURE şi terminând cu ENDPROC. O metodă

Page 156: Module 1-6 FoxPro

156

este similară unei proceduri FoxPro 2.x, cu excepţia că metoda este apelată prin

intermediul obiectului său.

6.2.5 Instanţierea obiectelor

Un obiect este instanţiat prin funcţia CREATEOBJECT(). Aceasta este

sintaxa pentru crearea unei instanţe MyClass:

oMyClass = CREATEOBJECT("MyClass")

oMyClass este doar o variabilă de memorie de tip Obiect. Pentru a putea accesa

membrii oMyClass, se pot folosi următoarele comenzi:

? oMyClass.cName && Initially blank

oMyClass.cName = "Menachem Bazian"

? oMyClass.cName && Now shows "Menachem Bazian"

oMyClass.ShowVals() && Runs the showvals method

6.2.6 Referirea unei Metode sau a unei Proprietăţi într-o clasă

Pentru a se putea referi la proprietăţile unui obiect sau ale unei metode

din însuşi clasa, se va folosi indentificatorul THIS în locul numelui obiectului

(s-a putut observa acest lucru în procedura SHOWVALS).

IF this.lIsNew

? "I'M NEW"

ELSE

? "I'M OLD"

ENDIF

Cuvântul cheie THIS semnifică faptul că se accesează metoda sau

variabila membră ale obiectului în sine.

6.2.7 Subclasarea unei clase unei altei clase

a) Crearea unor clase bazate pe cele anterioare

Să presupunem că avem o clasă denumită Light („lumină”) care

modelează lumina dintr-o cameră. Clasa ar avea nevoie de o metodă care să

poată închide şi aprinde lumina şi o proprietate pentru statusul curent al luminii.

Ar putea arăta astfel:

DEFINE CLASS light AS custom

status = "OFF"

Page 157: Module 1-6 FoxPro

157

PROCEDURE Toggle

IF this.status = "OFF"

this.status = "ON"

ELSE

this.status = "OFF"

ENDIF

ENDPROC

ENDDEFINE

În exemplul clasei Light, se crează un obiect care practic are o singură

proprietate şi o metodă. Aceasta funcţionează perfect pentru întrerupătoare care

doar sting şi aprind lumina, dar să presupunem că am dori să creăm un

întrerupător care să şi diminueze lumina. Întrerupătorul este încă aplicabil:

lumina putând încă să fie aprinsă şi stinsă. Ceea ce ne trebuie este o variantă

modificată a clasei Light care să aiba aceleaşi capabilităţi ca şi clasa Light şi în

plus capacitatea de a diminua lumina.

Pentru această ilustrare se vor stabili următoarele reguli: când se va

încerca folosirea diminuatorului, se va trece de la lumină maximă la lumină

slabă şi apoi lumină maximă. Pentru a stinge sau aprinde totuşi lumina se va

folosi metoda întrerupătorului de bază.

Astfel se poate realiza acest lucru folosind modelul OOP:

DEFINE CLASS dimmer AS light

intensity = "FULL"

PROCEDURE DimmIt

IF this.status = "OFF"

RETURN

ENDIF

this.intensity = IIF(this.intensity = "FULL", ;

"HALF", "FULL")

WAIT WINDOW "Lights are now "+this.intensity+" power."

ENDPROC

ENDDEFINE

În originalul DEFINE al clasei (clasa Light), s-a folosit Custom ca o

clasă de bază. Custom este clasa de bază cea mai simplă care este montată în

FoxPro; aceasta se foloseşte când se crează obiecte de la zero. În DEFINE cel

Page 158: Module 1-6 FoxPro

158

folosit aici, clasa de bază este Light. Aceasta semnificănd faptul că se va

moşteni tot ceea ce are Light de către clasa Dimmer. Totuşi, fără existenţa unui

cod în clasa Dimmer pentru a manevra metoda întrerupătorului şi a proprietăţii

statusului, Dimmer capătă metoda şi proprietăţile pentru că este o subclasă a

clasei Light. Acest proces este cunoscut sub denumirea de moştenire.

Efectul produs este subclasa (Dimmer) ca fiind o varianta specializată a

superclasei (Light).

b) Ignorarea comportamentului de moştenire

Una dintre cele mai frumoase lucruri la moştenire este faptul că putem

accepta ceea ce dorim de la superclasă, iar restul să ignorăm. Peste o metoda se

poate trece sau ignora când este recodată în subclasă. Iată un exemplu:

DEFINE CLASS offdimmer AS dimmer

intensity = "FULL"

PROCEDURE DimmIt

WAIT WINDOW "Dimmer is DIsabled"

ENDPROC

ENDDEFINE

În acest caz, metoda DimmIt a fost redefinită/ignorată. Metoda DimmIt

nu v-a mai fi apelată din clasa Dimmer.

Sa presupunem că am vrea să rulăm metoda din clasa metoda DimmIt a

clasei Dimmer şi pe urmă să adăugam cod la acesta. Astfel s-ar putea proceda:

DEFINE CLASS AnotherDimmer AS offdimmer

intensity = "FULL"

PROCEDURE DimmIt

Dimmer::Dimmit()

OffDimmer::Dimmit()

WAIT WINDOW "Isn't this cool?"

ENDPROC

ENDDEFINE

Operatorul (::) este folosit pentru a apela metode din clase aflate

superior în ierarhie. A se observa că se pot apela metode doar din clase din care

s-a moştenit.

Page 159: Module 1-6 FoxPro

159

6.2.8 Protejarea metodelor şi a proprietăţilor

Când se creează un obiect, trebuie avut în vedere care va fi interfaţa

publică pe care o va avea clasa. O clasă în mod obişnuit are proprietăţi şi

metode care sunt pentru a fi folosite numai în interiorul clasei. Dacă alte

proprietăţi şi metode, ar fi accesate din exterior, pot avea un efect dezastruos

pentru cele din interiorul clasei.

Să considerăm exemplul clasei Light şi să presupuem că metoda

întrerupătorului are un cad care îi permite să aprindă lumina şi să o închidă

bazată pe proprietatea Status. Dacă modificăm proprietatea Status prin

accesarea ei din exteriorul clasei, metoda întrerupător (Toggle) nu va lucra

corespunzător.

Soluţia la această problemă este protejarea metodei şi a proprietăţilor

care nu ar trebuie să poată fi accesate din exteriorul clasei. Când scriem codul

clasei putem proteja proprietăţile adăugând definiţii de genul PROTECTED

numeproprietate în zona declarativă a clasei. Pentru metode trebuie adăugat

cuvântul cheie PROTECTED pe linia procedurii.

DEFINE CLASS myClass AS Custom

PROTECTED cName

cName = ""

cType = ""

lIsNew = .F.

PROTECTED PROCEDURE ShowVals

? this.cName

? this.cType

IF this.lIsNew

? "I'M NEW"

ELSE

? "I'M OLD"

ENDIF

ENDPROC

ENDDEFINE

În acest exemplu, proprietatea cName şi metoda Showvals sunt

protejate. Încercările de a le accesa din exteriorul clasei ar produce o eroare ca

şi cum proprietatea şi metoda nu ar exista (şi în ceea ce priveşte lumea

exterioară, ele nici nu trebuie să existe).

Page 160: Module 1-6 FoxPro

160

Dacă o clasă trebuie să fie controlată (ca şi proprietatea Status, care

poate fi modificată doar de metoda Toggle / întrerupător), atunci ea ar trebui

protejată. Dacă utilizatorul trebuie să citească valoarea acelei proprietăţi, trebuie

să punem la dispoziţie o metodă care returnează valoarea proprietăţii protejate.

De exemplu, pentru a accesa proprietatea cName în clasa drept exemplu

prezentată anterior, ar trebui să creăm o metodă denumită ShowName după cum

urmează:

FUNCTION ShowName

RETURN (this.cName)

ENDFUNC

6.2.9 Polimorfismul

Polimorfism este capacitatea de a oferi metodelor sau proprietăţilor din

clase diferite chiar dacă ele semnifică lucruri distincte.

De exemplu, să considerăm exemplul cu obiectele clasei Light, care

toate au o metodă numită Toggle (întrerupător), care aprind şi opresc lumina.

Acum să presupunem că trebuie să creăm un cu totul alt obiect denumit

telephone (telefon). Obiectul Telephone ar putea să nu aibă legătura deloc cu

obiectul Light, dar există o metodă ataşată acesteia numită Toggle.

Să comparăm următoarele comenzi:

oLight = CREATEOBJECT("Light")

oPhone = CREATEOBJECT("Telephone")

oLight.Toggle() &&Runs the Toggle method from

&&the Light object

oPhone.Toggle() &&Runs the Toggle method from

&&the Phone object

Să observăm cât demult se aseamană oLight şi oPhone. Putem apela

metoda Toggle din oricare obiect într-un mod similar chiar dacă ar putea face

lucruri distincte.

Polimorfismul ne dă posibilitatea sa stabilim standarde în loc de metode

care fac acelaşi lucru. De exemplu, putem avea o metodă Show pentru diferite

obiecte care este desemnată să apeleze porţiunea de afişare a obiectului (de ex.,

oCust.Show() ar putea afişa formularul clientului, pe când oInv.Show() ar putea

afişa formularul de factură). Frumuseţea acestui lucru derivă din viziunea

utilizatorului. Înseamnă că putem folosi obiectele cu o mult mai mare uşurinţă

pentru că putem realiza o interfaţă consistentă pentru lucrul cu clase.

Page 161: Module 1-6 FoxPro

161

6.3 Sistem de mentenanta în POO

Pornind de la exemplul luminii / Light, să presupunem că utilizatorul

schimbă definiţia de bază a întrerupătorului / switch. În acest exemplu un

întrerupător de lumină (light switch) are o singură proprietate (Status) şi o

metodă (Toggle). Să presupunem că firma a reconceput întrerupătorul de bază

(clasa Light) pentru a adăuga o nouă facilitate. Acum, când utilizatorul

manevrează întrerupătorul, sistemul îi spune utilizatorului ce s-a întâmplat.

Pentru a realiza acest lucru, tot ce trebuie să se realizeze este

modificarea definiţiei clasei Light după cum urmează:

DEFINE CLASS light AS custom

status = "OFF"

PROCEDURE LightSwitch

IF this.status = "OFF"

this.status = "ON"

ELSE

this.status = "OFF"

ENDIF

WAIT WINDOW "Light is now " + this.status

ENDPROC

ENDDEFINE

De la acest punct în continuare, toate obiectele instantiate din clasa

Light primesc metoda modificată. Ca efect, s-a modificat acţiunea fiecărui

obiect bazat pe această clasă adăugând câte un rând de cod la definiţia clasei.

Dar aceasta nu este tot. Nu numai că am modificat toate obiectele bazate pe

clasa Light, dar am modificat şi fiecare obiect bazate pe subclasele ale clasei

Light (de exemplu, dimmer). Acesta este un mod ideal de a realiza cod

reutilizabil.

Partea mai puţin plăcută a lucrurilor este faptul că dacă greşim în acea

clasa am putea genera erori şi în subclasele bazate pe aceasta, indiferent de

aplicaţia în care este folosită clasa.

6. 4 Realizarea claselor in Visual FoxPro

Până acum toate exemplele enunţate se referă strict la cod de

programare. De fapt unele clase nu pot fi programate decât prin cod scris.

Totuşi, pentru marea majoritate, crearea claselor este mult mai eficientă

Page 162: Module 1-6 FoxPro

162

folosind instrumentul Visual Class Designer creat pentru a realiza cu uşurinţa

clase de obiecte.

Visual Class Designer este un supraset al Form Designer. În fapt, Visual

Class Designer este mai degrabă un Designer folosit de fişierul meta pentru a

stoca clasele create într-o copie de structură .SCX / .SCT. Singura diferenţă

constă în faptul că extensia dată unui fişier de clasă este .VCX în locul .SCX, şi

în faptul că poate memora mai multe clase într-un singur fişier spre deosebire

de un singur formular în cazul unui fişier .SCX.

Când se crează clase în mod vizual, Visual FoxPro permite accesul la

bara de controale şi la fereastra de proprietăţi.

Figura următoare exemplifică Visual Class Designer când se lucrează pe o clasă

a unui buton.

Visual Class Designer

Toate opţiunile meniului acţionează aproape identic cu cele ale Designer

–ului de formulare. Astfel vor fi prezentate doar elementele care diferă de cele

ale Designer –ului de formulare.

Page 163: Module 1-6 FoxPro

163

6.4.1 Diferenţele designului de suprafaţă

Prima diferenţă este aparentă, dar tehnic vorbind nu este nici o diferenţă.

Obiectul supus modificării în Form Designer este un formular. Un formular este

un container de obiecte şi de aceea poate conţine mai multe obiecte. În figura

XXX se înfăţişează doar un obiect CommandButton. Aceasta, se datorează

clasei care este construită fiind o subclasă a CommandButton, care nu suportă

adăugarea de noi obiecte. Astfel tot ce putem vedea este un singur obiect pe

care lucrăm. Dacă lucrăm pe o clasă de tip formular în Visual Class Designer,

spaţiul de lucru arată identic cu cel al Form Designer.

6.4.2 Diferenţele de meniu

Opţiunile care sunt specifice formularelor, ca şi Create Form Set şi

Remove Form Set , nu se regăsesc în meniu Visual Class Designer. Adăugarea

unei opţiuni de meniu, Class Info, şi operaţiunile noilor metode şi proprietăţi ,

de către Visual Class Designer, sunt realizate puţin schimbate. Aceste schimbări

vor fi primele discutate.

6.4.3 Adăugarea proprietăţilor şi a metodelor

Opţiunile din meniu şi anume, New Property şi New Method,

funcţioneaza ca şi în Form Designer cu o modificare importantă: apare un nou

control de tip check box în fereastra de dialog care ne permite să protejăm noile

metode şi proprietăţi. Bifarea acestui control semnifică protejarea în sine a

proprietăţii sau metodei. Pentru a nu mai proteja motoda sau proprietatea,

opţiunea Edit Property sau Edit Method. De reţinut că o proprietate sau o

metodă, odată protejate, nu pot fi neprotejate într-o subclasă. Va trebui sa fie

deprotejată la nivelul la care a fost adăugată în ierarhia clasei.

6.4.4 Accesarea Informaţiilor clasei

Opţiunea de meniu, Class Info, dă developer –ului acces la informaţii

privind clasa care este modificată cu fereastra de dialog prezentată în imaginea

de mai jos:

Page 164: Module 1-6 FoxPro

164

Fereastra de dialog Class Info

Tabul Class în acest frame al ferestrei arată câteva informaţii despre

clasă. Următorul tabel descrie opţiunile din fereastră:

Toolbar Icon Această opţiune stabileşte ce pictogramă va fi afişată în

bara de instrumente al controalelor formularelor în

momentul când fişierul de tip .vcx este încărcat. Apăsând

pe butonul de comandă de la dreapta spaţiului editabil, va

afişa fereastra de dialog GETPICT care permite selectarea

unui fişier grafic.

Container Icon Acesta este conceput în ideea facilităţii anterioare cu

excepţia că se referă la pictograma afişată pentru această

clasă în fereastra Class Browser.

OLE Public Dacă această opţiune este setată, în momentul când un

program, conţinând această clasă, este construit folosind

Project Manager, se va genera o automatizare personalizată

de server şi GUID (Identificator Global Unic)

Scale Units Determină unitatea de măsură a gridului.

Description Aici se pot introduce descrieri sugestive ale clasei.

Class Name Numele clasei care este modificată.

Parent Class Superclasa acesteia.

Class Library Numele fişierului .vcx în care este salvată clasa.

Page 165: Module 1-6 FoxPro

165

Următorul tab este Members, care afişeaza membrii clasei curente.

Membrii clasei pot fi proprietăţi, metode, evenimente, sau obiecte. Obiectele

membre apar dacă clasa este una compozită (de tip container).

Acest tab, care este exemplificat în figura XGY, conţine o listă a tuturor

membrilor clasei şi faciliteză programatorului să îi protejeze prin selectarea

coloanei protejate. Coloana No Init este aplicabilă numai obiectelor membre şi

transmite Visual FoxPro dacă să ruleze evenimentul Init al acestui obiect când

este adăugat la momentul de rulării. Prin bifare se specifică ignorarea

evenimentului.

Tabul de membrii pentru fereastra de dialog Class Info.

În continuare va fi preyentat modul de programare in Visual Designer şi

anume cele două modele: CREATE şi MODIFY

Crearea unei clase

O clasă nouă poate fi creată cu comanda CREATE CLASS. Folosirea

acestei comenzi fără specificarea altor informaţii prezintă imaginea de mai jos:

Fereastra de dialog a unei noi clase

Page 166: Module 1-6 FoxPro

166

Clasele pot fi bazate pe cele conţinute deja în Visual FoxPro sau pe cele

create ulterior de programator. Pentru a baza clasa nou creată pe una de bază

creată tot de către programator se dă click pe butonul (...). O fereastră de dialog

va permite indicarea unei clase care este necesară.

Fereastra de dialog în care se selectează o clasă.

Modificarea Clasei într-un fişier .VCX

Clasele pot fi modificate în Visual Class Designer prin comanda

MODIFY CLASS. Sintaxa comenzii:

MODIFY CLASS <NumeClasă> OF <NumeLibrărieClasă>

NumeLibrarieClasă este numele fişierului .vcx conţinând clasa ce va fi

modificată.

Page 167: Module 1-6 FoxPro

167

ANEXA NR. 1

PROIECT

la disciplina BAZE DE DATE ŞI SISTEME DE GESTIUNE

A BAZELOR DE DATE

I. CUPRINS CADRU ORIENTATIV AL PROIECTULUI:

1. Tema proiectului

2. Obiective (Prezentarea principalelor funcţiuni ale aplicaţiei);

3. Definirea şi proiectarea logică şi fizică a ieşirilor (machete ale

rapoartelor de ieşire: ex. L1: Listare tabela 1; L2: listare tabela 2; L3:

Listare din ambele tabele….etc.);

4. Definirea şi proiectarea logică şi fizică a intrărilor (macheta ecranelor de

preluare date de intrare);

5. Definirea şi proiectarea logică şi fizică a bazei de date

. Proiectarea conceptuală a bazei de date (DEA)

. Structura tabelelor bazei de date

6. Definirea şi proiectarea meniurilor aplicaţiei

7. Schema bloc a aplicaţiei

8. Anexe: - Listarea programului sursă

- Situaţii de ieşire cu date de test semnificative.

9. Bibliografie

II. ETAPE DE REALIZARE A PROIECTULUI (Model orientativ)

Etapa I-a: Analiza şi prezentarea cerinţelor aplicaţiei:

- Denumirea aplicaţiei;

- Prezentarea principalelor funcţiuni ale aplicaţiei;

- Identificarea colecţiilor de date şi modelarea conceptuală şi

logică a bazei de date;

- Specificarea cerinţelor funcţionale şi a restricţiilor de realizare a

aplicaţiei informatice cu baze de date.

Etapa a II-a: Proiectarea aplicaţiei:

- Identificarea componentelor aplicaţiei: ieşiri, intrări, baze de date,

fluxul de prelucrări:

Page 168: Module 1-6 FoxPro

168

- Proiectarea machetelor pentru rapoartele de ieşiri informaţionale ale

aplicaţiei;

- Stabilirea listei cu documentele primare ale aplicaţiei informatice;

- Proiectarea machetelor videoformat pentru preluarea datelor de

intrare;

- Proiectarea bazei de date şi alegerea SGBD-ului (stabilirea

tabelelor bazei de date);

Proiectarea schemei fizice a bazei de date (structura tabelelor bazei

de date);

Diagrama entitate legături după normalizarea bazei de date;

Proiectarea meniului principal al aplicaţiei informatice (meniuri cu

funcţiuni, butoane, taste funcţionale etc.);

- Proiectarea schemei de sistem a aplicaţiei;

- Estimarea eficienţei economice a aplicaţiei informatice cu baze de

date.

Etapa a III-a: Realizarea aplicaţiei informatice:

- Elaborarea, testarea şi integrarea modulelor aplicaţiei informatice cu

baze de date într-un produs program reutilizabil.

Observaţii:

1. Dezvoltarea modulelor aplicaţiei informatice se poate face fie în limbajul de

programare specific SGBD-ului ales, fie apelând la generatoarele de aplicaţii

disponibile în SGBD-ul ales.

2.Pentru nivelul de utilizatori se cere realizarea unei aplicaţii informatice care

are cel puţin două tabele corelate şi cel puţin patru rapoarte. În anexa

proiectului se va ataşa rezultatul rulării cu datele de test;

3.Pentru nivelul analişti- programatori se cere crearea unei aplicaţii cu cel puţin

patru tabele (două câte două legate prin câmpuri comune), încărcarea lor cu date

corelate, realizarea de machete videoformat (formulare) destinate activităţii de

actualizare şi vizualizare simultană a tabelelor corelate, realizarea a cel puţin

patru interogări din baza de date şi realizarea a cel puţin trei rapoarte. In anexa

proiectului se va ataşa listingul programului sursă şi rezultatul rulării cu datele

de test.

Etapa a IV-a: Implementarea aplicaţiei şi menţinerea în funcţiune:

- Precizarea platformei hardware şi software minimala pentru rularea

aplicaţiei şi a graficului de implementare a aplicaţiei;

- Crearea şi popularea cu date a tabelelor bazei de date şi mersul în

paralel cu sistemul actual;

Page 169: Module 1-6 FoxPro

169

- Adaptarea structurii tabelelor bazei de date şi a aplicaţiei la dinamica

cerinţelor utilizatorilor şi la schimbările tehnice şi organizatorice

care pot surveni.

III. LISTA TEMELOR PENTRU PROIECTUL INDIVIDUAL:

1. Aprovizionarea cu materii prime şi materiale

- Evidenţa stocurilor de materii prime şi materiale (fişe de gestiune:

intrări;consumuri; stoc final)

- Calculul necesarului de aprovizionat în funcţie de planul de producţie şi de

stocul existent

- Recepţia materialelor de la furnizori;

- Elaborarea NIR pentru marfă intrată şi evidenţa abaterilor;

- Încheierea contractelor de aprovizionare cu furnizorii de materiale pentru

acoperirea necesarului;

- Urmărirea realizării contractelor:(evidenţa facturi pe furnizori-contracte-

materiale- cantităţi- diferenţe de penalizat)

- Elaborarea unui grafic de aprovizionare (intrări materiale – furnizori- date

calendaristice)

- Evidenţa intrărilor pe categorii de materiale şi furnizori

2. Activitatea de Producţie:

- Elaborarea planului anual de producţie în funcţie de capacităţi (produse –

cantităţi – estimarea potenţialului pietei);

- Defalcarea planului anual pe unităţi de producţie şi perioade de timp;

- Repartizarea sarcinilor de plan pe posturi de lucru (produs-reper-operaţie-

cantităţi)

- Calculul încărcării utilajelor

- Înregistrarea producţiei realizate (post de lucru- produs/reper realizat- cantitate

– evidenţa rebuturi)

- Urmarirea realizării planului de fabricaţie pe secţii şi sectoare de activitate.

3. Activitatea comercială (Desfacerea producţiei):

- Gestiunea stocurilor de produse finite pe gestiuni (intrări-ieşiri produse)

- Repartiţia produselor pentru vânzare la diferite magazine;

- Acoperirea planului de productie cu contracte de desfacere;

- Evidenţa contractărilor pe beneficiari;

- Elaborarea graficului de desfacere a produselor în funcţie de termenele de

livrare contractate;

- Urmărirea contractelor de desfacere pe beneficiari (sesizare intârzieri)

4.Evidenţa mijloacelor fixe

Page 170: Module 1-6 FoxPro

170

- Crearea şi actualizarea fişei mijlocului fix

- Planificarea şi executarea reviziilor şi reparaţiilor

- Calculul amortizărilor lunare şi transferul lor către aplicaţia de contabilitate;

- Inventarierea mijloacelor fixe pe locuri de muncă.

5.Transport

- Evidenţa parcului auto şi a foilor de parcurs;

- Graficul de transport şi întocmirea foilor de parcurs pentru activitatea de

aprovizionare şi desfacere (evidenţa orelor lucrate)

6. Activităţi financiar contabile

- Preluarea notelor contabile din aplicaţiile de salarii, gestiune materiale,

mijloace fixe, transport,etc.

- Evidenţa contabilă în lei şi valuta (din documetele primare)

- Întocmirea situaţiilor centralizatoare: cartea mare, balanţa, bilanţ

- Calculul impozitului pe profit

- Elaborarea unor documente primare (dispoziţii de plată, chitanţe)

- Elaborarea fişelor de cont şi a registrului general

- Situaţia obligaţiilor neachitate şi a createlor neîncasate

- Situaţia veniturilor şi a cheltuielilor

7. Personal şi salarizare

- Evidenţa personalului (pe locuri de muncă- funcţii-situaţia militară)

- Calculul salariilor: indexare, compensare

- Situaţia reţinerilor pe tipuri de reţineri (rate la casa, mobilă, obiecte de uz

comun,etc.)

- Determinarea fondurilor pentru concedii medicale şi de odihna

- Listare documente: ştat de salarii, lista de avans chenzinal; pontaj; declaraţie

lunară către bugetul asigurărilor de stat;

- Întocmirea notelor contabile şi trimiterea lor către aplicaţia de contabilitate;

- Întocmirea dispoziţiilor de plată

ORICE ALTE TIPURI DE APLICAŢII:

- Evidenţa cheltuielilor de întreţinere la o asociaţie de locatari;

- Evidenţa pacienţilor la medicul de familie

- Evidenţa producţiei şi comercializare produselor la ….

- Aplicaţia ADMITERE la o unitate de învăţământ

- Aplicaţia desfacere la un supermarket

- Etc.

Page 171: Module 1-6 FoxPro

171

ANEXA NR 2

Comenzi PLIANT

1. Comenzi pentru crearea, modificarea si afisarea structurii bazei de date: CREATE nume_fisier

MODIFY STRUCTURE

DISPLAY STRUCTURE

LIST STRUCTURE [TO PRINT][TO FILE fis][IN ALIAS nume]

COPY STRUCTURE TO fisier [FIELDS lista_câmpuri]

2. Comenzi pentru crearea, [ncarcarea si gestionarea bazei de date APPEND [BLANK]

CREATE FROM

USE [fis/?][IN zona_lucru][INDEX lista_MDX_NDX][ORDER [TAG] fis.MDX/fis.NDX

[OF .MDX]][ALIAS alias][EXCLUSIVE][NOUPDATE]

LIST/DISPLAY FILES [LIKE] struct [ TO PRINTER/TO FILE fis]

COPY TO nume_fis [[TYPE] tip_fis][FIELD lista_câmpuri][scop][FOR cond] [WHILE

cond ][ WITH PRODUCTION]

COPY FILE sursa TO dest

COPY INDEXES lista_fis NDX [TO fis MDX]

SELECT n si SELECT alias

JOIN WITH alias TO fis[ FOR cond ][ FIELDS lista_câmpuri]

SET RELATION TO [expr/expN][INTO alias]

CREATE VIEW nume_fis FROM ENVIRONMENT

CREATE/MODIFY QUERY/VIEW nume_fis

SET VIEW TO fis/?

CREATE/MODIFY APPLICATION nume_fisier

CREATE/MODIFY LABEL nume_fisier

LABEL FORM nume/? [domeniu][ SAMPLE ][ FOR/WHILE cond][TO PRINT] [TO

FILE fisier]

ERASE nume.ext/?

Page 172: Module 1-6 FoxPro

172

DELETE [domeniu][FOR cond][WHILE cond]

RENAME fis.ext TO nfis.ext

3. Comenzi pentru sortare ]i indexare SORT TO fisier ON câmp1 [/A][/C][/D][,câmp2[/A][/B][/D]...] [ASCENDING/

DESCENDING] [domeniu][FOR cond][WHILE cond]

INDEX ON lista_câmpuri TAG/TO nume_fis [UNIQUE][DESCENDING]

SET INDEX fisier/? [ORDER fis.NDX/ [TAG] tag_MDX [OF fis.MDX]]

SET ORDER TO [TAG] fisier/MDX tag [OF MDX_fis]

4. Comenzi pentru localizarea [nregistrarilor

SKIP [expr][IN alias]

GO/GOTO BOTTOM/TOP/ [RECORD] nr [IN ALIAS]

LOCATE [FOR cond][domeniu][WHILE cond]

CONTINUE

FIND "sir"

SEEK expresie

5. Comenzi pentru actualizarea fi]ierelor APPEND FROM fisier [[TYPE] tip_fisier][FOR/WHILE cond]

INSERT [BEFORE][BLANK]

EDIT [RECORD n] [NOINIT] [NOFOLLOW] [NOAPPEND] [NOMENU] [NOEDIT]

[NODELETE] [NOCLEAR] [FIELDS lista_câmpuri] [FOR cond] [WHILE cond]

CHANGE [NOINIT] [NOFOLLOW] [NOAPPEND] [NOMENU] [NOEDIT]

[NODELETE] [NOCLEAR] [nr-inreg] [FIELDS lista_câmpuri] [domeniu] [FOR cond]

[WHILE cond]

BROWSE [NOINIT] [NOFOLLOW] [NOAPPEND] [NOMENU] [NOEDIT]

[NODELETE] [NOCLEAR] [COMPRESS] [FORMAT] [LOCK nr] [WIDTH nr]

[FREEZE nr_câmp][WINDOW nr_fereastra][FIELDS nume_câmp1/R lat.coloana/ nume

câmp calculat1 = expr1[,nume_câmp2 [/R] [/lat.coloana] /nume_câmp_calculat2 =expr2]...]

REPLACE [scop] [câmp WITH expresie câmp2 WITH expr2] [FOR cond] [WHILE cond]

[ADDITIVE]

Page 173: Module 1-6 FoxPro

173

UPDATE câmp cheie FROM alias REPLACE câmp1 WITH expresie [câmp2 WITH

expresie2 ] [RANDOM]

DELETE [domeniu] [FOR cond] [WHILE cond]

PACK

RECALL [domeniu] [FOR cond] [WHILE cond]

ZAP

6. Comenzi pentru crearea rapoartelor ]i machetelor ecran (videoformate) CREATE/MODIFY REPORT fisier/?

CREATE/MOFIDY SCREEN nume_fisier

SET FORMAT TO [fisier/?]

REPORT FORM fis/? [PLAIN] [HEADING sir][NOEJECT] [SUMMARY] [domeniu]

[FOR cond] [WHILE cond] [TO PRINTER/TO FILE fis]

7. Comenzi pentru introducerea si afisarea datelor de la terminal ACCEPT [mesaj] TO variabila de memorie

INPUT [mesaj] TO var

@ linie1, coloana1 [SAY expresie] [PICTURE expC] [FUNCTION fct] [GET var] [[OPEN]

WINDOW nume_fer] [PICTURE expr] [FUNCTION lista] [RANGE val1,val2] [VALID

cond [[ERROR expC] [WHEN cond] [DEFAULT expr] [MESSAGE expr] [COLOR

std./enhanced] [CLEAR] [TO rând2, coloana2] [DOUBLE/PANEL border_def]

Functiile de formatare care pot fi folosite cu optiunea PICTURE sunt:

@A accepta numai caractere alfabetice;

@B aliniaza la stanga datele numerice;

@C afiseaza “CR” (credit) dupa un numar pozitiv;

@D afiseaza data in format american;

@E afiseaza data in format european;

@X afiseaza “DB” (debit) dupa numere negative;

@Z afiseaza zerourile ca blankuri

@! Afiseaza toate caracterele cu majuscule;

@( incadreaza numerele negative cu paranteze;

@Sn limiteaza lungimea campului la n pozitii.

Clauzele de formatare care pot fi folosite cu optiunea PICTURE sunt:

Page 174: Module 1-6 FoxPro

174

9 accepta doar cifre pentru datele caracter sau cifre si semn pentru datele

numerice

# accepta numai cifre, blank-uri si semne;

A accepta numai litere;

L accepta numai date logice;

N accepta numai litere si cifre;

X accepta folosirea oricarui caracter;

Y accepta numai caracterele Y,y,N,n;

! converteste literele in majuscule corespunzatoare;

$ afiseaza caracterul $ in locul zerourilor initiale;

. specifica o pozitie zecimala

, afiseaza virgula in pozitia specificata.

READ SAVE

?/?? [expresie [PICTURE "clauza"] [FUNCTION "lista_functii] [AT expN] [STYLE font]

??? expC

LIST [[FIELDS] exp_list] [OFF] [domeniu] [FOR cond] [WHILE cond] [TO PRINT FILE

fis]

DISPLAY [[FIELDS expr_list] [domeniu] [lista_câmp] [FOR cond] [WHILE cond] [OFF]

[TO PRINT/TO FILE fis]

8. Comenzi de calcul

AVERAGE [lista_câmpuri] [domeniu] [FOR cond] [WHILE cond] [TO lista_var/TO

ARRAY nume-sir]

CALCULATE [domeniu] optiuni [FOR cond] [WHILE cond] [TO lista_var/ TO ARRAY

nume_sir]

Calculeaza cantitati folosind functii financiare sau statistice. Functiile sunt: AVG(expN) calculeaza media aritmetica a valorii expN;

CNT() numara [nregistrarile fi]ierului baza de date;

MAX(exp) gase]te valoarea maxima [n câmp, exp reprezinta un nume de

câmp;

MIN(exp) gase]te valoarea minima [n câmp;

STD(exp) determina deviatia standard a valorii stocate [ntr-un câmp al bazei de date, exp fiind

nume de câmp.

SUM(exp) calculeaza suma valorilor unui câmp al bazei de date.

VAR(exp) determina variati avalorilor [ntr-un câmp al bazei de date.

TOTAL ON cheie TO fis [FIELDS lista_câmpuri] [domeniu] [FOR cond] [WHILE cond]

Page 175: Module 1-6 FoxPro

175

9. Comenzi de lucru cu variabile de memorie ]i tablouri

STORE expr TO lista variabile de memorie/lista de elemnte tablou

SAVE TO fisier [ALL LIKE/EXCEPT masca]

Salveaza [ntr-un fi]ier pe disc variabilele de memorie ]i elementele de tablou

active. Fi]ierul creat are extensia .MEM.

RELEASE [lista_var] / [ALL [LIKE/EXCEPT masca]]

[RELEASE MODULE nume_modul]

[RELEASE MENUS lista_meniuri]

[RELEASE POPUP lista_popup]

[RELEASE SCREEN nume_ecran]

[RELEASE WINDOW lista_fereastre]

RESTORE FROM fisier [ADDITIVE]

DECLARE tablou1 [numar linii, numar coloane]

COPY TO ARRAY tablou [FIELDS lista câmpuri] [domeniu] [FOR conditie] [WHILE

conditie]

APPEND FROM ARRAY tablou [FOR cond]

COUNT [TO variabile memorie] [domeniu] [FOR/WHILE conditie]

SUM [scop] [lista expresii numerice] [TO lista variabile /TO ARRAY tablou] [FOR conditie]

[WHILE conditie]

LIST MEMORY [TO PRINT] [TO FILE nume fisier]

DISPLAY MEMORY

Se deosebe]te de LIST MEMORY doar prin faptul ca [ntrerupe afi]area dupa

fiecare ecran plin. Continuarea se realizeaza prin apasarea oricarei taste.

PRIVATE ALL [LIKE/EXCEPT masca] / [lista variabile] / [ARRAY lista]

PUBLIC [lista variabile] / [ARRAY lista]

Seteaza variabilele definite ca fiind publice.

10. Comenzi pentru informarea utilizatorului

ASSIST

DIR/DIRECTORY [[ON] drive] [[LIKE] [cale] masca]

LIST/DISPLAY STATUS [TO PRINT] / [TO FILE fisier]

HELP nume comanda