lab10

download lab10

of 9

Transcript of lab10

Mecanismele programrii n Visual FoxPro

Laboratorul nr. 10Mecanismele 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 Program3. 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 folosete butonul de execuie din bara de instrumente n fereastra de comenzi se foloseste comanda DODO ProgramName1 | ProcedureName [IN ProgramName2] [WITH ParameterList]

Conceptele de baza ale programrii

Variabile. Macrosubstituia.Crearea unei variabile sau modificarea valorii acesteia se face prin una din metodele urmtoare:

(1)memvar = exprExemplu:msal=1000

mdata=date()

(2) STORE expr TO lista varO 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 (cmp al unei baze de date, denumire fiier). Macrosubstituia functioneaz ca i cum n locul variabilei respective ar fi pus irul de caractere coninut de aceasta, fr 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 afiarea variabilelor de memorie existente la un moment dat:

LIST / DISPLAY MEMORY [NOCONSOLE][TO PRINTER [PROMPT]| TO 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 afiarea pe ecran a valorii " Univ. Stefan Cel Mare"

2. Daca variabilele v1 si v2 au valorile urmtoare:

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 aciuni. Sintaxa generala a unei comenzi este:

Verb < clauza >..

Unde: verb indica aciunea ce trebuie executat iar clauzele sunt opionale si furnizeaz informaii 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 ;.

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 defineste coloana unde se afiseaza ;

b) Instructiuni de citire de la tastatura.

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

(2) INPUT [ ] TO

Se afiseaza pe ecran valoarea dupa care se asteapta introducerea unei expresii de la tastatura, a carei valoare se atribuie variabilei de memorie .

Obs.:- comanda cere obligatoriu introducerea unei expresii; - pentru introducerea constantelor de tip sir sau data calendaristica se vor folosi delimitatorii specifici (",',[ ], resp. {}).

(3) WAIT [[ ] TO ]

Se afiseaza pe ecran valoarea dupa care se asteapta apasarea unei taste (fara a carei valoare se atribuie variabilei de memorie .

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 cmpurilor 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 reuit, indicatorul de nregistrare se va poziiona pe nregistrarea respectiv, funcia FOUND () va returna valoarea .T. iar functia EOF() va returna valoarea .F.

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

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[ELSEComenzi2]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 cte 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 [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 ciclareCiclarea permite executarea uneia sau mai multor linii de cod de cte 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 ct lExpr este .T.

Obs.:- dupa fiecare executie a 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

ENDSCANObs.: 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().

Intrebari si exerciii

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 afiat pe 4 caractere, n format DMY; (vezi Anexa2)

se activeaz ceasul ;

se inhib afiarea 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 afia valorile citite la punctul anterior;

e) se deschide baza de date;

f) se deschide un tabel;

g) se folosete mecanismul adugrii datelor prin program ( succesiunea de comenzi APPE BLANK i REPLACE.) pentru a aduga minim 3 nregistrri n tabelul deschis

h) se sterge prima inregistrare din tabeli) prin intermediul unei variabile de memorie numit "opt" introdus de la tastatur, care poate lua valori n mulimea :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 condiional. ( IF)

a) pe una din ramuri (de ex, pentru D respectiv d) se deschide nc un tabel ntr-o alt zon i se stabilesc legturi temporare ntre cele dou tabele deschise dup care se va verifica funcionalitatea legturilor prin afiare (ex. intre Materiale i Intrri 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 cmpuri (REPLACE)

j) se vor numra nregistrrile dintr-unul din tabelele deschise;

k) se afiaz rezultatul ;

l) se nchide baza de date.

ANEXA1

Principalele funcii predefinite Visual FoxPro

Funcii 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 urmtorul ntreg mai mare sau cel puin egal cu parametrul

FLOOR(nExpr) - ntoarce urmtorul ntreg mai mic sau cel mult egal cu parametrul

