Module 1-6 FoxPro
-
Upload
bogdan-baltaretu -
Category
Documents
-
view
190 -
download
3
Transcript of 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
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
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
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
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
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.
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.
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
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.
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
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
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
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.
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:
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
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;
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
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;
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,
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
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
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
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:
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).
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)
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ă
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.
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 ;
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)
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.
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)
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.
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.
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
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).
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
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:
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
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ă
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)
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)
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.
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.
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.
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ă:
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
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
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 :
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ă;
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]
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]
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>]
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.
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;
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:
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‟
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
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);
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
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;
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
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
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>
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ă>
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).
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
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:
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.
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
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
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
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
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ă.
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]
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
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:
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
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
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:
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()
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>]
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
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
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:
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
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
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.
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>]
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.
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.
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
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.
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
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ă;
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 „^‟
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.
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 „@*!‟
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
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:
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.
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.
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)
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ă.
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
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
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
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.
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
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.
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
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
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
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
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
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
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
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"
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"
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.
*************************************************************
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"
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"
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
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.
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:
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ă.
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
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
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
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.
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
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.
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
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
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.
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.
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).
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ă.
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
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ă .
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);
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.
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.
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
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:
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.
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:
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
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.
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.
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.
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.
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
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
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 = ""
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ă
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"
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
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.
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).
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.
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ă
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.
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:
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.
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
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ă.
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:
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;
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
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.
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/?
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]
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:
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]
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