curs foxpro

105

Click here to load reader

Upload: mustafaelgian1214

Post on 30-Jun-2015

1.045 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

1. INTRAREA ŞI IEŞIREA DIN FoxProW. MEDIUL FoxProW. ELEMENTE DE INTERFAŢĂ

Pentru a porni FoxProW sub Windows este necesar ca anterior să fi fost instalat atât sistemul Windows, cât şi FoxProW-ul sub acest sistem. Presupunând că aceste operaţii s-au executat, pornirea FoxProW-ului se poate face astfel:

- prin dublu clic pe icoana corespunzătoare acestuia din desk-top (vulpea), dacă aceasta există în desk-top;

- alegând Start, Programs, FoxProW for Windows, dacă icoana FoxProW-ului nu se află în desk-top.

Iniţial, fereastra asociată FoxProW-ului arată ca în figura de mai jos:

În partea superioară a acesteia, imediat sub titlu, se află meniul sistem al FoxProW-ului, prin care utilizatorul poate introduce comenzile sale în mod interactiv.

Fereastra de comenzi Command permite utilizatorului să introducă comenzi FoxProW în vederea execuţiei immediate. Aceată fereastră poate fi manipulată ca orice altă fereastră Windows.

Ecranul FoxProW reprezintă zona de afişare a informaţiilor, ca rezultat al comenzilor transmise de utilizator. Pentru a vedea tot ecranul, inclusiv porţiunea de sub fereastra de comenzi, se poate ascunde această fereastră, se poate transforma într-o icoană sau se poate închide, reafişarea sa realizându-se prin alegerea opţiunii Command din submeniul Window.

Alături de aceste trei elemente ale interfeţei FoxProW-ului, care sunt vizibile pe ecran imediat după pornirea acestui SGBD, comunicarea dintre utilizator şi sistem mai implică şi alte elemente, cum ar fi ferestrele sistem şi obiectele de control.

Ferestrele sistem sunt deschise de FoxProW ca urmare a unor comenzi ale utilizatorului. Ele pot conţine mesaje, obiecte de control şi chiar meniuri asociate şi sunt manipulate ca oricare altă fereastră Windows.

Comunicarea propriu-zisă dintre utilizator şi sistem se realizează prin intermediul obiectelor de control, care pot fi folosite la:

2

Page 2: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

introducerea de diferite texte, cu diferite semnificaţii (cum ar fi nume de fişiere, conţinutul unor câmpuri, diferite valori numerice etc.);

selectarea unor opţiuni din mai multe variante posibile; activarea sau dezactivarea unor comutatoare, opţiuni;

Obiectele de control sunt de următoarele tipuri: câmpuri, regiuni, zone de editare, însoţite eventual de butoane de incrementare/decre-

mentare (pentru câmpurile numerice); liste; liste ascunse; comutatoare; declanşatoare; butoane radio.

Pentru exemplificarea modului de lucru cu obiectele de control ale interfeţei FoxProW, vom folosi două ferestre sistem, fereastra Open şi fereastra New, afişate pe ecran ca urmare a alegerii opţiunilor Open şi respectiv New din submeniul File.

Fereastra Open este folosită pentru specificarea numelui unui fişier ce urmează a fi deschis. Ea conţine următoarele obiecte de control: un câmp de editare, File Name, în care poate fi introdus, caracter cu caracter, de la

tastatură, numele fişierului ce urmează a fi deschis; două liste, una sub câmpul de editare, iar cealaltă în partea dreaptă a ferestrei (numită

Directory), care permit selectarea unui fişier şi respectiv a unui director dintr-o mulţime finită, afişată total sau parţial pe ecran;

3

Page 3: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

două liste ascunse, numite List Files of Type şi Drive, prin intermediul cărora se permite selectarea tipului de fişiere, respectiv a unităţii de disc; diferenţa dintre listele simple şi cele ascunse este aceea că la cele de al doilea tip, în starea neselectat, este afişat pe ecran doar elementul curent, restul listei fiind afişat numai la trecerea în starea selectat, când se alege un alt element; în cazul listelor simple starea neselectat şi cea selectat nu diferă din punctul de vedere al numărului de elemente afişate pe ecran la un moment dat;

patru comutatoare, numite All Files, Read Only, Environment şi Exclusive fiecare dintre acestea indicând prezenţa sau absenţa unei anumite proprietăţi, simbolizată prin numele comutatorului respectiv; prezenţa proprietăţii este indicată printr-un X în interiorul pătrăţelului asociat comutatorului (starea activat), iar în lipsa acesteia pătrăţelul va fi gol (starea dezactivat);

trei declanşatoare, New, Open şi Cancel, în partea dreaptă a ferestrei. a căror acţionare determină declanşarea unor anumite operaţii, sugerate prin numele fiecăruia în parte.

Fereastra New, folosită în scopul creării unui nou fişier, de un anumit tip, conţine următoarele obiecte de control: un grup de butoane radio, numit File Type, a căror principală caracteristică este aceea

că permite selectarea unei anumite variante din mai multe posibile; activarea unuia dintre butoanele radio ale unui grup determină dezactivarea vechiului buton radio activat;

două declanşatoare, numite New şi Cancel.

Editorul de texteApare adeseori necesitatea introducerii sau modificării conţinutului unui fişier pe

disc, în acest scop folosindu-se editorul de texte încorporat FoxProW-ului. Textul se introduce caracter cu caracter, de la tastatură, la sfârşitul fiecărei linii tastându-se Enter.

Pentru mutarea cursorului în cadrul ferestrei de editare se folosesc tastele sau combinaţiile de taste următoare:

Tasta sau combinaţia de taste Efectul Un caracter la dreapta Un caracter la stânga O linie în sus O linie în josPage Up O pagină de text în susPage Down O pagină de text în josHome La începutul linieiEnd La sfârşitul linieiCtrl + Un cuvânt la dreaptaCtrl + Un cuvânt la stângaCtrl + Home La începutul textuluiCtrl + End La sfârşitul textului

Poziţionarea cursorului pe o anumită linie se poate face şi prin intermediul opţiunii Goto Line, la alegerea căreia este deschisă o fereastră:

în care se va specifica numărul liniei pe care se va poziţiona cursorul (prin intermediul câmpului de editare Line Number şi a declanşatorului Goto).

4

Page 4: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

O facilitate importantă a editorului FoxProW este posibilitatea lucrului cu blocuri de text. Astfel, o porţiune de text poate fi tratată ca un tot unitar, adică poate fi înlocuită, copiată, mutată, ştearsă prin combinaţii simple de taste.

Selectarea textului ce alcătuieşte blocul se face cu ajutorul tastaturii, ţinând apăsată tasta Shift şi deplasând cursorul în altă poziţie. Selectarea textului cu ajutorul mouse-ului se face prin deplasarea cursorului acestuia peste textul de selectat, menţinând butonul stâng apăsat. Pentru selectarea în întregime a textului dintr-o fereastră de editare se poate folosi opţiunea Select All din meniul Edit.

Ştergerea unei porţiuni de text se face prin: Backspace, şterge caracterul imediat din stânga cursorului; Delete, şterge caracterul imediat din dreapta cursorului; Dacă există text selectat, la acţionarea uneia din tastele de mai sus, se va şterge acest

text; Ctrl + Backspace, şterge cuvântul deasupra căruia se află cursorul.

Selectarea unei porţiuni de text urmată de alegerea opţiunii Clear din submeniul Edit, determină, de asemenea, ştergerea textului selectat.

Există, de asemenea, posibilitatea copierii sau mutării unei porţiuni de text în altă poziţie prin folosirea opţiunilor Cut, Copy şi Paste ale submeniului Edit.

Pentru găsirea automată a unui cuvânt, propoziţie, frază, în cadrul textului editat şi, eventual, înlocuirea sa cu o altă secvenţă de text, se folosesc opţiunile Find, Find Again, Replace and Find Again şi Replace All ale submeniului Edit. Căutarea unei secvenţe de text în cadrul textului aflat în editare se realizează astfel: se alege opţiunea Find din submeniul Edit, deschizându-se fereastra cu acelaşi nume:

în câmpul de editare Look For se introduce secvenţa de text ce urmează a ficăutată în textul sursă;

declanşatoarele din secţiunea Options au următoarele semnificaţii:Ignore Case: în cazul selectării acestuia, nu se mai face deosebirea între literele mari şi mici în timpul căutării;Match Whole Word: la activare, determină căutarea cuvintelor independente, nu şi pe cele care intră în componenţa unor cuvinte compuse;Wrap Around: după ce căutarea ajunge la sfârşitul fişierului editat, se trece automat la parcurgerea textului de la început, până la poziţia curentă a cursorului;

acţionarea declanşatorului Find determină căutarea textului specificat şi selectarea acestuia în cazul în care este găsit.

2. BAZE DE DATE. MENIURI

5

Page 5: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

2.1 Modul de lucru cu bazele de date. Operaţii. Exemplu de manipulare a bazelor de date prin intermediul meniului sistem

Bazele de date reprezintă acumulări de date, referitoare la un anumit subiect, cu o anumită organizare, în vederea obţinerii operative a unor informaţii utile despre subiectul respectiv.

În mare, mecanismul de manipulare a bazelor de date în FoxProW, este următorul: înainte de folosirea unei baze de date, aceasta trebuie creată pe dispozitivul de

memorare extern (disc magnetic). Crearea unei baze de date presupune atât crearea fişierului care va memora datele, cât şi specificarea unor parametri referitori la organizarea bazei, adică a structurii acesteia. Operaţia de creare a unei baze de date se realizează o singură dată, înainte de prima utilizare;

prima operaţie în lucrul cu o bază de date creată anterior este deschiderea ei; după ce baza de date a fost deschisă, urmează efectuarea diferitelor operaţii asupra

datelor memorate în baza de date sau asupra bazei de date în ansamblul ei; în final, baza de date se închide.

Operaţiile care se pot efectua asupra datelor dintr-o bază de date, distingem: adăugarea de noi date la baza de date; modificarea sau ştergerea unor date introduse anterior; consultarea bazei de date, adică extragerea unor informaţii, pe baza datelor memorate

în bazele de date; reorganizarea bazei de date, din punctul de vedere al structurii acesteia, al ordinii

datelor memorate etc.Toate aceste operaţii asupra bazelor de date se execută la comanda utilizatorului.

Comenzile pot fi date fie prin intermediul meniului sistem al FoxProW, fie folosind comenzile şi funcţiile limbajului de programare.

2.2 Crearea bazelor de date. Structura bazelor de datePentru a putea fi utilizată, o bază de date trebuie mai întâi creată pe suportul de

memorare extern. Această operaţie presupune crearea fişierului care va memora baza de date şi introducerea în acesta a unor informaţii specifice bazei, cum ar fi structură, număr de înregistrări,lungimea unei înregistrări etc.

Pentru exemplificare, vom crea o bază de date în care se va ţine evidenţa stocurilor de materiale dintr-un depozit. Fiecare înregistrare a bazei de date va avea următorul conţinut: cod material, denumire, cantitate, unitate de măsură, valoare, data ultimei intrări/ieşiri, necesită condiţii speciale de depozitare, informaţii suplimentare.

Pentru a crea această bază de date se alege opţiunea New a submeniului File, aceasta determinând deschiderea ferestrei cu acelaşi nume. Din grupul de butoane radio din partea stângă se selectează butonul radio Table/DBF, indicând că fişierul care se va crea va fi o bază de date (se mai puteau crea programe, fişiere ASCII, fişiere index, rapoarte, etichete, ecrane, meniuri, filtre, proiecte, folosind restul de butoane radio ale grupului). Urmează acţionarea butonului New, operaţie care va determina deschiderea unei noi ferestre, Table Structure

Înainte de prezentarea modului de lucru cu această fereastră, să stabilim structura exactă a bazei de date, adică denumirea câmpurilor, tipul lor, lungimea şi, acolo unde este cazul, numărul de zecimale.

Denumire câmp Tip câmp Lungime Zecimalecod Character 8

6

Page 6: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

denumire Character 30cantitate Numeric 10 2unit_mas Character 3valoare Numeric 10 2ultim_misc Date 8cond_spec Logical 1informatii Memo 10

Această structură stabilită pentru baza de date pe care o vom denumi MATERIAL.DBF, va fi introdusă în fereastra de specificare a structurii bazei de date, Table Structure:

Semnificaţia celor şase coloane care apar în această listă este următoarea: prima coloană, care nu poartă nici-un nume, este folosită la schimbarea ordinii de

apariţie a câmpurilor în baza de date; pentru mutarea unui câmp în altă poziţie se acţionează butonul din această coloană şi, cu butonul stâng al mouse-ului apăsat, se mută câmpul odată cu cursorul în noua poziţie, după care se eliberează butonul mouse-ului; prin intermediul tastaturii, aceeaşi operaţie se realizează cu ajutorul combinaţiilor Ctrl + şi Ctrl + ;

cea de-a doua coloană, Tag, se foloseşte la stabilirea unor criterii de ordonare a datelor din baza de date;

în cea de-a treia coloană, Name, se specifică denumirea câmpurilor bazei de date (cod, denumire, cantitate,…);

a patra coloană, Type, este utilizată la specificarea tipului fiecărui câmp în parte; ea conţine liste ascunse cu următoarele elemente:

Character - şir de caractereNumeric - numericFloat - numericDate - dată calendaristicăLogical - logic, booleanăMemo - memoGeneral - generalPicture - imagine

coloana a cincea, Width, va indica lungimea câmpurilor, în caractere; se poate folosi atât ca un câmp de editare (deci se poate tasta un număr în ea), cât şi prin intermediul butoanelor de incrementare/decrementare; lungimea câmpurilor numerice include şi punctul zecimal în numărul caracterelor; unele tipuri de câmpuri au lungimi predefinite: Date (8 caractere), Logical (1 caracter), Memo (10 caractere), General (10 caractere);

coloana Dec se foloseşte în cazul câmpurilor numerice pentru a preciza numărul de 7

Page 7: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

zecimale.În secţiune Field există două declanşatoare: Insert – inserează un nou câm

deasupra câmpului curent şi Delete – şterge câmpul curent.După terminarea lucrului în această fereastră se acţionează butonul OK pentru

continuare sau Cancel pentru renunţarea la operaţia de creare a bazei de date.Dacă a fost acţionat butonul OK, se va deschide fereastra Save As în care se vor

indica numele fişierului în care se va depune această bază de date (MATERIAL.DBF), directorul în care se va găsi acest fişier şi discul pe care se va afla.

2.3 Deschiderea şi închiderea bazelor de date. Zone de lucruPentru rezolvarea unor probleme simple, care nu lucrează decât cu o singură bază

de date, deschiderea acesteia se realizează astfel: se alege opţiunea Open a submeniului File pentru deschiderea ferestrei cu acelaşi

nume, în care se va specifica numele bazei de date care se deschide; numele bazei de date care se deschide se poate introduce manual în câmpul de

editare File Name, sau se poate selecta din lista afişată sub acest câmp; în această listă sunt afişate toate fişierele din directorul selectat prin lista Directory, de pe discul specificat prin lista ascunsă Drive:, de tipul dat de elementul selectat din lista ascunsă List Files of Type:;

după specificarea numelui se acţionează declanşatorul Open pentru deschiderea bazei de date respective;

acţionarea declanşatorului New determină pornirea operaţiei de creare a unei baze de date cu numele specificat (care nu trebuie să existe anterior pe disc).

Controlul zonelor de lucru şi al bazelor de date deschise în acestea se realizează în FoxProW prin fereastra View, în modul de lucru View, fereastră deschisă la alegerea opţiunii View a submeniului Window:

Selectarea modului de lucru View al acestei ferestre se realizează prin acţionarea primului buton, de sus în jos, din grupul de patru cinci butoane din partea stângă-sus a ferestrei. Celelalte patru butoane corespund diferitelor grupuri de opţiuni ale mediului FowProW ce sunt controlate prin intermediul acestei ferestre.

Lista Work Areas (zone de lucru) conţine ca elemente cele 255 zone de lucru, una singură dintre acestea fiind accesibilă la un moment dat, cea care este selectată curent în această listă şi care se numeşte “zona de lucru curentă”.

Pentru a deschide o bază de date în zona de lucru curentă se acţionează declanşatorul Open care permite deschiderea ferestrei cu acelaşi nume. În această fereastră se alege baza de date care urmează a fi deschisă. Următoarele baze de date care se doresc a fi deschise trebuie să folosească alte zone de lucru. Deci, pentru a deschide încă o bază de date se schimbă mai întâi zona de lucru curentă, prin alegerea

8

Page 8: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

acesteia din lista Work Areas, după care se procedează ca la prima bază de date.Odată cu deschiderea unei baze de date într-o zonă de lucru, acesteia i se atribuie

un nume simbolic, numit “alias”, folosit la referirea bazei de date respective. La deschidere, alias-ul bazei de date este afişat în lista Work Areas, în locul numărului care indică zona de lucru. De obicei, alias-ul este chiar numele bazei de date (al fişierului asociat acesteia, fără extensie).

La crearea unei baze de date, aceasta este automat deschisă în zona de lucru curentă.

După deschiderea bazei de date în zona de lucru dorită, fereastra View poate fi închisă ca oricare altă fereastră Windows.

După terminarea lucrului cu o bază de date, aceasta trebuie închisă. Pentru aceasta se alege opţiunea View a submeniului Window. Mai întâi se selectează zona de lucru care conţine baza de date, după care se acţionează declanşatorul Close. Închiderea bazei de date presupune eliberarea zonei de lucru în care a fost deschisă aceasta.

2.4 Adăugarea de noi date într-o bază de dateLucrul cu datele din bazele de date se face la nivel de înregistrare, aceasta

însemnând că nu putem adăuga, modifica sau şterge decât câte o înregistrare completă, la un moment dat.

Adăugarea de înregistrări la o bază de date este o operaţie curentă, ea realizându-se ori de câte ori se încarcă noi date în aceasta. Mai întâi trebuie deschisă baza de date la care se adaugă noi înregistrări, după care se procedează astfel: se alege opţiunea Append a submeniului Record, pe ecran fiind deschisă o fereastră

de adăugare; câmpurile sunt puse unele sub altele, iar înregistrările, de asemenea unele sub altele,

fiind separate printr-o linie punctată; se completează fiecare câmp în parte, înregistrare după înregistrare; completarea

câmpurilor memo (de exemplu informatii din baza de date MATERIAL.DBF) se face în ferestre distincte deschise prin acţionarea combinaţiei Ctrl + Page Down şi închise, după introducerea întregului conţinut, cu ajutorul combinaţiei Ctrl + Enter; câmpurile logice se completează cu “F” pentru fals şi “T” pentru adevărat;

după completarea ultimului câmp al ultimei înregistrări care se doreşte a fi adăugată la baza de date, se acţionează combinaţia Ctrl + End care închide fereastra de adăugare şi salvează noile înregistrări adăugate sau se închide simplu fereastra de adăugare ca oricare altă fereastră Windows.

2.5 Modificarea şi vizualizarea conţinutului unei baze de date. Fereastra Browse

Odată introduse date într-o bază de date, acestea pot fi vizualizate şi modificate. Pentru aceasta se alege opţiunea Browse a submeniului Database, deschizându-se o fereastră în care va fi afişat spre modificare conţinutul bazei de date, sub formă de tabel: câmpurile sunt coloane, iar înregistrările sunt linii.

Deplasarea din câmp în câmp se face cu ajutorul tastelor Tab (la dreapta) şi Shift + Tab (la stânga), iar din înregistrare în înregistrare, folosind tastele şi .

Odată deschisă fereastra Browse, la meniul sistem al FoxProW este adăugat un nou submeniu (numit de asemenea Browse) prin care se pot efectua diferite operaţii din

9

Page 9: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

această fereastră cum ar fi: schimbarea modului de afişare a cămpurilor (unul lângă altul sau unul sub altul); afişarea sau inhibarea afişării liniilor despărţitoare dintre câmpuri şi înregistrari; schimbarea dimensiunilor de afişare a câmpurilor, a ordinii de afişare a acestora; schimbarea fontului de afişare a textului în fereastra Browse etc.

La deschiderea ferestrei Browse pentru modificarea sau vizualizarea conţinutului unei baze de date, câmpurile sunt afişate unele lângă altele, iar înregistrările unele sub altele. Acest mod de afişare, sub forma unui tabel, se numeşte mod Browse. Un alt mod de afişare este cel numit Change, în care atât înregistrările cât şi câmpurile sunt afişate unele sub altele. Trecerea de la un mod de afişare la altul se face prin alegerea opţiunii Change şi, respectiv Browse din submeniul Browse al meniului sistem.

Afişarea sau inhibarea afişarii liniilor separatoare ale câmpurilor şi înregistrărilor în cadrul ferestrei Browse se face prin intermediul opţiunii Grid a submeniului Browse.

Modul de afişare în interiorul ferestrei Browse este stabilit în fereastra Font deschisă la alegerea opţiunii Font a submeniului Browse. În această fereastră pot fi modificate fontul folosit, stilul şi dimensiunea acestuia.

Închiderea ferestrei Browse se realizează fie prin combinaţia Ctrl + End, fie prin metode specifice ferestrelor platformei grafice Windows.

Modificarea automată a conţinutului unei baze de datePe lângă modificarea manuală a conţinutului unei baze de date, există posibilitatea

modificării valorilor anumitor câmpuri, calculate automat de FoxProW pe baza unor expresii furnizate de utilizator. Vor fi modificate doar acele înregistrări selectate de sistem pe baza unui set de condiţii stabilite de utilizator.

Pentru aceasta, se alege opţiunea Replace a submeniului Record pentru a fi deschisă fereastra cu acelaşi nume. În partea stăn-gă sus se află o listă din care se va alege câmpul care se modifică, din baza de date specificată prin lista ascunsă From Table. Comutatoarele Scope, For şi While permit stabilirea înregistrărilor afectate de această comandă. Valorile care vor fi introduse în câmpul selectat vor fi precizate prin intermediul declanşatorului With… sau prin câmpul de editare din dreapta acestuia.

Stabilirea înregistrărilor de modificatExistă multe comenzi FoxProW care acţio-

nează asupra mai multor înregistrări ale bazelor de date, stabilirea acestora făcându-se pe baza clauzelor Scope (domeniu), For (pentru…) şi While (atâta timp cât…).

Fereastra Scope, deschisă la activarea comutatorului cu acelaşi nume, permite specificarea domeniului înregistrărilor care vor fi modificate astfel: toate înregistrările, la selectarea butonului All; următoarele n înregistrări, inclusiv cea curentă, când se selectează butonul radio Next

(n fiind introdus în câmpul de editare din dreapta acestui buton radio); înregistrarea cu numărul n, în cazul selectării butonului radio Record (n precizat în

câmpul de editare alăturat butonului radio); restul de înregistrări, de la cea curentă inclusiv şi până la ultima, la selectarea

butonului radio Rest.Dintre înregistrările selectate prin clauza Scope vor fi afectate numai acelea care

respectă condiţiile clauzelor For şi While. Deci clauzele Scope, For şi While acţionează cumulativ, fiecare împunându-şi propriile restricţii la selectarea înregistrărilor.

10

Page 10: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Condiţia clauzei For va fi specificată cu ajutorul Constructorului de expresii pornit la activarea comutatorului For. Vor fi selectate acele înregistrări pentru care expresia clauzei este evaluată la adevărat (.T.).

Clauza While are de asemenea asociată o expresie logică. Vor fi selectate înregistrări din baza de date atâta timp cât condiţia clauzei este îndeplinită (expresia logică are valoarea adevărat). Prima înregistrare care nu mai respectă această condiţie determină oprirea procesului de selectare, următoarele înregistrări ale bazei de date nefiind selectate, indiferent de valoarea expresiei logice asociate clauzei.

Constructorul de expresiiPentru alcătuirea expresiilor logice asociate clauzelor For şi While, cât şi a altor

expresii FoxProW (de orice tip), se poate folosi un utilitar încorporat al mediului, numit Constructorul de expresii (Expression Builder).

Deschiderea ferestrei Expression Builder, asociată acestui utilitar, se face prin activarea comutatoarelor For şi While, în cazul expresiilor logice asociate clauzelor cu aceleaşi nume, sau prin activarea altor obiecte de control.

