Sunteți pe pagina 1din 17

VISUAL FOXPRO

TIPURI DE DATE

FoxPro
Principalele tipuri de date cu care lucrează FoxPro sunt următoarele:

Data Mărime Valoare Descriere


1. Tipuri numerice
Numeric (N) 8B în memorie; 20B în Între -0.9E19 şi +0.9E19 Valori întregi sau zecimale.
tabela de date
Float (F) 8B în memorie; 20B în Între -0.9E19 şi +0.9E19 Ca şi Numeric.
tabela de date
Double (B) 8B Între -4.9E-324 şi 1.79E308 Valori în VMDP (virgulă
mobila dublă precizie).
Integer (I) 4B Între -2147483647 şi Valori întregi.
+2147483646
Currency (Y) 8B Între -9*1014 şi +9*1014 Valori monetare.
2. Tipuri calendaristice
Date (D) 8B 1 ianuarie 1 e.n. - 31 Dată ce cuprinde anul, luna şi
decembrie 9999 e.n. ziua
DateTime (T) 8B 00:00:00 a.m.,1 ianuarie 1 Dată ce cuprinde anul, luna,
A.D.- 11:59:59 p.m.,31 ziua, oră, minutul şi secundă
decembrie 9999 A.D.
3. Tipul caracter
Character (C) 1-254B Orice caracter Caractere alfanumerice.
4. Alte tipuri specifice
Logical (L) 1B .T. / .F. Valoare booleana de True (.T.)
sau False (.F.).
Memo (M) 4B în tabela de date E limitată de memoria Text alfanumeric de lungime
disponibilă nedeterminată.
General (G) 4B în tabela de date E limitată de memoria Legătura la un obiect (poză,
disponibilă sunet etc.).

Oracle
Principalele tipuri de date (“native”) cu care lucrează Oracle sunt următoarele:

Data Marime Valoare Descriere


1. Tipul numeric
Number Între -1*10-130 şi Valori în VF (virgulă fixă) sau VM. Are
9.99...99*10125 precizie de până la 38 de zecimale.
2. Tipul calendaristic
Date 00:00:00 a.m.,1 ianuarie Reţine dată (zi, luna, an) şi timpul (oră,
4712 i.e.n. - 11:59:59 minut, secunda).
p.m., 31 decembrie
4712 e.n.
3. Tipul caracter
Char 1-2000B Orice caracter Reţine şiruri de caractere cu lungime fixă.
Varchar2 / Varchar 1-4000B Orice caracter Reţine şiruri de caractere cu lungime
variabilă (reţine lungimea reală, nu pe cea
maximă declarată).
NChar / NVarChar2 1-2000/4000B Orice caracter Unicode Tipuri de date rezervate pentru
(AL16UTF16 sau reprezentarea caracterelor naţionale (N
UTF8) menţionat la provine de la Naţional).
începutul creării bazei
ca fiind set de caractere
naţionale.
Long Până la 2 GB Orice caracter Reţine texte (şiruri de caractere) de
lungime variabilă.
4. Alte tipuri specifice
LOB (BLOB, Până la 4 GB Orice informaţie. Stochează cantităţi mari de informaţie
CLOB, NCLOB şi nestructurata (text, poze, sunete etc.).
BFILE)
RAW/LONG RAW Orice informaţie. Pentru informaţii binare sau şiruri de
caractere cu lungime variabilă; informaţia
(sunet, document etc.) nu poate fi
interpretată (deci nici convertită la
trecerea de la un sistem la altul).
ROWID/UROWID Stochează adresa fiecărui rând (row)
dintr-o tabelă.
XMLType Orice dată de tip XML Tip care stochează date XML (Extended
Markup Language).
URI Tip de dată care stochează URI-uri
(Uniform Resource Identifiers) care fac
legătura la un document sau o anume
parte dintr-un document.

Observaţie: tipurile de date cu acelaşi culori sunt asemănătoare.

LDD (Limbaj
Limbaj de Descriere a Datelor)
Datelor

