Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Mediul de lucru visual foxpro

mediul de lucru visual FoxPro

Visual FoxPro (VFP) face parte din categoria sistemelor de gestiune a bezelor de date relationale, dar inglobeaza si facilitati specifice programarii orientate obiect. El reprezinta un mediu de lucru puternic, orientat catre utilizatorii finali, pentru crearea bazelor de date si dezvoltarea de aplicatii complexe centrate in jurul bazelor de date. Obiectele unei astfel de aplicatii sunt: baza de date, interogari asupra bazei de date (query), formulare pentru introducerea datelor, rapoarte, meniuri, proceduri etc. Gestionarea acestor obiecte se poate realiza de o maniera centralizata cu ajutorul unei interfete unice prin inglobarea lor intr-un proiect (aplicatie).



Obiectele unei aplicatii pot fi create si/sau modificate prin apelarea la comenzile limbajului procedural inclus dar si prin intermediul generatoarelor si al asistentilor speciali (wizard) pusi la dispozitia utilizatorilor finali.

Componentele mediului de lucru

O data cu deschiderea sesiunii de lucru FoxPro, elementele mediului de lucru apar pe ecran in urmatoarea forma (vezi fig. nr. 7.1).

Figura nr. 7.1. Elementele mediului de lucru FoxPro

VFP pune la dispozitia utilizatorilor o interfata grafica prietenoasa, orientata pe evenimente, ceea ce permite trecerea rapida de la o activitate la alta, de la o fereastra la alta sau de la o aplicatie la alta. Activitatile necesare crearii si gestionarii obiectelor din aplicatii pot fi realizate prin intermediul urmatoarelor componente ale mediului de lucru VFP: meniurile derulante (pull-down menus), ferestrele de lucru si obiectele de control.

Sistemul de meniuri derulante este asemanator celui folosit in mediile de lucru Windows. Apelarea componentelor din meniurile derulante se face atat prin intermediul tastaturii cat si al mouse-ului. In functie de contextul de lucru, unele optiuni nu sunt selectabile deoarece la momentul respectiv este imposibila aplicarea lor.

Figura nr. 7.2. Exemplu de meniu derulant in Visual FoxPro

Mediul de lucru VFP se bazeaza pe utilizarea de ferestre, aproape fiecare actiune determinand deschiderea unei ferestre de lucru. De exemplu, actionarea comenzii New din meniul File determina aparitia ferestrei din fig. nr. 7.2. Ferestrele pot fi gestionate atat cu ajutorul tastaturii, cat si cu ajutorul mouse-ului.

Obiectele de control sunt utilizate in modul de lucru asistat prin meniurile si submeniurile oferite de sistem sau in utilizarea intrumentelor de dezvoltare a aplicatiilor (generatore de rapoarte, constructori de meniuri etc.).

Principalele obiectele de control utilizabile in Visual FoxPro sunt urmatoarele (vezi figura 7.3):

cadru de pagina (ex. fereastra din figura 7.3 contine doua cadre de pagina - SERVER si CLIENT, fiecare cu obiectele sale de control; pagina SERVER este activa);

casete de text;

casete combinate;

casete cu lista;

casete de incrementare/decrementare;

butoane de optiune;

caseta de validare;

buton de comanda.

Figura nr. 7.3. Obiecte de control Visual FoxPro

Diferite obiecte de control sunt disponibile si in cadrul instrumentelor de dezvoltare a aplicatiilor. Astfel, pentru formulare sunt specifice urmatoarele obiecte de control:

Label - text (inlocuieste comanda @.SAY.) - cu ajutorul lor se pot afisa texte in cadrul unui formular (fereastra de lucru definita de utilizator);

Text Box si Edit Box - casete de editare text (inlocuieste comanda @ . GET . ) - permit introducerea de date de diferite tipuri;

Drop-Down List si Drop-Down Combo (liste ascunse, respectiv liste ascunse combinate cu o caseta de text, permitand adaugarea de elemente in lista) - ofera posibilitatea selectarii unor elemente dintr-o multime finita, ce sunt afisate pe ecran;

Command Button - buton declansator - permit lansarea in executie a anumitor operatiuni, ele avand inscrise texte sau imagini care sugereaza operatia ce poate fi realizata;

Option Button - buton de selectie - prin intermediul carora se poate selecta o singura optiune din mai multe posibile;

Check Box - comutator - sunt utilizate atunci cand trebuie ca utilizatorul sa opteze pentru una din doua posibilitati si prin care se precizeaza respectarea sau nerespectarea unei conditii anume;

Grid - grila - afiseaza datele din baza de date sub forma tabelara si permite editarea continutului acestora sau adaugarea de noi inregistrari;

Image - permite introducerea unei imagini;

OLE - permite legarea unor obiecte din alte aplicatii Windows (adesea imagini si sunete);

Spinner - caseta de editare cu butoane de incrementre/decrementare - este utilizata in cazul valorilor numerice si permite cresterea sau descresterea interactiva a valorii din caseta cu o anumita valoare fixata la proiectarea ei;

Timer - declanseaza executia unei proceduri la intervale prestabilite de timp;

Page Frame - cadru de pagina - permite crearea de "pagini" suprapuse in aceeasi zona din formular;

Line, Shape - pentru trasarea de linii si figuri geometrice.

Pentru rapoarte sunt disponibile urmatoarele obiecte de control:

Label - text;

Field - permite afisarea valorii unui camp dintr-o tabela sau o variabila de memorie in oricare din benzile unui raport.

Rectangle, Line, Rounded Rectangle - pentru trasarea de linii si figuri geometrice;

OLE Bound Control - pentru afisarea unui camp OLE.

Obiectele enumerate dispun de multiple proprietati, metode (de fapt, proceduri FoxPro) si evenimente carora li se pot atasa proceduri (click de mouse, apasarea unei taste, deplasare). Un obiect are predefinite metode standard, dar utilizatorul poate crea si propriile sale metode.

Moduri de lucru FoxPro

Dupa deschiderea sesiunii de lucru, VFP ofera utilizatorilor trei modalitati de realizare a operatiunilor dorite: modul direct, modul asistat si modul program.