Expresia construită va fi introdusă în regiunea de editare Expression (sau For Clause, sau While Clause etc.), fie manual de către utilizator (caracter cu caracter), fie asistat de FoxProW prin intermediul celorlalte obiecte de control ale ferestrei. Listele ascunse String, Math, Logical şi Date conţin funcţii FoxProW de tip şir de caractere, numeric, logic şi respectiv dată calendaristică. Alegerea unei funcţii din aceste liste determină introducerea automată în regiunea de editare Expression, la poziţia curentă a cursorului, a funcţiei respective (în forma de prezentare a sintaxei funcţiei respective). Acelaşi mod de lucru se foloseşte în cazul listei Fields, din care se aleg câmpuri ale bazei de date specificate prin lista ascunsă From Table şi în cazul listei Variables, din care se aleg variabile folosite în expresie.

Acţionarea declanşatorului Verify determină testarea corectitudinii expresiei specificate şi afişarea unui mesaj de eroare în cazul când expresia respectivă nu este corectă.

Exemplu: condiţia:SUBSTR (material.cod, 1, 1) == “A”

se introduce astfel: se deschide fereastra Expression Builder prin activarea comutatorului For;

din lista ascunsă String se alege SUBSTR (,,);

11

Page 11: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

din lista Fields se alege câmpul cod (material.cod) (baza de date MATERIAL.DBF a fost deschisă anterior şi a fost selectată din lista ascunsă From Table);

se completează cu 1 celelalte poziţii ale funcţiei SUBSTR(,,), după care se mută cursorul la sfârşitul liniei:

SUBSTR (material.cod, 1, 1) se alege operatorul == din lista ascunsă Logical; se alege elementul “text” din lista ascunsă String şi între ghilimele se introduce

caracterul “A”:SUBSTR (material.cod, 1, 1) == “A”

se acţionează declanşatorul Verify pentru verificare şi apoi OK pentru acceptarea expresiei.

Exemplu: modificarea automată a conţinutului bazei de date.Având baza de date MATERIAL.DBF deschisă în zona de lucru curentă, să se

dubleze cantitatea de bere (cod: “bere”) de orice tip: se alege opţiunea Replace a submeniului Record pentru deschiderea ferestrei

asociate acesteia; se stabilesc condiţiile de selecţie a înregistrărilor:

Scope: AllFor: SUBSTR (material.cod, 1, 4) == “bere”

While: - se alege câmpul de modificat “cantitate” din lista ferestrei Replace; cu ajutorul Constructorului de expresii pornit la acţionarea declanşatorului With… se

introduce expresia de calcul al noilor cantităţi:material.cantitate*2

se acţionează declanşatorul Replace.

2.6 Ştergerea datelor din bazele de date. Accesul la datele din bazele de dateCa şi celelalte tipuri de prelucrări aplicate asupra datelor din bazele de date şi

ştergerea lucrează tot la nivel de înregistrare. În FoxProW există două tipuri de ştergere: ştergerea logică – prin care înregistrările nu sunt şterse propriu-zis din bazele de date, ci sunt doar marcate pentru ştergere (se poziţionează câte un indicator pentru fiecare înregistrare ştearsă din baza de date). Comenzile FoxProW care lucrează cu înregistrările din baza de date, înainte de prelucrarea unei înregistrări, testează marcatorul de ştergere al acesteia şi, dacă acesta este poziţionat, consideră că înregistrarea nu există în baza de date respectivă; ştergerea fizică – prin acest tip de ştergere înregistrările dispărând fizic din baza de date, fără posibilitatea de refacere.

Datorită faptului că ştergerea logică nu elimină fizic înregistrările, ci doar le ascunde prin poziţionarea marcatorului de ştergere, există posibilitatea de refacere a înregistrărilor şterse logic din baza de date, prin înlăturarea marcatorului de ştergere al acestora. Această operaţie poartă numele de “refacere” sau “rechemare” (“recall” în limba engleză).

Un alt tip de ştergere logică a unor baze din bazele de date se poate realiza la nivel de câmpuri. Această tehnică, numită “accesare a câmpurilor”, stabileşte o listă de câmpuri ale bazei de date care vor putea fi accesate prin comenzile şi funcţiile FoxProW, restul de câmpuri care nu aparţin acestei liste fiind invizibile pentru utilizator (ca şi când nu ar exista).

Pe lângă aceste două tipuri de ştergeri, la nivel de înregistrare (logică şi fizică) şi la nivel de câmpuri, FoxProW mai permite un al treilea mod de ştergere a unor înregistrări, de asemenea logică, în funcţie de respectarea unei condiţii dinainte stabilite. Această tehnică, numită filtrare”, va permite accesul numai la înregistrările care respectă condiţia dată, restul neapărând în baza de date respectivă.

Ştergerea logică a înregistrărilor se realizează prin intermediul ferestrei Delete care se deschide la alegerea opţiunii Delete a submeniului Record. În această fereastră se

12

Page 12: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

specifică înregistrările care vor fi şterse prin clauzele Scope, For şi While după care se acţionează declanşatorul Delete. Operaţia se referă la baza de date curentă.

Ştergerea fizică a unor înregistrări de baze de date se realizeaă în două etape: se marchează pentru ştergere (se şterg logic) înregistrările dorite; se comandă ştergerea fizică a înregistrărilor marcate anterior prin alegerea opţiunii

Pack a submeniului Database. Atenţie: odată şterse fizic, înregistrările nu mai pot fi refăcute. La comanda Pack se şterg fizic toate înregistrările şterse logic. Deci, înainte de marcarea logică a înregistrărilor de şters, trebuie avut grijă să nu mai existe alte înregistrări şterse logic într-o etapă anterioară.

Rechemarea înregistrărilor marcate anterior pentru ştergere (deci a celor şterse logic) poate fi obţinută astfel: se alege opţiunea Recall a submeniului Record pentru deschiderea ferestrei Recall; se specifică condiţiile de selecţie a înregistrărilor de rechemat cu ajutorul clauzelor

Scope, For şi While; se acţionează declanşatorul Recall.

Condiţiile de accesare a câmpurilor bazei de date active, adică lista de câmpuri active şi inactive ale bazei de date, se stabilesc după cum urmează: se deschide fereastra Setup prin alegerea opţiunii cu acelaşi nume a submeniului

Database; se acţionează declanşatorul Fields pentru deschiderea ferestrei Field Picker; din lista All Fields se selectează câmpurile active care vor fi transferate în lista

Selected Fields prin acţionarea declanşatorului Move; trecerea în sens invers din lista Selected Fields în lista All Fields este echivalentă cu

eliminarea câmpurilor respective din lista de câmpuri active şi se realizează cu ajutorul declanşatorului Remove;

declanşatoarele All şi Remove All au aceeaşi semnificaţie cu Move şi Remove, cu deosebirea că se referă la toate câmpurile, nu numai la cel selectat;

se acţionează declanşatorul OK pentru revenirea în fereastra Setup, care se închide prin acţionarea declanşatorului OK.

Cel de-al treilea tip de ştergere/accesare a datelor dintr-o bază de date, filtrarea înregistrărilor, se realizează asemănător cu filtrarea/accesarea câmpurilor, cu deosebirea că în fereastra Setup se va acţiona declanşatorul Filter Data în locul lui Fields. Va fi pornit Constructorul de expresii în vederea specificării expresiei de filtrare.

Exemplu: pentru a permite accesul doar la materialele care au o valoare mai mare de 100000 se va introduce următoarea condiţie de filtrare:

material.valoare > 100000

2.7 Deplasarea în bazele de date. Căutări secvenţialeAccesul la datele memorate în bazele de date se face la nivel de înregistrare, la un

moment dat putând fi prelucrată numai o înregistrare, cea curentă. Odată cu deschiderea unei baze de date, acesteia i se acordă o locaţie de memorie în care este memorat numărul înregistrării curente, locaţie care este numită “indicator de înregistrări”. Schimbarea înregistrării curente este echivalentă cu modificarea indicatorului de înregistrări, operaţie care poartă numele de “deplasare în baza de date”.

Există două tipuri de deplasări într-o bază de date: unul în care numărul înregistrării curente se calculează prin evaluarea unei expresii

numerice furnizate de utilizator (comenzile GOTO şi SKIP); altul în care selectarea înregistrării curente se face în funcţie de o expresie logică

(condiţie) furnizată de utilizator )curentă va fi prima înregistrare care respectă condiţia impusă).

Primul din aceste tipuri are de asemenea două variante: una în care numărul înregistrării curente este absolut, el calculându-se faţă de

începutul bazei de date (comanda GOTO);13

Page 13: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

alta, în care calculul noului număr al înregistrării curente se face relativ la cel vechi, adică se realizează o deplasare relativă la poziţia curentă a indicatorului de înregistrări (comanda SKIP).

Deplasarea absolută în baza de date se realizează cu ajutorul opţiunii Goto a submeniului Record. Alegerea acestei opţiuni determină deschiderea ferestrei Goto, în care: selectarea butonului radio Top determină poziţionarea indicatorului de înregistrări la

începutul bazei de date (pe prima înregistrare); butonul radio Bottom, opus lui Top, deplasează indicatorul de înregistrări pe ultima

înregistrare a bazei de date; butonul radio Record este folosit la poziţionarea indicatorului de înregistrări pe

înregistrarea cu numărul n, unde n este introdus în câmpul de editare din dreapta butonului radio.

În aceeaşi fereastră se găseşte şi butonul radio Skip, prin selectarea căruia indicatorul avansează cu n înregistrări, relativ la cea curentă, unde n este precizat în câmpul de editare alăturat butonului radio.

Exemple:deplasare pe prima înregistrare: Goto Top sau Goto 1deplasare pe ultima înregistrare: Goto Bottomdeplasare pe înregistrarea 6: Goto 6 sau Goto 2*3deplasarea pe următoarea înregistrare: Skip sau Skip 1deplasarea pe înregistrarea anterioară: Skip –1Un alt mod de a calcula numărul înregistrării curente este dat de căutarea

secvenţială (comenzile LOCATE şi CONTINUE). În acest caz indicatorul de înregistrări va fi poziţionat automat pe prima înregistrare care respectă o condiţie impusă anterior de utilizator.

Alegerea opţiunii Locate din submeniul Record deschide fereastra cu acelaşi nume, în care va fi precizată condiţia de testat şi condiţiile de selecţie a înregistrărilor care vor fi testate (clauzele Scope, For şi While).

Indicatorul de înregistrări va fi poziţionat pe prima înregistrare a bazei de date care respectă condiţia impusă. Dacă în baza de date există mai multe înregistrări pentru care expresia logică este adevărată, ele vor fi găsite prin opţiunea Continue a submeniului Record (la fiecare alegere indicatorul de înregistrări va fi poziţionat pe prima înregistrare care respectă condiţiile impuse prin ultima comandă Locate).

Exemplu: pentru a găsi primele 5 materiale mai scumpe decât 1500 lei/buc se vor specifica condiţiile:

Locate - Scope: All- For: Material.valoare > 1500- While -

ContinueContinueContinueContinueComenzile Locate şi Continue pot fi date şi direct din fereastra Browse.2.8 Calcule statistice cu datele din bazele de dateToate prelucrările efectuate asupra datelor din bazele de date (introducer,

modificare, vizualizare, ştergere etc.) au fost făcute cu scopul de a putea obţine pe baza lor diferite informaţii, liste, rapoarte, necesare utilizatorului în activitatea curentă. Calculele statistice care vor fi efectuate cu datele din bazele de date sunt de tipul: medii aritmetice, însumări de expresii, calcul de minime şi maxime, calcul de număr de elemente care respectă o anumită condiţie etc., acestea fiind prezentate în continuare.

14

Page 14: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Media aritmetică a valorilor unei expresii calculate pe baza datelor din bazele de date se va calcula prin intermediul opţiunii Average a submeniului Database, care are asociată următoarea fereastră:

Înregistrările care se vor lua în calcul se vor stabili prin clauzele Scope, For şi While. Folosind Constructorul de expresii, pornit la activarea comutatorului Expr…, va fi introdusă o expresie numerică ce se va evalua pentru fiecare înregistrare selectată, valorile obţinute fiind mediate aritmetic. Se va obţine o valoare care se va depune în variabila selectată din lista Memory Variables sau specificată în câmpul To Variable.

Exemplu: să se calculeze valoarea medie a unei sticle de bere (cod:bere, unitate de măsură:st).

Se vor introduce:Expr: material.valoare

(preţul unitar în lei/sticlă)Scope: AllFor: substr(material.cod, 1, 4) == “bere”While: -To Variable: aPentru a afişa valoarea variabilei “a”, după executarea calculului se pot introduce în

fereastra de comenzi următoarele două comenzi:clear? “Valoarea medie este “, a

În mod asemănător se calculează suma valorilor unei expresii dependente de câmpurile bazei de date, prin intermediul opţiunii Sum a submeniului Database.

Exemplu: să se calculeze valoarea totală a berii din depozit (cod:bere, unitate de măsură:st):

Expr: material.valoare*material.cantitateScope: AllFor: substr(material.cod, 4, 4) == “bere”While: -To Variable: a

Pentru a afişa valoarea variabilei “a”, după executarea calculului se pot introduce în fereastra de comenzi următoarele două comenzi:

clear? “Valoarea totală este “, a

Numărul de înregistrări care respectă o anumită condiţie se calculează cu ajutorul opţiunii Count a submeniului Database. Condiţia de îndeplinit se specifică cu ajutorul clauzei For.

Exemplu: să se numere materialele care au preţul mai mare decât 5000.15

Page 15: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Expr: -Scope: AllFor: material.valoare > 5000While: -To Variable: aPentru a afişa valoarea variabilei “a”, după executarea calculului se pot introduce în

fereastra de comenzi următoarele două comenzi:clear? “Nr.materiale cu valoare peste 5000 “, a

O altă opţiune a submeniului Database care permite calcule statistice este Calculate. Aceasta permite calcularea următoarelor funcţii statistice:

AVG – media aritmetică;CNT – număr de înregistrări;MAX – maximul unei expresii;MIN – minimul unei expresii;NPV – valoarea absolută;STD – abaterea medie pătratică;SUM – suma valorilor unei expresii;VAR – variaţia faţă de medie.Activarea comutatorului Fields în fereastra Calculate determină pornirea

Constructorului de expresii cu ajutorul căruia se va introduce expresia de calculat. În lista ascunsă Math se găsesc funcţiile statistice enumerate mai sus.

Exemplu: să se calculeze cea mai mare valoare a materialelor din depozit.Expr: MAX(material.valoare)Scope: AllFor: -While: -To Variable: aPentru a afişa valoarea variabilei “a”, după executarea calculului se pot introduce în

fereastra de comenzi următoarele două comenzi:clear? “Cea mai mare valoare “, a

2.9 Ordonarea datelor din bazele de dateÎn FoxProW există două metode principale de ordonare a bazelor de date:

sortarea unei baze de date – care presupune crearea unei noi baze de date, în care sunt depuse aceleaşi înregistrări, dar în ordinea dorită;

indexarea unei baze de date – caz în care se creează un nou fişier, numir fişier index, în care se memorează doar ordinea înregistrărilor bazei de date.

2.9.1 Sortarea unei baze de dateAceastă metodă de ordonare determină obţinerea unei noi baze de date, de obicei

cu aceeaşi structură cu a celei care se sortează, în care se copiază înregistrările în ordinea dorită.

Sortarea unei baze de date se obţine cu ajutorul opţiunii Sort a submeniului Database, la a cărei alegere se obţine pe ecran fereastra Sort.

16

Page 16: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Baza de date care se va sorta se alege prin intermediul listei ascunse From Table.Partea superioară aferestrei este folosită la specificarea cheii de ordonare, care, în

acest caz, se numeşte cheie de sortare. În această parte, în stânga, se găseşte lista All Fields din care se vor alege câmpurile care vor alcătui cheia de sortare, iar în partea dreaptă se află lista Sort Order, în care se vor introduce câmpurile selectate din lista All Fields.

Alcătuirea cheii de sortare se face astfel: se stabileşte primul criteriu de sortare, aceasta însemnând stabilirea modului de

ordonare a înregistrărilor după acest criteriu (crescător sau descrescător) şi primul câmp care va fi folosit la compararea înregistrărilor; pentru aceasta se alege unul dintre butoanele radio Ascending sau Descending, în funcţie de modul de sortare după primul câmp (crescător sau descrescător);

în cazul când primul câmp al cheii de sortare este de tip şir de caractere se poate activa comutatorul Ignore Case pentru a face compararea câmpurilor independentă de tipul caracterelor (majuscule sau minuscule);

se selectează ca prim câmp al cheii de sortare unul din câmpurile bazei de date, prin intermediul listei All Fields;

se acţionează declanşatorul Move care determină adăugarea câmpului selectat la lista Sort Order şi dezactivarea respectivului câmp din lista All Fields, pentru a nu mai permite reselectarea acestuia; în stânga câmpului selectat, în lista Sort Order vom observa o săgeată indicând modul de sortare:

pentru crescător, pentru descrescător

şi un buton care permite rearanjarea câmpurilor din lista Sort Order (la fel ca la mutarea câmpurilor în fereastra Table Structure folosită la crearea unor baze de date – vezi paragraful 2.2 Crearea bazelor de date); se procedează analog pentru următoarele câmpuri care alcătuiesc cheia de sortare (se

selectează modul de sortare şi se alege câmpul dorit).După stabilirea cheii de sortare se trece la specificarea condiţiilor de selecţie a

înregistrărilor care se vor copia în noua bază de date, prin intermediul secţiunii Input a ferestrei, prin comutatoarele Scope, For şi While.

Noua bază de date care va conţine înregistrările în ordinea dorită va fi specificată prin intermediul secţiunii Output. Este posibil ca în noua bază de date să nu se mai copieze toate câmpurile bazei de date care se sortează, ci numai o parte dintre acestea, care se vor selecta în fereastra deschisă prin activarea comutatorului Fields. Numele bazei de date, al fişierului care va memora datele bazei de date sortate se va specifica în

17

Page 17: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

fereastra Save As deschisă prin acţionarea declanşatorului cu acelaşi nume.După ce toate aceste operaţii au fost executate se poate trece la ordonarea propriu-

zisă a bazei de date prin acţionarea declanşatorului OK, sau se poate renunţa la aceasta prin acţionarea declanşatorului Cancel.

Exemplu: să se obţină lista tuturor materialelor care necesită condiţii speciale de depozitare (cond_spec=.T.) din baza de date MATERIAL.DBF, în ordine valorică.1. se deschide baza de date MATERIAL.DBF;2. se alege opţiunea Sort a submeniului Database, pe ecran apărând fereastra asociată

acestei opţiuni;3. se selectează butonul radio Ascending din secţiunea Field Options, indicând o

ordonare crescătoare a bazei de date (după valoare);4. din lista All Fields se alege câmpul “valoare” după care se va face ordonarea;5. prin comutatorul Scope se alege domeniul înregistrărilor, All, iar cu ajutorul

comutatorului For se introduce condiţia de selecţie a înregistrărilor:material.cond_spec=.T.;

6. prin intermediul comutatorului Fields se specifică acele câmpuri care vor face parte din raportul de ieşire: cod, denumire, valoare;

7. se acţionează declanşatorul Save As pentru a specifica baza de date care va memora lista dorită; de exemplu LISTA.DBF;

8. se acţionează declanşatorul OK pentru a porni procesul de sortare;9. se deschide baza de date LISTA.DBF şi apoi o fereastră Browse pe aceasta pentru a

vizualiza lista dorită.

2.9.2 Indexarea bazelor de dateIndexarea unei baze de date reprezintă o metodă performantă de acces la

înregistrări, într-o anumită ordine, dată de un anumit criteriu de ordonare. Spre deosebire de sortare, la care conţinutul bazei de date este copiat într-o nouă bază de date în ordinea dorită, obţinând astfel o dublare a informaţiilor pe disc şi deci risipă de spaţiu de memorare, indexarea presupune de asemenea crearea unui nou fişier asociat bazei de date, care va memora însă numai informaţiile referitoare la ordinea înregistrărilor bazei de date, ducând astfel la o relativă economie de spaţiu de memorare comparativ cu metoda anterioară.

Cheia de ordonare în cazul indexării se numeşte cheie de indexare, ea calculându-se pentru fiecare înregistrare a bazei de date şi folosindu-se la compararea înregistrărilor acesteia. În fişierul indexat asociat bazei de date se va memora pentru fiecare înregistrare valoarea cheii de indexare şi numărul de ordine al înregistrării (cel fizic). Accesul la datele dintr-o bază de date indexată se face prin intermediul fişierului index asociat. Acesta acţionează ca un filtru asupra bazei de date, înregistrările neordonate fizic fiind văzute logic în ordinea dorită.

Pentru stabilirea unei anumite ordini a înregistrărilor unei baze de date prin metoda indexării, se parcurg următoarele etape: se deschide baza de date; se indexează baza de date, aceasta însemnând stabilirea cheii de indexare şi a altor

opţiuni relativ la modul de indexare şi crearea fişierului fişierului index asociat.Odată creat fişierul index, pentru a lucra cu o bază de date indexată se procedează

astfel: se deschide baza de date; se deschid fişierele index asociate acesteia (create anterior), fie automat de FoxProW,

fie manual, de utilizator; din mai multe criterii de ordonare, chei de indexare, asociate simultan unei baze de

date, se selectează acea cheie care va da ordinea înregistrărilor, numită cheie de index activă;

se execută operaţiile dorite asupra bazei de date indexate;18

Page 18: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

se închide baza de date şi odată cu aceasta, în mod automat, şi fişierele index asociate.

Fişierele index ce se asociază unei baze de date pot fi de două tipuri:1. fişiere index simple (având extensia .IDX) care conţin o singură cheie de indexare şi

deci un singur criteriu de ordonare;2. fişiere index compuse (cu extensia .CDX), în care se memorează mai multe criterii de

ordonare, fiecăruia dintre acestea asociindu-i-se un nume, cu titlul generic de “etichetă index”.

Unei baze de date i se pot asocia mai multe fişiere index, atât simple, cât şi compuse. La un anumit moment de timp ordinea de accesare a înregistrărilor bazei de date este dată de un singur fişier index simplu, cel activ, sau de o singură etichetă index dintr-un fişier index compus, numită etichetă index activă.

La rândul lor, fişierele index compuse pot fi de două tipuri:1. structurale – care sunt deschise automat odată cu baza de date, fără a mai fi nevoie de

o comandă specială pentru deschiderea lor; acestea au acelaşi nume cu baza de date, dar au extensia .CDX;

2. nestructurale – care trebuie deschise explicit de utilizator, ele nefiind deschise automat odată cu baza de date; acestea poartă nume diferite de cel al bazei de date, extensia implicită fiind de asemenea .CDX.

Indexarea unei baze de date se face alegând opţiunea New a submeniului File şi selectând butonul radio Index. După acţionarea lui se va deschide fereastra asociată acestei opţiuni. După acţionarea declanşatorului New se va deschide fereastra Index:

Cheia de indexare se construieşte fie alegând câmpuri ale bazei de date din lista Fields, fie cu ajutorul Constructorului de expresii pornit la acţionarea declanşatorului Index Key din dreapta acestei liste.

Tipul de indexare crescătoare sau descrescătoare se indică prin intermediul butoanelor radio Ascending şi, respectiv, Descending.

Pentru o anumită valoare a cheii de indexare pot exista mai multe înregistrări ale bazei de date (de exemplu pentru baza de date MATERIAL.DBF indexată după cod, pot exista mai multe materiale care să aibă acelaşi cod de material). Activând comutatorul Unique se va permite accesul numai la prima înregistrare cu o valoare dată a cheii de indexare, restul înregistrărilor care au aceeaşi valoare a cheii de indexare fiind inaccesibile. Când acest comutator este dezactivat, se permite accesul la toate înregistrările bazei de date, indiferent de valoarea cheii de indexare.

Există posibilitatea stabilirii unui filtru pentru indexul nou creat, acesta constând într-o expresie logică care va fi evaluată înainte de accesarea fiecărei înregistrări. Dacă

19

Page 19: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

această expresie are valoarea adevărat (.T.), înregistrarea va fi accesibilă, iar în cazul valorii fals (.F.), înregistrarea nu va putea fi accesată. Expresia index filtru se specifică cu ajutorul Constructorului de expresii, pornit la acţionarea declanşatorului Index Filter, sau direct în câmpul de editare din dreapta acestui declanşator.

