Sunteți pe pagina 1din 73

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
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
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 texte
Apare 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 jos
Page Up O pagină de text în sus
Page Down O pagină de text în jos
Home La începutul liniei
End La sfârşitul liniei
Ctrl + → Un cuvânt la dreapta
Ctrl + ← Un cuvânt la stânga
Ctrl + Home La începutul textului
Ctrl + 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ă:

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

î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).
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.

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

2. BAZE DE DATE. MENIURI

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 date


Pentru 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
6
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

cazul, numărul de zecimale.


Denumire câmp Tip câmp Lungime Zecimale
cod Character 8
denumire Character 30
cantitate Numeric 10 2
unit_mas Character 3
valoare Numeric 10 2
ultim_misc Date 8
cond_spec Logical 1
informatii 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 caractere
Numeric - numeric
Float - numeric
Date - dată calendaristică
Logical - logic, booleană
Memo - memo
General - general
Picture - 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
7
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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
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 lucru


Pentru 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ă
8
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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
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 date


Lucrul 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 +

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

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
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 date


Pe 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 modificat


Există 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

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

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.
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 expresii
Pentru 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:
11
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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 (,,);
• 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: All
For: 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 date
Ca ş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,

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

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
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ţiale


Accesul 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ă
13
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

(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);
• 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 1
deplasare pe ultima înregistrare: Goto Bottom
deplasare pe înregistrarea 6: Goto 6 sau Goto 2*3
deplasarea pe următoarea înregistrare: Skip sau Skip 1
deplasarea pe înregistrarea anterioară: Skip –1
Un 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 -
Continue
Continue
Continue
Continue
Comenzile Locate şi Continue pot fi date şi direct din fereastra Browse.
2.8 Calcule statistice cu datele din bazele de date
Toate 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
14
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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.
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: All
For: substr(material.cod, 1, 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 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.cantitate
Scope: All
For: 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


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

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.
Expr: -
Scope: All
For: material.valoare > 5000
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
? “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: All
For: -
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
? “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 date


Această 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
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
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 date


Indexarea 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ă;

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

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


• 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-
19
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

o expresie logică care va fi evaluată înainte de accesarea fiecărei înregistrări. Dacă


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

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

Add şi în fereastra deschisă se alege fişierul index respectiv.

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.
21
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

În fereastra Constructorului de expresii se va introduce o expresie care va fi evaluată la


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;

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

• 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ă;
• 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;
23
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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);
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)
24
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

(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 tabele
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. Dată
… Total TVA Denumire Furnizor
Fct. Factură
… … … … … …
40 20/04/99 … 100000 18000 Societatea Comercială ALFA SRL
41 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. Data Cod Cod Denumire



Factură Factură Furnizor Furnizor Furnizor
… … … …
40 20/04/99 … 23
41 23/04/99 … 23
… … … … 23 Societatea comercială ALFA SRL
53 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):
25
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

FURNIZ.DBF DOMENIU.DBF
COD DENUMIRE DOM COD DENUMIRE
FACTURI.DBF … … … … …
NR. COD COD
… 24 GAMA SRL INM INM Industrie Metaliferă
FACT. FURN. BENEF.
… … … … … … … … …
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
26
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

invizibile;

♦ 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;
27
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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


care 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 totalizatoare


Un 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
28
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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ă
î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
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 logic


Este 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ă expresiile
2 !, NOT negaţie logică
3 AND “şi” logic
4 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 numeric


Cu 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;
30
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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

Prioritatea Operator Semnificaţie


1 (,) grupează expresiile
2 **, ^ ridicare la putere
3 *, /, % î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/3
0.67
SET DECIMALS TO 4
? 2/3
0.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 3
a=2/3
DISPLAY MEMORY LIKE a
A 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.
31
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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
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)
-1
a=-2/3
? a=SIGN(a)*ABS(a)
.T.

Funţii de aproximare a datelor numerice