Modul de lucru direct

In modul de lucru direct (sau comanda) utilizatorul poate realiza operatiunile dorite prin introducerea liniilor de comanda corespunzatoare in fereastra de comenzi, iar rezultatele sunt afisate imediat pe ecran. In acest mod pot fi folosite aproape toate comenzile FoxPro. In principiu nu pot fi folosite comenzile pentru controlul derularii programelor (RETURN, CANCEL, EXIT) si comenzile pentru descrierea structurilor de control alternative si repetitive. Utilizarea acestora genereaza mesajul de eroare "Statement not allow in interactive mode". In plus, in fereastra asociata modului de lucru direct sunt pastrate toate comenzile introduse intr-o sesiune de lucru si pot fi salvate, respectiv reutilizate dupa cerinte. Activarea sau dezactivarea ferestrei de comenzi asociate modului de lucru direct poate fi realizata prin combinatia de taste CTRL + F2.

Comenzile FoxPro au urmatoarea forma generala

VERB [<lista_expresii>] [<domeniu>] [FOR <expL1>] [WHILE<expL2>]

[TO PRINTER | TO ARRAY <lista_tablouri> | TO <variabila_memorie>

| TO FILE <fisier>] [ IN <alias>] [NOOPTIMIZE] [ALL [LIKE | EXCEPT <masca>]]


VERB reprezinta numele comenzii, este cuvant rezervat si exprima actiunea de executat.

Argumentul <lista expresii> reprezinta o lista de diferite tipuri de expresii (siruri de operanzi legati intre ei prin operatori). Cele mai importante expresii sunt cele matematice. Operanzii pot fi nume de campuri, nume de variabile, elemente de tablou, constante, functii. Operatorii pot fi aritmetici (+,-,/,*,^), relationali (<,>,<=,>=,#,=), logici (NOT, AND, OR) etc.

Multimea inregistrarilor asupra carora actioneaza comanda formeaza domeniul inregistrarilor. Clauza <domeniu> se va inlocui cu una din urmatoarele constructii, in functie de necesitati:

ALL selecteaza toate inregistrarile din tabela;

NEXT <expN> se refera la urmatorele <expN> inregistrari, incepand de la inregistrarea curenta, inclusiv;

RECORD <expN> actioneaza numai asupra inregistrarii cu numarul <expN>;

REST selecteaza inregistrarile incepand de la cea curenta, inclusiv si pana la sfarsitul tabelei.

De retinut ca fiecare comanda are un domeniu implicit. Spre exemplu, comanda LIST are ca domeniu implicit ALL, iar DISPLAY are ca domeniu implicit inregistrarea curenta.

Clauzele FOR si WHILE pot restrictiona domeniul. Clauza FOR se foloseste pentru selectarea inregistrarilor in functie de o conditie logica <expL1>. Comanda se va aplica numai acelor inregistrari pentru care <expL1> este adevarata. Clauza WHILE ('cat timp') selecteaza inregistrarile in functie de expresia logica <expL2>. Spre deosebire de clauza FOR care dupa gasirea unei inregistrari care nu respecta conditia <expL1> continua testarea celorlalte, clauza WHILE intrerupe testarea inregistrarilor cand gaseste o inregistrare ce nu respecta conditia data Daca se specifica ambele clauze FOR si WHILE, are prioritate clauza WHILE.

Prin clauza [TO PRINTER | TO ARRAY <lista_tablouri> | TO <variabila_memorie> | TO FILE <fisier>] rezultatul comenzii este directionat la imprimanta, intr-un tablou, intr-o variabila de memorie sau intr-un fisier.

Clauza [ALL [LIKE | EXCEPT <masca]] indica includerea in/sau excluderea de sub incidenta comenzii a unor fisiere, campuri, variabile de memorie conform mastii. In cadrul mastilor pot fi utilizate caracterele generice _ ('underscore') si % ce au aceeasi semnificatie cu caracterele ? si * din DOS.

Clauza IN permite gestionarea datelor dintr-o alta zona de lucru. Numarul zonelor de lucru difera de la un sistem la altul si de la o versiune la alta. In fiecare zona de lucru putem deschide o tabela (comanda USE). Parametrul <alias> este un pseudonim utilizat pentru o tabela. Acest pseudonim poate fi orice nume diferit de numele tabelei.. Daca lipseste, pseudonimul este chiar numele tabelei.

Clauza NOOPTIMIZE - inhiba tehnica Rushmore de comprimare a indecsilor.

In descrierea comenzilor se folosesc urmatoarele elemente de metalimbaj:

componentele scrise cu majuscule sunt cuvinte rezervate (nume de comenzi sau functii); se folosesc exact in aceeasi forma, eventual prescurtate la primele 4 caractere;

componentele scrise cu minuscule, in paranteze unghiulare reprezinta constructii definite de utilizator;

] desemneaza o constructie optionala

indica posibilitatea de repetare a constructiei anterioare

|este sau exclusiv si indica posibilitatea selectarii unei singure optiuni din lista respectiva.

Exemplu:

Comanda LIST are urmatorul format:

LIST [FIELDS <lista expresii>] [<domeniu>] [FOR <expL1>] [WHILE<expL2>] [OFF] [NOCONSOLE] [NOOPTIMIZE] [TO PRINTER [PROMPT]  | TO FILE <nume fisier>]

Modul de lucru asistat

Utilizatorul poate realiza multe din operatiunile dorite, fara sa apeleze la comenzile VFP, prin intermediul modului de lucru asistat. Utilizarea acestui mod de lucru presupune, cel mai adesea, activarea sistemului de meniuri derulante. In loc de a scrie liniile de comenzi se aleg meniurile, submeniurile, comenzile si parametrii necesari pentru realizarea obiectivului propus. In acest mod nu mai este necesara cunoasterea amanuntita a sintaxei fiecarei comenzi. Unele optiuni din submeniuri apar urmate de trei puncte (.), ceea ce arata ca dupa selectare trebuie aleasa alta optiune sau trebuie furnizati si alti parametri, prin intermediul unui submeniu sau al unei casete de dialog.

