Sunteți pe pagina 1din 10

III.

Tipuri de date n Visual FoxPro i operaii specifice


Principalul domeniu de utilizare a calculatoarelor numerice este cel al prelucrrii informaiilor. Programarea unui calculator presupune instruirea acestuia cu privire la modul de prelucrare a informaiilor, succesiunea de operaii ce vor fi aplicate informaiilor transmise reprezentnd programul n sine. Pentru a transmite calculatorului programul dup care acesta urmeaz s prelucreze informaiile se folosete un limbaj de programare. Acesta reprezint ansamblul codificrilor operaiilor ce se execut ntr-un program, ct i a regulilor de combinare a acestora n scopul transmiterii ctre calculator a programului dup care acesta va funciona. Informaiile prelucrate de calculator vor fi numite date. Un tip de date reprezint o caracteristic a acestora, care stabilete ce operaii se pot executa asupra datelor, modul de codificare a datelor n memoria calculatorului, semnificaia acestor date etc. Practic, un tip de date reprezint mulimea valorilor i a operaiilor care se pot efectua cu acestea. Operatorii Reprezint simboluri prin care se specific operaiile care se pot efectua cu diferite valori. n general, acetia se grupeaz astfel: -operatori aritmetici : +, -, *, /, i ridicare la putere ** -operatori relaionari : <, >, <=, >=, <> (#, !=) -operatori logici: NOT, AND, OR. Tipurile de date Fiecare cmp al unei baze de date are asociat un tip de date. Principalele tipuri de date cu care lucreaz FoxPro sunt: - irurile de caractere (tipul alfanumeric - character, memo), - datele numerice (tipul numeric - numeric, float), - datele logice (tipul logic - logical), - datele calendaristice (tipul data calendaristic - date) - date generale (tipul special - general). Datele de tip memo sau de tip general pot fi definite numai n contextul bazei de date.

a). Tipul ir de caractere (alfanumeric) cuprinde dou subtipuri:


-tipul caracter, care este alctuit din litere, cifre, simboluri i spaii, lungimea maxim fiind de 254 caractere. Pe datele de acest tip pot fi aplicai operatorii de concatenare i operatorii relaionari. -tipul memo este tot un ir de caractere, dar folosit pentru stocarea blocurilor largi de text de pn la 512 KO ntr-un cmp. Un ir de caractere reprezint o mulime ordonat de caractere, ordinea acestora fiind esenial; fiecrui caracter i se poate asocia un numr reprezentnd poziia caracterului n cadrul irului (primul caracter va avea poziia 1, al doilea va avea poziia 2 i aa mai departe). Acest tip este folosit pentru variabilele sau cmpurile care conin caractere ASCII delimitate la ambele capete prin acelai tip de apostrof, ghilimele sau paranteze ptrate. Exemplu: student , student, [student] reprezint acelai ir de caractere. Numrul caracterelor dintr-un ir reprezint lungimea irului. Un subir al irului dat reprezint o poriune din ir, ncepnd de la o poziie specificat i avnd lungimea dat. Dac lungimea irului de caractere este 1, acesta se reduce la un caracter. Dac lungimea irului

