Visual Fox Pro Tutorial
Visual Fox Pro Tutorial
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:
- fereastra Command
- 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 | ?]
[NOEDIT] [NOMENU] [NOWAIT]
[RANGE nStartCharacter, nEndCharacter]
[[WINDOW WindowName1]
[IN [WINDOW] WindowName2 | IN SCREEN]]
[AS nCodePage] [SAME] [SAVE]
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 MODI COMM î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
1
- în fereastra de comenzi se foloseste comanda DO
DO ProgramName1 | ProcedureName [IN ProgramName2] [WITH ParameterList]
Stocarea datelor
Fiecare data cu care se lucrează aparţine unui anumit tip, care determina modul în care aceasta
poate fi stocata si folosita.
Containere de date
Containerele de date permit executarea aceloraşi operaţii asupra mai multor date simultan.
Principalele containere de date în Visual FoxPro sunt:
Tipul Descriere
Variabile Elemente singulare de date stocate în memoria RAM a calculatorului
Înregistrări în tabele Rânduri multiple de câmpuri predefinite, fiecare din acestea conţinând date
care corespund tipului declarat.
Matrice (masive) Elemente multiple de date stocate în RAM.
2
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.
Manipularea datelor
Folosirea operatorilor
Operatorii utilizati pentru a crea expresii în Visual FoxPro sunt:
- operatori aritmetici: adunare, scadere, înmultire, ridicare la patrat etc,
- operatori relationali: <,>,=,<=,>=, <>. Ordinea lor de prioritate este aceeasi, de la stânga la
dreapta.
- operatori logici: negatie .not.(!) , sau logic .or. , si logic .and. Ordinea lor de prioritate este:
not; and; or.
- operatori specifici sirurilor 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. "
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. "
v2=21
Expresia:
? v1+v2 va avea ca efect afisarea pe ecran a unui mesaj de eroare.
Nota: Un semn de întrebare (?) la începutul unei expresii genereaza un caracter de salt la linie
noua si determina afişarea rezultatului expresiei în fereastra de rezultate activa.
Pentru un anumit operator trebuie folosite aceleaşi tipuri de date, în caz contrar se va genera un
mesaj de eroare de nepotrivire de tip.
Pentru evitarea acestui tip de probleme se vor folosi funcţiile de conversie.
3
Functii matematice elementare
EXP(nExpr)
LOG(nExpr)
SQRT(nExpr)
SIN(nExpr): COS(nExpr)..
ASIN(nExpr): ACOS(nExpr)..
Functii referitoare la codificarea caracterelor din siruri
CHR(nExpr)
ASC (cExpr)
Functii referitoare la subsirurile de caractere
SUBSTR(cExpr, nStartPosition [, nCharactersReturned])
Variante:
LEFT(<cExpr>,<nExpr>);
RIGHT(<cExpr>,<nExpr>);
Alte functii:
REPLICATE(<cExpr>,<nExpr>);,
SPACE(<nExpr>)
Functii de eliminare a blancurilor:
ALLTRIM(<cExpr>);
LTRIM(<cExpr>)
RTRIM(<cExpr>)
Functii referitoare la informatii despre un sir de caractere
LEN(<cExpr>);
ISDIGIT(<cExpr>);
ISLALPHA(<cExpr>);
ISLOWER(<cExpr>);
ISUPPER(<cExpr>);
Functii referitoare la transformarea sirurilor de caractere
LOWER(<cExpr>);
UPPER(<cExpr>);
PROPER(<cExpr>);
Functii referitoare la date calendaristice
DATE() - obtinerea datei curente a sistemului;
DOW(<dExpr>) - returneaza numarul zilei din cadrul saptamanii pentru data specificata;
CDOW(<dExpr>) - returneaza numele zilei din saptamana pentru data specificata;
DAY(<dExpr>) - returneaza numarul zilei din cadrul lunii pentru data specificata;
MONTH(<dExpr>) CMONTH(<dExpr>) - returneaza numarul/numele lunii pentru data
specificata;
YEAR(<dExpr>) - returneaza anul pentru data specificata;
Instructiuni pentru controlul formatului datei calendaristice
SET CENTURY ON/OFF
SET DATE TO DMY|MDY| BRITISH|FRENCH| GERMAN …
Functii pentru controlul timpului:
TIME(<nExpr>) - returneaza un sir de caractere de lungime 8, in formatul HH:MM:SS
ce reprezinta ora exacta a sistemului;
Instrucţiuni pentru controlul formatului de afişare al ceasului sistem:
SET CLOCK ON | OFF
SET CLOCK TO [<ROW>,<COL>]
SET HOURS TO [12 | 24]
4
Funcţie care verifica daca o expresie evaluata este vida sau nu
EMPTY(eExpression)
Funcţii de conversie
- 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 siruri de caractere
STR(nExpr [, nLength [, nDecimalPlaces]])
- transformarea sirurilor de caractere in valori numerice
VAL(cExpr)
Folosirea Comenzilor
5
E Utilizeaza formatul european de data calendaristica;
I Centreaza textul in cadrul unui camp (numai SAY);
J Aliniaza textul la dreapta in cadrul unui camp (numai SAY);
K Selecteaza intregul camp de editare cand cursorul se muta in acest camp;
L Afiseaza zerourile nesemnificative intr-un camp numeric;
M Defineste,atunci cand este urmat de o lista de optiuni separate prin virgula,optiunile
acceptabile pentru o variabila citita cu GET;
T Elimina spatiile din fata si din spate, in cadrul unui camp;
===================================================================
==================================================================
Cod PICTURE Semnificatie
==================================================================
9 Permite introd. cifrelor pentru date de tip sir de caract. si a cifrelor si semnelor
pentru date numerice;
# Permite cifre, blancuri si semne;
$ Afiseaza simbolul monetar curent definit de SET CURRENCY;
* Afiseaza asteriscuri in fata valorilor numerice;
. Specifica pozitia punctului zecimal;
, Separa cifrele la stanga punctului zecimal;
A Permite introducerea doar a caracterelor alfabetice;
W Permite doar date de tip logic;
N Permite doar litere si cifre;
X Permite doar caractere;
Y Permite doar caracterele Y,y,N,n trecandu-le la majuscule.
===================================================================
Obs.: Codurile FUNCTION pot fi incluse in clauza PICTURE dar precedate de "@"
Exemplu. PICTURE 'abcde' FUNCTION '!'
PICTURE '@!abcde'
Cele 2 forme sunt echivalente !!
a) Instructiuni de afisare.
Aceasta categorie de comenzi cuprinde urmatoarele instructiuni:
(1) ? | ?? Expr1
[PICTURE cFormatCodes] | [FUNCTION cFormatCodes] | [VnWidth]
[AT nColumn]
[FONT cFontName [, nFontSize] [STYLE cFontStyle | Expr2]]
[, Expr3] ...
Efect: Afiseaza, pe ecran, valorile unei sau mai multor expresii Visual FoxPro valide sau le
tipareste la imprimanta, daca SET PRINTER este pe ON , conform valorilor clauzelor PICTURE,
FUNCTION, AT, STYLE.
Obs.: - clauza AT <expN1> defineste coloana unde se afiseaza <expr1>;
- clauza STYLE <expC> defineste facilitati suplimentare de afisare/tiparire,cum ar fi bold, italic,
underline, sau scriere cu diferite tipuri de caractere (font) , daca monitorul sau imprimanta permit aceste
optiuni, in caz contrar fiind ignorata.
(2) @ <linie,coloana> SAY <expr>
[FUNCTION <expC1>] [PICTURE <expC2>][SIZE <expN1>, <expN2>]
[FONT <expC3> [, <expN3]][STYLE <expC4>][COLOR SCHEME <expN4>
| COLOR <lista perechi culori> ]
6
Efect: Afiseaza valoarea expresiei <expr> valide pe ecran sau o tipareste la imprimanta, daca
SET DEVICE este PRINTER, pe randul <expN1> si in coloana <expN2>, conform clauzelor
PICTURE, FUNCTION.
(5) READ
[CYCLE]
7
[ACTIVATE <expL1>][DEACTIVATE <expL2>]
[WITH <window title list>] [SHOW <expL3>] [VALID <expL4 | expN1>]
[WHEN <expL5>] [OBJECT <expN2>] [TIMEOUT <expN3>]
[SAVE] [NOMOUSE] [LOCK | NOLOCK]
[COLOR <color pair list> | COLOR SCHEME <expN4>]
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 campurilor specificate;
Exemplu: CLEAR
SET TALK OFF
SET STATUS OFF
SET SCOREBOARD OFF
Zi=SPACE(8)
@ 3,1 SAY "Ce zi este astazi ? " ;
GET zi FUNCTION "M Luni, Marti, Miercuri, Joi, Vineri, Simbata, Duminica" ;
MESSAGE "Spatiu sau prima litera pentru selectare si apoi Enter"
READ
@ 5,1 SAY "Astazi este : " + zi + "? - apasati o tasta..."
WAIT ""
SET STATUS ON
SET SCOREBOARD ON
SET TALK ON
8
CONTINUE
ENDDO
WAIT WINDOW 'Total clienti din Suceava: ' ;
+ LTRIM(STR(gnCount)) NOWAIT
9
? gnAvg && Afisaza media calculata
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 ; IIF();
- DO CASE ... ENDCASE.
IF lExpr [THEN]
Commands1
[ELSE
Commands2]
ENDIF
Efect: Se executa Commands1 daca lExpr are valoarea adevarat sau Commands2 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
10
Exemplu: Se presupune ca exista o relatie PERSONAL(codp, nume, functie,salar)
SET TALK OFF
CLEAR
IF Salar>= 25000000
REPLACE Salar WITH Salar*1.03
ELSE
REPLACE Salar WITH Salar*1.06
ENDIF
DO CASE
CASE lExpr1
Commands1
[CASE lExpr2
Commands2
...
CASE lExprN
Commandsn]
[OTHERWISE
Commandsn+1]
ENDCASE
Efect: Se executa Commandsi pentru prima lExpr cu valoarea .T. sau Commandsn+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 Commandsi si apoi executia comenzii
se incheie;
Un efect asemanator se obtine prin functia:
IIF(lExpr, eExpr1, eExpr2)
Efect: Returneaza valoarea obtinuta prin evaluarea expresiei eExpr1 daca lExpr este 'true' sau
returneaza eExpr2 daca lExpr este 'false'. Cele 2 expresii nu trebuie sa fie (obligatoriu) de acelasi tip.
b) 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.
DO WHILE lExpr
Commands
[LOOP] [EXIT]
ENDDO
Efect: Executa Commands atita timp cât lExpr este .T.
Obs.: - dupa fiecare executie a <grup instr.> se reevalueaza <eL>;
- 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.
SCAN [NOOPTIMIZE]
[Scope] [FOR lExpression1] [WHILE lExpression2]
[Commands]
11
[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 NOOPTIMIZE inhiba mecanismul de optimizare Rushmore;
- optiunea LOOP permite reluarea fortata a interatiei;
- optiunea EXIT permite terminarea fortata a instructiunii.
Exemplu: CLOSE DATABASES
OPEN DATABASE Parteneri
USE Clienti && Deschide tabelul clienti
CLEAR && Sterge ecranul
Obs.: Exemplul determina afisarea tuturir 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().
12