INT (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.46
a=-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 elementare


EXP(expN) – returnează e exp N ;
LOG(expN) – returnează ln(exp N ) ;
LOG10(expN) – returnează lg(exp N ) ;
SQRT(expN) – returnează exp N ;
Exemple:
32
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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

Funcţii trigonometrice
PI ( ) – 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 caractere


Un ş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
33
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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ă.
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 expC2
Rezultatul 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
> mai mare decât “fals” în caz contrar; compararea se face în ordine, la
<>, #, != diferit de nivel de caracter, astfel: se verifică relaţia dintre primele
<= mai mic sau egal caractere ale celor două şiruri; dacă acestea sunt egale
>= mai mare sau egal se trece la cel de-al doilea caracter ş.a.m.d.
== identic
Compararea 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.

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

Funcţii referitoare la codificarea caracterelor din şiruri


CHR (expN) – returnează caracterul ASCII corespunzător codului numeric expN;
Exemplu:
? CHR (49)
1
? 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 caractere
SUBSTR (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
35
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

dreapta lui;

Exemplu:
? ALLTRIM (‘_ _ _AB ’) == ‘AB ’
.T.
? ‘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 caractere


LEN (expC) – returnează lungimea şirului de caractere expC;
36
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Exemplu:
? LEN (‘Salutari !‘)
10
? LEN (‘Curs de ‘ + ‘FoxProW’)
15
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 caractere


LOWER (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 caractere


LIKE (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’)
37
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

.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
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_c
02/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} + 1
03/01/92
? {01/01/92} - 1
12/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.

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

Formatul de specificare a datelor calendaristice este controlat de comanda:


SET DATE [TO] AMERICAN / ANSI / BRITISH / FRENCH / GERMAN / ITALIAN /
JAPAN / USA / MDY / DMY /YMD
Formatul pentru fiecare dintre opţiuni este:
Tipul datei Formatul
AMERICAN ll/zz/aa
ANSI aa.ll.zz
BRITISH zz/ll/aa
FRENCH zz/ll/aa
GERMAN zz.ll.aa
ITALIAN zz-ll-aa
JAPAN aa/ll/zz
USA ll-zz-aa
MDY ll/zz/aa
DMY zz/ll/aa
YMD 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/99
SET CENTURY ON
SET 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
39
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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:
? 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 FoxProW


Ora 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:
CLEAR
SET CLOCK TO 10, 10
SET CLOCK OFF
SET CLOCK TO
SET CLOCK ON
SET 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”.
40
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

3.5 Funcţii referitoare la toate tipurile de date


TYPE (expC) – returnează tipul expresiei expC, unde expC reprezintă un şir de caractere;
Caracterul
Tipul expresiei
returnat
C şir de caractere
N numeric
D dată calendaristică
L logic, boolean
M memo
G general
U 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 linie
numeric este 0
dată calendaristică data vidă ( { / / sau { } )
logic este fals .F.
memo fără conţinut
general 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.
41
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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.
? 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.

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

4. VARIABILE ŞI MASIVE

4.1 Variabile
Prelucrarea 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:


? alfa
432
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 2
a=”buna” && vechea variabila “a” este inlocuita cu;
43
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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 >
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, c
NOTE se creeaza trei variabile numerice a, b, c, care;
sunt initializate cu valoarea 0
STORE {01\11\93} TO data
NOTE 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 >
sau
RELEASE 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, beta
NOTE se elimină din memorie variabilele alfa si beta
RELEASE ALL LIKE a*
NOTE se inlatura din memorie toate variabilele;
care incep cu litera a
RELEASE 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
44
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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:

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
CLEAR
a=1
b=2
suma=a+b
? a, ‘+’, b, ‘=’, suma
1+2=3
SAVE TO f_var
NOTE se salveaza variabilele a, b, si suma;
in fisierul f_var.mem
a=5
b=3
suma=a+b
? a, ‘+’, b, ‘=’, suma
5+3=8
RESTORE FROM f_var
? a, ‘+’, b, ‘=’, suma
1+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 !’
? &a
Salut !
? alfa &&echivalenta cu comanda anterioara
45
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Salut !
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’
? &a
O 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 nume
nume 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]
46
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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


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 Masive
O 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 10
DIMENSION alfa (2, 4)
NOTE va declara matricea alfa cu 2 linii si 4 coloane
DECLARE 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:
47
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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


• 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 a
NOTE toate elementele masivului vor fi de tip numeric,;
avand initial valoarea 0
? ‘a(3) =’, a(3)
a(3)=0
a=’ ‘
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.
48
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

Şi în acest caz, elementele care nu încap în noul masiv bidimensional se


pierd, iar elementele masivului bidimensional pentru care nu au
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 ) = I
ENDFOR
FOR 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
ENDFOR
Vom obţine pe ecran următoarele rezultate:

1 2 3
4 5 6

1 2 3 4
5 6 .F. .F.
.F. .F. .F. .F.

Funcţii referitoare la prelucrarea masivelor


ALEN ( <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
49
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

? ‘Acest tablou are ‘, ALEN(alfa,1), ‘linii si ‘,;


ALEN(alfa,2), ‘coloane’
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)=I
ENDFOR
?
FOR i=1 TO5
?? a(I)
ENDFOR
AINS(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 5
1 2 .F. 3 4 5

Elementul nou apare aici Acest element se pierde

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)=I
50
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

ENDFOR
?
FOR i=1 TO5
?? a(I)
ENDFOR
ADEL(a,3)
FOR i=1 TO 5
?? a(I)
ENDFOR
Dispare acest element

a(1) a(2) a(3) a(4) a(5)


1 2 3 4 5
1 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”.
51
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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
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 Tipul
1 numele fişierului şir de caractere
2 mărimea numeric
3 data ultimei actualizări dată calendaristică
4 tipul ultimei actualizări şir de caractere
5 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 element
Exemplu:
ADIR (masiv, ‘*.PRG’, ‘H’)
NOTE se incarca toate programele *.PRG ;
inclusiv cele ascunse
ADIR (masiv, ‘C:\*’, ‘D’)
NOTE se incarca toate subdirectoarele radacinii;
discului C
ADIR (masiv, ‘*.DBF’)
NOTE se incarca toate bazele de date
ADIR (masiv, ‘C: ‘, ‘V’)
NOTE se incarca in primul element (singurul) al;
masivului masiv eticheta de volum a discului C
Dacă “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 Tipul
1 nume câmp şir de caractere
2 tip câmp (C, D, L, M, G, N sau F) şir de caractere
3 lungime câmp numeric
4 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.

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

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
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-a
ASORT (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
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

5. LIMBAJ DE PROGRAMARE

5.1 Generalităţi
După 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 Baza de date
Indicatorul de înregistrări poate fi
înregistrări modificat prin comenzi FoxProW, acest lucru
fiind echivalent cu deplasarea săgeţii
Nr. înregistrare
curentă
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ă
************** Înregistrări 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:
54
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

• 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
acest moment.

5.2 Zone de lucru


Pentru 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 comanda
Presupunem că în zona de lucru 2 avem deschisă baza de date DEBITE; pentru
selectarea acestei zone putem folosi comenzile:
SELECT 2
SELECT B
SELECT debite
SELECT ‘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 curenta
1
? SELECT (1) && afiseaza ultima zona de lucru nefolosita
225
SELECT SELECT ( ) + 1
NOTE se selecteaza prima zona de lucru dupa cea curenta
? SELECT (0)
2
55
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

5.3 Crearea unei baze de date. Structura bazei de date


Corespunză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
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ă> Descriere
C n - şir de caractere de lungime n
D - - dată calendaristică
F n d real; de lungime n, cu d zecimale
L - - logic
M - - memo
N n d numeric, de lungime n, cu d zecimale
G - - general
P - - 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 fix
DENUMIRE Character 30 denumirea
VALOARE Numeric 10 valoarea
AMORTIZARE 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;

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

(cod C(10), denumire C(30), valoare N(10),;


amortizare N(10), loc_folos M, stare L, data_inst D)

5.4 Deschiderea şi închiderea unei baze de date


Să 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 curenta
1
USE mfixe
NOTE s-a deschis baza de date mfixe in zona de lucru 1
USE && s-a inchis baza de date
USE mfixe IN 2
NOTE 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 1
USE mfixe && se deschide baza de date mfixe in;
aceasta zona
USE mfixe IN 2 AGAIN
NOTE se deschide baza de date mfixe si in zona de lucru 2,;
* se inchid bazele de date
USE in 2
USE
Observaţ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.

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

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
USE mfixe NOUPDATE
NOTE se deschide baza de date mfixe in zona a doar;
pentru citire
USE && 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 1
USE 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.
USE
USE IN 1

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

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.
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 date


Identificarea 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 tabel
NOTE se deschide baza de date mfixe in zona de lucru;
b, atribuindu-i aliasul ‘tabel’
SELECT tabel
NOTE se selecteaza zona de lucru 2 prin aliasul tabel;
al bazei de date din aceasta zona de lucru
? SELECT ( )
2
USE 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 a
USE mfixe IN b && aliasul atribuit este mfixe
59
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

SELECT mfixe && se selecteaza zona de lucru 2;


folosind aliasul mfixe
? SELECT ( )
2
USE IN b
• 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 a
USE mfixe
USE mfixe IN 11 AGAIN
SELECT w11
NOTE referirea la zona de lucru 11 se face prin;
aliasul w11 atribuit bazei de date deschisa;
in aceasta zona de lucru
? SELECT ( )
11
SELECT 1
USE IN 1 && se inchid bazele de date
USE IN 11

5.6 Manipularea structurii unei baze de date


La î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> ]
60
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

[ NONCONSOLE ]

LIST STRUCTURE [ IN <expN> | <expC>]


[ TO PRINTER [ PROMPT ] | TO FILE <fişier> ]
[ NONCONSOLE ]

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 a
USE mfixe
LIST STRUCTURE
Structure for database : C:\ FOXPROW \ MFIXE.DBF
Number of data records : 0
Date of last update : 08/04/01
Memo file block size : 64
Field Field Name Type Width Dec
Index
1 COD Character 10
2DENUMIRE Character 30
3VALOARE Numeric 10 0
4AMORTIZARE Numeric 10 0
5LOC_FOLOS Memo 10
6STARE Logical 1
7DATA_INST Date 8
8 TIP Character 1
** Total ** 81
USE
Un 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 ]

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

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:
SELECT a
USE mfixe
COPY STRUCTURE TO mfixe_n.dbf;
FIELDS cod, denumire, valoare
USE mfixe_n
LIST STRUCTURE
Structure for database : C:\ FOXPROW \ MFIXE_N.DBF
Number of data records : 0
Date of last update : 08/04/01
Memo file block size : 64
Field Field Name Type Width Dec
Index
1 COD Character 10
2DENUMIRE Character 30
3VALOARE Numeric 10 0
** Total ** 51
USE

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)

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