este 0, obinem irul nul (vid), care se specific prin dou apostrofuri consecutive fr spaii sau alte caractere ntre ele, adic sau . O expresie de tip ir de caractere reprezint o combinaie de operanzi i operatori, realizat dup anumite reguli, a crei evaluare va avea ca rezultat un ir de caractere. Operanzii care intr n componena acestor tipuri de expresii pot fi: - cmpuri de tip ir de caractere ale unei baze de date, - funcii ce returneaz iruri de caractere, - variabile de tip ir de caractere, - constante de tip ir de caractere. Asupra irurilor de caractere pot fi aplicate dou tipuri de operatori: Operatori de concatenare + operatorul de concatenare simplu (concatenarea irurilor) Acest operator face ca din dou iruri de caractere s se obin un al treilea, prin alipirea celui de-al doilea ir la sfritul primului(cu pstrarea blancurilor de la sfritul fiecrui ir). Exemplu: [sef ] + 'grupa' 'sef grupa' - operatorul de concatenare special (concatenare cu mutarea spaiilor de la sfritul primului ir la sfritul irului rezultat). Acest operator este asemntor cu operatorul de concatenare simplu, cu deosebirea c blancurile de la sfritul primului ir sunt trecute la sfritul celui de-al doilea. Blancurile de la nceputul irului al doilea i pstreaz poziia n ir. Exemplu: [sef ] - 'grupa ' [sefgrupa ] Operatori relaionali Acetia sunt operatori binari ce testeaz dac dou iruri de caractere se afl sau nu ntr-o relaie dat, specific operatorului.Operatorii relaionali ce se aplic ntre dou iruri de caractere sunt dai n urmtorul tabel: <operator> relaie $ inclus n mai mic dect < mai mare dect > diferit de <>, # , ! = mai mic sau egal cu <= mai mare sau egal cu >= identic cu == Un astfel de operator are urmtoarea sintax: <expC1> <operator> <expC2> Rezultatul evalurii acestei expresii este adevrat dac irul <expC1> se afl n relaia dat de <operator> cu irul <expC2>. Dac cele dou iruri nu se afl n aceast relaie, rezultatul evalurii expresiei este fals. Operatorul "inclus n" ($) returneaz adevrat dac primul ir de caractere (<expC1>) este coninut n cel de-al doilea (<expC2>), altfel returneaz fals. De exemplu, expresia 'calcul' $ 'calculator' este adevrat, pe cnd expresia 'calcule' $ 'calculator' va fi evaluat la valoarea logic fals. Operatorul "mai mic dect" returneaz adevrat dac expresia <expC1>, de tip ir de caractere,

este mai mic dect expresia <expC2>, de acelai tip. Compararea a dou iruri se face astfel: se ia primul caracter din fiecare ir i se compar prin codurile ASCII corespunztoare. Dac primul caracter al primului ir va avea un cod ASCII mai mic dect primul caracter din cel de-al doilea ir, atunci primul ir este mai mic dect cel de-al doilea. n cazul n care codul ASCII corespunztor primului caracter al primului ir este mai mare dect codul ASCII al primului caracter din cel de-al doilea ir, irul al doilea este mai mare. n caz de egalitate ntre cele dou coduri ASCII se trece la compararea codurilor ASCII ale caracterelor de pe poziia doi a fiecrui ir, urmndu-se acelai algoritm. Dac lungimile celor dou iruri difer, se poate considera c irul mai mic este completat cu caracterul cu codul ASCII O pn la egalitatea lungimilor. Deci, n cadrul acestui algoritm, caracterele de pe o poziie dat n cadrul irurilor de comparat sunt luate n seam numai dac toate caracterele de pe poziiile anterioare sunt identice n ambele iruri. Evaluarea unei expresii de acest tip se ncheie la pasul n care compararea caracterelor de pe poziia curent conduce la un rezultat fals, relativ la relaia operatorului din expresie. Aceast tehnic de comparare se aplic urmtorilor operatori: <, >, o, #, ! = , <=, >=, =. Compararea a dou iruri de caractere de lungimi diferite este controlat de comanda SET EXACT: SET EXACT ON | OFF. n cazul SET EXACT OFF, care este i opiunea implicit, dou iruri care sunt identice pe lungimea celui mai scurt, sunt considerate egale. Cnd SET EXACT este ON, pentru a fi egale, dou iruri de caractere trebuie s coincid caracter cu caracter, blancurile de sfrit din iruri fiind ignorate. Exemplu: [alb] = 'albastru returneaz adevrat pentru SET EXACT OFF; [alb] = 'albastru', returneaz fals pentru SET EXACT ON; [alb] $ 'albastru'=adevarat. FoxPro conine o multitudine de funcii pentru prelucrarea irurilor de caractere: Funcie SUBSTR(s,n1,n2) Efect Extrage un subir din irul <s> ncepnd cu caracterul de pe poziia <n1>, de lungime <n2>. Extrage primele/ultimele <n> caractere din irul <s>. LEFT/RIGHT(s,n) Returneaz lungimea irului <s>. LEN(s) LTRIM/RTRIM/ ALLTRIM (s) Elimin spaiile de la stnga irului (LTRIM), de la dreapta irului (RTRIM) sau din ambele pri (ALLTRIM). Returneaz poziia irului <s1> n <s2>. AT(s1,s2) Transform irul n minuscule/majuscule/tip titlu. LOWER/UPPER/ PROPER(s) Realizeaz conversia unui ir la numr. VAL(s) OCCURS(s1,s2) Numr apariiile lui <s1> n irul <s2>.