FoxPro (9.0)

Se creeaza un proiect nou. (File-New-Project)


Se creeaza o noua baza de date (Data-Databases-New-New Database)
Putem creea tabele vizual folosind generatorul sau putem folosi script SQL.
Structura tabela

Cheia Primara:
Creare de tabele folosind script

Sintaxa

CREATE TABLE | DBF TableName1 [NAME LongTableName] [FREE]


(FieldName1 FieldType [(nFieldWidth [, nPrecision])]
[NULL | NOT NULL]
[CHECK lExpression1 [ERROR cMessageText1]]
[DEFAULT eExpression1]
[PRIMARY KEY | UNIQUE]
[REFERENCES TableName2 [TAG TagName1]]
[NOCPTRANS]
[, FieldName2 ...]
[, PRIMARY KEY eExpression2 TAG TagName2
|, UNIQUE eExpression3 TAG TagName3]
[, FOREIGN KEY eExpression4 TAG TagName4 [NODUP]
REFERENCES TableName3 [TAG TagName5]]
[, CHECK lExpression2 [ERROR cMessageText2]])
| FROM ARRAY ArrayName

Exemplu:

Sa se creeze urmatoarea structura:


create table emitenti(;
simb char(10),;
denumire char(32) not null,;
cf char(8) not null,;
data_l date,;
piata char(12) check upper(piata)='BVB' or upper(piata)='RASDAQ',;
cap_soc number(10) check cap_soc>200 error "capital social prea mic",;
primary key simb tag emit_pk)

create table cotatii(;


simb char(10),;
data_c date,;
vol number(10) check vol>=0 error "volumul trebuie sa fie pozitiv",;
pret number(16,4) check pret>=0 error "pretul trebuie sa fie pozitiv",;
primary key simb+dtoc(data_c) tag cot_pk,;
foreign key simb tag c_e_fk references emitenti)

• Modificare structură tabele


Utilizatorul poate şterge câmpuri, adăuga sau insera câmpuri, poate modifică lungimea sau tipul
unor câmpuri. Datele existente se vor copia în nouă structură prin verificarea numelui de câmp
din cele două structuri. Dacă coincid, datele se vor trece pe nouă structură făcându-se conversia
acolo unde este posibil la noul tip de câmp. Observaţie: modificarea structurii poate duce la
pierderea datelor.

Modificarea structurii se poate face prin comanda ALTER TABLE (se mai foloseşte şi comanda
MODIFY STRUCTURE).

Structura comenzii ALTER este asemănătoare cu cea de la Oracle (după cum o să se observe din
rândurile următoare) şi are rolul de a modifica structura unei tabele:fie prin adăugare de
coloane (ADD-cand se adauga trebuie precizata structura coloanei respective), sau a unei
coloane (ALTER [COLUMN]; se adăuga o validare SET CHECK sau se modifica un câmp,
sau se renunţa la valorile implicite DROP DEFULT, se anulează o validare DROP CHECK).
De asemenea, se poate renunţa la o coloană (DROP [COLUMN]), sau se poate adăugă /
renunţa la o cheie primară sau cheie externă (ADD /DROP PRIMARY KEY sau ADD/DROP
Foreign KEY).Tot în cadrul comenzii alter se poate redenumi o coloană.

Sintaxa

ALTER TABLE TableName1