FIELD_ FIELD_ FIELD_L FIELD_


NAME TYPE EN DEC
(nume câmp) (tip câmp) (lăţime câmp) (zecimale câmp)
1 Cod C 10 -
2 Denumire C 30 -
3 Valoare N 10 0
4 Amortizare N 10 0
5 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 mfixe
COPY STRUCTURE EXTENDED TO interm
NOTE se creaza baza de date interm.dbf care va contine;
structura bazei de date mfixe
USE interm
NOTE din aceasta se sterg inregistrarile 2, 3, si 6;
corespunzatoare campurilor denumire, valoare si stare
DELETE RECORD 2 && se marcheaza pentru stergere
DELETE RECORD 3 && respectivele inregistrari
DELETE RECORD 6 &&
PACK && se sterg fizic inregistrarile marcate anterior
CREATE mfixe_n FROM interm
NOTE se creeaza baza de date mfixe_n cu noua structura;
codificata in baza de date interm
LIST STRUCTURE
FIELDS cod, denumire, valoare
USE mfixe_n
LIST STRUCTURE
Structure for database : C:\ FOXPROW \ MFIXE_N.DBF
Number of data records : 0
Date of last update : 09/04/01

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

Field Field Name Type Width Dec


Index
1 COD Character 10
2AMORTIZARE Numeric 10 0
3LOC_FOLOS Memo 10
4DATA_INST Date 8
5 TIP Character 1
** Total ** 40
USE

