Documente Academic
Documente Profesional
Documente Cultură
Curs FoxPro
Curs FoxPro
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:
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
4
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă
5
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă
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ţă
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.
9
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă
10
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă
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ţă
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ţă
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
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
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ţă
18
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă
20
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă
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.
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.
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:
Î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ţă
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.
29
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă
3. TIPURI DE DATE
• constante numerice.
Operatorii care se aplică unor operanzi numerici, având ca rezultate tot valori
numerice, în ordinea priorităţii, sunt următorii:
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.
? 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.
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ţă
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.
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.
.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
38
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
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
SAVE TO < fişier > / TO MEMO < câmp memo > [ALL LIKE / EXCEPT < machetă >]
RESTORE FROM < fişier > / FROM MEMO < câmp memo > [ADDITIVE]
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]
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 >] ) ] …
1 2 3
4 5 6
1 2 3 4
5 6 .F. .F.
.F. .F. .F. .F.
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:
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
52
FoxPro 2.6 sub Windows – Intrarea şi ieşirea din FoxProW. Elemente de interfaţă
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ţă
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ţă
Î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
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
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ţă
[ 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ţă
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ţă
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
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.
INSERT BEFORE
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
[ 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
: 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
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
[ 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