Fişierul index care se va crea este specificat prin opţiunea Output File a ferestrei. Tipul fişierului index va fi dat de grupul de butoane radio din această secţiune: fişier index simplu când este selectat butonul radio Single Index File (IDX); fişier index compus în cazul selectării butonului radio Compound Index File (CDX).

Când se crează un fişier index compus, tipul acestui fişier, structural sau nestructural, este dat de starea comutatorului Structural Index Structure (când acesta este activat se va crea un fişier index compus structural). Activând comutatorul Compact Index Structure fişierul index creat va fi compact (are sens numai în cazul fişierelor index simple, cele compuse fiind întotdeauna compacte).

Numele fişierului index şi directorul unde va fi depozitat acesta se introduc fie prin intermediul ferestrei Save As, deschisă la acţionarea declanşatorului cu acelaşi nume, fie manual prin introducerea numelui şi căii complete în regiunea de editare text din dreapta acestui declanşator.

Deci, pentru crearea unui fişier index se vor parcurge următoarele etape: mai întâi se stabileşte tipul fişierului index (simplu, compus, structural sau nestructural,

compact sau necompact); se stabileşte apoi numele acestui fişier şi locul în care acesta va fi depozitat pe disc

(pentru fişierele index simple şi pentru fişierele index compuse nestructurale); apoi se stabileşte cheia de indexare; în cazul fişierelor index compuse se introduce în câmpul de editare Tag Name

denumirea etichetei index care se va crea; se specifică apoi tipul indexării (crescătoare sau descrescătoare, unică sau multiplă),

cât şi filtrul index; în final se acţionează declanşatorul OK.

Crearea unui fişier index pentru o bază de date nu presupune neapărat că acesta este deschis odată cu baza de date decât în cazul fişierelor index compuse structurale. În celelalte cazuri, după deschiderea unei baze de date este necesară şi deschiderea fişierelor index asociate, această operaţie realizându-se astfel: se alege opţiunea Open a submeniului File obţinând pe ecran fereastra Open; din lista ascunsă List Files of Type se alege elementul Index, indicând că vom

deschide un fişier index pentru baza de date curentă; cu ajutorul listelor ascunse Drive şi Directory şi al listei din partea stângă a ferestrei se

stabileşte directorul de unde se preia fişierul index; din lista din partea stângă-sus a ferestrei se alege fişierul index care se va deschide şi

apoi se acţionează declanşatorul Open; se repetă operaţiile anterioare pentru toate fişierele index asociate bazei de date

active.Din mai multe fişiere index deschise pentru o bază de date, unul singur dă ordinea

de accesare a înregistrărilor, iar dacă acesta este compus, există o singură etichetă index a fişierului index respectiv care va determina criteriul de ordonare a bazei de date.

Pentru a stabili care fişier index simplu este activ sau care etichetă index a unui fişier index compus este activă, se foloseşte opţiunea Setup a submeniului Database, care are asociată fereastra Setup.

În această fereastră, secţiunile Indexes şi Index Description controlează modul de indexare al bazei de date active. În lista Indexes sunt afişate toate fişierele index simple şi toate etichetele index deschise pentru baza de date activă. Pentru a adăuga la această listă un nou element (fişier index simplu sau etichetă index) se acţionează declanşatorul Add şi în fereastra deschisă se alege fişierul index respectiv.

20

Page 20: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Declanşatorul Modify se foloseşte pentru a modifica cheia de indexare a unui fişier index simplu sau a unei etichete index selectate anterior din lista Indexes. Închiderea unui fişier index se face prin acţionarea declanşatorului Remove, după selectarea din lista Indexes a fişierului index de închis.

Acţionarea declanşatorului No Order face ca accesarea înregistrărilor bazei de date să se facă în ordinea fizică a acestora, fără folosirea vreunui fişier index asociat bazei de date.

Stabilirea fişierului index simplu sau a etichetei index care va da ordinea de accesare a înregistrărilor se va face prin selectarea acestuia din lista Indexes a acestei ferestre şi acţionarea declanşatorului Set Order. Fereastra se părăseşte prin acţionarea declanşatorului OK.

Odată cu închiderea bazei de date se închid şi toate fişierele index asociate acesteia, indiferent de tipul lor, simple sau compuse, structurale sau nestructurale.

Există situaţii când apar neconcordanţe între conţinutul bazei de date şi conţinutul fişierelor index create pentru ea. La modificarea conţinutului unei baze de date se actualizează automat toate fişierele index deschise pentru aceasta. În schimb, fişierele index create pentru baza de date respectivă, care nu au fost deschise în momentul efectuării modificărilor, nu vor fi actualizate, ele memorând o stare veche a bazei de date. Pentru reactualizarea lor se foloseşte opţiunea Reindex a submeniului Database care reface toate fişierele index deschise pentru baza de date curentă. După această operaţie acestea reflectă starea curentă a bazei de date.

O altă facilitate importantă a indexării bazelor de date este cea a creşterii substanţiale a vitezei de căutare. În timp ce într-o bază de date neindexată căutarea se face secvenţial, înregistrare după înregistrare, pe o bază de date indexată se folosesc metode mai avansate de căutare (cum ar fi metoda înjumătăţirii intervalului), care măresc viteza de căutare de zeci, chiar de sute de ori (în funcţie de numărul de înregistrări ale bazei de date).

Căutările în bazele de date indexate se fac prin intermediul opţiunii Seek din submeniul Record, la alegere acesteia deschizându-se fereastra Constructorului de expresii.

Căutarea într-o bază de date indexată se face după o valoare a cheii de indexare. În fereastra Constructorului de expresii se va introduce o expresie care va fi evaluată la

21

Page 21: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

fiecare testare a unei înregistrări a bazei de date. Dacă valoarea expresiei este egală cu valoarea cheii de indexare pentru înregistrarea testată, atunci această înregistrare va fi considerată găsită, iar dacă cele două valori diferă, înregistrarea se va considera negăsită, sărindu-se la o altă înregistrare. Modul de parcurgere a înregistrărilor nu este secvenţial, ci se folosesc metode mai avansate, care permit viteze de căutare mai ridicate.

Spre deosebire de căutarea într-o bază de date neindexată, în cazul fişierelor indexate, după găsirea unei înregistrări potrivite se parcurg următoarele înregistrări cu aceeaşi valoare a cheii de indexare prin comanda Skip (opţiunea Goto din submeniul Record şi butonul radio Skip).

Exemplu: dându-se baza de date MATERIAL.DBF în care sunt memorate datele referitoare la materialele dintr-un depozit şi având structura dată în primul paragraf al acestui capitol, să se listeze materialele din depozit în ordine alfabetică a codului şi în ordine crescătoare a valorii.

Procedăm astfel: se deschida baza de date MATERIAL.DBF; se indexează această bază de date; pentru aceasta se alege opţiunea New a

submeniului File şi din fereastra deschisă se alege butonul radio Index; se acţionează butonul declanşator New, pe ecran fiind deschisă fereastra de creare a

fişierelor index; vom crea un fişier index compus, structural, selectând butonul radio Compound Index

File (CDX) şi activând comutatorul Structural Index Structure (dacă acestea nu sunt deja activate);

pentru specificarea cheii de indexare, care în acest caz este formată doar din câmpul “cod”, se selectează acest câmp din lista Fields;

se introduce în câmpul Tag Name numele primei etichete index, cod; urmează specificare tipului indexării: crescătoare (butonul radio Ascending selectat) şi

multiplă (comutatorul Unique dezactivat), prima etichetă index fiind acum creată; se acţionează declanşatorul Add to Index List pentru a adăuga indexul nou creat la

lista Index Key; vom crea acum cea de-a doua etichetă pe care o vom numi “valoare”; numele etichetei

îl vom introduce în câmpul Tag Name; vom preciza în continuare cea de-a doua cheie de indexare alegând câmpul “valoare”

din lista Database Fields; cea de-a doua etichetă index este acum creată;22

Page 22: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

acţionăm declanşatorul Add to Index List pentru a adăuga şi cel de-al doilea index la lista Index Key;

acţionăm declanşatorul OK pentru închiderea ferestrei şi crearea fişierului index respectiv, cu cele două etichete specificate;

pentru listarea bazei de date ordonată după “cod” se va specifica mai întâi eticheta index activă; pentru aceasta se va deschide fereastra Setup prin alegerea opţiunii cu acelaşi nume din submeniul Database;

în fereastra deschisă se alege indexul material.cod din lista Indexes şi se acţionează declanşatorul Set Order;

se închide această fereastră şi se deschide fereastra Browse pentru baza de date activă;

pentru o listare simplă a bazei de date se poate introduce în fereastra de comenzi instrucţiunea LIST; dacă se doreşte o listare mai complexă se poate folosi generatorul de filtre;

la fel se procedează pentru listarea bazei de date în ordinea crescătoare a valorii materialelor.

2.10 Import / Export de date din bazele de dateFoxProW posedă facilităţi de comunicare cu exteriorul foarte performante, putând transfera date la şi de la cele mai răspândite sisteme informatice, cum ar fi Excel, Lotus123, Paradox etc.

Importul datelor dintr-un fişier extern într-o bază de date FoxProW se face prin intermediul opţiunii Append From… a submeniului Database, care detrmină deschiderea ferestrei cu acelaşi nume.

Prin intermediul acestei comenzi se vor adăuga înregistrări la baza de date activă.

Aceste înregistrări vor fi preluate dintr-un fişier extern care va fi specificat în fereastra deschisă la acţionarea declanşatorului From… sau în câmpul de editare din dreapta acestuia. Tipul fişierului din care se vor prelua datele este dat de elementul selectat din lista ascunsă File Type, având următoarele variante:Table(DBF) –o altă bază de date FoxProW;Delimited with Tabs –un fişier text, în care câmpurile sunt separate prin Tab, iar

înregistrările printr-un sfârşit de linie (CR+LF);Delimited with Commas un fişier text în care separarea câmpurilor se face printr-o

virgulă;

Delimited with Spaces –un fişier text în care separarea câmpurilor se face printr-un spaţiu;

System Data Format (SDF) –un fişier text în care înregistrările au o lungime fixă şi se termină printr-un sfârşit de linie (CR+LF);

23

Page 23: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Symbolic Link Format (SYLK) –un fişier într-un format special de interschimbare, Symbolic Link; liniile devin înregistrări, iarcoloanele devin câmpuri;

Data Interchange Format (DIF) –fişier în format DIF în care coloanele devin câmpuri, iar rândurile înregistrări;

Microsoft Excel (XLS) –fişier în format Microsoft Excel (program de calcul tabelar), în care coloanele devin câmpuri, iar rândurile devin înregistrări;

Microsoft Multiplan (4.01) (MOD) –fişier în format BIFF (Binary File Format) al sistemului Microsoft Multiplan, în care liniile tabelului devin înregistrări, iar celulele acestuia devin câmpuri;

Symphony (1.0) (WRK) –tabel Symphony (1.0 sau 1.01);Symphony (1.1/1.2) (WR1) –tabel Symphony (1.1 sau 1.2)Lotus 1-2-3 (1A) (WKS) –tabel Lotus 1-2-3 (1A) în care coloanele devin câmpuri şi

liniile înregistrări;Lotus 1-2-3 (2.x) (WK1) –tabel Lotus 1-2-3 (1A) în care coloanele devin câmpuri şi

liniile înregistrări, versiunea 2.xx;Lotus 1-2-3 (3.0) (WK3) –tabel Lotus 1-2-3 (1A) în care coloanele devin câmpuri şi

liniile înregistrări, versiunea 3.0;Paradox (PDOX) –o bază de date Paradox, versiunea 3.5;RapidFile (1.2) (RPD) –o bază de date RapidFile;Framework II (FW2) –un tabel Framework II.

Domeniul înregistrărilor care se vor adăuga la baza de date activă se specifică cu ajutorul comutatorului Scope, iar condiţiile de selecţie a acestora prin intermediul comutatoarelor For şi While. În baza de date activă se pot copia doar anumite câmpuri, acestea precizându-se în fereastra deschisă prin acţionarea declanşatorului Fields.

După precizarea tuturor opţiunilor referitoare la import se acţionează declanşatorul Append.

Operaţia opusă importului este exportul, caz în care datele sunt preluate din baza de date activă şi sunt trimise în exterior, către un fişier de pe disc. Această operaţie se realizează cu ajutorul opţiunii Copy To a submeniului Database, la alegerea căreia este deschisă fereastra cu acelaşi nume:

Modul de lucru în această fereastră este asemănător cu cel de la import, tipurile disponibile pentru fişierul spre care se exportă fiind următoarele: Table (DBF), Delimited with Tabs, delimited with Commas, Delimited with Spaces, System Data Format (SDF), Symbolic Link Format (SYLK), Data Interchange Format (DIF), Microsoft Excel (XLS), Microsoft Multiplan (4.01) (MOD), Symphony (1.0) (WRK), Symphony )1.1/1.2) (WR1), Lotus 1-2-3 (1.A) (WKS), Lotus 1-2-3 (2.x) (WK1).

2.11 Baze de date relaţionale. Relaţii între tabele24

Page 24: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

O bază de date relaţională este compusă din mai multe tabele, care se află în relaţie unele cu altele. Un tabel al unei baze de date relaţionale are structura identică cu a unei baze de date simple, folosindu-se următoarea terminologie: câmpurile se numesc “coloane”, iar pentru înregistrări se foloseşte termenul de “linii”.

Exemplu:Să presupunem că proiectăm un sistem informatic pentru evidenţa facturilor unei

unităţi economice. Pentru memorarea acestora se va folosi un tabel în care coloanele vor corespunde rubricilor de pe formularul factură (număr factură, data emiterii, denumire furnizor, denumire beneficiar etc.), iar în fiecare linie se va putea memora o factură.

Memorarea în fiecare linie din tabel a denumirii complete a furnizorului şi beneficiarului este total ineficientă, datorită faptului că denumirea completă a unei unităţi economice se va găsi în tabel de un număr mare de ori, egal cu numărul de facturi schimbate cu această unitate economică:

Nr.Fct.

DatăFactură

… Total TVA Denumire Furnizor

… … … … … …40 20/04/99 … 100000 18000 Societatea Comercială ALFA SRL41 23/04/99 … 240000 43200 Societatea Comercială ALFA SRL… … … … … …53 29/04/99 … 153500 27630 Societatea Comercială ALFA SRL… … … … … …62 03/05/99 … 180000 32400 Societatea Comercială ALFA SRL… … … … … …

Folosind o bază de date relaţională pentru memorarea acestor facturi se poate face economie de spaţiu de memorare. Astfel, alegând o codificare pentru unităţile economice cu care unitatea noastră schimbă facturi, se va memora în tabelul facturilor numai codul furnizorului, respectiv beneficiarului, urmând ca denumirile complete ale acestor unităţi să fie memorate într-un tabel separat care se află în relaţie cu primul.

Structura relaţională a bazei de date a facturilor poate fi de forma:

Nr.Factură

DataFactură

…Cod

FurnizorCod

FurnizorDenumireFurnizor

… … … …40 20/04/99 … 2341 23/04/99 … 23… … … … 23 Societatea comercială ALFA SRL53 29/04/99 … 23… … … …62 03/05/99 … 23… … … …

Între cele două tabele ale bazei de date relaţionale s-a stabilit o relaţie după coloana cod_furnizor, astfel încât poziţionarea indicatorului de linii (înregistrări) pe o linie a primului tabel va determina poziţionarea automată a indicatorului de linii al celui de-al doilea tabel pe linia corespunzătoare (cu aceeaşi valoare în coloana cod_furnizor). Ostructură mai complexă de bază de date relaţională pentru memorarea facturilor unei unităţi economice este dată în exemplul de mai jos (sub formă grafică pentru o mai bună înţelegere):

FURNIZ.DBF DOMENIU.DBF

25

Page 25: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

COD DENUMIRE DOM COD DENUMIREFACTURI.DBF … … … … …

NR.FACT.

…COD

FURN.COD

BENEF.24 GAMA SRL INM INM Industrie Metaliferă

… … … … … … … … …123 … 24 29… … … … BENEF.DBF ACTIVIT.DBF

COD CAPITAL ACT COD NIVEL IMPOZIT… … … … …29 400000 COM COM Scutit impozit profit… … … … …

Relaţia dintre două tabele ale unei baze de date nu este una bidirecţională, de egalitate, ci este o relaţie unidirecţională, de subordonare. Unul dintre tabele va fi denumit părinte şi va avea ca subordonat pe cel de-al doilea tabel, numit copil. Deplasarea indicatorului de linii al tabelului părinte va determina poziţionarea corespunzătoare a indicatorului de linii al tabelului copil, dar invers această determinare nu se realizează.

Modul de lucru cu bazele relaţionale este următorul: se crează tabelele componente ca orice bază de date simplă; se deschid aceste tabele în zone de lucru distincte; se stabilesc apoi relaţiile între tabele, între zonele de lucru corespunzătoare; se pot accesa acum datele din toate tabelele simultan, fără a mai fi necesară

coordonarea acestora (realizată de FoxProW); după terminarea lucrului cu baza de date relaţională respectivă, aceasta se închide (se

închid toate componentele).O înregistrare a bazei de date relaţională este formată din mai multe linii, fiecare din

câte un tabel component. Pentru a fi accesată o astfel de înregistrare se poziţionează indicatorul de linii al bazei de date părinte pe linia dorită şi se citesc datele din toate tabelele bazei de date, cea părinte şi cele subordonate acesteia (indicatorii de linii ai tabelelor copil vor fi poziţionaţi automat pe liniile care corespund liniei selectate din tabelul părinte).

Stabilirea unei relaţii între două tabele presupune specificarea unei expresii, numită cheie a relaţiei, cu ajutorul căreia se face corespondenţa liniilor între cele două tabele. Mutarea indicatorului de linii în tabelul părinte determină evaluarea cheii relaţiei dintre cele două tabele pentru linia curentă din tabelul părinte şi pentru liniile tabelului copil. Indicatorul de linii al tabelului copil se va poziţiona pe linia pentru care valoarea cheii relaţiei este egală cu valoarea cheii respective pentru linia părinte.

Deci două linii din două tabele aflate în relaţie unul cu altul vor corespunde dacă au aceeaşi valoare a cheii relaţiei respective.

De cele mai multe ori cheia unei relaţii între două tabele este dată printr-un singur câmp, compararea liniilor tabelelor reducându-se la compararea valorilor câmpului respectiv, din cele două tabele.

Atenţie! Pentru stabilirea unei relaţii între două tabele ale unei baze de date relaţionale, tabelul copil trebuie să fie indexat după cheia relaţiei. Excepţii de la această regulă sunt acelea când cheia relaţiei este numerică sau când această cheie este chiar numărul de ordine al liniilor. În acest caz tabelul copil poate fi neindexat.

O situaţie specială apare atunci când, având două tabele aflate în relaţie unul cu altul, unei linii a tabelului părinte îi corespund mai multe linii ale tabelului copil. Acest aspect a dus la stabilirea unui criteriu de clasificare a relaţiilor între tabele, şi anume: relaţii de tip “una la una”, când unei linii din tabelul părinte îi corespunde o singură linie

a tabelului copil; în cazul când pentru o linie a tabelului părinte există mai multe linii ale tabelului copil, nu va putea fi accesată decât prima dintre ele, restul fiind practic invizibile;

26

Page 26: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

relaţii de tip “una la mai multe”, caz în care unei linii a tabelului părinte îi pot corespunde mai multe linii ale tabelului copil; toate liniile tabelului copil vor putea fi accesate, indiferent de numărul lor.

Pentru controlul bazelor de date relaţionale se foloseşte fereastra View, în modul de lucru cu acelaşi nume. Deschiderea acestei ferestre se face prin alegerea opţiunii View din submeniul Window, iar pentru selectarea modului de lucru se acţionează declanşatorul din colţul stânga-sus al ferestrei.

Pentru crearea unei baze de date relaţionale, presupunând că sunt deja create tabelele componente ale acesteia, se procedează în modul următor: se deschid tabelele componente, fiecare în câte o zonă de lucru distinctă, folosind

eventual declanşatorul Open al ferestrei View; se stabileşte prima relaţie; pentru aceasta se selectează tabelul părinte prin deplasarea

cursorului în lista Work Areas pe zona de lucru în care este deschis tabelul şi se acţionează tasta Space;

se acţionează declanşatorul Relations, în lista din partea dreaptă apărând tabelul părinte de la care pleacă o săgeată spre viitorul tabel copil;

se selectează acum tabelul copil din lista Work Areas; în acest moment este deschisă fereastra Constructorului de expresii pentru

specificarea cheii relaţiei; după introducerea expresiei dorite şi acţionarea declanşatorului OK relaţia este stabilită, în lista din partea dreaptă apărând acum tabelul selectat, subordonat tabelului părinte;

se creează în mod analog restul relaţiilor dintre tabelele componente ale bazei de date relaţionale.

Observaţie: dacă tabelul copil nu este indexat, în locul pornirii Constructorului de expresii pentru specificarea cheii relaţiei se va presupune că numărul de ordine al liniilor va reprezenta cheia relaţiei. În cazul când tabelul copil este indexat, dar nu este specificat indexul activ, va fi deschisă o fereastră pentru a stabili indexul activ al tabelului copil.

Pentru crearea unei relaţii de tipul “una la mai multe” vom proceda după cum urmează: se creează relaţia respectivă ca orice relaţie de tipul “una la una”; se transformă această relaţie într-una de tipul “una la mai multe”; pentru aceasta se

selectează tabelul părinte din lista Work Areas şi se acţionează declanşatorul 1-To-Many;

este deschisă fereastra pentru crearea relaţiilor “una la mai multe” conţinând următoarele elemente: Child Aliases – listă conţinând tabelele cu care se află în relaţie tabelul părinte

curent selectat; Selected Aliases – listă conţinând tabelele selectate care identifică relaţiile care

27

Page 27: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

vor fi transformate în “una la mai multe”; se va aplica această transformare pentru toate relaţiile dintre tabelul părinte curent şi tabelele copil selectate;

Move – trece tabelul selectat din lista Child Aliases în lista Selected Aliases; All – acelaşi efect ca şi Move, dar pentru toate tabelele din lista Child Aliases; Remove – acţiune opusă lui Move, deselectează tabelele selectate din lista

Selected Aliases, trecându-le în lista Child Aliases; Remove All – acelaşi efect ca şi Remove, dar pentru toate tabelele selectate din

lista Selected Aliases; OK – termină lucrul în această fereastră, realizând transformarea; Cancel – renunţă la transformare;

se alege tabelul copil al relaţiei de transformat din lista Child Aliases; se acţionează declanşatorul OK pentru închiderea ferestrei şi realizarea transformării

relaţiei specificate în relaţie “una la mai multe”.În fereastra View, o relaţie de tipul “una la mai multe” este indicată printr-un

dreptunghi plasat în dreapta tabelului părinte, în lista Work Areas.Modificarea unei relaţii create anterior se face urmând etapele:

se selectează relaţia de modificat din lista din partea dreaptă a ferestrei View prin deplasarea cursorului pe tabelul copil;

se acţionează tasta space pentru a modifica relaţia selectată (se va modifica cheia relaţiei în fereastra Constructorului de expresii);

Ştergerea unei relaţii între două tabele se realizează astfel: se selectează tabelul copil din lista din partea dreaptă a ferestrei View şi se intră în

editarea relaţiei selectate; în fereastra Constructorului de expresii se şterge expresia reprezentând cheia relaţiei

şi se acţionează declanşatorul OK, relaţia fiind ştearsă.Relaţia stabilită între două tabele ale unei baze de date relaţionale nu reprezintă în

sine un instrument de lucru. Aceasta este folosită doar prin efectele pe care le generează, prin modul de acces la datele depozitate în tabelele bazei de date.

2.12 Rapoarte totalizatoare. Baze de date totalizatoareUn alt mod de extragere şi prezentare a unor informaţii din bazele de date este

reprezentat de rapoartele totalizatoare. Să presupunem următoarea problemă: în baza de date MATERIAL.DBF avem mai multe tipuri de bere (toate cu acelaşi cod), mai multe tipuri de ţigări (de asemenea cu acelaşi cod) etc. Dorim să aflăm lista materialelor pe clase (bere, ţigări etc.), cu valoarea totală pe fiecare clasă. Această listă reprezintă de fapt un raport totalizator care se obţine astfel: mai întâi se ordonează (sortează sau indexează) baza de date după cod_material; apoi, automat, în urma comenzii Total a utilizatorului, se creează o bază de date nouă