ADD | ALTER [COLUMN] FieldName1
FieldType [(nFieldWidth [, nPrecision])]
[NULL | NOT NULL]
[CHECK lExpression1 [ERROR cMessageText1]]
[DEFAULT eExpression1]
[PRIMARY KEY | UNIQUE]
[REFERENCES TableName2 [TAG TagName1]]
[NOCPTRANS]
– Sau –
ALTER TABLE TableName1
ALTER [COLUMN] FieldName2
[NULL | NOT NULL]
[SET DEFAULT eExpression2]
[SET CHECK lExpression2 [ERROR cMessageText2]]
[DROP DEFAULT]
[DROP CHECK]
– Sau –
ALTER TABLE TableName1
[DROP [COLUMN] FieldName3]
[SET CHECK lExpression3 [ERROR cMessageText3]]
[DROP CHECK]
[ADD PRIMARY KEY eExpression3 TAG TagName2]
[DROP PRIMARY KEY]
[ADD UNIQUE eExpression4 [TAG TagName3]]
[DROP UNIQUE TAG TagName4]
[ADD FOREIGN KEY [eExpression5] TAG TagName4
REFERENCES TableName2 [TAG TagName5]]
[DROP FOREIGN KEY TAG TagName6 [SAVE]]
[RENAME COLUMN FieldName4 TO FieldName5]
[NOVALIDATE]

Exemple

Alter table emitenti drop primary key


Alter table emitenti add primary key simb tag emit_pk
Alter table emitenti drop column piata
Alter table emitenti add column piata char(12)
Alter table emitenti alter column denumire char(35) not null
Alter table emitenti alter column piata set check upper(piata)='BVB' or upper(piata)='RASDAQ'

Modificare tabele

ALTER TABLE TableName1


ADD | ALTER [COLUMN] FieldName1
FieldType [(nFieldWidth [, nPrecision])]
[NULL | NOT NULL]
[CHECK lExpression1 [ERROR cMessageText1]]
[DEFAULT eExpression1]
[PRIMARY KEY | UNIQUE]
[REFERENCES TableName2 [TAG TagName1]]
[NOCPTRANS]
sau
ALTER TABLE TableName1
ALTER [COLUMN] FieldName2
[NULL | NOT NULL]
[SET DEFAULT eExpression2]
[SET CHECK lExpression2 [ERROR cMessageText2]]
[DROP DEFAULT]
[DROP CHECK]
sau
ALTER TABLE TableName1
[DROP [COLUMN] FieldName3]
[SET CHECK lExpression3 [ERROR cMessageText3]]
[DROP CHECK]
[ADD PRIMARY KEY eExpression3 TAG TagName2]
[DROP PRIMARY KEY]
[ADD UNIQUE eExpression4 [TAG TagName3]]
[DROP UNIQUE TAG TagName4]
[ADD FOREIGN KEY [eExpression5] TAG TagName4
REFERENCES TableName2 [TAG TagName5]]
[DROP FOREIGN KEY TAG TagName6 [SAVE]]
[RENAME COLUMN FieldName4 TO FieldName5]
[NOVALIDATE]

Stergere tabela:
Drop table regiuni

LMD (Limbajul
( de Manipulare a Datelor))

SELECT

Afişează date din una sau mai multe tabele.

Sintaxa

SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]]


[Alias.] Select_Item [AS Column_Name]
[, [Alias.] Select_Item [AS Column_Name] ...]
FROM [FORCE]
[DatabaseName!]Table [Local_Alias]
[[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN
DatabaseName!]Table [Local_Alias]
[ON JoinCondition …]
[[INTO Destination]
| [TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT]
| TO SCREEN]]

[PREFERENCE PreferenceName]
[NOCONSOLE]
[PLAIN]
[NOWAIT]
[WHERE JoinCondition [AND JoinCondition ...]
[AND | OR FilterCondition [AND | OR FilterCondition ...]]]
[GROUP BY GroupColumn [, GroupColumn ...]]
[HAVING FilterCondition]
[UNION [ALL] SELECTCommand]
[ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]

• Sa se afiseze emitentii care au simbolul TLV sau SNP

Select * from emitenti where simb in ('TLV','SNP')

• Sa se afiseze o singura data toate pietele pe care se tranzactioneze emitentii

select distinct piata from emitenti

• Sa se afiseze toti emitentii a caror denumire incepe cu S sau s

Select * from emitenti where denumire like "S%" or denumire like "S%"

• Se se afiseze emitentii care au pe penultima pozitie A

Select * from emitenti where denumire like "%A_"


• Sa se afiseze toti emitentii care au capitalul social intre 200 si 5000

