Sunteți pe pagina 1din 17

VISUAL FOXPRO

TIPURI DE DATE
FoxPro
Principalele tipuri de date cu care lucreaz FoxPro sunt urmtoarele:
Data
Mrime
1. Tipuri numerice
Numeric (N)
8B n memorie; 20B n
tabela de date
Float (F)
8B n memorie; 20B n
tabela de date
Double (B)
8B

Valoare

Descriere

ntre -0.9E19 i +0.9E19

Valori ntregi sau zecimale.

ntre -0.9E19 i +0.9E19

Ca i Numeric.

ntre -4.9E-324 i 1.79E308

Integer (I)

ntre -2147483647 i
+2147483646
ntre -9*1014 i +9*1014

Valori n VMDP (virgul


mobila dubl precizie).
Valori ntregi.

4B

Currency (Y)
8B
2. Tipuri calendaristice
Date (D)
8B
DateTime (T)

8B

3. Tipul caracter
Character (C)
1-254B
4. Alte tipuri specifice
Logical (L)
1B
Memo (M)

4B n tabela de date

General (G)

4B n tabela de date

Valori monetare.

1 ianuarie 1 e.n. - 31
decembrie 9999 e.n.
00:00:00 a.m.,1 ianuarie 1
A.D.- 11:59:59 p.m.,31
decembrie 9999 A.D.

Dat ce cuprinde anul, luna i


ziua
Dat ce cuprinde anul, luna,
ziua, or, minutul i secund

Orice caracter

Caractere alfanumerice.

.T. / .F.

Valoare booleana de True (.T.)


sau False (.F.).
Text alfanumeric de lungime
nedeterminat.
Legtura la un obiect (poz,
sunet etc.).

E limitat de memoria
disponibil
E limitat de memoria
disponibil

Oracle
Principalele tipuri de date (native) cu care lucreaz Oracle sunt urmtoarele:
Data
1. Tipul numeric
Number

Marime

2. Tipul calendaristic
Date

3. Tipul caracter
Char
Varchar2 / Varchar

1-2000B
1-4000B

Valoare

Descriere

ntre -1*10-130 i
9.99...99*10125

Valori n VF (virgul fix) sau VM. Are


precizie de pn la 38 de zecimale.

00:00:00 a.m.,1 ianuarie


4712 i.e.n. - 11:59:59
p.m., 31 decembrie
4712 e.n.

Reine dat (zi, luna, an) i timpul (or,


minut, secunda).

Orice caracter
Orice caracter

Reine iruri de caractere cu lungime fix.


Reine iruri de caractere cu lungime

NChar / NVarChar2

1-2000/4000B

Long

Pn la 2 GB

4. Alte tipuri specifice


LOB
(BLOB, Pn la 4 GB
CLOB, NCLOB i
BFILE)
RAW/LONG RAW

Orice caracter Unicode


(AL16UTF16 sau
UTF8) menionat la
nceputul crerii bazei
ca fiind set de caractere
naionale.
Orice caracter

Reine texte (iruri de caractere) de


lungime variabil.

Orice informaie.

Stocheaz cantiti mari de informaie


nestructurata (text, poze, sunete etc.).

Orice informaie.

Pentru informaii binare sau iruri de


caractere cu lungime variabil; informaia
(sunet, document etc.) nu poate fi
interpretat (deci nici convertit la
trecerea de la un sistem la altul).
Stocheaz adresa fiecrui rnd (row)
dintr-o tabel.
Tip care stocheaz date XML (Extended
Markup Language).
Tip de dat care stocheaz URI-uri
(Uniform Resource Identifiers) care fac
legtura la un document sau o anume
parte dintr-un document.

ROWID/UROWID
XMLType

variabil (reine lungimea real, nu pe cea


maxim declarat).
Tipuri de date rezervate pentru
reprezentarea caracterelor naionale (N
provine de la Naional).

Orice dat de tip XML

URI