28

Page 28: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

în care se depune o singură înregistrare pentru fiecare clasă de produs, în fiecare dintre acestea totalizându-se înregistrările corespunzătoare din baza de date sursă;

se vizualizează apoi baza de date totalizatoare într-o fereastră Browse care reprezintă de fapt raportul dorit.

Crearea bazelor de date totalizatoare se face cu ajutorul opţiunii Total a submeniului Database, care determină afişarea ferestrei cu acelaşi nume.

În această fereastră cheia de totalizare se specifică prin intermediul listei din partea stângă-sus (când este un câmp al bazei de date) sau cu ajutorul Constructorului de expresii pornit la acţionarea declanşatorului Expr… (când cheia este o expresie).Cheia de totalizare reprezintă o expresie validă FoxProW, conţinând câmpuri ale bazei de date, după care se face totalizarea. Pentru fiecare înregistrare a bazei de date sursă (cea activă) se va evalua expresia respectivă şi se va “aduna” la înregistrarea corespunzătoare din baza de date totalizatoare. Deci pentru fiecare valoare a cheii de totalizare vom avea o singură înregistrare în baza de date totalizatoare şi una sau mai multe în

baza de date sursă.Implicit se vor totaliza toate câmpurile numerice ale bazei de date (doar pentru

acestea are sens însumarea). dacă se doreşte totalizarea doar a unora dintre acestea, lista câmpurilor care se vor totaliza va fi specificată în fereastra Field Picker deschisă la activarea comutatorului Fields.

Numele şi locul bazei de date totalizatoare (directorul şi unitatea de disc) vor fi specificate în fereastra Save As deschisă la acţionarea declanşatorului cu acelaşi nume din fereastra Total, sau manual, în câmpul de editare de sub acest declanşator. Înregistrările care vor intra în calcul la totalizare vor fi selectate cu ajutorul clauzelor Scope, For şi While, prin intermediul declanşatoarelor cu acelaşi nume din fereastra Total.

Atenţie! Cheia de sortare sau de indexare a bazei de date sursă trebuie să fie aceeaşi (sau să includă) cheia de totalizare.

29

Page 29: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

3. TIPURI DE DATE

Un tip de date reprezintă o caracteristică a datelor prin care se stabileşte ce operaţii se pot executa asupra lor, modul de codificare a datelor în memoria calculatorului, semnificaţia acestor date.

În limbajul FoxProW vom avea următoarele tipuri de date: tipul logic; tipul numeric; tipul şir de caractere; tipul dată calendaristică.

3.1 Tipul logicEste caracteristic datelor care nu pot lua decât două valori, True (adevărat) sau

False (fals).Pentru a specifica valoarea “adevărat” a unei expresii de tip logic se foloseşte

construcţia .T., iar pentru valoarea “fals” se foloseşte .F..O expresie de tip logic reprezintă o combinaţie de operanzi şi operatori, construită

după anumite reguli sintactice, a cărei evaluare va avea ca rezultat o valoare logică.Operanzii ce intră în componenţa expresiilor logice sunt de următoarele tipuri:

câmpuri de tip logic ale unei baze de date; funcţii ce returnează valori logice; variabile de tip logic; alte expresii logice.

Operatorii logici, în ordinea priorităţii de evaluare, sunt următorii:Prioritatea Operator Semnificaţie

1 (,) grupează expresiile2 !, NOT negaţie logică3 AND “şi” logic4 OR “sau” logic

De asemenea, rezultatul unei expresii care conţine operatori relaţionali (<, <=, …) este de tip logic.

Exemple:? NOT (1=3).T.? (1<=4) AND (5>3).T.? 6<3 OR 4*2=9.F.

3.2 Tipul numericCu toate că limbajul FoxProW este un limbaj orientat pe lucrul cu baze de date, şi

nu unul orientat pe calcule matematice, tipul numeric este implementat astfel încât să permită realizarea majorităţii operaţiilor matematice întâlnite în partea practică.

De asemenea sunt prevăzute o serie de funcţii matematice prin care se pot calcula funcţiile matematice elementare (exponenţiala, logaritmul, funcţii trigonometrice etc.).

Operanzii numerici care intervin în expresii pot fi: câmpuri numerice ale unei baze de date; funcţii care returnează valori numerice; variabile de tip numeric; constante numerice.

Operatorii care se aplică unor operanzi numerici, având ca rezultate tot valori numerice, în ordinea priorităţii, sunt următorii:

30

Page 30: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Prioritatea Operator Semnificaţie1 (,) grupează expresiile2 **, ^ ridicare la putere3 *, /, % înmulţire, împărţire, modulo (restul împărţirii)4 +, - adunare, scădere

Evaluarea unei expresii, pe acelaşi nivel de prioritate, se face de la stânga la dreapta, în ordinea apariţiei operatorilor în expresie.

Între două expresii numerice se pot aplica şi operatori relaţionali, obţinându-se expresii logice. Aceştia sunt:

Operator Semnificaţie< mai mic decât> mai mare decât= egal cu

<>, #, != diferit de<= mai mic sau egal cu>= mai mare sau egal cu

Funcţia MOD( ), având sintaxa:MOD (expN1, expN2)

returnează restul obţinut prin împărţirea expresiei numerice N1 la expresia numerică N2, rezultatul fiind de tip numeric.

Exemple:? MOD (38,6)2? MOD (44.44,11.11)0

