Creeaza.com - informatii profesionale despre


Cunostinta va deschide lumea intelepciunii - Referate profesionale unice
Acasa » scoala » informatica » baze de date
Programarea in Visual FoxPro

Programarea in Visual FoxPro


Programarea in Visual FoxPro

Folosirea la maximum a facilitatilor oferite de mediul VFP se realizeaza numai prin utilizarea programelor scrise in limbajul sau specific. Aceasta presupune crearea unor fisiere ce contin instructiuni organizate intr-o succesiune logica, cu scopul automatizarii operatiilor curente sau a celor cu un grad de complexitate sporit.

Avantajul acestui mod rezida in faptul ca printr-o simpla apelare a fisierului de comenzi, se pot relua serii de instructiuni intr-un mod identic celor introduse in fereastra de comenzi. Secventa de instructiuni astfel construita constituie programul sursa. Acest program este depus pe disc intr-un fisier care ulterior, pentru executia instructiunilor componente, este transformat intr-o forma intermediara (operatie numita compilare) care este interpretata de VFP.

Rezolvarea unei probleme complexe presupune elaborarea unui numar mai mare de programe, ansamblul acestora reprezentand o aplicatie. Aplicatiile pot fi privite din doua puncte de vedere: cel al utilizatorului direct si cel al proiectantului.

Pentru utilizator aplicatia este procedura prin care introducandu-si datele proprii (prin intermediul unor elemente de interfata) obtine rezultatele solicitate (pe ecran, la imprimanta etc.).



Schematic aceasta viziune se poate prezenta astfel:


Baza de date

Programe

Cel de al doilea punct de vedere se refera la modalitatea de concepere a unor aplicatii de dimensiuni mari. In astfel de situatii activitatea din sistem este controlata de un program monitor care in general contine un meniu principal definit de utilizator, prin program sau folosind generatorul de meniuri. Datele cu care opereaza aplicatia sunt depozitate in una sau mai multe tabele independente sau sunt incluse in baze de date.

Intr-o aplicatie complexa sunt reunite mai multe tipuri de programe dintre care amintim: programe de introducere date (folosite in general pentru actualizarea tabelelor); programe de prelucrarea a datelor din tabele (necesare obtinerii rezultatelor); programe de extragere a datelor sub diferite forme cerute de utilizatorul final (rapoarte, etichete, filtre etc.).

1 Editarea, depanarea si executia programelor

Scrierea si modificarea programelor sursa se realizeaza cu ajutorul editorului de texte incorporat in pachetul VFP, editor lansat prin comanda MODIFY COMMAND. Aceasta comanda deschide o fereastra de editare care are toate caracteristicile unei ferestre Windows.

Comanda MODIFY COMMAND are formatul general:

MODIFY COMMAND [<nume_fisier> | ?] [NOEDIT] [NOMENU] [NOWAIT]

[RANGE <expr_n_1>, <expr_n_2>][[WINDOW <nume_fereastra_1>]

[IN [WINDOW] <nume_fereastra_2> | IN SCREEN]][AS <nr_cod_pag>] [SAME] [SAVE]

unde:

<nume_fisier> - este numele fisierului ce se va edita;

Clauza NOEDIT - permite doar vizualizarea programului, interzicand modificarea lui;

Clauza NOMENU - inhiba afisarea meniului Format din bara meniu;

Clauza NOWAIT - anuleaza, intr-un program, pauza facuta implicit la intalnirea unei comenzi MODIFY COMMAND, inchizand fereastra de editare;

Clauza RANGE <expr_n_1>, <expr_n_2> - permite selectarea unei parti din fisierul de comenzi si incarcarea acesteia in fereastra de editare; zona selectata este specificata prin cele doua expresii numerice care desemneaza prima si ultima linie;

Clauza WINDOW <nume_fereastra_1> - permite specificarea ferestrei ale carei caracteristici le va prelua fereastra de editare;

Clauza IN [WINDOW] <nume_fereastra_2> - plaseaza fereastra de editare in fereastra specificata;

Clauza IN SCREEN - plaseaza fereastra de editare pe ecran;

Clauza SAME - previne editarea ferestrei inainte ca aceasta sa fie activa.

Clauza SAVE - permite ca dupa parasirea ferestrei de editare aceasta sa ramana vizibila pe ecran.

