Sunteți pe pagina 1din 19

Baza de date - definitie, creeare, deschidere...

Cateva definitii utile


Vom defini mai intai cativa termeni des utilizati pe tot parcursul acestor laboratoare. Conceptele fundamentale referitoare la structura datelor vor fi definite conform standardului CODASYL. Vom considera: Date Aspecte elementare ale unor obiecte, actiuni, fenomene din lumea reala nesupuse unor operatii de prelucrare si neevaluate din punct de vedere al utilitatii; Informatie ansamblu de date corelate si elaborate intr-un scop bine determinat, care satisface cerintele celor ce le utilizeaza; Articol (field) unitate elementara de date, care poate fi identificata cu ajutorul unui nume Tipul (schema) articolului ansamblu format din identificatorul articolului, descrierea multimii valorilor acceptabile pentru articol (tip de date) si a formatului de memorare; Inregistrare (record) colectie de articole Set de date (table) multime de inregistrari de un anumit tip Zona subdiviziune a memoriei interne, identificabila printr-un nume si care poate memora inregistrari; Schema bazei de date ansamblu format din lista identificatorilor folositi si descrierea articolelor, grupurilor de date, inregistrarilor, seturilor de date si a zonelor. Schema defineste un tip de baza de date; Baza de date totalitatea exemplarelor inregistrarilor, seturilor, zonelor organizate sub o anumita schema. In acceptiunea Visual FoxPro, baza de date cuprinde toate tabelele de date, indecsii, precum si toate relatiile stabilite intre tabele; Dictionarul datelor multimea descrierilor obiectelor unei baze de date Administratorul bazei de date persoana sau grup de persoane responsabile de analiza, proiectarea, implementarea si intretinerea bazei de date; Sistem de gestiune a bazei de date (SGBD) ansamblu de programe destinate crearii, intretinerii si exploatarii bazei de date. SGBD furnizeaza interfata dintre baza de date si utilizatorii acesteia. Un SGBD foloseste in principiu trei limbaje: un limbaj de descriere a datelor fizice, un limbaj de descriere a datelor logice si un limbaj de prelucrare a datelor.

Arhitectura unei baze de date


O baza de date are urmatoarea arhitectura (in principiu):

baza de date propri-zisa; sistemul de gestiune a bazelor de date, care realizeaza gestiunea si prelucrarea datelor continute de baza de date; dictionarul bazei de date (informatii referitoare la structura datelor, statistici, documentatie...) mijloace hardware utilizate; reglementari administrative personalul implicat: administrator, utilizatori finali, operatori, programatori;

Cum arata o tabela de date (Table)?


Dupa cum unii stiu iar altii nu, prin model intelegem o abstractizare a unui sistem, obiect, entitate, fenomen din lumea reala, caruia i se retin doar acele caracteristici considerate esentiale, definitorii (din punctul de vedere al observatorului, in cazul nostru fiind vorba despre analist). Activitatea prin care se creeaza un model se numeste modelare. Analistul identifica proprietatile esentiale si le asociaza cate un atribut care sa le descrie. Atributele iau valori intr-un anumit domeniu. Exemplu: Sa luam urmatorul exemplu: intr-un liceu este nevoie, printre multe altele, de repartizarea elevilor la admiterea in liceu. Una dintre entitatile din modelul nostru va fi entitatea elev. Analistul nostru nu va trebui sa retina aspecte neconcludente ca: inaltimea elevului, culoarea ochilor sau darea de mana a parintilor... Analistul va retine urmatoarele aspecte:

codul elevului (poate fi ales numarul matricol, de exemplu); nume prenume media scoala profil1 profil2 profil3

Dupa cum observati, fiecare elev isi va putea exprima trei optiuni, in ordinea preferintei, ei urmand a fi repartizati in functie de preferinta si medie. O tabela de date contine o multime de inregistrari, iar o inregistrare este compusa din mai multe articole (cimpuri). Structura tabelei de date va fi, intuitiv, cea din figura 2.1 Figura 2.1 -Structura unei tabele (Jpeg Image 546x222x16M
colors -29 KB)

Tabela, impreuna cu inregistrarile pe care le contine, pot fi privite ca fiind un tabel, in care:

