Sunteți pe pagina 1din 9

Laboratorul nr.

Mecanismele programarii în Visual FoxPro

Programarea în Visual FoxPro implica scrierea unor secvente de cod: instructiuni sub forma
de comenzi, functii sau operatii pe care Visual FoxPro le poate interpreta. Acestea pot fi introduse în:
- fisiere de programe;
- ferestre de cod pentru evenimente sau metode în cadrul proiectantului de formulare (Form
Designer) sau al proiectantului de clase (Class Designer);
- ferestre procedurale în cadrul proiectantului de meniuri (Menu Designer);
- ferestre procedurale în cadrul proiectantului de rapoarte (Report Designer).

Crearea de programe
- 1. în Project Manager se selecteaza optiunea Programs din fila Code;
2. se alege comanda New
- 1. se alege comanda New din meniul File
2. din caseta de dialog New se alege Program
3. se alege New File.
- în fereastra Command se foloseste comanda MODIFY COMMAND
MODIFY COMMAND [FileName | ?]

Visual Fox Pro va deschide o noua fereastra, în care se pot edita instructiunile programului.

Salvarea programelor
- din meniul File se alege Save
- daca se salveaza un program creat în Progect Manager , acesta este automat adaugat
proiectului.

Modificarea programelor
Înainte de a modifica un program, acesta trebuie redeschis prin una din urmatoarele metode:
- pentru programele cuprinse într-un proiect, se selecteaza în Project Manager si se alege
comanda Modify
- în meniul File se alege comanda Open. Din lista Files of Type se alege Program, se
selecteaza fisierul de modificat si se alege comanda Open.
- Se foloseste comanda MODIFY COMMAND în care se specifica numele programului sau
parametrul "?".

Rularea programelor
- daca programul este cuprins într-un proiect, se selecteaza din Project Manager si se alege
comanda Run.
- Din meniul Program se alege comanda Do
- Se foloseşte butonul de execuţie din bara de instrumente
- în fereastra de comenzi se foloseste comanda DO
DO ProgramName1 | ProcedureName [IN ProgramName2] [WITH ParameterList]

1
Conceptele de baza ale programării

Variabile. Macrosubstituţia.
Crearea unei variabile sau modificarea valorii acesteia se face prin una din metodele
următoare:
(1) memvar = expr
Exemplu: msal=1000
mdata=date()
(2) STORE expr TO lista var
O tehnica speciala de lucru cu variabile o reprezinta macrosubstitutia, prin care continutul
unei variabile de tip sir de caractere este tratat ca numele altei variabile sau alt element FoxPro (câmp al
unei baze de date, denumire fişier). Macrosubstituţia functionează ca şi cum în locul variabilei
respective ar fi pus şirul de caractere conţinut de aceasta, fără apostrofurile delimitatoare.
Operatorul de macrosubstitutie este &. ( && indică un comentariu)
Exemplu:1. a=”var”
var= ”Continutul variabilei var”
?a && se afisaza var
? &a && rezultatul afisarii este Continutul variabilei var
? var && rezultatul afisarii este Continutul variabilei var
Obs.: Dezavantajul este ca apare o problema de performanta pentru compilator, in sensul ca linia pe
care apare, trebuie compilata "din mers" in momentul rularii.

Comenzi pentru afişarea variabilelor de memorie existente la un moment dat:

LIST / DISPLAY MEMORY [NOCONSOLE][TO PRINTER [PROMPT]| TO FILE <file>]

Manipularea datelor
a) Operatori
Operatorii utilizati pentru a crea expresii în Visual FoxPro sunt operatori aritmetici, operatori
relationali, operatori logici, operatori specifici şirurilor de caractere: concatenare (+,-) apartenenta
$, etc, operatori specifici datelor calendaristice: adunare sau scadere numar de zile dintr-o data
calendaristica, compararea a doua date.
Exemplu:
1. Fie urmatoarele valori de tip caracter stocate în variabilele v1 si v2:
v1= "Univ. " şi v2="Stefan Cel Mare"
Expresia: ? v1+v2 va avea ca efect afişarea pe ecran a valorii " Univ. Stefan Cel Mare"
2. Daca variabilele v1 si v2 au valorile următoare:
v1= " Str. Univ. " şi v2=21
Expresia: ? v1+v2 va avea ca efect afisarea pe ecran a unui mesaj de eroare.