Pe masura ce se lucreaza cu meniurile, VFP converteste operatiunile in comenzi care sunt retinute in fereastra asociata modului de lucru direct. In acest fel, modul de lucru asistat este un mijloc ideal pentru invatarea comenzilor VFP.

O alta facilitate specifica modului de lucru asistat este reprezentata de gestionarul de aplicatii (Project Manager). El permite inglobarea intr-o aplicatie a tuturor obiectelor care o compun precum si gestiunea lor centralizata prin intermediul unei interfete unice (vezi figura 7.4). Aceasta interfata permite accesarea asistentilor speciali pentru crearea bazei de date, a generatoarelor si a altor instrumente de lucru asistat, dar si adaugarea componentelor ce nu au fost create in cadrul proiectului (aplicatiei). Toate obiectele aplicatiei sunt salvate intr-un fisier cu extensia PJX, iar la construirea proiectului prin selectarea butonului BUILD, toate obiectele sunt compilate intr-un singur fisier cu extensia APP.

Figura nr. 7.4. Interfata gestionarului de aplicatii

Crearea si gestionarea obiecteelor din aplicatie se poate realiza prin selectarea tipului de obiect dorit si a unuia din butoanele oferite de interfata. Aceste butoane au urmatoarele functiuni:

New - permite crearea unui nou obiect, in functie de tipul de obiect selectat.



Nota. Toate aceste operatiuni pot fi realizate si prin intermediul optiunilor existente in sistemul de meniuri, insa obiectele create nu sunt adaugate automat in proiect.

Add - adauga la proiect un obiect creat in afara proiectului.

Modify - deschide instrumentul de proiectare corespunzator cu tipul obiectului selectat si permite modificarea acestuia. Este activ numai daca este selectat un obiect.

Browse - deschide o tabela in fereastra BROWSE care permite actualizarea datelor in tabela respectiva. Acest buton este activ numai in urma selectarii unei tabele.

Open/Close - deschide/inchide o baza de date. Daca baza de date selectata este deja deschisa pe buton va fi inscrisa eticheta CLOSE, iar daca baza de date este inchisa va fi inscrisa eticheta OPEN.

Remove - determina eliminarea obiectului selectat din proiect sau stergerea fizica a acestuia de pe disc, in functie optiunea selectata de utilizator in fereastra de dialog afisata pe ecran.

Build - realizeaza compilarea tuturor obiectelor din aplicatie sau obtinerea unui fisier executabil care sa permita utilizatorilor lansarea in executie a aplicatiei fara a mai fi necesara desciderea explicita a unei sesiuni de lucru VFP.

Preview - afiseaza pe ecran raportul sau eticheta selectata, create anterior cu generatorul de rapoarte sau generatorul de etichete. Acest buton este activ numai in cazul selectarii unui obiect de tip raport sau eticheta.

Run - lanseaza in executie interogarea, formularul sau programul selectat si este activ doar daca a fost selectat un obiect de tipul celor mentionate.

Observatie:

Nu toate butoanele prezentate anterior sunt afisate la un moment dat, ci numai unele, in functie de contextul de lucru (adica de tipul obiectului selectat)

Modul de lucru program

In cazul aplicatiilor complexe, structurate in programe si proceduri, se apeleaza la modul de lucru program. Modul de lucru program asigura astfel descrierea eficienta a prelucrarilor repetitive sau a conditiilor de executie a diferitelor categorii de operatiuni.

VFP dispune de un editor de texte care permite crearea si editarea fisierelor care contin programele si procedurile. Acest editor de texte este apelat prin comanda MODIFY COMMAND <nume program> sau in modul asistat din meniul File/New/Program. Automat la salvare se va adauga fisierului extensia .PRG. Executia programelor FoxPro se realizeaza prin comenzile DO <nume program> sau DO <nume procedura> sau in modul asistat din meniul Program/DO.

Performante deosebite se obtin prin imbinarea modului de lucru asistat cu cel program.

Crearea bazelor de date in Visual FoxPro

Structura unei baze de date in VFP

Incepand cu versiunea 3, FoxPro, devenit Visual FoxPro, se apropie apreciabil de "filosofia" modelului relational. Elementul central al unei BD este tabela (table) - vezi exemplul din figura 7.5. O tabela corespunde notiunii teoretice de relatie. Coloanele tabelei sunt denumite atribute sau campuri (fields). Notiunii de tuplu (sau linie) ii corespunde cea de inregistrare (record). Fiecare inregistrare are un numar intern (recno), care depinde de ordinea "fizica" in care inregistrarile au fost adaugate in tabela.

Dupa cum a fost prezentat in paragraful anterior, o mare parte din comenzile SGBD-ului au ca domeniu toate inregistrarile tabelei, in timp ce altele doar inregistrarea curenta. Caracteristic categoriei de SGBD-uri din care face parte FoxPro este prezenta unui pointer intern (un soi de contoar) care memoreaza numarul inregistrarii curente.

Informatii despre inregistrari sunt furnizate de functii precum:

recno() - furnizeaza numarul (intern) al inregistrarii curente;

Rounded Rectangle: Inregistrare de structura  (structure)

reccount() - furnizeaza numarul total de inregistrari din tabela.

Rounded Rectangle: Nume tabel
(table)
Rounded Rectangle: Cheie primara


Rounded Rectangle: Nume camp 
(field name)

CLIENTI

Cod_cl

Den_cl

Localitate

Adresa

Distanta

900

Suprem SA

Iasi

Chisinau 125

10

Rounded Rectangle: Inregistrare
(record)
750

Sinta SA

Iasi

Bradului 10

10

820

Rodex SRL

Suceava

Unirii 44

150

320

RC Star SRL

Radauti

Putnei 5

190

980

Cristalul

Dorohoi

Al.I. Cuza 15

180

450

Sigma SA

Vaslui

Copou 55

80

735

Gama SRL

Iasi

Pacurari  144

10

220

Delta SRL

Suceava

Areni 19

150

360

Teta SRL

Vaslui

Florilor 36

80

Figura nr. 7.5. Tabela CLIENTI