ROUND(nExpr, nDecimalPlaces) rotunjete valoarea expresiei numerice la un numr de poziii 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

SQRT(nExpr) rdcina ptrat a unei expresii numerice

ASIN(nExpr), ACOS(nExpr), SIN(nExpr), COS(nExpr)..- funcii 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 stnga) din expresia tip ir de caractere furnizat ca parametru.

Functii referitoare la subsirurile de caractere

SUBSTR(cExpr, nPosStart [, NrCharIntoarse]) ntoarce un subir al irului cExpr, care ncepe cu caracterul aflat n poziia nPosStart i care conine un numr de caractere dat de NrCharIntoarse.

Variante:

LEFT(cExpr,nExpr)ntoarce primele nExpr caractere din irul cExpr (cele mai din stnga)

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 numrul specificat de spaii

Functii de eliminare a blancurilor:

ALLTRIM(cExpr) elimin att spaiile din stnga irului specificat, ct i pe cele din dreapta acestuia

LTRIM(cExpr) elimin spaiile din stnga irului specificat

RTRIM(cExpr) elimin spaiile 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 stnga caracter din irul specificat ca parametru este o cifr (0-9)

ISLALPHA(cExpr) - ntoarce valoarea logic .T. dac cel mai din stnga caracter din irul specificat ca parametru este o liter

ISLOWER(cExpr) - ntoarce valoarea logic .T. dac cel mai din stnga caracter din irul specificat ca parametru este o liter mic

ISUPPER(cExpr) ntoarce valoarea logic .T. dac cel mai din stnga 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 numrul zilei din cadrul sptmnii pentru data specificat;

CDOW(dExpr) - returneaz numele zilei din saptamana pentru data specificata;

DAY(dExpr) - returneaz numrul zilei din cadrul lunii pentru data specificata;

MONTH(dExpr) CMONTH(dExpr) - returneaz numrul/numele lunii pentru data specificat;

YEAR(dExpr) - returneaz anul pentru data specificata;

Funcii pentru controlul timpului:

TIME() - 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

- 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

Instruciuni (comenzi) de configurare

Instructiuni pentru controlul formatului datei calendaristice

SET CENTURY ON/OFF / valideaz, respectiv invalideaz afiarea anului pe patru digii

SET DATE TO DMY|MDY| BRITISH|FRENCH| GERMAN stabilete formatul de afiare a datei calendaristice

Instructiuni pentru controlul formatului de afiare al ceasului sistem:

SET CLOCK ON | OFF valideaz/invalideaz afiarea ceasului

SET CLOCK TO [,]- stabilete poziia pe ecran n care se va afia ceasul

SET HOURS TO [12 | 24] stabilete formatul de afiare al orei

Diverse instruciuni de configurare

SET BELL ON/OFF valideaz/invalideaz alarma sonor a mediului

SET CARRY ON/OFF valideaz/invalideaz pstrarea valorilor din nregistrarea curent pentru o nou nregistrare introdus prin una din comenzile INSERT, APPEND sau BROWSE

SET DATABASE TO [NumeBD] stabilete baza de date curent

SET DEFAULT TO [Specificator_director] stabilete directorul curent

SET DELETED ON/OFF invalideaz/valideaz utilizarea nregistrrilor marcate pentru tergere n comenzi ulterioare

SET ESCAPE ON/OFF valideaz/invalideaz ntreruperea execuiei unui program sau a unei comenzi la apsarea tastei ESCAPE

SET EXCLUSIVE ON/OFF stabilete dac fiierele tabel vor fi deschise pentru uzul exclusiv sau partajat ntr-o reea

SET LOCK ON/OFF valideaz/invalideaz blocarea automat a tabelelor pentru anumite comenzi.

SET PATH TO [lista_cai_de_cautare] stabilete o list a cilor de cutare pentru fiiere

SET TALK ON/OFF valideaz/invalideaz afiarea rezultatelor comenzilor Visual FoxPro

14