b) Comenzi
Fiecare comandă determină executarea unei acţiuni. Sintaxa generala a unei comenzi este:
Verb <clauza,>< clauza >..
Unde: verb indica acţiunea ce trebuie executată iar clauzele sunt opţionale si furnizează
informaţii suplimentare legate de modul cum se va executa actiunea
Daca o comanda este scrisa pe mai mult de o linie, atunci la sfarsitul fiecarei linii
intermedare se va plasa simbolul “;”.

2
1. Instructiuni (comenzi) de intrare-iesire

Sunt instructiuni de afisare si instructiuni pentru citirea de la tastatura.

a) Instructiuni de afisare.
Aceasta categorie de comenzi cuprinde urmatoarele instructiuni:
(1) ? Expr1 [PICTURE Cod_format] | [FUNCTION Cod_format] |[AT nColumn]
[FONT Nume_font [,Dimens_Font]
Efect: Afiseaza, pe ecran, valorile uneia sau mai multor expresii Visual FoxPro valide sau le
tipareste la imprimanta, daca SET PRINTER este pe ON , conform valorilor clauzelor PICTURE,
FUNCTION,etc.
Obs.: - clauza AT <expN1> defineste coloana unde se afiseaza <expr1>;

b) Instructiuni de citire de la tastatura.


(1) ACCEPT [<cExpr> ] TO <memvar>
Se afiseaza pe ecran valoarea <cExpr> dupa care se asteapta introducerea unui sir de caractere,
de la tastatura, ce se atribuie variabilei de memorie <memvar>.

(2) INPUT [<cExpr> ] TO <memvar>