Exemple: ?SUBSTR('ALFA',2,2) 'LF' ?LEFT("BETA",2) "BE" ?RIGHT('GAMA',2) 'MA' ?LEN('CURS') 4 ?LTRIM(' ORA ') "ORA " ?AT('NR','str Marasti nr 1') 0; ?LOWER('STUDENT') 'student' ?UPPER('nota') 'NOTA' ?PROPER('ana maria') 'Ana Maria'

?VAL('1234.55') 1234.55 ?OCCURS("A","ALFA") 2

b). Tipul numeric este folosit pentru stocarea numerelor cu sau fr zecimale, semnul - , fiind
admis naintea numerelor. Este utilizat n diferite variante, alese n funcie de domeniul de valori n care se va ncadra variabila sau cmpul de acest tip. Tipul numeric cuprinde mai multe variante, dintre care cele mai utilizate sunt subtipurile numeric i float, diferena dintre acestea fiind sesizabil la precizia de memorare a valorilor. Dimensiunea maxim a unui punct cu valori numerice este 20. Variant Numeric Float Double Integer Currency Descriere ntregi sau fracii. Ocup 8 B n memorie. Pn la 20 B n tabla de date. Este folosit pentru valori ntre -0.9E19 i +0.9E19. n VMSP pe 4 B. Pentru valori ntre -4.9E-324 i 1.79E308 n VMDP pe 8 B. Pentru valori ntregi ntre -2147483647 i +2147483646 pe 4 B. Valori monetare ntre -9*10**14 i +9*10**14; pe 8 B.

Cu toate c limbajul FoxPro este un limbaj oriental pe lucrul cu baze de date i nu unul orientat pe calcule matematice, tiinifice (cum este Fortran, Pascal etc.), tipul numeric este implementat astfel nct s realizeze majoritatea operaiilor matematice ntlnite n practic. De asemenea, sunt prevzute o serie de funcii matematice, plecnd de la funciile matematice elementare, cum ar fi: funcia exponenial, funcia logaritmic, funciile trigonometrice etc. i ajungnd la funcii complexe, calculele realizndu-se astfel cu un efort minim. Operanzii numerici care intervin n expresii pot fi: - cmpuri numerice ale unei baze de date, - funcii care returneaz valori numerice, - variabile de tip numeric, - constante numerice. Asupra operanzilor numerici pot fi aplicate dou tipuri de operatori, rezultatele obinute fiind tot valori numerice: Operatorii aritmetici: operator semnificaie () paranteze pentru gruparea expresiilor ** ^ ridicare la putere *, /, % nmulire, mprire, modulo (restul mpririi) + ,adunarea i scderea n acest tabel, prioritatea de evaluare scade de sus n jos, pe acelai nivel de prioritate evaluarea realizndu-se de la stnga la dreapta, n ordinea apariiei operatorilor n expresie. Exemplu: o expresie de tipul: (3*5)^2-9+5%3*4 se evalueaz dup cum urmeaz: 15^2-9+5%3*4 225-9+2*4 216+8 224 Operatorii relaionali