capul de tabel corespunde structurii tabelei (numele campului apare la inceputul unei coloane de date) inregistrarea corespunde unei linii a tabelului

Definirea structurii tabelei se va face specificand, pentru fiecare camp:


numele(name) = identificator unic prin intermediul caruia se pot manipula valorile efective ale campului tipul (type)= specifica domeniul in care poate lua valori atributul campului; In VFP sunt admise valori de urmatoarele tipuri: o character = sir de caractere o numeric = intreg sau real o integer = intreg de maxim 4 cifre o float = real (20 cifre cu 19 zecimale) o double = real (8 cifre si 18 zecimale) o logical = logic (cu valori .T. - true si .F. - false) o date = data calendaristica (lungime fixa de 8 caractere) o date time = data si ora o currency = moneda (marime fixa de 8 caractere) o memo = sir lung de caractere, memorat separat si afisat doar la cerere; in campurile de acest tip se memoreaza de fapt un pointer la zona ce contine sirul; o general = valorile acestui tip sunt obiecte de diverse tipuri: grafice, sunet, foaie de calcul. Inglobarea acestor obiecte se face prin mecanismul OLE Object Linking and Embedding (legare si incorporare de obiecte); marimea (width) = specifica numarul de caractere/cifre; anumite tipuri au valori de lungime fixa (vezi mai sus); zecimale (decimals) = numar de zecimale (valabil doar pentru campurile double, float, numeric); index (index) = specifica daca tabela este indexata dupa acel camp (vom vedea mai tarziu ce inseamna asta); Null = .........;

Crearea unei tabele


Crearea unei tabele se poate face in trei moduri:

din meniul TOOLS -> Wizards ->Table se porneste construirea tabelei prin asistenta pas cu pas; in fereastra de comenzi se da comanda: CREATE [nume_tabela]

care lanseaza fereastra de editare a structurii tabelei (table designer); Figura 2.2 - Fereastra Table Designer (Jpeg Image
478x296x16M colors -22 KB)