Se afiseaza pe ecran valoarea <cExpr> dupa care se asteapta introducerea unei expresii de la
tastatura, a carei valoare se atribuie variabilei de memorie <memvar>.
Obs.: - comanda cere obligatoriu introducerea unei expresii; - pentru introducerea constantelor
de tip sir sau data calendaristica se vor folosi delimitatorii specifici (",',[ ], resp. {}).

(3) WAIT [[<cExpr> ] TO <memvar>]


Se afiseaza pe ecran valoarea <cExpr> dupa care se asteapta apasarea unei taste (fara <CR> a
carei valoare se atribuie variabilei de memorie <memvar>.
Se utilizeaza pentru oprirea temporara a executiei unui program pana la apasarea unei taste.

(4) READ
Efect: Activeaza mecanismul de cititre pentru toate instructiunile @... GET active.
Obs.: - dupa executarea instructiunii READ, toate instructiunile @...GET sunt dezactivate, iar
noile valori introduse se atribuie variabilelor sau câmpurilor specificate;
Exemplu: CLEAR
Zi=SPACE(8)
@ 3,1 SAY "Ce zi este astazi ? " ;
GET zi FUNCTION "M Luni,Marti,Miercuri,Joi,Vineri,Sambata,Duminica";
MESSAGE "Spatiu pentru selectare si apoi Enter"
READ
@ 5,1 SAY "Astazi este : " + zi + "? - apasati o tasta..."
WAIT ""

c. Instructiuni de cautare a inregistrarilor intr-un tabel


Cautarea secventiala intr-un tabel pentru a gasi prima inregistrare care respecta conditia
specificata se realizeaza cu comanda:
LOCATE FOR Expr [Scope] [WHILE cond]

In caz de reuşită, indicatorul de înregistrare se va poziţiona pe înregistrarea respectivă, funcţia


FOUND () va returna valoarea .T. iar functia EOF() va returna valoarea .F.

3
In caz contrar, indicatorul de inregistrari va fi pozitionat dupa ultima inregistrare, FOUND () va
returna valoarea .F. , iar EOF() va returna valoarea .T..
Urmatoarele inregistrari care verifica conditia data vor fi gasite folosind comanda
CONTINUE.
Testarea reusitei sau nereusitei cautarii se face cu functiile RECNO(), FOUND() si EOF().
Functia:
FOUND([nWorkArea | cTableAlias])
Returneaza valoarea adevarat in cazul unei cautari reusite si valoarea fals in cazul unei cautari
nereusite.
Exemplu: Cu ajutorul urmatarei secvente de cod sunt gasiti toti clientii din Suceava si se afiseaza numarul lor:
OPEN DATABASE Parteneri
USE Clienti
STORE 0 TO total
LOCATE FOR UPPER(localitate) = 'SUCEAVA'
DO WHILE FOUND( )
total = total + 1
CONTINUE
ENDDO
WAIT WINDOW 'Total clienti din Suceava: ' ;
+ LTRIM(STR(total)) NOWAIT

d. Extragerea informatiilor statistice din tabele


Scopul principal pentru care sunt create bazele de date il reprezinta obtinerea in timp cat mai
scurt a unor informatii cu privire la datele continute. Aceste informatii pot fi de natura diferita, mai
detaliate sau mai sintetizate sub forma de liste, tabele sau simple valori, informatii statistice sau
totalizatoare.
In acest scop sunt folosite urmatoarele comenzi:
(1) COUNT [Scope] [FOR lExpr1] [WHILE lExpr2] TO Variabila
- comanda numara inregistrarile care respecta conditia data intr-un anumit tabel (cel activ).
Exemplu: USE Clienti
CLEAR
COUNT FOR UPPER(localitate) = 'SUCEAVA' to nrcl
? nrcl

(2) SUM [Expr] [Scope] [FOR Expr1] [WHILE Expr2] TO variab | TO ARRAY nume_arr
- face o insumare a campurilor numerice dintr-un tabel.
Exemplu: SET DEFA TO D:\universitate\gema
OPEN DATABASE stocuri
STORE 0 to tot_intr
USE rulaj
SUM cant for tipo="I" TO tot_intr
CLEAR
? 'Total intrari: ', tot_intr
CLOSE DATA

(3) AVERAGE [Expr][Scope][FOR Expr1][WHILE Expr2]TO Var | TO ARRAY nume_arr


- calculeaza media aritmetica a valorilor expresiilor din lista de expresii.
Exemplu: CLOSE DATABASES
OPEN DATABASE Tranzactii
USE comenzi
CLEAR

4
AVERAGE cant_com TO media && calculeaza media tuturor comenzilor si
&& memoreaza media in variabila de memorie
? media && Afisaza media calculata

(4) TOTAL TO NumeTabel ON NumeCamp [FIELDS lista_campuri] [Scope] [FOR


lExpr1] [WHILE lExpr2]
- se va crea un nou tabel, cu aceeasi structura cu tabelul activ, in care se vor incarca
inregistrari totalizatoare obtinute din tabelul curent.
Exemplu: USE Comenzi
INDEX ON cod_furn TAG furniz
TOTAL TO furn_tot ON furniz
USE furn_tot
LIST

Controlul fluxului programului

In Visual FoxPro exista comenzi care permit determinarea modului cum vor fi executate alte
comenzi. Acestea permit ramificarea conditionala a programului si structurile ciclice.

Ramificarea conditionala
Permite testarea unor conditii si executarea, în functie de rezultatul testului a unor operatii
diferite. Pentru aceasta sunt folosite urmatoarele comenzi: IF ..ELSE ... ENDIF sau DO CASE ...
ENDCASE.
IF lExpr [THEN]
Comenzi1
[ELSE
Comenzi2]
ENDIF
Efect: Se executa Comenzi1 daca lExpr are valoarea adevarat sau Comenzi2 daca are valoarea
fals si clauza ELSE este prezenta.
Obs.: - instructiunea nu se poate folosi de la prompter (fereastra Command);
- daca se utilizeaza comenzi IF imbricate, trebuie utilizat câte un ENDIF pentru fiecare IF
Exemplu: Se presupune ca exista o relatie PERSONAL(codp, nume, functie,salar)
SET TALK OFF
CLEAR
IF Salar2500
REPLACE Salar WITH Salar*1.03
ELSE
REPLACE Salar WITH Salar*1.06
ENDIF

DO CASE
CASE lExpr1
Comenzi1
[CASE lExpr2
Comenzi2
...
CASE lExprN
ComenziN

5
[OTHERWISE
ComenziN+1]
ENDCASE

Efect: Se executa Comenzii pentru prima lExpr cu valoarea .T. sau Comenzin+1 daca toate lExpr
au valoarea .F. si clauza OTHERWISE exista.
Obs.: - instructiunea nu se poate folosi de la prompter;
- la prima evaluare adevarata a lExpr se executa Comenzii si apoi executia comenzii se
incheie;
Un efect asemanator se obtine prin functia:
IIF(lExpr, eExpr1, eExpr2)
Efect: Returneaza valoarea obtinuta prin evaluarea expresiei Expr1 daca lExpr este .T. sau
returneaza Expr2 daca lExpr este .F.. Cele 2 expresii nu trebuie sa fie (obligatoriu) de acelasi tip.

Instructiuni de ciclare
Ciclarea permite executarea uneia sau mai multor linii de cod de câte ori este nevoie. Sunt:
- comenzi pentru bucle cu un numar dat de pasi;
- comenzi pentru bucle cu un numar nedefinit de pasi.
(1) DO WHILE lExpr
Comenzi
[LOOP] [EXIT]
ENDDO
Efect: Executa Comenzi atita timp cât lExpr este .T.
Obs.: - dupa fiecare executie a <grup instr.> se reevalueaza < lExpr >;
- daca lExpr este .F., se executa comanda urmatoare lui ENDDO;
- daca apare LOOP are loc o revenire fortata la inceputul ciclului;
- daca apare EXIT are loc o iesire fortata din bucla.

(2) SCAN [Scope] [FOR lExpr1] [WHILE lExpr2]


Comenzi
[LOOP] [EXIT]
ENDSCAN
Efect: Permite parcurgerea tabelului curent in ordinea indexului curent (daca este activat), tinind
cont si de conditiile din filtru.
Obs.: - se refera doar la parcurgerea unui tabel;
- pointerul de inregistrari inainteaza automat in tabelul care era activ in momentul intrarii
in bucla;
- optiunea LOOP permite reluarea fortata a interatiei;
- optiunea EXIT permite terminarea fortata a instructiunii.
Exemplu: USE Clienti && Deschide tabelul clienti
CLEAR && Sterge ecranul
SCAN FOR UPPER(localitate) = 'SUCEAVA'
? cod_cli,nume, manager
ENDSCAN
Obs.: Exemplul determina afisarea tuturor codurilor, denumirilor si managerilor pentru toti
clientii din Suceava. Nu este obligatoriu sa pun o expresie logica in SCAN, caz in care "scanarea"
tabelului se face pana la intilnirea EOF().

6
Intrebari si exerciţii
Se va crea, salva şi rula un program în Fox prin care :
a) Se setează drept director de lucru, directorul în care s-a salvat proiectul ( Anexa 2);
b) Se setează componentele mediului astfel: (vezi Anexa2)
- pentru dată, anul va fi afişat pe 4 caractere, în format DMY; (vezi Anexa2)
- se activează ceasul ;
- se inhibă afişarea rezultatelor comenzilor pe ecran ( SET TALK OFF);
c) se vor citi de la tastatură două valori ce se vor atribui unor variabile (un şir de caractere şi o
valoare numerică);
d) se vor afişa valorile citite la punctul anterior;
e) se deschide baza de date;
f) se deschide un tabel;
g) se foloseşte mecanismul adăugării datelor prin program ( succesiunea de comenzi APPE
BLANK şi REPLACE….) pentru a adăuga minim 3 înregistrări în tabelul deschis
h) se sterge prima inregistrare din tabel
i) prin intermediul unei variabile de memorie numită "opt" introdusă de la tastatură, care
poate lua valori în mulţimea :D,d,N,n ( se va folosi oricare din variantele ACCEPT, @…
SAY … GET şi READ pentru citirea acesteia), se va crea o structură de ramificare
condiţională. ( IF)
a) pe una din ramuri (de ex, pentru D respectiv d) se deschide încă un tabel într-o altă zonă
şi se stabilesc legături temporare între cele două tabele deschise după care se va verifica
funcţionalitatea legăturilor prin afişare (ex. intre Materiale şi Intrări cum ati facut
laboratorul trecut))
b) pe cealaltă ramură folosindu-se una din structurile de ciclare ( DO WHILE sau SCAN )
se vor se modifică valorile unuia dintre câmpuri (REPLACE)