select * from emitenti where cap_soc between 200 and 5000

• Sa se afiseze denumire emitent, data, cotatie (pret)

Select denumire,data_c,pret from cotatii c, emitenti e where c.simb=e.simb

Sau

Select denumire,data_c,pret from cotatii c inner join emitenti e on c.simb=e.simb

• Sa se afiseze si emitentii care nu au cotatii

Select denumire,data_c,pret from cotatii c, emitenti e where c.simb=e.simb(+)

Sau

Select denumire,data_c,pret from cotatii c right outer join emitenti e on c.simb=e.simb

• Sa se afiseze cotatiile care nu corespund unui emitent (merge daca pe insert e setat ignore)

Select denumire,data_c,pret from cotatii c left outer join emitenti e on c.simb=e.simb

INSERT

INSERT INTO emitenti values("TLV","Banca Transilvania","798655",DATE(),"BVB",795750)


INSERT INTO emitenti values("BRD","Banca Romana de
Dezvoltare","79885",DATE(),"BVB",195850)
INSERT INTO cotatii VALUES ("TLV",CTOD("07-12-2009"),50000,1)
INSERT INTO cotatii VALUES ("TLV",CTOD("08-12-2009"),70000,1.1)
INSERT INTO cotatii VALUES ("BRD",CTOD("08-12-2009"),78000,2.5)

UPDATE

Modifica înregistrările dintr-o tabelă.

Sintaxa

UPDATE [DatabaseName1!]TableName1
SET Column_Name1 = eExpression1
[, Column_Name2 = eExpression2 ...]
WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]

• Sa se majoreze capitalul social al BRD-ului cu 10%

Update emitenti set cap_soc=cap_soc*1.10 where simb='BRD'

• Sa se incrementeze cotatiile de pe 01-01-2005


Update cotatii set pret=pret+0.1 where data_c=ctod("08-12-2009")

Rezultatul obtinut este cel din figura urmatoare :

DELETE

Şterge înregistrările dintr-o tabelă.

Sintaxa

DELETE FROM [DatabaseName!]TableName


[WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]

• Sa se stearga toate cotatiile

Delete from cotatii

• Sa se stearga emitentul SNP

Delete from emitenti where simb='SNP'

Functii SQL

• Functie conversie string catre number: chr(). Functie ce returneaza data sau data+ora
curenta: date() si datetime()
Exemplu: select "Simbolul "+simb+"avand volumul"+str(vol) from cotatii where data_c=date()

• Sa se realizeze o jonctiune intre tabelele emitenti si simboluri

SELECT denumire,pret FROM emitenti e,cotatii c WHERE e.simb=c.simb

• Variatia neta si procentuala a pretului fata de sedinta anterioara:

select a.simb,a.pret pret_azi,i.pret pret_ieri,a.pret-i.pret net,a.pret*100/i.pret-100 procn from


cotatii a;
inner join cotatii i on a.simb=i.simb where i.data_c=(select max(c.data_c) from cotatii c;
where c.data_c<>date() and c.simb=i.simb) and a.data_c=date()

• Sa se calculeze suma, media volumului de tranzactionare pe fiecare simbol.

Select simb,count(vol) nr,sum(vol) suma,avg(vol) medie from cotatii group by simb

• Sa se calculeze suma, media volumului de tranzactionare pentru cazurile in care volumul a


fost mai mare ca 3000.

Select simb,count(vol) nr,sum(vol) suma,avg(vol) medie from cotatii where vol>3000 group by
simb

• Sa se afiseze suma, media volumului de tranzactionare pentru cazurile in care media a fost
mai mare ca 7500.

Select simb,count(vol) nr,sum(vol) suma,avg(vol) medie from cotatii group by simb having
medie>7500

ATENTIE: Clauza where filtreaza inregistrarile tabelei(lor) initiale iar having filtreaza rezultatul
obtinut dupa grupare.

Limbajul FOX

In FoXPro fiecare tabela se deschide intr-o zona de lucru denumita A, B, C… sau 1, 2, …