Afi;area numerelor este controlat[ de comanda SET DECIMALS care are următoarea sintaxă:

SET DECIMALS TO [n]Această comandă determină numărul minim de cifre zecimale care sunt afişate în

cazul în care nu se specifică un format explicit de afişare. Implicit, numărul de zecimale este 2, dar el se poate schimba prin comanda SET DECIMALS, specificându-se un alt număr prin n.

Exemplu:? 2/30.67SET DECIMALS TO 4? 2/30.6667

Observaţie: numărul de cifre cu care FoxProW lucrează intern nu este afectat de comanda SET DECIMALS, această comandă controlând doar aspectul exterior al rezultatului.

Exemplu:SET DECIMALS TO 3a=2/3DISPLAY MEMORY LIKE aA Pub N 0.667 ( 0.66666667)

Comanda DISPLAY MEMORY este folosită în acest exemplu pentru a afişa pe ecran informaţii despre variabila a.

Vom prezenta în continuare funcţiile numerice, adică acele funcţii care au ca scop prelucrarea datelor numerice.

Funcţii referitoare la semnul datelor numerice

31

Page 31: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

ABS (expN) – returnează valoarea absolută a argumentului;SIGN (expN) – returnează: +1 dacă expN > 0

0 dacă expN = 0 -1 dacă expN < 0.

Exemple:? ABS (-400)400? SIGN (-32)-1a=-2/3? a=SIGN(a)*ABS(a).T.

Funţii de aproximare a datelor numericeINT (expN) – returnează partea întreagă a argumentului;

Exemplu:? INT (14.46)14? INT (-2.25)-2

Partea fracţionară a unui număr se obţine conform relaţiei {a} = a - [a];Exemple:

a=14.46? a-INT(a)0.46a=-2.25? a-INT(a)-0.25

Alte moduri de a obţine o aproximaţie întreagă a unui număr sunt date de funcţiile:CEILING (expN) – returnează cel mai apropiat întreg, mai mare sau egal cu argumentul;FLOOR (expN) – returnează cel mai apropiat întreg mai mic sau egal cu argumentul;

Exemple:? CEILING (8.32)9? CEILING (-4.23)-4? FLOOR (8.32)9? FLOOR (-4.32)-5

Funcţia ROUND (expN1, expN2) aproximează expN1 la un număr real cu expN2 zecimale (în acest caz numărul de zecimale exprimat prin SET DECIMALS este ignorat).

Funcţii matematice elementareEXP(expN) – returnează ;LOG(expN) – returnează ;LOG10(expN) – returnează ;SQRT(expN) – returnează ;

Exemple:? EXP(2)7.39? LOG(2)0.69

32

Page 32: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

? LOG10(10)1.00? EXP(LOG(3))3.00? SQRT(2)1.41

Funcţii trigonometricePI ( ) – returnează valoarea lui , adică unghiul de 180 de grade, exprimat în radiani;

numărul de zecimale returnat de PI ( ) este determinat de SET DECIMALS.DTOR (expN) – returnează valoarea în radiani a unghiului expN exprimat în grade;RTOD (expN) – returnează valoarea în grade a unghiului expN exprimat în radiani.

Exemplu:? DTOR (90) = PI ( ) / 2.T.? RTOD (PI ( )/ 4)45.00

Funcţiile DTOR şi RTOD sunt funcţii inverse.SIN (expN) – returnează sinusul unghiului expN, exprimat în radiani;COS (expN) – returnează cosinusul unghiului expN, exprimat în radiani;TAN (expN) – returnează tangenta unghiului expN, exprimat în radiani;ASIN (expN) – returnează arcsinusul unghiului expN;ACOS (expN) – returnează arccosinusul unghiului expN;ATAN (expN) – returnează arctangenta unghiului expN.

Funcţii referitoare la calcule financiare şi statistice PAYMENT (expN1, expN2, expN3) – returnează valoarea fiecărei plăţi dintr-o serie

periodică de plăţi a unui împrumut cu o dobândă fixă; expN1 reprezintă valoarea împrumutului, expN2 este rata dobânzii la nivelul unei perioade, expN3 este numărul de plăţi în care se face plata împrumutului;

PV (expN1, expN2, expN3) – returnează valoarea viitoare a unei investiţii; aceasta se calculează ca o serie de plăţi periodice la o rată a dobânzii constantă; expN1reprezintă valoarea unei plăţi periodice, expN2 este rata dobânzii, iar expN3 reprezintă numărul de perioade, de plăţi;

FV (expN1, expN2, expN3) – returnează valoarea viitoare a unei investiţii, calculată ca o sumă de plăţi periodice constante, cu o dobândă fixă; expN1 reprezintă valoarea unei plăţi (constantă), expN2 este rata dobânzii, periodică, iar expN3 reprezintă numărul de plăţi, de perioade.

Exemplu:? PAYMENT (100000, 0.10, 12)146763.32? PV (100000, 0.12, 6)411140.73? FV (100000, 0.12, 6)811518.90

3.3 Tipul şir de caractereUn şir de caractere reprezintă o mulţime ordonată de caractere care se tratează ca

un tot unitar Într-un şir de caractere, ordinea acestora fiind esenţială, fiecărui caracter i se va putea asocia un număr reprezentând poziţia acestuia în cadrul şirului (primul caracter va avea poziţia 1).

Numărul caracterelor dintr-un şir reprezintă lungimea şirului. Un subşir al şirului dat reprezintă o porţiune din şir, începând de la o poziţie şi având o lungime dată.

33

Page 33: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Constantele de tip şir de caractere se specifică prin mulţimea caracterelor care le compun, încadrate între apostrofuri simple sau duble (la ambele capete trebuie să fie acelaşi tip de apostrof. De exemplu ‘Şir de caractere’ şi ”Şir de caractere” reprezintă acelaşi şir de caractere.

Pentru a include unul dintre cele două delimitatoare într-un şir de caractere, mulţimea caracterelor ce alcătuiesc şirul va fi încadrată de celălalt tip decât cel din şir.

Dacă lungimea şirului de caractere este 1, acesta se reduce la un caracter, de exemplu “A”, ‘1’. Dacă lungimea şirului este 0 obţinem şirul nul sau vid, ‘’ sau “”.

O expresie de tip şir de caractere reprezintă o combinaţie de operanzi şi operatori, realizată după anumite reguli, a cărei evaluare va avea ca rezultat un şir de caractere. Operanzii care intră în componenţa acestor tipuri de expresii pot fi: câmpuri de tip şir de caractere ale unei baze de date; funcţii ce returnează şiruri de caractere; variabile de tip şir de caractere; constante de tip şir de caractere.

Asupra şirurilor de caractere se aplică două tipuri de operatori: operatori de concatenare; operatori de comparare sau relaţionali.

Operatorii de concatenare sunt doi la număr şi anume: operatorul de concatenare simplu ”+”:

‘salut_ _ _ _’ + ‘_prieteni !’ va avea ca rezultat: ‘salut_ _ _ _ _prieteni !’; operatorul de concatenere special “-“:

‘salut_ _ _ _’ + ‘_prieteni !’ va avea ca rezultat: ‘salut_prieteni !_ _ _ _’;Se observă că blancurile de la sfârşitul primului şir sunt eliminate, dar nu şi blancul

de la începutul celui de-al doilea şir.Un grup aparte de operatori asupra şirurilor de caractere îl constituie operatorii

relaţionali. Aceştia sunt operatori binari care testează dacă două şiruri de caractere se află sau nu într-o relaţie dată, specifică operatorului. Un astfel de operator are sintaxa:

expC1 operator expC2Rezultatul evaluării acestei expresii este adevărat dacă şirul expC1 se află în relaţia

dată de operator cu şirul expC2. Dacă cele două şiruri nu se află în această relaţie, rezultatul evaluării expresiei este fals.

Operatorii relaţionali ce se aplică între două şiruri de caractere sunt:

operator relaţie efect$ inclus în returnează valoarea adevărat dacă primul şir de

caractere este conţinut în al doilea şi fals în caz contrar;< mai mic decât returnează “adevărat” dacă relaţia este adevărată şi

“fals” în caz contrar; compararea se face în ordine, la nivel de caracter, astfel: se verifică relaţia dintre primele caractere ale celor două şiruri; dacă acestea sunt egale se trece la cel de-al doilea caracter ş.a.m.d.

> mai mare decât<>, #, != diferit de

<= mai mic sau egal>= mai mare sau egal== identicCompararea a două şiruri de caractere de lungimi diferite este controlată de

comanda SET EXACT ON / OFF. În cazul SET EXACT OFF, care este şi opţiunea implicită, două şiruri care sunt identice pe lungimea celui mai scurt, sunt considerate egale. În cazul SET EXACT ON, pentru a fi egale, două şiruri de caractere trebuie să coincidă caracter cu caracter, blancurile de la sfârşitul şirurilor fiind ignorate.

Funcţii referitoare la codificarea caracterelor din şiruriCHR (expN) – returnează caracterul ASCII corespunzător codului numeric expN;

Exemplu:? CHR (49)1

34

Page 34: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

? CHR (65) ==’A’.T.

ASC (expC) – returnează codul numeric al caracterului ASCII expC;Exemplu:

? ASC (‘A’)65? ASC (‘a’) =ASC (’alfa’).T.

Funcţiile CHR şi ASC sunt funcţii inverse.Exemplu:

? ‘A’ == CHR (ASC (‘A’)).T.? 65 = ASC (CHR(65)).T.

Funcţii referitoare la subşirurile de caractereSUBSTR (expc, expN1, expN2) – extrage subşirul expC, începând de pe poziţia expN1,

pe o lungime de expN2 caractere; dacă expN2 lipseşte, subşirul extras se întinde până la sfârşitul şirului din care se extrage;

Exemplu:? SUBSTR (‘ABCDEF’, 2, 3)BCD? SUBSTR (‘Buna Ziua’, 6)Ziua

LEFT (expC, expN) – extrage din şirul expC, de la stânga spre dreapta, un subşir de expN caractere;

RIGHT (expC, expN) – extrage din şirul expC, de la dreapta spre stânga, un subşir de expN caractere;

Exemplu:? LEFT (‘La multi ani !’, 2)La? RIGHT (‘Noapte buna !’, 6)buna

În mod evident, au loc echivalenţele de funcţii:LEFT (expC, expN) cu SUBSTR (expC, 1, expN)

şi RIGHT (expC, expN) cu SUBSTR (expC, LEN (expC) – expN +1)unde funcţia LEN (expC) returnează lungimea şirului expC;REPLICATE (expC, expN) – returnează un şir obţinut prin repetarea şirului expC de expN

ori;SPACE (expN) – returnează un şir de blancuri cu lungimea expN;

Exemplu:? REPLICATE (‘AB ’, 3)AB AB AB? REPLICATE (‘ ’, 6) == SPACE (6).T.

ALLTRIM (expC) – elimină blancurile de la începutul şi sfârşitul şirului de caractere expC;LTRIM (expC) – elimină blancurile de la începutul şirului de caractere expC, deci de la

stânga lui;RTRIM (expC) – elimină blancurile de la sfârşitul şirului de caractere expC, deci de la

dreapta lui;

Exemplu:? ALLTRIM (‘_ _ _AB ’) == ‘AB ’.T.

35

Page 35: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

? ‘Ma numesc_’ + RTRIM (‘Ionescu_ _ _ ’) + ‘_’ + LTRIM (‘_ _ _ _ Ion’)Ma numesc Ionescu Ion

PADC (expr, expN, expC) – adaugă la ambele capete, la expresia expr, şirul de caractere expC, până se obţine o lungime a şirului de expN caractere;PADR (expr, expN, expC) – adaugă la dreapta, la expresia expr, şirul de caractere expC, până se obţine o lungime a şirului de expN caractere;PADL (expr, expN, expC) – adaugă la stânga, la expresia expr, şirul de caractere expC, până se obţine o lungime a şirului de expN caractere;

Exemplu:? PADL (‘Pagina 1, 40, ‘-’)- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Pagina 1? PADR (‘Pagina 1, 40, ‘-’)Pagina 1- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -? PADC (‘Pagina 1, 40, ‘-’)- - - - - - - - - - - - - - - - Pagina 1 - - - - - - - - - - - - - - - -

AT (expC1, expC2 [,expN]) – caută în şirul de caractere expC2, subşirul expC2, începând cu primul caracter şi continuând cu următoarele; dacă subşirul este găsit, funcţia returnează poziţia subşirului găsit în cadrul şirului, altfel returnează 0; parametrul expN, opţional, indică a câta apariţie a subşirului căutat încheie acţiunea de căutare; funcţia face distincţie între caractere majuscule şi minuscule;

ATC (expC1, expC2 [,expN]) – caută în şirul de caractere expC2, subşirul expC2, începând cu primul caracter şi continuând cu următoarele; dacă subşirul este găsit, funcţia returnează poziţia subşirului găsit în cadrul şirului, altfel returnează 0; parametrul expN, opţional, indică a câta apariţie a subşirului căutat încheie acţiunea de căutare; funcţia nu face distincţie între caractere majuscule şi minuscule;

RAT (expC1, expC2 [,expN]) – caută în şirul de caractere expC2, subşirul expC2, începând de la ultimul caracter, continuând spre începutul şirului, deci de la dreapta spre stânga; dacă subşirul este găsit, funcţia returnează poziţia subşirului găsit în cadrul şirului, altfel returnează 0; parametrul expN, opţional, indică a câta apariţie a subşirului căutat încheie acţiunea de căutare; funcţia nu face distincţie între caractere majuscule şi minuscule;

ACTLINE (expC1, expC2) – caută subşirul de caractere expC1 în şirul expC2 (şir care se întinde pe mai multe linii); returnează 0 dacă subşirul nu a fost găsit, sau numărul liniei în care a fost găsit; căutarea are loc de la stânga la dreapta;

ATLINE – caută subşirul de caractere expC1 în şirul expC2 (şir care se întinde pe mai multe linii); returnează 0 dacă subşirul nu a fost găsit, sau numărul liniei în care a fost găsit; căutarea are loc de la stânga la dreapta; funcţia face distincţie între majuscule şi minuscule;

RATLINE – caută subşirul de caractere expC1 în şirul expC2 (şir care se întinde pe mai multe linii); returnează 0 dacă subşirul nu a fost găsit, sau numărul liniei în care a fost găsit; căutarea are loc de la dreapta la stânga; funcţia face distincţie între majuscule şi minuscule;

OCCURS (expC1, expC2) – returnează numărul de apariţii ale subşirului expC1 în şirul expC2.

Funcţii ce returnează informaţii despre şirurile de caractereLEN (expC) – returnează lungimea şirului de caractere expC;

Exemplu:? LEN (‘Salutari !‘)10? LEN (‘Curs de ‘ + ‘FoxProW’)15

36

Page 36: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

ISALPHA (expC) – returnează adevărat dacă şirul expC începe cu un caracter alfabetic şi fals în caz contrar;

ISDIGIT (expC) – returnează adevărat dacă şirul expC începe cu o cifră şi fals în caz contrar;

ISLOWER (expC) – returnează adevărat dacă şirul expC începe cu o literă mică şi fals în caz contrar;

ISUPPER (expC) – returnează adevărat dacă şirul expC începe cu omajusculă şi fals în caz contrar.

Funcţii privind transformări ale şirurilor de caractereLOWER (expC) – transformă toate majusculele din şirul expC în litere mici, restul

caracterelor rămânând neschimbate;UPPER (expC) – transformă toate literele mici din şirul expC în litere mici, restul

caracterelor rămânând neschimbate;PROPER (expC) – transformă primul caracter al unui cuvânt din şirul expC în majusculă

(dacă este alfabetic), iar următoarele în litere mici.Aceste funcţii sunt foarte utile la compararea a două şiruri de caractere, independent de tipul caracterelor alfabetice care îl compun.

Exemplu:a=’MIHAI’b=’mihai’? UPPER (a) == UPPER (b).T.? LOWER (a) == LOWER ( b).T.? PROPER (‘PoPEscu vaLenTIn’)Popescu Valentin

Funcţii speciale asupra şirurilor de caractereLIKE (expC1, expC2) – compară două expresii de tip şir de caractere astfel: una dintre

expresii reprezintă modelul în care trebuie să se încadreze cea de-a doua, returnând adevărat în caz de potrivire şi fals în caz de nepotrivire; expC1 reprezintă modelul în care se încearcă găsirea lui expC2; în această comparare se pot folosi metacaracterele: “*” – înlocuieşte orice grup de caractere, indiferent de număr şi natură; “?” – înlocuieşte un singur caracter, indiferent de natura acestuia;Căutarea lui expC2 în expC1 este influenţată de starea lui SET COMPATIBLE. Dacă SET COMPATIBLE este ON, înainte de căutare se înlătură toate blancurile de început din cele două şiruri. Pentru SET COMPATIBLE OFF blancurile de început din cele două şiruri nu se mai înlătură înainte de căutare, acestea devenind semnificative în această operaţie. Căutarea este sensibilă la majuscule, dar “*” şi “?” pot înlocui atât litere mici, cât şi majuscule.

Exemplu:? LIKE (‘*TER’, ‘COMPUTER’).T.? LIKE (‘?OTOR’, ‘ROTOR’).T.? LIKE (‘?OTOR’, ‘TRACTOR’).F.

SOUNDEX (expC) – returnează o reprezentare fonetică a unui şir de caractere; primeşte ca parametru şirul de caractere expC şi returnează tot un şir de caractere de lungime 4 reprezentând codificarea fonetică a şirului transmis; această funcţie se foloseşte pentru a afla dacă două şiruri de caractere “sună la fel”; funcţia nu este

37

Page 37: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

sensibilă la majuscule.Exemplu:

? SOUNDEX (‘Toni’) == SOUNDEX (‘Tony’).T.? SOUNDEX (‘Alfabet’)A411

3.4 Tipul dată calendaristicăÎn cazul unei descrieri dinamice a unor obiecte, datele referitoare la acestea privesc

evoluţia lor în timp, deci factorul temporal are o importanţă deasebită în acest caz. Pentru memorarea şi prelucrarea datelor calendaristice s-a introdus acest tip de date, FoxProW oferind o mulţime de funcţii pentru manipularea acestora.

Expresiile de tip dată calendaristică pot conţine: câmpuri de acest tip ale unei baze de date; funcţii ce returnează valori de tip dată calendaristică; variabile de tip dată calendaristică; constante de tip dată calendaristică.

O constantă de tip dată calendaristică se specifică prin luna, ziua şi anul corespunzător, separate prin caracterul “/” şi încadrate între paranteze acolade. Această ordine, separatorul “/”, precum şi faptul că anul se specifică prin două cifre, sunt implicite, dar ele pot fi schimbate.

Exemplu:STORE {02/23/01} TO data_c? data_c02/23/01

Data calendaristică vidă se specifică prin blancuri în poziţia zilei, lunii şi anului, sau printr-un singur blanc încadrat între acolade.

Exemplu:data_v = {_/_/_}? data_v = {_}.T.

FoxProW tratează datele invalide (care nu există) ca date calendaristice vide.Exemplu:

? {02/330/99} = {_}.T.

Constantele de acest tip sunt reprezentate în calculator prin numere reprezentând zile, deci se poate scădea sau aduna o constantă de tip dată calendaristică la o dată fixată.

Exemplu:? {02/29/92} + 103/01/92? {01/01/92} - 112/31/91

Observăm că adunerea unei zile la o dată calendaristică nu are ca efect creşterea cu 1 a numărului de zile, ci avansarea datei cu o zi în ordine calendaristică. Operatorii relaţionali se pot aplica şi asupra datelor calendaristice. De exemplu, o dată calendaristică este mai mare decât o alta atunci când prima îi urmează, calendaristic, celei de-a doua.

Formatul de specificare a datelor calendaristice este controlat de comanda:SET DATE [TO] AMERICAN / ANSI / BRITISH / FRENCH / GERMAN / ITALIAN /

JAPAN / USA / MDY / DMY /YMDFormatul pentru fiecare dintre opţiuni este:

Tipul datei Formatul

38

Page 38: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

AMERICAN ll/zz/aaANSI aa.ll.zz

BRITISH zz/ll/aaFRENCH zz/ll/aaGERMAN zz.ll.aaITALIAN zz-ll-aaJAPAN aa/ll/zz

USA ll-zz-aaMDY ll/zz/aaDMY zz/ll/aaYMD aa/ll/zz

Formatul implicit pentru data calendaristică este cel american.În specificarea anului se pot folosi două sau patru cifre. Alegerea între aceste două

variante se face cu comanda SET CENTURY ON /OFF, unde ON indică două cifre pentru an, iar OFF stabileşte patru cifre pentru an. De asemenea, delimitatorii care separă ziua, luna şi anul din expresia unei constante de tip dată calendaristică se pot modifica prin comanda SET MARK TO expC, unde expC reprezintă un singur caracter care va deveni delimitatorul în reprezentarea externă a datelor calendaristice. Separatorul implicit, până la execuţia unei comenzi SET MARK este caracterul “/”.

Data curentă a sistemului se obţine folosind funcţia DATE ( ). Această dată este controşată de sistemul de operare, FoxProW neavând funcţii sau comenzi care să o modifice direct. Rezultatul funcţiei este de tip dată calendaristică.

Exemplu:? DATE ( )03/07/99SET CENTURY ONSET MARK TO ‘.’? DATE ( )03.07.1999

Având o expresie de tip dată calendaristică, putem afla în ce zi a săptămânii cade această dată. Acest lucru se realizează cu funcţiile DOW (expD) şi CDOW (expD), unde expD este o expresie de tip dată calendaristică. Funcţia returnează ziua din cadrul săptămânii în care cade această dată, astfel:

- ca şir de caractere, reprezentând numele zilei în engleză pentru CDOW;- ca număr, reprezentând a câta zi din săptămână pentru DOW.Exemplu:

? CDOW (DATE ( ))Saturday? DOW ((10/02/1864 ))1

Ziua în cadrul lunii este returnată de funcţia DAY (expD), rezultatul fiind de tip numeric.

Exemplu:? DAY ((03/14/1990) )14

Luna corespunzătoare unei expresii de tip dată calendaristică este returnată de funcţiile:

MONTH (expD) – care returnează un număr reprezentând a câta lună a anului) şi CMONTH (expD) – care returnează denumirea lunii corespunzătoare în limba engleză.Exemplu:

39

Page 39: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

? MONTH (DATE ( ))3? CMONTH ((03/25/1999))March

Pentru a avansa sau a ne înapoia cu un număr de luni se utilizează funcţia: GOMONTH (expD, expN), unde expD reprezintă data calendaristică faţă de care se calculează saltul, iar expN precizează numărul de luni cu care se avansează, încazul unei valori pozitiva, sau cu care se întoarce în timp, în cazul unei valori negative. Rezultatul este de tip dată calendaristică.

Exemplu:? GOMONTH ((02/08/91), 3)05/08/91? GOMONTH ((01/31/90), 1)02/28/90

Dintr-o expresie de tip dată calendaristică putem izola anul, ca valoare numerică folosind fun02/28/90

Dintr-o expresie de tip dată calendaristică putem izola anul, ca valoare numerică folosind funcţia YEAR (expD).

Exemplu:? YEAR (DATE ( ) + 365)2001

Controlul timpului în FoxProWOra exactă a sistemului se obţine cu funcţia TIME ( [expN] ), valoarea returnată

fiind un şir de caractere de lungime 8, în formatul: HH:MM:SS (oră, minute, secunde). Dacă în apelul funcţiei se specifică şi parametrul expN, valoarea returnată va include şi sutimile de secundă

Exemplu:? TIME ( )02:39:49? TIME (0)02:40:01.80

Ora exactă dată de sistem poate fi menţinută tot timpul pe ecran folosind comenzile SET CLOCK ON /OFF – ON face ca ceasul să rămână pe ecran;SET CLOCK TO [linie, coloană] – specifică poziţia pe ecran unde va apărea ora (poziţia

implicită este 0, 60, adică în colţul din dreapta-sus), putându-se reveni la aceasta prin comanda SET CLOCK TO (fără parametri).

Exemplu:CLEARSET CLOCK TO 10, 10SET CLOCK OFFSET CLOCK TOSET CLOCK ONSET CLOCK OFF

Formatul de afişare a ceasului este HH:MM:SS_xx unde xx poate fi “am” sau “pm”. Acest format se poate schimba folosind comanda SET HOURS TO [12 / 24] unde parametrul 24 va implica formatul orei de la 0 la 23, iar parametrul 12 va implica afişarea orei de la 0 la 11 cu “am” sau “pm”.

3.5 Funcţii referitoare la toate tipurile de dateTYPE (expC) – returnează tipul expresiei expC, unde expC reprezintă un şir de caractere;

Caracterul returnat

Tipul expresiei

40

Page 40: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

C şir de caractereN numericD dată calendaristicăL logic, booleanM memoG generalU nedefinit

Exemplu:? TYPE (‘DATE ( )’)D? TYPE (‘1=3’)L? 1=3.F.? TYPE (‘ALFA’)U? TYPE (‘ “ALFA” ’)C? TYPE (‘1456’)N

O funcţie similară cu funcţia TYPE este funcţia:EVALUATE (expC) – în funcţie de conţinutul şirului de caractere expC trimis ca parametru, rezultatul returnat de funcţie în urma evaluării va fi de tip şir de caractere, numeric, dată calendaristică, logic, memo sau general.

Exemplu.? EVALUATE (‘6*3/2’)9? EVALUATE (REPLICATE (‘1’, 4) + ‘/11’)101? DATE ( )03/09/99? EVALUATE (‘DATE ( ) + 1’)03/10/99

Un alt tip de testare a unei expresii este cel referitor la valoarea vidă, nulă, a acesteia, adică dacă aceasta este vidă sau nu, semnificaţia termenului “vidă” diferind de la un tip de date la altul:

Tipul datei Semnificaţia termenului “vid㔺ir de caractere conţine numai spaţii, nuluri,

tab-uri, sfârşit de linienumeric este 0dată calendaristică data vidă ( { / / sau { } )logic este fals .F.memo fără conţinutgeneral fără conţinut

Funcţia care testează acest lucru este EMPTY (expr), rezultatul fiind de tip logic, adevărat dacă expresia este vidă şi fals în caz contrar.

Funcţiile:MIN (expr1, expr2 [,expr3, …] – returnează valoarea minimă obţinută după evaluarea

expresiilor din listă;MAN (expr1, expr2 [,expr3, …] – returnează valoarea maximă obţinută după evaluarea

expresiilor din listă;Exemplu.

41

Page 41: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

? MIN (64, 7*8, 7*9)56? MAX ( {03/08/93}, DATE ( ) ) = DATE ( )

NOTE testeaza daca am depasit data de 08.03.1993.T.? MIN (‘abc’, ‘ABC’, ‘123’)123

O altă funcţie FoxProW care are ca scop compararea unor expresii este funcţia :BETWEEN (expr1, expr2, expr3) – testează dacă expr1 se află între expr2 şi expr3, rezultatul fiind de tip logic.

Exemplu.? BETWEEN (144, 100, 200).T.alfa = ‘a1’? BETWEEN (alfa, ‘aa’, ‘az’).F.

Apartenenţa la o mulţime este testată prin funcţia:INLIST (expr1, expr2 [,expr3,…]) – returnează valoarea adevărat dacă expr1 este găsită

printre expresiile din lista expr2, expr3,… şi fals în caz contrar.Exemplu.

zi = ‘miercuri’? INLIST (zi, ‘luni’, ‘marti’, ‘miercuri’, ‘joi’, ‘vineri’, ‘sambata’, ‘duminica’).T.? INLIST (7, 0, 2, 4, 6, 8, 10).F.

4. VARIABILE ŞI MASIVE

42

Page 42: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

4.1 VariabilePrelucrarea datelor cu ajutorul calculatorului presupune mai întâi depozitarea

acestora într-o memorie internă sau externă a calculatorului. Pentru depozitarea în memoria internă a calculatorului a unei anumite date (de tip numeric, logic, şir de caractere etc.) se foloseşte variabila de memorie, sau simplu variabila. Aceasta reprezintă o zonă de memorie, căreia i se atribuie un nume şi în care se poate memora o valoare de un anumit tip.

Deci o variabilă are trei elemente specifice şi anume: numele variabilei, atribuit de programator sau predefinit de FoxProW, folosit pentru

identificarea variabilei respective printre celelalte variabile existente la un moment dat în memorie;

conţinutul sau valoarea variabilei, reprezentând data ce este memorată în zona de memorie a variabilei; în timpul unui program, conţinutul unei variabile se poate modifica;

tipul variabilei, reprezentând tipul datei ce se poate memora în zona de memorie a variabilei; acest tip determină de asemenea şi comenzile şi funcţiile ce se pot aplica variabilei respective.

Exemplu:nume conţinut + tip

Variabilă alfa 432

Referirea la o variabilă se face prin numele său. Astfel:? alfa432

se traduce prin “afişează (?) conţinutul variabilei alfa (432)”. Variabila alfa este de tip numeric, înţelegând prin aceasta că ea poate memora un număr, o valoare de tip numeric.

Pentru folosirea unei variabile într-un program FoxProW, ea trebuie mai întâi creată, aceasta presupunând: atribuirea unui nume variabilei respective (numele este furnizat de program, la

conceperea programului); stabilirea tipului şi rezervarea zonei de memorie care este atribuită variabilei; atribuirea unei valori iniţiale pentru aceasta, adică stabilirea conţinutului iniţial al

variabilei.Crearea unei variabile sau modificarea valorii acesteia se realizează prin

operatorul de atribuire, cu următoarea sintaxă:< variabilă > = < expr >

Funcţionarea unei asemenea comenzi sre loc astfel: se evaluează expresia “expr”, obţinându-se o valoare de un anumit tip; se caută în memorie variabila cu numele “variabilă” şi, dacă se găseşte, se înlocuieşte

vechiul conţinut al acesteia cu valoarea expresiei; tipul variabilei este dat de tipul valorii expresiei, indiferent de tipul anterior al variabilei,

în cazul când aceasta exista şi înaintea executării comenzii.Exemplu:a=2 && se creeaza variabila numerica “a”;

cu valoarea initiala 2a=”buna” && vechea variabila “a” este inlocuita cu;

una noua, de tip sir de caractere, ce; va contine sirul “buna”

data={12\01\70} && se creeaza variabila “data”,;de tip data calendaristica,;cu valoarea initiala {12\01\70}

O comandă echivalentă cu operatorul de atribuire este comanda STORE:STORE < expr > TO < listă variabile >

43

Page 43: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Comanda constă în evaluarea expresiei “expr” şi depunerea valorii rezultate în toate variabilele din “listă variabile”. Cele care nu există vor fi create odată cu execuţia comenzii.

Exemplu:STORE 0 TO a, b, cNOTE se creeaza trei variabile numerice a, b, c, care;

sunt initializate cu valoarea 0STORE {01\11\93} TO dataNOTE se creeaza variabila data, de tip data;

calendaristica si se initializeaza aceasta; cu valoarea {01\11\93}

Comanda STORE şi operatorul de atribuire creează şi modifică variabile care sunt folosite în cadrul unui program. Dacă nu mai sunt necesare după ce au fost folosite, memoria ocupată de ele poate fi eliberată folosind comanda RELEASE:RELEASE < listă variabile > sauRELEASE ALL [ LIKE < machetă > / EXCEPT < machetă >]

În prima variantă se vor înlătura din memorie toate variabilele din “listă variabile”, aceasta fiind alcătuită din numele variabilelor, separate prin virgulă. Comanda RELEASE ALL, fără alţi parametri, elimină din memorie toate variabilele şi toate masivele.

Pentru a elimina din memorie numai o parte a variabilelor, putem folosi clauzele LIKE şi EXCEPT, astfel:

RELEASE ALL LIKE < machetă > - va înlătura din memorie toate variabilele care se potrivesc cu “machetă”;

RELEASE ALL EXCEPT < machetă > - va înlătura din memorie toate variabilele, cu excepţia celor care se potrivesc cu “machetă”.

În alcătuirea machetei pot intra şi metacaracterele * şi ? cu semnificaţiile: * – orice combinaţie de caractere; ? – orice caracter.

Exemplu:RELEASE alfa, betaNOTE se elimină din memorie variabilele alfa si betaRELEASE ALL LIKE a*NOTE se inlatura din memorie toate variabilele;

care incep cu litera aRELEASE ALL EXCEPT b?NOTE se vor elimina toate variabilele cu exceptia;

celor al caror nume este format din doua; caractere, din care primul este b

De asemenea, variabilele vor fi înlăturate din memorie şi la execuţia uneia dintre comenzile CLEAR ALL sau CLEAR MEMORY. Ambele comenzi, pe lângă alte efecte, elimină din memorie şi toate variabilele existente la momentul execuţiei respectivei comenzi.

Apare deseori situaţia în care se doreşte memorarea unor variabile (denumire şi conţinut) pe un dispozitiv de memorare extern, în vederea modificării acestora în memoria internă. După ce modificările executate nu mai sunt necesare, se va putea reveni la vechea situaţie prin refacerea variabilelor depozitate anterior.

Salvarea unui grup de variabile pe disc, într-un fişier, în vederea unei refaceri ulterioare, se realizează prin intermediul comenzii SAVE TO, iar operaţia inversă, adică restaurarea în memoria internă a unui grup de variabile salvate anterior într-un fişier pe disc, este posibilă folosind comanda RESTORE FROM:

44

Page 44: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

SAVE TO < fişier > / TO MEMO < câmp memo > [ALL LIKE / EXCEPT < machetă >]RESTORE FROM < fişier > / FROM MEMO < câmp memo > [ADDITIVE]

Comanda SAVE TO depozitează variabilele existente în memorie, în fişierul “fişier” sau în câmpul memo “câmp memo”, când se foloseşte clauza TO MEMO. Dacă se doreşte salvarea numai a unora dintre variabilele de memorie existente, acestea se vor specifica prin “machetă”, în clauzele ALL LIKE sau ALL EXCEPT (prezentate anterior).

Refacerea tuturor variabilelor prin comanda RESTORE FROM va avea ca efect înlăturarea tuturor variabilelor de memorie care existau înainte de execuţia comenzii. Pentru a evita acest lucru, în comandă se va introduce clauza ADDITIVE, care va determina adăugarea noilor variabile la cele anterioare (evident, când numele acestora diferă). Fişierul creat cu comanda SAVE TO şi utilizat de RESTORE FROM va avea extensia implicită .MEM, dacă în comandă nu se specifică o altă extensie.

Exemplu:CLEAR ALL

CLEARa=1b=2suma=a+b? a, ‘+’, b, ‘=’, suma1 + 2 = 3SAVE TO f_varNOTE se salveaza variabilele a, b, si suma;

in fisierul f_var.mema=5b=3suma=a+b? a, ‘+’, b, ‘=’, suma5 + 3 = 8RESTORE FROM f_var? a, ‘+’, b, ‘=’, suma1 + 2 = 3

O tehnică specială de lucru cu variabile o reprezintă macrosubstituţia, prin care conţinutul unei variabile de tip şir de caractere este tratat ca numele unei alte variabile sau alt câmp al FoxProW-ului (câmp al unei baze de date, denumire de fişier). Macrosubstituţia funcţionează ca şi cum în locul variabilei respective ar fi pus şirul de caractere conţinut de aceasta, fără apostrofurile delimitatoare.

Sintaxa macrosubstituţiei este:& < var > [, < expC > ]

în care “var” desemnează variabila de tip şir de caractere care va fi substituită de conţinutul său.

Exemplu:a=’alfa’

alfa=’Salut !’? &aSalut !? alfa &&echivalenta cu comanda anterioaraSalut !

45

Page 45: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Ultimele două comenzi sunt echivalente. Astfel, comanda ? &a va fi tratată astfel: se preia conţinutul variabilei a şi se introduce în locul construcţiei &a obţinându-se comanda ? ’alfa’, după care se elimină apostrofurile delimitatoare, rezultând comanda ? alfa, care va fi executată.

Variabila macrosubstituţiei nu trebuie să conţină un şir mai lung de 255 caractere.La conţinutul variabilei macrosubstituţiei se poate adăuga un şir de caractere

“expC”. Acesta se va concatena la sfârşitul şirului de caractere conţinut în variabilă, după care se va aplica macrosubstituţia.

Exemplu:a=’alfa’

alfa1=’Salut !’? &a.’1’Salut !? alfa1 Salut !

Comanda ? &a.’1’ va fi tratată astfel: se preia conţinutul variabilei a, “alfa”, la care se adaugă şirul de caractere ce urmează punctului, “1”, obţinându-se şirul “alfa1” care se introduce în instrucţiune în locul construcţiei &a.’1’. Se va obţine comanda ? ’alfa1’ din care se vor elimina apostrofurile delimitatoare, ajungându-se în final la comanda ? alfa1 care este identică cu cea din linia care urmează.

Expresia de tip şir de caractere “expC” poate fi la rândul ei o macrosubstituţie. Nu se permite însă referirea recursivă a unei variabile într-o macrosubstituţie. Astfel, instrucţiunile următoare nu vor funcţiona:a=’&a’

? &aO altă metodă de referire indirectă la o variabilă, dată etc., pe lângă

macrosubstituţie, este reprezentată de expresiile nume. Acestea determină tratarea valorii unei expresii ca un nume (de variabilă, de câmp al unei baze de date, de masiv etc.). Rezultatul acestei operaţii este asemănător cu cel al macrosubstituţiei.

Pentru ca o expresie să fie tratată ca o expresie de tip nume, aceasta se încadrează între paranteze rotunde. Construcţia este tratată ca o expresie de tip nume numai acolo unde nu există posibilitatea confundării parantezelor rotunde cu cele care grupează operaţiile din expresiile FoxProW.

Exemplu:a=’nume’

b=’ propriu’? (a+b) && nu va fi tratata ca o expresie numenume propriu…

REPLACE (a) WITH ’Popescu’NOTE in acest caz (a) este o expresie nume

Ori de câte ori este posibilă folosirea expresiilor nume, se recomandă această metodă, pentru că macrosubstituţia este mai lentă.

Pentru afişarea conţinutului variabilelor de memorie existente la un moment dat se poate folosi una dintre comenzile LIST MEMORY sau DISPLAY MEMORY:

DISPLAY MEMORY [LIKE < machetă >] [TO PRINTER / TO FILE < fişier >] [NO CONSOLE]

LIST MEMORY [LIKE < machetă >] [TO PRINTER / TO FILE < fişier >] [NO CONSOLE]

Ambele comenzi afişează numele, tipul şi conţinutul tuturor variabilelor definite la un 46

Page 46: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

moment dat, numărul variabilelor create de utilizator, memoria folosită şi cea disponibilă.Pentru selectarea spre afişare doar a unora dintre variabilele definite se foloseşte

clauza LIKE, prin “machetă” desemnându-se variabilele ce vor fi afişate. Afişarea se poate face fie la imprimantă (TO PRINTER), fie în fişierul “fişier” (TO FILE), în paralel cu afişarea pe ecran. Dacă se doreşte inhibarea afişării pe ecran se va folosi clauza NO CONSOLE, putându-se astfel obţine doar tipărirea variabilelor sau afişarea lor într-un fişier.

Alături de variabilele pe care utilizatorul le defineşte, prin program sau în mod direct, prin introducerea de comenzi, FoxProW mai foloseşte un set de variabile, predefinite, menţinute automat în memorie, în vederea controlului diferitelor operaţii, cum ar fi: formatul afişării datelor pe ecran, la imprimantă, funcţionarea mouse-ului etc. Acestea se numesc variabile sistem.

4.2 MasiveO metodă pentru memorarea mai multor valori în memoria internă a calculatorului

este oferită de masive – structuri de date care permit memorarea mai multor valori într-o zonă de memorie continuă căreia i se atribuie un nume, valorile respective putând fi tratate atât ca un tot unitar, cât şi independent, ca variabile simple.

Masivele sunt organizate sub forma unui tablou de valori, unidimensional sau bidimensional, deci sub formă de vectori sau de matrice. Declararea unui masiv presupune următoarele operaţii: stabilirea tipului masivului, adică dacă acesta este vector sau matrice; rezervarea zonei de memorie necesară depozitării valorilor care vor fi memorate în

masiv, în funcţie de numărul de elemente ale acestuia; atribuirea unui nume prin care masivul va fi identificat.

Declararea unui masiv se realizează prin una dintre comenzile DIMENSION sau DECLARE, care sunt identice ca funcţionare şi sintaxă:

DIMENSION < masiv1 > ( <expN1 >) [, < expN2 >])[, < masiv2 > ( <expN3 >) [, < expN4 >] ) ] …

DECLARE < masiv1 > ( <expN1 >) [, < expN2 >])[, < masiv2 > ( <expN3 >) [, < expN4 >] ) ] …

Cu aceste comenzi se pot declara unul sau mai multe tablouri, ale căror nume vor fi “masiv1”, “masiv2”, … Tipul tabloului, unidimensional (vector) sau bidimensional (matrice), va fi dat de numărul de expresii numerice care urmează numelui: unidimensional când este prezentă o singură expresie, sau bidimensional când între parantezele rotunde se află două expresii.

Dimensiunea tabloului, adică numărul de elemente ale acestuia, este dată de valorile expresiilor dintre paranteze (“expN1” şi “expN2” pentru primul tablou, “expN3” şi “expN4” pentru cel de-al doilea ş.a.m.d.)

Exemplu:DIMENSION a(10)NOTE defineste vectorul a cu 10 elemente, numerotate;

de la 1 la 10DIMENSION alfa (2, 4)NOTE va declara matricea alfa cu 2 linii si 4 coloaneDECLARE vector (3), mat (5, 10)NOTE se definesc vectorul vector cu 3 elemente,;

si matricea mat cu 5 linii si 10 coloane.În comenzile DIMENSION şi DECLARE se pot înlocui parantezele rotunde cu cele

pătrate, fără a afecta comanda respectivă.Elementele masivului sunt identificate prin poziţia acestora în cadrul tabloului,

astfel: printr-un singur număr, indicând poziţia elementului în cadrul vectorului;

47

Page 47: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

prin două numere, indicând linia şi coloana în cadrul matricei.Elementele unei matrice pot fi, de asemenea identificate printr-un singur

indice, care va indica poziţia în matrice a elementului respectiv, astfel: mai întâi se numără elementele unei linii, după care se trece la următoarea.

Exemplu:alfa (1) alfa (2) alfa (3) alfa (4)alfa (5) alfa (6) alfa (7) alfa (8)

Elementul din linia 2 şi coloana 3 poate fi identificat atât prin alfa(2,3), cât şi prin alfa(7).

După declararea unui masiv, toate elementele acestuia vor fi de tip logic, având iniţial valoarea .F. Atât tipul, cât şi valoarea unui element al masivului pot fi schimbate printr-o instrucţiune de atribuire (operatorul de atribuire “=” sau comanda STORE).

Spre deosebire de alte limbaje de programare, în FoxProW elementele unui masiv nu trebuie neapărat să fie de acelaşi tip.

O modalitatea specială de iniţializare a elementelor unui masiv este dată de folosirea unei instrucţiuni de atribuire în care, în locul variabilei de atribuit, este introdus numele masivului. Astfel, toate elementele masivului vor căpăta valoarea expresisi din instrucţiune.