ntre dou expresii numerice se pot aplica de asemenea operatori relaionali, obinndu-se astfel expresii logice. Aceti operatori sunt prezentai n urmtorul tabel: <operator> relaie < mai mic dect > mai mare dect = egal cu <>,#,! = diferit de <= mai mic sau egal cu >= mai mare sau egal cu Funciile standard matematice utilizate pentru prelucrarea expresiilor numerice: Funcie ABS(n) ROUND(n1,n2) MOD(n1,n2) INT(n) CEILING(n) FLOOR(n) STR(n1[,n2[,n3]]) Efect Valoarea absolut. <n1> este rotunjit la zecimala al crei ordin e dat de <n2>. Returnarea restului mpririi ntregi a expresiei numerice n1 la expresia numeric n2, rezultatul fiind de tip numeric. Partea ntreag a lui <n>. Aproximare la cel mai mic ntreg mai mare sau egal cu <n>. Aproximare la cel mai mare ntreg mai mic sau egal cu <n>. Conversie la ir a lui n1; n2 este lungimea; n3 este numrul de poziii zecimale.

Exemple: ?ABS(-15) 15. ?ROUND(1.7567,3) 1.757; ?MOD(5,2) 1 ?INT(7.25) 7; ?INT(7.87) 7 ?CEILING(5.87) 6; ?CEILING(-5.87) -5 ?FLOOR(5.87) 5; ?FLOOR(-5.87) -6 ?STR(1432.456,12,4) "1432.456" Afiarea numerelor este controlat de comanda SET DECIMALS care are urmtoarea sintax: SET DECIMALS TO [<expN>] Aceast comand determin numrul minim de cifre zecimale ce sunt afiate, dac nu se specific un format explicit de afiare. Implicit acest numr este 2, dar acesta se poate schimba folosind comanda SET DECIMALS, specificnd un alt numr prin <expN>. Observaie: Numrul de cifre cu care FoxPro lucreaz intern nu este afectat de comanda SET DECIMALS, aceast comanda controlnd doar aspectul exterior al rezultatului. Exemplu: ?2/3 0.67 SET DECIMALS TO 4 ?2/3 0.6667

c). Tipul dat calendaristic este folosit pentru stocarea datelor calendaristice sub forma
LL/ZZ/AA. Dimensiunea cmpului este implicit de opt caractere. Informaiile stocate ntr-o baz de date caracterizeaz obiecte sau procese din lumea nconjurtoare. n descrierea static a obiectelor factorul timp nu intervine, informaiile referitoare la un obiect fiind preluate la un anumit moment de timp (toate informaiile la acelai moment de timp sau momentul de timp nu este esenial). n cazul unei descrieri dinamice a obiectelor, informaiile referitoare la acestea se refer la evoluia acestora n timp, deci factorul temporal are o importan deosebit n acest caz. Pentru memorarea i prelucrarea datelor calendaristice s-a introdus acest tip de date care este foarte bine implementat n FoxPro oferind o mulime de funcii pentru manipularea acestora, acoperind marea majoritate a cerinelor de prelucrare a lor. Expresiile de tip dat calendaristic pot conine: - cmpuri de acest tip ale unei baze de date, - funcii ce returneaz valori de tip dat calendaristic, - variabile de tip dat calendaristic, - constante de tip dat calendaristic. Tipul Date este folosit pentru gestionarea datelor calendaristice reprezentate pe 8B (an, lun, zi). Forma de reprezentare difer n funcie de formatul implicit sau setat de utilizator. Exemplu: {01/31/94} reprezint 31 ianuarie 1994 n format american. Tipul DateTime este folosit pentru a memora valori ce conin att data, ct i ora. Regulile sunt aceleai ca la tipul Date. Exemplu: {12/12/1999 10:03:09} O constant de tip dat calendaristic se specific prin luna, ziua i anul corespunztor, separate prin caracterul / i ncadrate ntre paranteze acolade. Ordinea de specificare a zilei, lunii i anului, modul de scriere a anului (cu dou sau patru cifre) ct i separatorul dintre cele trei componente ale datei sunt controlate de comenzi ce vor fi prezentate ulterior. Implicit, anul se specific prin dou cifre, ordinea implicit este cea din formatul american, adic lun/zi/an, iar separatorul implicit este /. Exemplu: STORE {12/25/07} TO data_c ? data_c 12/25/07 Data calendaristic vid se specific prin blancuri n poziia zilei, lunii i anului sau printr-un blanc ncadrat ntre paranteze acolade: Exemplu: data_v = { / / } ? data_v = { } .T. Observaie: FoxPro trateaz datele invalide (care nu exist) ca date calendaristice vide. Astfel: ? {02/330/92} = {} .T. Asupra datelor calendaristice se pot aplica dou tipuri de opratori:

Operatorii aritmetici: + (adun) sau - (scade) un numr de zile unei date calendaristice; constantele de acest tip sunt reprezentate n calculator prin numere reprezentnd zile, deci se poate scdea sau aduna o valoare numeric la o dat fixat. Observaie: Adunarea unei zile la o dat calendaristic nu are ca efect creterea cu 1 a numrului de zile, ci avansarea datei cu o zi n ordine calendaristic. Exemple: ?{01.01.2001}+3 {04.01.2001} Operatorii relaionali: <, <=, >, >=, =, <>, #, !=. O dat calendaristic este mai mare dect o alta atunci cnd prima dintre acestea urmeaz calendaristic celei de-a doua. Exemplu: ?{01.01.2001} < {12.31.2001) T. Formatul de specificare a datelor calendaristice este controlat de comanda SET DATE care are urmtoarea sintax: SET DATE TO AMERICAN | ANSI | BRITISH | FRENCH | GERMAN | ITALIAN | JAPAN | USA | MDY | DMY | YMD tipul datei AMERICAN ANSI BRITISH FRENCH GERMAN ITALIAN JAPAN USA MDY DMY YMD formatul afiat ll/zz/aa aa.ll.zz zz/ll/aa zz/ll/aa zz.ll.aa zz-ll-aa aa/ll/zz ll-zz-aa Il/zz/aa zz/ll/aa aa/ll/zz

Aa cum am mai spus, formatul implicit pentru data calendaristic este cel AMERICAN. n specificarea anului se pot folosi dou cifre, caz n care se presupune automat c ne referim la secolul 20, sau prin 4 cifre cnd anul este specificat complet. Alegerea ntre aceste dou variante se face cu comanda SET CENTURY care are urmtoarea sintax: SET CENTURY ON | OFF unde cazul ON indic dou cifre pentru an iar OFF stabilete formatul de patru cifre pentru an. De asemenea, delimitatorii care separ ziua luna i anul din expresia unei constante de tip dat calendaristic se pot modifica prin comanda SET MARK TO cu urmtoarea sintax: SET MARK TO[<expC>] Expresia <expC> trebuie s reprezinte un singur caracter care va deveni delimitatorul n reprezentarea extern a datelor calendaristice. Separatorul implicit folosit pn la execuia unei comenzi SET MARK TO este caracterul"/".

Exemplu: ?DATE() 01/03/08 SET CENTURY ON SET MARK TO . ?DATE ( ) 01.03.2008 Funcii standard pentru date calendaristice: Funcie DATE()/TIME()/DATETIME() DAY/MONTH/ YEAR(d) CMONTH(d) DTOS/DTOC(d) CTOD(s) Efect Returneaz data/ora curent a sistemului (rezultatul funciei este de tip dat calendaristic). Extrage numrul zilei/lunii/anului din data calendarisitc <d>. Returneaz numele lunii din data <d>. Returneaz data sub form de ir. Realizeaz conversia unui ir la data calendaristic.

Exemple: 1.?DATE() {01/03/08}; ?TIME() "12:25:00"; ?DATETIME() {08/05/99 07:18:20PM} 2. Fie x={01.07.1997} cu formatul zz.ll.aaaa. Atunci DAY(x)=1; MONTH(x)=7; Year(x)=1997. 3. ?CMONTH({01/03/084})='JANUARY' 4. Fie x={01.03.08}. ?DTOS(X) "20080301"; ?DTOC(x) "01/03/08" 5. ?CTOD("01.03.08") {01.03.08}.