j) se vor număra înregistrările dintr-unul din tabelele deschise;


k) se afişază rezultatul ;
l) se închide baza de date.

ANEXA1
Principalele funcţii predefinite Visual FoxPro
Funcţii referitoare la semnul datelor numerice
ABS(nExpr) – întoarce valoarea absolută a expresiei numerice furnizată ca parametru
SIGN(nExpr) - întoarce semnul expresiei numerice furnizată ca parametru
Functii de aproximare a datelor numerice
INT(nExpr) - întoarce partea întreagă a expresiei numerice furnizată ca parametru
CEILING(nExpr) – întoarce următorul întreg mai mare sau cel puţin egal cu parametrul
FLOOR(nExpr) - întoarce următorul întreg mai mic sau cel mult egal cu parametrul
ROUND(nExpr, nDecimalPlaces) – rotunjeşte valoarea expresiei numerice la un număr de
poziţii zecimale specificat prin cel de-al doilea parametru
Functii matematice elementare
EXP(nExpr) – exponentul unei expresii numerice furnizate ca parametru
LOG(nExpr) – logaritmul unei expresii numerice

7
SQRT(nExpr) – rădăcina pătrată a unei expresii numerice
ASIN(nExpr), ACOS(nExpr), SIN(nExpr), COS(nExpr)..- funcţii trigonometrice
Functii referitoare la codificarea caracterelor din siruri
CHR(nExpr) – întoarce caracterul asociat codului ANSI (numeric) specificat
ASC (cExpr) – întoarce codul ANSI al primului caracter (cel mai din stânga) din expresia tip şir
de caractere furnizată ca parametru.
Functii referitoare la subsirurile de caractere
SUBSTR(cExpr, nPosStart [, NrCharIntoarse]) – întoarce un subşir al şirului cExpr, care începe
cu caracterul aflat în poziţia nPosStart şi care conţine un număr de caractere dat de
NrCharIntoarse.
Variante:
LEFT(cExpr,nExpr)–întoarce primele nExpr caractere din şirul cExpr (cele mai din stânga)
RIGHT(cExpr,nExpr) - întoarce ultimele nExpr caractere din şirul cExpr (cele mi din dreapta)
Alte functii:
REPLICATE(cExpr,nExpr) – multiplică şirul de caractere cExpr de nExpr ori
SPACE(nExpr) – întoarce un şir de caractere compus din numărul specificat de spaţii
Functii de eliminare a blancurilor:
ALLTRIM(cExpr) – elimină atât spaţiile din stânga şirului specificat, cât şi pe cele din dreapta
acestuia
LTRIM(cExpr) – elimină spaţiile din stânga şirului specificat
RTRIM(cExpr) – elimină spaţiile din dreapta şirului specificat
Functii referitoare la informatii despre un sir de caractere
LEN(cExpr) - întoarcre lungimea şirului specificat ca parametru
ISDIGIT(cExpr) – întoarce valoarea logică .T. dacă cel mai din stânga caracter din şirul
specificat ca parametru este o cifră (0-9)
ISLALPHA(cExpr) - întoarce valoarea logică .T. dacă cel mai din stânga caracter din şirul
specificat ca parametru este o literă
ISLOWER(cExpr) - întoarce valoarea logică .T. dacă cel mai din stânga caracter din şirul
specificat ca parametru este o literă mică
ISUPPER(cExpr) întoarce valoarea logică .T. dacă cel mai din stânga caracter din şirul specificat
ca parametru este o literă mare
Functii referitoare la transformarea sirurilor de caractere
LOWER(cExpr) - întoarce şirul cExpr scris în întregime cu litere mici
UPPER(cExpr) - întoarce şirul cExpr scris în întregime cu litere mari
PROPER(cExpr)- întoarce şirul cExpr scris sub forma unui nume propriu
Functii referitoare la date calendaristice
DATE() - furnizează data curentă a sistemului;
DOW(dExpr) - returnează numărul zilei din cadrul săptămânii pentru data specificată;
CDOW(dExpr) - returnează numele zilei din saptamana pentru data specificata;
DAY(dExpr) - returnează numărul zilei din cadrul lunii pentru data specificata;
MONTH(dExpr) CMONTH(dExpr) - returnează numărul/numele lunii pentru data specificată;
YEAR(dExpr) - returnează anul pentru data specificata;
Funcţii pentru controlul timpului:
TIME(<nExpr>) - returnează un sir de caractere de lungime 8, in formatul HH:MM:SS
ce reprezinta ora exacta a sistemului;
Functie care verifica daca o expresie evaluata este vida sau nu
EMPTY(eExpression)
Functii de conversie