Exemplu:DIMENSION a(10)STORE 0 TO aNOTE toate elementele masivului vor fi de tip numeric,;

avand initial valoarea 0? ‘a(3) =’, a(3)a(3)=0a=’ ‘NOTE tipul tuturor elementelor masivului a va fi ;

sir de caractere si toate elementele; acestuia vor avea valoarea ‘ ‘

Mărimea şi dimensiunile unui tablou creat anterior se pot schimba printr-o nouă comandă DIMENSION sau DECLARE, pentru redefinirea acestuia.

Se pot realiza astfel: mărirea sau micşorarea dimensiunii unui tablou unidimensional; transformarea unui tablou unidimensional într-unul bidimensional şi invers; redimensionarea unui tablou bidimansional.

Pentru masive unidimensionale: la mărirea numărului de elemente ale acestuia, vechile elemente vor rămâne

neschimbate, iar noile elemente vor fi de tip logic, având iniţial valoarea .F.; la micşorarea dimensiunii masivului, elementele care sunt în plus vor fi eliminate din

memorie, iar celelalte vor rămâne neschimbate.Transformarea unui masiv bidimensional într-unul unidimensional se face

copiind elementele vechiului masiv, linie cu linie, în cadrul fiecărei linii copierea făcându-se până la ultimul element al acesteia. În această situaţie apar două cazuri:

masivul bidimensional avea mai multe elemente decât noul masiv unidimensional: în acest caz restul elementelor care nu au încăput se pierd;

noul masiv creat, unidimensional, are mai multe elemente decât vechiul masiv bidimensional, caz în care restul elementelor masivului unidimensional pentru care nu au mai fost elemente de copiat din primul masiv, vor fi iniţializate cu valoarea logică .F.

Trecerea inversă se face în mod analog: completarea masivului bidimensional se face pe linii, începând cu prima linie a masivului şi terminând cu ultima. Şi în acest caz, elementele care nu încap în noul masiv bidimensional se pierd, iar elementele masivului bidimensional pentru care nu au

48

Page 48: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

corespondent în masivul unidimensional vor fi de tip logic, cu valoarea iniţială .F.

Redimensionarea unui masiv bidimensional se realizează prin alocarea memoriei necesare noului masiv bidimensional, după care urmează copierea elementelor vechiului masiv în cel nou, în ordinea numerotării acestora.

Elementele vechiului masiv bidimensional care nu încap în cel nou se vor pierde, iar dacă există elemente ale noului masiv care nu au corespondent în vechiul masiv, acestea vor fi iniţializate la valoarea logică .F.

Exemplu:DIMENSION a(2,3)FOR I=1 TO 6

a( I ) = IENDFORFOR I=1 TO 2

?FOR J=1 TO 3

?? a(I, J)ENDFOR

ENDFOR?DIMENSION a(3, 4)FOR I=1 TO 3

?FOR J=1 TO 4

?? a(I, J)ENDFOR

ENDFORVom obţine pe ecran următoarele rezultate:

1 2 34 5 6

1 2 3 45 6 .F. .F.

.F. .F. .F. .F.

Funcţii referitoare la prelucrarea masivelorALEN ( <masiv> [, <expN>] ) – returnează numărul elementelor, numărul liniilor sau

numărul coloanelor unui masiv; “masiv” desemnează masivul asupra căruia ne informăm, iar “expN” este o expresie numerică care determină informaţia returnată, astfel: dacă expN = 0, funcţia returnează numărul de elemente ale masivului; dacă expN = 1, funcţia returnează numărul de linii ale masivului (numărul de

elemente pentru masivele unidimensionale); dacă expN = 2, funcţia returnează numărul de coloane ale masivului (0 pentru

masivele unidimensionale).Valoarea returnată de funcţie este de tip numeric.Exemplu:

DIMENSION alfa(3,5)? ‘Tabloul alfa are ‘, ALEN(alfa), ‘elemente’Tabloul alfa are 15 elemente? ‘Acest tablou are ‘, ALEN(alfa,1), ‘linii si ‘,;ALEN(alfa,2), ‘coloane’

49

Page 49: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Acest tablou are 3 linii si 5 coloane

Absenţa expresiei numerice “expN” este echivalentă cu valoarea 0 a acesteia.Exemplu:

DIMENSION alfa(10)? ALEN(a) = ALEN(a,0).T.

AINS (<masiv>, <expN> [,2]) – inserează un element, o linie sau o coloană într-un masiv astfel: pentru masive unidimensionale funcţia va insera un nou element în poziţia

“expN” a masivului “masiv”; pentru masive bidimensionale funcţia va insera o linie, a “expN”-a linie a

masivului “masiv” atunci când lipseşte parametrul 2, sau va insera o coloană, a “expN”-a coloană atunci când parametrul 2 este prezent.

Inserarea unui element, a unei linii sau a unei coloane într-un masiv, nu va determina modificarea dimensiunii acestuia, ci pierderea elementelor care nu mai încap în masiv, după ce inserarea a avut loc.

Exemplu:DIMENSION a(5)FOR I=1 TO 5

a(I)=IENDFOR?FOR i=1 TO5

?? a(I)ENDFORAINS(a,3)FOR i=1 TO 5

?? a(I)ENDFOR

În exemplul anterior, inserarea elementului nou pe poziţia a 3-a a masivului unidimensional a va avea loc astfel:

a(1) a(2) a(3) a(4) a(5)1 2 3 4 51 2 .F. 3 4 5

ADEL (<masiv>, <expN> [,2]) – funcţie opusă lui AINS, şterge un elementul <expN> î]n cazul în care acesta este unidimensional, sau linia sau coloana <expN> dacă acesta este bidimensional; parametrul 2, ca şi la funcţia anterioară, face distincţie între ştergerea unei linii (absenţa acestui parametru) şi ştergerea unei coloane (prezenţa parametrului); după ştergere, calelalte elemente sunt translatate, în vederea umplerii golului format, iar pe ultima poziţie, ultimul element, ultima linie sau ultima coloană, eliberată prin translatare, se va introduce valoarea logică fals.Exemplu:

DIMENSION a(5)FOR I=1 TO 5

a(I)=IENDFOR?

50

Elementul nou apare aici Acest element se pierde

Page 50: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

FOR i=1 TO5?? a(I)

ENDFORADEL(a,3)FOR i=1 TO 5

?? a(I)ENDFOR

a(1) a(2) a(3) a(4) a(5)1 2 3 4 51 2 4 5 .F.

Referirea la elementele unui masiv bidimensional se poate face în două moduri: prin doi indici reprezentând linia şi coloana elementului respectiv în cadrul masivului, sau printr-un singur indice, acesta reprezentând poziţia elementului în masiv, numeroterea elementelor făcându-se astfel: mai întâi se numără elementele primei linii, după care s etrece la cea de-a doua şi aşa mai departe.

Pentru a afla poziţia unui element al unui masiv, când se cunoaşte linia şi coloana pe care se află acesta se foloseşte funcţia:AELEMENT (<masiv>, <expN1> [,<expN2>]) – unde “masiv” desemnează masivul,

tabloul la care se referă funcţia, iar “expN1”, expN2” reprezintă linia şi coloana elementului referit; dacă “expN2” lipseşte, masivul este unidimensional, funcţia returnând valoarea “expN1”; rezultatul funcţiei este de tip numeric.Unele funcţii FoxProW referitoare la masive manipulează elementele tablourilor

bidimensionale printr-un singur indice, pentru aflarea acestuia folosindu-se funcţia prezentată anterior. Funcţia care realizează transformarea inversă, deci de la un singur indice la doi este:ASUBSCRIPT (<masiv>, <expN1>, <expN2>) – unde “masiv” desemnează tabloul la

care se referă funcţia, iar “expN1” reprezintă poziţia elementului în tablou (specificată printr-un singur indice); “expN2” este o expresie numerică ce determină tipul informaţiei returnate de funcţie şi anume: linia elementului când “expN2” are valoarea 1, coloana elementului în cazul valorii 2 a lui “expN2”.Exemplu: având un masiv bidimensional definit cu:

DIMENSION a(4,6)următoarele referiri sunt echivalente:

a(2,3)a(9)a( AELEMENT(a,2,3))a( ASUBSCRIPT(a,9,1), ASUBSCRIPT(a,9,2))

Copierea elementelor unui masiv în elementele altui masiv se face prin intermediul funcţiei:ACOPY (<masiv1>, <masiv2>, [,<expN1> [,<expN2> [,<expN3>]]]) – unde “expN2”

reprezintă numărul de elemente ale masivului “masiv1”, începând de la al “expN1”-lea inclusiv, care se copiază în masivul “masiv2”, începând de la poziţia “expN3”; se observă că referirea la elementele masivului se face printr-un singur indice; dacă “expN1” lipseşte, se ia implicit valoarea 1 a acestei expresii; pentru a copia toate elementele masivului “masiv1”, începând de la poziţia “expN1” şi până la sfârşit, în masivul “masiv2”, se va folosi valoarea –1 pentru expresia “expN2”; când masivul “masiv2” nu există, se creează unul nou, cu aceeaşi dimensiune, în care se copiază conţinutul masivului “masiv1”.

ADIR (<masiv> [,<expC1> [,<expC2>]]) – determină încărcare în masivul “masiv” a informaţiilor despre fişierele din directorul curent, adică numele, mărimea, data şi

51

Dispare acest element

Page 51: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

tipul actualizării, atributele fişierelor respective; dacă masivul nu există, acesta se va crea la executarea funcţiei, iar dacă acesta există, dimensiunile sale vor fi potrivite pentru memorarea tuturor informaţiilor despre fişierele găsite; fişierele vor fi selectate incluzând masca “expC1”, care poate conţine metacaracterele “*” (desemnând orice combinaţie de caractere) şi “?” (desemnând orice caracter); coloanele masivului vor avea următorul conţinut:

Coloană Conţinut Tipul1 numele fişierului şir de caractere2 mărimea numeric3 data ultimei actualizări dată calendaristică4 tipul ultimei actualizări şir de caractere5 atributele fişierului şir de caractere

Atributele fişierelor vor fi codificate prin caractere satfel:A arhivă (citire şi scriere) (Archieve)H ascuns (Hidden)R numai citire (Read only)S sistem (Sistem)D director (Directory)

În şirul “expC1” se poate include o cale completă pentru căutarea fişierelor în alt director şi/sau alt disc, decât cel curent; “expC2” este un şir de caractere care poate conţine unul din codurile speciale de mai sus pentru selectarea subdirectoarelor, fişierelor ascunse şi a fişierelor sistem care se potrivesc măştii date prin “expC1”; în “expC2” se poate folosi codul V care determină încărcarea în masiv doar a etichetei de volum a discului curent, masivul fiind trunchiat după primul elementExemplu:

ADIR (masiv, ‘*.PRG’, ‘H’)NOTE se incarca toate programele *.PRG ;

inclusiv cele ascunseADIR (masiv, ‘C:\*’, ‘D’)NOTE se incarca toate subdirectoarele radacinii;

discului CADIR (masiv, ‘*.DBF’)NOTE se incarca toate bazele de dateADIR (masiv, ‘C: ‘, ‘V’)NOTE se incarca in primul element (singurul) al;

masivului masiv eticheta de volum a discului CDacă “expC1” este şirul nul, se vor încărca în masiv doar subdirectoarele, fişierele

ascunse sau fişierele sistem, în funcţie de conţinutul lui “expC2”.ADIR (masiv, ‘ ‘, ‘D’)NOTE se incarca toate subdirectoarele directorului curent

AFIELDS (<masiv>) – încarcă în masiv structura bazei de date curente, masivul având următoarea structură:

Coloană Conţinut Tipul1 nume câmp şir de caractere2 tip câmp (C, D, L, M, G, N sau F) şir de caractere3 lungime câmp numeric4 număr zecimale numeric

Dacă masivul nu există, atunci se va crea unul cu acest nume, iar dacă dimensiunile acestuia nu corespund, ele vor fi ajustate după necesităţi.ASCAN (<masiv>, <expr> [,<expN1> [,<expN2>]]) – caută în masivul “masiv” expresia

“expr”; se poate limita căutarea la o anumită porţiune, începând cu al “expN1”-lea

52

Page 52: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

element (implicit ia valosrea 1), iar la căutare vor fi testate “expN2” elemente (dacă lipseşte, se va căuta până la sfârşitul masivului.

ASORT (<masiv> [,<expN1> [,<expN2> [,<expN3>]]]) – sortează elementele masivului “masiv” în ordine crescătoare sau descrescătoare; toate elementele sortate trebuie să fie de acelaşi tip, pentru a se putea compara între ele; pentru masivele unidimensionale se vor sorta elementele acestuia, iar pentru cele bidimensionale se vor sorta liniile masivului respectiv, în sensul că, în funcţie de rezultatul comparării a două elemente ale unor linii distincte, se vor schimba sau nu între ele toate elementele acestor linii, fiecare element rămânând pe coloana pa care a fost şi înainte; dacă masivul este unidimensional “exp1” va desemna elementul de unde se începe sortarea; în cazul când avem un masiv bidimensional, prima linie care va intra la sortare va fi cea pe care se află elementul al “expN1”-lea al masivului; de asemenea “expN1” determină şi coloana de pe care se iau elementele de comparat, pentru a stabili ordinea liniilor.Exemplu: dacă avem masivul a(3,4), iar “expN1” este 7, avem situaţia:

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)

Elementul al 7-lea este a(2,3), deci se vor sorta liniile 2 şi 3 ale masivului, compararea acestora făcându-se prin a(2,3) şi a(3,3) (deci elementele de pe coloana a treia).“expN2” specifică numărul elementelor sortate în cazul unui masiv unidimensional, sau numărul liniilor de sortat, pentru un masiv bidimensional; dacă “expN2” este –1 sau dacă această expresie lipseşte, se vor sorta elementele, liniile până la sfârşitul masivului (ultimul element, respectiv ultima linie); “expN3” determină ordinea sortării şi anume: crescătoare dacă “expN3” lipseşte sau are valoarea 0 şi descrescătoare pentru o valoare diferită de 0; rezultatul funcţiei este de tip numeric.Exemplu:

DIMENSION a(4,5)ASORT (a)NOTE se sorteaza crescator masivul a pe linii,;

criteriul de sortare fiind dat de;compararea elementelor de pe coloana 1

ASORT (a,3,4)NOTE se vor sorta crescator liniile 1, 2, 3 si 4;

ale masivului a, dupa coloana a 3-aASORT (a,7,2,1)NOTE se sorteaza descrescator masivul a pe linii,;

incepand de la linia 2, compararea intre;linii facandu-se prin elementele coloanei 2

53

Page 53: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

5. LIMBAJ DE PROGRAMARE

5.1 GeneralităţiDupă cum se ştie, pe discuri informaţiile sunt organizate în fişiere. Obază de date

reprezintă tocmai un astfel de fişier, cu o anumită organizare, ce permite accesul direct şi complet la datele stocate în acesta.

O bază de date are o organizare tabelară, pe linii şi coloane, având următoarele corespondenţe: capului de tabel îi corespunde “structura bazei de date”; coloanele vor fi numite câmpuri; liniile se vor numi înregistrări.

La crearea unei baze de date trebuie specificată structura acesteia. Pentru a specifica univoc structura unei baze de date, trebuie indicate câmpurile care o compun (printr-un nume asociat fiecărui câmp), cât şi caracteristicile acestora (tipul de date ce se memorează în acel câmp, lungimea câmpului etc.).

Accesul la datele din bazele de date se face la nivel de înregistrare. La un moment dat putem avea acces la o singură înregistrare a unei baze de date, care se numeşte “înregistrare curentă”. Aceasta este localizată prin “indicatorul de înregistrări”, care reprezintă o zonă de memorie ce conţine numărul înregistrării curente. Acesta poate fi considerat ca o variabilă de memorie asociată bazei de date şi care există atâta timp cât este deschisă baza de date. La un moment dat o singură înregistrare a bazei de date este cea curentă, numărul acesteia fiind dat de indicatorul de înregistrări.

O imagine intuitivă a indicatorului de înregistrări este dată de următoarea figură:Indicatorul de înregistrări poate fi

modificat prin comenzi FoxProW, acest lucru fiind echivalent cu deplasarea săgeţii indicatorului de înregistrări în sus şi în jos,de-a lungul bazei de date.

Pentru a folosi o bază de date, aceasta trebuie mai întâi deschisă (se presupune că aceasta a fost creată anterior). Deschiderea bazei de date presupune rezervarea în memoria internă a calculatorului a unei zone de memorie în care FowProW va depozita toate informaţiile necesare utilizării acestei baze

(cum ar fi structura, numărul de înregistrări etc.). Această zonă de memorie poartă numele de “zonă de lucru” (în engleză “work area”). FoxProW poate manipula mai multe baze de date simultan, deci acesta dispune de mai multe zone de lucru, 225 la număr, în care se deschid bazele de date respective. Asocierea bazelor de date zonelor de lucru este controlată de programator, acesta având la dispoziţiecomenzi şi funcţii specializate în acest scop.

După deschiderea unei baze de date (într-o zonă de lucru) se poate trece la lucrul cu aceasta, adică: preluarea de date din baza de date; modificarea datelor deja existente; adăugarea de noi date; ştergerea de date din baza de date etc.

După terminarea lucrului cu baza de date urmează închiderea acesteia, operaţie ce constă în:

desfacerea legăturii dintre zona de lucru şi baza de date; eliberarea memoriei alocate la deschidere (eliberarea zonei de lucru); închiderea fişierului bazei de date, memorând modificările efectuate de la deschidere până în

54

Nr. înregistrare curentă

Baza de dateIndicatorul de înregistrări

Înregistrări**************

Page 54: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

acest moment.

5.2 Zone de lucruPentru manipularea bazelor de date FoxProW foloseşte zonele de lucru, 225 la număr, în

care acesta depune informaţiile necesare efectuării operaţiilor cu bazele de date respective.Pentru identificarea zonelor de lucru respective se folosesc două metode:

- primele 10 zone de lucru se identifică prin litere de la A la Z, adică primele 10 litere din alfabet;

- pentru toate celelalte zone de lucru putem folosi pentru identificare numerele de la 1 la 225.

La deschiderea unei baze de date într-o zonă de lucru, acesteia i se atribuie un nume pe care îl vom numi “alias” (pseudonim). Deci baza de date deschisă în zona de lucru va putea fi identificată şi prin aliasul respectiv.

La un moment dat, din cele 225 zone de lucru ale FoxProW-ului, una singură este curentă. Aceasta înseamnă că o anumită comandă, în interiorul căreia nu s-a specificat explicit baza de date la care se referă, va acţiona asupra bazei de date deschisă în zona curentă.

La pornirea FoxProW-ului zona de lucru curentă va fi zona A, sau 1. Aceasta se poate schimba folosind comanda SELECT:

SELECT <expN> | <expC>În această comandă, <expN> reprezintă numărul zonei de lucru ce va fi activată, adică va

deveni zona de lucru curentă. Dacă <expN> este 0 se va selecta prima zonă de lucru neocupată (în care nu s-a deschidă nici o bază de date). De asemenea, zona de lucru se poate specifica şi prin <expC>, expresie de tip şir de caractere ce reprezintă aliasul bazei de date deschise în acea zonă de lucru.

Exemplu:SELECT 1 && zona curentă va fi zona 1

SELECT A && echivalenta cu prima comandaPresupunem că în zona de lucru 2 avem deschisă baza de date DEBITE; pentru

selectarea acestei zone putem folosi comenzile:SELECT 2SELECT BSELECT debiteSELECT ‘debite’

acestea fiind echivalente.Pentru a afla care este zona curentă se foloseşte funcţia SELECT ( ), aceasta returnând

numărul zonei de lucru curente sau numărul ultimei zone de lucru nefolosite. Sintaxa comenzii este:SELECT ( [ 0 | 1 ] )

în care observăm că putem transmite funcţiei unul din doi parametri, 0 sau 1, cu următoarea semnificaţie:- incluzând 0 ca parametru, funcţia returnează numărul zonei de lucru curente;- 1 face ca funcţia să returneze numărul ultimei zone de lucru nefolosite.

Comenzile SELECT ( ) şi SELECT (0) sunt echivalente.? SELECT ( ) && afiseaza zona de lucru curenta1? SELECT (1) && afiseaza ultima zona de lucru nefolosita225SELECT SELECT ( ) + 1NOTE se selecteaza prima zona de lucru dupa cea curenta? SELECT (0)25.3 Crearea unei baze de date. Structura bazei de dateCorespunzător celor două metode de transmitere a comenzilor utilizatorului către FoxProW,

prin meniuri şi prin instrucţiuni în fereastra de comenzi, există două metode de creare a unei baze de 55

Page 55: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

date: în mod interactiv, prin intermediul meniurilor şi direct, printr-o comandă complexă introdusă în fereastra de comenzi.

Comanda CREATE, cu sintaxa:CREATE [ <fişier> | ? ]

determină deschiderea unor ferestre în care utilizatorul specifică în mod interactiv caracteristicile noii baze de date ce se va crea (metodă prezentată în capitolul “Baze de date – Meniuri”).

<fişier> reprezintă numele fişierului bazei de date ce va fi creat. Dacă pentru acest fişier nu se specifică nici o extensie, FoxProW asociază automat extensia .DBF. Dacă nu se specifică numele fişierului, sau se specifică parametrul ?, pe ecran apare o fereastră, în care se va introduce numele noii baze de date.

Cea de-a doua metodă de creare a unei baze de date este reprezentată de comanda CREATE TABLE:

CREATE TABLE | DBF <nume_dbf> (<nume_câmp1> <tip> [ (<precizie>[, <scală> ] ) [, <nume_câmp2>…]]) FROM ARRAY <masiv>

în care:- <nume_dbf> reprezintă numele bazei de date de creat (eventual incluzând şi calea; poate

fi o expresie nume;- <nume_câmp1>, <nume_câmp2>, … reprezintă numele câmpurilor structurii bazei de

date; pot fi expresii nume;- <tip>, o singură literă, reprezintă tipul câmpului, lista tipurilor fiind dată în tabelul

următor;- lăţimea câmpului este specificată prin <precizie>, numai când aceasta este dată de

utilizator, ca în tabelul următor;- <scală> reprezintă numărul de zecimale în cazul câmpurilor de tip “numeric” şi “float”.

<tip> <precizie> <scală> DescriereC n - şir de caractere de lungime n

D - - dată calendaristicăF n d real; de lungime n, cu d zecimaleL - - logicM - - memoN n d numeric, de lungime n, cu d zecimaleG - - generalP - - imagine

Clauza FROM ARRAY se introduce pentru ca structura bazei de date să fie preluată din masivul <masiv>, ce conţine <numele>, <tipul>, <precizia> şi <scala> pentru fiecare câmp. Masivul din care se copiază structura bazei de date poate fi format folosind funcţia AFIELDS ( ).

Exemplu: crearea bazei de date MFIXE.DBF, memorând starea mijloacelor fixe ale unei unităţi economice, cu structura:

COD Character 10 codul mijlocului fixDENUMIRE Character 30 denumireaVALOARE Numeric 10 valoareaAMORTIZARE Numeric 10 valoarea amortizatăLOC_FOLOS Memo 10 locul de folosinţăSTARE Logical 1 starea (în folosinţă .T., nefolosit .F.)DATA_INST Date 8 data instalării, punerii în funcţiune

se realizează cu comanda:CREATE TABLE mfixe;(cod C(10), denumire C(30), valoare N(10),;amortizare N(10), loc_folos M, stare L, data_inst D)

56

Page 56: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

5.4 Deschiderea şi închiderea unei baze de dateSă presupunem că am creat anterior una sau mai multe baze de date (de exemplu MFIXE).

Pentru lucrul cu acestea este necesară mai întâi deschiderea lor în zone de lucru ale FoxProW-ului. Acest lucru se realizează folosind comanda USE:

USE [ <fişier> | ?][ IN <zonă de lucru> ][ AGAIN ][ INDEX <lista fişiere index> | ?[ ORDER [<expN> | <fişier index.idx> |[ TAG ] <nume etichetă> OF <fişier index.cdx> ][ ASCENDING | DESCENDING ] ] ] ][ ALIAS <alias> ][ EXCLUSIVE ][ SHARE ][ NOUPDATE ]