5.7 Manipularea câmpurilor unei baze de date


Accesul la câmpurile unei baze de date este controlat de comanda SET FIELDS
SET FIELDS ON | OFF
SET 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 ON
SET 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 ALL
USE mfixe
? ‘Baza de date MFIXE are ‘, FCOUNT ( ), ‘campuri’
Baza de date MFIXE are 6 campuri
NOTE 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)
0
64
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

USE

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.
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 ALL
USE mfixe
? FIELD (1)
NOTE afiseaza numele primului camp al bazei de date;
deschisa in zona de lucru curenta
COD
USE mfixe IN 2 AGAIN
? FIELD (1, 2)
NOTE ca efect este echivalenta cu functia FIELD ( );
anterioara
COD
? FIELD (9) == ‘ ‘ && avem numai 8 campuri in baza de date
TIP
? FIELD (FCOUNT ( )) && afiseaza numele ultimului camp
TIP
CLOSE 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 ALL
USE mfixe
? FSIZE (‘denumire’)
NOTE afiseaza marimea celui de-al doilea camp;
al bazei de date
30
USE

5.8 Domeniul înregistrărilor


Există comenzi FoxProW care acţionează asupra mai multor înregistrări ale unei baze de
65
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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>;
• 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 date


Adă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);
66
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