Dupa editare, continutul ferestrei este salvat intr-un fisier cu extensia implicita .prg.

Lansarea in executie a unui program se realizeaza cu ajutorul comenzii DO care are formatul general:

DO <nume_progr_1> | <nume_procedura>[IN <nume_progr_2>][WITH <lista_param>]

Aceasta comanda executa programul cu numele specificat. Daca nu este prevazuta extensia se vor cauta si executa fisiere in urmatoarea ordine: .exe (fisier executabil), .app (fisier aplicatie), .fxp (fisier compilat), .prg (fisier sursa). Pentru executarea cu DO si a fisierelor program-meniu, program-format-ecran sau filtru se vor specifica explicit extensiile .mpr, .spr, sau .qpr.

Clauza WITH permite specificarea unei liste de expresii, variabile de memorie, nume de tabele, nume de campuri din tabele, constante etc. ce sunt transmise procedurii apelate pentru executie.

Un program poate contine la randul sau alte comenzi DO obtinandu-se astfel Do-uri imbricate pe mai multe niveluri. In timpul executiei comenzii DO sistemul realizeaza automat si compilarea programului analizand fiecare linie din fisierul sursa. Aparitia de erori duce la intreruperea executiei programului, pentru o compilare corecta utilizatorul trebuind sa le corecteze. Semnalarea erorilor se face prin afisarea in video invers, in fereastra de editare, a liniei ce contine eroarea. Peste aceasta fereastra sistemul plaseaza caseta de avertizare (Program Error) in care sunt disponibile trei butoane: Cancel (pentru abandonarea executiei si operarea corecturii), Suspend (pentru suspendarea temporara a programului) si Ignore (pentru ignorarea erorii). Butonul Help poate fi folosit pentru afisarea on-line a informatiilor referitoare la eroarea sesizata. Dupa compilare se obtine fisierul obiect cu extensia implicita .fxp.

2 Structuri de control

Spre deosebire de modul de lucru direct in care instructiunile sunt executate secvential, in modul de lucru programat se pot folosi toate structurile de control (secventiala, alternativa si repetitiva).

Structura secventiala presupune executia instructiunilor in ordinea scrierii acestora pana la terminarea secventei, putand contine comenzi de atribuire, comenzi pentru operatii de intrare-iesire etc. O astfel de structura nu poate contine insa comenzi specifice celorlalte tipuri de structuri de control. Rezolvarea problemelor complexe nu se poate realiza numai prin utilizarea unor structuri secventiale fiind necesare comenzi si functii care sa schimbe ordinea de executie a secventelor de program sau executarea repetata a unui grup de instructiuni.

Structura alternativa are la baza o decizie care trebuie luata in program in functie de realizarea sau nerealizarea unei conditii. In functie de rezultatul evaluarii conditiei, in program are loc o ramificare. Sub VFP sunt implementate doua forme ale structurii alternative:

- structura alternativa cu doua ramuri;

- structura alternativa cu mai multe ramuri.

Structura alternativa cu doua ramuri este asigurata prin comanda IF. ENDIF care are urmatorul format general:

IF <expr_log>[THEN]

<comenzi_1>

[ELSE

<comenzi_2>]

ENDIF

Comanda presupune evaluarea expresiei logice determinand executia primului grup de comenzi in cazul in care aceasta este adevarata. Daca rezultatul evaluarii expresiei este fals se va executa cel de al doilea grup de comenzi. In particular, atunci cand cel de al doilea grup de comenzi lipseste se obtine o structura cu o ramura vida. Atunci cand conditia specificata nu este indeplinita, nu se executa nimic, controlul fiind preluat de instructiunea care urmeaza in program.

Daca una din grupele de comenzi este de tip selectie structura devine de tip "imbricare". Totusi imbricarea trebuie folosita cu precautie deoarece aceste structuri pot provoca erori de programare mai greu de detectat.

Orice structura alternativa se termina printr-o comanda specifica ENDIF.

Exemplu: Sa se marcheze pentru stergere logica studentii nebursieri (care au media mai mica decat 8), iar pentru bursieri sa se afiseze mesajul "Studentul X este bursier". In secventa de program se va folosi functia RTRIM() care are rolul de a suprima spatiile de la sfarsitul unui sir de caractere:

USE student

SET DELETE ON

DO WHILE NOT EOF()


IF media < 8