Observaie: tipurile de date cu acelai culori sunt asemntoare.

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 cmpuri, aduga sau insera cmpuri, poate modific lungimea sau tipul
unor cmpuri. Datele existente se vor copia n nou structur prin verificarea numelui de cmp
din cele dou structuri. Dac coincid, datele se vor trece pe nou structur fcndu-se conversia
acolo unde este posibil la noul tip de cmp. Observaie: modificarea structurii poate duce la
pierderea datelor.
Modificarea structurii se poate face prin comanda ALTER TABLE (se mai folosete i comanda
MODIFY STRUCTURE).
Structura comenzii ALTER este asemntoare cu cea de la Oracle (dup cum o s se observe din
rndurile urmtoare) i are rolul de a modifica structura unei tabele:fie prin adugare de
coloane (ADD-cand se adauga trebuie precizata structura coloanei respective), sau a unei
coloane (ALTER [COLUMN]; se aduga o validare SET CHECK sau se modifica un cmp, sau
se renuna la valorile implicite DROP DEFULT, se anuleaz o validare DROP CHECK). De
asemenea, se poate renuna la o coloan (DROP [COLUMN]), sau se poate adug / renuna 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
(Limbajul de Manipulare a Datelor)
Datelor)

SELECT
Afieaz 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 nregistrrile 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 nregistrrile 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
MODIFY STRUCTURE
DISPLAY STRUCTURE sau LIST STRUCTURE
Close tables
Use cotatii
Go top
?dbf()
Go bottom
Skip +2
Skip -2
Go top
?nume,data_c
Go 3
?simb,data_c
Display sau
list next 1
Display all
List
Brow
Go top
?"Simbolul "+simb+" are pretul"+str(pret)
Go top
?"Simbolul "+simb+" are pretul"+str(pret,10,4)
go bottom
?simb,data_c,recno(),bof(),eof()

?reccount()
Go bottom
Skip
?simb,data_c,recno(),bof(),eof()
Index on simb+dtoc(data_c) tag cota_pk unique
set order to cota_pk
list

Efect
Modificarea structurii logice a unei tabele
Vizualizarea structurii logice
Se plaseaza indicatorul la inceputul tabelei
cotatii
Afiseaza tabela deschisa: cotatii
Se plaseaza indicatorul la sfarsitul tabelei
Se se deplaseaza peste 2 inregistrari inainte
Se se deplaseaza peste 2 inregistrari inapoi
TLV 12/10/05
TLV 01/23/05
Se afiseaza inregistrarea curenta
TLV 01/23/05 7000 1.14
Se afiseaza intreaga tabela, in diferite formate
Simbolul TLV are pretul 1
Se face rotunjire.
Simbolul TLV are pretul 1.1500
In acest caz se specifica lungimea maxima a
sirului si cat se se aloce pentru partea
zecimala.
SNP 01/03/05 4 .F. .F.
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
Numarul inregistrarilor din tabela curenta: 4
/ / 5 .F. .T.
Se construieste un index care nu accepta
duplicate pe simb si data_c. Se activeaza
indexul creat si se afiseaza inregistrarile

set order to
go top
list for pret>1.14
go top
list next 2 for pret>1.14
Close tables
Use emitenti
Count for cap_soc>3000 to nr
?"numarul de emitenti avand capitatlul social mai
mare decat 3000 este: "+str(nr)
set talk off
sum cap_soc to capital
?[suma capitalulilor sociale este: ],capital
Average cap_soc for simb=[T] to medie
?[media capitalulilor sociale este: ],medie
Average cap_soc to medie
List for cap_soc>medie
Use emitenti
calculate
min(cap_soc),sum(cap_soc),avg(cap_soc) to
minm,suma,medie
?minm,suma,medie
Use cotatii
Replace for simb=[TLV] pret with pret*1.2
use cotatii
Delete for vol<8000
brow
pack sau recall all
brow
Zap sau
Delete all
Pack
Use cotatii
append from emitenti fields simb

sortate. Dupa afisare se dezactiveaza indexul.


Afiseaza cotatiile care au pretul mai mare ca
1.14
Afiseaza cotatiile care au pretul mai mare ca
1.14 din primele doua inregistrari
Afisza numarul emitentilor care au capitalul
social mai mare decat 3000

Afiseaza suma capitalulilor sociale


Se va folosi set talk off daca nu se doreste sa
se afiseze suma de doua ori.
Media capitalulilor sociale pentru societatile
ce incep cu T
Emitentii ce au capitalul social mai mare decat
media
Afiseaza minimul, suma si media capitalulilor
sociale ale emitentilor

Se mareste cu 20% cotatiile pentru TLV


Se sterg cotatiile cu volum mai mic decat
8000. Initial doar se marcheaza pentru
stergere. Pack: stergere fizica. Recall all: se
readuc inregistrarile care nu au fost sterse
fizic.
Se sterg fizic toate inregistrarile din tabela.
Se adauga la sfaristul tabelei cotatii
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 numr 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

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