<fişier> reprezintă fişierul bazei de date ce va fi deschisă, căruia, dacă nu i se specifică nici o extensie, i se va atribui implicit extensia .DBF. Dacă nu se specifică nici <fişier>, nici ?, atunci comanda are ca efect închiderea bazei de date din zona de lucru curentă. Dacă, în locul unui fişier se specifică ? fişierul bazei de date ce va fi deschisă va fi selectat interactiv, într-o fereastră de dialog.

Implicit, baza de date va fi deschisă în zona de lucru curentă. De asemenea, închiderea unei baze de date se referă tot la zona de lucru curentă. Pentru a ne referi la altă zonă de lucru decât cea curentă se foloseşte clauza IN, specificând prin <zonă de lucru> această zonă.

Exemplu:? SELECT ( ) && afiseaza zona de lucru curenta1USE mfixeNOTE s-a deschis baza de date mfixe in zona de lucru 1USE && s-a inchis baza de dateUSE mfixe IN 2NOTE s-a deschis baza de date in zona de lucru 2,;

chiar daca zona de lucru curenta a fost si va;ramane 1.

USE in 2 && se inchide baza de date din 2

În FoxProW există posibilitatea deschiderii unei baze de date în mai multe zone de lucru. În acest scop se foloseşte clauza AGAIN (tradus prin “din nou”). Această clauză trebuie introdusă în comandă când se deschide o bază de date care a mai fost deschisă anterior şi în altă zonă de lucru.

Exemplu:SELECT ( ) && se selecteaza zona de lucru 1USE mfixe && se deschide baza de date mfixe in;

aceasta zonaUSE mfixe IN 2 AGAINNOTE se deschide baza de date mfixe si in zona de lucru 2,;* se inchid bazele de dateUSE in 2USEObservaţie: dacă la deschiderea unei baze de date în zona de lucru există deschisă anterior o

altă bază de date, cea veche este închisă automat înainte de deschiderea celei noi.Clauza NOUPDATE se introduce pentru a proteja baza de date la scriere, adică pentru a nu

permite modificarea acesteia (nici conţinutul şi nici structura nu se poate modifica). Baza de date poate fi totuşi vizualizată (atât conţinutul cât şi structura) fără a i se aduce schimbări.

Exemplu:SELECT a

57

Page 57: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

USE mfixe NOUPDATENOTE se deschide baza de date mfixe in zona a doar;

pentru citireUSE && se inchide baza de date

În sintaxa comenzii mai există patru clauze:- INDEX – se referă la “indexarea bazei de date”;- SHARE şi EXCLUSIVE – folosite la lucrul în reţea cu baza de date;- ALIAS – se referă la aliasul atribuit de utilizator bazei de date.

Închiderea bazelor de date se poate realiza şi cu comenzile CLOSE ALL şi CLOSE DATABASE, dar acestea, pe lângă bazele de date, închid şi alte fişiere, ferestre, deci trebuie utilizate cu atenţie. Comanda CLOSE ALL, cu sintaxa:

CLOSE ALLînchide toate fişierele deschise, deci şi bazele de date din toate zonele de lucru şi selectează zona de lucru 1. De asemenea, CLOSE ALL închide închide şi unele ferestre (vezi capitolul “Ferestre şi meniuri”).

Comanda CLOSE DATABASE, având sintaxa:CLOSE DATABASE

închide toate bazele de date şi selectează zona de lucru 1. Şi această comandă închide, pe lângă bazele de date, şi alte fişiere (cum ar fi fişierele index, de exemplu).

Pentru a obţine informaţii despre zonele de lucru ale FoxProW-ului şi bazele de date deschise în acestea, se vor folosi două funcţii, USED ( ) şi DBF ( ).

Funcţia USED ( ), ne informează dacă o zonă de lucru este liberă sau ocupată de o bază de date şi are următoarea sintaxă:

USED ( [<expN> | <expC>] )în care <expN> sau <expC specifică zona despre care dorim informaţii (prin numărul sau prin aliasul corespunzător); funcţia returnează o valoare logică astfel:

.T. (adevărat), dacă în zona de lucru respectivă este deschisă o bază de date;

.F. (fals), dacă zona de lucru respectivă este liberă.Dacă nu se specifică o zonă de lucru, funcţia se referă la zona de lucru curentă. Dacă se

specifică un alias, funcţia returnează adevărat, dacă o bază de date cu acest alias este deschisă într-una din zonele de lucru ale FoxProW-ului.

Exemplu:SELECT a

USE mfixe IN 1USE mfixe AGAIN? USED ( ) && se testeaza folosirea zonei de lucru 1.T.? USED (2 ) && se testeaza folosirea zonei de lucru 2.F.? USED (‘agenda’)NOTE testează daca exista baza de date cu aliasul;

‘agenda’ deschisa intr-o zona de lucru.T.USEUSE IN 1

Pentru a afla ce bază de date este deschisă într-o anumită zonă de lucru se foloseşte funcţia DBF ( ):

DBF ( [<expC> | <expN>] )Aceasta returnează un şir de caractere ce conţine numele bazei de date deschisă

într-o zonă de lucru sau care are un anumit alias. <expC> reprezintă aliasul de testat, iar <expN> reprezintă numărul zonei de lucru la care se referă funcţia.

58

Page 58: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Dacă nu este deschisă nici o bază de date în zona de lucru specificată va fi returnat şirul vid. În cazul când nu există nici o bază de date cu aliasul specificat se va afişa mesajul “Alias not found” (Alias negăsit).

Exemplu:SELECT a

USE mfixe? DBF (‘mfixe’)C:\FOXPROW\MFIXE.DBF? DBF (‘a’)C:\FOXPROW\MFIXE.DBF? DBF (1)C:\FOXPROW\MFIXE.DBF ? DBF (2) == ‘ ‘.T.USE

5.5 Aliasul unei baze de dateIdentificarea unei baze de date se face fie fie prin intermediul zonei de lucru în care

aceasta a fost deschisă, fie prin aliasul bazei de date respective. La deschiderea unei baze de date acesteia i se atribuie un nume, prin care se identifică în comenzile şi funcţiile folosite în continuare, pentru acest nume folosind denumirea de “alias”. Atribuirea unui alias unei baze de date se face fie de programator, fie de FoxProW, în cazul în care programatorul nu a făcut acest lucru. Utilizatorul poate atribui un alias unei baze de date specificând în comanda USE clauza ALIAS, cu sintaxa:

USE. . .[ALIAS <alias>]. . .

în care “alias” reprezintă aliasul ce se atribuie bazei de date.Exemplu:SELECT mfixe IN b ALIAS tabelNOTE se deschide baza de date mfixe in zona de lucru;

b, atribuindu-i aliasul ‘tabel’SELECT tabelNOTE se selecteaza zona de lucru 2 prin aliasul tabel;

al bazei de date din aceasta zona de lucru? SELECT ( )2USE IN b

Dacă programatorul nu specifică explicit un alias în comanda USE, atunci FoxProW preia această sarcină atribuind automat bazei de date un alias, după anumite reguli, astfel: aliasul implicit pe care FoxProW îl atribuie automat unei baze de date, la deschiderea sa, este numele fişierului bazei de date, fără extensie.

Exemplu:SELECT aUSE mfixe IN b && aliasul atribuit este mfixeSELECT mfixe && se selecteaza zona de lucru 2;

folosind aliasul mfixe? SELECT ( )2USE IN b

59

Page 59: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

când baza de date a mai fost deschisă anterior într-o zonă de lucru (când se foloseşte comanda USE cu clauza AGAIN), bazei de date i se atribuie un alias diferit de numele fişierului acestuia; dacă programatorul nu specifică un alias, prin clauza ALIAS a comenzii USE, FoxProW atribuie bazei de date un alias astfel:

- în primele zece zone de lucru, pentru bazele de date se atribuie ca alias literele de la A la J;

- în zonele de lucru de la 11 la 225 se atribuie aliasul W11 – W225, în funcţie de zona de lucru.

de asemenea, FoxProW atribuie un alias unei baze de date şi în cazul atribuirii aceluiaşi alias la două baze de date distincte.

Exemplu:SELECT aUSE mfixeUSE mfixe IN 11 AGAINSELECT w11NOTE referirea la zona de lucru 11 se face prin;

aliasul w11 atribuit bazei de date deschisa;in aceasta zona de lucru

? SELECT ( )11

SELECT 1USE IN 1 && se inchid bazele de dateUSE IN 11

5.6 Manipularea structurii unei baze de dateLa începutul acestui capitol am văzut cum se creează o bază de date, prin specificarea

structurii acesteia, folosind comanda CREATE. Deseori în lucrul cu bazele de date apare necesitatea modificării structurii unei baze de date, adică adăugarea unor câmpuri, ştergerea altora, modificarea caracteristicilor bazei de date.

Exemplu: să presupunem că avem baza de date MFIXE creată anterior, cu structura dată la începutul capitolului, şi că dorim o clasificare a mijloacelor fixe din baza de date în funcţie de tipul acestora (maşină, aparatură electronică, clădiri etc.). La crearea bazei de date nu am inclus acest tip de informaţie în structură, deci nu putem obţine direct această clasificare. Pentru a o obţine totuşi, trebuie ca, pentru fiecare mijloc fix, să se specifice şi tipul acestuia într-un nou câmp (de tip şir de caractere, de exemplu), deci este necesară modificarea structurii bazei de date.

Comanda MODIFY STRUCTURE, fără nici un parametru, realizează modificarea structurii bazei de date active prin deschiderea unei ferestre de dialog, aceeaşi ca la crearea bazei de date, unde se vor realiza modificările dorite.

Dacă în zona de lucru curentă avem deschisă o bază de date, atunci comanda se referă la aceasta. În caz contrar apare o fereastră de dialog, de unde se va selecta baza de date a cărei structură se va modifica.

După efectuarea modificărilor, FoxProW copiază conţinutul bazei de date vechi în baza nouă de date, cu modificările respective, operaţie transparentă pentru utilizator.

Vizualizarea structurii unei baze de date se face cu comenzile DISPLAY STRUCTURE sau LIST STRUCTURE, cu sintaxa:

DISPLAY STRUCTURE [ IN <expN> | <expC>][ TO PRINTER [ PROMPT ] | TO FILE <fişier> ][ NONCONSOLE ]

LIST STRUCTURE [ IN <expN> | <expC>][ TO PRINTER [ PROMPT ] | TO FILE <fişier> ][ NONCONSOLE ]

60

Page 60: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Comenzile sunt asemănătoare, singura deosebire fiind aceea că prima face pauză după umplerea unui ecran cu informaţii, pe când cea de-a doua nu face această pauză, pe ecran derulându-se continuu toate informaţiile, până la sfârşit.

<expN> sau <expC> specifică zona de lucru, respectiv baza de date, la care se referă comanda. În mod implicit afişarea se face pe ecran. Dacă se specifică opţiunea NONCONSOLE, afişarea pe ecran este inhibată. În paralele cu afişarea pe ecran, dacă aceasta nu este inhibată, se pot trimite informaţii şi la imprimantă în cazul folosirii clauzei TO PRINTER, sau în fişierul “fişier”, în cazul utilizării clauzei TO FILE. Cele două clauze, TO PRINTER şi TO FILE se exclud reciproc.

În varianta sub Windows a FoxPro-ului se poate folosi clauza PROMPT care determină deschiderea ferestrei Print în care se pot stabili opţiuni de imprimare.

Informaţia afişată are următorul conţinut: pe prima linie se afişează baza de date la care se referă comanda, cu unitate de disc şi cale; pe

următoarea linie se afişează numărul de înregistrări din baza de date, iar pe cea de-a treia linie se afişează data calendaristică la care s-a scris ultima oară în baza de date;

linia a patra conţine dimensiunea unui bloc al fişierului memo asociat bazei de date (când este cazul);

pe următoarele linii se afişează câmpurile ce alcătuiesc structura bazei de date, cu caracteristicile lor (număr câmp, nume, tip, lăţime, zecimale, indecşi);

ultima linie conţine lungimea unei înregistrări, adică suma câmpurilor, plus 1, reprezentând numărul de caractere pe care îl ocupă o înregistrare în baza de date.

Exemplu:SELECT aUSE mfixeLIST STRUCTUREStructure for database : C:\ FOXPROW \ MFIXE.DBFNumber of data records : 0Date of last update : 08/04/01Memo file block size : 64

Field Field Name Type Width DecIndex

1 COD Character 102 DENUMIRE Character 303 VALOARE Numeric 10 04 AMORTIZARE Numeric 10 05 LOC_FOLOS Memo 106 STARE Logical 17 DATA_INST Date 88 TIP Character 1

** Total ** 81USEUn alt mod de a crea o bază de date îl reprezintă comanda COPY STRUCTURE care

crează o bază de date nouă, cu aceeaşi structură (sau asemănătoare) cu a celei deschise în zona de lucru curentă. Sintaxa comenzii este:

COPY STRUCTURE TO <fişier>[ FIELDS <listă câmpuri> ][ [ WITH ] CDX | [ WITH ] PRODUCTION ]

unde <fişier> reprezintă fişierul noii baze de date. Clauza FIELDS are ca efect copierea în baza de date nouă doar a câmpurilor specificate în lista de câmpuri care urmează clauzei.

Ultima linie se referă la “fişiere index” care vor fi tratate în paragraful referitor la indexarea bazelor de date.

Exemplu: din baza de date MFIXE creăm o nouă bază de date, MFIXE_N, în care vom copia doar câmpurile COD, DENUMIRE şi VALOARE:

61

Page 61: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

SELECT aUSE mfixeCOPY STRUCTURE TO mfixe_n.dbf;

FIELDS cod, denumire, valoareUSE mfixe_nLIST STRUCTUREStructure for database : C:\ FOXPROW \ MFIXE_N.DBFNumber of data records : 0Date of last update : 08/04/01Memo file block size : 64

Field Field Name Type Width DecIndex

1 COD Character 102 DENUMIRE Character 303 VALOARE Numeric 10 0

** Total ** 51USE

Comanda COPY STRUCTURE realizează copierea structurii unei baze de date în structura altei baze de date, deci copierea se face structură la structură.

Mai există o modalitate de transmitere a unei structuri a bazei de date, şi anume printr-o bază de date intermediară, în care se încarcă structura de copiat. Comanda folosită este COPY STRUCTURE EXTENDED, cu următoarea sintaxă:

COPY STRUCTUREEXTENDED TO <fişier>[ FIELDS <listă câmpuri> ]

Structura bazei de date se copiază în înregistrările unei noi baze de date, <fişier>, care are o structură fixă, formată din patru câmpuri: FIELD_NAME (nume câmp), de tip şir de caractere, în care se depozitează numele câmpului

structurii; FIELD_TYPE (tip câmp), tot de tip şir de caractere, de lungime 1, în care se depozitează un

caracter ce corespunde tipului câmpului structurii (C-şir de caractere, N-numeric, F-real, D-dată calendaristică, L-logic, M-memo, G-general, P-imagine);

FIELD_LEN (lungime câmp), de tip numeric, în care se depozitează lungimea fiecărui câmp al structurii;

FIELD_DEC (poziţii zecimale câmp), de tip numeric, în care se depozitează numărul de poziţii zecimale, când este cazul.

Exemplificăm această copiere în următoarea schemă, unde s-a luat ca exemplu baza de date MFIXE:

Cod (C 10)Denumire (C 30)Valoare (N 10,0)Amortizare (N 10,0)Loc_folos (M)Stare (L)Data_inst (D)Tip (C 1)

FIELD_NAME

(nume câmp)

FIELD_TYPE

(tip câmp)

FIELD_LEN

(lăţime câmp)

FIELD_DEC

(zecimale câmp)1 Cod C 10 -2 Denumire C 30 -3 Valoare N 10 0

62

Page 62: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

4 Amortizare N 10 05 Loc_folos M 10 -6 Stare L 1 -7 Data_inst D 8 -8 Tip C 1 -

deci câmpurile structurii devin înregistrări în noua bază de date. Conţinutul acestor înregistrări se poate modifica, se pot şterge sau adăuga înregistrări, modificându-se astfel structura codificată în această bază de date.

Când se foloseşte clauza FIELDS, numai câmpurile din <lista câmpuri> vor genera înregistrări în baza de date nou creată.

Trecerea inversă, din înregistrările bazei de date în structura unei noi baze de date, se face cu comanda CREATE FROM:

CREATE [ <fişier1> ] FROM [ <fişier2> ]<fişier2> este o bază de date ce memorează în înregistrările sale o structură, în modul descris la comanda anterioară. Acest fişier s-a creat anterior, fie cu o comandă COPY STRUCTURE EXTENDED, fie manual. <fişier1> este baza de date ce se va crea şi va avea structura codificată în <fişier2>. Noua bază de date va deveni activă.

Dacă în comandă nu se specifică unul dintre fişiere sau amândouă, se vor deschide ferestre de dialog prin care FoxProW interoghează utilizatorul asupra fişierelor ce se vor folosi.

Exemplu: USE mfixeCOPY STRUCTURE EXTENDED TO intermNOTE se creaza baza de date interm.dbf care va contine;

structura bazei de date mfixeUSE intermNOTE din aceasta se sterg inregistrarile 2, 3, si 6;

corespunzatoare campurilor denumire, valoare si stareDELETE RECORD 2 && se marcheaza pentru stergereDELETE RECORD 3 && respectivele inregistrariDELETE RECORD 6 &&PACK && se sterg fizic inregistrarile marcate anteriorCREATE mfixe_n FROM intermNOTE se creeaza baza de date mfixe_n cu noua structura;

codificata in baza de date intermLIST STRUCTURE

FIELDS cod, denumire, valoareUSE mfixe_nLIST STRUCTUREStructure for database : C:\ FOXPROW \ MFIXE_N.DBFNumber of data records : 0Date of last update : 09/04/01

Field Field Name Type Width DecIndex

1 COD Character 102 AMORTIZARE Numeric 10 03 LOC_FOLOS Memo 104 DATA_INST Date 85 TIP Character 1

** Total ** 40USE

5.7 Manipularea câmpurilor unei baze de date63

Page 63: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Accesul la câmpurile unei baze de date este controlat de comanda SET FIELDSSET FIELDS ON | OFFSET FIELDS TO [ [ <câmp1> [<câmp2> …]] | ALL]Dacă SET FIELDS este ON, pot fi accesate doar câmpurile care sunt prezente în lista de

câmpuri a comenzii SET FIELDS TO. Dacă SET FIELDS este OFF se permite accesul la toate câmpurile bazei de date. Starea implicită este OFF.

<câmp1> <câmp2> … reprezintă lista câmpurilor care pot fi accesate în cazul SET FIELDS ON. SET FIELDS TO ALL permite accesul la toate câmpurile, chiar dacă starea lui SET FIELDS este ON. SET FIELDS TO face ca lista câmpurilor să fie vidă, deci nici un câmp nu va putea fi accesat în cazul SET FIELDS ON.

Comanda se referă la baza de date activă.Exemplu: pentru a se permite accesul doar la câmpurile COD şi VALOARE din baza de date

MFIXE, se va introduce următoarea secvenţă de instrucţiuni:SET FIELDS ONSET FIELDS TO cod, valoare

iar pentru a se reveni la normal, se introduce fie:SET FIELDS TO ALL

fie:SET FIELDS OFF

Numărul câmpurilor dintr-o bază de date este returnat de funcţia FCOUNT( ):FCOUNT ( [<expN> | <expC> ] )În această sintaxă, prin <expN> am desemnat zona de lucru în care este deschisă baza de

date la care se referă funcţia, iar prin <expC> aliasul bazei de date respective.Dacă nu se specifică nici zona de lucru, nici baza de date, se consideră că funcţia se referă la

baza de date deschisă în zona de lucru curentă. Dacă în zona de lucru specificată nu este deschisă nici o bază de date, funcţia va returna valoarea 0.

Exemplu:CLOSE ALLUSE mfixe? ‘Baza de date MFIXE are ‘, FCOUNT ( ), ‘campuri’Baza de date MFIXE are 6 campuriNOTE afiseaza cate campuri are baza de date (mfixe);

din zona de lucru curenta (1)? FCOUNT ( ) = FCOUNT (1).T.? FCOUNT (SELECT ( )) = FCOUNT ( ).T.? FCOUNT (1) = FCOUNT (‘Mfixe’).T.? FCOUNT (2)0USE

Funcţia FIELD ( ) returnează numele unui câmp dintr-o bază de date, câmp identificat prin numărul său în cadrul structurii bazei de date. Funcţia are următoarea sintaxă:

FIELD ( <expN1> [,<expN2> | <expC>] )în care <expN1> specifică numărul de ordine al câmpului (primul câmp are numărul de ordine 1, al doilea 2 ş.a.m.d.), iar <expN2> sau <expC> identifică baza de date la care se referă funcţia, prin zona de lucru (în cazul specificării lui <expN2>) sau prin aliasul bazei de date (când se specifică <expC>).

Funcţia returnează un şir de caractere conţinând numele câmpului specificat, scris cu majuscule.

64

Page 64: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Dacă nu se specifică nici <expN2>, nici <expC>, funcţia se referă la zona de lucru curentă. În cazul în care în zona de lucru specificată nu este deschisă nici o bază de date sau în cazul când numărul de ordine al câmpului specificat este mai mare decât numărul total de câmpuri ale bazei de date, funcţia va returna şirul de caractere vid.

Exemplu:CLOSE ALLUSE mfixe? FIELD (1)NOTE afiseaza numele primului camp al bazei de date;

deschisa in zona de lucru curentaCODUSE mfixe IN 2 AGAIN? FIELD (1, 2)NOTE ca efect este echivalenta cu functia FIELD ( );

anterioaraCOD? FIELD (9) == ‘ ‘ && avem numai 8 campuri in baza de dateTIP? FIELD (FCOUNT ( )) && afiseaza numele ultimului campTIPCLOSE ALL

Funcţia FSIZE ( ) returnează mărimea unui câmp al bazei de date, specificat prin numele său.

FSIZE ( <expC1> [,<expN> | <expC2>] )rezultatul fiind de tip numeric.

<expC1> este un şir de caractere ce reprezintă numele câmpului bazei de date, iar prin <expN> sau <expC2> se specifică zone de lucru, respectiv baza de date la care se referă funcţia. Dacă acestea lipsesc se consideră implicit zona de lucru curentă.

Exemplu:CLOSE ALLUSE mfixe? FSIZE (‘denumire’)NOTE afiseaza marimea celui de-al doilea camp;

al bazei de date30USE

5.8 Domeniul înregistrărilorExistă comenzi FoxProW care acţionează asupra mai multor înregistrări ale unei baze de

date. Selectarea acestora se face specificând în comandă condiţia de selecţie, cu ajutorul căreia, din mulţimea totală a înregistrărilor se aleg doar acelea care respectă condiţia respectivă. Mulţimea înregistrărilor selectate formează “domeniul înregistrărilor” la care se referă comanda. Domeniul înregistrărilor se specifică prin clauzele <domeniu>, FOR şi WHILE, incluse opţional în comanda respectivă.

Clauza <domeniu> se va înlocui cu una dintre următoarele construcţii, în funcţie de necesităţi:

ALL selectează toate înregistrările bazei de date; NEXT <expN> se referă la următoarele <expN> înregistrări, începând de la

înregistrarea curentă, inclusiv; RECORD <expN> acţionează numai asupra înregistrării cu numărul <expN>;

65

Page 65: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

REST selectează înregistrările începând de la cea curentă, inclusiv, şi până la sfărşitul bazei de date.

Clauza FOR, cu sintaxa:FOR <expL>

se foloseşte pentru selectarea înregistrărilor în funcţie de o condiţie logică, <expL>. Se selectează acele înregistrări pentru care <expL> este adevărată.

Clauza WHILE, având sintaxa:WHILE <expL>

este asemănătoare clauzei FOR, selectarea înregistrărilor făcându-se în funcţie de expresia logică <expL> (pentru valoarea adevărat a acesteia). Spre deosebire de clauza FOR care, după găsirea unei înregistrări ce nu respectă condiţia <expL>, continuă testarea celorlalte, clauza WHILE întrerupe testarea înregistrărilor când găseşte o înregistrare ce nu respectă condiţia dată.

Observaţie: în expresia logică din clauzele FOR şi WHILE trebuie să intre o mărime ce variază, în funcţie de înregistrare. Aceasta trebuie să depindă fie de numărul înregistrării, fie de conţinutul acesteia.