DELETE

ELSE

? 'Studentul ';

+RTRIM(numest)+;

' este bursier'

ENDIF

SKIP

ENDDO

Rezultatul executiei acestei secvente de program este urmatorul:

Pentru ramificari simple intr-un program, VFP ofera functia IIF() care are formatul general: 

IIF(<expr_log>, <expr_1>, <expr_2>)

Prin aceasta functie se evalueaza conditia si se executa prima expresie cand aceasta este adevarata, sau a doua expresie in caz contrar.

Exemplu: Sa se afiseze pentru articolele 3 si 15 daca studentii respectivi sunt sau nu bursieri:

USE student

GO 3

? IIF(media>8,'Studentul '+numest + prenume +' este bursier','Studentul '+numest + prenume +' este nebursier')

Studentul mihaescu nora este nebursier

GO 15

? IIF(media>8,'Studentul '+numest + prenume +' este bursier','Studentul '+numest + prenume +' este nebursier')

Studentul florescu mihai este bursier

Structura alternativa cu mai multe ramuri ofera posibilitatea unor selectii multiple fara utilizarea imbricarilor, ceea ce asigura cresterea flexibilitatii programelor. Aceasta structura permite selectarea unei singure alternative din mai multe posibile si este implementata prin comanda DO CASE . ENDCASE care are urmatorul format:

DO CASE

CASE <expr_log_1>

<comenzi_1>

[CASE <expr_log_2>

<comenzi_1>

CASE <expr_log_n>

<comenzi_n>]

[OTHERWISE

<comenzi>]

ENDCASE

Sistemul evalueaza secvential fiecare conditie in parte. Prima conditie care este adevarata determina executia grupei de comenzi aferente ei si ignorarea celorlalte conditii. Optional, daca nici una din conditiile impuse nu este adevarata se va executa grupa de comenzi subordonata clauzei OTHERWISE. Grupele de comenzi pot fi de orice tip, deci secvente, selectii sau iteratii.

Comanda DO CASE simuleaza o cascada de IF-uri ceea ce inseamna ca orice IF poate fi inlocuit cu o structura de tip DO CASE cu o singura ramura.

Fiecare comanda DO CASE trebuie sa se termine cu ENDCASE.

Exemplu: Folosind tabela student.dbf sa se prelucreze selectiv prin proceduri distincte datele privind studentii de la fiecare specializare in parte:

USE student

DO CASE

CASE specializ = 'Finante'

DO prel_finante

CASE specializ = 'Contabilitate'

DO prel_contab

CASE specializ = "Adm. Publica"

DO prel_administratie

CASE densectie = 'Informatica'

DO prel_info

OTHERWISE

? 'specializare inexistenta'

ENDCASE

Structura repetitiva permite efectuarea iterativa a unor secvente de instructiuni organizate in asa numitele "bucle". La randul lor comenzile din aceasta categorie se impart in doua grupe:

-comenzi folosite pentru bucle cu un numar nedefinit de pasi in care numarul de executari a grupului de instructiuni este variabil fiind dependent de o conditie asociata comenzii;

-comenzi pentru bucle cu un numar finit de pasi in care grupul de instructiuni se executa de un numar cunoscut de ori.

In prima grupa se incadreaza comanda DO WHILE . ENDDO care are urmatorul format general:

DO WHILE <expr_log>

<instructiuni>

[LOOP]

[EXIT]

ENDDO

Comanda determina executarea repetata a grupului de instructiuni atat timp cat valoarea expresiei logice este adevarata. Daca expresia logica devine falsa bucla se incheie si controlul este preluat de prima instructiune de dupa ENDDO.

Comanda LOOP determina reluarea executarii comenzii DO WHILE.

Comanda EXIT determina iesirea fortata din bucla si predarea controlului primei instructiuni de dupa ENDDO.

Exemplu: Plecand de la tabela specializare.dbf obtinuta prin sortarea tabelei student.dbf dupa campurile Denspecializare si Nrmatr, sa se selecteze si sa se afiseze numai studentii de la specializarea "Adm.Publica". La localizarea studentului cu numarul matricol egal cu 980047 se va parasi bucla DO WHILE:

USE student

CLEAR

SORT ON specializ, nrmatr TO specializare

USE specializare

DO WHILE specializ = 'Adm. Publica'

? nrmatr, numest, media