• 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
î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 ALL
USE mfixe_n && se deschide baza de date mfixe_n
APPEND 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 date
USE
Preluarea î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 /
67
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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

Înregistrare nouă Înregistrare curentă

INSERT
Exemplu:
USE mfixe_n
GOTO 2 && se pozitioneaza indicatorul de ;
inregistrari pe inregistrarea 2
INSERT BEFORE && se insereaza o noua inregistrare;
in pozitia 2
LIST
USE

5.10 Modificarea conţinutului unei baze de date


Modificarea 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> ]
68
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

[ 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,
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 ALL
USE mfixe
CHANGE FIELDS cod, vechime= (DATE ( ) – data_inst) / 365, stare
USE

Opţiunile ataşate fiecărui câmp au următoarele semnificaţii:


:R – câmpul se poate vizualiza, nu şi modifica;
Exemplu:
USE mfixe
CHANGE FIELDS cod : R, stare
NOTE 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;
69
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

: 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 mfixe
CHANGE 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’
USE

: 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 mfixe
CHANGE FIELDS cod : R, valoare : B = 100000, 9999999999
USE

: 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 mfixe
CHANGE FIELDS cod : R, valoare : H = ‘Val.mijl.fix’;
: W = valoare = 0
NOTE 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 mfixe
CHANGE FREEZE denumire
NOTE se editeaza doar denumire al bazei de date mfixe
USE

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
70
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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
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.
71
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

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.
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> ]
72
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

[ 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,
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 : vopsea
DENUMIRE : vopsea in ulei, albastra
secvenţa de comenzi care realizează acest lucru fiind:
USE mfixe APPEND BLANK
REPLACE cod WITH ‘vopsea’;
denumire WITH ‘vopsea in ulei, albastra’;
...
73
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă

LIST
USE

74

S-ar putea să vă placă și