EX:
Sa se deschida tabela emitenti In zona A si cotatii facturi In zona B.
SELECT A
USE emitenti
SELECT B
USE cotatii
SELECT A
brow
SELECT B
Brow

Sa presupunem ca in cotatii si emitenti avem urmatoarele inregistrari:


Instructiuni

Instructiune Efect
MODIFY STRUCTURE Modificarea structurii logice a unei tabele
DISPLAY STRUCTURE sau LIST Vizualizarea structurii logice
STRUCTURE
Close tables Se plaseaza indicatorul la inceputul tabelei
Use cotatii cotatii
Go top
?dbf() Afiseaza tabela deschisa: cotatii
Go bottom Se plaseaza indicatorul la sfarsitul tabelei
Skip +2 Se se deplaseaza peste 2 inregistrari inainte
Skip -2 Se se deplaseaza peste 2 inregistrari inapoi
Go top TLV 12/10/05
?nume,data_c
Go 3 TLV 01/23/05
?simb,data_c
Display sau Se afiseaza inregistrarea curenta
list next 1 TLV 01/23/05 7000 1.14
Display all Se afiseaza intreaga tabela, in diferite formate
List
Brow
Go top Simbolul TLV are pretul 1
?"Simbolul "+simb+" are pretul"+str(pret) Se face rotunjire.
Go top Simbolul TLV are pretul 1.1500
?"Simbolul "+simb+" are pretul"+str(pret,10,4) In acest caz se specifica lungimea maxima a
sirului si cat se se aloce pentru partea
zecimala.
go bottom SNP 01/03/05 4 .F. .F.
?simb,data_c,recno(),bof(),eof() Recno() – returneaza nr inregistrarii curente
Eof()- returneaza .T. daca este sfarsitul tabelei
si .F. altfel
Bof()- returneaza .T. daca este inceputul
tabelei si .F. altfel
?reccount() Numarul inregistrarilor din tabela curenta: 4
Go bottom / / 5 .F. .T.
Skip
?simb,data_c,recno(),bof(),eof()
Index on simb+dtoc(data_c) tag cota_pk unique Se construieste un index care nu accepta
set order to cota_pk duplicate pe simb si data_c. Se activeaza
list indexul creat si se afiseaza inregistrarile
set order to sortate. Dupa afisare se dezactiveaza indexul.
go top Afiseaza cotatiile care au pretul mai mare ca
list for pret>1.14 1.14
go top Afiseaza cotatiile care au pretul mai mare ca
list next 2 for pret>1.14 1.14 din primele doua inregistrari
Close tables Afisza numarul emitentilor care au capitalul
Use emitenti social mai mare decat 3000
Count for cap_soc>3000 to nr
?"numarul de emitenti avand capitatlul social mai
mare decat 3000 este: "+str(nr)
set talk off Afiseaza suma capitalulilor sociale
sum cap_soc to capital Se va folosi set talk off daca nu se doreste sa
?[suma capitalulilor sociale este: ],capital se afiseze suma de doua ori.
Average cap_soc for simb=[T] to medie Media capitalulilor sociale pentru societatile
?[media capitalulilor sociale este: ],medie ce incep cu T
Average cap_soc to medie Emitentii ce au capitalul social mai mare decat
List for cap_soc>medie media
Use emitenti Afiseaza minimul, suma si media capitalulilor
calculate sociale ale emitentilor
min(cap_soc),sum(cap_soc),avg(cap_soc) to
minm,suma,medie
?minm,suma,medie
Use cotatii Se mareste cu 20% cotatiile pentru TLV
Replace for simb=[TLV] pret with pret*1.2
use cotatii Se sterg cotatiile cu volum mai mic decat
Delete for vol<8000 8000. Initial doar se marcheaza pentru
brow stergere. Pack: stergere fizica. Recall all: se
pack sau recall all readuc inregistrarile care nu au fost sterse
brow fizic.
Zap sau Se sterg fizic toate inregistrarile din tabela.
Delete all
Pack
Use cotatii Se adauga la sfaristul tabelei cotatii
append from emitenti fields simb simbolurile din emitenti