8
- din grade în radiani si invers
DTOR(nExpr)
RTOD(nExpr)
- transformarea unei date calendaristice intr-un sir de caractere
DTOC (dExpr)
DTOS (dExpr)
MDY (dExpr); DMY (dExpr)
- transformarea unui sir de caractere in data calendaristica
CTOD (cExpr)
-transformarea valorilor numerice in şiruri de caractere
STR(nExpr [, nLength [, nDecimalPlaces]])
-transformarea şirurilor de caractere in valori numerice
VAL(cExpr)

ANEXA 2
Instrucţiuni (comenzi) de configurare

Instructiuni pentru controlul formatului datei calendaristice


SET CENTURY ON/OFF / validează, respectiv invalidează afişarea anului pe patru digiţi
SET DATE TO DMY|MDY| BRITISH|FRENCH| GERMAN – stabileşte formatul de afişare a
datei calendaristice
Instructiuni pentru controlul formatului de afişare al ceasului sistem:
SET CLOCK ON | OFF – validează/invalidează afişarea ceasului
SET CLOCK TO [<ROW>,<COL>]- stabileşte poziţia pe ecran în care se va afişa ceasul
SET HOURS TO [12 | 24] – stabileşte formatul de afişare al orei
Diverse instrucţiuni de configurare
SET BELL ON/OFF – validează/invalidează alarma sonoră a mediului
SET CARRY ON/OFF – validează/invalidează păstrarea valorilor din înregistrarea curentă
pentru o nouă înregistrare introdusă prin una din comenzile INSERT, APPEND sau BROWSE
SET DATABASE TO [NumeBD] – stabileşte baza de date curentă
SET DEFAULT TO [Specificator_director] – stabileşte directorul curent
SET DELETED ON/OFF – invalidează/validează utilizarea înregistrărilor marcate pentru
ştergere în comenzi ulterioare
SET ESCAPE ON/OFF – validează/invalidează întreruperea execuţiei unui program sau a unei
comenzi la apăsarea tastei ESCAPE
SET EXCLUSIVE ON/OFF – stabileşte dacă fişierele tabel vor fi deschise pentru uzul exclusiv
sau partajat într-o reţea
SET LOCK ON/OFF – validează/invalidează blocarea automată a tabelelor pentru anumite
comenzi.
SET PATH TO [lista_cai_de_cautare] – stabileşte o listă a căilor de căutare pentru fişiere
SET TALK ON/OFF – validează/invalidează afişarea rezultatelor comenzilor Visual FoxPro

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