Download - SGBD Visual Foxpro

Transcript
Page 1: SGBD Visual Foxpro

Identificarea şiclasificarea unor tipuri

de structuri de dateÎn anii precedenÆi de studiu, aÆi învåÆat cå un calculatoreste o unealtå electronicå ce vå poate ajuta så prelucraÆiinformaÆia. InformaÆia prelucratå poate fi formatå dintexte, numere, imagini sau sunete. Ea este påstratå pediferite medii de memorare, în diferite formate, subformå de date. Açadar, orice rezolvare de problemåîncepe prin definirea datelor, continuå cu prelucrarea lor(de exemplu atribuirea de valori) çi se terminå fie cuafiçarea valorii lor, fie cu stocarea lor pe un mediu dememorare în vederea prelucrårii lor ulterior.

AÆi mai învåÆat cå un calculator nu çtie så prelucrezedecât çiruri de cifre binare care pot fi modelate fizic prinimpulsuri de curent, cu douå niveluri de tensiune ce co-respund celor douå cifre binare 0 çi 1. Prin urmare, date-le vor fi codificåri binare ale informaÆiei existente în exte-riorul calculatorului. Fiecårui tip de informaÆie îi cores-punde un anumit mod de stocare în mediul de memora-

re, adicå un anumit tip de datå. Tipul datei determinå atât operaÆiile care se pot executa cuacele date, cât çi modul în care sunt reprezentate pe mediul de memorare. Astfel, fiecarecaracter dintr-un çir de caractere va fi reprezentat sub forma unui grup de 8 cifre binarecorespunzåtoare codului ASCII asociat caracterului, iar asupra datelor de acest tip se potaplica numai operatorul de concatenare çi operatorii relaÆionali. Açadar, datele (data) suntçiruri de biÆi care sunt prelucrate de calculator. Data este o resurså la dispoziÆiaprogramatorului çi orice limbaj de programare permite folosirea mai multor tipuri de date.

Indiferent de tipul de date ales, reprezentarea datei în memoria calculatorului (fie internå,fie externå) se face printr-un çir de biÆi. Pentru a realiza aceastå reprezentare sunt imple-mentaÆi algoritmi de codificare care asigurå corespondenÆa dintre tipul de datå çi çirulde biÆi atât la scrierea datelor, cât çi la citirea lor. Tipul de datå ales de cåtre programatorinfluenÆeazå calitatea programului deoarece el determinå dimensiunea zonei de memorie

Dupå ce veÆi parcurge acestcapitol trebuie så çtiÆi:

1. Cum folosiÆi datele pentru aprelucra informaÆiile.

2. Ce tipuri de date puteÆi folosi.3. Cum puteÆi organiza datele

sub formå de colecÆii de date.4. Ce colecÆii de date puteÆi folosi

în procesul de prelucrare adatelor.

5. Ce este o bazå de date çi cumsunt organizate datele într-obazå de date.

6. Ce operaÆii puteÆi executapentru a obÆine informaÆii înurma prelucrårii datelor dintr-obazå de date.

Capitolul 1

Page 2: SGBD Visual Foxpro

4 Informatică

alocatå, algoritmul de codificare, operatorii admiçi pentru prelucrare çi implicit timpulnecesr prelucrårii.

Analiza datelor se poate face în douå moduri:Logic (la nivelul conceptual). De exemplu, o datå este un numår întreg pozitiv, cu valoricuprinse între 0 çi 100.Fizic (la nivelul reprezentårii ei în memoria internå). De exemplu, în limbajul Pascal odatå de tip integer, iar în limbajul C o datå de tip int (datå numericå de tip întreg) estereprezentatå în 2 octeÆi de memorie çi permite memorarea datelor cu valori cuprinseîntre -32768 ÷ 32767. La nivelul limbajului de programare este necesar så fieimplementaÆi diferiÆi algoritmi care så permitå folosirea acestui tip de datå: algoritmi deîncårcare a valorii datei în zona de memorie, algoritmi de adresare a zonei de memoriealocate, algoritmi de extragere a valorii din zona de memorie etc.

AÆi mai învåÆat cå existå:Date simple sau date elementare. Sunt date independente unele de altele din punctde vedere al reprezentårii lor în memorie. Chiar dacå ele pot depinde din punct devedere logic (valoarea unei date este dependentå de valoarea altei date), ele nu depinddin punct de vedere fizic (localizarea unei date pe suportul de memorare nu se face înfuncÆie de locaÆia unei alte date pe suport).Date compuse sau structuri de date. Sunt colecÆii de date între care existå anumiterelaÆii (relaÆii structurale). Fiecare componentå a structurii are o anumitå poziÆie încadrul structurii, iar toate componentele formeazå un întreg, astfel încât prelucrarea sepoate face atât la nivelul structurii de date (care poate fi consideratå o entitate de sineståtåtoare), cât çi la nivelul fiecårei componente. Pentru fiecare tip de structurå dedate în limbajul de programare trebuie så fie definiÆi algoritmi de localizare acomponentelor în cadrul structurii de date. Între componentele structurii existå çilegåturi de conÆinut, adicå întregul ansamblu de date din colecÆie poate caracteriza unobiect, o persoanå, un fenomen, un proces etc. De exemplu, un vector cu 12elemente în care se memoreazå valorile lunare ale unui contor electric. Structura dedate caracterizeazå în acest caz un proces: consumul lunar de curent electric.Açadar orice obiect, proces sau fenomen din lumea realå poate fi caracterizat printr-olistå de atribute. Valorile atributelor din listå pot fi reprezentate fizic în calculator(lumea virtualå) sub forma unei structuri de date. În anii precedenÆi de studiu aÆi lucratcu urmåtoarele structuri fizice de date:

Structurile de date create în memoria internå sunt temporare dar permit o vitezå deprelucrare mult mai mare decât a celor organizate în memorie externå. Pe de altå parte,structurile de date organizate în memoria externå sunt permanente çi permit stocarea çiprelucrarea unei cantitåÆi mari de date.

Structuri de date

în memoria internå în memoria externå

Tabloul de memorie(vectori çi matrici)

Înregistrarea Fiçierul de date

Page 3: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 5

Açadar, scopul programelor de calculator este de a prelucra datele pentru a furnizainformaÆii. Aceastå informaÆie poate fi påstratå pe diferite medii de memorare, în diferiteformate, sub formå de date. Între datele prelucrate de un program existå diferite relaÆii.Modul în care vor fi aranjate aceste date în mediul de memorare depinde de legåturadintre ele.

1. Baza de datePrincipalele probleme pe care le implicå înså o colecÆie de date formatå dintr-un ansam-blu de fiçiere de date sunt:

RedundanÆa datelor. RedundanÆa reprezintå o proprietate a unei colecÆii de date çise referå la faptul cå unele componente ale colecÆiei sunt memorate de mai multeori pe suportul de memorare. Date care reprezintå aceeaçi informaÆie pot så aparåîn fiçiere de date diferite, de multe ori cu formate de reprezentare diferite. Folosindmai multe copii ale aceloraçi date se consumå inutil suport de memorare. Pe lângåacest dezavantaj, mai existå çi alte dezavantaje: se consumå timpi suplimentari cuactualizarea datelor, deoarece se actualizeazå de mai multe ori acelaçi set de date(actualizarea se face în fiecare fiçier de date în care setul de date apare), actualizareadatelor în toate fiçierele de date este un proces dificil (fiecare posesor al unui fiçier dedate trebuie så fie informat de schimbårile survenite) çi nu pot fi controlate erorileapårute în procesul de actualizare a datelor.Actualizarea fiçierelor çi påstrarea integritåÆii datelor. Actualizarea datelor trebuieså se facå în toate fiçierele în care apar. Dacå se omite un singur fiçier, nu mai esteasiguratå integritatea datelor, iar rapoartele obÆinute cu aceste date vor conÆineinformaÆii greçite.DependenÆa programelor de fiçierele de date. Pentru exploatarea çi întreÆinereafiecårui fiçier de date, programatorii vor scrie câte un program. Orice modificare înstructura fiçierului de date va avea ca efect modificarea programului de aplicaÆie. Înplus, în loc så se scrie un singur program pentru o colecÆie de date unicå, se scriu maimulte programe, câte unul pentru fiecare colecÆie. Efectul este creçterea costurilorplåtite de cåtre organizaÆie pentru programele care trebuie så-i furnizeze informaÆiiledin fiçierele de date.

Ansamblurile independente de date erau folosite în general în folosul unui singur depar-tament al organizaÆiei çi mai puÆin în folosul întregii organizaÆii. SoluÆia care poate rezolvaaceastå problemå este reunirea datelor într-o colecÆie unicå numitå baza de date. Înacest mod, organizaÆia îçi poate exercita controlul asupra tuturor datelor.

Controlul se executå prin intermediul administratorului bazei de date (databaseadministrator - DBA) care este o poziÆie în cadrul administraÆiei (ocupatå de una sau maimulte persoane) ce are ca atribuÆie stabilirea datelor care sunt necesare în cadrulorganizaÆiei sau la nivelul fiecårui departament. Administratorul bazei de date mai poateså stabileascå çi modul în care se executå accesul la date, adicå så hotårascå pentrufiecare persoanå din organizaÆie setul de date din colecÆia de date la care are acces. Peparcursul exploatårii bazei de date, el poate så hotårascå modificarea structurii bazei dedate în funcÆie de noile cerinÆe ale utilizatorilor.

Page 4: SGBD Visual Foxpro

6 Informatică

Obiectul: realizarea bazei de date a unei companii.Analiza sistemului iniÆial, format din mai multe fiçiere de date

Fiecare departament al companiei çi-a creat çi întreÆinut propriul fiçier de date:Departamentul Resurse umane are fiçierul AngajaÆi în care sunt påstrate datedespre angajaÆii companiei: numele, codul numeric personal, adresa, numårul detelefon, data naçterii, data angajårii, studii, experienÆå, funcÆia çi departamentul în carelucreazå, istoricul posturilor ocupate, data fiecårei avansåri etc.Departamentul Salarizare are fiçierul Salarii în care sunt påstrate date despresalariile angajaÆilor companiei: numele çi prenumele salariatului, codul numericpersonal, adresa, funcÆia deÆinutå, treapta de salarizare, salariul tarifar, numårul deore lucrate, reÆineri lunare, salariul lunar etc.Departamentul RelaÆii cu clienÆii are fiçierele ClienÆi în care sunt påstrate date despreclienÆii companiei (numele companiei client, adresa, numele persoanei de contact,telefonul etc.) çi Comenzi în care sunt påstrate informaÆii despre comenzile clienÆilor(numårul comenzii, clientul care a emis comanda, conÆinutul comenzii, data comenzii etc.).Departamentul Aprovizionare are fiçierele Stocuri în care sunt påstrate date desprestocul de materiale çi materii prime necesare producÆiei (denumirea materialului,unitatea de måsurå, cantitatea etc.) çi Furnizori în care sunt påstrate date desprefurnizorii de materii prime çi materiale ale companiei (numele companiei furnizor,adresa, numele persoanei de contact, telefonul etc.).Departamentul Marketing are fiçierele Vânzåri în care sunt påstrate date despre vânzå-rile de produse ale companiei (denumirea produsului, unitatea de måsurå, cantitatea, datavânzårii, persoana care a intermediat vânzarea, date despre clientul care a cumpåratprodusul etc.) çi Catalog_produse care conÆine un catalog cu oferta de produse acompaniei (denumirea produsului, descrierea produsului, unitatea de måsurå, preÆul etc.).Departamentul ProducÆie are fiçierele Produse în care sunt påstrate date despreprodusele realizate: denumirea produsului, unitatea de måsurå, cantitatea, data lacare a fost realizat produsul etc.

Vânzåri

Resurseumane Salarizare

RelaÆii cuclienÆii

ProducÆieMarketing

Aprovizi-onare

AngajaÆiProduse

ClienÆi Comenzi

SalariiCatalogproduse

Stocuri

Furnizori

Page 5: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 7

Deoarece datele companiei se gåsesc în mai multe fiçiere de date independente, aparurmåtoarele dezavantaje:

1. Departamentele nu pot folosi în comun datele de care au nevoie. Între fiçierele cudate ale departamentelor nu existå posibilitatea de comunicare, iar departamentele nupot folosi în comun aceste date. De exemplu, dacå angajaÆii implicaÆi în vânzåri suntplåtiÆi în funcÆie de coeficientul vânzårilor lunare çi nu conform unui salariu tarifar,informaÆiile necesare calculårii drepturilor salariale ale acestor persoane se gåsesc înfiçierul Vânzåri. La acest fiçier nu are acces funcÆionarul din departamentul Salarizarecare are nevoie de ele pentru a calcula salariul lunar al angajaÆilor ce se ocupå cuvânzarea produselor. Aceasta înseamnå cå o persoanå din departamentul Marketingva extrage din fiçierul Vânzåri o listå cu angajaÆii implicaÆi în vânzåri în luna respectivåçi cu volumul valoric al vânzårilor fiecåruia dintre ei. La rândul såu, persoana dindepartamentul Salarizare va trebui så actualizeze fiçierul Salarii pe baza listei primite.

2. Ansamblul de fiçiere de date are o redundanÆå foarte mare. ColecÆia de fiçiere dedate are o redundanÆå mare deoarece foarte multe din date sunt duplicate, fiindmemorate în mai multe fiçiere de date. De exemplu, unele informaÆii despre angajaÆisunt memorate çi în fiçierul Salarii aflat în întreÆinerea compartimentului Salarizare,dar çi în fiçierul AngajaÆi aflat în întreÆinerea compartimentului Resurse umane sauunele informaÆii despre produsele realizate pot så aparå atât în fiçierul Produse aflatîn întreÆinerea compartimentului ProducÆie, cât çi în fiçierul Catalog_produse aflat înîntreÆinerea compartimentului Marketing.

3. Orice miçcare în cadrul companiei necesitå intervenÆia în mai multe fiçiere dedate. De exemplu, datele despre un client pot så aparå atât în fiçierul ClienÆi, cât çi înfiçierul Vânzåri. Dacå un client îçi schimbå adresa, modificarea trebuie fåcutå în ambelefiçiere. Deci, o persoanå din cadrul companiei trebuie så aibå grijå så informeze celedouå persoane care se ocupå de actualizarea celor douå fiçiere din cele douådepartamente ca så facå aceste modificåri. Aceasta înseamnå cå la nivelul companieiar trebui så existe o persoanå care så aibå cunoçtinÆe despre toate aceste fiçiere dedate, de structura lor çi de toate schimbårile care apar în cadrul companiei çi care potafecta aceste date. Aceastå persoanå ar trebui så informeze, atunci când este cazul,departamentele care trebuie så-çi actualizeze datele, ce date trebuie så actualizeze çicu ce valori, altfel nu ar mai putea fi asiguratå integritatea datelor. DeficienÆe pot såaparå chiar dacå aceastå persoanå informeazå corect departamentele. Persoana careface modificåri într-un fiçier de date poate så scrie greçit o valoare, astfel încât la nivelulcompaniei, aceeaçi datå va avea valori diferite, în fiçiere diferite.

SoluÆia este reunirea acestor fiçiere de date într-o singurå colecÆie de date: baza dedate. În aceastå colecÆie pot fi eliminate datele duplicate (de exemplu informaÆiile des-preun client care apar çi în fiçierul ClienÆi çi în fiçierul Vânzåri çi în fiçierul Comenzi),micçorându-se foarte mult redundanÆa datelor. Deoarece datele se vor gåsi o singurådatå, în aceeaçi colecÆie, actualizarea lor se poate face mult mai uçor, asigurându-seastfel integritatea datelor. În plus, angajaÆii unui departament pot avea acces çi la dateleproduse de un alt departament.

Principala problemå care apare în acest caz este ca angajaÆii unui departament så aibåacces numai la datele care le sunt strict necesare çi nu la toate datele companiei. Deexemplu, persoana care se ocupå de corespondenÆå trebuie så aibå acces numai la

Page 6: SGBD Visual Foxpro

8 Informatică

adresele angajaÆilor, ale clienÆilor çi ale furnizorilor pentru a putea expedia cores-pondenÆa, nu çi la alte date despre aceçtia: salariile angajaÆilor, conturile bancare aleclienÆilor, facturile emise cåtre clienÆi çi alte tranzacÆii financiare fåcute de companie.

Açadar, principalul avantaj al bazelor de date îl reprezintå partajarea datelor uneiorganizaÆii între membrii ei, iar principalul dezavantaj este necesitatea controlårii

accesului la datele importante din colecÆie.

TTest pentru evaluare:

IdentificaÆi în colecÆia de fiçiere de date a companiei datele redundante. IdentificaÆi înaceeaçi colecÆie datele care sunt necesare mai multor departamente. Presupunând cådatele companiei se organizeazå într-o colecÆie unicå, daÆi exemple de date la caretrebuie controlat accesul angajaÆilor companiei.

TTest pentru evaluare:

ConsideraÆi cå çcoala voastrå este o organizaÆie formatå din mai multe compartimente.AnalizaÆi activitatea din çcoala voastrå çi puneÆi în evidenÆå fiçierele de date care pot fifolosite pentru a Æine evidenÆa activitåÆilor care au loc la nivelul çcolii çi la nivelul fiecåreiclase. AråtaÆi care sunt deficienÆele acestei colecÆii defiçiere de date.

1.1. Definirea bazei de dateDin punct de vedere al serviciilor pe care le oferå, baza de date este o colecÆie de datecare poate descrie întreaga activitate a unei organizaÆii çi care furnizeazå acces la diferiteinformaÆii, prezentate în diferite formate.

Din punct de vedere al organizårii datelor sub forma unei structuri de date pe mediul dememorare, ea este forma optimå de organizare a datelor. Se poate spune cå:

Pentru a permite accesul diferenÆiat la datele din colecÆia de date, se poate defini oschemå generalå a bazei de date care descrie întreaga colecÆie de date çi diferitescheme parÆiale care descriu seturile de date din colecÆie la care pot avea acces anumiÆiutilizatori sau anumite grupuri de utilizatori.

Açadar, avantajele folosirii bazelor de date în locul fiçierelor de date sunt:Partajarea informaÆiilor. Spre deosebire de datele din fiçierele de date la care auacces numai utilizatorii care le-au creat çi le întreÆin, la datele din baza de date potavea acces toÆi membrii unei organizaÆii, care îçi vor partaja datele din baza de date.Pot fi create aplicaÆii noi care så foloseascå datele din mai multe colecÆii de date çicare så furnizeze informaÆii noi folosind tot ansamblul de date. În acest mod, fiecareutilizator are senzaÆia cå este beneficiarul unic al colecÆiei de date.

Baza de date (database) este o colecÆie de fiçiere çi înregistråri legate între ele.

Page 7: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 9

Creçterea cantitåÆii de informaÆii disponibile unui utilizator. Deoarece dateleproduse de un compartiment al organizaÆiei pot fi folosite de toÆi membrii organizaÆieiçi nu numai de membrii compartimentului respectiv, creçte cantitatea de informaÆii lacare au acces membrii organizaÆiei, chiar dacå se vor impune unele restricÆii de accespentru unele grupuri de membri. Gruparea datelor într-o colecÆie unicå de date faceposibil ca utilizatorul så poatå obÆine toate datele legate logic de o datå elementaråde care el are nevoie pentru a-çi desfåçura activitatea în cadrul companiei.Micçorarea redundanÆei datelor. Membrii organizaÆiei vor avea acces la aceeaçi co-lecÆie de date în loc så-çi creeze fiecare propria colecÆie de date, care înseamnå defapt existenÆa aceloraçi date în mai multe colecÆii (multiplicarea unor seturi de date).Råmân multiplicate numai acele date care trebuie så asigure coerenÆa bazei de date.Prin eliminarea datelor multiplicate se micçoreazå çi spaÆiul de memorie externå alo-cat pentru colecÆia de date çi timpul de actualizare a colecÆiei de date deoarece o datåva fi actualizatå o singurå datå, în cadrul colecÆiei, çi nu de mai multe ori, în fiecarefiçier de date în care apare.ConsistenÆa datelor. Actualizarea datelor din baza de date este perceputå de fiecareutilizator al bazei de date, nu numai de utilizatorii din compartimentul care gestioneazåacele date. Deoarece nu mai existå mai multe copii ale aceloraçi date, se eliminåsituaÆiile în care pot så aparå valori diferite pentru aceeaçi datå.Integritatea datelor. Un alt efect al eliminårii redundanÆei datelor este integritatea date-lor, deoarece datele vor fi actualizate într-un singur loc (în baza de date) çi nu în fiecarecolecÆie de date (în fiçierele de date). În plus, pot fi adåugate diferite proceduri pentruvalidarea datelor introduse sau actualizate. Astfel, nu mai existå riscul så aparå necon-cordanÆe între datele care corespund aceloraçi informaÆii, dar care aparÆin la colecÆii dife-rite de date, sau riscul ca datele så fie incorecte (så nu aparÆinå domeniului de definiÆie).Securitatea datelor. Se poate asigura mult mai uçor pentru o singurå colecÆie de date(baza de date) decât pentru mai multe colecÆii de date (fiçierele de date). Astfel, numaiutilizatorii autorizaÆi vor avea acces la un anumit set de date din colecÆia de date.Controlul centralizat al datelor. Prin stabilirea unui administrator al bazei de datese poate asigura controlul tuturor datelor din colecÆia de date (baza de date), decât încazul colecÆiilor de date independente (fiçierele de date) unde fiecare utilizator îçiexercitå controlul la nivelul propriei colecÆii de date.TransparenÆa. Utilizatorul poate obÆine informaÆii din baza de date fårå så cunoascåtoatå organizarea ei complexå.Dezvoltarea standardelor. Se pot dezvolta standarde referitoare la bazele de date atâtla nivelul organizårii logice a datelor, cât çi la nivelul limbajelor pentru manipularea çiinterogarea datelor, standarde care så permitå transferul datelor dintr-o bazå de date înalta. Cererea de date se poate face prin intermediul unui limbaj simplu, prin precizareacriteriului de selectare a datelor çi a modului de prezentare a informaÆiilor.IndependenÆa datelor. Se asigurå douå tipuri de independenÆå a datelor: independenÆafizicå çi independenÆa logicå. IndependenÆa fizicå înseamnå independenÆa datelor faÆåde programele de aplicaÆie, adicå orice modificare a structurii datelor nu afecteazå pro-gramul de aplicaÆie çi reciproc, orice modificare a programului de aplicaÆie nu afecteazåstructura de date. IndependenÆa logicå înseamnå independenÆa fiecårei schemeparticulare a unui utilizator faÆå de schema generalå, adicå pot fi definite noi câmpuri çipot fi adåugate noi înregistråri în baza de date fårå så fie afectaÆi utilizatorii care nu au

Page 8: SGBD Visual Foxpro

10 Informatică

nevoie de ele. În plus, baza de date poate fi reorganizatå (pot fi regrupate câmpurile dinînregistråri) pentru a face faÆå cerinÆelor unui nou utilizator, fårå a fi afectaÆi vechii utili-zatori. Eliminarea unor entitåÆi din baza de date poate afecta înså utilizatorii care facreferiri la acele entitåÆi.

1.2. Stratificarea bazei de dateDin punct de vedere conceptual, sistemul care foloseçte baza de date este organizat pemai multe straturi:

stratul utilizator al bazei de date,stratul software de aplicaÆii,stratul sistem de gestiune a bazelor de date,stratul baza de date propriu-ziså.

Utilizatorul bazei de date

Este o persoanå care este membru al organizaÆiei çi are dreptul så foloseascå baza dedate pentru a obÆine informaÆii. El poate fi çi o persoanå exterioarå organizaÆiei, cåreiaorganizaÆia i-a permis accesul la anumite informaÆii. De obicei nu este specialist în infor-maticå çi nu cunoaçte tehnicile folosite în exploatarea bazelor de date. InformaÆiile îi suntfurnizate în termenii aplicaÆiei çi nu în termenii tehnici folosiÆi în bazele de date.

Software-ul de aplicaÆie

Prezintå imaginea datelor într-o formå accesibilå utilizatorului çi permite personalizareasistemului de gestiune a bazelor de date folosit. Rolul såu este de a prezenta informaÆiaîn mod interactiv, în termeni specifici aplicaÆiei, prin intermediul unei interfeÆe. Nu arerolul de a gestiona datele. AplicaÆia poate comunica cu utilizatorul fie printr-un sistem deîntrebåri çi råspunsuri, fie prin intermediul unor formulare completate de cåtre utilizator.Software-ul de aplicaÆie poate fi conceput fie de programatori, în cazul bazelor de datemari, distribuite pe mai multe calculatoare ale organizaÆiei, fie chiar de unii utilizatori aibazei de date, în cazul bazelor de date mici, organizate pe microcalculatoare.

Bazå de date

Sistem de gestiunea bazelor de date

Software de aplicaÆii

Utilizator

Page 9: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 11

Sistemul de gestiune a bazelor de date

Pentru gestionarea datelor din baza de date trebuie så folosiÆi un Sistem de Gestiune aBazelor de Date (SGBD).

Este un instrument software specializat în gestionarea datelor din baza de date:crearea structurii de date, manipularea datelor în cadrul structurii çi regåsirea datelor învederea extragerii informaÆiilor. El asigurå interfaÆa cu sistemul de operare în scopul sim-plificårii procesului de acces la datele fizice de pe suportul de memorare. În general,sistemele de gestiune a bazelor de date au implementate limbaje gazdå care permit atâtdescrierea algoritmului rezolvårii problemei folosind structurile de control din limbajele deprogramare clasice, cât çi comenzi specializate în manipularea datelor din baza de date,specifice numai sistemului de gestiune a bazelor de date.

Principalele facilitåÆi oferite de un sistem de gestiune a bazelor de date pentru crearea çiexploatarea bazelor de date sunt:

Facilitatea de descriere a datelor - asiguratå de limbajul de descriere a datelor(Data Description Language). Prin aceastå facilitate se realizeazå legåtura între sistemulde gestiune a bazelor de date çi baza de date. Acest limbaj permite descrierea mode-lului bazei de date (schema bazei de date) çi a restricÆiilor aplicate colecÆiei de date.Facilitatea de manipulare a datelor - asiguratå de limbajul de manipulare a datelor(Data Manipulation Language). Prin aceastå facilitate se realizeazå legåtura între sis-temul de gestiune a bazelor de date çi utilizator. Acest limbaj este o colecÆie de comenzicare permit executarea operaÆiilor obiçnuite de exploatare çi întreÆinere a bazei de date:cererile de acces la date çi actualizarea lor (adåugare, çtergere, modificare).

Prin separarea programului de aplicaÆie de sistemul de gestiune a bazelor de date seobÆin mai multe avantaje:

Utilizatorul poate lucra cu baza de date prin intermediul interfeÆei create de programulde aplicaÆie care presupune cunoçtinÆe numai despre aplicaÆie çi nu çi despre sistemulde gestiune a bazelor de date, care prezentând datele în termeni specifici modului încare a fost conceputå baza de date, obligå utilizatorul så aibå cunoçtinÆe tehnice,legate de acest gen de software.Deoarece se folosesc douå tipuri de software - unul pentru interfaÆå çi unul pentrugestionarea datelor - se creeazå independenÆa datelor, adicå modificarea structuriidatelor nu implicå modificarea programelor de aplicaÆii.Se asigurå controlul accesului la baza de date. Cel care va stabili setul de date la careare acces un utilizator este sistemul de gestiune a bazelor de date. Programul deaplicaÆie nu are decât rolul de a-i comunica parola introduså de utilizator care îi då aces-tuia anumite drepturi de acces la date. Sistemul de gestiune a bazelor de date va folosiîn interior schema generalå pentru a manipula çi a întreÆine datele din baza de date çi vafolosi în exterior schema parÆialå atribuitå unui utilizator conform parolei, pentru a-lîmpiedica pe acesta så obÆinå informaÆii din seturile de date la care nu are acces.

Sistemul de gestiune a bazelor de date (database management) este unsoftware specializat pentru crearea, întreÆinerea çi consultarea bazelor de date.

Page 10: SGBD Visual Foxpro

12 Informatică

Programele de aplicaÆii sunt uçor de scris deoarece ele descriu datele folosindmodelul conceptual al bazei de date (numele entitåÆilor care formeazå baza de date)çi nu structura fizicå a datelor înregistrate pe suportul de memorare.

Sistemul de gestiune a bazelor de date furnizeazå instrumentele necesare pentrumanipularea datelor, dintre care cele mai importante sunt:

cåutarea uneia sau a mai multor entitåÆi care îndeplinesc anumite criterii,sortarea în diferite moduri a diferitelor entitåÆi din baza de date,generarea unor raporte folosind datele stocate în baza de date,generarea unor formulare pentru introducerea çi validarea datelor.

Baza de date

Reprezintå un model de organizare a datelor oferit de sistemul de gestiune a bazelor dedate folosit. În cazul fiçierelor de date existå douå niveluri de organizare a datelor: nivelullogic care constå în descrierea structurii de câmpuri de cåtre programator çi nivelul fiziccare constå în metodele de înregistrare çi regåsire a datelor la nivelul suportului de date. Încazul bazelor de date, pentru asigurarea independenÆei datelor, organizarea trebuie så sefacå pe cel puÆin trei niveluri:

Nivelul intern sau baza de date fizicå este reprezentat de colecÆia de fiçiere înregis-trate pe suportul de memorare, fiçiere care conÆin datele propriu-zise dar çi informaÆiilesuplimentare, necesare accesului la datele din baza de date.Nivelul conceptual reprezintå descrierea unitåÆilor logice din care este formatå bazade date çi a legåturilor dintre ele. Tot în modelul conceptual sunt specificate constrân-gerile aplicate asupra datelor, care determinå restricÆii ale operaÆiilor de actualizare.Ele sunt necesare pentru a asigura integritatea datelor.Nivelul extern reprezintå modelul extern cu care opereazå utilizatorul bazei de date.Acesta este format din unitåÆile logice de la nivelul conceptual cu care opereazå unutilizator sau un grup de utilizatori. Pentru modelul extern se mai foloseçte çi termenulde vizualizare (view) sau tabel virtual, deoarece se defineçte pe baza unei expresii

Nivelul extern(modelul extern)

vizualizårile

Nivelulconceptual

(modelulconceptual)

descrierea bazeide date

Nivelul intern(modelul intern)

baza de datefizicå

Sistemul e gestiune abazelor de date

Calculator

Utilizatori

Page 11: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 13

relaÆionale aplicate câmpurilor din tabelele reale ale bazei de date. Vizualizareapåstreazå numai schema prin care este definitå, nu çi datele propriu-zise, pe care lepreia din tabelele reale de fiecare datå când este folositå. Cea mai importantå utilitatea unei vizualizåri este aceea cå prin intermediul ei se poate controla accesul unui grupde utilizatori la baza de date. Deoarece utilizatorul are acces la baza de date nu prinmodelul conceptual, ci prin vizualizåri, acestea pot så ascundå unui utilizator aceleunitåÆi logice la care nu are drept de acces. Vizualizårile pot så controleze çi operaÆiilepe care le poate executa cu unitåÆile logice: unele vizualizåri îi permit så actualizezeunele unitåÆi logice, altele îi permit numai så le consulte. De exemplu, dacå seconstruieçte o bazå de date a companiei, în tabelul AngajaÆi este înregistratå datanaçterii pentru fiecare angajat. Dacå o anumitå categorie de utilizatori (de exemplupersonalul din compartimentul Resurse Umane) doreçte o listå cu angajaÆii dintr-uncompartiment çi vârsta lor, nu se recomandå înregistrarea vârstei ca unitate logicå înmodelul conceptual deoarece ar trebui actualizatå zi de zi. Cel mai simplu este så secreeze o vizualizare pentru aceastå categorie de utilizatori în care se defineçteentitatea vârstå. Aceastå entitate se calculeazå ca diferenÆå dintre data curentåfurnizatå de sistem çi data naçterii înregistratå într-unul din tabelele bazei de date.

TTest pentru evaluare:

În baza de date aveÆi un tabel cu notele elevilor, care are urmåtoarele câmpuri: codul ele-vului, disciplina, data notårii, nota. Pentru a afla mediile semestriale ale elevilor dintr-oclaså la fiecare disciplinå, ce soluÆie se poate alege: så se creeze un tabel cu mediileelevilor (care så aibå urmåtoarea structurå: codul elevului, codul disciplinei, media) sauså se creeze o vizualizare cu aceeaçi structurå?

Modelul de date oferå instrumentele necesare interpretårii datelor din colecÆia de date.El este format din douå componente:

un set de reguli pentru organizarea çi structurarea datelor,un set de reguli care definesc operaÆiile pentru manipularea datelor.

Se pot folosi mai multe modele pentru organizarea bazelor de date.

1.3. Clasificarea bazelor de dateScopul bazelor de date este de a integra date individuale, pe care le transformå din fapteizolate în informaÆii utile. Dacå fiçierele de date pot fi organizate în mai multe moduriastfel încât så permitå accesul secvenÆial sau direct la informaÆii, în funcÆie de necesitåÆileutilizatorilor, çi bazele de date pot fi organizate în mai multe moduri, astfel încât så îi fiecât mai utile utilizatorului. Açadar, baza de date fiind o colecÆie de entitåÆi (câmpuri çiînregistråri), organizarea acestor entitåÆi se poate face în mai multe moduri astfel încâtstructura de date så råspundå cât mai bine necesitåÆilor utilizatorului. Cele mai råspânditemodele de organizare a bazelor de date sunt urmåtoarele:

ierarhice,reÆea,relaÆionale.

Page 12: SGBD Visual Foxpro

14 Informatică

Baze de date ierarhice (hierarchical database). În acest model de organizare a bazelorde date entitåÆile (câmpurile çi înregistrårile) sunt structurate sub formå de noduri.Nodurile sunt puncte care conecteazå ramurile unui arbore descendent. Un nod de penivelul inferior este subordonat unui singur nod din nivelul ierarhic imediat superior, darpoate fi în relaÆie cu n noduri aflate la nivelul inferior. Altfel spus fiecare entitate are unsingur nod pårinte (parent node), dar un pårinte poate avea mai multe noduri copil(child nodes). Pentru a gåsi un anumit câmp trebuie så se porneascå cu nodul pårinte depe primul nivel çi så se coboare pe arbore pânå la copilul care conÆine acel câmp.

Un exemplu de organizare ierarhicå este baza de date pentru sistemul de rezervåri laliniile aeriene, structuratå pe 4 niveluri. Nodul pårinte de pe primul nivel este oraçul deplecare Bucureçti. Acest pårinte are patru copii: Cluj, ConstanÆa, Iaçi çi Timiçoara, carereprezintå oraçele de sosire. Nodul Timiçoara are la rândul såu doi copii: 210 çi 211 carereprezintå numårul zborurilor. Zborul 210 are la rândul såu trei copii, pasagerii.

Într-un astfel de tip de organizare apar urmåtoarele probleme:Dacå se çterge un nod pårinte, se çterg toate nodurile copil subordonate.Un nod copil poate fi adåugat numai dacå au fost adåugate mai întâi nodurile pårinte.Între nodurile copii nu pot fi stabilite relaÆii.

Baze de date reÆea (network database). Çi în acest caz existå o aranjare ierarhizatå anodurilor, cu deosebirea cå un nod copil poate så aibå mai multe noduri pårinÆi. Întrenodurile pårinte çi nodurile copil se adaugå conexiuni adiÆionale numite pointere. Aceastaînseamnå cå unui nod i se poate adåuga o cale nouå çi cå pot fi trasate în jos ramuri noi.În aceastå organizare, fiecare entitate poate avea un numår nelimitat de conexiuni,dispårând noÆiunea de entitate ierarhic superioarå.

Un exemplu de astfel de organizare este baza de date a produselor care se executå într-ofabricå. Fiecare produs este format din mai multe ansambluri, iar fiecare ansamblu esteformat din mai multe piese. Fiecare pieså poate intra în componenÆa mai multor ansam-

produse Produsul 1 Produsul 2 Produsul 3

ansambluri Ansamblul 1 Ansamblul 2 Ansamblul 3

piese Piesa 1 Piesa 2 Piesa 3 Piesa 4 Piesa 5

Cluj ConstanÆa Iaçi

Ionescu Alexandru Cålin Mircea Andronescu Ana

210 211

Timiçoara

Bucureçtiplecare

sosire

numår zbor

pasager

Page 13: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 15

bluri, iar fiecare ansamblu poate intra în componenÆa mai multor produse. În acestexemplu se poate observa cå organizarea de tip reÆea este mai flexibilå çi în multe cazurimai eficientå decât cea ierarhicå.

Baze de date relaÆionale (relational database). Cel mai flexibil model de organizare îlreprezintå bazele de date relaÆionale, în care nu existå o cale de acces ierarhizatå la oanumitå datå. Baza de date este formatå din mai multe tabele, fiecare dintre ele fiindformat din linii çi coloane. Un tabel este numit o relaÆie.

Så construim o bazå de date a çcolii. Så consideråm tabelul elevi care conÆine date despreelevii çcolii: identificatorul elevului, numele, prenumele, data naçterii, numårul de telefon çiadresa. Un alt tabel, absenÆe, conÆine date despre absenÆele elevilor din toatå çcoala:identificatorul elevului, data absenÆei, identificatorul disciplinei çi identificatorul profesorului.Aceste douå tabele sunt legate printr-un câmp comun numit câmp cheie. În acest caz,câmpul cheie este identificatorul elevului. Aceasta înseamnå cå între tabelul elevi çi tabelulabsenÆe s-a stabilit o relaÆie prin intermediul unui câmp cheie care conÆine o informaÆiecomunå ambelor tabele çi anume identificatorul elevului. În tabelul profesori se påstreazådate despre profesorii din çcoalå: nume, prenume, discipline la care predau, grad didactic,adreså, numår telefon etc. Tabelul profesori se leagå de tabelul absenÆe prin câmpul cheieidentificatorul profesorului. În tabelul discipline se påstreazå date despre disciplinele predateîn çcoalå: nume, profilul clasei çi anul de studiu, numårul de ore etc. Tabelul discipline seleagå de tabelul absenÆe prin câmpul cheie identificatorul disciplinei. Aceste patru tabeleformeazå împreunå o bazå de date relaÆionalå (relational database). Baza de date a çcoliimai poate fi completatå çi cu alte tabele ca de exemplu, tabelul cu date despre pårinÆii elevilor(pårinÆi) care se va lega de tabelul elevi prin câmpul cheie identificatorul elevului, tabelul cudate despre notele elevilor (note) care se va lega de tabelul elevi prin câmpul cheieidentificatorul elevului, de tabelul profesori prin câmpul cheie identificatorul profesorului çi detabelul discipline prin câmpul cheie identificatorul disciplinei, tabelul cu date despre clase(clase) care conÆine date despre clasele din çcoalå (identificator claså, an de studiu,identificatorul profesorului diriginte) care se va lega de tabelul elevi prin câmpul cheieidentificatorul clasei, iar de tabelul profesori prin câmpul cheie identificatorul profesorului etc.

elevi absenÆeidentif. elev nume prenume ... adresa identif.

elevdatåabsenÆå

identif.disciplinå

identif.profesor

discipline profesoriidentif.disciplinå

nume ........... identif.profesor

nume .............

Page 14: SGBD Visual Foxpro

16 Informatică

Fiecare rând din tabel în care se gåsesc informaÆii despre un elev corespunde uneiînregistråri de date. Fiecare coloanå cu informaÆii corespunde unui câmp (de exemplu,coloana adreså). Capul de tabel (antetul tabelului) defineçte structura tabelului çi se mainumeçte çi înregistrare de structurå. Datele sunt înregistrate în baza de date prinintermediul structurii definite în înregistrarea de structurå. La crearea unui tabel trebuiedefinitå mai întâi structura tabelului (capul de tabel), adicå trebuie precizate câmpurilecare o compun, cât çi caracteristicile acestora.

2. Bazele de date relaţionale

Tabelul permite gruparea unor date înrudite çi poate fi privit ca o colecÆie de câmpuri.Pentru fiecare câmp sunt descrise datele care vor fi memorate în el. Descrierea se faceprin tipul datelor, dimensiunea lor çi alte proprietåÆi. Ele definesc implicit domeniul dedefiniÆie al datelor memorate în câmp. Dacå domeniul datelor este inclus în domeniulimplicit de definiÆie, se pot defini condiÆii de validare a datelor care så controlezecorectitudinea datelor introduse sau modificate. De exemplu, datele dintr-un câmp suntnumere întregi cuprinse între 1.000 çi 30.000. Se va alege tipul întreg, ca domeniu implicital datelor, dar se vor preciza condiÆii de validare suplimentare care så oblige utilizatorulså introducå în acest câmp numai date întregi pozitive din domeniul 1.000 ÷ 30.000.

Antetul tabelului (capul de tabel) poate fi privit ca o descriere a structurii tabelului:ansamblul de câmpuri çi descrierea lor. În teoria bazelor de date relaÆionale tabelele semai numesc çi relaÆii, fiecare coloanå din tabel care corespunde unui câmp se mainumeçte çi atributul relaÆiei, iar fiecare rând din tabel care conÆine câte o valoare pentrufiecare câmp se mai numeçte çi tuplu. Tuplul corespunde înregistrårii din fiçierul dedate. Într-un tabel al unei baze de date relaÆionale nu pot exista înregistråri identice.

Tabelele bazei de date sunt organizate apoi într-o structurå arborescentå determinatå derelaÆia dintre tabele.

Schema generalå a unei baze de date relaÆionale este formatå din ansamblultabelelor çi al legåturilor dintre ele.

Putem stabili urmåtoarea analogie între un fiçier de date çi o bazå de date:

Fiçierul de date Baza de dateColecÆia de date = fiçier de date ColecÆia de date = colecÆie de relaÆii

Fiçier de date (tabel) RelaÆieÎnregistrare Tuplu

Câmp Atribut

Deoarece interfeÆele puse la dispoziÆie de sistemele de gestiune a bazelor de date rela-Æionale folosesc în general termenii de tabel (table), câmp (field) çi înregistrare (record),vom folosi în continuare aceçti termeni pentru a defini obiectele corespunzåtoare alebazei de date.

Baza de date relaÆionalå este formatå dintr-unul sau mai multe tabelebidimensionale între care se pot stabili legåturi.

Page 15: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 17

Procesul de construire a unei baze de date se desfåçoarå în douå etape:1. Construirea tabelelor care compun baza de date. Aceasta înseamnå cå pentru

fiecare tabel din baza de date trebuie definitå structura, adicå ansamblul de câmpuriîmpreunå cu proprietåÆile lor. Dupå definirea structurii începe încårcarea datelor întabel. La nivelul tabelului entitatea prelucratå este înregistrarea: se pot adåugaînregistråri, se pot çterge înregistråri, se pot modifica înregistråri. Se poate modificastructura unui tabel chiar dupå ce a fost încårcat cu date. Sistemul de gestiune abazelor de date nu opereazå modificarea de structurå direct în tabel, ci executåurmåtoarele operaÆii: creeazå noua structurå de tabel (rezultatå în urma modificårilorcerute), încarcå în noul tabel datele din vechiul tabel çi çterge vechiul tabel. Toateaceste operaÆii sunt executate automat de cåtre sistem, fårå intervenÆia utilizatoruluiçi fårå a fi vizibile pentru utilizator.

2. Stabilirea relaÆiilor între tabele. RelaÆiile care se vor stabili între tabele sunt unidi-recÆionale, adicå între douå tabele nu se stabileçte o relaÆie de egalitate ci o relaÆiede subordonare: unul dintre tabele este tabelul conducåtor sau principal (tabelul dela care porneçte legåtura), iar celålalt este tabelul condus sau secundar (tabelul lacare ajunge legåtura). Tabelul condus este subordonat tabelului conducåtor. Aceastaînseamnå cå dacå utilizatorul selecteazå o înregistrare în tabelul conducåtor, sistemulva selecta automat înregistrarea de care este legatå din tabelul condus.

De obicei, modelul relaÆional cel mai des întâlnit este cel descris printr-un arbore cu osingurå rådåcinå, adicå în baza de date existå un singur tabel conducåtor care reprezintårådåcina arborelui. Celelalte tabele sunt legate de tabelul conducåtor direct sau indirect(prin intermediul altor tabele).

Tabelele

Coloane = Câmpuri

Rânduri = ÎnregistråriRelaÆii între tabele

Baza de date relaÆionalå

Page 16: SGBD Visual Foxpro

18 Informatică

Pentru a putea stabili legåturi între tabele, se definesc în tabele chei de identificare.Cheia de identificare este formatå din numårul minim de câmpuri alese astfel încâtansamblul lor de valori så fie unic în cadrul unui tabel pentru a permite identificareaînregistrårilor din tabel. Açadar, fiecare înregistrare va putea fi identificatå în mod unicprin valorile cheii astfel definite. Este posibil ca într-un tabel så poatå fi evidenÆiate maimulte grupuri de câmpuri care så permitå identificarea în mod unic a înregistrårilortabelului, deci pot fi definite mai multe chei de identificare. Deoarece un tabel nu poateavea douå înregistråri identice, orice tabel poate avea cel puÆin o cheie deidentificare, formatå în cel mai råu caz din toate câmpurile înregistrårii.Cheia primarå este aleaså din mulÆimea cheilor de identificare pe baza anumitor criteriiçi este folositå pentru a face legåtura între înregistrårile mai multor tabele ale bazei dedate. Cheia primarå va fi folositå de sistemul de gestiune a bazelor de date pentru aidentifica unic înregistrårile în procesul de cåutare çi regåsire a datelor. Se recomandå cadin mulÆimea cheilor de identificare så se aleagå, pentru cheia primarå, cheia care esteformatå din cele mai puÆine câmpuri.Cheia secundarå este formatå dintr-unul sau mai multe câmpuri dintr-un tabel, care suntfolosite ca o cheie primarå în alt tabel, valorile câmpurilor din cheie fiind identice înambele tabele. Se mai numeçte çi cheie stråinå.

Legåtura dintre tabelele bazei de date se realizeazå prin mecanismul de propagare acheilor. În tabelul surså, tabelul de la care începe propagarea cheii (tabelul conducåtor),se gåseçte cheia primarå, iar în tabelul destinaÆie, tabelul pânå la care se propagå cheia(tabel condus), se gåseçte cheia secundarå. Se spune cå a avut loc propagarea cheii dintabelul surså în tabelul destinaÆie. Acest mecanism permite stabilirea legåturii între oînregistrare din tabelul surså çi o înregistrare din tabelul destinaÆie. CondiÆia care trebuierespectatå pentru a putea fi asiguratå aceastå legåturå se numeçte condiÆia deintegritate referenÆialå.

Tabelul conducåtorÎnregistrarea 1Înregistrarea 2Înregistrarea 3Înregistrarea 4Înregistrarea 5Înregistrarea 6

Tabelul condusÎnregistrarea 1Înregistrarea 2Înregistrarea 3Înregistrarea 4Înregistrarea 5Înregistrarea 6

Definirea unei relaÆii între cele douåtabele are ca efect stabilirea unor

legåturi între înregistrårile celor douåtabele.

Înregistrarea esteselectatå printr-o

comandå a utilizatorului.Înregistrarea este

selectatå automat desistem.

Page 17: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 19

Integritatea referenÆialåEste specificå relaÆiilor dintre tabelele bazei de date. Ea înseamnå o colecÆie de reguli çirestricÆii impuse tabelelor între care s-au stabilit relaÆii. Astfel, a asigura integritateareferenÆialå înseamnå ca atunci când se fac modificåri ale valorii unui câmp dintr-untabel så nu fie afectatå relaÆia dintre tabele. Aceastå problemå apare în cazulcâmpurilor care fac parte dintr-o cheie primarå sau secundarå. Ele trebuie så respectecondiÆia de integritate referenÆialå.

Integritatea referenÆialå trebuie så fie satisfåcutå permanent în baza de date.

OperaÆiile de adåugare, çtergere çi modificare pot afecta integritatea referenÆialå:

În tabelul condus:OperaÆia de adåugare a unei înregistråri trebuie så se facå numai dacå valorile dincâmpurile secundare se gåsesc în mulÆimea valorilor cheilor primare din care s-aupropagat.OperaÆia de çtergere a unei înregistråri se poate face fårå så fie afectatå integritateareferenÆialå.OperaÆia de modificare a valorii unui câmp dintr-o înregistrare trebuie så aibå învedere faptul cå dacå acel câmp este un câmp secundar, valoarea sa trebuie så segåseascå în mulÆimea valorilor cheii primare din care s-a propagat.

În tabelul conducåtor:OperaÆia de adåugare a unei înregistråri se poate face fårå så fie afectatå integritateareferenÆialå.OperaÆia de çtergere a unei înregistråri poate så afecteze relaÆiile dintre tabele numaiîn cazul în care existå chei secundare care au aceeaçi valoare cu a cheii primare dinînregistrarea çtearså. În acest caz se pot folosi douå metode: çtergerearestricÆionatå (nu se acceptå çtergerea înregistrårii dacå existå cel puÆin o cheiesecundarå într-unul din tabelele bazei de date, propagatå din cheia primarå care areaceeaçi valoare cu cheia primarå din înregistrarea pe care vreÆi så o çtergeÆi) sauçtergerea în cascadå (çtergerea înregistrårii va avea ca efect çtergerea din toatetabelele a înregistrårilor care conÆin chei secundare propagate din cheia primarå çicare au aceeaçi valoare cu cheia primarå din înregistrarea çtearså).OperaÆia de modificare a unei înregistråri poate så afecteze relaÆiile dintre tabelenumai în cazul în care existå chei secundare care au aceeaçi valoare cu a cheiiprimare care se modificå. Çi în acest caz se pot folosi douå metode: modificarearestricÆionatå (nu se acceptå modificarea unui câmp dacå el este cheie primarå çiexistå cel puÆin o cheie secundarå într-unul din tabelele bazei de date propagatå dincheia primarå care are aceeaçi valoare cu cheia primarå pe care vreÆi så o modificaÆi)sau modificarea în cascadå (modificarea cheii primare va avea ca efect modificareatuturor cheilor secundare propagate din aceasta, din toate tabelele, care au aceeaçivaloare cu cheia primarå care se modificå).

CondiÆia de integritate referenÆialå impune ca mulÆimea valorilor unei cheisecundare så fie incluså în mulÆimea valorilor cheii primare din care s-a propagat.

Page 18: SGBD Visual Foxpro

20 Informatică

Obiectul: analiza integritåÆii referenÆiale în cazul bazei de date a unei çcoli.

Analiza se va face pe baza de date relaÆionalå ÇcoalaÎn baza de date Çcoala, legåtura între tabelul Elevi çi tabelul Note, respectiv un tabelMedii, se face prin intermediul câmpului cod_elev, care este cheie primarå în tabelul Eleviçi cheie secundarå în tabelul Note, respectiv tabelul Medii. Açadar, câmpul cod_elev s-apropagat în tabelul Note, respectiv în tabelul Medii, unde a devenit cheie secundarå.Scopul propagårii a fost de a asigura legåtura cu aceste tabele.

Så presupunem cå în tabelul Elevi, care conÆine date generale despre elevi, se çtergeînregistrarea corespunzåtoare unui elev deoarece acesta s-a transferat la o altå çcoalå.În tabelul Note se påstreazå toate notele elevilor, iar în tabelul Medii toate mediileelevilor. Så presupunem cå trebuie extrase din baza de date una dintre urmåtoarelesituaÆii: lista cu toÆi elevii care au cel puÆin o notå de 10 la o anumitå disciplinå sau lista cutoÆi elevii corijenÆi pe primul semestru la cel puÆin o disciplinå. Så mai presupunem cåelevul care s-a transferat se încadreazå într-una dintre aceste situaÆii. Cåutarea în bazade date a elevilor care corespund acestor situaÆii se face astfel: se cautå în tabelul Notetoate înregistrårile care pentru o anumitå valoare a codului disciplinei au valoarea 10pentru câmpul nota (de exemplu, cod_disciplina=02 and nota=10), respectiv se cautå întabelul Medii toate înregistrårile care au valoarea câmpului media mai micå decât 5(media<5). Pentru a se afiça numele elevului, se foloseçte ca legåturå cu tabelul Elevicâmpul cheie cod_elev. În baza de date Elevi, nu mai existå o înregistrare care så aibåaceeaçi valoare a cheii primare cu cheile secundare din tabelele Note çi Medii. Înseamnåcå nu a fost îndeplinitå condiÆia de integritate referenÆialå, deoarece o valoare acheii secundare nu se gåseçte în mulÆimea valorilor cheii primare. Efectul neres-pectårii acestei condiÆii este cå în tabelele Note çi Medii existå înregistråri pentru care s-arupt legåtura cu tabelul Elevi. Problema se complicå çi mai mult dacå în çcoalå se mutåun elev cåruia i se atribuie acelaçi cod_elev cu al elevului care s-a transferat. În acestmod, toate datele care se referå la elevul transferat (note, medii, absenÆe) sunt atribuiteautomat noului elev prin relaÆia care existå între tabele.

Pentru a se asigura integritatea referenÆialå, normal ar fi ca atunci când elevul setransferå, så se çteargå înregistrarea corespunzåtoare elevului din tabelul Elevi, dar çitoate înregistrårile din celelalte tabele care au valoarea cheilor secundare cod_elev egalåcu valoarea cheii primare cod_elev corespunzåtoare elevului transferat din tabelul Elevi,pentru a se asigura astfel condiÆia de integritate referenÆialå. În acest exemplu, trebuiefolositå çtergerea în cascadå atunci când un elev este transferat. Prin aceastå operaÆievor fi çterse toate înregistrårile din tabelele bazei de date care sunt legate de elevultransferat. La venirea unui elev nou, acestuia i se poate atribui codul matricol al elevuluitransferat deoarece în tabele nu vor mai exista înre-gistråri referitoare la acesta (note, absenÆe, medii).

În baza de date se gåsesc douå tipuri de date:colecÆiile de date organizate sub formå de tabele care reprezintå informaÆia utilå çi

Page 19: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 21

fiçiere ajutåtoare în care este descriså structura tabelelor (fiçierele de structurå),legåturile dintre ele çi alte informaÆii necesare regåsirii datelor în tabele (cum suntfiçierele index care permit regåsirea datelor în baza de date în funcÆie de valoareaunui câmp cheie çi care asigurå accesul direct la date) sau interpretårii lor (cum suntfiçierele pentru rapoarte).

Modelul relaÆional are urmåtoarele avantaje faÆå de celelalte modele de organizare:Este un model uçor de înÆeles de cåtre utilizator çi uçor de vizualizat.Asigurå independenÆa structurii logice a datelor faÆå de modul de stocare fizicå a lor.Regulile çi restricÆiile care asigurå integritatea datelor çi protejarea datelor çi a struc-turii de date sunt uçor de înÆeles de cåtre utilizator.SpaÆiul de stocare a datelor este redus.RedundanÆa datelor este reduså.

Obiectul: baza de date a unei companii.Crearea bazei de date, pornind de la sistemul iniÆial format din mai multe fiçiere:

Fiçierele de date dezvoltate de fiecare compartiment al companiei se pot transforma întabelele unei baze de date relaÆionale:

Tabelul AngajaÆi în care sunt påstrate date despre angajaÆii companiei: numele çiprenumele, codul angajatului, codul numeric personal, adresa, numårul de telefon,data naçterii, data angajårii, studii, experienÆa, funcÆia çi departamentul în carelucreazå, istoricul posturilor ocupate, data fiecårei avansåri etc.Tabelul Salarii în care sunt påstrate date despre salariile angajaÆilor companiei:numele çi prenumele salariatului, codul angajatului, codul numeric personal, adresa,funcÆia deÆinutå, treapta de salarizare, salariul tarifar, numårul de ore lucrate, reÆinerilunare, salariul lunar etc.Tabelul ClienÆi în care sunt påstrate date despre clienÆii companiei: numele companieiclient, codul clientului, adresa, numele persoanei de contact, telefonul etc.Tabelul Comenzi în care sunt påstrate informaÆii despre comenzile clienÆilor: numårulcomenzii, codul clientului care a emis comanda, conÆinutul comenzii, data comenzii etc.Tabelul Catalog_materiale în care sunt påstrate date despre materialele folosite decompanie: codul materialului, denumirea materialului, unitatea de måsurå etc.Tabelul Stocuri în care sunt påstrate date despre stocul de materiale çi materii primenecesare producÆiei: codul materialului, cantitatea, codul depozitului, denumireadepozitului, angajatul care råspunde de depozit etc.Tabelul Furnizori în care sunt påstrate date despre furnizorii de materii prime çimateriale ale companiei: numele companiei furnizor, codul furnizorului, adresa,numele persoanei de contact, telefonul, codul materialului furnizat, preÆul etc.Tabelul Vânzåri în care sunt påstrate date despre vânzårile de produse alecompaniei: codul produsului, denumirea produsului, unitatea de måsurå, cantitatea,data vânzårii, codul angajatului care a intermediat vânzarea, date despre clientul carea cumpårat produsul etc.

Page 20: SGBD Visual Foxpro

22 Informatică

Tabelul Produse în care sunt påstrate date despre produsele realizate: codulprodusului, denumirea produsului, unitatea de måsurå, cantitatea, data la care a fostrealizat produsul, preÆul de fabricaÆie etc.Tabelul Catalog_produse în care sunt påstrate date despre produsele oferite decompanie: codul produsului, denumirea produsului, descrierea produsului, unitatea demåsurå, preÆul etc.

În aceste tabele apar mai multe câmpuri de tip: cod produs, cod angajat, cod client saucod furnizor. Ele se folosesc pentru a identifica unic înregistrårile din tabele.

Pentru aceste tabele pot fi definite diferite chei de identificare. De exemplu, pentrutabelul AngajaÆi se poate folosi pentru cheie câmpul cod_angajat saucod_numeric_personal deoarece ele identificå unic un angajat din tabel. Câmpurilenume_prenume, funcÆie sau departament nu pot fi folosite pentru cheia de identificarepentru cå ele nu pot identifica unic înregistrårile din tabel (angajaÆii) deoarece pot existamai mulÆi angajaÆi care au acelaçi nume çi prenume sau care au aceeaçi funcÆie orilucreazå în acelaçi departament. Câmpurile cod_angajat çi cod_numeric_personal nupot forma împreunå o cheie de identificare deoarece cheia presupune numårul minim decâmpuri necesar identificårii, iar în acest exemplu, fiecare câmp în parte este suficientpentru identificarea angajatului.

Pentru tabelul Stocuri sunt necesare douå câmpuri pentru a obÆine cheia de identificarea unei înregistråri: cod_material çi cod_depozit, deoarece fiecare dintre aceste câmpuriluate separat nu pot identifica unic o înregistrare din tabel: existå mai multe câmpuricod_material cu aceeaçi valoare, câte unul pentru fiecare depozit în care se gåseçte înstoc acel material çi mai multe câmpuri cod_depozit cu aceeaçi valoare, câte unul pentrufiecare material care existå în acel depozit.

Dacå în tabelul ClienÆi câmpul cod_client este cheie primarå deoarece el identificå unicun client, în tabelul Comenzi el va fi cheie secundarå çi va permite stabilirea unei relaÆiiîntre tabelul ClienÆi çi tabelul Comenzi. Pentru a fi îndeplinitå condiÆia de integritate refe-renÆialå, nu trebuie så existe nici o comandå în tabelul Comenzi care så nu corespundåunui client din tabelul ClienÆi.

Baza de date a companiei

Salarii

Vânzåri ComenziAngajaÆi Produse

Furnizori

ClienÆiCatalogproduse

Stocuri

Catalogmateriale

Page 21: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 23

Între tabelele bazei de date ale companiei se vor stabili mai multe legåturi. De exemplu,între tabelul Catalog_produse çi tabelul Produse sau între tabelul Catalog_produse çitabelul Vânzåri prin intermediul cheii cod_produs.

Baza de date poate conÆine:Tabele corelate. Sunt tabele între care se stabilesc legåturi. De exemplu, întretabelele ClienÆi çi Comenzi existå o legåturå realizatå prin intermediul codului clientuluicare a emis comanda (cheia cod_client).Tabele necorelate. Sunt tabele între care nu se stabilesc legåturi. De exemplu, întretabelele Stocuri çi Salarii nu existå nici un fel de legåturå. În acest caz tabelele sefolosesc pentru a separa date diferite între ele.

TTest pentru evaluare:

Considerând cå sågeÆile reprezintå o relaÆie între un tabel conducåtor çi un tabel condus,precizaÆi cheile primare çi cheile secundare care pot fi folosite pentru a realiza legåturaîntre tabele (sensul sågeÆii reprezintå legåtura între tabelul conducåtor çi tabelul condus).Pe baza structurii de câmpuri precizatå pentru fiecare tabel çi pe baza legåturilor stabiliteîntre tabele, identificaÆi datele redundante din tabele (de exemplu denumirea produsului çiunitatea de måsurå care apar atât în tabelul Vânzåri,cât çi în tabelul Produse). EliminaÆi datele redundante.

RelaÆiaEste o legåturå dintre un câmp sau o combinaÆie de câmpuri dintr-un tabel (cheiaprimarå) çi câmpurile corespunzåtoare dintr-un alt tabel (cheia secundarå). Existå maimulte tipuri de relaÆii:

1. Una-la-una (one-to-one). Înseamnå cå o înregistrare din primul tabel este legatå la osingurå înregistrare din al doilea tabel. Este posibil çi cazul în care o înregistrare dinprimul tabel nu este legatå cu nici o înregistrare din al doilea tabel.

Aceastå relaÆie este similarå cu un tabel care conÆine ambele tabele. Se folosesc însådouå tabele din urmåtoarele motive:

Un tabel unic ar fi un tabel foartemare, cu o structurå care poatedepåçi numårul maxim de câmpuriacceptat de sistemul de gestiune abazelor de date (de exemplu, 255de câmpuri în Visual FoxPro).Numårul de câmpuri din înregis-trårile tabelului nu sunt fixe (uneleînregistråri au nevoie de mai multecâmpuri decât alte înregistråri).Dacå se lucreazå într-o reÆea de calculatoare, se preferå ca anumite câmpuri din tabelså se påstreze pe calculatorul local çi nu pe serverul de fiçiere.Un grup de date dintr-un tabel sunt legate de un tabel, iar un alt grup de date din tabelsunt legate de un alt tabel sau nu sunt legate de nici un tabel.

Tabelul A

a1

a2

a3

a4a5

Tabelul B

b1

b2

b3

b4

Page 22: SGBD Visual Foxpro

24 Informatică

Tabelul A

a1

a2

Tabelul B

b1

b2

b3

b4

Asupra unui grup de date din tabel se executå un anumit gen de operaÆii, iar asupraaltui grup de date din tabel se executå alt gen de operaÆii.

De exemplu, relaÆia stabilitå între tabelele Salarii çi AngajaÆi este de una-la-una deoareceunui angajat îi corespunde un singur salariu, iar un salariu corespunde unui singur angajat.Legåtura între cele douå tabele se face prin intermediul câmpului cod_angajat. Chiar dacåcele douå tabele ar putea fi reunite într-unul singur, nu se recomandå acest lucru deoareceasupra acestor date nu se executå acelaçi gen de operaÆii în cadrul organizaÆiei. Datele dintabelul AgajaÆi sunt folosite de departamentul Personal atunci când trebuie luate decizii refe-ritoare la angajaÆii companiei. Acest tabel conÆine datele generale ale fiecårui angajat caresunt necesare atunci când trebuie promovat, penalizat, disponibilizat sau când trebuie loca-lizat (adreså, telefon) pentru a i se transmite o anumitå informaÆie. Datele din tabelul Salariisunt folosite de departamentul Salarizare atunci când trebuie calculate drepturile salariale alefiecårui angajat sau datoriile companiei cåtre bugetul statului çi cåtre asiguråri, legate deangajaÆii såi. Acest tabel conÆine informaÆii necesare pentru calculul lunar al salariului fiecåruiangajat.

2. Una-la-mai-multe (one-to-many).Înseamnå cå o înregistrare din pri-mul tabel poate fi legatå cu maimulte înregistråri din al doilea tabel.

Este cel mai råspândit tip de relaÆie.Primul tabel trebuie så aibå un câmpcheie primarå, iar al doilea tabeltrebuie så conÆinå un câmp similar, princare så se poatå identifica înregistrareadin primul tabel de care este legatå înregistrarea din al doilea tabel. Un exemplu derelaÆie una la mai multe este cea stabilitå între tabelul ClienÆi çi tabelul Comenzi. Unuiclient îi corespund mai multe comenzi, dar o comandå poate fi emiså de cåtre un singurclient. Câmpul cheie folosit pentru legåturå este cod_client.

3. Mai-multe-la-mai-multe (many-to-many). Înseamnå cå o înregistrare din primul tabelpoate fi legatå de mai multe înregistråri din al doilea tabel, çi invers, o înregistrare dincel de-al doilea tabel poate fi legatå de una sau mai multe înregistråri din primul tabel.

De exemplu, între tabelul Vânzåtori çitabelul Produse poate fi stabilitå o rela-Æie de mai-multe-la-mai-multe: un an-gajat comercial poate vinde mai multeproduse, iar un produs este vândut demai mulÆi angajaÆi comerciali. RelaÆiamai-multe-la-mai-multe poate fi des-compuså în douå relaÆii una-la-mai-multe. În acest caz se construieçte untabel suplimentar care så realizezeaceastå descompunere. De exemplu, înbaza de date Çcoala pot fi definite un tabel Elevi cu elevii din çcoalå çi un alt tabel Disciplinecu disciplinele predate în çcoalå. Fiecårei înregistråri din tabelul Elevi îi corespund mai multeînregistråri în tabelul Discipline (un elev studiazå mai multe discipline) çi fiecårei înregistråri

Tabelul A

a1

a2

a3a4

Tabelul B

b1

b2

b3

b4

Page 23: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 25

din tabelul Discipline îi corespund mai multe înregistråri în tabelul Elevi (o disciplinå estestudiatå de mai mulÆi elevi). Aceastå relaÆie se poate descompune în douå relaÆii una-la-mai-multe prin crearea unui tabel suplimentar Încadråri care så conÆinå înregistråri cu douå câm-puri: cod_elev çi cod_disciplinå. RelaÆiile vor fi de una-la-mai-multe între tabelul Elevi çitabelul Încadråri (unui elev îi corespund mai multe încadråri, câte una pentru fiecare disciplinåpe care o studiazå) çi între tabelul Discipline çi tabelul Încadråri (unei discipline îi corespundmai multe încadråri, câte una pentru fiecare elev care o studiazå).

2.1. Sistemul de Gestiune a Bazelor de Date Relaţionale (SGBDR)Açadar, modelul relaÆional este caracterizat de:

Structuri. Sunt obiecte definite ce conÆin date la care utilizatorul are acces.OperaÆii. Sunt acÆiuni definite care permit utilizatorului så manipuleze datele.Reguli. Sunt legi prin care se stabileçte cine çi cum manipuleazå datele.

Datoritå råspândirii din ce în ce mai mari a bazelor de date relaÆionale pe microcalcula-toare, majoritatea firmelor producåtoare de seturi software au inclus în acestea çisisteme de gestiune a bazelor de date:

Firma Setul software S.G.B.D.Microsoft Microsoft Office Access

Lotus Lotus SmartSuite Lotus ApproachCorel Corel Suite Office Paradox

Unele firme, cum este Microsoft, produc çi alte SGBD-uri relaÆionale (FoxPro). Toateaceste sisteme de gestiune a bazelor de date sunt orientate pe microcalculatoare çireÆele de microcalculatoare.

Înså cel mai utilizat SGBD relaÆional din întreaga lume råmâne în continuare Oracleprodus de firma Oracle Corporation, deoarece are urmåtoarelor avantaje:

Poate fi folosit cu diferite sisteme de operare: Windows pentru microcalculatoarele com-patibile IBM çi System pentru calculatoarele Macintosh, Unix pentru microcalculatoare çiminicalculatoare çi sisteme de operare pentru calculatoare mari (mainframe).Permite dezvoltarea unor baze de date de orice dimensiune (de la câÆiva octeÆi pânåla gigaocteÆi).Respectå standardele în vigoare referitoare la limbajele de accesare a datelor (SQL).Acceptå un numår mare de utilizatori simultani, minimizând conflictele care pot såaparå în cererile simultane de acces la date.Asigurå o securitate måritå datoritå siguranÆei foarte mari la limitarea çi monitorizareaaccesului la date.

FuncÆiile unui sistem de gestiune a bazelor de date relaÆionale sunt:memorarea, actualizarea (adåugarea, çtergerea çi modificarea) çi regåsirea datelordin baza de date (utilizatorul poate crea çi manipula datele fårå så cunoascå modul încare sunt stocate pe mediul de memorare),crearea çi întreÆinerea dicÆionarului de date,asigurarea acesului rapid la datele din colecÆia de date,påstrarea unei copii de siguranÆå a datelor pentru a putea fi recuperate în cazul în careau loc întreruperi accidentale ale funcÆionårii sistemului,

Page 24: SGBD Visual Foxpro

26 Informatică

asigurarea securitåÆii datelor,asigurarea accesului simultan al mai multor utilizatori la o înregistrare din baza dedate (eventual asigurarea accesului concurent),asigurarea integritåÆii datelor (se pot introduce în baza de date numai date valide, iaroperaÆiile de actualizare nu distrug legåturile dintre tabele).

Sistemele de gestiune a bazelor de date relaÆionale vå pot pune la dispoziÆie urmåtoarelemetode prin care så asiguraÆi securitatea bazei de date:

Parolå la nivelul întregii baze de date

Aceastå metodå permite asigurarea securitåÆii la nivelul bazei de date. Este cea maisimplå metodå de asigurare a securitåÆii çi cel mai rapid de realizat. Se atribuie o singuråparolå pentru întreaga bazå de date. Orice persoanå care doreçte så foloseascå baza dedate trebuie mai întâi så introducå parola. Dacå parola este corectå, se obÆine accesul labaza de date çi toate obiectele bazei de date îi vor fi disponibile. Metoda este eficientånumai în cazul unui birou mic çi cu un numår foarte mic de utilizatori ai bazei de date(eventual unul singur). Aceçtia se pot asigura astfel cå nici o persoanå neautorizatå (dinafara biroului) nu are acces la baza de date.

Drepturi specifice acordate utilizatorilor sau grupurilor de utilizatori

Aceastå metodå permite asigurarea securitåÆii la nivelul utilizatorului. Utilizatorii potavea drepturi diferite asupra aceleiaçi baze de date prin folosirea schemelor parÆiale. Fie-care utilizator deÆine propria parolå, care este unicå çi nu are legåturå cu parolele celor-lalÆi utilizatori. La începerea sesiunii de lucru, utilizatorul introduce numele de utilizator çiparola. Sistemul de gestiune a bazelor de date verificå dacå sunt corecte çi dacå da,determinå drepturile asociate utilizatorului respectiv (schema parÆialå la care are acces).Utilizatorii pot fi organizaÆi pe grupuri çi pot fi atribuite drepturi la nivel de grup, la nivel deutilizator sau la ambele niveluri. Grupurile sunt categorii de utilizatori care au aceleaçidrepturi de a folosi baza de date. Utilizatorul poate så facå parte dintr-un grup sau dinmai multe grupuri. El va moçteni drepturile grupului cel mai puÆin restrictiv din care faceparte. La aceste drepturi se vor adåuga drepturile proprii. Prin aceastå metodå pot fipersonalizate uçor drepturile fiecårui utilizator asupra obiectelor din baza de date.InformaÆiile despre utilizatori çi grupurile de utilizatori se påstreazå la nivelul bazei dedate, iar drepturile de folosire a obiectelor bazei de date se påstreazå în cadrul tabelelor.

Folosirea grupurilor de utilizatori uçureazå mult munca de asigurare a securitåÆii bazei dedate. Mai întâi se organizeazå drepturile de acces pe grupuri logice çi apoi se ataçeazåutilizatorii la aceste grupuri. Drepturile unui utilizator pot fi uçor modificate prin simpla mu-tare a utilizatorului dintr-un grup în altul. De exemplu, pot fi definite trei grupuri de utiliza-tori ai unei baze de date relaÆionale AngajaÆi: primul grup poate vizualiza çi actualiza (mo-difica, adåuga, çterge) baza de date, al doilea grup poate doar vizualiza baza de date, iaral treilea grup poate vizualiza numai anumite câmpuri ale bazei de date (de exemplu,numai numele çi adresa). Dacå utilizatorul este promovat în funcÆie çi primeçte noi drep-turi de folosire a bazei de date, el va fi mutat în grupul corespunzåtor acestor drepturi.

Criptarea bazei de date

Primele douå metode se referå la protejarea folosirii bazei de date de cåtre persoaneneautorizate prin intermediul sistemului de gestiune a bazelor de date, dar ele nu

Page 25: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 27

împiedicå vizualizarea datelor din tabele cu ajutorul altor aplicaÆii care pot så citeascåtexte (procesoare de texte, editoare de texte etc.). Singura metodå prin care se poateîmpiedica vizualizarea datelor este cea de criptare a datelor.

Elementele folosite de sistemul de gestiune a bazelor de date relaÆionale pentru a-çi realiza funcÆiile sunt:

DicÆionarul de date (Data Dictionary) conÆine descrierea structurii datelor folosite în bazade date. El este generat automat la crearea bazei de date çi conÆine informaÆii referitoarela tabelele bazei de date, la fiçierele ajutåtoare folosite în exploatarea tabelelor çi la mo-dul în care pot fi localizate pe disc. De obicei aceste informaÆii sunt despre:

ce date sunt disponibile,unde sunt localizate datele,descrierea datelor,legåturile dintre date,cum pot fi folosite datele,cine este proprietarul lor,cui i se permite accesul la consultarea datelor,cui i se permite accesul la actualizarea datelor,limitårile în exploatare generate din necesitatea de a asigura securitatea çiconfidenÆialitatea datelor.

În dicÆionarul de date se gåsesc tabele care conÆin datele bazei de date în formatul internal sistemului de gestiune a bazelor de date folosit, precum çi vizualizårile (tabelevirtuale) care sintetizeazå datele din tabelele reale çi prezintå informaÆia într-un formataccesibil utilizatorului. Actualizarea dicÆionarului de date se face folosind limbajuldicÆionarului de date (Data Dictionary Language). Accesul la dicÆionarul de date estepermis numai dacå baza de date este deschiså.

Limbajul de manipulare a datelor (Data Manipulation Language). Este un limbaj folositde sistemul de gestiune a bazelor de date pentru gestionarea dicÆionarului de date prinoperaÆii de inserare çi actualizare a datelor. El permite efectuarea calculelor matematiceçi statistice care pot fi folosite apoi în generarea rapoartelor.

Limbajul de interogare (Query Language). Este un limbaj accesibil, uçor de înÆeles çi defolosit de marea majoritate a utilizatorilor. Deseori el se confundå cu limbajul de mani-pulare a datelor. El asigurå accesul la datele din baza de date, regåsirea çi afiçarea lor.

Iatå câteva exemple de interogåri ale bazei de date a companiei:Identificarea tuturor clienÆilor dintr-un judeÆ.Afiçarea tuturor comenzilor dintr-o perioadå de timp pentru un anumit produs saupentru toate produsele.Afiçarea informaÆiilor despre un client identificat dupå numårul såu de cod sau dupånumele såu.

Interogarea (query) sau cererea de înregistråri este un proces prin care se extrag dinbaza de date çi sunt prezentate în vederea utilizårii acele înregistråri care satisfac

anumite criterii.

Page 26: SGBD Visual Foxpro

28 Informatică

Afiçarea listei cu clienÆii care au comandat produse care nu existå în acest moment înstoc (numele clientului, numele persoanei de contact çi numårul de telefon).Afiçarea unei liste cu clienÆii care nu au avut comenzi într-o perioadå de timp precizatå.Afiçarea unitåÆilor vândute pentru fiecare produs într-o perioadå de timp.Afiçarea informaÆiilor despre un client identificat dupå numårul såu de cod sau dupå nume.

SQL (Structured Query Language - limbaj structurat de interogare) este cel mai råspân-dit limbaj de interogare a bazelor de date relaÆionale. Este un limbaj standardizat care afost creat special pentru a putea fi folosit la interogarea, actualizarea çi gestionarea baze-lor de date. InstrucÆiunile SQL descriu operaÆiile relaÆionale între tabele, ca de exempluSelect, Project çi Join. Limbajul SQL nu opereazå cu datele propriu-zise (variabile dememorie çi câmpuri) ci cu relaÆiile dintre tabele. Limbajul SQL poate fi folosit împreunå cuun limbaj gazdå sau în unele cazuri este inclus în limbajul gazdå (cum este de exemplulimbajul gazdå al sistemului de gestiune a bazelor de date FoxPro). Limbajul SQL estedeosebit de un limbaj procedural (aça cum sunt limbajele Pascal, C, Basic etc.). Limbajulprocedural duce la construirea unor programe prin care i se aratå calculatorului cetrebuie så facå în conformitate cu algoritmul de rezolvare a problemei, descris prin in-strucÆiuni (prin care i se spune calculatorului pas cu pas ce trebuie så execute). Pe bazaacestor programe, calculatorul executå instrucÆiune dupå instrucÆiune respectând cele treitipuri de structuri de control: secvenÆialå, alternativå çi repetitivå. Limbajul SQL este unlimbaj de rezultate: el îi spune calculatorului ce doreçte utilizatorul så obÆinå çi nu ceacÆiuni trebuie så efectueze ca så obÆinå acele rezultate. Elementul fundamental al

Terminal

Terminal

Sistemul degestiune a

bazelor de date

Identificareacererii de date

DeterminarealocaÆiilor în baza

de date

Baza de date

Interogare

Råspuns

DicÆionarulde date

Limbajul demanipulare

a datelor

Stabilirea volumului mediu de co-menzi într-o perioadå de timp pen-tru un anumit produs.Stabilirea produsului care a fostcel mai bine vândut într-o anumitåperioadå de timp.Afiçarea pentru fiecare produs acantitåÆii maxime vândute într-oanumitå perioadå de timp.Afiçarea listei de materiale careau stocul 0.Afiçarea listei de materiale caresunt sub stocul de siguranÆåadmis pentru a asigura fluxulproducÆiei.

Page 27: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 29

oricårei interogåri SQL este cuvântul cheie Select cu care începe fiecare instrucÆiuneSQL folositå pentru interogarea bazei de date.

De exemplu, sistemul de gestiune a bazelor de date relaÆionale FoxPro are implementatun limbaj propriu specializat, dar înÆelege çi limbajul SQL.

2.2. Normalizarea unei bazei de dateCea mai importantå problemå care apare în proiectarea unei aplicaÆii de exploatare abazei de date nu o reprezintå aplicaÆia în sine, ci modul în care este proiectatå structurabazei de date pentru cå de ea depinde timpul de acces la date çi ea este cea careasigurå integritatea referenÆialå a datelor.

AÆi aflat deja cå, structura bazei de date este definitå de:structura de câmpuri a fiecårui tabel çi delegåturile care se stabilesc între tabele.

Structura de date obÆinutå nu trebuie så conÆinå dependenÆe nedorite între tabele,deoarece acestea pot genera anomalii în exploatarea bazei de date.

În cadrul acestui proces sunt identificate datele care trebuie separate în tabele mai mici çimodul în care va fi asiguratå legåtura între ele. Prin aceastå operaÆie se simplificå oînregistrare de mari dimensiuni în mai multe tabele legate între ele. Nu trebuie alocatecâmpuri pentru datele derivate sau calculate (cum este de exemplu vârsta uneipersoane, dacå existå deja un câmp în care este înregistratå data naçterii).

Pe de altå parte, dacå o bazå de date relaÆionalå conÆine foarte multe tabele, exploatareasa va necesita un timp mai mare de prelucrare, deoarece o interogare a bazei de date vaavea ca efect parcurgerea mai multor tabele. De aceea, procesul de divizare a tabeluluiiniÆial în mai multe tabele trebuie så se opreascå la un moment dat.

AÆi våzut cå elementul principal care defineçte o bazå de date este schema tabelelor,adicå tabelele care fac parte din baza de date: numele tabelului çi structura de câmpuri atabelului. Problema proiectårii unei baze de date constå de fapt în modul în care grupåmdatele sub formå de câmpuri în tabele pentru a reuçi så modelåm cât mai eficient colecÆiade date pentru a putea råspunde întrebårilor formulate în cadrul organizaÆiei. De aceea, înprocesul de proiectare a bazelor de date trebuie avutå în vedere dependenÆa datelor,adicå legåturile care existå între câmpurile unui tabel sau între câmpurile unor tabelediferite. DependenÆele cele mai influente sunt dependenÆa funcÆionalå çi dependenÆamultivaloricå.

DependenÆa funcÆionalå se referå la faptul cå un câmp al unui tabel depinde de un altcâmp al unui tabel, adicå se spune cå un câmp x depinde funcÆional de un câmp y dacåçi numai dacå pentru o valoare a câmpului x corespunde o singurå valoare a câmpului y.De exemplu, în tabela ClienÆi câmpul cod_client este dependent funcÆional de câmpuladreså_client deoarece fiecårui client al companiei îi corespunde o singurå adreså. Oastfel de constrângere aplicatå bazei de date face înså imposibilå înregistrarea în baza

Normalizarea este procesul de simplificare a unei structuri complexe de date prindivizarea ei în mai multe entitåÆi mai simple, interconectate între ele.

Page 28: SGBD Visual Foxpro

30 Informatică

de date a unui client care are douå adrese. Prin eliminarea dependenÆelor funcÆionale semicçoreazå redundanÆa datelor çi anomaliile care pot så aparå atunci când se adaugå çise çterg înregistråri sau atunci când se modificå valoarea câmpurilor. Principala cale princare se pot elimina dependeÆele funcÆionale din cadrul tabelelor este descompunerea lorîn tabele din ce în ce mai simple.

DependenÆa multivaloricå se referå la faptul cå valoarea unui câmp x poate forma câteo înregistrare cu toate combinaÆiile posibile ale valorilor câmpurilor y çi z - cu toateperechile de valori (y,z) din produsul cartezian al mulÆimilor Y çi Z, mulÆimi care specificådomeniul de definiÆie al câmpurilor y çi z pentru valoarea câmpului x. De exemplu, pentruobÆinerea unui atestat, o mulÆime Y de elevi trebuie så fie îndrumatå de o mulÆime Z deprofesori, fiind posibilå pentru acelaçi tip de atestat orice combinaÆie de elev-profesor dincele douå mulÆimi. Tabelul format din cele trei câmpuri: tip_atestat, nume_elev,nume_profesor conÆine dependenÆe multivalorice. Pentru a elimina anomaliile deexploatare a unei baze de date, într-un tabel trebuie så existe o singurå dependenÆåmultivaloare, adicå trebuie descompus tabelul astfel încât så fie respectatå aceaståcondiÆie. În acest caz se obÆin trei tabele: Atestat_elevi (conÆine câmpurile tip_atestat,nume_elev, adicå atribuiri prin care se poate afla ce atestat va susÆine fiecare elev),Atestat_profesori (conÆine câmpurile tip_atestat, nume_profesor, adicå atribuiri prin carese poate afla ce atestat poate îndruma fiecare profesor) çi Atestat (conÆine câmpurilenume_elev, nume_profesor, adicå atribuiri prin care se poate afla ce profesor îndrumåfiecare elev pentru atestat).

Toate aceste dependenÆe care existå în cadrul unui tabel pot genera diferite anomalii întimpul executårii operaÆiilor de actualizare a bazei de date, anomalii care sunt generate înspecial din cauza redundanÆei datelor. Pentru a evita aceste anomalii trebuie înlocuittabelul care le genereazå cu alte tabele în care dependenÆele sunt supuse unor restricÆii.Formele echivalente astfel obÆinute se numesc forme normale.

Existå cinci niveluri de normalizare: primele trei acÆioneazå asupra dependenÆelorfuncÆionale çi ultimele douå asupra dependenÆelor multivalorice. De obicei baza de datese gândeçte iniÆial sub forma unui singur tabel, dupå care tabelul respectiv senormalizeazå trecându-l prin cele cinci forme normale.

Deoarece în proiectarea unei baze de date primele trei forme sunt cele mai des întâlnite,în continuare vor fi prezentate numai acestea, pentru a înÆelege ce înseamnå procesul denormalizare a bazei de date.

Prima formå normalåAducerea unei baze de date la prima formå normalå înseamnå eliminarea câmpurilorcompuse çi a câmpurilor repetitive.

De exemplu, så consideråm cå tabelul AngajaÆi_tot conÆine, pe lângå informaÆiile generaledespre un angajat, çi informaÆiile necesare pentru a urmåri istoricul evoluÆiei unui angajat înposturile companiei. Înseamnå cå pentru fiecare angajat trebuie så existe urmåtoarele date:cod_angajat, nume_prenume, cod_numeric, adreså, telefon, studii, data_naçterii,data_angajårii, funcÆie1, departament1, data_iniÆalå1, data_finalå1, motiv_schimbare1, func-Æie2, departament2, data_iniÆalå2, data_finalå2, motiv_schimbare2, funcÆie3, departament3,data_iniÆalå3, data_finalå3, motiv_schimbare3 etc. Toate aceste date pot furniza informaÆiiparticulare despre angajat (data naçterii, codul numeric personal, adresa, telefonul) çi modul

Page 29: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 31

AngajaÆi_tot

AngajaÆi

AngajaÆii DepartamenteFuncÆii

în care a evoluat profesional în cadrul companiei (funcÆia, departamentul, data la care a fostangajat în funcÆie, data la care a fost schimbat din funcÆie çi motivul: promovare, retrogradaredin cauza absenÆelor nemotivate, retrogradare din cauza incompetenÆei etc.). Se observå cåpentru acelaçi angajat existå mai multe ansambluri de câmpuri (funcÆie, departament,data_iniÆalå, data_finalå, motiv_schimbare), în cazul în care a ocupat mai multe posturi încadrul companiei, câte un ansamblu pentru fiecare post ocupat. Vom numi post acest ansam-blu de câmpuri. Numårul de repetåri ale ansamblului post pentru un angajat nu poate fi preci-zat. Unii angajaÆi au ocupat aceeaçi funcÆie de la angajare, alÆii çi-au schimbat funcÆia de cinciori. Deci existå mai multe câmpuri compuse post cu aceeaçi semnificaÆie pentru informaÆia pecare o reprezintå (funcÆie, perioada ocupårii funcÆiei çi motivul schimbårii funcÆiei).

Pentru a elimina câmpurile repetitive dintr-o înregistrare, se va reorganiza structura acestuitabel într-un nou tabel AngajaÆi astfel: cod_angajat, nume_prenume, cod_numeric, adreså,telefon, studii, data_naçterii,data_angajårii, schimbare_funcÆie, funcÆie, departament,data_iniÆalå, data_finalå, mo-tiv_schimbare. Folosind oastfel de structurå, câmpurilefuncÆie, departament, data_iniÆalå, data_finalå, motiv_schimbare nu se vor mairepeta în cadrul aceleiaçiînregistråri. Vor apårea însåmai multe înregistråri pentru

Cod_angajat Nume_prenume Cod_numeric ... Post1 ... Post5

InformaÆii generale despre salariat. Fiecåruisalariat îi corespunde o singurå înregistrare în

tabel.

InformaÆii despre fiecarepost ocupat de un salariat.Ele se repetå de mai multe

ori într-o înregistrare.

FuncÆie Departament Data_iniÆialå Data_finalå Motiv_schimbare

Cod_angajat

Nume_prenume

Cod_numeric

... FuncÆie Departament ... Motiv_schimbare

Fiecare înregistrare conÆine informaÆii generale despre salariat çi informaÆii despre un postocupat. Pentru un salariat pot exista mai multe înregistråri, câte una pentru fiecare post

ocupat.

Page 30: SGBD Visual Foxpro

32 Informatică

acelaçi angajat, câte una pentru fiecare schimbare de funcÆie. Câmpul schimbare_funcÆie vaînregistra cronologic a câta schimbare de funcÆie reprezintå înregistrarea.

Se observå cå în tabelul AngajaÆi, pentru funcÆie çi pentru departament existå un singurcâmp care nu poate identifica unic aceste date deoarece sunt dependente de çirul decaractere introdus de la tastaturå (persoane diferite pot scrie diferit acelaçi nume defuncÆie sau acelaçi nume de departament). Din aceastå cauzå se atribuie fiecårei funcÆiiun cod numeric unic cod_funcÆie çi fiecårui departament un cod numeric uniccod_departament. În acest mod câmpurile funcÆie çi departament vor deveni câmpuricompuse fiecare din câte douå câmpuri elementare. Câmpul compus funcÆie poate fidescompus în câmpurile elementare cod_funcÆie çi denumire_funcÆie, iar câmpul compusdepartament poate fi descompus în câmpurile elementare cod_departament çidenumire_departament. În acest mod vor apårea douå noi tabele: tabelul FuncÆii careconÆine câmpurile cod_funcÆie, denumire_funcÆie çi tabelul Departamente care conÆinecâmpurile cod_departament, denumire_departament.

În acest caz tabelul AngajaÆii va fi format din: cod_angajat, nume_prenume,cod_numeric, adreså, telefon, studii, data_naçterii, data_angajårii, schimbare_funcÆie,cod_funcÆie, cod_departament, data_iniÆalå, data_finalå, motiv_schimbare. Între tabelulAngajat çi tabelul FuncÆii va exista o legåturå prin intermediul câmpului cod_funcÆie careeste cheie primarå în tabelul FuncÆii çi cheie secundarå în tabelul Angajat. Între tabelulAngajaÆi çi tabelul Departamente va exista o legåturå prin intermediul câmpuluicod_departament care este cheie primarå în tabelul Departamente çi cheie secundarå întabelul AngajaÆi.

A doua formå normalåAducerea unei baze de date la adoua formå normalå înseamnå cådivizarea tabelelor bazei de datetrebuie så continue astfel încâtfiecare tabel obÆinut så nu conÆinådependenÆe funcÆionale parÆiale,adicå toate câmpurile unui tabeltrebuie så depindå numai de cheiaprimarå a tabelului, çi nu de diversecâmpuri care compun cheia primarå,adicå fiecare înregistrare a unuitabel trebuie så fie identificatå unicde cheia primarå.

Se observå cå în tabelul AngajaÆii existå pentru acelaçi angajat (codul angajatului fiindcheia primarå) mai multe înregistråri în cazul în care a ocupat mai multe posturi în cadrulcompaniei, câte una pentru fiecare post ocupat. Deci, în mai multe înregistråri se vorrepeta valori ale câmpurilor: cod_angajat, nume_prenume, cod_numeric, adreså, telefon,studii, data_naçterii, data_angajårii. Valorile câmpurilor care pot diferi de la o înregistrarela alta pentru aceeaçi valoare a câmpurilor enumerate anterior sunt: schimbare_funcÆie,cod_funcÆie, cod_departament, data_iniÆalå, data_finalå, motiv_schimbare. Pentru aelimina câmpurile care nu pot fi identificate unic prin intermediul câmpului cod_angajat

AngajaÆii

Angajat FuncÆiiangajat

DepartamenteFuncÆii

Page 31: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 33

(cheia primarå a tabelului) se va diviza acest tabel în douå tabele: Angajat care conÆinecâmpurile cod_angajat, nume_prenume, cod_numeric, adreså, telefon, studii,data_naçterii, data_angajårii çi FuncÆii_angajat care conÆine câmpurile cod_angajat,cod_funcÆie, cod_departament, data_iniÆalå, data_finalå, motiv_schimbare. În tabelulFuncÆii_angajat cheia primarå (cea care identificå unic o înregistrare) este formatå dincâmpurile cod_angajat, cod_funcÆie çi cod_departament. Acest tabel este legat de maimulte tabele: Angajat (legåtura între cele douå tabele va fi fåcutå prin câmpulcod_angajat), FuncÆii (prin cheia cod_funcÆie care este cheie primarå în tabelul FuncÆii çicheie secundarå în tabelul Angajat) çi Departamente (prin cheia cod_departament careeste cheie primarå în tabelul Departamente çi cheie secundarå în tabelul Angajat).

A treia formå normalåAducerea unei baze de date la a treia formå normalå înseamnå cå divizarea tabelelorbazei de date trebuie så continue astfel încât fiecare tabel obÆinut så nu conÆinådependenÆe funcÆionale tranzitive, adicå un câmp x nu trebuie så depindå de un câmpy care depinde la rândul såu de un câmp z.

Så analizåm tabelul Vânzåri în care sunt påstrate date despre vânzårile de produse alecompaniei: codul produsului, denumirea produsului, unitatea de måsurå, cantitatea, datavânzårii, codul angajatului care a intermediat vânzarea, date despre clientul care acumpårat produsul, date despre factura prin care s-a încheiat tranzacÆia etc.

Se observå cå pentru acelaçi angajat vânzåtor (adicå acelaçi cod vânzåtor, care este defapt codul angajatului, o cheie secundarå cu care se poate lega tabela Salarii de tabelaAngajat unde acest câmp este cheie primarå) pot så existe mai multe facturi. Fiecarefacturå corespunde unui cod de client çi fiecare facturå poate conÆine mai multe produsevândute de acel angajat. Açadar câmpul cod_produs depinde de câmpul cod_client (celcåruia i s-a vândut produsul), care la rândul såu depinde de câmpul cod_vânzåtor (celcare a vândut produsul).

Cod_angajat

Cod_funcÆie

Cod_departament

... Motiv_schimbare

Tabelul AngajaÆii va fi descompus în douå tabele.

Cod_angajat

Nume_prenume

Cod_numeric

... FuncÆie Departament ... Motiv_schimbare

Cod_angajat

Nume_prenume

Cod_numeric

...

Tabelul Angajat va conÆineinformaÆii generale despreangajaÆi. Existå o singuråînregistrare pentru fiecareangajat.

Tabelul FuncÆii_angajat va conÆine informaÆiidespre posturile ocupate de fiecare angajat.Pentru fiecare angajat existå atâtea înregistråri.câte posturi a ocupat în cadrul organizaÆiei.

Page 32: SGBD Visual Foxpro

34 Informatică

În acest caz, documentul ce leagå toate aceste informaÆii este factura care påstreazåurma tranzacÆiei comerciale. În ea se gåsesc date generale despre tranzacÆie(numårul_facturii, data_facturii), dar çi date despre angajatul care a negociat tranzacÆia(denumire_vânzåtor, cod vânzåtor), date despre client (persoana care a cumpåratprodusele, identificatå prin cod_client, denumire_client, cod_fiscal, adreså etc.) çi datedespre fiecare produs vândut (numår_produs_facturå, cod_produs, denumire_produs,unitate, preÆ_unitar, cantitate, valoare_cantitate1). Se observå cå în cadrul unei facturi,produsul vândut depinde de clientul care l-a cumpårat (care plåteçte toatå factura), carela rândul såu depinde de vânzåtorul cu care a negociat achiziÆionarea produselor. Pentrua elimina aceste dependenÆe funcÆionale tranzitive: produs→ client→ vânzåtor din datelefurnizate de o facturå, vor fi construite mai multe tabele: tabelul Facturå care conÆine dategenerale despre facturå (numår_facturå, datå, serie), tabelul Vânzåtor care conÆine datedespre tranzacÆiile efectuate de angajaÆii comerciali ai companiei çi care sunt necesarepentru salarizarea lor (numår_facturå, cod_angajat_vânzåtor), tabelul Cumpåråtor careconÆine date pentru identificarea clientului implicat în tranzacÆie (numår_facturå,cod_client), presupunând cå existå deja tabelul ClienÆi care furnizeazå informaÆiicomplete depre fiecare client obiçnuit al companiei (nume, cod fiscal, adreså etc.), tabelulProdus_vândut care identificå produsul vândut prin facturå çi care conÆine date pentruidentificarea fiecårui produs vândut (numår_facturå, cod_produs, cantitate), presupunândcå existå deja tabelul Catalog_produse care furnizeazå informaÆii complete desprefiecare produs vândut de companie (denumire, cod, unitate de måsurå, preÆ unitar etc.).

TTest pentru evaluare:

ConsideraÆi cå çcoala voastrå este o organizaÆie care trebuie informatizatå, iar colecÆia dedate pe care o veÆi folosi va fi de tipul unei baze de date relaÆionale. Analiza voastråtrebuie så porneascå de la entitatea Elev. VeÆi identifica toate datele caracteristice unuielev, atât din punct de vedere al datelor personale (numår matricol, nume çi prenume,iniÆiala tatålui, datele despre pårinÆi, adresa, numårul de telefon), cât çi din punct devedere al situaÆiei çcolare (anul de studiu, clasa, profilul clasei, profesorul diriginte,profesorul pe care îl are la fiecare disciplinå, disciplinele pe care le studiazå în acest ançcolar, notele çi absenÆele la fiecare disciplinå, pe fiecare semestru, media la fiecare

1 Pentru a simplifica analiza, s-au eliminat din structura unei facturi toate datele referitoare la TVA.

Facturå(document)

Factura Vânzåtor Produs_vândutCumpåråtor

Salarii Catalog_produseClienÆi

Page 33: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 35

disciplinå obÆinutå semestrial, media anualå la fiecare disciplinå, media semestrialå çimedia anualå a elevului). ConstruiÆi cu aceste date primul tabel. NormalizaÆi tabelul.

TTest pentru evaluare:

În urmåtorul exemplu, pentru proiectarea unei baze de date s-a pornit de la lista cu co-menzile clienÆilor. Trecând prin mai multe forme normale s-au obÆinut tabelele: Comenzi,ClienÆi, Produse_comandate. IdentificaÆi formele normale prin care a trecut tabelul iniÆial.

Etapa 1. Se construieçte tabelul Total_comenzi care conÆine urmåtoarele câmpuri:numår_comandå, datå_comandå, nume_client, adreså_client çi 6 câmpuri compuseprodus_comandat. Câmpul compus este format din câmpurile denumire_produs,unitate_måsurå, cantitate, preÆ_unitar, valoare. Fiecare înregistrare reprezintå ocomandå. Câmpul numår_comandå poate identifica unic o înregistrare.

Etapa 2. Se construieçte tabelul Comenzi care conÆine urmåtoarele câmpuri:numår_comandå, datå_comandå, nume_client, adreså_client, denumire_produs,unitate_måsurå, cantitate, preÆ_unitar, valoare. Pentru fiecare comandå vor fi mai multeînregistråri, câte una pentru fiecare podus din comandå. Câmpul numår_comandå çidenumire_produs identificå unic o înregistrare.

Etapa 3. Pentru a uçura identificarea unui produs se atribuie acestuia un cod_produs. Seconstruieçte tabelul Catalog_produse care conÆine urmåtoarele câmpuri: cod_produs,denumire_produs, unitate_måsurå, preÆ_unitar. Fiecare produs din catalog va fi identificatunic prin câmpul cod_produs. În tabelul Comenzi vor råmâne câmpurile:numår_comandå, datå_comandå, nume_client, adreså_client, cod_produs, cantitate,valoare. Înregistrårile vor fi identificate unic prin cheia formatå din douå câmpurinumår_comandå çi cod_produs.

Etapa 4. Din tabelul Comenzi se construiesc douå tabele: tabelul Comanda çi tabelulProduse. Tabelul Comanda conÆine câmpurile: numår_comandå, datå_comandå,nume_client, adreså_client, valoare. Pentru fiecare comandå va fi o singurå înregistrareidentificatå unic prin câmpul numår_comandå. Tabelul Produse conÆine câmpurile:numår_comandå, cod_produs, nume_client, adreså_client, cantitate, valoare. Pentrufiecare comandå vor exista mai multe înregistråri. Înregistrårile vor fi identificate unic princheia formatå din douå câmpuri: numår_comandå çi cod_produs.

Etapa 5. Din tabelul Comanda se construiesc douå tabele: tabelul Comenzi çi tabelulClienÆi. Tabelul Comenzi conÆine câmpurile: numår_comandå, datå_comandå, cod_client,valoare. Pentru fiecare comandå va fi o singurå înregistrare identificatå unic prin câmpulnumår_comandå. Tabelul ClienÆi conÆine câmpurile: cod_client, nume_client,adreså_client. Pentru fiecare client va fi o singurå înregistrare. Înregistrårile vor fiidentificate unic prin câmpul: cod_client.

Page 34: SGBD Visual Foxpro

36 Informatică

2.3. Fundamentul matematic al bazelor de date relaţionaleCele mai multe limbaje folosite pentru interogarea bazelor de date, aça cum este çilimbajul SQL, derivå din aplicarea operatorilor specializaÆi asupra relaÆiilor dintre tabelelebazei de date. Aceçti operatori fac parte din algebra relaÆionalå.

Algebra relaÆionalå conÆine pe lângå operatorii de mulÆimi care trateazå tabelele ca pemulÆimi de elemente (reuniunea, intersecÆia, diferenÆa, produsul cartezian), fårå så Æinåcont de relaÆiile dintre ele, çi operatorii relaÆionali specifici care se aplicå asuprarelaÆiilor stabilite între înregistrårile tabelelor legate.

Operatorii relaÆionali specifici sunt:

selecÆia (select),proiecÆia (project),cuplarea (join).

1. SelecÆia (Select2). Operatorul se aplicå pe un tabel surså. Rezultatul este un tabelnou, cu aceeaçi structurå de câmpuri ca çi a tabelului surså, ce conÆine înså numaiacele înregistråri din tabelul surså care îndeplinesc o condiÆie precizatå: au aceeaçivaloare pentru un anumit câmp.

2 Operatorul relaÆional Select nu trebuie confundat cu comanda SQL Select.

AngajaÆiCod-a Nume_prenume Cod_num Departament FuncÆia

1111 Ionescu Maria 2030361403457 Marketing Casier1112 Popescu Ion 1020260403456 Marketing Vânzator1113 Andronescu Ana 2040469402458 Salarizare Casier1114 Ene Magda 2050570403453 Salarizare Contabil

Nou1 Select from AngajaÆi where cod_num=1020260403456Cod-a Nume_prenume Cod_num Departament FuncÆia

1112 Popescu Ion 1020260403456 Marketing Vânzator

Nou2 Select from AngajaÆi where departament='Salarizare'Cod-a Nume_prenume Cod_num Departament FuncÆia

1113 Andronescu Ana 2040469402458 Salarizare Casier1114 Ene Magda 2050570403453 Salarizare Contabil

Nou3 Select from AngajaÆi where funcÆia='Casier'Cod-a Nume_prenume Cod_num Departament FuncÆia

1111 Ionescu Maria 2030361403457 Marketing Casier1113 Andronescu Ana 2040469402458 Salarizare Casier

Page 35: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 37

De exemplu, putem considera ca tabel surså tabelul AngajaÆi. Prin operaÆia select se potcrea noi tabele:

Tabelul Nou1. ConÆine o singurå înregistrare corespunzåtoare unui angajat care areun anumit cod numeric personal:

Select from AngajaÆi where Cod_num=1020260403456Tabelul Nou2. ConÆine mai multe înregistråri care corespund angajaÆilor din departa-mentul Salarizare:

Select from AngajaÆi where Departament='Salarizare'Tabelul Nou3. ConÆine mai multe înregistråri care corespund angajaÆilor care aufuncÆia de casier:

Select from AngajaÆi where FuncÆia='Casier'

2. ProiecÆia (Project). Operatorul se aplicå pe un tabel surså din care creeazå un tabelnou ce va conÆine numai câmpurile specificate din tabloul surså.

De exemplu, putem considera ca tabel surså tabelul AngajaÆi. Prin operaÆia project sepot crea noi tabele:

Tabelul Nou4. ConÆine douå câmpuri: Nume_prenume çi Cod_num:Project Nume_prenume, Cod_num from AngajaÆi

Tabelul Nou5. ConÆine douå câmpuri: Nume_prenume çi Departament:Project Nume_prenume, Departament from AngajaÆi

3. Compunerea (Join). Operatorul se aplicå pe douå tabele surså din care creeazå untabel nou astfel: din produsul cartezian al celor douå tabele se påstreazå numai înre-gistrårile care îndeplinesc o anumitå condiÆie.

Nou4Project Nume_prenume, Cod_num from AngajaÆiNume_prenume Cod_num

Ionescu Maria 2030361403457Popescu Ion 1020260403456Andronescu Ana 2040469402458Ene Magda 2050570403453

Nou5Project Nume_prenume, Departament from AngajaÆiNume_prenume Departament

Ionescu Maria MarketingPopescu Ion MarketingAndronescu Ana SalarizareEne Magda Salarizare

AngajaÆiCod-a Nume_prenume Cod_num Departament FuncÆia

1111 Ionescu Maria 2030361403457 Marketing Casier1112 Popescu Ion 1020260403456 Marketing Vânzator1113 Andronescu Ana 2040469402458 Salarizare Casier1114 Ene Magda 2050570403453 Salarizare Contabil

Page 36: SGBD Visual Foxpro

38 Informatică

Exemplu de operaÆie Join

De exemplu, departamentul Aprovizionare foloseçte urmåtoarele tabele:Tabelul Catalog materiale pentru evidenÆa materialelor cu care se poate faceaprovizionarea. ConÆine câmpurile: cod_material, denumire, unitate_måsurå.Tabelul Intråri pentru evidenÆa materialelor achiziÆionate. ConÆine câmpurile:cod_material, cantitate_intratå, tip_document, numår_document, data_intrårii.Tabelul Ieçiri pentru evidenÆa materialelor consumate. ConÆine câmpurile:cod_material, cantitate_ieçitå, tip_document, numår_document, data_ieçirii.

Pentru a obÆine stocul din fiecare material, trebuie calculatå pentru fiecare materialdiferenÆa dintre suma cantitåÆilor intrate çi suma cantitåÆilor ieçite. Pentru a putea executaaceastå operaÆie trebuie compuse cele douå tabele într-unul singur, condiÆia decompunere fiind egalitatea câmpurilor: intråri. cod_material = ieçiri. cod_material, adicå

Join intråri and ieçiri where intråri. cod_material = ieçiri. cod_material

Operatorii din algebra relaÆionalå pot fi folosiÆi pentru a formula diferite interogåri. Deexemplu, în baza de date a organizaÆiei:

Lista cu numele angajaÆilor din toate departamentele care au funcÆia 'casier'. În tabelulAngajaÆi se executå o operaÆie de selecÆie:

Select from AngajaÆi where FuncÆie='casier'

Tabel A ×× B (produs cartezian)Câmpuri→→ C1 C2 C3 C4 C5

RA1 1 a x 1 m RB1RA1 1 a x 2 n RB2RA1 1 a x 3 p RB3RA2 2 b y 1 m RB1RA2 2 b y 2 n RB2RA2 2 b y 3 p RB3

↑↑ Rândurile tabelului A Rândurile tabelului B↑↑

Tabel ACâmpuri→→ C1 C2 C3RA1 1 a xRA2 2 b y↑↑ Rândurile tabelului A

Tabel BCâmpuri→→ C4 C5RB1 1 mRB2 2 nRB3 3 p↑↑ Rândurile tabelului B

Tabel C Join A and B where A.C1=B.C4Câmpuri→→ C1 C2 C3 C4 C5

RA1 1 a x 1 m RB1RA2 2 b y 2 n RB2

↑↑ Rândurile tabelului A Rândurile tabelului B↑↑

Page 37: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 39

çi se obÆine tabelul Casieri care conÆine toÆi angajaÆii care au funcÆia de casier. Apoi petabelul astfel obÆinut se aplicå operaÆia de proiecÆie:

Project Nume_prenume, Departament from Casieriçi se obÆine în tabelul Casieri_departamente informaÆia doritå (lista cu numele persoa-nelor çi departamentul în care lucreazå).

Lista cu numele furnizorului, numele çi numårul de telefon al persoanei de contactpentru materialele care sunt sub stocul de siguranÆå, pentru a se putea comandaaceste materiale. În tabelul Stocuri se executå o operaÆie de selecÆie:

Select from Stocuri where stoc<=stoc_sigçi se obÆine tabelul SiguranÆå care conÆine toate materialele care sunt sub stocul desiguranÆå. Apoi pe tabelul astfel obÆinut se aplicå operaÆia de proiecÆie:

Project cod_material, denumire from SiguranÆåçi se obÆine tabelul Comenzi_materiale. Se compun tabelele Furnizori çi

Comenzi_materiale cu operaÆiaJoin Furnizori and Comenzi_materiale where

furnizori.cod_material = comenzi_materiale. cod_materialçi se obÆine tabelul Comanda. Apoi pe tabelul astfel obÆinut se aplicå operaÆia de proiecÆie

Project denumire, den_furnizor, nume_pers, telefon from Comandaçi se obÆine tabelul Comanda_furnizori care conÆine denumirea furnizorului, numelepersoanei de contact, numårul de telefon çi denumirea materialului pentru materialelecare sunt sub stocul de siguranÆå. Se poate verifica prin telefon dacå furnizorul poateprimi comanda de livrare pentru materialele care sunt sub stocul de siguranÆå.

TTest pentru evaluare:

Pornind de la tabelele A çi B, precizaÆi conÆinutul tabelului C obÆinut ca rezultat aloperaÆiei relaÆionale:

a) Project X,Z from Ab) Select from A where Y=1c) Project U from Bd) Select from B where V=2e) Join A and B where A.Y=B.V

TTest pentru evaluare:

Tabelul A conÆine informaÆii generale despre angajaÆi: nume angajat, adreså, numår detelefon. Tabelul B conÆine informaÆii despre ocuparea posturilor de cåtre angajaÆi: numeangajat, nume funcÆie, departament, data iniÆialå, data finalå. Ce operaÆii relaÆionaletrebuie så executaÆi ca så obÆineÆi informaÆiile:

a) Ce angajaÆi au ocupat postul X?b) Ce angajaÆi au lucrat în departamentul X?c) Ce posturi a ocupat angajatul X çi în ce departamente?d) Ce adrese au angajaÆii care au ocupat postul X din departamentul Y?

Tabelul AX Y Zm 1 an 2 bo 3 cp 1 d

Tabelul BU Vi 2j 4k 2

Page 38: SGBD Visual Foxpro

40 Informatică

În afara limbajelor care au la bazå algebra relaÆionalå (care folosesc interogåri exprimateprin operatori relaÆionali specifici aça cum este limbajul SQL), mai existå çi limbaje carese bazeazå pe calculul relaÆional (care exprimå interogårile prin intermediul condiÆiilorpe care trebuie så le îndeplineascå mulÆimea înregistrårilor care corespund cererii). Dinaceastå categorie face parte limbajul QBE (Query By Example - Interogare prinexemple) care este standardul prin care pot fi formulate interactiv interogårile bazei dedate folosind calculul relaÆional. De obicei limbajul QBE pune la dispoziÆia utilizatorului ointerfaÆå prin intermediul cåreia utilizatorul îçi poate asambla interogarea, incluzândoperatori pentru calculul:

sumei valorilor unui câmp din tabel - sum,mediei aritmetice a valorilor unui câmp din tabel - avg,celei mai mari valori a unui câmp din tabel - max,celei mai mici valori a unui câmp din tabel - min,numårului de înregistråri dintr-un tabel - cnt.

În sistemul de gestiune a bazelor de date Visual FoxPro interogårile se pot construi prinintermediul interfeÆei folosind interogarea prin exemple (QBE). În culise, acestecomenzi sunt transformate în instrucÆiuni SQL.

ÎncercaÆi:

AA nalizå. Så presupunem cå aveÆi o bazå de date formatå dintr-un tabel A çi o bazå dedate formatå din douå tabele B çi C. Tabelul A conÆine urmåtoarele câmpuri: nume angajat,funcÆie, departament. Tabelul B conÆine câmpurile nume angajat çi funcÆie, iar tabelul Ccâmpurile funcÆie çi departament. ComparaÆi cele douå baze de date. Ele conÆin aceleaçicategorii de date, dar nu sunt identice din punct de vedere al informaÆiilor pe care lefurnizeazå. AråtaÆi cum råspund cele douå baze de date la urmåtoarele cereri de informaÆii:

a) În ce departament lucreazå angajatul X.b) Care sunt angajaÆii dintr-un departament.c) Care sunt angajaÆii cu funcÆia X din departamentul Y.

Ce concluzie trageÆi? ReproiectaÆi cea de-a doua bazå de date astfel încât så poatåråspunde la aceste întrebåri.

AA nalizå. Så presupunem cå aveÆi o bazå de date formatå dintr-un tabel A çi o bazå dedate formatå din douå tabele B çi C. Tabelul A conÆine urmåtoarele câmpuri: nume angajat,funcÆie, departament, numår de telefon. Tabelul B conÆine câmpurile nume angajat çidepartament, iar tabelul C câmpurile funcÆie çi numår de telefon. ComparaÆi cele douå bazede date. Ele conÆin aceleaçi categorii de date, dar nu sunt identice din punct de vedere alinformaÆiilor pe care le furnizeazå. AråtaÆi cum råspund cele douå baze de date laurmåtoarele cereri de informaÆii:

a) Ce numår de telefon are angajatul X.b) Ce angajat are numårul de telefon Y.c) Care sunt angajaÆii cu funcÆia X din departamentul Y.

Page 39: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 41

Ce concluzie trageÆi? ReproiectaÆi cea de-a doua bazå de date astfel încât så poatåråspunde la aceste întrebåri.

MM iniproiect. Presupunând cå existå o companie care asigurå distribuÆia cåtreabonaÆi a mai multor publicaÆii, descrieÆi în ce mod vor putea fi reprezentate într-o bazå dedate relaÆionale (tabele çi relaÆii între tabele) urmåtoarele informaÆii referitoare la editori çiabonaÆi:

a) Existå mai multe edituri. InformaÆiile referitoare la o editurå sunt: nume, adreså,persoanå de contact, numår de telefon.

b) Fiecare editurå are mai multe publicaÆii. InformaÆiile referitoare la o publicaÆiesunt: nume, tip publicaÆie, preÆ.

c) Fiecårui abonat i se pot distribui mai multe publicaÆii. InformaÆiile referitoare la unabonat sunt: nume, adreså, numår de telefon.

AråtaÆi ce condiÆii trebuie îndeplinite pentru a fi asiguratå integritatea referenÆialå a bazeide date.

MM iniproiect. DescrieÆi în ce mod vor putea fi reprezentate într-o bazå de daterelaÆionalå (tabele çi relaÆii între tabele) urmåtoarele informaÆii referitoare la curseleaeriene dintr-o zi çi pasagerii acestor curse :

a) Existå mai multe linii aeriene, fiecare identificatå printr-un nume.b) Pe fiecare linie aerianå existå mai multe curse identificate printr-un nume.

Fiecare curså are o destinaÆie.c) Fiecare curså are o anumitå capacitate (numår de locuri) çi foloseçte un anumit

tip de avion.d) La fiecare curså existå mai mulÆi pasageri care rezervå locuri. Un pasager poate

rezerva mai multe locuri. Pasagerii se identificå dupå nume, iar locurile dupånumår.

AråtaÆi ce condiÆii trebuie îndeplinite pentru a fi asiguratå integritatea referenÆialå a bazeide date. VerificaÆi dacå baza de date råspunde la urmåtoarele interogåri (exprimaÆiinterogårile prin cei trei operatori relaÆionali):

a) Lista cu pasagerii de la cursa X.b) Locurile rezervate de pasagerul X la cursa Y.c) Tipul avionului folosit de cursa X.d) Lista curselor care aparÆin liniei aeriene X.e) Lista curselor care au destinaÆia X.

MM iniproiect. DescrieÆi în ce mod vor putea fi reprezentate într-o bazå de daterelaÆionalå (tabele çi relaÆii între tabele) urmåtoarele informaÆii referitoare la o bibliotecå:

a) Biblioteca este formatå din mai multe cårÆi, care aparÆin mai multor domenii deinteres pentru cititor. Domeniul se identificå prin cod çi nume.

b) Fiecare carte se identificå prin: cod carte, titlu, autor, editurå, an apariÆie, preÆ,cod domeniu.

c) Fiecare cititor se identificå prin: cod cititor, nume, adreså, telefon.

Page 40: SGBD Visual Foxpro

42 Informatică

d) CårÆile pot fi împrumutate de cititori. Pentru fiecare împrumut se Æin urmåtoareleevidenÆe: cartea împrumutatå, cititorul care a împrumutat-o, data împrumutului,data la care trebuie så o înapoieze, data la care a înapoiat-o.

AråtaÆi ce condiÆii trebuie îndeplinite pentru a fi asiguratå integritatea referenÆialå a bazeide date. VerificaÆi dacå baza de date råspunde la urmåtoarele interogåri (exprimaÆiinterogårile prin cei trei operatori relaÆionali):

a) Ce cårÆi a împrumutat cititorul X în perioada D.b) Lista cu cårÆile care sunt împrumutate la data D.c) Lista cu cårÆile care aparÆin unui autor X.d) Lista cu cårÆile din domeniul Y.e) Lista cu cårÆile din domeniul X apårute la editura Y.f) Lista cu cårÆile apårute în anul X la editura Y.

MM iniproiect. DescrieÆi în ce mod vor putea fi reprezentate într-o bazå de daterelaÆionalå (tabele çi relaÆii între tabele) urmåtoarele informaÆii referitoare la o agenÆie deturism:

a) AgenÆia organizeazå excursii sau sejururi de mai multe zile la diferite obiective turistice.b) Obiectivele turistice se identificå prin localitate çi aparÆin unui domeniu de interes.c) La un obiectiv turistic pot exista mai multe cåi de acces.d) Turistului i se asigurå cazare çi maså. Hotelurile se identificå prin nume, adreså

çi categorie, iar restaurantele prin nume çi adreså.e) Organizarea excursiei constå în a asigura turistului transportul, cazarea çi masa

pe o perioadå determinatå de timp.f) AgenÆia Æine evidenÆa turiçtilor, a excursiilor çi a sejururilor organizate pentru

aceçtia.AråtaÆi ce condiÆii trebuie îndeplinite pentru a fi asiguratå integritatea referenÆialå a bazeide date. VerificaÆi dacå baza de date råspunde la urmåtoarele interogåri (exprimaÆiinterogårile prin cei trei operatori relaÆionali):

a) Lista cu obiectivele turistice dintr-un judeÆ X.b) Lista cu hotelurile care pot fi folosite pentru a asigura cazarea la un obiectiv

turistic X.c) Lista cu rezervårile fåcute pe o perioadå de timp D la un hotel X.d) Lista cu turiçtii care vor merge în excursie într-o perioadå D la un obiectiv X.e) Turistul care a rezervat camera X din hotelul Y de la obiectivul turistic Z în data D.

Dacå este cazul, modificaÆi structura tabelelor din baza de date astfel încât baza de dateså poatå råspunde la aceste întrebåri.

MM iniproiect. Baza de date a unei çcoli este formatå din urmåtoarele tabele:Clase: cod_claså, profil_claså.Discipline: cod_disciplinå, denumire_disciplinå.Profesori: cod_profesor, nume_profesor, adreså, telefon.Elevi: cod_elev, cod_claså, nume_elev, adreså, telefon.PårinÆi: cod_elev, nume_pårinte, tip_pårinte, telefon.Note: cod_elev, cod_disciplinå, datå, notå.AbsenÆe: cod_elev, cod_disciplinå, datå.

Page 41: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 43

DiriginÆi: cod_profesor, cod_claså.Încadrare_discipline: cod_claså, cod_ disciplinå, numår_ore.Încadrare_profesori: cod_profesor, cod_disciplinå, cod_claså.

a) StabiliÆi legåturi între tabele.b) PrecizaÆi pentru fiecare legåturå tipul relaÆiei.c) IdentificaÆi pentru fiecare relaÆie cheia primarå çi cheia secundarå.d) AråtaÆi ce condiÆii trebuie îndeplinite pentru a fi asiguratå integritatea referenÆialå.e) FormulaÆi zece cereri de interogare a bazei de date.f) Ce date mai puteÆi adåuga la baza de date pentru a obÆine noi informaÆii?

TT est pentru evaluare:

AråtaÆi corespondenÆele:Prima grupå (1 ÷ 10) vå prezintå mai mulÆi termeni. A doua grupå (a ÷ j) vå prezintå afirmaÆii saudefiniÆii posibile pentru aceçti termeni. LegaÆi corespunzåtor obiectele din prima grupå cuobiectele din a doua grupå:1. baza de date 6. administratorul bazei de date2. înregistrarea 7. sistemul de gestiune a bazelor de date3. schema 8. relaÆia una-la-mai-multe4. redundanÆa datelor 9. independenÆa datelor5. dicÆionarul de date 10. modelul relaÆional de baze de date

a. ConÆine toate informaÆiile despre entitåÆile memorate în baza de date.b. Cel mai popular model de baze de date folosit pe microcalculatoare.c. Instrument software care faciliteazå crearea çi întreÆinerea bazelor de date.d. O persoanå sau un grup de persoane care coordoneazå çi controleazå toate

activitåÆile legate de baza de date a unei organizaÆii.e. O colecÆie de fiçiere çi înregistråri legate între ele.f. Unul dintre cele mai mari avantaje ale folosirii bazelor de date.g. O colecÆie de câmpuri care sunt legate logic.h. Descrierea întregii colecÆii de date din baza de date.i. Una dintre proprietåÆile datelor care creeazå deficienÆe mari colecÆiilor de fiçiere de

date.j. O înregistrare din primul tabel poate fi legatå de mai multe înregistråri din al doilea

tabel.

Adevårat/Fals:1. Un avantaj al folosirii fiçierelor de date este partajarea datelor între mai mulÆi utilizatori.2. Un avantaj al folosirii bazelor de date este asigurarea integritåÆii datelor.3. DicÆionarul de date descrie structura datelor din baza de date.

Clase Elevi Note AbsenÆe PårinÆi

Discipline Profesori DiriginÆi Încadrare_profesori

Încadrare_discipline

Page 42: SGBD Visual Foxpro

44 Informatică

4. Administratorul bazei de date asigurå consistenÆa datelor.5. Administratorul bazei de date asigurå controlul centralizat al datelor.6. Tabelul virtual (vizualizarea) este modelul datelor cu care opereazå utilizatorul.7. Çtergerea restricÆionatå înseamnå cå înregistrårile din tabelele conduse vor fi çterse

numai cu acordul utilizatorului.8. O relaÆie mai-multe-la-mai-multe poate fi descompuså în douå relaÆii una-la-una.9. Operatorul relaÆional Select se aplicå pe douå tabele pentru a obÆine un tabel nou, cu

înregistrårile din ambele tabele care au aceeaçi valoare a câmpului cheie în ambeletabele.

10. Limbajul SQL foloseçte interogarea prin exemple.

CompletaÆi:1. Câmpul care identificå unic o înregistrare din tabel se numeçte …………………,.2. Baza de date este o colecÆie de ……................. çi ................ legate între ele.3. Setul de date la care are acces un grup de utilizatori este descris prin .........................4. Cheia secundarå este folositå în tabelul ......................5. Mecanismul de propagare a cheilor asigurå ........................ dintre tabelele bazei de

date.6. Pentru a asigura condiÆia de integritate referenÆialå, mulÆimea valorilor cheii secunda-

re trebuie så fie ....................... mulÆimea valorilor cheii primare din care s-a propagat.7. Normalizarea este procesul de ................................. a unei structuri complexe prin

................................ ei în structuri mai simple, legate între ele.8. Proprietatea datelor care caracterizeazå cantitatea de date memoratå de mai multe

ori pe suportul de memorare se numeçte ............................. datelor.

AlegeÆi råspunsurile corecte:1. Care dintre urmåtoarele entitåÆi sunt caracteristice unei baze de date relaÆionale :

a) tabelulb) înregistrårilec) legåturile logice complexed) câmpurilee) structura de reÆea a tabelelor

2. Care dintre urmåtoarele operaÆii creeazå probleme într-un ansamblu de fiçiere de date :a) actualizarea datelorb) asigurarea independenÆei datelor faÆå de programec) redundanÆa datelor

3. Care dintre urmåtoarele nu sunt componente ale sistemului de gestiune a bazelor dedate:a) limbajul de manipulare a datelorb) dicÆionarul de datec) limbajul de interogared) sistemul de gestiune a fiçierelore) limbajul de descriere a datelorf) baza de date

4. DicÆionarul bazei de date nu furnizeazå informaÆii despre:a) locul în care se gåsesc datele din baza de dateb) dimensiunea spaÆiului de pe disc

Page 43: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 45

c) proprietarul unor seturi de date din baza de dated) modul în care pot fi folosite datele de cåtre utilizatorie) limitåri pentru a asigura securitatea çi confidenÆialitatea datelor

5. Dacå unele componente ale colecÆiei de date se înregistreazå de mai multe ori pesuportul de date, redundanÆa datelor:a) creçteb) scadec) nu se modificå

6. Administratorul bazei de date stabilieçte:a) drepturile de acces ale utilizatorilor la baza de dateb) programele de aplicaÆie folosite pentru baza de datec) sistemul de gestiune a bazelor de date folositd) modificarea structurii bazei de date

7. Utilizatorul bazei de date opereazå cu:a) tabelele bazei de dateb) colecÆia de fiçiere în care este memoratå baza de datec) vizualizårile

8. Operatorii relaÆionali Select, Project çi Join se pot folosi în limbajul de tip :a) SQLb) QBEc) gazdå

9. Pentru a extrage într-un tabel nou anumite câmpuri dintr-un tabel surså se foloseçteoperatorul relaÆional :a) Selectb) Projectc) Join

RåspundeÆi:1. De ce este necesar un administrator de baze de date?2. Care este deosebirea dintre schema generalå a bazei de date çi o schemå parÆialå?3. Ce este un sistem de gestiune a bazelor de date? Care este rolul såu?4. Care sunt cele mai importante avantaje ale unei baze de date?5. Care sunt cele mai importante dezavantaje ale unei baze de date?6. Ce este limbajul de interogare a unei baze de date?7. Ce înseamnå independenÆa datelor într-o bazå de date?8. Ce tipuri de limbaje pot fi folosite pentru interogarea unei baze de date relaÆionale?

RRåspunsuri:AråtaÆi corespondenÆele: 1-e; 2-g; 3-h; 4-i; 5-a; 6-d; 7-c; 8-j; 9-f; 10-b.Adevårat/Fals: 1-F; 2-A; 3-A; 4-F; 5-A; 6-A; 7-F; 8-F; 9-F; 10-F.CompletaÆi: 1- cheie de identificare; 2-înregistråri, fiçiere; 3- schema parÆialå; 4- condus; 5- legåtura;6-incluså în; 7-simplificare, divizarea; 8-redundanÆa.AlegeÆi råspunsurile corecte: 1-a,b,d; 2-b,c; 3-b,d; 4-b; 5-a; 6-a,d; 7-c; 8-a; 9-b.CondiÆiile sunt:

a) E := alfa <> " " and alfa <> "," and fa <> "."

Page 44: SGBD Visual Foxpro

46 Informatică

3. Tipuri de date folosite de sistemele de gestiune a bazelor de date relaţionaleÎn orice sistem de gestiune a bazelor de date sunt implementate urmåtoarele tipuri dedate:

tipul numerictipul alfanumerictipul logictipul pentru gestionarea timpuluitipul special

Pentru a asigura o mai mare flexibilitate în manipularea çi stocarea datelor, în sistemelede gestiune a datelor, ca çi în alte sisteme care permit prelucrarea datelor, suntimplementate subtipuri de date. Aceste subtipuri pot fi folosite pentru datele elementarestocate în memorie (variabilele de memorie) çi/sau pentru datele elementare stocate înmemoriile externe (câmpurile tabelelor care formeazå baza de date). Subtipurile de datediferå între ele prin modul de stocare a datelor çi prin domeniul de definiÆie al lor. Încontinuare, pentru a vå putea crea o imagine asupra varietåÆii de subtipuri de date pecare le puteÆi întâlni atunci când lucraÆi cu bazele de date, sunt prezentate subtipurileimplementate în sistemul de gestiune a bazelor de date Visual FoxPro.

În acest sistem structurile de date de tip tablou de memorie sunt neomogene.

Pentru operatorul de atribuire se foloseçte simbolul = :<nume>3 = <expresie>

De exemplu, n=n+100 înseamnå cå variabilei n i se atribuie valoarea expresiei n+100,adicå valoarea obÆinutå prin adåugarea numårului 100 la valoarea avutå anterioroperaÆiei de atribuire.

3.1. Tipul numericPentru manipularea informaÆiei numerice (numere reale sau întregi) existå urmåtoarelesubtipuri numerice:

Pentru variabilele de memorie existå un singur tip numeric, reprezentat în memoriainternå pe 8 octeÆi, care permite manipularea numerelor reale cu o precizie de 16 cifrezecimale.

Pentru câmpuri existå patru subtipuri numerice. Unele subtipuri au lungime fixå, altelepermit modificarea lungimii de cåtre utilizator:

Subtipul float (simplu) poate fi folosit pentru numerele reale. Reprezentarea sa înmemoria internå poate avea o lungime cuprinså între 1 octet çi 20 de octeÆi, în funcÆie dedeclaraÆia utilizatorului. Acesta trebuie så precizeze numårul total de caractere folosite

3 Numele unei variabile de memorie sau al unui câmp.

Page 45: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 47

pentru reprezentarea numårului (un caracter pentru semnul minus folosit de numerelenegative, numårul de cifre pentru partea întreagå, numårul de cifre pentru partea zecimalåçi un caracter pentru punctul folosit ca separator între partea întreagå çi partea zecimalå) çinumårul de caractere folosite numai pentru partea zecimalå. Deoarece numårul maxim deocteÆi este 20 (deci numårul maxim de caractere folosite pentru numår este 20), acestsubtip poate fi folosit pentru reprezentarea cu precizie scåzutå a numerelor raÆionale mici.

Subtipul double (dublu) poate fi folosit çi el pentru numerele reale. Reprezentareanumårului pe suportul de memorare se face în virgulå mobilå, dublå precizie (o metodåoptimå de reprezentare a numerelor reale) çi are o lungime fixå de 8 octeÆi. Acest subtippoate fi folosit pentru reprezentarea cu precizie måritå (pânå la 15 cifre zecimale) anumerelor reale foarte mari (pânå la ordinul 10308)4. Deoarece lungimea sa este fixå,pentru o bunå gestionare a spaÆiului de memorare nu se recomandå folosirea acestuisubtip pentru numere reale mici cu precizie scåzutå.

Subtipul integer (întreg) poate fi folosit numai pentru numerele întregi. Reprezentareanumårului pe suportul de memorare se face în binar pe o lungime fixå de 4 octeÆi,folosindu-se un bit pentru semn çi 31 de biÆi pentru numår. Deoarece 231 - 1 este egal cu2147483647, domeniul de definiÆie al acestui subtip este [-2147483648, 2147483647].

Subtipul currency (monetar) poate fi folosit pentru memorarea valorilor numericeexprimate în unitåÆi monetare. Înaintea numårului se introduce simbolul monetar ($).Poate fi folosit pentru date reale, cu o precizie de maxim 4 cifre zecimale çi cu valoricuprinse aproximativ în domeniul [-9×1014, 9×1014]5. Este specific domeniului contabil,pentru a se preveni erorile de rotunjire. Pentru reprezentarea sa se folosesc 8 octeÆi.

Operatorii matematici care pot fi aplicaÆi pe datele de tip numeric sunt:

MM = {+, -, *, /, **|^, %6}

Pentru operaÆia modulo se mai poate folosi çi funcÆia mod(a,b) care calculeazå restulîmpårÆirii lui a la b.

Operatorii relaÆionali care pot fi aplicaÆi pe datele de tip numeric sunt:

RR = {>, >=, <, <=, =, #|<>|!=7}

3.2. Tipul alfanumericÎn orice sistem de gestiune a bazelor de date sunt implementate subtipuri de date pentrureprezentarea informaÆiei alfanumerice (a textelor). Astfel:

Subtipul character (çir de caractere) poate fi folosit atât pentru variabilele de memo-rie, cât çi pentru câmpuri. Fiecare caracter este reprezentat pe suportul de memorare pe

4 Mai exact, numere din intervalul [-1,79769313486232×10308 ÷ 1,79769313486232×10308]5 Mai exact, numere din intervalul [-922337203685477,5808 ÷ 922337203685477,5807]6 Pentru operaÆia modulo prin care se calculeazå restul împårÆirii unui operand de tip numeric întreg la un al doilea operand de tip numeric întreg.7 Variante ale operatorului diferit.

Page 46: SGBD Visual Foxpro

48 Informatică

un octet, prin codul såu ASCII. Lungimea maximå a çirului de caractere este 254 decaractere. Lungimea çirului de caractere dintr-un câmp este fixå pentru întregul tabel çipoate fi stabilitå de cåtre utilizator pânå la maxim 254 de caractere. Lungimea çirului decaractere dintr-o variabilå de memorie este variabilå, în funcÆie de valoarea atribuitå datei.

Pentru constanta çir de caractere se pot folosi ambele tipuri de delimitatori: apostrof('Caracter') çi ghilimele ("Caracter").

Operatorii de concatenare care pot fi aplicaÆi pe datele de tip çir de caractere sunt:

CC = {+,-}

Operatorul + se numeçte operator de concatenare simplu, iar operatorul - se nu-meçte operator de concatenare special. Deosebirea dintre operatorul de concatenaresimplu çi operatorul de concatenare special este aceea cå cel de-al doilea operator mutåspaÆiile de la sfârçitul primului çir de caractere la sfârçitul çirului de caractere concatenat.

De exemplu:

'Pop ' + ' Ana' = 'Pop Ana'P o p + A n a = P o p A n a

'Pop ' - ' Ana' = 'Pop Ana 'P o p - A n a = P o p A n a

Operatorii relaÆionali care pot fi aplicaÆi pe datele de tip çir de caractere sunt:

RR = {>, >=, <, <=, =, ==, #|<>|!=, $}

Operatorul == (identic) va furniza rezultatul logic adevårat dacå cele douå çiruri decaractere sunt identice (conÆin exact aceleaçi caractere, inclusiv spaÆiile, în exact aceleaçipoziÆii). De exemplu, expresia 'abc' == 'abc' are valoarea adevårat, iar expresia'abc' == 'acb' are valoarea fals. Operatorul = (egal) comparå çirurile caracter cucaracter, de la stânga la dreapta, pânå când douå caractere comparate nu sunt egalesau pânå când se ajunge la sfârçitul celui de-al doilea çir. De exemplu, condiÆia"abc" = "ab" are valoarea adevårat, iar condiÆia "ab" = "abc" are valoarea fals.

Operatorul $ (inclus în) va furniza rezultatul adevårat dacå primul çir de caractere esteconÆinut de cel de-al doilea çir de caractere (primul çir este subçir în al doilea çir). Deexemplu, expresia 'abc' $ 'abcd' are valoarea adevårat, iar expresia 'abc' $ 'acbd' arevaloarea fals.

Subtipul memo poate fi folosit numai pentru câmpuri. Se recomandå pentru câmpurile încare se memoreazå çiruri de caractere ce au o lungime mai mare de 254 de caracteresau care au lungimi foarte diferite între ele, de la o înregistrare la alta. De exemplu, dacåîn baza de date a çcolii trebuie så se påstreze informaÆii despre cauzele exmatriculåriiunui elev, aceste informaÆii sunt texte de lungimi diferite, care pot avea çi lungimea 0pentru elevii care nu au fost exmatriculaÆi. Stabilirea unei lungimi optime pentru astfel decâmpuri este imposibilå. În aceste cazuri se preferå subtipul memo care permite o alo-

Page 47: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 49

care dinamicå pentru astfel de câmpuri a spaÆiului de memorare de pe disc, diferitå de laun câmp la altul, în funcÆie de necesitåÆile de la un moment dat. Memorarea caracterelordin fiecare câmp memo se face într-un fiçier asociat tabelului care conÆine câte o înregis-trare de lungime variabilå asociatå fiecårui câmp memo din tabel. Acest fiçier are exten-sia .fpt. În tabel, în câmpul memo se påstreazå pe 4 octeÆi doar adresa la care se gåseç-te înregistrarea asociatå în fiçier. Câmpurile de tip memo nu pot fi câmpuri cheie.

3.3. Tipul logicPentru tipul logic nu existå subtipuri. Tipul logic poate fi folosit atât pentru variabile de memo-rie, cât çi pentru câmpuri. Câmpurile care conÆin date de tip logic nu pot fi câmpuri cheie.

Tipul logic se numeçte logical. El se reprezintå folosind 1 octet de suport de memorie.MulÆimea constantelor logice este:

L = {.T., .F.};

Operatorii logici care pot fi aplicaÆi pe datele de tip logic sunt:

LL = {and, or, not|!}

Ordinea de evaluare a operatorilor logici este: not, and, or.

3.4. Tipul pentru gestionarea timpuluiÎn aplicaÆiile care gestioneazå un volum mare de date este important så se poatå urmårievoluÆia cronologicå a acestor date. Din aceastå cauzå orice sistem de gestiune abazelor de date are implementat tipul de date pentru gestionarea timpului. De exemplu,folosind subtipul Date se pot reprezenta date cuprinse între 1 ianuarie 100 çi 31decembrie 9999. În Visual FoxPro sunt implementate douå subtipuri de date pentrugestionarea timpului, atât pentru variabile de memorie, cât çi pentru câmpuri:

Subtipul date (data calendaristicå) permite memorarea datelor calendaristice cuprecizie de o zi, folosind 8 octeÆi: 4 pentru numårul anului, 2 pentru numårul lunii çi 2pentru numårul zilei. Fiecare cifrå a acestor numere se reprezintå în codul ASCII.

Pentru constanta datå calendaristicå se folosesc ca delimitatori parantezele acoladå.Între paranteze se scrie data. Formatul implicit pentru datå este: ll/zz/aa. Astfel constanta{01/25/01} specificå data 25 ianuarie 2001. Constanta datå calendaristicå vidå se preci-zeazå astfel: { / / } (câte douå spaÆii pentru fiecare numår). Datele invalide (dacånumårul zilei sau al lunii nu este corect) sunt considerate date vide.

Operatorii pentru date calendaristice care pot fi aplicaÆi pe datele de tip datå calenda-risticå sunt:

DD = {+, -}

Dacå notåm cu a primul operand, cu b al doilea operand çi cu c rezultatul, aceçtioperatori se aplicå astfel:

Page 48: SGBD Visual Foxpro

50 Informatică

Operator Tip a Tip b Tip c Executå Exemplu

++ D8 Î9 D incrementeazå data din operandul a cunumårul de zile din operandul b

{08/31/01}+1={09/01/01}

-- D Î D decrementeazå data din operandul acu numårul de zile din operandul b

{08/01/01}-1={07/31/01}

-- D D Î calculeazå diferenÆa în zile dintreprimul operand çi al doilea operand

{08/01/01}-{07/01/01}=31

Subtipul datetime (timp calendaristic) permite memorarea momentelor de timp dintr-ozi, cu o precizie de sutime de secundå, atât faÆå de data curentå, cât çi faÆå de momentulzero al sistemului FoxPro care este considerat data de 1 ianuarie 100. Se memoreazåfolosind 8 octeÆi: 4 octeÆi pentru data calendaristicå (memoratå sub formå de întreg carereprezintå numårul de zile scurse de la momentul zero FoxPro) çi 4 octeÆi pentru timp(memorat sub formå de întreg care reprezintå numårul de secunde scurse de la miezulnopÆii).

Çi pentru constanta timp calendaristic se folosesc ca delimitatori parantezele acoladå.Între paranteze se scriu data çi timpul în formatul ll/zz/aa oo:mm:ss [xM]10. oo reprezintåun numår format din douå cifre pentru orå: 00≤oo≤12 dacå se foloseçte împårÆirea zilei îndouå perioade AM (antemeridian) çi PM (postmeridian) sau 00≤oo≤24 în caz contrar. mmeste un numår format din douå cifre çi reprezintå numårul de minute (00≤mm≤59), iar sseste un numår format din douå cifre çi reprezintå numårul de secunde (00≤ss≤59).

Operatorii timp calendaristic ce pot fi aplicaÆi pe datele de tip timp calendaristic sunt:

TT = {+, -}

Dacå notåm cu a primul operand, cu b al doilea operand çi cu c rezultatul, aceçtioperatori se aplicå astfel:

Operator Tip a Tip b Tip c Executå Exemplu

+- T11 Î T incrementeazå timpul dinoperandul a cu numårul desecunde din operandul b

{08/31/01 01:01:10 AM}+10={08/31/01 01:01:20 AM}

-- T Î T decrementeazå timpul dinoperandul a cu numårul desecunde din operandul b

{08/31/01 01:01:10 AM}-5={08/31/01 01:01:5 AM}

-- T T Î calculeazå diferenÆa însecunde dintre primul

operand çi al doilea operand

{08/31/01 01:01:15 AM} -{08/31/01 01:01:10 AM} = 5

8 Tip datå calendaristicå.9 Tip întreg.10 Parantezele [ ] semnificå faptul cå este opÆional conÆinutul lor.11 Tip timp calendaristic;

Page 49: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 51

3.5. Tipul specialAcest tip de date este folosit numai pentru câmpurile din tabelele bazei de date çipermite stocarea unor entitåÆi create cu alte aplicaÆii (foi de calcul, imagini grafice,sunete etc.).

În Visual FoxPro se foloseçte numai tipul general (date generale) care permitepåstrarea în tabelele bazei de date a unor entitåÆi de tip document, foaie de calcul sauimagine. Aceste entitåÆi sunt considerate obiecte çi pot fi stocate în baza de datefolosind protocolul OLE de încapsulare çi legare a obiectelor. Ele trebuie så fie createcu o aplicaÆie OLE server. Memorarea obiectelor din câmpul general se face într-un fiçierasociat tabelului. În tabel, în câmpul general se påstreazå pe 4 octeÆi doar adresa la carese gåseçte obiectul. Câmpurile de tip general nu pot fi câmpuri cheie.

3.6. Proprietăţile câmpurilor bazei de dateAÆi våzut cå într-un câmp al bazei de date pot fi påstrate date elementare. Tipul sau subti-pul datei elementare stocate determinå tipul câmpului. Un câmp dintr-un tabel al bazei dedate mai are çi alte proprietåÆi pe lângå proprietatea datå de tipul datelor. Acestea sunt:

formatulmasca de introducereetichetavaloarea implicitåregula de validaretextul regulii de validareindexareavaloarea nulå

Formatul (format). Aceastå proprietate controleazå modul în care sistemul de gestiune abazelor de date afiçezå valoarea memoratå în câmp. Pentru fiecare tip sau subtip de datåexistå mai multe formate de afiçare.

Masca de introducere (input mask). Aceastå proprietate controleazå valorile datelorintroduse în câmp. Ea determinå numårul de poziÆii ale câmpului çi, pentru fiecare poziÆiedin câmp, tipul caracterului acceptat: numeric, alfabetic, alfanumeric, caracter special, unanumit caracter, orice caracter. Pentru caracterele alfabetice se poate stabili dacå suntlitere mici sau litere mari. Se mai poate stabili dacå introducerea datelor se face de lastânga la dreapta (pentru câmpurile aliniate la stânga, cum sunt de exemplu çirurile decaractere) sau de la dreapta la stânga (pentru câmpurile aliniate la dreapta, cum sunt deexemplu numerele întregi). O mascå de introducere specialå este masca password careafiçeazå pe ecran câte un asterisc pentru fiecare caracter introdus.

Eticheta (caption). Aceastå proprietate controleazå titlul afiçat pe ecran pentru câmp.Valoarea implicitå pentru aceastå proprietate este numele câmpului. Utilizatorul poateschimba aceastå valoare.

Page 50: SGBD Visual Foxpro

52 Informatică

Valoarea implicitå (default value). Aceastå proprietate controleazå iniÆializarea câmpu-lui. Prin ea se poate stabili valoarea iniÆialå atribuitå unui câmp la adåugarea uneiînregistråri în tabel. De exemplu, pentru câmpurile de tip datå calendaristicå se poatestabili ca valoare iniÆialå data curentå, iar pentru câmpurile logice valoarea true.

Regula de validare (validation rule). Aceastå proprietate controleazå valorile datelorintroduse în câmp. Regula de validare se exprimå printr-o condiÆie logicå, ce trebuie såaibå valoarea true dupå ce se introduce valoarea câmpului. Regula de validare se poateaplica la nivel de:

câmp, çi anume se verificå dacå valoarea introduså pentru câmp se încadreazåîntr-un anumit interval de valori sau într-o anumitå mulÆime de valori. Aceastå validarese declançeazå la introducerea sau modificarea valorii câmpului.înregistrare, çi anume se verificå dacå valoarea introduså pentru câmp respectå anu-mite corelaÆii cu valorile altor câmpuri din înregistrare. Aceastå validare se declançea-zå dupå validarea la nivel de câmp, în urma introducerii sau modificårii valorii unuicâmp sau a çtergerii valorii câmpului. Nu se declançeazå dacå se çterge toatåînregistrarea. În expresia din condiÆia de validare pot fi folosite çi funcÆii de sistem saudefinite de utilizator.

Textul regulii de validare (validation text). Aceastå proprietate controleazå textul afiçatîn cazul în care datele introduse în câmp nu respectå regula de validare (în cazul în carecondiÆia logicå pentru validare are valoarea false dupå introducerea valorii câmpului). Deobicei, prin acest text i se explicå utilizatorului regulile de validare pe care trebuie så lerespecte datele introduse în câmp.

Indexarea (index). Aceastå proprietate controleazå dacå acel câmp este folosit pentruindexare. Indexarea este o tehnologie utilizatå de sistemele de gestiune a bazelor dedate care permite ordonarea logicå, dupå un anumit criteriu, a înregistrårilor dintr-untabel, la exploatarea sau vizualizarea datelor din tabel, fårå så fie afectatå ordinea fizicåa înregistrårilor din tabel (ordinea în care sunt scrise). Câmpul devine cheie de indexare.

Valoarea nulå (NULL). Aceastå proprietate controleazå dacå în câmp a fost memoratåsau nu o valoare nulå (NULL). Aceastå proprietate este utilå pentru a putea facedeosebirea dintre un câmp în care utilizatorul nu a introdus date çi un câmp în careutilizatorul a introdus o datå neutrå pentru acel tip de datå, cum ar fi: 0 pentru datelenumerice, çirul vid - çirul de caractere de lungime zero ("") - pentru datele alfabetice, falsepentru datele logice sau data vidå ({ / / }) pentru datele de tip datå calendaristicå. Deexemplu, dacå aÆi declarat câmpul telefon numeric, respectiv çir de caractere, valoareaNULL indicå faptul cå nu se cunosc detalii despre numårul de telefon al acelei persoane,iar valoarea 0, respectiv çirul vid aratå cå acea persoanå nu are telefon.

3.7. Crearea unei variabile de memorie în Visual FoxProO variabilå de memorie se creeazå atribuind o valoare numelui variabilei. Valoarea poatefi precizatå printr-o constantå, prin numele unei alte variabile de memorie sau printr-oexpresie. Tipul datei atribuite determinå tipul variabilei.

De exemplu, prin operaÆia de atribuire a=2 s-a creat variabila de memorie a de tipnumeric. Urmåtoarea operaÆie de atribuire a=2=3 schimbå tipul variabilei de memorie a,deoarece noua valoare atribuitå este de tip logic (rezultatul operaÆiei de comparare 2=3).

Page 51: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 53

Adresarea indirectåUnele comenzi sau funcÆii Visual FoxPro cer så li se furnizeze un nume, cum ar fi:numele unui fiçier bazå de date, numele unui câmp, numele unui alias, numele unui fiçierindex, numele unei variabile de memorie, numele unui tablou de memorie etc. Folosindadresarea indirectå, numele poate fi furnizat prin intermediul unei variabile de memoriesau al unui tablou de memorie, astfel încât så se poatå generaliza comanda.

Pentru adresarea indirectå se poate folosi macrosubstituÆia: se memoreazå numeleîntr-o variabilå de memorie, dupå care poate fi substituit într-o comandå sau într-o funcÆieprin numele variabilei de memorie sau al elementului de tablou, precedat de semnul &(ampersand):

&<nume_variabilå_de memorie>sau

&<nume_variabilå_de memorie>.<x>unde <x> este o expresie de tip çir de caractere. În acest caz, çirul de caractere x va ficoncatenat cu numele memorat în variabila de memorie.

Pentru adresarea indirectå se mai poate folosi çi expresia nume: se memoreazånumele într-o variabilå de memorie dupå care poate fi substituit într-o comandå sau într-ofuncÆie prin numele variabilei de memorie sau al elementului de tablou, închis întreparanteze rotunde:

(<nume_variabilå_de memorie>)

EvaluaÆi expresii

VeÆi evalua mai multe tipuri de expresii folosind aplicaÆia Visual FoxPro. În expresii veÆifolosi çi variabile de memorie.

DeschideÆi fereastra aplicaÆiei Visual FoxPro. În fereastra aplicaÆiei este deschiså ofereastrå document care are numele Command. Aceasta este fereastra de comenzi încare puteÆi så editaÆi diferite comenzi.

Pentru început veÆi scrie diferite comenzi pentru evaluarea unor expresii. Pentru a cereevaluarea unei expresii veÆi scrie înaintea ei semnul ? care semnificå operaÆia deafiçare. Rezultatul evaluårii va fi afiçat în spaÆiul liber al ferestrei de aplicaÆie.

1. EvaluaÆi expresia:

3)( baca

acdb

cbaE

++

+++

++

=

pentru a=1, b=2, c=3 çi d=3.VeÆi folosi cinci variabile de memorie a, b, c, d, çi e. AtribuiÆi valori primelor patruvariabile de memorie. ScrieÆi patru operaÆii de atribuire, câte una pe fiecare rând.TerminaÆi fiecare operaÆie de atribuire apåsând tasta Enter.

Page 52: SGBD Visual Foxpro

54 Informatică

a=1b=2c=3d=4

AtribuiÆi variabilei de memorie e valoarea expresiei. ScrieÆi pe un rând operaÆia deatribuire çi apåsaÆi la sfârçit tasta Enter.

e=(a+b)/c + (b+d)/(c+a)+(a+c)/((a+b)**3)AfiçaÆi valoarea variabilei de memorie e. ScrieÆi pe un rând comanda çi apåsaÆi lasfârçit tasta Enter:

?eÎn fereastra aplicaÆiei va fi afiçatå valoarea 2.65.

2. EvaluaÆi urmåtoarele expresii pentru x=2, a=1, b=2 çi c=3

3

2

3

22

32

2

3

1

2

3)()(4

)()1)(3(

1

abcaabc

bca

E

baab

baaE

xxxx

E

+++=

+++

=

−−−

=

3. ComparaÆi douå date calendaris-tice: 2 ianuarie 2001 cu 1 februarie2001:

? {01/02/01} > {02/01/01}.F.

4. EvaluaÆi expresia logicå:

e = a and b or (not a or not b)

pentru a=.T. çi b=.T. çi pentru a=.F. çib=.F.

a=.T.b=.T.e=a and b or (not a or not b)? e

.T.a=.F.b=.F.

Fereastra de comenzi. AiciscrieÆi comenzile.

?? ⇒ afiçeazå

Aici se afiçeazårezultatul evaluårii.

Page 53: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 55

e= a and b or (not a or not b)? e

.T.

ObservaÆi cå dupå fiecare operaÆie deatribuire pentru variabilele de memorie açi b s-a executat o nouå operaÆie deatribuire pentru expresia e, pentru caexpresia så fie evaluatå cu noile valoriale variabilelor a çi b.

5. VerificaÆi dacå valoarea numåruluireal x aparÆine mulÆimii A =(0,10]∪{30} pentru x=50 çi pentrux=5. Pentru fiecare valoare veÆitesta dacå x aparÆine sau nu lamulÆimea A. Pentru apartenenÆå veÆievalua expresia logicå:

e = (x>0 and x<=10) or x=30

iar pentru a verifica dacå nu aparÆineveÆi evalua expresia logicå not e.

x=50e=(x>0 and x<=10) or x=30? e

.F.? not e

.T.x=5e=(x>0 and x<=10) or x=30? e

.T.? not e

.F.

6. ConcatenaÆi douå çiruri de carac-tere 'Ion ' çi 'Maria ':

a='Ion 'b='Maria '? a + b + '!'

Ion Maria !? a - b + '!'

IonMaria !

7. ComparaÆi douå çiruri de caractere:

a='123'b='12 '? a<b

.F.? a=b

.T.? a>b

.F.? a==b

.F.? a$b

.F.? b$a

.T.b='abc '? a<b

.T.

8. AplicaÆi diferiÆi operatori asupradatelor calendaristice. AdåugaÆi 2zile la data de 10 februarie 2001 çiobÆineÆi data de 12 februarie 2001,scådeÆi 10 zile din data de 1ianuarie 2001 çi obÆineÆi data de 22decembrie 2000 çi calculaÆi diferen-Æa de zile între datele 1 ianuarie2001 çi 22 decembrie 2000.

? {02/10/01}+202/12/01

? {01/01/01}-1012/22/00

? {01/01/01}-{12/22/00}10

9. FolosiÆi macrosubstituÆia. MemoraÆiîn variabila a valoarea 1 çi în varia-bila b numele variabilei a.

a=1b=’a’? b

a? a

1? &b

1

MacrosubstituÆia &b afiçeazå conÆinutulvariabilei a al cårei nume este memoratîn variabila b, adicå valoarea 1.

10. FolosiÆi macrosubstituÆia. MemoraÆiîn variabila a valoarea alfa:

a=’alfa’alfa1=’Caldura ’alfa2=’mare ’

Page 54: SGBD Visual Foxpro

56 Informatică

alfa3=’monser! ’? &a.1+&a.2+&a.2

Caldura mare monser!

MacrosubstituÆia &a.1+&a.2+&a.3 afi-çeazå çirul de caractere Caldura maremonser! Se afiçeazå acest çir decaractere deoarece &a.1 are urmå-toarea semnificaÆie: numele memorat învariabila a se concateneazå cu carac-terul 1, adicå ‘alfa’+’1’ çi se obÆinenumele de variabilå de memorie alfa1.

Açadar &a.1 înseamnå conÆinutulvariabilei de memorie alfa1, adicå çirulde caractere Caldura. În acelaçi mod,&a.2 înseamnå conÆinutul variabilei dememorie alfa2, adicå çirul de caracteremare, iar &a.3 înseamnå conÆinutulvariabilei de memorie alfa3, adicå çirulde caractere monser!. Expresia înseam-nå de fapt concatenarea acestor treiçiruri de caractere.

ÎncercaÆi:

Adevårat/Fals:1. Visual FoxPro acceptå pentru numere întregi subtipul longinteger.2. Operatorul relaÆional != folosit în Visual FoxPro se numeçte operatorul „diferit“.3. Operatorul relaÆional $ se foloseçte pentru a verifica dacå valoarea unei expresii este

cuprinså între douå valori v1 çi v2.4. Subtipul memo poate fi folosit în Visual FoxPro pentru çiruri de caractere care au o

lungime mai mare de 254 de caractere.5. Subtipul datetime se reprezintå în Visual FoxPro pe 16 octeÆi.6. Valoarea nulå este o proprietate a câmpului care controleazå dacå într-un câmp nu

s-a introdus nici o datå.7. Câmpurile care în Visual FoxPro au tipul general pot fi câmpuri cheie.8. MacrosubstituÆia este o metodå folositå pentru a defini proprietatea unui câmp.

CompletaÆi:1. Operatorul $ folosit în Visual FoxPro se numeçte ………………… çi se aplicå pe

date de tip .......................................2. Subtipul Date poate fi folosit pentru a reprezenta date calendaristice cuprinse între

..................... çi ..................3. Operatorii care pot fi folosiÆi pentru subtipul Datetime sunt: ................4. În Visual FoxPro constanta de tip datå calendaristicå se delimiteazå folosind

caracterele ........5. Expresia nume se foloseçte pentru ...........................

AlegeÆi råspunsul corect:1. Dacå trebuie så memoraÆi într-un câmp al unei baze de date Visual FoxPro media generalå

a unui elev, veÆi alege un câmp numeric cu subtipul:a) simplu b) dublu c) monetar

2. Dacå folosiÆi subtipul numeric simplu pe 4 octeÆi pentru reprezentarea unui numår întregîntr-o bazå de date Visual FoxPro, valoarea maximå pe care o veÆi putea reprezentaeste:

Page 55: SGBD Visual Foxpro

Identificarea i clasificarea unor tipuri de structuri de date 57

a) 24 -1 b) 9999 c) 2147483646

3. Rezultatul expresiei 3^2*35%5**2 este:a) 0.00 b) 15.00 c) 3.00

4. Reprezentarea subtipului float folosit pentru câmpurile numerice din Visual FoxPro arelungimea de:

a) 1 octet b) 20 octeÆi c) cuprinså între 1 octet çi 20 de octeÆi

5. Reprezentarea subtipului integer folosit pentru câmpurile numerice din Visual FoxProare lungimea de:

a) 4 octeÆi b) 8 octeÆi c) 16 octeÆi

6. Operatorul folosit în Visual FoxPro pentru operaÆia modulo este :a) MOD b) \ c) %

7. În Visual FoxPro numårul maxim de caractere dintr-un çir de caractere este:a) 254 b) 255 c) 256

8. În Visual FoxPro rezultatul evaluårii expresiei 12 + {08/15/01} - {07/15/01} = 43 este:a) .T. b) .F. c) eroare

9. În Visual FoxPro operatorul ! este un operator:a) relaÆional b) logic c) de concatenare

RåspundeÆi:1. Ce subtipuri numerice se folosesc pentru câmpurile din Visual FoxPro?2. În Visual FoxPro ce operatori relaÆionali se folosesc în plus pentru datele de tip çir de

caractere faÆå de cele de tip numeric?3. Ce operatori de concatenare se folosesc în Visual FoxPro? Care este deosebirea

dintre ei?4. Pentru ce tip de date a fost implementat subtipul memo? În ce caz se recomandå

folosirea lui?5. Ce subtipuri de date se folosesc în Visual FoxPro pentru gestionarea timpului?6. Pentru ce se foloseçte tipul de date general în Visual FoxPro?7. Ce este valoarea nulå a unui câmp?8. Care sunt proprietåÆile câmpurilor dintr-o bazå de date?9. Ce este regula de validare? La câte niveluri se poate aplica?

RRåspunsuri:Adevårat/Fals: 1-F; 2-A; 3-F; 4-A; 5-F; 6-A; 7-F; 8-F.CompletaÆi: 1-inclus în, çiruri de caractere; 2-1 ianuarie 100, 31 decembrie 9999; 3-+,-; 4-{ };5-adresarea indirectå.AlegeÆi råspunsul corect: 1) a; 2) b; 3) b; 4) c; 5) a; 6) c; 7) a; 8) a; 9) b.

Page 56: SGBD Visual Foxpro

Utilizarea unorinstrumente de

prelucrare a datelorBaza de date relaÆionalå este un instrumentcomplex de organizare a datelor. Ea este forma-tå nu numai din datele care reprezintå informaÆiapropriu-ziså (datele din tabele), dar çi de multedate ajutåtoare necesare pentru descrierea struc-turii tabelelor çi a relaÆiilor dintre tabele, pentruregåsirea çi interpretarea datelor, astfel încât såvå poatå oferi acces la o mare cantitate de infor-maÆii care så vå ajute så luaÆi decizii. Pentru ad-ministrarea ei este necesar un software speci-alizat numit sistem de gestiune a bazelor dedate. Termenul de bazå de date se referå la mo-delul de organizare a datelor pe suportul de me-morare, iar termenul de gestiune se referå laacÆiunea de stocare çi prelucrare a acestor date.Deja aÆi putut vedea ce tipuri de date se folosesc

într-un sistem de gestiune a bazelor de date. Acesta a fost primul pas pentru a înÆelegecomplexitatea unui sistem de gestiune a bazelor de date.

Orice sistem de gestiune a bazelor de date trebuie så asigure urmåtoarele funcÆiielementare:

definirea bazei de date,actualizarea datelor din baza de date prin:

adåugarea de noi înregistråri,çtergerea unor înregistråri,modificarea valorii unor câmpuri din înregistråri;

interogarea bazei de date (extragerea informaÆiilor din baza de date).

La aceste funcÆii elementare, pe måsura dezvoltårii sistemelor de gestiune a bazelor dedate s-au mai adåugat çi alte funcÆii, dintre care cele mai importante sunt:

generarea formularelor de ecran pentru introducerea datelor,generarea rapoartelor,

Dupå ce veÆi parcurge acest capitoltrebuie så çtiÆi:

1. Så lucraÆi cu interfaÆa unei aplicaÆiispecifiå pentru gestiunea bazelor dedate.

2. Så creaÆi o bazå de date definindtabelele çi relaÆiile dintre ele.

3. Så executaÆi prin intermediulinterfeÆei operaÆii specifice gestiuniibazelor de date relaÆionale: actua-lizarea (adåugarea, çtergerea çimodificarea înregistrårilor), sortarea,consultarea, cåutarea, sortarea.

4. Så obÆineÆi informaÆii din baza dedate sub formå de rapoarte, intero-gåri çi vizualizåri.

Capitolul 2

Page 57: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 59

noi modalitåÆi de interogare a bazelor de date (de exemplu folosind unlimbaj neprocedural cum este SQL).

Pe microcalculatoare au fost implementate mai multe tipuri de sisteme de gestiune abazelor de date:

dBase II, III, III+, IV au fost realizate de firma Ashton-Tate. Ele au deÆinut supremaÆiamulÆi ani çi au impus un standard în domeniul bazelor de date relaÆionale, astfel încâtsistemele dezvoltate ulterior, cum este çi sistemul FoxPro, au preluat çi dezvoltatacest standard. Deoarece bazele de date dBase au înmagazinat un volum foartemare de date, pentru a nu se pierde aceste date çi pentru a le putea folosi ulterior cuajutorul aplicaÆiilor create cu alte sisteme de gestiune a bazelor de date, toate noilesisteme de gestiune a bazelor de date pentru microcalculatoare, dacå nu folosescstandardul dBase, au implementatå facilitatea de import al bazelor de date dBase.Clipper a fost creat de firma Nantucket çi respectå standardul dBase.Paradox creat de firma Borland a fost ulterior cumpårat de firma Corel çi integrat însetul software creat de aceastå firmå. Nu respectå standardul dBase.FoxPro a fost creat de firma FoxSoftware çi a fost cumpårat ulterior de firmaMicrosoft. Este sistemul de gestiune a bazelor de date care s-a impus cel mai mult înultima vreme pe microcalculatoare.Access a fost creat de firma Microsoft çi integrat în setul Microsoft Office. Nurespectå standardul dBase, dar poate importa baze de date dBase.

Dintre sistemele de gestiune a bazelor de date folosite pe microcalculatoare veÆi studiaaplicaÆia Visual FoxPro, deoarece este cea mai nouå versiune a sistemului de gestiune abazelor de date FoxPro. Termenul visual înseamnå cå aplicaÆia dispune de instrumentelefolosite de programarea vizualå. În aceastå tehnicå de programare, programatorii au ladispoziÆie programe utilitare care scriu singure secvenÆa de instrucÆiuni necesare pentrurealizarea unor operaÆii. Rolul programatorului se reduce la specificarea unor opÆiuni(valoarea unor parametri) în cadrul unui dialog interactiv cu programul utilitar.

1. Interfaţa aplicaţiei Visual FoxPro

1.1. Prezentarea sistemului de gestiune a bazelor de date FoxPro Sistemul de gestiune a bazelor de date FoxPro este cel mai råspândit produs de acesttip pentru microcalculatoare deoarece:

Este orientat pe standardul dBase, ceea ce a permis preluarea bazelor de dateexploatate prin acest sistem. Sunt baze de date care au fost create acum câÆiva anifolosind sistemul de gestiune a bazelor de date dBase. S-a consumat mult timp pentruîncårcarea lor çi preluarea datelor elementare într-un nou format de bazå de daterelaÆionalå, cum este FoxPro, se poate face simplu, fårå pierderea datelor.Asigurå compatibilitatea cu versiunile anterioare çi cu produsele dBase.Poate fi folosit sub diverse sisteme de operare: MS-DOS, Windows, Unix,MacIntosh. Deosebirea de la un sistem de operare la altul apare doar în interfaÆå çistructura meniului. Aceste deosebiri sunt uçor de depåçit, deoarece înseamnå de faptreadaptarea la interfaÆa noului sistem de operare.

Page 58: SGBD Visual Foxpro

Informatică 60

Permite o adaptare uçoarå la lucrul cu mai mulÆi utilizatori, fårå så necesite imple-mentarea unei variante speciale pentru lucrul în reÆea.Are implementat conceptul de colecÆie de date definitå ca un depozit cu informaÆiidespre tabele, care permite folosirea numelor lungi pentru tabele çi pentru câmpuri çiimplementarea integritåÆii referenÆiale direct în tabelele bazei de date în loc så fiedescriså în programele de aplicaÆie.Permite comunicarea çi cu alte aplicaÆii folosind mecanisme DDE, cum este deexemplu, comunicarea cu aplicaÆia Excel. Orice modificare fåcutå într-o foaie decalcul Excel se va reflecta çi în tabelul bazei de date FoxPro.Are implementat protocolul OLE care permite schimbul de date între aplicaÆii dife-rite. AplicaÆiile FoxPro sunt aplicaÆii client çi în ele pot fi legate çi încapsulate diferiteobiecte produse de aplicaÆiile server: texte, sunete, imagini, foi de calcul.Permite importul çi exportul diferitelor tipuri de date påstrate în diferite formate defiçiere: Access, dBase, Paradox, Oracle, Excel etc.Dispune de un limbaj procedural puternic ce permite descrierea datelor çi a aplica-Æiilor pe baza modelului programårii structurate, în care orice algoritm de rezolvare aunei probleme poate fi descris cu ajutorul a trei structuri de control: liniarå, alternativå,repetitivå.Are implementat pentru interogarea bazei de date, pe lângå limbajul propriu, atât limbajulde interogare de tip SQL, cât çi limbajul de tip QBE (interogarea prin exemple,exemplele fiind create interactiv prin diferite obiecte puse la dispoziÆie de interfaÆå). Acestelimbaje uçureazå folosirea sistemului de cåtre utilizatorii neinformaticieni.Începând cu versiunea 3.0, în limbajul FoxPro este implementat çi modelul programåriiorientate pe obiecte. Dacå în programarea clasicå datele çi programele care le pre-lucrau erau separate, în programarea orientatå pe obiecte programul este definit ca unobiect care înglobeazå atât ansamblul de date, cât çi algoritmii care prelucreazå acestedate. În cadrul algoritmilor se foloseçte în continuare modelul programårii structurate.Limbajul de programare propriu sistemului de gestiune a bazelor de date FoxPro areimplementat çi modelul programårii conduse de evenimente. În cadrul acestui model,programul este considerat un ansamblu de proceduri care nu se executå într-o ordinedescriså de programator, ci numai atunci când apar în sistem anumite evenimente. Unexemplu de astfel de eveniment este apåsarea unei combinaÆii de taste, care se poateproduce în orice moment în sistem çi nu la momente determinate de programator.Permite programarea vizualå a aplicaÆiilor. Acest tip de proiectare oferå programatori-lor posibilitatea de a realiza mai simplu aplicaÆii de exploatare a bazelor de date,deoarece ei nu mai sunt obligaÆi så precizeze cum trebuie realizatå aplicaÆia (sådescrie algoritmul de rezolvare a problemei), ci ce trebuie så realizeze aplicaÆia.Pentru aceasta, FoxPro pune la dispoziÆia utilizatorilor diferite instrumente vizualenumite generatoare sau constructori. Acestea sunt programe care permitproiectarea interactivå a bazelor de date, a interogårilor, a rapoartelor, a elementelorde interfaÆå (formulare de introducere a datelor, meniuri, ferestre), a aplicaÆiilor çi aproiectelor. În plus, utilizatorul poate apela çi la procedurile asistent (wizard) care îlîndrumå interactiv, pas cu pas în construirea acestor elemente. Elementul va fi realizatpe baza datelor furnizate de cåtre programator în cadrul dialogului interactiv.Are o vitezå de lucru foarte mare, deoarece foloseçte o tehnologie specialå denumitåtehnologie Rushmore care reduce timpul de acces la date prin optimizarea interogårilor.

Page 59: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 61

1.2. Moduri de lucru în Visual FoxPro Sistemul de gestiune a bazelor de date Visual FoxPro permite douå moduri de lucru:

modul de lucru interactiv,modul de lucru programat.

1.2.1. Modul de lucru interactivModul de lucru interactiv se poate desfåçura çi el în douå moduri:

prin intermediul interfeÆei grafice,prin intermediul limbajului de comandå.

InterfaÆa graficåInterfaÆa graficå este de tip MDI (interfaÆå cu mai multe documente), adicå în fereastraaplicaÆiei pot fi deschise mai multe ferestre document. Ea este compatibilå cu interfaÆa detip Microsoft Office (meniurile, barele de instrumente, scurtåturile de la tastaturå).

Fereastra aplicaÆiei prezintå un sistem de meniuri care pun la dispoziÆia utilizatoruluimarea majoritate a comenzilor care formeazå limbajul de comandå. În general, opÆiuneade meniu reprezintå verbul comenzii, iar adverbele sunt precizate prin intermediulcontroalelor din caseta de dialog. Comenzile, în funcÆie de modul în care pot acÆiona, suntgrupate în meniuri. Astfel:

File conÆine opÆiuni pentru operaÆii cu fiçiere: creare, deschidere, salvare, tipårire. MaiconÆine çi opÆiunea pentru închiderea aplicaÆiei Visual FoxPro: Exit.

Titlurile meniurilor Barele cu instrumente

Meniul Edit conÆine operaÆiilepentru editarea textelor, inclusiv acomenzilor din fereastra documentCommand.

În fereastra Command puteÆi så editaÆicomenzile. Pentru editare puteÆi folosi aceleaçitehnici ca çi în cazul editoarelor de texte.

Page 60: SGBD Visual Foxpro

Informatică 62

Edit conÆine opÆiuni pentru editarea textelor: operaÆii de selectare, operaÆii de copiere(Cut, Copy, Paste), operaÆii de cåutare çi înlocuire (Find çi Replace), inserarea saulegarea obiectelor.View conÆine opÆiuni pentru modificarea obiectelor afiçate în fereastra aplicaÆiei. Ceamai importantå opÆiune este Toolbars... care vå permite så alegeÆi barele cuinstrumente care vor fi afiçate.Format conÆine opÆiuni pentru formatarea textelor afiçate în ferestrele document aleaplicaÆiei (fontul, dimensiunea çi stilul caracterelor, indentarea çi spaÆiul dintre liniileparagrafelor).Tools conÆine opÆiuni prin care puteÆi alege diferite instrumente: proceduri asistent,editorul de macrocomenzi, ferestrele pentru depanarea programului (Debug) saupentru executarea pas cu pas a programului (Trace).Program conÆine opÆiuni pentru compilarea çi executarea programelor.Window conÆine opÆiuni pentru operaÆii cu ferestrele document: aranjarea ferestrelor(Arrange All), ascunderea ferestrei active (Hide), çtergerea ferestrei active (Clear),comutarea între ferestre (Cycle), deschiderea ferestrei de comenzi (CommandWindow), deschiderea ferestrei pentru vizualizarea tabelelor din baza de datedeschiså çi a legåturilor dintre tabele (View Window).Help conÆine opÆiuni pentru asigurarea asistenÆei utilizatorului.

Sistemul de meniuri este dependent de context. În funcÆie de operaÆiile care se executå,mai pot så aparå meniurile:

Titlul meniului Database este afiçat în bara de meniuri numai dacå în fereastra aplicaÆieieste deschiså o fereastrå document de tip bazå de date în care sunt afiçate tabelele

bazei de date çi relaÆiile dintre ele.

Page 61: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 63

Table conÆine opÆiuni pentru manipularea înregistrårilor din tabel: adåugarea de noiînregistråri - Append New Record çi Append Records..., marcarea pentru çtergere aînregistrårilor (çtergerea logicå) - Delete, refacerea înregistrårilor çterse logic - Recall¸çtergerea fizicå a înregistrårilor marcate pentru çtergere - Remove Deleted Records,poziÆionarea pe o înregistrare din tabel - Go to Record..., înlocuirea valorilor unorcâmpuri cu alte valori - Replace Field..., actualizarea indexului tabelului pentru areflecta situaÆia actualå - Rebuild Indexes etc. Meniul mai conÆine çi opÆiuni pentrustabilirea proprietåÆilor tabelului (Properties...) çi pentru alegerea fontului, adimensiunii çi a stilului caracterelor cu care se afiçeazå datele din tabel (Font...) etc.Database conÆine opÆiuni pentru manipularea tabelelor din baza de date: crearea unuitabel nou çi adåugarea lui la baza de date - New Table, adåugarea unui tabel la bazade date - Add Table, crearea unei noi vizualizåri çi adåugarea ei la baza de date -New Local View, modificarea structurii tabelului selectat din baza de date - Modify,afiçarea conÆinutului tabelului selectat din baza de date într-o fereastrå de editare -Browse, înlåturarea unui tabel din baze de date - Remove, actualizarea indexuluitabelului selectat din baza de date - Rebuild Table Indexes, çtergerea fizicå aînregistrårilor marcate logic pentru çtergere din tabelul selectat din baza de date -Remove Deleted Records..., editarea relaÆiei selectate dintre douå tabele ale bazeide date - Edit Relationship...¸ deschiderea ferestrei generatorului pentru integritateareferenÆialå a bazei de date - Referential Integrity... etc.

Titlul meniului Table este afiçat în bara de meniuri numai dacå în fereastra aplicaÆieieste deschiså o fereastrå document de tip tabel al bazei de date.

Page 62: SGBD Visual Foxpro

Informatică 64

Bara de stare furnizeazå informaÆii despre obiectul focalizat (titlu de meniu, opÆiune demeniu, buton din bara cu instrumente etc.), despre programul care se executå (numeleprogramului) sau despre tabelul bazei de date selectat. În acest ultim caz, furnizeazåinformaÆii despre identificatorul tabelului (<nume_bazå_date> ! <nume tabel>) çi aliasultabelului, despre numårul înregistrårii curente x din numårul total de înregistråri y. Afiçarease face sub forma <x>/<y>. Aceste informaÆii sunt afiçate în partea stângå a barei de stare:

În partea dreaptå a barei de stare sunt afiçate informaÆii despre tastelecomutator Insert (OVR), Num Lock (NUM) çi Caps Lock (CAPS).Dacå numele lor este afiçat (ca în exemplu), înseamnå cå sunt activate.

La fel ca la orice aplicaÆie Microsoft, utilizatorul mai are la dispoziÆie çi meniul contextu-lui sau meniul de comenzi rapide care se deschide atunci când executaÆi clic cubutonul din dreapta al mouse-ului pe un obiect din fereastrå. OpÆiunile din acest meniudepind de context (de obiectul indicat cu mouse-ul).

Ferestrele document care pot fi deschise în fereastra aplicaÆiei Visual FoxPro sunt:

Fereastra Command. Se foloseçte pentru editarea comenzilor.Fereastra View. Se foloseçte la vizualizarea tabelelor bazei de date deschise, a rela-Æiilor dintre tabele çi a zonelor în care lucreazå fiecare tabel.

Identificatorul tabelului çi al bazeide date din care face parte Numårul înregistrårii curente çi numårul

total de înregistråri din tabel

Obiectul indicat cu mouse-ul afost un tabel al bazei de date.

Meniul contextului conÆineopÆiuni care se referå la tabel.

Obiectul indicat cu mouse-ul afost spaÆiul liber al ferestrei

generatorului de bazå de date.Meniul contextului conÆine

opÆiuni care se referå la baza dedate.

Page 63: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 65

Ferestrele pentru constructori çi generatoare. Se folosesc pentru crearea çi modi-ficarea diferitelor elemente Visual FoxPro: baze de date (Database Designer), tabeleale bazei de date çi indecçi (Table Designer), vizualizåri (View Designer), interogåri(Query Designer), formulare pentru introducerea datelor (Form Designer), rapoarte(Report Designer), meniuri (Menu Designer).Fereastra pentru administratorul de proiecte (Project Manager). Proiectul este ocolecÆie de fiçiere, date, documente çi obiecte Visual FoxPro folosite de o aplicaÆie.Fereastra pentru editarea fiçierelor cu texte, a fiçierelor de programe çi a câmpurilormemo. Numele ferestrei va fi numele fiçierului, iar în cazul câmpului memo numele vafi format din numele tabelului çi numele câmpului memo, separate prin punct.Fereastra pentru editarea unui tabel. Poate så fie de tip Browse când sunt afiçate maimulte înregistråri din tabel, câte o înregistrare pe fiecare rând sau de tip Edit cândeste afiçatå o singurå înregistrare, câte un câmp pe fiecare rând. Numele ferestreieste numele tabelului.Fereastra Debug. Se foloseçte pentru depanarea programelor.Fereastra Trace. Se foloseçte pentru executarea pas cu pas a unui program.

Deschiderea unei ferestre document se face automat la alegerea unei opÆiuni de meniu sauprintr-o comandå. OperaÆiile cu ferestrele document (redimensionarea, minimizarea,maximizarea, mutarea, defilarea conÆinutului) se executå la fel ca la orice aplicaÆie MicrosoftOffice. Pentru operaÆia de ascundere a unei ferestre alegeÆi opÆiunea Hide∈∈ Window.

Barele cu instrumente grupeazå dupå funcÆii butoanele scurtåturi pentru opÆiunile dinmeniuri. Bara standard conÆine aceleaçi butoane ca orice barå standard din aplicaÆiiileMicrosoft Office. Celelalte bare grupeazå în general butoane care corespund ferestrelordocument ale generatoarelor (Database Designer, Form Designer, Report Designer,View Designer çi Query Designer) sau butoane prin care pot fi inserate diferitecontroale în formulare sau rapoarte (Form Controls çi Report Controls). Controalelecare pot fi inserate într-un formular pot fi: etichete, casete de text, deruloare, butoane decomandå, comutatoare, butoane de opÆiuni, liste, casete combinate, grile etc.

Limbajul de comandåComenzile vor fi editate în fereastra Command. Fiecare comandå se scrie pe un rând.Terminarea unei comenzi se marcheazå prin acÆionarea tastei Enter. AcÆionarea acesteitaste semnificå faptul cå interpretorul de comenzi poate prelua aceastå comandå så oanalizeze, så o decodifice çi så o lanseze în execuÆie.

Comanda este o succesiune de caractere organizate conform sintaxei limbajului, princare i se cere calculatorului så execute o acÆiune. Sintaxa se referå la structura liniei decomandå. Linia de comandå are urmåtoarea sintaxå:

ObservaÆii:1. Cuvintele comenzii (verbe çi adverbe) se separå prin spaÆiu.

verb listå adverbe Enter

defineçte acÆiunea precizeazå modul în care se executåacÆiunea comandatå de verb

Page 64: SGBD Visual Foxpro

Informatică 66

2. În general, adverbele din listå pot fi scrise în orice ordine.3. Cuvintele din comandå pot fi scrise cu litere mari sau mici sau combinaÆie de astfel

de litere.4. Verbul comenzii poate fi prescurtat la primele patru caractere ale cuvântului.5. Comanda trebuie scriså pe un singur rând. Dacå vreÆi så o scrieÆi pe mai multe

rânduri, înainte de acÆionarea tastei Enter (care semnificå terminarea comenzii),trebuie så scrieÆi caracterul ; . PrezenÆa lui înseamnå cå prin acÆionarea tastei Entercomanda nu se terminå, ci se continuå pe rândul urmåtor.

6. Lungimea maximå a unei linii de comandå este de 1024 caractere.7. Adverbele pot fi:

nume de câmpuri, nume de variabile de memorie, nume de fiçiere, aliasuri, expresii.o listå - reprezintå un grup de elemente asemånåtoare (nume de câmpuri, numede variabile de memorie etc.). Separarea lor în listå se face prin virgulå.un domeniu (scope) - reprezintå un grup de înregistråri dintr-un tabel.

Domeniul poate fi precizat prin:a. cuvinte cheie:

Record <n> - înregistrarea cu numårul n,Next <n> - urmåtoarele n înregistråri, începând cu înregistrarea curentå,All - toate înregistrårile,Rest - toate înregistrårile pânå la sfârçitul tabelului începând cu înregistrarea curentå.

b. clauze (precizeazå un anumit tip de acÆiune):For <x> - numai înregistrårile care satisfac condiÆia precizatå prin expresia logicåx, începând cu prima înregistrare a tabelului.While <x> - toatå secvenÆa de înregistråri care urmeazå înregistrårii curente pentrucare expresia logicå x este adevåratå, pânå la prima înregistrare pentru careexpresia nu este adevåratå.

Alte clauze care pot fi folosite ca adverbe sunt:All/Like/Except <çablon> - poate fi folositå pentru a preciza un grup de variabilede memorie, tablouri de memorie sau fiçiere, al cåror nume corespunde çablonului.Comanda va acÆiona asupra tuturor (All), numai asupra celor care corespundçablonului (Like) sau numai asupra celor care nu corespund çablonului (Except).To … - controleazå ieçirea unei comenzi, redirecÆionând-o faÆå de ieçirea standard(care este ecranul). Ieçirea poate fi:

un fiçier: File <nume_fiçier>un tablou de memorie: Array <nume_tablou>imprimanta: Printer

In <alias> - permite manipularea unui tabel într-o altå zonå de lucru precizatå prinalias. Alias este un nume care se atribuie unui tabel, diferit de numele pe care l-aprimit acesta la crearea sa. Poate fi folosit pentru identificarea tabelului.

Additive - controleazå modul în care se scriu date într-un fiçier; prezenÆa acesteiclauze precizeazå cå datele vor fi adåugate la fiçier (scrise la sfârçitul fiçierului), iarabsenÆa clauzei precizeazå cå datele vor fi scrise la începutul fiçierului (vechiledate din fiçier se vor distruge).

Page 65: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 67

De exemplu, linia de comandå:Display next 30 adresa for nume=’Popescu’

conÆine verbul display (afiçeazå) çi adverbele care precizeazå ce înregistråri çi câmpurivor fi afiçate din tabel. Lista de adverbe conÆine trei adverbe:

next 30 - un adverb prin care se precizeazå domeniul înregistrårilor care vor fi afiçate:urmåtoarele 30 de înregistråri începând cu înregistrarea curentå;adresa - un adverb nume de câmp care precizeazå ce câmpuri se vor afiça dinînregistråri;for nume=’Popescu’ - un adverb precizat printr-o clauzå care defineçte domeniulînregistrårilor: toate înregistrårile pentru care valoarea câmpului nume este ‘Popescu’.

1.2.2. Modul de lucru programatComenzile sunt memorate în fiçiere de comenzi speciale de tip program executabil carepot fi încårcate în memorie çi lansate în execuÆie.

În loc så se scrie comenzile în fereastra de comenzi una câte una çi så se cearå de fiecaredatå execuÆia lor, se vor scrie într-un fiçier de comenzi. Fiçierul de comenzi are extensia .prg.Printr-o singurå comandå se va cere executarea programului, adicå a grupului de comenzi

sfârçit

sfârçit

da

x=.T.

Not EOF

BOF

comanda care acÆioneazåasupra înregistrårii

salt la urmåtoarea înregistrare

nu

danu

For <x>

salt la urmåtoarea înregistrare

comanda care acÆioneazåasupra înregistrårii

Not EOFandx=.T.

înregistrareacurentå

nu

da

While <x>

Schemele logice descriu modul în care clauzele Forçi While definesc domeniul înregistrårilor.

Page 66: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 67

De exemplu, linia de comandå:Display next 30 adresa for nume=’Popescu’

conÆine verbul display (afiçeazå) çi adverbele care precizeazå ce înregistråri çi câmpurivor fi afiçate din tabel. Lista de adverbe conÆine trei adverbe:

next 30 - un adverb prin care se precizeazå domeniul înregistrårilor care vor fi afiçate:urmåtoarele 30 de înregistråri începând cu înregistrarea curentå;adresa - un adverb nume de câmp care precizeazå ce câmpuri se vor afiça dinînregistråri;for nume=’Popescu’ - un adverb precizat printr-o clauzå care defineçte domeniulînregistrårilor: toate înregistrårile pentru care valoarea câmpului nume este ‘Popescu’.

1.2.2. Modul de lucru programatComenzile sunt memorate în fiçiere de comenzi speciale de tip program executabil carepot fi încårcate în memorie çi lansate în execuÆie.

În loc så se scrie comenzile în fereastra de comenzi una câte una çi så se cearå de fiecaredatå execuÆia lor, se vor scrie într-un fiçier de comenzi. Fiçierul de comenzi are extensia .prg.Printr-o singurå comandå se va cere executarea programului, adicå a grupului de comenzi

sfârçit

sfârçit

da

x=.T.

Not EOF

BOF

comanda care acÆioneazåasupra înregistrårii

salt la urmåtoarea înregistrare

nu

danu

For <x>

salt la urmåtoarea înregistrare

comanda care acÆioneazåasupra înregistrårii

Not EOFandx=.T.

înregistrareacurentå

nu

da

While <x>

Schemele logice descriu modul în care clauzele Forçi While definesc domeniul înregistrårilor.

Page 67: SGBD Visual Foxpro

Informatică 68

memorat în fiçier. În plus, de fiecare datå când se doreçte executarea acelor comenzi, ele nuvor mai fi scrise, ci lansate direct în execuÆie din fiçierul de comenzi.

Pentru crearea unui fiçier de comenzi se deschide fereastra editorului de texte folosindcomanda:

Modify command <nume_fiçier>

În fereastra de editare veÆi scrie comenzile, câte una pe fiecare rând, aça cum le scriaÆi çiîn fereastra de comenzi. OperaÆiile pentru editare (selectare, copiere sau mutare text se-lectat, cåutare sau cåutare cu înlocuire a unui çir de caractere, anularea ultimei operaÆii)sunt operaÆiile obiçnuite ale unui editor de texte Windows. Comenzile pentru acesteoperaÆii se gåsesc sub formå de opÆiuni în meniul Edit. Dupå ce aÆi scris comenzile,salvaÆi fiçierul cu opÆiunea Save∈∈File. Pentru închiderea ferestrei de editare puteÆi folosiscurtåturile: Ctrl+W pentru închiderea cu salvare sau Esc pentru închiderea fårå salvare.

LansaÆi în execuÆie programul cu comanda:Do <nume_fiçier>

1.3. Configurarea mediului de lucru Visual FoxPro

1.3.1. Sintaxa comenzilor de configurare a mediului Visual FoxProConfigurarea mediului de lucru se face prin intermediul unui ansamblu de comenziSet. În general, sintaxa comenzii Set este:

Set <parametru> …unde <parametru> reprezintå un parametru al sistemului care poate fi modificat prin comandå.

Comanda Set prezintå douå forme:

Set <parametru> On|OffAceastå formå se foloseçte pentru parametrii care pot avea doar douå valori: on -parametru activat çi off - parametru dezactivat. De exemplu:Set Bell On|Off

Controleazå parametrul Bell (sunet) care poate fi activat (on) sau dezactivat (off).Implicit este on.

Set Clock On|Off|StatusControleazå parametrul Clock (afiçarea pe ecran a ceasului) care poate fi activat(on), dezactivat (off) sau poate fi afiçat în bara de stare (status). Implicit este off.

Set Status Bar On|OffControleazå parametrul Status Bar (afiçarea barei de stare) care poate fi activat(on) sau dezactivat (off). Implicit este on.

Set Blink On|OffControleazå parametrul Blink (clipirea elementelor ecranului: margini, umbre, texteetc.) care poate fi activat (on) sau dezactivat (off). Implicit este on.

Set Talk On|OffControleazå parametrul Talk (afiçarea pe ecran a rezultatului comenzilor) carepoate fi activat (on) sau dezactivat (off). Implicit este on.

Set <parametru> to <valoare>

Page 68: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 69

Aceastå formå se foloseçte pentru parametrii care pot lua o valoare dintr-un domeniu demai multe valori. Ei vor fi precizaÆi prin valoare. De exemplu:Set Default to <cale_director>

Schimbå directorul curent în cel precizat prin <cale_director>.Set Clock to [<x>,<y>]

Controleazå parametrul Clock care reprezintå poziÆia afiçårii ceasului pe ecran. Eapoate fi precizatå prin coordonatele <x> - numårul rândului çi <y> - numårul coloa-nei. PoziÆia implicitå de afiçare este colÆul din dreapta sus al spaÆiului de lucru dinfereastra de aplicaÆie Visual FoxPro.

Set Hours to [12/24]Controleazå parametrul Hours care reprezintå formatul de afiçare al orei. El poateconsidera ziua ca fiind formatå din douå grupe de 12 ore (cu precizarea am saupm) sau dintr-un grup de 24 de ore. Valoarea implicitå este 12.

Set Path to <listå_cåi_director>Permite stabilirea unei liste de cåutare; aceastå listå conÆine mai multe cåi dedirector în care se va cåuta fiçierul precizat în comandå, dacå nu va fi gåsit îndirectorul curent.

Pentru a vizualiza starea parametrilor care pot fi stabiliÆi prin comenzi Set, folosiÆi comanda:Display status

ObÆineÆi informaÆii despre starea unui parametru care poate fi stabilit prin comenzi Setfolosind funcÆia:

Set (<nume parametru>[,1|2])Numele parametrului se scrie ca un çir de caractere. Dacå numele parametrului este folositcu ambele forme ale comenzii Set (cum este de exemplu parametrul Clock), el reprezintå doiparametri cu semnificaÆie diferitå. În acest caz se foloseçte 1 sau 2 pentru a afla informaÆiidespre fiecare parametru.

1.3.2. Configurarea mediului pentru diferite tipuri de dateFolosind comenzile Set puteÆi configura mediul Visual FoxPro pentru diferite tipuri dedate. De exemplu, pentru:

Tipul numeric. PuteÆi folosi comenzile:Set Decimals to [<x>]

Stabileçte numårul minim de zecimale afiçate. Numårul de zecimale este precizatprin <x>, care trebuie så fie o expresie numericå cu valoarea cuprinså între 0 çi 18.Valoarea implicitå este 2.

Set Fixed On|OffStabileçte dacå numårul de poziÆii zecimale afiçate este controlat sau nu. Dacå arevaloarea off, numårul de poziÆii afiçate nu este controlat (depinde de valoarea nu-mericå afiçatå). Dacå are valoarea on, numårul de poziÆii afiçate poate fi controlatcu comanda Set decimals to. Valoarea implicitå a acestui parametru este off.

Set Point to [<x>]Stabileçte prin expresia de tip çir de caractere <x> care va fi delimitatorul folosit întrepartea întreagå çi partea fracÆionarå a unui numår. Valoarea implicitå este punctul.

Page 69: SGBD Visual Foxpro

Informatică 70

Tipul çir de caractere. PuteÆi folosi comanda:

Set Exact On|OffControleazå modul în care se executå operaÆia de comparare a douå çiruri. Dacåare valoarea on, douå çiruri pentru a fi egale trebuie så aibå aceeaçi lungime çi såfie identice la nivelul fiecårei poziÆii a caracterelor. Dacå are valoarea off, çirurilepot avea lungimi diferite. Ele vor fi egale numai dacå se potrivesc pânå când seterminå çirul din dreapta. Valoarea implicitå este on.

1.3.3. Redirectarea ieçirii în mediul Visual FoxProPuteÆi folosi comenzile Set çi pentru redirectarea ieçirilor comenzilor. Ieçirea standardeste ecranul. De exemplu, prin comanda ? datele de ieçire vor fi afiçate pe ecran. Datelede ieçire pot fi redirectate cåtre un alt echipament: imprimantå sau fiçier pe disc.

Set Console On|OffControleazå ieçirea cåtre ecran. Dacå are valoarea on, datele de ieçire vor fiafiçate pe ecran, altfel va fi inhibatå afiçarea lor. Dacå aÆi inhibat afiçarea pe ecran,puteÆi så redirectaÆi ieçirea cåtre imprimantå sau cåtre un fiçier pe disc folosindcomanda Set Printer. Valoarea implicitå este on.

Set Printer On|OffControleazå redirectarea ieçirii cåtre imprimantå. Dacå are valoarea on, permiteieçirea la imprimantå, altfel aceastå ieçire este inhibatå. Valoarea implicitå aacestui parametru este off.

Set Printer to [<nume_fiçier>[additive]]Redirecteazå ieçirea cåtre un fiçier specificat prin <nume_fiçier>. Dacå nu se pre-cizeazå parametrul, ieçirea va fi implicit cåtre dispozitivul folosit pentru tipårire.

1.3.4. Configurarea interactivå a mediului Visual FoxProPentru a configura interactiv (prin intermediul interfeÆei) mediul de lucru Visual FoxPro,deschideÆi caseta de dialog Options cu opÆiunea Options...∈∈Tools.

Caseta conÆine mai multe secÆiuni:Data pentru parametrii care stabilesc modul în care se controleazå datele din tabele,View pentru parametrii care stabilesc obiectele afiçate în fereastra aplicaÆiei: bara destare, ceasul, rezultatul comenzilor, mesajele sistemului etc.General pentru parametrii generali ai mediului care stabilesc caracteristicile sunetului,ale interfeÆei de programare, ale modului de introducere a datelor etc.Edit pentru parametrii care stabilesc modul în care se face editarea unui text çi modulîn care se salveazå fiçierele,File Locations pentru parametrii care furnizeazå informaÆii pentru localizareafiçierelor folosite de Visual FoxPro (calea de director çi numele fiçierului),Forms pentru parametrii generatorului de formulare,Project pentru parametrii administratorului de proiecte,Controls pentru parametrii bibliotecii de clase vizuale çi de controale OLE,

Page 70: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 71

Internationals pentru parametrii care stabilesc formatul datelor calendaristice, aldatelor moment de timp çi al datelor numerice.

1.4. Comenzi pentru gestionarea fişierelor în Visual FoxPro Sistemul de gestiune a bazelor de date creeazå mai multe fiçiere: fiçierele care conÆin tabeleale bazelor de date .dbf, fiçierele care conÆin bazele de date .dbc, fiçierele de comenzi .prg,fiçierele care conÆin câmpurile memo .fpt, fiçierele care conÆin indecçii .idx çi .cdx.

Gestionarea acestor fiçiere (copiere, mutare, redenumire etc.) implicå închiderea aplica-Æiei çi revenirea la interfaÆa sistemului de operare. Pentru a se evita aceste operaÆii, sis-temul de gestiune a bazelor de date Visual FoxPro pune la dispoziÆia utilizatorilorcomenzi pentru gestionarea fiçierelor. Aceste comenzi sunt:a. copierea unui fiçier:

Copy file <nume1> to <nume2>unde <nume1> reprezintå numele fiçierului surså (numele fiçierului care se copiazå), iar<nume2> reprezintå numele fiçierului destinaÆie (numele sub care se face copierea).b. redenumirea unui fiçier:

Rename <nume1> to <nume2>unde <nume1> reprezintå numele iniÆial al fiçierului, iar <nume2> reprezintå noul nume alfiçierului.c. çtergerea unui fiçier:

Erase <nume> sauDelete file <nume>

unde <nume> reprezintå numele fiçierului care se çterge.d. afiçarea conÆinutului unui fiçier cu text:

Type <nume1> [to printer | to file <nume2>]unde <nume1> reprezintå numele fiçierului cu text al cårui conÆinut se afiçeazå implicit peecran, dar poate fi redirectat cåtre imprimantå (to printer) sau într-un alt fiçier cu numele<nume2> (to file <nume2>).e. afiçarea conÆinutului unui director:

Dir [on] [<disc>] [<dir>] [<çablon>] [to printer | to file <nume>]Se afiçeazå conÆinutul directorului care se gåseçte pe unitatea de disc <disc> çi carepoate fi identificat prin calea de director <dir>. Prin <çablon> se poate preciza grupul defiçiere care va fi inventariat (de exemplu *.prg este un çablon prin care se precizeazå cåvor fi inventariate numai fiçierele de comenzi). Afiçarea se face implicit pe ecran, dar poate firedirectatå cåtre imprimantå (to printer) sau într-un alt fiçier cu numele <nume> (to file <nume>).Se mai pot folosi douå comenzi, identice din punct de vedere al sintaxei:

List/Display files [[on] [<disc>] [like <çablon>]] [to printer | to file <nume2>]

PuteÆi så administraÆi interactiv fiçierele prin intermediul casetei de dialog Filer pe care odeschideÆi cu comanda:

Filer

Page 71: SGBD Visual Foxpro

Informatică 72

1.5. Asistenţa utilizatorului în Visual FoxPro ÇtiÆi deja cå autodocumentarea înseamnå o facilitate puså la dispoziÆie de aplicaÆie pentrua furniza utilizatorului explicaÆii despre modul în care poate folosi interfaÆa, despre comenzi,despre diferite operaÆii pe care le poate executa. Autodocumentarea se mai numeçte çihelp. Visual FoxPro pune la dispoziÆia utilizatorului ambele tipuri de autodocumentare:

Help dependent de contextInformaÆiile afiçate depind de contextul în care au fost cerute, adicå se apeleazå funcÆiahelp în timpul executårii unei operaÆii, iar informaÆiile se referå strict la operaÆia respectivå.În general, funcÆia Help existå în marea majoritate a casetelor de dialog çi a ferestrelordocument. Apelarea ei se face prin apåsarea tastei F1. În cazul casetelor de dialog maiputeÆi folosi çi butonul declançator Help sau butonul ? din bara de titlu a casetei.

Mai puteÆi så cereÆi informaÆii despre o comandå sau o funcÆie precizatå prin <nume>folosind comanda Help care are sintaxa:

Help <nume>De exemplu, comada Help str() cere så se afiçeze informaÆii depre funcÆia str(). AplicaÆiaafiçeazå caseta de dialog Help Topics la secÆiunea Index.

Help independent de contextSe afiçeazå o listå cu nume de subiecte (topic) çi diverse mecanisme de cåutare rapidåprintre aceste subiecte. Fereastra aplicaÆiei Help se deschide cu opÆiunea Contents∈∈Help. Meniurile aplicaÆiei Help sunt:

File conÆine opÆiuni pentru operaÆii cu fiçiere de tip Help (deschidere, tipårire).Edit conÆine opÆiuni pentru copierea textului selectat din fereastra Help çi pentru adminis-trarea comentariilor (adåugare, çtergere, modificare). Comentariul (annotation) este untext suplimentar pe care utilizatorul poate så-l adauge la textul unui subiect din Help.Bookmark conÆine opÆiuni pentru administrarea semnelor de carte - bookmarks (creare,çtergere, modificare). Acestea sunt marcaje ce pot fi identificate printr-un nume. Ele suntasociate unor subiecte çi ajutå la localizarea rapidå a subiectelor marcate.Options conÆine opÆiuni pentru stabilirea modului de afiçare în fereastra aplicaÆieiHelp: dimensiunea caracterelor, dacå se foloseçte sau nu sistemul de culori, dacå larevenirea în aplicaÆie fårå închiderea ferestrei Help, aceasta råmâne deschisådeasupra sau sub fereastra aplicaÆiei etc.

Butoanele declançatoare sunt:Contents deschide caseta de dialog în care este afiçat conÆinutul unui subiect.Print tipåreçte subiectul la imprimantå.Search deschide o casetå de dialog care conÆine controale ce vå permit så localizaÆirapid un subiect. Cåutarea se face dupå numele subiectului sau dupå primele litereale numelui subiectului.Back aduce în fereastrå ultimul subiect vizualizat.Glossary afiçeazå glosarul (listå de termeni ordonatå alfabetic). Dacå executaÆi clicpe numele unui termen, se afiçeazå într-o casetå informaÆii despre el.

Page 72: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 73

Din interfaÆa sistemului de operare Windows lansaÆi aplicaÆia Visual FoxPro.

AdministraÆi interfaÆa aplicaÆiei Visual FoxPro1. IdentificaÆi elementele ferestrei de aplicaÆie Visual FoxPro: bara de meniuri, bara cu

instrumente, bara de stare, fereastra de comenzi çi spaÆiul de lucru al ferestrei deaplicaÆie.

2. Fereastra Commands este o fereastrå document. ExecutaÆi cu aceastå fereastråoperaÆiile de minimizare, deplasare, maximizare, redimensionare çi restaurare.ObservaÆi cå aceste operaÆii se executå numai în cadrul ferestrei de aplicaÆie.

3. DeschideÆi caseta de dialog Toolbars cu opÆiunea Toolbars...∈∈View. În listaToolbar executaÆi clic pe comutatorul View Designer çi apoi clic pe declançatorulOk. ObservaÆi cå în fereastra aplicaÆiei este afiçatå o nouå barå cu instrumente. Des-chideÆi din nou caseta de dialog Toolbars. VerificaÆi så fie activat numai comutatorulStandard din lista Toolbar. ExecutaÆi clic pe declançatorul Ok. ObservaÆi cå înfereastra aplicaÆiei este afiçatå numai bara standard cu instrumente.

4. DeschideÆi meniul Window. ObservaÆi informaÆiile afiçate în bara de stare.5. ExecutaÆi operaÆii cu ferestrele document:

AscundeÆi fereastra document Command cu opÆiunea Hide∈∈Window. ObservaÆicå în bara de meniu nu mai este afiçat titlul meniului Format, deoarece acestmeniu conÆine opÆiuni pentru formatarea textelor editate. El depinde de existenÆaunei ferestre care så permitå editarea. Fereastra Command este o fereastrå încare se editeazå comenzi. Ferestrele View çi Debug pe care le veÆi deschide nusunt ferestre de editare.ReafiçaÆi fereastra apåsând tastele Ctrl+F2 (scurtåtura opÆiunii Command∈∈Window).DeschideÆi fereastra View cu opÆiunea View∈∈Window.DeschideÆi fereastra Debug cu opÆiunea Debug Window∈∈Tools.ActivaÆi pe rând ferestrele document deschise, apåsând tastele Ctrl+F1.ÎnchideÆi ferestrele View çi Debug executând clic pe butonul de închidere.

FolosiÆi autodocumentarea

1. VizualizaÆi informaÆii despre comanda Display Status (help dependent de context):ScrieÆi în fereastra Command comanda Help Display Status.Se deschide caseta de dialog Help Topics. În listå este selectat subiectul DISPLAYSTATUS command. ExecutaÆi clic pe declançatorul Display.Se deschide caseta de dialog Topics Found. SelectaÆi în listå subiectul DISPLAYSTATUS command çi executaÆi clic pe declançatorul Display.Se deschide fereastra aplicaÆiei Help. În fereastrå sunt afiçate informaÆii despreacest subiect.ExecutaÆi clic pe butonul Glossary. Se deschide caseta de dialog Help Index.ExecutaÆi clic pe butonul cu litera S.În casetå este afiçatå lista cu termenii care încep cu litera S. ExecutaÆi clic petermenul SQL. Se deschide o casetå cu text în care vå sunt furnizate informaÆiidespre acest termen. ÎnchideÆi aceastå casetå executând clic în exteriorul ei.

Page 73: SGBD Visual Foxpro

Informatică 74

ÎnchideÆi caseta de dialog cu glosarul executând clic pe butonul de închidere.ÎnchideÆi fereastra Help executând clic pe butonul de închidere.

2. VizualizaÆi informaÆii despre controalele din caseta de dialog Toolbars (help depen-dent de context):

DeschideÆi caseta de dialog Toolbars. ExecutaÆi clic pe butonul Help.Se deschide fereastra Help. În fereastrå este afiçat subiectul Toolbar (ViewMenu). ÎnchideÆi fereastra Help.În caseta de dialog Toolbars apåsaÆi tasta F1. ObservaÆi cå aceastå acÆiune areacelaçi efect ca çi apåsarea butonului Help. ÎnchideÆi fereastra Help.

3. LucraÆi cu controalele din fereastra Help (help independent de context):DeschideÆi fereastra Help cu Contents∈∈Help. În spaÆiul de lucru al ferestrei esteprezentatå o listå de capitole cu subiecte. Fiecare titlu de capitol reprezintå unsalt cåtre o listå cu subcapitole.ExecutaÆi clic pe numele capitolului Language Reference. În fereastrå va fiafiçatå lista cu subcapitolele. ExecutaÆi clic pe numele subcapitolului LanguageReference A-Z.Se deschide caseta de dialog Help Index. ExecutaÆi clic pe subiectul = Command.În fereastra Help va fi afiçat conÆinutul subiectului = Command (Comanda =;operaÆia de atribuire). ÎnchideÆi fereastra executând clic pe butonul de închidere.

LucraÆi cu ferestrele document ale constructorilor1. AlegeÆi opÆiunea Open∈∈File. Se deschide caseta de dialog Open. În listå este afiçat

conÆinutul dosarului Vfp (Visual FoxPro). DeschideÆi din listå dosarul cu exempleSample. DeschideÆi apoi dosarul Data. Din lista ascunså Files of type alegeÆivaloarea Database. ExecutaÆi clic în lista cu fiçiere çi dosare pe numele fiçieruluiTestdata.dbc. ExecutaÆi clic pe declançatorul Ok.

2. Se deschide fereastra Database Designer (generatorul bazei de date). În fereastråeste afiçatå baza de date a unei organizaÆii: tabelele çi relaÆiile dintre tabele. Înfereastrå nu este activat nici un obiect. ObservaÆi cå meniul Format a fost înlocuit cumeniul Database.

3. DeschideÆi meniul Database. IdentificaÆi opÆiunile disponibile. De ce nu suntdisponibile opÆiunile Modify..., Browse çi Remove? ÎnchideÆi lista meniului.

4. ExecutaÆi clic pe tabelul Products. ObservaÆi informaÆiile din bara de stare. Deschi-deÆi meniul Database. IdentificaÆi opÆiunile disponibile. De ce nu este disponibilåopÆiunea Edit Relationship...? ÎnchideÆi lista meniului.

5. ExecutaÆi clic pe legåtura dintre tabelele Orders çi Orditems. DeschideÆi meniulDatabase. De ce este acum disponibilå opÆiunea Edit Relationship...? De ce nusunt disponibile opÆiunile Modify..., Browse çi Remove? ÎnchideÆi lista meniului.

6. ExecutaÆi dublu clic pe tabelul Products. Se deschide fereastra Table Designer (ge-neratorul de tabele). Fereastra are numele tabelului - Products, iar în fereastrå suntafiçate datele din acest tabel. În partea superioarå a ferestrei sunt afiçate numele câm-purilor din tabel (numele fiecårei coloane). PuteÆi så derulaÆi conÆinutul ferestrei folosindbarele de derulare. ObservaÆi cå meniul Database a fost înlocuit cu meniul Table.

7. DeschideÆi meniul Table. IdentificaÆi opÆiunile de meniu care pot fi folosite pentruadministrarea înregistrårilor dintr-un tabel. ÎnchideÆi lista meniului.

Page 74: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 75

8. DeschideÆi meniul View. ObservaÆi cå opÆiunile acestui meniu sunt dependente decontext. În meniu au apårut opÆiuni noi. De exemplu, a apårut un grup de opÆiuni detip butoane radio: Browse çi Edit. Este activatå opÆiunea Browse. Aceasta înseam-nå cå fereastra generatorului de tabel este de tip Browse. ExecutaÆi clic pe opÆiuneaEdit. ObservaÆi cå s-a modificat modul în care sunt afiçate datele în fereastratabelului. De data aceasta, pe fiecare rând este afiçat conÆinutul unui câmp. Numelecâmpului apare scris la începutul rândului. ReveniÆi la modul de afiçare Browse.

9. ÎnchideÆi cele douå ferestre document. ObservaÆi cå în fereastra Command au apårutcomenzile pe care le-aÆi executat prin intermediul interfeÆei:

OPEN DATABASE C:\VFP\SAMPLES\DATA\Testdata.dbc EXCLUSIVEMODIFY DATABASE

ConfiguraÆi mediul de lucru Visual FoxPro1. ConfiguraÆi ceasul çi modul în care este afiçat timpul:

set hours to 12set clock to status

ceasul este afiçat în bara de stare în format de 12 ore

? set ('clock')STATUS

? set ( 'hours')12

set clock offceasul nu mai este afiçat în

bara de stareset clock on

ceasul este afiçat în colÆul din dreapta sus al spaÆiului de lucru al ferestrei

? set ('clock',1)0.000, 122.333

set clock to 15,60ceasul este în interiorul spaÆiu-

lui de lucru al ferestrei? set ('clock',1)

15.000, 60.000 (noile coordonate ale ceasului)

set hours to 24ceasul este afiçat în format de

24 de ore? set ( 'hours')

12

2. ConfiguraÆi modul în care sunt comparate datele de tip çir de caractere:

set exact off?'abc'='abc1'

.F.?'abc'=='abc1'

.F.?'abc'='ab'

.T.?'ab'='abc'

.F.?'abc'='ab1'

.F.?'ab'='ab1'

.F.?'ab1'='ab'

.T.?''='ab'

.F.?'ab'=''

.T.set exact on?'ab'='abc'

.F.?'abc'='ab'

.F.?'abc'='ab1'

.F.?'ab'='ab1'

.F.

?'ab'='ab '.T.

?'ab'=='ab '.F.

?'ab1'='ab'.F.

?'ab '='ab'.T.

?'ab '=='ab'.F.

?''='ab'.F.

?'ab'=''.F.

3. IdentificaÆi modul în care puteÆi modifica interactiv diferiÆi parametri Set. DeschideÆicaseta de dialog Options la diferite secÆiuni çi verificaÆi controalele din urmåtorultabel în care este prezentatå o comparaÆie între modul de lucru comandå çi modul de

Page 75: SGBD Visual Foxpro

Informatică 76

lucru interactiv. ReluaÆi operaÆiile de la punctele anterioare folosind controalele dincaseta de dialog Options.

Parametru Mod comandå Mod interactivBell Set Bell On|Off SecÆiunea General; grupul de butoane radio Off

(fårå sunet), Default (cu sunet implicit), Play (cusunet ales prin intermediul unei casete de text).

Clock Set Clock On|Off SecÆiunea View; caseta Show; comutatorulClock.

Clock Set Clock to [12|24] SecÆiunea International; grupul de butoane radio12-Hour çi 24-Hour.

Decimals Set Decimals to SecÆiunea International; caseta de text cu derulorDecimals Digit.

Point Set Point to SecÆiunea International; caseta de text DecimalsSeparator.

Exact Set Exact On|Off SecÆiunea Data; comutatorul SET EXACT.Status Bar Set Status Bar On|Off SecÆiunea View; caseta Show; comutatorul

Status Bar.Talk Set Talk On|Off SecÆiunea View; caseta Show; comutatorul

Command Result.

LucraÆi cu fereastra document a editorului de texte1. ScrieÆi în fereastra Command urmåtoarele comenzi pe care le executaÆi:

set fixed onset decimals to 4set point to ','

x=4*30?x

Se afiçeazå rezultatul 120,0000:2. DeschideÆi fereastra de editare cu comanda modify command a1. Numele ferestrei

de editare este numele fiçierului a1.prg.3. ActivaÆi fereastra de comenzi executând clic în aceastå fereastrå. SelectaÆi comenzile

introduse la punctul 1. CopiaÆi în zona Clipboard aceste instrucÆiuni apåsând tasteleCtrl+C.

4. ActivaÆi fereastra de editare executând clic în spaÆiul ei de lucru. CopiaÆi în aceaståfereastrå instrucÆiunile din Clipboard apåsând tastele Ctrl+V. ÎnchideÆi fereastra deeditare cu salvarea conÆinutului apåsând tastele Ctrl+W.

5. DeschideÆi din nou fereastra de editare cu comanda modify command a1. În fe-reastra de editare sunt afiçate instrucÆiunile scrise anterior. SalvaÆi acest conÆinut într-unalt fiçier de program cu comanda Save As...∈∈File. În caseta de dialog Save As scrieÆiîn zona de editare Save a2. ObservaÆi numele dosarului în care se salveazå acestefiçiere cu programe. ExecutaÆi clic pe declançatorul Save. ObservaÆi cå acum numeleferestrei de editare este a2.prg. Ea conÆine comenzile din programul a1. ModificaÆiinstrucÆiunile urmåtoare, pentru a reveni la afiçarea implicitå a numerelor (2 poziÆiizecimale çi separatorul punct):

set decimals to set point to

Page 76: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 77

ÎnchideÆi fiçierul a2 cu salvarea modificårilor apåsând tastele Ctrl+W.6. ExecutaÆi comenzile din fiçierul a1. ScrieÆi în fereastra Commands comanda Do a1.

Rezultatul afiçat este 120,0000.7. ExecutaÆi comenzile din fiçierul a2. ScrieÆi în fereastra Commands comanda Do a2.

Rezultatul afiçat este 120.00.

ManipulaÆi fiçierele1. CopiaÆi fiçierul a1.prg sub numele nou.prg, folosind comanda:

copy file a1.prg to nou.prg2. VizualizaÆi lista cu fiçiere cu programe din directorul curent. IdentificaÆi în listå fiçierele

program create: a1.prg, a2.prg çi nou.prg. FolosiÆi comanda:dir like *.prg

3. RedenumiÆi fiçierul nou.prg cu numele a3.prg folosind comanda:rename nou.prg to a3.prg

4. VizualizaÆi lista cu fiçiere cu programe din directorul curent create în aceastå sesiunede lucru: a1.prg, a2.prg çi a3.prg. FolosiÆi comanda:

dir like a*.prg5. DeschideÆi caseta de dialog Filer folosind comanda:

filer

IdentificaÆi controalele din caseta de dialog. În listå sunt afiçate directoarele çi fiçierele dindirectorul curent. Pentru fiecare dintre ele se afiçeazå numele, dimensiunea, data çi oraultimei actualizåri, atributele. Cele douå liste ascunse Drive çi Directories se folosescpentru a schimba discul implicit çi directorul curent. Caseta de text Files Like se foloseç-te pentru a comunica çablonul fiçierelor afiçate în listå (implicit este *.*, adicå toate fiçi-erele). Pentru executarea operaÆiilor cu fiçiere çi directoare puteÆi folosi declançatoarele:

Find - localizarea unui fiçier sau director prin intermediul controalelor din caseta dedialog Find Files;Copy - copierea fiçierului sau a directorului selectat sau a grupului de fiçiere saudirectoare selectate;Move - mutarea fiçierului sau a directorului selectat sau a grupului de fiçiere saudirectoare selectate;Delete - çtergerea fiçierului sau a directorului selectat sau a grupului de fiçiere saudirectoare selectate;Sort - sortarea listei cu fiçiere çi directoare dupå diferite criterii (nume, extensie, datå,dimensiune etc.);Edit - editarea fiçierului selectat (deschide fereastra de editare în care încarcå fiçierul);Attr - afiçarea sau modificarea atributelor fiçierului selectat;Rename - redenumirea fiçierului sau directorului selectat;Size - afiçarea dimensiunii fiçierului selectat (în octeÆi);Tree - are efect de comutator: prin acÆionare schimbå informaÆia afiçatå în listå; înlocul listei cu fiçiere çi directoare este afiçat arborele de directoare.ScrieÆi în caseta de text çablonul *.prg. ObservaÆi cå în listå sunt afiçate numaifiçierele care au extensia .prg. ReveniÆi la afiçarea tuturor fiçierelor rescriind înaceastå casetå çablonul *.*.

Page 77: SGBD Visual Foxpro

Informatică 78

SelectaÆi fiçierul a1.prg çi executaÆi clic pe declançatorul Edit. Se deschide fereastrade editare în care este încårcat fiçierul a1.prg. ÎnchideÆi fereastra de editare.În listå existå fiçierul a1.bak. El a fost creat automat de cåtre sistem atunci când aÆifåcut modificarea în acest fiçier. Acest tip de fiçier conÆine penultima versiune a fiçie-rului. SelectaÆi acest fiçier çi executaÆi clic pe declançatorul Delete ca så îl çtergeÆi.ExecutaÆi clic pe declançatorul Tree. Se afiçeazå structura arborescentå a directoare-lor. În locul acestui declançator este afiçat acum declançatorul Files. Nu mai sunt afi-çate declançatoarele Find, Sort, Edit çi Attr. În locul lor sunt afiçate declançatoareleChdir (pentru schimbarea directorului curent) çi Mkdir (pentru crearea unui director).ExecutaÆi clic pe declançatorul Files pentru a afiça lista cu fiçiere çi directoare.SelectaÆi toate fiçierele create în aceastå sesiune de lucru çi executaÆi clic pedeclançatorul Delete.

ÎncercaÆi:

Adevårat/Fals:1. Meniul Database conÆine opÆiuni pentru manipularea tabelelor din baza de date.2. Într-o comandå puteÆi preciza grupul de înregistråri care începe cu înregistrarea

curentå çi se terminå cu ultima înregistrare folosind cuvântul cheie Next.3. În general, adverbele dintr-o comandå pot fi scrise în orice ordine.4. Verbul comenzii poate fi prescurtat la primele patru caractere.5. Configurarea mediului de lucru Visual FoxPro se poate face prin ansamblul de

comenzi Set.6. Folosind comanda Display status afiçaÆi informaÆii despre starea monitorului.7. Numårul de zecimale dintr-un numår îl stabiliÆi cu comanda Set Fixed.8. Formularul prin intermediul cåruia puteÆi så modificaÆi interactiv parametrii sistemului

este de tip fereastrå document.

CompletaÆi:1. InformaÆiile despre activarea/dezactivarea tastelor comutator se gåsesc în .............…2. Fereastra folositå pentru editarea comenzilor se numeçte ..................................3. Fereastra generatorului de tabele ale bazei de date se numeçte .................................4. Cuvântul cheie prin care puteÆi preciza într-o comandå un grup de n înregistråri,

începând cu înregistrarea curentå este ......................5. Pentru redirectarea ieçirii unei comenzi la imprimantå folosiÆi clauza .....................6. Comanda prin care cereÆi så aflaÆi informaÆii despre operaÆia de çtergere a fiçierelor

Erase este ................................7. Formularul prin intermediul cåruia puteÆi så administraÆi fiçierele este de tip ................

............................. çi se numeçte ....................................8. Autodocumentarea declançatå prin acÆionarea butonului Help dintr-o casetå de dia-

log se numeçte help ............................... de context.

AlegeÆi råspunsul corect:1. Meniul Table conÆine opÆiuni pentru:

a) crearea çi formatarea tabelelor

Page 78: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 79

b) manipularea înregistrårilor dintr-un tabelc) crearea legåturilor între tabele

2. Fereastra în care puteÆi vedea ce tabele conÆine baza de date deschiså, în ce zonelucreazå çi ce legåturi existå între ele se numeçte:

a) Database Designer b) Form Designer c) View

3. Clauza prin care puteÆi preciza numai înregistrårile care îndeplinesc o anumitåcondiÆie logicå, începând cu prima înregistrare din tabel este:

a) While b) All Like c) For

4. Linia de comandå trebuie scriså cu:a) litere mari b) litere mici c) orice tip de literå

5. În adverbul de tip listå, separarea elementelor se face prin:a) punct çi virgulå b) virgulå c) spaÆiu

6. LansaÆi în execuÆie un program cu comanda:a) Modi Comm b) Do c) Return

7. Comanda Set clock status:a) afiçeazå starea ceasuluib) afiçeazå ceasul în bara de starec) este greçitå

8. PuteÆi stabili interactiv parametrii sistemului prin intermediul:a) ferestrei document Traceb) casetei de dialog Optionc) ferestrei document Project Manager

RåspundeÆi:1. Ce înseamnå compatibil cu standardul dBase?2. Ce înseamnå termenul Visual din numele aplicaÆiei Visual FoxPro? Ce reprezintå aceas-

tå tehnicå?3. Ce tipuri de limbaje are implementat Visual FoxPro pe lângå limbajul propriu?4. Ce informaÆii afiçeazå bara de stare atunci când este selectat un tabel din baza de date?5. Ce tipuri de adverbe pot fi folosite în linia de comandå?6. Câte forme are comanda Set? Pentru ce tip de parametri se poate folosi fiecare for-

må? Ce formular puteÆi folosi în locul comenzii Set pentru a configura interactivmediul de lucru Visual FoxPro?

7. Pentru ce operaÆii cu fiçiere vå pune la dispoziÆie comenzi aplicaÆia Visual FoxPro?Ce formular puteÆi folosi în locul comenzilor pentru operaÆii cu fiçiere? Cum deschideÆiacest formular?

8. Câte tipuri de autodocumentare foloseçte Visual FoxPro? Cum puteÆi avea acces lafiecare tip de help?

RRåspunsuri:Adevårat/Fals: 1-A; 2-F; 3-A; 4-A; 5-A; 6-F; 7-F; 8-F.CompletaÆi: 1- bara de stare; 2-Command; 3-Database Designer; 4-Next; 5-To Print; 6-Help Erase;7-caseta de dialog, Filer; 8-dependent.AlegeÆi råspunsul corect: 1-b; 2-c; 3-c; 4-c; 5-b; 6-b; 7-b; 8-b.

Page 79: SGBD Visual Foxpro

80 Informatică

2. Funcţii folosite pentru datele din Visual FoxPro

2.1. Funcţii pentru date de tip numericPentru aceste funcÆii argumentul este de tip numeric (întreg sau real). Argumentul poate fio variabilå sau un câmp numeric, sau o expresie al cårui rezultat este numeric.

FuncÆia Sintaxa Ce reprezintå?FuncÆii pentru semnul expresiei

Sign Sign(x) Furnizeazå semnul argumentului x: +1 dacå x>0, 0 dacåx=0 çi -1 dacå x<0.

Abs Abs(x) Furnizeazå valoarea absolutå (modulul) argumentului x.FuncÆii folosite ca operatori matematici

Mod Mod(x,y) Furnizeazå restul împårÆirii argumentului x la argumentul y.FuncÆii care aproximeazå datele

Int Int(x) Furnizeazå partea întreagå a argumentului.Ceiling Ceiling(x) Furnizeazå cel mai apropiat întreg mai mare sau egal cu

argumentul.Floor Floor(x) Furnizeazå cel mai apropiat întreg mai mic sau egal cu

argumentul.

DateTimeDate

Currency

Tipuri de date

Numeric Alfanumeric Logic SpecialTimp

GeneralLogical

MemoCharacter

Real

Întreg

Monetar

Integer

DoubleFloat

Pentru prelucrarea datelor elementare(variabile de memorie sau câmpuri) puteÆifolosi, pe lângå operatorii specificitipului de datå, çi funcÆiile. Acestea potfi grupate dupå tipul datelor care suntfolosite ca argumente (parametri deintrare sau date de intrare prelucrate defuncÆie).

Page 80: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 81

FuncÆia Sintaxa Ce reprezintå?Round Round(x,y) Furnizeazå valoarea numericå a numårului precizat prin

argumentul x, rotunjitå la numårul de zecimale precizatprin argumentul y.

FuncÆii matematiceSqrt Sqrt(x) Furnizeazå rådåcina påtratå din argument.Exp Exp(x) Furnizeazå exponenÆialul argumentului.Log Log(x) Furnizeazå logaritmul natural din argument.Log10 Log10(x) Furnizeazå logaritmul zecimal din argument.

FuncÆii trigonometriceSin Sin(x) Furnizeazå sinusul argumentului exprimat în radiani.Cos Cos(x) Furnizeazå cosinusul argumentului exprimat în radiani.Tan Tan(x) Furnizeazå tangenta argumentului exprimat în radiani.Asin Asin(x) Furnizeazå arcsinusul argumentului exprimat în radiani.Acos Acos(x) Furnizeazå arccosinusul argumentului exprimat în radiani.Atan Atan(x) Furnizeazå arctangenta argumentului exprimat în radiani.Rtod Rtod(x) Realizeazå conversia din radiani în grade.Dtor Dtor(x) Realizeazå conversia din grade în radiani.Pi Pi() Furnizeazå valoarea constantei ΠΠ (3,141592).ObservaÆii:1. PuteÆi exprima relaÆia dintre un numår, modulul såu çi semnul såu astfel:

x = abs(x)*sign(x)2. Pentru a afla partea fracÆionarå a unui numår x puteÆi folosi expresia:

x - int(x)3. PuteÆi folosi funcÆiile exp() çi log() pentru a calcula valoarea expresiei ab, adicå a^b.

ÇtiÆi deja cå din punct de vedere matematic: ab = eb*ln(a). PuteÆi exprima operatorulmatematic pentru ridicare la putere folosind aceste funcÆii:

a^b = exp(b*log(a))4. PuteÆi folosi funcÆiile log() çi log10() pentru a calcula valoarea oricårui logaritm. ÇtiÆi

deja cå din punct de vedere matematic:logb(a)= log(a)/log(b) = log10(a)/log10(b)

5. Argumentele funcÆiilor trigonometrice sin(x), cos(x) çi tan(x) sunt specificate în radianiçi nu în grade. Rezultatul furnizat defuncÆiile asin(x), acos(x) çi atan(x)este în radiani.

Pentru a transforma gradele (Degree) înradiani (Radian), çi invers, se pot folosifuncÆiile Dtor() çi Rtod().

PrelucraÆi date numerice cu ajutorul funcÆiilor

1. EvaluaÆi expresii numerice folosind funcÆia sqrt():

Dtor() radiani grade

Rtod()

Page 81: SGBD Visual Foxpro

82 Informatică

( )aaaaa

−×−+

−+ 21+11-1

pentru a=4. ScrieÆi comenzile:

a=4e=((sqrt(a+1)-sqrt(a-1))/ (sqrt(a+1)+sqrt(a-1)))*(2-a)? e

-0.25 (rezultatul afiçat)

2. EvaluaÆi expresia:

12 −xpentru x=3.

x=3e=sqrt(sqrt(sqrt(x^2-1)))? e

1.30

3. EvaluaÆi semnul expresiei numericecu funcÆiile: sign(), abs():

? abs(-1000)1000

? sign(-1000)-1

alfa=-1000? alfa=sign(alfa)*abs(alfa)

.T.

4. AproximaÆi expresia numericå folosindfuncÆiile: ceiling(), floor(), round(),int():

x=5.253? floor(x)

5? int(x)

5? ceiling(x)

6? round(x,2)

5.25? round(x+0.004,2)

5.26x=-5.25? floor(x)

-6? int(x)

-5? ceiling(x)

-5? sign(x)

-1? round(x,2)

-5.25

5. ExtrageÆi partea fracÆionarå dintr-unnumår:

x=3.15? x-int(x)

0.15x=-3.15? x-int(x)

-0.15

6. CalculaÆi modulo (restul împårÆirii)folosind operatorul % çi funcÆia mod():

? mod(5,2)1

? 5%21

? mod(5,2) = 5%2.T.

? mod(6.5,3)0.5

? 6.5%30.5

7. EvaluaÆi expresii numerice folosindfuncÆia sqrt(), log(),log10(), exp():

a=2 b=3? a^b=exp(b*log(a))

.T.

Page 82: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 83

? exp(0)1

? exp(1)2.72

? log(1)0.00

? log(exp(5))5.00

? exp(log(5))5.00

? log10(1000)3.00

? log10(1000^2)6.00

8. EvaluaÆi funcÆii trigonometrice folo-sind funcÆiile: sin(), cos(), tan(), asin(),acos(), atan(), pi(), rtod(), dtor():

? sin(pi()/2)

1.00? sin(dtor(90))

1.00? asin(1)

1.57? rtod(asin(1))

90.00? tan(pi()/4)

1.00? rtod(atan(1))

45.00? rtod(atan(-1))

-45.00? rtod(asin(-1))

-90.00? rtod(acos(-1))

180.00? rtod(asin(sqrt(2)/2))

45.00

2.2. Funcţii pentru date de tip şir de caracterePentru aceste funcÆii argumentul este de tip çir de caractere. Argumentul poate fi o variabilåsau un câmp çir de caractere, ori o expresie al cårei rezultat este un çir de caractere.

FuncÆia Sintaxa Ce reprezintå?FuncÆii pentru conversii

Asc Asc(x) Argumentul x este de tip çir de caractere. FuncÆia furnizeazåcodul ASCII al primului caracter din argument.

Chr Chr(x) Argumentul x este de tip numeric întreg cuprins între 0 çi 255.FuncÆia furnizeazå caracterul al cårui cod ASCII este argu-mentul x. FuncÆia furnizeazå un rezultat de tip çir de caractere.

FuncÆii care furnizeazå informaÆii despre un çir de caractereLen Len(x) Furnizeazå un rezultat de tip numeric ce reprezintå

lungimea çirului de caractere.Isalpha Isalpha(x) Furnizeazå un rezultat de tip logic prin care se testeazå

dacå primul caracter din çirul de caractere este o literå(rezultatul este .T. dacå primul caracter este o literå).

Isupper Isupper(x) Furnizeazå un rezultat de tip logic prin care se testeazå dacåprimul caracter din çirul de caractere este o literå mare(rezultatul este .T. dacå primul caracter este o literå mare).

Islower Islower(x) Furnizeazå un rezultat de tip logic prin care se testeazå dacåprimul caracter din çirul de caractere este o literå micå(rezultatul este .T. dacå primul caracter este o literå micå).

Isdigit Isdigit(x) Furnizeazå un rezultat de tip logic prin care se testeazådacå primul caracter din çirul de caractere este o cifrå(rezultatul este .T. dacå primul caracter este o cifrå).

Page 83: SGBD Visual Foxpro

84 Informatică

FuncÆia Sintaxa Ce reprezintå?FuncÆii pentru generarea de çiruri de caractere

Replicate Replicate(x,y) Argumentul x este de tip çir de caractere, iar argumentuly este de tip numeric. FuncÆia furnizeazå un çir decaractere obÆinut prin repetarea de y ori a çirului decaractere x.

Space Space(x) Argumentul x este de tip numeric. FuncÆia furnizeazå unçir de caractere format din x spaÆii.

FuncÆii pentru eliminarea spaÆiilor sau pentru inserarea spaÆiilor sau a altorcaractere într-un çir de caractere

Alltrim Alltrim(x) Eliminå spaÆiile din faÆa çi din spatele (din stânga çi dindreapta) çirului de caractere x.

Ltrim Ltrim(x) Eliminå spaÆiile suplimentare din faÆa (din stânga - left) çiruluide caractere x.

Rtrim,Trim

Rtrim(x)Trim(x)

Eliminå spaÆiile din spatele (din dreapta - right) çirului decaractere x.

Padc Padc(x,n[,y]) Argumentele sunt x,y de tip çir de caractere çi n de tip nume-ric. FuncÆia completeazå çirul de caractere x la stânga çi ladreapta cu çirul de caractere y astfel încât çirul rezultat såaibå lungimea n.

Padl Padl(x,n[,y]) Argumentele sunt x,y de tip çir de caractere çi n de tip nume-ric. FuncÆia completeazå çirul de caractere x în faÆå (la stânga- left) cu çirul de caractere y astfel încât çirul rezultat så aibålungimea n.

Padr Padr(x,yn[,y]) Argumentele sunt x,y de tip çir de caractere çi n de tip nume-ric. FuncÆia completeazå çirul de caractere x la sfârçit (ladreapta - right) cu çirul de caractere y astfel încât çirul rezultatså aibå lungimea n.

FuncÆii pentru transformarea unui çir de caractereLower Lower(x) Furnizeazå un çir de caractere în care literele din çirul de car-

ractere x sunt transformate în litere mici.Upper Upper(x) Furnizeazå un çir de caractere în care literele din çirul de ca-

ractere x sunt transformate în litere mari.Proper Proper(x) Furnizeazå un çir de caractere în care literele din çirul de ca-

ractere x sunt transformate astfel: prima literå este mare, iarcelelalte sunt mici.

Chrtran Chrtran(x,y,z) Argumentele x, y, z sunt de tip çir de caractere. Furnizeazåun çir de caractere obÆinut prin transformarea çirului de carac-tere x astfel: toate apariÆiile primului caracter din çirul de ca-ractere y sunt înlocuite cu primul caracter din çirul z, toate a-pariÆiile celui de-al doilea caracter din çirul y sunt înlocuite cual doilea caracter din çirul z etc. Dacå expresia y are mai mul-te caractere decât expresia z, atunci caracterele care sunt înplus vor fi transformate în caracterul NULL. Dacå expresia zare mai multe caractere decât expresia y, atunci caracterelecare sunt în plus vor fi ignorate.

Page 84: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 85

FuncÆia Sintaxa Ce reprezintå?Strtran Strtran(x,y

[,z,n,m])Argumentele x, y, z sunt de tip çir de caractere, iar argumen-tele n çi m sunt de tip numeric. Furnizeazå un çir de caractereprin înlocuirea în çirul de caractere x a çirului de caractere ycu çirul de caractere z. Înlocuirea începe cu apariÆia n a çiruluiy çi se vor înlocui numai m apariÆii. Dacå nu se precizeazå çi-rul z, el va fi considerat çirul vid, iar efectul va fi çtergerea a mapariÆii ale çirului y începând cu apariÆia n. Dacå nu se preci-zeazå argumentul n, înlocuirea începe cu prima apariÆie, iardacå nu se precizeazå argumentul m, se vor înlocui toateapariÆiile.

Stuff Stuff(x,n,m,y) Argumentele x çi y sunt de tip çir de caractere, iar argumentelen çi m sunt de tip numeric. Furnizeazå un çir de caractere obÆi-nut prin înlocuirea în çirul de caractere x a unui subçir, careîncepe din poziÆia n çi are lungimea m, cu çirul de caractere y.

FuncÆii pentru operaÆii cu subçiruri de caractereLeft Left(x,n) Argumentul x este de tip çir de caractere, iar argumentul n

este de tip numeric. Furnizeazå un çir de caractere obÆinutprin extragerea a n caractere de la stânga çirului x.

Right Right(x,n) Argumentul x este de tip çir de caractere, iar argumentul neste de tip numeric. Furnizeazå un çir de caractere obÆinutprin extragerea a n caractere de la dreapta çirului x.

Substr Substr(x,m,n) Argumentul x este de tip çir de caractere, iar argumentele nçi m sunt de tip numeric. Furnizeazå un çir de caractereobÆinut prin extragerea unui subçir de lungime n din çirul x,începând cu poziÆia m.

At At(x,y[,n]) Argumentele x çiy sunt de tip çir de caractere, iar argumen-tul n este de tip numeric. Furnizeazå un rezultat numeric ca-re reprezintå poziÆia în çirul y a subçirului x. Cåutarea se fa-ce de la stânga la dreapta, Æinând cont de diferenÆa dintreliterele mari çi mici. Dacå se precizeazå argumentul n, secautå apariÆia n.

Rat Rat(x,y[,n]) Argumentele x çiy sunt de tip çir de caractere, iar argumen-tul n este de tip numeric. Furnizeazå un rezultat numeric ca-re reprezintå poziÆia în çirul y a subçirului x. Cåutarea se fa-ce de la dreapta la stânga, Æinând cont de diferenÆa dintreliterele mari çi mici. Dacå se precizeazå argumentul n, secautå apariÆia n.

Atc Atc(x,y[,n]) Argumentele x çiy sunt de tip çir de caractere, iar argumen-tul n este de tip numeric. Furnizeazå un rezultat numeric ca-re reprezintå poziÆia în çirul y a subçirului x. Cåutarea se fa-ce de la stânga la dreapta, fårå så Æinå cont de diferenÆa din-tre literele mari çi mici. Dacå se precizeazå argumentul n, secautå apariÆia n.

Atline Atline(x,y) Argumentele x çiy sunt de tip çir de caractere. Furnizeazåun rezultat numeric care reprezintå linia de text din çirul y încare apare prima datå subçirul x. Cåutarea se face Æinând

Page 85: SGBD Visual Foxpro

86 Informatică

FuncÆia Sintaxa Ce reprezintå?cont de diferenÆa dintre literele mari çi mici çi de la stânga ladreapta.

Ratline Ratline(x,y) Argumentele x çi y sunt de tip çir de caractere. Furnizeazåun rezultat numeric care reprezintå linia de text din çirul y încare apare prima datå subçirul x. Cåutarea se face Æinândcont de diferenÆa dintre literele mari çi mici çi de la dreaptala stânga.

Atcline Atcline(x,y) Argumentele x çiy sunt de tip çir de caractere. Furnizeazåun rezultat numeric care reprezintå linia de text din çirul y încare apare prima datå subçirul x. Cåutarea se face Æinândcont de diferenÆa dintre literele mari çi mici çi de la stânga ladreapta.

Occurs Occurs(x,y) Argumentele x çiy sunt de tip çir de caractere. Furnizeazåun rezultat numeric care reprezintå numårul de apariÆii alsubçirului x în çirul y.

ObservaÆii:1. PuteÆi folosi urmåtoarele funcÆii pen-

tru conversia numår ↔↔ caracter:2. Pentru çirul vid funcÆia Len() furni-

zeazå valoarea 0.3. FuncÆiile Replicate(‘ ‘,n) çi Space(n) furnizeazå acelaçi rezultat.4. FuncÆiile Alltrim(), Ltrim(), Trim(), Rtrim(), Padc(), Padl() çi Padr() pot fi sintetizate în

urmåtoarele diagrame:a. FuncÆiile pot fi folosite pentru douå

tipuri de operaÆii:eliminarea spaÆiilor: Alltrim(),Ltrim(), Trim(), Rtrim()inserarea spaÆiilor sau a altorcaractere: Padc(), Padl(), Padr()

b. FuncÆiile acÆioneazå în diferite zone ale çirului de caractere:la stânga çirului: Ltrim(),Padl()la dreapta çirului: Trim(), Rtrim(), Padr()la ambele capete ale çirului: Alltrim(), Padc()

5. Transformarea unui çir de caractere se poate face prin douå tipuri de operaÆii.a. transformarea din litere mari în litere mici çi invers: Lower(), Upper(), Proper()b. înlocuirea unor caractere cu alte caractere: Chrtran(), Strtran(), Stuff()

Ltrim(),Padl() Trim(), Rtrim(),Padr()

Alltrim(), Padc()

Padc(), Padl(), Padr() çir cu spaÆii çir fårå spaÆii

Alltrim(), Ltrim(), Trim(), Rtrim()

Asc() cod ASCII caracter

Chr()

Page 86: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 87

De exemplu, pentru funcÆia Strtran():

çi pentru funcÆia Stuff():

Folosind funcÆia Stuff() puteÆi realiza urmåtoarele operaÆii:inserarea unui çir de caractere, dacå m=0;çtergerea unui çir de caractere, dacå y='' (çirul vid).

6. OperaÆiile cu subçiruri de caractere se fac prin trei tipuri de operaÆii:a. extragerea unui subçir de caractere dintr-un çir se poate face din diferite poziÆii ale

çirului cu funcÆiile : Left(), Right(), Substrr()

Între aceste funcÆii existå urmåtoarele relaÆii:Left(x,n) = Substr(x,1,n);Right(x,n) = Substr(x,len(x)-n+1,n).

b. cåutarea unui subçir de caractere într-un çir se poate face Æinând cont de mai multe criterii:cåutarea se face pe o singurå linie de text:

Æinând cont de diferenÆa dintre literele mari çi mici At(), Rat() saufårå så se Æinå cont de diferenÆa dintre literele mari çi mici Atc()

cåutarea se face pe mai multe linii de text:Æinând cont de diferenÆa dintre literele mari çi mici Atline(), Ratline() sau

x - çirul în care se înlocuieçte

n = 2; înlocuirea se face începând cu a doua apariÆiem = 3; numårul de apariÆii care se înlocuiesc

y - subçirul care se înlocuieçte

z - subçirul cu care se înlocuieçte

m

x - çirul în care se înlocuieçte

subçirul care se înlocuieçte,definit prin poziÆia n çi lungimea m

y - subçirul cu care se înlocuieçten

Left(x,n)Right(x,n)

n nnçirul x

mSubstr(x,m,n)

Page 87: SGBD Visual Foxpro

88 Informatică

fårå så se Æinå cont de diferenÆa dintre literele mari çi mici Atcline()cåutarea se face în urmåtoarele sensuri:

de la stânga la dreapta At (), Atc(), Atline(), Atcline() saude la dreapta la stânga Rat (), Ratline()

c. determinarea numårului de apariÆii ale unui subçir într-un çir: Occurs()

PrelucraÆi çiruri de caractere cu ajutorul funcÆiilorVeÆi folosi mai multe funcÆii pentru çiruri de caractere çi veÆi observa rezultatul furnizat deaceste funcÆii:

1. FolosiÆi funcÆiile de conversie: asc(),chr():

? asc ('123')49 codul ASCII al caracterului 1

? asc ('abc')97 codul ASCII al caracterului a

? asc('abc')>asc('123').T. deoarece 97>49

? asc ('A')65 codul ASCII al caracterului A

? chr (65)A

? chr (7)bip semnal sonor

? asc ('1') = asc('123').T.

? 'z'==chr (asc('z')).T.

? 122=asc (chr(122)).T.

? chr(asc('Z')+32)z

2. ObÆineÆi informaÆii despre un çir decaractere folosind funcÆiile len(),isalpha(), isdigit(), isupper(),islower():

x='Albastru'? len (x)

8? len ('')

0 çirul vid? len ('Ana '+'Maria')

10? isalpha (x)

.T.y='123'z=123? isalpha (y)

.F.? isdigit (y)

.T.? isalpha (z)

mesaj de eroare? isupper (x)

.T.? islower (x)

.F.

3. GeneraÆi çiruri de caractere folosindfuncÆiile: replicate (), space():

? replicate ('*',10)**********

? replicate (chr(7),5)bip, bip, bip, bip bip

x='Buna'+space(8)+'ziua'? x

Buna ziua? len (x)

16? replicate(' ',10)=space(10)

.T.

At(), Atc(),Atline(),Atcline()

Rat(),Ratline()

Page 88: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 89

4. EliminaÆi sau inseraÆi spaÆii çi in-seraÆi caractere într-un çir de carac-tere folosind funcÆiile: alltrim(), ltrim(),trim(), rtrim(), padc(), padl(), padr():

x= space(2)+'Popescu'+space(3)? len (x)

12? len (alltrim(x))

7? alltrim(x)=='Popescu'

.T.? len (ltrim(x))

10? len (rtrim(x))

9y= ltrim (x)? len (y)

10z=trim (y)? len (z)

7a='Salut'? padc (a,15,'*')

*****Salut*****? padc (a,16,'*')

*****Salut******? len(padc (a,15,'*'))

15? padl (a,10,'*')

*****Salut? padr (a,10,'*')

Salut*****? len(padr(a,15,'*'))= len(padl(a,15,' '))

.T.? len(padr(a,15,'*'))= len(padc(a,15,' '))

.T.

5. TransformaÆi un çir de caractere fo-losind funcÆiile: lower(), upper(),proper(), chrtran(), strtran(), stuff():

x= 'abc'y='ABC'? upper (x)

ABC? lower (y)

abc? lower(y) = x

.T.? upper(x) = y

.T.

? proper(x)Abc

? proper(y)Abc

? proper(y) = proper(upper(x)).T.

? proper(lower(y)) = proper(x).T.

? proper('AlFaBeT')Alfabet

? upper(x) = lower(y).F.

? upper(y) = lower(x).F.

? chrtran ('abcdef','bdf','111')a1c1e1

? chrtran ('abcdef','bdf','xyz')axcyez

? chrtran ('abcdef','bdf','12')a1c2e

? len (chrtran('abcdef','bdf','12'))5

? chrtran ('abcdef','bdf','xyzu')axcyez

? chrtran ('mosor','ms','tp')topor

? chrtran ('cotor','cor','nal')natal

a='Am cumparat bilet la "Ala Bala Portocala"'

b='la'c='na'd='vala'e=strtran(a,b,c,2)?e Am cumparat bilet la "Ana Bana

Portocana"e=strtran(a,b,d,2,1)?e

Am cumparat bilet la "Avala Bala Portocala"

?stuff('parcare',4,1,'taj')partajare

?stuff('caviar',3,3,'')car s-a çters subçirul 'via'

?stuff('car',3,0,'via')caviar s-a inserat subçirul 'via'

a=stuff('cod',4,0,'are')?a

codarea=stuff(a,1,0,'dec')?a

Page 89: SGBD Visual Foxpro

90 Informatică

decodare

6. ExecutaÆi operaÆii cu subçiruri decaractere folosind funcÆiile: left(),right(), substr(), at(), rat(), atc():

x= 'Marea Neagra'y='untdelemn'? left (x,5)

Marea? right (x,6)

Neagra? left(y,3)

unt? substr(y,4,2)

de? right(y,4)

lemn? left(y,3)=substr(y,1,3)

.T.? substr(y,len(y)-4+1,4) = right(y,4)

.T.a='str. Iezerului nr. 32'

? at ('nr', a)16

? at ('Nr', a)0

? atc ('Nr', a)16

? rat('nr', a)16

a='Ala Bala Portocala'? at ('la',a,1)

2? at ('la',a,2)

7? at ('la',a,3)

17? rat ('la',a,3)

2? occurs('co','cocor')

2? occurs('la',a)

3

2.3. Funcţii pentru date folosite pentru gestionarea timpuluiPentru aceste funcÆii argumentuleste de tip datå pentru ges-tionarea timpului sau de tip datåcalendaristicå.

Reprezentarea datei calendaris-tice se poate face în mai multeformate, conform tabelului.

Formatul determinå modul încare este interpretatå o datå detip datå calendaristicå atunci când este scriså de la tastaturå sau atunci când este cititådin memorie çi afiçatå pe ecran. Formatul implicit este cel american. Pentru schimbareaformatului se poate folosi comanda:

Set date to <format>Pentru an se pot specifica douå sau patru cifre. Formatul implicit este cu douå cifre.Acest format nu deranjeazå, în special în cazul anilor mai mici de 2000. Se poate cere çio afiçare a anului cu patru cifre folosind comanda:

Set century onSe poate modifica separatorul folosit în cadrul reprezentårii datei folosind comanda:

Set mark to ‘<delimitator>’Modul în care este afiçatå data pentru gestionarea timpului poate fi controlat cuurmåtoarele comenzi:

Tipul Formatul de reprezentareAmerican/MDY ll/zz/aa

Ansi aa.ll.zzBritish/French/DMY zz/ll/aa

German zz.ll.aaItalian zz-ll-aa

Japan/YMD aa/ll/zzUSA ll-zz-aa

Page 90: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 91

Set hours to 12|24care permite stabilirea unui format cu ziua formatå din 24 de ore sau a unui format cuziua împårÆitå în douå perioade de 12 ore (am çi pm) çi :

Set seconds on|offcare permite afiçarea timpului cu secunde (on) sau fårå secunde (off).

FuncÆia Sintaxa Ce reprezintå?FuncÆii pentru aflarea timpului

Date Date() Furnizeazå data curentå preluatå din sistem. Rezultatul estede tip datå calendaristicå.

DateTime DateTime() Furnizeazå data curentå çi momentul de timp preluate dinsistem. Rezultatul este de tip çir de caractere.

Time Time() Furnizeazå numai momentul de timp preluat din sistem.Rezultatul este de tip çir de caractere.

FuncÆii pentru extragerea informaÆiilor din datåArgumentul x poate fi datå calendaristicå sau datå pentru gestionarea timpului.

Argumentul y este o datå pentru gestionarea timpului.Rezultatul poate fi de tip N (numeric) sau C (çir de caractere).

Day Day(x) Furnizeazå numårul zilei din lunå. Rezultatul este de tip N.Dow Dow(x) Furnizeazå numårul zilei din såptåmânå. Rezultatul este de tip N.Cdow Cdow(x) Furnizeazå numele zilei din såptåmânå. Rezultatul este de tip C.Week Week(x) Furnizeazå numårul såptåmânii din an. Rezultatul este de tip N.Month Month(x) Furnizeazå numårul lunii din an. Rezultatul este de tip N.Cmonth Cmonth(x) Furnizeazå numele lunii. Rezultatul este de tip C.Year Year(x) Furnizeazå numårul anului. Rezultatul este de tip N (cu patru cifre).Hours Hours(y) Furnizeazå numårul orei. Rezultatul este de tip N.Minute Minute(y) Furnizeazå numårul minutelor. Rezultatul este de tip N.Sec Sec(y) Furnizeazå numårul secundelor. Rezultatul este de tip N.Seconds Seconds() Furnizeazå numårul secundelor scurse de la miezul nopÆii.

Rezultatul este de tip N (real, în care partea întreagå reprezintåsecundele, iar partea fracÆionarå milisecundele).

FuncÆii pentru modificarea dateiGomonth Gomonth(x,n) Argumentul x este de tip datå calendaristicå, iar argumentul n

de tip numeric întreg. FuncÆia furnizeazå un rezultat de tipdatå calendaristicå a cårei lunå este incrementatå cu n, da-cå n este pozitiv çi decrementatå cu n, dacå n este negativ.

PrelucraÆi date folosite pentru gestionarea timpului:

1. ExtrageÆi informaÆii din timpul siste-mului folosind funcÆiile: date(), time(),timedate():

? date()03/02/01

set date to british? date()

Page 91: SGBD Visual Foxpro

92 Informatică

02/03/01set century on? date()

02/03/2001set century off? time()

16:52:50? datetime()

02/03/01 04:53:00 PMset hours to 24? datetime()

02/03/01 16:54:23

2. ExtrageÆi informaÆii despre ziua din da-tå folosind funcÆiile: day(), dow(),cdow():

d={10/05/01}? day(d)

10? dow(d)

5? cdow(d)

Thursday

3. ExtrageÆi informaÆii despre såptåmânadin datå folosind funcÆia: week():

? week(d)19

4. ExtrageÆi informaÆii despre luna din datåfolosind funcÆiile: month(), cmonth():

? month (d)5

? cmonth (d)May

? gomonth(d,3)10/08/01

5. ExtrageÆi informaÆii despre an din datåfolosind funcÆia: year():

? year(d)2001

6. ExtrageÆi informaÆii despre orå, minuteçi secunde din datå folosind funcÆiile:hours(), minute(), sec(), seconds():

d=datetime()? hours(d)

17? minute(d)

14? sec(d)

12? seconds()

62135.20

2.4. Funcţii folosite pentru conversiiPentru a realiza unele operaÆii este necesar ca un tip de datå så fie transformat într-un alttip de datå. Transformarea se face folosind funcÆiile pentru conversii. Se pot realizaurmåtoarele conversii:

a. tip numeric ↔↔ tip çir de caractere

FuncÆia Sintaxa Ce reprezintå?Str Str(m,n,p) Argumentele m,n çi p sunt de tip numeric. FuncÆia converteçte

numårul m într-un çir de caractere de lungime n care conÆine ppoziÆii pentru zecimale (cifre situate dupå punctul zecimal). Dacånumårul conÆine mai multe poziÆii decât argumentul n, rezultatul va

Val()tip numeric tip çir de caractere

Str()

Page 92: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 93

FuncÆia Sintaxa Ce reprezintå?fi un çir de asteriscuri. Dacå numårul conÆine mai puÆine poziÆiidecât argumentul n, çirul de caractere va fi completat cu spaÆiipânå la obÆinerea lungimii n. Dacå numårul p este mai mic decâtnumårul de poziÆii zecimale, partea zecimalå va fi trunchiatå.

Val Val(x) Argumentul x este de tip çir de caractere. El trebuie så conÆinånumai caracterele: cifre, punctul zecimal sau semnul minus, altfelconversia se va face eronat. FuncÆia converteçte çirul de caracterex într-un numår.

b. tip datå calendaristicå ↔↔ tip çir de caractere

FuncÆia Sintaxa Ce reprezintå?Dtoc Dtoc(x) Argumentul x este de tip datå calendaristicå. FuncÆia furnizeazå un

çir de 8 caractere care reprezintå data. Are forma ll/zz/aa (douåcaractere pentru numårul lunii, douå pentru numårul zilei çi douåpentru numårul anului, separarea fåcându-se cu caracterul /).

Dtos Dtos(x) Argumentul x este de tip datå calendaristicå. FuncÆia furnizeazå unçir de 8 caractere care reprezintå data. Are forma aaaallzz (patrucaractere pentru an, douå pentru numårul lunii çi douå pentrunumårul zilei).

Ctod Ctod(x) Argumentul x este de tip çir de caractere care formeazå o datåcalendaristicå. FuncÆia furnizeazå data calendaristicå precizatåprin çirul de caractere.

c. tip datå pentru timp ↔↔ tip çir de caractere

FuncÆia Sintaxa Ce reprezintå?Ttoc Ttoc(x) Argumentul x este de tip datå pentru gestionarea timpului. FuncÆia

converteçte aceastå datå într-un çir de caractere.Ctot Ctot(x) Argumentul x este de tip çir de caractere. Çirul de caractere este de

forma zz/ll/aa hh:mm:ss apm (câte douå caractere pentru fiecareelement: zi, lunå, an, orå, minut, secundå çi am/pm). FuncÆiaconverteçte çirul de caractere într-o datå pentru gestionarea timpului.

Ctod()tip datå calendaristicå tip çir de caractere

Dtoc(), Dtos()

Ctot()tip datå pentru timp tip çir de caractere

Ttoc()

Page 93: SGBD Visual Foxpro

94 Informatică

d. tip datå pentru timp ↔↔ tip datå calendaristicå

FuncÆia Sintaxa Ce reprezintå?Ttod Ttoc(x) Argumentul x este de tip datå pentru gestionarea timpului. FuncÆia

converteçte aceastå datå într-o datå calendaristicå.Dtot Ctot(x) Argumentul x este de tip datå calendaristicå. FuncÆia converteçte

aceastå datå într-o datå pentru gestionarea timpului, considerândora 12:00:00 am.

ObservaÆie:Avantajul folosirii funcÆiei Dtos() în locul funcÆiei Dtoc() este acela cå formatul furnizat deea permite compararea corectå a douå date calendaristice.

FaceÆi conversii între tipuri de date:

1. ConvertiÆi numere ⇔ çiruri de carac-tere folosind funcÆiile: val(), str():

a='10'b='15'? a+b

1015? val(a)+val(b)

25.00c='-10'? val(c)

-10x=val ('10,25')? type('x')

N? x

10.00? val ('10a10')

10.00a=10b=15? a+b

25? str(a)+str(b)

10 15? len(str(a)+str(b))

20? str(a,2)+str(b,2)

1015? len(str(a,2)+str(b,2))

4a=12.5? str(a)

13? len(str(a))

10a=12345123451? str(a)

.1234E+11? len(str(a))

10

2. ConvertiÆi date calendaristice ⇔ çiruride caractere folosind funcÆiile: dtoc(),dtos(), ctod():

d1={08/03/01}d2={07/04/01}x=dtoc(d1)?x

08/03/01y=dtoc(d2)

Dtot()tip datå pentru timp tip datå calendaristicå

Ttod()

Page 94: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 95

?y07/04/01

?x>y.T.

x=dtos(d1)?x

20010308y=dtos(d2)?y

20010407?x>y

.F.

3. ConvertiÆi data calendaristicå ⇔ mo-ment de timp folosind funcÆiile: dtot(),ttod():

a=datetime()? ttod(a)

02/03/01b=date()? dtot(b)

02/03/01 00:00:00set hour to 12? dtot(b)

02/03/01 12:00:00 AM

4. ConvertiÆi çir de caractere ⇔ mo-ment de timp folosind funcÆiile: ctot(),ttoc():

a=datetime()? a

02/03/01 04:52:12 PMb = ttoc(a)? b

02/03/01 04:52:12 PM?type('b')

Cc=ctot(b)? c

02/03/01 04:52:12 PM?type('c')

T

2.5. Funcţii de uz generalAceste funcÆii se pot aplica pe mai multe tipuri de date:

FuncÆia Sintaxa Ce reprezintå?Min()Max()

Min(x1,x2,…)Max(x1,x2,…)

Argumentele x1, x2,… trebuie så fie de acelaçi tip. FuncÆiacomparå între ele toate argumentele çi furnizeazå carezultat valoarea cea mai micå, respectiv cea mai mare.

Between() Between(x,y,z) Argumentul x, y çi z trebuie så fie de acelaçi tip. FuncÆiatesteazå dacå valoarea argumentului x se gåseçte întrevalorile y çi z. FuncÆia furnizeazå un rezultat logic (.T. dacåeste îndeplinitå relaÆia y<x<z).

Iif() Iif(x,y,z) Argumentul x trebuie så fie de tip logic. Rezultatul furnizatdepinde de valoarea lui x. Dacå x=.T., funcÆia afiçeazå va-loarea lui y, iar dacå x=.F., funcÆia afiçeazå valoarea lui z.

Inlist() Inlist(x1,x2,x2,…)

FuncÆia furnizeazå un rezultat logic. Ea testeazå dacåprimul argument x1 se gåseçte în lista descriså de ceilalÆiparametri, x2, x3,… . În cazul în care valoarea se gåseçteîn listå, rezultatul este .T..

Type() Type(x) Testeazå tipul unui argument x scris ca un çir de caracte-re. În funcÆie de conÆinutul çirului de caractere funcÆia vafurniza printr-o literå rezultatul: N-numeric, C-çir de carac-tere, L-logic, D-datå calendaristicå, T-timp calendaristic,M-memo, Y-monetar, O-obiect, G-general, U-necunoscut.

Empty Empty(x) Testeazå dacå o datå este vidå. Rezultatul furnizat este detip logic. Dacå data este vidå, rezultatul este .T..

Page 95: SGBD Visual Foxpro

96 Informatică

FuncÆia Sintaxa Ce reprezintå?Evaluate Evaluate(x) FuncÆia evalueazå un argument x scris ca un çir de carac-

tere. În funcÆie de conÆinutul çirului de caractere, funcÆia vafurniza un rezultat de tip çir de caractere, numeric, datåcalendaristicå.

ObservaÆii:1. O datå vidå este o datå care conÆine elementul neutru (nul) pentru acel tip de datå. De

aceea, conÆinutul unei date vide diferå în funcÆie de tipul datei. Astfel:Tipul datei Formatul de reprezentareçir de caractere çirul vid sau çirul de caractere format numai din spaÆii

(Chr(30)), caractere nul (Chr(0)), caractere Tab (Chr(9))çi caractere sfârçit de linie (Chr(13), Chr(10)).

numeric 0datå calendaristicå {} sau {//}logic .F.2. FuncÆia Evaluate poate identifica tipul datelor din çirul de caractere. De exemplu,

evaluate(‘2*5+5’) furnizeazå un rezultat de tip numeric egal cu 15, funcÆia evaluate(‘2>5’)furnizeazå un rezultat de tip logic egal cu .F., funcÆia evaluate(‘{05/03/01}+2’) furnizeazåun rezultat de tip datå calendaristicå egal cu data 05/05/01, iar funcÆiaevaluate(‘"abc"+"123"’) furnizeazå un rezultat de tip çir de caractere egal cu abc123.

3. FuncÆia Type poate identifica tipul expresiei scrise ca çir decaractere. De exemplu, type(‘5+5’) furnizeazå tipul nume-ric (N), funcÆia type(‘2>5’) furnizeazå tipul logic (L), funcÆiatype(‘{05/05/01}+10’) furnizeazå tipul datå calendaristicå(D), iar funcÆia type(‘$20.00’) furnizeazå tipul monetar (Y).

4. FuncÆia Iif(x,y,z) poate fi folositå pentru o structurå alter-nativå care este descriså în pseudocod astfel: if x thenwrite y else write z endif.

PrelucraÆi date de tipuri diferite cu ajutorul funcÆiilor generale1. AtribuiÆi o valoare întreagå unei variabile de memorie çi verificaÆi dacå acel numår

este divizibil prin 3:a=1b1='Numarul este divizibil prin 3'b2='Numarul nu este divizibil prin 3'? iif(a % 3 = 0, b1, b2)

Numarul nu este divizibil prin 3a=9? iif(a % 3 = 0, b1, b2)

Numarul este divizibil prin 3

2. TestaÆi dacå o variabilå de memorie este vidå:

x

yz

danu

Page 96: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 97

b1='Variabila de memorie este vida'b2='Variabila de memorie nu este vida'a=''? iif(empty(a), b1, b2)

Variabila de memorie este vidaa=0? iif(empty(a), b1, b2)

Variabila de memorie este vidaa=date()? iif(empty(a), b1, b2)

Variabila de memorie nu este vida

3. CalculaÆi maximul çi minimul:

a=1b=2c=3? max(a,b,c)

3? min(a,b,c)

1? max('a','b','c')

c? min('a','b','c')

a

4. TestaÆi dacå un element existå în listå:

a=1c=inlist(a,1,2,3,4,5)b1='Elementul este in lista'b2='Elementul nu este in lista'?iif(c,b1,b2)

Elementul este in listaa=10c=inlist(a,1,2,3,4,5)?iif(c,b1,b2)

Elementul nu este in lista

a='A'c=inlist(lower(a),'a','e','i','o','u')b1='Este vocala'b2='Nu este vocala'?iif(c,b1,b2)

Este vocalaa='B'c=inlist(lower(a),'a','e','i','o','u')?iif(c,b1,b2)

Nu este vocala

5. TestaÆi dacå o variabilå de memorie aparÆine unui interval:

a='a'c=between(a, 'a','z')b1='litera mica'b2='litera mare'? iif(c,b1,b2)

litera micaa='M'c=between(a, 'a','z')? iif(c,b1,b2)

litera marevarsta=10b1='minor'b2='major'? iif(between(varsta,0,17), b1, b2)

minorvarsta=18? iif(between(varsta,0,17), b1, b2)

major

3 . C o m e n z i p e n t r u v a r i a b i l e d e m e m o r i e

ÇtiÆi cå o variabilå de memorie reprezintå o zonå de memorie cåreia i se atribuie un numeçi în care se poate memora valoarea unei date elementare de un anumit tip. Referirea lavariabila de memorie se face prin numele såu.

Page 97: SGBD Visual Foxpro

98 Informatică

Visual Fox Pro foloseçtevariabile de memorie utilizator,variabile de memorie sistem.

Variabilele de memorie sistem sunt variabile proprii aplicaÆiei, pe care aceasta lecreeazå automat la lansarea în execuÆie çi pe care le påstreazå în memorie atât timp câteste în execuÆie. Aceste variabile nu sunt çterse de comenzile obiçnuite de çtergere avariabilelor de memorie. Identificatorul lor începe cu caracterul linie de subliniere _.Variabilele de sistem sunt folosite de cåtre aplicaÆie pentru configurarea mediului VisualFoxPro (de exemplu, configurarea formatelor de ieçire cåtre ecran sau cåtre imprimantå).

Variabilele de memorie utilizator sunt create de cåtre utilizatorul aplicaÆiei. Crearea lorînseamnå: atribuirea unui nume, stabilirea tipului datelor pentru a se rezerva cores-punzåtor o zonå de memorie çi atribuirea unei valori iniÆiale.

Asupra unei variabile de memorie se pot executa operaÆii de creare çi consultare.

Crearea unei variabile de memorie se face prin:

1. iniÆializare folosindoperaÆia de atribuire a unei valori (constantå sau valoare obÆinutå prin evaluareaunei expresii)comanda Store care are sintaxa:

Store <expresie> to <listå_nume_variabile>

2. introducerea unei valori de la tastaturå, folosind comenzile:Accept. Este recomandatå pentru tipul de date çir de caractere.Input. Este recomandatå pentru tipul de date numeric.Wait. Este recomandatå pentru un singur caracter. Sistemul açteaptå acÆionareaunei taste. Caracterul tastei acÆionate poate fi påstrat într-o variabilå de memorie.Aceste trei comenzi au sintaxa:

Accept | Input | Wait [<expresie>] to <nume_variabilå>

Adverbul <expresie> este opÆional çi este de tip çir de caractere. El reprezintå un mesajafiçat pe ecran, ca un prompter, care informeazå utilizatorul despre operaÆia de introdu-cere date care urmeazå så se execute.

Consultarea unei variabile de memorie înseamnå vizualizarea conÆinutului ei pe ecransau la imprimantå. Pentru vizualizarea pe ecran puteÆi folosi comenzile:

?. Înaintea afiçårii, cursorul este poziÆionat pe rândul urmåtor.??. Înaintea afiçårii, cursorul råmâne în poziÆia curentå. Cele douå comenzi au sintaxa:

? | ?? <listå_nume_variabile>

Pentru vizualizarea la imprimantå puteÆi folosi comanda:???. Comanda trimite cåtre imprimantå un çir de caractere exprimat printr-oexpresie de tip çir de caractere care poate conÆine çi variabile de memorie:

??? <expresie>

Page 98: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 99

PuteÆi obÆine informaÆii complexe despre un grup de variabile de memorie (nume, dacåsunt publice1 - public sau particulare - private, tip, valoare) folosind comenzile ListMemory çi Display Memory:

List | Display Memory [Like <çablon>] [ to print | to file <nume_fiçier>]<çablon> reprezintå descrierea grupului de variabile folosind convenÆiile clasice pentrucaracterele de înlocuire ? çi *. Lista de variabile de memorie poate fi afiçatå pe ecran saula imprimantå (to print) ori salvatå într-un fiçier (to file <nume_fiçier>).

Chiar dacå sistemul vå permite så definiÆi 65.000 de variabile de memorie, este bine såçtergeÆi variabilele de memorie pe care nu le mai folosiÆi. OperaÆia se numeçte eliberareamemoriei interne. PuteÆi folosi urmåtoarele comenzi:1. pentru eliberarea globalå (çtergerea tuturor variabilelor de memorie):

Comanda Clear Memory çterge toate variabilele de memorie çi toate tablourile dememorie, låsând numai variabilele de sistem.Comanda Clear All çterge çi ea toate variabilele de memorie çi toate tablourile dememorie, låsând numai variabilele de sistem. Suplimentar elibereazå çi celelaltezone de memorie ocupate de diferite obiecte Visual FoxPro: meniuri, ferestre,controale definite de utilizator çi tabele ale bazei de date deschise, inclusiv fiçierelefolosite pentru exploatarea bazei de date.

2. pentru eliberarea selectivå (çtergerea anumitor variabile de memorie) veÆi folosiuna dintre urmåtoarele comenzi (alegerea se va face în funcÆie de modul în careputeÆi så descrieÆi grupul de variabile de memorie):

Comanda Release All çterge variabilele de memorie çi tablourile de memorieprecizate printr-un çablon: variabilele çterse pot så corespundå çablonului (Like)sau pot så nu corespundå çablonului (Except). Sintaxa comenzii este:

Release All [Like | Except <çablon>]Comanda Release çterge variabilele de memorie çi tablourile de memorieprecizate printr-o listå. VeÆi alege aceastå comandå dacå nu puteÆi så descrieÆigrupul de variabile de memorie printr-un çablon. Sintaxa comenzii este:

Release <listå_nume_variabile>

La închiderea sesiunii de lucruVisual FoxPro, are loc o çtergerea conÆinutului memoriei internealocatå aplicaÆiei çi se pierdeconÆinutul variabilelor de memo-rie folosite. Ele pot fi salvate(save) într-un fiçier (cu extensia .mem) de unde pot fi readuse ulterior în memoria internå,operaÆie numitå restaurare (restore). Comenzile folosite pentru aceste operaÆii sunt:

Comanda Save to salveazå într-un fiçier identificat prin nume toate variabilele de me-morie sau numai cele care corespund (Like) sau nu corespund (Except) unui çablon:

Save to <nume_fiçier> [All Like | Except <çablon>]

1 O variabilå publicå sau globalå poate fi folositå de orice subprogram al aplicaÆiei, iar o variabilåparticularå sau localå poate fi folositå numai în subprogramul în care a fost creatå. Toatevariabilele create în fereastra de comenzi sunt publice.

Save tomemoria internå memoria externå

(variabile de memorie) (fiçier .mem)

Restore from

Page 99: SGBD Visual Foxpro

100 Informatică

Comanda Restore from readuce în memoria internå variabilele de memorie dintr-unfiçier identificat prin nume; dacå nu se precizeazå clauza additive, variabilele de memo-rie çi tablourile de memorie care existau în memorie înaintea restaurårii vor fi distruse:

Restore from <nume_fiçier> [Additive]

PrelucraÆi variabile de memorie

1. CreaÆi variabile de memorie; înainte de a crea aceste variabile de memorie eliberaÆimemoria de orice alte variabile de memorie create anterior:

clear memorystore 0 to a1, a2, a3store .T. to b1, b2x1='alfa'x2='beta'a1=2a2=7

store a1*a2 to a3accept 'Scrieti numele: ' to nume

Scrieti numele: Popescuinput 'Scrieti varsta: ' to varsta

Scrieti varsta: 18wait 'Raspundeti cu o litera: ' to b3

Raspundeti cu o litera: x

2. ConsultaÆi variabilele de memorie:? a1, a2, a3

2 7 14?? a1, a2, a3

2 7 14 ( pe acelaçi rând cu råspunsul comenzii precedente)? nume, varsta

Popescu 18? b1, b2, b3, x1, x2

.T. .T. x alfa betalist memory like a?

a1 Pub N 2 ( 2.00000000)a2 Pub N 7 ( 7.00000000)a3 Pub N 14 ( 14.00000000)

list memory like ?1a1 Pub N 2 ( 2.00000000)b1 Pub L .T.x1 Pub C "alfa'

3. EliberaÆi memoria internå : display memory sunt afiçate informaÆii despre toate variabilele definite anterior: a1, a2, a3, b1, b2, b3, x1, x2, nume, vârsta release varsta, nume display memory

sunt afiçate informaÆii despre variabilele råmase: a1, a2, a3, b1, b2, b3, x1, x2 release all like a? display memory

sunt afiçate informaÆii despre varia- bilele råmase: b1, b2, b3, x1, x2 release all except b? display memory

sunt afiçate informaÆii despre varia- bilele råmase: b1, b2, b3 release all display memory nu mai sunt afiçate informaÆii despre variabile utilizator

Page 100: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 101

4. TestaÆi urmåtoarea secvenÆå de instrucÆiuni pentru mai multe valori ale variabilelor a,b çi c, definite astfel: (a,b,c)∈ {(2,3,4), (2,3,3), (3,3,3), (2,1,4)}.

input 'a= ' to ainput 'b= ' to binput 'c= ' to cb1='Nu este triunghi'b2='Triunghi oarecare'b3='Triunghi echilateral'b4='Triunghi isoscel'c1=a+b>c and b+c>a and c+a>bc2= a=b and b=cc3= a=b or a=c or b=c ? iif(c1, iif(c2, b3, iif(c3 b4,b2)),b1)

Ce realizeazå aceastå secvenÆå de comenzi? ScrieÆi secvenÆa de comenzi într-un fiçierde tip program executabil cu numele alfa. FolosiÆi comanda:

modify command alfaExecutaÆi programul pentru fiecare valoare a tripletului (a,b,c) din mulÆimea de definiÆie.Pentru executarea programului folosiÆi comanda:

do alfa5. TestaÆi urmåtoarea secvenÆå de instrucÆiuni pentru mai multe valori ale variabilelor a,

b çi c, definite astfel: (a,b,c)∈ {(2,3,4), (5,3,4), (2,3,3), (2,1,4)}input 'a= ' to ainput 'b= ' to binput 'c= ' to cx=a^2y=b^2z=c^2b1='nu este triunghi'b2='triunghi dreptunghic'b3='triunghi ascutitunghic'b4='triunghi optuzunghic'c1=a+b>c and b+c>a and c+a>bc2=x+y=z or y+z=x or z+x=yc3=x+y>z and y+z>x and z+x>yc4=x+y<z or y+z<x or z+x<y? iif(c1, iif( c2,b2, iif(c3,b3, iif(c4,b4,''))),b1)

Ce realizeazå aceastå secvenÆå de comenzi? ScrieÆi secvenÆa de comenzi într-un fiçierde tip program executabil cu numele beta. FolosiÆi comanda:

modify command betaExecutaÆi programul pentru fiecare valoare a tripletului (a,b,c) din mulÆimea de definiÆie.Pentru executarea programului folosiÆi comanda:

do betaÎnlocuiÆi ultima comandå din program cu comanda:

? iif(c1, iif( c2,b2, iif(c3,b3,b4)),b1)ReluaÆi execuÆia programului modificat pentru fiecare valoare a tripletului (a,b,c) dinmulÆimea de definiÆie. Ce constataÆi?

Page 101: SGBD Visual Foxpro

102 Informatică

ÎncercaÆi:

AråtaÆi corespondenÆele:Se evalueazå funcÆia:

?iif(inlist(n,1,2,3,4,5,6), iif(2**n=a,'1 octet', iif(2**n=b, ' 2 octeti',iif(2**n=c, '8 octeti', 'incorect'))), 'incorect')

unde a=8, b=16, c=64. LegaÆi prin linii fiecare element din coloana n de elementulcorespunzåtor din coloana Afiçeazå:

n: Afiçeazå:

12 a 1 octet34 b 2 octeÆi56 c 8 octeÆi78 d incorect

Adevårat/Fals:1. FuncÆia isdigit('123') furnizeazå rezultatul adevårat.2. Pentru a afiça çirul de caractere 12345 din numårul întreg 12345 folosiÆi funcÆia

str(12345,5,0).3. Rezultatul funcÆiei max(day(d)+2,month(d)+5) este 7 pentru valoarea {02/04/01} a

variabilei de memorie d afiçatå în formatul american.4. FuncÆia prin care convertiÆi un caracter în codul såu ASCII se numeçte val.5. EliminaÆi spaÆiile din stânga unui çir de caractere cu funcÆia left().6. FuncÆia at() înlocuieçte într-un çir de caractere un subçir cu un alt subçir.7. FuncÆia floor() se foloseçte pentru aproximarea unui numår.8. Comanda ?? se foloseçte pentru a afiça la imprimantå un çir de caractere.

CompletaÆi:1. FuncÆia mod(10,5) furnizeazå rezultatul …………2. FuncÆia len(padc(5,'alfa')) afiçeazå valoarea ......3. FuncÆia occurs('a','calamar') afiçeazå rezultatul ...............4. FuncÆia prin care convertiÆi un numår într-un çir de caractere se numeçte ........5. Pentru a extrage n caractere dintr-un çir de caractere folosiÆi funcÆia ..............6. FuncÆia str() cu care puteÆi så obÆineÆi çirul de caractere 123 din numårul 123.45 este ....7. Pentru a obÆine valoarea numericå 23 din çirul de caractere .1234 veÆi folosi funcÆiile: ......8. Pentru a obÆine valoarea 23 din numårul 1234 veÆi folosi funcÆiile .............

AlegeÆi råspunsurile corecte:1. FuncÆia ceiling(-3.5) afiçeazå:

a) -3 b) -4 c) 42. FuncÆia round(3.5) afiçeazå:

a) 3 b) 4 c) eroare

Page 102: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 103

3. FuncÆia floor(3.5) afiçeazå:a) 3 b) 3.5 c) 4

4. FuncÆia int(-3.5) afiçeazå:a) -3 b) -4 c) 3

5. SecvenÆa de comenzi set decimals to 3 çi ?pi() afiçeazå:a) 3.1 b) 3.14 c) 3.142

6. FuncÆia inlist(1, 2, 3, 4) furnizeazå rezultatul:a) .T. b) .F. c) 10

7. FuncÆia between(1, 2, 3) furnizeazå rezultatul:a) .T. b) .F. c) 6

8. FuncÆia type('2B') furnizeazå rezultatul:a) N b) C c) U

9. Data d are valoarea {05/04/01} în formatul american. Rezultatul furnizat de funcÆiamin(day(d)-2, month(d)-2,year(d)) are valoarea:

a) 1 b) 2 c) 310. FuncÆia strtran('ala bala','a','o',2,1) furnizeazå rezultatul:

a) olo bala b) alo bala c) alo bolo11. FuncÆia str (12345,3, 2) furnizeazå rezultatul:

a) 123.45 b) 12.345 c) eroare12. Care dintre urmåtoarele expresii logice va furniza rezultatul .T. dacå çi numai dacå

expresia w începe cu un caracter special:a) not (isalpha(w) and isdigit(w))b) not (isalpha(w) or isdigit(w))c) not isalpha(w) and not isdigit(w)d) not isalpha(w) or not isdigit(w)

13. Dacå x='1234.56a', funcÆia val (left(x,6)) furnizeazå rezultatul:a) 1234.56 b) 1234.50 c) eroare

14. Dacå x='10.5' çi y=',25', pentru a obÆine valoarea numericå 10.25 folosiÆi:a) val(left(x,2)+y) b) val(left(x,2))+val(y) c) val(x+y)-0.25 d) val(x+y)

RåspundeÆi:1. Cum puteÆi afiça o expresie la imprimantå? De ce tip trebuie så fie expresia?2. CâÆi parametri are funcÆia round()? Ce se întâmplå dacå lipseçte un parametru?3. CâÆi parametri are funcÆia string()? Ce se întâmplå dacå lipseçte un parametru?4. Ce funcÆii puteÆi folosi pentru a testa primul caracter dintr-un çir de caractere?5. Ce funcÆii puteÆi folosi pentru a genera un çir de caractere?6. Ce funcÆii puteÆi folosi pentru a elimina spaÆiile dintr-un çir de caractere? Ce criterii de

comparare puteÆi folosi pentru aceste funcÆii?7. Ce funcÆii puteÆi folosi pentru a insera un subçir de caractere într-un çir de caractere?8. Ce funcÆii puteÆi folosi pentru a çterge un subçir de caractere într-un çir de caractere?9. Ce funcÆii puteÆi folosi pentru a descompune un cuvânt compus în cuvintele care îl compun?10. Cu ce comandå puteÆi stabili formatul unei date calendaristice? Cum se numeçte for-

matul zz/ll/aa?

Page 103: SGBD Visual Foxpro

104 Informatică

11. Ce funcÆie puteÆi folosi pentru a testa dacå valoarea unei date aparÆine unui interval?Dar pentru a testa dacå aparÆine unei mulÆimi de valori?

12. Ce funcÆie puteÆi folosi pentru a descrie o structurå alternativå?13. ScrieÆi funcÆiile prin care puteÆi så realizaÆi urmåtoarele transformåri de cuvinte:

cor ⇒ colorcovor ⇒ cotor ⇒ color ⇒ cosor ⇒ cosarcovor ⇒ cotor ⇒ motor ⇒ mosorcalculator ⇒ calator ⇒ abator ⇒ abatere

14. ScrieÆi funcÆiile prin care descompuneÆi în cuvintele componente urmåtoarele cuvintecompuse çi expresii: viÆa de vie, Spitalul de UrgenÆå, Delta Dunårii çi cocoçul de munte.

15. Trebuie så çtergeÆi un grup de variabile de memorie. Ce operaÆie veÆi folosi dacå puteÆi sådescrieÆi grupul printr-un çablon? Ce operaÆie veÆi folosi dacå nu puteÆi så descrieÆi grupulprintr-un çablon?

RRåspunsuri:AråtaÆi corespondenÆele: 1-d; 2-d; 3-a; 4-b; 5-d; 6-c; 7-d; 8-d.Adevårat/Fals: 1-A; 2-A; 3-A; 4-F; 5-F; 6-F; 7-A; 8-F.CompletaÆi: 1-0; 2-5; 3-3; 4-str(); 5-substr(); 6-str(123.45,3); 7-int(val(substr('.1234',3,2)));8-int(val(substr(str(1234,4),2,2)))AlegeÆi råspunsurile corecte: 1-a; 2-c; 3-a; 4-a; 5-c;6-b; 7-b; 8-c; 9-b; 10-b; 11-c;12-b,c; 13-b; 14-a,b,c.

TT est pentru evaluare:

1. CreaÆi variabilele de memorie a1 de tip numeric, a2 de tip çir de caractere, a3 de tipdatå calendaristicå çi a4 de tip logic. Variabilele de memorie trebuie så fie vide.VerificaÆi cå aÆi definit corect variabilele de memorie afiçând tipul çi dacå sunt vide.

2. VizualizaÆi conÆinutul variabilelor de memorie create.3. AflaÆi ce tip de rezultat furnizeazå funcÆia Seconds().4. ModificaÆi conÆinutul variabilei de memorie astfel încât så-çi påstreze tipul. În cele

patru variabile de memorie veÆi påstra urmåtoarele informaÆii:a1 - numårul de secunde scurse de la miezul nopÆii,a2 - un çir de caractere format din 10 grupuri de caractere *1!,a3 - data curentå,a4 - rezultatul comparårii expresiilor e1 çi e2: e1 = (72/5+5)*5 çi e2 = (40-6+2*8)*2

VizualizaÆi conÆinutul variabilelor de memorie çi verificaÆi dacå çi-au påstrat tipul.VizualizaÆi variabila de memorie de tip datå calendaristicå în formatul zz/ll/aa.5. AfiçaÆi pe ecran o linie cu urmåtorul conÆinut:

zz/ll/aa ********** Buna ziua ********** hh:mm:ssAfiçarea se va face printr-o singurå comandå, fårå a folosi variabile de memorie.6. CopiaÆi conÆinutul variabilelor de memorie a1, a2, a3 çi a4 în variabilele de memorie

b1, b2, b3 çi b4.7. AfiçaÆi urmåtoarele informaÆii:

Page 104: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 105

partea întreagå din numårul memorat în variabila de memorie b1,numårul memorat în variabila de memorie b1, rotunjit la partea întreagå, prin adåugare,numårul memorat în variabila de memorie b1, rotunjit la partea întreagå, prin pierdere,

ExtrageÆi partea fracÆionarå din numårul memorat în variabila de memorie b1.8. MemoraÆi în variabilele de memorie a1, a2, …, a6 cuvintele din urmåtorul text:

Uf! Am terminat o saptamana obositoareFolosind macrosubstituÆia prin intermediul variabilei de memorie z, afiçaÆi textul pe ecran.MemoraÆi textul în variabila de memorie w.9. AfiçaÆi textul:

Uf! Am terminat o saptamana obositoare!!!astfel încât la sfârçitul tipåririi så se audå un semnal sonor.10. Folosind textul din variabila de memorie w, scrieÆi pe ecran urmåtoarele texte:

Uf! Am Terminat O Saptamana Obositoare!!!uf! am terminat o saptamana obositoare!!!

UF! AM TERMINAT O SAPTAMANA OBOSITOARE!!!uf! Terminat OBOSITOARE

11. VerificaÆi dacå existå çirul de caractere ‘oa’ în variabila de memorie w. Dacå existå,aflaÆi poziÆia în care se gåseçte. ExecutaÆi operaÆia în douå moduri.

12. AfiçaÆi în ce zi a såptåmânii suntem.13. AfiçaÆi câte zile mai sunt pânå la sfârçitul anului. AfiçaÆi câte såptåmâni mai sunt

pânå la sfârçitul anului sub forma urmåtorului mesaj:Mai sunt nn saptamani si m zile.

Unde nn reprezintå numårul de såptåmâni, iar m numårul de zile.14. AfiçaÆi ora sub forma unui çir de caractere: ===== hh:mm:ss =====

ExecutaÆi operaÆia în patru moduri diferite.15. ConstruiÆi variabila de memorie t care conÆine urmåtorul çir de caractere: 5 spaÆii, ora

çi 5 spaÆii. AfiçaÆi conÆinutul çirului çi lungimea lui.16. EliminaÆi spaÆiile din çirul de caractere memorat în variabila t. ExecutaÆi operaÆia în douå

moduri diferite. MemoraÆi çirul de caractere fårå spaÆii în variabila de memorie u.ComparaÆi lungimile celor douå çiruri de caractere. AfiçaÆi diferenÆa dintre lungimile lor.

17. TransformaÆi printr-o funcÆie pentru date de tip çir de caractere urmåtoarele cuvinte:copac ⇒ capac çi capac ⇒ copac. ExecutaÆi operaÆia în douå moduri diferite.

18. ScrieÆi un program care så rezolve urmåtoarea problemå:Pentru executarea unei piese sunt necesare x minute. AfiçaÆi timpul necesar confec-Æionårii a n piese, exprimat în numår de zile, ore çi minute. La fabricarea pieselor selucreazå în ritm continuu (24 de ore pe zi).

19. AfiçaÆi lista cu variabilele de memorie pe care le-aÆi creat. În aceastå listå se gåsescçi variabilele de memorie definite în programul de la punctul 18. De ce?

20. ÇtergeÆi variabilele de memorie a1, b2 çi u. VerificaÆi cå operaÆia s-a executat corect.21. ÇtergeÆi variabilele de memorie b1, b3 çi b4. VerificaÆi cå operaÆia s-a executat

corect.22. ÇtergeÆi toate variabilele de memorie, mai puÆin variabila t. VerificaÆi cå operaÆia s-a

executat corect.23. EliberaÆi memoria internå.

Page 105: SGBD Visual Foxpro

106 Informatică

RRåspunsuri:1) a1=0 | a2=space(0) | a3={ / / } | a4=.F. | ? empty(a1) | ? empty(a2) | ? empty(a3) | ? empty(a4) | ? type('a1'), a1 | ? type('a2'), a2 | ? type('a3'), a3 | ? type('a4'), a42) ? a1 | ? a2 | ? a3 | ? a4 3) ?type('seconds()')4) a1=seconds() | a2=replicate('*1!',10) | a3=date() | a4=((75/5+5)*5=(40-6+2*8)*2) ? type('a1'), a1 | ? type('a2'), a2 | ? type('a3'), a3 | ? type('a4'), a4 | set date to british | ?a35) ?dtoc(Date())+' '+replicate('*',10)+' Buna ziua '+replicate('*',10)+' '+time()6) b1=a1 | b2=a2 | b3=a3 | b4=a47) ?int(b1) | ?floor(b1) | ?ceiling(b1) | ?b1-int(b1) sau ?mod(b1,int(b1))8) b1=a1 | b2=a2 | b3=a3 | b4=a4 | z='a' | a1='Uf! ' | a2='Am ' | a3='terminat ' | a4='o ' | a5='saptamana ' | a6='obositoare' | ?&z.1+&z.2+&z.3+&z.4+&z.5+&z.6 | w=&z.1+&z.2+&z.3+&z.4+&z.5+&z.69) ?w+'!!!'+replicate(chr(7),5)10) ?proper(w)+'!!!' | ?lower(w)+'!!!' | ?upper(w)+'!!!' | ?left(lower(w),4)+substr(proper(w),8,9)+right(upper(w),10)11) ?at('oa',w) | ?rat('oa',w) 12) ?dow(date())| ?cdow(date())13) dif={31/12/01}-date() | ?dif | spt=int(dif/7) | ?spt | zile=mod(dif,7) | ?zile | ?str(spt,2)+' saptamani si '+str(zile,1)+' zile' | ?str(spt,2)+' saptamani si '+str(zile,1)+iif(zile=1,' zi',' zile')14) ?padc(time(),18,'=') | ?padl(padr(time(),13,'='),18,'=') | ?replicate('=',5)+time()+replicate('=',5) | ?'====='+time()+'====='15) t=space(5)+time()+space(5) | ? t | ? len(t)16) ?alltrim(t) sau ?ltrim(rtrim(t)) | u=alltrim(t) | ?len(u) | ?len(t) | ?len(u)=len(t) | ?len(t)>len(u)17) ?chrtran('copac','o','a') sau ?strtran('copac','o','a') |

?strtran('capac','ap','op') sau ?stuff('capac',2,1,'o')18) CreaÆi fiçierul cu programul folosind comanda modify command timp. ScrieÆi în fereastra de editare urmåtoarele comenzi:

input 'timp executie piesa ' to xinput 'numar piese executate ' to nt=x*nnr_min=t%60nr_tot_ore=int(t/60)nr_zile=int(nr_tot_ore/24)

nr_ore=nr_tot_ore%24? 'timpul necesar executarii pieselor estede:'? nr_zile, 'zile', nr_ore, 'ore', nr_min,'minute'

SalvaÆi comenzile scrise. LansaÆi în execuÆie programul cu comanda do timp. IntroduceÆi valori pentru x çi n (de exemplu 50 de minute çi 100 de piese).19) display memory | nu se gåsesc çi variabilele de memorie create în program, deoarece la termina- rea execuÆiei programului, zona de memorie alocatå lui se elibereazå, inclusiv zona ocupatå de variabilele de memorie create de el. Efectul este pierderea valorii acestor variabile de memorie.20) release a1, b2, u | display memory 21) release all like b? | display memory22) release all except t | display memory 23) clear memory | display memory

Page 106: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 107

4. Operaţii cu datele dintr-un tabel al bazei de dateExploatarea unui tabel constå în:

OperaÆii de actualizare cum sunt cele de adåugare a unei noi înregistråri, deçtergere a unei înregistråri sau de modificare a valorii unor câmpuri din înregistråri.OperaÆii de consultare (interogare) prin care se pot obÆine informaÆii din tabel.Aceste operaÆii presupun çi operaÆii de cåutare a anumitor înregistråri. OperaÆiile decåutare trebuie så precizeze criteriul de cåutare çi modul de afiçare a informaÆiilor(pe ecran, la imprimantå etc.). OperaÆia de consultare este posibil så necesite înprealabil o operaÆie de sortare (de reordonare fizicå a înregistrårilor din tabel).

Exploatarea unui tabel se poate face:SecvenÆial, adicå în ordinea fizicå a înregistrårilor (ordinea în care au fost scriseîn tabel).În acces direct, adicå în ordinea logicå a înregistrårilor (ordinea datå de valoareacrescåtoare sau descrescåtoare a unui câmp din tabel). Pentru a avea acces direct,înregistrårile din tabel trebuie ordonate logic. Ordonarea logicå se face prin creareaunui fiçier numit fiçier de index care memoreazå ordinea logicå a înregistrårilor.

ObservaÆie:Sortarea este operaÆia de ordonare fizicå a înregistrårilor dintr-un tabel. Prin aceaståoperaÆie se creeazå un nou tabel în care înregistrårile sunt scrise conform criteriului deordonare precizat. Indexarea este operaÆia de ordonare logicå a înregistrårilor dintr-untabel. Prin aceastå operaÆie se creeazå un fiçier special asociat tabelului, numit fiçier deindex care se exploateazå împreunå cu tabelul (se deschide çi se închide împreunå cuacesta) çi care påstreazå evidenÆa ordinii logice a înregistrårilor. El are douå câmpuri: uncâmp care conÆine valoarea câmpului folosit pentru indexare (care determinå ordonarea)numit çi cheie de indexare çi un câmp cu numårul înregistrårii din tabel în care segåseçte câmpul. Acest fiçier este ordonat crescåtor sau descrescåtor dupå valoarea cheiide indexare:

Cåutarea unei înregistråri dupå valoarea unui câmp se face mult mai rapid atunci cândînregistrårile sunt ordonate dupå acel câmp, deoarece în cazul unei structuri ordonate se potfolosi diferiÆi algoritmi de cåutare. De exemplu, pentru a gåsi înregistrarea care îndeplineçtecondiÆia a=34 (valoarea câmpului a este 34), în cazul unei parcurgeri secvenÆiale se vorexecuta 8 operaÆii de verificare, câte una pentru fiecare înregistrare. În cazul ordonåriistructurii se poate folosi, de exemplu, algoritmul de înjumåtåÆire a intervalului. Cåutarea se

Tabelul Indexulnr. înreg. a b c ..... a nr. înreg.

1 10 100 a 10 12 40 300 b 12 73 45 200 a 23 44 23 100 c 34 85 89 200 d 40 26 90 400 a 45 37 12 500 b 89 58 34 800 c 90 6

Page 107: SGBD Visual Foxpro

108 Informatică

va face în fiçierul index folosind acest algoritm. Se împarte fiçierul în douå: în prima jumåtatese vor gåsi înregistrårile pentru care a∈[10,34], iar în a doua jumåtate se vor gåsi înregistrårilepentru care a∈[40,90]. Se verificå çi se vede cå valoarea 34 a câmpului a aparÆine primuluiinterval. Se împarte çi acest interval în douå: în prima jumåtate se vor gåsi înregistrårile pentrucare a∈[10,12], iar în a doua jumåtate se vor gåsi înregistrårile pentru care a∈[23,34]. Severificå çi se vede cå valoarea 34 a câmpului a aparÆine celui de-al doilea interval. Se împarteçi acest interval în douå: în prima jumåtate se va gåsi o singurå valoare (23), iar în a douajumåtate se va gåsi o singurå valoare (34), care este valoarea cåutatå. Pentru aceaståvaloare, în index existå numårul înregistrårii: 8. Se poziÆioneazå în tabel pointerul deînregistrare direct pe înregistrarea 8. În acest caz s-au executat numai trei operaÆii deverificare (de apartenenÆå a valorii câmpului a la un interval).

Indiferent de modul în care este exploatat tabelul, algoritmul de exploatarecuprinde urmåtorii paçi: deschiderea tabelului, prelucrarea çi închiderea.

Tabelul este memorat într-un fiçier de date care are acelaçi nume ca çitabelul çi extensia .dbf. Pentru a se putea prelucra înregistrårile dintr-untabel, trebuie deschis fiçierul în care acesta este påstrat. Prin operaÆia dedeschidere i se alocå o zonå de memorie internå în care urmeazå så fietransferate de pe disc înregistrårile care vor fi prelucrate. Deschidereafiçierului se face fie folosind opÆiunea de meniu Open...∈∈File, fie prinintermediul comenzii:

use <nume_fiçier>Dupå ce aÆi prelucrat înregistrårile din tabel trebuie închis fiçierul. PrinoperaÆia de închidere se elibereazå zona de memorie internå alocatå fiçierului. Închidereafiçierului se face prin intermediul comenzii:

useMai puteÆi så închideÆi tabelul din fereastra View (pe care o deschideÆi cu opÆiunea ViewWindow∈∈Window). SelectaÆi numele tabelului çi executaÆi clic pe declançatorul Close.

OperaÆiile puse la dispoziÆie de Visual FoxPro pentru administrarea datelor dintr-un tabelal bazei de date pot fi grupate astfel:1. Crearea unui tabel care cuprinde operaÆii pentru:

crearea structurii tabelului,manipularea structurii tabelului;

2. Exploatarea unui tabel în acces secvenÆial care cuprinde operaÆii pentru:localizarea înregistrårilor prin parcurgere secvenÆialå a înregistrårilor din tabel,actualizarea tabelului,controlarea accesului la înregistråri,consultarea tabelului;

3. Exploatarea unui tabel în acces direct care cuprinde operaÆii pentru:crearea çi administrarea fiçierelor index,localizarea înregistrårilor dupå valoarea unei chei.

ObservaÆie:Toate comenzile au un domeniu implicit de acÆiune. Domeniul implicit de acÆiune poatefi schimbat prin explicitarea cu adverbele care sunt scrise între parantezele påtrate [ ].

Start

Open

Prelucrare

Close

Stop

Page 108: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 109

4.1. Crearea tabelului Un tabel poate fi creat în interiorul unei baze de date ca tabel al bazei de date sau înafara ei ca tabel liber. Ulterior, tabelul liber poate fi adåugat la o bazå de date. Încontinuare vor fi prezentate metodele prin care puteÆi crea tabele libere. În general,aceste metode pot fi folosite çi în cadrul unei baze de date. Deosebirea este cå pentru untabel liber nu puteÆi stabili reguli de validare çi nici chei primare, aça cum puteÆi facepentru tabelele din baza de date. Crearea unui tabel se face în douå etape:

crearea structurii tabelului,introducerea datelor în tabel, conform structurii definite.

La definirea structurii tabelului poate fi definit çi indexul structural compus. Acest index senumeçte compus¸ deoarece poate conÆine mai multe chei de indexare numite eticheteindex (tag). La un moment dat se poate folosi o singurå cheie de indexare dintre cheiledefinite, adicå o singurå etichetå este activå. Se numeçte structural deoarece are acelaçinume ca çi tabelul. Extensia sa este .cdx. El se creeazå automat la crearea tabelului dacådefiniÆi o etichetå de index çi se deschide automat împreunå cu tabelul. Este actualizatautomat dupå fiecare operaÆie de actualizare a tabelului (çtergerea sau adåugarea uneiînregistråri sau modificarea câmpurilor dintr-o înregistrare). Indecçii pot fi:

Primary - cheia primarå. Se poate folosi numai în cazul în care tabelul se gåseçteîntr-o bazå de date. Numai un singur index poate fi folosit pentru cheia primarå.Candidate - cheia candidat. Este o cheie care poate deveni cheie primarå deoarecenu conÆine valori duplicate çi nici valori nule. Çi ea este utilå numai în baza de date.Unique - cheia unicå. Este o cheie care se considerå cå nu conÆine valoriduplicate. Dacå existå douå înregistråri cu aceeaçi valoare a cheii unice, va fivizibilå logic numai prima dintre ele, chiar dacå fizic existå amândouå.Regular - cheia obiçnuitå.

Folosind indexarea puteÆi:så ordonaÆi înregistrårile afiçate din tabel (indexul poate fi cheie obiçnuitå, candidatsau cheie primarå);så controlaÆi valorile duble introduse într-un câmp (indexul poate fi cheie candidatsau primarå pentru baze de date çi cheie candidat pentru tabelele libere);så definiÆi relaÆii între tabele (indexul poate fi cheie obiçnuitå, candidat sau primarå).

4.1.1. Crearea structurii tabeluluiÎn urma operaÆiei de creare, tabelul este deschis automat. Crearea structurii unui tabel sepoate face prin mai multe metode:

1. Prin definirea structurii:interactiv - structura se defineçte prin intermediul controalelor din fereastra documenta generatorului de tabele Table Designer; deschiderea ferestrei se poate face fie prinintermediul opÆiunii de meniu New...∈∈File, fie prin intermediul comenzii:

create <nume_tabel>folosind limbajul de comandå - structura se defineçte prin intermediul adverbelordin comanda SQL:

create table <nume_tabel> (<nume_câmp1> <tip1> (<låÆime1> [,<poz_zec1>][<nume_câmp2> <tip2> (<låÆime2> [,<poz_zec2>]...]

Page 109: SGBD Visual Foxpro

110 Informatică

unde <nume_tabel> este numele tabelului care se creeazå çi a cårui structurå sedefineçte prin precizarea pentru fiecare câmp a numelui såu <nume_câmp>, atipului <tip>, a dimensiunii <låÆime> çi a numårului de poziÆii din partea fracÆionarå<poz_zec> (numai pentru câmpurile reale numeric, float çi double).

2. Prin preluarea structurii dintr-un alt tabel:Prin preluarea structurii dintr-un tabel de structurå. Tabelul de structurå este un tabelîn care se påstreazå informaÆii despre structura unui alt tabel (proprietåÆile câmpurilor).El a fost creat cu comanda copy structure extended. Sintaxa comenzii este:

create <nume_tabel1> from <nume_tabel2>unde <nume_tabel1> este numele tabelului a cårui structurå se creeazå prinpreluarea structurii din tabelul de structurå care are numele <nume_tabel2>.Prin preluarea structurii dintr-un tabel deschis. Pot fi preluate toate câmpurile dinstructurå sau numai o parte din ele. Sintaxa comenzii este:

copy structure to <nume_tabel> [fields <listå_nume_câmpuri>]unde <nume_tabel> este numele tabelului care se creeazå çi a cårui structurå sepreia din tabelul deschis în acel moment; se pot prelua toate câmpurile sau numaicâmpurile precizate în lista clauzei fields.

4.1.2. Manipularea structurii tabeluluiManipularea structurii unui tabel se face prin urmåtoarele operaÆii:

1. Afiçarea structurii tabelului:

Structura tabelului poate fi afiçatå cu comenzile list structure çi display structure.Deosebirea dintre aceste douå comenzi constå în modul în care se face afiçarea:comanda display structure afiçeazå în regim paginat (dupå umplerea ecranului seaçteaptå confirmare din partea utilizatorului pentru a continua afiçarea), iar comanda liststructure afiçeazå în regim de defilare (este derulatå pe ecran toatå informaÆia chiardacå depåçeçte capacitatea de afiçare a ecranului; se vor putea vedea astfel numaiultimele câmpuri din tabel). Comenzile au aceeaçi sintaxå:

display | list structure [to printer | to file <nume_fiçier>] [no console]Domeniul implicit al comenzii se referå la faptul cå afiçarea se face pe ecran. Explicit, afiçarease poate face çi la imprimantå sau într-un fiçier (adverbele to printer sau to file), sau numaila unul dintre acestea, inhibându-se ieçirea cåtre ecran (adverbul no console).

2. Modificarea structurii tabelului:

Se poate modifica structura unui tabel deschis în prealabil folosind comanda:modify structure

Se deschide caseta de dialog Table Designer care conÆine aceleaçi controale ca çi lacrearea tabelului. PuteÆi så faceÆi urmåtoarele modificåri:

så inseraÆi câmpuri noi,så çtergeÆi câmpuri,så modificaÆi caracteristicile unui câmp (nume, tip, lungime).

Înaintea modificårilor, aplicaÆia salveazå datele din tabel într-un fiçier cu acelaçi nume çicu extensia .bak pentru tabel çi .tbk pentru fiçierul memo asociat tabelului (care conÆinevalorile pentru câmpurile memo). Dupå efectuarea modificårilor de structurå, datele vor fi

Page 110: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 111

adåugate din aceste fiçiere la noua structurå de tabel. PuteÆi så påstraÆi çi vechea versi-une, redenumind fiçierele nume.bak cu nume_nou.dbf çi nume.tbk cu nume_nou.fpt.

Mai puteÆi så deschideÆi caseta de dialog çi din fereastra View. SelectaÆi numele tabeluluiçi executaÆi clic pe declançatorul Properties.... În caseta de dialog Work AreaProperties executaÆi clic pe declançatorul Modify....

3. Copierea structurii tabelului:

PuteÆi så copiaÆi structura tabelului deschis:Într-un tabel de structurå. Acest tabel are o structurå predefinitå. El conÆine 11câmpuri, câte un câmp pentru fiecare proprietate a câmpului (de exemplu,field_name pentru numele câmpului, field_type pentru tipul câmpului, field_lenpentru lungimea câmpului, field_dec pentru numårul de poziÆii ale pårÆii fracÆionare,field_null pentru a stabili dacå se acceptå valoarea null în câmp, field_defa pentruvaloare implicitå a câmpului etc.). În tabel existå câte o înregistrare pentru fiecarecâmp (açadar, va avea atâtea înregistråri, câte câmpuri are tabelul pentru carepåstreazå structura). Sintaxa comenzii este:

copy to <nume_tabel> structure extendedunde <nume_tabel> este numele tabelului în care se va påstra structura.Într-un tabel precizat prin <nume_tabel>. Pot fi copiate toate câmpurile dinstructurå sau numai o parte din ele. Sintaxa comenzii este:

copy structure to <nume_tabel> [fields <listå_nume_câmpuri>]ObservaÆie:Pentru a vedea ce conÆin tabelele în care au fost copiate structurile, trebuie så le deschideÆi.ObservaÆie:Dacå într-o comandå nu se specificå numele unui tabel, înseamnå cå ea se referå latabelul deschis. De exemplu, comenzile list structure, modify structure etc.

4.1.3. Manipularea çi controlarea câmpurilor dintr-un tabelCâmpurile dintr-un tabel pot fi manipulate çi controlate prin intermediul comenzilor Set çial funcÆiilor.1. Prin intermediul comenzilor set se poate controla accesul la câmpuri:

Controlul accesului la câmpuri poate fi activat (on) sau inhibat (off) cu comanda:set fields on|off

Valoarea implicitå este off.Se pot preciza câmpurile la care poate avea acces utilizatorul cu comanda:

set fields to [<listå_câmpuri> | all]De exemplu:a. Se poate preciza cå utilizatorul are acces la toate câmpurile:

set fields to all sau

set fields offb. Se poate preciza cå utilizatorul are acces numai la câmpurile nume çi pren:

set fields to nume, prenc. Se poate preciza cå utilizatorul nu are acces la nici un câmp:

set fields to

Page 111: SGBD Visual Foxpro

112 Informatică

2. Prin intermediul funcÆiilor se pot obÆine informaÆii despre câmpuri:numele câmpului dintr-o poziÆie precizatå se obÆine cu funcÆia field(<n>), unde <n>este numårul de ordine al câmpului;numårul de câmpuri din tabel se obÆine cu funcÆia fcount();lungimea unui câmp din tabel se obÆine cu funcÆia fsize(<nume>) unde <nume>este numele câmpului;dimensiunea înregistrårii din tabel se obÆine cu funcÆia recsize().

4.1.4. Câmpurile memoAÆi aflat cå un câmp memo se foloseçte pentru påstrarea textelor (a çirurilor de caracterecu lungime variabilå sau mai mare de 255 de caractere). AÆi mai aflat cå ele se påstreazåîntr-un fiçier separat, asociat tabelului (are acelaçi nume cu tabelul, are extensia .fpt çieste deschis çi închis împreunå cu tabelul). Câmpul memo din tabel memoreazå de faptadresa la care se gåsesc datele din câmp în fiçierul memo.

Utilizatorul poate încårca datele într-un câmp memo:de la tastaturå,dintr-un fiçier,din memoria internå (dintr-o variabilå de memorie).

Introducerea unui câmp memo de la tastaturå se face prin intermediul fetrestrei de edi-tare a unui câmp memo. Dacå este deschiså o fereastrå de editare a tabelului, deschideÆifereastra de editare memo poziÆionând cursorul pe câmp çi executând dublu clic sauapåsând tastele Ctrl+PageDown| PageUp. Dacå nu este deschiså fereastra de editare atabelului, poziÆionaÆi pointerul de înregistrare pe înregistrarea în care vreÆi så scrieÆi va-loarea câmpului memo çi deschideÆi fereastra de editare memo cu comanda:

modify memo <nume_câmp>

Preluarea unui câmp memo dintr-un fiçier cu texte (extensia .txt) se face cu comanda:append memo <nume_câmp> from <nume_fiçier> [overwrite]

Fiçierul din care se preia valorea se identificå prin <nume_fiçier>. Încårcarea valorii seface implicit la sfârçitul textului care existå deja. Explicit se poate rescrie peste vechiulconÆinut cu clauza [overwrite]. Comanda complementarå este cea de copiere a valoriiunui câmp memo într-un fiçier text:

copy memo <nume_câmp> to <nume_fiçier> [additive]

Preluarea unui câmp memo dintr-o variabilå de memorie se face cu comanda:replace <nume_câmp> with <nume_variabilå>

Comanda complementarå este cea de copiere a valorii unui câmp memo într-o variabilåde memorie, folosind operaÆia de atribuire.

Obiectul: realizarea bazei de date a unei companii care oferå servicii de consultanÆå.

Scopul bazei de date: gestionarea serviciilor de consultanÆå asigurate clienÆilor de cåtreangajaÆii companiei.

Page 112: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 113

CerinÆe:Fiecare angajat al companiei are o persoanå din cadrul companiei care îi monito-rizeazå çi îi supervizeazå activitatea.Atunci când un client solicitå pentru prima datå serviciile acestei companii, i serepartizeazå un angajat care så se ocupe de el. De obicei angajatul se întâlneçte cuclientul pânå când i se rezolvå problema.În cadrul primei discuÆii, angajatul stabileçte obiectivele consultanÆei, termenele çicostul estimativ. Aceste date se pot modifica pe parcursul desfåçurårii consultanÆei.Toate aceste modificåri trebuie påstrate în baza de date.Pentru fiecare çedinÆå de consultanÆå trebuie så se påstreze date despre modul încare serviciile prestate de angajat îndeplinesc obiectivele consultanÆei, în conformitatecu termenele stabilite. Pentru fiecare çedinÆå se vor înregistra urmåtoarele date: dataçedinÆei, angajatul cu care s-a întâlnit clientul, durata çedinÆei, suma facturatå pentruçedinÆå, rezumatul modului în care a decurs întâlnirea.Costul unui serviciu de consultanÆå este în funcÆie de ore. Tariful orar depinde deangajatul care s-a ocupat de client: cu cât acesta are mai multå experienÆå, cu atâttariful este mai mare. Pentru fiecare çedinÆå de consultanÆå se emite o notå de platå.Totalul sumelor facturate prin notele de platå trebuie så fie comparate cu valoareaestimatå pentru costul consultanÆei.Unii clienÆi sunt întâmplåtori, alÆii devin permanenÆi, solicitând frecvent diferite serviciide consultanÆå. Compania poate derula la un moment dat douå sau mai multecontracte de consultanÆå cu acelaçi client. Pentru fiecare contract se va Æine oevidenÆå separatå a notelor de platå.Pe lângå notele de platå, baza de date trebuie så furnizeze un raport lunar al activi-tåÆilor cu fiecare client.Un angajat al companiei are mai mulÆi clienÆi, iar un client poate lucra cu mai mulÆiangajaÆi ai companiei.

Pentru a putea råspunde la toate aceste cerinÆe, baza de date va fi formatå din urmåtoa-rele tabele13:Tabelul AngajaÆi care va trebui så conÆinå urmåtoarele date (sub formå de câmpuri):

Identificatorul angajatului (id_ang, I). Este un numår care identificå unic angajatul çieste folosit pentru cheia primarå.Numele angajatului (nume, C, 20). Deoarece pot så aparå cåutåri în tabel çi dupånumele angajatului, acest câmp va fi cheie de indexare împreunå cu câmpul prenume.Preumele angajatului (pren, C, 20).Tip angajat (tip_ang, C, 1). Acesta este un cod care foloseçte un singur caracter princare se identificå tipul angajatului: permanent cu normå întreagå (a), permanent cujumåtate de normå (b), temporar cu normå întreagå (c), temporar cu jumåtate denormå (d), colaborator cu ora (e) sau cu angajamentul terminat (f).

13 În descrierea structurii de date a tabelelor se vor folosi pentru tipul datelor: I - integer, F - float, C- character, M - memo, D - date, T - DateTime, L - logic. În cazul în care lungimea câmpului nu estedeterminatå de tipul datelor, se va preciza çi lungimea câmpului. De exemplu, nume,C,20înseamnå câmpul nume este de tip Character çi are lungimea 20.

Page 113: SGBD Visual Foxpro

114 Informatică

Identificatorul superiorului (id_sup, I). Este un numår care identificå angajatul cåruia îieste subordonat. Trebuie så fie de acelaçi tip ca çi câmpul identificatorul angajatului.deoarece superiorul este çi el angajat al companiei.Data naçterii (data_n, D). Este data naçterii angajatului.Data angajårii (data_a, D). Este data angajårii.Data încetårii angajårii (data_i, D). Este data de la care angajatul nu mai face partedin firmå (demisie, demitere, restrângere de activitate, pensionare etc.). El va fipåstrat în continuare în evidenÆele companiei.Tariful orar (tarif, I). Este tariful perceput clientului pentru o orå de consultanÆåasiguratå (prestatå) de angajat.Adresa angajatului (adresa, M). Deoarece adresa este un çir de caractere cu lungimecare poate varia foarte mult de la un angajat la altul, pentru a nu se risipi spaÆiul dememorie se va folosi câmpul de tip Memo.Localitatea (loc, C, 15). Deoarece compania are sucursale çi birouri de reprezentanÆåîn mai multe localitåÆi, çi angajaÆii pot avea domiciliile în mai multe localitåÆi.Codul judeÆului (c_jud, C, 2). Pentru judeÆ se înregistreazå numai codul. Separat, întabelul JudeÆe vor fi înregistrate çi numele judeÆelor.Codul poçtal (cp, C, 5). Este codul poçtal al adresei angajatului.Telefonul fix (tel_f, C, 9). Este numårul telefonului fix al angajatului.Telefonul mobil (tel_m, C, 9). Este numårul telefonului mobil al angajatului.ObservaÆii (obs, M). ConÆine informaÆii biografice ale angajatului sau referitoare laactivitatea lui în cadrul companiei.

Tabelul ClienÆi care va trebui så conÆinå urmåtoarele date (sub formå de câmpuri):Identificatorul clientului (id_cl, I). Este un numår care identificå unic clientul çi este fo-losit pentru cheia primarå. Este de acelaçi tip ca çi câmpul id_ang din tabelul AngajaÆi.Numele clientului (nume, C, 20). Deoarece pot så aparå cåutåri în tabel çi dupånumele clientului, acest câmp va fi cheie de indexare. Este de acelaçi tip ca çi câmpulnume din tabelul AngajaÆi.Prenumele clientului (pren, C, 20). Este de acelaçi tip ca çi câmpul pren din tabelul AngajaÆi.Tip client (Tip_cl, L). Câmpul va avea valoarea .T. în cazul unui client curent (are uncontract de consultanÆå în derulare).Identificatorul angajatului (id_ang, I). Este un numår care identificå angajatul atribuitclientului så se ocupe de el. Este de acelaçi tip ca çi câmpul id_ang din tabelul AngajaÆi.Data intrårii (data_i, D). Este data de la care a devenit clientul companiei de consultanÆå.Adresa clientului (adresa, M). Este adresa clientului. Este de acelaçi tip ca çi câmpuladresa din tabelul AngajaÆi.Localitatea clientului (loc, C, 15). Este localitatea de rezidenÆå a clientului. Este deacelaçi tip ca çi câmpul loc din tabelul AngajaÆi.Codul judeÆului (c_jud, C, 2). Este codul judeÆului de rezidenÆå al clientului. Este deacelaçi tip ca çi câmpul c_jud din tabelul AngajaÆi.Codul poçtal (cp, C, 5). Este codul poçtal al adresei clientului. Este de acelaçi tip ca çicâmpul cp din tabelul AngajaÆi.Fax (fax, C, 9). Este numårul de fax al clientului.Telefonul fix (tel_f, C, 9). Este numårul telefonului fix al clientului. Este de acelaçi tipca çi câmpul tel_f din tabelul AngajaÆi.Telefon mobil (tel_m, C, 9). Este numårul telefonului mobil al clientului. Este deacelaçi tip ca çi câmpul tel_m din tabelul AngajaÆi.

Page 114: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 115

ObservaÆii (obs, M). ConÆine scurte informaÆii despre client çi relaÆiile sale cucompania de consultanÆå.

Tabelul JudeÆe care va trebui så conÆinå urmåtoarele date (sub formå de câmpuri):Codul judeÆului (c_jud, C, 2). Este folosit pentru cheia secundarå.Numele judeÆului (n_jud, C, 15).

Un angajat poate så aibå mai mulÆi clienÆi, iar de un client se pot ocupa mai mulÆiangajaÆi. Açadar, între tabelele AngajaÆi çi ClienÆi, tipul de relaÆie este de mai-multe-la-mai-multe. Din aceastå cauzå trebuie creat un tabel intermediar Contracte, care ÆineevidenÆa contractelor de consultanÆå:

Identificatorul contractului (id_cont, I). Este un numår unic folosit pentru identificareacontracului de consultanÆå.Identificatorul clientului (id_cl, I) care beneficiazå de contractul de consultanÆå.Tipul contractului (tip_c, C, 1). Este un cod atribuit contractului care defineçtecategoria de consultanÆå: instruire, proiectare etc.ObservaÆii (obs_c, C, 254). ConÆine o scurtå descriere a contractului de consultanÆå.Data începerii (data_i, D). Este data la care începe derularea contractului de consultanÆå.Terminat (term_c, L). Are valoarea .T. dacå s-a încheiat consultanÆa.

Deoarece estimårile se modificå pe parcursul derulårii contractului (vor fi mai multe esti-måri pentru acelaçi contract) çi deoarece se doreçte påstrarea unui istoric al acestor esti-måri, ele vor fi înregistrate într-un tabel separat Estimåri care are urmåtoarea structurå:

Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care seface estimarea. El va fi o cheie secundarå, propagatå din tabelul Contracte.Numårul estimårii (nr_est, I). Reprezintå a câta estimare este pentru acelaçi contract.Identificatorul angajatului (id_ang, I). Este identificatorul angajatului care a fåcut estimarea.Obiectivul estimårii (obiectiv, C, 254). Este descrierea obiectivelor pentru aceaståestimare a derulårii contractului. Descrierea trebuie så se facå precis çi concis.Termene (term, I). Este numårul estimativ de çedinÆe în care se va derula contractul.Cost estimat (cost_e, I). Este costul estimativ al contractului de consultanÆå.Data estimåriii (data_e, D). Este data la care s-a fåcut estimarea.Data terminårii (data_t, D). Este data estimatå pentru terminarea contractului de consultanÆå.

Dar fiecare contract de consultanÆå se desfåçoarå pe parcursul mai multor çedinÆe deconsultanÆå. Din aceastå cauzå trebuie creat un tabel intermediar ÇedinÆe care så ÆinåevidenÆa acestora çi care are urmåtoarea structurå:

Numårul çedinÆei (nr_s, I). Este un numår unic atribuit çedinÆei çi este folosit ca o cheieprimarå a tabelului care ajutå la identificarea unei înregistråri din tabel (a unei çedinÆe).Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se desfå-çoarå çedinÆa de consultanÆå. Va fi o cheie secundarå propagatå din tabelul Contracte.Identificatorul angajatului (id_ang, I) care s-a ocupat de aceastå çedinÆå de consultanÆå.Data çedinÆei (data_s, D).Durata çedinÆei (timp_s, I). Este timpul în care s-a derulat çedinÆa. Se måsoarå în minute.Costul çedinÆei (cost_s, I). Se calculeazå ca produs între duratå çi tariful angajatului.Rezumat (rez_s, C, 254). Este un rezumat scurt al çedinÆei, care va fi tipårit pe notelede platå ale clientului.ObservaÆii (obs_s, M). Sunt observaÆii despre modul în care a decurs çedinÆa. Suntfolosite numai în interiorul companiei.

Page 115: SGBD Visual Foxpro

116 Informatică

Açadar, tabelul Contracte leagå între ele toate çedinÆele prestate pentru o consultanÆå,iar tabelul ÇedinÆe leagå între ei clientul çi angajatul care au participat la acea çedinÆå.

Pentru serviciile prestate, compania încaseazå bani de la client. Clientul nu plåteçte o singurådatå valoarea finalå a contractului de consultanÆå. El va face mai multe plåÆi pe parcursul de-rulårii contractului. Din aceastå cauzå, încasarea nu va fi înregistratå în tabelul Contracte.Clientul nu plåteçte nici la fiecare çedinÆå. Din aceastå cauzå, încasarea nu va fi înregistratånici în tabelul ÇedinÆe. Clientul poate så aibå cu compania mai multe contracte de consul-tanÆå. Din aceastå cauzå, încasarea nu va fi înregistratå nici în tabelul ClienÆi. Va trebui creatun tabel separat, tabelul Încasåri, cu urmåtoarea structurå:

Numårul încasårii (nr_i, I). Este un numår unic atribuit încasårii. El este folosit ca o cheieprimarå a tabelului çi ajutå la identificarea unei înregistråri din tabel (a unei încasåri).Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care seface încasarea. El va fi o cheie secundarå propagatå din tabelul Contracte.Data plåÆii (data_p, D).Modul plåÆii (mod_p, C,50). Se foloseçte pentru a descrie modul în care s-a fåcut plata:numerar (chitanÆa încasårii), ordin de platå (bancå, numår), filå cec (bancå, numår) etc.Valoare (valoare, I). Este valoarea încasårii çi reprezintå o parte din valoarea totalå aconsultanÆei.ObservaÆii (obs_i, C, 254). Sunt detalii referitoare la obiectivul plåÆilor.

Între aceste tabele s-au stabilit urmåtoarele relaÆii:

Tabelul 1 Tabelul 2 Tipul relaÆiei Câmpul de legåturåJudeÆe AngajaÆi una-la-mai-multe codul judeÆului

AngajaÆi ÇedinÆe una-la-mai-multe codul angajatuluiJudeÆe ClienÆi una-la-mai-multe codul judeÆuluiClienÆi Contracte una-la-mai-multe codul clientului

Contracte ÇedinÆe una-la-mai-multe numårul contractuluiContracte Estimåri una-la-mai-multe numårul contractuluiContracte Încasåri una-la-mai-multe numårul contractului

ÎncasåriEstimåriÇedinÆe

AngajaÆi ClienÆi

JudeÆe

Contracte

Page 116: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 117

CreaÆi un tabel definind structura interactiv:CreaÆi structura tabelului AngajaÆi:

DeschideÆi caseta New cu opÆiunea New...∈∈File. ActivaÆibutonul radio Table çi apoi executaÆi clic pe butonul New File.Se deschide caseta de dialog Create care conÆine aceleaçicontroale ca çi o casetå de dialog de tip Save As. AlegeÆidin lista ascunså Save As Type tipul de fiçier Table/DBF.ScrieÆi în caseta de text Enter table numele tabeluluiAngajaÆi. ExecutaÆi clic pe declançatorul Save.Se deschide fereastra generatorului de tabele Table De-signer. SecÆiunea Table conÆine controalele prin care definiÆistructura tabelului. Structura de câmpuri o definiÆi în grila deru-lantå care are cinci coloane. În coloana Name scrieÆi numelecâmpului în caseta de text (de exemplu id_ang). Numele tre-buie så conÆinå numai litere, cifre çi linie de subliniere. Atuncicând creaÆi un tabel liber, numele nu trebuie så depåçeascå10 caractere, iar când definiÆi un tabel într-o bazå de date,poate så aibå pânå la 128 de caractere. În coloana Type alegeÆi din lista ascunså tipulcâmpului (de exemplu Integer). Dimensiunea câmpului este prestabilitå. Nu se potaccepta valori nule în acest câmp. VerificaÆi så nu fie activat comutatorul din coloanaNULL.RepetaÆi aceste operaÆii pentru toate câmpurile din tabel.

DefiniÆi un index structural pentru acest tabel, câmpul de indexare fiind câmpurilenume çi prenume (înregistrårile vor fi aranjate logic în ordinea alfabeticå a numelui çi

Coloanele grilei reprezintå proprietåÆi ale câmpului pe care îl definiÆi.

Comutatoare:Insert - insereazåun câmp deasupracâmpului selectat;Delete - çtergecâmpul selectat;

Bara de stare afiçeazå informaÆii despre tabel: identificatorul tabelului, numårul de înregistråri - Records(are valoarea 0 pentru cå nu s-au introdus date), numårul de câmpuri definite - Fields (s-au definit 16) çilungimea înregistrårii în octeÆi - Length (reprezintå suma lungimilor tuturor câmpurilor) .

Page 117: SGBD Visual Foxpro

118 Informatică

prenumelui; adicå, atunci când numele este acelaçi, vor fi aranjate în ordineaalfabeticå a prenumelui). ExecutaÆi clic pe secÆiunea Index.În grila derulantå scrieÆi în caseta Name numele etichetei index: Nume. În stângaacestei casete de text se gåseçte butonul cu sågeatå. Sågeata indicå ordinea dearanjare: crescåtor ↑↑ sau descrescåtor ↓↓. VerificaÆi ca simbolul så corespundåordonårii crescåtoare. Dacå este necesar, schimbaÆi ordinea executând clic pe buton.PuteÆi alege din lista ascunså Type tipul de index: Primary, Candidate, Unique sauRegular (cheia obiçnuitå). AlegeÆi pentru acest index valoarea Regular.

În zona Expression trebuie så definiÆi cheia de indexare. Ea poate så conÆinå maxim240 de caractere çi poate fi formatå dintr-un singur câmp (expresie simplå) sau poateså fie obÆinutå prin concatenarea mai multor câmpuri (expresie complexå). Deoarecenu se pot concatena decât câmpuri de tip çir de caractere, trebuie så convertiÆicelelalte câmpuri în tipul çir de caractere. Pentru a vå uçura munca de construire aunei expresii complexe de indexare, puteÆi så faceÆi apel la constructorul deexpresii (Expression Builder). Açadar, fie scrieÆi expresia, fie executaÆi clic pe butonca så se deschidå caseta de dialog Expression Builder.

Tipul de index aleseste Regular.

ScrieÆi expresia cheii deindexare: nume+prenume.

Comutatoare:Insert - insereazå unindex deasupra indexuluiselectat;Delete - çterge indexulselectat;

Butonul Move care vå permite så mutaÆi un rândcare defineçte un index.

Expresia se construieçte în caseta de textExpression. Folosind controalele puteÆialege numele unui câmp (în lista FieldsexecutaÆi dublu clic pe numele câmpului),numele unei variabile de memorie sistemsau utilizator (executaÆi dublu clic pe nu-mele variabilei din lista Variables), tabelul(îl alegeÆi din lista ascunså From Table).Din grupul de liste ascunse FunctionalegeÆi funcÆia pe care o veÆi folosi înexpresie. Ea poate fi o funcÆie matematicå(Math), o funcÆie pentru çiruri de caractere(String), o funcÆie logicå sau un operatorrelaÆional (Logical) sau o funcÆie pentrudate calendaristice (Date). În momentul încare alegeÆi o funcÆie (executând clic penumele ei) vor fi afiçate çi parantezele ().ScrieÆi parametrii între paranteze.

Page 118: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 119

Dupå ce aÆi definit toatå structura tabelului, o salvaÆi acÆionând declançatorul Ok. Sedeschide caseta de dialog prin care sunteÆi întrebaÆi dacå vreÆi så introduceÆi date:Input data records now? ExecutaÆi clic pe declançatorul Yes. Se deschide o fereas-trå de editare a tabelului, de tip browse. ScrieÆi cinci înregistråri:

100, Popescu, Andrei, a, 100, 300000, 02/03/1960, 04/08/1995, / / , Str. Morilor nr. 50sector 2, Bucuresti, B, 23451, 014567890, 092111111,101, Andronescu, Ana, a, 100, 280000, 09/05/1958, 09/15/1996, / / , Str. Cuza Voda nr.20 sector 1, Bucuresti, B, 23456, 012345678, 092122222,102, Ionescu Maria, a, 100, 280000, 03/01/1961, 03/15/1998, / / , Str. Zorilor nr. 23 sector4, Bucuresti, B, 34561, 012346789, 093189467,200, Petrescu Radu, a, 200, 280000, 03/08/1964, 06/15/1998, / / , SoseauaMangalia nr. 34, Constanta, Ct, 34512, 041123123, 092134567,201, Popescu Mihai, a, 200, 250000, 01/01/1965, 09/15/1998, / / , Str. Lujeruluinr. 56, Constanta, Ct, 34562, 041237893, 092341561,

ÎnchideÆi apoi fereastra de editare.

CreaÆi un tabel definind structura prin intermediul comenzii SQL:CreaÆi tabelul JudeÆe folosind comanda SQL:

create table judete (c_jud c (2), n_jud C (15))

CreaÆi un tabel preluând structura dintr-un alt tabel:CreaÆi tabelul ClienÆi prin preluarea unor câmpuri din tabelul AngajaÆi:

DeschideÆi tabelul AngajaÆi cu comanda:use angajati

AfiçaÆi structura tabelului AngajaÆi cu comanda:display structure

CopiaÆi din tabelul AngajaÆi în tabelul ClienÆi numai câmpurile id_ang, nume, pren,id_sup, data_n, adresa, loc, c_jud, cp, tel_m, tel_f, obs cu comanda:

copy structure to clienti fields id_ang, nume, pren, id_sup, data_n, adresa, loc, c_jud,cp, tel_m, tel_f, obs

DeschideÆi tabelul ClienÆi cu comanda:use clienti

DeschideÆi caseta de dialog Table Designer pentru a face modificåri în structuratabelului. FolosiÆi comanda:

modify structureÎn caseta de dialog faceÆi urmåtoarele modificåri. SchimbaÆi numele câmpurilor:id_ang în id_cl, id_sup în id_ang çi data_n în data_i. InseraÆi în poziÆia corespunzå-toare câmpurile: tip_cl çi fax.VizualizaÆi structura tabelului ClienÆi cu comanda display structure.

ObÆineÆi informaÆii despre câmpurile din tabel:AflaÆi câte câmpuri are înregistrarea folosind funcÆia (råspunsul este 14):

?fcount()AflaÆi ce dimensiune are câmpul loc folosind funcÆia (råspunsul este 15):

?fsize('loc')

Page 119: SGBD Visual Foxpro

120 Informatică

AflaÆi cum se numeçte câmpul din poziÆia 10 folosind funcÆia (råspunsul este cp): ?field(10)

AflaÆi ce dimensiune are înregistrarea folosind funcÆia (råspunsul este 126): ?recsize()

ÎnchideÆi tabelul folosind comanda use.

4.2. Poziţionarea pe o înregistrare din tabelLa un moment dat existå o singurå înregistrare care poate fi prelucratå. Ea se numeçteînregistrarea curentå. Numårul înregistrårii curente se påstreazå în contorul deînregistrare. El se mai numeçte indicator de înregistrare sau pointer de înregistrare.

Contorul de înregistrare este o zonå de memorie internå care se asociazå tabelului ladeschiderea lui. La închiderea tabelului contorul se çterge. Se pot folosi urmåtoarelecomenzi pentru poziÆionarea pointerului de înregistrare:

poziÆionarea dupå numårul înregistrårii: goto, skip;poziÆionarea dupå un criteriu logic: locate+continue.

4.2.1. PoziÆionarea dupå numårul înregistråriiPuteÆi folosi:

Comanda goto sau go poziÆioneazå pointerul de înregistrare pe o anumitå înregistrare dintabel, precizatå prin numårul såu. Sintaxa comenzii este:

goto| go <n >| top | bottomunde <n> reprezintå numårul înregistrårii, top prima înregistrare, iar bottom ultima înregistrare.

Comanda skip poziÆioneazå pointerul de înregistrare peste un anumit numår de înregis-tråri din tabel, relativ faÆå de înregistrarea curentå. Sintaxa comenzii este:

skip [<n >]unde <n> reprezintå numårul de înregistråri peste care se sare înainte dacå n>0 sau înapoidacå n<0. Dacå numårul lipseçte, saltul se face la înregistrarea urmåtoare.

4.2.2. PoziÆionarea dupå un criteriu logic de cåutarePuteÆi folosi:

Comanda locate poziÆioneazå pointerul de înregistrare pe o înregistrare care îndeplineçtecondiÆia specificatå. Sintaxa comenzii este:

locate for <cond_1> [<domeniu>][while <cond_2>]

Comanda cautå secvenÆial çi poziÆioneazå pointerul pe prima înregistrare care îndeplineçteun criteriu de cåutare precizat prin condiÆia <cond_1> din clauza For. Dacå nu gåseçte nici oînregistrare, pointerul va fi poziÆionat dupå ultima înregistrare de date, adicå pe marcajul eof.Comanda cautå implicit în tot tabelul (All). Explicit poate cåuta numai în anumite înregistråri,precizate prin <domeniu> sau prin clauza while. Cu aceastå comandå se gåseçte prima înre-gistrare care îndeplineçte criteriul de cåutare.

Comanda continue continuå procesul de cåutare definit de ultima comandå locate (cautåurmåtoarea înregistrare care îndeplineçte criteriul de cåutare precizat în comanda locate).

Page 120: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 121

Comanda continue se foloseçte numai împre-unå cu comanda locate. Sintaxa comenzii este:

continueDacå nu se mai gåseçte nici o înregistrare, în barade stare se afiçeazå mesajul End of locate scope.

PuteÆi så folosiÆi aceste comenzi de poziÆionare çiprin intermediul interfeÆei. AlegeÆi opÆiunea GotoRecord44∈∈ Table. Se deschide un submeniu cuopÆiuni pentru poziÆionarea pe o anumitå înregistra-re: Top (prima înregistrare), Bottom (ultima înregis-trare), Next (urmåtoarea înregistrare), Previous(înregistrarea precedentå), Record#... (înregistrareacu numårul precizat), Locate... (adverbele comenziilocate vor fi definite prin intermediul controalelor dincaseta de dialog Locate).

4.2.3. Controlarea poziÆionårii în tabelPrin intermediul funcÆiilor se pot obÆine informaÆiidespre înregistrårile din tabel:

numårul de înregistråri din tabel se obÆine cufuncÆia reccount();numårul înregistrårii curente din tabel se obÆinecu funcÆia recno();sfârçitul de fiçier eof() - funcÆia furnizeazå unrezultat logic care este .T. dacå pointerul estepoziÆionat pe ultima înregistrare din tabel;începutul de fiçier bof() - funcÆia furnizeazå unrezultat logic care este .T. dacå pointerul estepoziÆionat pe prima înregistrare din tabel;modul în care a decurs cåutarea found() -funcÆia furnizeazå un rezultat logic care este.T. dacå a avut succes operaÆia de cåutare.

Aceste funcÆii pot fi folosite pentru a testa dacå maicontinuaÆi sau nu procesul de cåutare.

PoziÆionaÆi pointerul de înregistrare folosind numårul înregistrårii:DeschideÆi tabelul AngajaÆi cu comanda:

use angajatiExecutaÆi mai multe operaÆii de poziÆionare folosind comenzile goto çi skip.ObservaÆi informaÆia afiçatå în bara de stare dupå fiecare operaÆie de poziÆionare.

?recno()1

?reccount()

5 ?bof()

.F.

skip-1 ?bof()

.T.

sfârçit

sfârçit

locate for <cond>

eof() =.F.

continue

<prelucrare>

nu

da

locate for <cond>

found() =.T.

continue

<prelucrare>

nu

da

Page 121: SGBD Visual Foxpro

122 Informatică

goto 3 ?recno()

3 goto bottom ?recno()

5 goto top ?recno()

1

skip 2*3 ?recno()

6 ?eof()

.T. skip 2

End of file encountered ?recno()

6 skip -7 ?recno()

1 skip -10

Beginning of file encountered ?recno()

1

ExecutaÆi operaÆii de poziÆionare folosind opÆiunea de meniu. DeschideÆi mai întâifereastra de editare a tabelului cu opÆiunea de meniu Browse "Angajati"∈∈View.ObservaÆi dupå fiecare operaÆie de poziÆionare informaÆia afiçatå în bara de stare çiînregistrarea pe care s-a poziÆionat pointerul de înregistrare în fereastra de editare:Table →→ Goto Record44→→ Next →→ înregistrarea 2 (era urmåtoarea înregistrare)Table →→ Goto Record44→→ Bottom →→ înregistrarea 5 (ultima înregistrare)Table →→ Goto Record44→→ Record#... →→ caseta de dialog Go to Record: scrieÆi în casetacu derulor Record valoarea 2 çi executaÆi clic pe declançatorul Go to →→ înregistrarea 2.ÎnchideÆi fereastra de editare. ObservaÆi în fereastra Command comenzile corespun-zåtoare acÆiunilor executate:

skip go bottom go 2

PoziÆionaÆi pointerul de înregistrare folosind un criteriu de cåutare:FolosiÆi pentru poziÆionare comenzile locate çi continue. UrmåriÆi efectul lor obser-vând informaÆiile afiçate în bara de stare.

locate for id_ang=100 (Se cautå angajatul cu codul 100.) ? nume, pren, adresa, loc (Se afiçeazå numele, prenumele, adresa çi localitatea angajatului.)

Popescu Andrei Str. Morilor nr. 50 sector 2 Bucureçti continue (Se continuå cåutarea angajatului cu codul 100.)

End of locate scope (Nu s-a mai gåsit un angajat cu codul 100.) ? found() (Se testeazå dacå s-a mai gåsit o înregistrare.)

.F (Nu s-a mai gåsit un angajat cu codul 100.) locate for id_sup=100 (Se cautå angajaÆii care au ca superior angajatul cu codul 100.) ? nume, pren, adresa, loc (Se afiçeazå numele, prenumele, adresa çi localitatea angajatului.)

Popescu Andrei Str. Morilor nr. 50 sector 2 Bucureçti continue (Se continuå cåutarea angajaÆilor care au superiorul cu codul 100.) ? found() (Se testeazå dacå s-a mai gåsit o înregistrare.)

.T. (S-a mai gåsit angajatul care are ca superior angajatul 100.) ? nume, pren, adresa, loc (Se afiçeazå numele, prenumele, adresa çi localitatea angajatului.)

Andronesu Ana Str. Cuza Vodå nr. 20 sector 1 Bucureçti continue (Se continuå cåutarea angajaÆilor care au superiorul cu codul 100.) ? found() (Se testeazå dacå s-a mai gåsit o înregistrare.)

.T. (S-a mai gåsit angajatul care are ca superior angajatul 100.) ? nume, pren, adresa, loc (Se afiçeazå numele, prenumele, adresa çi localitatea angajatului.)

Ionescu Maria Str. Zorilor nr. 23 sector 4 Bucureçti continue (Se continuå cåutarea angajaÆilor care au superiorul cu codul 100.)

End of locate scope (Nu s-au mai gåsit angajaÆi subordonaÆi angajatului 100.) ? found() (Se testeazå dacå s-a mai gåsit o înregistrare.)

.F. (Nu s-au mai gåsit angajaÆi subordonaÆi angajatului cu codul 100.) ? eof() (Se testeazå dacå s-a ajuns la sfârçitul fiçierului.)

Page 122: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 123

.T. (S-a ajuns la sfârçitul fiçierului.) locate for day(data_n)=day(date()) and month(date_n) = month(date()) Se cautå angajatul care are data de naçtere aståzi. Dacå s-a gåsit, afiçaÆi-i numele çi prenumele. locate for upper(nume)='ANDRONESCU' and upper(pren)='ANA' Se cautå angajatul care are numele Andronescu çi prenumele Ana. Deoarece nu çtiÆi cu ce tip de caractere au fost scrise numele çi prenumele, le transformaÆi în litere mari. ?tel_f, tel_m (se afiçeazå numerele de telefon)

012345678 921222222ExecutaÆi comanda locate folosind opÆiunea de meniu.Table →→ Goto Record44→→ Locate... →→ caseta de dialog Locate Record: executaÆi clic pedeclançatorul Locate →→ înregistrarea 1 (prima înregistrare).Table →→ Goto Record44→→ Locate... →→ caseta de dialog Locate Record: executaÆi clicpe declançatorul For... →→ caseta de dialog Expression Builder: executaÆi dublu clic pecâmpul pren, scrieÆi în caseta de text semnul =, apoi în lista de funcÆii String executaÆiclic pe funcÆia Proper() çi scrieÆi ca parametru în locul parametrului expC, prenumele'Maria' (în casetå va fi scriså condiÆia Angajati.pren=PROPER('Maria')), acÆionaÆideclançatorul Verify pentru a verifica dacå este corectå expresia çi apoi executaÆi clic peOK →→ în caseta de dialog Locate Record executaÆi clic pe declançatorul Locate →→înregistrarea 3 (prima înregistrare pentru care valoarea câmpului pren este Maria).ÎnchideÆi fereastra de editare. ObservaÆi în fereastra Command comenzile corespun-zåtoare acÆiunilor executate:

locate all locate for Angajati.pren= proper('Maria')

4.3. Actualizarea tabeluluiOperaÆia de actualizare a tabelului se executå asupra tabelului deschis çi presupune treitipuri de operaÆii:

adåugarea de noi înregistråri,çtergerea unei înregistråri,modificarea câmpurilor dintr-o înregistrare.

4.3.1. Adåugarea de noi înregistråriSe poate face:1. Prin adåugare la sfârçitul tabelului:

de la tastaturå - se realizeazå fie prin intermediul opÆiunii de meniu Append NewRecords∈∈Table, fie prin intermediul comenzii:

appendSe deschide fereastra de editare de tip Edit. La sfârçitul fiçierului este adåugatå oînregistrare vidå. CompletaÆi câmpurile din înregistrare prin intermediul controa-lelor din aceastå fereastrå. Dacå vreÆi så mai adåugaÆi o nouå înregistrare, dupå ceaÆi terminat de completat câmpurile unei înregistråri apåsaÆi tasta Enter. TerminaÆioperaÆia de adåugare închizând fereastra.prin adåugarea unei înregistråri vide - se realizeazå prin intermediul comenzii:

append blankLa sfârçitul tabelului se adaugå o înregistrare vidå pentru care urmeazå såcompletaÆi ulterior valorile câmpurilor.

Page 123: SGBD Visual Foxpro

124 Informatică

dintr-un alt tabel - se realizeazå fie prin intermediul opÆiunii de meniu AppendRecords...∈∈Table, fie prin intermediul comenzii:

append from <nume_tabel> [fields <listå_câmpuri>] [for <cond>]unde <nume_tabel> este numele tabelului din care se adaugå înregistråri. Implicit seadaugå toate înregistrårile çi toate câmpurile din tabel, dar se poate explicita numaiadåugarea anumitor câmpuri (câmpurile precizate în lista de câmpuri a clauzei fields)çi/sau numai a anumitor înregistråri (cele care îndeplinesc condiÆia precizatå prinexpresia <cond> a clauzei for).

2. Prin inserarea în interiorul tabelului:OperaÆia se realizeazå prin comanda:

insert [before] [blank]Implicit se insereazå o înregistrare vidå dupå înregistrarea curentå çi se deschidefereastra de editare pentru a completa valorile câmpurilor. Explicit, inserarea sepoate face înaintea înregistrårii curente, folosind clauza before, sau se poateinsera numai o înregistrare vidå folosind clauza blank.

4.3.2. Çtergerea înregistrårilorSe poate face prin urmåtoarele operaÆii:

Çtergerea logicå. OperaÆia de çtergere logicå nu înseamnå eliminarea fizicå a înregistråri-lor din tabel, ci numai marcarea lor pentru çtergere. Înregistrårile çterse logic pot fi refå-cute. OperaÆia se realizeazå fie prin intermediul opÆiunii de meniu Delete Records...∈∈Table, fie prin intermediul comenzii:

delete [<domeniu>] [for <cond_1>] [while <cond_2>]Implicit este çtearså logic înregistrarea curentå. Explicit poate fi çters logic un grup deînregistråri precizat prin <domeniu> sau clauzele for sau while.Refacerea înregistrårilor çterse logic. OperaÆia înlåturå marcajele pentru çtergere logi-cå. Se realizeazå fie prin intermediul opÆiunii de meniu Recall Records...∈∈Table, fie prinintermediul comenzii:

recall [<domeniu>] [for <cond_1>] [while <cond_2>]Implicit sunt refåcute toate înregistrårile marcate logic pentru çtergere. Explicit poate firefåcut un grup de înregistråri precizat prin <domeniu> sau clauzele for sau while.Çtergerea fizicå. OperaÆia de çtergere fizicå înseamnå eliminarea fizicå din tabel aînregistrårilor marcate logic pentru çtergere. Înregistrårile çterse fizic nu mai pot fi refåcute.OperaÆia se realizeazå fie prin intermediul opÆiunii de meniu Remove Deleted Records∈∈Table, fie prin intermediul comenzii:

packÇtergerea fizicå a tuturor înregistrårilor. OperaÆia de çtergere fizicå a tuturor înregistrå-rilor înseamnå eliminarea fizicå din tabel a tuturor înregistrårilor de date çi påstrarea numaia structurii tabelului. Se realizeazå prin intermediul comenzii:

zapAceastå operaÆie este echivalentå cu douå operaÆii delete all çi pack.

În fereastra de editare puteÆi så marcaÆi logic pentru çtergere sau så anulaÆi marcajul cuopÆiunea Toggle Deletion Mark∈∈Table sau folosind scurtåtura Ctrl+T. OpÆiunea are

Page 124: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 125

efectul unui comutator. Dacå înregistrarea nu este marcatå, o marcheazå, çi invers, dacåeste marcatå, îi anuleazå marcajul.

Controlarea operaÆiei de çtergere se face prin:Comanda care stabileçte cum pot fi folosite înregistrårile çterse logic:

set deleted on | offunde on înseamnå cå înregistrårile çterse logic nu pot fi folosite de comenzile care auîn sintaxå clauzele for çi while, iar off (implicit) înseamnå cå înregistrårile çterse logicpot fi folosite de toate comenzile.FuncÆia care testeazå dacå înregistrarea curentå este marcatå logic pentru çtergere(valoarea .T. înseamnå cå a fost marcatå pentru çtergere):

deleted()

4.3.3. Modificarea înregistrårilorModificarea valorii câmpurilor din înregistråri se poate face:

prin valori precizate: Se poate folosi comanda replace care are sintaxa:replace <câmp_1> with <expr_1> [additive] [,<câmp_2> with <expr_2>[additive]...]

[<domeniu>] [for <cond_1>] [while <cond_2>]Se înlocuieçte valoarea din câmpul <câmp_1> cu valoarea obÆinutå în urma evaluåriiexpresiei <expr_1>, valoarea din câmpul <câmp_2> cu valoarea obÆinutå în urma eva-luårii expresiei <expr_2> etc. Implicit, înlocuirea se face numai în înregistrareacurentå. Explicit, înlocuirea se poate face într-un grup de înregistråri precizat prin<domeniu> sau clauzele for sau while.interactiv, de la tastaturå: Se pot folosi comenzile edit sau browse care deschidfereastra de editare.

Comenzile browse çi edit au urmåtoarea sintaxå:browse | edit [fields <listå_câmpuri>] [<domeniu>] [for <cond_1>] [while <cond_2>]

[font <nume_font> [,<n>]] [style <nume_stil>] [freeze <nume_câmp>] [last| noinit ] [noappend] [nodelete] [noedit | nomodify] [title <nume_t>] [normal]

[partition <m>] [lpartition] [nolink] [ledit] [redit][valid [f] <cond_3> [error <mesaj>]] [when <cond_4>] [width <p>]

Clauzele din comandå au urmåtoarea semnificaÆie:fields - permite afiçarea numai a câmpurilor precizate în <listå_câmpuri>. Lista decâmpuri poate conÆine nume de câmpuri din tablou sau câmpuri calculate. Separareaîn listå se face prin virgulå. Fiecårui câmp i se poate asocia o opÆiune. OpÆiunile sunt:

:R - câmpul poate fi vizualizat dar nu poate fi modificat;:V = <cond> - câmpul introdus este evaluat prin expresia logicå <cond>. Dacå

valoarea expresiei este T., data din câmp este corectå, altfel se afiçeazå unmesaj de eroare.

:F - se verificå o regulå de validare atunci când trece cursorul prin câmp (fåråmodificare). OpÆiunea se poate folosi împreunå cu opÆiunea :V.

:E= <mesaj> - Mesajul de eroare standard produs de introducerea unei valoriinvalide în câmp poate fi modificat cu mesajul <mesaj> de tip çir de carac-tere. OpÆiunea se poate folosi împreunå cu opÆiunea :V.

Page 125: SGBD Visual Foxpro

126 Informatică

:B = <val_1>,<val_2> - se verificå dacå dupå editare câmpul aparÆine interva-lului definit de valorile <val_1> (limita inferioarå) çi <val_2> (limita superioa-rå). Cele douå valori trebuie så fie de acelaçi tip. În cazul în care valoareacâmpului nu se încadreazå între cele douå limite, se afiçeazå un mesaj deeroare care poate fi personalizat cu opÆiunea :F.

:H = <nume_câmp> - numele câmpului afiçat în fereastra de editare esteînlocuit cu '<nume_câmp>' de tip çir de caractere.

:W = <cond> - se va intra în operaÆia de editare cu câmpul respectiv numaidacå este îndeplinitå condiÆia <cond>.

font - permite stabilirea fontului caracterelor afiçate în fereastra de editare prinnume font çi dimensiune font (de exemplu, font 'arial',12).style - permite stabilirea stilului caracterelor afiçate în fereastra de editare (deexemplu, 'b' - bold, 'u' - underline, 'i' - italic, 'o' - outline, 's' - shadow).freeze - permite selectarea pentru editare a unui singur câmp (precizat prin<nume_câmp>); restul câmpurilor sunt numai pentru informare.last | noinit - fereastra este deschiså cu configuraÆia pe care a avut-o la ultimaoperaÆie de editare.noappend - nu permite utilizatorului så adauge noi înregistråri în tabel.nodelete - nu permite utilizatorului så çteargå logic înregistråri din tabel.noedit | nomodify - nu permite utilizatorului så modifice înregistrårile din tabel (nu-mai så adauge sau så çteargå).normal - deschide fereastra de editare cu valori implicite pentru parametri (culoa-re, dimensiune, poziÆie, titlu etc.).title - modificå titlul ferestrei de editare cu numele <nume_t> de tip çir de caractere.partition - precizeazå coloana <m> în care se împarte fereastra în douå partiÆii: una detip browse, alta de tip edit; fiecare dintre ele poate fi våzutå independent.lpartition - la deschiderea ferestrei de editare, cursorul va fi afiçat în partiÆia dinpartea stângå, în primul câmp, altfel este poziÆionat în partea dreaptå.nolink - cele douå partiÆii nu sunt legate, altfel ele sunt legate, adicå atunci cândse deruleazå conÆinutul unei partiÆii se deruleazå çi conÆinutul celeilalte partiÆii.ledit - partiÆia din partea stângå este de tip invers faÆå de fereastra de editare (detip browse pentru fereastra edit çi de tip edit pentru fereastra browse).redit - partiÆia din partea dreaptå este de tip invers faÆå de fereastra de editare (detip browse pentru fereastra edit çi de tip edit pentru fereastra browse).valid - valideazå valorile introduse în câmpuri (validarea se face la nivelul înregis-trårii çi nu la nivelul câmpului cum face opÆiunea V); dacå este adevåratå condiÆia<cond_3>, se trece la urmåtoarea înregistrare, altfel se råmâne la înregistrareacare se modificå çi se afiçeazå un mesaj de eroare. Mesajul de eroare poate fi per-sonalizat cu <mesaj> (de tip çir de caractere) cu clauza error. OpÆiunea :f forÆeazåexecutarea operaÆiei de validare chiar dacå nu s-au fåcut modificåri în înregistrare.when - are acelaçi efect ca çi opÆiunea w, cu deosebirea cå se aplicå la nivelulîntregii înregistråri, çi nu numai la nivelul unui câmp.width - limiteazå låÆimea câmpurilor la <p> caractere; afecteazå numai formatulde afiçare din fereastrå, nu çi structura tabelului.

Page 126: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 127

Comanda browse mai poate avea clauzele:lock <n> - precizeazå numårul de câmpuri <n> care pot fi våzute în partiÆia dinstânga a ferestrei browse fårå så se deruleze conÆinutul; partiÆia se va dimensionaautomat pentru a realiza acest format de afiçare.nolgrid, norgrid - înlåturå grila din partiÆia stângå, respectiv dreaptå a ferestrei deeditare browse.

4.3.4. Controlarea accesului la înregistråriAccesul la înregistrårile unui tabel poate fi controlat la citire çi scriere prin douå metode:

1. Metoda çtergerii logice:

Aceastå metodå constå în urmåtoarele acÆiuni:Se çterg logic înregistrårile la care nu vreÆi så aveÆi acces cu comanda delete.Se inhibå accesul la înregistrårile çterse logic cu comanda set deleted on.Atunci când vreÆi så aveÆi acces la unele înregistråri, anulaÆi marcajul lor pentruçtergere cu comanda recall.

2. Metoda filtrului:

Aceastå metodå constå în urmåtoarele acÆiuni:Se construieçte un filtru cu comanda:

set filter to <cond>unde <cond> este o condiÆie logicå pe care trebuie så o îndeplineascå înregistrårile lacare aveÆi acces.Refacerea accesului la toate înregistrårile se face cu comanda:

set filter toPuteÆi så testaÆi filtrul (condiÆia pe care trebuie så o îndeplineascå înregistrårile ca såaveÆi acces la ele) cu funcÆia logicå:

filter()

AdåugaÆi înregistråri: use angajati Se deschide tabelul AngajaÆi care conÆine deja cinci înregistråri. append Se deschide fereastra de editare. AdåugaÆi cinci înregistråri. use judete Se deschide tabelul JudeÆe care nu conÆine înregistråri. append AdåugaÆi numai înregistrarea pentru Bucureçti. browse fields c_jud:v=isalpha(left(c_jud,1)) and isalpha(right(c_jud,1))

:e='cod gresit':h='cod judet', n_jud:h='nume_judet'ExecutaÆi clic pe opÆiunea Append Mode ∈∈View (puteÆi så adåugaÆiînregistråri çi în fereastra de editare de tip Browse). AdåugaÆi restul în-registrårilor în fereastra Browse. VerificaÆi mesajele de eroare careapar atunci când nu scrieÆi codul judeÆului format din douå litere.

use angajati Se deschide tabelul AngajaÆi care conÆine zece înregistråri. copy structure to ang CopiaÆi structura tabelului într-un tabel nou ang. use ang Se deschide tabelul Ang care nu conÆine înregistråri. append blank (de 5 ori) Se adaugå cinci înregistråri vide. browse În fereastra de editare sunt afiçate cele 5 înregistråri vide.

Page 127: SGBD Visual Foxpro

128 Informatică

replace all tip_ang with 'a' Se completeazå pentru toÆi angajaÆii câmpul tip_ang cu 'a'. goto top PoziÆionaÆi pointerul la începutul tabelului, deoarece comanda replace all

l-a pozÆionat la sfârçitul tabelului. replace next 3 id_sup with 300, loc with 'Buzau', c_jud with 'Bz',tel_f with '038'

Primii trei angajaÆi sunt din Buzåu çi sunt subordonaÆi aceleiaçipersoane. Pentru numårul de telefon se scrie prefixul pentru Buzåu.Pointerul de înregistrare va fi poziÆionat pe înregistrarea 3.

skip Salt la urmåtoarea înregistrare (înregistrarea 4) replace rest id_sup with 100, loc with 'Bucuresti', c_jud with 'B',tel_f with '01'

Ultimii doi angajaÆi sunt din Bucureçti çi sunt subordonaÆi aceleiaçipersoane. Pentru numårul de telefon se scrie prefixul pentru Bucureçti.Pointerul de înregistrare va fi poziÆionat pe înregistrarea 5.

browse În fereastra de editare completaÆi cu valori restul câmpurilor. use angajati Se deschide tabelul AngajaÆi. append from ang for c_jud='B'

Se adaugå din tabelul Ang la sfârçitul tabelului, angajaÆii din Bucureçti. append from ang for c_jud='Bz'

Se adaugå din tabelul Ang la sfârçitul tabelului, angajaÆii din Buzåu. browse DeschideÆi fereastra de editare. ObservaÆi cum s-au executat operaÆiile. use clienti Se deschide tabelul ClienÆi. browse Nu conÆine nici o înregistrare. appen blank (de 6 ori) AdåugaÆi 6 înregistråri vide. browse Se completeazå pentru toate înregistrårile codul clientului çi codul

angajatului care se ocupå de el. replace for id_ang>=100 and id_ang<200 loc with 'Bucuresti', c_jud with 'B', tel_f with '01',

fax with '01'Se completeazå pentru clienÆii de care se ocupå angajaÆii din Bucureçtilocalitatea, codul judeÆului çi prefixul pentru telefon çi fax.

replace for id_ang>=200 and id_ang<300 loc with 'Constanta', c_jud with 'Ct',tel_f with '041', fax with '041'

Se completeazå pentru clienÆii de care se ocupå angajaÆii din Constan-Æa localitatea, codul judeÆului çi prefixul pentru telefon çi fax.

replace for id_ang>=300 and id_ang<400 loc with 'Buzau', c_jud with 'Bz', tel_f with '038',fax with '038'

Se completeazå pentru clienÆii de care se ocupå angajaÆii din Buzåulocalitatea, codul judeÆului çi prefixul pentru telefon çi fax.

brow CompletaÆi restul câmpurilor.

ModificaÆi valoarea câmpurilor din înregistråri:use angajati Se deschide tabelul AngajaÆi.browse freeze tarif valid tarif>=300000 and tarif<=500000

În fereastra de editare se modificå numai tariful. Valoarea introdusåtrebuie så aparÆinå intervalului [300000, 500000]

browse for lower(c_jud)='ct' fields nume:r, pren:r, tel_f:v=tel_f >'041000000' andtel_f<'041999999':e='telefon gresit'

În fereastra de editare se fac modificåri numai pentru angajaÆii dinConstanÆa pentru care se modificå numai numårul de telefon. Pentruvaloarea introduså s-a precizat o regulå de validare çi un mesaj afiçatîn caz de introducere eronatå a valorii.

replace id_sup with 1000 for id_sup=100Se înlocuieçte în tot tabelul codul superiorului 100 cu 1000.

Page 128: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 129

browse Se afiçeazå modificårile fåcute în fereastra de editare.replace id_sup with 100 for id_sup=1000

Se înlocuieçte în tot tabelul codul superiorului 1000 cu 100.browse Se afiçeazå modificårile fåcute în fereastra de editare.browse fields nume, pren:h='prenume', varsta= int((date()-data_n)/365)

Se afiçeazå în fereastra browse numai câmpurile nume, pren çi varsta(un câmp calculat). Pentru câmpul pren se afiçeazå eticheta prenume.

replace for id_ang=104 tip_ang with 'c'Se modificå pentru angajatul cu identificatorul 104 tipul angajatului din a în c.

replace for id_ang=302 tip_ang with 'b'Se modificå pentru angajatul cu identificatorul 104 tipul angajatului din a în b.

browse Se afiçeazå modificårile fåcute în fereastra de editare.

ÇtergeÆi înregistråri:delete for lower(c_jud)='ct'browse Înregistrårile din judeÆul ConstanÆa sunt marcate logic pentru çtergere.set deleted onbrowse Înregistrårile marcate logic pentru çtergere nu mai sunt afiçate.set deleted offbrowse Înregistrårile marcate logic pentru çtergere sunt afiçate.

PoziÆionaÆi cursorul pe o înregistrare marcatå logic pentru çtergere.?deleted()

.T. PoziÆionaÆi cursorul pe o înregistrare care nu este marcatå pentru çtergere.?deleted()

.F.recall for lower(c_jud)='ct'

RefaceÆi înregistrårile marcate logic pentru çtergere.delete record 1 MarcaÆi logic pentru çtergere înregistrarea 1.set deleted onbrowse Înregistrarea 1 nu este afiçatå în fereastra de editare.recall record 1 RefaceÆi înregistrarea marcatå logic pentru çtergere.browse Înregistrarea 1 este afiçatå în fereastra de editare.set deleted off

4 . 4 . C o n s u l t a r e a t a be l u l u i

Bazele de date se construiesc pentru a obÆine informaÆii într-un timp mai scurt. Informa-Æiile obÆinute dintr-un tabel pot fi:

1. Detaliate - sub forma unor liste:

Se pot folosi comenzile list sau display . Sintaxa lor este:

list | display [ [fields] <listå_câmpuri>][<domeniu>] [for <cond_1>] [while <cond_2>]

[to printer | to file <nume_fiçier>] [noconsole] [off]Deosebirile dintre comanda list çi display sunt:

Page 129: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 129

browse Se afiçeazå modificårile fåcute în fereastra de editare.replace id_sup with 100 for id_sup=1000

Se înlocuieçte în tot tabelul codul superiorului 1000 cu 100.browse Se afiçeazå modificårile fåcute în fereastra de editare.browse fields nume, pren:h='prenume', varsta= int((date()-data_n)/365)

Se afiçeazå în fereastra browse numai câmpurile nume, pren çi varsta(un câmp calculat). Pentru câmpul pren se afiçeazå eticheta prenume.

replace for id_ang=104 tip_ang with 'c'Se modificå pentru angajatul cu identificatorul 104 tipul angajatului din a în c.

replace for id_ang=302 tip_ang with 'b'Se modificå pentru angajatul cu identificatorul 104 tipul angajatului din a în b.

browse Se afiçeazå modificårile fåcute în fereastra de editare.

ÇtergeÆi înregistråri:delete for lower(c_jud)='ct'browse Înregistrårile din judeÆul ConstanÆa sunt marcate logic pentru çtergere.set deleted onbrowse Înregistrårile marcate logic pentru çtergere nu mai sunt afiçate.set deleted offbrowse Înregistrårile marcate logic pentru çtergere sunt afiçate.

PoziÆionaÆi cursorul pe o înregistrare marcatå logic pentru çtergere.?deleted()

.T. PoziÆionaÆi cursorul pe o înregistrare care nu este marcatå pentru çtergere.?deleted()

.F.recall for lower(c_jud)='ct'

RefaceÆi înregistrårile marcate logic pentru çtergere.delete record 1 MarcaÆi logic pentru çtergere înregistrarea 1.set deleted onbrowse Înregistrarea 1 nu este afiçatå în fereastra de editare.recall record 1 RefaceÆi înregistrarea marcatå logic pentru çtergere.browse Înregistrarea 1 este afiçatå în fereastra de editare.set deleted off

4 . 4 . C o n s u l t a r e a t a be l u l u i

Bazele de date se construiesc pentru a obÆine informaÆii într-un timp mai scurt. Informa-Æiile obÆinute dintr-un tabel pot fi:

1. Detaliate - sub forma unor liste:

Se pot folosi comenzile list sau display . Sintaxa lor este:

list | display [ [fields] <listå_câmpuri>][<domeniu>] [for <cond_1>] [while <cond_2>]

[to printer | to file <nume_fiçier>] [noconsole] [off]Deosebirile dintre comanda list çi display sunt:

Page 130: SGBD Visual Foxpro

130 Informatică

diferenÆe list displaydomeniul implicit de acÆiune toate înregistrårile înregistrarea curentåmodul de afiçare defilare paginat (ecran plin)efectul valorii on a parameterului deleted

nu afiçeazå înregistrårile çterse logic

afiçeazå înregistrårile çterse logic

Açadar, comanda list este echivalentå cu comanda display rest, iar comanda displayeste echivalentå cu comanda list next 1 sau list record recno().

Implicit sunt afiçate pe ecran toate câmpurile, inclusiv numårul înregistrårii. Explicit sepoate afiça numai un grup de înregistråri precizat prin <domeniu> sau clauzele for sauwhile, numai anumite câmpuri precizate prin clauza fields, fårå numårul înregistråriifolosind clauza off, iar ieçirea poate fi redirectatå la imprimantå sau într-un fiçier.

2. Sintetizate - sub forma unor valori:

Se pot folosi comenzi sau funcÆii:

Comanda FuncÆia Efectulcount cnt() furnizeazå numårul de înregistrårisum sum(<expn>) furnizeazå suma unor câmpuri numericeaverage avg(<expn>) furnizeazå media aritmeticå a unor câmpuri numericecalculate furnizeazå rezultatul evaluårii funcÆiilor cnt(), sum() çi avg().

Sintaxa comenzilor este:sum | average | calculate [<listå_expresii_numerice>]

[<domeniu>] [for <cond_1>] [while <cond_2>][ to <nume_variabilå>]count [<domeniu>] [for <cond_1>] [while <cond_2>] [ to <nume_variabilå>]

Domeniul implicit de acÆiune al acestor comenzi este: comanda se aplicå asupra tuturorînregistrårilor çi asupra tuturor câmpurilor numerice, iar rezultatul se afiçeazå pe ecran.Explicit, comenzile acÆioneazå numai asupra grupului de înregistråri precizat prin<domeniu> sau clauza for sau while çi numai asupra câmpurilor numerice precizate în<listå_expresii_numerice>, iar rezultatul poate fi memorat în variabile de memorie.

AflaÆi media aritmeticå:

DeschideÆi tabelul AngajaÆi. AflaÆi media aritmeticå a tarifului folosind comanda:

average tarif Se calculeazå çi se afiçeazå media aritmeticå a tarifului pentrutoÆi angajaÆii.

average tarif to v Se calculeazå media aritmeticå a tarifului pentru toÆi angajaÆii çise påstreazå în variabila de memorie v

?v al cårui conÆinut se afiçeazå ulterior. calculate avg(tarif) CalculaÆi media aritmeticå cu ajutorul funcÆiei avg(). average for tip_ang='a' Se afiçeazå media aritmeticå pentru toate câmpurile numerice

(inclusiv pentru cele care conÆin codurile angajaÆilor çi ale superi-orilor; din aceastå cauzå cererea de informaÆie nu s-a fåcut corect)

Page 131: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 131

average tarif for tip_ang='a' Se afiçeazå media aritmeticå a tarifului pentru angajaÆii per-manenÆi cu normå întreagå (tip 'a').

average tarif for tip_ang<>'a' Se afiçeazå media aritmeticå a tarifului pentru angajaÆii care nusunt permanenÆi cu normå întreagå (tip diferit de 'a').

NumåraÆi înregistråri:

Prin numårarea înregistrårilor care corespund unui criteriu, puteÆi så aflaÆi câÆi angajaÆiîndeplinesc acel criteriu:

count for id_sup=100 Se numårå çi se afiçeazå câÆi angajaÆi sunt subordonaÆi anga-jatului cu identificatorul 100.

count for id_sup=100 to v Se numårå câÆi angajaÆi sunt subordonaÆi angajatului cu identi-ficatorul 100 çi rezultatul se påstreazå în variabila de memorie v

? v al cårui conÆinut se afiçeazå ulterior. count for lower(c_jud)='ct' Se numårå çi se afiçeazå câÆi angajaÆi sunt din ConstanÆa. count for tarif > 250000 Se numårå çi se afiçeazå câÆi angajaÆi au tariful mai mare decât

250000 lei.

AfiçaÆi liste:

În liste puteÆi så afiçaÆi anumite câmpuri precizate prin lista de câmpuri çi anumiteînregistråri precizate prin domeniu sau clauzele for sau while:

list nume, pren, data_n for month(data_n)=03Se afiçeazå numele, prenumele çi data naçterii pentru toÆi angajaÆii nåscuÆi înluna martie.

list for id_sup=100Se afiçeazå toate câmpurile pentru angajaÆii subordonaÆi angajatului cu codul 100.

list nume, pren, id_ang for id_sup=100Se afiçeazå numele, prenumele çi identificatorul pentru angajaÆii subordonaÆiangajatului cu codul 100.

list nume, pren, id_ang for id_sup=id_angSe afiçeazå numele, prenumele çi identificatorul pentru angajaÆii care nu suntsubordonaÆi altor angajaÆi.

display nume, pren, id_ang for id_sup=id_ang list id_ang, nume, pren to file alfa

Lista, care conÆine numai câmpurile cu identificatorul angajatului, numele çiprenumele pentru toÆi angajaÆii, este copiatå într-un fiçier.

dir alfa.* Se afiçeazå lista fiçierelor care au numele alfa din directorul curent. Fiçierul încare s-a transferat lista are extensia .txt.

type alfa.txt Se afiçezå conÆinutul fiçierului alfa.txt care conÆine lista.

TestaÆi modul în care sunt tratate înregistrårile çterse logic:

Controlul se face prin parametrul deleted:

delete for lower(c_jud)='ct' Se marcheazå pentru çtergere logicå înregistrårileangajaÆilor din ConstanÆa.

set deleted on Se atribuie parametrului deleted valoarea on. display Se afiçeazå înregistrarea curentå cu comanda display. list Se afiçeazå toate înregistrårile cu comanda list. display all Se afiçeazå toate înregistrårile cu comanda display all. set deleted off Se atribuie parametrului deleted valoarea off. display Se afiçeazå înregistrarea curentå cu comanda display.

Page 132: SGBD Visual Foxpro

132 Informatică

list Se afiçeazå toate înregistårile cu comanda list. display all Se afiçeazå toate înregistårile cu comanda display all. recall for lower(c_jud)='ct' Se refac înregistrårile marcate logic pentru çtergere.

TestaÆi efectul filtrului definit pentru înregistråri:

PuteÆi så definiÆi filtre pentru înregistråri cu ajutorul parametrului filter: set filter to upper(c_jud)='B' Se construieçte un filtru. Scopul este de a låsa så treacå

numai angajaÆii din Bucureçti. ?filter() Se cere afiçarea filtrului.

upper(c_jud)='B' Se afiçeazå condiÆia logicå din filtru. list id_ang, nume, pren, loc Se afiçeazå atât angajaÆii din Bucureçti cât çi cei din Buzåu. browse Açadar, filtrul nu a fost construit corect. set filter to upper(c_jud)=='B' Se defineçte din nou filtrul, cu o altå condiÆie logicå. ?filter() Se cere afiçarea filtrului.

upper(c_jud)=='B' Se afiçeazå condiÆia logicå din filtru. list id_ang, nume, pren, loc Nu se afiçeazå nici o înregistrare. Din nou filtrul nu a fost definit browse corect. set filter to upper(c_jud)=='B ' Se defineçte din nou filtrul, cu o altå condiÆie logicå. ?filter() Se cere afiçarea filtrului.

(c_jud)=='B ' Se afiçeazå condiÆia logicå din filtru. list id_ang, nume, pren, loc Se afiçeazå numai angajaÆii din Bucureçti. CondiÆia din filtru a browse fost definitå corect. set filter to Se anuleazå filtrul. list id_ang, nume, pren, loc Se afiçeazå toate înregistrårile.

browse

TestaÆi efectul filtrului definit pentru câmpuri:

PuteÆi så definiÆi filtre pentru câmpuri cu ajutorul parametrului fields. DeschideÆi tabelulClienÆi cu comanda use clienti.

set fields to id_cl, nume, pren, id_ang list Sunt afiçate numai câmpurile identificator client, nume çi pre- browse nume client, identificatorul angajatului care se ocupå de client. display (numai câmpurile id_cl, nume, pren, id_ang) set fields to browse Nu este afiçat nici un câmp. set fields to all browse Sunt afiçate toate câmpurile.

4 . 5 . S o r t a r e a t a b e l u lu i

În urma sortårii unui tabel se creeazå un alt tabel în care înregistrårile sunt rearanjateconform criteriului de sortare folosit. OperaÆia acÆioneazå asupra tabelului deschis.Sintaxa comenzii este:

sort to <nume_tabel> on <câmp_1> [/a | /d] [ /c] [, <câmp_1> [/a | /d] [ /c].... ][ascending | descending] [<domeniu>] [for <cond_1>] [while <cond_2>]

[fields <listå_câmpuri>]Forma implicitå a comenzii este:

sort to <nume_tabel> on <câmp>

Page 133: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 133

unde <nume_tabel> este numele tabelului obÆinut în urma sortårii tuturor înregistrårilor dintabelul deschis, iar <câmp> este numele câmpului folosit pentru cheia de sortare. Sortarease face în ordinea crescåtoare a câmpului cheie de sortare. Tabelul sortat va avea aceeaçistructurå ca çi tabelul surså. Explicit, se pot sorta din tabelul surså numai înregistrårileprecizate prin <domeniu> sau clauzele for sau while çi pot fi folosite mai multe chei desortare <câmp_1>, <câmp_2> etc. Sortarea se poate face descrescåtor, dupå toatå lista decâmpuri cheie de sortare folosind clauza descending, sau poate fi controlatå ordinea desortare la nivelul fiecårui câmp, folosind adverbele /a - crescåtor, /d - descrescåtor sau /c -fårå så se Æinå cont de diferenÆa dintre literele mari sau mici. Tabelul sortat poate så conÆinånumai câmpurile precizate prin lista din clauza fields.

4 . 6 . I n d e x a r e a t a b e lu l u i

Pentru a putea exploata un tabel în acces direct, trebuie organizat astfel încât så aveÆiacces direct la o înregistrare în funcÆie de valoarea unui câmp sau a unor câmpuri carevor forma cheia de acces. SoluÆia este de ordonare logicå a înregistrårilor prin interme-diul fiçierelor index, iar cheia de acces se mai numeçte cheie de indexare.

Visual FoxPro permite crearea a douå tipuri de fiçiere de index pe lângå indexul structural:index simplu care conÆine o singurå cheie de indexare într-un fiçier (numele diferitde al tabelului çi extensia idx),index compus care conÆine mai multe chei de indexare (etichete index) într-unfiçier (numele diferit de al tabelului çi extensia cdx).

Cheia de indexare poate fi formatå dintr-un singur câmp sau din mai multe câmpuri legateprintr-o expresie de concatenare. Din aceastå cauzå, dacå nu sunt de tip çir de caractere,câmpurile trebuie convertite într-un çir de caractere cu ajutorul funcÆiilor de conversie. Amnotat cp1 - câmpul 1, cp2 - câmpul 2 çi e(cp1,cp2) - expresia formatå din cele douå câmpuri.

tip cp1 tip cp2 cp1 convertit cp2 convertit e(cp1,cp2)C C cp1 cp2 cp1+cp2C N cp1 str(cp2) cp1+ str(cp2)C D cp1 dtos(cp2) cp1+ dtos(cp2)C T cp1 ttoc(cp2) cp1+ ttoc(cp2)N N str(cp1) str(cp2) str(cp1)+ str(cp2)N D str(cp1) dtos(cp2) str(cp1)+ dtos(cp2)N T str(cp1) ttoc(cp2) str(cp1)+ ttoc(cp2)D D dtos(cp2) dtos(cp2) dtos(cp1)+ dtos(cp2)D T dtos(cp2) ttoc(cp2) dtos(cp1)+ ttoc(cp2)T T ttoc(cp2) ttoc(cp2) ttoc(cp1)+ ttoc(cp2)

Câmpurile logice çi memo nu pot fi folosite în cheia de indexare.

4.6.1. Crearea unui indexDacå indexul compus structural se creeazå împreunå cu tabelul, ceilalÆi indecçi secreeazå dupå ce a fost creat tabelul, prin comanda:

index on <expresie_index>to <nume_fiçier.idx> | tag <nume_etichetå> [of <nume_fiçier.cdx>]

[for <cond_1>] [ascending | descending] [additive]

Page 134: SGBD Visual Foxpro

134 Informatică

Forma implicitå a comenzii este:pentru indexul simplu:

index on <expresie_index> to <nume_fiçier.idx>pentru indexul compus:

index on <expresie_index> tag <nume_etichetå> of <nume_fiçier.cdx>

Implicit, se ordoneazå crescåtor toate înregistrårile din tabel, iar la crearea noului indextoate celelalte fiçiere index asociate tabelului sunt închise (cu excepÆia indexului structural).Explicit, prin fiçierul index puteÆi avea acces numai la înregistrårile precizate cu clauza for,ordonarea logicå poate fi crescåtoare (ascending) sau descrescåtoare (descending) çi sepot påstra deschise fiçierele index deschise anterior (folosind clauza additive).

4.6.2. Deschiderea unui indexÎn afarå de indexul compus structural care se deschide automat la deschiderea tabelului,ceilalÆi indecçi trebuie deschiçi fie prin opÆiunea Open∈∈File (în caseta de dialog OpenalegeÆi tipul index (*.idx; *.cdx) din lista Files of type), fie folosind una dintre comenzile:

la deschiderea tabelului:use <nume_tabel> index <listå_fiçiere.idx>

[order <nume_fiçier.idx>| tag <nume_etichetå> of <nume_fiçier.cdx> [ascending | descending]

În lista de fiçiere a clauzei index pot fi specificaÆi atât indecçi simpli, cât çi indecçi compuçi.Nu este obligatoriu så se precizeze çi extensia (doar dacå existå douå fiçiere index, unulsimplu çi altul compus, cu acelaçi nume). Dacå se deschid mai mulÆi indecçi prin clauzaorder, precizaÆi care este indexul activ (indexul simplu sau eticheta din indexul compus).

dupå deschiderea tabelului:set index to <listå_fiçiere.idx> [ascending | descending] [additive] order <nume_fiçier.idx>| tag <nume_etichetå> of <nume_fiçier.cdx>

4.6.3. Alte operaÆii cu indecçischimbarea indexului activ din lista de indecçi deschiçi:

set order to <nume_fiçier.idx>| tag <nume_etichetå> of <nume_fiçier.cdx> [ascending | descending]

çtergerea etichetelor dintr-un index compus:delete tag <nume_etichetå_1> of <nume_fiçier_1.cdx>

[,<nume_etichetå_1> of <nume_fiçier_1.cdx> ...]

4.6.4. Exploatarea unui tabel împreunå cu indexulDacå deschideÆi tabelul împreunå cu un index, aveÆi acces direct la înregistråri. PoziÆionareapointerului de înregistrare direct pe o înregistrare se face folosind comanda:

seek <expresie>care cautå prima înregistrare cu valoarea cheii de indexare egalå cu <expresie>. Efectulcomenzii seek în acces direct este echivalent cu efectul comenzii locate for <cond> în accessecvenÆial. Dacå se gåseçte înregistrarea, funcÆia found() va furniza valoarea .T.

În loc så folosiÆi comanda seek împreunå cu funcÆia found(), puteÆi folosi funcÆia seek():seek (<expresie>)

Page 135: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 135

FuncÆia testeazå dacå existå o înregistrare care are cheia de indexare egalå cu expresia<expresie>. Dacå o gåseçte, poziÆioneazå pointerul pe aceastå înregistrare çi furnizeazåvaloarea .T., altfel poziÆioneazå pointerul la sfârçitul fiçierului çi furnizeazå valoarea .F..

SortaÆi tabele:

DeschideÆi tabelul AngajaÆi. SortaÆi acest tabel dupå urmåtoarele criterii:

use angajati Se deschide tabelul AngajaÆi. browse Se afiçeazå conÆinutul tabelului în fereastra de editare. sort on nume, pren to a1

Se sorteazå tabelul dupå câmpurile nume çi pren. Rezultatul sortårii este în tabelul a1. sort on id_ang to a2

Se sorteazå tabelul dupå câmpul id_ang. Rezultatul sortårii este în tabelul a2. sort on id_sup to a3

Se sorteazå tabelul dupå câmpul id_sup. Rezultatul sortårii este în tabelul a3. sort on loc, id_ang to a4

Se sorteazå tabelul dupå câmpurile loc çi id_ang. Rezultatul sortårii este în tabelul a4. use a1 Se deschide tabelul a1. list nume, pren, id_ang, id_sup, loc browse Înregistrårile sunt aranjate alfabetic dupå valoarea câmpurilor nume çi pren. Pentru

acelaçi nume, sunt ordonate alfabetic dupå prenume. use a2 Se deschide tabelul a2. list nume, pren, id_ang, id_sup, loc browse Înregistrårile sunt aranjate crescåtor dupå valoarea câmpului id_ang. use a3 Se deschide tabelul a3. list nume, pren, id_ang, id_sup, loc browse Înregistrårile sunt aranjate crescåtor dupå valoarea câmpului id_ang. use a4 Se deschide tabelul a4. list nume, pren, id_ang, id_sup, loc browse Înregistrårile sunt aranjate alfabetic dupå localitate. Pentru aceeaçi localitate, sunt

aranjate în ordinea crescåtoare a identificatorului de angajat.

IndexaÆi tabele: use judete S-a deschis tabelul JudeÆe. modify structure

În caseta de dialog Table Designer, deschideÆi secÆiunea Index. ObservaÆi cå pentru acesttabel nu s-a definit la creare nici un index structural.

index on c_jud tag cod of judeteS-a definit un index structural. ConÆine o singurå etichetå cod, iar cheia de indexare aetichetei este câmpul c_jud (codul judeÆului).

modify structureÎn caseta de dialog Table Designer, deschideÆi secÆiunea Index. ObservaÆi cå indexul

definit este de tip Regular. SchimbaÆi tipul în Candidate. list Înregistrårile sunt afiçate în ordinea alfabeticå a codului judeÆului. browse În fereastra de editare, înregistrårile sunt afiçate în ordinea alfabeticå a

codului judeÆului. seek 'ct' Cautå înregistrarea pentru care codul judeÆului este ct. ?iif (found(),n_jud, 'nu a gasit')

Page 136: SGBD Visual Foxpro

136 Informatică

Constanta S-a gåsit înregistrarea. ?iif(seek('bz'),n_jud,'nu a gasit')

Buzau S-a gåsit înregistrarea. use angajati S-a deschis tabelul AngajaÆi.

browse Înregistrårile sunt afiçate în ordinea în care le-aÆi creat. modify structure

În caseta de dialog Table Designer, deschideÆi secÆiunea Index. ObservaÆi cå pentru acesttabel este definit deja de la creare indexul nume care are cheia determinatå de expresianume+pren. DefiniÆi un nou index cu numele cod, de tip Candidate çi cu expresia de

indexare id_ang. MutaÆi acest index pe prima poziÆie în listå. DefiniÆi un nou index cu numeledata, de tip Regular çi cu expresia de indexare dtos(data_n)+ dtos(data_a).

set order to tag cod Ordinea de indexare este datå de eticheta cod. browse ObservaÆi ordinea în care sunt afiçate înregistrårile. list id_ang, nume, pren set order to tag nume Ordinea de indexare este datå de eticheta cod. list id_ang, nume, pren browse ObservaÆi ordinea în care sunt afiçate înregistrårile.

ÎncercaÆi:

TT est pentru evaluare:

Adevårat/Fals:1. Ordonarea logicå înseamnå o ordonare dupå o condiÆie logicå.2. Cheia de indexare poate conÆine mai multe câmpuri legate printr-o expresie de concatenare.3. Un tabel poate avea mai mulÆi indecçi structural compuçi.4. Într-un tabel puteÆi defini mai multe etichete de tipul Primary.5. Numårul înregistrårii curente din tabel îl obÆineÆi cu funcÆia reccount().6. Domeniul implicit al comenzii list este all.7. Domeniul implicit al comenzii display este all.8. FuncÆia cnt() nu poate fi folositå decât în comanda calculate.9. Comanda delete tag çterge o etichetå dintr-un index compus.10. Se poate crea un singur index simplu.CompletaÆi:1. Un index compus conÆine mai multe ..........................…………2. Pentru crearea unui tabel puteÆi folosiÆi comanda SQL ............................3. PuteÆi så modificaÆi structura unui tabel cu comanda ..............................................4. Cu comanda set fields to controlaÆi accesul la ....................................5. ObÆineÆi numårul de câmpuri dintr-o înregistrare cu funcÆia ..............................6. ObÆineÆi numårul de înregistråri dintr-un tabel cu funcÆia ...................................7. În acces secvenÆial, cåutarea unei înregistråri dupå un criteriu logic se face cu comanda .....8. În comanda list, pentru a afiça anumite câmpuri folosiÆi clauza ......................9. Pentru a calcula media aritmeticå folosiÆi funcÆia ..........................10. StabiliÆi eticheta activå dintr-un index compus cu comanda ..........................................

Page 137: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 137

AlegeÆi råspunsurile corecte:1. ObÆineÆi dimensiunea unei înregistråri cu funcÆia:

a) fsize() b) recsize() c) reccount()2. Ordonarea fizicå a înregistrårilor din tabel se face cu operaÆia de:

a) indexare b) sortare c) concatenare3. VreÆi så indexaÆi dupå douå câmpuri numerice a çi b. Expresia cheii de indexare este:

a) a+b b) a,b c) str(a)+str(b)4. VreÆi så sortaÆi dupå douå câmpuri numerice a çi b. Expresia cheii de sortare este:

a) a+b b) a,b c) str(a)+str(b)5. PuteÆi vedea structura unui tabel cu comanda:

a) list structure b) display structure c) modify structure6. Cu comanda set filter to controlaÆi accesul la:

a) câmpuri b) înregistråri c) înregistråri çi câmpuri7. Comanda goto next poziÆioneazå pointerul de înregistrare pe:

a) înregistrarea urmåtoare b) înregistrarea curentå c) eroare8. Comanda delete:

a) çterge logic înregistrarea curentåb) çterge fizic înregistrarea curentåc) çterge logic toate înregistråriled) çterge fizic toate înregistrårile

9. CombinaÆia comanda seek + funcÆia found() poate fi înlocuitå de:a) comanda locate + funcÆia found() b) funcÆia seek() c) comanda found

10. Comanda insert blank insereazå:a) spaÆii într-un câmp de tip çir de caractereb) o înregistrare vidå dupå înregistrarea curentåc) o înregistrare vidå înaintea înregistrårii curente

RåspundeÆi:1. Ce este un tabel liber?2. Prin câte metode puteÆi crea structura unui tabel? Ce comenzi folosiÆi?3. Ce este un tabel de structurå?4. Ce sunt indecçii? De câte tipuri sunt? Unde sunt memoraÆi în afara sesiunii de lucru?5. Ce este un index structural compus? Ce avantaje are folosirea acestui index?6. Ce tip de etichetå de index trebuie så definiÆi pentru câmpul care va asigura legåtura

cu un alt câmp al bazei de date?7. Ce avantaj are folosirea a douå operaÆii de çtergere: logicå çi fizicå?8. Cum controlaÆi accesul la nivel de înregistrare çi la nivel de câmp într-un tabel?9. Ce informaÆii puteÆi obÆine despre câmpurile din tabel cu ajutorul funcÆiilor?10. Ce informaÆii puteÆi obÆine despre înregistrårile din tabel cu ajutorul funcÆiilor?11. Care este deosebirea dintre comenzile list çi display?12. Care este deosebirea dintre comenzile edit çi browse?

RR åspunsuri:Adevårat/Fals: 1-F; 2-A; 3-F; 4-F; 5-F; 6-A; 7-F; 8-A; 9-A; 10-F.CompletaÆi: 1-etichete index; 2-create table; 3-modify structure; 4-câmpuri; 5-fcount; 6-reccount; 7-locate; 8-fields; 9-avg(); 10-set order toAlegeÆi råspunsurile corecte: 1-b; 2-b; 3-c; 4-b; 5-a,b,c; 6-b; 7-c; 8-a; 9-b; 10-b.

Page 138: SGBD Visual Foxpro

138 Informatică

5. Operaţii cu datele dintr-o bază de dateÎn Visual FoxPro puteÆi folosi douå metode pentru crearea unei baze de date. Acestemetode creeazå douå tipuri de baze de date:

Temporare. Ele sunt create prin metoda clasicå (metoda folositå în varianteleanterioare de FoxPro çi care s-a påstrat çi în Visual FoxPro pentru compatibilitatecu versiunile anterioare). Tabelele bazei de date sunt permanente çi sememoreazå în fiçiere .dbf. Ele pot fi create çi manipulate prin operaÆiile descrise încapitolul anterior. Baza de date nu este înså permanentå. Ea trebuie definitå înfiecare sesiune de lucru sau trebuie scris un program de aplicaÆie în care så fiedefinitå çi care trebuie rulat de fiecare datå când vreÆi så exploataÆi baza de date.La începutul sesiunii de lucru, tabelele care fac parte din baza de date se deschidîn zone de lucru diferite, apoi se construieçte baza de date prin definirea relaÆiilordintre tabele. Aceste relaÆii pot fi numai de tip una-la-una sau una-la-mai-multe. Întimpul sesiunii de lucru se executå operaÆii de exploatare çi întreÆinere a bazei dedate. La terminarea sesiunii de lucru tabelele se închid çi automat se distrug çirelaÆiile stabilite între ele, relaÆii care defineau baza de date. În urmåtoarea sesiunede lucru, trebuie reluatå operaÆia de definire a relaÆiilor dintre tabele, operaÆii carecreeazå baza de date.Permanente. Ele sunt create prin metoda containerului, în care baza de dateeste o entitate permanentå. Tabelele sunt påstrate în continuare în fiçiere cuextensia .dbf. Baza de date este înså definitå ca un container care va conÆine: listatabelelor componente, relaÆiile dintre tabele çi alte date necesare regåsirii informa-Æiilor. Baza de date este memoratå într-un fiçier cu extensia .dbc, este indepen-dentå de programele de aplicaÆii çi poate fi påstratå çi în afara sesiunii de lucru.Definirea relaÆiilor se face o singurå datå, la crearea bazei de date. Pentru a aveaacces la baza de date, este suficient så deschideÆi fiçierul bazei de date (fiçierul.dbc). Prin aceastå metodå poate fi îmbunåtåÆit lucrul cu tabelele bazei de date,deoarece în baza de date pot fi påstrate çi alte date, ca de exemplu date desprecâmpurile din tabele: etichetele câmpurilor, valoarea implicitå a câmpului, regulade validare la nivel de câmp sau la nivel de înregistrare, mesajele care vor fiafiçate dacå datele introduse în câmp nu respectå regula de validare etc.

OperaÆiile puse la dispoziÆie de Visual FoxPro pentru administrarea bazelor de date pot figrupate astfel:1. Crearea bazei de date care cuprinde urmåtoarele operaÆii:

crearea unui fiçier nou bazå de date;adåugarea pe rând la baza de date a tabelelor libere create anterior;construirea unor noi tabele direct în baza de date;precizarea, pentru tabelele libere create anterior, a proprietåÆilor care nu au putut fidefinite la crearea lor: etichetele câmpurilor, valorile implicite ale câmpurilor,regulile de validare la nivel de câmp çi la nivel de înregistrare, mesajele de eroarepentru regulile de validare.stabilirea legåturilor între tabele;stabilirea proprietåÆilor bazei de date;încorporarea în baza de date a unor entitåÆi specifice pentru exploatarea ei:vizualizåri, conexiuni (care asigurå accesul la datele create cu alte sisteme),

Page 139: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 139

proceduri çi funcÆii care pot fi folosite atunci când seexploateazå tabelele bazei de date.

2. Exploatarea bazei de date care cuprinde operaÆii pentru:deschiderea bazei de date çi a tabelelor,prelucrarea datelor din tabele prin operaÆii de actualizare,consultare, sortare etc.,închiderea tabelelor çi a bazei de date.

5.1. Crearea bazei de date 5.1.1. Crearea bazei de dateÎn urma operaÆiei de creare, baza de date este deschisåautomat. PuteÆi crea baza de date prin urmåtoarele metode:1. Interactiv:AlegeÆi opÆiunea New...∈∈File çi în caseta de dialog New activaÆibutonul radio Database din lista File Type çi executaÆi clic pecontrolul New File. Se deschide caseta de dialog Create în care scrieÆi numele bazei dedate în caseta de text Enter çi apoi executaÆi clic pe declançatorul Save. Se deschidefereastra generatorului de baze de date Database Designer, în care puteÆi vedeaarhitectura bazei de date: tabele çi relaÆii între tabele. IniÆial ea afiçeazå containerul gol albazei de date nou create.2. Prin comanda:

create database <nume_bazå_de_date>Comanda creeazå baza de date çi o deschide. DeschideÆi apoi fereastra DatabaseDesigner cu comanda:

modify database

5.1.2. Adåugarea la baza de date a tabelelor liberePuteÆi så adåugaÆi tabele libere la baza de date prin urmåtoarele metode:1. Interactiv:

Fie folosiÆi opÆiunea Add Table...∈∈Database, fie executaÆi clic pe butonul Add Table dinbara de instrumente Database Designer.2. Prin comanda:

add table <nume_tabel>

5.1.3. Adåugarea la baza de date a tabelelor noiPuteÆi så adåugaÆi tabele noi la baza de date prin urmåtoarele metode:1. Interactiv:

Fie folosiÆi opÆiunea New Table...∈∈Database, fie executaÆi clic pe butonul New Table dinbara de instrumente Database Designer.2. Prin comanda:

create <nume_tabel>

Start

Open (baza de date)

Prelucrare

Open (tabele)

Close (baza de date)

Stop

Close (tabele)

Page 140: SGBD Visual Foxpro

140 Informatică

5.1.4. ObÆinerea informaÆiilor despre baza de date deschisåPuteÆi folosi comenzile:

list | display databasesAfiçeazå numele bazei de date, identificatorul cåii de director în care se gåseçte fiçierul,versiunea çi lista tabelelor împreunå cu câmpurile lor.

list | display tablesAfiçeazå pe douå coloane lista tabelelor din baza de date: în coloana Name - numeletabelului, iar în coloana Source identificatorul fiçierului în care se gåseçte tabelul.

5.1.5. Alte operaÆii cu baza de dateÎndepårtaÆi un tabel din baza de date fie cu opÆiunea de meniu Remove...∈∈Database,fie executând clic pe butonul Remove Table din bara de instrumente DatabaseDesigner dupå ce aÆi selectat tabelul, fie cu comanda:

remove <nume_tabel>

Dupå ce aÆi selectat un tabel în fereastra Database Designer, puteÆi så-i modificaÆistructura fie cu opÆiunea de meniu Modify...∈∈Database, fie executând clic pe butonulModify Table din bara de instrumente Database Designer, fie cu comanda:

modify structure

Dupå ce aÆi selectat un tabel în fereastra Database Designer, puteÆi så deschideÆifereastra de editare pentru a face modificåri cu opÆiunea de meniu Browse∈∈ Database,executând clic pe butonul Browse Table din bara de instrumente Database Designer,executând dublu clic pe tabel sau cu comanda:

browse

VerificaÆi integritatea bazei de date cu comanda:validate databases

Dacå aÆi deschis mai multe baze de date, una singurå este activå (baza de date pe careo puteÆi exploata). Pentru a activa o bazå de date folosiÆi comanda:

set database to <nume_bazå de date>

5.2. Exploatarea bazei de date 5.2.1. Deschiderea çi închiderea bazei de datePentru a actualiza sau a consulta o bazå de date, ea trebuie deschiså. Deschiderea eise face fie prin deschiderea unui tabel din baza de date, fie prin comanda:

open database <nume_bazå_de_date>

Deschiderea bazei de date nu implicå çi deschiderea tabelelor care o compun.

Închiderea bazei de date se face cu comanda:close databases

care determinå çi închiderea tabelelor care fac parte din ea. Dacå se foloseçte comanda:close all databases

Page 141: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 141

se vor închide toate bazele de date deschise, toate tabelele încorporate în bazele de datesau libere çi toate fiçierele asociate exploatårii bazelor de date care erau deschise în acelmoment.

5.2.2. Deschiderea çi închiderea tabelelorPentru a folosi un tabel din baza de date, el trebuie deschis. Pentru a administra maimulte tabele din baza de date, fiecare dintre ele trebuie så fie deschis. Pentru a puteadeschide mai multe tabele, Visual FoxPro foloseçte mecanismul zonelor de lucru.

O zonå de lucru este o zonå de memorie care se asociazå unui tabel la deschiderea lui.Pot fi folosite peste 30.000 de zone de lucru. În zona de lucru se påstreazå informaÆiidespre tabelul deschis în acea zonå:

identificatorul fiçierului în care este memorat tabelul,structura fiçierului,numårul de înregistråri din fiçier,contorul înregistrårii curente etc.

Identificarea unei zone de lucru se face prin numårul såu 1, 2, 3, ... 30.000. Primelezece zone de lucru se pot identifica çi prin literele alfabetului: a,b, ...,j. La deschidereatabelului, acestuia i se poate atribui un alias, adicå un nume cu care puteÆi så identificaÆitabelul çi componentele sale în timpul operaÆiilor de exploatare.

Deschiderea unui tabel într-o zonå de lucru se face cu comanda:use <nume_tabel> in <zona> [alias <nume_alias>] [again]

unde <zona> este identificatorul zonei în care se deschide tabelul, iar <nume_alias> esteun nume atribuit pentru alias. Dacå acest nume nu se precizeazå, sistemul îi atribuieimplicit un alias: numele tabelului (numele fiçierului în care este påstrat tabelul) dacåtabelul este deschis într-o singurå zonå sau numårul zonei, dacå tabelul este deschis înmai multe zone. Dacå vreÆi så deschideÆi acelaçi tabel în mai multe zone de lucru, folosiÆiclauza again începând de la a doua operaÆie de deschidere. Dacå precizaÆi pentru<zona> valoarea 0, tabelul va fi deschis în prima zonå de lucru disponibilå (liberå).

La un moment dat, într-o zonå de lucru nu poate fi deschis decât un singur tabel. Dacå înzona respectivå este deschis deja un tabel, el trebuie închis în prealabil.

Indiferent de câte zone de lucru folosiÆi, la un moment dat una singurå dintre ele estezona de lucru activå (curentå). Zona de lucru curentå este zona la care se referåimplicit o comandå în care nu se precizeazå explicit numele tabelului (comanda vaacÆiona asupra tabelului din zona de lucru activå). La începutul sesiunii de lucru, zona delucru activå este zona 1.

Schimbarea zonei de lucru curente se face cu comanda:select <zona>

unde <zona> poate fi precizatå prin numårul såu sau prin aliasul sau numele tabeluluideschis în aceastå zonå.

Alocarea unei zone de lucru unui tabel se poate face la deschiderea lui prin clauza in sauprin selectarea zonei de lucru înainte de deschiderea tabelului. Comanda:

use <nume_tabel> in <zona>este echivalentå cu grupul de comenzi:

select <zona> use <nume_tabel>.

Page 142: SGBD Visual Foxpro

142 Informatică

OperaÆiile care se pot executa în zonele de lucru sunt:În zona activå se poate citi din tabel çi se poate scrie în tabel.În celelalte zone se poate numai citi din tabel.

Identificarea tabelelor se face astfel:În zona activå, numele tabelului se subînÆelege (este implicit în comenzi).În celelalte zone, prin aliasul såu sau prin numele zonei.

Identificarea câmpurilor dintr-un tabel se face astfel:În zona activå prin numele câmpului.În celelalte zone prin identificatorul <alias>.<nume_câmp> sau <alias>-><nume_câmp>.

PuteÆi så obÆineÆi informaÆii despre zonele de lucru çi tabelele deschise în aceste zone cufuncÆiile:

select([1]) furnizeazå implicit numårul zonei de lucru active; dacå folosiÆi parametrul 1,va furniza numårul ultimei zone de lucru nefolosite.used([<zona>]) furnizeazå un rezultat logic prin care se precizeazå dacå zona esteocupatå (.T.) sau liberå (.F.). Implicit, rezultatul funcÆiei se referå la zona curentå,explicit, se referå la zona precizatå prin parametrul <zona>.used(<nume_tabel>) furnizeazå un rezultat logic prin care se precizeazå dacå tabeluleste deschis într-o zonå de lucru (.T.) sau nu (.F.).dbf([<zona>]) furnizeazå un rezultat de tip çir de caractere care poate conÆine numelefiçierului deschis în zona de lucru sau çirul vid, dacå nu este deschis nici un fiçier.Implicit, rezultatul funcÆiei se referå la zona curentå, explicit, se referå la zonaprecizatå prin parametrul <zona>.alias([<zona>]) furnizeazå un rezultat de tip çir de caractere care poate conÆine aliasulfiçierului deschis în zona de lucru sau çirul vid, dacå nu este deschis nici un fiçier.Implicit, rezultatul funcÆiei se referå la zona curentå, explicit, se referå la zonaprecizatå prin parametrul <zona>.

Închiderea unui tabel se face cu comanda:use [in <zona>]

Implicit, se închide tabelul din zona curentå, explicit, se închide tabelul din zona precizatåcu clauza in.

Tabelul mai poate fi închis çi cu comanda de închidere a bazei de date (closedatabases) sau comanda de închidere a tuturor fiçierelor (close all).

FolosiÆi fereastra View pentru a vizualiza zonele de lucru

DeschideÆi baza de date din exemplul (testdata) din dosarul Data, din dosarul Samples,din dosarul aplicaÆiei Visual FoxPro. Pentru deschidere folosiÆi comanda Open∈∈File. Sedeschide fereastra Database Designer în care sunt afiçate tabelele çi relaÆiile dintretabelele bazei de date.

DeschideÆi fereastra View folosind comanda View Window∈∈Window. În fereastrå nueste afiçat nici un tabel în listå, deoarece aÆi deschis baza de date, nu çi tabelele din bazade date.

Page 143: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 143

DeschideÆi pe rând toate tabelele din baza de date: fie executaÆi dublu clic în fereastraDatabase Designer pe fiecare tabel pentru a deschide fereastra de editare a tabelului çiimplicit tabelul, fie în fereastra View executaÆi clic pe declançatorul Open çi în caseta de

DeschideÆi caseta de dialog Open executândclic pe declançatorul Open din fereastra View.

Lista ascunså din carealegeÆi baza de date.

Lista din carealegeÆi tabelul pecare îl deschideÆi.

Grupul de butoaneradio din care alegeÆitabele (Tables) sauvizualizåri (Views).

Dupå ce aÆi deschis mai multe tabele, numelelor va fi afiçat în lista Aliases. Ele sunt afiçateîn listå în ordinea inverså deschiderii.SelectaÆi un fiçier din listå. În bara de stare seva afiça numårul zonei de lucru în care estedeschis (Work Area) çi numårul total deînregistråri (Records).ObservaÆi cå zonele de lucru au fost alocate înordinea deschiderii: primului tabel deschis,zona 1, celui de-al doilea tabel deschis,zona 2 etc.

SelectaÆi din lista Alias tabe-lul destinaÆie çi apoi execu-taÆi clic pe declançatorulRelations. Numele tabeluluiva fi afiçat în lista Relations.Se deschide caseta de dia-log Set IndexOrder în careeste afiçatå lista de eticheteindex definite pentru tabel.

Executând clic pe eticheta index corespunzåtoare relaÆiei, se deschide caseta de dialogExpression Builder prin intermediul cåreia puteÆi construi relaÆia.

PuteÆi så definiÆi relaÆii între douå tabele.SelectaÆi din lista Alias tabelul surså çi apoiexecutaÆi clic pe declançatorul Relations.Numele tabelului va fi afiçat în lista Relations.

Page 144: SGBD Visual Foxpro

144 Informatică

dialog Open executaÆi clic pe rând pe numele fiecårui tabel din lista Tables in Database.DeschideÆi pe rând, începând cu zona 1 çi terminând cu zona 5 tabelele: Customer,Products, Orditems, Orders çi Employee.

Dupå ce aÆi deschis tabelele, ele vor fi afiçate în fereastra View. SelectaÆi pe rând fiecaretabel din listå. În bara de stare a ferestrei vor fi afiçate informaÆii despre tabelul selectat:numårul zonei de lucru çi numårul total de înregistråri. ÎnchideÆi fereastra de comenzi.

ObÆineÆi informaÆii despre tabelele deschise: select 1 ?used()

.T. ?used(5)

.T. ?used(10)

.F. ?used('orders')

.T.

?dbf(3)c:\vfp\samples\data\orditems.dbf

?alias(3)orditems

?dbf(10)nimic

?alias(10)nimic

CreaÆi baza de date din exemplu:CreaÆi baza de date Compania cu comanda:

create database companiaAfiçaÆi informaÆii despre baza de date nou creatå cu comanda:

display databaseSe vor afiça numele bazei de date, calea fiçierului bazå de date çi versiunea.AfiçaÆi baza de date în fereastra Database Designer cu comanda

modify databaseFereastra este vidå.

ObservaÆie: Tabelele din baza de date trebuie så conÆinå urmåtoarele chei, astfel încâtså puteÆi stabili legåturi între ele:

Tabelul AngajaÆi - câmpul id_ang cheie primarå; câmpul cheie c_jud se va declara detipul regular deoarece un tabel nu poate avea decât o cheie primarå.Tabelul ClienÆi - câmpul id_cl cheie primarå; câmpul cheie c_jud se va declara de tipulregular deoarece un tabel nu poate avea decât o cheie primarå.Tabelul Contracte - câmpul id_cont cheie primarå; câmpul cheie id_cl de tipul regular.Tabelul ÇedinÆe - câmpul nr_s cheie primarå; câmpurile cheie id_ang çi id_cont sevor declara de tipul regular.Tabelul Estimåri - câmpul id_cont cheie de tipul regular.Tabelul Încasåri - câmpul nr_i cheie primarå; câmpul cheie id_cont de tipul regular.Tabelul JudeÆe - câmpul c_jud se va declara de tipul cheie primarå.AdåugaÆi la baza de date tabelele libere create fie folosind opÆiunea de meniu, fie cubutonul din bara de instrumente, fie cu comenzile:

add table angajatiadd table clientiadd table judete

AfiçaÆi informaÆii despre baza de date cu comanda:

Page 145: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 145

display databaseSe vor afiça numele bazei de date, calea fiçierului bazå de date, versiunea çi, pentrufiecare tabel adåugat la baza de date, numele, calea fiçierului çi structura de câmpuri.

AfiçaÆi informaÆii despre tabelele din baza de date cu comanda:display tables

Se va afiça lista cu numele tabelelor çi cåile fiçierelor.AdåugaÆi la baza de date un tabel nou cu comanda :

create contracteSe deschide fereastra Table Designer, care spre deosebire de cea afiçatå la creareaunui tabel liber, conÆine controale noi. De exemplu, pentru câmpul tip_c puteÆi defini oregulå de validare care så nu permitå introducerea în câmp decât a uneia dintrevalorile: 'e'-evaluare, 'i' - instruire, 'p'-proiect. Regula de validare poate fi exprimatåprin una dintre urmåtoarele condiÆii logice: lower(tip_c)='i' or lower(tip_c)='p' orlower(tip_c)='e' sau inlist (lower(tip_c),'i','p','e'). DefiniÆi structura tabelului çi indecçii.

AdåugaÆi la baza de date çi celelalte tabele cu comenzile :create estimaricreate sedintecreate incasari

Dupå fiecare comandå se deschide fereastra Table Designer în care definiÆi structuratabelului çi indecçii.ModificaÆi structura tabelelor create liber, adåugându-le reguli de validare çi indecçi.ExecutaÆi pentru fiecare tabel deschiderea cu comanda use çi apoi modificarea cucomanda modify structure.Dupå ce aÆi adåugat tabelele în baza de date, fereastra Database Designer vaconÆine aceste tabele:

În partea inferioarå a fe-restrei au apårut controa-le noi care permit stabili-rea unei reguli de validarela nivelul câmpului selec-tat (Validation Rule),mesajul de eroare afiçat(Validation Text), valoa-rea implicitå a câmpului(Default Value), etichetacâmpului (Caption),comentarii despre câmp(Field Comment). Înexemplu s-au completataceste casete de textpentru câmpul tip_c - tipulcontractului. Regula devalidare este:lower(tip_c)='i' orlower(tip_c)='p' orlower(tip_c)='e' iar va-loarea implicitå este 'p'.

Page 146: SGBD Visual Foxpro

146 Informatică

Între tabele nu sunt stabilite relaÆii permanente. În prealabil, în tabelele conducåtoares-a stabilit câte un index primar, iar în tabelele conduse indecçi de tip regular. VeÆistabili interactiv relaÆii în fereastra Database Designer, glisând indexul primar dintabelul conducåtor peste indexul regular din tabelul condus. De exemplu, glisaÆi cheiacu numele angajat din tabela AngajaÆi (câmpul index este id_ang) peste cheiaangajat din tabela ÇedinÆe (câmpul index este id_ang). Se deschide caseta de dialogEdit Relationship în care executaÆi clic pe declançatorul OK.

Dupå ce aÆi definit relaÆiile, fereastra Database Designer va afiça:

ObservaÆi cå între tabelul JudeÆe çi tabelele AngajaÆi çi ClienÆi nu s-au stabilit încårelaÆii. În tabelele AngajaÆi çi ClienÆi cheia c_jud nu poate fi declaratå cheie candidat,deoarece existå mai multe înregistråri cu aceeaçi valoare a cheii (mai mulÆi angajaÆi çiclienÆi din acelaçi judeÆ). Açadar, se poate stabili o relaÆie de tip una-la-mai multe întretabelul JudeÆe çi tabelul AngajaÆi, respectiv ClienÆi.

Page 147: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 147

Deoarece tabelele din baza de date trebuie gestionate împreunå, trebuie asiguratå inte-gritatea referenÆialå. DefiniÆi pentru fiecare relaÆie regula de integritate referenÆialå astfel:în fereastra Database Designer executaÆi dublu clic pe o relaÆie. Se deschide caseta dedialog Edit Relationship în care executaÆi clic pe declançatorul Referential Integrity....Se deschide caseta de dialog Referential Integrity Builder care conÆine trei secÆiuni:

secÆiunea Rules for Updating în care puteÆi stabili regula de integritatereferenÆialå pentru operaÆiile de actualizare,secÆiunea Rules for Deleting în care puteÆi stabili regula de integritatereferenÆialå pentru operaÆiile de çtergere çisecÆiunea Rules for Inserting în care puteÆi stabili regula de integritatereferenÆialå pentru operaÆiile de adåugare.

Aceste operaÆii se referå la tabelele conducåtoare, în care modificarea valorii cheii prima-re poate så ducå la ruperea legåturii cu unele înregistråri din tabelul condus. DeschideÆisecÆiunea corespunzåtoare operaÆiei pentru care stabiliÆi regula de integritate, selectaÆirelaÆia tabel pårinte - tabel copil pentru care stabiliÆi regula çi activaÆi apoi butonul radiocorespunzåtor regulii de integritate. PuteÆi alege una dintre urmåtoarele reguli de integri-tate: Cascade (se çterg sau se modificå în cascadå toate înregistrårile din tabelul copil,legate de înregistrarea çtearså sau modificatå din tabelul pårinte), Restrict (dacå existåîn tabelul copil o înregistrare legatå de înregistrarea care se çterge sau se modificå întabelul pårinte, se opreçte procesul çi se afiçeazå un mesaj de eroare), Ignore (operaÆiilese pot executa fårå restricÆii).

DeschideÆi acum prin comenzi fiecare tabel într-o zonå diferitå: select 1 use angajati select 2 use judete select 3

use clienti select 4 use contracte select 5 use sedinte

select 6 use estimari select 7 use incasari

VerificaÆi integritatea datelor existente în acest moment folosind comanda:validate database

AdåugaÆi date la fiecare tabel.

Page 148: SGBD Visual Foxpro

148 Tehnologii asistate de calculator

ÎnchideÆi baza de date cu comanda:close databases

ÎncercaÆi:

TT est pentru evaluare:

Adevårat/Fals:1. Visual FoxPro vå permite crearea unor relaÆii permanente între tabelele bazei de date.2. La o bazå de date nu puteÆi adåuga tabele libere.3. Dacå închideÆi o bazå de date, se închid automat çi tabelele pe care le conÆine.4. Dacå deschideÆi un tabel dintr-o bazå de date, se deschide automat çi baza de date.5. Nu puteÆi îndepårta un tabel dintr-o bazå de date.

CompletaÆi:1. PuteÆi vedea arhitectura bazei de date în fereastra ..........................…………2. PuteÆi verifica integritatea bazei de date cu comanda ............................3. Dacå aÆi deschis mai multe baze de date, puteÆi activa o bazå de date cu comanda

..............................................4. PuteÆi închide o bazå de date cu comanda ....................................5. PuteÆi så deschideÆi fereastra Database Designer pentru o bazå de date deschiså cu

comanda ..............................

AlegeÆi råspunsul corect:1. AdåugaÆi un tabel liber la o bazå de date cu comanda:

a) add table b) new table c) create table2. AdåugaÆi un tabel nou la o bazå de date cu comanda:

a) add table b) new table c) create3. StabiliÆi zona de lucru activå cu comanda:

a) open b) select c) alias4. AflaÆi dacå un tabel este deschis cu funcÆia:

a) dbf() b) used() c) alias()5. AflaÆi numårul zonei de lucru active cu funcÆia:

a) select() b) used() c) alias()

RåspundeÆi:1. Care sunt etapele de creare a unei baze de date?2. Prin ce metode puteÆi vedea arhitectura bazei de date?

RR åspunsuri:Adevårat/Fals: 1-A; 2-F; 3-A; 4-A; 5-F.CompletaÆi: 1-Database Designer; 2-validate database; 3-set database to; 4-close databases;5-modify database.AlegeÆi råspunsul corect: 1-a; 2-c; 3-b; 4-b; 5-a.

Page 149: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 149

6. Obţinerea informaţiilor din baza de dateDatele din baza de date vå ajutå så modelaÆi çi så analizaÆi evenimentele care seproduc în cadrul organizaÆiei. Metoda cea mai simplå de a genera anumite informaÆii dindatele din baza de date este aceea de a prezenta datele sub forma vizualizårilor sau ainterogårilor. Alteori este necesar så prezentaÆi datele sub forma unor rapoarte care sågrupeze çi så sintetizeze informaÆiiile.

În prezentarea informaÆiilor apar cazuri în care trebuie så combinaÆi informaÆii dintr-obazå de date cu informaÆiile create cu alte aplicaÆii çi este necesar så integraÆi dateledintr-o bazå de date într-un document creat cu mai multe tipuri de aplicaÆii (så integraÆidatele dintr-o bazå de date într-un tabel Excel, într-un document Word sau într-o prezentarePower Point). De exemplu, un angajat al firmei de consultanÆå trebuie så-çi prezinteactivitatea pe o perioadå de timp. El îçi påstreazå unele date legate de activitatea sa întabele personale create cu aplicaÆia Excel, iar alte date se gåsesc în baza de date acompaniei. Raportul va fi scris cu procesorul de texte Word çi va trebui så integreze dateatât din aplicaÆia Excel, cât çi din aplicaÆia Visual FoxPro. Mai este posibil ca un angajat alfirmei så pregåteascå o prezentare cu Power Point pentru unul dintre clienÆii fideli. Pentruprezentare are nevoie de date din baza de date a companiei, despre contractele derulate,termene, preÆuri etc. În acest caz, în prezentarea creatå cu aplicaÆia Power Point trebuie såintegreze date create cu aplicaÆia Visual FoxPro. Alteori este posibil så aveÆi nevoie de datecreate cu un alt sistem de gestiune a bazelor de date. De exemplu, firma de consultanÆå apreluat clienÆii çi o parte dintre angajaÆii altei firme de consultanÆå, care çi-a påstrat dateleîntr-o bazå de date Paradox. Pentru a evita reintroducerea acestor date, ele trebuiepreluate din vechea bazå de date în baza de date a companiei. Sistemul de gestiune abazelor de date trebuie så çtie så rezolve aceste probleme.

Açadar, scopul pentru care creaÆi çi administraÆi o bazå de date este de a obÆine rapidinformaÆii. InformaÆia poate fi prezentatå în diferite formate. Pentru prezentarea ei puteÆifolosi interogårile, vizualizårile çi rapoartele.

6.1. InterogărileInterogarea este operaÆia prin care extrageÆi date din baza de date fårå så le çtergeÆi sauså le modificaÆi çi pe care le afiçaÆi într-un anumit format. Extragerea se face în funcÆie deun anumit criteriu numit criteriu de interogare. Acesta trebuie så defineascå datele pecare vreÆi så le extrageÆi: numele câmpurilor, tabelele din care fac parte, criteriile prin carese extrag înregistrårile çi în ce ordine sunt pezentate. Interogarea este scopul bazei dedate. Când un utilizator interogheazå baza de date, el pune de fapt o întrebare: „Ce datedin baza de date îndeplinesc aceste condiÆii?". Folosind o interogare puteÆi:

så combinaÆi înregistråri din mai multe tabele într-un singur tabel,så selectaÆi numai înregistrårile care îndeplinesc un anumit criteriu,så afiçaÆi înregistrårile în ordinea doritå,så afiçaÆi câmpuri calculate.

Interogårile pot afiça înregistråri din mai multe tabele. Dacå relaÆia dintre cele douå tabeleeste de una-la-mai-multe, interogarea va afiça pe mai multe rânduri câmpurile corespun-zåtoare înregistrårilor din al doilea tabel (mai-multe) legate de o singurå înregistrare dinprimul tabel (una), iar în aceste rânduri se vor repeta câmpurile din primul tabel.

Page 150: SGBD Visual Foxpro

Informatică 150

Pentru operaÆia de interogare, orice sistem de gestiune a bazelor de date are implemen-tate diferite instrumente prin care så se comunice sistemului criteriul de interogare.Unul dintre aceste instrumente este limbajul SQL, care este limbajul standard deinterogare.

În Visual FoxPro puteÆi crea o interogare:interactiv folosind generatorul de interogåri (Query Designer);prin limbajul de comandå SQL (instrucÆiunea select1).

În urma operaÆiei de creare, interogarea este salvatå într-un fiçier cu extensia .qpr careconÆine specificaÆiile criteriului de interogare. Acest fiçier este un fiçier de tip ASCII în carese memoreazå comanda SQL asociatå. Deoarece fiçierul conÆine o comandå SQL, pentrua o executa trebuie så lansaÆi în execuÆie fiçierul cu comanda:

do <nume_fiçier>.qpr

AÆi våzut cå operatorul relaÆional select aplicat pe un tabel creeazå un alt tabel care conÆi-ne submulÆimi de date din tabelul surså. Açadar çi rezultatul unei interogåri va fi tot untabel, care va conÆine datele specificate de criteriul de interogare. DestinaÆia interogårii(destinaÆia datelor din tabelul obÆinut) poate fi:

fereastra de editare Browse,diagrama (graph),ecranul (screen),raportul (report),tabelul permanent (table) sau temporar (cursor).

Açadar, interogarea se aplicå pe mai multe tabele ale bazei de date numite tabele surså,iar rezultatul unei interogåri este un tabel numit tabel destinaÆie; modificårile fåcute întabelul destinaÆie nu se reflectå çi în tabelele surså.

Parametrii folosiÆi în construirea unei interogåri sunt:Câmpurile (fields) din tabelele bazei de date (tabelele surså). Se recomandå så sepreia din tabelele surså numai câmpurile strict necesare.Legåtura (join) dintre tabelele bazei de date (tabelele surså). Pe lângå legåturilestabilite între tabele în cadrul bazei de date, care vor fi preluate automat, se mai potstabili noi legåturi cu tabele care nu au fost legate la baza de date. Dacå definiÆi douålegåturi între tabele, le puteÆi lega cu operatorii logici or sau and.Filtrul (filter) prin care se precizeazå condiÆiile de filtrare, adicå modul în care vor fiselectate datele din tabelele bazei de date. Un criteriu de selecÆie sau de filtraretrebuie så precizeze câmpul sau expresia care conÆine câmpul, operatorul relaÆional çivaloarea cu care se comparå. Pot fi definite mai multe criterii de filtrare legate între eleprin operatorii logici or sau and (ordinea de evaluare este and çi apoi or).Ordonarea (order by) prin care se precizeazå ordinea în care vor fi prezentate rezul-tatele interogårii (în tabelul destinaÆie). Ordinea este datå de un criteriu de ordonaredeterminat de un câmp din tabel sau de mai multe criterii de ordonare determinate demai multe câmpuri. În acest caz, un criteriu de ordonare este luat în consideraÆie numaidacå cele definite anterior au aceeaçi valoare a câmpurilor pentru douå înregistråri.

1 Este diferitå de comanda select folositå pentru selectarea unei zone de lucru.

Page 151: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 151

Gruparea (group by) prin care se precizeazå un criteriu de grupare a datelor. Acestcriteriu este dat de cheia de grupare formatå din unul sau mai multe câmpuri aletabelului. Conform acestei chei, înregistrårile care au aceeaçi valoare a cheii degrupare vor fi cumulate în tabelul destinaÆie într-o singurå înregistrare, în care fiecarecâmp numeric va fi calculat prin însumarea valorilor corespunzåtoare câmpului dintoate înregistrårile grupului. Mai pot fi definite çi criterii de selecÆie la nivel de grupprin care se precizeazå condiÆia pe care trebuie så o îndeplineascå grupul de înre-gistråri pentru a face parte din tabelul destinaÆie. CondiÆia este precizatå prin câmpulsau expresia care conÆine câmpul, operatorul relaÆional çi valoarea cu care se comparå.

6.2. VizualizărileVizualizårile sunt tabele virtuale, construite pe baza datelor din tabelele bazei de date, carepot fi legate prin relaÆii çi care permit modificarea lor de cåtre utilizator. Açadar, dacå încazul unei interogåri utilizatorul poate vedea numai un rezultat, în cazul vizualizåriiutilizatorul poate interveni çi poate modifica valoarea datelor. Orice modificare fåcutå într-ovizualizare se va regåsi çi în tabelul real al bazei de date. Când se creeazå o vizualizare, sepune de fapt întrebarea: „Cu ce date din baza de date poate interacÆiona utilizatorul?".Construirea unei vizualizåri constå, ca çi în cazul unei interogåri, în extragerea anumitordate din baza de date, pe baza unui criteriu. Rezultatul va fi memorat în fiçierul bazei dedate (.dbc). De aceea, pentru a folosi o vizualizare, trebuie deschiså mai întâi baza dedate çi apoi vizualizarea, ca orice tabel din baza de date.

Açadar, vizualizarea este o structurå de date, la fel ca çi tabelele bazei de date, iarinterogarea este un fiçier care conÆine o comandå çi care trebuie lansat în execuÆie

la fel ca orice fiçier de program.

Dacå în cazul interogårilor datele circulå într-un singur sens, de la tabelele bazei de datela formatul ales pentru afiçare, în cazul vizualizårilor ele pot circula în ambele sensuriîntre tabelele bazei de date çi vizualizare.

Vizualizårile se pot construi cu constructorul de vizualizåri (View Designer).

Vizualizarea foloseçte, pe lângå parametrii întâlniÆi la interogåri, urmåtorii parametri:Câmpurile cheie. Aceste câmpuri sunt alese astfel încât så identifice unic relaÆiadintre vizualizare çi tabelele surså. Pentru fiecare tabel surså trebuie så se defineascåunul sau mai multe câmpuri cheie care så identifice unic fiecare înregistrare din aceltabel.Câmpurile actualizate çi câmpurile neactualizate. Acest parametru stabileçtemodul în care se transmit datele între vizualizare çi tabelele surså. Astfel, dacå învizualizare se face modificarea într-un câmp actualizat, modificarea va fi transmiså çiîn tabelele surså, altfel, dacå modificarea se face într-un câmp nemodificat, ea nu seva transmite çi cåtre tabelele surså.

6.3. RapoarteleRaportul este o colecÆie de informaÆii obÆinute din datele stocate în tabelele bazei de date,prezentate utilizatorului într-o formå cât mai clarå çi mai conciså. El poate fi tipårit la

Page 152: SGBD Visual Foxpro

Informatică 152

imprimantå sau afiçat pe ecran çi prezintå un set de date legate între ele, preluate dintabelele bazei de date. Permite descrierea elementelor care pot så aparå: textul afiçatdeasupra coloanelor, câmpurile din coloane, la care pot fi adåugate çi alte texte sauimagini grafice (linii, chenare, imagini bitmap sau vectoriale etc.). Raportul nu modificådatele din tabele. El parcurge secvenÆial înregistrårile din tabele pentru:

obÆinerea unor date sintetice: subtotaluri çi totaluri,obÆinerea unor rezumate,gruparea datelor pe mai multe niveluri, fiecare nivel cu propriile sale informaÆiisintetice çi rezumate,analize complexe çi grafice.

În general, raportul este conceput sub forma unui tabel. În plus are çi funcÆia de sortare çigrupare a datelor. Raportul se compune din:

SecÆiunea de date (Detail) conÆine date care se repetå pentru fiecare înregistrare.Antetul paginii (Page Header) defineçte elementele care trebuie så aparå în parteade sus a fiecårei pagini a raportului.Subsolul paginii (Page Footer) defineçte elementele care trebuie så aparå în parteade jos a fiecårei pagini a raportului.Antetul raportului (Report Header sau Title) apare numai pe prima paginå araportului. El este ca un titlu pentru întregul raport çi poate conÆine texte çi imagini (deexemplu sigla firmei).Subsolul raportului (Report Footer sau Summary) apare numai pe ultima paginå araportului çi cuprinde de obicei un rezumat al datelor din diferite secÆiuni ale raportului.Grupul (Group). Un raport poate prezenta conÆinutul unui tabel sau al mai multortabele din baza de date. Aceste date pot fi grupate dupå diferite criterii çi totalizate lanivel de grup. În linia totalului pot fi inserate totaluri ale unor câmpuri, adicå date încare sunt cumulate valorile aceluiaçi câmp pentru întreg grupul de înregistråri. Pot fidefinite mai multe niveluri de grupare. Pentru fiecare nivel trebuie definit un criteriude grupare caracterizat printr-o expresie care este evaluatå la fiecare înregistrare.Dacå existå un singur nivel de grupare, numårul de grupuri va fi egal cu numårul devalori diferite ale cheii de grupare.Antetul grupului (Group Header) afiçeazå un titlu al grupului (criteriul de grupare).Subsolul grupului (Group Footer) afiçeazå date sintetice despre grup.

Raportul conÆine informaÆii utile personalului care are atribuÆii de conducere în cadrulorganizaÆiei. În funcÆie de nivelul de conducere pentru care se produce raportul,cantitatea de date prezentatå diferå. La nivelul inferior de conducere, nivelul operaÆional,la care personalul de conducere are rolul de a monitoriza çi a controla activitåÆile zilniceale angajaÆilor, rapoartele trebuie så fie detaliate çi så conÆinå informaÆii specifice despreactivitåÆile zilnice (de exemplu rapoartele de încasåri).

La nivelul mediu de conducere (director tehnic, director de vânzåri, director de resurseumane etc.) ele trebuie så conÆinå mai puÆine detalii çi mai multe treceri în revistå,rezumate çi analize ale datelor din istoric. Aceste date trebuie så-i ajute så planifice çi såcontroleze operaÆiile çi så implementeze strategii care trebuie så fie bine formulate çiargumentate. De exemplu, aceste rapoarte pot prezenta un rezumat al activitåÆilor(încasårile rezultate din contractele de consultanÆå cu un client, încasårile rezultate

Page 153: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 153

dintr-un anumit tip de consultanÆå - de exemplu instruire), pot prezenta situaÆii deexcepÆie, care depåçesc limitele normale (clienÆi care au derulat în ultimul trimestru maimult de cinci contracte de consultanÆå) sau, atunci când trebuie så se concentreze pe oproblemå, pot conÆine date la cerere (dacå un client nu çi-a mai plåtit de mult çedinÆele deconsultanÆå, se poate cere un raport despre client care så conÆinå contractele çi modul încare a plåtit pe o perioadå de timp).

În funcÆie de informaÆia prezentatå, existå trei categorii de rapoarte:Rapoarte periodice. Se produc la intervale de timp regulate (såptåmânal, lunar,trimestrial etc.), cum este de exemplu raportul lunar al çedinÆelor cu clienÆii.Rapoarte la cerere. Sunt produse la cerere, cum este de exemplu raportul cucontractele de consultanÆå ale unui client.Rapoarte ale excepÆiilor. Sunt produse pentru a atrage atenÆia asupra unor eveni-mente deosebite, cum este de exemplu raportul încasårilor lunare ale unui angajatpermanent cu normå întreagå, care sunt cu mult sub nivelul normal.

Pentru construirea unui raport se poate folosi constructorul de rapoarte (ReportDesigner). El simplificå procesul de creare a rapoartelor, deoarece foloseçte o procedu-rå simplå: utilizatorul trebuie så precizeze numele coloanelor din tabele care trebuie såaparå în raport, totalurile pe coloane, subtotalurile pe grupuri de înregistråri, diferite altecalcule. În urma comunicårii acestor date, el va genera un tabel care conÆine toate dateleçi caracteristicile raportului çi care sunt memorate într-un fiçier cu extensia .frx.

CreaÆi o interogare

Interogarea trebuie så råspundå la urmåtoarea întrebare: „Ce angajaÆi (identificaÆi prinnume, prenume çi numele judeÆului) au tariful cuprins între 260.000 çi 300.000?". Afiçarease va face într-o fereastrå de editare Browse.Fiçierul în care veÆi salva interogarea va fi a1.qry.

DeschideÆi baza de date Compania cucomanda: open database compania.AlegeÆi opÆiunea New∈∈File. Se deschide case-ta de dialog New în care din grupul de butoanecu opÆiuni File Type activaÆi butonul Querydupå care executaÆi clic pe butonul New File.Se deschide caseta de dialog Add Table orView. Din lista Tables in Database selectaÆimai întâi tabelul AngajaÆi çi executaÆi clic pebutonul Add Table din bara de instrumenteQuery Designer, apoi selectaÆi tabelul JudeÆeçi executaÆi clic pe butonul Add Table.Se deschide fereastra generatorului de interogåri Query Designer. În parteasuperioarå este afiçat un panou care conÆine tabelele care au fost selectate din bazade date pentru a face parte din interogare. Fiecare tabel este reprezentat într-o fe-

Page 154: SGBD Visual Foxpro

Informatică 154

reastrå redimensionabilå în care sunt afiçate câmpurile çi indecçii tabelului. Dacå întretabele existå legåturi, sunt afiçate çi acestea. Pe lângå aceste legåturi definite deja înbaza de date, puteÆi crea noi legåturi fie glisând un câmp index de la tabelul surså latabelul destinaÆie, fie prin intermediul obiectelor din caseta de dialog Join Condition pecare o deschideÆi executând dublu clic pe butonul Add Join din bara de instrumenteQuery Designer. În partea inferioarå este afiçat un panou cu mai multe secÆiuni:

Selection Criteria - conÆine controale pentru a stabili criteriul de selectare aînregistrårilor. Criteriul poate conÆine anumite valori ale unui câmp çi condiÆiipentru legåturile temporare dintre tabele.Fields - conÆine controale pentru a stabili câmpurile din tabel sau câmpurilecalculate care vor fi afiçate de interogare.Order By - conÆine controale pentru a stabili câmpurile din tabel sau câmpurilecalculate care vor determina ordinea de afiçare în interogare.Group By - conÆine controale pentru a stabili modul în care vor fi grupateînregistrårile afiçate de interogare.

DeschideÆi secÆiunea Fields. În lista Available Fields sunt afiçate câmpurile disponi-bile în tabelele selectate. SelectaÆi din aceastå listå grupul de câmpuri AngajaÆi.nume,AngajaÆi.pren, AngajaÆi.tarif çi JudeÆe.n_jud (executaÆi clic pe numele câmpului cutasta Ctrl apåsatå). ExecutaÆi apoi clic pe declançatorul Add>. Câmpurile selectatevor fi copiate în lista cu câmpurile selectate pentru a fi afiçate - Selected Output. ÎnsecÆiune mai puteÆi folosi urmåtoarele controale: butoanele Add All>> (copiazå toatecâmpurile din tabele în lista Selected Output), <Remove (înlåturå câmpul selectat),çi <<Remove All (înlåturå toate câmpurile din lista Selected Output) precum çicaseta combinatå Functions/Expressions prin care puteÆi defini câmpurile calculate.Bara de instrumente Query Designer conÆine urmåtoarele butoane:

1 Add Table Adaugå un tabel nou la interogare.2 Remove Table Înlåturå tabelul selectat din interogare. Implicit vor fi înlåturate câmpurile,

criteriile de selectare, criteriile de sortare çi criteriile de grupare definite decâmpurile din acest tabel.

3 Add Join Adaugå noi legåturi între tabelele interogårii.4 Show the SQL

WindowDeschide fereastra de editare în care este afiçatå comanda SQL asociatåinterogårii definite interactiv.

5 Maximize thetable Window

Maximizeazå panoul cu tabele. Panoul cu secÆiuni nu va mai fi afiçat.

6 QueryDestination

Deschide o casetå de dialog care conÆine controale pentru a alege destinaÆiainterogårii: o fereastrå Browse, ecranul, o diagramå etc.

DeschideÆi secÆiunea Selection Criteria. ExecutaÆi dublu clic pe butonul Condition.Se deschide caseta de dialog Join Condition în care este afiçatå condiÆia caredefineçte legåtura dintre cele douå tabele. Deoarece legåtura este realizatå prin douåcâmpuri de tip çir de caractere, pentru a evita unele nepotriviri din cauza scrierii culitere mari sau cu litere mici a aceluiaçi cod de judeÆ, activaÆi comutatorul IgnoreUpper/Lower Case. ÎnchideÆi caseta de dialog. VeÆi observa cå în urma acesteioperaÆii, s-a activat în grilå comutatorul Case corespunzåtor condiÆiei.În grila afiçatå în secÆiune adåugaÆi criteriul pentru selectarea înregistrårilor:tarif>260000 and tarif<300000. Pentru aceasta executaÆi clic pe declançatorulInsert, alegeÆi din lista ascunså Field Name numele câmpului AngajaÆi.tarif, din listaascunså Criteria operatorul More Than çi scrieÆi în caseta de text Example valoarea

Page 155: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 155

260000. ExecutaÆi din nou clic pe declançatorul Insert, alegeÆi din lista Field Namedin nou numele câmpului AngajaÆi.tarif, din lista Criteria operatorul Less Than çiscrieÆi în caseta de text Example valoarea 300000. Cele douå condiÆii au fostadåugate în grilå. CondiÆiile sunt legate implicit prin operatorul logic and. Dacåtrebuie schimbat operatorul logic and cu or se executå clic pe declançatorul Add Or.Dacå vreÆi så schimbaÆi ordinea în care sunt afiçate condiÆiile în grilå selectaÆi condiÆiape care vreÆi så o mutaÆi çi executaÆi clic pe butonul (Mover Box). Dacå vreÆi såînlåturaÆi o condiÆie, o selectaÆi în grilå çi executaÆi clic pe declançatorul Remove.

DeschideÆi secÆiunea Order By pentru a stabili ordinea în care vor fi afiçate înregis-trårile. SelectaÆi, din lista Selected Output care afiçeazå câmpurile din interogare,câmpurile AngajaÆi.nume çi AngajaÆi.pren dupå care acÆionaÆi declançatorul Add>. Câm-purile vor fi adåugate în lista Ordering Criteria. În grupul de butoane radio OrderOptions este activat butonul Ascending (ordinea alfabeticå a numelui çi prenu-melui). Ordinea câmpurilor din cheia de sortare este AngajaÆi.nume çi Angaja1i.pren,adicå ordinea din lista Ordering Criteria (ordinea este datå de ordinea de adåugarela aceastå listå). Dacå vreÆi så înlåturaÆi un criteriu de sortare, îl selectaÆi în listaOrdering Criteria çi acÆionaÆi declançatorul <Remove.DeschideÆi secÆiunea Group By numai pentru a identifica controalele, deoareceinterogarea nu conÆine grupuri de înregistråri. În secÆiune sunt douå liste AvailableFields (câmpurile disponibile) din care puteÆi selecta câmpul folosit pentru cheia degrupare, lista Group By Fields în care vor fi afiçate cheile de grupare, declança-toarele Add> çi <Remove cu care puteÆi adåuga sau înlåtura chei de grupare. PrinacÆionarea declançatorului Having... se deschide caseta de dialog Having prinintermediul cåreia puteÆi stabili criterii de selecÆie la nivelul unui grup.

condiÆia pentrulegåtura dintre tabele

butonulCondition

lista câmpurilordin interogare

1 2 3 4 5 6

Page 156: SGBD Visual Foxpro

Informatică 156

ExecutaÆi clic pe butonulQuery Destination din barade instrumente Query Desi-gner. Se deschide casetade dialog Query Desti-nation în care executaÆi clicpe butonul Browse pentruca rezultatul interogårii så seafiçeze într-o fereastrå deeditare Browse.VizualizaÆi comanda SQLasociatå acestei interogåri.ExecutaÆi clic pe butonul Show the SQL Window din bara de instrumente. Sedeschide fereastra de editare care afiçeazå comanda SQL:

SELECT Angajati.nume, Angajati.pren, Angajati.tarif, Judete.n_jud;FROM compania!angajati, compania!judete;WHERE UPPER(Judete.c_jud) = UPPER(Angajati.c_jud);

AND (Angajati.tarif > 260000;AND Angajati.tarif < 300000);

ORDER BY Angajati.nume, Angajati.prenÎnchideÆi fereastra de editare.ÎnchideÆi fereastra generatorului de interogåri çi salvaÆi interogarea sub numelea1.qry. ObservaÆi cå în fereastra Command este afiçatå comanda asociatåinterogårii create interactiv: create queryAfiçaÆi rezultatul interogårii cu comanda: do a1.qriSe deschide fereastra de editare de tip Browse:

ModificaÆi interogarea astfel încât rezultatul så fie afiçat pe ecran. DeschideÆi inte-rogarea pentru modificare, fie cu opÆiunea Open∈∈File, fie cu comanda:

modify query c:\vfp\a1.qprSe deschide fereastra generatorului de interogåri Query Designer. ExecutaÆi clic pebutonul Query Destination din bara de instrumente. Se deschide caseta de dialogQuery Destination în care executaÆi clic pe butonul Screen. VizualizaÆi comandaSQL asociatå acestei interogåri. ExecutaÆi clic pe butonul Show the SQL Windowdin bara de instrumente. Se deschide fereastra de editare care afiçeazå comandaSQL, la care observaÆi cå a fost adåugatå opÆiunea to screen. ÎnchideÆi fereastra deeditare a comenzii. ÎnchideÆi fereastra generatorului cu salvare.AfiçaÆi rezultatul interogårii cu comanda: do a1.qri

Page 157: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 157

Rezultatul va fi afiçat pe ecran, la fel ca rezultatul unei comenzi list/display.ModificaÆi aceastå interogare astfel: se vor afiça çi angajaÆii care au un tarif de300000 lei, se va afiça o coloanå nouå cu vârsta angajaÆilor, iar rezultatul va fi afiçatîntr-o fereastrå Browse. DeschideÆi interogarea pentru modificare.Se deschide fereastra generatorului de interogåri Query Designer. DeschideÆi secÆi-unea Selection Criteria çi înlocuiÆi valoarea 300000 cu 300001. DeschideÆi secÆi-unea Fields çi scrieÆi în caseta combinatå expresia prin care se calculeazå valoareacâmpului vârsta: int((date()-data_n)/365). ExecutaÆi clic pe butonul Query Desti-nation din bara de instrumente. Se deschide caseta de dialog Query Destination încare executaÆi clic pe butonul Browse. ÎnchideÆi cu salvare fereastra generatorului deinterogåri.AfiçaÆi rezultatul interogårii cu comanda do a1.qriModificaÆi interogarea astfel încât în fereastra de editare coloana Pren så aibå nume-le Prenume, coloana N_jud numele JudeÆ, iar coloana câmpului calculat numeleVarsta. Modificarea se va face în comanda SQL. Pentru aceasta veÆi deschide ofereastrå de editare cu comanda: modi comm a1.qprFereastra de editare va afiça comanda SQL. ModificaÆi comanda astfel:

SELECT Angajati.nume, Angajati.pren As Prenume, Angajati.tarif, Judete.n_jud As Judet;INT((DATE()-Angajati.data_n)/365) As Varsta;

FROM compania!angajati, compania!judete;WHERE Judete.c_jud = Angajati.c_jud;

AND (Angajati.tarif > 260000;AND Angajati.tarif < 300001);

ORDER BY Angajati.nume, Angajati.prenÎnchideÆi fereastra de editare. AfiçaÆi din nou rezultatul interogårii. ObservaÆi modifi-cårile apårute în fereastra Browse.ÎnchideÆi interogarea çi baza de date cu comanda close all.

CreaÆi o vizualizare

Vizualizarea trebuie så råspundå la urmåtoarea întrebare: „Cu ce date din baza de datepoate interacÆiona utilizatorul pentru angajaÆii (identificaÆi prin nume, prenume, vârstå çinumele judeÆului) care au tariful cuprins între 260.000 çi 300.000?". Utilizatorului i se vapermite så interacÆioneze doar cu câmpul tarif.

DeschideÆi baza de date Compania.AlegeÆi opÆiunea New∈∈File. Se deschide caseta de dialog New în care din grupul debutoane cu opÆiuni File Type activaÆi butonul View, dupå care executaÆi clic pebutonul New File.Se deschide caseta de dialog Add Table or View. Din acest moment veÆi urmaaceiaçi paçi pe care i-aÆi executat atunci când aÆi creat o interogare. Bara deinstrumente View Designer conÆine primele cinci butoane din bara Query Designer.Fereastra generatorului de vizualizåri conÆine în plus secÆiunea Update Criteria. Prinintermediul controalelor din aceastå secÆiune puteÆi stabili câmpurile cheie (câmpurilecare realizeazå legåtura între vizualizare çi tabelele surså) çi câmpurile actualizate(câmpurile a cåror modificare se transmite çi cåtre tabelele surså). DeschideÆi aceaståsecÆiune pentru a stabili parametrii vizualizårii. Lista Field Name conÆine lista câmpu-rilor din vizualizare disponibile pentru actualizare, din tabelul AngajaÆi. Se stabilesc maiîntâi câmpurile cheie (care vor identifica unic relaÆia vizualizare-tabel surså). Aceste

Page 158: SGBD Visual Foxpro

Informatică 158

câmpuri sunt nume çi pren. Se selecteazå fiecare dintre aceste câmpuri çi se activeazåcomutatorul pentru câmpul cheie. Se pot stabili acum câmpurile care pot fi actualizate(ele nu pot fi câmpuri cheie). Singurul câmp care a mai råmas este câmpul tarif. Îl vommarca pentru actualizare fie executând clic pe comutatorul de actualizare din dreptulsåu din lista Field Name, fie executând clic pe declançatorul Update All. Actualizareacâmpului marcat se poate face în douå moduri, pe care le stabiliÆi cu butoanele radioUpdate using: prin çtergerea vechilor înregistråri çi reinserarea celor modificate (SQLDELETE then INSERT) sau prin scrierea modificårilor direct în înregistrare (SQLUPDATE). ActivaÆi butonul radio SQL UPDATE. ActivaÆi comutatorul Send SQLupdates (dacå vreÆi ca aceste actualizåri så se çi realizeze). SalvaÆi vizualizarea subnumele a1.DeschideÆi vizualizarea (ca pe un tabel cu comanda use).AfiçaÆi vizualizarea în fereastra de editare Browse (cu comanda browse). FaceÆimodificåri în câmpurile vizualizårii.

DeschideÆi tabelul AngajaÆi. AfiçaÆi conÆinutul acestui tabel într-o fereastrå browse.ObservaÆi ce modificåri fåcute în vizualizare se regåsesc în tabel.ÎnchideÆi baza de date.

CreaÆi un raport

Se construieçte un raport în care se prezintå situaÆia încasårilor cu subtotaluri pentrufiecare contract.

DeschideÆi baza de date Compania.AlegeÆi opÆiunea New∈∈File. Se deschide caseta de dialog New în care, din grupul debutoane cu opÆiuni File Type, activaÆi butonul Report, dupå care executaÆi clic pebutonul New File. Se deschide fereastra generatorului de rapoarte care este

coloana de comutatoarepentru câmpuri cheie

coloana de comutatoarepentru câmpuri actualizate

Page 159: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 159

împårÆitå în mai multe benzi, fiecare bandå reprezentând o zonå din raport. PuteÆimodifica dimensiunea unei zone pe verticalå, glisând bara delimitatoare a zonei.DefiniÆi mediul de date al raportului (tabelele din care preia datele). AlegeÆi opÆiuneaData Environment...∈∈View. Se deschide fereastra care este vidå.AlegeÆi opÆiunea Add...∈∈ Data Environment. Se deschide caseta de dialog AddTable or View. AlegeÆi din listå tabelul Încasåri. ReluaÆi operaÆia çi alegeÆi din liståtabelul Contracte. Tabelele çi relaÆia dintre ele vor fi adåugate în fereastrå.AdåugaÆi în fereastra generatorului de rapoarte benzile pentru antetul çi subsolulraportului. AlegeÆi opÆiunea Title/Summary...∈∈ Report. Se deschide caseta de dialogTitle/Summary în care activaÆi comutatorul Title band pentru antetul raportului çicomutatorul Summary band pentru subsolul raportului.StabiliÆi caracteristicile caracterelor din raport. AlegeÆi opÆiunea Default Font...∈∈Report. AlegeÆi în caseta de dialog Font fontul Arial.

1 Select Object Selecteazå un obiect.2 Label Activeazå scrierea textului.3 Field Activeazå inserarea unui câmp4 Line Activeazå trasarea unei linii.5 Rectangle Activeazå trasarea unui dreptunghi.6 Rounded Rectangle Activeazå trasarea unui dreptunghi cu colÆuri rotunjite.7 Data Grouping Permite gruparea datelor.8 Report Controls Toolbar Activeazå bara cu instrumente Report Controls.

ScrieÆi titlul raportului. ExecutaÆi clic pe instrumentul Label, executaÆi clic în bandapentru antetul raportului în locul în care vreÆi så scrieÆi titlul çi scrieÆi: SituaÆiaîncasårilor pe contracte. ExecutaÆi clic în banda de antet de paginå çi scrieÆi titlurilecoloanelor: Nr. încasare, Nr. contract, Client, Data çi Valoare.AdåugaÆi la raport câmpurile care vor fi afiçate. ExecutaÆi clic pe instrumentul Field.ExecutaÆi apoi clic în banda Detail, sub titlul coloanei Nr. încasare în poziÆia în carevreÆi så aparå valoarea câmpului. Se deschide caseta de dialog Report Expression.ExecutaÆi clic pe butonul Expression çi se deschide caseta de dialog Expression

1 2 3 4 5 6 7 8

Banda pentru antet de paginå

Banda pentru datele din raport (Detail)

Banda pentru subsol de paginå

Page 160: SGBD Visual Foxpro

Informatică 160

Builder în care alegeÆi din lista Fields câmpul Încasåri.nr_i. ReluaÆi operaÆia pentrucâmpurile Încasåri.id_cont, Contracte.id_cl, Încasåri.data_p, Încasåri.valoare.CreaÆi grupuri de înregistråri dupå numårul contractului.AlegeÆi opÆiunea Data Grouping...∈∈Report. Se deschide caseta de dialog DataGrouping în care veÆi defini un singur nivel pentru grup. ExecutaÆi clic pe butonulprimului grup. Se deschide caseta de dialog Expression Builder în care alegeÆi dinlista Fields câmpul Încasari.id_cont.DefiniÆi totalul la nivelul raportului çi subtotal la nivelul fiecårui grup pentru câmpulvaloare. ExecutaÆi clic pe instrumentul Field. ExecutaÆi apoi clic în banda Group, subcâmpul Valoare. Se deschide caseta de dialog Report Expression. ExecutaÆi clic pebutonul Expression çi din caseta de dialog Expression Builder alegeÆi câmpulincasari.valoare. În caseta de dialog Report Expression executaÆi clic pe butonulCalculations.... Se deschide caseta de dialog Subtotal or Calculate Field în careactivaÆi în grupul de butoane radio Subtotal or Calculate butonul Sum. ReluaÆiaceleaçi operaÆii çi pentru banda subsolului de raport.

SalvaÆi raportul sub numele a1. ÎnchideÆi caseta de dialog. În fereastra Commandeste afiçatå comanda cu care a fost creat raportul: create report.PrevizualizaÆi raportul cu comanda:

report form a1 preview.PuteÆi modifica raportul cu comanda:

modify report a1.VeÆi modifica raportul astfel: deoarece câmpurile pentru numårul contractului çi pentruidentificatorul clientului se repetå la nivelul grupului, veÆi adåuga aceste date în antetulgrupului çi le veÆi scoate din secÆiunea de date a raportului.

PuteÆi tipåri un raport cu comanda:Report form <nume_fiçier> [heading <exp_C>] [summary]

[<domeniu>][for <expL1>][ while <expL2>][to printer | to file <nume_fiçier>]unde clauza heading permite afiçarea unui antet suplimentar la începutul fiecårei pagini,iar clauza summary inhibå afiçarea rândurilor cu dateçi afiçeazå numai rândurile cu totaluri çi subtotaluri.

Page 161: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 161

7. Transferul datelor între un sistem de gestiune a bazelor de date şi o altă aplicaţieO problemå importantå a oricårui sistem o reprezintå schimbul de informaÆii dintreaplicaÆii. Visual FoxPro permite folosirea urmåtoarelor metode:

Exportul çi importul fiçierelor. Poate så execute aceste operaÆii pentru foi de calculExcel sau Lotus 1-2-3 çi pentru baze de date Access çi Paradox.Protocolul OLE. Folosind acest protocol pot fi introduse într-un tabel diferite obiecte(un document, o foaie de calcul, o imagine etc.). Pentru aceste obiecte se foloseçtecâmpul General.Protocolul DDE. Folosind acest protocol se poate realiza un schimb de date întredouå aplicaÆii aflate în execuÆie. Se pot realiza transferuri complexe de date, ca deexemplu: încårcarea datelor într-o foaie de calcul Excel direct dintr-o aplicaÆie VisualFoxPro, introducerea datelor într-un tabel Visual FoxPro direct din Excel sau scriereaunui text într-un document Word direct dintr-o aplicaÆie Visual FoxPro. Comunicareadintre cele douå aplicaÆii se bazeazå pe un schimb de mesaje în care una dintreaplicaÆii este client, iar cealaltå server. În funcÆie de ceea ce se doreçte, Visual FoxPropoate fi client sau server.Drivere ODBC (Open DataBase Connectivity). Folosind drivere ODCB, Visual FoxProse poate conecta la alte tipuri de baze de date.Tehnologia ActivX. Aceastå tehnologie permite aplicaÆiei Visual FoxPro så inte-racÆioneze într-o reÆea cu alte aplicaÆii, indiferent de software-ul folosit pentru crearealor. În acest mod, într-o interfaÆå creatå cu Visul FoxPro pot fi folosite controaleActivX create într-un alt limbaj de programare.

7.1. Importul şi exportul OperaÆiile de import-export se pot realiza numai pentru acele tipuri de fiçiere pentru careîn Visual FoxPro sunt implementate programe de conversie.

În general operaÆiile de import-export se realizeazå între tabelele Visual FoxPro çi:tabele create cu alte sisteme de gestiune a bazelor de date relaÆionale; în acest cazse realizeazå o conversie între cele douå tipuri de înregistråri de structurå.foi de calcul create cu un produs de calcul tabelar; în acest caz înregistrårile din tabelvor deveni rânduri în foaia de calcul, iar câmpurile coloane çi invers.fiçiere de texte (ASCII) în care liniile de text sunt separate de caracterul Eol (generatde codurile ASCII CR - retur de car çi LF - linie nouå, echivalent cu apåsarea tasteiEnter); în acest caz rândurile de text devin înregistråri în tabel çi invers. Existå douåtipuri de fiçiere text:

Sdf - înregistrårile au lungime fixå, iar câmpurile nu sunt separate între ele prindelimitatori;Delimited - câmpurile sunt separate prin virgulå, iar câmpurile de tip caracter suntdelimitate prin ghilimele. Se pot schimba separatorii cu clauza with astfel:

with tab - câmpurile sunt separate prin caracterul tabulator (codul ASCII 9 -generat de apåsarea tastei Tab);

Page 162: SGBD Visual Foxpro

Informatică 162

with blank - câmpurile sunt separate prin spaÆiu;with <delimitator> - câmpurile de tip caracter vor fi delimitate de caracterul<delimitator> în locul ghilimelelor.

1. Importul datelor este operaÆia princare se preiau date create cu alteaplicaÆii çi sunt transformate într-untabel al bazei de date VisaulFoxPro. Se realizeazå cu comen-zile: Import çi Append from.

a. Sintaxa comenzii Import este:Import from <nume_fiçier>

type <tip>

b. Sintaxa comenzii Append fromeste:

Append from <nume_fiçier>type <tip>

unde <nume_fisier> este numele fiçierului din care se importå datele, iar <tip>reprezintå tipul fiçierului.

2. Exportul datelor este operaÆia prin care se transferå date dintr-un tabel al bazei dedate într-un alt tip de fiçier, specific unei alte aplicaÆii. Se realizeazå cu comenzile:Export çi Copy to.

a. Sintaxa comenzii Export este:Export to <nume_fiçier> [fields <listå_câmpuri>]

[<domeniu>] [for <expL1>] [while <expL2>] type <tip>

b. Sintaxa comenzii copy to este:Copy to <nume_fiçier> [fields <listå_câmpuri>]

[<domeniu>] [for <expL1>] [while <expL2>] type <tip>unde <nume_fisier> este numele fiçierului din care se importå datele, iar <tip> este tipulfiçierului. Implicit se transferå toate câmpurile din tabel. Explicit se transferå numai celeprecizate prin lista clauzei fields. Implicit se transferå toate înregistrårile din tabel.Explicit se transferå numai cele precizate prin clauzele <domeniu>, for sau while.

<tip> extensie produs deTabele din bazå de date

fox2x .dbf versiuni anterioareFoxPro (pentru MS-DOSsau Windows

pdox .db Paradox versiuni 3.5/4.0Foi de calcul

wk1/wk3/wks

wk1/wk3/wks

Lotus 1-2-3 - diferiteversiuni

xls/xl5 xls Excel vers. 2.0/5.0Fiçiere text

sdf txt fiçiere ASCIIdelimited txt fiçiere ASCII

ImportAppend from

tabel al bazei de date alt tip de fiçier

Copy toExport

Page 163: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrarea datelor 163

InseraÆi date dintr-un tabel al bazei de date într-un document Word

PoziÆionaÆi cursorul în document în poziÆia în care vreÆi så inseraÆi datele din tabel.AfiçaÆi bara de instrumente Database cu opÆiunea Database∈∈Toolbars∈∈View.ExecutaÆi clic pe butonul Insert Database. Se deschide caseta de dialog Database.ExecutaÆi clic pe declançatorul Get Data... Din caseta de dialog Open Data SourcealegeÆi numele tabelului, de exemplu AngajaÆi. Se revine în caseta de dialogDatabase.ExecutaÆi clic pe declançatorul Query Options... Se deschide caseta de dialogQuery Options care conÆine trei secÆiuni pentru stabilirea unui criteriu de interogare.DeschideÆi secÆiunea Filter Records pentru a stabili criteriul de filtrare (de exemplunumai angajaÆii din Bucureçti). Din lista ascunså Field alegeÆi cîmpul c_jud, din listaComparison operatorul Equal to, iar în caseta de text Compare to scrieÆi B. Deschi-deÆi secÆiunea Sort Records pentru a stabili cheia de sortare (de exemplu dupånume çi prenume). PuteÆi alege maxim trei chei de sortare. AlegeÆi din lista ascunsåSort by câmpul nume etc. DeschideÆi secÆiunea Select Fields pentru a stabilicâmpurile care vor fi preluate din baza de date. AlegeÆi din listå câmpurile nume,pren, tel_f çi tel_m. ÎnchideÆi caseta de dialog Query Options.ExecutaÆi clic pe declançatorul Table Auto Format dacå vreÆi så alegeÆi unul dintreformatele predefinite pentru tabele.ExecutaÆi clic pe declançatorul Insert Data.... Se deschide caseta de dialog InsertData din care puteÆi alege domeniul înregistrårilor.Datele din tabelul bazei de date vor fi inserate în document sub forma unui tabel.

ExportaÆi date dintr-un tabel al bazei de date

DeschideÆi baza de date Compania çi apoi tabelul Clienti.open database compania use clienti

ExportaÆi datele din tabel în diferite formate de fiçier text ASCII:

copy to cl1.txt sdfcopy to cl2.txt delimitedcopy to cl3.txt;

delimited with blank

copy to cl4.txt;delimited with tab

copy to cl5.txt;delimited with *

VizualizaÆi conÆinutul fiçierelor text create çi comparaÆi rezultatul exporturilor.

modi file cl1.txt................modi file cl5.txt

TT est pentru evaluare:

1. CreaÆi o interogare în care afiçaÆi clienÆii care au fost înregistraÆi înainte de 01/01/2000.Interogarea va fi afiçatå în ordinea codurilor angajaÆilor.

2. CreaÆi o vizualizare cu clienÆii atribuiÆi angajatului cu codul 200 în perioada 01/01/2000 çi31/12/2001.

Page 164: SGBD Visual Foxpro

Informatică 164

3. CreaÆi un raport cu evidenÆa çedinÆelor. ÇedinÆele vor fi grupate dupå numårul contractului çipentru acelaçi contract vor fi afiçate în ordine cronologicå. AfiçaÆi subtotaluri la nivel de grupçi un total la nivel de raport pentru durata çedinÆelor çi pentru costul çedinÆelor.

4. ImportaÆi fiçierele cu texte cl1.text, ..., cl5.txt în tabele. VizualizaÆi conÆinutul acestor tabele.5. ExportaÆi tabelul ClienÆi într-o foaie de calcul Excel. VizualizaÆi conÆinutul foii de calcul.6. ImportaÆi foaia de calcul într-un tabel. VizualizaÆi

conÆinutul tabelului.

ÎncercaÆi:

Adevårat/Fals:1. Prin intermediul interogårii puteÆi face modificåri în tabelele bazei de date.2. Prin intermediul unei vizualizåri puteÆi modifica orice câmp din tabelele bazei de date.3. Folosind interogarea puteÆi stabili o ordine de afiçare a înregistrårilor.4. Folosind interogarea puteÆi combina înregistråri din mai multe tabele.5. PuteÆi insera date dintr-un tabel al bazei de date într-un document Word.6. PuteÆi exporta un tabel Visual FoxPro într-un tabel FoxPro for MS-DOS.7. Comanda copy to alfa.txt delimited with ! va exporta datele din tabel într-un fiçier de

tip text în care câmpurile din tabel vor fi separate de semnul !.

CompletaÆi:1. Criteriul de interogare este salvat într-un fiçier sub formå de ..........................…………2. Vizualizarea este salvatå într-un fiçier sub formå de ..........................…………3. ObÆineÆi rezultatul unei interogåri cu comanda ..............................................4. PuteÆi construi interactiv un raport folosind ....................................5. Datele din câmpurile înregistrårii vor fi inserate în raport în banda............................6. Pentru a obÆine în urma exportului dintr-un tabel un fiçier text în care câmpurile sunt

separate prin tabulatori folosiÆi clauza.............................7. PuteÆi introduce o imagine într-un câmp de tip General folosind ....................

RåspundeÆi:1. Ce este o interogare a bazei de date?2. Ce este o vizualizare a bazei de date?

RR åspunsuri:Adevårat/Fals: 1-F; 2-F; 3-A; 4-A; 5-A; 6-A; 7-F.CompletaÆi: 1-comandå SQL; 2-tabel; 3-do; 4-generatorul de rapoarte; 5-Detail; 6-delimited withtab; protocolul OLE.

Page 165: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 165

8. Tablouri de memorieVisual FoxPro permite crearea çi manipularea structurilor de date de tip tablou dememorie care, în acest sistem au urmåtoarele caracteristici:

Se pot crea numai tablouri cu o singurå dimensiune (vectori) sau cu douå dimensiuni(matrice).Tablourile de memorie Visual FoxPro sunt tablouri neomogene.La creare, elementele tabloului sunt iniÆializate cu valoarea logicå .F.La un moment dat, în memoria internå gestionatå de Visual FoxPro se pot creamaxim 65.000 de tablouri de memorie, iar un tablou de memeorie poate avea65.000 de elemente.

8.1. Operaţii cu tablouri de memorie:Asupra tablourilor de memorie Visual FoxPro se pot executa urmåtoarele operaÆii:

1. Crearea tabloului de memorie:definirea structurii → comenzile declare/dimensionatribuirea de valori elementelor → comanda store sau

operaÆia de atribuire

2. Redimensionarea tabloului → comenzile declare/dimensionschimbarea dimensiunii: din vector în matrice çi din matrice în vector;mårirea (creçterea numårului de elemente) sau micçorarea (diminuareanumårului de elemente) tabloului.

3. Consultarea tablourilor constå în:obÆinerea de informaÆii despre elementele tabloului:

global (despre toate elementele) →→ comenzile display/list memoryindividual (numai despre anumite elemente) →→ comenzile ?/??

obÆinerea de informaÆii despre tablou:lungimea tabloului → funcÆia alen()poziÆia unui element din linia çi coloana specificatå → funcÆia aelement()numårul liniei sau al coloanei unui element specificat prin poziÆie în cadrul

tabloului → funcÆia asubscript()existenÆa unui çir de caractere în tablou → funcÆia ascan()

4. Actualizarea tablourilor constå în:çtergerea unui element, a unei linii sau a unei coloane → funcÆia adel()adåugarea unui element, a unei linii sau a unei coloane → funcÆia ains()

5. Copierea unui tablou → funcÆia acopy()6. Sortarea unui tablou → funcÆia asort()7. Salvarea informaÆiilor într-un tablou constå în salvarea:

conÆinutului unui director → funcÆia adir()structurii unui tabel din baza de date (fiçier .dbf) → funcÆia afield()

Page 166: SGBD Visual Foxpro

166 Informatică

8.1.1. Crearea unui tablou de memorie:Crearea unui tablou de memorie se face prin douå operaÆii:

a. Definirea structurii cu ajutorul comenzilor declare/define. Comenzile au sintaxa:

ObservaÆii:Nu existå nici o diferenÆå între comenzile declare çi define (existå ambele comenzipentru a crea compatibilitate cu versiunile anterioare de limbaje de comandå specifi-ce sistemelor de gestiune a bazelor de date compatibile dBase).Printr-o comandå pot fi definite mai multe tablouri de memorie identificate prin nume<nume_tablou1>, <nume_tablou2>, .... Tablourile definite pot fi atât de tip vector,cât çi de tip matrice.Comenzile au un singur adverb: lista de tablouri de memorie care se definesc.Separarea tablourilor în listå se face prin virgulå. Pentru fiecare tabel se precizeazånumele çi numårul de elemente dupå o dimensiune, dacå se defineçte un vector(<expN11>, <expN21>, ...), respectiv numårul de elemente dupå douå dimensiuni,dacå se defineçte o matrice (<expN11> çi <expN12>, <expN21> çi <expN22>, ...).

Dupå ce aÆi definit structura tabloului, puteÆi identifica orice element din tablou astfel:

pentru vectori : <nume_tablou>(<expN>), unde <expN> reprezintå numårul de ordine alelementului în cadrul vectorului;

pentru matrice : <nume_tablou>(expN1,<expN2>), unde identificarea elementului seface prin numårul liniei <expN1> çi numårul coloanei <expN2>. Elementele uneimatrice se pot identifica çi prin numårul de ordine. æinând cont cå în Visual FoxPro omatrice se memoreazå în ordinea liniilor çi dacå notåm cu n numårul de linii ale matricei,cu m numårul de coloane, iar cu i çi j cei doi indici ai unui element, atunci numårul deordine al unui element va fi m××(i-1)+j.

b. Atribuirea de valori elementelor se poate face în douå moduri:Se atribuie aceeaçi valoare tuturor elementelor cu ajutorul comenzii store careare sintaxa:

store <exp> to <nume_tablou>Se atribuie câte o valoare fiecårui element folosind operaÆia de atribuire:

<element_tablou>= <exp>sau comanda store care are sintaxa:

store <exp> to <element_tablou>

declare | define <nume_tablou1> (<expN11>[,<expN12>])[,<nume_tablou2> (<expN21>[,<expN22>]) ....... ]

Numele tablouluide memorie

Numårul de elementedupå prima dimensiune

Numårul de elementedupå a doua dimensiune

Page 167: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 167

8.1.2. Redimensionarea tablourilor de memorie:Redimensionarea unui tablou se face redeclarând structura cu comanda declare/define.Se pot executa urmåtoarele operaÆii:a. Se schimbå dimensiunea tabloului, adicå un tablou unidimensional (vector) se poate

transforma într-un tablou bidimensional (matrice) çi invers. Prin schimbarea dimensiuniinu se distrug datele din tablou.

b. Se måresçte tabloul, adicå se creçte numårul de elemente ale tabloului. Elementeleadåugate vor fi inÆializate cu valoarea logicå .F..

c. Se micçoreazå tabloul, adicå se reduce numårul de elemente ale tabloului. Ele-mentele care vor ajunge în afara tabloului, în urma redeclarårii structurii, se vor pierde.

8.1.3. Consultarea tablourilor:Consultarea unui tablou de memorie (obÆinerea de informaÆii din tabloul de mmorie) sepoate face prin urmåtoarele operaÆii:a. Vizualizarea elementelor tabloului. Se poate executa în douå moduri:

Se vizualizeazå toate elementele tabloului (sunt afiçate valorile elementelor çiinformaÆii despre tipul lor) folosind comenzile list memory | display memory careau sintaxa:

list memory | display memory like <nume_tablou>Se vizualizeazå valoarea unui element sau a mai multor elemente folosind comanda?| ?? (elementele tabloului sunt tratate ca variabile de memorie):

?| ?? <element_tablou>sau:

?| ?? <listå_elemente_tablou>

b. ObÆinerea de informaÆii despre tablou sau despre elementele tabloului. AcesteinformaÆii se pot obÆine cu ajutorul urmåtoarelor funcÆii1:

Lungimea tabloului, adicå numårul de elemente ale unui tablou se poate obÆine cuajutorul funcÆiei alen() care are sintaxa: alen(<nume_tablou>,[,<expN>]) . FuncÆiafurnizeazå un rezultat numeric.Implicit acesta este numårul de ele-mente din tablou. Dacå se foloseçteargumentul <expN> care este op-Æional, funcÆia va furniza numårul delinii (pentru valoarea 1 a argumen-tului <expN>) sau numårul de coloa-ne (pentru valoarea 2 a argumen-tului <expN>).

1 Numele funcÆiilor folosite pentru operaÆii cu tablouri de memorie încep cu litera a (array).

1. Ce valoare va furniza funcÆia alen() dacåse va preciza argumentul <expN> în cazulunui vector?

2. Ce valoare va furniza funcÆia alen() dacåargumentul <expN> are valoarea 0 sau ovaloare mai mare decât 2?

?

Page 168: SGBD Visual Foxpro

168 Informatică

PoziÆia unui element din tablou, identificat prinnumårul liniei çi numårul coloanei se obÆine cuajutorul funcÆiei aelement() care are sintaxa:aelement(<nume_tablou>,<expN1>[,<expN2>] ,unde <expN1> çi <expN2> sunt indicii elementului(numårul liniei çi numårul coloanei). FuncÆia furni-zeazå un rezultat numeric care reprezintå numå-rul de ordine al elementului în cadrul structurii.Numårul liniei sau al coloanei unui element dintablou (adicå unul dintre indicii ele-mentului), identificat prin poziÆia sa în cadrultabloului, se obÆine cu ajutorul funcÆiei asubscript() care are sintaxa:asubscript(<nume_tablou>,<expN1>,<expN2>), unde prin <expN1> se precizeazåpoziÆia elementului çi prin expresia <expN2>, ceea ce doriÆi så aflaÆi. FuncÆia furnizeazåun rezultat numeric care reprezintåpentru vectori numårul de ordine alelementului, iar pentru matricenumårul liniei (primul indice) dacå<expN2> are valoarea 1 sau numårulcoloanei (al doilea indice) dacå<expN2> are valoarea 2.Cåutarea unui element din tabloucare are o valoare precizatå se facecu funcÆia ascan():ascan(<nume_tablou>,<exp>[,<expN1>[,<expN2>]]), unde <exp> este expresia princare se specificå valoarea cåutatå. Ea poate fi de orice tip (numeric, çir de caractere,logic, datå calendaristicå). FuncÆia furnizeazå un rezultat numeric care reprezintånumårul de ordine al elementului care are valoarea precizatå. Dacå nici un elementnu are aceastå valoare, rezultatul furnizat va fi 0. Implicit cåutarea se face prin toateelementele tabloului. Explicit se cautå numai printre elementele care încep din poziÆiaprecizatå cu argumentul <expN1> çi pânå la elementul din poziÆia precizatå cuargumentul <expN2>.

8.1.4. Actualizarea tablourilor de memorie:Valoarea unui element al tabloului de memorie poate fi modificatå prin simpla atribuire a noiivalori. În afarå de aceastå operaÆie de actualizare, se mai pot executa urmåtoarele operaÆii:a. Inserarea unui element (pentru vectori) sau a unei linii/coloane (pentru matrice) se face

cu ajutorul funcÆiei ains(): ains(<nume_tablou>,<expN>[,2]) , unde argumentul<expN> se foloseçte pentru a preciza poziÆia în care se face inserarea. Argumentul 2se foloseçte la matrice unde, dacå nu se precizeazå se insereazå o linie, iar dacå seprecizeazå se insereazå o coloanå. FuncÆia furnizeazå un rezultat numeric astfel: 1dacå operaÆia s-a executat cu succes çi -1 în caz contrar. FuncÆia nu modificå dimen-siunea tabloului. Elementele care urmeazå poziÆiei, respectiv liniei sau coloanei insera-te vor fi deplasate spre sfârçitul tabloului, iar ultimul element, respectiv ultima linie saucoloanå va fi scos în afara tabloului çi se va pierde. În poziÆia inseratå elementelor li seva atribui valoarea .F..

1. Ce valoare va furniza funcÆia asubscript()dacå pentru un vector se furnizeazåargumentul <expN2>?

2. Ce valoare va furniza funcÆia asubscript()dacå pentru o matrice argumentul<expN2> are valoarea 0 sau o valoaremai mare decât 2?

?

Ce valoare va furniza funcÆiaaelement() dacå argumentul<expN1> este mai maredecât numårul de linii, iarargumentul <expN2> estemai mare decât numårul decoloane ale unei matrice?

?

Page 169: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 169

b. Çtergerea unui element (pentru vectori) sau a unei linii/coloane (pentru matrice) seface folosindu-se funcÆia adel(): adel(<nume_tablou>,<expN>[,2]) , unde argumenteleçi rezultatul furnizat au aceeaçi semnificaÆie ca çi la funcÆia ains(). FuncÆia nu modificådimensiunea tabloului. Elementele care urmeazå poziÆiei, respectiv liniei sau coloaneiçterse vor fi deplasate spre începutul tabloului, iar ultimul element, respectiv ultima liniesau coloanå va fi iniÆalizatå cu valoarea .F..

8.1.5. Copierea unui tablou de memorie:Se poate realiza o copie a unui tablou de memorie folosind funcÆia acopy() care areurmåtoare sintaxå:

acopy(<nume_tablou1>,<nume_tablou2>[,<expN1>[,<expN2>[,<expN3>]]])

Se copiazå elementele tabloului identificat prin <nume_tablou1> (tabloul surså) în tabloulidentificat prin <nume_tablou2> (tabloul destinaÆie). Dacå tabloul destinaÆie nu existå, el vafi creat automat de aceeaçi dimensiune çi mårime ca çi tabloul surså. Implicit se copiazåtoate elementele. Explicit se copiazå numai o porÆiune din tabelul surså, çi anume cea careîncepe din poziÆia precizatå prin <expN1> çi conÆine urmåtoarele <expN2> elemente.Implicit copierea se face în tabelul destinaÆie începând din prima poziÆie. Explicit, copierease face începând din poziÆia precizatå prin <expN3>. FuncÆia furnizeazå un rezultatnumeric care reprezintå numårul de elemente copiate.

8.1.6. Sortarea unui tablou de memorie:Folosind funcÆia asort() se pot ordona crescåtor sau descrescåtor elementele unui vectorsau liniile unei matrice în funcÆie de valoarea elementelor dintr-o coloanå precizatå. Pentrua se putea executa operaÆia de sortare tabloul de memorie trebuie så fie omogen.FuncÆia are urmåtoarea sintaxå:

asort(<nume_tablou> [,<expN1>[,<expN2>[,<expN3>]]])

Se sorteazå elementele tabloului identificat prin <nume_tablou>. Modul în care se faceordonarea se precizeazå prin argumentul <expN3> care, dacå este diferit de zero,determinå o ordonare descrescåtoare, iar dacå este zero sau lipseçte, determinå oordonare crescåtoare. FuncÆia furnizeazå un rezultat numeric astfel: 1 dacå operaÆia s-aexecutat cu succes çi -1 în caz contrar. Implicit se ordoneazå toate elementele vectorului,respectiv toate liniile matricei începând cu primul element al tabloului. Explicit se ordoneazånumai numårul de elemente sau numårul de linii precizate prin <expN2> începând cupoziÆia precizatå prin <expN1>, respectiv cu linia în care se gåseçte elementul cu numårulde ordine precizat prin <expN1>. În cazul unei matrice, coloana folositå pentru ordonareeste coloana elementului cu numårul de ordine precizat prin<expN1>.

8.1.7. Salvarea informaÆiilor în tablouri de memorie:Într-un tablou de memorie pot fi salvate urmåtoarele informaÆii:

a. ConÆinutul directorului curent poate fi salvat într-un tablou de memorie de tip matricefolosind funcÆia adir(): adir(<nume_tablou>,<expC1>[,<expC2>]) . Salvarea se face întabloul precizat prin argumentul <nume_tablou>. Aceastå matrice are o structurå binedefinitå çi dacå nu a fost creatå anterior, va fi creatå de funcÆie, iar dacå existå va fi

Page 170: SGBD Visual Foxpro

170 Informatică

redimensionatå corespunzåtor. Matricea va avea un numår de linii egal cu numårul defiçiere çi directoare (dosare=foldere) înregistrate în director çi 5 coloane,corespunzåtoare celor 5 caracteristici ale unui fiçier sau director: nume fiçier (tip çir decaractere), dimensiune fiçier (tip numeric), data ultimei actualizåri (tip datå calen-daristicå), timpul ultimei actualizåri (tip çir de caractere) çi atribute (tip çir decaractere). Atributele fiçierelor sau directoarelor pot fi: A - arhivat, H - ascuns, R - pro-tejat la scriere, S - sistem, D - director. Implicit pot fi salvate informaÆii despre toate fiçie-rele çi dosarele înregistrate. Explicit vor fi salvate informaÆii numai despre fiçierele carepot fi identificate prin çablonul descris cu argumentul <expC1> sau fiçierele care auatributele precizate prin argumentul <expC2>: 'D' - numai directoare, 'H' - numai fiçie-rele ascunse, 'S' - numai fiçierele sistem, 'V' - în primul element al tabloului va fi înre-gistratå eticheta volumului de disc pe care se gåseçte directorul curent. FuncÆia furni-zeazå un rezultat numeric care reprezintå numårul de fiçiere çi dosare inventariate.

b. Structura tabelului bazå de date activ poate fi salvatå într-un tablou de memorie detip matrice folosind funcÆia afields(): afields(<nume_tablou>) . Salvarea se face întabloul precizat prin argumentul <nume_tablou>. Aceastå matrice are o structurå binedefinitå çi dacå nu a fost creatå anterior, va fi creatå de funcÆie, iar dacå existå va firedimensionatå corespunzåtor. Matricea va avea un numår de linii egal cu numårul decâmpuri din tabel çi 11 coloane, corespunzåtoare caracteristicilor ale unui câmp: numecâmp (tip çir de caractere), tip câmp (tip çir de caractere), lungime câmp (tipnumeric), numår poziÆii zecimale (tip numeric), regula de validare (tip çir de carac-tere), .... . FuncÆia furnizeazå un rezultat numeric care reprezintå numårul de câmpuri.

8.2. Păstrarea variabilelor de memorie şi a tablourilor de memorie în afara sesiunii de lucruTablourile de memorie sunt structuri de date temporare. La terminarea execuÆieiprogramului sau la terminarea execuÆiei sesiunii de lucru Visual FoxPro, datele påstrateîn ele se pierd. La fel ca çi în cazul variabilelor de memorie, datele din tablourile dememorie pot fi salvate într-un fiçier (fiçier cu extensia .mem) folosind comanda save to çireaduse din fiçier în memoria internå folosind comanda restore from.

8.3. Transferul datelor între variabile de memorie sau tablouri de memorie şi un tabel al bazei de dateSe pot transfera date în ambele sensuri între memoria internå (variabile de memorie sautablouri de memorie) çi memoria externå (fiçiere cu tabelele bazei de date). Astfel:

variabile de memorie ⇔⇔ tabel din baza de date :

a. variabilå de memorie ⇔⇔ câmp memo din tabel

Save to memomemoria internå memoria externå

(variabilå de memorie) (câmp memo din tabel)

Restore from memo

Page 171: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 171

b. set de variabile de memorie ⇔⇔ câmpuri dintr-o înregistrare din tabel

tablou de memorie ⇔⇔ tabel din baza de date :

ObservaÆie:Comanda Copy to array cere ca tabloul så fie creat anterior spre deosebire de comandaScatter care îçi creeazå singurå tabloul de memorie.

Sintaxa comenzilor:a. Comanda save to: salveazå variabilele de memorie çi tablourile descrise prin <sablon>

într-un fiçier pentru variabile de memorie (extensia .mem) specificat prin <nume_fisier>sau într-un câmp memo al tabelului activ specificat prin clauza to memo çi identificatprin nume <nume_câmp>:

save to <nume_fisier>| to memo <nume_câmp> [all like | except <sablon>]b. Comanda restore from: restaureazå variabilele de memorie çi tablourile dintr-un fiçier

pentru variabile de memorie specificat prin <nume_fisier> sau într-un câmp memo altabelului activ specificat prin clauza to memo çi identificat prin nume <nume_câmp>:

restore from <nume_fisier>| to memo <nume_câmp> [additive]c. Comanda scatter copiazå datele din

câmpurile înregistrårii curente ale ta-belului activ într-un tablou de memorieidentificat prin <nume_tablou> sau într-un set de variabile de memorie, cazspecificat prin clauza memvar.Variabilele de memorie vor aveaacelaçi nume ca çi câmpurile care secopiazå. Implicit se copiazå toate câmpurile, mai puÆin câmpurile memo. Explicit se pot

ReplaceGather

memoria internå memoria externå (set de variabile de memorie) (câmpuri dintr-o înregistrare din tabel)

Scatter

Append from arrayGather

memoria internå memoria externå (tablou de memorie) (tabel din baza de date)

ScatterCopy to array

1. În ce ordine se copiazå datele dincâmpurile tabelului în tabloul de memorie?

2. Ce se întâmplå dacå numårul de câmpuricare trebuie copiate este mai mare decâtnumårul de elemente din tabel?

?

Page 172: SGBD Visual Foxpro

172 Informatică

copia numai câmpurile din lista de câmpuri a clauzei fields çi se pot copia çi câmpurilememo dacå se precizeazå clauza memo. Clauza blank semnificå faptul cå se creeazåtabloul de memorie, respectiv setul de variabile de memorie de acelaçi tip çi lungime caçi câmpurile, dar în loc så se transfere în ele datele din câmpuri, acestea vor fi vide.

scatter [fields <listå_câmpuri>] [memo] to <nume_tablou> | to <nume_tablou> blank |memvar | memvar blank

d. Comanda gather copiazå în câmpurile înregistrårii curente a tabelului activ, datele dintr-un tablou de memorie identificat prin <nume_tablou> sau dintr-un set de variabile dememorie, caz specificat prin clauza memvar. Variabilele de memorie trebuie så aibåacelaçi nume ca çi câmpurile. Ele pot fi create cu comanda scatter memvar blank, dupåcare li se pot atribui valori. Dacå pentru un câmp nu existå o variabilå de memorie cuacelaçi nume, câmpul råmâne neschimbat. Copierea dintr-un tablou de memorie se facesecvenÆial, în fiecare câmp copiindu-se un element al tabloului, pânå când se terminåelementele din tablou sau pânå când se terminå câmpurile din înregistrare. Implicittransferul se face în toate câmpurile, mai puÆin câmpurile memo. Explicit transferul sepoate face numai în câmpurile precizate în lista de câmpuri a clauzei fields çi se potcopia çi câmpurile memo dacå se precizeazå clauza memo.

gather from <nume_tablou> | memvar [fields <listå_câmpuri>] [memo]

e. Comanda copy to array încarcå într-un tablou de memorie creat anterior, identificat prin<nume_tablou>, datele din câmpurile tabelului activ. Dacå tabloul este de tip vector, secopiazå numai câmpurile din înregistrarea curentå, iar dacå tabloul este de tip matrice, seîncarcå în fiecare linie a matricei câmpurile dintr-o înregistrare. Dacå existå mai multeelemente decât câmpuri, restul elementelor råmâne neschimbat, iar dacå existå mai multecâmpuri decât elemente, câmpurile care nu mai încap nu se copiazå. Dacå existå maimulte linii decât înregistråri, restul de linii råmâne neschimbat, iar dacå existå mai multeînregistråri decât linii, înregistrårile care nu mai încap nu se copiazå. Implicit se transferåtoate câmpurile dintr-o înregistrare. Explicit se transferå numai în câmpurile precizate în listade câmpuri a clauzei fields. Implicit se transferå toate înregistrårile din tabelul activ. Explicitse transferå numai înregistrårile precizate prin <domeniu> sau clauzele for sau while.

copy to array <nume_tablou> [fields <listå_câmpuri>] [<domeniu>][for <expL1>][while < expL2>][<nooptimize>]

f. Comanda append from array adaugå la sfârçitul tablelului activ înregistråri cu datepreluate dintr-un tablou de memorie identificat prin <nume_tablou>. Dacå tabloul dememorie este de tip vector, se adaugå o singurå înregistrare astfel: dacå existå mai multeelemente decât câmpuri, restul elementelor din tablou sunt ignorate, iar dacå sunt maimulte câmpuri decât elemente, restul câmpurilor se iniÆalizeazå cu elementul neutrupentru acel tip de datå. Dacå tabloul este de tip matrice, se copiazå în câte o înregistrarecâte o linie a matricei. Linia matricei este tratatå la fel ca un tablou de tip vector. Implicitse transferå date în toate câmpurile înregistrårii. Explicit se transferå numai în câmpurileprecizate în lista de câmpuri a clauzei fields. Implicit se transferå toate liniile din tablou.Explicit se transferå numai liniile precizate prin clauza for. Dacå tipul elementului dintablou nu corespunde cu tipul câmpului în care se transferå, se încearcå transformareaacelui tip de datå, care poate så reuçeascå sau nu. De exemplu, o datå de tip numeric,logic sau datå calendaristicå poate fi transformatå într-o datå de tip çir de caractere, iar o

Page 173: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 173

datå de tip datå calendaristicå poate fi transformatå într-o datå de tip numeric. O datå detip çir de caractere nu poate fi transformatå într-o datå de tip numeric, iar o datå de tipnumeric nu poate fi transformatå într-o datå de tip datå calendaristicå.

append from array <nume_tablou> [fields <listå_câmpuri>] [for <expL>]

CreaÆi tablouri de memorie1. CreaÆi douå structuri de date - a de tip

vector çi b de tip matrice, ambele cu10 elemente:

declare a(10), b(2,5)

2. AfiçaÆi valoarea tuturor elementelordin tablouri folosind comanda displaymemory.

display memory like adisplay memory like b

ObservaÆi cå informaÆia este afiçatå subforma unui tabel - pe fiecare linie se afi-çeazå informaÆii despre un element, iar pefiecare coloanå câte un tip de informaÆie:valoarea indicelui sau valorile indicilor, ti-pul datei din element, valoarea datei çi,pentru datele numerice, çi reprezentareainternå a valorii. IniÆial toate elementele ta-blourilor create au valoarea logicå .F..

3. AfiçaÆi valoarea unor elemente dintablouri:

? a(5).F.

? b(2,4).F.

4. AtribuiÆi valori elementelor din tablou-rile create çi verificaÆi modul în cares-au executat operaÆiile de atribuire:

b(2,4)=40

? b(2,4)40

? b(9)40

b(1,1)='azi'b(1,2)='maine'

b(1,3)=date()b(1,4)=.T.b(1,5)=datetime()b(2,1)=10b(2,2)=20b(2,3)=30b(2,5)=50display memory like bstore 0 to adisplay memory like a

5. RedimensionaÆi tablourile:declare a(8)display memory like adimension a(2,4)display memory like adimension a(2,5)display memory like a

elementele a(2,4) çi a(2,5) au valoarea .F.

dimension a(10)dimension b(2,8)display memory like b

ultimele 6 elemente au valoarea .F. (ca çi cum b ar fi un vector)

6. ConsultaÆi tablouri de memorie (lungi-me, indici, existenÆa unui element):

? alen(a)10

? alen(b)16

? alen(b,1)2

? alen(b,2)8

? aelement(b,2,3)11

? asubscript(b,11,1)2

? asubscript(b,11,2)

Page 174: SGBD Visual Foxpro

174 Informatică

3? aelement(b, asubscript(b,11,1),

asubscript(b,11,2))11

? ascan(b,40)9

? asubscript(b, ascan(b,40),1)2

? asubscript(b, ascan(b,40),2)1

? ascan(b,'azi')1

? ascan(b,'zi')0

? ascan(b,date())3

? ascan(b,.T.)4

7. ActualizaÆi tablourile de memorie:display memory like a

elementele a(9) çi a(10) au valoarea .F.

? ains(a,3)1

display memory like aelementele a(3) çi a(10) au

valoarea .F.a(3)='nou'display memory like a? adel(a,5)

1display memory like a

elementele a(9) çi a(10) au valoarea .F.

? adel(a,15)mesaj de eroare (depåçirea

rangului indicelui): "Subscript is outside defined range"

? ains(a,15)acelaçi mesaj de eroare (depå-

çirea rangului indicelui)declare b(2,5)display memory like b? ains(b,3,1)

acelaçi mesaj de eroare (depå- çirea rangului indicelui)

? ains(b,2,1)1

display memory like belementele din ultima linie a

matricei au valoarea .F.

b(2,1)=10b(2,2)=20b(2,3)=30b(2,4)=40b(2,5)=50? adel(b,3,2)

1display memory like b

a fost çtearså coloana 3 çi elementele din ultima coloanå - b(1,5) çi b(2,5) - au valoarea .F.

? ains(b,3,2)1

display memory like ba fost inseratå coloana 2 çi

elementele din aceastå coloanå -b(1,3) çi b(2,3)- au valoarea .F.

b(1,3)=date()b(2,3)=30

8. CopiaÆi tablouri de memorie în altetablouri de memorie:

declare d(20)declare e(5)? acopy(b,d)

10display memory like d

elementele tabloului b au fost copiate în primele 10 elemente ale tabloului d; restul elemen- telor din d au valoarea .F.

? acopy(b,c)10

display memory like ds-a creat tabloul de memorie c

care are 10 elemente; elemen- tele tabloului b au fost copiate în tabloul c

? acopy(b,e)mesaj de eroare (depåçirea

rangului indicelui)? acopy(b,e,1,5)

5display memory like e

s-au copiat în vectorul e prime- le 5 elemente din matricea b (prima linie)

? acopy(b,a,6,5,4)5

display memory like a s-au copiat în vectorul a, înce-

pând de la elementul a(4) pânå

Page 175: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 175

la elementul a(8) cele 5 elemen- te din ultima linie a matricei b

9. SortaÆi tablourile de memorie:? asort(a)

mesaj de eroare (elementele tabloului trebuie så fie de ace- laçit tip): "Data type mismatch"

a(3)=100a(9)=15a(10)=0a(1)=5a(2)=25display memory like a? asort(a)

1display memory like a

elementele vectorului a sunt ordonate crescåtor

? adel(a,1,alen(a),1)1

display memory like aelementele vectorului a sunt

ordonate descrescåtordeclare a(3,4)a(11)=300a(12)=400display memory like a

elementele matricei a sunt:100 50 40 30 25 20 15 10 5 0 300 400

? asort(a,2)1

display memory like aau fost sortate toate liniile

matricei a începând cu linia în care se gåseçte elementul 2 - prima linie çi dupå coloana în care se gåseçte acest element - coloana 2; elementele matricei a sunt:

5 0 300 400 25 20 15 10100 50 40 30

? asort(a,3,2)1

display memory like aau fost sortate crescåtor

primele douå linii ale matricei a începând cu linia în care se gå- seçte elementul 3 - prima linie

çi dupå coloana în care se gå- seçte acest element - coloana 3; elementele matricei a sunt:

25 20 15 105 0 300 400100 50 40 30

10. TransferaÆi date între tablouri dememorie çi tabelul bazei de date:

create exSe creeazå tabelul liber ex cu

urmåtoarea structurå: c1(C,10), c2(N,5,0), c3(D), c4(L)

declare a(2,4)a(1,1))='linia1'a(1,2))=100a(1,3))=date()a(1,4))=.T.a(2,1))='linia2'a(2,2))=200a(2,3))=date()+10a(2,4))=.F.append from array alistgoto 2replace c2 with 500listgoto topscatter to qdisplay memory like q

a fost creat vectorul q cu 4 ele- menete; elementele sale conÆin valorile câmpurilor din prima înregistrare a tabelului ex

q(1)='linia3'q(2)=1000display memory like qappend from array qlist

tabelul conÆine trei înregis- tråri; ultima înregistrare con- Æine valorile elementelor vecto- rului q:

a(1,1))='linia4'a(1,2))=800a(1,3))=date()+20a(2,1))='linia5'a(2,2))=900a(2,3))=date()+30display memory like aappend from array alist

Page 176: SGBD Visual Foxpro

176 Informatică

declare w(5,3)copy to array w fields c1, c2, c3display memory like w? asort(w,2)

1display memory like wzapappend from array w for c2>400list

11. SalvaÆi informaÆii în tablouri de memorie:? adir(alfa,'*.dbf")display memory like alfa?alfa(1,1)? adir(alfa,'*ex.dbf")display memory like alfa?afields(alfa)display memory like alfahelp afields()

12. TransferaÆi date între tabele ale bazei dedate çi tablouri de memorie. Pentru a-ceasta deschideÆi tabelul Sedinte dinbaza de date Compania. CopiaÆicâmpurile nr_s, id_cont, id_ang, cost_sîntr-un tabel de memorie çi sortaÆi aceste

date dupå valoarea crescåtoare acâmpului cost_s (coloana 4 a tabloului):

open database companiause sedinterelease all like ax=reccount()declare a(reccount(),4)copy to array a fields nr_s, id_cont,

id_ng, cost_sdisplay memory like a

sau?a(1,1), a(1,2), a(1,3), a(1,4)?a(2,1), a(2,2), a(2,3), a(2,4)?a(3,1), a(3,2), a(3,3), a(3,4)..............................................?asort(a,4)append from array a fields nr_s,

id_cont, id_ang, cost_sbrowgoto x+1delete restpackuseclose databaseclear memory

TT est pentru evaluare:

1. CreaÆi structura a douå tablouri de memorie: vectorul b cu 10 elemente çi matricea a cudouå linii çi cinci coloane.

2. AfiçaÆi conÆinutul acestor tablouri de memorie. AfiçaÆi lungimea lor.3. AtribuiÆi tuturor elementelor din vectorul b valoarea 0. AtribuiÆi elementelor din matricea

a valorile 1, 2, ..., 10. AfiçaÆi conÆinutul celor douå tablouri de memorie.4. AfiçaÆi valoarea elementului 8 din vectorul b. AfiçaÆi valoarea elementului 8 din matricea

a. AfiçaÆi valoarea elementului din linia 2 çi coloana 3 din matricea a.5. AfiçaÆi numårul de ordine al elementului din linia 2 çi coloana 3 a matricei a.6. AfiçaÆi din matricea a valoarea elementului care are numårul de ordine al elementului

din linia 2 çi coloana 3 a matricei a.7. MemoraÆi în variabila ak1 numårul de linii ale matricei a. MemoraÆi în variabila ak2

numårul de coloane ale matricei a. MemoraÆi în variabila al numårul de elemente alematricei a. MemoraÆi în variabila bl numårul de elemente ale matricei b.

8. Folosind variabilele de memorie definite anterior, afiçaÆi pe ecran urmåtorul text(prezentaÆi cele trei variante):

Tabloul are <n> linii çi <m> coloane9. TransformaÆi matricea a într-un vector cu 10 elemente. AfiçaÆi conÆinutul acestui vector.10. TransformaÆi vectorul a într-o matrice cu 2 linii çi 4 coloane. AfiçaÆi conÆinutul matricei.11. ComparaÆi numårul de linii ale matricei a cu variabila de memorie ak1. ComparaÆi

numårul de coloane ale matricei a cu variabila de memorie ak2. ComparaÆi numårul deelemente ale matricei a cu variabila de memorie al.

Page 177: SGBD Visual Foxpro

Utilizarea unor instrumente de prelucrare a datelor 177

12. TransformaÆi matricea a într-o matrice cu 2 linii çi 5 coloane. AfiçaÆi conÆinutul matricei.13. ComparaÆi numårul de linii ale matricei a cu variabila de memorie ak1. ComparaÆi

numårul de coloane ale matricei a cu variabila de memorie ak2. ComparaÆi numårul deelemente ale matricei a cu variabila de memorie al.

14. AfiçaÆi valoarea elementului 9 din matricea a. AfiçaÆi valoarea elementului 10 dinmatricea a.

15. TransformaÆi matricea a într-un vector cu 10 elemente.16. RefaceÆi datele din matricea iniÆialå a.17. SortaÆi descrescåtor vectorul a. AfiçaÆi conÆinutul vectorului sortat.18. TransformaÆi vectorul a într-o matrice cu 2 linii çi 4 coloane. AfiçaÆi conÆinutul matricei.19. SortaÆi creascåtor matricea a dupå coloana 3 începând cu prima linie. AfiçaÆi conÆinutul

acestei matrice.20. TransformaÆi matricea a într-un vector cu 10 elemente. AfiçaÆi conÆinutul acestui vector.21. SortaÆi crescåtor vectorul a. AfiçaÆi conÆinutul acestui vector.22. CreaÆi printr-o singurå comandå structura vectorului c cu 5 elemente çi a vectorului d

cu 2 elemente.23. Folosind datele din matricea a, atribuiÆi elementelor din vectorul c valorile 6, 7, ..., 10,

iar elementelor din vectorul d valorile 3 çi 8. AfiçaÆi conÆinutul celor doi vectori.24. TransformaÆi vectorul a într-o matrice cu 3 linii çi 5 coloane. AfiçaÆi conÆinutul matricei.25. ÇtergeÆi linia 2 a matricei a. TransformaÆi matricea a într-o matrice cu 2 linii çi 5 coloane.

AfiçaÆi conÆinutul acestei matrice.26. TransformaÆi matricea a într-o matrice cu 2 linii çi 6 coloane. AfiçaÆi conÆinutul acestei

matrice. InseraÆi o coloanå vidå în coloana 3. AfiçaÆi conÆinutul acestei matrice.27. TransformaÆi matricea a într-o matrice cu 2 linii çi 5 coloane. RefaceÆi matricea iniÆialå a.

AfiçaÆi conÆinutul matricei. InseraÆi o coloanå vidå în coloana 3. AfiçaÆi conÆinutul matricei.28. ÇtergeÆi coloana 3 din matricea a. AfiçaÆi conÆinutul matricei a.29. CåutaÆi valoarea 6 în matricea a. CåutaÆi valoarea 8 în vectorul c.30. RefaceÆi matricea iniÆialå a. CåutaÆi valoarea 6 în matricea a.31. CreaÆi structura a doi vectori cu 5 elemente: a1 çi a2.32. CopiaÆi în vectorul a1 prima linie din matricea a.33. CopiaÆi în vectorul a2 a doua linie din matricea a.34. AfisaÆi printr-o singurå comandå conÆinutul vectorilor a1 çi a2 çi al matricei a.35. SalvaÆi vectorii a1 çi a2 çi matricea a în fiçierul fa.36. ÇtergeÆi din memoria internå vectorii a1 çi a2 çi matricea a.37. AfiçaÆi conÆinutul vectorilor a1 çi a2 çi al matricei a.38. RefaceÆi în memoria internå vectorii a1 çi a2 çi matricea a prin preluare din fiçierul fa.39. AfiçaÆi conÆinutul vectorilor a1 çi a2 çi al matricei a.40. ÇtergeÆi conÆinutul memoriei interne.41. DeschideÆi tabelul Incasari din baza de date Compania. PåstraÆi în variabila x numårul

de înregistråri din tabel.42. CopiaÆi din acest tabel, într-un tablou de memorie cu trei coloane, câmpurile nr_i,

id_cont, valoare. VizualizaÆi datele din tabloul de memorie.43. SortaÆi acest tabel dupå valoarea câmpului valoare. VizualizaÆi datele sortate.44. AdåugaÆi aceste date la sfârçitul tabelului. VizualizaÆi datele adåugate.45. ÇtergeÆi datele adåugate. ÎnchideÆi tabelul çi baza de

date. EliberaÆi memoria internå.

Page 178: SGBD Visual Foxpro

178 Informatică

ÎncercaÆi:Adevårat/Fals:1. În Visual FoxPro tablourile de memorie sunt omogene.2. Un element al unei matrice Visual FoxPro poate fi identificat dupå numårul såu de ordine.3. Dacå transformaÆi un vector într-o matrice, datele se pierd.4. În Visual FoxPro se pot defini tablouri de memorie cu trei dimensiuni.5. Înregistrarea în memoria internå a elementelor unei matrice se face linie dupå linie.

CompletaÆi:1. Structura tabelului activ se poate salva într-o matrice folosind funcÆia ................2. FuncÆia alen(a,2) furnizeazå ............................... ale matricei a.3. Prin comanda de definire a structurii unui tablou de memorie elementele sunt

iniÆializate cu valoarea ..........4. Pentru a çterge a doua coloanå dintr-o matrice a folosiÆi funcÆia ....................

AlegeÆi råspunsul corect:1. Pentru copierea elementelor unui tablou de memorie într-un alt tablou de memorie folosiÆi: a) funcÆia acopy() b) comanda copy to array c) comanda append from array2. Într-o matrice Visual FoxPro se pot ordona:

a) elementele b) liniile c) coloanele3. Elementul inserat într-un vector va avea valoarea:

a) .T. b) .F. c) NULL pentru acel tip de datå4. Pentru a cåuta un element al tabloului de memorie care are o valoare precizatå, folosiÆi

funcÆia:a) afind() b) afilds() c) ascan()

5. PuteÆi încårca într-un vector câmpurile din înregistrarea curentå a tabelului activ cuajutorul comenzii:a) restore from b) copy to array c) scatter

6. PuteÆi încårca în câmpurile din înregistrarea curentå a tabelului activ datele din elemen-tele unui vector folosind comanda:a) save to b) gather c) append from array

RåspundeÆi:1. CaracterizaÆi structura de date de tip tablou de memorie din Visual FoxPro.2. Ce operaÆii se pot executa cu tablourile de memorie?3. Ce operaÆii de transfer se pot executa între datele din memoria internå çi datele din

memoria externå.

RR åspunsuri:Adevårat/Fals: 1-F; 2-A; 3-F; 4-F; 5-A.CompletaÆi: 1-afields(); 2-numårul de coloane; 3-.F.; 4- adel(a,2,2).AlegeÆi råspunsul corect: 1) a; 2) b; 3) b;4) c;5) b,c; 6) b.

Page 179: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare

şi abstractizare a prelucrării datelor

AÆi învåÆat så folosiÆi interfaÆa unui sistem de ges-tiune a bazelor de date pentru a crea çi a întreÆineo bazå de date.Pentru exploatarea unei baze de date, utilizatorulnu interacÆioneazå direct cu baza de date sau cusistemul de gestiune al bazei de date, ci cu unsoftware de aplicaÆie. Rolul acestuia este de aprezenta informaÆiile din baza de date într-o formåçi în termeni accesibili utilizatorului. UtilizatorulinteracÆioneazå cu aplicaÆia prin intermediul inter-feÆei. Açadar, partea vizibilå a oricårei aplicaÆiicu care interacÆioneazå utilizatorul este inter-faÆa. Din punctul de vedere al utilizatorului, apli-caÆia înseamnå de fapt interfaÆa ei. Pentru el nuconteazå instrucÆiunile care se gåsesc în spatele

ei çi nici efortul consumat de programator pentru a scrie çi a optimiza codul programului.Pentru utilizator conteazå modul în care exploateazå aplicaÆia, adicå interfaÆa çiinformaÆiile pe care le obÆine prin intermediul acestei interfeÆe.

Pentru crearea unei aplicaÆii, sistemul de gestiune a bazelor de date Visual FoxPro punela dispoziÆia programatorului douå metode de programare:

Programarea clasicå în care rezolvarea unei probleme se face cu ajutorul algoritmilordescriçi prin cele trei structuri de control: structura secvenÆialå, structura alternativå çistructura repetitivå. Ea este orientatå pe prelucrarea datelor. Folosind aceaståmetodå, programatorul trebuie så construiascå un program care este format dinansamblul de date çi algoritmul folosit pentru descrierea problemei. Algoritmul esteimplementat în calculator cu ajutorul instrucÆiunilor puse la dispoziÆie de limbajul deprogramare.

Dupå ce veÆi parcurge acest capitoltrebuie så çtiÆi:

1. Cum puteÆi crea o aplicaÆie VisualFoxPro.

2. Cum puteÆi modulariza aplicaÆia.3. Cum puteÆi dezvolta o aplicaÆie

folosind elementele programåriiclasice.

4. Ce metode puteÆi folosi pentruconstruirea interfeÆei unei aplicaÆii.

5. Cum puteÆi construi interfaÆa uneiaplicaÆii folosind programareaorientatå pe obiecte.

6. Cum puteÆi construi interfaÆa apli-caÆiei cu ajutorul obiectelor vizuale.

Capitolul 3

Page 180: SGBD Visual Foxpro

Informatică180

Programarea orientatå pe obiecte în care rezolvarea problemei se face cu ajutorulobiectelor. Ea este orientatå pe definirea obiectelor. Folosind aceastå metodå, pro-gramatorul trebuie så construiascå obiecte care sunt formate din date çi procedurilecare prelucreazå aceste date.

Aceeaçi problemå poate fi rezolvatå cu oricare dintre cele douå metode. Metodaprogramårii pe obiecte are înså urmåtoarele avantaje: permite un control mai bun alprogramelor (în special al programelor de dimensiuni mari) çi permite o mai uçoarådezvoltare a programelor. În schimb, programarea clasicå asigurå compatibilitatea cuprogramele scrise ca aplicaÆii pentru versiunile anterioare ale sistemului de gestiune abazelor de date FoxPro.

Pe lângå cele douå metode de programare Visual FoxPro pune la dispoziÆia utilizatoruluiinstrumente vizuale pe care le poate folosi pentru a realiza interfaÆa aplicaÆiei.

AplicaÆia Visual FoxPro cuprinde, pe lângå fiçierele surså sau cu module obiect aleprogramelor çi ale bibliotecilor de subprograme, çi alte fiçiere care concurå la realizareainterfeÆei çi la obÆinearea informaÆiilor, cum sunt de exemplu fiçierele cu formularelefolosite pentru introducerea datelor, fiçierele pentru formatul rapoartelor, fiçierele pentruinterogåri etc. Toate aceste elemente necesare la realizarea unei aplicaÆii pot fi organi-zate într-un proiect care så permitå o mai bunå gestionarea a lor din punct de vedere alprogramatorului. Pentru a proteja aceste elemente împotriva unor modificåri neautorizate,proiectul poate genera un fiçier executabil independent de mediul Visual FoxPro.

1. Elemente de programare clasică structurată

1.1. Declararea datelorAtunci când aÆi folosit un limbaj clasic de programare structuratå aÆi våzut cå programulconÆine o secÆiune declarativå, în care trebuie definite datele elementare çi structurile dedate folosite de algoritmul care rezolvå problema. În aceastå secÆiune datele se definescprin precizarea identificatorului çi a tipului datei. Aceastå secÆiune declarativå trebuie såpreceadå secÆiunea de instrucÆiuni care descriu algoritmul, deoarece în faza de compilarese alocå fiecårei date, în funcÆie de tip, zona de memorie corespunzåtoare. Programulscris în limbajul gazdå FoxPro nu conÆine o secÆiune declarativå în care så fie definitedatele care vor fi folosite de instrucÆiunile programului. Variabilele de memorie çitablourile de memorie pot fi definite oriunde în interiorul programului astfel:

variabilele de memorie simple (corespunzând datelor elementare) se creeazå prinatribuirea unei valori unui identificator, tipul valorii atribuite determinând tipul datei.tablourile de memorie se creeazå cu comanda dimension sau declare.

De exemplu, urmåtoarele comenzi creeazå (çi implicit definesc) variabile de memorie detip numeric prin atribuirea de valori numerice unui identificator:a=100 {atribuie variabilei de memorie a valorea 100}store 1000 to b {atribuie variabilei de memorie b valorea 1000}input 'n= ' to n {atribuie variabilei de memorie n valorea introduså de la tastaturå}

Page 181: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 181

sum camp1 to c {atribuie variabilei de memorie c valorea obÆinutå prin însumarea valorilor din câmpul numeric camp1 al tabelului activ}count to d {atribuie variabilei de memorie d valorea obÆinutå prin numårarea înregistrårilor din tabelul activ}

Pe parcursul unui program, acelaçi identificator de datå poate så defineascå tipuri diferitede date. De exemplu, în acelaçi program se pot întâlni comenzile:store 0 to a {se creeazå variabila de memorie a de tip numeric prin atribuirea........................... unei valori numerice}a=date() {se creeazå variabila de memorie a de tip datå calendaristicå prin........................... atribuirea valorii unei funcÆii de tip datå calendaristicå}accept 'a=' to a {se creeazå variabila de memorie a de tip çir de caractere prin atribuirea çirului de caractere introdus de la tastaturå}

În general, pentru marea majoritate a comenzilor nu este necesar ca variabilele de me-morie så fie definite anterior comenzii (de exemplu comenzile de atribuire sau comenzilecare permit redirectarea unor valori de pe ecran într-o variabilå de memorie folosindclauza to: accept, input, sum, count etc. creeazå ele însele variabila de memorie).

1.2. Structuri de controlÇtiÆi deja cå un program reprezintå o succesiune de comennzi de operaÆii numite instruc-Æiuni, care trebuie så rezolve o anumitå problemå, descriind un anumit algoritm. Structurade control a algoritmului defineçte ordinea de executare a paçilor, adicå ordinea în careun pas predå controlul altui pas çi prin care se determinå fluxul controlului. În general,instrucÆiunile unui program se executå în ordinea în care apar scrise în programul surså,dar uneori este necesar så se schimbe aceastå ordine cu ajutorul unor instrucÆiuni decontrol. Atunci când aÆi studiat un limbaj de programare clasic aÆi våzut cå pentru adescrie un algoritm este suficient så folosiÆi trei tipuri de structuri de control:

structura liniarå,structura alternativå,structura repetitivå.

Limbajul gazdå Visual FoxPro (ca çi limbajele gazdå din versiunile anterioare FoxPro)poate fi folosit la fel ca orice limbaj de programare structuratå. La construirea unuiprogram, comenzile studiate anterior pot fi folosite ca instrucÆiuni, iar pentru schimbareaordinii secvenÆiale de execuÆie se pot folosi instrucÆiuni de control. Programul sursådevine astfel o colecÆie de comenzi çi instrucÆiuni de control scrise în ordinea în caretrebuie så fie executate. InstrucÆiunile de control sunt instrucÆiuni bloc deoarece conÆinmai multe instrucÆiuni. De aceea ele trebuie delimitate de cuvinte cheie care marcheazåînceputul çi sfârçitul structurii de control. InstrucÆiunile nu pot fi folosite în modul comandå.

Compilatorul FoxPro trebuie så poatå identifica fiecare instrucÆiune a programului surså.El considerå ca separator între instrucÆiuni codul ASCII generat la acÆionarea tastei enter.Se numeçte EOL (End Of Line) çi este format din douå coduri ASCII:

EOL = LF (Line Feed = salt la linia urmåtoare) +CR (Carriage Return = retur la începutul liniei) = 0DH + 0AH

Page 182: SGBD Visual Foxpro

Informatică182

Din aceastå cauzå, în fereastra de editare fiecare comandå se va scrie pe câte un rând:

Dacå doriÆi så scrieÆi o comandå pe mai multe rânduri, pentru a aråta cå ea continuå perândul urmåtor, la sfârçitul liniei, înainte de a acÆiona tasta enter scrieÆi caracterul punct çivirgulå ( ; ), astfel:

InstrucÆiunile de control implementate în limbajul gazdå FoxPro sunt:

ObservaÆii:1. Spre deosebire de limbajele clasice de programare, în limbajul gazdå FoxPro este imple-

mentatå o structurå repetitivå specificå acestui gen de aplicaÆie (scan ... endscan), carefaciliteazå scrierea unui program ce exploateazå secvenÆial un tabel al bazei de date.

structura alternativåsimplå

generalizatå

if ... endif

do case ... endcase

structura repetitivå

cu numårcunoscut de paçi

cu numår necunoscutde paçi, condiÆionatå

anterior

for ... endfor

do while ... enddo

pentru parcurgereaînregistrårilor dintr-un

tabelscan ... endscan

<verb1> <listå_adverbe_1> enter<verb2> <listå_adverbe_2> enter

instrucÆiune.......................................................

<verb> < adverb_1> ; enter < adverb_2> ; enter < adverb_3> enter

sfârçit de comandåAtenÆie: urmåtoarele linii ale comenzii nuse scriu din prima coloanå.

Page 183: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 183

2. Nu este implementatå structura repetitivå cu numår necunoscut de paçi condiÆionatåposterior (de tip repeat ... until).

1.2.1. Structura liniarå sau secvenÆialåStructura liniarå sau secvenÆialå este structura în care comenzile se executå în ordinea încare au fost scrise.ComentariileSunt çiruri de caractere inserate în program care nu reprezintå comenzi executate desistem. Ele se folosesc pentru a uçura urmårirea logicii unui program. Se pot folosi douåtipuri de comentarii:

Linia de comentariu. Este un text care se scrie pe o linie sau mai multe linii. Pentru anu fi interpretatå de cåtre sistem ca instrucÆiune, textul este precedat de caracterul **sau de cuvântul cheie note . La fel ca çi la o comandå, pentru a aråta cå ea continuåçi pe rândul urmåtor scrieÆi la sfârçitul liniei de comentarii caracterul ;.Comentariu inserat în comandå. Este un text care se scrie pe aceeaçi linie cu comanda,dar la sfârçitul ei. Pentru a nu fi interpretatå de cåtre sistem ca adverb al comenzii, textuleste precedat de caracterele && . Comentariul poate fi continuat pe rândul urmåtor dacåscrieÆi la sfârçitul liniei caracterul ;. Nu adåugaÆi comentarii la sfârçitul unei linii de comandåcare se continuå pe rândul urmåtor. De exemplu, nu veÆi scrie pe un rând input 'x= ' to ; &&Se introduce x iar pe rândul urmåtor continuaÆi comanda scriind x.

ExempluSå se genereze aleator un numår cu valoarea cuprinså între douå numere precizate, acåror valoare se introduce de la tastaturå:

note Programul este un exemplu pentru modul in care pot fi; folosite comentariileset talk offclear && Se sterge ecranulstore 0 to x,y && Nu este obligatoriu sa se initializeze;

aceste variabile de memorie? 'Programul va furnizeaza un numar aleator intre x si y'? 'Numerele x si y pot lua orice valoare între 0 si 999'* Se introduc de la tastatura valorile pentru x si yinput 'x= ' to xinput 'y= ' to ynote Se initializeaza generatorul de numere aleatoare=rand(-1) && Comanda = evalueaza una sau mai multe expresii preci-;

zate printr-o lista scrisa în dreapta caracterului =; în exemplu se evalueaza functia rand(-1))

z=x+(y-x)*rand() && se calculeaza valoarea z (numar aleator)? 'Numarul este: '+str(z,8,4)wait 'Actionati orice tasta pentru continuare'clearreturn

Page 184: SGBD Visual Foxpro

Informatică184

1.2.2. Structura alternativåPrin aceastå structurå se executå condiÆionat o anumitå secvenÆå de instrucÆiuni, înfuncÆie de valoarea unei condiÆii logice. Limbajul gazdå FoxPro permite folosirea a douåtipuri de structuri alternative:

a. Structura alternativå simplå

Structura alternativå simplå permite executarea unei acÆiuni (descriså printr-o secvenÆåde instrucÆiuni: <secvenÆå-instrucÆiuni-1> sau <secvenÆå-instrucÆiuni-2>) din douå acÆiuniposibile, în funcÆie de valoarea unei condiÆii exprimate printr-o expresie logicå (<expL>):

if <expL><secvenÆå-instrucÆiuni-1>

else<secvenÆå-instrucÆiuni-2>

endifObservaÆii:

1. Cuvintele cheie if çi endif delimiteazå structura, iar cuvântul else marcheazå începutul sec-venÆei de instrucÆiuni care descrie activitatea ce se executå dacå expresia logicå are valoa-rea „fals”.

2. Cuvântul cheie if împreunå cu condiÆia çi cuvintele cheie else çi endif se scriu fiecare pecâte un rând.

3. Sunt permise structuri if ... endif imbricate. Dacå sunt mai multe structuri alternativesimple imbricate, else se referå la primul if care îl precede.

4. Se pot construi çi structuri alternative simple cu o ramurå vidå.

ExempluSå se scrie un program pentru rezolvarea ecuaÆiei de gradul I cu coeficienÆi numerereale. CoeficienÆii a çi b se introduc de la tastaturå.

Metoda 1set talk offclearstore 0 to a,b? 'Programul va furnizeaza; solutia ecuatiei de gradul I'? 'de forma a*x+b=0'input 'a= ' to ainput 'b= ' to bif a=0

if b=0? 'Ecuatia are o infinitate;

de solutii'

else ? 'Ecuatia este imposibila'

endif else

x=-b/a? 'x= ',x

endifwait 'Actionati orice tasta; pentru continuare'clearreturn

Metoda 2 (care foloseçte structuri if...endif imbricate)

set talk offclearstore 0 to a,b

? 'Programul va furnizeaza;solutia ecuatiei de gradul I'

? 'de forma a*x+b=0'

Page 185: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 185

input 'a= ' to ainput 'b= ' to bif a=0 and b=0 ? 'Ecuatia are o infinitate; de solutii'else

if a=0 and b<>0? 'Ecuatia este imposibila'

else

x=-b/a? 'x= ',x

endifendifwait 'Actionati orice tasta; pentru continuare'clearreturn

Metoda 3 (care foloseçte funcÆia iif())set talk offclearstore 0 to a,b? 'Programul va furnizeaza solu-; tia ecuatiei de gradul I'? 'de forma a*x+b=0'input 'a= ' to ainput 'b= ' to b

? iif(a<>0, -b/a,iif(b<>0, 'Ecuatia este imposibila',; 'Ecuatia are o infinitate de; solutii'))wait 'Actionati orice tasta; pentru continuare'clearreturn

b. Structura alternativå generalizatå

Structura alternativå generalizatå permite executarea unei singure acÆiuni din mai multeacÆiuni posibile (descrise prin secvenÆele de instrucÆiuni: <secvenÆå-instrucÆiuni-1>,<secvenÆå-instrucÆiuni-2>, ..., <secvenÆå-instrucÆiuni-n+1>). Stabilirea acÆiunii care urmea-zå så se execute se face în urma evaluårii unei condiÆii care poate lua mai multe valoriexprimate prin expresiile logice (<expL1>, <expL2>, ..., <expLN>):

do case case <expL1>

<secvenÆå-instrucÆiuni-1> case <expL2>

<secvenÆå-instrucÆiuni-2> .............................................. case <expLi>

<secvenÆå-instrucÆiuni-i> ............................................. case <expLn>

<secvenÆå-instrucÆiuni-n> [otherwise

<secvenÆå-instrucÆiuni-n+1>]endcase

ObservaÆii:1. Cuvintele cheie do case çi endcase delimiteazå structura, iar cuvintele cheie case mar-

cheazå începutul unui caz care urmeazå så fie tratat (condiÆia logicå ce trebuie evaluatåçi secvenÆa de instrucÆiuni care descrie activitatea ce se va executa atunci când condiÆialogicå are valoarea „adevårat”). Cuvântul cheie otherwise împreunå cu secvenÆa de in-strucÆiuni <secvenÆå-instrucÆiuni-n+1> sunt opÆionale çi reprezintå acÆiunea care se va

Page 186: SGBD Visual Foxpro

Informatică186

executa atunci când nici una dintre expresiile logice din cazurile prezentate nu au avutvaloarea „adevårat”.

2. Cuvântul cheie case împreunå cu condiÆia çi cuvintele cheie do case, otherwise çiendcase se scriu fiecare pe câte un rând.

3. Se acceptå într-o structurå do case ... endcase structuri alternative sau structuri repetitivecu condiÆia ca aceste structuri så fie incluse complet în interiorul unui case sau otherwise.

4. Structura alternativå generalizatå do case ... endcase poate fi echivalatå cu mai multestructuri alternative simple if ... endif imbricate:

if <expL1> <secvenÆa-instrucÆiuni-1> else if <expL2> <secvenÆa-instrucÆiuni-2> else if <expLn> <secvenÆa-instrucÆiuni-1> else ...................................... if <expLn> <secvenÆa-instrucÆiuni-n> else <secvenÆa-instrucÆiuni-n> endif ......................................

endifendif

endif

Mod de executare a instrucÆiunii:

1. Se evalueazå pe rând expresiile logice <expL1>, <expL2>, <expL3>, ... çi <expLn>.Când se întâlneçte prima expresie care are valoarea „adevårat”, se executå secvenÆade instrucÆiuni cuprinså între condiÆia logicå çi apariÆia unuia dintre cuvintele cheie case,otherwise sau endcase.

2. Dupå ce s-a întâlnit un caz adevårat çi s-au executat instrucÆiunile corespunzåtoarecazului, celelalte cazuri nu vor mai fi tratate çi se va trece la executarea primei instrucÆiuniaflate dupå cuvântul cheie endcase.

3. Dacå nici una dintre expresiile logice evaluate nu a avut valoarea „adevårat”, se executåsecvenÆa de instrucÆiuni delimitatå de cuvintele cheie otherwise çi endcase, dacå existåsau, în caz contrar, prima instrucÆiune aflatå dupå cuvântul cheie endcase.

Recomandare:

Se recomandå folosirea instrucÆiunii do case ... endcase în locul instrucÆiunii if ... endifîn urmåtoarele cazuri:1. Din mai multe cazuri unul singur poate fi adevårat.2. Din mai multe condiÆii numai prima gåsitå adevåratå trebuie executatå.3. Existå un numår mic de excepÆii la o anumitå condiÆie. În acest caz excepÆiile vor fi puse

în evidenÆå prin case <expL>, iar situaÆia obiçnuitå prin otherwise.

Page 187: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 187

ExempluSå se scrie un program pentru rezolvarea ecuaÆiei de gradul I folosind structura repetitivågeneralizatå pornind de la metoda folosirii structurilor alternative simple imbricate:set talk offclear? 'Programul va furnizeaza;

solutia ecuatiei de gradul I'? 'de forma a*x+b=0'input 'a= ' to ainput 'b= ' to bdo case case a=0 and b=0 ? 'Ecuatia are o infinitate; de solutii'

case a=0 and b<>0 ? 'Ecuatia este imposibila'otherwisex=-b/a? 'x= ',x

endcasewait 'Actionati orice tasta; pentru continuare'clearreturn

1.2.3. Structura repetitivåPrin aceastå structurå se executå repetat o acÆiune (exprimatå printr-o secvenÆå de in-strucÆiuni - <secvenÆå-instrucÆiuni>) atât timp cât este îndeplinitå o condiÆie pentru execu-Æia repetatå. Toate structurile repetitive acceptå încorpul lor (secvenÆa de instrucÆiuni care se executårepetat) instrucÆiunile loop çi exit:

Loop - forÆeazå reevaluarea condiÆiei determinare a structurii repetitive printr-un salt laînceputul structurii (în cazul unei structuri repetitivecu numår cunoscut de paçi, înainte de evaluareacondiÆiei produce çi incrementarea contorului).

Exit - forÆeazå abandonarea structurii repetitiveindiferent de rezultatul evaluårii condiÆiei determinare printr-un salt la prima instrucÆiune careurmeazå dupå terminarea structurii repetitive.

InstrucÆiunile loop çi exit se vor folosi într-o structuråalternativå din interiorul structurii repetitive.

În limbajul FoxPro sunt implementate urmåtoareletipuri de structuri repetitive:

a. Structura repetitivå cu numår cunoscut de paçi

Permite executarea repetatå a unei secvenÆe de instrucÆiuni de un numår specificat deori. Pentru a numåra de câte ori s-a executat secvenÆa de instruc-Æiuni se foloseçtevariabila de memorie <contor> care va avea valoarea iniÆialå precizatå prin <expN1> laînceperea executårii repetate a secvenÆei de instrucÆiuni. Aceastå variabilå va trebui såaibå valoarea precizatå prin <expN2> pentru a se termina executarea repetatå asecvenÆei de instrucÆiuni. Dupå fiecare executare a secvenÆei de instrucÆiuni, variabilacontor este incrementatå implicit cu valoarea 1 sau, dacå se precizeazå clauza step, cuvaloarea <expN3>. Sintaxa instrucÆiunii este:

<contor>=<contor>+<expN3>

<secvenÆå-instrucÆiuni>

.T.

.F.<contor><= <expN2>

endfor

contor:=<expN1>for

to

step

Page 188: SGBD Visual Foxpro

Informatică188

for <contor>=<expN1> to <expN2> [step <expN3>]<secvenÆå-instrucÆiuni>

endfor | next

ObservaÆie:1. Cuvântul cheie for marcheazå începutul structurii, iar cuvântul cheie endfor (sau cuvân-

tul cheie next) marcheazå sfârçitul structurii. Cuvintele cheie for çi to delimiteazå opera-Æia de atribuire prin care se face iniÆializarea contorului, cuvântul to precede valoareafinalå a contorului, iar cuvântul step precede valorea cu care se incrementeazå contorul.

2. Cuvântul cheie for împreunå cu expresiile çi cuvintele cheie to çi step se scriu pe acelaçirând. Cuvântul cheie endfor, respectiv next se scrie pe un singur rând.

3. Variabila de memorie <contor> trebuie definitå înaintea structurii for ... endfor cavariabilå de tip numeric întreg printr-o operaÆie de atribuire.

Exemplu:Så se calculeze suma a n numere introduse de la tastaturå. Valoarea lui n se introducede la tastaturå.set talk offclearstore 0 to suma,i? 'Programul calculeaza suma a n;numere introduse de la tastatura'input 'n= ' to nfor i=1 to n input 'a= ' to a

suma=suma+aendfor? 'Suma = ', sumawait 'Actionati orice tasta; pentru continuare'clearreturn

b. Structura repetitivå cu numår necunoscut de paçi condiÆionatå anterior

Permite executarea repetatå a unei secvenÆe de instrucÆiuni atât timp cât o condiÆie expri-matå printr-o expresie logicå <expL> are valoarea „adevårat”. Sintaxa instrucÆiunii este:

do while <expL><secvenÆå-instrucÆiuni>

enddoObservaÆii:1. Cuvântul cheie while marcheazå începutul structurii iar

cuvântul cheie enddo sfârçitul ei.2. Cuvântul cheie while împreunå cu expresia logicå çi

cuvântul cheie enddo se scriu fiecare pe câte un rând.

Exemplu:Så se calculeze media aritmeticå a unor numere introdusede la tastaturå. Utilizatorul programului este întrebat defiecare datå dacå mai doreçte så introducå un numår.OperaÆia se terminå atunci când acesta råspunde cå nu maidoreçte continuarea operaÆiei de introducerea numerelor.

<expL>

iniÆializare

<secvenÆå-instrucÆiuni>.T.

.F.

do while

enddo

Page 189: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 189

set talk offclearstore 0 to suma,i? 'Programul calculeaza media aritmetica a numerelor '? 'introduse de la tastatura'accept 'Doriti sa introduceti primul numar? (d/n) ' to raspdo while .T.

do casecase rasp$'Dd'input 'a= ' to a

suma=suma+a i=i+1 accept 'Mai doriti sa introduceti un numar? (d/n) ' to rasp case rasp$'Nn' exit otherwise

? 'Ati raspuns gresit' accept 'Mai doriti sa introduceti un numar? (d/n) ' to rasp endcaseenddoif i<>0 media=suma/i ? 'Media = ', media

else ? 'Nu ati introdus nici un numar si nu se poate calcula media'endifwait 'Actionati orice tasta pentru continuare'clearreturnExemplu:În tabelul Sedinte din baza de date Compania så se numere çedinÆele care au avut ovaloare mai mare decât o valoare precizatå, care se va introduce de la tastaturå. Så seafiçeze numårul acestor çedinÆe çi ce procent reprezintå ele din totalul çedinÆelor.set talk offclearstore 0 to k? 'Programul evalueaza valoarea; sedintelor'input 'Introduceti valoarea de; referinta: ' to valopen database companiause sedintedo while .T.if eof()

exit endif if cost_s<val

skip loop

endifk=k+1skip

enddo? str(k,3)+' sedinte ' au o va-; loare mai mare de '+str(val,8)? 'si reprezinta '+;str(((k/reccount())*100),5,2);

+'% din total sedinte'wait 'Actionati orice tasta; pentru continuare'clearuseclose databasesreturn

Page 190: SGBD Visual Foxpro

Informatică190

c. Structura repetitivå pentru parcurgerea înregistrårilor dintr-un tabel

Permite parcurgerea secvenÆialå a înregistrårilor dintr-un tabel, excutând o secvenÆå deinstrucÆiuni. SecvenÆa de instrucÆiuni acÆioneazå implicit asupra tuturor înregistrårilor dintabel. Explicit, ea se poate executa condiÆionat numai asupra înregistrårilor care aparÆinunui domeniu precizat prin clauza <domeniu> sau numai asupra înregistrårilor careîndeplinesc condiÆia precizatå prin expresia logicå <expL1> respectiv <expL2> din clauzafor respectiv while. Sintaxa instrucÆiunii este:

scan [<domeniu>] [for <expL1>] [while <expL2>]<secvenÆå-instrucÆiuni>

endscanObservaÆie:

1. Cuvântul cheie scan marcheazå începutul structurii, iar cuvântul cheie endscan sfârçitulstructurii.

2. Cuvântul cheie scan (împreunå cu adverbele careprecizeazå înregistrårile ce vor fi prelucrate) çi cu-vântul cheie endscan se scriu fiecare pe câte un rând.

3. Forma implicitå a instrucÆiunii scan ... endscan esteechivalentå cu urmåtoarea instrucÆiune do while ...enddo:

goto topdo while not eof()

<secvenÆå-instrucÆiuni>skip

enddo4. Forma implicitå a instrucÆiunii scan ... endscan este

echivalentå cu urmåtoarea instrucÆiune for ... endfor:goto topfor i=1 to reccount()

<secvenÆå-instrucÆiuni>skip

endforExemplu:Så se afiçeze informaÆii despre çedinÆele Æinute de un angajat al firmei de consultanÆå.Identificatorul angaja-tului se introduce de la tastaturå.

set talk offclearstore 0 to tot_cost, tot_timp,k? 'Programul furnizeaza informatii despre sedintele de ; consultanta ale unui angajat'input 'Introduceti identificatorul angajatului: ' to codopen database companiause sedinte? 'Lista sedintelor angajatului '+str(cod,4)scan for id_ang=cod

? id_cont, data_s, timp_s, cost_s tot_cost=tot_cost+cost_s

not eof()

use <tabel>

<secvenÆå-instrucÆiuni>.T.

.F.

do while

enddo

skip

Page 191: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 191

tot_timp=tot_timp+timp_s k=k+1endscan? 'Total sedinte = '+str(k,3)? 'Total valoare sedinte = '+str(tot_cost,9)? 'Total timp sedinte = '+str(tot_timp,9)wait 'Actionati orice tasta pentru continuare'clearuseclose databases

1.3. Construirea programuluiPentru construirea çi lansarea în execuÆie a unui program Visual FoxPro se parcurg etapele:

1.3.1. Crearea programului sursåProgramul surså se scrie într-un fiçier de tip text cu ajutorul editorului de texte încorporat.Editorul de texte se activeazå cu comanda modify command (care creeazå un fiçier programsurså, cu extensia implicitå .prg) sau modify file (care creeazå un fiçier text, cu extensiaimplicitå .txt). Prin aceastå comandå se deschide fereastra de editare, în care se vor scriecomenzile çi instrucÆiunile programului. Fereastra editorului de texte poate fi deschiså cu ajutorulacestor comenzi fie din fereastra Command (folosind limbajul de comandå), fie din interiorulunui program (folosind una dintre aceste comenzi ca instrucÆiune într-un program surså).Sintaxa celor douå comenzi este:

modify command | modify file [<nume_fiçier> | <çablon> | ?] [noedit] [nowait][range <expN1>, <expN2>] [save]

[[window <nume_fereastrå_1>] [in [window] <nume_fereastrå_2> ]]

Forma implicitå a comenzii este modify command | modify file care deschide fereastra deeditare pentru a crea un fiçier de tip text al cårui nume se va comunica ulterior prin operaÆiaSave as çi care va avea extensia implicitå comenzii. Dacå veÆi comunica çi numele fiçieruluiprin adverbul <nume_fiçier>, în fereastra de editare se va încårca conÆinutul fiçierului pentru afi editat (la creare, conÆinutul fiçierului este vid). Çi în acest caz, comanda va avea în vederefiçierele care au extensia implicitå. Dacå vreÆi så încårcaÆi un fiçier cu o altå extensie, trebuieså precizaÆi çi extensia. Dacå nu cunoaçteÆi numele fiçierului, folosiÆi adverbul ? care vadeschide caseta de dialog Open prin intermediul cåreia puteÆi alege numele fiçierului. Pentrunumele fiçierului puteÆi folosi un çablon pentru nume de fiçiere (adverbul <çablon>). În acestcaz se vor deschide mai multe ferestre de editare çi în fiecare fereastrå va fi încårcat câte unfiçier care corespunde çablonului.

Implicit se pot face modificåri în text. Explicit textul poate fi numai vizualizat dacå sefoloseçte clauza noedit. Implicit în fereastra de editare este încårcat tot textul din fiçier,Explicit este încårcat numai textul cuprins între caracterele cu numårul de ordine precizatprin expresiile <expN1> çi <expN2> ale clauzei range.

Dacå se foloseçte comanda într-un program, implicit programul îçi întrerupe execuÆia,açteptând închiderea ferestrei de editare. Explicit, programul îçi poate continua execuÆiadacå se precizeazå clauza nowait. Implicit fereastra de editare se închide la påråsireaeditorului. Explicit ea råmâne deschiså dacå se precizeazå clauza save. Implicit, textul

Page 192: SGBD Visual Foxpro

Informatică192

poate fi încårcat în fereastra standard a editorului. Explicit aceastå fereastrå poate preluacaracteristicile ferestrei precizate prin clauza window <nume_fereastrå_1>. Fereastra deeditare este deschiså implicit pe ecran çi explicit într-o fereastrå pårinte precizatå princlauza in [window] <nume_fereastrå_2>.

1.3.2. Compilarea programului sursåProgramul surså poate fi compilat cu comanda compile ce pune în evidenÆå erorile desintaxå ale programului. În urma compilårii se obÆine un fiçier cu extensia .fxp careconÆine codul obiect al programului. Comanda are sintaxa:

compile <nume_fiçier> | <çablon> [encrypt] [nodebug]

Comanda poate acÆiona asupra unui singur fiçier surså precizat prin adverbul <nume_fiçier>sau asupra unui grup de fiçiere surså care poate fi identificat prin adverbul <çablon>. Implicitcodul obÆinut în urma compilårii nu este cifrat. Explicit el poate fi cifrat dacå se precizeazå clauzaencrypte. Implicit se genereazå un cod care permite vizualizarea execuÆiei programului înfereastra trace. Pentru a micçora dimensiunea acestui cod la 2 octeÆi pentru fiecare linie sursåse poate folosi clauza nodebug. În acest caz nu se va mai putea folosi fereastra trace.Controlul compilåriiPuteÆi controla compilarea folosind urmåtoarele comenzi çi funcÆii:

PuteÆi salva mesajele de eroare obÆinute în urma compilårii într-un fiçier de textecu acelaçi nume ca çi fiçierul surså çi cu extensia .err. Aceastå facilitate estecontrolatå de parametrul logerrors care trebuie så aibå valoarea on. Valoareaparametrului poate fi stabilitå cu comanda set logerrors care are sintaxa:

set logerrors on | offPuteÆi construi capcane pentru erori. O capcanå pentru erori opreçte execuÆiaprogramului atunci când apare o eroare çi då controlul unei subrutine (subprogramsau program). Activarea çi dezactivarea subrutinei se face cu comanda on errorrcare are sintaxa:

on error <comandå>pentru activarea rutinei çi

on errorpentru dezactivarea ei. Adverbul <comandå> este o comandå de apel a unui subpro-gram: do <nume_program>. Subprogramul poate fi scris în fiçierul surså al progra-mului (ca procedurå) sau într-un fiçier separat. Dupå executarea subrutinei, programulva fi reluat cu instrucÆiunea imediat urmåtoare dupå cea în care a apårut eroarea. Încadrul subrutinei de eroare pot fi obÆinute informaÆii despre eroare utilizând caparametri funcÆiile: error(), message(), lineno() çi program():

error() - furnizeazå numårul erorii detectate de capcana on error (rezultat numeric).

message() - furnizeazå mesajul de eroare (fårå parametru) sau conÆinutul linieicare a cauzat eroarea (dacå se foloseçte parametrul 1). Rezultatul este de tip çirde caractere.

lineno() - furnizeazå numårul relativ al liniei programului în curs de execuÆie(rezultat numeric). Se numårå toate liniile, inclusiv liniile de comentarii çi liniile vide.

Page 193: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 193

FuncÆia poate fi utilizatå pentru a crea puncte de întrerupre (breakpoints), adicåinstrucÆiuni la care så se opreascå execuÆia programului pentru a fi depanat. Eapermite oprirea programului la o linie specificatå prin numårul såu <expN>:lineno()=<expN>.

program() - furnizeazå numele programului în execuÆie sau al programului carese executa când a apårut eroarea. Rezultatul este de tip çir de caractere.

InformaÆiile furnizate de aceste funcÆii sunt utile pentru depanarea programului înfereastra debug.

1.3.3. Lansarea în execuÆie a programuluiPentru a produce rezultate programul trebuie încårcat în memoria internå çi lansat înexecuÆie cu comanda do care are sintaxa:

do <nume_fiçier_1> [ with <listå_parametri>] [in <nume_fiçier_2>]

Comanda lanseazå în execuÆie programulcare se aflå în fiçierul <nume_fiçier_1>.Acest fiçier poate så aibå extensia implicitå.prg (fiçier program surså FoxPro), .fxp (fi-çier cod obiect FoxPro), .exe (fiçier executa-bil) sau .app (fiçier de aplicaÆii FoxPro). Impli-cit se executå programul din acest fiçier careeste cåutat pe disc în directorul curent sau în directorul specificat în identificatorul fiçierului. Înacest caz directorul specificat devine director curent. Explicit, se executå procedura cu numele<nume_fiçier_1> care se gåseçte în fiçierul de programe <nume_fiçier_2> precizat în clauza in.

ObservaÆii:1. Dacå se doreçte execuÆia unui fiçier care conÆine comenzi pentru meniuri, formate de

ecran sau interogåri trebuie precizatå extensia fiçierului (.mpr, .spr, qpr).2. ExecuÆia unui program apelat prin comanda do se terminå atunci când se întâlneçte

una dintre urmåtoarele situaÆii:o comandå Return - care redå controlul unui alt modul.o comandå Cancel - care abandoneazå execuÆia programului çi redå controlulferestrei de comenzi (comanda elibereazå toate variabilele de memorie);o comandå Quit - care întrerupe execuÆia programului çi redå controlul sistemuluide operare.o comandå Do - care redå controlul modului apelat.sfârçitul fiçierului care conÆine programul (eof()=.T.)

1.4. Modularizarea aplicaţiilor AÆi învåÆat deja cå atunci când construiÆi o aplicaÆie este avantajos så o descompuneÆi însubprobleme. Aceastå operaÆie este necesarå deoarece:a O secvenÆå de instrucÆiuni se repetå de mai multe ori în cadrul unui program.

Folosind facilitatea de autodocumentare aflaÆiordinea în care comanda do alege programulpe care îl lanseazå în execuÆie în funcÆie de

extensia fiçierului în care este memorat.

!

Page 194: SGBD Visual Foxpro

Informatică194

b. O anumitå operaÆie este necesarå în mai multe programe, cum sunt de exempludiferite operaÆii matematice (extragerea radicalului, extragerea pårÆii întregi sau a pårÆiifracÆionare dintr-un numår real etc.), diferite operaÆii cu çiruri de caractere (extragereaunui subçir dintr-un çir, çtergerea unui subçir dintr-un çir, inserarea unui subçir într-unçir etc.), diferite operaÆii cu fiçiere (deschiderea unui fiçier, închiderea unui fiçier,testarea sfârçitului de fiçier etc.).

c. Pentru simplificare, orice problemå poate fi descompuså în subprobleme folo-sind tehnica top-down de proiectare a algoritmilor. Descompunerae poate continuapânå când se obÆin subprobleme cu rezolvare imediatå çi care sunt independenteunele de altele, astfel încât programele cu care vor fi descrise så fie uçor de conceputçi depanat, iar ulterior, când se schimbå unele cerinÆe, så fie uçor de dezvoltat.

În anii precedenÆi de studiu aÆi aflat cå subproblemele obÆinute pot fi descrise prin unitåÆide programe care se mai numesc çi module. AÆi mai învåÆat cå modulele se clasificåastfel:

Modul apelant. Este modulul carepentru rezolvarea propriei problemeapeleazå la alte module, fiecare din-tre ele rezolvând o anumitå subpro-blemå. La apelare, el transferå con-trolul modului apelat.Modul apelat. Este un modul la ca-re apeleazå un alt modul pentru a-irezolva o subproblemå. Dupå ce îçiterminå execuÆia, el redå controlul modulului apelant.

În Visual FoxPro, la fel ca çi în versiunile anterioare de FoxPro existå douå metode de adescompune o problemå în subprobleme (module):

ConstruiÆi modulele sub formå de programe independente. Fiecare program va fiscris într-un fiçier separat. Aceste programe se pot apela unele pe altele folosindcomanda do. Se obÆin astfel comenzi do imbricate. Comanda do acceptå 128 deniveluri de imbricare (32 de niveluri în variantele anterioare de FoxPro).ConstruiÆi modulele sub formå de subprograme, la fel ca çi în limbajele clasice deprogramare. Aceste subprograme pot fi grupate în biblioteci de subprograme.

1.4.1. Controlul execuÆiei modulelorFolosind comanda return puteÆi så controlaÆi modul în care redaÆi controlul altui modul.Comanda are sintaxa:

return [<exp> | to master | to <nume_program>]

Implicit controlul este redat modulului apelant. Explicit controlul poate fi redat modulului prin-cipal (nivel 0 pentru comanda do) dacå precizaÆi clauza to master, unui alt modul identificatprin <nume_program> dacå precizaÆi clauza to sau puteÆi returna cåtre modulul apelant ovaloare precizatå prin <exp> dacå modulul apelat este un subprogram de tip funcÆie.

Executarea unui modul poate fi controlatå prin comenzile Return , Cancel , Quit çi:

Modul apelatModul apelant Transfercontrol

Revenirecontrol

Page 195: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 195

Comanda Suspend - care suspendå (întrerupe) execuÆia unui program. În timpulsuspendårii execuÆiei se pot executa alte comenzi, se pot vizualiza variabile de memo-rie etc. Variabilele de memorie create în timpul suspendårii sunt variabile private(locale). Comanda este utilå în depanarea programelor. ExecuÆia programului poate fireluatå din punctul în care a fost întreruptå cu comanda resume.Comandå Resume - care reia execuÆia unui program suspendat începând cu liniacare a fost întreruptå (comenzile resume çi suspend lucreazå împreunå).Comandå Retry - care reexecutå comanda anterioarå. Ea redå controlul modululuiapelant çi este utilå în rutinele de tratare a erorilor sau în cazul în care se doreçteexecutarea reptatå a unei comenzi pânå când este îndeplinitå o condiÆie.

Pentru depanarea programelor (detectarea çi eliminarea erorilor) puteÆi urmåri procesulde execuÆie folosind ferestrele:

Trace. Permite urmårirea procesului de execuÆie a unui program sau a unui formular.ExecuÆia poate fi urmåritå çi pas cu pas.Debug. Permite testarea funcÆiilor, vizualizareavariabilelor de memorie în timpul execuÆiei unuimodul, verificarea expresiilor etc. Fereastra aredouå panouri: panoul din dreapta poate fi folositpentru a edita numele variabilelor de memorie çiexpresiile pe care le testaÆi în timpul execuÆieiprogramului, iar panoul din partea dreaptå pentru vizualizarea valorii lor.

La primele versiuni de Visual FoxPro ferestrele se deschid cu opÆiunea Trace Window,respectiv Debug Window din meniul Tools. DeschideÆi aceste ferestre înaintea comenziido cu care lansaÆi în execuÆie programul pe care vreÆi så-l testaÆi. În versiunile mai maride 4, în fereastra Debugger a aplicaÆiei (care poate fi deschiså cu opÆiunea Debuggerdin meniul Tools) pot fi deschise mai multe ferestre document care vå ajutå så urmåriÆimodul în care se executå programul: Trace - în care se afiçeazå instrucÆiunile progra-mului, Watch - în care sunt afiçate valorile variabilelor de memorie folosite de program,Locals - în care sunt afiçate valorile variabilelor de memorie locale folosite de subprogra-mul care se executå, Call Stack - stiva programelor în execuÆie (utilå în cazul unei apli-caÆii modularizate deoarece permite vizualizarea modului în care se apeleazå modulele).

Indiferent de versiunea de Visual FoxPro folositå, depanatorul de programe vå oferåurmåtoarele facilitåÆi:

Rularea pas cu pas (step over). ExecuÆia programului este suspendatå dupå execuÆiafiecårei instrucÆiuni permiÆând programatorului så observe modul în care s-a executat in-strucÆiunea. ExecuÆia urmåtoarei instrucÆiuni se face numai la cererea programatorului.Rularea cu vitezå încetinitå (throttle). ExecuÆia programului se face în mod continuu,dar dupå execuÆia fiecårei instrucÆiuni este introdus un timp de açteptare (a cårui valoareeste precizatå de programator). Acest mod de rulare a programului permite programa-torului så vizualizeze valorile unor variabile mai rapid decât în cazul rulårii pas cu pas.Rularea continuå pânå la intâlnirea unui punct de întrerupere (breackpoint). Exe-cuÆia programului se face în mod continuu pânå la întâlnirea unui punct de întrerupere,dupå care execuÆia poate fi reluatå (resume) sau anulatå (cancel). Punctele de întreru-pere sunt create de cåtre programator în interiorul programului prin precizarea urmå-

Folosind facilitatea de autodocumen-tare aflaÆi informaÆii despre modul în careputeÆi lucra cu ferestrele trace çi debug

pentru a vå depana programele.

!

Page 196: SGBD Visual Foxpro

Informatică196

toarelor situaÆii: execuÆia unei anumite linii din program (care creeazå puncte de între-rupere permanente), schimbarea valorii unei expresii, evaluarea unei expresii la o a-numitå valoare, terminarea execuÆiei unui anumit modul (step out) sau producereaunui anumit eveniment în timpul execuÆiei programului.

1.4.2. Domeniul de vizibilitate al identificatorilorDeoarece atât în modulul apelant, cât çi în modulul apelat sunt definiÆi mai mulÆi identi-ficatori pentru variabilele çi tablourile de memorie1, apare urmåtoarea problemå: careeste domeniul de vizibilitate al identificatorilor în funcÆie de locul çi modul în care suntdeclaraÆi? AÆi învåÆat deja cå domeniul de vizibilitate al unui identificator este regiu-nea din interiorul programului în care un identificator este vizibil (poate fi referit încadrul unei operaÆii de consultare sau modificare).

În Visual FoxPro în funcÆie de domeniul de vizibilitate, variabilele de memorie se clasificå în:Globale sau publice. Ele sunt vizibile atât în modulul în care au fost declarate, cât çiîn modulele activate de acesta, din momentul în care au fost declarate çi pânå cândmodulul îçi terminå execuÆia. Se recomandå folosirea lor atunci când unele date suntfolosite în comun de mai multe module ale aplicaÆiei. Declararea lor se face cuinstrucÆiunea Public care are urmåtoarea sintaxå:

public <listå_variabile_memorie>pentru variabilele de memorie çi

public [array] <nume_tablou_1>(<expN11>[,<expN12>])[<nume_tablou_2>(<expN21>[,<expN22>])] ...

pentru tablourile de memorie.Locale. Sunt vizibile numai în modulul în care au fost create. La terminarea execuÆieimodulului, ele vor fi distruse, eliberându-se zona de memorie pe care o ocupau.Folosirea lor este utilå pentru a se elimina confuziile care apar atunci când sefolosesc variabile cu acelaçi nume în douå module diferite. Ele pot fi create cuinstrucÆiunea Local care are urmåtoarea sintaxå:

local <listå_variabile_memorie>pentru variabilele de memorie çi

local [array] <nume_tablou_1>(<expN11>[,<expN12>])[<nume_tablou_2>(<expN21>[,<expN22>])] ...

pentru tablourile de memorie.Private. Sunt ascunse de modulele superioare. Se recomandå folosirea lor atuncicând doriÆi så memoraÆi în module diferite, valori diferite, folosind acelaçi identifica-tor. Ascunzând o variabilå sau un tablou de memorie, operaÆiile de modificare avalorilor executate în modulul curent nu vor fi percepute de modulele superioare.Declararea lor se face cu instrucÆiunea Private care are urmåtoarea sintaxå:

private <listå_variabile_memorie>

1 În continuare, se va folosi numai termenul variabile de memorie çi se va subînÆelege cå aceleoperaÆii se referå çi la tablouri de memorie.

Page 197: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 197

pentru un grup de variabile çi tablouri de memorie care nu poate fi descris cu ajuto-rul unui çablon çi

private all [like <çablon> | except <çablon>]pentru un grup de variabile çi tablouri de memorie care poate fi descris cu un çablon.Regionale. Sunt vizibile într-o anumitå regiune a modulului. Se recomandå folosi-realor atunci când doriÆi så memoraÆi în regiuni diferite ale modulului valori diferitefolosind acelaçi identificator. Pentru aceasta trebuie create mai întâi regiunilemodulului folosind directiva de compilare #Region astfel:

#region <numår_regiune>Se pot crea maxim 32 de regiuni numerotate de la 0 la 31. Dupå declararea regiuniise pot declara çi variabilele din acea regiune cu instrucÆiunea Regional care aresintaxa:

regional <listå_variabile_memorie>

ObservaÆii:1. InstrucÆiunile public, local çi regional creeazå variabile de memorie. O variabilå de

memorie trebuie declaratå globalå, localå respectiv regionalå înainte de a i se atribuivalori çi de a fi folositå în cadrul modulului.

2. Comanda private nu creeazå variabile de memorie; ea schimbå numai statutulvariabilelor de memorie precizate.

3. Variabilele çi tablourile de memorie create în fereastra de comenzi sunt publice.

1.4.3. Parametrii de comunicareDin experienÆa cåpåtatå prin studiul unui limbaj de programare structurat çtiÆi deja cåtransmiterea datelor între modulele unei aplicaÆii se face prin intermediul parametrilor decomunicare.

Parametrii de comunicare sunt variabile de memorie sau tablouri de memorie princare modulul apelant transmite datele de intrare cåtre modulul apelat çi prin care

primeçte rezultatele obÆinute în urma executårii acestuia.

Çi limbajul gazdå Visual FoxPro permite folosirea parametrilor de comunicare. Pentrutransmiterea datelor se pot folosi maxim 27 de parametri. Ei pot fi variabile de memorielocale sau globale. Transmiterea valorilor prin intermediul parametrilor se face astfel:

În modulul apelat, pentru fiecare parametru trebuie så se precizeze denumirea sim-bolicå folositå în interiorul modulului, adicå trebuie precizatå lista de parametri for-mali. Pentru declararea parametrilor formali veÆi folosi instrucÆiunea Parametersssau Lparameters care trebuie scriså ca primå instrucÆiune în modulul apelat. Deo-sebirea dintre cele douå instrucÆiuni constå în tipul de vizibilitate al variabilelor dememorie declarate ca parametri: cu lparameters variabilele de memorie vor filocale, iar cu parameters vor fi private. InstrucÆiunile au urmåtoarea sintaxå:

parameters | lparameters <listå_parametri_formali>La activarea modulului apelat parametrilor de comunicare li se atribuie valori concretecu care se va executa modulul la acel apel, adicå se comunicå lista de parametriactuali. Lista se comunicå prin clauza with <listå_ parametri_actuali> a comenzii do.

Page 198: SGBD Visual Foxpro

Informatică198

Atribuirea valorilor se face respectând regula de corespondenÆå. De aceea în celedouå liste de parametri trebuie så se respecte aceeaçi succesiune a parametrilor çiacelaçi tip de date pentru fiecare pereche de parametri. Se acceptå înså ca lista deparametri actuali så conÆinå mai puÆini parametri decât lista de parametri formali (dar numai mulÆi parametri). În acest caz, parametrii formali cårora nu li s-a atribuit o valoarefolosind regula de corespondnÆå vor fi iniÆializaÆi cu valoarea logicå .F..

PuteÆi afla numårul de parametri transmiçi unui modul folosind funcÆia parameters() .

1.4.4. Modul de transmitere al parametrilorCa çi în cazul limbajelor de programare structuratå studiate, pentru transmiterea datelorîntre module se pot folosi douå metode:

Transmiterea prin referinÆå . Valoarea transmiså este afectatå de eventualelemodificåri aduse în modulul apelat. La sfârçitul executårii modulului apelat, conÆinutulvariabilelor de memorie folosite ca parametri este trecut în variabilele de memoriedin modulul apelant.Transmiterea prin valoare . Valoarea transmiså nu este afectatå de eventualelemodificåri aduse în modulul apelat. La sfârçitul executårii modulului apelat, conÆinutulvariabilelor de memorie din modulul apelant, folosite ca parametri, nu este actualizatcu conÆinutul variabilelor de memorie din modulul apelat.

În cazul modulelor de tip program, transmiterea se face implicit prin referinÆå. Pentru aschimba modul de transmitere, numele parametrului trebuie scris între parantezerotunde: (<nume_parametru>).

1.4.5. SubprogrameleÇtiÆi deja cå din punct de vedere al valorilor returnate modulului apelant, subprogramelese clasificå în proceduri (care returneazå un rezultat, nici un rezultat sau mai multerezultate prin intermediul listei de parametri) çi funcÆii (care returneazå un singur rezultatprin numele såu). Tipul subprogramului determinå çi modul în care este activat (lansat înexecuÆie): procedura printr-o instrucÆiune de apel çi funcÆia în cadrul unei expresii undeeste folositå ca operand. Din punct de vedere al constructorului, subprogramele seclasificå în subprograme de sistem çi subprograme utilizator.

Limbajul gazdå Visual FoxPro permite lucrul cu:Proceduri utilizatorFuncÆii de sistem

utilizator (UDF - User Defined Functions)

Construirea unei proceduri sau a unei funcÆii utilizator se face astfel:

procedure | function <nume_procedurå>|<nume_funcÆie><corp-procedurå> | <corp_funcÆie>

[return [<expresie>]]

Prin comanda procedure , respectiv function se defineçte antetul subprogramului(tipul çi numele). Dacå la sfârçitul subprogramului nu se scrie instrucÆiunea return (care

Page 199: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 199

semnificå terminarea subprogramului) acesta se considerå terminat atunci când seîntâlneçte un alt antet de subprogram sau sfârçitul fiçierului. Adverbul <expresie> dincomanda return reprezintå valoarea întoarså de funcÆie sau procedurå prin numele såu.Dacå nu se precizeazå valoarea returnatå aceasta va fi .T..

Activarea unei proceduri se face cu instrucÆiunea:do <nume_procedurå> with <listå_parametri>

iar a unei funcÆii se face fie prin instrucÆiunea do, fie ca operand într-o expresie, fie folosindcomanda =. Dacå o procedurå furnizeazå un singur rezultat, returnat printr-o variabilå dememorie cåreia i se atribuie valoarea expresiei din comanda return, ea poate fi activatå lafel ca o funcÆie, ca operand într-o expresie.

Subprogramele pot fi scrise:În acelaçi fiçier cu programul principal.Subprogramele se vor scrie dupå in-strucÆiunile programului principal.Într-o bibliotecå de programe. Bibliote-ca de programe din Visual FoxPro senumeçte fiçier de proceduri. Pentru a putea folosi un subprogram din bibliotecå, înainte a-lactiva trebuie deschiså biblioteca, iar dupå ce s-a terminat lucrul cu subprogramele dinbibliotecå, ea trebuie închiså. Starea unei biblioteci poate fi controlatå cu parametrul desistem procedure a cårui valoare se stabileçte cu comanda:

set procedure to [<nume_fiçier_proceduri>]unde <nume_fiçier_proceduri> este numele bibliotecii care se deschide. Comanda:

set procedure tofårå parametru închide biblioteca deschiså.

Transmiterea parametrilor se va face implicit prin referinÆå dacå activaÆi subprogramul cucomanda do çi prin valoare, dacå activaÆi subprogramul ca un operand. PuteÆi såcontrolaÆi modul de transmitere al parametrilor cu parametrul sistemului udfparms careare valoarea reference pentru transmiterea prin referinÆå çi valoarea value pentrutransmiterea prin valoare. Valoarea parametrului se stabileçte cu comanda set:

set udfparms to reference | value

ObservaÆie:Se mai poate stabili modul de transfer pentru fiecare parametru astfel: dacå numele estescris între paranteze, transferul se face prin valoare, iar dacå este precedat de caracterul@ transferul se face prin referinÆå.

CreaÆi un fiçier care conÆine un program surså çi-l lansaÆi în execuÆie

1. CreaÆi fiçierul surså, îl compilaÆi çi-l lansaÆi în execuÆie folosind meniul aplicaÆiei:

Folosind facilitatea de autodocumentare aflaÆiordinea în care comanda do alege subprogra-mul pe care îl lanseazå în execuÆie în funcÆie de

fiçierul în care este memorat.

!

Page 200: SGBD Visual Foxpro

Informatică200

DeschideÆi o fereastrå a editorului de texte încorporat astfel: alegeÆi opÆiuneaNew...∈∈File; se deschide caseta de dialog New în care alegeÆi din grupul de bu-toane radio File Type opÆiunea Program çi apoi acÆionaÆi declançatorul New File.Se deschide fereastra de editare. Folosind operaÆia Save As atribuiÆi fiçieruluinumele test1.prg.ScrieÆi în fereastra de editare textul programului din exemplul prezentat la struc-tura liniarå. CompilaÆi fiçierul surså cu opÆiunea de meniu Compile∈∈ Program.SalvaÆi çi închideÆi fereastra de editare fie cu opÆiunea de meniu, fie folosindbutonul de închidere al ferestrei, fie apåsând tastele ctrl+w.LansaÆi în execuÆie programul cu opÆiunea de meniu Do...∈∈ Program.

2. CreaÆi fiçierul surså, îl compilaÆi çi-l lansaÆi în execuÆie folosind limbajul de comandå:DeschideÆi o fereastrå a editorului de texte încorporat cu comanda:

modify command test2Se deschide fereastra de editare care are titlul test2.prg. ScrieÆi în aceaståfereastrå textul programului din exemplul prezentat la structura alternativå simplå.SalvaÆi çi închideÆi fereastra de editare.CompilaÆi fiçierul surså cu comanda:

compile test2LansaÆi în execuÆie programul cu comanda:

do test2DeschideÆi fereastra editorului de texte încorporat cu comanda:

modify command test2SalvaÆi conÆinutul acestui fiçier sub numele test3.prg. ÎnchideÆi fereastra de editare.CompilaÆi fiçierul surså cu comanda:

compile test2 encryptDeschideÆi douå ferestre de editare în care încårcaÆi cele douå fiçiere obiect obÆi-nute în urma compilårii: test2.fxp çi test3.fxp. Ele s-au obÆinut în urma compilåriiaceluiaçi program surså, dar folosind metode diferite de compilare. ComparaÆi ce-le douå fiçiere obiect obÆinute.

3. CreaÆi fiçierele surså, le compilaÆi çi le lansaÆi în execuÆie pentru toate exempleleprezentate la secÆiunea Structuri de control.

CreaÆi o capcanå pentru erori

Så se construiascå o capcanå pentru erori. În fiçierul surså exemplu.prg se vor scrieinstrucÆiunile programului (modulul apelant), iar în fiçierul surså eroare.prg instrucÆiunilesubrutinei de eroare (modulul apelat).

1. CreaÆi fiçierul surså exemplu.prg çi îl compilaÆi:

if set('talk')='on'set talk off

endifif set('bell')='off'

set bell onendif* prin urmatoarea instructiune* se activeaza un subprogram* care a fost scris într-un* fisier separat:eroare.prg

on error do eroare with;error(),message(),message(1),;program(), lineno()

open database compania use sedinte apend && In aceasta; linie va fi detectata o eroare ? program() wait '' goto top

Page 201: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 201

browseon error do eroare with:';

error(),message(),message(1),;program(), lineno()

go to top && In aceasta; linie va fi detectata o eroare

on error on errorusesclose data

2. CreaÆi fiçierul surså eroare.prg çi îl compilaÆi:parameter nrer, mesaj1,; mesaj2, numeprog, nrlinieclear? 'Eroare cu numarul: '??str(nrer,4)+replicate(chr(7),3)? 'Mesaj de eroare: '?? mesaj1? 'Comanda eronata: '

?? mesaj2? 'Programul cu eroarea: '?? numeprog? 'Linia cu numarul: '?? nrliniewait ''clearreturn

3. LansaÆi în execuÆie programul exemplu. ObservaÆi modul în care sunteÆi informaÆidespre erorile de compilare.

TestaÆi modul în care pot fi folosite variabilele de memorie ascunse

ScrieÆi urmåtorul program surså în fiçierul ex1.prg çi-l lansaÆi în execuÆie:set talk offa1 = 10a2 = 20do ascunde? 'Afiseaza variabilele din; program dupa revenire din; procedura'? a1, a2 && Afiseaza 10, 200procedure ascundeprivate a1

a1 = 100a2 = 200? 'Afiseaza variabilele din; procedura'? 'a1= '?? a1 && Afiseaza 100? 'a2= '?? a2 && Afiseaza 200return

TestaÆi modul în care pot fi folosite variabilele de memorie publice

ScrieÆi urmåtorul program surså în fiçierul ex2.prg çi-l lansaÆi în execuÆie. ObservaÆi valo-rile afiçate. ObservaÆi comportamentul variabilelor publice. ComparaÆi acest exemplu deprogram (în care variabilele de memorie a1 çi a2 au fost declarate publice) cu exemplulanterior în care nu au fost declarate publice. Ce concluzie trageÆi? ObservaÆi cå prin co-manda release all nu sunt eliberate variabilele publice, iar prin comanda release a1,a2sunt eliberate variabilele de memorie specificate în listå, chiar dacå sunt publice.

set talk offpublic a1,a2a1 = 10a2 = 20do ascunde? 'Afiseaza variabilele din; program dupa revenire din; procedura'? a1, a2 && Afiseaza 10, 200

release alldisplay memory like a?release a1,a2display memory like a?procedure ascundeprivate a1a1 = 100a2 = 200? 'Afiseaza variabilele din; procedura'

Page 202: SGBD Visual Foxpro

Informatică202

? 'a1 = '?? a1 && Afiseaza 100? 'a2 = '

?? a2 && Afiseaza 200return

TestaÆi modul în care pot fi folosite variabilele de memorie regionale

ScrieÆi urmåtorul program surså în fiçierul ex3.prg çi-l lansaÆi în execuÆie:

* Se creeaza doua regiuni* In prima regiune se creeaza variabilele a1,a2,a3,a4* In a doua regiune se creeaza variabilele a2,a3,a4,a5* Variabilele a2,a3,a4 sunt comune celor doua regiuni#region 1regional a1,a2,a3,a4store 10 to a1,a2,a3,a4#region 2regional a2,a3,a4,a5store 20 to a2,a3,a4,a5? 'Observati modul in care sunt afisate variabilele'? 'regionale care folosesc acelasi identificator'display memory like a*#region 1? a2, a3, a4#region 2? a2, a3, a4returnRezolvaÆi problemele cu ajutorul subprogramelorNotåm combinåri de n luate câte m cu C(n,m). Calcularea lor se face folosind urmåtoareaformulå: C(n,m)=n!/(m!*(n-m)!)). ObservaÆi cå în formulå se repetå de trei ori calculul facto-rialului. Pentru acest calcul se va folosi un subprogram. ScrieÆi urmåtorul program surså înfiçierul ex4.prg çi-l lansaÆi în execuÆie. Subprogramul folosit este de tip procedurå çi va fi scrisdupå instrucÆiunile din programul apelant.clearset talk offpublic n,m,f1,f2,f3? 'Programul calculeaza; combinari de n luate cate m'input 'n= ' to ninput 'm= ' to mdo fact with n,f1do fact with m,f2do fact with n-m,f3

c=f1/(f2*f3)? 'Combinari = ', creturnprocedure factparameters j,pstore 1 to i,pfor i=1 to j p=p*iendforreturn

ScrieÆi urmåtorul program surså în fiçierul ex5.prg çi-l lansaÆi în execuÆie. Subprogramulfolosit este de tip funcÆie. ObservaÆi modul în care a fost rezolvatå aceeaçi problemåfolosind cele douå tipuri de subprograme.clearset talk offpublic n,m? 'Programul calculeaza; combinari de n luate cate m'

input 'n= ' to ninput 'm= ' to mc=fact(n)/(fact(m)*fact(n-m))? 'Combinari = ',creturn

Page 203: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 203

function factparameters jfact=1for i=1 to j

fact=fact*iendforreturn fact

TestaÆi modul în care puteÆi folosi informaÆiile furnizate de funcÆia parameters()

ScrieÆi urmåtorul program surså în fiçierul ex6.prg çi-l lansaÆi în execuÆie.set talk offa1 = 10a2 = 20a3 = 30a4 = 40med = media(a1, a2, a3, a4)? 'Media aritmetica = '?? medfunction media* functia permite transferul datelor prin cel mult 9 parametri.parameters b1,b2,b3,b4,b5,b6,b7,b8,b9* se foloseste functia parameters() pentru a afla numarul; de valori transferate functieiif parameters()=0 && Daca nu s-a transferat nici un parametru;

return 0 && media aritmetica este 0 else

suma = 0for i=1 to parameters()

nume_p = 'b' +(str(i,1)) && Pentru numele parametrului se suma = suma + &nume p && foloseste adresarea indirecta

endfor m = suma/(i-1)

return mendifreturnTestaÆi modul în care se face transferul parametrilor între module

ScrieÆi urmåtorul program surså în fiçierul ex7.prg çi-l lansaÆi în execuÆie.

clearif set('talk')='on'

set talk offendifset udfparms to valuen=10?test(n),n && Afiseaza 70, 10set udfparms to reference

n=10?test(n),n && Afiseaza 70, 70returnfunction testparameters yy=2*y+50return y

TestaÆi modul în care puteÆi activa o procedurå la fel ca çi o funcÆie

Procedura data furnizeazå un format românesc de afiçare a datei prin chiar numele såu.ScrieÆi urmåtorul program surså în fiçierul ex8.prg çi-l lansaÆi în execuÆie.

set talk offset century on

set date to britishaccept 'Data (zz/ll/aaaa):' to dt

Page 204: SGBD Visual Foxpro

Informatică204

? data(ctod(dt))procedure dataparameter ddo casecase month(d)=1

luna='ianuarie'case month(d)=2

luna='februarie'case month(d)=3

luna='martie'case month(d)=4

luna='aprilie'case month(d)=5

luna='mai'case month(d)=6 luna='iunie'case month(d)=7

luna='iulie'case month(d)=8

luna='august'case month(d)=9

luna='septembrie'case month(d)=10

luna='octombrie'case month(d)=11

luna='noiembrie'case month(d)=12

luna='decembrie'endcasedo casecase lower(cdow(d))='monday'

ziua='luni'case lower(cdow(d))='tuesday'

ziua='marti'case

lower(cdow(d))='wednesday' ziua='miercuri'case lower(cdow(d))='thursday'

ziua='joi'case lower(cdow(d))='friday'

ziua='vineri'case lower(cdow(d))='saturday'

ziua='sambata'case lower(cdow(d))='sunday'

ziua='duminica'endcasedat=ziua+', '+str(day(d),2)+; ' '+luna+' '+str(year(d),4)return dat

ConstruiÆi çi testaÆi o bibliotecåConstruiÆi în fiçierul vectori.prg o bibliotecå cu operaÆii pentru vectori care så conÆinå: pro-ceduri pentru citirea unui vector, pentru afiçarea unui vector, pentru concatenarea doi vectori,pentru interclasare a doi vectori, pentru divizarea unui vector, o funcÆie pentru cåutarea unuielement cu o valoare precizatå într-un vector (funcÆia va furniza un rezultat numeric: prima po-ziÆie în care a fost gåsit elementul în vector sau -1 dacå nu a fost gåsit) çi o procedurå decåutare care va comunica toate poziÆiile în care a fost gåsit un element cu o valoare precizatå(se va folosi dacå existå mai multe elemente cu aceeçi valoare în vector). Dupå ce aÆi scrisfiçierul surså, îl veÆi compila ca så fiÆi siguri cå nu aveÆi erori de sintaxå.procedure creareparameters a,nlocal i? 'Creati un vector cu n elemente'input 'n= ' to ndimension a(n)for i=1 to n input 'a('+str(i,2)+')= ' to; a(i)endforreturnprocedure afisareparameters a,nlocal i,j? 'Se afiseaza un vector cu ',str(n,2)+' elemente'

?i=1do while i<=n-1for j=1 to 10

?? str(a(i),6)+', ' i=i+1

if i=nexit

endifendforif i<=n-1

?endif

enddo?? str(a(n),6)

return

Page 205: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 205

procedure concatenareparameters a,b,c,n,mdimension c(n+m)?acopy(a,c,1,n,1)?acopy(b,c,1,m,n+1)procedure divizareparameters a,b,c,n,mdimension b(m)dimension c(n-m)?acopy(a,b,1,m,1)?acopy(a,c,m+1,n-m,1)returnprocedure interclasareparameters a,b,c,n,mdimension c(n+m)?acopy(a,c,1,n,1)?acopy(b,c,1,m,n+1)?asort(c)returnfunction cautparameters a,n,xlocal i

k=-1for i=1 to nif a(i)=x

k=iexit

endifendforreturn kprocedure cautvparameters a,n,x,t,klocal i,jk=-1j=0for i=1 to nif a(i)=x

j=j+1dimension t(j)

t(j)=i k=jendif

endforreturn

TestaÆi apoi biblioteca folosind urmåtoarele programe: test1.prg pentru testarea operaÆieide cåutare, test2.prg pentru testarea operaÆiei de concatenare, test3.prg pentru testareaoperaÆiei de interclasare çi test4.prg pentru testarea operaÆiei de divizare.

test1.prgset talk off? 'Cu acest program lucrati cu; vectori cu elemente numerice'public m,p,x,v(1),u(1)clearnote Se deschide bibliotecaset procedure to vectorido creare with v,mdo afisare with v,m? 'Puteti cauta o valoare; numerica x in vector'input 'x= ' to x?? 'Veti afla prima pozitie in; care a fost gasita'if caut(v,m,x)=-1? 'Nu exista elementul cautat'

else? 'Prima pozitie in care se;

gaseste valoarea este '; +str(caut(v,m,x),2)

do cautv with v,m,x,u,pif p>1

? 'Valoarea apare in mai; multe pozitii'

? 'Pozitiile gasite sunt:'do afisare with u,p

endifendifnote Se închide bibliotecaset procedure toreturn

test2.prgset talk offpublic p,q,x(1),y(1),z(1)clearset procedure to vectori? 'Programul concateneaza doi;

vectori numerici'? 'Comunicati primul vector'do creare with x,p? 'Comunicati al doilea vector'do creare with y,q

Page 206: SGBD Visual Foxpro

Informatică206

do concatenare with x,y,z,p,qdo afisare with z,p+q

set procedure toreturn

test3.prg La fel ca la test2.prg numai cå în loc de do concatenare with x,y,z,p,qscrieÆi do interclasare with x,y,z,p,qtest4.prgset talk offpublic p,q,x(1),y(1),z(1)clearset procedure to vectori? 'Programul divizeaza un; vector numeric in doi vectori'? 'Comunicati vectorul care se; divizeaza'do creare with x,p

input 'Numarul de elemente; preluate de primul vector = ';to q

do divizare with x,y,z,p,q?'Primul vector obtinut'do afisare with y,q?'Al doilea vector obtinut'do afisare with z,p-qset procedure toreturn

TT est pentru evaluare:

1. Så se scrie un program care permite crearea unei matrici de 2 linii çi 5 coloane încare så se înregistreze în ordine primele 10 numere naturale:

1 2 3 4 56 7 8 9 10

Så se afiçeze apoi aceste numere pe ecran în ordine, pe cinci linii çi douå coloane:1 2........9 10

çi apoi sub forma unui triunghi:12 34 5 67 8 9 10

2. ScrieÆi un program prin care cåutaÆi un element într-o matrice. Dimensiunea matricei,elementele matricei çi valoarea cåutatå se introduc de la tastaturå. Programul vaafiça numårul de ordine al elementului, numårul liniei çi numårul coloanei în cazul încare se gåseçte elementul çi un mesaj dacå nu se gåseçte.

3. Så se scrie un program pentru rezolvarea ecuaÆiei de gradul II cu coeficienÆi numerereale. CoeficienÆii a,b,c se introduc de la tastaturå. Programul trebuie så permitåreluarea rezolvårii problemei pentru mai multe seturi de date de intrare (seturi decoeficienÆi) çi så calculeze atât rådåcinile reale, cât çi cele complexe.

4. Så se scrie un program care så çteargå înregistrårile dintr-un tabel pentru care uncâmp de tip çir de caractere este vid. Se presupune cå tabelul are cel puÆin un câmp detip çir de caractere care poate fi vid. Numele tabelului çi numele câmpului se introducde la tastaturå (folosiÆi tabele din baza de date Compania pentru a testa programul).

5. Så se scrie un program care så realizeze urmåtoarele prelucråri asupra unui çir decaractere introdus de la tastaturå:a) Så se numere cuvintele din text în urmåtoarele douå variante:

a1) cuvintele sunt separate printr-un singur spaÆiu;

Page 207: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 207

a2) cuvintele sunt separate prin douå sau mai multe spaÆii.b) Så se numere caracterele din text çi så se precizeze:

b1) câte consoane sunt;b2) câte vocale sunt;b3) câte cifre sunt;b4) câte semne speciale sunt.

c) Så se înlocuiascå în text un çir de caractere cu un alt çir de caractere. Cele douåçiruri de caractere se introduc de la tastaturå. Se vor înlocui toate apariÆiile çiruluide caractere precizat în urmåtoarele cazuri:c1) nu conteazå diferenÆa dintre literele mari çi mici;c2) conteazå diferenÆa dintre literele mari çi mici;c3) nu conteazå dacå çirul de caractere este un cuvânt+cerinÆa c2;c4) çirul de caractere este un cuvânt+ cerinÆa c2.

d) Så se afiçeze în ordine alfabeticå cuvintele din text.e) Så se numere cuvintele care au m caractere. Valoarea lui m se introduce de la

tastaturå.f) Så se afiçeze pentru fiecare literå, câte litere sunt în text (frecvenÆa de apariÆie a

literelor). Afiçarea se va face pe ecran sub forma:Literea a sau A ............ 20Literea b sau B ............ 5........................................Lista se va afiça sortat în douå moduri: în ordinea alfabeticå a literelor çi înordinea descrescåtoare a frecvenÆei de apariÆie.

g) Så se afiçeze litera care are cea mai mare frecvenÆå de apariÆie în text.h) Så se afiçeze media apariÆiilor çi abaterea medie påtraticå. Ce informaÆii obÆineÆi

comparând cele douå valori obÆinute.6. Så se realizeze un tabel bazå de date în care så se memoreze evoluÆia cursului leu-euro

din luna precedentå. Pentru fiecare zi din lunå se vor memora urmåtoarele informaÆii: data,valoarea cursului, indicele cu bazå fixå (raportul dintre cursul zilei çi cursul din ziua de în-ceput a perioadei de analizå), indicele cu bazå în lanÆ (raportul dintre cursul zilei çi cursul dinziua precedentå), sporul cu bazå fixå (diferenÆa dintre cursul zilei çi cursul din ziua de în-ceput a perioadei de analizå), sporul cu bazå în lanÆ (diferenÆa dintre cursul zilei çi cursul dinziua precedentå). Crearea structurii tabelului çi încårcarea câmpurilor pentru datå çi curs seva face la nivel de limbaj de comandå. Pentru calcularea celorlalte câmpuri se va folosi unprogram. Så se afiçeze urmåtoarele informaÆii folosind datele din tabel: ziua cu cel maimare curs, ziua cu cel mai mic curs, media aritmeticå a cursului çi abaterea medie påtraticåa cursului. Aceste informaÆii se vor furniza în douå moduri: cu ajutorul limbajului decomandå çi cu ajutorul unui program.

7. Så se realizeze un tabel bazå de date în care så se memoreze situaÆia notelor çi a mediilorla disciplina Informaticå a elevilor dintr-o claså. Tabelul va conÆine urmåtoarele informaÆii:numele çi prenumele elevului, poziÆia lui din catalog, cinci note pentru primul semestru, cincinote pentru cel de al doilea semestru, douå note pentru tezele de pe cele douå semestre,mediile de pe cele douå semestre çi media anualå. Crearea structurii tabelului çi încårcareacâmpurilor pentru numele çi prenumele elevului, pentru poziÆia lui din catalog, pentru celemaxim 10 note din cele douå semestre çi pentru cele douå note de la tezele semestriale seva face la nivel de limbaj de comandå. Pentru calcularea mediilor se va folosi un program.La calcularea mediilor trebuie så ÆineÆi cont de urmåtoarele:

Page 208: SGBD Visual Foxpro

Informatică208

a) valorile mediilor semestriale sunt de tip întreg, iar valoarea mediei generale estede tip real;

b) este posibil ca un elev så primeascå mai puÆin de cinci note;c) teza are ponderea de 25% din media semestrialå.

ScrieÆi un program care så afiçeze urmåtoarele informaÆii:a) corigenÆii de pe fiecare semestru çi corigenÆii anuali;b) o listå ordonatå alfabetic dupå numele çi prenumele elevilor care så conÆinå

numele, prenumele, mediile semestriale çi media anualå;c) o listå ordonatå descrescåtor dupå media anualå care så conÆinå numele, prenu-

mele, mediile semestriale çi media anualå;d) numele elevului cu cea mai mare medie pe semestrul 1, pe semestrul 2 çi res-

pectiv pe an;e) media generalå a clasei çi abaterea medie påtraticå a mediilor pe fiecare semes-

tru çi pe an (ce concluzie trageÆi prin compararea acestor medii?).8. CompletaÆi biblioteca vectori cu urmåtaorele subprograme pentru operaÆii cu vectori:

proceduri pentru adunarea çi produsul vectorial a doi vectori çi funcÆii pentru produsulscalar a doi vectori çi pentru suma çi produsul elementelor unui vector. TestaÆi noilesubprograme adåugate la bibliotecå.

9. ConstruiÆi o bibliotecå pentru operaÆii cu mulÆimi care så permitå executarea urmåtoare-lor operaÆii: citirea çi afiçarea unei mulÆimi, reuniunea, intersecÆia, diferenÆa, diferenÆa si-metricå, produsul cartezian a douå mulÆimi, cardinalul unei mulÆimi (numårul de elemen-te), apartenenÆa unui element (a cårui valoare o veÆi comunica de la tastaturå) la o mul-Æime. Pentru mulÆimi veÆi folosi tipul de date vector. Spre deosebire de un vector oarecare,într-un vector care påstreazå elementele unei mulÆimi nu pot exista douå elemente cuaceeaçi valoare.

10. ConstruiÆi o bibliotecå cu operaÆii cu çiruri de caractere în care så påstraÆi subpro-grame pentru rezolvarea cerinÆelor de la problema 5. ConstruiÆi programe pentrutestarea acestei biblioteci.

11. Folosind editorul de texte Notepad vizualizaÆi conÆinutul fiçierelor clienÆi.dbf çi clienÆi.fpt.ObservaÆi cå orice persoanå care vrea så citeascå datele din tabelele bazei de date poateface acest lucru cu un simplu editor de texte. Cu puÆin efort poate identifica ce reprezintåfiecare datå çi poate obÆine anumite informaÆii care pot fi secrete. Pentru a evita acest lucruputeÆi codifica datele de tip alfanumeric (câmpurile de tip çir de caractere aflate în fiçierul cuextensia .dbf çi câmpurile memo aflate în fiçierul cu extensia .fpt). VeÆi crea un cod simplu:translataÆi cu o valoare stabilitå (de exemplu 15) codurile ASCII ale caracterelor. ConstruiÆidouå subprograme: unul pentru codificare (pe care îl folosiÆi înainte de închiderea bazei dedate) çi unul pentru decodificare (pe care îl folosiÆi la deschiderea bazei de date). Çirurile decaractere pot conÆine numai cifre, litere çi anumite semne speciale. Pentru a evita afiçareaîn çirurile de caractere codificate a altor caractere, puteÆi complica codul folosind pentruacelaçi tip de caractere (cifre, litere sau semne speciale) o translatare circularå. Deexemplu, pentru literele mici consideraÆi cå dupå litera z urmeazå litera a; în acest mod,pentru o translatare cu 15, în locul literei a (cod ASCII: 97) se va folosi litera p (cod ASCII97+15=112), iar în locul literei z (cod ASCII: 122) se vafolosi litera o (cod ASCII 97-1+15=111).

Page 209: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 209

ÎncercaÆi:Adevårat/Fals:1. O procedurå utilizator din Visual FoxPro poate fi activatå ca o funcÆie.2. În limbajul Visual FoxPro este implementatå structura repetitivå de tip repeat ... until.3. Comenzile care permit redirectarea unei valori de pe ecran într-o variabilå de memorie

folosind clauza to creeazå variabila de memorie.4. Variabilele de memorie pot fi definite oriunde în interiorul programului.5. Printr-o comandå modify command puteÆi deschide mai multe ferestre de editare.6. InstrucÆiunea exit redå controlul sistemului de operare.7. InstrucÆiunea public creeazå variabile de memorie.8. Printr-o comandå compile puteÆi compila un singur program.

CompletaÆi:1. În instrucÆiunea alternativå generalizatå do case ... endcase cuvântul cheie ............ prece-

de instrucÆiunile care se vor executa dacå nici unul dintre cazuri nu a fost „adevårat”.2. Comentariul inserat într-o linie a programului trebuie precedat de .................3. InstrucÆiunea prin care puteÆi forÆa reevaluarea condiÆiei de terminare a unei structuri

repetitive este .....................4. Pentru crearea unei capcane pentru erori folosiÆi comanda ........................5. ConÆinutul liniei care a cauzat o eroare de compilare este furnizat de funcÆia ...............6. PuteÆi så urmåriÆi execuÆia pas cu pas a unui program în fereastra ....................7. Parametrii formali se declarå cu instrucÆiunea .................8. AflaÆi numårul de parametri actuali transmiçi unui subprogram cu funcÆia ...................9. DeschideÆi o bibliotecå de subprograme cu comanda ..........................

AlegeÆi råspunsurile corecte:1. În funcÆie de context, într-un program Visual FoxPro caracterul = poate fi:

a) operator relaÆionalb) operator de atribuirec) comandå

2. Dacå din mai multe acÆiuni posibile trebuie så se execute una singurå veÆi folosi:d) instrucÆiuni if ... endif imbricatee) instrucÆiunea do case ... endcasef) instrucÆiunea scan ... endscan

3. Fraza „citeçte înregistrårile fiçierului pânå când ajungi la marcajul de sfârçit de fiçier“poate fi descriså cu instrucÆiunea:a) for i=1 to reccount() ... endforb) do while not eof() ... enddoc) scan ... endscan

4. O variabilå de memorie declaratå „privatå“ cu instrucÆiunea private este:a) o variabilå de memorie localå, vizibilå numai în modulul în care a fost creatå;b) o variabilå vizibilå numai în regiunea de program în care a fost creatå;c) o variabilå de memorie ascunså de modulele superioare.

5. Comanda return to master redå controlul:a) modulului apelant b) modulului principal c) sistemului de operare

Page 210: SGBD Visual Foxpro

Informatică210

6. Linia de comentarii începe cu:a) note b) * c) &&

7. Dacå scrieÆi numele unui parametru între paranteze rotunde, transferul se va face prin:a) referinÆå b) valoare c) adresare indirectå

RåspundeÆi:1. RealizaÆi o comparaÆie între un limbaj de programare structurat studiat çi limbajul

gazdå Visual FoxPro. PuneÆi în evidenÆå asemånårile çi deosebirile referitoare la:declararea datelor, structurile de control care pot fi folosite, comentarii, modularizareaunei aplicaÆii (çi tot ce presupune acest prooces - transferul datelor, domeniul devizibilitate al identificatorilor etc.), bibliotecile de subprograme etc.

2. Ce tipuri de structuri de control sunt implementate în limbajul gazdå Visual FoxPro?3. Cum poate fi modularizatå o aplicaÆie în Visual FoxPro? Câte metode existå?4. Câte tipuri de variabile de memorie sunt în funcÆie de domeniul de vizibilitate?

RR åspunsuri:Adevårat/Fals: 1-A; 2-F; 3-A; 4-A; 5-A; 6-F; 7-A; 8-F.CompletaÆi: 1-otherwise; 2-&&; 3-loop; 4-on error; 5-message(1); 6-Trace; 7- parameters;8-parameters(); 9-set procedure to<nume_biblioteca>.AlegeÆi råspunsurile corecte: 1-a,b,c; 2- a,b; 3- a,b,c; 4-c; 5-b; 6-a,b; 7-b.

2 . P r o g r a m a r e a o r i e n t a tă p e o b i e c t e

2 . 1 . P r i n c i p i i l e p r o gr a măr i i o r i e n t a t e p e o b i e c t e

Programele de calculator prelucreazå informaÆii din lumea care ne înconjoarå. Lumea realåeste formatå din obiecte, iar omul interacÆioneazå cu ea prin intermediul acestor obiecte. Ofotografie prezintå çi ea un ansamblu de obiecte care sunt caracterizate înså numai deproprietåÆi (formå, dimensiuni, culoare etc.), nu çi de acÆiuni. Ea este o reprezentare staticåa lumii reale. Dar lumea care ne înconjoarå este o lume dinamicå în care fiecare obiect estedeterminat de proprietåÆi, metode çi evenimente. Putem så ne gândim la proprietåÆi ca laatributele obiectului, la metode ca la acÆiuni ale obiectului, iar la evenimente ca la råspun-suri ale obiectului la acÆiunile omului asupra lui. Pentru a înÆelege mai bine ce înseamnåproprietåÆile, metodele çi evenimentele så consideråm un obiect din viaÆa de zi cu zi: balo-nul unui copil. Balonului i se pot asocia proprietåÆi, metode çi evenimente. ProprietåÆile ba-lonului includ atât atributele vizibile cum sunt înålÆimea, diametrul, culoarea, cele care des-criu starea lui (umflat sau dezumflat), cât çi atribute invizibile cum este vârsta. Prin definiÆie,toate baloanele au aceste proprietåÆi. Valorile acestor proprietåÆi diferå de la un balon la al-tul. Balonului i se pot asocia de asemenea çi acÆiuni pe care le poate executa, adicå meto-de: metoda de umflare a balonului (acÆiunea prin care se umflå balonul cu aer), metoda dedezumflare a balonului (acÆiunea prin care se scoate aerul din balon), metoda de înålÆare abalonului (acÆiunea prin care se ridicå balonul). Toate baloanele sunt capabile så executeaceste acÆiuni, deci au asociate aceste metode. Baloanele au çi råspunsuri predefinite laanumite evenimente externe: la evenimentul înÆepåturå, råspunsul este dezumflarea auto-matå, iar la evenimentul eliberarea balonului råspunsul este înålÆarea lui în aer.

Page 211: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 211

Açadar, baloanele diferå între ele numai prin valorile proprietåÆilor çi au acelaçi comporta-ment (reacÆioneazå la aceleaçi evenimente prin aceleaçi metode). Putem spune cå balonuleste un tip de obiect din lumea realå, iar mulÆimea baloanelor formeazå o claså de obiecte.

Aça cum o fotografie descrie starea unui obiect la un moment dat, çi o structurå de datefolositå pentru descrierea obiectului nu poate så caracterizeze decât starea acelui obiect laun moment dat, deci este o descriere staticå a obiectului. TendinÆa limbajelor moderne deprogramare este de a pune în corespondenÆå obiectele reale cu obiectele virtuale pentru aputea evidenÆia transformårile pe care acestea le suferå în mod continuu. Obiectul va încap-sula atât datele care descriu proprietåÆile, dar çi subprogramele care prelucreazå aceste dateçi care vor defini metodele obiectului.

Domeniul în care programarea orientatå pe obiecte a ajuns indispensabilå este realizareainterfeÆei. Aça cum obiectele cu care venim în contact reprezintå interfaÆa între noi çi lumearealå çi interfaÆa graficå dintre utilizator çi programul de aplicaÆie este construitå cu diferiteobiecte virtuale afiçate pe ecran care pot fi acÆionate cu mouse-ul çi tastatura. Putem spunecå în urma acÆionårii, obiectul declançeazå un anumit eveniment. Deoarece, utilizatorulpoate veni în contact cu mai multe aplicaÆii, s-a cåutat o standardizare a acestor obiecteatât din punct de vedere al proprietåÆilor, cât çi din punct de vedere al evenimentuluideclançat. De exemplu, dacå un utilizator vede pe ecranul calculatorului un buton pe carescrie OK, çtie cå dacå îl va acÆiona se va închide caseta de dialog çi se va continuaexecuÆia aplicaÆiei.

AÆi studiat deja principiile programårii orientate pe obiecte. Dintre conceptele studiate, såne reamintim urmåtoarele:

Obiectul (object) reprezintå un ansamblu de date (un numår fix de variabile) çisubprograme (proceduri çi funcÆii) necesare pentru prelucrarea datelor. Datele poartånumele de proprietåÆi, iar subprogramele numele de metode sau evenimente. Proprie-tåÆile, metodele çi evenimentele sunt membrii unui obiect. InterfaÆa de acces la obiecteste realizatå numai prin intermediul metodelor. În acest mod, subprogramele membreale unui obiect prelucreazå datele membre ale obiectului care apeleazå metoda.

Proprietatea (property) reprezintå un atribut al unui obiect care defineçte una dintrecaracteristicile sau unul dintre aspectele sale. De exemplu, un obiect vizual poate aveaproprietatea visible care determinå dacå obiectul este vizibil la un moment dat.

Metoda (method) reprezintå acÆiunea pe care o poate executa un obiect. Utilizatorulunui obiect are acces la date numai prin intermediul metodelor obiectului, iar metoda areacces implicit la membrii unui obiect. Metodele ascund celui care utilizeazå obiectulamånunte despre modul în care a fost implementat. De exemplu, un obiect vizual de tip

listå are implementate metode necesare pentru întreÆinerea listei: adåugarea unui articol la listå,çtergerea unui articol din listå etc.

Evenimentul (event) reprezintå o acÆiune recunoscutå de obiect pentru care se poate scrie unprogram ca råspuns. Evenimentele pot fi externe, adicå generate de acÆiuni ale utilizatorului (unclic cu mouse-ul, miçcarea mouse-ului, apåsarea unei taste) sau interne, adicå generate prin-tr-un cod de program sau de sistem.

Clasa (class) reprezintå definiÆia unui anumit tip de obiect. DefiniÆia cuprinde descriereaproprietåÆilor çi a metodelor obiectului. Folosirea claselor permite gestionarea mai multorobiecte de acelaçi tip. Clasa este înså doar un termen abstract, un çablon care defineçtecaracteristicile unui obiect (cum aratå çi cum se comportå).

Page 212: SGBD Visual Foxpro

Informatică212

InstanÆa (instance) reprezintå un obiect creat pornind de la definiÆia unei clase. Spre deosebire declaså care este doar o definiÆie, o instanÆå existå ca un obiect care poate fi folosit pentru aexecuta anumite acÆiuni. De exemplu, o casetå de text dintr-un formular este o instanÆå a claseiTextBox care descrie acest tip de obiecte vizuale.

InstanÆe multiple (multiple instances) reprezintå mai multe obiecte create de aceeaçi claså.Obiectele au propriile proprietåÆi çi date private, dar folosesc împreunå codul de program.

Încapsularea (encapsulation) reprezintå un mecanism prin care folosind o singurå definiÆie suntincluse în obiect datele çi metodele. Datele membre ale unui obiect nu pot fi modificate decâtprin intermediul metodelor proprii obiectului respectiv. Încapsularea izoleazå complexitateainternå a unui obiect de restul aplicaÆiei.

Moçtenirea (inheritance) este o facilitate oferitå de programarea pe obiecte prin care o clasånouå numitå claså copil (child class) se poate construi pornind de la o claså existentå numitåclaså pårinte (parent class) prin preluarea caracteristicilor clasei pårinte. Clasa copil se mainumeçte çi claså derivatå (subclass), iar clasa pårinte claså de bazå (base class). Folosindaceastå facilitate se poate crea o ierarhie de clase çi se poate dezvolta uçor un software exis-tent. Clasa copil moçteneçte accesul la datele çi metodele stråmoçilor. La acestea, programato-rul poate adåuga proprietåÆi çi metode noi, definite explicit în noua claså. Orice modificare într-un stråmoç se reflectå çi la urmaçi. De exemplu, dacå o claså Text are proprietatea ca textul såfie scris îngroçat, orice urmaç al acestei clase va avea aceastå proprietate.

Aceeaçi problemå poate fi rezolvatå atât în varianta clasicå a programårii structurate, câtçi folosind programarea orientatå pe obiecte. Principalele avantaje ale folosirii progra-mårii orientate pe obiecte sunt:

Reutilizarea unui software deja scris. Acest avantaj creçte eficienÆa programatorilor.În programarea clasicå se realiza prin crearea bibliotecilor de subprograme.Dezvoltarea mai uçoarå a aplicaÆiilor. În programarea orientatå pe obiecte creçtegradul de modularizare al unei aplicaÆii faÆå de programarea clasicå. Adåugarea saumodificarea unor module de aplicaÆie se va face mai uçor datoritå organizåriiobiectelor în clase de obiecte çi a facilitåÆii de moçtenire.Controlul mai bun al programelor de dimensiuni mari. AplicaÆia este mai binestructuratå decât în cazul programårii clasice çi mult mai abstractizatå, permiÆând omai uçoarå citire çi urmårire a codului.Dezvoltarea programårii vizuale ca aplicaÆie a programårii orientate pe obiecte. Învarianta clasicå, descrierea unui obiect grafic de pe ecran se fåcea precizând printr-unset de instrucÆiuni caracteristicile obiectului (coordonatele obiectului, dimensiunile, cu-loarea, textul afiçat etc.), iar prin subprograme modul în care putea fi manipulat obiectul.În programarea vizualå existå deja obiecte vizuale predefinite care pot fi folosite pentruconstruirea unei intrefeÆe. Obiectul vizual conÆine proprietåÆile obiectului grafic (cu valoriimplicite, care înså pot fi modificate) çi metodele çi evenimentele la care poate reacÆionaobiectul vizual, fårå så mai necesite scrierea codului de cåtre programator.

2 . 2 . L u c r u l c u c l a s e şi o b i e c t e în V i s u a l F o x P r o

2.2.1. ClaseleVisual FoxPro are implementate mai multe clase predefinite care permit crearea unorobiecte cu care poate fi construitå interfaÆa unei aplicaÆii, cum sunt de exemplu casetele

Page 213: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 213

de text, comutatoarele, butoanele radio, listele, formularele etc. Folosind facilitatea demoçtenire, programatorul poate defini douå categorii de clase:

Clase vizuale care permit crearea obiectelor vizuale ce pot fi folosite la realizareainterfeÆei. DefiniÆia acestor clase se bazeazå pe una dintre clasele predefinite vizuale.Altfel spus, clasele vor avea ca stråmoç una dintre clasele predefinite. De exemplu,pornind de la clasa predefinitå form, care descrie obiecte vizuale de tip formular, sepoate crea o nouå claså, care så descrie tot un obiect de tip formular, dar cu proprietåÆimodificate çi eventual cu metode noi faÆå de formularul predefinit.Clase nevizuale care permit crearea unor obiecte nevizuale. DefiniÆia acestor clase sebazeazå pe clasa custom sau pe clasele predefinite nevizuale (de exemplu claseletimer sau cursor). Clasele derivate din clasa custom se mai numesc çi clase definite deutilizator - User Defined Class (UDC). De exemplu, pornind de la clasa custom se poatecrea o nouå claså, care så descrie comportamentul unui numår complex.

Clasa container este formatå dintr-un grup de clase similare (clase predefinite sau deri-vate din acestea) care pot fi tratate ca o unitate. De exemplu, clasa predefinitå form (aformularelor) este un grup de clase de controale predefinite tratate ca o unitate, iar clasaform set (a setului de formulare) este çi ea o claså container care conÆine unul sau maimulte formulare legate între ele. InstanÆa unei clase container este un obiect container.

Obiectul container este un obiect care conÆine pe lângå proprietåÆi, metode çi evenimenteçi alte obiecte. El permite accesul la obiectele pe care le conÆine. Obiectul container estefoarte util la construirea interfeÆelor. De exemplu, un formular de tip casetå de dialog esteun obiect container care poate conÆine alte obiecte cu care se poate asigura un dialoginteractiv cu utilizatorul: liste, comutatoare, butoane radio, casete de text etc.

Clasele (predefinite çi custom) au implementate implicit urmåtoarele evenimente: Init (seproduce la crearea obiectului), Destroy (se produce la eliberarea obiectului), Error (se pro-duce la apariÆia unei erori în timpul execuÆiei unei metode) çi metode: AddObject (adaugå unobiect la un container în timpul execuÆiei), CloneObject (creeazå o copie a obiectului),RemoveObject (înlåturå un obiect dintr-un container în timpul execuÆiei), SaveAsClass(salveazå o instanÆå a unui obiect ca o definiÆie de claså într-o bibliotecå de clase),

Fiecare claså se identificå printr-un nume. O claså se poate crea cu instrucÆiunea blocdefine class care are sintaxa:

define class <nume_cls1> as <nume_cls2> [[protected <nume_pr1>, <nume_pr2>,... ]

<nume_pr>=<exp> ...][add object [protected] <nume_ob> as <nume_cls3> [noinit] [with <lista_pr>]...[[protected] function | procedure <nume>

<secvenÆå-instrucÆiuni> endfunc | endproc ] ...enddefine

Prin aceastå instrucÆiune se defineçte clasa identificatå prin <nume_cls1>. DefiniÆia noii clasese bazeazå pe clasa pårinte precizatå prin <nume_cls2> din clauza as de la care moçteneçteproprietåÆile, metodele çi evenimentele. Clasa pårinte poate fi o claså predefinitå, o claså vi-zualå (care se bazeazå pe o claså predefinitå) sau o claså nevizualå (definitå de utilizator). Lanoua claså pot fi adåugate:

Page 214: SGBD Visual Foxpro

Informatică214

ProprietåÆi noi. Ele vor fi precizate printr-o listå de operaÆii de atribuire <nume_pr>=<exp>, unde <nume_pr> este numele proprietåÆii, iar <exp> este valoarea cu care seiniÆializeazå proprietatea. ProprietåÆile pot fi protejate, adicå se poate împiedica acce-sul la proprietate çi se poate împiedica modificarea ei din afara definiÆiei clasei. Prote-jarea unor proprietåÆi se precizeazå cu clauza protected însoÆitå de lista de proprietåÆicare vor fi protejate: <nume_pr1>, <nume_pr2>,... .Obiecte noi. Fiecare obiect nou care va fi adåugat la definiÆia clasei este precizat printr-oclauzå add object. Obiectul va fi identificat prin <nume_ob> çi va fi adåugat dintr-o clasåprecizatå prin <nume_cls3> din clauza as. Obiectul adåugat poate fi protejat, adicå sepoate împiedica accesul çi modificarea lui din afara clasei, dacå se precizeazå clauzaprotected. Metodele çi evenimentele clasei vor avea înså acces la proprietate. Implicit seexecutå metoda de inÆializare a obiectului la adåugarea obiectului. Explicit nu se faceiniÆializarea dacå este precizatå clauza noinit. Explicit se poate preciza cu clauza withlista proprietåÆilor çi valorile proprietåÆilor care se adaugå obiectului adåugat la claså.Metode çi evenimente noi. Ele sunt create ca un set de subprograme (proceduri çifuncÆii). Fiecare funcÆie çi procedurå este delimitatå de cuvintele cheie function çiendfunc çi respectiv procedure çi endproc. Între cuvintele cheie se scrie secvenÆade instrucÆiuni care formeazå corpul subprogramului. Se pot folosi parametri decomunicaÆie între subprogram çi obiect sau între subprogramele aceleiaçi clase.Parametrii se declarå la începutul fiecårui subprogram cu instrucÆiunea paramaterssau lparameters. Metodele pot fi protejate (este împiedicat accesul la ele din afaraobiectului) dacå se precizeazå clauza protected înainte de a scrie subprogramulasociat. Metoda va fi un subprogram care va acÆiona asupra obiectului creat pe bazaclasei çi care poate fi apelat indiferent de îndeplinirea unor condiÆii, iar evenimentul vafi un subprogram care se va executa numai atunci când se produce o acÆiune (deexemplu un clic cu mouse-ul) recunoscutå de obiectul creat pe baza clasei.

ObservaÆii:1. Define class este instrucÆiune deoarece nu poate fi folositå în modul interactiv, ci nu-

mai în programe. InstrucÆiunea are o sintaxå de bloc, deoarece este formatå dintr-unansamblu de instrucÆiuni. Blocul de instrucÆiuni începe cu comanda define class çi seterminå cu cuvântul cheie enddefine. InstrucÆiunile componente sunt scrise însintaxa blocului fiecare pe câte un rând çi trebuie scrise pe un singur rând çi în cadrulunui program (la fel ca orice instrucÆiune independentå).

2. Clauza as precede numele clasei pårinte pe care se bazeazå definiÆia noii clase sau aunui obiect adåugat la o claså container.

Exemplu:

Se creeazå o claså cu numele formular pe baza clasei vizuale form (clasa formularelor).Obiectele din aceastå claså vor fi obiecte container, deoarece obiectul formular conÆinealte trei obiecte: douå care se bazeazå pe clasa CommandButton (adicå vor fi butoanede comandå), iar unul care se bazeazå pe clasa ListBox (adicå va fi o listå). Clasa formu-lar va conÆine pe lângå proprietåÆile, metodele çi evenimentele clasei form proprietåÆilenume çi versiune çi metoda click.

define class formular as form* Se definesc proprietatile nume si versiune. Ele sunt* initializate cu 20 de spatii, respectiv cu un sir de caractere.

Page 215: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 215

* Proprietatea versiune va fi protejata.protected versiune

nume=space(20) versiune='1.0'* Se precizeaza obiectele care vor fi adaugate.* Pentru obiectele cb1 si cb2 se vor modifica valorile proprieta-* tilor caption (legenda) si backcolor (culoarea fundalului).

add object cb1 as CommandButton;with Caption='Da', BackColor = 2

add object cb2 as CommandButton;with Caption='Nu', BackColor = 2

add object lista as ListBox* Se scrie metoda Click cu ajutorul unei proceduri.

procedure Click = messagebox('Ati executat un clic în formular')

endprocenddefineObservaÆie:Clasele pot fi definite çi modificate interactiv prin intermediul constructorului de clase -Class Designer pe care îl activaÆi cu comanda create class.

2.2.2. ObiecteleObiectele se creeazå pe baza claselor definite. Obiectul este instanÆa unei clase. Pen-tru crearea unui obiect se foloseçte funcÆia createobject() care are sintaxa:

createobject('<nume_cls>' [,<p1>, <p2>, ...]

Rezultatul furnizat de funcÆie este de tip obiect (adicå referinÆå cåtre un obiect). Obiectul secreeazå pe baza clasei identificate prin <nume_cls>, iar pentru crearea sa se poate facetransfer prin parametrii din lista <p1>, <p2>, ... . Numele clasei va fi scris nu ca un identi-ficator, ci ca un çir de caractere. Pentru a putea folosi obiectul, trebuie så se atribuie referinÆacåtre obiect unei variabile de memorie. În acest mod, numele variabilei de memorie va puteafi folosit pentru a referi obiectul.

Exemplu:

Se creeazå un obiect pe baza clasei definite anterior. Variabilei de memorie obiect i seatribuie referinÆa cåtre acest obiect: obiect = createobject('clasa')În lucrul cu clase çi obiecte se folosesc urmåtorii operatori specifici:

Operatorul . (punct). Se foloseçte pentru a separa numele obiectului de numelepårintelui sau pentru a separa numele unui membru al obiectului (proprietate, metodåsau eveniment) de numele obiectului.Operatorul :: (delimitarea domeniului). Se foloseçte atunci când doriÆi så apelaÆidintr-o claså o metodå din clasa pårinte.

Astfel, sintaxa generalå pentru a avea acces la unul din membrii unui obiect este:<nume_obiect>.<nume_membru>

unde <nume_membru> este numele unei proprietåÆi, al unei metode sau al unui eveniment alobiectului.

Page 216: SGBD Visual Foxpro

Informatică216

În cadrul definiÆiei unei clase se pot folosi urmåtoarele referiri relative la membrii unui obiectsau la alte clase:

Parent - obiectul container al obiectului curent. This - obiectul curent. ThisForm - formularul care conÆine obiectul curent (formularul curent). ThisFormSet - setul de formulare curent care conÆine formularul curent.

Aceste cuvinte cheie se folosesc pentru a se face referiri la obiecte care nu au fost createîncå (ele au fost definite în cadrul clasei) çi implicit nu li s-au atribuit nume pentru a fi referite.

În timpul execuÆiei unui program puteÆi så adåugaÆi sau så înlåturaÆi obiecte dintr-unobiect container folosind metodele obiectului container: AddObject() pentru adåugarea çiRemoveObject() pentru înlåturarea unui obiect. Aceste metode sunt implementateimplicit în marea majoritate a claselor predefinite çi în clasa custom. Sintaxa lor este:

<nume_ob1>.addobject('<nume_ob2>' , '<nume_cls>')unde <nume_ob1> este numele obiectului container la care se adaugå obiectul cu numele<nume_ob2> ce se creeazå pe baza clasei <nume_cls> çi

<nume_ob1>.removeobject('<nume_ob2>')unde <nume_ob1> este numele obiectului container din care se înlåturå obiectul cu numele<nume_ob2>. Obiectul înlåturat nu va mai fi afiçat pe ecran.

ObservaÆii:În sintaxa celor douå funcÆii numele obiectului container a fost separat prin operatorul punctde numele metodei membru al obiectului container.

Exemplu:În acest exemplu puteÆi observa cum este folosit operatorul :: pentru a apela o metodådin clasa pårinte (în clasa F2 este apelatå metoda click definitå în clasa F1 care esteclasa pårinte a clasei F2) çi referinÆa This pentru a preciza cå este vorba de obiectulcurent, adicå obiectul creat pe baza clasei F2 (This.Backcolor se referå la proprietateaBackcolor a obiectului curent - culoarea fundalului):* Se creeaza clasa F1 care are ca parinte clasa Formdefine class F1 as Form procedure click

wait window 'S-a executat clic in formular'endproc

enddefine* Se creeaza clasa F2 care are ca parinte clasa F1define class F2 as F1 procedure click F1::click This.BackColor=This.BackColor+1

endprocenddefineExemplu:

În acest exemplu puteÆi observa cum pot fi folosite metodele proprii ale obiectului, cumpot fi modificate proprietåÆile unui obiect, cum se fac referirile la proprietåÆile çi metodeleunui obiect çi cum este folosit operatorul punct în aceste referiri:

Page 217: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 217

F1=createobject('form') && se creeaza un obiect formular* Se modifica valoarea proprietatilor caption (legenda) si* closable (daca formularul poate fi închis folosind meniul de* control - .T. sau nu - .F.)F1.caption='Exemplu' && Numele obiectului este separat de nume-F1.closable=.F. && le proprietatii prin operatorul punct.* Se adauga la formular o linie si doua butoane de comanda* folosind metoda proprie a obiectuluiF1.addobject('L1','Line')F1.addobject('B1','CommandButton')F1.addobject('B2','CommandButton')* Se modifica unele proprietati ale obiectelor adaugateF1.B1.caption='Da' && Operatorul punct a fost folosit pentru aF1.B2.caption='Nu' && separa proprietatea de obiect siF1.B1.visible=.T. && obiectul de obiectul container.F1.B2.visible=.T.F1.L1.visible=.T.F1.show && Se apeleaza metoda obiectului prin care; este afisat obiectul

Dacå adåugaÆi un obiect la un obiect container el nu va fi vizibil. Pentru a-l face vizibil tre-buie så i se atribuie proprietåÆii visible valoarea .T.

ObservaÆie:PuteÆi specifica proprietåÆile multiple pentru un obiect cu instrucÆiunea with ... endwith .InstrucÆiunea nu poate fi folositå în instrucÆiunea bloc pentru definirea clasei. Ea are sintaxa:

with <nume_ob> <secvenÆå_instrucÆiuni>endwith

Astfel, în exemplul precedent puteÆi modifica proprietåÆile obiectelor adåugate astfel:with F1

with B1caption='Da'visible=.T.

endwith

with B2caption='Nu'visible=.T.

endwith L1.visible=.T.endwith

Mecanismele programårii orientate pe obiecte sunt implementate în VisualFoxPro astfel:Încapsularea. Prin folosirea comenzii define class sunt incluse în aceeaçiclaså definiÆiile pentru proprietåÆile, metodele çi evenimentele unui obiect.Moçtenirea. O claså poate fi definitå pe baza definiÆiei altei clase folosind cla-uza as <nume_claså_pårinte>. ProprietåÆile clasei pårinte nu vor mai fi definiteîn clasa derivatå, în care vor fi definite numai proprietåÆile çi metodele noi.

Accesul la membrii unui obiectÎn tratarea accesului la membrii unui obiect pot så aparå urmåtoarele cazuri:

Page 218: SGBD Visual Foxpro

Informatică218

Datele unui obiect pot fi prelucrate prin metodele proprii obiectului. În timpul acestor pre-lucråri pot så fie necesare diferite variabile temporare. Acestea trebuie definite ca proprie-tåÆi ale obiectului pentru a putea fi folosite în interiorul obiectului, dar trebuie izolate deexteriorul lui, deoarece modificarea lor din exterior ar putea afecta prelucrårile din interior.Unele dintre subprograme sunt folosite intern de metodele obiectului çi nu trebuie såfie folosite çi din exterior.

Din aceste douå cazuri se observå cå este necesar så fie controlat accesul la membriiunui obiect. De aceea, membrii unui obiect pot fi:

Publici. Accesul la aceçti membri este posibil din interiorul clasei, dar çi din exteriorul ei.ProtejaÆi. Accesul la aceçti membri este posibil din interiorul clasei çi din interiorulunei clase derivate din ea. Aceçti membri vor fi declaraÆi protejaÆi prin intermediulclauzei protected din definiÆia clasei.

Exempludefine class ang as Custom

protected data_n nume=space(20) pren=space(20) adresa=space(30) data_n={ / / }

procedure data_nsreturn this.data_n

endprocenddefineProprietatea data_n este protejatå çi nu poate fi modificatå din exteriorul clasei, în schimbmetoda data_ns nu este protejatå çi poate furniza valoarea proprietåÆii data_n.

ObÆinerea de informaÆii despre obiecteObÆineÆi informaÆii despre obiecte folosind urmåtoarele funcÆii:

aclass() - plaseazå într-un vector numele clasei unui obiect çi ale stråmoçiloracestuia. FuncÆia returneazå un rezultat numeric care va reprezenta numårul declase plasate în vector. În primul element al vectorului va fi scris numele claseiobiectului. Sintaxa funcÆiei este: aclass(<nume_vector>,<nume_ob>). ainstance() - plaseazå într-un vector instanÆele unei clase. FuncÆia retuneazå unrezultat numeric care va reprezenta numårul de instanÆe plasate în vector. SintaxafuncÆiei este: ainstance(<nume_vector>,<nume_cls>). amembers() - plaseazå într-un tablou de memorie numele membrilor unui obiect(proprietåÆi, metode, evenimente çi obiecte membre). FuncÆia returneazå un rezultatnumeric care reprezintå numårul de membrii ai obiectului, memoraÆi în tablou.Sintaxa funcÆiei este: amembers(<nume_tablou>,<nume_ob>[,1|2]). Implicit secreeazå un vector în care vor fi memorate numai proprietåÆile. Explicit, dacå seprecizeazå argumentul 1 se va crea o matrice bidimensionalå în care în primacoloanå va fi scris numele membrului çi în coloana a doua tipul membrului (Property,Event, Method, Object), iar dacå se precizeazå argumentul 2 se va crea un vectorcare va conÆine numai numele obiectelor membre.

Page 219: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 219

Afiçarea listei obiectelor active (numele lor, propietåÆile, metodele çi evenimentele asocia-te) se face cu comanda:

display object [ like <sablon>]

CondiÆia de existenÆå a unui obiectDupå eliberarea unui obiect (de exemplu prin închiderea formularului container), variabila dememorie care a fost folositå pentru referirea lui va conÆine valoarea null. Çtergerea ei din me-morie se va face printr-o comandå explicitå (release):

release <listå_nume_obiecte>

Pentru a testa dacå existå un obiect, folosiÆi urmåtoarea condiÆie:type('<nume_ob>')='o' and not isnull (<nume_obiect>)

adicå trebuie îndeplinite douå condiÆii: tipul variabilei de memorie folosite pentru referireaobiectului trebuie så fie o (object) çi variabila de memorie så nu aibå valoarea null,deoarece dacå obiectul a fost eliberat, variabila are valoarea null.

Atunci când se creeazå o instanÆå a unei clase se påstreazå în memorie definiÆia clasei.Aceastå definiÆie råmâne în memorie çi dupå ce obiectul a fost eliberat. Ea trebuieçtearså explicit cu comanda:

clear <nume_cls>2.2.3. Studiu de cazSå se creeze un obiect care så descrie comportamentul unui numår complex. Obiectul vaavea proprietåÆile re (partea realå a numårului), im (partea imaginarå a numårului) çimodul (modulul unui numår complex) çi metoda m pentru calculul modulului.

Pentru a crea çi a testa un astfel de obiect se vor scrie urmåtoarele linii de program într-unfiçier surså, la fel ca çi programele pe care le-aÆi scris folosind limbajul gazdå. Blocul in-strucÆiunii define class se scrie la sfârçit, dupå instrucÆiunile din program, la fel ca çisubprogramele. Prin instrucÆiunile input atribuiÆi valori proprietåÆilor re çi im.

Exemplul 1

Pentru construirea metodei modul se va folosi un subprogram de tip procedurå. PrininstrucÆiunea z.m apelaÆi metoda m pentru a calcula modulul, iar prin instrucÆiunea?z.modul afiçaÆi valoarea proprietåÆii modul.

clearset talk offz=CreateObject('Complex')input 're (partea reala a numarului)= ' to z.reinput 'im (partea imaginara a numarului)= ' to z.imz.m?z.moduldefine class complex as custom re=0 im=0 modul=0

procedure mthis.modul=sqrt(this.re**2 +this.im**2)

endprocenddefine

Page 220: SGBD Visual Foxpro

Informatică220

Exemplul 2

Pentru construirea metodei modul se va folosi un subprogram de tip funcÆie. Prin instruc-Æiunea ?z.m() afiçaÆi valoarea furnizatå de metoda m. ObservaÆi cå pentru metodele care re-turnezå valori folosite în expresii trebuie så scrieÆi între paranteze lista parametrilor actuali (înacest caz lista este vidå; nu existå parametri pentru transferul datelor).

clearset talk offz=CreateObject('Complex')input 're (partea reala a numarului)= ' to z.reinput 'im (partea imaginara a numarului)= ' to z.im?z.modul()define class complex as custom re=0 im=0 m=0

function modulthis.m=sqrt(this.re**2+this.im**2)return this.m

endfuncenddefineExemplul 3

Pe baza clasei complex se defineçte o claså nouå complex1 care va conÆine în plus o metodåpentru afiçarea numårului complex. Pentru definirea acestei metode se va folosi o metodåinternå a clasei nrc (metodå protejatå) pentru calcularea cifrelor unui numår çi proprietatea nccare are ca valoare numårul de cifre al pårÆii întregi sau imaginare a numårului complex.Aceastå proprietate este folositå numai intern çi de aceea este protejatå. Ea este necesaråpentru a stabili numårul de poziÆii afiçabile ale unui numår pentru funcÆia str(). Prin instruc-Æiunea z.afiçare se apeleazå metoda afisare pentru afiçarea unui numår complex. Clasacomplex1 a moçtenit toate proprietåÆile çi metodele clasei complex.

clearset talk offz=CreateObject('Complex1')input 're (partea reala a numarului)= ' to z.reinput 'im (partea imaginara a numarului)= ' to z.im?z.modul()z.afisaredefine class complex as custom re=0 im=0 m=0

function modulthis.m=sqrt(this.re**2+this.im**2)return this.m

endfuncenddefinedefine class complex1 as complex

protected nr nr=0

Page 221: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 221

procedure afisare? 'Numarul complex este: '+str(this.re,this.nrc(this.re))do casecase this.im>0?? ' + i*'+str(this.im,this.nrc(this.im))

case this.im<0?? ' - i*'+str(abs(this.im),this.nrc(this.im))

endcaseendprocprotected function nrcparameter vthis.nr=1do while v<>0

v=int(v/10)this.nr=this.nr+1

enddoreturn this.nr

endfuncenddefine

2 . 3 . P r i n c i p i i l e p r o gr a măr i i c o n d u s e d e ev e n i m e n t e

Programarea orientatå pe obiecte a dus la dezvoltarea programårii conduse de eve-nimente. Dacå în cazul programårii clasice aplicaÆia era o colecÆie de instrucÆiuni care seexecutau în ordinea în care au fost scrise, în cazul programårii conduse de evenimenteaplicaÆia este un ansamblu de subprograme care nu se executå într-o ordine prestabilitå,ci în funcÆie de producerea unor evenimente (deplasarea mouse-ului, executarea unui cliccu mouse-ul, glisarea unui obiect, apåsarea unei taste sau a unei combinaÆii de tasteetc). ApariÆia evenimentului este aleatorie çi de aceea programul trebuie så çtie cum såråspundå la un anumit eveniment. Acest lucru se realizeazå prin asocierea la fiecareeveniment a unei secvenÆe de cod prin care se descriu operaÆiile care trebuie executate.

Programarea conduså de evenimente se bazeazå pe bucla evenimentului (event loop),adicå un mediu interactiv în execuÆie care poate fi:

activat cu comanda read events care porneçte procesorul de evenimente care vasesiza apariÆia unui eveniment çidezactivat cu comanda clear events care îl opreçte.

Dupå oprirea procesorului de evenimente programul va continua cu prima instrucÆiunecare urmeazå dupå comanda read event.

2 . 4 . F o l o s i r e a p r o g ra m ăr i i o r i e n t a t e p e ob i e c t e în r e a l i z a r e a

i n t e r f e ţ e i u n e i a p l i c a ţi i

InterfaÆa graficå cu o aplicaÆie afiçeazå mai multe ecrane cu obiecte prin intermediul cårora utili-zatorul interacÆioneazå cu aplicaÆia pentru a controla evoluÆia ei sau pentru a cere så executediferite procese prin care se prelucreazå datele în vederea obÆinerii de informaÆii (de exemplu,procesul de cåutare într-o bazå de date a unor date care corespund unui anumit criteriu).

Page 222: SGBD Visual Foxpro

Informatică222

Orice interfaÆå graficå este realizatå din obiecte care au asociateproprietåÆi, metode çi evenimente.

Obiectul virtual este o sumå de proprietåÆi, metode çi evenimente. Asupra obiectelorvirtuale se pot folosi în general urmåtoarele acÆiuni: clic, dublu clic, glisare çi apåsareaunei taste. Prin asociere cu balonul så identificåm care sunt proprietåÆile, metodele çievenimentele asociate unui obiect, cum ar fi butonul declançator dintr-o casetå de dialog.ProprietåÆile sale sunt numele såu, poziÆia în care este afiçat faÆå de marginile ca-setei dedialog, culoarea butonului çi a textului etc. AcÆiunile care se pot executa asupra butonuluisunt: indicare cu mouse-ul çi clic sau apåsarea unei anumite taste. Evenimentulreprezintå efectul acÆionårii butonului prin intermediul mouse-ului sau al tastaturii, adicåråspunsul sistemului în urma acÆionårii butonului. De exemplu, evenimentul asociat bu-tonului Open este deschiderea obiectului selectat în caseta de dialog (fiçier sau dosar).

Programarea orientatå pe obiecte poate fi folositå pentru realizarea unei interfeÆe deoare-ce sistemul de gestiune a bazelor de date Visual FoxPro pune la dispoziÆia utilizatoruluimai multe clase vizuale predefinite:

Numele clasei Clasa predefinitå SemnificaÆia obiectului vizualCheckBox Comutator Control care indicå dacå o opÆiune este activå (on)

sau nu (off).Column Coloanå într-o

grilåContainer care conÆine antetul de coloanå çi alteobiecte care pot så aparå într-o coloanå a unei gri-le; nu poate fi folosit independent, ci numai într-uncontainer de tip grilå.

ComboBox Listå combinatå Control similar unei combinaÆii dintre o casetå de text(TextBox) çi o listå (ListBox) în care puteÆi introduceo valoare sau o puteÆi alege dintr-o listå.

CommandButton Buton decomandå

Control asociat unei comenzi: dacå la un momentdat executaÆi clic pe un buton, se executå comandaasociatå butonului.

Command Group

Grup de butoane de comandå

Container care poate conÆine numai un grup debutoane de comandå care pot fi tratate ca o unitate.

Container Obiect container Container care conÆine alte obiecte neprotejate(este permis accesul la obiectele conÆinute).

Control Obiect container Container care poate include çi obiecte ale utiliza-torului, obiectele incluse fiind protejate (nu este per-mis accesul la obiectele conÆinute).

EditBox Zonå de editaretext

Control care furnizeazå o zonå pentru introducereasau vizualizarea unui text într-un formular (permiteafiçarea pe mai multe linii).

Form Formular Container care poate conÆine o colecÆie de maimulte pagini (care se pot comporta ca o casetå dedialog sau ca o fereastrå standard), controale çicontainere pentru afiçarea çi editarea datelor çicontroale utilizator (custom).

Page 223: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 223

Numele clasei Clasa predefinitå SemnificaÆia obiectului vizualFormSet Set de formulare Container care poate conÆine unul sau mai multe for-

mulare legate între ele sau bare cu instrumente.Grid Grilå Container care creeazå o grilå pentru prezentarea da-

telor pe rânduri çi coloane, sub formå de tabel; poateconÆine numai controale de tip coloanå într-o grilå.

Header Antet de coloanå Obiect care conÆine antetul coloanei çi care nu poa-te fi folosit independent, ci numai într-un containerde tip coloanå într-o grilå.

Image Imagine Control care permite introducerea unei imaginiîntr-un formular; imaginea este memoratå într-unfiçier bitmap (.bmp).

Label Etichetå Control care conÆine un text ce descrie o zonå deformular sau un control.

Line Linie Control care deseneazå într-un formular o linie peverticalå, pe orizontalå sau pe diagonalå.

ListBox Listå Control care furnizeazå o listå de articole din careutilizatorul poate alege unul dintre ele.

OLEContainerControl

Control detip OLE

Container cu controale OLE (fiçiere .ocx; au propriulset de evenimente) çi obiecte OLE inserabile (obiec-te OLE create cu o altå aplicaÆie - Word, Excel etc.;ele nu au propriul set de evenimente).

OLEBoundControl

Control containerde tip OLE

Controale folosite în formulare sau rapoarte carepermit afiçarea conÆinutului unui obiect OLE într-uncâmp General al unui tabel.

OptionButton Buton de opÆiuni(radio)

Obiect care nu poate fi folosit independent, ci într-uncontainer de tip grup de butoane de opÆiuni pentru areprezenta o opÆiune.

OptionButtonGroup

Grup cu butoanede opÆiuni (radio)

Container folosit pentru a grupa numai controale detip butoane de opÆiuni; puteÆi folosi un buton pentrua alege o opÆiune dintr-un set de opÆiuni.

Page Paginå Container folosit pentru crearea casetelor de dialog cumai multe secÆiuni (tabs); nu poate fi folosit indepen-dent, ci într-un container de tip set de pagini çi poateconÆine orice controale çi containere.

PageFrame Set de pagini Container care conÆine una sau mai multe pagini.Separator Separator pe bara

de utilitåÆiObiect care nu poate fi folosit independent, ci într-uncontainer de tip barå cu instrumente; este folosit pen-tru a introduce spaÆii între controale cu scopul de acrea grupuri de butoane.

Shape Formå Control care creeazå o formå care poate fi afiçatå ca ocombinaÆie de dreptunghiuri, cercuri çi elipse.

Page 224: SGBD Visual Foxpro

Informatică224

Numele clasei Clasa predefinitå SemnificaÆia obiectului vizualSpinner Casetå de text cu

derulorControl care permite incrementarea sau decremen-mentarea unei valori fie prin scrierea valorii noi, fieexecutând clic pe sågeata de incrementare sau pesågeata de decrementare.

TextBox Casetå de text Control care furnizeazå o zonå pentru introducereasau vizualizarea unui text într-un formular; permiteafiçarea pe o singurå linie.

Timer Obiect de tip ceas Control invizibil folosit pentru a executa secvenÆede cod la intervale de timp egale (controleazåevenimentele recurente din aplicaÆie).

ToolBar Barå cuinstrumente

Container care poate conÆine orice controale; esteformat dintr-un set de butoane pe care puteÆiexecuta clic ca så cereÆi excutarea unei anumitesarcini.

AÆi observat cå obiectele vizuale pe care le puteÆi crea pot fi simple sau containere. Îngeneral, obiectele container nu pot conÆine orice obiecte. De exemplu:

Container ConÆinutgrup de butoane de comandå butoane de comandågrup cu butoane de opÆiuni butoane de opÆiuniset de pagini paginipaginå controale, containere, obiecte utilizatorset de formulare formulare, bare de instrumenteformular set de pagini, controale, containere, obiecte utilizatorgrilå coloane într-o grilåcoloanå într-o grilå antet de coloanå çi orice obiect cu excepÆia formulare-

lor, a seturilor de formulare, a coloanelor într-o grilå çi abarelor cu instrumente

barå de instrumente controale, seturi de paginå, containere

AÆi mai observat cå unele obiecte nu pot fi definite independent, ci numai în interiorul unuicontainer. De exemplu:

Obiect Containerantet de coloanå coloanå într-o grilåbuton pentru opÆiune grup de butoane pentru opÆiunicoloanå într-o grilå grilåpaginå set de paginiseparator barå de instrumente

Pe lângå aceste obiecte predefinite care creeazå obiecte vizuale într-o aplicaÆie, maiputeÆi folosi urmåtoarele obiecte predefinite:

Page 225: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 225

Numele clasei Clasa predefinitå SemnificaÆia obiectului vizualCursor Cursor Obiect creat atunci când se adaugå un tabel sau o vi-

zualizare la mediul de date dintr-un tabel, dintr-un for-mular sau dintr-un set de formulare; permite specifica-rea proprietåÆilor tabelului sau ale vizualizårii atuncicând este lansat în execuÆie formularul sau raportul.

Relation RelaÆie Obiect creat atunci când se stabileçte o relaÆie întredouå tabele într-un raport, formular sau set de formu-lare; permite determinarea modului în care sunt legatecele douå tabele.

DataEnvironment

Mediu de date Obiect container pentru obiectele cursor çi relaÆie asoci-ate unui formular, raport sau set de formulare; se creea-zå o datå cu raportul, formularul sau setul de formulare.

Exemplu:

Folosind clasele vizuale predefinite s-au creat trei formulare: primul formular conÆine oetichetå çi douå butoane de comandå, care dacå vor fi acÆionate vor deschide fiecarecâte un alt formular u o etichetå çi un buton de comandå. Fiecare buton reacÆioneazådiferit la evenimentul clic cu mouse-ul, çi de aceea a fost scriså câte o procedurå pentrufiecare eveniment: b1.click, b2.click, b3.click çi b4.click. Metoda release se foloseçtepentru a çterge din memorie obiectul de tip formular.

forma1=createobject('Form1')forma2=createobject('Form2')forma3=createobject('Form3')* Afiseaza primul formular:forma1.showread eventsdefine class form1 as Form

* Se definesc proprietatile* formularului form1:

caption='Intrebare'closable=.F.height=143width=386

Page 226: SGBD Visual Foxpro

Informatică226

* Se adauga obiecte la* formular

add object text as Labeladd object b1 as CommandButtonadd object b2 as CommandButton

* Se definesc proprietatile* obiectului text: text.caption='Ati rezolvat; testul din capitolul; precedent?' text.height=16 text.left=45 text.top=34

text.width=376 text.visible=.T.* Se definesc proprietatile* obiectului b1: b1.caption='Da' b1.height=33 b1.left=40 b1.top=96 b1.width=114 b1.visible=.T.* se definesc proprietatile* obiectului b2: b2.caption='Nu' b2.height=33 b2.left=222 b2.top=96 b2.width=114 b2.visible=.T.* Se defineste codul evenimen-* tului click pe obiectul b1:

procedure b1.clickthisform.release

* Afiseaza al doilea formular: forma2.show

endproc* Se defineste codul evenimen-* tului click pe obiectul b2:

procedure b2.clickthisform.release

* Afiseaza al treilea formular: forma3.show

endprocenddefinedefine class form2 as Form

caption='Raspuns'closable=.F.height=143width=346

add object text1 as Labeladd object b3 as CommandButton

text1.caption='Felicitari; !!!!!!!!!!!!' text1.height=16 text1.left=110 text1.top=34 text1.width=376 text1.visible=.T. b3.caption='Terminare' b3.height=33 b3.left=110 b3.top=86 b3.width=114 b3.visible=.T.

procedure b3.click* Elibereaza formularul si* dezactiveaza procsorul de* evenimente:

thisform.releaseclear events

endprocenddefinedefine class form3 as form

caption='Raspuns'closable=.F.height=143width=346add object text2 as Labeladd object b4 as CommandButton

text2.caption='????????????; !!!!' text2.height=16 text2.left=110 text2.top=34 text2.width=376 text2.visible=.T. b4.caption='Terminare' b4.visible=.T. b4.height=33 b4.left=110 b4.top=86 b4.width=114

procedure b4.click* Elibereaza formularul si* dezactiveaza procesorul de* evenimente:

thisform.releaseclear events

endprocenddefine

Page 227: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 227

2 . 5 . B i b l i o t e c i l e d e c la s e

Biblioteca de clase (class library) este folositå pentru a påstra o colecÆie de clasevizuale. Se memoreazå într-un fiçier cu extensia .vcx.

Asupra unei biblioteci de clase se pot executa urmåtoarele operaÆii:

Comanda create classlib are sintaxa:create classlib <nume_bib>

çi creeazå o bibliotecå de clase cu numele <nume_bib> (implicit çi numele fiçierului).Biblioteca va fi vidå.

Comanda add class are sintaxa:add class <nume_cls> [of <nume_bib1>] to <nume_bib1> [overwrite]

La biblioteca precizatå prin <nume_bib1> se adaugå clasa identificatå prin <nume_cls>.Implicit aceastå claså poate fi în orice bibliotecå deschiså. Explicit ea este preluatå dinbiblioteca precizatå prin clauza of çi identificatå prin <nume_bib2>. Biblioteca nu poate fiadåugatå dintr-un program, dintr-o aplicaÆie sau dintr-un fiçier de proceduri.

Comanda remove class are sintaxa:remove class <nume_cls> of <nume_bib>]

çi înlåturå definiÆia clasei cu numele <nume_cls> din biblioteca precizatå prin <nume_bib>.

Comanda set classlib to are sintaxa:set classlib to <nume_bib> [additive]

Biblioteca

OpreaÆii deîntreÆinere

create classlib

crearea bibliotecii

add class

adåugarea unei clase

remove class

înlåturarea unei clase

OpreaÆii deexploatare

închiderebibliotecå

set classlib to

deschidere bibliotecå

release classlib

biblioteca precizatå

set classlib to

toate bibliotecile

Page 228: SGBD Visual Foxpro

Informatică228

când deschide biblioteca precizatå prin <nume_bib> sau sintaxa:set classlib to

când închide toate bibliotecile deschise.

Comanda release classlib are sintaxa:release classlib <nume_bib>

çi închide biblioteca precizatå prin <nume_bib>.

ObservaÆie:Dacå aÆi deschis o bibliotecå, toate definiÆiileclaselor vor fi påstrate în memoria internå. DacåvreÆi så le çtergeÆi, puteÆi folosi comanda clear:

clear <nume_bib>Trebuie så aveÆi grijå ca atunci când executaÆi aceastå operaÆie de çtergere så nu existeo instanÆå a nici unei clase din bibliotecå.

CreaÆi un fiçier care conÆine un program surså çi-l lansaÆi în execuÆie

1. CreaÆi un obiec care så conÆinå proprietåÆile nume, prenume, adresa, data_n (datanaçterii), vârsta çi metoda pentru calcularea vârstei. Metoda poate fi descriså fiefolosind o procedurå, fie folosind o funcÆie. TestaÆi programul.

Metoda descriså cu procedurå:ang = createobject('angajati')with ang .nume = 'Popa' .pren = 'Ion'.adresa = 'str. Zorilor nr. 34'

.data_n = {02/07/83}endwithclear? ang.nume + ' ' + ang.pren? ang.adresa? ang.data_nang.v

? ang.varstadefine class angajati AS custom nume = space(20) pren = space (20) adresa = space (30) data_n = { \ \ } varsta = 0

procedure vthis.varsta=int((date()-;

this.data_n)/365)endproc

enddefineMetoda descriså cu funcÆie (observaÆi informaÆiile afiçate despre obiect):

*Scrieti secventa corespunza-*toare de instructiunicleardisplay object like ang? ang.nume + ' '+ ang.pren? ang.adresa? ang.data_n? ang.v()??' ani'define class angajati as custom nume = space(20)

pren = space (20) adresa = space (30) data_n = { \ \ } varsta = 0

function vthis.varsta=int((date()-;

this.data_n)/365)return this.varsta

endfuncenddefine

Ce se întâmplå dacå înlåturaÆi dintr-obibliotecå de clase o claså pårintepentru alte clase din bibliotecå?

?

Page 229: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 229

2. TestaÆi funcÆia aclass() cu ajutorul urmåtorului program:clearobiect = createobject("forma11")for ncount = 1 to aclass(a, obiect) && se creeaza vectorul

? a(ncount) && se afiseaza numele claselorendforrelease obiectdefine class forma1 as formenddefinedefine class forma11 as forma1enddefine3. TestaÆi funcÆia ainstance() cu ajutorul urmåtorului program:clear allobiect1 = createobject('form')obiect2 = createobject('form')obiect3 = createobject('form')clear? ainstance(a,'form') && furnizeaza rezultatul 3 (trei instante)display memory like a && afiseaza referintele4. TestaÆi funcÆia amembers() cu ajutorul urmåtorului program:clearforma=createobject"form") && creeaza un formular= amembers(a1, forma)= amembers(a2, forma1, 1)= amembers(a3, forma1, 2)display memory like a?5. TestaÆi lucrul cu biblioteci:create classlib bibcreate class f1 of bib as 'Form'set classlib to bib additiverelease classlib bib

TT est pentru evaluare:

1. Se considerå urmåtorul program:

clearset talk offpunct=CreateObject("puncte")punct.generare?'Distanta fata de origine: '??punct.distanta()?'Unghiul fata de sistemul de; axe: '??punct.argument()define class puncte as custom x=0 y=0 d=0

a=0procedure generare? 'Coordonatele punctului:'input 'x= ' to this.xinput 'y= ' to this.y

endprocfunction distantathis.d=sqrt(this.x**2+;

this.y**2)return this.d

endfuncfunction argumentif this.x=0

Page 230: SGBD Visual Foxpro

Informatică230

if this.y=0this.a=0

elsethis.a=pi()/2

endifelsethis.a=atan(abs(this.x/;

this.y))if this.x<0

if this.y<=0this.a=this.a+pi()

else

this.a=-this.a+pi()endif

elseif this.y<0

this.a=-a+2*pi()endif

endifendifthis.a=this.a*180/pi()return this.a

endfuncenddefine

a. IdentificaÆi clasele çi obiectele, proprietåÆile çi metodele obiectului.b. ExplicaÆi ce realizeazå programul.c. Pe baza acestui program definiÆi obiectul dreaptå cu metodele generare çi calculul

lungimii çi obiectul dreptunghi cu metodele generare çi calculul ariei çi al perimetrului.

2. IdentificaÆi çi corectaÆi erorile din urmåtorul program:

clearset talk offz=CreateObject("Complex")z.citire?z.modul()define class complex as customdimension c(2)m=0procedure citire

input 'x= ' to z.c(1)input 'y= ' to z.c(2)

endprocfunction modulthis.m=sqrt(this.c(1)**2+;

this.c(2)**2)return this.m

endfuncenddefine

3. ComparaÆi urmåtoarea variantå de program cu cea prezentatå ca exemplu în studiulde caz. VerificaÆi dacå aceastå variantå este corectå. Ce concluzie trageÆi din compa-rarea celor douå versiuni?

clearset talk offz=CreateObject("Complex")input 're= ' to z.reinput 'im= ' to z.im?z.m(z.re,z.im)define class complex as custom re=0

im=0 m=0 function modul parameter re,im

this.modul=sqrt(re**2+im**2) return this.m endfuncenddefine

4. AdåugaÆi obiectului complex metoda pentru citirea numårului complex:

procedure citireinput 're= ' to this.re

input 'im= ' to this.imendproc

ModificaÆi corespunzåtor programul astfel încât citirea numårului complex så se facåprin intermediul acestei metode.

Page 231: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 231

5. AdåugaÆi obiectului complex o metodå pentru calculul conjugatului numårului complexçi pentru calculul argumentului numårului complex. ScrieÆi un program în care folosiÆiaceste metode.

6. DefiniÆi o claså de obiecte pentru adunarea çi înmulÆirea a douå numere complexe.ScrieÆi un program în care folosiÆi obiecte din aceastå claså.

7. DefiniÆi o claså de obiecte prin care administraÆi o listå de numere. Clasa trebuie såconÆinå o metodå pentru adåugarea unui element la listå, çtergerea ultimului elementdin listå, afiçarea elementelor listei, cåutarea unui element în listå çi afiçarea elemen-tului cu valoarea maximå. ScrieÆi un program în care folosiÆi obiecte din aceastå claså.

8. DefiniÆi o claså de obiecte prin care administraÆi fracÆiile. Clasa trebuie så conÆinå metodepentru citirea numitorului çi a numåråtorului fracÆiei, pentru simplificarea fracÆiei, pentruafiçarea fracÆiei simplificate, pentru calculul fracÆiei ca numår zecimal, pentru afiçareafracÆiei ca numår zecimal. ScrieÆi un program în care folosiÆi obiecte din aceastå claså.

9. DefiniÆi o claså de obiecte prin care administraÆi mulÆimi de numere. Clasa trebuie såconÆinå metode pentru citirea çi afiçarea mulÆimii, pentru reuniunea, intersecÆia çi dife-renÆa a douå mulÆimi çi pentru determinarea apartenenÆei unui element la mulÆime.MulÆimile vor fi descrise prin vectori cu elemente cu valori distincte. ScrieÆi un programîn care folosiÆi obiecte din aceastå claså.

10. DefiniÆi o claså de obiecte prin care administraÆi polinoame. Clasa trebuie så conÆinåmetode pentru citirea çi afiçarea polinoamelor, pentru adunarea çi înmulÆirea a douåpolinoame çi pentru calcularea valorii unui polinom pentru un x precizat. Polinoamele vorfi descrise prin vectori în care în prima poziÆie se va scrie gradul polinomului, iar înurmåtoarele n+1 poziÆii, coeficienÆii polinomului. ScrieÆiun program în care folosiÆi obiecte din aceastå claså.

ÎncercaÆi:Adevårat/Fals:1. În definiÆia unei clase de obiecte metodele se scriu înaintea proprietåÆilor.2. Într-un program definiÆia clasei de obiecte se face înaintea de a crea obiectul.3. Într-o metodå nu se poate defini o claså de obiecte.4. Parametrii metodelor pot avea acelaçi nume ca çi proprietåÆile obiectului.5. InstrucÆiunea with ... endwith poate fi folositå în instrucÆiunea pentru definirea unei clase.6. Clasele pot fi adåugate la biblioteci din fiçiere de programe.7. O claså pårinte moçteneçte proprietåÆile çi metodele de la urmaçi.8. În definiÆia unei clase trebuie precizatå obligatoriu clasa pårinte.9. AcÆiunea metodelor çi råspunsul la evenimente se defineçte cu ajutorul subprogramelor.

CompletaÆi:1. InstrucÆiunea pentru definirea clasei este o instrucÆiune ........... delimitatå de cuvintele

cheie ............................... çi ..............................2. AcÆiunea metodelor se defineçte prin intermediul .........................

Page 232: SGBD Visual Foxpro

Informatică232

AlegeÆi råspunsurile corecte:1. PuteÆi adåuga un obiect la un obiect container cu:

a) instrucÆiunea Add Objectb) metoda AddObjectc) instrucÆiunea Add Class

2. AflaÆi câÆi stråmoçi are o claså folosind funcÆia:a) aclass() b) ainstance() c) amembers()

3. AflaÆi câte obiecte au fost realizate pe baza aceleiaçi clase folosind funcÆia:a) aclass() b) ainstance() c) amembers()

4. Form este:a) o claså vizualå de tip container predefinitåb) o claså vizualå simplå predefinitåc) un obiect vizual din clasa predefinitå PageFrame.

5. Header este:a) un obiect independent predefinitb) un obiect predefinit dependent de clasa Columnc) un obiect predefinit dependent de clasa Grid.

RåspundeÆi:1. RealizaÆi o comparaÆie între modurile în care este implementatå programarea pe

obiecte în limbajul de programare structurat studiat çi limbajul gazdå Visual FoxPro.2. Ce tehnici caracteristice programårii pe obiecte sunt implementate în Visual FoxPro?

RR åspunsuri:Adevårat/Fals: 1-F; 2-F; 3-A; 4-A; 5-F; 6-F; 7-F; 8-A; 9-A;.CompletaÆi: 1-bloc, define class, enddefine; 2-subprogramelor;AlegeÆi råspunsurile corecte: 1-b; 2- a; 3- b; 4-a; 5-b.

3 . P r o g r a m a r e a v i z u a lă

3 . 1 . R e a l i z a r e a i n t e rf e ţe i

3.1.1. Obiectele vizualeInterfaÆa poate fi construitå cu ajutorul obiectelor vizuale. Ele sunt de douå tipuri:

formulare çicontroale.

Controalele sunt obiecte care sunt create în general în formulare çi suntfolosite pentru a asigura interacÆiunea utilizatorului cu aplicaÆia: prin

intermediul lor utilizatorul comunicå aplicaÆiei datele de intrare çi proceselepe care trebuie så le execute, iar aplicaÆia comunicå utilizatorului datele de

ieçire çi mesaje de informare sau de atenÆionare.

Page 233: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 233

Fiecare tip de control are propriul såu set de proprietåÆi, metode çi evenimente care îl facpotrivit unui anumit scop. Unele dintre cotroalele pe care le puteÆi folosi în aplicaÆii suntcele mai potrivite pentru introducerea çi afiçarea datelor. Altele vå permit så cereÆi exe-cutarea unui proces în cadrul aplicaÆiei sau vå permit accesul la alte aplicaÆii ca så puteÆiprelucra unele date ca çi cum ar face parte din propria aplicaÆie.

Într-o interfaÆå pot fi folosite urmåtoarele tipuri de controale:controalele pentru executarea acÆiunilor: butonul de comandå, opÆiunea de meniu;controalele pentru introducerea çi afiçarea datelor: eticheta, caseta de text, zonade editare, caseta de text cu derulor, grila;controalele care îi permit utilizatorului så aleagå: comutatorul, lista, lista combi-natå, grupul cu butoane de opÆiuni;controalele grafice: linia, chenarul, imaginea, forma;controalele care îi permit afiçarea obiectelor inserabile create cu alte aplicaÆii.

Formularul este un obiect container care grupeazå alte obiecte. AreproprietåÆi specifice çi metode care determinå comportamenul såu în diferite

situaÆii.

SuprafaÆa de afiçare a formularelor este împårÆitå în douå zone:bara de titlu (title bar) împreunå cu butoanele de manipulare ale formularului çispaÆiul de lucru (workspace) în care pot fi afiçate diferite controale cu care poateinteracÆiona utilizatorul.

Formularele pot fi de tip:Fereastrå (window). Utilizatorul interacÆioneazå cu fereastra atunci când lanseazå înexecuÆie aplicaÆia. Ferestrele pot fi redimensionate çi pot fi deplasate pe ecran. Înfereastra de aplicaÆie pot fi deschise alte formulare de tip fereastrå numite ferestredocument în care utilizatorul poate prelucra diferite colecÆii de date ale aplicaÆiei (înaplicaÆia Visual FoxPro, fereastra care se deschide atunci când prelucraÆi un fiçiersurså este o fereastrå document). Ferestrele asociate unei aplicaÆii pot avea sub barade titlu o barå de meniu cu titlurile meniurilor pe care aplicaÆia le pune la dispoziÆiautili-zatorului. Ferestrele document nu au barå de meniuri.Casetå de dialog (dialog box). Se deschide în urma unei comenzi prin care se ceredeclançarea unui proces. Prin intermediul ei utilizatorul poate så furnizeze datele nece-sare executårii unui proces pe care l-a activat fie prin acÆionarea unui buton de coman-då, fie prin alegerea unei opÆiuni de meniu. Mai poate fi folositå pentru ca aplicaÆia såafiçeze pentru utilizator informaÆii despre desfåçurarea unui proces. Spre deosebire deformularul fereastrå, caseta de dialog nu are buton de minimizare sau de maximizare,poate fi deplasatå pe ecran, dar nu poate fi redimensionatå. Cele mai folosite controaleîntr-o casetå de dialog sunt casetele de text, etichetele çi butoanele de comandå.Casetele de dialog pot fi simple sau cu secÆiuni. O casetå de dialog cu secÆiuni (tabs)poate afiça în aceeaçi zonå a formularului mai multe seturi de obiecte. Fiecare set deobiecte formeazå o secÆiune. La un moment dat este afiçatå o singurå secÆiune. Serecomandå acest tip de casetå atunci când într-o casetå trebuie create foarte multecontroale çi ele nu încap în spaÆiul formularului. Controalele se vor grupa dupå anumitecriterii çi fiecare grup va fi afiçat într-o secÆiune a casetei. Un exemplu de casetå dedialog cu secÆiuni este caseta Option a interfeÆei Visual FoxPro.

Page 234: SGBD Visual Foxpro

Informatică234

Bare cu instrumente (toolbar). Este o casetå de dialog mai specialå care conÆinenumai butoane de comandå reprezentate în general prin pictograme. Ea poate fimobilå (float), adicå poate fi afiçatå oriunde în interiorul ferestrei de aplicaÆie sau fixå(dock), adicå poate fi lipitå de una dintre marginile ferestrei de aplicaÆie. Bara de titlueste afiçatå numai în barele cu instrumente flotante.

Pentru implementarea acestor obiecte pentru interfaÆå, Visual FoxPro pune la dispoziÆia pro-gramatorului urmåtoarele obiecte vizuale predefinite:

Pentru formulare: FormSet, Form, Page,PageFrame çi ToolBar.Pentru controale: EditBox, TextBox, Label,Spinner, Grid, OptionButtonGroup, ListBox,ComboBox, CheckBox, CommandButton.

Crearea obiectelor de interfaÆå se poate face în douå moduri:Prin crearea unui program în care obiectele sunt descrise prin intermediul instrucÆiu-nilor de program. La crearea obiectelor se pot folosi clasele predefinite de obiectespecifice programårii orientate pe obiecte. Dupå crearea programului surså, pentru arealiza interfaÆa, trebuie lansat în execuÆie programul cu comanda do <nume_fiçier>.Folosind programarea vizualå. În acest caz, caracteristicile formularelor sunt înre-gistrate sub forma unui tabel într-un fiçier de date care are extensia .scx. Aceste datesunt interpretate de un modul al sistemului. Lansarea în execuÆie a acestui modul,împreunå cu fiçierul care conÆine tabelul (<nume_formular>) se face cu comanda:

do form <nume_formular> with <lista_parametri_actuali>

Comanda de lansare în execuÆie va crea formularul. Ea poate fi scriså într-un modul deprogram (modulul apelant al formularului). Adverbul <lista_parametri_actuali> reprezintå olistå de variabile çi/sau constante de tipuri diferite care se transmit formularului la lansareaîn execuÆie.

3.1.2. Proiectarea interfeÆeiAtunci când se proiecteazå o aplicaÆie, trebuie luate mai multe decizii referitoare la interfaÆå:

ce stil de interfaÆå se va folosi?de câte formulare este nevoie?ce comenzi vor fi incluse în meniuri?se va folosi o barå cu instrumente pentru a dubla opÆiunilede meniu cu butoane scurtåturi cu pictograme?ce asistenÆå se va oferi utilizatorului?ce casete de dialog vor fi folosite pentru a asigura interac-tivitatea cu utilizatorul?

Elementele de interfaÆå ale unei aplicaÆii sunt dependente de funcÆiile pe care trebuie såle îndeplineascå aplicaÆia. În plus, atunci când se proiecteazå interfaÆa unei aplicaÆii,trebuie proiectate çi urmåtoarele elemente:

AsociaÆi obiectele vizuale predefiniteprezentate în capitolul anterior, cu tipu-rile de controale definite în acest capitol.

!

Page 235: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 235

Formularul de început (startup form). Este primul formular care se afiçeazå çi reprezintåce va vedea prima datå utilizatorul când va porni aplicaÆia. Unele interfeÆe nu au unformular specific de început. Acest caz apare atunci când aplicaÆia începe cu încårcareaunui fiçier de date çi testarea unor date, iar primul formular care va fi afiçat va depinde derezultatul testului. Formularul de început poate fi o casetå prin care se cere introducereaunei parole prin care utilizatorul îçi câçtigå dreptul de a folosi aplicaÆia. Asupra parolei sepot pune restricÆii. De exemplu, dacå utilizatorul nu a introdus parola corectå din treiîncercåri, se va afiça un mesaj de eroare çi se va termina execuÆia programului.

Ecranul introductiv (splash screen). Dacå dureazå foarte mult încårcarea çi lansarea înexecuÆie a unei aplicaÆii, este bine ca în acest timp så fie afiçat un ecran introductiv încare se poate afiça un mesaj sau emblema firmei.

Formularul de sfârçit (ending form). Este ultimul formular care se afiçeazå la terminareaaplicaÆiei. Este bine ca acest formular så conÆinå un buton de închidere a aplicaÆiei careså fie acÆionat de utilizator, operaÆie care så ofere siguranÆa închiderii tuturor fiçierelor çidescårcårii tuturor formularelor interfeÆei aplicaÆiei. Unele interfeÆe rezolvå închidereaaplicaÆiei prin opÆiunea de meniu Exit∈File, care terminå execuÆia aplicaÆiei, închide toatefiçierele çi descarcå toate formularele deschise.

Înainte de a se proiecta interfaÆa trebuie så se cunoascå scopul aplicaÆiei. Unele aplicaÆii suntfolosite în mod constant, iar altele ocazional pe o perioadå scurtå de timp. De asemenea, oaplicaÆie care are ca scop principal afiçarea informaÆiilor are cerinÆe diferite faÆå de una careeste folositå pentru a colecta date. InterfaÆa este influenÆatå çi de categoria de utilizatori careo va folosi. Dacå sunt utilizatori începåtori, interfaÆa trebuie så fie cât mai simplå, iar dacåutilizatorii sunt experimentaÆi ea poate så fie mai complexå. În plus, dacå aplicaÆia va cunoaç-te o distribuÆie internaÆionalå, trebuie så Æinå cont de limba çi cultura viitorilor utilizatori.

Orice interfaÆå trebuie så îndeplineascå urmåtoarele cerinÆe ale utilizatorului:InterfaÆa trebuie så-i permitå utilizatorului så controleze evoluÆia programului.Sistemul de meniuri trebuie så fie concis, eficient, logic çi bine structurat.Ecranul nu trebuie aglomerat cu obiecte. Dacå o fereastrå conÆine prea multe butoa-ne, ele ar trebui înlocuite cu opÆiuni de meniu. Se vor afiça sub formå de butoanenumai controalele care sunt folosite foarte des.InterfaÆa trebuie så-i ofere utilizatorului o reprezentare vizualå complexå a opÆiunilorde lucru ale aplicaÆiei la momentul respectiv. Folosirea porprietåÆåÆilor de disponibilita-te sau de vizibilitate ale unui obiect vizual este foarte importantå deoarece împiedicåaccesul uitilizatorului la obiectele care nu pot fi acÆionate în acel moment.Utilizatorul trebuie så fie informat continuu de starea programului. Dacå un procesdureazå prea mult timp, interfaÆa nu trebuie så îngheÆe, deoarece utilizatorul nu maiçtie dacå procesul continuå sau s-a blocat. În acest caz, utilizatorul va fi informat cåprocesul continuå fie prin transformarea formei cursorului, fie prin afiçarea unui contorcare numårå paçii parcurçi de proces, fie prin afiçarea unui indicator de evoluÆie, fieprin imagini grafice animate.InterfaÆa trebuie så permitå anularea unor operaÆii pentru ca utilizatorul så-çi poatåcorecta uçor unele greçeli, fie de introducere a datelor, fie de prelucrare a lor. PentruoperaÆiile de çtergere este bine så cereÆi confirmarea operaÆiei. Pentru operaÆiile deintroducere a datelor trebuie så prevedeÆi cât mai multe operaÆii de verificare a

Page 236: SGBD Visual Foxpro

Informatică236

corectitudinii datelor introduse (prin compararea lor cu limitele permise, prin introduce-rea aceloraçi date de douå ori çi compararea celor douå valori introduse etc.).AplicaÆia trebuie så prevadå cât mai multe cazuri de eroare astfel încât så poatå func-Æiona în cât mai multe condiÆii ale datelor de intrare. Orice eroare detectabilå trebuie sådeclançeze un proces de informare a utilizatorului (prin mesaje care så precizezecauzele erorii çi eventual prin sunete pentru atenÆionare) çi de recuperare a datelor.

3.1.3. Stilurile interfeÆeiExistå trei stiluri de interfeÆe:

InterfaÆå cu un singur document (single-document interface - SDI) care permite la unmoment dat deschiderea unui singur document (de exemplu aplicaÆia Notepad). DacåvreÆi så deschideÆi un nou document, trebuie închis cel precedent (dacå alegeÆi opÆiuneaNew∈File pentru a deschide un nou document, documentul curent va fi închis).InterfaÆå cu mai multe documente (multiple-document interface - MDI) care permitedeschiderea mai multor documente (de exemplu aplicaÆia Word). La un moment dat potfi deschise mai multe documente, fiecare document în fereastra sa (dacå este deschisun document çi alegeÆi opÆiunea New∈File, aplicaÆia va crea un nou formular în care va fideschis noul document). Acest stil de interfaÆå poate fi recunoscut prin existenÆa în barade meniuri a titlului meniului Window ale cårui opÆiuni sunt folosite la manipulareaferestrelor cu documente. Unul singur dintre documente este activ, adicå documentulcare primeçte datele introduse de la tastaturå de cåtre utilizator. Formularuldocumentului activ este obiectul focalizat din interfaÆa aplicaÆiei.InterfaÆå de explorare (explorer-style interface) care conÆine o singurå fereastråîmpårÆitå în douå regiuni numite panouri (panel). De obicei, panoul din stângaconÆine un arbore sau o structurå ierarhicå, iar panoul din dreapta o zonå de afiçarea unei liste (de exemplu aplicaÆia Windows Explorer). Un astfel de tip de interfaÆå sefoloseçte atunci când trebuie så se caute într-o listå mare cu articole (fiçiere,documente, imagini etc.) prin operaÆia de råsfoire (browse).

Stilul interfeÆei se alege în funcÆie de tipul aplicaÆiei. Stilul MDI se foloseçte la aplicaÆiile carenecesitå frecvent vizualizarea simultanå a mai multor documente pentru a le compara saupentru a face transfer de date între ele cum este de exemplu procesorul de texte (Word). Încazul altor tipuri de aplicaÆii (cum sunt aplicaÆiile de tip calendar sau calculator) estesuficient så se deschidå un singur document çi de aceea se foloseçte o interfaÆå SDI. Îngeneral, stilul SDI este cel mai råspândit deoarece este un stil de interfaÆå pe careproiectantul produsului o creeazå mai uçor çi care este mai simplå çi pentru utilizator.

Stilul MDI permite crearea unei interfeÆe care administreazå mai multe formulare într-unsingur formular container. Formularul container se mai numeçte çi fereastrå pårinte(parent window), iar formularele din interiorul såu se numesc ferestre copil (childwindows). O aplicaÆie MDI poate avea un singur formular pårinte çi mai multe formularecopil. Formularul pårinte nu poate fi un formular modal. Ferestrele copil pot fi de acelaçitip sau de tipuri diferite. Fereastra pårinte furnizeazå un spaÆiu de lucru (workspace)pentru toate ferestrele copil ale aplicaÆiei. SpaÆiul de lucru este delimitat de borduraformularului pårinte çi este situat sub bara de meniu.

Page 237: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 237

Formularele interfeÆei MDI au urmåtoarele caracteristici:Formularele copil pot fi afiçate numai în spaÆiul de lucru al formularului pårinte.Utilizatorul poate muta sau redimensiona formularele copil ca pe orice alt formular, cudeosebirea cå operaÆiile sunt limitate de spaÆiul de lucru al formularului pårinte.Când un formular copil este minimizat, pictograma sa apare în formularul pårinte çi nupe bara de aplicaÆii. Când un formular pårinte este minimizat, formularul pårinte çitoate formularele copil care îi aparÆin vor fi reprezentate printr-o singurå pictogramå.Când formularul pårinte este restaurat, sunt restaurate împreunå cu el çi formularelecopil care vor fi afiçate în aceeaçi stare în care erau înainte de minimizare.Când un formular copil este maximizat, legenda sa este combinatå cu legendaformularului pårinte çi afiçatå în bara de titlu a formularului pårinte.Meniurile care pot fi folosite în formularul copil activ sunt afiçate în bara de meniu aformularului pårinte çi nu în formularul copil.

Tipul formularului este controlat cu proprietatea MDIForms care este de tip logic (arevaloarea .T. pentru un formular MDI çi valoarea .F. pentru un formular SDI).

FiliaÆia formularelor (dacå un formular este formular copil sau formular pårinte) estecontrolatå cu proprietatea ShowWindows care este de tip numeric:

0 - Screen - formularul este creat în fereastra principalå Visual FoxPro (implicit).1 - In Top Level Form - formularul este copilul formularului activ de cel mai înaltnivel çi este afiçat în acest formular. Atunci când este minimizat nu este afiçat înbara de aplicaÆii Windows (TaskBar). Se recomandå pentru ferestrele documentale unei ferestre de aplicaÆie.2 - As Top Level Form - este un formular independent nemodal în care pot fiplasate formulare copil. Nu are pårinte çi poate fi folosit fie ca fereastrå într-ointerfaÆå SDI, fie ca fereastrå pårinte într-o interfaÆå MDI. Atunci când esteminimizatå este afiçatå în bara de aplicaÆii Windows. Se recomnadå så o folosiÆipentru fereastra aplicaÆiei.

Prin proprietatea de tip logic Desktops controlaÆi locul în care va fi creat formularul: dacåeste .T. se creeazå oriunde pe ecran, iar dacå este .F. se creeazå în fereastra aplicaÆieiVisual FoxPro (implicit).

Variabila de memorie de sistem _Screens poate fi folositå pentru a referi fereastraimplicitå a aplicaÆiei Visual FoxPro, astfel încât puteÆi manipula aceastå fereastrå ca peun obiect: puteÆi så-i modificaÆi proprietåÆile, puteÆi så-i apelaÆi metodele dar nu puteÆi creaproceduri pentru evenimente.

3.1.4. ProprietåÆile generale ale obiectelor vizuale Visual FoxProObiectele vizuale au proprietåÆi fizice prin care se descrie aspectul lor cum sunt culoa-rea, dimensiunea çi poziÆia pe ecran, dar çi proprietåÆi care caracterizeazå modul încare se comportå cum sunt vizibilitatea, disponibilitatea sau numårul de linii dintr-o ca-setå de text (o linie sau mai multe). Orice obiect vizual are proprietåÆi standard caresunt comune tuturor obiectelor cum sunt dimensiunea, poziÆia çi vizibilitatea. Pe lângåaceste proprietåÆi ele mai au çi proprietåÆi specifice, caracteristice obiectului respectiv.ProprietåÆile sunt descrise printr-un set de date asociate, de un anumit tip.

Page 238: SGBD Visual Foxpro

Informatică238

ProprietåÆile standard (proprietåÆile comune majoritåÆii obiectelor) sunt:Numele obiectului - Name . Se foloseçte pentru a referi obiectul în program.Dimensiunile obiectului. Sunt de tip numeric çi se exprimå în pixeli. Sunt date de:

Height - înålÆimea (dimensiunea pe verticalå) çiWidth - låÆimea (dimensiunea pe orizontalå).

Coordonatele obiectului. Reprezintå un sistem de douå coordonate [x,y] prin carese stabileçte poziÆia obiectului faÆå de colÆul din stânga sus al reperului (ecranul sauformularul din care face parte). Pentru stabilirea coordonatelor se folosesc proprie-tåÆile de tip numeric, exprimate în pixeli :

Left - poziÆia pe orizontalå, faÆå de marginea stângå a reperului (x),Top - poziÆia pe verticalå, faÆå de marginea de sus a reperului (y),

Legenda - Caption . Este un text princare utilizatorul poate identifica rolul obiec-tului. În cazul formularelor, legenda esteafiçatå în bara de titlu. În cazul controale-lor, este afiçatå în interiorul lui sau lângå el.Au legendå urmåtoarele controale: butonulde comandå, comutatorul, butoanele deopÆiuni, cadrele, eticheta, meniul. Proprie-tatea este de tip çir de caractere.Caracteristicile caracterelor folosite în formular. Sunt trei proprietåÆi prin care se carac-terizeazå textele:

FontName - numele fontului, de tip çir de caractere: Arial, Courier New, TimesNew Roman etc.,FontSize - dimensiunea, de tip numeric, exprimatå în pixeli.

stilul caracterelor de tip logic:FontBold - îngroçat, FontItalic - aplecat,FontUnderline - subliniat,FontCondense - condensat,FontExtend - extins, FontOutline - cucontur, FontStrikethrough - tåiat çiFontShadow - cu umbrå.

Culoarea folositå la afiçarea textului estespecificatå prin proprietåÆile de tip nume-ricce reprezintå codul culorii astfel:

BackColor - culoarea fundaluluiobiectului în care este afiçat textul;ForeColor - culoarea primplanului, adicå

a textului sau a imaginii din obiect.Chenarul (Border) este folosit la uneleobiecte (formularul, eticheta, caseta de text,grila, imaginea, caseta de imagine, linia,forma) ca un delimitator. Chenarul poate fifix sau dimensionabil, trasat cu linie simplå

Proprietatea Name se foloseçte pentruidentificarea obiectului în interior (la nivelde program, de cåtre programator), iar

proprietatea Caption se foloseçte pentruidentificarea lui în exterior (la nivel de

interfaÆå, de cåtre utilizator).

!

Cod SemnificaÆie cod chenarControale

0 Transparent (invizibil)1 Solid (implicit; linie continuå)2 Dash (linie întreruptå)3 Dot (linie punctatå)4 Dash - Dot (linie formatå din grupuri

de o linie urmatå de un punct)5 Dash - Dot -Dot (linie formatå din gru-

puri de o linie urmatå de douå puncte)6 Inside Solid (linie continuå în interior)

Formulare0 No border (fårå chenar)1 Fixed Single (chenar simplu)2 Fixed Dialog (chenar de tip casetå de

dialog, care nu permiteredimensionarea formularului)

3 Sizable (implicit; chenar de tipfereastrå, care permite redimen-sionarea formularului)

Page 239: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 239

sau dublå. Este caracterizat de urmåtoarele proprietåÆi:BorderStyle - stilul chenarului este de tip numeric çi exprimå codul chenarulu.BorderColor - culoarea liniei cu care este trasat chenarul;BorderWidth - grosimea liniei cu care este trasat chenarul este de tip numeric çi

este exprimatå în puncte: 1 punct, 3 puncte etc.;LineSlant - modul de trasare este de tip caracter çi exprimå codul direcÆiei de

trasare a dreptunghiului care formeazå chenarul: \ - trasarea se face începând de lacolÆul din stânga sus spre colÆul din dreapta jos çi / - trasarea se face începând de lacolÆul din dreapta jos spre colÆul din stânga sus;Curvature - curbura colÆurilor chenarului stabileçte gradul de rotunjire al colÆurilor çi

este de tip numeric. Poate lua valori de la 0 la 99 determinând aspectul chenarului.Astfel pentru valoarea 0 chenarul va fi un dreptunghi sau un påtrat, pentru valoarea 99chenarul se va transforma într-un cerc, respectiv o elipså, iar pentru o valoare cuprinsåîntre cele douå limite, de exemplu 30, se va transforma într-un dreptunghi, respectivîntr-un påtrat cu colÆurile rotunjite.

Pictograma de glisare - DragIcon . Este de tip çir de caractere çi reprezintå identifi-catorul fiçierului (calea de director çi numele) care conÆine pictograma ce va fi afiçatå în lo-cul cursorului de mouse atunci când se executå operaÆia de glisare çi plasare a obiec-tului.Cursorul de mouse - MousePointer . Estede tip numeric çi reprezintå codul asociatformei cursorului de mouse afiçat atuncicând este indicatå o zonå a obiectului.Disponibilitatea - Enabled . Este o pro-prietate de tip logic. Dacå are valoarea .T. controlul este disponibil (enabled), adicåutilizatorul îl poate acÆiona, iar dacå are valoarea .F. nu este disponibil (disabled), adicånu-l poate acÆiona. Un control nu este disponibil atunci când nu sunt îndeplinite condiÆiilenecesare pentru a putea fi folosit. Reprezentarea graficå çi legenda controalelor care nusunt disponibile sunt afiçate estompat.Vizibilitatea - Visible . Este o proprietate de tip logic. Dacå are valoarea .T. obiectul estevizibil, iar când are valoarea .F. nu este vizibil.

Pentru precizarea codului unei culori se foloseçte schema de culori RGB prin care precizaÆiprin trei numere cuprinse între 0 çi 255 intensitatea pentru fiecare din cele trei culori de bazå:roçu, verde çi albastru. Pentru a afla codul culorii folosiÆi funcÆia RGB() care are sintaxargb(<r>, <g>,<b>), unde cei trei parametri reprezintå intensitåÆile celor trei culori:

Culoare Parametri RGB() Numår Culoare Parametri RGB() NumårAlb 255, 255, 255 16777215 Verde 0, 255, 0 65280Negru 0, 0, 0 0 Verde închis 0, 128, 0 32768Gri 192, 192, 192 12632256 Cian 0, 255, 255 16776960Gri închis 128, 128, 128 8421504 Cian închis 0, 128, 128 8421376Roçu 255, 0, 0 255 Albastru 0, 0, 255 16711680Roçu închis 128, 0, 0 128 Albastru închis 0, 0, 128 8388608Galben 255, 255, 0 65535 Magenta 255, 0 ,255 16711935Galben închis 128, 128, 0 32896 Magenta închis 128, 0, 128 8388736

Folosind autodocumentarea aflaÆi caresunt valorile asociate proprietåÆii

MousePointer.

!

Page 240: SGBD Visual Foxpro

Informatică240

3.1.5. Evenimente recunoscute de obiectele vizualeAtât formularele, cât çi marea majoritate a controalelor sunt capabile så primeascå dinpartea sistemului semnale prin care sunt informate de producerea unui eveniment. Laproiectarea formularului programatorul poate specifica secvenÆe de instrucÆiuni prin careobiectul trebuie så råspundå la diferite evenimente. De exemplu, evenimentele recunos-cute de majoritatea obiectelor (formulare çi controale) sunt:

Evenimente declançate de acÆiunile mouse-ului:MouseMove - deplasarea mouse-ului pe obiect;Clicks - clic cu mouse-ul pe obiect cu butonul din stânga (are ca efect focalizarea

obiectului).RightClicks - clic cu mouse-ul pe obiect cu butonul din dreapta (are ca efect în

general deschiderea unui meniu dependent de context, adicå un meniu cu opÆiunispecifice obiectului pe care s-a executat clic);DblClick - dublu clic cu mouse-ul pe obiect;MouseDown - apåsarea butonului de mouse;MouseUp - eliberarea butonului de mouse;DragOvers - glisarea obiectului cu mouse-ul;DragDrops - glisarea çi plasarea obiectului cu mouse-ul.

Evenimentul declançat la acÆionarea unei taste (apåsarea çi eliberarea ei) -KeyPress. Procedurii care se va executa la apariÆia acestui eveniment i se pot trans-mite ca parametri numårul asociat tastei apåsate çi un cod numeric prin care se defineç-te combinaÆia de taste reci care însoÆeçte tasta apåsatå. Fiecårei taste reci îi cores-punde un bit poziÆionat pe 1 din codul numeric. Astfel, pentru tasta Shift este bitul 0(rezultå codul=1), pentru tasta Ctrl bitul 1(rezultå codul=2) çi pentru tasta Alt bitul 2(rezultå codul=4). Se pot combina mai multetaste reci.Evenimente declançate de crearea çieliberarea obiectului:

Init - iniÆializarea obiectului declançatå decrearea lui;Destroys - eliberarea obiectului declança-

tå de metoda de eliberare a zonei de memoriealocate obiectului.

3.1.6. Focalizarea

Focalizarea (focus) este capacitatea aplicaÆiei de a primi datele de intrareale utilizatorului prin intermediul tastaturii sau al mouse-ului.

Ea se manifestå în cadrul interfeÆei prin prezenÆa selectorului. Când selectorul este pozi-Æionat pe un obiect, acesta va putea primi datele de intrare ale utilizatorului. Pe de o par-te, sistemul de operare Windows permite lansarea în execuÆie a mai multor aplicaÆii la unmoment dat, dar numai una dintre aplicaÆii are capacitatea de focalizare. Aceasta este

PoziÆie 2 1 022 21 20

ApåsaÆi Alt Ctrl Shift CodShift 0 0 1 1Ctrl 0 1 0 2

Ctrl +Shift 0 1 1 3Alt 1 0 0 4

Alt+Shift 1 0 1 5Alt+Ctrl 1 1 0 6

Alt+Ctrl+Shift 1 1 1 7

Page 241: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 241

aplicaÆia activå, adicå aplicaÆia care va primi datele de intrare furnizate de utilizator. Pede altå parte, în cadrul unei aplicaÆii la un moment dat pot fi deschise mai multe formu-lare, înså un singur formular are capacitatea de focalizare çi se numeçte formular activ,iar în cadrul formularului activ un singur control poate primi focalizarea çi se numeçtecontrol activ.

Înainte de a focaliza un obiect trebuie activat containerul, acÆiune sesizatå prin eveni-mentul Activates. Containerul se activeazå:

Interactiv: utilizatorul executå clic pe obiectul container.Din program: se apeleazå metoda Show (afiçarea) a obiectului container.

Evenimentul Activate se declançeazå în ordinea de incluziune a formularelor: mai întâipentru obiectul FormSet, apoi pentru obiectele Form conÆinute de acesta çi în final pentruobiectele Page din obiectele Form.

Dupå activarea containerului, un obiect poate fi focalizat:Interactiv: utilizatorul executå clic pe obiect sau apaså repetat tasta Tab pânåfocalizeazå obiectul dorit.Din program: se apeleazå metoda SetFocuss a controlului pe care vreÆi så-l focalizaÆi.

Un obiect îçi poate pierde focalizarea:Interactiv: utilizatorul focalizeazå alt obiect executând clic pe acel obiect.Din program: se apeleazå metoda SetFocuss a controlului pe care-l doriÆi så preiafocali-zarea.

De aceea, formularele çi cele mai multe dintre controale au asociate evenimente de pri-mire a focalizårii çi de pierdere a focalizårii. Aceste evenimente sunt:

Primirea focalizårii declançeazå evenimentul GotFocuss.Pierderea focalizårii declançeazå evenimentul LostFocuss.

Programatorul poate scrie proceduri pentru aceste evenimente, la nivelul fiecårui control.De exemplu, atunci când un control primeçte focalizarea (evenimentul GotFocus), prinintermediul procedurii asociate evenimentului pot fi afiçate în casete instrucÆiuni referi-toare la control sau în bara de stare mesaje de informare despre control.

Obiectul focalizat este evidenÆiat prin diferite metode. De exemplu, un buton declançatorfocalizat este evidenÆiat printr-o bordurå care înconjoarå butonul.

Un obiect poate fi focalizat numai dacå are proprietatea de a fi disponibil (de a råspundela acÆionåri de la tastaturå sau mouse) çi proprietatea de a fi vizibil pe ecran. Nu pot fifocalizate urmåtoarele obiecte: eticheta, linia, forma, imaginea çi caseta de imagine.

Focalizarea este controlatå prin douå proprietåÆi de tip referinÆå (adreså), specifice formula-relor, care sunt protejate la scriere - read-only - çi nu pot fi modificate de programator:

ActiveForms - formularul activ. Este o proprietate prin care se face referirea la for-mularul activ dintr-un set de formulare sau de pe ecran. Poate fi folosit în obiectelecontainer: Form, FormSet, _Screen. Folosind aceastå referinÆå puteÆi modifica valoa-rea unei proprietåÆi a formularului activ sau puteÆi apela o metodå a formularului activ:

<nume_obiect_container>.ActiveForm.<proprietate>=<valoare><nume_obiect_container>.ActiveForm.<metodå>

Page 242: SGBD Visual Foxpro

Informatică242

ActiveControl - controlul activ. Este o proprietate prin care se face referirea lacontrolul activ dintr-un obiect container. Poate fi folosit în obiectele container: Form,Page, ToolBar, _Screen. Folosind aceastå referinÆå puteÆi modifica valoarea uneiproprietåÆi a controlului activ:

<nume_obiect_container>.ActiveControl.<proprietate>=<valoare>

Dacå obiectul container nu mai conÆine nici un obiect focalizat, înseamnå cå el estedezactivat, stare care va fi sesizatå prin evenimentul Deactivates. Evenimentul estedeclançat:

Interactiv: se mutå focalizarea din obiectul container într-un alt obiect container sauîntr-o altå aplicaÆie.Din program: se creeazå un nou obiect care declançeazå evenimentul Activatepentru noul obiect çi evenimentul Deactivate pentru vechiul obiect.

Transferul controlului focalizårii de la un obiect (formular sau control) se poate face folo-sind metoda SetFocuss care poate fi apelatå din diferite metode.

Ordinea tabulårii este una dintre proprietåÆile unui formular çi reprezintå ordinea în careutilizatorul se poate deplasa de la un control la altul pentru a-l focaliza, folosind tastaTab. Pentru a stabili aceastå ordine, fiecare control din formular are douå proprietåÆi:

TabStops - controlul tabulårii. Are valoare logicå çi este folosit pentru a determinadacå utilizatorul poate focaliza controlul folosind tasta Tab. Dacå valoarea este .F.,controlul nu va putea fi focalizat decât executând clic pe el.TabIndex - indexul tabulårii. Este numårul de ordine al controlului în cadrul formu-larului atunci când se foloseçte tasta Tab pentru a focaliza un control.

Fomularele pot fi:Modale (modal). Un astfel de formular cere utilizatorului så execute anumite acÆiuniprin care så închidå formularul activ pentru a putea continua execuÆia aplicaÆiei çipentru a putea focaliza un alt formular. Astfel, o casetå de dialog modalå trebuieînchiså prin acÆionarea declançatoarelor OK sau Cancel ca så se poatå continualucrul cu restul aplicaÆiei (de exemplu, în Visual FoxPro casetele de dialog Open sauSave As sunt modale). Se recomandå folosirea acestui tip de formular în cazul în careprin intermediul lui se solicitå utilizatorului un råspuns sau anumite date necesarepentru continuarea unui proces de prelucrare.Nemodale (modeless). Acest tip de formular nu trebuie închis pentru a ceda focaliza-rea altui formular. De exemplu, ferestrele cu documente din aplicaÆia Visual FoxProsunt ferestre nemodale. Caseta de dialog Find and replace care se deschide cuopÆiunea Find.../Replace...∈Edit atunci când scrieÆi un program surså cu editorulîncorporat Visual FoxPro permite continuarea lucrului în aplicaÆia curentå (continua-rea operaÆiei de editare a programului surså) în timp ce caseta de dialog este afiçatåîn continuare pe ecran. Barele cu instrumente sunt çi ele formulare nemodale. Serecomandå folosirea acestui tip de formular în cazul în care el conÆine date caretrebuie vizualizate pentru a fi comparate cu date din alte formulare.

Tipul formularului este controlat cu proprietatea WindowType care este de tip numeric.Ea poate lua valoarea 0 (nemodal) sau 1 (modal).

Page 243: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 243

3 . 2 . P r i n c i p i i l e p r o gr a măr i i v i z u a l e

Chiar dacå se uçureazå munca programatorului atunci când construieçte interfaÆa cuajutorul obiectelor create pe baza claselor vizuale predefinite puse la dispoziÆie deprogramarea pe obiecte, din exemplele prezentate se poate vedea cå çi aceastå metodåeste destul de laborioaså. De aceea, pentru construirea interfeÆei se recomandå metodavizualå. Açadar:

Programarea vizualå constå în folosirea unor instrumente interactive care ajutåprogramatorul så precizeze diferite opÆiuni çi så contruiascå diferite elemente ale

aplicaÆiei, pe baza cårora sistemul genereazå apoi codul programului.

Programarea vizualå se bazeazå pe programarea orientatå pe obiecte (codul de programeste generat folosind programarea orientatå pe obiecte). Metoda vizualå creçte producti-vitatea programatorului.

Recomandare: Pentru construirea elementelor aplicaÆiei, se recomandå folosireametodei vizuale, iar acolo unde nu obÆineÆi efectul dorit folosind aceastå metodå, veÆifolosi metoda clasicå a programårii structurate pentru a scrie programul.

Programarea vizualå pune la dispoziÆia programatorului douå instrumente interactive:

constructori çiproceduri asistent.

Cu ajutorul acestor instrumente, programatorul poate construi marea majoritate a elemen-telor unei aplicaÆii: baza de date, formularele, meniurile, rapoartele, interogårile, vizualizå-rile etc.

În cazul obictelor de interfaÆå, în procesul de creare a formularului prin intermediul aces-tor instrumente vizuale, proiectantul trebuie så comunice proprietåÆile formularului çi aleobiectelor componente çi procedurile asociate evenimentelor çi metodelor care vor fifolosite de formulare çi controale. Aceste caracteristici se memoreazå într-un fiçier careare o structurå de tabel çi extensia .scx.

Constructorii de formulare

Principiul folosit de constructorii de formulare este urmåtorul: constructorul pune la dispo-ziÆia proiectantului de interfaÆå un formular care are proprietåÆi, metode çi evenimenteimplicite, iar obiectele care vor fi create în formular vor primi çi ele valori implicite pentruproprietåÆi (conform clasei de bazå a obiectului respectiv). Rolul proiectantului constå înmodificarea interactivå a valorii unor proprietåÆi ale obiectelor create çi scrierea unor pro-ceduri asociate metodelor çi evenimentelor, în conformitate cu configuraÆia pe care vreaså o realizeze pentru interfaÆå. Constructorii de formulare pe care puteÆi så-i folosiÆi sunt:

Form Builder - Constructorul rapid - care permite o proiectare rapidå a formularelorsimple. Prin intermediul unei casete de dialog cu mai multe secÆiuni, proiectantul furni-zeazå constructorului valoarea unor proprietåÆi. El nu are cunoçtinÆå de numele aces-tor proprietåÆi, ci numai de caracteristicile fomularului pe care le stabilesc. Nu poatestabili decât valoarea proprietåÆilor asociate acestor caracteristici çi nici nu poate scrieproceduri asociate evenimentelor çi metodelor. Sunt implementaÆi mai mulÆi construc-

Page 244: SGBD Visual Foxpro

Informatică244

tori rapizi, fiecare dintre ei specializat pentru un anumit obiect de interfaÆå. Fiecareconstructor rapid afiçeazå anumite secÆiuni, în funcÆie de obiect. Fiecare secÆiunegrupeazå anumite caracteristici ale obiectului care corespund unei categorii deproprietåÆi. Existå constructori rapizi pentru:

Formulare: Form Builder.Controale: Combo Box Builder, Command Group Builder, Edit Box Builder,Text Box Builder, List Box Builder, Option Group Builder.

Form Designer - Constructorul normal - care permite construirea unor formularecomplexe. Constructorul pune la dispoziÆia proiectantului diferite instrumente: bara cuobiectele care pot fi inserate în formular, bara cu instrumente ale aplicaÆiei constructor,fereastra pentru stabilirea proprietåÆilor, fereastra pentru stabilirea procedurilorasociate evenimentelor çi metodelor etc. Prin intermediul lor proiectantul atribuie valoriproprietåÆilor (identificate prin numele lor) çi scrie procedurile asociate metodelor çievenimentelor.

Pentru lansarea în execuÆie a constructorului folosiÆi comanda:create form <nume_formular>

unde <nume_formular> este numele fiçierului în care se salveazå formularul.Pentru modificarea formularului cu ajutorul constructorului folosiÆi comanda:

modify form <nume_formular>unde <nume_formular> este numele fiçierului în care se salveazå formularul.

Procedura asistent pentru construirea formularelor

Procedura asistent Form Wizard construieçte ea însåçi formularul pe baza unor infor-maÆii furnizate de proiectant prin intermediul unui dialog desfåçurat în mai mulÆi paçi.Proiectantul nu modificå proprietåÆile çi nu scrie codurile procedurilor.

Deoarece fiçierul în care este memorat formularul are o structurå de tabel el poate fideschis cu comanda use çi vizualizat apoi cu comanda browse. Caracteristicile unuiobiect al formularului sunt memorate în câte o înregistrare fiecare, iar în fiecare coloanåcâte o caracteristicå. De exemplu, coloana Properties conÆine câmpuri de tip memo încare sunt memorate proprietåÆile care au valori diferite de cele implicite, iar coloanaMethods conÆine câmpuri de tip memo în care sunt memorate procedurile asociatemetodelor çi evenimentelor obiectului.

Pentru a afiça formularul creat pe ecran çi pentru a permite utilizatorului så interacÆionezecu obiectele de interfaÆå pe care le conÆine, formularul trebuie lansat în execuÆie princomanda:

do form <nume_formular> [with <lista_parametri >] [to < parametru_ieçire>]

Transferul parametrilor se face astfel:

Page 245: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 245

CreaÆi tabelul Agenda1 cu urmåtoarea structurå de câmpuri: nume (C,15), prenume(C,15) çi telefon (C,10). AdåugaÆitrei înregistråri de date la tabel. NuînchideÆi tabelul.

CreaÆi un formular folosindprocedura asistent

AlegeÆi opÆiunea Form∈∈Wizard88∈∈Tools. Se deschidecaseta de dialog Wizard Selec-tion. Din caseta de dialog alegeÆiopÆiunea Form Wizard. Dacå aÆifi creat un formular cu câmpuridin douå tabele, aÆi fi alesopÆiunea One-to-Many FormWizard. AcÆionaÆi butonul OK.Se deschide caseta de dialog corespunzåtoare primului pas (Step1) în care alegeÆicâmpurile din tabel pentru care se vor crea obiecte în formular. În acest exemplu veÆialege toate câmpurile. Pentru aceste câmpuri, asistentul va crea controale de tipTextBox asociate cu controale Label. VeÆi circula de la un dialog la altul cu butoaneleNext (dialogul urmåtor) çi Back (dialogul anterior). TerminaÆi dialogul cu butonul Finish.Dupå ce aÆi selectat toate câmpurile din tabel, treceÆi la urmåtorul dialog Step2.În dialogul Step2 alegeÆi stilul formularului. Din grupul de butoane radio Button TypeactivaÆi butonul Text Button, iar din lista Style alegeÆi stilul Chiseled. În acest pas suntadåugate controalele pentru editarea câmpurilor din tabel çi suplimentar butoanepentru administrarea datelor din tabel. Controalele vor avea aspectul fizic stabilit prinstilul ales. TreceÆi la urmåtorul dialog.În dialogul Step3 alegeÆi criteriul de ordonare a datelor din tabel: ordinea de sortare çicâmpul cheie pentru sortare care este format dintr-un câmp sau mai multe câmpuri din

Lansarea în execuÆie aformularului:

do form <nume_formular>with <lista_parametri >to < parametru_ieçire>

Formularul<nume_formular>.scx

procedure init parameters <lista_parametri> ............................................endproc............................................procedure unload ............................................ return <parametru>endproc

Page 246: SGBD Visual Foxpro

Informatică246

tabel. AlegeÆi pentru criteriul de ordonarecâmpurile nume çi prenume. TreceÆi ladialogul urmåtor.În dialogul Step4 scrieÆi legenda formularuluiîn caseta de text Type a title for your form.Din grupul de butoane radio alegeÆi opÆiuneaSave and run form. AcÆionaÆi apoi butonulFinish pentru terminare. Se deschide case-ta de dialog Save As în care comunicaÆi nu-mele formularului Agenda1.Dupå închiderea casetei Save as estelansat în execuÆie formularul.TestaÆi butoanele formularului executândoperaÆii de vizualizare a înregistrårilor, deadåugare, de çtergere çi de cåutare a uneiînregistråri.ÎnchideÆi formularul.DeschideÆi tabelul asociat formularului cucomanda use Asgnda1.scx. VizualizaÆi cucomanda list stru structura de câmpuri a tabelului asociatå formularului. VizualizaÆiconÆinutul tabelului cu comanda browse. IdentificaÆi proprietåÆile çi metodele asociateformularului çi obictelor din formular. ÎnchideÆi fereastra Browse. ÎnchideÆi fiçierul cucomanda use. DeschideÆi tabelul cu comanda use Agenda1.

CreaÆi un formular folosind constructorul rapid pentru formulareLansaÆi în execuÆie constructorul de formulare fie cu comanda:

create form agenda2fie prin opÆiunea de meniu New...∈∈File. Se deschide caseta de dialog New din carealegeÆi din grupul de butoane radio File Type opÆiunea Form çi apoi executaÆi clic pebutonul New File.

Se deschide fereastra aplicaÆiei Form Designer. În fereastrå este deschiså fereastradocument Form1 în care se vor crea obiectele care aparÆin formularului. SuprafaÆaformularului este divizatå printr-o grilå care va ajuta utilizatorul la aranjarea obiectului

Butoanele adåugate la formularTop Mutå pointerul de înregistrare pe

prima înregistrare.Prev Mutå pointerul de înregistrare pe

înregistrarea precedentå.Next Mutå pointerul de înregistrare pe

înregistrarea urmåtoare.Bottom Mutå pointerul de înregistrare pe

ultima înregistrare.Find Afiçezå caseta de dialog Search

prin intermediul cåreia construiÆiun criteriu de cåutare a uneiînregistråri.

Print Tipåreçte un raport cu datele dintabel.

Add Adaugå o înregistrare la sfârçitultabelului.

Edit Permite modificarea valorilor dincâmpurile înregistrårii curente.

Delete Çterge înregistrarea curentå.Exit Închide formularul form.

Page 247: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 247

în cadrul formularului (alinierea obiectelor la liniile grilei). În bara de meniu a fostadåugat un titlu de meniu (Form) cu opÆiuni specifice constructorului de formulare. În

partea inferioarå ferestrei sunt afiçate douå liste ascunse: Form care este disponibilånumai dacå aÆi creat un set deformulare çi vå permite såalegeÆi un formular din set çiPage care este disponibilånumai dacå aÆi creat un set depagini çi vå permite så alegeÆio paginå din set.AlegeÆi opÆiuneaQuick Form...∈∈Form. Sedeschide caseta de dialogForm Builder. Caseta de dia-log conÆine douå secÆiuni: sec-Æiunea Field Section din carealegeÆi câmpurile din baza dedate pentru care doriÆi så creaÆi obiecte în formular pentru editarea datelor. AlegeÆi toatecâmpurile din tabel: din lista Available Fields selectaÆi câmpul çi executaÆi clic pebutonul 8. Din secÆiunea Style alegeÆi stilul formularului (alegeÆi opÆiunea Embosed dinlista Style). ÎnchideÆi caseta de dialog executând clic pe declançatorul OK.

Meniul Form care conÆine opÆiuni specificeconstructorului de formulare

Grila prin care este divizatåsuprafaÆa formularului.

Page 248: SGBD Visual Foxpro

Informatică248

În proiectul de formular vor fi inserate automat casete de text pentru editareacâmpurilor din tabel çi etichete asociate acestor câmpuri pentru identificarea lor.ÎnchideÆi aplicaÆia (clic pe butonul de închidere al ferestrei de aplicaÆie).DeschideÆi tabelul asociat formularului cu comanda use Agenda2.scx. VizualizaÆi con-Æinutul tabelului cu comanda browse. IdentificaÆi obiectele create în formular (coloanacâmpurilor Objectname) çi proprietåÆile asociate acestor obiecte (coloana câmpurilorProperties). ÎnchideÆi fiçierul cu comanda use.

3 . 3 . F o r m u l a r e l e

3.3.1. Metodele çi evenimentele specifice formularelorFormularele pot executa acÆiuni (au asociate metode) çi pot råspunde la evenimente.

Evenimentele la care pot råspunde formularele sunt:IniÆializarea obiectului Init declançat de crearea obiectului; procedura asociatåacestui eveniment se executå automat la crearea formularului çi are ca scop prelua-rea parametrilor transmiçi de modulul apelant (în cazul unui apel cu parametri, primainstrucÆiune din metoda init va fi parameters <listå_parametri_formali>).Încårcarea formularului Load ; procedura asociatå acestui eveniment se apeleazåînaintea procedurii asociate evenimentului de iniÆializare çi poate conÆine instrucÆiunicare trebuie så se execute înainte de a iniÆializa obiectele din formular (de exempluiniÆializarea unor variabile de memorie, deschiderea unor tabele etc.). EvenimenteleLoad sunt sesizate în ordinea incluziunii obiectelor. De exemplu, este sesizat eveni-mentul Load al unui set de formulare çi apoi cele ale formularelor conÆinute.Activarea formularului Activate care då posibilitatea de a interacÆiona cu obiectele dinformular, ca de exemplu evidenÆierea unui text dintr-o casetå de editare.Dezactivarea formularului Deactivate - se produce atunci când este activat un altformular.Distrugerea formularului Destroy - are ca efect çtergerea din memoria internå atuturor informaÆiilor despre formular çi eliminarea formularului de pe ecran.Descårcarea formularului Unload - este ultlimul eveniment care se executå înaintede eliberarea formularului; prin procedura asociatå, formularul poate returna o valoaremodulului apelant (cel care l-a lansat în execuÆie).

ObservaÆii:

1. Procedura asociatå evenimentului Load se executå înainte de cele asociate eveni-mentelor Init, Activate çi GotFocus.

2. Într-un formular pot fi create mai multe obiecte, fiecare dintre ele având propriuleveniment Init. Ordinea de execuÆie a procedurilor de iniÆalizare este: mai întâi seexecutå iniÆializarea obiectelor din formular (controalele) în ordinea în care au fostdefinite çi apoi iniÆializarea formularului. În acest mod puteÆi avea acces la controaleledin procedura asociatå evenimentului Init al formularului. Pentru a împiedica creareaunui control, procedura Init asociatå controlului trebuie så întoarcå valoarea .F..

Page 249: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 249

3. Dacå datele preluate de formular prin intermediul parametrilor actuali ai proceduriiasociate evenimentului Init sunt necesare çi în alte metode çi evenimente, ei vor fitransmiçi ca variabile globale.

4. Procedura asociatå evenimentului Unload se executå dupå procedura asociatåevenimentului Destroy çi dupå ce au fost eliberate toate obiectele conÆinute. Deexemplu, dacå un formular este creat într-un set de formulare çi conÆine o casetå detext çi un buton de comandå, la eliberarea unui formular evenimentele sunt tratate înurmåtoarea ordine: Destroy pentru setul de formulare, Destroy pentru formular,Destroy pentru caseta de text çi butonul de comandå, Unload pentru formular çiUnload pentru setul de formulare.

Metodele pe care le pot executa formularele sunt:Metoda de afiçare Show - are ca efect afiçarea pe ecran a formularului care a fostcreat sau care a fost ascuns anterior.AcÆiunea de ascundere Hide - are ca efect îndepårtarea formularului de pe ecran,fårå ca informaÆiile referitoare la el så fie çterse din memoria internå; se pot executachiar diferite operaÆii cu formularul ascuns, ca de exemplu crearea în formular a unornoi controale care vor fi afiçate atunci când formularul va fi reafiçat.Metoda de reactualizare Refresh - are ca efect reîmprospåtarea formularului çi aobiectelor din formular, astfel încât ele så afiçeze valorile actuale; în aceastå metodåvor fi scrise instrucÆiunile prin care se pot actualiza valorile unor proprietåÆi ale formu-larului sau ale obiectului, sau valorile unor variabile de memorie folosite pentrucalcularea unor date.Metoda de çtergere a formularului din memorie Release - are ca efect eliberareazonei de memorie alocate formularului.

3.3.2. Mediul de date al formularelorFormularele sunt folosite pentru a permite accesul utilizatorului la datele din tabelele sauvizualizårile bazei de date. De aceea, o datå cu crearea formularului se creeazå çi obiec-tul container nevizual DataEnvironment care conÆine obiectele Cursor (påstreazå evi-denÆa tabelelor çi a vizualizårilor asociate) çi Relation (påstreazå legåturile dintre tabele).Prin intermediul acestui control container se deschid tabelele çi vizualizårile asociate çise stabilesc legåturile dintre tabele çi se închid tabelele çi vizualizårile atunci când se în-chide çi formularul. Proprietatea DataEnvironment a formularului conÆine referinÆa cåtreobiectul DataEnvironment asociat formularului. Dacå nu se foloseçte obiectulDataEnvironment, comenzile pentru deschiderea tabelelor çi a vizualizårilor se pot scrieîn proecdura asociatå evenimentului Load, iar comenzile pentru închiderea lor înprocedura asociatå evenimentului Unload.Mediul de date poate conÆine tabele ale bazei de date sau tabele libere. Dacå tabelelefac parte dintr-o bazå de date, mediul de date preia çi legåturile permanente dintretabele. Se pot påstra aceste legåturi, se pot modifica sau pot fi înlocuite cu altele noi.Dacå tabelele sunt libere, trebuie precizate legåturile dintre ele.Obiectul DataEnvironment are urmåtoarele proprietåÆi, metode çi evenimente specifice:

ProprietåÆile de tip logic se recomandå numai dacå localizarea pe disc a tabelelor çi avizualizårilor este cunoscutå de cåtre programator la proiectarea formularului, altfel se vorfolosi metodele asociate obiectului:

Page 250: SGBD Visual Foxpro

Informatică250

AutoOpen - Dacå are valoarea .T. tabelele çi vizualizårile din mediul de date suntdeschise automat o datå cu crearea formularului.AutoClose - Dacå are valoarea .T. tabelele çi vizualizårile din mediul de date sunt

închise automat o datå cu eliberarea formularului.Evenimentele la care poate råspunde mediul datelor sunt:

BeforeOpenTables - Evenimentul este declançat înaintea deschiderii tabelelor çia vizualizårilor din mediul de date. Se declançeazå înaintea evenimentului Load al for-mularului pentru cå tabelele trebuie så fie deschise înainte de iniÆializarea formu-larului, deoarece în formular trebuie afiçate date din aceste tabele çi vizualizåri. Înprocedura asociatå acestui eveniment se pot stabili numele tabelelor çi vizualizårilorcare se vor deschide çi locul în care sunt memorate pe disc.AfterCloseTables - Evenimentul este declançat dupå închiderea tabelelor çi a vizua-lizårilor din mediul de date (este provocat de fiecare apel al metodei CloseTables). Sedeclançeazå dupå descårcarea formularului (dupå evenimentul Unload al formula-rului).

Metodele pe care le poate executa mediul de date sunt:OpenTables - dechiderea tabelelor çi vizualizårilor din mediul de date; în aceastå

metodå se scriu instrucÆiunile pentru deschiderea tabelelor în diferite zone de lucru.CloseTables - închiderea tabelelor çi vizualizårilor din mediul de date; în aceastå

metodå se scriu instrucÆiunile pentru închiderea tabelelor deschise în diferite zone delucru.

Sesiunea (session) este intervalul de timp în care o aplicaÆie primeçte dateçi le prelucreazå. Sesiunea de date (data session) este mediul de date

asociat sesiunii (parametrii sistemului, variabile de memorie, fiçiere de date).

În Visual FoxPro un formular poate rula în:sesiunea de date implicitå care preia configurårile implicite ale mediului VisualFoxPro.sesiunea de date privatå (proprie formularului) în care toate configurårile mediuluitrebuie fåcute la crearea formularului; acest tip de sesiune creeazå o mai mareindependenÆå a formularului faÆå de mediu.

OperaÆiile pe care trebuie så le executaÆi pentru a proiecta un formular sunt urmåtoarele:

1. DeschideÆi constructorul pentru proiectarea formularului (Form Designer).2. DefiniÆi proprietåÆile formularului çi scrieÆi procedurile asociate metodelor çi eveni-

mentelor formularului.3. DeschideÆi baza de date pentru a se crea obiectul DataEnvironment asociat

formularului.4. CreaÆi controalele în formular. DefiniÆi proprietåÆile lor çi scrieÆi procedurile asociate

metodelor çi evenimentelor fiecårui control.5. SalvaÆi formularul.

Page 251: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 251

3.3.3. Obiecte de tip formular

Formularul FormxCu ajutorul acestui tip de obiect vizual puteÆi crea formulare de tip fereastrå sau casetåde dialog.

Formularele au proprietåÆi, metode çi evenimente cu care le este controlat aspectul çicomportamentul. Pe lângå proprietåÆile standard, formularele mai au urmåtoareleproprietåÆi specifice care determinå aspectul çi comportamentul lor:

Starea ferestrei - WindowStates . Este o proprietatea de tip numeric care con-troleazå starea în care se gåseçte fereastra: normalå (0), minimizatå (1) sau maxi-mizatå (2). Fereastra minimizatå ve fi reduså fie la o dimensiune minimå, fie la o picto-gramå. Fereastra maximizatå va fi måritå astfel încât så ocupe tot ecranul.Dimensiunile ferestrei minimizate sunt specificate prin proprietåÆile de tip numeric:

MinHeight - înålÆimea ferestrei minimizate;MinWidth - låÆimea ferestrei minimizate.

Pictograma ferestrei minimizate - Icon . Este de tip çir de caractere çi reprezintåidentificatorul fiçierului care conÆine pictograma asociatå ferestrei minimizate. Fiçierultrebuie så fie de tip fiçier de pictograme (.ico).Pictograma meniului de control - Picture . Este de tip çir de caratere çi reprezintåidentificatorul fiçierului sau numele unui câmp de tip General care conÆine pictogramaasociatå butonului meniului de control. Fiçierul trebuie så fie de tip bitmap (.bmp) saude pictograme (.ico).Scara de poziÆionare - ScaleMod . Este de tip numeric çi reprezintå un cod pentruunitatea de måsurå folositå pentru coordonatele obiectului. Are valoarea 0 pentruunitatea de måsurå Foxels (unitate specificå mediului Visual FoxPro, echivalentå cuînålÆimea maximå çi låÆimea medie a unui caracter din fontul curent çi 3 pentru pixeli.Coordonatele poziÆiei în care se poate începe scrierea unui text sau desenarea unuiobiect grafic într-un formular sunt specificate prin proprietåÆile de tip numeric:

CurentX - coordonata <x>;CurentY - coordonata <y>.

Centrarea formularului - AutoCenter . Este o proprietate de tip logic. Dacå arevaloarea .T. formularul este afiçat automat în centrul reperului (ecran sau alt formular) fåråså se Æinå cont de valorile proprietåÆilor Left çi Top.Acoperirea formularului - AlwaysOnTop . Este o proprietate de tip logic. Dacå arevaloarea .T. formularul nu poate fi acoperit de alte formulare.Umplerea este specificatå prin proprietåÆile de tip numeric:

FillStyle - modelul care va fi afiçat în fundalul formularului;FillColor - culoarea modelului afiçat în fundalul formularului.

Butoanele specifice unui formular sunt precizate prin proprietåÆile de tip logic:MinButton - controleazå dacå formularul are buton de minimizare sau nu;MaxButton - controleazå dacå formularul are buton de maximizare sau nu;

Page 252: SGBD Visual Foxpro

Informatică252

ControlBox - controleazå dacå formularul are buton de meniu de control sau nu.ProprietåÆi legate de comportament sunt specificate prin proprietåÆile de tip logic:

Closable - controleazå dacå formularul poate fi închis folosind meniul de control(opÆiunea Close a meniului sau dublu clic pe butonul meniului) sau nu;Movable - controleazå dacå formularul poate fi mutat sau nu;

Afiçarea casetelor cu informaÆii despre controalele din formular ShowTips estede tip logic: dacå are valoarea .T. (implicit în ToolBar) se afiçeazå caseta cu informaÆiidespre controlul indicat cu mouse-ul (ToolTip), iar dacå are valoarea .F. (implicit înForm) nu se afiçeazå caseta.

Evenimentele la care pot råspunde formularele sunt:Redimensionarea formularului Resize - este declançat fie prin schimbarea interac-tivå a dimensiunii formularului, fie prin modificarea din program a dimensiunii sale(proprietåÆile Height çi Width).Mutarea formularului Moved - este declançat fie prin mutarea interactivå a formula-rului, fie prin modificarea din program a poziÆiei sale (proprietåÆile Top çi Left).

Metodele pe care le pot executa formularele sunt:Metoda de mutare a formularului pe ecran Move .Metoda de desenare a unei linii în formular Line ; prin intermediul parametrilor sevor preciza coordonatele primului punct (x1,y1) çi coordonatele celui de al doileapunct (x2,y2). Parametrii se vor scrie între paranteze rotunde, dupå numele metodei.Dupå desenare, coordonatele poziÆiei de desenare vor fi (x2,y2).Metoda de desenare a unui dreptunghi în formular Box ; prin intermediul parametrilorse vor preciza coordonatele colÆului din stânga sus (x1,y1) çi coordonatele colÆului dindreapta jos (x2,y2). Dupå desenare, coordonatele poziÆiei de desenare vor fi (x2,y2).Metoda de desenare a unui cerc în formular Circle ; prin intermediul parametrilor sevor preciza raza cercului çi coordonatele centrului cercului (x,y). Dupå desenare,coordonatele poziÆiei de desenare vor fi (x,y).Metoda de scrierea a unui text în formular Print ; prin intermediul parametrului seprecizeazå çirul de caractere care va fi scris. Dupå scriere, coordonatele poziÆiei dedesenare vor fi cele de la sfârçitul textului.Metoda de çtergere a textului çi a desenelor din formular Cls . Dupå çtergere,coordo-natele poziÆiei de desenare vor fi (0,0).

IdentificaÆi instrumentele constructorului de formulareVeÆi realiza un formular pentru testarea metodelor folosite într-o fereastrå.

DeschideÆi fereastra constructorului de aplicaÆii fie cu opÆiunea de meniu New...∈∈File(în caseta de dialog New File alegeÆi butonul Form din grupul de butoane radio FileType çi apoi executaÆi clic pe butonul New File), fie cu comanda create form forma1.

Page 253: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 253

Pentru crearea formularului çi a obiectelor din formular Constructorul de formularevå pune la dispoziÆie urmåtoarele instrumente:

Ferestre:Fereastra aplicaÆiei. Are titlul Form designer urmat de numele fiçierului în care secreeazå formularul. Fereastra conÆine spaÆiul formularului în care veÆi defini obiectele.Fereastra de proprietåÆi. Are titlul Properties çi conÆine mai multe secÆiuni .Fereastra pentru secvenÆele de cod asociate metodelor çi evenimentelor. Aretitlul <nume_obiect>.<nume_procedura>, unde <nume_obiect> este numele obiec-tului pentru care scrieÆi procedura (îl puteÆi alege din lista ascunså Object), iar<nume_procedura> este numele metodei sau evenimentului pentru care scrieÆiprocedura (îl puteÆi alege din lista ascunså Procedure).Fereastra mediului de proprietåÆi ale formularului. Are titlul Data Environmentçi poate fi folositå pentru precizarea tabelelor, a vizulizårilor çi a relaÆiilor dintre ele.Tabelele vor fi deschise automat la definirea formularului.Bare cu instrumente:Bara pentru obiectele de interfaÆå - Form Controls Toolbar. Afiçeazå controale cuajutorul cårora selectaÆi obiectul pe care vreÆi så-l creaÆi în cadrul formularului.Bara pentru manipularea obiectelor - Layout Toolbar. Afiçeazå controale cuajutorul cårora manipulaÆi obiectele pe care le-aÆi creat în formular.Bara aplicaÆiei - Form Designer. Afiçeazå controale cu ajutorul cårora stabiliÆiinstrumentele afiçate de aplicaÆie.Bara pentru controlul culorilor - Color Palette. Afiçeazå controale cu ajutorul cåroraalegeÆi culorile.OpÆiuni de meniu:Meniul Form este vizibil numai dacå este deschiså fereastra constructorului deformulare çi conÆine opÆiuni specifice acestei aplicaÆii. Prin intermediul opÆiunilorsale puteÆi administra clasele definite de utilizator (crearea çi modificarea unorproprietåÆi çi metode, includerea unui fiçier de constante), puteÆi administra seturide formulare (crearea setului de formulare, adåugarea sau înlåturarea formularelordin set etc.), puteÆi administra formularul pe care îl creaÆi (deschidereaconstructorului rapid pentru crearea lui, lansarea lui în execuÆie, modificarea lui).În meniul View devin vizibile opÆiuni prin care puteÆi så stabiliÆi instrumenteleConstructorului de formulare care vreÆi så fie afiçate.În meniul Format devin vizibile opÆiuni prin care puteÆi så stabiliÆi caracteristicilegrilei folosite pentru alinierea obiectelor în formular.

OpÆiunile de meniu:OpÆiunea SemnificaÆia

Meniul ViewDataEnvironment

OpÆiune de tip comutator. Controleazå afiçarea ferestrei mediului de date.

Properties OpÆiune de tip comutator. Controleazå afiçarea ferestrei de proprietåÆi.Code OpÆiune de tip comutator. Controleazå afiçarea ferestrei pentru secvenÆele de cod.

Page 254: SGBD Visual Foxpro

Informatică254

OpÆiunea SemnificaÆiaForm ControlsToolbar

OpÆiune de tip comutator. Controleazå afiçarea barei cu instrumente pentrucrearea obiectelor în formular.

Layout Toolbar OpÆiune de tip comutator. Controleazå afiçarea barei cu instrumente pentruadministrarea obiectelor în formular.

Color PaletteToolbar

OpÆiune de tip comutator. Controleazå afiçarea barei cu instrumente pentrustabilirea culorilor.

Tab Order Permite modificarea ordinii de focalizare cu tasta Tab a obiectelor din formular.Ordinea implicitå este cea în care au fost proiectate (adåugate la formular).

Grid Lines OpÆiune de tip comutator. Afiçeazå/ascunde grila pentru alinierea obiectelor.Show Position OpÆiune de tip comutator. Controleazå afiçarea în bara de stare a poziÆiei çi

dimensiunii obiectului selectat.Meniul Format

Snap To Grid OpÆiune de tip comutator. Controleazå alinierea automatå a obiectelor nou createla liniile grilei.

Set Grid Scale Permite modificarea distanÆelor (în pixeli) dintre liniile grilei.Meniul Form

New Property... Creeazå o proprietate nouå pentru o claså definitå de utilizator. Se deschidecaseta de dialog New Property prin intermediul cåreia stabiliÆi numele çidescrierea proprietåÆii.

New Method... Creeazå o metodå nouå pentru o claså definitå de utilizator. Se deschide caseta dedialog New Method prin intermediul cåreia stabiliÆi numele çi descrierea metodei.

Edit Property/Method...

Permite modificarea sau çtergerea unei proprietåÆi sau metode definite de utiliza-tor. Se deschide caseta de dialog Modify Property/Method prin intermediulcåreia administraÆi proprietåÆile çi metodele definite.

Include File... Permite specificarea numelui fiçierului cu constante predefinite ale clasei definitede utilizator.

Create FormSet

Creeazå un set de formulare care va conÆine formularul curent. Dacå existå dejaun set de formulare, opÆiunea nu este disponibilå.

Remove FormSet

Înlåturå setul de formulare. OpÆiunea este disponibilå numai dacå existå un set deformulare, iar acesta conÆine numai un formular.

Add New Form Adaugå un formular la setul de formulare. OpÆiunea este disponibilå numai dacå afost creat un set de formulare.

Remove Form Înlåturå formularul curent din set. OpÆiunea este disponibilå numai dacå a fostcreat un set de formulare, iar acesta conÆine mai mult de un formular.

Quick Form... Deschide fereastra Constructorului rapid de formulare.Run Form Lanseazå în execuÆie formularul.

IdentificaÆi instrumentele specifice constructorului de formulare: butoanele din barelede instrumente, ferestrele çi opÆiunile de meniu specifice acestei aplicaÆii.AfiçaÆi barele cu instrumente çi identificaÆi pe fiecare barå controalele pe care le puteÆifolosi.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Page 255: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 255

Buton Buton Buton1 Select Object 9 CheckBox 17 OLE Container Control2 View Classes 10 ComboBox 18 OLE Bound Control3 Label 11 List 18 Line4 TextBox 12 Spinner 20 Shape5 EditBox 13 Grid 21 Container6 CommandButton 14 Image 22 Separator7 CommandGroup 15 Timer 23 BuildLock8 OptionButton 16 PageFrame 24 ButtonLock

Marea majoritate a butoanelor din bara Form controls le veÆi folosi pentru a crea obiecte înformulare (Label, TextBox etc.). Butonul Select Object îl puteÆi folosi pentru a selecta ungrup de obiecte din formular. Butonul BuildLock îl puteÆi folosi pentru a lansa în execuÆieConstructorul rapid pentru formulare, iar butonul ButtonLock îl veÆi folosi atunci când veÆidori så creaÆi mai multe instanÆe ale aceluiaçi obiect.

Buton Buton Buton1 Set Tab Order 4 Code Window 7 Layout Toolbar2 Data Environment 5 Form Control Toolbar 8 Form Builder3 Properties Windows 6 Color Palette Toolbar 9 Auto Format

Majoritatea butoanelor din bara Form Designer pot fi folosite pentru a stabili ceinstrumente ale aplicaÆiei veÆi afiça (fereastra de proprietåÆi, fereastra de cod etc). ButonulFormBuilder îl puteÆi folosi pentru lansa în execuÆie Constructorul rapid pentru formulare.Butonul AutoFormat îl veÆi folosi atunci când veÆi dori så aplicaÆi un anumit stil de formatareasupra obiectelor de acelaçi tip, selectate. Stilul de formatare se referå la aspectulchenarului, la culorile folosite, la fonturile caracterelor, la alinierea obiectelor çi la efectul 3Dal obiectelor. La acÆionarea acestui buton se deschide fereastra aplicaÆiei Constructoruluide format: AutoFormat Builder. IdentificaÆi opÆiunile de meniu pentru care butoanele dinaceastå barå sunt scurtåturi.

Buton Buton Buton1 Align Left Sides 5 Align Vertical Centers 10 Center Horizontally2 Align Right Sides 6 Align Horizontal Centers 11 Center Vertically3 Align Top Edges 7 Same Width 12 Bring to Front4 Align Bottom Edges 8 Same Height 13 Send to Back

9 Same SizeButoanele din bara Layout sunt disponibile numai dacå au fost selectate mai multecontroale çi se folosesc pentru a stabili alinierea grupului de controale, modul în care seuniformizeazå dimensiunea lor çi stratul din formular în care vor fi afiçate (obiectele pot fi

1 2 3 4 5 6 7 8 9

1 2 3 4 5 6 7 8 9 10 11 12 13

Page 256: SGBD Visual Foxpro

Informatică256

afiçate în douå straturi). Butoanele Align LeftSides, Align Right Sides, Align Top Edges çiAlign Bottom Edges se folosesc pentru aliniereacontroalelor faÆå de marginea grupului selectat.Butoanele Align Vertical Centers çi AlignHorizontal Centers se folosesc pentru aliniereacentratå faÆå de axa verticalå, respectiv orizontalå agrupului selectat, iar Center Horizontally çi CenterVertically se folosesc pentru alinierea centratå faÆåde axa verticalå, respectiv orizontalå a grupuluiselectat, în mijlocul formularului. Butoanele SameWidth, Same Height çi Same Size se folosesc pentru a uniformiza dimensiuneacontroalelor din grupul selectat: la cel mai lat, la cel mai înalt çi la cel mai mare. ButoaneleBring to Front çi Send to Back stabilesc stratul în care va fi afiçat grupul de controale:deasupra celorlalte sau dedesubt.Paleta de culori conÆine controale prin care puteÆi så stabiliÆi elementul pentru care alegeÆiculoarea (hârtia sau cerneala), controale pentru o paletå standard de culori çi controlulpentru deschiderea unui constructor de culori.

În fereastra de proprietåÆi puteÆi stabili çi vizualiza proprietåÆile formularului çi a fie-cårui obiect din formular. Din lista ascunså alegeÆi formularul sau obiectul pentrucare stabiliÆi proprietåÆile. Dacå deschideÆi aceastå listå puteÆi vedea ierarhia deobiecte a formularului. Prin intermediul ei identificaÆi relaÆia de filiaÆie a obiectelor înformular. Existå urmåtoarele convenÆii în scrierea proprietåÆilor în listå:

Normal - proprietatea are valoarea implicitå çi nu este protejatå la scriere (este detip Read-Write).Bold - proprietatea are valoarea modificatå faÆå de cea implicitå.Italic - proprietatea are valoarea implicitå çi nu este protejatå la scriere (este de tipRead-Only).

Fiecare proprietate are un meniu rapid care conÆine opÆiunea Reset to Default princare se atribuie proprietåÆii valoarea implicitå çi Help... care deschide fereastra cuinformaÆii despre proprietate (help dependent de context).DefiniÆi în fereastrå douå obiecte, o etichetå çi o casetå de text astfel: executaÆi clic pebutonul Label din bara cu controale çi apoi indicaÆi în formular colÆul din stânga sus aletichetei çi glisaÆi mouse-ul pânå când obÆineÆi dimensiunea doritå pentru obiect.RepetaÆi operaÆia pentru caseta de text (butonul TextBox). IdentificaÆi pentru acestecontroale valorile implicite pentru proprietåÆile, evenimentele çi metodele asociate.Formularul çi obiectele din formular au fiecare câte un meniu rapid de comenzi pecare îl deschideÆi executând pe formular sau pe obiect clic cu butonul din dreapta almouse-ului. În tabel, opÆiunile disponibile pentru formular sunt marcate cu F, iar celedisponibile pentru obiecte sunt marcate cu O.

OpÆiunea SemnificaÆieRun F Lanseazå în execuÆie formularul.

Copy O Copiazå în Clipboard obiectul selectat.Cut O Mutå în Clipboard obiectul selectat.

Se stabileçteculoarea cernelii.

Se stabileçteculoarea hârtiei.

Se deschide opaletå de culoripentru a alege

l l i

Paleta de culori

Page 257: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 257

OpÆiunea SemnificaÆiePaste F Insereazå în formular, în poziÆia indicatå, obiectul care fost copiat anterior în

Clipboard.Data

EnvironmentF Deschide fereastra Data Environment

Properties F,O Afiçeazå în fereastra de proprietåÆi formularul sau obiectul selectat.Builder F,O Deschide fereastra Constructorului rapid de formulare corespunzåtoare

obiectului selectat.Code F,O Deschide fereastra pentru scrierea secvenÆei de cod asociate unei metode

sau eveniment al obiectului selectat.Help F,O Deschide fereastra cu informaÆii despre obiect (help dependent de context).

IdentificaÆi, pentru formular çi obiectele definite în formular, opÆiunile meniului rapid.Cu obiectele din formular puteÆi executa mai multe operaÆii:

Selectare obiect - executaÆi clic pe suprafaÆa obiectului.Selectare grup de obiecte - executaÆi clic pe butonul Select Object din bara Formcontrols çi glisaÆi apoi mouse-ul peste obiectele pe care vreÆi så le selectaÆi.Mutarea obiectului - fie glisaÆi obiectul cu mouse-ul, fie selectaÆi obiectul çi apoifolosiÆi operaÆiile Cut çi Paste (din meniul Edit sau din meniul de comenzi rapide).

SecÆiunea ConÆineAll Toate proprietåÆile

Data Numai proprietåÆile care carac-terizeazå data memoratå în control.

Method Numai metodele çi evenimenteleasociate obiectului.

Layout Numai proprietåÆile carecaracterizeazå aspectul controlului.

Other Alte proprietåÆi decât cele carecaracterizeazå datele çi aspectul.

Lista ascunså din care alegeÆi obiectulpentru care stabiliÆi prorpietåÆile çi

procedurile pentru metode çi evenimente.

Proprietate pentru care s-amodificat valoarea implicitå

Proprietate protejatå la scriere

Proprietate sau metodå saueveniment selectat

Activeazå constructorul de expresiiExpression Builder pentru construirea

interactivå a unei expresii.

Page 258: SGBD Visual Foxpro

Informatică258

Copierea obiectului - selec-taÆi obiectul çi apoi folosiÆi operaÆiile Copy çi Paste (dinmeniul Edit sau din meniul de comenzi rapide).Çtergerea obiectului - selectaÆi obiectul çi apoi apåsaÆi tasta Delete.CreaÆi instanÆe multiple ale unui obiect - executaÆi clic pe butonul ButtonLock dinbara Form controls, executaÆi apoi clic în aceastå barå pe obiectul pentru care creaÆiinstanÆe multiple, creaÆi obiectul în formular çi apoi executaÆi clic în locul în care vreÆiså creaÆi o copie a acestui obiect. ExecutaÆi clic pentru fiecare copie pe care vreÆi så ocreaÆi. Dupå ce aÆi terminat de creat copii ale obiectului, dezactivaÆi aceastå funcÆieexecutând clic pe butonul ButtonLock.

Folosind funcÆia de creare deinstanÆe multiple, mai adåugaÆila formular douå casete detext. SelectaÆi grupul de ca-sete de text çi aplicaÆi unanumit stil acestor casete (cuAutoFormat Builder). AliniaÆigrupul în diferite maniere folo-sind butoanele de pe baraLayout.SchimbaÆi ordinea de par-curgere a formularului fie folo-sind opÆiunea de meniu, fiebutonul Sel Tab Order dinbara Form Designer. StabiliÆiordinea executând clic în formular, pe obiecte, în ordinea în care vreÆi så fie parcurse:

ÎnchideÆi constructorul de formulare fårå så salvaÆi modificårile fåcute.

Noua ordine de parcurgere aformularului cu tasta Tab.

Structura ierarhizatåa formularului.

Page 259: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 259

CreaÆi un formularVeÆi realiza un formular în care textul çidesenele sunt afiçate numai dacå se indicåformularul cu mouse-ul çi se apaså butonulstâng. La eliberarea butonului de mousetextul çi desenele afiçate se çterg.

DeschideÆi fereastra constructoruluide aplicaÆii.În fereastra de proprietåÆi atribuiÆiurmåtoarele valori proprietåÆilor (ca-re determinå aspectul çi comportareaformularului):

Name = "Form1"ScaleMode = 3Top = 13Left = 14Height = 300Width = 450Desktop = .F.BackColor = 220,220,220ForeColor = 0,0,0BorderStyle = 2Caption = "Exemplu"FontName = "Courier New"FontSize = 16

FontBold = .T.DrawWidth = 5FillColor = 150,150,150FillStyle = 7Closable = .T.Enabled = .T.Visible = .T.ShowTips = .F.TabIndex = 1TabStop = .T.WindowState = 0WindowType = 0

Pentru afiçarea textului çi a desenelor, la apåsarea butonului de mouse s-a scrisprocedura asociatå evenimentului MouseDown în care s-au apelat metodele spe-cifice formularelor - Print (scrierea textului), Line (desenarea liniei), Circle (desena-rea cercului). Pentru a avea acces la fereastra de cod, deschideÆi în fereastra depro-prietåÆi secÆiunea Method çi din lista de metode çi evenimente alegeÆievenimentul MouseDown.

Procedure MouseDownLparameters nButton, nShift,;

nXCoord, nYCoord

ThisForm.CurrentX=10ThisForm.CurrentY=10for i=1 to 25

Din lista ascunsåObject puteÆi alege

obiectul pentrucare scrieÆi codul

procedurii.

Din lista ascunsåProcedure puteÆialege evenimentulsau metoda pentru

care scrieÆisecvenÆa de cod.

Page 260: SGBD Visual Foxpro

Informatică260

ThisForm.Print('Exemplu')ThisForm.CurrentX=;

ThisForm.CurrentX+10ThisForm.CurrentY=;

ThisForm.CurrentY+10endforx1=25y1=10x2=65

y2=50for i=1 to 8

ThisForm.Line(x1,y1,x2,y2)ThisForm.Line(x2,y2,x1,y2+50)

x1=x1+50 x2=x2+50endforThisForm.Circle(75,225,225)Endproc

Pentru çtergerea textului çi a desenelor, la eliberarea butonului de mouse s-a scrisprocedura asociatå evenimentului MouseUp în care s-a apelat metoda Cls(çtergerea):

Procedure MouseUpLparameters nButton, nShift, nXCoord, nYCoordThisForm.ClsEndproc

SalvaÆi formularul çi îl lansaÆi în execuÆie executând clic pe butonul Run din barastandard.

ObservaÆie:Procedurile asociate evenimentelor MouseMove, MouseUp çi MouseDown primesc dinpartea sistemului urmåtoarele informaÆii prin intermediul parametrilor:

nButton - reprezintå butonul de mouse acÆionat: 1 - butonul stâng, 1 - butonuldrept çi 4 -butonul din mijloc.nShift - este un cod numeric (modul în care se calculeazå a fost prezentat la eve-nimentul PressKey) prin care se poate determina dacå mouse-ul a fost acÆionatîmpreunå cu o tastå rece Shift, Alt çi Ctrl.nXCoord, nYCoord - reprezintå coordonatelecursorului de mouse, relative la formular.

Setul de formulare FormSetxEste un container care conÆine un grup de formulare. Este caracterizat de proprietåÆilecare pot fi folosite pentru parcurgerea ciclicå a formularelor din set:

Numårul de formulare din set FormCount . Este de tip numeric.Formularele Forms . Este de tip vector. În elementele vectorului se påstreazåreferinÆele cåtre formularele din grup.

Mai poate fi folsitå çi proprietatea AutoReleased care conÆine o referinÆå cåtre formularul activçi proprietatea AutoReleased care determinå cum este eliberat setul de formulare. Este de tiplogic: dacå are valoarea .T. (implicit atunci când setul de formulare este creat pe baza metodeivizuale), setul de formulare va fi eliberat dupå ce este eliberat çi ultimul formular din set çi dacåare valoarea .F. (implicit atunci când setul de formulare este creat prin program), setul deformulare nu va fi eliberat dupå ce este eliberat çi ultimul formular din set.

Run - LansaÆi în execuÆieformularul

Modify Form - ModificaÆi formularul

Page 261: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 261

CreaÆi seturi de formulare

1. CreaÆi un set de formulare careconÆine douå formulare. Legende-le celor douå formulare suntFormular 1 çi Formular 2. Pentrufundalul lor s-au ales douå culoridiferite.CreaÆi setul de formulare cu opÆi-unea de meniu Create Form Set∈∈Form. IniÆial setul va conÆine unsingur formular. AdåugaÆi al doi-lea formular cu opÆiunea AddNew Form ∈∈Form.ProprietåÆile setului de formulareçi ale formularelor se vor stabiliprin intermediul ferestrei de proprietåÆi astfel:

* Proprietatile setuluiAutoRelease = .T.Name = "Formset1"* Proprietatile formularului 1Name = "Form1"Top = 8Left = 44Height = 250Width = 375BackColor = 128,128,128BorderStyle = 1

Caption = "Formularul 1"AlwaysOnTop = .T.* Proprietatile formularului 2Name = "Form2"Top = 32Left = 113Height = 250Width = 375BackColor = 192,192,192BorderStyle = 2Caption = "Formularul 2"

Pentru fiecare formular, scrieÆi câte o procedurå asociatå evenimentului Click. Laproducerea acestui eveniment, se parcurg ciclic cele douå formulare, çi se scrie în barade titlu al fiecårui formular numårul såu.

Procedure Clickfor n=1 to thisformset.formcountthisformSet.Forms(n).Caption= thisformSet.Forms(n).Caption+str(n,2)endforEndproc

SalvaÆi setul de formulare çi îl testaÆi lansându-l în execuÆie.

2. Setului de formulare li se va mai adåuga un formular. Formularul Formular 1 va fiafiçat întotdeauna deasupra celorlalte. Formularele pot fi mutate pe ecran, dar nici unformular nu poate fi adus deasupra formularului Formular 1. Se implementeazå, prinintermediul procedurilor, råspunsuri la evenimentul Click.DeschideÆi formulaul anterior çi îl salvaÆi sub un alt nume. AdåugaÆi la setul deformulare cel de al treilea formular.

Page 262: SGBD Visual Foxpro

Informatică262

StabiliÆi proprietåÆile pentru cel de latreilea formular:

* Proprietatile formularului 3Name = "Form3"Top = 54Left = 132Caption = "Formularul 3"

Pentru fiecare formular scrieÆi câte oprocedurå asociatå evenimentului Click.La producere acestui eveniment, separcurg ciclic cele trei formulare çi sescrie în fiecare formular eticheta formu-larului în care s-a produs evenimentulClick:

* Procedura pentru formularul 1Procedure Clickfor n=1 to thisformset.formcount

thisformSet.Forms(n).Print('Formularul 1')endforEndproc* Procedura pentru formularul 2Procedure Clickfor n=1 to thisformset.formcount

thisformSet.Forms(n).Print('Formularul 2')endforEndproc* Procedura pentru formularul 3Procedure Clickfor n=1 to thisformset.formcount

thisformSet.Forms(n).Print('Formularul 3')endforEndproc

Setul de pagini PageFramex çi pagina PagexSetul de pagini este un container care conÆine un grup de pagini. Pentru a fi vizibil, setulde pagini trebuie creat într-un formular (form). El se foloseçte pentru a obÆine un obiect deinterfaÆå de tipul casetå de dialog cu secÆiuni (tabs). Setul de pagini va reprezenta casetade dialog, iar paginile secÆiunile casetei. La un moment dat, o singurå paginå (secÆiune acasetei) este activå. Paginile nu pot fi create decât într-un set de pagini, çi nu ca formulareindependente. Dacå este mutat setul de pagini, se mutå automat cu el çi paginile.

Eticheta paginii este afiçatå în partea superioarå a paginii. Ea este folositå ca unidentificator al paginii, dar çi ca un element care poate fi acÆionat cu mouse-ul (clic)pentru a activa pagina. Ca identificator al etichetei paginii se foloseçte textul din proprie-tatea Caption a paginii.

Setul de formulare are urmåtoarele proprietåÆi specifice care determinå caracteristicilepaginilor din set:

Pagina activå ActivePage . Este de tip numeric çi reprezintå numårul paginii active.

Page 263: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 263

ProprietåÆile care pot fi folosite pentru parcurgerea ciclicå a paginilor din set:Numårul de pagini din set PageCount . Este de tip numeric.Paginile Pages . Este de tip vector. În elementele vectorului se påstreazåreferinÆele cåtre paginile din set.

ProprietåÆile de tip numeric care pot fi folosite pentru dimensiunile paginilor din set:PageHeight - înålÆimea paginii (fårå etichetå);PageWidth - låÆimea paginii.

ProprietåÆile care caracterizeazå etichetele paginilor din set:PrezenÆa etichetelor Tabs . Este de tip logic çi determinå dacå vor fi afiçateetichetele. Dacå are valoarea .T. (implicit), etichetele paginilor vor fi afiçate, altfelzona etichetei va fi ocupatå de paginå.LåÆimea etichetelor TabStyle . Este de tip numeric. Dacå are valoarea 0 -(Justified), eticheta este dimensionatå dupå lungimea textului. Dacå are valoarea 1- (Nonjustified), etichetele paginilor sunt dimensionate astfel încât så ocupe toatålåÆimea setului de paginå.Aranjarea etichetelor TabsStretch . Este de tip numeric çi determinå modul încare vor fi aranjate etichetele în cadrul setului de pagini, atunci când lungimeatextului etichetelor depåçeçte låÆimea setului de pagini. Dacå are valoarea 0 -(Multiple Rows), etichetele vor fi scrise pe mai multe rânduri. Dacå are valoarea 1 -(Single Row), etichetele sunt afiçate pe o singurå linie çi textul etichetelor estesecÆionat astfel încât så încapå în etichetå. Valoarea implicitå este 1.

Identificarea unei pagini se poate face în douå moduri:<nume_set_pagini>.<nume_paginå>

sau<nume_set_pagini>.Pages(<n>)

unde Pages este numele propritåÆii care påstreazå într-un vector referinÆele fiecåreipagini a setului, iar <n> indexul paginii din acest vector.

Formularele de tip paginå au proprietatea specificå de tip numeric PageOrder -numårul de ordine al paginii. Ea este diferitå de indexul paginii din vectorul Pages.Modificarea unui numår de ordine al unei pagini duce la rearanjarea tuturor pginilor. Deexemplu, dacå existå patru pagini çi vreÆi ca pagina a patra så devinå a doua, îi atroibuiÆiacesteia numårul de ordine 2. Automat pagina a doua va primi numårul de ordine 3, iarpagina a treia numårul de ordine 4.

ConstruiÆi un set de pagini

1. ConstruiÆi un set de pagini care så conÆinå 8 pagini:LansaÆi în execuÆie constructorul de formulare çi creaÆi un formular nou.ExecutaÆi clic pe butonul PageFrame din bara Form controls. GlisaÆi apoi mouse-ulîn fereastra formularului, peste suprafaÆa care vreÆi så fie ocupatå de setul de pagini.Se va crea iniÆial un set de pagini cu douå pagini.

Page 264: SGBD Visual Foxpro

Informatică264

În fereastra Properties, alegeÆi din lista de obiecte obiectul PageFrame1 çi scrieÆipentru proprietatea PageCount (numår de pagini) valoarea 8.StabiliÆi apoi çi celelalte prorpietåÆi ale obiectelor. Valorile proprietåÆilor formularului,setului de pagini çi paginilor sunt:

* FormularulCaption = "Form1"Name = "Form1"* Setul de paginiName = "Pageframe1"PageCount = 8PageHeight=203PageWedth=345TabStretch = 0Top = 12Left = 12Width = 349Height = 252

Tabs = .T.* PaginilePage1.Caption = "Pagina 1"Page1.Name = "P1"Page1.PageOrder = 1Page2.Caption = "Pagina 2"Page2.Name = "P2"Page2.PageOrder = 2..............................Page8.Caption = "Pagina 8"Page8.Name = "P8"Page8.PageOrder = 8

2. În fereastra Properties, deschideÆi lista cu obiectele din paginå çi observaÆi structuraierarhizatå a obiectelor din formular.

3. Cele douå moduri în care sunt afiçate paginile sunt controlate cu proprietateaTabStretch. TestaÆi efectul acestei proprietåÆi.

4. Dacå paginii P2 i se atribuie numårul de ordine 5 (Page2.PageOrder=5), se vormodifica çi paginile: P3 va primi numårul de ordine 2, P4 va primi numårul de ordine3 çi P5 va primi numårul de ordine 4. TestaÆi operaÆia de schimbare a ordiniipaginilor.

TabStretch=1

TabStretch=0

Setul de pagini se identificå prin:Form1.Pageframe1

O paginå (de exemplu pagina P4) se identificå prin:Form1.Pageframe1.P1

Page 265: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 265

TT est pentru evaluare:

1. CreaÆi un set de trei formulare. Formularele vor fi de tip fereastrå. În fiecare formularveÆi desena câte o formå: un påtrat, un cerc çi o elipså. Forma va fi afiçatå în formularnumai când este activat formularul.

2. CreaÆi un formular cu patru pagini. Când activaÆi opaginå, în interiorul ei se va scrie legenda sa.

ÎncercaÆi:Adevårat/Fals:1. InterfaÆa de explorare este o interfaÆå container care conÆine mai multe ferestre.2. Procedura asociatå evenimentului KeyPress primeçte ca parametru codul numeric

asociat tastelor reci apåsate.3. Focalizarea este o metodå prin care se poate måri un control grafic.4. Evenimentul Init este declançat de activarea obiectului.5. Print este o metodå prin care scrieÆi într-un formular.6. Evenimentul Destroy este declançat de eliberarea zonei de memorie alocate obiectului.7. Procedura asociatå evenimentului Load se executå dupå cea asociatå evenimentului Init.

CompletaÆi:1. Dimensiunile, poziÆiile pe ecran, vizibilitatea çi disponibilitatea sunt ...........................

ale unui obiect vizual.2. Variabila de sistem folositå pentru a referi fereastra implicitå a aplicaÆiei Visual

FoxPro este ....... .3. FuncÆia care furnizeazå codul unei culori descrise prin intensitatea celor trei culori de

bazå este ........4. Un obiect poate fi focalizat din program cu metoda ......................5. Procedura asociatå evenimentului .......... al unui formular este ultima care se executå.

AlegeÆi råspunsurile corecte:1. Pentru un obiect,Click este:

a) o proprietate b) un eveniment c) o metodå2. StabiliÆi tipul formularului (modal/nemodal) cu proprietatea:

a) WindowType b) ShowWindow c) MDIForm3. Ordinea tabulårii este o proprietate specificå:

a) tuturor controalelor b) controalelor grilå c) formularelor4. Caseta de dialog Open a interfeÆei aplicaÆiei Visual FoxPro este o casetå de dialog:

a) modalå b) nemodalå c) copil d) pårinte5. Stilul interfeÆei aplicaÆiei Visual FoxPro este de tip:

a) SDI b) MDI c) de explorare6. Pentru un formular, Release este:

a) o proprietate b) un eveniment c) o metodå

Page 266: SGBD Visual Foxpro

Informatică266

RR åspunsuri:Adevårat/Fals: 1-F; 2-A; 3-F; 4-F; 5-F; 6-A; 7-F.CompletaÆi: 1-proprietåÆi; 2-_screen; 3-rgb(); 4-SetFocus ; 5-UnloadAlegeÆi råspunsurile corecte: 1-b; 2-a; 3- c; 4-a; 5-b; 6-c.

3 . 4 . C o n t r o a l e l e

3.4.1. ProprietåÆile çi evenimentele specifice controalelorPe lângå proprietåÆile standard comune controalelor çi formularelor, controalele mai auurmåtoarele proprietåÆi specifice:

Valoarea Value . Este o proprietate pe care programatorul interfeÆei o poate folosi caså påstreze valoarea unei date prin simpla referire la acel control. Ea permiteproiectantului interfeÆei så foloseascå obiectele de tip control ca o legåturå întreutilizator çi aplicaÆie, prin care utilizatorul comunicå aplicaÆiei datele de intrare çiprocesele pe care trebuie så le execute, iar aplicaÆia, rezultatele obÆinute. În tabelulalåturat sunt prezentate tipurile de date permise pentru fiecare control predefinit.Sursa controlului ControlSource . Este o proprie-tate care stabileçte sursa de date a controlului (va-riabila de memorie sau câmpul referit) care deter-minå çi tipul datei påstrate în valoarea controlului.Pårintele Parent . Este identificatorul formularuluide care aparÆine controlul.Alinierea Alignment . Caracterizeazå modul încare va fi aliniat textul în interiorul unui obiect. Pro-prietatea este de tip numeric çi poate lua valorile: 0 -Left (aliniere la stânga; implicit), 1 - Right (aliniere ladreapta), 2 - Center (aliniere în centru) çi 3 -Automatic (implicit - alinierea este fåcutå de cåtresistem în funcÆie de tipul proprietåÆii Value: pentrutipuri numeric, la stânga, iar pentru celelalte ladreapta).AparenÆa SpecialEffect . Este de tip numeric çidefineçte aspectul tridimensional (0) sau plat (1) alobiectului.Stilul fundalului BackStyle . Este de tip numericçi defineçte stilul fundalului controlului: transparent(0) sau opac (1). Implicit este opac. În stilul transparent este ignoratå proprietateaBackColor. Se recomandå acest stil pentru controalele plasate peste imagini grafice)Bara de stare StatusBarText . Este de tip çir de caractere çi reprezintå textul careva fi afiçat în bara de stare atunci când este focalizat controlul.InformaÆiile despre control ToolTipText . Este de tip çir de caractere çi reprezintåtextul care va fi afiçat în caseta de informaÆii (ToolTip) atunci când este indicatcontrolul cu mouse-ul.

Control Tipuri de datepermise

CheckBox Integer, Numeric,Logical

CommandGroup

Character,Integer, Numeric

EditBox Character, MemoTextBox Orice tipGrid Character,

NumericListBox Character,

Integer, NumericComboBox

Character,Integer, Numeric

Spinner Currency, Integer,Numeric

OptionButton

Integer, Numeric,Logical

OptionGroup

Character,Integer, Numeric

Page 267: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 267

Culorile controlului care nu este disponibil sunt determinate de proprietåÆile de tipnumeric:

BackColor - culoarea fundalului;ForeColor - culoarea textului.

Tasta de acces. PuteÆi focaliza rapid un control apåsând o literå împreunå cu tasta Alt.Tasta literei se numeçte tastå de acces (access key) çi ea este afiçatå subliniat. PuteÆiså o stabiliÆi, dacå în proprietatea Caption a controlului scrieÆi litera care vreÆi så fie taståde acces precedatå de caracterele: \<. De exemplu, dacå legenda unui control esteTelefon çi vreÆi ca litera F så fie tastå de acces, veÆi scrie legenda astfel: Tele\<fon. Înformular legenda va fi afiçatå Telefon.Protejarea la scriere ReadOnly . Este de tip logic çi caracterizeazå modul de accesla un control: dacå are valoarea .T., controlul nu poate fi editat (poate fi numaivizualizat), altfel utilizatorul poate modifica valoarea controlului. Valoarea implicitå aproprietåÆii este .F..

Evenimentele specifice sunt:Accesul condiÆionat When . Se declançeazå înaintea primirii focalizårii. Proceduraasociatå evenimentului poate fi folositå pentru a focaliza condiÆionat controlul: dacå nusunt îndeplinite anumite condiÆii (precizate în procedurå) controlul nu va putea fi focali-zat. Procedura va întoarce un rezultat de tip logic: valoarea .T. va permite primireafocalizårii, iar valoarea .F. nu.Validarea Valid . Se declançeazå înainte de pierderea focalizårii. Procedura asociatåevenimentului poate fi folositå pentru a ceda focalizarea condiÆionat: de exemplu, încazul unuei casete de text, dacå valoarea introduså în câmp nu îndeplineçte o anumitåcondiÆie, nu se va putea focaliza urmåtorul control. Procedura va întoarce fie un rezultatde tip logic (valoarea .T. va permite transferarea focalizårii, iar valoarea .F. va påstrafocalizarea), fie un rezultat numeric (0 - controlul påstreazå focalizarea, diferitå de 0 -focalizarea va avansa peste n controale, n fiind valoarea furnizatå; avansarea se vaface în sensul acÆionårii tastei Tab, dacå valoarea este pozitivå, çi în sens invers, dacåvaloarea este negativå). Astfel, dacå procedura întoarce valoarea 1, focalizarea estetrecutå controlului urmåtor, iar dacå întoarce valoarea -1, focalizarea este trecutåcontrolului anterior.

3.4.2. Controale pentru executarea acÆiunilorCea mai simplå cale prin care i se permite unui utilizator så interacÆioneze cu o aplicaÆieeste executarea unui clic pe un buton de pe ecran. Aceste controale pot fi de tip declan-çator sau buton de comandå (command button) sau opÆiune de meniu (menu option).

Butonul de comandå CommandButtonxEste folosit pentru a începe, a întrerupe sau a termina un anumit proces în cadrulaplicaÆiei. De exemplu, în timpul executårii unui proces poate fi afiçat un buton decomandå de tip Pause care prin acÆionare opreçte temporar executarea procesului. Întimpul opririi temporare a unui proces, butonul de pauzå este înlocuit cu butonul Resumepentru reluarea execuÆiei procesului din punctul în care a fost întrerupt. Mai poate fi afiçat

Page 268: SGBD Visual Foxpro

Informatică268

çi un buton Stop care poate opri execuÆia procesului. În general, acestui control nu i seasociazå valori, ci acÆiuni descrise prin procedura asociatå evenimentului Click.

Butonul de comandå nu are proprietatea BackColor, iar proprietatea Style poate aveavalorile: 0 - standard (implicit) çi 1 - invizibil. Are proprietåÆile WordWrap çi Autosize(care vor fi prezentate ulterior).

În funcÆie de modul în care este informat utilizatorul despre acÆiunea butonului existå:Butoane în care acÆiunea este descriså printr-un text. În acest caz, textul care descrieacÆiunea va fi påstrat de proprietatea Caption a controlului.Butoane în care acÆiunea este descriså printr-o imagine. În acest caz, identificatorulfiçierului care conÆine imaginea care va fi afiçatå va fi påstrat de proprietatea Picture acontrolului (identificatorul fiçierului în care este påstratå imaginea). În cazul în care sefoloseçte imaginea pentru descrierea acÆiunii, trebuie folosite çi urmåtoarele proprietåÆi:

DownPicture - imaginea afiçatå atunci când butonul este focalizat;DisablePicture - imaginea afiçatå atunci când butonul nu este disponibil.

Declançatorul poate fi acÆionat în mai multe moduri:ExecutaÆi clic pe butonul focalizat.FocalizaÆi butonul apåsând repetat tasta Tab çi apoi apåsaÆi tasta Enter sau SpaÆiu.ApåsaÆi tasta Alt împreunå cu tasta de acces la buton (cu tasta literei de identificare).Dacå butonul de comandå este butonul implicit al formularului, apåsaÆi tasta Enter,indiferent de poziÆia selectorului.Dacå butonul de comandå este butonul de anulare al formularului, apåsaÆi tasta Esc,indiferent de poziÆia selectorului.

Indiferent de modul ales, evenimentul este acelaçi (evenimentul Click): prin acÆionareabutonului se declançeazå operaÆia atribuitå lui.

Într-un formular nu poate fi decât un buton implicit çi un buton de anulare. Tipul butonuluieste controlat cu proprietåÆile specifice unui buton de comandå:

Implicit Default . Este de tip logic. Dacå are valoarea .T., butonul de comandå estebutonul implicit (default command button). Într-un formular, un singur buton decomandå poate fi implicit. Valoarea implicitå pentru aceastå proprietate este .F..Anulare Cancel . Este de tip logic. Dacå are valoarea .T., butonul de comandå estebutonul de anulare (cancel command button). Într-un formular, un singur buton decomandå poate fi de anulare. Valoarea implicitå pentru aceastå proprietate este .F..

Grupul de butoane de comandå CommandButtonGroupxSe foloseçte pentru a grupa butoanele dintr-un formular çi a uçura administrarea lor.Grupul de butoane de comandå are urmåtoarele proprietåÆi specifice:

Numårul de butoane din grup ButtonCount . Este de tip numeric.Butoanele Buttons . Este de tip vector. Elementele sale se folosesc pentru a refeributoanelor din grup.

Page 269: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 269

ConstruiÆi un formular care conÆine butoane de comandå, folosind metodaprogramårii

RealizaÆi un formular care så prezin-te panta unei linii. Formularul estede tip casetå de dialog, are titlulTest linie çi culoarea fundalului gri.Pentru testarea liniei se vor folositrei butoane de comandå: Cresca-tor, Normal, Descrescator. Cel de lapatrulea buton, Terminare, se folo-seçte pentru a închide formularul.Toate butoanele au taste de acces.AcÆiunile realizate la acÆionareabutonului sunt descrise în procedurile pentru evenimentele Click ale fiecårui buton.

ScrieÆi programul surså într-un fiçier forma_p.prg.public hF1 = CreateObject('Form')F1.Caption='Test linie'F1.Closable = .F.F1.Width=400F1.Height=200F1.BackColor=RGB(220,220,220)F1.AddObject('L','Line')F1.AddObject('B1','Buton1')F1.AddObject('B2','Buton2')F1.AddObject('B3','Buton3')F1.AddObject('B4','Buton4')F1.L.Visible = .T.F1.L.Top = 20F1.L.Left = 150h=F1.L.HeightF1.B1.Visible =.T.F1.B2.Visible =.T.F1.B3.Visible =.T.F1.B4.Visible =.T.F1.ShowRead eventsDefine class Buton1 as;

CommandButtonCaption = ' \<Crescator'Left = 25

Top = 100Height = 25Procedure Click

ThisForm.L.Visible = .F.ThisForm.L.Height=HThisForm.L.LineSlant ='/'ThisForm.L.Visible = .T.

EnddefineDefine class Buton2 as;

CommandButtonCaption = '\<Normal'Left = 150Top = 100Height = 25Procedure ClickThisForm.L.Visible = .F.ThisForm.L.Height=0ThisForm.L.Visible = .T.

EnddefineDefine class Buton3 as;

CommandButtonCaption = '\<Descrescator'Left = 275Top = 100Height = 25Procedure ClickThisForm.L.Visible = .F.ThisForm.L.Height=H

Page 270: SGBD Visual Foxpro

Informatică270

ThisForm.L.LineSlant ='\'ThisForm.L.Visible = .T.

Enddefine

Define class Buton4 as;CommandButton

Caption = '\<Terminare'

Cancel = .T.Left = 150Top = 150Height = 25Procedure ClickClear events

Enddefine

SalvaÆi programul çi-l lansaÆi în execuÆie cu comanda do forma_p.prg. TestaÆibutoanele.

ConstruiÆi un formular care conÆine butoane de comandå folosind metoda vizualåCreaÆi un formular nou forma_v. CreaÆi în acest formular un obiect de tip linie:executaÆi clic pe butonul Line de pe bara Form controls çi glisaÆi apoi mouse-ul înformular pentru a trasa linia.Pentru a crea cele patru butoane declançtoare, folosiÆi facilitatea de creare deinstan-Æe multiple. ExecutaÆi clic pe butonul ButtonLock pe bara Form controls,apoi exe-cutaÆi clic pe butonul CommandButton de pe aceeaçi barå. GlisaÆi mouse-ul în formular pentru a crea un buton de comandå. Apoi executaÆi clic de trei ori înpoziÆiile în care vreÆi så aparå celelalte butoane. DezactivaÆi facilitatea executând clicpe bu-tonul ButtonLock.ModificaÆi corespunzåtor valorile proprietåÆilor formularului çi obiectelor din formular(pe baza instrucÆiunilor din programul surså).ScrieÆi câte o procedurå pentru fiecare eveniment Click al celor patru butoane (pebaza instrucÆiunilor din programul surså).SalvaÆi formularul çi-l lansaÆi în execuÆie cucomanda do form forma_v. TestaÆi formularul.

3.4.3 Controale pentru introducerea çi afiçarea datelor

Eticheta LabelxEste un control care afiçeazå un text pe care utilizatorul nu-l poate modifica. Poate fifolositå ca identificator al unei zone dintr-un formular, pentru furnizarea unor instrucÆiunipentru utilizator sau pentru identificarea unor controale care nu au proprietatea delegendå (cum sunt casetele de text, zonele de editare, listele etc.). Textul care va fi afiçateste memorat în proprietatea Caption a etichetei care poate avea lungimea de maxim256 de caractere. Proprietatea de aliniere (alignment) se referå la tipul de aliniere folositpentru textul etichetei.

La definirea unei etichete, legenda nu poate ocupa decât o singurå linie de text. Dacålegenda etichetei este mai mare sau lungimea ei se poate schimba în funcÆie de anumitecondiÆii (prin schimbarea textului), existå douå proprietåÆi specifice etichetei care permitlegendei så încapå în zona alocatå ei:

Autodimensionarea AutoSize . Este de tip logic çi stabileçte dacå eticheta va fi re-dimensionatå automat pe orizontalå (textul va fi scris pe un singur rând), påstrându-i-seînålÆimea, astfel încât så încapå textul: .T. - eticheta este redimensionatå automat, iar .F.

Page 271: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 271

(implicit) - eticheta nu este redimensionatå; în acest caz textul care nu încape înetichetå este tåiat çi nu mai este afiçat.Trunchierea textului WordWrap . Este de tip logic çi stabileçte cum va fi expandatåeticheta (pe orizontalå sau pe verticalå) pentru a încåpea textul atunci când controluleste redimensionat: .T. - textul este trunchiat, adicå se måreçte dimensiunea eticheteipe verticalå, påstrându-i-se låÆimea (textul va fi scris pe mai multe rânduri, separareatextului pe rânduri fåcându-se la nivel de cuvânt), iar .F. (implicit) - textul nu setrunchiazå, nu i se modificå înålÆimea, dar este måritå låÆimea. Dacå are valoarea .T.,proprietatea AutoSize este ignoratå.

ConstruiÆi un formular care conÆine etichete

Caseta de dialog Test mouse conÆine douå secÆiuni pentru testarea mouse-ului:secÆiunea Deplasare mouse - pentru testarea deplasårii mouse-ului (coordonate, butonapåsat çi taste apåsate) çi Apåsare buton - pentru testarea butonului apåsat (coordonate,buton apåsat çi taste apåsate).

Controalele folosite pentru afiçare sunt de tip etichetå (label). În fiecarea secÆiune secreeazå 11 etichete. De exemplu, în prima secÆiune se definesc 5 etichete cu text fix:Coordonatele cursorului de mouse sunt:, x=, y=, Buton apasat, Tasta apasata çi 6etichete cu legende dependente de acÆiunile mouse-ului: douå pentru coordonate, unapentru butonul apåsat çi trei pentru tastele apåsate.

CreaÆi un formular nou. CreaÆi în formular un set de pagini cu douå pagini. CreaÆi înfiecare secÆiune etichetele astfel: executaÆi clic pe butonul Label de pe bara Formcontrols çi glisaÆi apoi mouse-ul în formular pentru a trasa eticheta.

Page 272: SGBD Visual Foxpro

Informatică272

Folosind fereastra Properties stabiliÆi proprietåÆile formularului, a setului de pagini,ale paginilor çi ale obiectelor folosite:

* FormularulName = "Formular"Top = 11Left = 33Height = 296Width = 375BackColor = 200,200,200Caption = "Test mouse"WindowState = 0* Setul de paginiName = "Caseta"PageCount = 2TabStretch = 1ActivePage = 1Top = 0Left = -12Width = 408Height = 253* Sectiunea 1Page1.Name = "Sect1"Page1.Caption="Deplasare mouse"* Sectiunea 2Page2.Name = "Sect2"

Page2.Caption = "Apasare buton"* Etichetele* proprietati comune:Name = ....AutoSize = .T.BackStyle = 0Caption = ....Height = ...Left = ...Top = ...Width = ...*Exemplu:Name = "L2"AutoSize = .T.BackStyle = 0Caption = "x= "Height = 18Left = 47Top = 72Width = 20* Butonul de comandaName = "Buton"Caption = "\<Terminare"

Pentru secÆiunea 1 a casetei se asociazå o procedurå evenimentului MouseMove(în etichetele L4 çi L5 se afiçeazå coordonatele, în eticheta L7 se afiçeazå butonulapåsat, iar în etichetele L9, L10 çi L11 se afiçeazå tastele apåsate):

Procedure Sect1.MouseMoveLparameters nButton, nShift, nXCoord, nYCoordThisForm.Caseta.Pages(1).L4.Caption=str(nXCoord,4,0)ThisForm.Caseta.Pages(1).L5.Caption=str(nYCoord,4,0)Do case case nButton=1

ThisForm.Caseta.Pages(1).L7.Caption='Stanga'case nButton=2

ThisForm.Caseta.Pages(1).L7.Caption='Dreapta'case nButton=4

ThisForm.Caseta.Pages(1).L7.Caption='Mijloc' otherwise nButton=0

ThisForm.Caseta.Pages(1).L7.Caption=''Endcaseif inlist(nShift,1,3,5,7)

ThisForm.Caseta.Pages(1).L9.Visible=.T.elseThisForm.Caseta.Pages(1).L9.Visible=.F.

endifif inlist(nShift,2,3,6,7)

ThisForm.Caseta.Pages(1).L10.Visible=.T.else

Page 273: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 273

ThisForm.Caseta.Pages(1).L10.Visible=.F.endifif inlist(nShift,4,5,6,7)

ThisForm.Caseta.Pages(1).L11.Visible=.T.elseThisForm.Caseta.Pages(1).L11.Visible=.F.

EndifThisForm.Caseta.RefreshEndproc

Pentru secÆiunea 2 a casetei se asociazå o procedurå evenimentului MouseDown(în etichetele L10 çi L11 se afiçeazå coordonatele, în eticheta L2 se afiçeazå butonulapåsat, iar în etichetele L5, L5 çi L6 se afiçeazå tastele apåsate) çi o proceduråevenimentului MouseUp:

Procedure Sect2.MouseDownLparameters nButton, nShift, nXCoord, nYCoordThisForm.Caseta.Pages(2).L10.Caption=str(nXCoord,4,0)ThisForm.Caseta.Pages(2).L11.Caption=str(nYCoord,4,0)Do casecase nButton=1

ThisForm.Caseta.Pages(2).L2.Caption='Stanga'case nButton=2

ThisForm.Caseta.Pages(2).L2.Caption='Dreapta'case nButton=4

ThisForm.Caseta.Pages(2).L2.Caption='Mijloc'otherwise

ThisForm.Caseta.Pages(2).L2.Caption=''Endcaseif inlist(nShift,1,3,5,7)

ThisForm.Caseta.Pages(2).L4.Visible=.T. else

ThisForm.Caseta.Pages(2).L4.Visible=.F.endifif inlist(nShift,2,3,6,7)

ThisForm.Caseta.Pages(2).L5.Visible=.T. else

ThisForm.Caseta.Pages(2).L5.Visible=.F.endifif inlist(nShift,4,5,6,7)

ThisForm.Caseta.Pages(2).L6.Visible=.T.elseThisForm.Caseta.Pages(2).L6.Visible=.F.

EndifThisForm.Caseta.RefreshEndprocProcedure Sect2.MouseUpLparameters nButton, nShift, nXCoord, nYCoordThisForm.Caseta.Pages(2).L10.Caption=''ThisForm.Caseta.Pages(2).L11.Caption=''ThisForm.Caseta.Pages(2).L2.Caption=''ThisForm.Caseta.Pages(2).L4.Visible=.F.ThisForm.Caseta.Pages(2).L5.Visible=.F.

Page 274: SGBD Visual Foxpro

Informatică274

ThisForm.Caseta.Pages(2).L6.Visible=.F.ThisForm.Caseta.RefreshEndproc

Pentru butonul de comandå s-a asociat o procedurå evenimentului Click:Procedure ClickThisForm.ReleaseEndproc

Caseta de text TextBoxxAfiçeazå conÆinutul unei variabile de memorie, al unui câmp sau al unui element detablou çi permite editarea lui. Pentru editarea textului dipuneÆi de facilitåÆile de editare:mutarea cursorului de inserare, selectarea textului çi operaÆiile de çteregere, mutare çicopiere a textului selectat (Cut, Copy çi Paste). Se mai numeçte çi câmp de editare saucasetå de editare. Ea poate fi folositå çi pentru afiçarea unui text, dar prezintå dezavan-tajul cå utilizatorul poate modifica voluntar sau involuntar acest text. Pe lângå proprie-tåÆile standard (dimensiunea, poziÆia, aparenÆa, fontul, dimensiunea çi stilul caracterelor,stilul bordurii chenarului, alinierea textului în casetå) ea are çi proprietåÆi specifice carecaracterizeazå modul în care se comportå.

ProprietåÆile specifice unei casete de text sunt:Stilul Style . Este de tip numeric çi stabileçte stilul casetei de text: 0 - Normal (implicit)çi 1 - Read Only (nu poate primi focalizarea; nu poate fi modificat).Protejat la scriere ReadOnly . Este de tip logic; dacå are valoarea .T., câmpul poate finumai vizualizat, nu çi modificat. Câmpul poate fi înså focalizat.Marginile Margin . Este de tip numeric çi stabileçte distanÆa în interior de la text labordura controlului. Este bine så fie mai mare decât 0 pentru a face textul mai lizibil.Ascunderea textului PasswordChar . Este de tip çir de caractere çi precizeazå cese va afiça în caseta de text: textul editat de utilizator (proprietatea are valoarea çirul vid:"") sau un çir de alte caractere, de exemplu * sau # (proprietatea are valoarea un çir decaractere care începe cu caracterul care doriÆi så fie afiçat). Aceastå proprietate estefolositå de obicei la casetele de text pentru introducerea parolei sau a codului deacces, pentru ca persoanele neautorizate så nu poatå vedea textul scris.ProprietåÆi folosite la selectarea textului din caseta de text:

Culoarea zonei selectate: SelectedBackColor - culoarea fundalului çiSelectedForeColor - culoarea textului folosite pentru evidenÆierea textului selectat.PoziÆia de început a zonei selectate: SelectedStart (tip numeric). Dacå nu esteselectat un text, prorpietatea va furniza poziÆia cursorului de inserare.Lungimea zonei selectate: SelectedLength (tip numeric) - numårul de caracteredin zona selectatå.Textul selectat: SelectedText (tip çir de caractere). Dacå nu este selectat un text,proprietatea va avea valoarea çirul vid.Ascunderea textului selectat: HideSelection (tip logic). Dacå are valoarea .T.(implicit) textul selectat în casetå nu va mai fi evidenÆiat dupå ce caseta pierdefocalizarea, altfel el va fi evidenÆiat çi dupå ce a fost focalizat alt control din formular.

Page 275: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 275

Çablonul

Cod SemnificaÆieX Orice caracter.9 Numai cifre çi semne (ca de exem-

plu semnul minus -)# Cifre, spaÆii çi semne$ Afiçeazå simbolul monetar$$ Afiçeazå simbolul monetar mobil.* Afiçeazå asteriscuri la stânga valorii.. Reprezintå poziÆia punctului zecimal

(separatporul între partea întreagå çipartea fracÆionarå).

, Reprezintå poziÆia separatoruluiordinelor de mårime (sute de mii,sutele de mii de milioane etc.)

Format

Cod SemnificaÆieA Numai litere, fårå spaÆii sau semne

de punctuaÆie.D Pentru datele calendaristice, se folo-

seçte formatul stabilit prin set date.E Datele de tip datå calendaristicå vor

fi editate în format british.K Selecteazå textul din câmp atunci

când este focalizat controlul.L Se foloseçte numai pentru tipul nume-

ric; afiçeazå zerouri nesemnificative înîn locul spaÆiilor.

R Afiçeazå çablonul definit prin proprieta-tea InputMask. Valoarea çablonului nuva fi memoratå în proprietatea Value.

T Se foloseçte numai pentru tipul çir decaractere; înlåturå spaÆiile de la începu-tul çi de la sfârçitul çirului de caractere.

! Se foloseçte numai pentru tipul çirde caractere; converteçte toateliterele în litere mari.

$ Se foloseçte numai pentru tipul nume-ric; afiçeazå simbolul monetar.

Lungimea maximå a textului MaxLength (tip numeric) - numårul maxim de carac-tere care pot fi scrise în caseta de text . Se foloseçte în cazul câmpurilor de tip çir decaractere pentru ca textul introdus så nu depåçeascå lungimea permiså în câmp.ProprietåÆi prin care se controleazå formatul de introducere çi afiçare a datei memo-rate în proprietatea Value:

Formatul de introducere: Format (tip çir de caractere). Prin aceastå proprietate sestabileçte caracteristica întregului câmp de editare. De exemplu, dacå proprietatea arevaloarea 'A', în caseta de text nu veÆi putea scrie decât litere.Masca de introducere: InputMask (tip çir de caractere). Prin aceastå proprie-tate se stabileçte un çablon pentru format în care se precizeazå caracteristicafiecårei poziÆii a formatului. FaÆå de proprietatea anterioarå prezintå avantajul cå

permite çi precizarea lungimii forma-tului. De exemplu, dacå proprietatea arevaloa-rea '9999.99', în caseta de textveÆi putea scrie numai o valoare nume-ricå; numårul va avea maxim 4 cifrepentru partea întreagå çi douå cifrepentru partea fracÆionarå.

Selectarea la focalizare:SelectOnEntry . Este de tip logic; dacå are valoarea .T., conÆinutul câmpului este

selectat la focalizarea controlului. Se recomandå selectarea la focalizare pentru câm-purile a cåror valoare de obicei trebuie schimbatå des.ProprietåÆi specifice casetelor de text pentru introducerea câmpurilor memo:

Deschiderea ferestrei de editare a câmpului memo: OpenWindow (tip logic). Sefoloseçte pentru a stabili modul în care se face desciderea ferestrei: dacå are valoarea.T. (implicit), se va deschide automat atunci când este focalizat controlul, altfel trebuiedeschiså de cåtre utilizator prin apåsarea tastelor Ctrl+PageDown.Fereastra folositå pentru editarea câmpului memo: MemoWindow (tip çir decaractere). Ea poate fi: fereastra implicitå a interfeÆei Visual FoxPro (valoarea

Page 276: SGBD Visual Foxpro

Informatică276

proprietåÆii este çirul vid) sau o fereastrå definitå de utilizator (valoarea proprietåÆii va finumele ferestrei).

Zona de editare EditBoxxSpre deosebire de caseta de text care permite scrierea datelor pe un singur rând, zonade editare permite introducerea lor pe mai multe rânduri. Ea este recomandatå atuncicând datele de intrare sunt formate din texte foarte lungi. FaÆå de casetele de text, zonelede editare au urmåtoarele proprietåÆi specifice:

Barele de derulare: ScrollBars . Este de tip numeric. Se afiçeazå barele de derulareatunci când dimensiunea textului depåçeçte capacitatea de afiçare a casetei. Îngeneral, proprietatea precizeazå dacå nu existå barå de derulare, dacå existå barå dederulare pe verticalå, dacå existå barå de derulare pe orizontalå sau dacå existåambele tipuri de bare. În cazul zonei de editare, dacå are valoarea 0, bara de derulareeste ascunså çi derularea textului în zona de editare se face numai cu ajutorul tastelorde editare, iar dacå are valoarea 2, este afiçatå bara de derulare pe verticalå, care vapermite çi folosirea mouse-ului. Valoarea implicitå este 2.Folosirea tabulårii în text: AlowTabs . Este de tip logic; dacå are valoarea .F., nueste voie så folosiÆi tasta Tab pentru editarea textului (ea va fi folositå pentru ieçirea dinzona de editare çi predarea focalizårii urmåtorului control), iar dacå are valoarea .T.,puteÆi folosi tasta Tab pentru editarea textului (pentru ieçirea din zona de editare se vafolosi Ctrl+Tab). Valoarea implicitå este F.

ConstruiÆi un formular care conÆine casete de text folosind metoda programårii

RealizaÆi o casetå de dialog caresimuleazå un calculator. Vor fi treicasete de text: a,b - operanzii çi c- rezultatul. Rezultatul trebuie såfie protejat la scrire. Pentru celepatru operaÆii se vor folosideclançatoarele +, -,*,/. PentruoperaÆia de împårÆire se va testadacå împårÆitorul este 0; dacå arevaloarea 0 se va afiça un mesajde atenÆionare, iar focalizarea va fimutatå pe operandul b. Cel de alcincilea buton, Terminare, se folo-seçte pentru a închide caseta dedialog.

ScrieÆi programul surså Calc_p.prg:F1 = CreateObject('Form')F1.Caption='Operatii'F1.Closable = .F.

F1.Width=400F1.Height=250F1.BackColor=RGB(220,220,220)

Page 277: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 277

F1.AddObject('L1','Label')F1.AddObject('C1','TextBox')F1.AddObject('L2','Label')F1.AddObject('C2','TextBox')F1.AddObject('L3','Label')F1.AddObject('L4','Label')F1.AddObject('C3','TextBox')F1.AddObject('B1','Buton1')F1.AddObject('B2','Buton2')F1.AddObject('B3','Buton3')F1.AddObject('B4','Buton4')F1.AddObject('B5','Buton5')F1.L1.AutoSize = .T.F1.L1.BackColor=RGB(220,220,220)F1.L1.Caption = "a"F1.L1.Height = 18F1.L1.Left = 48F1.L1.Top = 36F1.L1.Width = 8F1.L1.Visible =.T.F1.L2.AutoSize = .T.F1.L2.BackColor=RGB(220,220,220)F1.L2.Caption = "b"F1.L2.Height = 18F1.L2.Left = 48F1.L2.Top = 96F1.L2.Width = 8F1.L2.Visible =.T.F1.L3.BackColor=RGB(220,220,220)F1.L3.Caption = "c"F1.L3.Height = 18F1.L3.Left = 48F1.L3.Top = 144F1.L3.Width = 7F1.L3.Visible =.T.F1.L4.BackColor=RGB(220,220,220)F1.L4.Caption = "Imposibil!!!; Impartire la zero"F1.L4.Height = 25F1.L4.Left = 36F1.L4.Top = 204F1.L4.Visible = .F.F1.L4.Width = 181F1.C1.Value=0F1.C1.InputMask = "999999"F1.C1.Left = 85F1.C1.Top = 36F1.C1.Height = 25F1.C1.Width = 108F1.C1.Visible =.T.

F1.C2.Value=0F1.C2.InputMask = "999999"F1.C2.Left = 85F1.C2.Top = 84F1.C2.Height = 25F1.C2.Width = 108F1.C2.Visible =.T.F1.C3.Value=0F1.C3.BackColor=RGB(220,220,220)F1.C3.Height = 25F1.C3.Left = 85F1.C3.ReadOnly = .T.F1.C3.Top = 144F1.C3.Width = 108F1.C3.Style = 1F1.C3.Visible =.T.F1.B1.Visible =.T.F1.B2.Visible =.T.F1.B3.Visible =.T.F1.B4.Visible =.T.F1.B5.Visible =.T.F1.ShowRead eventsDefine class Buton1 as;

CommandButtonTop = 24Left = 276Height = 25Width = 61Caption = "+"Procedure ClickThisForm.C3.Value=;

ThisForm.C1.Value+;ThisForm.C2.Value

ThisForm.C3.RefreshEnddefineDefine class Buton2 as;

CommandButtonTop = 60Left = 276Height = 25Width = 61Caption = "-"

Procedure ClickThisForm.C3.Value=;ThisForm.C1.Value-;ThisForm.C2.ValueThisForm.C3.Refresh

Enddefine

Page 278: SGBD Visual Foxpro

Informatică278

Define class Buton3 as;CommandButton

Top = 96Left = 276Height = 25Width = 61Caption = "*"

Procedure ClickThisForm.C3.Value=;ThisForm.C1.Value*;ThisForm.C2.ValueThisForm.C3.Refresh

EnddefineDefine class Buton4 as;

CommandButtonTop = 132Left = 276Height = 25Width = 61Caption = "/"

Procedure ClickThisForm.B4.StatusBarText=''ThisForm.L4.Visible=.F.if ThisForm.C2.Value=0

ThisForm.B4.StatusBarText=; 'ImposibiI!!! -; Impartire la 0'

ThisForm.L4.Visible=.T.ThisForm.C2.SetFocus

elseThisForm.C3.Value=;ThisForm.C1.Value/;ThisForm.C2.Value

ThisForm.C3.Refreshendif

EnddefineDefine class Buton5 as;

CommandButtonTop = 204Left = 264Height = 25Width = 84Caption = "\<Terminare"

Procedure ClickThisForm.Releaseclear events

Enddefine

SalvaÆi fiçierul. LansaÆi în execuÆie programul Calc_p.prg. TestaÆi formularul.

ConstruiÆi un formular care conÆine casete de text folosind metoda vizualå

1. RealizaÆi caseta de dialog din exemplul precedent folosind metoda vizualå.CreaÆi un formular nou, în care creaÆi urmåtoarele obicete: patru etichete, trei casetede text çi cinci butoane de comandå.

StabiliÆi pentru formular çi obiecte urmåtoarele proprietåÆi:* FormularulName = "Form1"Top = 0Left = 0BackColor = 220,220,220Caption = "Operatii"* Casetele de textName = "Text1" && Text1InputMask = "999999"Name = "Text2" && Text2InputMask = "999999"Name = "Text3" && Text3BackColor = 220,220,220ReadOnly = .T.Style = 1* EticheteleName = "Label1" && Eticheta1Caption = "\<a"

Name = "Label2" && Eticheta2Caption = "\<b"Name = "Label3" && Eticheta3Caption = "c"Name = "Label4" && Eticheta4Caption = "Imposibil!!! ; Impartire la zero"Visible = .F.* pentru toate eticheteleAutoSize = .T.BackStyle = 0* ButoaneleName = "Command1" && Buton1Caption = "+"Name = "Command2" && Buton2Caption = "-"Name = "Command3" && Buton3Caption = "*"

Page 279: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 279

Name = "Command4" && Buton4Caption = "/"

Name = "Command5" && Buton5Caption = "Terminare"

ScrieÆi procedurile asociate urmåtoarelor evenimente: evenimentul Init alformularului çi evenimentele Click ale butoanelor:

procedure Init && FormularThisForm.Text1.Value=0ThisForm.Text2.Value=0ThisForm.Text3.Value=0ThisForm.Label4.Visible=.F.

endprocprocedure Click && Buton1ThisForm.Text3.Value=ThisForm.Text1.Value+ThisForm.Text2.ValueThisForm.Text3.Refresh

endprocprocedure Click && Buton2ThisForm.Text3.Value=ThisForm.Text1.Value-ThisForm.Text2.ValueThisForm.Text3.Refresh

endprocprocedure Click && Buton3ThisForm.Text3.Value=ThisForm.Text1.Value*ThisForm.Text2.ValueThisForm.Text3.Refresh

endprocprocedure Click && Buton4ThisForm.Command4.StatusBarText=''ThisForm.Label4.Visible=.F.if ThisForm.Text2.Value=0

ThisForm.Command4.StatusBarText='ImposibiI!!! -Impartire la 0'ThisForm.Label4.Visible=.T.ThisForm.Text2.SetFocus

elseThisForm.Text3.Value=ThisForm.Text1.Value/ThisForm.Text2.ValueThisForm.Text3.Refresh

endifendprocprocedure Click && Buton5ThisForm.Release

endprocSalvaÆi formularul. Îl lansaÆi în excuÆieçi-l testaÆi.

2. RealizaÆi caseta de dialog din exemplulprecedent folosind metoda vizualå.SalvaÆi formularul anterior sub un altnume. ÇtergeÆi cea de a patra etiche-tå (cea folositå pentru atenÆionare;pentru atenÆionare veÆi folosi de dataaceasta o fereastrå de atenÆionare).AdåugaÆi la formular cele douå noibutoane (pentru salvare în memorie

Page 280: SGBD Visual Foxpro

Informatică280

M+ çi pentru readucere din memorie). Pentru memorarea numårului se va folosivariabila de memorie globalå memorie.

Pentru obiectele adåugate stabiliÆi proprietåÆile:Name = "Command6" && Buton6Caption = "M+"

Name = "Command7"Caption = "M-"

ScrieÆi o procedurå asociatå evenimentului Load al formularului în care iniÆializaÆivariabila de memorie memorie.

procedure Load && Formularpublic memorie

memorie=0endproc

ModificaÆi procedura asociatå evenimentului Clic al butonului Buton4.procedure Click && Buton4ThisForm.Command4.StatusBarText=''if ThisForm.Text2.Value=0

ThisForm.Command4.StatusBarText='ImposibiI!!! -Impartire la 0'Wait Windows 'ImposibiI!!! -Impartire la 0'ThisForm.Text2.SetFocus

elseThisForm.Text3.Value=ThisForm.Text1.Value/ThisForm.Text2.ValueThisForm.Text3.Refresh

endifendproc

ScrieÆi procdurile asociate evenimentului Clic pentru cele douå noi butoane:procedure Click && Buton6 Memorie=ThisForm.Text3.Valueendproc

procedure Click && Buton7ThisForm.Text1.Value=Memorie

endproc3. RealizaÆi caseta de dialog pentru intro-

ducerea parolei.CreaÆi formularul çi adåugaÆi la formular oetichetå, o casetå de text çi un buton decomandå. Sursa controlului casetå detext va fi variabila de memorie m.parola.Pentru a permite introducerea unei parolecaseta de dialog trebuie så fie unformular modal. StabiliÆi pentru formularçi controale urmåtoarele proprietåÆi:

* FormularulName = "Form1"BackColor = 192,192,192Caption = "Parola"Closable = .F.WindowType = 1 && Modal* ObiecteleName = "Label1"

AutoSize = .T.BackStyle = 0Caption = "Parola"Name = "Text1"ControlSource = "m.parola"PasswordChar = "*"Name = "Command1"Caption = "\<Terminare"

ScrieÆi procedurile asociate evenimentelor formularului Load çi Unload (prin careeste returnatå parola cåtre un program):

Page 281: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 281

Procedure Load && Formular parola=space(6)endproc

Procedure Unload && Formularreturn parola

endprocScrieÆi procedura asociatå evenimentului Click al butonului de terminare:

Procedure Click && ButonThisForm.Releaseendproc

SalvaÆi formularul sub numele form_par.DeschideÆi fereastra editorului de texte çi scrieÆi urmåtorul program prin care lansaÆiîn execuÆie formularul. Formularul va furniza programului apelant parola introduså deutilizator. Parola corectå este alfa plus douå caractere pentru ziua din lunå (deexemplu, dacå parola se introduce pe 12 februarie, parola corectå este alfa12). Înprogramul principal se stabileçte parola corectå (variabila parola_c) çi se verificådacå parola furnizatå este corectå. Se acceptå maxim 3 încercåri.

set talk offif day(date())<10 parola_c='alfa0'+str(day(date()),1)else

parola_c='alfa'+str(day(date()),2)endiffor i=1 to 3do form form_par to parolaif parola=parola_c

wait window 'Felicitari!!! Parola este corecta'exit

elsewait window 'Parola gresita !!! Mai aveti '+str(3-i,1)+';

incercari'endif

endforSalvaÆi programul. LansaÆi în execuÆie programul çi testaÆi modul în care funcÆionea-zå programul çi formularulpentru parolå.

4. RealizaÆi o casetå de dialog careså simuleze operaÆiile de selec-tare a textului çi de lucru cu zonade memorie Clipboard pentrutransferul datelor (operaÆiile Copy,Cut çi Paste). Pentru acesteoperaÆii se vor folosi butoaneleCopiere (Copy), Mutare (Cut),Inserare (Paste) çi Stergere(Delete). Butoanele au taste deacces. În acest mod scurtåturaAlt+C este similarå cu Ctrl+C, Alt+M este similarå cu Ctrl+X, Alt+I este similarå cu Ctrl+V,iar Alt+S este similarå cu Delete. Transferul textului se va face prin intermediul uneivariabile de memorie zona_s care simuleazå zona de memorie Clipboard. Butoanele

Page 282: SGBD Visual Foxpro

Informatică282

Stergere, Copiere çi Mutare nu vor fi disponibile dacå nu a fost selectat un text, iar butonulInserare nu va fi disponibil dacå variabila de memorie zona_s este vidå (în Clipboard nu aufost transferate date). În caseta de dialog se vor crea douå zone pentru editarea textului(douå controale de tip EditBox). OperaÆiile se pot executa în aceeaçi zonå (acelaçidocument) sau între cele douå zone (douå documente diferite). Pentru a çti cu ce zonå detext se va lucra, se va folosi variabila de memorie text, de tip numeric, care are valoarea 1pentru prima zonå de text çi valoarea 2 pentru a doua zonå de text.CreaÆi formularul çi adåugaÆi la formular douå etichete, douå zone de editare çi cincibutoane de comandå. Pentru zona de editare folosiÆi butonul EditBox de pe baraForm Controls. StabiliÆi pentru formular çi controale urmåtoarele proprietåÆi:

* FormularulName = "Form1"BackColor = 192,192,192Caption = "Prelucrare text"Closable = .F.* Zonele de editareName = "Edit1"HideSelection = .F.Name = "Edit2"HideSelection = .F.*EticheteleName = "Label1"Caption = "Text 1"Name = "Label2"Caption = "Text 2"

* Pentru toate eticheteleAutoSize = .T.BackStyle = 0* ButoaneName = "Command1"Caption = "\<Stergere"Name = "Command2"Caption = "\<Inserare"Name = "Command3"Caption = "\<Copiere"Name = "Command4"Caption = "\<Mutare"Name = "Command5"Cancel = .T.Caption = "\<Terminare"

ScrieÆi procedura asociatå evenimentului Init al formularului. În aceastå procedurådeclaraÆi variabilele globale text çi zona_s çi iniÆializaÆi proprietåÆile Value ale celordouå zone de editare:

procedure Init && Formular public text,zona_s text=1 zona_s=''

ThisForm.Edit1.Value='' ThisForm.Edit2.Value=''endproc

ScrieÆi procedurile asociate evenimentului LostFocus pentru cele douå zone detext, în care memoraÆi în variabila text zona de editare care a pierdut focalizarea.

procedure LostFocus &&Edit1 text=1endproc

procedure LostFocus &&Edit1 text=2endproc

ScrieÆi procedurile asociate evenimentului Click pentru cele cinci butoane:procedure Click &&Buton1 if text=1

ThisForm.Edit1.SelText=''elseThisForm.Edit2.SelText=''

endifendprocprocedure Click &&Buton2if text=1

ThisForm.Edit1.SelText=zona_s

elseThisForm.Edit2.SelText=zona_s

endifendprocprocedure Click &&Buton3if text=1

zona_s=ThisForm.Edit1.SelTextelsezona_s=ThisForm.Edit2.SelText

endif

Page 283: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 283

Grupul de butoane decomandå

endprocprocedure Click &&Buton4if text=1

zona_s=ThisForm.Edit1.SelTextThisForm.Edit1.SelText=''

elsezona_s=ThisForm.Edit2.SelText

ThisForm.Edit2.SelText=''endif

endprocprocedure Click &&Buton5ThisForm.Release

endproc

SalvaÆi formularul. LansaÆi în execuÆie formularul çi-l testaÆi.

5. RealizaÆi o casetå de dialog care så simuleze operaÆiile de cåutare çi înlocuire într-un text(operaÆiile Find çi Replace). Pentru aceste operaÆii se vor folosi butoanele Cauta (Find),Inlocuieste (Replace) çi Inlocuieste toate aparitiile (Replace All). Butoanele au taste deacces. În acest mod scurtåtura Alt+C este similarå cu Ctrl+F çi Alt+I este similarå cuCtrl+H. Butonul Cauta nu este disponibil dacå zona de editare çi caseta de text cueticheta Se cautå sunt vide. Butoanele Inlocuieste çi Inlocuieste toate aparitiile nu suntdisponibile dacå nu a fost gåsit în zona de text textul scris în caseta de text cu eticheta Secauta.CreaÆi formularul çi adåugaÆi la formular trei etichete, o zonå de editare, douå casetede text, un grup de trei butoane de comandå çi un buton de comandå. StabiliÆi

pentru formular çi con-troale urmåtoarele pro-prietåÆi:

* FormularName = "Form1"Closable = .F.BackColor = 192,192,192Caption = "Prelucrare texte"* Zona de editareName = "Edit1"HideSelection = .F.*EticheteName = "Label1"Caption = "Text"Name = "Label2"Caption = "Se cauta"

Name = "Label3"Caption = "Se inlocuieste cu"* Pentru toate eticheteleAutoSize = .T.BackStyle = 0*Casetele de textName = "Text1"DisabledBackColor = 192,192,192Name = "Text2"DisabledBackColor = 192,192,192

Page 284: SGBD Visual Foxpro

Informatică284

* Grupul de butoaneName = "Commandgroup1"AutoSize = .T.ButtonCount = 3BackStyle = 0Value = 1Height = 106Left = 288Top = 36Width = 198Command1.Name = "Command1"Command1.AutoSize = .F.

Command1.Caption = "\<Cauta"Command1.Style = 0Command2.Name = "Command2"Command2.AutoSize = .F.Command2.Caption="\<Inlocuieste"Command3.Name = "Command3"Command3.AutoSize = .T.Command3.Caption = "Inlocuieste; toate \<aparitiile"* Butonul de comandaName = "Command1"Caption = "\<Terminare"

Pentru formular scrieÆi procedura asociatå evenimentului Init:procedure Init &&Formularpublic xstore 0 to xThisForm.Edit1.Value=''ThisForm.Text1.Value=''ThisForm.Text2.Value=''ThisForm.Text1.Enabled=.F.ThisForm.Text2.Enabled=.F.ThisForm.Commandgroup1.Command1.Enabled=.F.ThisForm.Commandgroup1.Command2.Enabled=.F.ThisForm.Commandgroup1.Command3.Enabled=.F.

endprocPentru zona de editare scrieÆi proceduri asociate evenimentelor GotFocus,LostFocus çi Valid:

procedure GotFocus && EditBoxThisForm.Text1.Enabled=.T.ThisForm.Text2.Enabled=.F.ThisForm.Commandgroup1.Command1.Enabled=.F.ThisForm.Commandgroup1.Command2.Enabled=.F.ThisForm.Commandgroup1.Command3.Enabled=.F.

endprocprocedure LostFocus && EditBoxThisForm.Text2.Enabled=.F.ThisForm.Commandgroup1.Command1.Enabled=.F.ThisForm.Commandgroup1.Command2.Enabled=.F.ThisForm.Commandgroup1.Command3.Enabled=.F.

endprocprocedure Valid && EditBoxif len(ThisForm.Edit1.Value)<>0

ThisForm.Text1.Enabled=.T.Return .T.

else ThisForm.Text1.Enabled=.F.

Return .F.endif

endproc

Page 285: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 285

Pentru casetele de text scrieÆi proceduri asociate evenimentelor GotFocus çiLostFocus:

procedure GotFocus &&Text1ThisForm.Text2.Enabled=.F.ThisForm.Commandgroup1.Command1.Enabled=.F.ThisForm.Commandgroup1.Command2.Enabled=.F.ThisForm.Commandgroup1.Command3.Enabled=.F.

endprocprocedure LostFocus &&Text1if Len(ThisForm.Text1.Value)<>0

ThisForm.Commandgroup1.Command1.Enabled=.T.if Len(ThisForm.Text2.Value)<>0

ThisForm.Commandgroup1.Command2.Enabled=.T.ThisForm.Commandgroup1.Command3.Enabled=.T.

endifelseThisForm.Commandgroup1.Command1.Enabled=.F.ThisForm.Commandgroup1.Command2.Enabled=.F.ThisForm.Commandgroup1.Command3.Enabled=.F.

endifendprocprocedure GotFocus &&Text2ThisForm.Commandgroup1.Command2.Enabled=.F.ThisForm.Commandgroup1.Command3.Enabled=.F.

endprocprocedure LostFocus &&Text2if Len(ThisForm.Text2.Value)<>0

ThisForm.Commandgroup1.Command2.Enabled=.T.ThisForm.Commandgroup1.Command3.Enabled=.T.

elseThisForm.Commandgroup1.Command2.Enabled=.F.ThisForm.Commandgroup1.Command3.Enabled=.F.

endifendproc

Pentru butoanele din grup çi pentru butonul Terminare scrieÆi proceduri asociateevenimentului Click:

procedure Command1.Click && Grup.Buton1 x=at(alltrim(ThisForm.Text1.Value),ThisForm.Edit1.Value)if x<>0

ThisForm.Text2.Enabled=.T.ThisForm.Edit1.SelStart=at(alltrim(ThisForm.Text1.Value),;

ThisForm.Edit1.Value)-1ThisForm.Edit1.SelLength=Len(alltrim(ThisForm.Text1.Value))

n=n+1elseThisForm.Commandgroup1.Command1.Enabled=.F.ThisForm.Commandgroup1.Command2.Enabled=.F.ThisForm.Commandgroup1.Command3.Enabled=.F.ThisForm.Text2.Enabled=.F.

endif

Page 286: SGBD Visual Foxpro

Informatică286

endprocprocedure Command2.Click && Grup.Buton1ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value)ThisForm.Text2.Value=''ThisForm.Text2.Enabled=.F.ThisForm.Commandgroup1.Command2.Enabled=.F.ThisForm.Commandgroup1.Command3.Enabled=.F.

endprocprocedure Command3.Click && Grup.Buton1ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value)

x=at(alltrim(ThisForm.Text1.Value),ThisForm.Edit1.Value)do while x<>0ThisForm.Edit1.SelStart=at(alltrim(ThisForm.Text1.Value),;

ThisForm.Edit1.Value)-1ThisForm.Edit1.SelLength=Len(alltrim(ThisForm.Text1.Value))ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value)

x=at(alltrim(ThisForm.Text1.Value),ThisForm.Edit1.Value)enddoThisForm.Text2.Value=''ThisForm.Text2.Enabled=.F.ThisForm.Commandgroup1.Command1.Enabled=.F.ThisForm.Commandgroup1.Command2.Enabled=.F.ThisForm.Commandgroup1.Command3.Enabled=.F.

endprocprocedure Click && Buton1ThisForm.Release

endprocSalvaÆi formularul. LansaÆi formularul în execuÆie çi-l testaÆi.

6. CreaÆi tabelul agenda cu urmåtoarea structurå: nume(C,15), prenume(C,15), adresa(C,40), telefon(C,10) çi data_n(D). RealizaÆi o casetå de dialog care så permitå urmå-toarele operaÆii cu datele din tabel: parcurgerea tabelului pentru vizualizare (nu se potmodifica datele din câmpuri) çi adåugarea de noi înregistråri. Butoanele >>> çi <<< sefolosesc pntru parcurgerea tabelului înainte çi înapoi, iar butonul Adauga pentruadåugarea de noi înregistråri.CreaÆi formularul çi adåugaÆi laformular cinci etichete, o zonå deeditare (pentru câmpul adresa),patru casete de text (pentru restulcâmpurilor) çi patru butoane decomandå. StabiliÆi pentru formular çicontroale urmåtoarele proprietåÆi:

* FormularName = "Form1"BackColor = 220,220,220Caption = "Agenda"Closable = .F.* Casetele de textName = "Text1"ControlSource = "agenda.nume"

Page 287: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 287

Name = "Text2"ControlSource="agenda.prenume"Name = "Text3"ControlSource="agenda.telefon"Name = "Text4"ControlSource="agenda.data_n"Format = "E"* Zona de editareName = "Edit1"ControlSource="agenda.adresa"*EticheteleName = "Label1"Caption = "\<Numele"Name = "Label2"Caption = "\<Preumele"Name = "Label3""Adre\<sa"

Name = "Label4""Tele\<fon"Name = "Label5"Caption = "\<Data nasterii"*pentru toate etichetele:AutoSize = .T.BackStyle = 0* ButoaneName = "Command1"Caption = ">>>"Name = "Command2"Caption = "<<<"Name = "Command3"Caption = "\<Adauga"Name = "Command4"Caption = "\<Terminare"

ScrieÆi procedurile asociate evenimentelor Load, Unload çi Init ale formularului:procedure Load &&Formularuse agendagoto top

endprocprocedure Init &&Formular set date to british ThisForm.Text1.ReadOnly=.T. ThisForm.Text2.ReadOnly=.T.

ThisForm.Text3.ReadOnly=.T.ThisForm.Text4.ReadOnly=.T.ThisForm.Edit1.ReadOnly=.T.ThisForm.Text1.SetFocus

endprocprocedure Unload &&Formularuse

endprocScrieÆi procedurile asociate evenimentului Init al casetelor de text çi al zonei de edi-tare:

procedure Init &&Text1if eof()ThisForm.text1.Value=''

endifendprocprocedure Init &&Text2if eof()ThisForm.Text2.Value=''

endifendprocprocedure Init &&Edit1if eof()ThisForm.Edit1.Value=''

endifendprocprocedure Init &&Text3if eof()ThisForm.Text3.Value=''

endifendprocprocedure Init &&Text4if eof()ThisForm.Text4.Value={ / / }endif

endproc

ScrieÆi procedurile asociate evenimentelor Click ale butoanelor:procedure Click &&Buton1if not eof()skipThisForm.Text1.ReadOnly=.T.ThisForm.Text2.ReadOnly=.T.ThisForm.Text3.ReadOnly=.T.ThisForm.Text4.ReadOnly=.T.ThisForm.Edit1.ReadOnly=.T.

ThisForm.Refreshendif

endprocprocedure Click &&Buton2if not bof()skip -1ThisForm.Text1.ReadOnly=.T.ThisForm.Text2.ReadOnly=.T.

Page 288: SGBD Visual Foxpro

Informatică288

ThisForm.Text3.ReadOnly=.T.ThisForm.Text4.ReadOnly=.T.ThisForm.Edit1.ReadOnly=.T.

ThisForm.Refreshendif

endprocprocedure Click &&Buton3append blankThisForm.Text1.ReadOnly=.F.ThisForm.Text2.ReadOnly=.F.

ThisForm.Text3.ReadOnly=.F.ThisForm.Text4.ReadOnly=.F.ThisForm.Edit1.ReadOnly=.F.ThisForm.RefreshThisForm.Text1.SetFocus

endprocprocedure Click &&Buton4ThisForm.Release

endproc

SalvaÆi formularul. LansaÆi formularul în execuÆieçi-l testaÆi.

Casetå de text cu derulor SpinnerxCaseta de text cu derulor este un control care combinå un control casetå de text cu uncontrol derulor. Derulorul faciliteazå utilizatorului modificarea unei valori numerice prinincrementare sau decrementare. Este reprezentat printr-un buton cu douå sågeÆi (sus/jossau dreapta/stânga) care poate fi acÆionat executând clic cu mouse-ul pe una dintresågeÆi. Evenimentul declançat este incrementarea/decrementarea cu un pas a valoriiasociate controlului. Derulorul nu are proprietatea de legendå çi din aceastå cauzå trebuieasociat cu o etichetå care så precizeze parametrul cåruia i se atribuie valoarea.

Pe lângå proprietåÆile standard çi specifice unei casete de text, derulorul mai are çiurmåtoarele proprietåÆi specifice:

Pasul Increment . Este de tip numeric çi reprezintå cu cât se incrementeazå/decre-menteazå valoarea. De exemplu, valorile numerice întregi pot fi incrementate cu ounitate, iar cele reale cu o zecime de unitate. Pasul implicit este 1.ProprietåÆile folosite pentru a preciza domeniul care poate fi parcurs (limitele valoriiasociate controlului) sunt de tip numeric:

Pentru valorile introduse de la tastaturå în caseta de text: KeyboardHighValue -valoarea maximå çi KeyboardLowValue - valoarea minimå. Domeniul implicit este±2.147.483.647. Dacå se introduce un numår care depåçeçte aceastå valoare, seafiçeazå un mesaj de eroare.Pentru valorile incrementate/decrementate în derulor: SpinnerHighValue - va-loarea maximå çi SpinnerLowValue - valoarea minimå. Dacå se incrementeazå/decrementeazå peste limite, nu se afiçeazå un mesaj de eroare, dar valoareacontrolului nu va mai fi modificatå peste limitele admise.

Pentru a controla comportamentul controlului au o fost adåugate urmåtoarele evenimentespecifice:

Evenimentele declançate la pierderea focalizårii controlului çi care permit validareavalorii introduse (de la tastaturå sau cu mouse-ul). Astfel:

Dacå procedura asociatå evenimentului RangeLow întoarce un numår mai maredecât cel introdus în control, controlul va påstra focalizarea.Dacå procedura asociatå evenimentului RangeHight întoarce un numår mai micdecât cel introdus în control, controlul va påstra focalizarea.

Page 289: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 289

Evenimentele declançate de acÆionarea derulorului cu mouse-ul:UpClick - când este acÆionat butonul de incrementare çiDownClick - când este acÆionat butonul de decrementare.

ConstruiÆi un formular care conÆine casete de text folosind metoda programårii

RealizaÆi o casetå de dialog în care sefolosesc trei controale de tip casetå detext cu derulor pentru introducerea uneidate: anul, luna çi ziua. Se mai folosesctrei etichete çi un buton de comandå.Limitele pentru an au fost stabilite: minim1900 çi maxim anul curent, adicåyear(date()). Limitele pentru lunå sunt 1çi 12, iar pentru zi 1 çi 31.

CreaÆi un formular nou. În formularcreaÆi urmåtoarele controale: treicasete de text cu derulor, trei etichete çi un buton de comandå. Pentru caseta detext cu derulor folosiÆi instrumentul Spinner de pe bara Form Controls.StabiliÆi propritåÆile pentru formular çi controale. Pentru controlul Spinner1 trebuie såatribuiÆi prorpietåÆilor KeyboardHighValue çi SpinnerHighValue o valoare calcu-latå: year(date()). Pentru aceasta, în fereastra de proprietåÆi folosiÆi butonul con-structorului de expresii Expression Builder care deschide caseta de dialog prinintermediul cåreia construiÆi expresia folositå pentru calcul.

* FormularulName = "Form1"BackColor = 192,192,192Caption = "Data"Closable = .F.* Derulorul AnName = "Spinner1"Increment = 10.00InputMask = "9999"KeyboardHighValue=year(date())KeyboardLowValue = 1900SpinnerHighValue = year(date())SpinnerLowValue = 1900.00Value = 2000.0000* Derulorul LunaName = "Spinner2"InputMask = "99"KeyboardHighValue = 12KeyboardLowValue = 1SpinnerHighValue = 12.00

SpinnerLowValue = 1.00Value = 1.0* Derulorul ZiuaName = "Spinner3"InputMask = "99"KeyboardHighValue = 31KeyboardLowValue = 1SpinnerHighValue = 31.00SpinnerLowValue = 1.00Value = 1.0* EticheteleName = "Label1"Caption = "Anul"Name = "Label2"Caption = "Luna"Name = "Label3"Caption = "Ziua"* Butonul de comandaName = "Command1"Caption = "Terminare"

Page 290: SGBD Visual Foxpro

Informatică290

DefiniÆi urmåtoarele proceduri pentru evenimentele care valideazå datele introduseîn casetele de text cu derulor RangeLow çi RangeHight çi pentru evenimentul Clickgenerat de executarea unui clic pe butonul de terminare:

Procedure RangeLow && Spinner1 return 1900EndprocProcedure RangeHigh && Spinner2luna return 12EndprocProcedure RangeHigh && Spinner3do casecase;thisform.spinner2.value=2 and;thisform.spinner1.value%4=0return 29

case;thisform.spinner2.value=2return 28

case;inlist(thisform.spinner2.;value,1,3,5,7,8,10,12)return 31

otherwisereturn 30

endcaseEndprocProcedure Click ThisForm.ReleaseEndproc

SalvaÆi formularul. LansaÆi în execuÆie formularul çi-ltestaÆi.

Grila Gridx, coloana Columnx çi antetul coloanei HeaderxGrila ca obiect de interfaÆå se foloseçte pentru organizarea datelor sub formå de tabele. Eaafiçeazå un ansamblu de rânduri çi coloane. IntersecÆia unui rând cu o coloanå se numeçtecelulå (cell). În celulele grilei se pot scrie çi se pot afiça informaÆii atât sub formå de texte, câtçi sub formå de imagini.

Grila se realizeazå prin intermediul obiectului container Gridx care conÆine obiecte de tipcoloanå Columnx. Obiectul coloanå la rândul såu conÆine un obiect de tip antet Headerxçi alte controale. Controalele sunt adaptate datelor care trebuie introduse sau afiçate încoloana respectivå. Cele mai folosite sunt casetele de text (de aceea ele sunt implicite ladefinirea unei coloane). Pentru datele care trebuie introduse de utilizator se mai pot folosi çizonele de editare sau casetele cu derulor. Dacå valoarea celulei trebuie aleaså din mai multevariante posibile, se pot folosi comutatoarele (pentru douå variante) sau listele. Açadar,grila este o matrice în celulele cåreia pot fi create diferite obiecte de interfaÆå. Grila secreeazå într-un formular.

Folosind acest tip de obiect, pot fi afiçate sub forma unui tabel câmpurile dintr-un tabel albazei de date. Aspectul afiçårii în grilå este asemånåtor cu cel al ferestrei Browse. FaÆå defereastra Browse, grila are avantajul cå poate fi tratatå ca un obiect cu proprietåÆi, care çtieså execute diferite metode çi care çtie så råspundå la evenimente.

Elementele caracteristice ale unui obiect de interfaÆå de tip grilå sunt:Dimensiunea grilei. Este datå de numårul de rânduri çi de coloane ale grilei.Rândul grilei. Corespunde unei înregistråri dintr-un tabel.Coloana grilei. Corespunde unui câmp din tabel sau unei variabile de memorie acårei valoare este datå de o expresie care poate conÆine çi câmpuri din tabel.

Page 291: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 291

Antetul coloanei. Este o etichetå afiçatå în partea de sus a coloanei care conÆine untext explicativ referitor la datele afiçate în coloanå.Celula. Celula curentå (celula activå) este celula care primeçte focalizarea. Ea estedeterminatå de numårul rândului çi numårul coloanei la intersecÆia cårora se gåseçtecelula. Utilizatorul poate schimba în orice moment celula curentå folosind mouse-ulsau tastatura (tasta Tab). Dimensiunea celulei este determinatå de înålÆimea rândului çilåÆimea coloanei. Aceste proprietåÆi trebuie så fie modificate dacå nu sunt suficiente ca såîncapå textul sau imaginea în celulå.Alinierea. Se referå la alinierea datelor în coloanele tabelului çi în celule.Barele de derulare. Se folosesc pentru a deplasa conÆinutul grilei atunci când nu potfi vizualizate toate datele în zona de afiçare a grilei. Se pot folosi bare de derulare peverticalå çi pe orizontalå.Liniile folosite ca delimitatori. Pentru delimitarea celulelor se pot folosi linii care potfi caracterizate de culoare çi grosime.Coloana cu marcajul pentru çtergere. Este o coloanå care poate fi folositå pentru amarca o înregistrare pentru çtergere (se executå clic în aceastå coloanå în dreptulînregistrårii pe care vreÆi så o marcaÆi pentru çtergere sau pentru care vreÆi så anulaÆiun marcaj pentru çtergere - la fel ca la fereastra Browse).Coloana cu marcajul rândului curent. Este o coloanå care poate fi folositå pentru astabili înregistrarea curentå (se executå clic în aceastå coloanå în dreptul înregistråriicare vreÆi så devinå înregistrare curentå - la fel ca la fereastra Browse).Panourile grilei. La fel ca la fereastra Browse grila poate fi împårÆitå în douå partiÆiinumite panouri. Cele douå panouri pot funcÆiona ca douå grile independente, iardivizarea lor se face prin intermediul unei bare de divizare (split).

Toate aceste elemente pot fi caracterizate cu ajutorul proprietåÆilor grilei, coloanelor çi alanteturilor, pot fi manipulate cu ajutorul metodelor çi pot råspunde la evenimente spe-cifice.

Coloana cumarcajul rândului

Coloana cumarcajul pentru

çtergere

Barele dederulare ale grilei

Formularul

Grila

AntetulColoana

Celula selectatå

Page 292: SGBD Visual Foxpro

Informatică292

Antetul - obiectul HeaderCreeazå un antet al unei coloane dintr-o grilå prin care se afiçeazå o etichetå în parteade sus a coloanei. Antetul poate råspunde la evenimente. Aspectul antetului poate fistabilit prin intermediul proprietåÆilor pentru fontul caracterelor (nume font, dimensiune,stil), pentru aliniere çi culoare (pentru fond çi pentru text). Obiectul nu are proprietåÆipentru dimensiune çi poziÆie. Prin proprietatea Caption a antetului se stabileçte textulcare se afiçeazå ca etichetå a coloanei.

Antetul råspunde la evenimente declançate de acÆiunile mouse-ului (Click, RightClick,DblClick, MouseUp, MouseDown, MouseMove) çi cunoaçte metoda Refresh.

Coloana - obiectul ColumnCreeazå o coloanå într-o grilå. Coloana poate conÆine un obiect antet çi diversecontroale. Coloana poate conÆine date din câmpurile unui tabel sau valori ale uneiexpresii. Afiçarea çi editarea lor se poate face cu ajutorul controalelor. Açadar, într-ocoloanå poate fi creat un antet çi pot fi adåugate diferite controale. Controalele pot fi adå-ugate la coloana unei grile cu metoda AddObject în procedura asociatå evenimentuluiInit al formularului care conÆine grila. Nu este permis accesul la antetul coloanei çi lacoloanå înainte de a se produce evenimentul Init al grilei.

Sursa de date a coloanei este datå de proprietatea ControlSource care este de tip çir decaractere (este numele unui câmp sau al unei variabile de memorie).

Alinierea controalelor în coloanå poate fi stabilitå cu proprietatea Alignment. Coloanelenu au decât proprietatea Width (låÆime). ProprietåÆile Width ale controalelor create în co-loanå sunt protejate la scriere (read-only). ProprietåÆile specifice unei coloane sunt:

Numårul de ordine al coloanei ColumnOrder . Este un numår de ordine relativ al co-loanei în cadrul grilei. La crearea grilei, fiecare coloanå primeçte un index pentru referinÆå,în ordinea în care au fost create. Numårul de ordine al coloanei este diferit de acest indexçi se referå la ordinea de exploatare a coloanelor într-o grilå (afiçare çi focalizare).ProprietåÆile dinamice pentru aspectul fizic al coloanei. Aceste prorpietåÆi se potfolosi pentru a stabili dinamic caracteristicile fizice ale unei coloane deoarece ele suntreevaluate dupå fiecare execuÆie a metodei Refresh a grilei. Ele se referå la aliniereDynamicAlignment , la culori DynamicBackColor çi DynamicForeColor , laaspectul caracterelor DynamicFontName , DynamicFontSize , ..., la controlul curentDynamicCurrentControl .Metoda folositå pentru focalizarea unei celule SelectOnEntry . Este de tip logic çise foloseçte pentru a controla modul în care poate fi focalizatå o celulå din coloanå.Dacå are valoarea .T., celula este focalizatå atunci când utilizatorul executå clic în celulåsau apaså repetat tasta Tab pânå este deplasat selectorul în celulå. Dacå are valoarea .F.(valoarea implicitå), aceste acÆiuni nu vor focaliza celula.ProprietåÆile folosite pentru a administra controalele din coloanå:

Numårul controalelor: ControlCount . Este de tip numeric çi reprezintå numårul decontroale definite într-o coloanå (inclusiv antetul).ReferinÆele controalelor: Controls - este un vector care conÆine referinÆele pentrucontroalele din coloanå.

Page 293: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 293

Controlul curent: CurrentControl - este de tip çir de caractere çi conÆine numelecontrolului care afiçeazå çi primeçte date în celula activå a coloanei.Råspândirea influenÆei: Sparse - este de tip logic çi se foloseçte pentru a controlamodul în care controlul curent influenÆeazå çi celelalte controale din coloanå. Dacå arevaloarea .T. (valoarea implicitå), numai celula activå foloseçte obiectul de interfaÆåspecificat în proprietatea CurrentControl (controlul curent), iar celelalte celule dincoloanå folosesc pentru afiçare çi editare controale de tip casetå de text (TextBox).Dacå are valoarea .F., toate celulele din coloanå vor folosi obiectul de interfaÆåspecificat în proprietatea CurrentControl. Açadar, dacå vreÆi ca într-o coloanå såfolosiÆi pentru vizualizarea çi editarea datelor un alt tip de control decât caseta de text,proprietatea Sparse a coloanei trebuie så aibå valoarea .F..Domeniul sursei de date: Bound - este de tip logic çi se foloseçte pentru a controlasursa de date a controalelor din coloanå. Dacå are valoarea .T. (valoarea implicitå),toate controalele din coloanå vor folosi aceeçi surså de date ca çi coloana, iar dacå arevaloarea .F., fiecare control din coloanå va putea folosi propria sa surså de date.Açadar, dacå vreÆi så obligaÆi toate controalele din coloanå så foloseascå sursa dedate a coloanei (condiÆie necesarå în cazul unui tabel al sursei de date), proprietateaBound a coloanei trebuie så aibå valoarea .T..

ProprietåÆile folosite pentru manipularea coloanei:Deplasarea coloanei: Movable - este de tip logic çi determinå dacå o coloanåpoate fi mutatå sau nu. Dacå are valoarea .T. (valoarea implicitå), coloana poate fimutatå interactiv, iar dacå are valoarea .F., coloana nu poate fi mutatå interactiv decåtre utilizator (cu ajutorul tastaturii sau prin glisarea cu mouse-ul a coloanei), ci numaidin program prin modificarea valorii proprietåÆii ColumnOrder.Redimensionarea: Resizable - este de tip logic çi determinå dacå o coloanå poatefi redimensionatå sau nu. Dacå are valoarea .T., coloana poate fi redimensionatåinteractiv (pe låÆime), iar dacå are valoarea .F. (valoarea implicitå), coloana nu poate firedimensionatå interactiv de cåtre utilizator (cu ajutorul tastaturii sau prin glisarea cumouse-ul a uneia dintre laturile coloanei), ci numai din program prin modificarea valoriiproprietåÆii Width.

Printre metodele care pot fi folosite de coloanå sunt: SetAll, Refresh, SetFocus çi Move.Evenimentele recunoscute de coloanå sunt: MouseMove, Moved (provocat prin mutateainteractivå a coloanei de cåtre utilizator sau prin modificarea din program a proprietåÆilorTop çi Left ale coloanei) çi Resize (provocat prin redimensionarea interactivå a coloanei decåtre utilizator, sau prin modificarea din program a proprietåÆii Width a coloanei).

Grila - obiectul GridAdunå într-un container mai multe obiecte de tip coloanå. La nivelul grilei nu existå pro-prietatea Alignment (alinierea se face la nivelul fiecårei coloane). Existå proprietåÆilepentru poziÆia grilei, relative la formular (Top çi Left), proprietåÆile pentru dimensiuneagrilei (Hight çi Width), pentru culori çi pentru caracteristicile caracterelor.

Pe lângå aceste proprietåÆi generale existå urmåtoarele proprietåÆi folosite pentru a stabiliaspectul fizic al grilei (sunt proprietåÆi care se referå la unele obiecte componente ale

Page 294: SGBD Visual Foxpro

Informatică294

grilei, dar care nu se stabilesc la nivelul componentei, deoarece trebuie så existe unaspect unitar al acestor componente la nivelul grilei):

ÎnålÆimea antetului HeaderHeight . Este de tip numeric çi se måsoarå în pixeli.Modificarea interactivå a înålÆimii antetului AllowHeaderSizing . Este de tip logic.Dacå are valorea .T., permite modificarea interactivå de cåtre utilizator a înålÆimii antetului.ÎnålÆimea rândului RowHeight . Este de tip numeric. Dacå are valoarea -1, înålÆimeaeste aleaså automat astfel încât så încapå caracterele corespunzåtoare dimensiuniistabilite prin proprietåÆile FontSize çi FontName.Modificarea interactivå a înålÆimii rândului AllowRowSizing . Este de tip logic. Dacåare valorea .T., permite modificarea interactivå de cåtre utilizator a înålÆimii rândului.EvidenÆierea celulei focalizate HeighLight . Este de tip logic çi determinå cum esteafiçatå celula focalizatå: dacå are valoarea .T., celula focalizatå apare evidenÆiatå, iardacå are valoarea .F., celula focalizatå nu apare evidenÆiatå.

Alte proprietåÆi se folosesc pentru a stabili aspectul fizic al elementelor specifice grilei:Barele de derulare ScrollBars . Este de tipnumeric çi controleazå ce bare de derulare suntafiçate. Pentru valorile diferite de 0 barele dederulare sunt afiçate automat atunci când în spaÆiulde afiçare al grilei nu pot fi afiçate toate datele dinsursa de date a grilei. AcÆionarea elementelorcaracteristice ale barei de derulare sunt sesizate deevenimentul Scrolled. Barele de derulare pot fiacÆionate interactiv (clic pe sågeÆi, clic deasupra,deddesubt, la dreapta sau la stânga casetei de derulare sau glisarea casetei dederulare) sau pot fi acÆionate din program folosind metoda DoScroll.Coloana cu marcajul înregistrårii curente RecordMark . Este de tip logic çi con-troleazå dacå este afiçatå coloana care conÆine marcajul pentru înregistrarea curentå:dacå are valoarea .T. (implicit), este afiçatå, iar dacå are valoarea .F., nu este afiçatå.Coloana cu marcajele pentru çtergere DeleteMark . Este de tip logic çi controleazådacå este afiçatå coloana care conÆine marcajele pentru çtergere. Dacå are valoarea .T.(implicit), este afiçatå, iar dacå are valoarea .F., coloana nu este afiçatå.ProprietåÆile folosite pentru a caracteriza liniile folosite ca delimitatori:

Modul de afiçare a liniilor: GridLines - este de tipnumeric.Grosimea liniilor: GridLineWidth - este de tipnumeric çi determinå grosimea în pixeli a liniilor.Culoarea liniilor: GridLineColor - este de tipnumeric çi reprezintå codul culorii.

ProprietåÆile folosite pentru a caracteriza împårÆireagrilei în panouri:

ÎmpårÆirea în panouri: Partition - este de tip numeric çi controleazå dacå grilaeste împårÆitå sau nu în panouri. Dacå are valoarea 0, grila nu este împårÆitå înpanouri, dacå are valoarea diferitå de 0, înseamnå cå grila este împårÆitå în

Valoare Efect ScrollBars0 Barele nu sunt afiçate.1 Se afiçeazå numai barele

pe orizontalå.2 Se afiçeazå numai barele

pe verticalå.3

(implicit)Se afiçeazå barele peorizontalå çi pe verticalå.

Valoare Efect GridLines0 Liniile nu sunt afiçate.1 Liniile se afiçeazå numai

pe orizontalå.2 Liniile se afiçeazå numai

pe verticalå.3

(implicit)Liniile se afiçeazå peorizontalå çi pe verticalå.

Page 295: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 295

panouri, iar valoarea proprietåÆii reprezintå distanÆa dintre marginea stângå a grileiçi bara de divizare a grilei în panouri.Panoul activ: Panel - este de tip numeric. Dacå are valoarea 0, panoul activ este înstânga, iar dacå are valoarea 1 (implicit), panoul activ este în dreapta.Legåtura dintre panouri: PanelLink - este de tip logic çi determinå dacå celedouå panouri sunt legate între ele (dacå au acelaçi aspect determinat de proprie-tåÆile HeaderHeight, DeleteMark, GridLines,..., HeightLight, RecordMark,RowHeight, ScrollBar): dacå are valoarea .T. (implicit), au acelaçi aspect, iardacå are valoarea .F., nu au acelaçi aspect.

ProprietåÆile folosite pentru a caracteriza coloanele grilei:Numåul de coloane: ColumnCount - este de tip numeric. Implicit are valoarea -1,care înseamnå numår suficient de coloane pentru a afiça câmpurile sursei de date.Referirea coloanei: Columns - este de tip vector çi conÆine referinÆe cåtre coloanelegrilei.Prima coloanå afiçatå: LeftColumn - este de tip numeric çi reprezintå numårulcoloanei (numåråtoarea se face începând de la stânga) care va fi prima afiçatå. Deexemplu, dacå proprietatea are valoarea 3, afiçarea în grilå va începe cu coloana3, iar coloanele 1 çi 2 nu vor fi afiçate.

Pe lângå proprietåÆile care caracterizeazå aspectul, grila mai are çi proprietåÆi specifice,prin care este caracterizat comportamentul ei:

ProprietåÆile folosite pentru a caracteriza celula activå (focalizatå):PoziÆia absolutå furnizatå de numårul rândului ActiveRow çi de numårul coloaneiActiveColumn . Aceste proprietåÆi sunt de tip numeric çi se calculeazå faÆå de primulrând, respectiv prima coloanå a grilei. Sunt proprietåÆi protejate la scriere (read-only).Aceste valori corespund parametrilor metodei ActivateCell.PoziÆia relativå furnizatå de numårul rândului RelativeRow faÆå de primul rândafiçat în grilå çi de numårul coloanei RelativeColumn faÆå de prima coloanåafiçatå în grilå. Aceste proprietåÆi sunt de tip numeric. De exemplu, dacå primacoloanå afiçatå în grilå este coloana 2, iar proprietatea ActiveColumn are valoarea 5,înseamnå cå valoarea proprietåÆii RelativeColumn este 3.

Adåugarea datelor la grilå este controlatå cu proprietatea de tip logic AllowAddNew,care dacå are valoarea .T. permite adåugarea de noi rânduri la grilå (dacå se apasåtasta ↓↓ se mai adaugå un rând la grilå).ProprietåÆile folosite pentru a caracteriza sursa de date a grilei:

Tipul sursei de date: RecordSourceType este de tip numeric çi caracterizeazåce date se vor folosi pentru a popula grila. Dacå datele vor fi preluate dintr-untabel, acesta poate fi permanent sau temporar (cusor), poate fi deja construit saupoate fi construit la iniÆializarea grilei (în procedura asociatå evenimentului Init algrilei se poate crea un tabel folosind comanda SQL Create table). Înregistråriletabelului vor fi rândurile grilei, iar câmpurile lui vor fi coloanele grilei.Sursa de date: RecordSource este de tip çir de caractere çi furnizeazå numeletabelului folosit ca surså de date sau numele aliasului cursorului sau numelefiçierului de interogåri.

Page 296: SGBD Visual Foxpro

Informatică296

RowSourceType Semnificå: RowSource0 - Table Sursa de date este un tabel deja construit. El va fi

deschis automat la iniÆializarea grilei (evenimentul Init).Numele tabelului.

1 - Alias (implicit) Tabelul care va fi sursa de date este specificat prin alias. Aliasul tabelului.2 - Prompt Sursa de date este un tabel al cårui nume va fi

specificat de utilizator pin intermediul unei casete dedialog; dacå este deschiså o bazå de date poatealege un tabel din ea.

Numele tabelului.

3 - Query Sursa de date este generatå dintr-un fiçier deinterogåri (.qpr).

Numele fiçierului deinterogåri (.qpr)

4 - SQL Statement Sursa de date va fi descriså printr-o instrucÆiune SQLSelect de interogare a bazei de date, care va generaun tabel permanent sau temporar ce va fi afiçat în grilå.

InstrucÆiunea SQL

ProprietåÆile folosite pentru a caracteriza grila care afiçeazå date dintr-un tabel albazei de date:

Câmpul cheie: RelationalExpr este de tip caracter çi precizeazå câmpul cheiecare asigurå legåtura între tabelul condus çi tabelul conducåtor çi care permitereunirea celor douå tabele într-un singur tabel.Aliasul tabelului conducåtor: LinkMaster este de tip çir de caractere çifurnizeazå aliasul tabelului conducåtor al tabelului afiçat în grilå.

Pe lângå metodele obiçnuite, printre care çi SetAll çi SetFocus, grila mai are urmåtoare-le metode specifice:

Manipularea barelor de derulare DoScroll . Prin aceastå metodå pemite derularea dinprogram a conÆinutului grilei pentru a simula acÆionarea interactivå a barelor de derulare.Metoda are parametrul <n>. Apelul metodei se face cu DoScroll(<n>). Parametrul <n>determinå modul în care se face derularea çi poate avea urmåtoarele valori: 0- derulare cuun rând în sus, 1- derulare cu un rând în jos, 2- derulare cu o paginå în sus, 3- derulare cuo paginå în jos, 4- derulare cu o coloanå la stânga, 5- derulare cu o coloanå la dreapta, 6-derulare cu o paginå la stânga, 7- derulare cu câte o paginå la dreapta.Activarea celulei ActiveCell . Prin aceastå metodå se poate schimba din programcelula activå. Metoda trebuie så primeascå doi parametri: <n> - numårul rândului çi<m> - numårul coloanei. Apelul metodei se face cu ActivateCell(<n>,<m>).Adåugarea unei coloane la grilå AddColumn . Prin aceastå metodå se poateadåuga un nou obiect Column la grilå. Metoda trebuie så primeascå un parametru <n>- poziÆia coloanei în grilå; coloanele care urmeazå dupå ea sunt deplasate cu o poziÆiespre drepata. Apelul metodei se face cu AddColumn(<n>).Çtergerea unei coloane din grilå DeleteColumn . Prin aceastå metodå se poateçterge un obiect Column din grilå. Metoda poate primi un parametru <n> - poziÆiacoloanei care se çterge din grilå, altfel se çterge coloana activå (cea care conÆinecelula activå); coloanele care urmeazå dupå ea sunt deplasate cu o poziÆie sprestânga. Apelul metodei se face cu DeleteColumn([<n>]).

Evenimentele specifice grilei sunt declançate de:Manipularea barelor de derulare Scrolled . Acest eveniment este declançat fie deacÆionarea interactivå a barei de derulare, fie prin acÆionarea ei din program cu metodaDoScroll. Procedura asociatå evenimentului primeçte din partea acestuia parametrul

Page 297: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 297

<nDirection> care îi comunicå modul în care a fost acÆionatå bara de derulare: 0-derulare cu un rând în sus (butonul sau tasta ↑↑), 1- derulare cu un rând în jos (butonulsau tasta ↓↓), 2- derulare cu o paginå în sus (clic pe bara verticalå, deasupra casetei), 3-derulare cu o paginå în jos (clic pe bara verticalå, sub casetå), 4- derulare cu o coloanåla stânga (butonul sau tasta ←←), 5- derulare cu o coloanå la dreapta (butonul sau tasta→→), 6- derulare cu o paginå la stânga (clic pe bara orizontalå, la stânga casetei), 7-derulare cu o paginå la dreapta (clic pe bara orizontalå, la dreapta casetei).Marcarea pentru çtergere a unei înregistråri Deleted . Acest eveniment estedeclançat fie de marcarea interactivå în grilå a înregistrårii pentru çtergere sau refacereaei, fie prin marcarea pentru çtergere cu comanda Delete. Procedura asociatå eveni-mentului primeçte din partea acestuia parametrul <nRecNo> care îi comunicå numå-rul înregistrårii marcate pentru çtergere.Schimbarea celulei focalizate (fie interactiv prin deplasarea selectorului de celulå cumouse-ul sau cu tastatura, fie din program cu metoda ActivateCell):

Dupå mutarea focalizårii: AfterRowColChange - se produce atunci cînd utilizatorulmutå focalizarea într-o celulå dintr-o altå coloanå sau un alt rând al grilei, dupå ce afost focalizatå noua celulå çi numai dacå procedura asociatå evenimentului When aobiectului din celula nou focalizatå furnizeazå un rezultat .T.. Evenimentul furnizeazåun parametru care corespunde indexului coloanei sau rândului în care a fost mutatåfocalizarea.Înaintea mutårii focalizårii: BeforeRowColChange - se produce atunci cîndutilizatorul mutå focalizarea într-o celulå dintr-o altå coloanå sau un alt rând al grilei,înainte ca noua celulå så primeascå focalizarea çi înainte de evenimentul Valid alobiectului din celula din care se mutå focalizarea.

CreaÆi o grilå pentru un tabel

CreaÆi un formular nou. În acest formular veÆi crea în mod rapid o grilå pentrucâmpurile din tabelul agenda cu ajutorul obiectului Data Environment.ExecutaÆi clic pe butonul Data Environment din bara Form Designer. Se deschidecaseta de dialog Open din carealegeÆi tabelul agenda. În fereastraData Environment va fi afiçattabelul. IndicaÆi titlul tabelului çi îlglisaÆi în formular. Dupå ce eliberaÆibutonul mouse-ului, în formular se vacrea o grilå cu o structurå decoloane care corespunde câmpurilordin tabel. Legendele din anteturilecoloanelor vor fi numele câmpurilor.FaceÆi urmåtoarele modificåri de pro-prietåÆi în fereastra Properties:Pentru obiectul Grid1 modificaÆi proprietatea AllowAddNew = .T., pentru obiectul

Page 298: SGBD Visual Foxpro

Informatică298

Header1 al coloanei a cincea (controlul Column5) modificaÆi proprietatea Caption='Data nasterii'.AdåugaÆi o coloanå la grilå: în obiectul Grid1 modificaÆi proprietatea ColumnCount=6.În coloana a çasea se va afiça un câmp calculat çi anume vârsta persoanei. StabiliÆipentru aceastå coloanå proprietåÆile: pentru obiectul Column6 proprietåÆileControlSource=int((date()-agenda.data_n)/365) çi ReadOnly=.T.(este protejat lascriere fiind un câmp calculat), iar pentru controlul Header al acestei coloaneproprietatea Caption='Varsta'.SalvaÆi formularul sub numele agenda_t çi închideÆi constructorul de formulare.Prin aceastå metodå fiecårei coloane i se atribuie implicit un control de tip casetå detext. Vom schimba tipul controlului din coloana a treia (pentru adresa), cu o zonå deeditare, astfel: deschideÆi tabelul asociat formularului cu comanda:

use agenda_t.scxDeschideÆi fereastra Browse cu comanda browse. CåutaÆi în acest tabel înregistrareacare coprespunde obiectului Grid1.Column3.Text1 (caseta de text din coloana a treiaa grilei). În aceastå înregistrare faceÆi urmåtoarele modificåri: în coloanele class çibaseclass înlocuiÆi textbox cu editbox, în coloana objname înlocuiÆi Text1 cu Edit1.DeschideÆi câmpul Properties çi çtergeÆi conÆinutul. ÎnchideÆi fereastra Browse.ÎnchideÆi tabelul cu comanda use.DeschideÆi fiçierul pentru modificare cu comanda modi form agenda_t. AdåugaÆi laformular un buton pentru terminare. FaceÆi modificårile ncesare pentru proprietåÆi,astfel încât ele så corespundå cu cele prezentate mai jos.

* Mediul de dateName = "Dataenvironment"Name = "Cursor1"Alias = "agenda"CursorSource = agenda.dbf* FormularName = "Form1"Caption = "Agenda"Closable = .F.* GrilaName = "Grid1"ColumnCount = 6AllowAddNew = .T.AllowRowSizing = .T.Panel = 1ReadOnly = .T.RecordSource = "agenda"RecordSourceType = 1RowHeight = 30* coloanele grileiColumn1.Name = "Column1"Column1.ControlSource =; "agenda.nume"Column1.ReadOnly = .F.Column2.Name = "Column2"

Column2.ControlSource =; "agenda.prenume"Column2.ReadOnly = .F.Column3.Name = "Column4"Column3.ControlSource =; "agenda.telefon"Column3.ReadOnly = .F.Column4.Name = "Column5"Column4.ControlSource =; "agenda.data_n"Column4.ReadOnly = .F.Column5.Name = "Column6"Column5.ControlSource =;"int((date()-agenda.data_n)/365)"Column5.ReadOnly = .T.Column6.Name = "Column3"Column6.Bound = .T.Column6.ControlSource =; "agenda.adresa"Column6.ReadOnly = .F.Column6.Sparse = .F.* Antetul coloanelor + controlName = "Header1"Caption = "nume"Name = "Text1"ReadOnly = .F.

Page 299: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 299

Name = "Header1"Caption = "prenume"Name = "Text1"ReadOnly = .F.Name = "Header1"Caption = "telefon"Name = "Text1"ReadOnly = .F.Name = "Header1"Caption = "data nasterii"Name = "Text1"ReadOnly = .F.Name = "Header1"Caption = "varsta"Name = "Text1"

ReadOnly = .T.Name = "Header1"Caption = "adresa"Name = "Edit1"ReadOnly = .F.* pentru toate controalele* caseta de text:BorderStyle = 0Margin = 0ForeColor = 0,0,0BackColor = 255,255,255* Butonul de comandaName = "Command1"Caption = "\<Termina"Default = .T.

ScrieÆi procedurile asociate evenimentelor Init al formularului çi Click al butonului deînchidere (prin care se çterg çi înregistrårile considerate vide - fårå nume pentrupersoanå - çi cele care au fost marcate pentru çtergere):

procedure Init && formular set date to britishendprocprocedure Click && Buton scan for nume=space(15)

delete endscan pack ThisForm.Releaseendproc

SalvaÆi formularul çi-l lansaÆi în execuÆie. TestaÆi grila.

AdåugaÆi la tabel câmpul de tip numeric Copii (numårul de copii ai persoaneirespective).ReluaÆi operaÆia de creare a grilei folosind metoda constructorului rapid (deschideÆitabelul, creaÆi un formular nou çi apåsaÆi butonul BuilderLock de pe bara FormControls. În caseta de dialog care se deschide, în secÆiunea Grid gåsiÆi instrumentelenecesare pentru a alege câmpurile din tabel care vor fi surså de date pentru coloanelegrilei, în secÆiunea Style gåsiÆi instrumentele necesare pentru a alege stilul grilei, iar însecÆiunea Layout gåsiÆi instrumentele necesare pentru stabilirea unor proprietåÆi pentruobiectele grilei: proprietatea Caption pentru Header, tipul controlului din lista Controltype). Pentru câmpul Copii alegeÆi un control de tip Spinner).

Page 300: SGBD Visual Foxpro

Informatică300

TT est pentru evaluare:

1. CreaÆi un tabel cu evidenÆa elevilor care vor så meargå într-o excursie. Tabelul arestructura: nume (C,15), prenume (C,15), telefon (C,10), suma (N,6). Elevii pot achitaîn mai multe etape valoarea excursiei. Valoarea totalå a excursiei este de 500.000lei. CreaÆi un formular cu urmåtoarele controale: trei casete de text pentru nume,prenume çi telefon, o casetå de text cu derulor pentru plata parÆialå (cu pasul de10.0000 çi cu valorile limitå 0 çi 500.000), trei casete de text protejate la scriere încare afiçaÆi suma totalå achitatå de elev (câmpul suma), diferenÆa råmaså de achitatçi suma totalå plåtitå de elevi (controlul va deveni vizibil la prima apåsare a butonuluipentru Total), çapte etichete în care så afiçaÆi semnificaÆia casetelor de text dinformular çi 5 butoane declançatoare: 2 pentru parcurgerea tabelului înainte çi înapoi,unul pentru adåugarea unei noi înregistråri, unul pentru afiçarea sumei totale çi unulpentru terminare.

2. RezolvaÆi aceeaçi problemå folosind un control de tip grilå. Grila va avea çasecoloane corspunzåtoare celor çase casete de text care se referå la un elev. Pentruplata parÆialå se va folosi çi în grilå o casetå de text cu derulor. Vor fi protejate lascriere coloanele care conÆin suma totalå achitatå de elev çi diferenÆa de achitat.Pentru suma totalå plåtitå de elevi veÆi folosi o casetå de text protejatå la scriere çi oetichetå. Formularul va avea doar douå butoane declançatoare: unul pentru Total çialtul pentru Terminare.

3. În variantele prezentate anterior, nu aveÆi posibilitatea så corectaÆi o platå parÆialå pecare aÆi scris-o greçit (la påråsirea controlului se actualizeazå câmpul suma). CumputeÆi îmbunåtåÆi formularul pentru a rezolva aceastå situaÆie?

ÎncercaÆi:Adevårat/Fals:1. Textul afiçat în formular prin care utilizatorul poate identifica rolul controlului se pås-

treazå în proprietatea Name.2. ProprietåÆile ReadOnly çi Enabled au aceeaçi semnificaÆie: controleazå accesul la un

control.3. When este un eveniment declançat înaintea primirii focalizårii de cåtre control.4. Proprietatea Default este specificå unui control de tip CommandButton.5. Eticheta are proprietatea AutoSize.6. Câmpul de editare are proprietatea WordWrap.7. Increment este o propritatea specificå unui control de tip Spinner.8. Evenimentul UpClick este specific tuturor controalelor.9. Obiectul Column se poate crea numai în obiectul container Grid.10. Proprietatea Panel controleazå împårÆirea grilei în panouri.

CompletaÆi:1. InformaÆiile despre control, afiçate într-o casetå atunci când este indicat controlul, se

påstreazå în proprietatea .............. çi se poate folosi numai dacå proprietatea ..............a formularului are valoarea .T.

Page 301: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 301

2. Evenimentul Valid se declançeazå .................................... focalizårii.3. Un formular care conÆine o casetå de text pentru introducerea parolei trebuie så fie ............4. Evenimentul DownClick este specific unui control de tip ........5. Obiectul Header se poate crea numai în obiectul ...................6. Sparse este o proprietate specificå unui control ...........................7. Textul afiçat ca o etichetå a unei coloane dintr-o grilå se memoreazå în proprietatea

Caption a controlului ...........8. Proprietatea prin care se stabileçte dacå toate controalele dintr-o coloanå au aceeaçi

surså de date este ..............

AlegeÆi råspunsurile corecte:1. Tipul datelor memorate într-un control este determinat de proprietatea:

a) Value b) Control Source c) Caption2. SelectedText este o proprietate a controlului:

a) TextBox b) Label c) EditBox3. Pentru formatul datelor memorate în proprietatea Value, caracteristica întregului câmp

de editare se stabileçte prin proprietatea:a) Format b) InputMask c) ControlSource

4. HeaderHeight este o proprietate specificå unui control:a) Grid b) Column c) Header

5. Sursa de date a grilei se påstreazå în proprietatea:a) RecordSourceType b) RecordSource c) RecordMark

RR åspunsuri:Adevårat/Fals: 1-F; 2-F; 3-A; 4-A; 5-A; 6-F; 7-A; 8-F; 9-A; 10-F.CompletaÆi: 1-ToolTipText, ShowToolTips; 2-dupå pierderea; 3-modal; 4-Spinner; 5- Column; 6-Column; 7-Header; 8-Bound.AlegeÆi råspunsurile corecte: 1-b; 2-a,c; 3- a; 4-a; 5-b.

3.4.4. Controale care permit utilizatorului så aleagåMulte aplicaÆii necesitå ca utilizatorul så aleagå din mai multe variante, de la o simplåalegere dintre douå opÆiuni Da/Nu pânå la alegerea unei variante dintr-o listå care conÆinesute de posibilitåÆi. Varianta aleaså este atribuitå ca valoare nouå unei variabile dememorie sau unui câmp. Controalele care permit utilizatorului så aleagå sunt:

Controlul SemnificaÆie Tipul datelorComutatorul Permite utilizatorului så aleagå din douå

variante posibile: adevårat sau fals.Logic

Butoane de opÆiuni Un set de opÆiuni care permite utilizatorului såaleagå numai una dintre ele.

Çir de caracteresau numere

Lista O listå de variante din care utilizatorul poateså aleagå una sau mai multe variante.

Çir de caracteresau numere

Caseta combinatå O combinaÆie între o listå çi o casetå de text.Utilizatorul poate fie så aleagå din listå, fie såscrie alegerea în zona de editare a casetei.

Çir de caracteresau numere

Page 302: SGBD Visual Foxpro

Informatică302

Comutatorul CheckBoxx

Se foloseçte într-o aplicaÆie pentru a permite utilizatorului så aleagå din douå varianteposibile, adicå så comute între douå variante posibile. Într-un formular, comutatoarelesunt independente unele de altele. De obicei, legenda comutatorului afiçeazå numelecomutatorului care corespunde datei a cårui valoare va fi stabilitå de utilizator.Proprietatea de aliniere a comutatorului (Alignment) se referå la modul de aranjare alegendei faÆå de comutator (la dreapta - 1 sau la stânga - 0). Metoda de acÆionare a unuicomutator este la fel ca çi la butoanele de comnadå: Click. Astfel, procedura asociatåevenimentului Click trebuie så asigure trecerea comutatorului dintr-o stare în alta çi de aatribui proprietåÆii Value valoarea corespunzåtoare noii ståri. Valoarea unui comutatorpoate fi de tip logic sau numeric:.F. sau 0, dacå este dezactivat, .T. sau 1, dacå esteactivat çi NULL sau 2, dacå nu este disponibil.

Stilul de reprezentare a comutatorului poate fi stabilit cu proprietatea Style. Dacåproprietatea are valoarea 0 - Standard (implicit), controlul este reprezentat grafic printr-ocasetå pentru care, dacå are în interior semnul de validare, valoarea controlului este .T.,iar dacå nu are semnul de validare are valoarea .F.. De aceea se mai numeçte çi casetåde validare. Dacå proprietatea are valoarea 1 - Graphic, controlul este reprezentat ca unbuton de comandå: în interiorul såu este afiçatå o imagine care poate fi însoÆitå de text(textul va fi scris centrat, sub imagine). Pentru acest stil de reprezentare trebuie folositåproprietatea DownPicture prin care se stabileçte aspectul comutatorului când esteactivat. Se recomandå folosirea acestui tip de reprezentare în barele cu instrumente.

În proprietatea Value se memoreazå 0 sau 1 dacå proprietatea ControlSource este tipnumeric sau .T. sau .F. dacå proprietatea ControlSource este de tip logic.

CreaÆi un comutator folosind metoda programårii clasice

În caseta de dialog Test se foloseçte comutatorul Afisare patrat pentru a controla afiçareaunei forme de tip påtrat.

ScrieÆi pogramul surså:

F1 = CreateObject('Form')F1.Closable = .F.F1.Caption='Test'F1.Height=200F1.BackColor = RGB(200,200,200)F1.AddObject('B1','Buton')F1.AddObject('C1','Comutator')F1.AddObject('P1','Patrat')F1.B1.Visible =.T.F1.C1.Value=.F.F1.C1.Visible = .T.

F1.C1.BackStyle = 0F1.C1.ClickF1.ShowRead eventsDefine class Comutator asB;

CheckBoxAlignment=1Top = 40Left = 10Height = 25

Page 303: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 303

Width = 130FontSize=12Caption = "\<Afisare patrat"Procedure ClickThisForm.P1.Visible =;

!ThisForm.P1.Visible ThisForm.CurrentX=55ThisForm.CurrentY=100If This.Value

ThisForm.Print("Patrat")elseThisForm.Print(space(12))

endifEnddefineDefine class Buton as;

CommandButtonCaption = '\<Terminarea'

Cancel = .T.Left = 125Top = 150Height = 25Procedure ClickThisForm.ReleaseClear eventsEnddefineDefine class Patrat as ShapeTop = 30Left = 220Width = 100Height = 100Curvature = 0BackColor = RGB(100,100,100)FillStyle=7Enddefine

ScrieÆi pogramul. LansaÆi programul în execuÆie çi testaÆi comutatorul.

CreaÆi un comutator folosind metoda programårii vizualeCreaÆi un formular nou. CreaÆi în acest formular urmåtoarele obiecte: un comutator, oformå çi un buton. Pentru comutator folosiÆi butonul CheckBox, iar pentru formåbutonul Shape de pe bara Form controls.StabiliÆi pentru formular çi controale urmåtoarele proprietåÆi:

*FormularName = "Form1"BackColor = 192,192,192Caption = "Test"Closable = .F.* ComutatorName = "Check1"FontSize = 12AutoSize = .T.Alignment = 1

BackStyle = 0Caption = "\<Afisare patrat"* FormaName = "Shape1"BackColor = 100,100,100FillStyle = 7* Buton de comandaName = "Command1"Cancel = .T.Caption = "\<Terminare"

ScrieÆi procedurile asociate evnimentelor Init çi Click ale comutatorului çi evenimen-tului Click al butonului :

Page 304: SGBD Visual Foxpro

Informatică304

procedure Init &&Check1ThisForm.Check1.Value=.T.

endprocprocedure Click &&Check1ThisForm.Shape1.Visible=;!ThisForm.Shape1.Visible

ThisForm.CurrentX=55ThisForm.CurrentY=100if ThisForm.Check1.Value

ThisForm.Print("Patrat")elseThisForm.Print(space(12))

endifendprocprocedure Click &&ButonThisForm.Releaseendproc

SalvaÆi formularul. Îl lansaÆi în execuÆie çi-l testaÆi.AdåugaÆi la tabelul Agenda câmpul de tip logic Are_copii (are valoarea adevårat dacåpersoana respectivå are copii).ReluaÆi operaÆia de creare a grilei folosind metodaconstructorului rapid. Pentru câmpul Are_copii ale-geÆi un control de tip CheckBox).

Butonul de opÆiune OptionButtonx çigrupul de butoane de opÆiuni OptionGroupxÎntr-un formular, controlul de tip buton de opÆiune nu poate fi folosit independent ciîntr-un container de tip grup de butoane de opÆiuni. Se folosesc într-o aplicaÆie pentru apermite utilizatorului så aleagå din douå sau mai multe variante posibile. ApartenenÆabutoanelor de opÆiuni la un grup face ca la un moment dat utilizatorul så poatå selecta unsingur buton din grup, celelalte butoane din grup nefiind selectate. Ele funcÆioneazå la felca butoanele pentru selectarea lungimii de undå ale unui aparat de radio çi de aceea semai numesc çi butoane radio. Într-un formular pot så existe mai multe grupuri de butoanede opÆiuni, fiecare grup având activat un singur buton. Grupul de butoane radio estedesenat în interiorul unui recipient care are proprietatea BorderStyle egalå cu 1 (fixå çitrasatå cu linie simplå). Grupul de butoane radio nu are proprietatea de legendå. DacåvreÆi så afiçaÆi numele datei pentru care stabiliÆi o valore cu ajutorul butoanelor de opÆiunidin grup, va trebui så folosiÆi un control de tip etichetå (label).

Legenda fiecårui buton afiçeazå valoarea care se va atribui datei asociate grupului dacåse va selecta acel buton. Proprietatea de aliniere a butonului de opÆiuni se referå lamodul de aranjare a legendei faÆå de buton (la dreapta sau la stânga). Butonul de opÆiunieste reprezentat grafic printr-un cerc care are în interior un punct atunci când butonuleste selectat.

În proprietatea Value se memoreazå:Dacå proprietatea ControlSource este o variabilå de memorie sau un câmp de tipnumeric, se memoreazå poziÆia în grup a butonului selectat.Dacå proprietatea ControlSource este o variabilå de memorie sau un câmp de tip çirde caractere, se memoreazå textul explicativ (Caption) asociat butonului selectat.

Butonul radio poate fi selectat prin mai multe metode:IndicaÆi cu mouse-ul butonul çi executaÆi clic.MutaÆi selectorul în grupul de butoane radio apåsând repetat tasta Tab çi selectaÆiapoi butonul activ din grup folosind tastele cu sågeÆi.

Page 305: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 305

ApåsaÆi tastele de acces la buton (tasta Alt împreunå cu tasta literei de identificare).

Pentru administrarea butoanelor din grup puteÆi folosi proprietåÆile specifice grupului debutoane radio:

Numårul de butoane din grup ButtonCount . Este de tip numeric.Butoanele Buttons . Este de tip vector çi poate fi folosit pentru referirea butoanelordin grup.

PuteÆi folosi metoda SetAll pentru a atribui aceeaçi valoare a unei proprietåÆi tuturorbutoanelor din grup. Sintaxa de apelare a metodei este: SetAll('<proprietate>',<valoare>).

Evenimentul Click asociat grupului de butoane radio va atribui datei valoarea asociatåbutonului selectat.

CreaÆi un grup de butoane cu opÆiuni folosind metoda programårii

În caseta de dialog Test se foloseçtegrupul de butoane radio Afisare pentrua alege figura geometricå afiçatå: cerc,elipsa sau patrat. În procedura asociatåevenimentului Click al grupului debutoane se va testa proprietatea Valuea grupului çi în funcÆie de valoarea eise va afiça una dintre figurile geome-trice. Pentru afiçarea unei legende agrupului de butoane s-a folosit uncontrol de tip etichetå.

Obiectele, proprietåÆile obiectelor çiprocedurile asociate evenimentelorsunt prezentate în programul urmåtor. ScrieÆi programul, îl salvaÆi, îl lansaÆi în execuÆie çiapoi testaÆi grupul de butoane radio.

dimension a(3)a(1)='Cerc 'a(2)='Elipsa 'a(3)='Patrat 'F1 = CreateObject('Form')F1.Closable = .F.F1.FontSize=14F1.Caption='Test'F1.BackColor = RGB(200,200,200)F1.AddObject('B1','Buton')F1.AddObject('GO1','GrupOpt')F1.AddObject('C1','Cerc')F1.AddObject('E1','Elipsa')F1.AddObject('P1','Patrat')F1.AddObject('L1','Label')

F1.B1.Visible =.T.F1.L1.Caption = 'Afisare'F1.L1.AutoSize = .T.F1.L1.Top=20F1.L1.Left=20F1.L1.BackStyle=0F1.L1.Visible =.T.F1.GO1.Buttons(1).Caption=; "\<Cerc"F1.GO1.Buttons(2).Caption=; "\<Elipsa"F1.GO1.Buttons(3).Caption=; "\<Patrat"F1.GO1.SetAll("Width", 100)F1.GO1.SetAll("Left", 10)

Page 306: SGBD Visual Foxpro

Informatică306

F1.GO1.SetAll("BackStyle", 0)F1.GO1.SetAll("FontSize", 12)F1.GO1.Visible = .T.F1.GO1.BackStyle = 0F1.GO1.ClickF1.ShowRead eventsDefine class GrupOpt as;

OptionGroupButtonCount = 3Top = 40Left = 20Height = 80Width = 100Procedure ClickThisForm.C1.Visible = .F.ThisForm.E1.Visible = .F.ThisForm.P1.Visible = .F.do casecase ThisForm.GO1.Value=1ThisForm.C1.Visible =.T.

case ThisForm.GO1.Value = 2ThisForm.E1.Visible = .T.

case ThisForm.GO1.Value = 3ThisForm.P1.Visible = .T.

endcaseThisForm.CurrentX=20ThisForm.CurrentY=150ThisForm.Print;

(a(ThisForm.GO1.Value))EnddefineDefine class Buton as;

CommandButtonCaption = '\<Terminarea'

Cancel = .T.Left = 125Top = 200Height = 25Procedure ClickThisForm.Releaseclear events

enddefineDefine class Cerc as shapeTop = 30Left = 200Width = 100Height = 100Curvature = 99BackColor = RGB(200,200,200)FillStyle=4EnddefineDefine class Elipsa as shapeTop = 30Left = 200Width = 120Height = 80Curvature = 99BackColor = RGB(150,150,150)FillStyle=5EnddefineDefine class Patrat as shapeTop = 30Left = 200Width = 100Height = 100Curvature = 0BackColor = RGB(100,100,100)FillStyle=7Enddefine

CreaÆi un grup de butoane cu opÆiuni folosind metoda vizualåCreaÆi un formular în care definiÆi apoi o legendå pentru grupul de butoane de opÆiuni,un grup de butoane de opÆiuni cu trei butoane, trei forme care se vor suprapune înformular çi un buton.StabiliÆi proprietåÆile formularului çi ale controalelor din formular:

* FormularName = "Form1"BackColor = 200,200,200Caption = "Test"Closable = .F.FontSize = 14* Eticheta grupuluiName = "Label1"

AutoSize = .T.BackStyle = 0Caption = "Afisare"* Grupul de optiuniName = "Optiongroup1"AutoSize = .T.ButtonCount = 3BackStyle = 0

Page 307: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 307

Value = 1Option1.Name = "Option1"Option1.Caption = "\<Cerc"Option2.Name = "Option2"Option2.Caption = "\<Elipsa"Option3.Name = "Option3"Option3.Caption = "\<Patrat"* FormeleName = "Shape1"BackColor = 200,200,200Curvature = 99FillStyle = 4Height = 120Left = 195Top = 24Width = 120Name = "Shape2"

BackColor = 150,150,150Curvature = 90FillStyle = 5Height = 80Left = 195Top = 24Width = 120Name = "Shape3"BackColor = 100,100,100FillStyle = 7Height = 120Left = 195Top = 24Width = 120Name = "Command1"Cancel = .T.Caption = "\<Terminare"

ScrieÆi procedurile asociate evenimentelor Init al formularului, Init çi Click ale grupuluide butoane de opÆiuni çi Click al butonului de comenzi:

procedure Init &&FormularThisForm.Optiongroup1.Value=1ThisForm.Shape1.Visible=.T.ThisForm.Shape2.Visible=.F.ThisForm.Shape3.Visible=.F.

endprocprocedure Init &&Grup optiunipublic adimension a(3)

a(1)='Cerc ' a(2)='Elipsa ' a(3)='Patrat 'ThisForm.Optiongroup1.SetAll("Width",100)ThisForm.Optiongroup1.SetAll("Left",100)ThisForm.Optiongroup1.SetAll("BackStyle",0)ThisForm.Optiongroup1.SetAll("FontSize",12)

endprocprocedure Click &&Grup optiuniThisForm.Shape1.Visible = .F.ThisForm.Shape2.Visible = .F.ThisForm.Shape3.Visible = .F.do casecase ThisForm.Optiongroup1.Value=1ThisForm.Shape1.Visible=.T.

case ThisForm.Optiongroup1.Value=2ThisForm.Shape2.Visible =.T.

case ThisForm.Optiongroup1.Value=3ThisForm.Shape3.Visible =.T.

endcaseThisForm.CurrentX=20ThisForm.CurrentY=150ThisForm.Print(a(ThisForm.Optiongroup1.Value))

Page 308: SGBD Visual Foxpro

Informatică308

endprocprocedure Click &&ButonThisForm.Release

endproc

SalvaÆi formularul, îl lansaÆi în execuÆie çi-l testaÆi.

CreaÆi un grup de butoane cu opÆiuni folosind Option Group BuilderCreaÆi acelaçi grup de butoane radio folosind acest constructor rapid. CreaÆi obiectul de tipgrup de butoane de opÆiuni, îl selectaÆi çi deschideÆi caseta de dialog a constructorului rapidcu opÆiunea Builder a meniului de comenzi rapide al controlului. Caseta de dialog conÆinetrei secÆiuni: Buttons pentru stabilirea butoanelor (numår, tip, etichete), Layout pentrustabilirea aspectului controlului (modul în care vor fi afiçate butoanele - pe orizontalå sauverticalå, dimensiunea spaÆiului care separå butoanele,stilul bordurii) çi Value pentru stabilirea câmpului dintr-untabel în care se va memora valoarea asociatå controlului.

Lista ListBoxx çi caseta combinatå ComboBoxxListele çi casetele combinate sunt controale care permit utilizatorului så aleagå dintr-ocolecÆie de valori numite articolele listei (item). Ele pot fi folosite pentru administrareasistemului sau pot fi folosite pentru introducerea datelor în câmpurile unei baze de date.Pentru administrarea sistemului, puteÆi construi liste cu unitåÆile de disc din sistem, cudirectoarele çi cu fiçierele dintr-un director.

Aceste controale nu au proprietatea Caption. Din aceastå cauzå ele se pot folosi împre-unå cu un control Label. Proprietatea Caption a etichetei ataçate poate fi folositå pentrua afiça numele parametrului a cårui valoare va fi stabilitå de utilizator în urma selectåriiunui articol din listå.

Deosebirea dintre un grup de butoane radio çi o listå este aceea cå, în cazul butoanelorde opÆiuni, colecÆia de articole din care se alege valoarea este fixå, iar în cazul listeiaceastå colecÆie este variabilå, controlul având încorporate metode suplimentare pentruactualizarea colecÆiei (adåugarea çi înlåturarea unor articole din listå), pentru sortareaarticolelor din listå çi pentru localizarea unui articol din listå.

Lista ListBoxx afiçeazå colecÆia de valori din care utilizatorul poate så aleagå sub formaunei liste de articole într-o casetå, afiçate pe verticalå, pe o singurå coloanå sau pe maimulte coloane (liste multicoloanå). În cazul listei multicoloanå un articol din listå conÆinemai multe coloane cu valori. Dacå numårul de articole din colecÆie depåçeçte capacitateade afiçare a casetei, apar automat barele de derulare. Articolele listei pot så fie derulatenumai pe verticalå.

Caseta combinatå ComboBox este un control care combinå o casetå de text cu olistå permiÆând utilizatorului så aleagå dintr-o colecÆie de valori. Aceste valori sunt afiçateîn listå çi utilizatorul poate fie så aleagå un articol din listå, fie så scrie valoarea de la tas-taturå în caseta de text. FaÆå de listå, caseta combinatå are çi proprietatea stil Style .Proprietatea este de tip numeric çi poate lua valorile: 0 - Drop-down Combo, adicå ocasetå derulantå combinatå care conÆine o listå derulantå çi o casetå de text çi 1 -

Page 309: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 309

Drop-down List, adicå o listå derulantå, care conÆine numai o listå derulantå (se mainumeçte çi listå ascunså).

Açadar, folosind aceste tipuri de controale puteÆi obÆine urmåtoarele tipuri de liste:Lista simplå (List). Afiçeazå pe ecran mai multe articole (nu neapårat toate articole-le). Se obÆine cu controlul ListBox .Lista ascunså sau lista derulantå (Drop-down List). Afiçeazå pe ecran numaiarticolul curent selectat din listå (ascunde restul articoleleor). Pentru a avea acces çila alte elemente, lista trebuie deschiså. În urma operaÆiei de deschidere, lista esteexpandatå (se deruleazå conÆinutul), iar utilizatorul are acces la mai multe articole (nuneapårat toate). Se obÆine cu controlul ComboBox având proprietatea Style=1.Caseta derulantå combinatå (Drop-down List). Combinå o listå ascunså cu o case-tå de text. Afiçeazå pe ecran numai elementul curent selectat din listå. Pentru a aveaacces çi la alte elemente lista trebuie deschiså. În urma operaÆiei de deschidere, listaeste expandatå (sunt afiçate mai multe articole, nu neapårat toate) çi se activeazåcaseta de text. Utilizatorul fie poate alege un articol din listå, fie scrie valoarea încaseta de text. Se obÆine cu controlul ComboBox având proprietatea Style=0.

Identificarea articolelor din listå

Articolele listei pot fi precizate, înainte de executarea listei (liste statice), la fel ca çi încazul butoanelor radio, prin precizarea sursei de date în momentul proiectårii çi citireasursei de date a listei în momentul execuÆiei, dar pot fi stabilite çi în timpul execuÆiei (listedinamice), prin adåugarea çi înlåturarea unor articole din listå. În timpul execuÆiei,articolele listei sunt påstrate în memoria internå sub forma unui tablou de memorie.Dacå lista are o singurå coloanå, tabloul va fi de tip vector cu elemente de tip çir decaractere, iar dacå are mai multe coloane, va fi de tip matrice. Fiecare element alvectorului, respectiv fiecare rând al matricei reprezintå un articol din listå. Articolele listeipot fi aranjate în ordine alfabeticå (sortate) sau nu.

Fiecårui articol din listå i se atribuie, la crearea listei sau la adåugarea lui la listå, douåco-duri numerice pentru identificare:

Indexul (Index) Reprezintå poziÆia articolului în listå la un moment dat. OperaÆiile dereordonare a listei, de çtergere sau de adåugare a unui articol au ca efect shimbareapoziÆiei articolului în listå. În acest caz se modificå çi indexul articolelor, pentru areflecta noua situaÆie.Codul de identificare (ItemID). Reprezintå un cod numeric unic asociat articoluluicare nu se modificå pe toatå perioada existenÆei articolului în listå (nu se modificå laschimbarea poziÆiei articolului în listå). De obicei, acest cod este indexul iniÆial alarticolului (atribuit articolului la adåugarea lui la listå). Numele proprietåÆilor carefolosesc acest cod pentru identificarea unui articol în listå conÆin cuvântul cheie ID.

Pentru conversia celor douå coduri numerice se pot folosi metodele:ItemIDToIndex - furnizeazå codul asociat al unui articol specificat prin index.IndexToItemID - furnizeazå indexul unui articol specificat prin codul asociat.

De exemplu, dacå într-o listå identificatå prin numele Lista articolul din poziÆia 5 are codul20, apelarea metodei Lista.IndexToItemID(5) va furniza numårul 20, iar apelarea metodeiLista.IndexToItemID(20) va furniza numårul 5.

Page 310: SGBD Visual Foxpro

Informatică310

Selectarea articolelor din listå

A selecta un articol din listå, înseamnå a atribui proprietåÆii Value a obiectului de tip liståvaloarea articolului selctat. Dacå lista este de tip multicoloanå, proprietåÆii Value a listei ise va atribui numai una dintre valoarile afiçate în coloanele articolului.

Selectarea unui articol din listå se poate face fie cu mouse-ul (se executå clic pe articol),fie de la tastaturå (se deplaseazå selectorul pe articol cu tastele ↓↓ çi ↑↑ çi se confirmåalegerea apåsând tasta Enter). Dacå lista este ascunså, în prealabil ea trebuie deschisåfie cu mouse-ul (se executå clic pe butonul cu sågeatå din partea dreaptå), fie de latastaturå (se apaså tastele Alt+↓↓).

Mecanismul implementat pentru listele Visual FoxPro permite selectarea unui grup dearticole din listå. Aceastå metodå de selectare multiplå este utilå atunci când doriÆi såexecutaÆi operaÆii cu un grup de articole din listå: så copiaÆi, så mutaÆi sau så çtergeÆi ungrup de articole dintr-o listå în alta (de exemplu så copiaÆi, så mutaÆi sau så çtergeÆi ungrup de fiçiere), så efectuaÆi calcule cu un grup de articole etc. Pentru a avea evidenÆaarticolelor selectate, lista are asociat un vector cu valori logice de aceeaçi lungime ca çivectorul listå. Fiecare element al vectorului descrie starea unui articol din listå: dacå arevaloarea adevårat, articolul este selectat, iar dacå are valoarea fals, nu este selectat.

Selectarea unui grup de articole din listå se face prin selectarea fiecårui articol fie cumouse-ul (se executå clic pe articol cu tasta Shift sau Ctrl apåsatå), fie cu tastatura (sedeplaseazå selectorul pe articol cu tastele ↓↓ çi ↑↑ çi se confirmå alegerea apåsând tastaShift sau Ctrl împreunå cu tasta Space). Tasta Shift se foloseçte atunci când grupul dearticole selectat formeazå un bloc continuu în listå, iar tasta Ctrl atunci când articolelesunt dispersate în listå. Pentru anularea selectårii unui articol din grup se procedeazå lafel ca çi la selectarea lui.

Dacå lista permite selectarea unui grup de articole, proprietåÆii Value a listei i se vaatribui valoarea ultimului articol selectat (chiar dacå între timp i s-a anulat selectarea, dardupå el nu a mai fost selectat un alt articol din listå).

Lista poate så permitå sau nu selectarea unui grup de articole. De exemplu, dacå listaconÆine fiçiere care pot fi deschise, se va putea selecta un singur fiçier, iar dacå lista conÆi-ne documente care pot fi copiate sau mutate, se vor putea selecta mai multe documente.

ProprietåÆile specifice listei sunt:ProprietåÆile folosite pentru a controla culoarea de afiçare a articolelor çi a listei:

Lista nu este disponibilå: DisabledBackColor - pentru fundal çiDisabledForeColor - pentru text.Chenarul listei: BorderColor - pentru fundal çi DisabledItemForeColor - pentrutext.Articolele din listå (care nu au fost selectate): ItemBackColor - pentru fundal çiItemForeColor - pentru text.Articolele selectate din listå: SelectedItemBackColor - pentru fundal çiSelectedItemForeColor - pentru text.Articolele din listå care nu sunt disponibile: DisabledItemBackColor - pentrufundal çi DisabledItemForeColor - pentru text.

Page 311: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 311

Sursa de date a listei:Tipul sursei de date: RowSourceType - este de tip numeric çi specificå un cod princare poate fi identificat tipul sursei de date.Sursa de date: RowSource - este de tip çir de caractere çi furnizezå sursa de date.

RowSourceType Articolele listei sunt furnizate: RowSource0 - None În timpul execuÆiei listei folosind meto-

dele AddItem sau AddListItem.Nu este precizatå.

1 - Value Prin enumerare într-o listå de valori. Lista de valori. Valorile sunt separateîn listå prin virgulå.

2 - Alias Prin preluare din câmpurile unui tabel. Numele tabelului din baza de datesau a tabelului liber (.dbf).

3 - SQL Statement De o instrucÆiune SQL Select de inte-rogare a bazei de date, care va ge-nera un tabel permanent sau tempo-rar ce va conÆine articolele listei.

InstrucÆiunea SQL

4 - Query De o interogare. Numele fiçierului de interogåri (.qpr)5 - Array De un tablou de memorie (vector

pentru lista cu o singurå coloanå saumatrice pentru lista cu multe coloane).

Numele tabloului de memorie.

6 -Fields De câmpurile unui tabel, enumerateîntr-o listå.

Lista de nume de câmpuri ( separa-teîn listå prin virgulå). Numele câmpuluitrebuie precedat de numele tabelului:<nume_tabel>.<nume_câmp>

7 - Files un grup de fiçiere dintr-un director. Çablonul care descrie grupul defiçiere.

8 - Structure numele câmpurilor unui tabel. Numele tabelului.Variabila de memorie sau câmpul în care se memoreazå valoarea elementuluiselectat ControlSource . Dacå este de tip numeric, se va memora poziÆia curentå înlistå a articolului selectat, iar dacå este de tip çir de caractere, se va memora textulasociat articolului selectat.Data memoratå în prorprietatea Value BoundTo . Este de tip logic: dacå arevaloarea .T., în proprietatea Value se va memora textul asociat articolului selectat, iardacå are valoarea .F., în proprietatea Value se va memora conÆinutul variabilei saucâmpului specificat de proprietatea ControlSource.Tabloul de memorie care conÆine articolele listei este caracterizat de proprietåÆile:

Numårul de articole din listå: ListCount - este de tip numeric.Tabloul de memorie (de tip vector sau matrice, în funcÆie de numårul de coloane alelistei) se påstreazå în proprietåÆile: List - articolele se påstreazå în ordinea poziÆieilor curente (ordinea în care sunt afiçate în listå) çi ListItem - articolele se påstreazåîn ordinea datå de codurile de identificare. Ambele proprietåÆi sunt de tip tablou dememorie. De exemplu, în lista cu numele Lista, Lista.List(5) identificå al cincilea arti-col din listå, iar Lista.ListItem(5) identificå articolul din listå care are codul de identi-ficare 5. Dacå lista conÆine mai multe coloane, trebuie precizat çi numårul coloanei.De exemplu, dacå lista Lista are 4 coloane, Lista.List(5,2) identificå a doua coloanådin cel de al cincilea articol din listå. Proprietatea ListCount poate fi folositå pentru aparcurge elementele tabloului de la primul element pânå la ultimul (ListCount).

Page 312: SGBD Visual Foxpro

Informatică312

Identificatorul articolului selectat este furnizat de proprietåÆile: ListIndex - carese foloseçte împreunå cu proprietatea List (dacå are valoarea 0, nu este selectat unarticol, iar dacå are o valoare cuprinså între 1 çi ListCount reprezintå poziÆia curentåa articolului selectat) çi ListItemID - care se foloseçte împreunå cu proprietateaListItem (dacå are valoarea -1, nu este selectat un articol, iar dacå are o valoarepozitivå reprezintå codul de identificare al articolului selectat). Ambele sunt de tipnumeric. De exemplu, pentru a face referire la articolul selectat în lista Lista se poatefolosi Lista.List(Lista.ListIndex), dar çi Lista.ListItem(Lista.ListIItemID).Vectorul cu indecçi asociat listei poate fi folosit de programator pentru a atribuiintern coduri speciale articolelor listei. Fiecare element al vectorului conÆine un codspecial asociat unui articol din listå, diferit de codul de identificare. Dimensiunea vec-torului este egalå cu numårul de elemente, respectiv cu numårul de rânduri ale tablo-ului asociat listei. Vectorul este furnizat de proprietåÆile: ItemData - vector în careidentificarea articolului se face prin poziÆia în listå çi ItemIDData - vector în careidentificarea articolului se face prin codul de identificare. De exemplu, în listaLista seobÆine codul special asociat articolului focalizat cu Lista.ItemData(Lista.ListIndex).Codul special asociat poate fi folosit pentru a identifica un articol din listå: poziÆia înlistå a unui articol cu codul special asociat cu valoarea12345 se poate afla cuLista.ItemIDData(12345).

Ordonarea articolelor în listå este controlatå cu urmåtoarele proprietåÆi:Autosortarea: Sorted - este de tip logic çi controleazå modul în care sunt afiçatearticolele din listå. Dacå are valoarea .T., articolele din listå sunt automat ordonatealfabetic, Æinându-se cont de diferenÆa dintre literele mari çi mici. Dacå are valoarea .F.(implicit), articolele din listå sunt afiçate în ordinea naturalå, ordinea în care au fostadåugate la creare sau în care au fost preluate dintr-o surså de date. Proprietatea estedisponibilå numai pentru valorile 0 çi 1 ale proprietåÆii RowSourceType.Ordonarea manualå: MoveBars - este de tip logic çi controleazå dacå articolele potfi aranjate manual în listå. Dacå are valoarea .T., este afiçatå bara de mutare carepermite executarea interactivå a operaÆiei de mutare a articolelor în listå. Dacå arevaloarea .F. (implicit), bara nu este afiçatå. Pentru a muta un articol în listå se poatefolosi fie tastatura (se selecteazå articolul çi apoi cu tastat Ctrl apåsatå se deplaseazåarticolul în noua poziÆie cu tastele ↓↓ çi ↑↑), fie mouse-ul (pe bara de mutare se gliseazåbutonul din dreptul articolului pe care vreÆi så-l mutaÆi în noua poziÆie). Proprietatea estespecificå numai controlului ListBox.

Cåutarea asistatå: IncrementalSearch - este de tip logic çi controleazå dacå sepoate folosi metoda de cåutare asistatå pentru gåsirea unui articol în listå. Dacå arevaloarea .T., se foloseçte cåutarea asistatå, iar dacå are valoarea .F., nu este activatåaceastå facilitate. Cåutarea asistatå înseamnå cå atunci când este apåsatå o tastå,sistemul interpreteazå aceastå tastå ca fiind primul caracter al textului afiçat de articolulcåutat çi deruleazå lista astfel încât så fie afiçat în listå primul articol care îndeplineçteaceastå condiÆie. Dacå se mai apaså o tastå, aceasta este interpretatå ca fiind al doileacaracter al textului afiçat de articolul cåutat çi deruleazå lista astfel încât så fie afiçat în liståprimul articol care afiçeazå un text care începe cu cele douå caractere ç.a.m.d. Este util såactivaÆi aceastå facilitate dacå lista are dimensiuni mari.Primul articol vizibil din listå: TopIndex - furnizeazå poziÆia curentå a primuluiarticol afiçat în partea vizibilå a listei çi TopItemID - furnizeazå codul de identificare a

Page 313: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 313

primului articol afiçat în partea vizibilå a listei. Aceste proprietåÆi se pot folosi pentru a afladacå un articol se gåseçte în zona vizibilå a listei sau pentru a schimba articolele afiçate înpartea vizibilå a listei.Ultimul articol adåugat la listå: NewIndex - furnizeazå poziÆia curentå a ultimuluiarticol adåugat la listå çi NewItemID - furnizeazå codul de identificare a ultimului articoladåugat la listå.ProprietåÆi specifice listelor care au ca surså de date tablouri de memorie prin carese controleazå intervalul de elemente din tablou care sunt preluate în listå (valabil nu-mai pentru RowSourceType=5). ProprietåÆile sunt de tip numeric çi determinå interva-lul de elemente, respectiv de rânduri care vor fi folosite ca surså de date, altfel vor fifolosite toate elementele, respectiv toate rândurile din tabloul.

Primul element: FirstElement - primul element, respectiv primul rând al intervalului.Implicit are valoarea 1 (primul element, respectiv primul rând al tabloului).Numårul de elemente: NumberOfElements - numårul de elemente, respectiv derânduri preluate din sursa de date începând cu primul element al intervalului. Implicitare valoarea corespunzåtoare numårului de elemente, respectiv de rânduri ale tablo-ului.

ProprietåÆi specifice selectårii multiple:Selectarea multiplå: MultipleSelect - este de tip numeric çi controleazå dacåeste permiså (valoarea 1) sau nu (valoarea 0 - implicit) selectarea mai multor arti-cole în listå.EvidenÆa articolelor selectate este furnizatå de proprietåÆile Selected çiSelectedID . Ambele proprietåÆi sunt de tip vector cu elemente de tip logic çi conÆinatâtea elemente câte articole sunt în listå. Fiecare element din vector reprezintå stareaunui articol: dacå are valoarea .T., articolul este selectat, iar dacå are valoarea .F., arti-colul nu este selectat. Cei doi vectori se deosebesc dupå modul în care se face identifi-carea articolelor: dupå poziÆia curentå, respectiv dupå codul de identificare. Deexemplu, dacå vreÆi så aflaÆi dacå în lista Lista a fost selectat al treilea articol din listå,aflaÆi valoarea proprietåÆii Lista.Selected(3), iar dacå vreÆi så aflaÆi dacå articolul cucodul de identificare 10 a fost selectat, aflaÆi valoarea proprietåÆii Lista.SelectedID(10).Aceste proprietåÆi pot fi folosite pentru a selecta un articol sau pentru a anulaselectarea unui articol din program. De exemplu, dacå vreÆi så selectaÆi al treilea articolîn lista Lista, atribuiÆi valoarea corespunzåtoare proprietåÆii: Lista.Selected(3)=.T., iardacå vreÆi så anulaÆi selectarea pentru articolul cu codul de identificare 10, atribuiÆivaloarea corespunzåtoare proprietåÆii: Lista.SelectedID(10)=.F..

ProprietåÆi specifice listelor cu mai multe coloane:Numårul de coloane: ColumnCount - este de tip numeric; dacå are valoarea 0,nu se afiçeazå coloane.LåÆimea coloanelor: ColumnWidth - este de o listå de numere, separate prinvirgulå; fiecare numår reprezintå låÆimea unei coloane. De exemplu, în lista ListaLista.ColumnCount=3 çi Lista.ColumnWidth='5,7,9'Afiçarea liniilor separatoare între coloane: ColumnLines - este de tip logic(dacå are valoarea .T. - implicit - între coloane vor fi afiçate linii separatoare, altfelliniile de separare sunt invizibile).

Page 314: SGBD Visual Foxpro

Informatică314

Coloana preluatå de proprietatea Value a controlului: BoundColumn - este detip numeric çi reprezintå numårul coloanei al cårui text va fi preluat de proprietateaValue. Implicit se preia textul din prima coloanå.Textul din prima coloanå este preluat de proprietatea DisplayValue - este detip çir de caratere. Proprietatea este utilå atunci când în proprietatea Value estepreluat textul articolului dintr-o altå coloanå.

Metodele specifice listei sunt:Adåugarea unui articol la listå: AddItem çi AddItemList . Metodelor trebuie så li secomunice textul afiçat de articol (<text>), poziÆia în care va fi adåugat (<n>) pentruAddItem, respectiv codul de identificare atribuit pentru AddItemList çi numårul coloanei(<n>) în cazul unor liste cu coloane: AddItem('<text>'[,<n>[,<c>]])). Dacå poziÆia precizatåeste validå, articolul va fi inserat în poziÆia precizatå. Dacå nu este precizatå poziÆia,articolul va fi inserat în poziÆia corespunzåtoare dacå lista este sortatå, iar dacå nu estesortatå, va fi adåugat la sfârçitul listei. Dacå lista are mai multe coloane çi nu seprecizeazå coloana, se va considera coloana 1. Aceste metode se pot folosi numai pentrulistele a cåror surså de date nu este precizatå (RowSourceType=0).Înlåturarea unui articol din listå: RemoveItem çi RemoveItemList . Metodelortrebuie så li se comunice indexul articolului înlåturat , respectiv codul de identificare alarticolului. De exemplu, apelul metodei RemoveItem(5) înlåturå din listå articolul dinpoziÆia a cincea.Çtergerea conÆinutului unei liste: Clear .Reîmprospåtarea listei: Requery . Acestå metodå trebuie så fie apelatå dupå oricemodificare a sursei de date. Prin aceastå metodå este recititå sursa de date a listei.Metoda este similarå metodei Refresh.

CreaÆi o listå ascunså folosind valorile ca surså de date

În exemplul de formular creat la lecÆia despre butoane radio, veÆi înlocui controlul folositpentru alegerea formei afiçate cu o listå ascunså (obiectul ComboBox cu stilul 2). Sursa dedate (numele celor trei forme) va fi precizatå printr-o listå de valori.

Deoarece formularul pe care trebuie så-l realizaÆi este foarteasemånåtor cu cel prezentat la acea lecÆie, îl veÆi salva pe acelasub un alt nume, veÆi çterge obiectul grup de butoane radio çi înlocul lui veÆi crea un control de tip listå folosind instrumentulComboBox de pe bara Form Controls.StabiliÆi proprietåÆile listei:Name = "Combo1"RowSourceType = 1RowSource = "Cerc ,Elipsa ,Patrat "Style = 2

ScrieÆi procedurile asociate elementului Init al formularului çi evenimentului Click allistei (påstraÆi procedura asociatå evenimentului Click al butonului de comandå):

Page 315: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 315

procedure Init && Formular ThisForm.Combo1.ListIndex = 1 ThisForm.Shape1.Visible=.T. ThisForm.Shape2.Visible=.F. ThisForm.Shape3.Visible=.F.endprocprocedure Click && ListaThisForm.Shape1.Visible = .F.ThisForm.Shape2.Visible = .F.ThisForm.Shape3.Visible = .F.do casecase ThisForm.Combo1.Value = ThisForm.Combo1.List(1)

ThisForm.Shape1.Visible = .T.case ThisForm.Combo1.Value = ThisForm.Combo1.List(2)

ThisForm.Shape2.Visible = .T.case ThisForm.Combo1.Value = ThisForm.Combo1.List(3)

ThisForm.Shape3.Visible = .T.endcaseThisForm.CurrentX=20ThisForm.CurrentY=155ThisForm.Print(ThisForm.Combo1.List(ThisForm.Combo1.ListIndex))

endprocSalvaÆi formularul, îl lansaÆi în execuÆie çi-l testaÆi.

CreaÆi o listå ascunså folosind ca surså de date tabloul de memorie

În exemplul de formular creat la lecÆia despre comutator, veÆi înlocui controlul comutatorfolosit pentru a controla afiçarea påtratului cu o listå ascunså din care veÆi alege culoareade umplere a påtratului (obiectul ComboBox cu stilul 2). Lista va conÆine 8 culori çi sursade date (numele celor 8 culori) va fi precizatå printr-un vector.

SalvaÆi formularul realizat anterior sub un alt nume, çtergeÆi obiectul comutator çi înlocul lui creaÆi un control de tip listå folosind instrumentul ComboBox de pe baraForm Controls. VeÆi mai adåuga çi un control de tip etichetå pentru legenda listei.StabiliÆi proprietåÆile listei çi ale etichetei:

Name = "Label1"AutoSize = .T.BackStyle = 0Caption = "Culoarea"Name = "Combo1"RowSourceType = 5RowSource = "a"

ControlSource = ""Height = 25Left = 24NumberOfElements = 8Style = 2Top = 48Width = 121

ScrieÆi procedurile asociate evenimentelor Load çi Init ale formularului în caredeclaraÆi çi creaÆi vectorul a:

procedure Load && Formularpublic adimension a(8)endprocprocedure Init && Formulara(1)='Negru'a(2)='Rosu'

Page 316: SGBD Visual Foxpro

Informatică316

a(3)='Verde'a(4)='Galben'a(5)='Albastru'a(6)='Magenta'a(7)='Cian'a(8)='Alb'ThisForm.Combo1.ListIndex = 8ThisForm.Shape1.BackColor=rgb(255,255,255)ThisForm.Shape1.Visible=.T.endproc

Formularului îi vom adåuga o metodå pentru calculul codului deculoare corespunzåtor culorii din listå. Metoda se numeçteCuloarea çi foloseçte o matrice b cu 8 linii çi 3 coloane pentru acalcula ponderea celor trei culori de bazå: coloana 1 - pondereapentru roçu, coloana 2 - ponderea pentru verde çi coloana 3 -ponderea pentru albastru care corespund parametrilor funcÆiei Rgb(). De exemplu,culoarea galben este determinatå de valorile din cea de a patra linie a matricei çi,deoarece codul ei este dat de funcÆia Rgb(255,255,0), conform tabelului prezentatanterior, elementele de pe linia a patra vor avea valoarea: b(4,1)=1, b(4,2)=1 çib(4,3)=0. Pentru constru-irea acestei metode folosiÆi opÆiunea de meniu NewMethod...∈∈Form. În caseta de dialog scrieÆi numele metodei Culoarea. Numelemetodei va fi adåugat la lista de metode a formularului. AlegeÆi din lista afiçatå însecÆiunea Method a ferestrei de proprietåÆi a formularului opÆiunea Culoarea. Se vadeschide fereastra pentru cod. ScrieÆi procedura asociatå metodei:

procedure culoarea && Formular parameters n dimension b(8,3) store 0 to b for i=1 to 8 k=i-1 j=0

do while k <>0 j=j+1

b(i,j)=k%2 k=int(k/2)

enddo endforcod=rgb(b(n,1)*255,b(n,2)*255,;

b(n,3)*255)return cod

endproc

ScrieÆi procedura asociatå evenimentului Click al listei:procedure Click && ListaThisForm.Shape1.BackColor =;

ThisForm.Culoarea(ThisForm.Combo1.ListIndex)endprocCreaÆi o listå cu mai multe coloane

Lista va avea douå coloane corespunzåtoare câmpurilor nume çi prenume din tabelulagenda. La alegerea unui articol din listå, în formular se va afiça numårul de telefon (sealege ca obiect eticheta) çi a-dresa persoanei (se alege ca obiect zona de editare). CreaÆiun fiçier index (dupå câmpurile nume çi prenume pentru tabelul agenda.

CreaÆi un formular nou. AdåugaÆi în formular patru etichete, o zonå de edita-re, unbuton declançator çi o listå (butonul ListBox de pe bara Form Controls).StabiliÆi proprietåÆile formularului çi ale obiectelor din formular:

Page 317: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 317

* formularulName = "Form1"BackColor = 200,200,200Caption = "Test"Closable = .F.FontSize = 14* eticheta folosita pentru* legenda listeiName = "Label1"Caption = "Alegeti:"* etichete folosite pentru* informareName = "Label2"Caption = "Telefon"Name = "Label4"Caption = "Adresa"* eticheta folosita pentru afi-* sarea numarului de telefonName = "Label3"Caption = ""* pentru toate etichetele:AutoSize = .T.

BackStyle = 0* zona de editareName = "Edit1"BackStyle = 0Enabled = .T.ReadOnly = .T.* buton de comandaName = "Command1"Cancel = .T.Caption = "\<Terminare"* ListaName = "List1"BoundColumn = 2ColumnCount = 2ColumnWidths = "70,70"RowSourceType = 2RowSource = "agenda"ColumnLines = .F.Height = 97Left = 24Top = 60Width = 170

ScrieÆi procedurile asociate evenimentelor Load, Init çi Unload ale formularului în caredeschideÆi çi închideÆi tabelul, evnimentului Click al butonului de comandå çiprocedura Click a listei:

procedure Load && Formularuse agenda index agenda

endprocprocedure Init && Formular goto topThisForm.List1.ListIndex = 1locate for agenda.nume=ThisForm.List1.DisplayValue and;

agenda.prenume=ThisForm.List1.ValueThisForm.Label3.Caption=agenda.telefonThisForm.Edit1.Value=agenda.adresa

endproc

Page 318: SGBD Visual Foxpro

Informatică318

procedure Unload && Formularuse

endprocprocedure Click && Buton ThisForm.Releaseendprocprocedure Click &&Listagoto toplocate for agenda.nume=ThisForm.List1.DisplayValue and;

agenda.prenume=ThisForm.List1.ValueThisForm.Label3.Caption=agenda.telefonThisForm.Edit1.Value=agenda.adresa

endprocSalvaÆi formularul, îl lansaÆi în execuÆie çi-l testaÆi.

CreaÆi o listå dinamicå cu selecÆie multiplå

CreaÆi un formular care con-Æine douå liste. Într-o listå vorfi afiçate fiçierele de tip pro-gram din directorul curent(*.prg). Din aceastå listå veÆiselecta un grup de fiçierecare vor fi adåugate la ceade a doua listå. Cea de adoua listå este o listå dinami-cå (se creeazå dinamic întimpul execuÆiei formularu-lui). Pentru lucrul cu celedouå liste vor fi folosite douåbutoane: unul pentru adåugare la cea de a doua listå a fiçierelor selectate în prima listå çiunul pentru anularea selectårii unor fiçiere din a doua listå. Ambele liste permit selecÆiemultiplå. Dupå ce aÆi selectat grupul de fiçiere, acÆionaÆi cel de al treilea buton, butonul determinare care va declança operaÆia de copiere a fiçierelor în directorul Test din rådåcinadiscului C.

CreaÆi directorul Test.CreaÆi un formular nou. AdåugaÆi în formular douå liste, douå etichete (pentrulegenda celor douå liste) çi trei butoane de comandå. Prima listå va avea ca sursåde date fiçierele de tip *.prg. A doua listå nu va avea surså de date.StabiliÆi prorpietåÆile pentru formular çi obiectele din formular:

* FormularulName = "Form1"Caption = "Test"Closable = .F.FontSize = 14WindowType = 1BackColor* Etichetele

Name = "Label1"Caption = "Fisiere pentru ; selectare"Name = "Label2"Caption = "Fisiere selectate"* Toate tichetele:AutoSize = .T.BackStyle = 0

Page 319: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 319

* ListeleName = "List1"BoundColumn = 1RowSourceType = 7RowSource = "*.prg"MultiSelect = .T.Name = "List2"BoundColumn = 1RowSourceType = 0RowSource = ""

MultiSelect = .T.* ButoaneleName = "Command1"Cancel = .T.Caption = "\<Terminare"Name = "Command2"Caption = "\<Selecteaza>>>"Name = "Command3"Caption="<<<\<Anuleaza selectare"

ScrieÆi procedurile asociate evenimentelor Click ale celor trei butoane:

procedure Click && Buton1 for i=1 to ThisForm.List2.Listcount

numef=ThisForm.List2.List(i) copy file &numef to c:\test endforThisForm.Release

endprocprocedure Click && Buton2 for i=1 to ThisForm.List1.Listcount if ThisForm.List1.Selected(i)

ThisForm.List2.AddItem(ThisForm.List1.List(i)) endif endforThisForm.List1.RequeryThisForm.List2.Requery

endprocprocedure Click && Buton3 for i=1 to ThisForm.List2.Listcount if ThisForm.List2.Selected(i)

ThisForm.List2.RemoveItem(i) endif endforThisForm.List1.RequeryThisForm.List2.Requery

endprocSalvaÆi formularul, îl lansaÆi în execuÆie çi-l testaÆi.

TT est pentru evaluare:

1. CreaÆi un tabel cu evidenÆa elevilor din claså. Tabelul are structura: nume (C,15) çiprenume (C,15). CompletaÆi cu date tabelul. ModificaÆi structura tabelului çi adåugaÆicâmpul echipa (C,10) care reprezintå echipa din care face parte elevul, presupunândcå el face parte dintr-o singurå echipå: baschet, handbal, volei sau nici o echipå.ConstruiÆi un formular prin care så actualizaÆi tabelul. Formularul va conÆine o listå cudouå coloane (nume çi prenume) din care alegeÆi elevul, un grup de butoane radiopentru a alege echipa çi un buton de comandå pentru terminare.

Page 320: SGBD Visual Foxpro

Informatică320

2. CreaÆi un tabel pentru reÆeta unui preparat gastronomic cu urmåtoarea structurå:ingredient, unitate de måsurå, cantitate. CreaÆi un tabel cu un singur câmp în carememoraÆi ingredintele care pot fi folosite pentru prepararea lui. CreaÆi un formularpentru introducerea datelor în tabel, care va conÆine o listå pentru selectarea ingre-dientelor, un grup de butoane radio pentru alegerea unitåÆii de måsurå, o casetå detext pentru comunicarea cantitåÆii çi un buton pentru terminare.

3. Din tabelul cu elevii clasei înscriçi la diferite echipe, creaÆi un formular prin care såextrageÆi numai elevii care fac parte din echipa de baschet. Formularul va conÆine olistå cu douå coloane cu elevii din claså çi va permite crearea unei liste dinamice cuelevii din echipa de baschet, prin selectarea lor dinlista surså.

ÎncercaÆi:Adevårat/Fals:1. Cu metoda SetAll puteÆi selecta toate articolele dintr-o listå.2. Identificarea unui articol selectat în listå se face cu proprietatea ListIndex.3. Proprietatea Value a unui comutator memoreazå starea comutatorului.4. Proprietatea Value a unui comutator poate fi de tip numeric.5. Grupul de butoane radio are proprietatea AutoSize.

CompletaÆi:1. Pentru a atribui aceeaçi valoare unei proprietåÆi pentru toate butoanele dintr-un grup

de butoane radio folosiÆi metoda ...............2. CreaÆi o listå ascunså cu controlul ............... cu valorea .... a proprietåÆii Style.3. Reîmprospåtarea listei se face cu metoda ........................4. IncrementalSearch este o proprietate specificå unui control de tip ..............5. Numårul de articole din listå se påstreazå în proprietatea ....................

AlegeÆi råspunsurile corecte:1. Tabloul de memorie în care se påstreazå articolele listei în ordinea poziÆiei lor curente

se memoreazå în proprietatea:a) List b) ListItem c) ListIndex

2. FirstElement este o proprietate a listei care foloseçte ca surså de date:a) lista cu nume de câmpuri b) tabloul de memorie c) lista de valori

3. Articolele selectate dintr-o listå cu selecÆie multiplå se påstreazå într-un vector înproprietatea:a) MultipleSelect b) Selected c) ListItemID

RR åspunsuri:Adevårat/Fals: 1-F; 2-A; 3-A; 4-A; 5-A.CompletaÆi: 1-SetAll; 2-ComboBox,1; 3-Requery; 4-listå; 5- ListCount; 6- Column; 7-Header; 8-Bound.AlegeÆi råspunsurile corecte: 1-a; 2-b; 3- b.

Page 321: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 321

3.4.5. Alte controale çi obiecte

Bara cu instrumente ToolBarxBara cu instrumente este un obiect de interfaÆå care pune la dispoziÆia utilizatorului un cadrucare conÆine un grup de butoane cu ajutorul cårora poate så cearå executarea unor acÆiuni.Se recomandå ca în acest obiect så fie grupate controale care så permitå un acces mai rapidla comenzile cele mai des folosite din meniurile aplicaÆiei (de exemplu deschiderea, salvareaçi închiderea unui tabel). Bara cu instrumente are avantajul cå pune la dispoziÆia utilizatoruluireprezentåri grafice ale comenzilor care sunt mai uçor de memorat decât combinaÆiile detaste folosite pentru scurtåturi. Butoanele de pe bara cu instrumente pot avea proprietateainformaÆii despre instrument (ToolTips) care afiçeazå o micå etichetå cu numele butonuluiatunci când utilizatorul îl indicå cu cursorul de mouse.

Bara de instrumente este construitå ca un formular container ce conÆine mai multe con-troale care are urmåtoarele caracteristici specifice:

Este afiçatå întotdeauna deasupra formularelor de tip fereastrå.Dacå este mutatå, poate fi ancoratå (dock) la marginile ferestrei de aplicaÆie.Când nu este ancoratå, afiçeazå o barå de titlu (cu înålÆimea jumåtate din înålÆimeaobiçnuitå a unei bare de titlu) çi butonul de închidere.Când se modificå dimensiunea cadrului, controalele din interior sunt rearanjate astfelîncât så încapå în cadru.Poate fi mutatå oriunde în freastrå sau pe ecran prin operaÆia de glisare cu mouse-ul.Pentru controalele din interiorul ei nu se pot folosi taste de acces.Unele controale nu primesc focalizarea atunci când sunt selectate.

Când bara de instrumente este ancoratå, aspectul ei se modificå astfel:Bara de titlu çi butonul de închidere sunt ascunse.Chenarul este trasat cu o singurå linie.Este redimensionatå astfel încât så afiçeze un singur rând de butoane.Fereastra în care este creatå bara este redimensionatå astfel încât bara så nu ascundåinformaÆii din fereastrå.

Pe lângå proprietåÆile specifice unui formular (Caption, Movable, Sizable etc.) sau spe-cifice unui obiect container (Controls - vectorul cu referinÆele controalelor çiControlCount - numårul de controale), obiectul ToolBox are urmåtoarele proprietåÆispecifice:

Ancorarea: Docked este de tip logic: dacå arevaloarea .T., bara este ancoratå, iar dacå are valoarea.F., bara este mobilå.PoziÆia ancorårii: DockPosition este de tip numericçi aratå poziÆia ancorårii (marginea ferestrei de care afost ancoratå).ActiveControl: ActiveControl este o referinÆå cåtrecontrolul activ al unui obiect. Pentru a avea acces la proprietåÆile sale se foloseçte con-strucÆia: <nume_obiect>.ActiveControl.<proprietate>=<valoare>.Redimensionarea cadrului: Sizable - este de tip logic: dacå are valoarea .T. (implicit),cadrul barei poate fi redimensionat. Dacå poate fi redimensionat, se poate folosi proprie-

Valoare Efect DockPosition-1 Nu este ancoratå0 (Top) Marginea de sus.1 (Left) Marginea din stânga.2 (Right) Marginea din dreapta.3 (Bottom) Marginea de jos.

Page 322: SGBD Visual Foxpro

Informatică322

tatatea logicå AutoSize pentru a determina dacå se redimensioneazå automat cadrulcontainerului atunci când se adaugå obiecte noi.

Pe lângå metodele specifice unui formular (Refresh, Show, Move, Hide etc.), obiectulToolBox are urmåtoarele metode specifice :

Ancorarea barei: Dock ancoreazå bara la una dintre marginile ferestrei. Apelul metodeise face prin Dock([<poziÆie>[,<x>,<y>]]), unde parametrul reprezintå marginea ferestrei decare va fi ancoratå çi poate lua aceleaçi valori ca çi proprietatea DockPosition, iar <x> çi<y> reprezintå coordonatele poziÆiei barei ancorate.Transformarea barei fixe în barå mobilå cu metoda Move . Dacå apelaÆi aceaståmetodå atunci când bara este ancoratå, ea va deveni mobilå.

Pe lângå evenimentele specifice unui formular, obiectul ToolBox råspunde la urmåtoa-rele evenimente specifice :

Dupå ancorarea barei: AfterDock este declançat dupå ce a fost ancoratå bara.Înainte de ancorarea barei: BeforeDock este declançat fie interactiv, prin glisareabarei de cåtre utilizator pentru a fi ancoratå, fie din program prin apelarea metodei Dock.Procedura asociatå acestui eveniment primeçte parametrul nLocation care reprezintåpoziÆia în care va fi ancoratå bara (aceleaçi valori ca çi proprietatea DockPosition).Înainte ca bara så fie redesenatå în poziÆia de ancorare, în procedura asociatå acestuieveniment se pot scrie instrucÆiuni prin care så fie modificat aspectul barei (de exemplu,så se înlocuiascå un control cu un alt control).Anularea ancorårii barei: Undock este declançat fie interactiv, prin glisarea bareide cåtre utilizator din poziÆia în care a fost ancoratå, fie din program prin apelareametodei Move.

CreaÆi o barå de instrumente pe ecran

Bara cu instrumente va conÆine trei controalepentru stabilirea stilului în care va fi scristextul pe ecran: îngroçat (butonul Italic),înclinat çi subliniat (butonul Underline).Aceste butoane au efect de comutator. Exe-cutând clic pe ele, proprietatea care cores-punde stilului este negatå (este o proprietatelogicå). De exemplu, dacå se executå clic pebutonul Bold se va executa instrucÆiuneascreen.fontbold=!_screen.fontbol,adicå proprietåÆii FontBold a ecranului ise va atribui valoarea inverså (este folositopera-torul pentru negare !).

ScrieÆi în fiçierul test_bara1 programulsurså:

public ecranecran=createobj('bara')

Butoanele din barå au efect de comutator.Atunci când sunt activate, determinå scrierea

pe ecran cu caractere cu stilul respectiv.Atunci când un buton este activat, textul

legendei sale este scris cu acel stil.

Toatecomutatoarelesunt activate

Toatecomutatoarele

sunt dezactivate

Page 323: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 323

ecran.showdefine class bara as toolbaradd object b1 as commandbuttonadd object s1 as separatoradd object b2 as commandbuttonadd object s2 as separatoradd object b3 as commandbutton

b1.height = 20 b1.width = 50 b1.caption = "Bold" b2.height = 20 b2.width = 50 b2.caption = "Italic" b2.fontbold = .f. b2.fontitalic = .t. b3.height = 20 b3.width = 50 b3.caption = "subliniat" b3.fontbold = .f. b3.fontunderline = .t.left=1top=1width=25caption="afisare ecran"procedure activateThis.b1.FontBold=_screen.FontBoldThis.b2.FontItalic=_screen.FontItalicThis.b3.FontUnderline=_screen.FontUnderline

endprocprocedure b1.click

_ screen.FontBold =!_screen.FontBoldThis.FontBold =_screen.FontBold

endprocprocedure b2.click

_ screen.FontItalic=!_screen.FontItalicThis.FontItalic=_screen.FontItalic

endprocprocedure b3.click

_ screen.FontUnderline=!_screen.FontUnderlineThis.FontUnderline=_screen.FontUnderline

endprocenddefine

LansaÆi în execuÆie programul cu comanda do test_bara1.TestaÆi bara de instrumente. ActivaÆi unul dintre stiluri sau mai multe stiluri. AfiçaÆi peecran un text de fiecare datå (de exemplu, comanda ? 'AAAA'). UrmåriÆi efectul obÆinut.DeplasaÆi bara cu instrumente în interiorul ferestrei Visual FoxPro. AncoraÆi bara îndiferite poziÆii.ÎnchideÆi bara executând clic pe butonul de închidere.

Page 324: SGBD Visual Foxpro

Informatică324

CreaÆi o barå de instrumente care acÆioneazå asupra unui formular

Bara cu instrumente va conÆine aceleaçi trei controale pentru stabilirea stilului în care va fiscris textul pe ecran: îngroçat (butonul Bold), înclinat (butonul Italic) çi subliniat (butonulUnderline). Aceste butoane au efect de comutator. Se va crea un set de formulare care vacuprinde un formular pentru fereastrå çi o barå cu instrumente. Butonul Test al formularuluiva testa stilul ales prin scrierea unui text în formular. Atât butoanele din bara cuinstrumente, cât çi butoanele din formular vor afiça informaÆii despre instrument(ToolTips).

ScrieÆi în fiçierul test_bara2 programul surså:set=createobj('formset')set.addobject("bara1","bara")set.addobject("f1","form")set.f1.addobject("bt1","buton1")set.f1.addobject("bt2","buton2")set.f1.top=8set.f1.left=44set.f1.height=250set.f1.width=400set.f1.backcolor=rgb(190,190,190)set.f1.borderstyle=1set.f1.caption="test"set.f1.showtips=.T.set.f1.closable=.F.set.f1.bt1.visible=.t.set.f1.bt2.visible=.t.set.f1.showset.bara1.showread eventsdefine class buton1 as commandbuttontop = 200left = 50height = 25width = 100caption = "T\<est"ToolTipText = "Test scriere"procedure clickThisForm.print('test ')

endprocenddefinedefine class buton2 as commandbuttontop = 200left = 250height = 25width = 100

ToolTipText = "Termina aplicatia"caption = "\<Terminare"procedure clickThisFormSet.Releaseclear events

endproc

Page 325: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 325

enddefinedefine class bara as toolbaradd object b1 as commandbuttonadd object s1 as separatoradd object b2 as commandbuttonadd object s2 as separatoradd object b3 as commandbutton

left = 1top = 1width = 25

showtips = .T.caption = "Afisare ecran"

b1.height = 20 b1.width = 50b1.ToolTipText="Ingrosat"

b1.caption = "Bold" b2.height = 20 b2.width = 50 b2.ToolTipText="Aplecat" b2.caption = "Italic" b2.fontbold = .f. b3.height = 20 b3.width = 50 b3.ToolTipText="Subliniat" b3.caption = "Underline" b3.fontbold = .f.procedure activate

This.b1.FontBold = ThisFormSet.f1.FontBoldThis.b2.FontItalic = ThisFormSet.f1.FontItalicThis.b3.FontUnderline = ThisFormSet.f1.FontUnderline

endprocprocedure b1.clickThisFormSet.f1.FontBold = !ThisFormSet.f1.FontBoldThis.FontBold =ThisFormSet.f1.FontBold

endprocprocedure b2.clickThisFormSet.f1.FontItalic = !ThisFormSet.f1.FontItalicThis.FontItalic = ThisFormSet.f1.FontItalic

endprocprocedure b3.clickThisFormSet.f1.FontUnderline = !ThisFormSet.f1.FontUnderlineThis.FontUnderline =ThisFormSet.f1.FontUnderline

endprocenddefine

LansaÆi în execuÆie programul cu comanda do test_bara2.TestaÆi bara de instrumente. ActivaÆi unul dintre stiluri sau mai multe stiluri çi exe-cutaÆi clic pe butonul Test din fereastrå. ObservaÆi informaÆiile afiçate pentru fiecareinstrument selectat.ÎnchideÆi setul de formulare executând clic pe butonul Terminare.

Page 326: SGBD Visual Foxpro

Informatică326

ModificaÆi formularul creat anterior

AdåugaÆi fomularului creat anterior un buton care så controleze afiçarea barei cuinstrumente:

SalvaÆi fiçierul cu programul surså test_bara2 sub numele test_bara3. DeschideÆiacest fiçier çi faceÆi urmåtoarele modificåri.AdåugaÆi în program, înainte de definirea claselor, instrucÆiunile:

set.f1.addobject("bt3","buton3")set.f1.bt3.visible=.t.

În secÆiunea Define class buton1 modificaÆi: left=25 width=75

În secÆiunea Define class buton2 înlocuiÆi buton 2 cu çi buton 3 modificaÆi: left=300 width=75

AdåugaÆi secÆiunea de program pentru definirea clasei Buton2:define class Buton2 as CommandButtonTop = 200Left = 150Height = 25Width = 75ToolTipText='Afiseaza/anuleaza bara cu instrumente'Caption = "\<Bara"procedure ClickThisFormSet.Bara1.Visible=!ThisFormSet.Bara1.Visibleendprocenddefine

LansaÆi în execuÆie programul cu comanda do test_bara3.

CreaÆi vizual o barå de instrumente

Se va crea bara de la primul exemplu. Deoarece bara cu obiecte a constructorului deformulare nu are un buton asociat obiectului ToolBar, trebuie fåcut un mic artificiu: seconstruieçte un formular vid care se transformå apoi într-o barå cu instrumente.

DeschideÆi fereastra constructorului de formulare cu comanda create form bara.SalvaÆi çi închideÆi fereastra constructorului.DeschideÆi tabelul asociat formularului cu comanda use bara.scx. AfiçaÆi conÆinutultabelului cu comnada browse.

În rândul 2 al tabelului sunt înregistrate caracteristicile obiectului DataEnvironmentasociat formularului, iar în rândul 3 caracteristicile formularului Form1. În rândul 3 altabelului veÆi face urmåtoarele modificåri în câmpurile memo:

Page 327: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 327

În câmpurile Class çi BaseClass çtergeÆi Form çi scrieÆi ToolBar.În câmpul Objname çtergeÆi Form1 çi scrieÆi Bara.În câmpul Properties çtergeÆi tot conÆinutul.

ÎnchideÆi fereastra de editare çi apoi çi fiçierul cu comanda use.DeschideÆi formularul cu comanda Modify Form bara.În fereastra constructorului de formulare Form Design este afiçat obiectul ToolBar.AdåugaÆi acestui obiect trei comutatoare. Spre deosebire de formular, într-o barå cuinstrumente, poziÆiile obiectelor sunt stabilite automat. Ele vor fi plasate unele lângåaltele. Nu puteÆi stabili decât ordinea în care apar butoanele în barå, nu çi poziÆia exactåa fiecårui buton. Pentru a adåuga un control, procedaÆi astfel: executaÆi clic pe obiectulcorespunzåtor de pe bara cu obiecte de interfaÆå pentrua-l selecta (în exemplu, pe obiectul Command Button) çiapoi în bara pe care o construiÆi executaÆi clic în poziÆia încare vreÆi så fie inserat obiectul. Între butoane inseraÆiseparatori (obiectul Separator de pe bara cu obiecte).StabiliÆi pentru aceste controale valorile pentru restul pro-prietåÆilor. ScrieÆi procedurilecorespunzåtoare evenimentelor. SalvaÆi modificårile fåcute în formular. ÎnchideÆiconstructorul de formulare.DeschideÆi din nou tabelul asociat formularului. ObservaÆi modificårile care au fostfåcute. ÎnchideÆi fereastra de editare çi tabelul.LansaÆi în execuÆie formularul cu comanda do form bara.ReluaÆi toate aceste operaÆii çi creaÆi vizual formularul çi o barå de instrumente ca celedin cel de al doilea exemplu.ReluaÆi toate aceste operaÆii çi creaÆi vizual formu-larul çi o barå de instrumente ca cele din cel de altreilea exemplu.

Obiecte de tip OLE: container OLE OLE Containerx çicontrol OLE OLE Bound ControlxPrin intermediul tehnologiei OLE puteÆi introduce într-un formular obiecte create cu alteaplicaÆii (documente, foi de calcul imagini). AplicaÆiile cu care sunt create obiectele senumesc aplicaÆii server (de exemplu, o aplicaÆie Microsoft: Word, Excel, Paint etc.).Pentru adåugarea obiectelor OLE într-un formular, aplicaÆia Visual FoxPro vå pune ladispoziÆie douå obiecte vizuale:

obiecte OLE de tip container - OLEContainerx.obiecte OLE asociate câmpurilor de tip General din tabel - OLEBoundControlxcare permit afiçarea çi editarea unui obiect în acest tip de câmp.

Recomandare: Dacå doriÆi så editaÆi un câmp de tip General într-un formular, folosiÆi unobiect de tip OLEBoundControl. Dacå doriÆi så vizualizaÆi çi eventual så editaÆi într-un for-mular un obiect care nu este memorat într-un câmp, folosiÆi un obiect de tip OLEContainer.

Page 328: SGBD Visual Foxpro

Inormatică328

Containerul OLE permite afiçarea çi editarea obiectelor OLE într-o aplicaÆie VisualFoxPro. Obiectul vizual OLEContainer din Visual FoxPro este un container pentru obiec-tul creat cu o altå aplicaÆie. Aceste obiecte pot fi:

Controale OLE (fiçiere .ocx). Au propriul lor set de proprietåÆi, metode çi evenimente.Obiecte OLE inserabile. Nu au propriul lor set de proprietåÆi, metode çi evenimente(nu pot råspunde la evenimente).

Containerul OLE care nu are proprietåÆile ControlSource çi Value. În scimb, obiectul vizualOLEBoundControl are aceste proprietåÆi. Proprietatea ControlSource memoreazå nume-le câmpului în care se påstreazå obiectul.

ProprietåÆile specifice obiectelor vizualeOLE Container çi OLEBoundControl sunt:

Autoactivarea: Autoactivate este de tipnumeric çi determinå modul în care poate fiactivat obiectul. A activa obiectul înseamnå aactiva aplicaÆia server care l-a creat. Dacå arevaloarea 2 (valoarea implicitå), nu mai puteÆifolosi evenimentul DoubleClick.Tipul de obiect permis OLETypeAlowed .Este de tip numeric çi controleazå tipul deobiect care poate fi adåugat la cotainer.Modul în care se executå redimensionareaStretch . Este de tip numeric çi controleazå modul în care este redimensionat obiectulpentru a încåpea în zona alocatå lui în cadrul formularului. Valoarea implicitå este 0.

Accesul la obiect Object .Este o referinÆå cåtre un obiectOLE care permite accesul laproprietåÆile çi metodele sale.ProprietåÆile çi metodele spe-cifice unui anumit obiect OLE leputeÆi afla din documentaÆiaaplicaÆiei server. De exemplu,dacå obiectul OLE este o foaiede calcul (un obiect Excel), in-formaÆiile despre proprietåÆile çimetodele lui le puteÆi afla dindocumentaÆia aplicaÆiei MicrosoftExcel. FolosiÆi aceastå proprie-tate astfel: pentru modificareavalorii unei proprietåÆi:

Valoare Efect Autoactivate0

(Manual)Activat din program cumetoda DoVerb.

1(GotFocust)

Activat atunci când obiectulprimeçte focalizarea.

2(DoubleClick)

Activat atunci când se exe-cutå dublu clic pe obiect saucând obiectul este foca-lizatçi se apaså tasta Enter.

3 (Automatic) Activat de evenimentul impli-cit de activare al obiectului(de exemplu focalizareaformularului).

Valoare Efect OLETypeAlowed0 Linked - legat.1 Embedded - încapsulat.-1 OLE Bound - nu conÆine un

obiect OLE.-2 OLE control - control OLE (.ocx)

Valoare Efect Stretch0 Clip - Este secÆionat ca så încapå.1 Isometric - Este redimensionat ca

så încapå, cu påstrarea proporÆiilor.2 Stretch - Este redimensionat ca så

încapå, fårå påstrarea proporÆiilor.

Verb Efectul metodei DoVerb0 Este acÆiunea implicitå a obiectului.-1 Obiectul va fi activat pentru editare împreunå cu

containerul OLE.-2 Deschide fereastra aplicaÆiei server în care se

încarcå obiectul pentru editare.-3 Ascunde aplicaÆia care a creat obiectul (pentru

obiectele încapsulate).-4 Obiectul este activat în container pentru editare çi

sunt afiçate instrumentele specifice aplicaÆiei server.-5 La focalizarea obiectului se creeazå o fereastrå

pentru editarea obiectului.-6 Obiectul este activat pentru editare dar sunt igno-

rate toate modificårile pe care aplicaÆia server lepoate anula.

Page 329: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 329

<nume_obiect>.Object.<nume_proprietate>=<valoare>iar pentru apelarea unei metode:

<nume_obiect>.Object.<nume_metodå>[(<listå-parametri>)]AplicaÆia server cu care a fost creat obiectul: OLEClass (numele aplicaÆiei).Identificatorul fiçierului care conÆine obiectul (unitatea de disc, calea de director, nu-mele çi extensia): DocumentFile .Redimensionarea zonei alocate obiectului OLE: Sizable . Are aceeaçi semnificaÆie caçi la obiectul ToolBar. Dacå are valoarea .T. se poate folosi pro-prietatea AutoSizepentru a se redimensiona automat zona alo-catå obiectului.

Metoda specificå unui obiect OLE este DoVerb çi are ca efect activarea obiectului çistabilirea ope-raÆiilor care se pot executa cu obiectul respectiv. Obiectul poate fi activat prinacÆionarea standard a obiectului sau prin alte acÆiuni (verbe). Metoda poate fi apelatå prin:

DoVerb[(<verb>)]

InseraÆi un obiect OLE într-un formularVeÆi insera o foaie de calcul creatå cu aplicaÆia Excel.

CreaÆi un dosar Test în rådåcina discului C. CreaÆi în acest dosar o foaie de calcul cuaplicaÆia Excel pentru cheltuielile casnice din primul trimestru al anului. AtribuiÆiformule de calcul (sum) pentru celulele care memoreazå totalul pe tip de cheltuialå(pe orizontalå) çi totalul chltuielilor pe lunå (pe verticalå). RealizaÆi o diagramå cu re-partiÆia cheltuielilor în luna ianuarie.

ScrieÆi în fiçierul obiect1 programul surså:f1 = createobject('Form')f1.height = 350f1.width = 500f1.closable = .f.f1.caption="Cheltuieli"f1.addobject('b1','buton1')f1.addobject('o1','obiectexcel')f1.b1.visible=.t.f1.o1.visible=.t.f1.o1.height = 275f1.o1.width = 475f1.showf1.o1.doverb(-1) && -1; pentru editareread eventsdefine class obiectexcel as olecontrololeclass ='excel.sheet' && numele aplicatiei serverdocumentfile = "c:\test\cheltuieli.xls"

enddefinedefine class buton1 as commandbuttoncaption = '\<Terminare'cancel = .t.

Page 330: SGBD Visual Foxpro

Inormatică330

left = 250top = 310height = 25procedure clickclear eventsthisform.release

enddefine

LansaÆi în execuÆie programul cu comanda do obiect1.

Obiectul a fost deschis pentru editare. ModificaÆi valoarea câmpurilor. ObservaÆi cåvalorile din câmpurile pentru care s-a aplicat formula de calcul pentru sumå (sum)sunt modificate automat pentru a reflecta corect sitiuaÆia din foaia de calcul. Dacå aÆifåcut modificårile în coloana corespunzåtoare lunii ianuarie, observaÆi cå s-a modificatautomat çi diagrama. ÎnchideÆi formularul.LansaÆi în execuÆie programul cu comanda do test_bara1.

CreaÆi vizual obiectul inserat în formular

CreaÆi formularul din exemplul anterior folosindmetoda vizualå:

DeschideÆi fereastra constructorului de for-mulare cu comanda create form obiect1.StabiliÆi pentru formular proprietåÆile dinprogram.SelectaÆi din bara cu obiecte a constructoruluiobiectul OLEContainer.În zona formularului delimitaÆi zona ocupatåde obiect prin glisarea mouse-ului.Se deschide caseta de dialog InsertObject

Din grupul de butoane radio al caseteide dialog Insert Object mai puteÆi så

activaÆi butonul Create New, dacå vreÆiså creaÆi un obiect nou (din lista ObjectType alegeÆi aplicaÆia server pe care oveÆi folosi pentru crearea obiectului çi

se va deschide fereastra aplicaÆieipentru a crea obiectul) sau butonul

Insert Control dacå vreÆi så inseraÆi uncontrol OLE (se deschide caseta dedialog Browse din care puteÆi alege

fiçierul .ocx).

Page 331: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 331

prin intermediul cåreia stabiliÆi obiectul care va fi adåugat în formular. Din grupul debutoane radio activaÆi butonul Create From File. AcÆionaÆi butonul Browse pentru aconstrui identificatorul fiçierului care conÆine obiectul: discul C, dosarul Test çi fiçierulCheltuieli.xls. ÎnchideÆi caseta de dialog (clic pe butonul OK).În caseta de proprietåÆi modificaÆi proprietåÆile controlului OLEControl pentru acorespunde cu cele din program. ObservaÆi care sunt proprietåÆile, metodele çievenimentele acestui tip de control.AdåugaÆi la formular butonul pentru terminare. StabiliÆi proprietåÆile controlului (cele dinprogram) çi codul evenimentului Click.SalvaÆi formularul çi închideÆi aplicaÆia Constructorului de formulare.LansaÆi în execuÆie formularul cu comanda do form obiect1.

CreaÆi vizual obiectul inserat într-un câmp de tip General

CreaÆi un tabel Sigle care conÆine câmpurile nume (C,15), prenume (C,15) çi sigla (G).Câmpul Sigla va conÆine fieçiere .bmp în care sunt memorate sigle pentru iniÆialelepersoanelor înregistrate în tabel. CreaÆi aceste fiçiere cuaplicaÆia Windows Paint. AdåugaÆi date în tabel cu ajutorulferestrei Browse. Atunci când vreÆi så adåugaÆi date în câm-pul de tip General, executaÆi clic pe câmp. Se deschide o fe-reastrå de editare a câmpului în care veÆi insera obiectul cuopÆiunea Insert Object...∈∈Edit. Se deschide caseta de dialogInsert Object. Dacå alegeÆi butonul Create New, veÆi alegedin lista Liste Object Type articolul Bitmap Image dupå care se va deschide o zonå deeditare a obiectului çi se vor afiça instrumentele aplicaÆiei Paint cu care puteÆi creaobiectul. Dacå alegeÆi butonul Create from File, se va deschide o casetå de editare încare va trebui så scrieÆi identificatorul fiçierului care conÆine imaginea sau veÆi construiacest identificator cu ajutorul ferestrei Browse. Dupå ce aÆi completat cu date câmpuriledin tabel, închideÆi tabelul.

CreaÆi un formular pentru acest tabel.Formularul va conÆine butoanele >>> çi<<< pentru parcurgerea înregistrårilordin tabel.

DeschideÆi fereastra constructoruluide formulare cu comanda createform obiect2.AdåugaÆi în fereastrå urmåtoareleobiecte: trei etichete cu legendaNume, Prenume çi Sigla, douå ca-sete de text pentru câmpurile dintabel, sigle.nume (ControlSource= sigle.nume) çi sigle.prenume (ControlSource=sigle.prenume), trei comutatoare cu legenda \<>>>, \<<<< çi \<Terminare. Fereastrava avea legenda Sigle, culoarea fundalului gri çi butonul de închidere nu va fidisponibil. Etichetele trebuie så fie afiçate transparent.CompletaÆi procedurile asociate evenimentului click al butoanelor >>> çi <<<:

procedure click && butonul >>>if not eof()

skipendif

Page 332: SGBD Visual Foxpro

Inormatică332

thisform.refreshendprocprocedure click && butonul <<<if not bof()

skip -1endifthisform.refreshendproc

AdåugaÆi la formular un obiect de tip OLEBoundControl: executaÆi clic pe obiectuldin bara de obiecte a constructorului. StabiliÆi proprietåÆile controlului (ControlSource=sigle.sigla).SalvaÆi formularul. LansaÆi în execuÆie formularul cu comanda do form obiect2. TestaÆiformularul.

Obiectele grafice çi ceasulÎntr-un formular puteÆi så introduceÆi diferite obiecte grafice :

Control SemnificaÆieImagea Afiçeazå o imagine preluatå dintr-un fiçier .bmp. Caracteristicile sale pot fi

controlate cu proprietåÆile Top, Left, Height, Width, BackStyle,BorderColor, Border Style, Enabled, Visible, Stretch.

Linea Afiçeazå o linie. Caracteristicile sale pot fi controlate cu proprietåÆile Top,Left, Height, Width, BorderWidth, BorderColor, Border Style, Enabled,Visible, LineSlant.

Shapea Afiçeazå o formå (påtrat, dreptunghi, cerc, elipså). Caracteristicile sale pot ficontrolate cu proprietåÆile Top, Left, Height, Width, BackStyle, BackColor,BorderWidth, BorderColor, Border Style, FullColor, FullStyle, Enabled,Visible, ToolTipText, Curvature.

Imaginea (image) poate fi folositå la crearea butoanelor cu pictograme în locul butoa-nelor cu legendå, care pot fi folosite ca butoane declançatoare. Se recomandå folosirealor în cazul barelor cu instrumente. Imaginea graficå are o proprietate specificå Picture(imaginea) care memoreazå sursa imaginii. Aceasta poate fi: un fiçier bitmap .bmp, unfiçier de imagini .ico sau un câmp din tabel de tip general.

Formele çi liniile (shape sau line) sunt folosite pentru a se desena elemente grafice pesuprafaÆa formularelor. Chiar dacå au asociate evenimente (declançate de acÆiuni alemouse-ului), au în general numai un rol decorativ, de grupare sau de evidenÆiere.

Ceasul Timer este un obiect nevizual care poate fi folosit în interfaÆa unei aplicaÆiipentru a måsura timpul. Este un mecanism implementat în interfaÆå care permite progra-matorului så declançeze un anumit proces dupå un interval de timp. Este caracterizat de:

Proprietatea interval - Intervalx. Este de tip numeric çi reprezintå numårul demilisecunde dupå care este generat evenimentul Timer, adicå intervalul de timp pânåla apelul procesului. Valoarea sa implicitå este 0 (corespunde dezactivårii ceasului).Evenimentul asociat ceasului - Timerx. Este un eveniment care se declançeazå laintervale egale de timp (stabilite de proprietatea Interval). În procedura asociatå aces-tui eveniment se scriu instrucÆiunile acÆiunii care trebuie så se execute dupå un intervalde timp.Metoda de resetare a ceasului - Resetx prin care contorul ceasului este adus la 0.

Page 333: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 333

CreaÆi un formular controlat de ceas

CreaÆi un fiçier bitmap în dosarul Test. Imaginea din formularul alåturat a fost creatå înfiçierul test.bmp. CreaÆi formularulAtenÆionare care, la acÆionarea unuibuton Afisare va afiça o imagine çi olegendå care vor dispårea dupå 2500de ms. Ele vor fi reafiçate numai dacåse acÆioneazå din nou butonul Afisare:

DeschideÆi fereastra constructoruluide formulare cu comanda createform imagine1.StabiliÆi pentru formular proprie-tåÆile:

BackColor=192,192,192Caption="Atentionare"Closable=.F.

AdåugaÆi în fereastrå urmåtoarele obiecte: o imagine (Image1), o etichetå (Label1),douå butoane de comandå (Command1 çi Command2) çi un ceas (Timer1). StabiliÆipentru aceste controale proprietåÆile:

* Imagnea "Image1"Picture=c\test\test.bmpVisible = .F.AutoSize = .T.* Eticheta "Label1"FontSize = 12Alignment = 2BackStyle = 0

Caption="Vizitati ruinele ; castrului roman !!!"Visible = .F.* Butonul "Command1"Caption="\<Afisare"* Butonul "Command1"Caption="\<Terminare"

ScrieÆi procedurile asociate evenimentelor:procedure Click && Command1ThisForm.Image1.Visible=.T.ThisForm.Label1.Visible=.T.ThisForm.Timer1.Interval=2500

endprocprocedure Click && Command2 ThisForm.Release

endprocprocedure TimerThisForm.Image1.Visible=.F.ThisForm.Label1.Visible=.F.This.Interval=0

endproc

SalvaÆi formularul. LansaÆi în execuÆie formularul cu comanda do form imagine1.TestaÆi formularul. ÎnchideÆi formularul.DeschideÆi formularul cu comanda modify form imagine1. SalvaÆi formularul subnumele imagine2.FaceÆi modificåri în acest formular astfel încât imaginea çi eticheta så fie afiçateintermitent la un interval de 500 ms (se creeazå un efect dinamic, de animaÆie). Semodificå urmåtoarele proceduri:procedure Click && Command1ThisForm.Timer1.Interval=500

Page 334: SGBD Visual Foxpro

Inormatică334

endprocprocedure TimerThisForm.Image1.Visible=!ThisForm.Image1.VisibleThisForm.Label1.Visible=!ThisForm.Label1.Visible

endproc

SalvaÆi formularul. LansaÆi în execuÆie formularul cu comanda do form imagine2.TestaÆi formularul. ÎnchideÆi formularul.

CreaÆi un formular care simuleazå un ceas

Fie creaÆi douå fiçiere bitmap .bmp, fie gåsiÆi în sistem douå fiçiere cu pictograme .ico(de exemplu face01.ico çi face02.ico în imaginile din formularul alåturat). CreaÆi formu-larul Ceas care, la acÆionarea unui buton Afisare va afiça alternant la un interval de500 ms o imagine în partea dreaptå çi o imagine în partea stângå, iar sub cele douåimagini o afiçare numericå a timpului (cu pasul de 500 ms).

DeschideÆi fereastra constructorului de formulare cu comanda create form imagine3.StabiliÆi pentru formular proprietåÆile:

BackColor=192,192,192Caption="Ceas"Closable=.F.

AdåugaÆi în fereastrå urmåtoarele obiecte: douå imagini (Image1 çi Image2), o casetåde text (TextBox1), douå butoane de comandå (Command1 çi Command2) çi unceas (Timer). StabiliÆi pentru aceste controale proprietåÆile:

* Imagnea "Image1"Picture=c:\test\face01.icoBackStyle=0* Imagnea "Image2"Picture=c:\test\face03.icoBackStyle=0* Butonul "Command1"

Caption="\<Afisare"* Butonul "Command2"Caption="\<Terminare"* Ceasul "Timer"Interval=0* Caseta de text "TextBox1"BackStyle=0

ScrieÆi procedurile asociate evenimentelor:procedure Click && Command1ThisForm.Text1.Value=0ThisForm.Timer1.Interval=500

Page 335: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 335

ThisForm.Image1.Visible=.T.ThisForm.Image2.Visible=.F.endprocprocedure Click && Command2 ThisForm.Releaseendprocprocedure TimerThisForm.Text1.Value=ThisForm.Text1.Value+ ThisForm.Timer1.IntervalThisForm.Image1.Visible=!ThisForm.Image1.VisibleThisForm.Image2.Visible=!ThisForm.Image2.Visible

endproc

SalvaÆi formularul. LansaÆi în execuÆie çi testaÆi formularul. ÎnchideÆi formularul.

TT est pentru evaluare:

1. CreaÆi un tabel cu elevii din claså cu urmåtoarea structurå: nume (C,15), prenume(C,15), telefon (C,10), adresa (M), foto (G). În câmpul foto veÆi memora poza elevului.Crea1i un formular pntru introducerea çi vizualizarea datelor din tabel. VeÆi folosi treicontroale de tip casetå de text pentru câmpurile nume, prenume çi telefon, un controlde tip zonå de editare pentru câmpul adresa, un control de tip OLE pentru câmpulfoto çi cinci comutatoare: pentru adåugarea unei noi înregistråri, pentru çtergereaunei înregistråri, pentru parcurgere înainte çi înapoi a tabelului çi pentru terminare.

2. CreaÆi o barå cu instrumente care så conÆinå trei butoane prin care se deseneazå oformå într-un formular: påtrat, cerc, elipså çi linie.

3. ConstruiÆi un formular în care vor fi afiçaÆi, într-un control de tip listå, elevii al cårornume începe cu o anumitå literå. Litera o veÆi alege dintr-o barå cu instrumente careva conÆine butoane cu toate literele alfabetului.

4. DesenaÆi cu ajutorul unui program care prelucreazå imagini, patru imagini care såsugereze miçcarea unei persoane (patru cadre). CreaÆi într-un formular un efect deanimaÆie afiçând repetat la un anumit interval detimp, în ordine câte unul dintre cele patru cadre.

ÎncercaÆi:Adevårat/Fals:1. Obiectul ToolBox are proprietatea AutoSize.2. DocumentFile este o proprietate specificå obiectelor de tip OLE.3. Obiectul Timer are proprietatea Picture.

CompletaÆi:1. Evenimentul AfterDock este specific obiectului ............................2. Modul în care poate fi activat un obiect de tip OLE este controlat cu proprietatea

.........................3. Metoda prin care contorul ceasului este adus la 0 este ....................

Page 336: SGBD Visual Foxpro

Inormatică336

AlegeÆi råspunsurile corecte:1. Pentru un obiect ToolBox, Dock este:

a) o proprietate b) o metodå c) un eveniment2. Pentru un obiect de tip OLE DoVerb este:

a) o proprietate b) o metodå c) un eveniment3. Pentru obiectul ceas Timer este:

a) o proprietate b) o metodå c) un eveniment

RR åspunsuri:Adevårat/Fals: 1-A; 2-A; 3-F.CompletaÆi: 1-ToolBox; 2- Autoactivate; 3-Reset.AlegeÆi råspunsurile corecte: 1-b; 2- b; 3- c.

4 . P r o i e c t a r e a m e n i u r i l o r

Dacå aplicaÆia pune la dispoziÆia utilizatorului un set de comenzi, metoda cea mai avan-tajoaså, mai uçoarå çi mai potrivitå pentru a grupa aceste comenzi astfel încât utilizatorulså aibå acces la ele o reprezintå meniurile.

Meniul (menu) este un element de interfaÆå prin care i se oferå utilizatorului posibilitateade a selecta o opÆiune (menu item) dintr-o mulÆime finitå de opÆiuni posibile, afiçate pe

ecran total sau parÆial. În urma selectårii unei opÆiuni se declançeazå o anumitå acÆiune,corespunzåtoare opÆiunii alese.

În Visual FoxPro puteÆi folosi douå tipuri de meniu:Meniul sistem - este pus la dispoziÆie de mediul Visual FoxPro pentru a realiza acÆi-

uni corespunzåtoare limbajului de comandå.Meniul utilizator - este creat de programatorul unei aplicaÆii ca element al aplicaÆiei

construite de el.

Tipul de meniu disponibil (modul în care este afiçatå bara de meniu Visual FoxPro întimpul execuÆiei programului) este controlat de parametrul Sysmenu cu comanda:

set sysmenu on| off | automatic | to defaultunde:

on - bara de meniu Visual FoxPro este disponibilå în timpul execuÆiei programului.off - bara de meniu Visual FoxPro nu este disponibilå în timpul execuÆiei programului.automatic - bara de meniu Visual FoxPro este vizibilå în timpul execuÆiei

programului, iar opÆiunile sunt disponibile în funcÆie de comanda care se executå înprogram.to default - se revine la afiçarea meniului Visual FoxPro dupå ce programul çi-a ter-

minat execuÆia.

În funcÆie de modul în care este dispuså lista cu opÆiuni, meniurile sunt de douå tipuri:

Page 337: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 337

Meniuri orizontale - afiçeazå lista de opÆiuni pe un rând, pe orizontalå. Meniul ori-zontal se mai numeçte çi barå de meniu (menu bar), iar opÆiunile sale se mai numescçi titluri de meniuri (menu titles). Ele pot fi reprezentate prin cuvinte, expresii saupictograme. În terminologia Visual FoxPro, meniul orizontal se numeçte menu, iaropÆiunile sale se numesc pad.Meniuri verticale - afiçeazå lista de opÆiuni într-o coloanå, pe verticalå. Ele se mainumesc çi submeniuri. În terminologia Visual FoxPro, meniul vertical se numeçtepopup, iar opÆiunile sale se numesc bar.

Sistemul de meniuri al unei aplicaÆii este o combinaÆie de barå de meniuri, titluri demeniuri, submeniuri çi opÆiuni de meniu. Forma standard a unui sistem de meniuri esteurmåtoarea:

Meniul principal (main menu) este reprezentat printr-o barå de meniu afiçatå subbara de titlu a unui formular de tip fereastrå, în care ruleazå aplicaÆia. Atunci când seexecutå clic pe un titlu de meniu se deschide un meniu pe verticalå.Meniurile pe verticalå afiçeazå o listå cu opÆiuni. OpÆiunile pot fi comenzi de operaÆiide prelucrare, titluri de submeniuri sau bare separatoare. Barele separatoare sefolosesc pentru a împårÆi în grupuri opÆiunile din lista meniului. Submeniul este un altmeniu care afiçeazå o altå listå de opÆiuni. În acest mod se poate crea o structuråarborescentå de submeniuri.

Pentru a face aplicaÆia mai uçor de utilizat, opÆiunile de meniu sunt grupate dupå funcÆiilelor. Submeniurile se creeazå atunci când:

bara de meniu este plinå cu titluri de meniu çi nu mai încape un nou titlu de meniu;lista submeniului este formatå din comenzi care sunt folosite mai rar;lista de comenzi din submeniu este într-o anumitå relaÆie cu o opÆiune de meniu.

Unele opÆiuni de meniu executå direct o acÆiune. Alte opÆiuni afiçeazå o casetå de dia-log, un fomular prin care aplicaÆia cere utilizatorului så-i furnizeze informaÆii suplimentareca så poatå executa acÆiunea cerutå. În marea majoritate a aplicaÆiilor aceste opÆiuni demeniu sunt urmate de trei puncte. Este bine ca çi în interfaÆa pe care o construiÆi sårespectaÆi acest standard.

Fiecårei opÆiuni de meniu îi corespunde un control de meniu. Controlul meniului este çi elun obiect. La fel ca orice obiect, çi el are proprietåÆi standard prin care i se poate stabiliaspectul: legenda, disponibilitatea, vizibilitatea etc. Legenda este textul care apare în titlusau în opÆiunea de meniu. Controlul meniu are asociat un singur eveniment care estedeclançat atunci când opÆiunea de meniu este selectatå de la tastaturå sau cu mouse-ul.

ProprietåÆile specifice unui control meniu sunt:Legenda opÆiunii Prompt - este textul explicativ afiçat de titlul meniului sau deopÆiunea de meniu.Tasta de acces Access key - este tasta care se apaså pentru a selecta direct titlulsau opÆiunea respectivå atunci când meniul este activat. Litera tastei de acces estesubliniatå în legendå. Pentru a stabili o tastå de acces, înaintea literei respective dinlegendå, scrieÆi caracterele \<.Scurtåtura Shortcut key - este combinaÆia de taste asociatå opÆiunii de meniu carepermite executarea unei comenzi dintr-un meniu fårå så se mai activeze bara de

Page 338: SGBD Visual Foxpro

Informatică338

meniu çi så se selecteze comanda. Lângå opÆiune, în partea dreaptå este afiçat untext cu combinaÆia respectivå de taste.Mesajul informativ Message - este un mesaj afiçat în bara de stare atunci când seselecteazå opÆiunea.Marcajul de verificare Mark character - este un simbol care se afiçeazå în parteastângå a opÆiunii de meniu în funcÆie de o condiÆie: dacå valoarea condiÆiei este adevårat,în faÆa opÆiunii este afiçat marcajul de verificare b(bifa), iar dacå este fals, marcajul nueste afiçat. Aceastå proprietate permite folosirea opÆiunilor de meniu pentru stabilireavalorii unui parametru. Dacå parametrul poate lua valoarea adevårat sau fals, se foloseçteo singurå opÆiune care poate fi marcatå sau nu. Numele opÆiunii este numele parametrului.Deoarece aceastå opÆiune se comportå la fel ca un control comutator, ea se mai numeçteçi opÆiune comutator. Dacå parametrul poate lua mai multe valori, se folosesc mai multeopÆiuni de meniu, numele fiecårei opÆiuni reprezentând o valoare posibilå a parametrului.O singurå opÆiune din grupul de opÆiuni poate fi marcatå çi ea reprezintå valoarea aleasåpentru parametru. La alegerea unei noi opÆiuni din grup, va fi çters marcajul vechii opÆiuniçi va fi marcatå noua opÆiune. Deoarece grupul de opÆiuni de meniu se comportå la fel caun control de tip butoane radio, el se mai numeçte çi grup de opÆiuni butoane radio.Disponibilitatea Skip for - este determinatå de o condiÆie prin care se controleazådacå opÆiunea de meniu este disponibilå sau nu: dacå expresia logicå are valoareaadevårat, opÆiunea de meniu este disponibilå.

Pentru a controla afiçarea marcajului în faÆa unei opÆiuni se foloseçte comanda:set mark of popup <nume_opÆiune> to <expL>

unde <nume_opÆiune> este numele atribuit opÆiunii (diferit de legendå) folosit pentru iden-tificarea sa, iar <expL> exprimå condiÆia care determinå afiçarea marcajului.

Evenimentele specifice unui control meniu sunt:IniÆilizarea Setup - este declançatå de crearea meniului. În procedura asociatåacestui meniu puteÆi defini variabilele de memorie, puteÆi deschide fiçiere, puteÆi salvasau restaura un sistem de meniuri. Meniurile pot fi salvate în stiva meniurilor. PentruoperaÆiile cu stiva puteÆi folosi comenzile push menu pentru salvarea meniului în stivåçi pop menu pentru extragerea meniului în stivå.Çtergerea Cleanup - este declançatå de activarea meniului. În procedura asociatåacestui meniu puteÆi scrie secvenÆe de cod prin care çtergeÆi informaÆiile care au fostafiçate pe ecran çi prin care stabiliÆi ce opÆiuni de meniu sunt disponibile. Dacå meniuleste programul principal al aplicaÆiei, în aceastå procedurå puteÆi activa procesorul deevenimente cu comanda read events. Comanda prin care dezactivaÆi acest procesorclear evnts o veÆi scrie în procedura asociatå opÆiunii de meniu prin care terminaÆiaplicaÆia.

Unele aplicaÆii pun la dispoziÆia utilizatorului meniuri derulante (pop-up menu) care suntafiçate deasupra formularului, independent de bara de meniu. OpÆiunile afiçate în acestmeniu depind de context, adicå de locul în care se gåseçte cursorul atunci când esteapåsat butonul din partea dreaptå a mouse-ului. El se numeçte meniul contextului(context menus) sau meniu de comenzi rapide.

Pentru proiectarea unui meniu se poate folosi limbajul de comandå care vå pune ladispoziÆie comenzi çi funcÆii pentru realizarea acestei operaÆii. Forma mai rapidå çi mai puÆin

Page 339: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 339

laborioaså o reprezintå înså Constructorul de meniuri care permite programatorului sådefineascå interactiv un sistem de meniuri çi så stabileascå elementele sale componente(submeniuri çi opÆiuni de meniu), proprietåÆile lor (legenda, tastele de acces, scurtåtura) çiacÆiunile asociate unei opÆiuni de meniu: declançarea unei acÆiuni sau deschiderea unuinou submeniu.

Pentru realizarea unui sistem de meniuri trebuie så parcurgeÆi urmåtorii paçi:

1. ProiectaÆi sistemul de meniuri. În aceastå fazå decideÆi de ce meniuri aveÆi nevoie,când sunt afiçate în interfaÆå çi când sunt disponibile. StabiliÆi ce elemente veÆi folosipentru sistemul de meniuri (titlurile din meniul principal, submeniurile, opÆiunile dinsubmeniuri), adicå structura sistemului de meniuri. Pentru fiecare element, veÆi stabiliproprietåÆile specifice. Pentru fiecare opÆiune de meniu, veÆi stabili ce acÆiune vadeclança în urma selectårii. Când proiectaÆi sistemul de meniuri trebuie så aveÆi învedere cå utilizatorul trebuie så-l foloseascå uçor çi trebuie så înveÆe repede så-lutilizeze. Utilizatorul îçi face o imagine mentalå despre modul în care este organizatåaplicaÆia pe baza meniului çi a opÆiunilor de meniu. De aceea, atunci când proiectaÆiun sistem de meniuri este bine så respectaÆi urmåtoarele reguli:

a. OrganizaÆi sistemul de meniuri pornind de la sarcinile pe care trebuie så leexecute utilizatorul programului de aplicaÆii çi nu de la structura de module aprogramului de aplicaÆii.

b. Legendele afiçate de titlurile çi opÆiunile de meniuri trebuie så fie sugestive, cuun înÆeles asociat acÆiunii determinate de titlu sau opÆiune. În general este bineså folosiÆi verbe prin care descrieÆi acÆiunea ce va rezulta în urma alegeriiopÆiunii. Pentru informarea utilizatorului veÆi folosi construcÆii suplimentare (deexemplu mesaje în bara de stare) prin care veÆi descrie acÆiunea declançatå dealegerea unei opÆiuni.

c. În legendele titlurilor çi opÆiunilor de meniu puteÆi folosi atât litere mari, cât çi literemici. LimitaÆi folosirea literelor mari numai la evidenÆierea anumitor caracteristici.

d. LimitaÆi numårul de titluri de meniuri la un ecran. Dacå ele depåçesccapacitatea unui ecran, le veÆi organiza în submeniuri.

e. OpÆiunile de meniu se organizeazå fie Æinând cont de frecvenÆa lor de folosire,fie într-o secvenÆå logicå de folosire, fie alfabetic. VeÆi alege ultimul criteriudacå nu le cunoaçteÆi pe primele douå sau dacå lista de opÆiuni este prea mare(de regulå peste 8) pentru a uçura parcurgerea listei de cåtre utilizator.

f. PuneÆi bare separatoare între grupuri logice de opÆiuni de meniu.g. Este bine så nu se foloseascå mai mult de un nivel de submeniuri, pentru ca

utilizatorul så nu-çi piardå timpul cåutând comenzi printr-o structurå arbores-centå de meniuri.

h. StabiliÆi taste de acces pentru titlurile de meniuri çi opÆiunile de submeniuri çiscurtåturi pentru opÆiunile de submeniuri.

2. CreaÆi meniurile çi submeniurile çi stabiliÆi sarcinile pe care trebuie så le executesistemul. Pentru aceasta lansaÆi în execuÆie constructorul de meniuri cu comanda:

create menu <nume_meniu>

Page 340: SGBD Visual Foxpro

Informatică340

VeÆi preciza structura arborescentå a meniului çi veÆi specifica acÆiunile pe care tre-buie så le execute fiecare opÆiune de meniu ca de exemplu afiçarea unei casete dedialog, a unui formular, a unei bare de instrumente sau a unui alt sistem de meniuri.Cererea de executare a unei acÆiuni trebuie så se facå numai printr-o singurå co-mandå. Dacå acÆiunea declançatå de selectarea unei opÆiuni se descrie printr-ungrup de instrucÆiuni, acestea vor fi scrise într-un fiçier de tip program surså çi vor filansate în execuÆie printr-o singurå comandå: do <nume_fiçier>. În urma acestoracÆiuni ale programatorului constructorul de meniuri va crea un fiçier cu numele me-niului çi extensia .mnx în care se gåsesc, sub forma unui tabel, componentele unuimeniu çi caracteristicile lor. PuteÆi modifica un meniu cu comanda:

modify menu <nume_meniu>

3. GeneraÆi programul excutabil al meniului. Pentru a putea folosi meniul, trebuiegenerat un program care, în urma execuÆiei sale, så activeze meniul. Programul va fimemorat într-un fiçier cu extensia .mpr. Dupå orice modificare a meniului va trebui såexecutaÆi din nou operaÆia de generare.

4. LansaÆi în execuÆie çi testaÆi meniul. Meniul va fi activat prin lansarea în execuÆie apogramului generat cu comanda:

do <nume_meniu>.mpr

CreaÆi un sistem de meniuri

Sistemul de meniuri pe care îl veÆi crea reprezintå programul principal de aplicaÆie în care,în funcÆie de opÆiunile alese, veÆi lansa în execuÆie diferite module de program, construiteanterior sub formå de formulare. Se va folosi pentru meniul principal un meniu sub formaunei bare pe orizontalå, la fel ca çi meniul sistemului Visual FoxPro.

Sistemul de meniuri va afiça o barå de meniuri peorizontalå cu titlurile Afiseaza figuri, Utilitati çiTerminare. Titlul Afiseaza figuri va deschide un meniupe verticalå care conÆine douå opÆiuni de tip submeniu:Patrat4 çi Figuri4. Submeniul Patrat4 conÆine douaopÆiuni de tip comandå: Afiseaza... care va lansa în execuÆie formularul în care estecontrolatå afiçarea unui påtrat cu ajutorul unui control de tip comutator çi Coloreaza...care va lansa în execuÆie formularul în care este controlatå afiçarea culorii de umplere aunui påtrat cu ajutorul unui control de tip listå. Submeniul Figuri4 conÆine douå opÆiuni detip comandå: Grup 1... care va lansa în execuÆie formularul în care este controlatåafiçarea unei anumite figuri geomtrice cu ajutorul unui control de grup de butoane radio çiGrup 2... care va lansa în execuÆie formularul în care este controlatå afiçarea uneianumite figuri geomtrice cu ajutorul unui control de tip listå. Titlul UtilitåÆi va deschide unmeniu pe verticalå care conÆine douå opÆiuni de tip comandå: Ceas... care va lansa înexecuÆie formularul în care este simulat un ceas cu ajutorul controlului de tip Timer çiCalculator... care va lansa în execuÆie formularul în care este simulat lucrul cu un

Page 341: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 341

calculator de buzunar. Titlul Terminare va avea asociatå o comandå pentru terminareaaplicaÆiei.

LansaÆi în execuÆie constructorul de meniuri fie cu opÆiunea de meniu New...∈∈File (dincaseta de dialog New alegeÆi butonul radio Menu çi executaÆi apoi clic pe butonul NewFile), fie cu comanda:

create menu menu_testSe deschide caseta de dialog New Menu care conÆine douåbutoane: Menu pentru crearea unui sistem de meniuri subformå de barå orizontalå pe primul rând al formularului în loculsau împreunå cu titlurile meniului Visual FoxPro çi Shortcutpentru crearea unui meniu derulant pe verticalå în interiorulferestrei de aplicaÆie. PuteÆi alege butonul Shortcut atunci cândvreÆi så creaÆi un meniu de comenzi rapide asociat unui anumitelement de interfaÆå. VeÆi scrie comanda de lansare în execuÆie a acestui meniu înprocedura asociatå evenimentului RightClick al elementului respectiv. Deoarece vremså construim un meniu sub formå de barå pe orizontalå, executaÆi clic pe butonul Menu.Se deschide fereastra constructorului de meniuri Menu Designer, iar în bara de meniurieste afiçat un titlu de meniu care conÆine opÆiuni specifice constructorului de meniuri:Menu. DeschideÆi acest meniu çi observaÆi opÆiunile pe care le conÆine. IdentificaÆiopÆiunile pentru care aveÆi butoane în fereastra Menu Designer. OpÆiunea Quick menuvå ajutå så creaÆi rapid un sistem de meniuri pornind de la meniul Visual FoPro. Se vagenera automat structura acestui sistem de meniuri, dupå care veÆi putea çterge,adåuga sau modifica opÆiunile sau meniurile Visual FoxPro. VeÆi construi înså sistemulde meniuri fårå så folosiÆi aceastå facilitate.Înainte de a specifica structura sistemului de meniuri, îi veÆi stabili caracteristicile gene-rale prin intermediul casetei de dialog General Option pe care o deschideÆi cu opÆiuneade meniu General Options...∈∈View. Ea conÆine urmåtoarele controale:Grupul de butoane radio Location prinintermediul cårora stabiliÆi poziÆia meniuluipe care îl creaÆi faÆå de meniul sistemuluiVisual FoxPro: Replace - în locul acestuia,Append - la dreapta acestuia, Before -înaintea unui titlu de meniu çi After - dupåun titlu de meniu din meniul sistemului.Dacå alegeÆi una dintre ultimele douå opÆi-uni, se va deschide o listå derulantå cu titlu-rile de meniuri din care puteÆi så alegeÆi titlulmeniului faÆå de care va fi adåugat în meniulsistemului, meniul creat de dumneavoastrå.Grupul de comutatoare Menu code prin in-termediul cårora stabiliÆi dacå doriÆi så scrieÆio secvenÆå de cod asociatå evenimentului Setup (comutatorul Setup...) çi evenimen-tului Cleanup (comutatorul Cleanup...). Dacå activaÆi comutatorul se va deschide ofereastrå de editare în care veÆi scrie secvenÆa de instrucÆiuni.

Page 342: SGBD Visual Foxpro

Informatică342

Zona de editare Procedure çi comutatorul Edit le veÆi folosi dacå vreÆi så definiÆi oprocedurå globalå care va fi folositå implicit în întregul sistem de meniuri. Ea va filansatå în execuÆie de fiecare datå când se va alege o opÆiune cåreia nu i s-a atribuit oprocedurå proprie. Pentru meniul pe care îl construiÆi trebuie så fie activat butonulReplace. ÎnchideÆi caseta de dialog executând clic pe butonul Ok.AÆi revenit în fereastra Menu Designer în care definiÆi titlurile din meniul principal:

În fereastra Menu Designer puteÆi folosi urmåtoarele controale:Zona de de lucru afiçeazå sub forma unui tabel mai multe controale: pe un rând suntafiçate controalele corespunzåtoare definirii caracteristicilor unei opÆiuni de meniu, iarpe o coloanå controalele corespunzåtoare unei caracteristici a opÆiunii de meniu.Coloanele sunt urmåtoarele:

Mover Control. Este prima coloanå çi conÆine un buton cu sågeatå dublå . Sefoloseçte pentru a schimba locul opÆiunilor în listå (prin glisarea opÆiunii în nouapoziÆie).Prompt. În aceastå coloanå se scrie textul legendei opÆiunii de meniu. Dacå înlegendå scrieÆi înaintea textului caracterul \, opÆiunea nu va disponibilå. Dacå înlegendå scrieÆi numai caracterele \-, opÆiunea respectivå va fi o linie de demarcareîntre grupurile de opÆiuni.

Result. În acestå coloanå este afiçat un control de tip listå ascunså din care puteÆialege tipul acÆiunii declançate de selectarea opÆiunii de meniu (tipul rezultatului).Tipul rezultatului poate fi: Submenu (se deschide un submeniu), Command (seexecutå o comandå) sau Procedure (se executå o procedurå). Pentru opÆiunile desubmeniu Afiseaza, Coloreaza, Grup 1, Grup 2, Calculator çi Ceas alegeÆi un rezul-tat de tip Command, pentru titlul Terminare, rezultatul Procedure, pentru restulopÆiunilor rezultatul Submenu.

Page 343: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 343

Zona de creare sau editare a rezultatului. Este coloana urmåtoare rezultatului(coloana a patra). ConÆine un buton Create la creare çi un buton Edit la editare. Da-cå tipul rezultatului este Submenu, la acÆionarea butonului se deschide o nouå zonåde lucru în care puteÆi defini opÆiunile submeniului çi caracteristile lor. Dacå tipulrezultatului este Command, la acÆionarea butonului se activeazå în coloana a patra ocasetå de text în care scrieÆi comanda. Dacå tipul rezultatului este Procedure, laacÆionarea butonului se deschide o zonå de editare în care scrieÆi secvenÆa deinstrucÆiuni a procedurii. Pentru opÆiunile de meniu pentru care aÆi ales rezultatul detip Command, scrieÆi comanda do form <nume_forma>, unde <nume_forma> estenumele fiçierului în care aÆi salvat formularul. Pentru titlul Terminare pentru care aÆiales rezultatul Procedure, scrieÆi în zona de editare urmåtoarea secvenÆå deinstrucÆiuni:deactivate menu menu_test && dezactiveaza meniulrelease menu menu_test extended && elibereaza zona de ; memorie alocata meniului la creareset sysmenu to defaultclear memoryclearButonul Option. Dacå îl acÆionaÆi se deschide caseta de dialog Prompt Option încare stabiliÆi caracteristicile opÆiunii de meniu. CompletaÆi în aceastå casetå dedialog, pentru fiecare opÆiune de meniu, mesajul çi scurtåtura.

Lista ascunså Menu level afiçeazå ierarhic meniurile din care s-a dezvoltat meniul pentrucare se pecizeazå opÆiunile în zona de lucru a ferestrei (filiaÆia meniului). Alegând oopÆiune din aceastå listå puteÆi reveni într-unul din meniurile superioare lui. De exemplu,folosind aceastå listå puteÆi så reveniÆi din zona de lucru a meniului Patrat, în zona delucru a meniului pårinte Afiseazå figuri sau a meniului principal Menu Bar.

Grupul de zone de editare Shortcut se folo-seçte pentru a stabili o scurtåturå pentru opÆi-unea de meniu. CombinaÆia de taste se scrieîn zona de editare Key Label (de exemplu Æi-nând apåsatå tasta Alt apåsaÆi tasta S;scurtåtura va fi Alt+S). În zona de editareKey Text se va scrie textul afiçat lângå opÆi-unea de meniu prin care se precizeazå scur-tåtura.În caseta de editare Skip For scrieÆi expresialogicå folositå pentru a controla disponibilita-tea opÆiunii de meniu. PuteÆi folosi construc-torul de expresii dacå acÆionaÆi butonul ....În caseta de editare Message scrieÆi mesajulcare va fi afiçat în bara de stare la selectareaopÆiunii. PuteÆi folosi constructorul de expresii.În zona de editare Comment puteÆi scriecomentarii folosite intern, de proiectant.

Page 344: SGBD Visual Foxpro

Informatică344

SecÆiunea de butoane Item conÆine butoane pentru inserarea unei opÆiuni de meniu întrecele existente: Insert (o opÆiune definitå de utilizator) çi Insert Bar... (o opÆiune preluatådin meniul sistemului Visual FoxPro) çi pentru çtergerea unei opÆiuni Delete.Butonul Preview. Prin acÆionarea lui puteÆi så previzualizaÆimeniul pe care îl construiÆi: meniul sistemului este înlocuitde acesta çi se deschide o casetå de dialog Preview încare sunt prezentate informaÆii despre opÆiunea selectatådin meniu (numele fiçierul, legenda opÆiunii çi comanda aso-ciatå).

Dupå ce aÆi terminat de construit meniul, îl previzualizaÆifolosind butonul Preview.GeneraÆi meniul executabil cu opÆiunea Generate...∈∈Menu.LansaÆi în execuÆie meniul cu comanda: do menu_test. TestaÆi meniul.Structura meniului este memoratå într-un fiçier de tip tabel, care are cu numele meniului(menu_test) çi extensia .mnx. DeschideÆi acest fiçier cu comanda use menu_test.mnx.AfiçaÆi conÆinutul såu cu comanda browse. IdentificaÆi în acest tabel semnificaÆia fiecåreicoloane. IdentificaÆi ce element din structura meniului este înregistrat în fiecare rând altabelului.

TestaÆi modul în care puteÆi folosi procedura globalå çi procedurile asociate eveni-mentelor Setup çi Cleanup

VeÆi adåuga sistemului de meniuri o procedurå globalå:DeschideÆi meniul anterior çi-l salvaÆi sub numele menu_1. În noul meniu veÆi faceurmåtoarele modificåri:In caseta de dialog General Option scrieÆi în zona de editare a procedurii globaleinstrucÆiunea:

? "Test procedura globala"ActivaÆi comutatorul Setup çi în fereastra de editare a procedurii scrieÆi:

? "Test eveniment Setup"În fereastra Form Designer în meniul principal adåugaÆi titlul Scrie înainte de titlul demeniu Terminare. Acestui titlu de meniu îi atribuiÆi un rezultat de tip Command, dar nuîi atribuiÆi nici o comandå. În meniul Utilitati adåugaÆi la sfârçit douå opÆiuni: Scrie 1 çiScrie 2. Ambelor le atribuiÆi un rezultat de tip comandå. OpÆiunii Scrie 1 nu îi atribuiÆinici o comandå, iar opÆiunii Scrie 2 îi atribuiÆi comanda:

? "Test optiune Scrie 2"În procedura asociatå titlului Terminare din meniul principal, çtergeÆi instrucÆiunea clear.SalvaÆi modificårile fåcute çi generaÆi meniul executabil. LansaÆi în execuÆie meniul.TestaÆi meniul Scrie çi opÆiunile Scrie 1 çi Scrie 2. Ce concluzii trageÆi?DeschideÆi meniul menu_1 çi îl salvaÆi sub numele menu_2. În noul meniu deschideÆicaseta de dialog General Option, activaÆi comutatorul Cleanup çi în fereastra deeditare a procedurii scrieÆi:

clear ? "Test eveniment Cleanup"

SalvaÆi modificårile fåcute çi generaÆi meniul executabil. LansaÆi în execuÆie meniul.TestaÆi meniul Scrie çi opÆiunile Scrie 1 çi Scrie 2. Ce concluzii trageÆi? Când seexecutå procedura asociatå evenimentului Cleanup.

Page 345: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 345

TT est pentru evaluare:

ConstruiÆi o bazå de date în care profesorul de informatica va Æine evidenÆa notelorelevilor din clasele la care predå. Baza de date va fi formatå din douå tabele: elevi custructura identificatorul elevului (id_elev,N,3), clasa (cls,C,3), numele (nume,C,15),prenume (pren,C,15), teza pe semestrul 1 (t1,N,2), media pe semestrul 1 (m1,N,2), tezape semestrul 2 (t1,N,2), media pe semestrul 2 (m2,N,2) çi media generalå (mg,N,5,2) încare ÆineÆi evidenÆa elevilor çi note cu structura identificatorul elevului (id_elev,N,3), nota(nota,N,2) çi data notårii (data,D) în care ÆineÆi evidenÆa notelor la informaticå. CânddefiniÆi baza de date aveÆi grijå så asiguraÆi integritatea referenÆialå a datelor. SeparatcreaÆi tabelul liber Clase în care profesorul Æine evidenÆa claselor la care predå. Tabelulva avea un singur câmp pentru clase (cls,C,3). Acest tabel va fi folosit ca surså de datepentru un control de tip listå. ConstruiÆi un sistem de meniuri care så-i permitåprofesorului întreÆinerea çi exploatarea acestor date. Sistemul va avea urmåtoarele titluri:

a. Titlurile din meniul principal vor fi: Actualizare, Prelucrare, Listare, Terminare.b. Meniul Actualizare va deschide un meniu pe verticalå cu opÆiunile Note, Teze, Elevi,

Clase. Selectarea uneia dintre aceste opÆiuni va deschide un formular pentruactualizarea datelor din tabelul respectiv. Formularele Elevi çi Clase vor aveaurmåtoarele butoane: buton pentru adåugarea unei înregistråri, buton pentruçtergerea unei înregistråri, buton pentru refacerea unei înregistråri çterse accidentalîn timpul lucrului cu formularul, douå butoane pentru parcurgere înregistrårilor dintabel înainte çi înapoi çi butonul de terminare. În formularul pentru elevi, se voractualiza numai urmåtoarele date din tabelul Elevi: numele, prenumele çi clasa.Clasa se va alege dintr-o listå a cårei surså de date va fi tabelul Clase. Tabelul Noteva conÆine o casetå de text pentru datå çi o casetå de text cu derulor pentru notå, uncontrol de tip claså din care veÆi alege clasa çi un control de tip listå cu douå coloanedin care veÆi alege numele çi prenumele elevului pentru care înregistraÆi nota.Formularul va avea butoane de adåugare, çtergere, refacere a unei înregistråriçterse accidental în timpul lucrului cu formularul, douå butoane pentru parcurgereaînregsitrårilor din tabel înaintea çi înapoi çi butonul de terminare. Formularul pentruteze va permite alegerea elevului cu ajutorul celor douå liste, la fel ca çi în cazulnotelor. Se vor crea douå casete de text cu derulor pentru cele douå note la tezelede pe primul semestru, respectiv al doilea semestru.

c. Meniul Prelucrarea va deschide un meniu pe verticalå cu opÆiunile SituaÆie elev,Primii 10, Ultimii 10, Corigentii. OpÆiunea SituaÆie elev va afiça un formular cu situaÆiaunui elev. Formularul va conÆine douå liste din care veÆi alege elevul çi clasa, uncontrol de tip grilå în care vor fi afiçate nota çi data çi cinci casete de text pentru celedouå teze, cele douå medii semestriale çi menia anualå. Valorile din toate acestecontroale vor fi protejate la scriere. OpÆiunile Primii 10 çi Ultimii 10 vor afiçaformulare care vor conÆine un control de tip listå din care veÆi alege perioda(Semestrul 1, Semestrul 2 sau An) çi un control de tip grilå în care vor fi afiçaÆi primii10 elevi care au cele mai mari medii, respectiv ultimii 10 elevi care au cele mai micimedii. Grila va avea coloane pentru nume, prenume, claså çi medie. OpÆiuneaCorigenÆii va afiça un formular în care, dintr-o listå, veÆi putea alege perioada(Semestrul 1, Semestrul 2 sau An) çi o listå din care veÆi alege clasa, dupå care se

Page 346: SGBD Visual Foxpro

Informatică346

va crea o listå dinamicå cu numele elevilor corigenÆi din clasa respectivå, în perioadaaleaså. Toate aceste formulare vor avea un buton de terminare.

d. Meniul Listare va deschide un meniu pe verticalå cu opÆiunile Lista 1, Lista 2, Lista 3,Lista 4, Lista 5 çi Lista 6. Aceste opÆiuni vor fi grupate logic în douå grupuri deopÆiuni (fiecare grupå va conÆine 3 opÆiuni) separate printr-o barå separatoare.Toate aceste opÆiuni de meniu vor afiça rapoarte, în care înregistrårile vor fi grupatedupå criteriul clasei. Lista 1 (Lista 4) çi Lista 2 (Lista 5) vor afiça rapoarte cu numeleçi prenumele elevului, notele çi media pe primul semestru, respectiv al doileasemestru, iar Lista 3 ((Lista 6)) va afiça un raport cu numele çi prenumele elevului,mediile semestriale çi media generalå. În primul grup de rapoarte, în cadrul grupuluiclasa, înregistrårile vor fi afiçate în ordine alfabeticå, iar al doilea grup de rapoarte înordinea descrescåtoare a mediilor. Utilizatorul programului va cunoaçte semnificaÆiafiecårei opÆiuni din mesajul afiçat în bara de stare.

e. StabiliÆi scurtåturi çi mesaje pentru toate opÆiunile de meniu.f. Înainte de a se activa meniul, afiçaÆi pe ecran o casetå de dialog pentru introducerea

parolei. StabiliÆi ce parolå doriÆi. Se vor acceptanumai cinci încercåri de comunicare a paroleipentru a avea acces la datele din baza de date.

5 . P r o i e c t a r e a ap l i c a ţi i l o r

5 . 1 . P r o g r a m u l m o n i t o r

O aplicaÆie cuprinde mai multe module: pentru introducerea datelor, pentru prelucrarealor sau pentru afiçarea unor rapoarte pe ecran sau la imprimantå. Toate aceste moduletrebuie asamblate într-o aplicaÆie, în care un modul de program trebuie så le administrezeçi så le coordoneze.

Programul monitor al unei aplicaÆii are rolul de a coordona executareamodulelor aplicaÆiei çi a asigura colaborarea între ele.

Sarcinile unui program monitor sunt:a. Så configureze mediul de lucru. Sistemul de gestiune a bazelor de date poate fi

configurat prin intermediul unor parametri a cåror valoare se stabileçte cu co-manda set. Aceçti parametri au valori implicite, iar în unele aplicaÆii aceste valoriimplicite nu sunt tocmai potrivite. De exemplu, parametrul talk trebui så aibåvaloarea off, iar parametrului date, care stabileçte formatul datelor calendaristice, ise poate atribui un anumit format (set date to british). Se mai poate stabili direc-torul curent din care se vor prelua baza de date çi alte fiçiere necesare aplicaÆiei cuparametrul default (set default to <cale_director>). AlÆi parametri pentru care sestabilesc de obicei valorile sunt century, confirm, console, deleted çi safety.

b. Så personalizeze fereastra de aplicaÆie. AplicaÆia ruleazå în fereastra sistemuluiVisual FoxPro, care va deveni fereastra aplicaÆiei. De aceea trebuie så schimbaÆianumite proprietåÆi ale acestei ferestre. Obiectul fereastra aplicaÆiei Visual FoxProse identificå prin variabila de memorie sistem _screen. De exemplu, dacå vreÆi såschimbaÆi legenda ferestrei de aplicaÆie veÆi folosi comanda de atribuire:

Page 347: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 347

_screen.caption=<numele_ferestrei_de_aplicatie>Înainte înså de a modifica proprietåÆile ferestrei, salvaÆi valorile pe care le modificaÆiîn variabile de memorie (de exemplu: nume_f=_screen.caption) .

c. Så activeze meniul principal al aplicaÆiei. Din meniul principal se vor lansa înexecuÆie modulele de program pentru prelucrarea datelor, formularele pentrueditarea datelor, comenzile pentru afiçarea rapoartele etc.

d. Så activeze procesorul de evenimente. Deoarece programul generat de con-structorul de meniuri nu conÆine propriul procesor de evenimente, este necesarca, dupå ce a fost lansat în execuÆie programul care creeazå meniul, så seactiveze procesorul de evenimente care la rândul såu va activa meniul çi vapermite tratarea evenimentelor.

e. Så dezactiveze procesorul de evenimente çi så refacå starea anterioarå amediului de lucru la terminarea execuÆiei aplicaÆiei.

Exemplu

Pentru salvarea çi restaurarea parametrilor care caracterizeazå starea sistemului, puteÆifolosi douå tabele (câte una pentru fiecare tip de comandå set):stare1 (comenzi set pentru parametrii cu douå valori - on çi off; de exemplu talk,century, confirm, console, deleted çi safety) cu structura nume C(15), valoarea_sC(3), valoarea_a C(3);stare2 (comenzi set pentru parametrii cu mai multe valori - set ... to; de exempludefault çi date) cu structura nume C(15), valoarea_s C(30), valoarea_a C(30);

unde valoarea_s este valoarea parametrului în sistemul Visual FoxPro, iar valoarea_a estevaloarea parametrului în aplicaÆie. ÎncårcaÆi iniÆial tabelul cu numele parameterilor pe caredoriÆi så-i modificaÆi (câmpul nume) çi cu valorile pe care doriÆi så le aibå în aplicaÆie.

Pentru salvarea configurårii sistemului, la începutul sesiunii de lucru veÆi folosi proceduraintrare:procedure intrare * se salveaza valorile parametrilor sistemului * se atribuie parametrilor valorile aplicatiei use stare1 scan

replace valoare_s with set(alltrim(stare1.nume)) alfa=alltrim(stare1.nume) beta=alltrim(stare1.valoare_a)

set &alfa &betaendscanuseuse stare2scanreplace valoare_s with set(alltrim(stare2.nume))

alfa=alltrim(stare2.nume) beta=alltrim(stare2.valoare_a)

set &alfa to &betaendscan

useendproc

Page 348: SGBD Visual Foxpro

Informatică348

Pentru restaurarea stårii sitemului, la sfârçitul sesiunii de lucru veÆi folosi procedura ieçire:procedure iesire * se restaureaza valorile parametrilor sistemului use stare1 scan

alfa=alltrim(stare1.nume)beta=alltrim(stare1.valoare_s)

set &alfa &beta endscan use use stare2 scan

alfa=alltrim(stare2.nume)beta=alltrim(stare2.valoare_s)

set &alfa to &beta endscan useendproc

5 . 2 . G e s t i o n a r e a c om p o n e n t e l o r u n e i a p li c a ţii

5.2.1. Proiectul aplicaÆieiLa realizarea unei aplicaÆii concurå mai multe componente: module de program - programs(programe independente care pot coÆine proceduri çi funcÆii sau subprograme organizate înfiçiere de proceduri), baze de date - Database, tabele libere - Free Tables, formulare -Forms, meniuri - Menus, rapoarte - Reports, interogåri - Queries, biblioteci de clase - ClassLibraries, fiçiere text - Text Files, alte tipuri de fiçiere - Other Files. Pentru a manipula uçorcomponentele aplicaiÆiei, ele pot fi organizate într-un proiect.

Proiectul (project) este o facilitate prin care proiectantul unei aplicaÆii poateÆine evidenÆa componentelor aplicaÆiei çi le poate administra. El este un fiçier

care conÆine o colecÆie de fiçiere cu structuri specifice sistemului care le-a creat.

Se recomandå ca înainte de a crea componentele unei aplicaÆii, så creaÆi proiectul çi så adåu-gaÆi la proiect fiecare nouå componentå. În acest mod evitaÆi så uitaÆi så includeÆi în proiectuna dintre componentele aplicaÆiei. Orice modificare a unei componente se va face îninteriorul proiectului. Propiectul se memoreazå într-un fiçier cu extensia .pjx. Acest fiçier arestructura unui tabel. Într-o înregistare se memoreazå informaÆii despre o componentå aproiectului. Practic proiectul nu conÆine componentele propriu-zise, ci informaÆii despre ele,cum este de exemplu locul în care se gåsesc pe disc.

Pentru construirea çi modificarea unui proiect, Visual FoxPro vå pune la dispoziÆie Gestio-narul de proiecte - Project Manager pe care îl lansaÆi în execuÆie pentru crearea saumodificarea unui proiect cu comanda:

create | modify project <nume_proiect>

5.2.2. Generarea aplicaÆiei çi a programului executabilProiectul conÆine douå categorii de componente:

Page 349: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 349

Componente care nu se modificå în timpul execuÆiei: programele, meniurile, ra-poartele, formularele etc.Componente care se modificå în timpul execuÆiei: bazele de date, tabelele etc.

AplicaÆia (application) este un fiçier care conÆine componetele unui proiectcare nu se modificå în timpul execuÆiei.

Fiçierul aplicaÆiei are extensia .app.

Pentru a crea o aplicaÆie trebuie parcurse urmåtoarele etape:a. Se creeazå proiectul aplicaÆiei. Nu se poate crea o aplicaÆie dacå nu aÆi

inclus componentele ei într-un proiect.b. Se stabileçte programul principal - Set Main. Orice aplicaÆie trebuie så aibå

un program principal. Programul principal este programul care se va executaatunci când se lanseazå în execuÆie aplicaÆia çi din care vor fi apelate celelaltecomponente ale aplicaÆiei: modulele de program, meniurile, formularele etc.

c. Se genereazå aplicaÆia.

AplicaÆia se lanseazå în execuÆie cu comanda:do <nume_aplicaÆie>.app

AplicaÆia este dependentå de mediul Visual FoxPro. Pentru a crea un program independentde acest mediu, acesta trebuie så fie un program executabil (fiçier cu extensia .exe) care seobÆine la fel ca o aplicaÆie, cu deosebirea cå în caseta Build Options se activeazå butonulBuild Executable.

Açadar, pentru a putea rula aplicaÆia pe care aÆi construit-o pe un calculator pe care nu esteinstalat Visual FoxPro aveÆi douå posibilitåÆi:

CreaÆi fiçierul aplicaÆiei (.app) çi îl distribuiÆi utilizatorului împreunå cu versiunea„pentru rulare” a sistemului Visual FoxPro care conÆine numai acele elemente careasigurå execuÆia programelor, nu çi modificarea lor.CreaÆi programul executabil al aplicaÆiei. Acesta nu are nevoie de varianta pentrurulare, ci îi sunt necesare numai bibliotecile de rulare (fiçiere care conÆin proceduri pentrurularea programelor).

AplicaÆia çi programul executabil trebuie transportate la destinaÆie (calculatorul utilizatorului)pe un suport de memorare (discuri flexibile sau CD). Pe acest suport va fi construit kitul deinstalare care va conÆine o imagine a structurii de directoare necesare executårii aplicaÆiei,directoarele în care se vor gåsi fiçierul executabil çi alte fiçiere necesare aplicaÆiei.

Pentru realizarea kitului de instalare folosiÆi procedura asistent a kitului de instalareSetup Wizard. Procedura creeazå pe hard discul calculatorului dumneavoastrå, în direc-torul precizat, o imagine a chitului de instalare. Dupå ce aÆi creat aceastå imagine, oveÆi copia pe suportul de memorare stabilit pentru destinaÆie în timpul procesului degenerare a kitului (dacå aÆi ales discul flexibil, veÆi copia conÆinutul fiecårui directorrezultat pe o dischetå). La destinaÆie veÆi instala aplicaÆia lansând în execuÆie programulsetup.exe care a fost creat, în cazul suportului de tip disc flexibil, pe primul disc.

Page 350: SGBD Visual Foxpro

Informatică350

CreaÆi un proiect

Proiectul va cuprinde meniul definit anterior menu_test, formularele care sunt activate deopÆiunile acestui meniu, çi cele douå fiçiere cu pictograme folosite în formularul caresimuleazå ceasul. La aceste componente trebuie så adåugaÆi programul monitor.

CreaÆi în rådåcina discului C directorul AplicaÆie. În acest director veÆi crea proiectul.LansaÆi în execuÆie generatorul de proiecte fie cu opÆiunea de meniu New...∈∈File (dincaseta de dialog New alegeÆi butonul radio Project çi executaÆi apoi clic pe butonul NewFile, dupå care în caseta de dialog Create alegeÆi directoul Aplicatie çi atribuiÆiproiectului numele Proiect), fie cu comanda:

create project \aplicatie\proiectSe deschide fereastra ProjectManager care este împårÆitå înmai multe secÆiuni, fiecaresecÆiune reprezentând o cate-gorie de componente: All - toa-te componentele, Date - com-ponentele care conÆin date(Database, Free Table, Que-ries), Documents - componen-tele utile pentru introducerea çiafiçarea datelor (formulareleForms çi rapoartele Reports),Class Libraries - bibliotecile declase, Code - componente careconÆin module de program(Pro-grams çi Applications) çiOther - alte componente (meni-urile Menus, fiçierele de texteText Files çi alte fiçiere OtherFiles). În zona de lucru a feres-trei vor fi afiçate componentelespecifice secÆiunii.

Cu ajutorul Gestionarului de proiecte puteÆi executa urmåtoarele operaÆii:Crearea unei componente noi (butonul New...). Se va deschide fereastra construc-torului corespunzåtor componentei selectate: Menu Designer - pentru meniuri, QueryDesigner - pentru interogåri, Report Designer - pentru rapoarte, Form Designer -pentru formulare ... çi fereastra de editare texte pentru Programs çi Files.Adåugarea unei componente la proiect (butonul Add...). Dacå obiectul a fostcreat în afara proiectului, dupå ce acÆionaÆi acest buton puteÆi så alegeÆi dintr-o liståcomponentele pe care doriÆi så le adåugaÆi la proiect.Editarea unei componente a proiectului (butonul Modify). SelectaÆi componentadin secÆiunea corespunzåtoare a fereastrei çi acÆionaÆi butonul. Se va deschidefereastra constructoului cu care aÆi creat componenta çi puteÆi så faceÆi modificårile.

Butonul de restrângere/expandare a ferestrei. În urmaoperaÆiei de restrângere fereastra va fi reduså la zona

etichetelor secÆiunilor çi va putea fi ancoratå la fel ca oricebarå de instrumente. Executând apoi clic pe o etichetå veÆi

expanda numai secÆiunea corespunzåtoare etichetei.

Page 351: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 351

Lansarea în execuÆie a unei componente a proiectului (butonul Run). SelectaÆicomponenta çi acÆionaÆi butonul. Va fi lansatå în execuÆie componenta (programul,interogarea, formularul etc.).Înlåturarea unei componente din proiect (butonul Remove...). SelectaÆi compo-nenta din secÆiunea corespunzåtoare a ferestrei çi acÆionaÆi butonul. În caseta dedilaog care se deschide, confirmaÆi dacå doriÆi numai înlåturarea componentei dinproiect (Remove) sau înlåturarea çi çtergerea ei de pe disc (Delete).Construirea proiectului (butonul Build...). Dupå ce apåsaÆi butonul, se va des-chide o casetå de dialog în care veÆi preciza ce veÆi construi (proiect, aplicaÆie,fiçier executabil sau veÆi recompila toate fiçierele).

DeschideÆi secÆiunea Documents în care veÆi adåuga la proiect formularele. SelectaÆiobiectul Form çi acÆionaÆi butonul Add.... Se deschide caseta de dialog Open în carecåutaÆi directorul în care se gåseçte formularul çi selectaÆi apoi primul formular apelat înmeniu. AcÆionaÆi apoi butonul Ok. VeÆi repeta aceastå operaÆie pentru fiecare formularcare va fi adåugat la proiect.DeschideÆi secÆiunea Other în care veÆi adåuga la proiect meniul çi fiçierele cu pictogramenecesare pentru simularea ceasului. SelectaÆi mai întâi obiectul Menus çi acÆionaÆi butonulAdd.... Se deschide caseta de dialog Open din care selectaÆi meniul menu_test çiacÆionaÆi apoi butonul Ok. SelectaÆi apoi obiectul Other Files çi acÆionaÆi butonul Add....Se deschide caseta de dialog Open din care selectaÆi primul fiçier cu pictogramå(Face01.ico) çi acÆionaÆi apoi butonul Ok. VeÆi repeta aceastå operaÆie çi pentru al doileafiçier cu pictogramå (Face01.ico).FaceÆi modificåri în meniu. SelectaÆi obiectul Menus çi îl dezvoltaÆi executând clic pe buto-nul +. În lista afiçatå selectaÆi meniul Menu_test çi apoi executaÆi clic pe butonulModify. Se deschide fereastra constructorului de meniuri. ExecutaÆi clic pe butonulEdit al meniului Terminare. În fereastra de editare a procedurii asociate titlului demeniu çtergeÆi instrucÆiunile:set sysmenu to defaultclear memory

çi adåugaÆi instrucÆiunea:clear events

ÎnchideÆi fereastra de editare.DeschideÆi secÆiunea code în care veÆi crea programul monitor. SelectaÆi obiectul Pro-grams çi acÆionaÆi butonul New.... Se deschide fereastra de editare. ScrieÆi în fereastra deeditare instrucÆiunile programului monitor çi apoi îl salvaÆi sub numele monitor.

* se salveaza configuratiasalv=set('talk')_screen.Caption = 'Test'_screen.BackColor=Rgb(120,120,120)* se stabileste noua configuratieset talk offnume_f = screen.Captionculoare_f=_screen.BackColor* se creeaza meniul

do menu_test.mpr* se activeaza procesorul de; evenimenteread events* se restaureaza configuratiaset talk &salv_screen.Caption=nume_f_screen.BackColor=culoare_fset sysmenu to default

Page 352: SGBD Visual Foxpro

Informatică352

Pentru a vizualiza conÆinutul proiectului, executaÆi clic pe butoanele + din faÆa numeluiobiectului:

AcÆionaÆi butonul Build.... În caseta de dialog BuildOptions activaÆi butonul Rebuild Project çi apoibutonul OK.

ÎnchideÆi fereastra aplicaÆiei executând clic pe bu-tonul de închidere.InformaÆiile proiectului sunt memorate sub formaunui tabel. DeschideÆi acest tabel cu comanda:

use \aplicatie\proiect.pjx.VizualizaÆi conÆinutul tabelului cu comandabrowse. IdentificaÆi semnificaÆia informaÆiilor me-morate în fiecare rând çi în fiecarea coloanå a tabelului. ÎnchideÆi fereastra de vizualizare.ÎnchideÆi tabelul cu comanda use.

CreaÆi o aplicaÆie

AplicaÆia o veÆi construi pornind de la proiectul construit anterior.

Page 353: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 353

DeschideÆi proiectul fie cu opÆiunea de meniu Open...∈∈File (din lista ascunså Files oftype alegeÆi Project, selectaÆi fiçierul Proiect din directoul AplicaÆie çi executaÆi apoi clicpe butonul Open), fie cu comanda:

modify project \aplicatie\proiectÎn secÆiunea Code a ferestrei Project Manager selectaÆi programul monitor care va fiprogramul principal. SelectaÆi apoi opÆiunea Set Main∈∈Project. Numele programuluiprincipal va fi scris cu stilul bold.Pentru a genera aplicaÆia, acÆionaÆi butonul Build... din fereastra Project Manager.Se deschide caseta de dialog Build Options în care din grupul de butoane radioAction activaÆi butonul Build Application. AcÆionaÆi apoi comutatorul OK çi înfereastra Save As scrieÆi numele aplicaÆiei: test.LansaÆi în execuÆie aplicaÆia cu comanda:

do \aplicatie\test.app. TestaÆi aplicaÆia.

CreaÆi kitul pentru distribuirea aplicaÆieiCreaÆi un director Test în care va fi creatå imaginea kitului de distribuÆie.DeschideÆi caseta de dialog a procedurii asistent alegând opÆiunea de meniu Setup∈∈Wizard∈∈Tools çi parcurgeÆi urmåtorii paçi (folosind butonul Next):

1. PrecizaÆi locul sursei kitului- Locate Files. Îl comunicaÆi în câmpul de editareDistribution files. Pentru a uçura cåutarea, executaÆi clic pe butonul .... Din listadeschiså alegeÆi directorul c:\aplicatie.

2. PrecizaÆi componentele speciale folosite de aplicaÆie - Specify Components.Componentele pe care le puteÆi preciza (activând comutatorul corespunzåtor) sunt:Visual FoxPro runtime - versiunea „pentru rulare” necesarå aplicaÆiilor (estenecesarå atunci când kitul conÆine o aplicaÆie), Microsoft Graph 5.0 runtime -versiunea „pentru rulare” a programului Microsoft Graph 5.0 (este necesarå atuncicând în programele kitului se creeazå grafice), OLE servers (este necesar atuncicând în programele kitului se foloseçte tehnologia OLE). ActivaÆi comutatorul VisualFoxPro runtime.

3. CreaÆi directorul cu imaginea kitului - Create Disk Image Directory. Proceduraasistent creeazå pe hard disc o imagine a kitului. Aceastå imagine poate fisegmentatå în grupuri de directoare, fiecare grup corespunzând unui disc flexibil dede 3.5 inch sau poate fi nesegmentatå. Modul pe care l-aÆi ales pentru memorareape hard disc va determina tipul suportului destinaÆie. AlegeÆi acest mod activând unuldintre comutatoarele din grupul Disk Image: 1.44 MB 3.5-inch (pentru discheta de3.5 inch) sau Netsetup (pentru CD). Locul în care va fi memoratå imaginea kitului îlveÆi comunica în caseta de text Disk Images Directory. Pentru exemplul nostru veÆialege varianta discurilor de 3.5 inch çi directorul pentru imagine va fi c:\Test.

4. PrecizaÆi opÆiunile la instalare - Specify Setup Option. Este obligatoriu såcomunicaÆi informaÆiile pentru caseta de text Setup dialog box caption (titlul afiçatde fereastra în care ruleazå kitul de instalare; scrieÆi de exemplu Instalare) çiCopyright information (date referitoare la drepturile de copyright ale aplicaÆiei;scrieÆi de exemplu Autor <nume>). Mai puteÆi completa caseta de text Post-setupexecutable cu numele unui program executabil care va fi lansat în execuÆie lasfârçitul instalårii kitului. PuteÆi folosi acest program pentru a vå proteja aplicaÆiaîmpotriva copierilor ilegale sau pentru a stabili configuraÆia specificå aplicaÆiei.

Page 354: SGBD Visual Foxpro

Informatică354

5. PrecizaÆi directorul implicit în care se va instala aplicaÆia la destinaÆie - SpecifyDefault Destination. Aceastå informaÆie o comunicaÆi în caseta de text DefaultDirectory. Este posibil ca acest director så fie schimbat la instalarea kitului prinprecizarea unui alt director de cåtre persoana care instaleazå aplicaÆia. ScrieÆi încaseta de text c:\produs. Mai puteÆi så scrieÆi în caseta de text Program Groupnumele grupului care va fi adåugat la meniul de start (implicit este Visual FoxProApplication). Din grupul de butoane radio User can modify puteÆi activa butonulDirectory and program group (utilizatorul poate modifica la instalare çi numeledirectorului în care va fi instalatå aplicaÆia çi numele grupului de programe) saubutonul Directory only (utilizatorul poate modifica la instalare numai numeledirectorului).

6. PrecizaÆi caracteristicile fiçierelor care compun aplicaÆia - Change File Setings.Se deschide tabelul în care sunt memorate datele referitoare la fiçierele incluse în kitulde instalare. Fiecare rând reprezintå un fiçier, iar fiecare coloanå o caracteristicå afiçie-rului. Titlurile coloanelor sunt: File - numele fiçierului, Target Dir - directorul încare va fi copiat fiçierul la destinaÆie (din lista ascunså puteÆi alege una dintre opÆiunile:AppDir - directorul aplicaÆiei, WinDir - directorul sistemului de operarea Windows,WinSysDir - directorul System al sistemului de operarea Windows), PM Item -activeazå programul Program Manager cu ajutorul cåruia puteÆi stabili proprietåÆisuplimentare ale fiçierului (de exemplu pictograma), ActiveX - activeazå instalareacontrolului de tip ActiveX la destinaÆie.

7. TerminaÆi procesul de creare al kitului. Pentru aceasta acÆionaÆi butonul Finish.Se va afiça caseta de dialog Setup Progress care vå informeazå despre modul încare decurge procesul de creare a kitului.

Dupå ce s-a terminat procesul de creare a imaginii kitului de distribuÆie, deschideÆidirectorul Test çi observaÆi cå el conÆine un director Disk144 (imagine pe disc flexibil) çi înacest director trei subdirectoare Disk1, Disk2 çi Disk3. Aceste directoare vor fi copiatefiecare pe câte un disc flexibil.

Page 355: SGBD Visual Foxpro

Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 355

Putem så teståm kitul de instalare pepropriul calculator. DeschideÆi directorulDisk1 çi lansaÆi în execuÆie programul

setup. VeÆi påstra ca director pentruaplicaÆie directorul stabilit în kit, aça cåveÆi acÆiona butonul Install all files forInstalare.

La terminarea procesului de insta-lare, pe calculatorul dumneavoastrå va fi creat undirector nou (Testare) çi în el vor fi scrise fiçierele aplicaÆiei. LansaÆi în execuÆie aplicaÆia.

CreaÆi un program monitor folosind tehnica programårii pe obiecteVeÆi deschide proiectul, veÆi modifica programul monitor, apoi veÆi crea aplica-Æia. Dupå ce aÆisalvat noua versiune a aplicaÆiei, veÆi genera kitul ei de instalare.Programul monitor în aceastå versiune va fi (crearea obiectului program monitor se va facepornind de la clasa Custom):* se creeaza un obiect program monitormonitor=CreateObject("clasa_m","menu_test")monitor.proc_evDefine class clasa_m as custom protected salv, nume_f, culoare_fprocedure init && Evenimentul init declansat de creare obiect pm

parameters meniuThis.salv=set('talk')This.nume_f= screen.Caption

This.culoare_f= screen.BackColor set talk off

_screen.Caption = 'Test' _screen.BackColor=Rgb(120,120,120)

nume_m=meniu+'.mpr' do &nume_mendproc

procedure proc_ev && Metoda activeaza procesorul de evenimente read events endproc procedure destroy && Evenimentul destroy declansat de terminarea; program monitor

val=This.salvset talk &val_screen.Caption=This.nume_f

Page 356: SGBD Visual Foxpro

Informatică356

screen.BackColor= This.culoare_f set sysmenu to default endprocenddefine

TT est pentru evaluare:

CreaÆi proiectul, aplicaÆia çi kitul de distribuÆie pentru sistemul de meniuri definit anterior,care este folosit de un profesor pentru a Æine evidenÆanotelor çi mediilor la disciplina Informaticå.

ÎncercaÆi:Adevårat/Fals:1. Se poate preciza cazul în care o opÆiune de meniu nu este disponibilå.2. În procedura Setup a meniului se dezactiveazå procesorul de evenimente.3. Într-o aplicaÆie Visual FoxPro puteÆi crea un meniu de comenzi rapide.4. Procedura Cleanup se executå înaintea procedurii Setup.5. Programul monitor se foloseçte pentru a administra proiectul.6. Proiectul este un program care, dacå este lansat în execuÆie, monitorizeazå aplicaÆia.7. AplicaÆia este independentå de mediul Visual FoxPro.

CompletaÆi:1. Mesajul informativ Message se afiçeazå .............................................................2. Unei opÆiuni de meniu puteÆi så-i asociaÆi un submeniu, o comandå sau..,....................3. Fiçierul în care se memoreazå tabelul cu structura meniului are extensia ..........4. CondiÆia prin care testaÆi disponibilitatea unei opÆiuni de meniu este precizatå prin .............5. Kitul de instalare conÆine programul ...................... care se foloseçte pentru instalarea

aplicaÆiei pe alt calculator.

AlegeÆi råspunsurile corecte:1. Pentru revenirea din meniul aplicaÆiei în meniul sistemului, trebuie så atribuiÆi cu comanda

set parametrului sysmenu valoarea :a) off b) automatic c) to default

2. Extensia fiçierului care conÆine meniul executabil este:a) mnx b) mnt c) mpr d) mpx

3. Extensia fiçierului care conÆine aplicaÆia este:a) prj b) api c) exe d) app

RR åspunsuri:Adevårat/Fals: 1-A; 2-F; 3-A; 4-F; 5-F; 6-F; 7-F.CompletaÆi: 1-bara de stare; 2-o procedurå; 3-.mnx; 4-Skip For ; 5-setup.exeAlegeÆi råspunsurile corecte: 1-c; 2- c; 3- d.


Top Related