d). Tipul logic este folosit pentru stocarea valorilor logice adevarat sau fals.
Acest tip este caracteristic variabilelor sau cmpurilor ce nu pot lua dect dou valori, notate .T. (true = adevrat) i .F. (false = fals). Aspectele ce au determinat dezvoltarea acestui tip de date sunt legate de faptul c la baza construciei calculatoarelor moderne stau fenomene fizice ce pot fi reduse la dou stri (de exemplu: un tranzistor conduce sau nu, printr-un conductor trece sau nu curent etc.). Astfel, n calculator, datele sunt numerotate n sistemul binar de numeraie (care conine doar elementele 1, 0); n rezolvarea multor probleme cu calculatorul se ajunge la situaia de a alege ntre dou posibiliti, adevrat sau fals, da sau nu. In FoxPro, tipul logic este foarte bine reprezentat i, de asemenea, exist o mulime de funcii care primesc sau returneaz valori logice. O expresie de tip logic reprezint o combinaie de operanzi i operatori, realizat dup anumite reguli sintactice, pentru a forma o construcie corect, a crei evaluare va avea ca rezultat o valoare logic. Operanzii ce intr n componena expresiilor logice sunt de urmtoarele tipuri: - cmpuri de tip logic ale unei baze de date, - funcii ce returneaz valori logice, - variabile de tip logic, - alte expresii logice. Asupra datelor de tip logic se pot aplica operatorii logici. Acetia sunt prezentai n urmtorul tabel, n ordinea prioritii de evaluare:

Operator

() !, NOT AND OR Observaie: Rezultatul unei expresii care conine operatori relaionali (<, <=, >, >=, =, <>, #, !=) este tot de tip logic. Exemple: ?NOT(1 =3) T ?(1<=4) AND (5>3) .T. ?6<3 OR 4*2=9 .F. e). Tipul memo Acest tip de date reprezint o facilitate foarte puternic a FoxPro, dnd programatorului posibilitatea controlului, la nivel inferior, a diverselor date cum ar fi drivere de imprimant, de ecran, diverse texte cu lungime variabil etc. Interpretarea acestor date rmne la latitudinea programatorului, FoxPro tratndu-le ca un simplu ir de caractere. Tipul memo este asemntor tipului ir de caractere. Astfel, unele funcii care se aplic irurilor de caractere pot fi aplicate i datelor de tip memo. (exemplu: $, LEN(), AT(), SUBSTR(), etc.)

semnificaie grupeaz expresiile logice negaie logic i logic sau logic

Alte funcii uzuale aplicate tuturor tipurilor de date


Funcie MAX/MIN(e1,e2[,e3...]) TYPE(eC) IIF(eL,e1,e2) BETWEEN(e1,e2,e3) EMPTY(e) INLIST(e1,e2[,e3...]) Efect Calculeaz extremul dintre valorile <e1>, <e2>, ... Returneaz litera corespunztoare tipului de dat. Dac e1=.T. returneaz e1, altfel returneaz e2. Testeaz dac e1 aparine intervalului (e2,e3). Testeaz dac expresia dat ca parametru este vid. Testeaz dac e1 aparine listei date de urmtorii parametri.

Exemple: 1.?max(14,3) 14; ?min(14,3,15,6) 3 2. ?TYPE ("12") N; TYPE("[12]") C 3. ?IIF(eL,e1,e2) Dac e1=.T. returneaz e1, altfel returneaz e2. ?IIF(3=5,"corect","incorect") "incorect". 4. ?BETWEEN(3,0,20) .T. 5. ?Empty("")=.t.; empty({//}) .T.; ?empty(5) .F. 6.? inlist(2,1,2,3,4) .T.; ?inlist('d','a','b','c') .F.