Stabilirea domeniului inregistrarilor:

• For <conditie> se refera la inregistrarile pentru care <conditie> are valoarea .T.
• While <conditie> se refera la inregistrarile cuprinse intre inregistrarea curenta si prima
inregistrare pentru care <conditie> este .F.

List for vol>8000 afiseaza toate inregistrarile pentru care vol>8000


Go top
List while vol>8000 afiseaza pana cand intalneste un volum mai mic sau egal cu 8000

Cautare indexata:

Comenzile seek si find se folosesc doar pe tabelele indexate.

Exemplu:
use emitenti
index on simb tag isimb
seek "TLV"
if found()
display
endif

Jonctiuni

Pentru a creea o legatura intre cotatii si emitenti:

sele 1
use emitenti
index on simb to p1
sele 2
use cotatii
set relation to simb into emitenti
set skip to emitenti
?relation(1) -> afiseaza pe ce s-a facut prima legatura adica: SIMB
browse fields emitenti.denumire,cotatii.data_c,cotatii.pret FOR cotatii.simb='TLV'
sau
join with emitenti to cemit for simb=A.simb fields a.denumire,data_c,pret
select * from cemit

Structuri de program FOX

1. Structura secventiala:

O astfel de structura este data de o secventa de comenzi, care nu contine structurile alternative IF si
CASE sau structurile repetitive (WHILE, FOR, SCAN).

Atribuirea se face prin STORE sau prin =.

Exemplu

Store 100 to X1,X2


sau
X1=100
X2=100

2. Structura alternativa

If <conditie>
Secventa - instructiuni 1
Else
Secventa – instructiuni 2

Exemplu
Clear
Go top
If vol>5000
?simb," este la categoria I"
else
?"este la categoria II"
endif

Do case
Case expresie 1
Secventa 1
Case expresie 2
Secventa 2
….
Case expresie n
Secventa n
Otherwise
Secventa
Endcase

Input [introduceti media:] to medie


do case
Case between(medie,7,8.50)
?"medie buna"
case between(medie,8.51,9.50)
?"medie foarte buna"
case between(medie,9.51,10)
otherwise
?"medie slaba"
endcase

3. Structura repetitiva

• Cu numar cunoscut de repetitii


For v=v1 to vf [step Vp]
Instructiuni
[exit]
[loop]
endfor
• Cu număr neconoscut de repetitii
Do while <conditie>
Instructiuni
[loop]
[exit]
enddo
• Scan – instructiune specifică lucrului cu tabele- secventa se executa pentru fiecare
inregistrare din tabela
Scan <scop>
Instructiuni
[loop]
[exit]
endscan
loop – transmite controlul instructiunii de sfarsit a secventei repetitive
exit – transmite controlul primei instructiuni ce urmeaza secventei

Exemple:

1. Sa se afiseze cotatiile cat si numarul lor din luna curenta folosind functia locate

close tables
Use cotatii
Set talk off
Nr=0
Locate for year(data_c)=year(date()) and month(data_c)=month(date())
Do while found()
display
Nr=nr+1
Continue
Enddo
?"Numar total de cotatii:",nr

2. Sa se afiseze folosind o structura do while emitentii care incep cu 'P'


close tables
use emitenti
go top
clear
do while NOT EOF()
if like ('P*',denumire)
?denumire
endif
skip
enddo

3. Sa se afiseze folosind scan emitentii care incep cu 'P'

close tables
use emitenti
go top
clear
scan for substr(denumire,1,1)='T'
?denumire
endscan

4. Sa se afiseze folosind for si iif emitentii care incep cu 'P'

close tables
use emitenti
go top
clear
for i=1 to reccount()
?iif(substr(denumire,1,1)='P',denumire,'Nu incepe cu P')
skip
?replicate("-",35)
endfor
use