O baza de date FoxPro, ca orice BD relationala, este alcatuita din una sau mai multe tabele puse in legatura prin intermediul cheilor straine. Atat declararea cheilor primare, cat si a celor straine (si implicit, a restrictiilor referentiale) se bazeaza in VFP pe indecsi asociati tabelelor si care sunt, firesc inclusi in baza.

Pe langa tabele, in BD mai sunt incluse:

tabele derivate (views), care pot fi locale sau la distanta (remote - sunt utilizate pentru a face legatura cu BD gestionate de alte SGBD-uri),

conexiuni cu alte SGBD-uri,

proceduri stocate (stored procedures), care sunt blocuri de program pastrate in dictionarul de date. Cele mai uzuale tipuri de proceduri stocate in VFP sunt: functii si proceduri pentru validarea modificarilor in BD, functii pentru calcularea valorilor implicite ale unor atribute si declansatoare (triggere).

Este prezentata in continuare baza de date VANZARI, alcatuita din tabelele CLIENTI, COMENZI, PRODUSE.


CLIENTI


Cod_cl

Den_cl

Localitate

Adresa

Distanta

900

Suprem SA

Iasi

Chisinau

10

750

Sinta SA

Iasi

Bradului

10

820

Rodex SRL

Suceava

Unirii

150

320

RC Star SRL

Radauti

Putnei

190

980

Cristalul

Dorohoi

Al.I. Cuza

180

450

Sigma SA

Vaslui

Copou

80

520

Alfa SRL

Suceava

Marasesti

150

623

Beta SRL

Iasi

Decebal

10

735

Gama SRL

Iasi

Pacurari

10

220

Delta SRL

Suceava

Areni

150

Comenzi


Nr_com

Cod_cl

Cod_prod

Cantitate

Data_com


12

900

34501

2000.00

13/03/05


20

750

34501

2500.00

15/03/05


25

820

34501

3570.00

28/02/05


80

320

34512

4500.00

28/12/05


80

980

34521

2500.00

16/04/05


30

820

34531

200.00

03/10/05


30

450

34502

5600.00

13/03/05


89

520

34531

1200.00

20/04/05


58

750

34502



1240.00

20/04/05

 

Produse

Cod_prod

Den_prod

U_m

Pret_i

34501

Rochie AC-218

BUC

250000

34511

Sacou AC-226

BUC

310000

34512

Sacou AC-227

BUC

360000

34521

Sarafan AC-243

BUC

120000

34531

Bolero AC-245

BUC

105000

34502

Rochie AC-219

BUC

162000

Numele tabelelor, atributele care o compun, restrictiile de cheie, regulile de validare la nivel de atribut si inregistrare, legaturile permanente dintre tabele (cheile straine), declansatoarele, precum si celelalte proceduri stocate sunt pastrate intr-un fisier special denumit dictionar de date (data dictionary sau, in unele SGBD-uri, data catalog), care in VFP are extensia .DBC (DataBase Container). Tabelele BD au extensia .DBF, iar indecsii .CDX.

Mecanismul de baza in declararea domeniilor de valori ale unui atribut are la baza precizarea tipului si lungimii fiecarui camp dintr-o tabela.

Tipuri de date FoxPro

Datele sunt stocate pe suporturile de memorare intr-un anumit format, in functie de tipul fiecareia. Tipul unei date este o caracteristica ce stabileste modul in care data este inregistrata pe suportul de memorare si modul in care este interpretata si prelucrata.

In VFP exista o serie de tipuri de date predefinite, insa exista posibilitatea definirii de catre utilizator a altor tipuri de date pe baza celor existente deja. Tipurile de date predefinite implementate in VFP sunt: numeric, sir de caractere, logic (boolean), data calendaristica, memo si general.

Tipul Character (sir de caractere) este cel mai uzual tip de date, folosit in majoritatea tabelelor. Campurile caracter pot stoca intre 1 si 254 caractere. Poate contine orice caracter ASCII. Pentru date de dimensiuni mai mari se recomanda campurile memo.

Exemplu:

Den_client, C, 20

Localitate, C, 15              