IF nrmatr =' EL990047'

EXIT

ENDIF

SKIP

ENDDO

Prin executarea acestei secvente se va obtine:

In cea de a doua grupa de comenzi (care executa buclele de instructiuni de numar cunoscut de ori), intra FOR. ENDFOR si SCAN . ENDSCAN.

Comanda FOR determina executarea repetata a unei bucle de instructiuni de un numar finit de ori. Contorizarea executiilor se realizeaza cu ajutorul unei variabile. Formatul general al comenzii este:

FOR <variabila> = <expr_n1> TO <expr_n2>

[STEP <expr_n3>]

<instructiuni>

[EXIT]

[LOOP]

ENDFOR | NEXT

Variabila are rol de contor stabilind numarul de executii ale buclei. Ea are o valoare initiala data de <expr_n1> si o valoare finala indicata prin <expr_n2>. Dupa fiecare executie a buclei variabila este incrementata /decrementata cu <expr_n3>. Daca STEP lipseste, implicit <expr_n_3> este egala cu unu. Cele trei expresii numerice sunt evaluate doar la intrarea in bucla FOR, modificarea lor neavand nici un efect asupra numarului de executari ale instructiunilor.

Comenzile EXIT si LOOP au acelasi rol ca si in cazul comenzii precedente.

Exemplu: Sa se calculeze media generala a studentilor din tabela student.dbf si sa se afiseze intr-un format cu doua zecimale (stabilit prin clauza PICTURE). Pentru acest calcul se vor folosi variabilele de memorie nr (initializata prin functia RECCOUNT() care returneaza numarul total de inregistrari dintr-o tabela) si suma (care va cumula mediile tuturor studentilor din tabela).

CLEAR

USE student

STORE RECCOUNT() TO nr

suma =0

FOR i = 1 TO nr

GO i

suma = suma + media

ENDFOR

mg = suma / nr

? ' Media generala este = ',mg PICTURE '99.99'

Media generala este = 8.42

Comanda SCAN . ENDSCAN se aseamana cu comanda FOR . ENDFOR cu precizarea ca este specializata in lucrul cu tabele, pe care le parcurge in mod automat gestionand totodata si indicatorul de inregistrare. Formatul general este:

SCAN [NOOPTIMIZE]

[<domeniu>] [FOR<expr_log_1>] [WHILE <expr_log_2>] [<instructiuni>]

[LOOP]

[EXIT]

ENDSCAN

Bucla de instructiuni este executata pentru fiecare inregistrare din tabela curenta care indeplineste conditia specificata prin prima expresie logica. Implicit, comanda SCAN incrementeaza automat indicatorul de inregistrare nemaifiind necesara comanda SKIP pentru saltul la inregistrarea urmatoare. Daca clauzele <domeniu>, FOR si WHILE sunt prezente vor intra sub actiunea comenzii numai acele inregistrari care raspund conditiilor impuse.

Comenzile LOOP si EXIT au functii identice cu cele din comenzile precedente.

Exemplu: Sa se marcheze pentru stergere si sa se afiseze, din primele opt inregistrari, numai cele cu numar par. In secventa de program urmatoare se va folosi functia MOD() care returneaza restul impartirii a doua expresii numerice.

CLEAR

USE student

nr = RECCOUNT()

SCAN NEXT 8 FOR MOD(RECNO(),2) = 0

FOR i = 1 TO nr

DELETE

ENDFOR

ENDSCAN

LIST FIELDS nrmatr, numest, prenume FOR DELE() = .T.

Rezultatul executarii secventei de mai sus este:

Exemplu: Sa se scaneze tabela student.dbf selectand studentii care au numarul matricol mai mare decat 980025 si relansand bucla cand numarul matricol este 980035.

USE student

SCAN FOR nrmatr > ' EL990022'

IF nrmatr = ' EL980035'

LOOP

ENDIF

? ' ',nrmatr, numest

ENDSCAN

Rezultatul executiei acestei secvente este:

Se observa ca ultimele patru inregistrari din tabela Student, nu au fost selectate, desi indeplinesc conditia precizata prin clauza FOR. Ele au fost ignorate la selectie deoarece inaintea lor s-a reperat numarul matricol EL990035 care activeaza comanda LOOP ce forteaza iesirea din bucla de instructiuni.





Politica de confidentialitate


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.