intr-un modul de program sau in fereastra de comenzi se poate da comanda: CREATE TABLE nume.dbf ( nume_cimp1 tip [ (marime [scala])] [, nume_cimp2 ...] unde:
o o o o

nume.dbf - numele, eventual calea, fisierului care va contine tabela; tip - o singura litera care specifica tipul: C-character, N - numeric, F float, ... marime - este specificata doar pentru tipurile care nu au marime fixa; scala - numarul de zecimale (pentru tipuri reale);

Pentru tabela considerata in exemplul de mai sus vom da comanda: Create Table elev.dbf ( cod N(4), nume C(20), prenume C(15), media F(2,2) ,scoala C(20), profil1 C(2), profil2 C(2), profil3 C(3)) Dupa definirea structurii bazei de date in fereastra Table Designer, utilizatorul este intrebat daca introduce sau nu inregistrari in momentul respectiv. Daca raspunsul este afirmativ, va apare pe ecran fereastra de editare a valorilor campurilor, sub forma unui tabel sau a unei liste. Introducerea inregistrarilor se incheie prin inchiderea ferestrei de editare.

Cum lucram cu tabela de date


In principiu, lucrul cu o tabela de date presupune urmatoarele operatii:

deschiderea tabelei operatii de actualizare a datelor: modificare, stergere, adaugare crearea de rapoarte (report), filtre (query), etichete (label), statistici,...(operatii de consultare a tabelei in vederea obtinerii de informatii pe baza datelor pe care le contine); inchiderea tabelei de date;

Deschiderea unei baze de date. Zone de lucru VFP dispune de un numar de 255 de zone de memorie, numerotate de la 1 la 255, care sunt utilizate pentru a stoca tabelele de date care sunt deschise. In fiecare zona de

memorie se poate deschide o singura tabela. Primele zece zone pot fi identificate si prin litere (A,B,...), iar urmatoarele doar prin numarul corespunzator. Deschiderea unei tabele se face prin comanda: USE nume_tabela [IN zona_de_lucru] Mod de functionare:

Deschide tabela cu numele specificat in zona_de_lucru specificata prin litera sau numarul corespunzator; Daca sectiunea IN... nu exista, tabela este deschisa in zona de lucru curenta;

Exemplu: Baza de date creata mai sus poate fi deschisa prin comanda:
USE elev.dbf IN 3 USE elev USE elev IN C &&deschide tabela in zona 3 &&deschide tabela in zona curenta &&deschide tabela in zona 3

Zona de lucru curenta este unica (nu se poate lucra in acelasi timp in doua zone distincte) si poate fi selectata de utilizator prin comanda:
SELECT zona_de_lucru

Exemplu:
SELECT c USE elev USE profesor IN 2 SELECT 1 &&zona 3 devine curenta &&tabela elev este deschisa in zona 3 &&deschide tabela profesor in zona 2, fara a deveni zona curenta &&zona 1 devine curenta

Pentru a testa daca o zona de lucru este sau nu utilizata se foloseste functia:
USED ([zona_de_lucru]) cu valorile: .T. daca zona_de_lucru este utilizata .F. in caz contrar

Daca dorim sa stim ce tabela de date este deschisa intr-o zona de lucru vom utiliza functia:
DBF([zona_de_lucru]) care intoarce un sir de caractere reprezentand numele tabelei deschise in zona specificata sau sirul vid, daca nu exista o tabela deschisa in acea zona;

Exemplu:
SELECT a USE elev.dbf ? USED() ? DBF(1)

&&afiseaza .T. &&afiseaza C:\...\vfp\elev.dbf

Observatii:

semnele && introduc un comentariu, care se termina la sfarsitul liniei ? este comanda de afisare ;

Inchiderea tabelei de date Inchiderea tabelei se poate face prin comenzile:


USE fara a specifica un parametru - inchide tabela din zona curenta; USE IN zona_de_date - inchide tabela din zona specificata; CLOSE DATABASE - inchide toate bazele de date si stabileste zona 1 ca zona curenta; CLOSE ALL - inchide toate fisierele deschise si selecteaza zona 1 ca zona curenta;

Introducerea inregistrarilor Pentru a introduce/modifica inregistrari in tabela se poate proceda astfel:


la incheierea definirii structurii tabelei (vezi mai sus); prin utilizarea comenzii APPEND [BLANK] care functioneaza astfel: deschide fereastra de editare, permitand introducerea datelor; daca este folosita clausa BLANK, atunci se introduce o inregistrare vida, care poate fi completata mai tarziu; prin comanda BROWSE - care afiseaza continutul tabelei (sub forma unui tabel) si permite modificare valorilor campurilor; prin comanda INSERT [BEFORE] [BLANK] care permite introducerea unei inregistrari in interiorul unei tabele (comanda Append adauga inregistrari tabelei de date); Daca este prezenta clauza BEFORE noua inregistrare este introdusa inainte de inregistrarea curenta, altfel inregistrarea este introdusa dupa inregistrarea curenta. Daca se foloseste clauza BLANK este introdusa o inregistrare vida.

Vizualizarea continutului unei tabele. Indicatorul de inregistrari

Afisarea inregistrarilor
Afisarea inregistrarilor dintr-o tabela se poate face cu una dintre comenzile:
DISPLAY [[FIELDS] <lista_campuri>] [domeniu] [FOR expL] [WHILE expL]

Comanda afiseaza datele in urmatorul format: o pe prima linie numele campurilor afisate o pe urmatoarele linii inregistrarile din tabela, una pe fiecare linie; o se adauga un camp suplimentar ce reprezinta numarul de ordine al fiecarei inregistrari; Sa comentam putin sintaxa comenzii Display:
o o

clauza FIELDS precizeaza care dintre campurile tabelei sa fie afisate, in absenta sa afisandu-se toate; domeniu - stabileste o multime de inregistrari asupra careia actioneaza comanda, avand una dintre valorile: ALL - toate inregistrarile; NEXT expN - urmatoarele expN inregistrari incepand cu inregistrarea curenta; RECORD expN - inregistrarea cu numarul expN REST - toate inregistrarile de la inregistrarea curenta si pana la sfarsitul tabelei; OBSERVATIE: - Precizarile de mai sus sunt valabile pentru toate comenzile care actioneaza asupra unei multimi de inregistrari

o o

clauza FOR - selecteaza din domeniu inregistrarile care satisfac conditia logica; clauza WHILE - selecteaza din domeniu inregistrari atata timp cat conditia este adevarata (cand conditia devine falsa, nu se mai continua explorarea domeniului);

LIST [[FIELDS] <lista_campuri>] [domeniu] [FOR expL] [WHILE expL]

care are aceeasi sintaxa ca Display, deosebirea fiind aceea ca domeniul implicit al inregistrarilor este ALL, in timp ce pentru Display este NEXT 1 (inregistrarea curenta). Exemplu: Sa presupunem ca am creeat o tabela numita agenda.dbf cu urmatoarele campuri: nume C(20), prefix C(3), telefon N(7), adresa C(30). Cerinte:

1. 2. 3. 4.

Sa se afiseze toate inregistrarile Sa se afiseze doar campurile Nume si telefon Sa se afiseze toate persoanele care au prefixul 038 Sa se afiseze numele si adresa persoanelor cu numele care incepe cu F

Rezolvare:
CLOSE ALL USE agenda LIST DISPLAY ALL FIELDS nume, telefon DISPLAY ALL FOR prefix='038' LIST FOR UPPER(substr(prefix,1,1))='F' FIELDS nume, adresa USE

Observatii:

DISPLAY ALL este echivalent cu LIST, iar DISPLAY cu LIST NEXT 1 functia substr(sirC,inceput, nr_caractere) intoarce subsirul lui sirC, care incepe de la caracterul inceput si are nr_caractere caractere; functia UPPER(sirC) intoarce sirul sirC scris cu majuscule

Exercitii propuse
1. Sa se creeze baza de date agenda.dbf cu structura din exempul de mai sus. Sa se introduca in aceasta baza 5 inregistrari. 2. Introduceti in fereastra de comenzi, rand pe rand, comenzile ce rezolva cerintele din exemplul de mai sus; 3. Sa se creeze tabela salariat.dbf cu urmatoarele campuri: nume, prenume, vechime, salariu. Sa se afiseze: a. lista cu numele si prenumele salariatilor b. salariatii cu vechimea de peste 5 ani c. salariatii cu salariul de 1 000 000 lei d. salariatii cu salariul de sub un milion lei e. salariatii cu vechimea intre 3 si 5 ani f. informatiile complete despre salariatii cu numele ce incepe cu litera C si prenumele care incepe cu I 4. Gasiti inca o deosebire intre Display si List (indicatie: inregistrarile sa nu poata fi afisate intr-un singur ecran)

Indicatorul de inregistrari. Modificarea inregistrarii curente


Fiecarei tabele de date i se asociaza o adresa de memorie care memoreaza a cata inregistrare este cea curenta. Convenim sa numim aceasta locatie indicatorul de inregistrari. Foarte multe comenzi actioneaza asupra inregistrarii curente, deci este

absolut necesar sa existe comenzi care sa repozitioneze indicatorul de inregistrari in functie de necesitatile de prelucrare ale utilizatorului. De asemenea, sunt necesare comenzi (de fapt functii) pentru aflarea numarului inregistrarilor din tabela, pentru aflarea inregistrarii curente... Vom lucra cu urmatoarele functii:

RECNO=intoarce numarul inregistrarii curente a tabelei din zona_de_lucru specificata;


RECNO ([zona_de_lucru])

Daca nu se specifica o tabela anume, functia intoarce numarul inregistrarii curente din tabela curenta;

GO / GOTO= pozitioneaza indicatorul de inregistrari; Are doua forme:


GO [RECORD] expN [IN zona_de_lucru] GO TOP | BOTTOM [IN zona_de_lucru]

Prima forma a comenzi determina ca inregistrarea cu numarul expN din tabela precizata sa devina inregistrare curenta. Daca nu este specificata o tabela anume se considera tabela curenta. A doua forma determina pozitionarea indicatorului de inregistrarila inceputul tabelei (clauza TOP) sau la sfarsitul acesteia (clauza BOTTOM).

SKIP = pozitioneaza indicatorul de inregistrari relativ la inregistrarea curenta.


SKIP [expN] [IN zona_de_lucru]

care pozitioneaza indicatorulde inregstrari la a expN inregistrare incepand de la inregistrarea curenta, in tabela specificata. Daca nu se precizeaza nici o clauza (se foloseste doar comanda SKIP), indicatorul de inregistrari se pozitioneaza pe inregistrarea urmatoare. Observatii: Daca se depaseste ultima inregistrare a tabelei, indicatorul de inregistrari contine valoarea numarului de inregistrari din tabela plus 1. In acest caz functia EOF() intoarce valoarea .T. Daca saltul se face inaintea primei inregistrari din tabela, functia BOF() intoarce valoarea .T.

RECCOUNT([zona_de_date]) = intoarce numarul de inregistrari din tabela specificata. RECSIZE([zona_de_date]) = intoarce dimensiunea unei inregistrari.

Stergerea inregistrarilor
O facilitate absolout necesara, alaturi de posibilitatea de a adauga si modifica inregistrari, este aceea de a putea sterge inregistrari din tabelele de date. Stergerea poate fi realizata la doua nivele:

logic: inregistarea nu este stearsa efectiv din tabela, dar primeste un marcaj special, care indica stergerea acesteia (spunem ca inregistrarea a fost marcata pentru stergere. Unele comenzi FoxPro iau in considerare marcajul de stergere, astfel ca inregistrarile sterse logic sunt ca si inexistente. fizic: inregistrarile sunt sterse efectiv din tabela de date.

Mecanismul de stergere al inregistrarilor este urmatorul: mai intai sunt marcate pentru stegere inregistrarile dorite (comanda DELETE), iar apoi sunt sterse fizic (comanda PACK), deci nu mai pot fi refacute. Comanda Delete are urmatoarea sintaxa:
DELETE [domeniu] [For expL1] [While expL2]

Mod de functionare: marcheaza pentru stergere toate inregistrarile din domeniul precizat, domeniul implicit fiind inregistrarea curenta. Inregistrarile nu vor fi definitiv sterse decat dupa aplicarea comenzii PACK. Exemplu: Sa se stearga inregistrarea cu numarul 7 din tabela elevi.dbf
USE elevi DELETE RECORD 7 PACK

Obs: Se poate inlocui linia 2 din exemplu cu:


GO 7 DELETE

Stergerea mai multor inregistrari se face ca in exemplul urmator: Exemplu: Sa se stearga primele 10 inregistrari din tabela elevi.
USE elevi

DELETE FOR RECNO()<=10

Comanda inversa comenzii DELETE este:


RECALL [domeniu] [For expL1] [While expL2]

care are aceeasi sintaxa ca si DELETE. Mod de functionare: Anuleaza marcajul de stergere pentru inregistarile din domeniu. Inregistrarile din acest domeniu care nu sunt marcate ca sterse nu sunt afectate. Stergerea permanenta a inregistrarilor marcate pentru stergere se face cu ajutorul comenzii:
PACK

Mod de functionare: Sterge definitiv inregistrarile din tabela curenta, care sunt marcate pentru stergere. Comanda
ZAP

Mod de functionare: Sterge definitiv toate inregistrarile din tabela curenta, fara posibilitatea refacerii acestora. Pentru a verifica daca o inregistrare este marcata pentru stergere putem folosi functia:
DELETED([zona_de_lucru])

Mod de functionare: Intoarce valoarea .T. daca inregistrarea curenta din zona de lucru specificata (din tabela specificata) este marcata pentru stergere si .F. in caz contrar. Daca nu se specifica tabela se considera tabela curenta. Exemplu:
GO 2 DELETE ? DELETED() GO 7 ? DELETED()

Variabile si tipuri de date in FoxPro. Citirea datelor


Variabile si tipuri de date in Foxpro
Prin variabila vom intelege un obiect cu urmatoarele proprietati: nume, valoare, tip si zona de memorie asociata. O variabila poate pastra in zona de memorie asociata o valoare de un anumit tip. Valoarea variabilei se poate modifica de un numar arbitrar de ori de-a lungul executiei programului. Declararea unei variabile nu se va mai face ca in limbaje tip C ori Pascal, intr-o sectiune speciala si bine delimitata, ci in urmatoarele moduri:

prin instructiunea de atribuire. Atribuirea are urmatoarea sintaxa:


variabila = expresie

si functioneaza astfel: se evalueaza expresia; valoarea expresiei va fi depusa in zona de memorie alocata variabilei; tipul variabilei este dat de tipul valorii expresiei; daca variabila nu exista inca este creata in acest moment; daca variabila exista deja, ea va capata noua valoare, iar tipul variabilei devine tipul expresiei (indiferent daca variabila avea alt tip); prin comanda STORE, care are urmatoarea sintaxa:
o o o o STORE expresie TO lista_de_variabile

si functioneaza astfel: se evalueaza expresia, iar valoarea acesteia este atribuita tuturor variabilelor din lista; daca variabilele nu existau sunt create la executarea comenzii. Eliberarea memoriei alocate variabilelor se poate face prin comenzile:

RELEASE cu sintaxa:
RELEASE lista_variabile

care elibereaza zona de memorie ocupata de variabilele precizate in lista.


RELEASE ALL cu sintaxa :


RELEASE ALL [LIKE | EXCEPT macheta]

care are urmatoarea semnificatie:


o o o

In forma Release All elibereaza din memorie toate variabilele Daca se foloseste clauza Like macheta se sterg toate variabilele cu numele ce corespunde machetei specificate. Daca se foloseste clauza Except macheta se sterg toate variabilele cu exceptia celor cu numele ce corespunde machetei specificate.

Macheta este un sir de caractere care include caracterele * si ?, reprezentand orice sir de caractere, respectiv orice caracter (sunt caractere "joker"; aceeasi semnificatie o au si in sistemul de operare MS-DOS).

CLEAR ALL sau CLEAR MEMORY care au si efectul de a sterge din memorie variabilele.

Daca dorim sa stim care sunt variabilele definite in program la un moment dat, vom putea utiliza comenzile DISPLAY MEMORY si LIST MEMORY, care au aceeasi sintaxa:
DISPLAY MEMORY [LIKE macheta] [TO PRINTER | TO FILE nume_fisier] [NO CONSOLE]

cu semnificatia: afiseaza variabilele din memorie precizand pentru fiecare numele, tipul, continutul, precum si numarul variabilelor definite de utilizator, memoria folosita si memoria disponibila. Folosind clauza LIKE, se pot afisa doar variabilele conforme cu macheta precizata. Lista poate fi tiparita la imprimanta (clauza TO PRINTER) sau intr-un fisier cu numele specificat (clauza TO FILE). Daca dorim ca lista sa nu apara si pe ecran (in cazul in care tiparim sau scriem intr-un fisier), utilizam clauza NO CONSOLE. Exemplu:
a = 10 b = 5 c = 2 suma = a+b+2 prod = a*b*c

? suma && afiseaza 17 ? prod && afiseaza 100 STORE 50 TO a, a1, a2 ? a, a1, a2 && afiseaza 50, 50, 50 RELEASE ALL LIKE a* && sterge variabilele a, a1, a2

Exercitiul 1: Rulati programul precedent si urmariti rezultatele. Adaugati si comanda pentru afisarea variabilelor din memorie atat inainte de stergerea variabilelor a, a1, a2, cat si dupa. Verificati toate clauzele comenzilor Release si Display Memory

Comenzi de intrare / iesire


Limbajul FoxPro, ca orice alt limbaj de programare, da posibilitatea utilizatorului sa introduca valori pentru variabilele definite in program. Zona de lucru a ferestrei in care ruleaza FoxPro poate fi utilizata pentru afisarea ferestrelor, textelor, meniurilor, ... precum si pentru citirea datelor de la tastatura. FoxPro dispune de urmatoarele comenzi pentru:

Afisare: @...Say, ?, ??, \, \\, TEXT...ENDTEXT Citire: @..GET, @..EDIT, READ

Comenzile ? si ?? Cele doua comenzi au aceeasi sintaxa:


?[lista_expresii] [PICTURE format] [FUNCTION format] [AT coloana]

si functioneaza astfel: afiseaza valoarea expresiilor din lista_expresii, avand ca punct de reper pozitia curenta a cursorului. Afisarea se face conform cu formatul precizat in clauzele Picture si Function. Daca dorim ca afisarea sa se faca incepand de la o anunita coloana (de pe linia curenta), utilizam clauza AT. Diferenta dintre ? si ?? este urmatoarea: ?? incepe afisarea imediat de la pozitia cursorului, iar ? de la inceputul liniei imediat urmatoare celei pe care se afla cursorul. Stabilirea formatului de afisare va fi discutat la comanda SAY. Comenzile \, \\, TEXT...ENDTEXT Sunt utilizate pentru afisarea mai comoda a liniilor de text. Comenzile \ si \\ afiseaza sirul de caractere care le urmeaza, prima trecand cursorul pe linia urmatoare dupa afisare. Daca dorim afisarea unui text mai mare vom folosi:

TEXT text ENDTEXT

Daca dorim sa introducem in text si expresii ce trebuiesc evaluate, acestea trebuiesc incadrate intre << si >>. Pentru a putea utiliza aceasta facilitate trebuie sa folosim comanda:
SET TEXTMERGE [ON | OFF] [TO fisier]

cu semnificatia:

Clauza ON determina evaluarea expresiilor dintre << si >>, care apar in sirurile de caractere afisate cu \, \\ si TEXT; Clauza TO permite specificarea unui fisier in care se se faca afisarea (valabila doar pentru \ si \\);

Comanda @...Say Comanda @...Say este, probabil, cea mai utilizata comanda de afisare din FoxPro si are urmatoarea sintaxa:
@ linie, coloana SAY expresie [FUNCTION format][PICTURE format] [SIZE n1,n2] [FONT nume_font, marime] [STYLE stil] [COLOR SCHEME schema] [COLOR lista perechi de culori]

cu semnificatia: afiseaza incepand de la linia si coloana spacificate o expresie, utilizand un format stabilit prin Function si Picture, fontul, culoarea si stilul precizate in clauzele corespunzatoare. Stilul este definit printr-un sir in care pot sa apara, printre altele urmatoarele caractere: B- bold, I- italic, U - underline. Clauzele Function si Picture, care apar si la alte comenzi FoxPro, au urmatoarea semnificatie: Function stabileste un format de citire/scriere pentru intregul text, in timp ce Picture stabileste un format pentru fiecare caracter din text. Codurile Picture sunt: Cod Semnificatie A Permite doar caractere alfabetice

W N X Y 9

Permite doar date logice Litere si cifre Orice caracter Doar Y,y,N,n pe care le trece la majuscule Daca se aplica sirurilor, permite doar cifre, altfel permite cifre si semne

Pentru Function voi aminti doar caracterul A (permite doar caractere alfabetice), S(n) (limiteaza marimea campului de afisare la n caractere) si ! (toate caracterele alfabetice sunt trecute la majuscule). Listele complete de coduri pentru Function si Picture pot fi gasite in diverse carti de FoxPro. Exemple:
Clear \ Afisez rezultatul unei adunari \\ 12+10 = 22 \\ fara sa evaluez vreo expresie Set TextMerge ON \ Acum evaluez \ 12 + 10 =<<12+10>> @ 10, 5 Say 'Afisez la linia 10, coloana 5' Function '!'; Font 'Arial Black', 15 Style 'BI' Text Va placut acest font Arial Black de marime 16 ? Si ce daca ? EndText Set TextMerge OFF

Exercitiul 2: Executati exemplul de mai sus si urmariti efectele. Exercitiul 3: Afisati pe ecran sablonul unei scutiri medicale Exercitiul 4: Afisati pe ecran cursul valutar pentru USD si DM din ultima saptamana, sub forma unui tabel

Citirea datelor
In limbajul FoxPro, citirea datelor se realizeaza in doua etape:

Se definesc zonele in care se vor introduce valorile (campuri de editare) folosind comanda @...GET; Se da comanda READ, care citeste efectiv valorile de la tastatura, conform campurilor de editare definite anterior, si le atribuie variabilelor precizate;

Sintaxa comenzii GET este urmatoarea, exceptand unele clauze, pe care le-am "sarit":
@ linie, coloanaGET variabila | camp [FUNCTION format][PICTURE format] [SIZE n1, n2] [FONT nume_font, marime] [STYLE stil] [DEFAULT expresie] ...

cu semnificatia: se defineste un camp de editare incepand de la linie, coloana, conform cu formatul din clauzele Function si Picture, stilul, fontul si culoarea precizate; valoarea citita ulterior de comanda READ va fi depusa intr-o variabila sau intr-un camp al bazei de date. Precizari:

Daca variabila nu exista, va trebui folosita clauza Default, care precizeaza valoarea initiala a variabilei. Daca variabila este un masiv (tablou), aceasta trebuie sa fi fost definita anterior Se poate afisa un mesaj explicativ, afisat atat timp cat campul respectiv este activ (Message sir_de_caractere) Se poate defini campul intr-o fereastra de editare specificata prin Window nume_fereastra. Stabilirea unui domeniu de valori pentru valoarea ceruta se face prin clauza Range limita_inferioara, limita_superioara Se pot face verificari asupra valorii introduse, stabilindu-se daca valoarea este sau nu acceptabila. Aceasta se realizeaza prin clauza VALID expr_logica. Daca valoarea expresiei logice este .T., valoarea introdusa este considerata corecta si se trece la urmatorul camp de editare, altfel nu este permisa iesirea din campul de editare.

Exemplul 1: Vom scrie un program care gaseste solutia unei ecuatii de gradul 1. Se vor citi valori pentru coeficientii ecauatiei. Pentru coeficientul necunoscutei se va pune conditia de validare a<>0; Codul este:
Clear a = 0 b = 0 @5,5 Say 'a=' Get a Picture '9999'; Valid a<>0

@6,5 Say 'b=' Get b Picture '9999' READ ? 'Solutia este:', -b/a

Observatii:

Caracterul ";" este folosit nu ca separator de instructiuni, ci pentru a marca faptul ca instructiunea / comanda se continua pe randul urmator. Valorile pentru a si b nu pot depasi maxim 4 caractere (4 cifre), asa cum precizeaza clauza Picture. Daca dorim sa introducem date de dimensiuni mai mari, vom folosi functiile Space si Replicate, asa cum vedeti in exemplul urmator.

Exemplul 2: Sa se introduca datele referitoare la un elev: nume, prenume, data nasterii, notele la romana, matematica, romana si istorie. Codul este:
Clear nume = Space (15) prenume = Space (10) data_n = { / / } rom = 1 mat = 1 ist = 1 @ 5, 5 Say 'Nume :' Get nume Picture Replicate('x',15) @ 6, 5 Say 'Prenume:' Get prenume Picture Replicate('x',10) @ 7, 5 Say 'Data :' Get data_n Function 'd' @ 8, 5 Say 'Romana :' Get rom Picture '99'; Range 1, 10 Message 'Nota la romana' @ 8, 20 Say 'Matematica: ' Get mat Picture '99'; Range 1, 10 Message 'Nota la matematica' @ 8, 37 Say 'Istoria: ' Get ist Picture '99'; Range 1, 10 Message 'Nota la istorie' READ media = (rom + mat + ist)/3 Set TextMerge ON \ Media este:<<media>> Set TextMerge OFF

Observatie: Functia Space (nr) are ca rezultat un sir de caractere compus din nr spatii. Functia Replicate are ca rezultat un sir de caractere format prin multiplicarea unui sir de un numar specificat de ori. Exercitii 5. Sa se scrie un program care calculeaza aria totala, volumul si lungimea diagonalei unui paralelipiped dreptunghic cu dimensiunile a, b, c 6. Sa se construiasca o macheta de introducere a datelor pentru realizarea unui depozit bancar. Sa fie citite urmatoarele date: numele si prenumele depunatorului, seria si numarul buletinului de identitate, data nasterii, adresa, suma depusa (mai

mare de 500000 lei), termenul de depunere (1, 3 sau 6 luni), tip depozit (cu capitalizarea dobanzii sau fara capitalizare), data la care s-a constituit depozitul 7. Completati rezolvarea exercitiului precedent cu generarea unui fisier text care sa contina datele introduse de utilizator (contractul de depozit). Afisarea sa se faca si pe ecran, utilizand diferite fonturi, ...

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