Tipul Numeric (real, in virgula fixa descrie datele reprezentate in virgula fixa. Lungimea maxima este de 20 de cifre, din care maxim 19 pozitii zecimale, fiecare cifra necesitand un spatiu de stocare de un octet. In afara de cifre se pot folosi semnele +/- si marca zecimala

Exemplu:

Cod_cl, N,3

Pret_unit, N,11,2

N,11,2 se interpreteaza astfel: 8 cifre pentru partea intreaga, 2 cifre pentru partea fractionara si marca zecimala.

Tipul de data Numeric este tipul numeric clasic, implementat si in versiunile anterioare de FoxPro, VFP oferind si urmatoarele tipuri de date numerice:

Tipul Integer este destinat reprezentarii numerelor intregi, in cod complementar pe patru octeti.

Tipul Double presupune reprezentarea datelor numerice in virgula mobila dubla precizie si este destinat reprezentarii numerelor foarte mari sau a celor foarte mici.

Tipul Currency (format monetar) este utilizat pentru memorarea datelor referitoare la tranzactii in unitati monetare.

Tipul Data calendaristica este implementat prin Date (data si DateTime (data-ora

DATE este utilizat pentru memorarea datelor calendaristice cuprinse in domeniul 01/01/100 si 31/12/9999. Ordinea de specificare a zilei, lunii si anului poate fi controlata prin comanda SET DATE.

DATETIME permite utilizatorilor o gestiune mai fina a timpului prin includerea momentelor de timp din cadrul unei zile alaturi de data calendaristica. Ora variaza in domeniul 00:00:00 a.m. si 11:59:59 p.m.

Exemplu1: 

DATA_C, D

DATA_OP, DT

Exemplu2:

Deschideti tabela COMENZI, configurati modul de specificare a datei calendaristice in formatul "dd/mm/yy" si schimbati valoarea atributului DATA_C pentru prima inregistrare cu valoarea 4 martie 1977. Schimbati modul de specificare a datei calendaristice in formatul "yy/mm/dd".

USE COMENZI

SET DATE TO DMY

REPLACE DATA_C with

? DATA_C&& se va afisa valoarea 04/03/1977

SET DATE TO YMD

? DATA_C&& se va afisa valoarea 1977/03/04

USE

Tipul Logical (logic) desemneaza date ce nu pot lua decat doua valori: True (adevarat) si Flase (fals).  Are lungimea de un caracter. Pentru adevarat este asociata litera T sau cifra 1, iar pentru fals litera F sau cifra 0.

Exemplu:

Taxabil, L, 1.

Tipul Memo se foloseste pentru date tip caracter care depasesc 254 de caractere si prevede o dimensiune de stocare variabila de la inregistrare la alta. Un bloc reprezinta un numar fix de caractere pe care FoxPro le rezerva pentru un camp memo. In mod prestabilit, FoxPro utilizeaza 64 de octeti pentru un bloc. FoxPro stocheaza valorile campurilor memo intr-un fisier distinct care are extensia .FPT si cu acelasi nume cu al tabelei. Utilizand campurile memo se pot memora nu numai texte, ci si alte informatii: fisiere executabile DOS, imagini, biti de sunet etc.

Tipul General apare incepand de la versiunea FoxPro 2.5 sub Windows. Intr-un camp de tip general pot fi pastrate obiecte de diferite tipuri: grafic, imagine, sunet, foaie de calcul, adica obiecte create cu alte aplicatii Windows. Datorita folosirii mecanismului OLE,  un obiect poate fi pastrat intr-un camp de tip general prin legare sau prin incorporare. In ambele cazuri intre baza de date si aplicatia sursa cu care a fost creat obiectul se realizeaza o legatura. Aceasta legatura permite modificarea obiectelor incorporate sau legate la baza de date, direct din FoxPro (apelarea aplicatiei sursa cu care se modifica obiectul se face din FoxPro). In cazul acestei relatii FoxPro este considerat client pentru ca foloseste obiecte create cu alte aplicatii, acestea fiind servere. Un camp General este un camp Memo specializat. FoxPro stocheaza campurile General in acelasi fisier .FPT utilizat de celelalte campuri Memo ale tabelului, insa acestea nu sunt utilizate in acelasi fel. Campurile General sunt utilizate in primul rand pentru stocarea referintelor la obiecte OLE legate. Prin legare obiectul nu este inclus fizic in document, ci se memoreaza doar referintele necesare localizarii si descrierii acestuia. Prin incorporare o copie a obiectului este inclusa fizic in document.

Conversia intre tipurile de date

Uneori apare necesitatea prelucrarii unor date de diferite tipuri in expresii complexe. De exemplu, aceasta necesitatea apare la specificarea expresiei indexului compus pentru o tabela, expresie care sa combine o date de tip sir de caractere cu date numerice sau date de tip sir de caractere cu date calendaristice. In astfel de expresii complexe toate datele trebuie sa fie compatibile din punctul de vedere al tipului de data, motiv pentru care se apeleaza la functiile de conversie a datelor care dau posibilitatea transformarii datelor de diferite tipuri.

Cele mai utilizate functii de conversie a tipului de data sunt prezentate mai jos.

Conversia datelor numerice in date de tip sir de caractere

STR(expresie_numerica,[lungime,[numar_zecimale]]), in care lungime reprezinta numarul de caractere pe care-l va contine sirul de caractere returnat, iar numar_zecimale numarul de cifre de la partea fractionara care-l va contine sirul de caractere returnat.

Conversia datelor de tip sir de caractere in date numerice

VAL(expresie_caracter)

Conversia datelor calendaristice in date de tip sir de caractere

DTOC(expresie_data[,1]) in care parametrul '1' permite conversia unei date calendaristice intr-un sir de caractere potrivit pentru indexare, in sensul ca se pastreaza succesiunea cronologica a inregistrarilor din tabela.

Conversia datelor de tip sir de caractere in date calendaristice

CTOD(expresie_caracter)

Exemplu 1

? VAL("1250.25")+2522.50

? CTOD("04/03/77")

Exemplu 2

USE COMENZI

? STR(NR_CDA,4)+DTOC(DATA_C)

USE

In VFP stocarea datelor se realizeaza de cele mai multe ori in cadrul tabelelor care compun baza de date. In afara de acestea, in VFP se pot utiliza variabile si constante. Daca datele memorate in tabele sunt stocate pe disc si le putem considera permanente deoarece ele nu se pierd intre doua sesiuni de lucru, datele memorate in variabile sunt stocate in memoria interna a calculatorului si au un caracter temporar deoarece la inchiderea sesiunii de lucru ele vor fi pierdute. Variabilele si constantele sunt utilizate mai ales in cadrul programelor.

Variabilele de memorie pot fi simple sau structurate in tablouri (array). Daca o variabila poate memora o singura valoare la un moment dat, un tablou ne apare ca o matrice formata din mai multe linii si, eventual, mai multe coloane in care se pot memora mai multe valori in acelasi timp, in functie de dimensiunile definite la crearea sa. De exemplu, tabloul de date IMP_SAL(10,2) poate stoca 20 (10x2) de valori in acelasi timp. Deci, se poate afirma ca un tablou reprezinta un ansamblu de variabile de memorie.

O variabila are asociata o locatie de memorie in care se poate scrie sau citi o valoare. Referirea la o locatie de memorie in vederea citirii/scrierii unei valori se face doar prin nume, in cazul variabilelor simple de memorie, si prin nume urmat de indicii care specifica numarul liniei si numarul coloanei (daca este un tablou bidimensional) pentru tablourile de date.

Definirea unei variabile de memorie se poate face prin simpla atribuire a unei valori, iar in cazul tablourilor de date se utilizeaza comanda DIMENSION cu urmatoarea structura:

DIMENSION nume_tablou1(nr_linii1[,nr_coloane1])

[, nume_tablou2 (nr_linii2 [, nr_coloane2])]

Exemplu

Sa se defineasca variabila de memorie SAL_BRUT si sa i se atribuie valoarea 1000000; sa de defineasca tabloul de date bidimensional IMP_SAL format din doua linii si trei coloane si sa se atribuie valori fiecarui element din tablou. Sa se calculeze si sa se afiseze impozitul aferent unui venit brut de 1000000 lei.

SAL_BRUT = 1000000

Note  s-a definit variabila IMP_SAL si i s-a atribuit valoarea 1000000

DIMENSION IMP_SAL(2,3)  && se defineste tabloul IMP_SAL

IMP_SAL(1,1)=1000000

IMP_SAL(1,2)=3000000

IMP_SAL(1,3)=5000000

IMP_SAL(2,1)=0.25

IMP_SAL(2,2)=0.30

IMP_SAL(2,3)=0.40

? SAL_BRUT*IMP_SAL(2,1)&& se va afisa 250000

RELEASE SAL_BRUT, IMP_SAL


Crearea tabelelor unei bazelor de date

Crearea bazei de date

O baza de date poate fi creata in oricare dintre cele trei moduri de lucru ale VFP: asistat, prin comenzi si prin program.

Cel mai simplu este modul de lucru asistat. Din proiect (desi nu este obligatoriu) se alege cadrul de pagina Data. Dupa selectarea pictogramei Databases se actioneaza butonul New, iar dintre cele doua butoane afisate apoi - Database Wizard si New Database - se executa clic pe al doilea. In continuare, sistemul solicita precizarea numelui bazei de date - in exemplul nostru, VANZARI (salvata intr-un fisier cu extensia .dbc). Drept rezultat, pe ecran apare "proiectantul" bazei de date (database designer), ca in figura 7.6.

Fig. nr. 7.6. Database Designer

In continuare, apeland la butonul New Table se trece la definirea structurii fiecarei tabele. Definirea mininala a structurii presupune indicarea numelui fiecarui atribut, a tipului si lungimii acestuia. Pentru atributele de tip numeric real, pot fi precizate si numarul de pozitii zecimale. Pentru tabela Clienti, declararea atributelor este prezentata in fig. nr. 7.7.



Fig. nr. 7.7. Stabilirea structurii tabelei CLIENTI utilizand Table Designer

Din cele 3 cadre de pagina - Fields, Indexes si Table - este utilizat mai intai primul. Cadrul de pagina Fields (vezi figura 7.7) este utilizat pentru definirea campurilor din tabela, prin intermediul urmatoarelor elemente:

Name indica numele campului. Tabelele independente, din afara BD, trebuie sa respecte limita de 10 caractere pentru numele campurilor, specifica versiunilor anterioare lui 3.0.

Type specifica tipul campului.

Width specifica numarul de caractere sau de cifre pentru fiecare camp.

Decimal precizeaza numarul de cifre pentru partea fractionara. Se pot preciza doar la datele numerice, cu exceptia celor de tip intreg.

Index specifica indecsii regulari pentru ordonarea valorilor campului ascendent sau descendent.

NULL - cand este specificat, atributul respectiv poate accepta valori nule.

Imediat dupa declararea ultimului camp, dupa salvarea structurii, pe ecran apare mesajul "Input data records now?". Daca se raspunde prin Yes, atunci se pot introduce inregistrari in tabela proaspat creata.

Atentie! Este recomandat ca introducerea inregistrarilor sa se faca doar dupa definirea tuturor tabelelor, a restrictiilor si relatiilor dintre ele, pentru a asigura in acest fel consistenta si corectitudinea datelor introduse.

Definirea restrictiilor la nivel de atribut si inregistrare

O regula de validare la nivel de atribut sau inregistrare este o functie care "intoarce" o valoare logica, TRUE sau FALSE. Daca valoarea returnata este TRUE atunci operatiunea de actualizare a atributului/inregistrarii este operata in tabela. Daca este FALSE, se afiseaza un mesaj de avertizare, iar modificarea prin care s-a incalcat restrictia nu se preia in baza.

Reguli la nivel de atribut

In figura anterioara pe langa cele sase elemente care permit definirea atributelor unei tabele, in jumatatea de jos a ferestrei se observa alte dupa grupuri de optiuni: Display si Field validation. Display permite formatarea valorilor atributului, la culegere si afisarea pe ecran. Pentru acest punct al discutiei intereseaza cel de-al doilea grup. Optinea Rule permite definirea unei reguli de validare la nivel de inregistrare, in timp ce Message va indica ce mesaj apare pe ecran atunci cand regula nu este respectata. Cea de-a treia optiune, Default value, este utila la specificarea valorii implicite a atributului, valoare care va "umple" atributului respectiv la adaugarea unei noi inregistrari.Fig. nr. 7.8. Introducerea regulilor la nivel de atribut

Sa luam cazul tabelei Comenzi din figura 7.8. Atributul curent este data_c ce reprezinta data la care a fost emisa (de catre client) comanda. Pentru acest atribut, valoarea implicita este data-sistem (functia DATE()). Regula de validare la nivel de atribuit stabileste ca data de intocmire a comenzii prebuie sa "cada" in intervalul 1 ianuarie 2000 si 1 ianuarie 2005. Definirea regulii de realizeaza in exemplul nostru prin utilizarea functiei BETWEEN:

BETWEEN(data_c,,).

Daca valoarea atributului nu se incadreaza in intervalul specificat, se afiseaza mesajul Data incorecta !.

Reguli la nivel de inregistrare

Deseori, intereseaza nu numai valorile pe care le poate avea un camp, dar si restrictiile dintre doua sau mai multe campuri ale aceleasi inregistrari. Revenind la tabela Comenzi, instituim urmatoarea regula a firmei stabilita de comun acord cu clientii (care intocmesc comenzile): pentru produsul ce are codul 34501 cantitatea ce poate aparea pe o comanda nu trebuie sa depaseasca 5000 de unitati.

Specific acestei reguli este ca priveste doua campuri: cand cod_prod = 34501, cantitate e musai <= 5000. Cum pentru cuvantul-cheie "musai" nu exista o clauza speciala, in VFP regula se scrie o functie ceva mai complexa: IIF(cod_prod = 34501, IIF(cantitate<=5000, .T., .F.), .T.)

Aceasta expresie se introduce intr-un alt cadru de pagina al proiectantului de tabele (Table Designer), si anume Table, dupa cum se observa in fig. nr. 7.9.

Fig. nr. 7.9. Cadrul de pagina Table pentru validarea la nivel de inregistrare

Cadrul de pagina Table ofera informatii generoase despre tabela: numele bazei de date din care face parte, cate inregistrari contine, cate atribute alcatuiesc tabela si care este suma lungimilor acestora. Pentru declarea restrictiei la nivel de tabela interseaza grupul Record validation. In casuta de text Rule a fost introdusa functia descrisa anterior, in timp ce pentru Message s-a specificat sirul de caractere: Pentru acest produs, cantitatea maxim admisa este 5000 de unitati !.

Declararea cheii primare

Atat in mecanismul de declarare a cheilor primare, cat si cel de declarare al cheilor straine (relatii sau legaturi permanente intre tabele), un rol esential il au indecsii.

Declararea cheii primare in VFP se face creand un index de tip primar. Un index are un nume (tag) si o expresie pe baza caruia este construit. In expresia indexului de tip primar se introduce atributul (sau expresia de atribute, daca cheia primara este compusa). Pentru exemplificare, vezi fig. nr. 7.10.

Declararea indecsilor in modul asistat (interactiv) se realizeaza prin intrebuintarea cadrului de pagina Indexes al proiectantului de tabele. Pentru tabela Clienti numele indexului primar este chiar primaru, tipul acestuia este Primary, iar expresia de indexare este alcatuita din atributul-cheie primara a tabelei, cod_cl. Sagetile din stanga numelui indexului arata daca indexul este in ordine ascendenta sau descendenta.

Tipul indexului poate fi obisnuit (regular), unic sau candidat. Regular indica faptul ca Visual FoxPro stocheaza in index valoarea generata de expresia indexului pentru fiecare linie a tabelului. Daca mai multe inregistrari au aceeasi expresie, FoxPro stocheaza expresia de mai multe ori, cu pointeri distincti pentru fiecare inregistrare. In cazul tipului Unique sunt incluse numai valorile distincte ale experisiei de construire a indexului. Candidate indica faptul ca expresia indexului respectiv este o cheie-candidat (cheie alternativa).

Fig. nr 7.10. Crearea indexului primar

FoxPro nu limiteaza expresiile indecsilor la un singur camp. Orice combinatie de campuri poate fi folosita drept expresie a unui index. Pentru a crea o expresie complexa se utilizeaza caseta de text Expression din Table Designer.

Declararea legaturilor permanente dintre tabele, inclusiv a restrictiilor referentiale

Si declararea restrictiilor referentiale se bazeaza pe indecsi. In baza de date luata spre exemplificare, pentru tabela Clienti cheia primara este cod_cl, pentru tabela Comenzi este cod_cda, iar pentru Produse, cod_prod. Restrictiile referentiale se instituie intre tabelele Comenzi si Clienti, respectiv intre Comenzi si Produse:

intre tabelele Comenzi (copil) si Clienti (parinte) atributul de legatura este cod_cl

intre tabelele Comenzi (copil) si Produse (parinte) atributul de legatura este cod_prod.

Pentru stabilirea legaturilor permanente (suportul restrictiilor referentiale) este necesara, pe de o parte crearea in tabelele parinte a indecsilor primari, iar, pe de alta parte, in tabela copil a cateva unui index de tip Regular pentru fiecare din cele doua atribute - chei straine, cod_cl si cod_prod. Pentru tabela Comenzi, acest lucru este reflectat in fig. nr. 7.11.

Fig. nr. 7.11. Indecsii tabelei COMENZI

Pentru simplificare, numele indecsilor "obisnuiti" au acelasi nume ca si cel al atributului din expresie.

Cel mai simplu mod de creare a legaturilor permanente intre tabele se realizeaza din proiectantul bazei (Database Designer) pritr-o simpla "tragere" de mouse intre numele indexului primar din tabela parinte si numele indexului "obisnuit" (regular) corespondent al tabelei-copil. Fig. nr. 7.12 ilustreaza acest lucru.

Linia ce uneste tabelele Clienti si Comenzi este simpla inspre Clienti si "trifurcata" inspre Comenzi. Aceasta inseamna ca relatia dintre cele doua tabele este de tip one-to-many (una-la-mai multe).

Atentie! Declararea legaturii permanente intre tabele nu echivaleaza cu instituirea restrictiilor referentiale. In VFP stabilirea restrictiilor referentiale presupune indicarea modului in care SGBD-ul va "reactiona" la actualizarea tabelei parinte si a celei copil. Pentru declararea regulilor de urmat intr-o restrictie referentiala, se face un dublu-click pe linia dintre cele doua tabele, in urma caruia va aparea fereastra cu numele Edit Relationship, ca in fig. nr. 7.13.

Fig. nr. 7.12. Legaturile permanente intre tabelele BD

Fig. nr. 7.13. Fereastra Edit Relationship

Tabela parinte este Clienti, indexul participant in relatie fiind primaru, in timp ce tabela copil este comenzi, indexul participant fiind cod_cl. Dupa actionarea butonului Referential Integrity sunt definite cele trei reguli pentru:

modificarea cheii primare in tabela parinte;

stergerea unei inregistrari in tabela parinte;

inserarea unei inregistrari sau modificarea valorii cheii straine in tabela copil.

Fig. nr. 7.14. Constructorul de integritate referentiala

In constructorul de integritate referentiala prezentat in fig. nr. 7.14 s-au instituit urmatoarele reguli:

modificarea valorii cod_cl in tabela Clienti atrage modificarea in cascada a tuturor liniilor-copil (linii in care cod_cl avea valoarea dinaintea modificarii) in comenzi;

modificarea valorii cod_prod in tabela Produse atrage modificarea in cascada a tuturor liniilor-copil in comenzi;

nu se sterg linii din tabela clienti daca exista linii-copil corespondente in tabela Comenzi;

nu se sterg linii din tabela Produse daca exista linii-copil corespondente in tabela Comenzi;

nu se permite inserarea sau modificarea unei linii in tabela Comenzi daca valoarea cheii straine, cod_cl nu exista in tabela parinte, Clienti;

nu se permite inserarea sau modificarea unei linii in tabela Comenzi daca valoarea cheii straine, cod_prod nu exista in tabela parinte, Produse.

Observatie:

Cele trei seturi de reguli definesc declansatoare (triggerele) celor trei tabele.

Crearea bazei de date prin comenzi/program

Crearea prin comenzi al BD se poate realiza prin comenzile CREATE DATABASE si CREATE TABLE. In fig. nr. 7.15 este prezentat programul creare_bd. Este drept, fiecare comanda din progam poate fi introdusa direct din fereastra de comenzi (mai putin simbolul de continuare (punct-virgula)).

Fig. nr. 7.15. Program de creare a BD

Nota:

Prin comanda CREATE TABLE nu pot fi definite restrictiile referentiate, ci numai precizate relatiile permanente dintre tabele. Definirea modului de "reactie" la adaugarea/ modificarea in tabelele copil sau modificarea/stergerea in tabelele-parinte presupune utilizarea comenzii CREATE TRIGGER.

Deschiderea tabelelor bazei de date prin comenzi

Fiecare tabela a bazei de date are asociata o zona de lucru (o zona de memorie) prin intermediul careia are loc accesul la date. In primele versiuni se putea lucra cu maximum 10 tabele simultan, iar in ultimele versiuni cu maximum 32767 tabele simultan. Fiecare dintre zone are asociat un numar de la 1 la 25, respectiv 32767. Primele 10 zone pot fi identificate si prin primele litere ale alfabetului. La deschiderea unui tabel se poate asocia si un alias pentru zona de lucru respectiva. Ca urmare, identificarea se poate face si prin acest nume. Gestionarea zonelor de lucru se realizeaza prin comanda SELECT:

SELECT <exp N>| ExpC>

Exemplu

SELECT 1

USE CLIENTI

SELECT 2

USE COMENZI

SELECT 3

USE NPRODUSE

SELECT COMENZI

Ultima zona deschisa sau selectata se numeste zona curenta. Asupra tabelei din zona curenta au efect comenzile introduse.

Exemplu

SELECT 1

USE CLIENTI

SELECT 2

USE COMENZI

LIST FOR comenzi.cod_cl=clienti.cod_cl

Accesul la datele din tabele este permis numai dupa deschiderea lor, adica dupa asocierea zonei de lucru prin comanda USE. In Visual Fox Pro formatul acestei comenzi este:

USE [[<nume baza de date>.]<nume tabela> | SQL <nume view> | ?]

[IN <zona de lucru> | <alias >]

[ONLINE]

[ADMIN]

[AGAIN]

[NOREQUERY [<numar sesiune dechisa>]]

[NODATA]

[INDEX <lista fisiere index>  | ?

[ORDER [<expN> | <fisier .idx>

| [TAG] <nume eticheta> [OF <fisier .cdx>]

[ASCENDING | DESCENDING]]]]

[ALIAS <alias>]

[EXCLUSIVE]

[SHARED]

[NOUPDATE]

Argumentul [<nume baza de date>.]<nume tabela> specifica numele tabelei pe care o deschideti. Pentru deschiderea unei tabele care nu apartine bazei de date curente se utilizeaza punctul (.) pentru a separa baza de date de numele tabelei. Daca nu se foloseste si numele bazei de date, Visual FoxPro poate deschide tabelele doar pentru baza de date curenta

Clauza SQL <nume view>  specifica numele unui view SQL.

USE ?  afiseaza un dialog pentru alegerea dintr-o lista a tabelei ce va fi deschisa.

Argumentul <zona de lucru>  specifica zona de lucru unde va fi deschisa tabela. Clauza IN suporta 0 pentru zona de lucru.

Argumentul <alias> specifica aliasul tabelei deschise in zona de lucru curenta. Daca numarul zonei de lucru sau aliasul lipsesc, tabela este deschisa in zona curenta de lucru selectata.

Clauza AGAIN  permite deschiderea unei tabele in mai multe zone de lucru

Daca deschideti o tabela intr-o alta zona de lucru, tabela din noua zona de lucru va avea aceleasi atribute ca si tabela originala. De exemplu, daca tabela este deschisa in acces exclusiv si este deschisa si intr-o alta zona de lucru, atunci tabela va fi deschisa in acelasi mod si in noua zona de lucru.

Clauza INDEX<lista fisiere index> | ? specifica lista indecsilor care vor fi deschisi cu tabela respectiva. Daca tabela are un index compus structural acesta este deschis in mod automat cu tabela respectiva. Lista de indecsi poate contine orice combinatie de indecsi simpli (.IDX) sau compusi (.CDX). Primul index din lista este cel activ.

INDEX ?  afiseaza un dialog cu o lista de unde vor fi selectate fisierele index.

Clauza ORDER [<expN> | <fisier .idx> | [TAG] <nume eticheta> [OF <fisier .cdx>] stabileste indexul principal dupa care se va face ordonarea inregistrarilor din tabela (vezi subcapitolul 7.3.2 privind indexarea tabelelor).

Optiunea ASCENDING | DESCENDING specifica ordinea crescatoare sau descrescatoare folosita pentru accesarea sau afisarea inregistrarilor din tabela. Includerea acestor clauze nu schimba fisierele index sau etichetele; modificarea intervine in ordinea in care inregistrarile sunt afisate sau accesate.

Clauza ALIAS creaza un alias pentru tabela.

Clauzele EXCLUSIVE si SHARED se folosesc pentru lucrul in retea. EXCLUSIVE deschide tabela in modul exclusiv, deci alti utilizatori nu au acces la ea. SHARED deschide tabela in modul de lucru partajat, deci la ea au acces si alti utilizatori. Daca nu includeti EXCLUSIVE sau SHARED, comanda SET EXCLUSIVE curenta (implicit este ON) va determina modul in care este deschisa tabela respectiva.

Clauza NOUPDATE specifica ca tabela este read-only, deci nu poate fi actualizata.

Comanda USE fara nici un argument realizeaza inchiderea tabelei curente. Prin comanda CLOSE DATABASE se inchid toate tabelele deschise.