Exemplu: un domeniu de forma:i = 4. . . ALL FOR i = 2 . . .

este egal cu 0 înregistrări, deoarece, pentru orice înregistrare, i este diferit de 2, deci expresia logică va fi falsă.

Domeniul:ALL WHILE 1+1 = 2

reprezintă toate înregistrările din baza de date (1+1 este egal cu 2 pentru toate înregistrările).

Construcţia:ALL FOR RECNO ( ) > 3

are ca efect selectarea tuturor înregistrărilor începând de la înregistrarea 3, exclusiv.Observăm în acest ultim exemplu că în condiţia logică a clauzei FOR intervine

funcţia RECNO ( ) (care reprezintă numărul înregistrării) care este dependentă de înregistrarea de testat.

5.9 Adăugarea de înregistrări la o bază de dateAdăugarea de înregistrări se poate face în două moduri, în funcţie de poziţia pe

care o va ocupa noua înregistrare în baza de date: adăugarea de înregistrări noi la sfârşitul bazei de date; introducerea de înregistrări noi în interiorul bazei de date.

Prima metodă se realizează cu comenzile APPEND, APPEND FROM şi APPEND FROM ARRAY. Aceste trei comenzi se utilizează cu acelaşi scop, ele diferind prin sursa datelor care se introduc în baza de date şi anume:

la comanda APPEND datele sunt furnizate de utilizator, în mod interactiv (excepţie făcând clauza BLANK);

la comanda APPEND FROM datele sunt preluate dintr-o altă bază de date sau un alt fişier;

comanda APPEND FROM ARRAY preia datele dintr-un masiv şi le introduce în baza de date.

Comanda APPEND adaugă înregistrări la sfârşitul bazei de date deschisă în zona de lucru curentă şi are următoarea sintaxă:

APPEND [ BLANK ]Fără clauza BLANK comanda determină deschiderea unei ferestre de editare în

care utilizatorul poate introduce, câmp cu câmp, datele înregistrării ce se va adăuga.Saltul la câmpul următor se realizează fie la apăsarea tastei Enter, fie când câmpul

se completează în întregime. După introducerea ultimului câmp se sare la următoarea 66

Page 66: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

înregistrare care se va adăuga. Pentru a edita un câmp de tip memo, când cursorul se află în câmpul respectiv, se apasă combinaţia de taste Ctrl+PageDown, după care se intră într-o fereastră de editare a câmpului memo. Ieşirea cu salvare din această fereastră se face cu combinaţia de taste Ctrl+Enter. Terminarea introducerii tuturor înregistrărilor se realizează acţionând Ctrl+End, fereastra de editare închizându-se după aceasta.

O formă a comenzii APPEND, deosebită de cea prezentată anterior, se obţine folosind clauza BLANK. Comanda APPEND BLANK are ca efect adăugarea unei înregistrări “blank” la sfârşitul bazei de date, urmând ca informaţia utilă să se încarce mai târziu, prin alte comenzi FoxProW. Înregistrarea “blank” este înregistrarea în care toate câmpurile conţin valori vide.

Adăugarea de înregistrări la sfârşitul unei baze de date, când conţinutul înregistrărilor este preluat dintr-un fişier, se realizează cu comanda APPEND FROM:

APPEND FROM <fişier>[ FIELDS <listă câmpuri > ][ FOR <expL> ][ [ TYPE ] [ DELIMITED [ WITH TAB |

WITH <delimitator> | WITH BLANK ][ DIF | FW2 | MOD | PDOK | RPD | SDF | SYLK |

WK1 | WK3 | WKS | WR1 | WRK | XLS ] ]<fişier> reprezintă numele fişierului din care se preiau înregistrările ce se vor adăuga la baza de date. Dacă nu se specifică numele fişierului, trebuie specificată clauza ?, utilizatorului oferindu-i-se astfel posibilitatea selectării fişierului într-o fereastră de dialog.

Dacă se doreşte ca din baza de date <fişier> să se preia doar anumite câmpuri, se va include clauza FIELDS, în care <listă câmpuri > reprezintă lista câmpurilor ce se vor copia, separate prin virgulă. Dacă nu se specifică altfel, întregul <fişier> va fi adăugat la sfârşitul bazei de date. Pentru a prelua din fişier doar anumite înregistrări, se va specifica domeniul acestora, prin clauza FOR. Se foloseşte clauza TYPE pentru a specifica tipul acestui fişier.

Exemplu: din baza de date MFIXE vom copia în baza de date MFIXE_N cu aceeaşi structură mijloacele fixe care sunt în stare de folosinţă:

CLOSE ALLUSE mfixe_n && se deschide baza de date mfixe_nAPPEND FROM mfixe;

FIELDS cod, denumire, valoare;FOR stare = .t.

NOTE se adauga din baza de date mfixe_n inregistrari;care au stare=.t. , preluandu-se doar campurile;cod, denumire si valoare

LIST && se afiseaza continutul bazei de dateUSEPreluarea înregistrărilor dintr-un masiv şi adăugarea lor la sfârşitul bazei de date se

face cu ajutorul comenzii APPEND FROM ARRAY care va fi tratată în paragraful “Import / Export dintr-o bază de date”.

Cea de-a doua metodă de adăugare a unei noi înregistrări la o bază de date o reprezintă inserarea înregistrării în interiorul bazei de date, folosind comanda INSERT:

INSERT [ BEFORE ] [ BLANK ].Comanda are ca efect inserarea unei noi înregistrări, după înregistrarea curentă.

Dacă se psecifică clauza BLANK se adaugă o înregistrare blank, altfel se deschide o fereastră de editare pentru introducerea interactivă a conţinutului noii înregistrări. Clauza BEFORE determină adăugarea unei înregistrări noi înaintea înregistrării curente, astfel:

INSERT BEFORE

67

Page 67: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Înregistrare nouă Înregistrare curentă

INSERTExemplu:USE mfixe_nGOTO 2 && se pozitioneaza indicatorul de ;

inregistrari pe inregistrarea 2INSERT BEFORE && se insereaza o noua inregistrare;

in pozitia 2LISTUSE

5.10 Modificarea conţinutului unei baze de dateModificarea datelor stocate într-o bază de date se realizează cu comenzile

CHANGE, EDIT, BROWSE şi REPLACE. Primele trei comenzi nu modifică propriu-zis conţinutul bazei de date, ci deschid o fereastră în care utilizatorul va modifica datele din baza de date în mod interactiv.

Comenzile CHANGE şi EDIT sunt identice, ele diferind faţă de comanda BROWSE doar prin modul de organizare pe ecran a ferestrei corespunzătoare. Astfel, la comenzile CHANGE şi EDIT câmpurile din cadrul unei înregistrări sunt aşezate unele sub altele, pe când la comanda BROWSE acestea se află unele lângă altele. La toate trei comanzile, în ferestrele corespunzătoare, înregistrările sunt aşezate unele sub altele.

Comanda CHANGE (sau EDIT) permite editarea conţinutului unei baze de date într-o fereastră de editare. Sintaxa comenzii este:

CHANGE | EDIT[ FIELDS <listă câmpuri> ][ <domeniu> ] [ FOR <expL1> ] [ WHILE <expL2> ][ FONT <expC1> [, <expN1> ] ][ STYLE <expC2> ][ FREZEE <câmp> ][ KEY <expr1> [, <expr2> ] ][ LAST ] [ LEDIT ] [ REDIT ] [ LPARTITION ][ NOAPPEND ] [ NOCLEAR ] [ NODELETE ][ NOEDIT | NOMODIFY ][ NOLINK ] [ NOMENU ] [ NOOPTIMIZE ] [ NORMAL ] [ NOWAIT ][ PARTITION <expN2> ][ PREFERENCE <expC3> ][ REST ] [ SAVE ][ TIMEOUT <expN3> ][ TITLE <expC4> ][ VALID [ :F ] <expL3> [ ERROR <expC5> ] ][ WHEN <expL4> ][ WIDTH <expN4> ][ [ WINDOW ] <nume fereastră 1> ]

[ IN [ WINDOW ] <nume fereastră 2> | IN SCREEN ] ][ COLOR SCHEME <expN5> |

COLOR <listă perechi de culori> ]Ieşirea din fereastra de editare Change şi salvarea modificărilor se face folosind

combinaţia CTRL+End.Clauza FIELDS are ca efect afişarea spre editare doar a câmpurilor specificate în

<listă câmpuri>, în ordinea apariţiei lor în listă. Dacă această clauză lipseşte, sunt afişate spre editare toate cămpurile bazei de date.

Această listă reprezintă o înşiruire de câmpuri, ale unei baze de date sau calculate, 68

Page 68: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

separate prin virgulă, având următoarea sintaxă:<câmp1> [ :R ][ :V=<expr1> [ :F ] [ :E=<expC1> ] ][ :P=<expC2> ][ :B=<expr2>, <expr3> [ :F ] ][ :H=<expC3> ][ :W=<expL1> ][ ,<câmp2> [ :R ] . . . ]În lista de câmpuri pot fi incluse şi câmpuri ale unei baze de date deschisă într-o

altă zonă de lucru decât cea curentă.Câmpurile calculate reprezintă câmpuri din fereastra de editare, create prin

evaluarea unei expresii şi afişate în fereastra respectivă ca un câmp de sine stătător. Aceste câmpuri se pot doar vizualiza, dar nu se pot modifica. Sintaxa de definiţie a unui câmp calculat este:

<nume câmp calculat> = <expr>Exemplu: având baza de date MFIXE, vom deschide o fereastră de editare în care

vom afişa doar câmpurile COD, VECHIME, STARE. Primul şi ultimul sunt câmpuri simple ale bazei de date, VECHIME fiind un câmp calculat în funcţie de data instalării (câmpul DATA_INST din baza de date) şi data curentă.

CLOSE ALLUSE mfixeCHANGE FIELDS cod, vechime= (DATE ( ) – data_inst) / 365, stareUSE

Opţiunile ataşate fiecărui câmp au următoarele semnificaţii::R – câmpul se poate vizualiza, nu şi modifica;

Exemplu:USE mfixeCHANGE FIELDS cod : R, stareNOTE se afiseaza campurile cod si stare, dar se poate;

modifica doar campul stare.USE

: V=<expr1> - permite validarea câmpului introdus. După ce valoarea memorată în câmp s-a modificat şi se iese din editare, se evaluează <expr1>. Dacă valoarea obţinută este .T. data introdusă în câmp este corectă, iar dacă este evaluată la .F. data se consideră incorectă, afişându-se un mesaj de eroare. În cazul când expresia este de tip numeric, iar valoarea ei este 0, data introdusă în câmp se consideră incorectă, afişându-se mesajul de eroare;

: F – se foloseşte pentru a forţa evaluarea expresiei <expr1>, şi deci validarea, chiar şi atunci când se trece cu cursorul prin câmp fără modificarea conţinutului acestuia;

: E=<expC1> - se foloseşte pentru ca mesajul afişat în caz de eroare să fie altul decât cel implicit, şi anume <expC1>;Exemplu:USE mfixeCHANGE FIELDS cod : R, valoare : V = valoare >= 100000;

: F : E = ‘Valoare prea mica’NOTE se citeste campul valoare permitandu-se doar;

valori mai mari decat 100000, in caz de eroare;afisandu-se mesajul ‘Valoare prea mica’

USE69

Page 69: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

: B=<expr2>, <expr3> - se foloseşte pentru a se specifica intervalul în care trebuie să se afle valoarea din câmp după editare. <expr2> reprezintă limita inferioară, iar . <expr3> reprezintă limita superioară. Aceste două valori trebuie să fie de acelaşi tip cu câmpul editat. În cazul când valoarea câmpului nu se încadrează între cele două expresii, se afişează un mesaj de eroare;Exemplu: vom realiza acelaşi lucru ca şi în exemplul precedent, folosind această

opţiune:USE mfixeCHANGE FIELDS cod : R, valoare : B = 100000, 9999999999USE

: P=<expC2> - se poate specifica un cod PICTURE, care va fi prezentat la comanda GET, în capitolul “INTRARE / IEŞIRE”;

: H=<expC3> - numele câmpului care se afişează la partea superioară a ferestrei de editare, va fi înlocuit cu <expC3>;

: W=<expL1> - se permite intrarea în editarea câmpului doar dacă expresia logică <expL1> este evaluată la valoarea .T.;Exemplu:USE mfixeCHANGE FIELDS cod : R, valoare : H = ‘Val.mijl.fix’;

: W = valoare = 0NOTE se permite citirea doar a campului valoare,;

ce are antetul ‘Val.mijl.fix’ si doar a acelor;inregistrari care au valoare=0

USE

Fontul folosit pentru textul afişat în fereastra Change se poate specifica prin clauza Font, iar stilul de afişare prin clauza Style.

<domeniu>, FOR, WHILE specifică domeniul înregistrărilor ce vor fi accesibile spre editare.

Clauza Freeze se foloseşte pentru a selecta spre modificare un singur câmp şi anume <câmp>, restul fiind afişate în fereastra de editare fără a se permite editarea lor.

USE mfixeCHANGE FREEZE denumire

NOTE se editeaza doar denumire al bazei de date mfixeUSE

Clauza KEY se foloseşte pe baze de date indexate pentru limitarea mulţimii înregistrărilor afişate în fereastra Change la cele pentru care valoarea cheii de indexare se află în intervalul (<expr1>, <expr2>).

Clauza NOAPPEND, prezentă în comanda CHANGE, opreşte utilizatorul de a adăuga înregistrări noi la baza de date, din fereastra de editare. Pentru a nu permite ştergerea înregistrărilor din baza de date se include în comandă clauza NODELETE. NOEDIT şi NOMODIFY sunt două clauze care se exclud şi care nu permit modificarea înregistrărilor din baza de date, ci vor permite doar vizualizarea acestora. Aceste clauze nu presupun protejarea la ştergere a înregistrărilor din baza de date, pentru aceasta folosindu-se clauza NODELETE.

Odată cu apariţia pe ecran a ferestrei de editare, ca urmare a execuţiei comenzii CHANGE, la meniul sistem este ataşat un nou submeniu, numit Browse, care conţine comenzi specifice ferestrei de editare Change, Edit sau Browse. Dacă se doreşte ca

70

Page 70: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

acest submeniu să nu apară, în comandă se include clauza NOMENU.Incluzând în comandă clauza LAST, fereastra de editare Change va căpăta

aceleaşi caracteristici cu cele pe care le avea la ultima sa folosire (când acestea au fost salvate). Caracteristicile ferestrei sunt salvate în fişierul de resurse FoxProW (FOXUSER.DBF).

Atenţie! Ieşirea din fereastra de editare cu combinaţia de taste Ctrl + End salvează configuraţia ferestrei, iar ieşirea cu combinaţia Ctrl + Q nu realizează această salvare.

Clauza PREFERENCE determină salvarea atributelor ferestrei de editare Change în fişierul de resurse FoxProW sub numele dat prin şirul de caractere <expC3>. Următoarele apariţii ale acestei clauze (bineînţeles inclusă în comanda CHANGE), având ataşat acelaşi nume, au ca efect refacerea atributelor salvate anterior. În mod normal, după ieşirea din fereastra de editare, aceasta se închide. Pentru ca imaginea ferestrei să rămână pe ecran şi după ieşirea din editare, se foloseşte clauza NOCLEAR. După aceasta ştergerea ecranului se poate face cu CLEAR.

Fereastra de editare Change poate fi împărţită în două părţi, numite partiţii, fiecare dintre acestea putând fi văzută în forma Change (câmpurile aranjate vertical), sau sub forma Browse (câmpurile aranjate orizontal), independent una de alta.

Împărţirea în cele două partiţii se face folosind clauza PARTITION, unde expresia numerică ce o urmează reprezintă coloana unde se vor separa cele două partiţii. Dacă se specifică LEDIT în comanda CHANGE, partiţia stângă va fi văzută în modul Browse, iar dacă în comandă se include REDIT, partiţia dreaptă se va afişa în modul Browse. Comanda CHANGE poate conţine ambele clauze simultan, caz în care ambele partiţii sunt afişate în modul Browse.

La deschiderea ferestrei de editare, cursorul va fi poziţionat în primul câmp din poziţia dreaptă. Dacă includem clauza LPARTITION, cursorul va fi poziţionat iniţial în primul cămp al partiţiei din partea stângă.

În mod normal, deplasarea de la o înregistrare la alta, în cadrul unei partiţii, are ca efect deplasarea pe aceeaşi înregistrare în cealaltă partiţie. Pentru ca deplasarea pe înregistrările bazei de date să se facă independent în cele două partiţii, se foloseşte clauza NOLINK.

Clauza NOWAIT este disponibilă numai în interiorul unui program, adică nu se poate introduce când comanda este dată în mod interpretativ în fereastra de comenzi. Când FoxProW întâlneşte o comandă CHANGE într-un program, acesta opreşte execuţia programului dându-i posibilitatea utilizatorului de a modifica datele din baza de date în fereastra de editare. În cazul în care comanda CHANGE conţine clauza NOWAIT, FoxProW nu mai face pauză la întâlnirea comenzii, ci continuă execuţia programului cu instrucţiunea imediat următoare lui CHANGE.

Folosind clauza TIMEOUT, programatorul specifică, prin expresia numerică ce urmează clauzei, numărul de secunde cât FoxProW va aştepta pentru introducerea datelor în fereastra de editare. Dacă după <expN3> secunde nu este apăsată nici o tastă, fereastra de editare se închide automat, FoxProW continuând execuţia programului. Şi această clauză este disponibilă numai într-un program FoxProW.

La folosirea unei comenzi CHANGE indicatorul de înregistrări va indica spre prima înregistrare a bazei de date. Pentru ca indicatorul de înregistrări să nu fie afectat la deplasarea cursorului pe baza de date, în fereastra de editare, se include clauza REST în alcătuirea comenzii CHANGE.

Clauza SAVE este folosită pentru a păstra fereastra de editare pe ecran şi după ieşirea din comanda CHANGE. Această clauză este, de asemenea, disponibilă doar în programele FoxProW, neputându-se introduce în fereastra de comenzi.

Fereastra de editare Change are ca titlu numele bazei de date al cărui conţinut se modifică, acesta apărând în partea superioară a chenarului ferestrei. Pentru a fi afişat un alt titlu pentru această fereastră se foloseşte clauza TITLE, în care şirul de caractere <expC4> reprezintă noul titlu al acesteia.

71

Page 71: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

VALID :F <expL3> ERROR <expC5>Această clauză este echivalentă cu opţiunea :V din clauza FIELDS a aceleiaşi

comenzi, dar spre deosebire de opţiunea clauzei FIELDS, care se referă la un câmp dintr-o înregistrare a bazei de date, clauza VALID se referă la întreaga înregistrare. Construcţia VALID :F <expL3> ERROR <expC5> este echivalentă cu lista de opţiuni

:V = <expL3> >F >E ) <expC5>, având aceeaşi funcţionare, dar la nivel de înregistrare.

Acelaşi tip de asemănare există şi între clauza WHEN şi opţiunea :W a clauzei FIELDS. Pe când opţiunea :W se referă la un câmp dintr-o înregistrare, clauza WHEN se referă la întreaga înregistrare. Deci construcţia WHEN <expL4> este echivalentă cu opţiunea clauzei FIELDS :W = <expL4>, dar la nivel de înregistrare.

Clauza WIDTH este folosită pentru a limita numărul de caractere afişate pentru un câmp. Nu este afectată mărimea câmpului în baza de date.

Clauzele NORMAL, WINDOW, IN SCREEN se referă la lucrul cu ferestre, iar clauzele COLOR SCHEME şi COLOR la controlul culorilor.

O organizare diferită a ferestrei de editare deschisă pentru modificarea conţinutului unei baze de date, se obţine folosind comanda BROWSE. Această comandă este asemănătoare, atât ca scop, cât şi ca utilizare, cu comenzile CHANGE şi EDIT, principala diferenţă dintre acestea fiind dată de modul de aranjare a câmpurilor în cadrul unei înregistrări, în fereastra de editare.

Spre deosebire de fereastra de editare CHANGE, unde câmpurile sunt afişate unul sub altul în cadrul aceleiaşi înregistări, în fereastra de editare BROWSE câmpurile sunt aşezate pe orizontală, unul lângă altul.

Sintaxa comenzii BROWSE este următoarea:BROWSE

[ FIELDS <listă câmpuri> ][FONT <expC1> [, <expN1> ] ][ STYLE <expC2> ][ FOR <expL1> ][ FORMAT ][ FREEZE <câmp> ][ KEY <expr1> [, <expr2> ] ][ LAST ][ LEDIT ] [ REDIT ][ LOCK <expN2> ][ LPARTITION ][ NOAPPEND ] [ NOCLEAR ] [ NODELETE ][ NOEDIT | NOMODIFY ][ NOLGRID ] [ NORGRID ][ NOLINK ] [ NOMENU ] [ NOOPTIMIZE ][ NOREFRESH ] [ NORMAL ] [ NOWAIT ][ PARTITION <expN3> ][ PREFERENCE <expC3> ][ REST ] [ SAVE][ TIMEOUT <expN4> ][ TITLE <expC4> ][ VALID [ :F ] <expL2> [ ERROR <expC5> ] ][ WHEN <expL3> ][ WIDTH <expN5> ][ [ WINDOW ] <nume fereastră 1> ][ IN WINDOW < nume fereastră 2> | IN SCREEN ] ][ COLOR <listă perechi culori> | COLOR SCHEME <expN6> ]

Marea majoritate a clauzelor sunt asemănătoare cu cele de la comanda CHANGE, 72

Page 72: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

cu câteva diferenţe.Clauza LEDIT prezentă în comanda BROWSE face ca partiţia stângă să fie afişată

în format Change, iar prezenţa clauzei REDIT are acelaşi efect asupra partiţiei drepte.Clauza LOCK este urmată de o expresie numerică ce reprezintă numărul de

câmpuri ce vor fi plasate în partiţia stângă a ferestrei de editare Browse (se referă la primele <expN2> câmpuri.

În fereastra BbrowseB câmpurile sunt separate prin linii verticale. Pentru a le elimina se folosesc clauzele NOLGRID, respectiv NORGRID, acestea referindu-se la partiţia stângă, respectiv dreaptă a ferestrei.

Clauza FORMAT se referă la preluarea formatului de afişare a câmpurilor din fereastra Browse dintr-un fişier de format.

Clauza REFRESH se referă la reîmprospătarea ferestrei de editare Browse fiind necesară la lucrul în reţea cu baza de date.

Restul clauzelor sunt aceleaşi cu cele de la comanda CHANGE (sau EDIT).Modificarea conţinutului unei baze de date se poate face şi cu comanda REPLACE

care, spre deosebire de cele trei anterioare, nu deschide o fereastră în care utilizatorul introduce noile valori ale câmpurilor bazei de date, ci realizează propriu-zis actualizarea bazei de date cu datele precizate în comandă.

Sintaxa comenzii este următoarea:REPLACE

<câmp1> WITH <expr1> [ ADDITIVE ][, <câmp2> WITH <expr2> [ ADDITIVE ] . . . ][ <domeniu> ] [ FOR <expL1> ] [ WHILE <expL2> ][ NOOPTIMIZE ]

Comanda înlocuieşte vechea valoare din câmpul <câmp1> cu valoarea rezultată în urma evaluării expresiei <expr1>, vechea valoare din câmpul <câmp2> cu valoarea expresiei <expr2> ş.a.m.d.

Pentru câmpuri numerice, dacă nu se reuşeşte încadrarea valorii expresiei în câmpul respectiv, acesta va fi umplut cu asteriscuri. În cazul câmpurilor memo, specificând clauza ADDITIVE, vechea valoare nu este înlocuită cu cea nouă, ci se va realiza adăugarea noului conţinut la sfârşitul celui vechi.

<domeniu>, FOR şi WHILE specifică domeniul înregistrărilor la care se referă comanda REPLACE, domeniul implicit fiind înregistrarea curentă.

Exemplu: la baza de date MFIXE se va adăuga o nouă înregistrare, cu următorul conţinut:

COD : vopseaDENUMIRE : vopsea in ulei, albastra

secvenţa de comenzi care realizează acest lucru fiind:USE mfixe APPEND BLANKREPLACE cod WITH ‘vopsea’;

denumire WITH ‘vopsea in ulei, albastra’;. . .

LISTUSE

73

Page 73: Curs FoxPro

FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

74