Documente Academic
Documente Profesional
Documente Cultură
Recapitulare . . . . . . . . . . . . . . . . . . . . . . . .99
Cuprins
Capitolul
Organizarea datelor
n baze de date
Componentele unei structuri de date pot s fie de acelai tip (structura este
omogen) sau de tipuri diferite (structur neomogen).
Operaiile (operatorii) aplicate asupra unei structuri de date pot s-i afecteze valorile
i/sau structura. Dac o structur de date i modific structura n timp, este numit
dinamic. Spre deosebire de acestea, structurile statice au acelai numr de
componente i n aceeai ordine pe tot parcursul existenei lor.
Definirea structurilor de date necesare ntr-o aplicaie este o activitate complex,
care condiioneaz n mare msur necesarul de memorie, viteza de prelucrare i
uneori chiar efortul de proiectare i implementare. Pentru realizarea ei trebuie s se
in seama de o serie de factori, dintre care:
volumul datelor;
operaiile de prelucrare i frecvena lor (o atenie deosebit trebuie acordat
actualizrii: dac este frecvent, trebuie aleas o structur la care performanele
accesului nu scad esenial datorit modificrilor structurii);
indicele de activitate pe operaii se definete ca raport ntre numrul de
componente ale structurii utilizate ntr-o operaie i numrul de componente
explorate pentru aceasta. El determin timpul de acces. Dac indicele este mare
(peste 0,8), atunci accesul poate fi secvenial. Valorile mici ale indicelui implic
un acces direct.
durata de via a structurii;
utilizarea raional a spaiului de memorie (comprimare, blocare, segmentare,
combinarea diferitelor forme de reprezentare);
complexitatea programrii;
asigurarea integritii datelor (alegerea structurii care permite protecia mpotriva
distrugerilor accidentale i posibilitatea refacerii datelor.
sarcini de laborator
1.
a) Identificai aceste date i facei o list a atributelor lor. Separai datele care sunt
elementare i datele care sunt calculate. Pentru fiecare scriei natura valorilor
posibile (numere sau iruri de caractere).
b) Ce informaii pot fi cerute de conducerea colii, de prini, de elevi?
c) Identificai diferite structuri care s faciliteze obinerea rapid a informaiilor.
Care sunt prelucrrile?
De exemplu, o colecie ar putea s rein numele elevului, numele prinilor i
adresa de acas, o alt colecie ar putea s rein numrul matricol al elevului, totalul
absenelor motivate i nemotivate, o colecie ar putea s conin notele (data cnd a
fost luat, elevul, obiectul) etc.
2.
Cutai i vizitai site-ul unei librrii on-line. Cum sunt prezentate crile? Este
dat i o imagine a coperii sau a autorilor? Care sunt informaiile pe care le putei
obine din pagina web?
5.
Fiiere pe aplicaii
Primele forme de organizare a datelor au fost fiierele secveniale pe band
magnetic. Odat cu folosirea suportului adresabil discul magnetic au aprut
fiierele cu acces direct (indexate, selective). Gestiunea fiierelor era asigurat printrun sistem specializat, numit SGF (sistem de gestiune a fiierelor) existent n orice
sistem de operare. A fost o soluie specific anilor 1960-1970, dar mai este ntlnit i
astzi n cazul aplicaiilor economice care folosesc limbaje clasice precum Cobol.
Fiierul este o structur omogen din punctul de vedere al coninutului i al
prelucrrii. Organizarea n fiiere are un nivel fizic i un nivel logic. Fiierul este format
din nregistrri fizice care formeaz unitatea de transfer ntre memoria extern i cea
intern. O nregistrare fizic poate conine mai multe nregistrri logice (formate din
cmpuri), care reflect punctul de vedere al utilizatorului.
Programele utilizatorilor trebuie s conin n mod explicit referiri la suportul, forma
de organizare i modul de acces al fiierului de lucru.
Altfel spus, datele aveau sens i puteau fi accesate numai din aplicaiile-program.
Pe de alt parte, n anii 1960-1970 fiecare aplicaie informatic dintr-o instituie era
proiectat ntr-o manier individualist i viza automatizarea unei anumite activiti. n
vederea creterii vitezei de rspuns, aplicaia i aducea n fiierele proprii toate datele
de care avea nevoie, ignornd faptul c, poate, aceleai date erau culese, selectate i
prelucrate i de alte aplicaii. Apare fenomenul de redundan a datelor i efectele sale
nedorite: creterea nejustificat a costurilor de ntreinere a fiierelor de date i, mai
ales, pericolul inconsistenei datelor (datorit omiterii actualizrii datelor n toate locurile
unde apreau).
Sisteme de fiiere
Pasul urmtor n istoricul organizrilor datelor a fost gestiunea comun a fiierelor
de ctre toate aplicaiile informatice care aveau legturi funcionale bine stabilite ntre
ele. Apare structurarea datelor n fiiere integrate sau sisteme de fiiere.
Trecerea la sistemele de fiiere nu a rezolvat, ns, o problem foarte important:
problema independenei programelor de aplicaii de modul de organizare a datelor. n
organizrile tradiionale pe fiiere, cunotinele despre structura datelor i tehnicile de
accesare a acestora erau incluse n programe. Odat creat fiierul, toate procedurile de
prelucrare conineau aceste caracteristici. Modificarea structurii fiierului (adugarea
unor cmpuri sau eliminarea altora) conducea la modificarea poriunilor descriptive ale
programelor, iar modificarea modului de acces (secvenial, direct) impunea revizuirea
coninutului procedural al programelor. O cerin nou se rezolva doar printr-un
program nou sau prin modificarea unuia existent. Dac lum n consideraie faptul c
aproape zilnic apreau cerine noi, efortul de meninere a sistemului de fiiere
operaional era imens. Soluia a fost detaarea din programul de aplicaii a descrierii
fiierelor i a legturilor dintre ele. Astfel au aprut primele baze de date.
date se deruleaz exclusiv prin intermediul acestui dicionar care conine informaii
privitoare la structurarea datelor i restriciile ndeplinite de acestea. Astfel apare
noiunea de model conceptual al bazei de date.
Specific acestei etape este i apariia funciei de administrator al bazei de date
i conceperea unor proceduri speciale de securitate.
11
sarcini de laborator
1.
Scriei un eseu Ce tiu despre mine! urmrind rspunsuri la ntrebri de felul urmtor:
3.
13
15
nume entitate
familie de
caracteristici
automobil
serie
1111
1234
1999
culoare
alb
roz
bleu
marca
matiz
tico
cielo
pret
200
190
300
realizare de
entitate
domeniul caracteristicii
culoare
fiind acceptate doar relaii tip 1-1 sau 1-n (COLI1, nPROFESORI). Dac ns un
profesor pred la mai multe coli, atunci informaiile personale vor fi repetate n
entitatea PROFESORI (vorbim de o anumit redundan a datelor); de asemenea,
modelul are dificulti atunci cnd sunt necesare includeri sau excluderi de entiti sau
de relaii2.
b. Modelul reea
Este un model mai general
de organizare a datelor, n care nu
mai exist restricia ca un nod s
nu aib dect un singur ascendent. Pot fi modelate i relaiile
n-n (COLIn, nPROFESORI).
c. Modelul relaional
n bazele de date relaionale, entitile sunt organizate n tabele simple,
bidimensionale, fr legturi fixe. Relaiile necesare sunt stabilite prin asocierea ntre
ele a unor cmpuri cheie ale fiecrei tabele.
De exemplu, entitile CLASE i ELEVI sunt n legate prin cmpul cod-clas.
Legtura este de tip 1-N.
Pe baza modelului ierarhic au fost concepute primele SGBD-uri, cel mai reprezentativ fiind IMS
(Information Management System) al firmei IBM.
Capitolul 1 Organizarea datelor n baze de date
17
relaionale. Noul val se numete obiect-relaional. Modelul de date este practic acelai
ca la modelul orientat spre obiecte. Limbajul de interogare declarativ este n esen
acelai OQL, dar pstreaz sintaxa limbajului SQL, cu extensii pentru funciile noi.
Studiu de caz
18
Periodicitate
Ocazional
La sosirea
crilor
Anual
Ocazional
Documente
Oferte, comenzi,
facturi
Comanda,
registrul inventar
Registrul inventar
Registrul inventar
La nscrierea
cititorului
Ocazional
Fia cititorului
Zilnic
Anual
Fia cititorului
Fia cititorilor,
registrul inventar,
situaie centralizatoare
Fia crtii
La sosira
crilor
ntrziere,
pierdere
Fia cititorului
Fia cititorului
Documente
Registrul inventar
Fia crii
Fia cititorului
Lista de inventar
Lista ofertelor de carte
Comanda
Factura
Situaia centralizatoare
3. Grila informaional
Documente Informaii RI
Titlu
*
Autor
*
Domeniu
*
Editura
*
Adresa-editurii
Date-pers autori
Periodicitatea de completare
Ocazional, la sosirea/scoaterea crii din inventar
Ocazional, la sosirea unei cri
La nscriere, mprumut/restituire i retragere
Anual; alctuit de comisia de inventar
Ocazional; vine de la edituri
Ocazional; pe baza ofertelor; se trimite la edituri
Ocazional; vine de la editur odat cu livrrile
Anual
FC
*
*
*
*
FCIT
Li
*
*
Of
*
*
*
*
*
C
*
*
F
*
*
*
*
*
*
SIT
*
Capitolul 1 Organizarea datelor n baze de date
19
Documente Informaii RI
Pret-carte
*
Numar inventar
*
Isbn
*
Comision
Data
*
Numar-comanda
Numar-factura
Cnp-cititor
Date-pers cititor
Operaie imprumut/restituire
Numar-restantieri
Numar carti
FC
FCIT
Li
*
*
*
*
Of
*
C
*
F
*
*
*
*
*
*
SIT
*
*
*
*
*
*
*
Proiectarea entitilor
Edituri (nume, adres, alte_informaii); Autori (nume, date-personale, alte_informaii);
Carti (ISBN, titlu, cod-autor, pre, alte-infomaii); Oferte (editura, carte, comision,
alte_informaii); Comenzi (data, numar-comanda, cantitate, alte_informaii); Facturi
(data, numar-factura, nr-buci-trimise, alte_informaii); Inventar (numr-de-inventar,
ISBN, starea, alte_informai); Cititori (cnp, date-personale).
Proiectarea legturilor:
1. O editur poate trimite N oferte; o ofert nu aparine mai multor edituri.
2. O ofert poate constitui baza a N comenzi; o comand nu poate s fac referire
la mai multe oferte.
3. O comand poate fi onorat prin N facturi; o factur nu este trimis dect n
contul unei singure comenzi.
4. O editur poate avea N cri; o carte nu poate aparine mai multor edituri.
5. O carte poate avea mai muli autori; un autor poate scrie N cri.
6. Un cititor poate mprumuta mai multe cri; o carte poate fi citit de mai muli cititori.
Proiectarea SCHEMEI CONCEPTUALE
inventar
edituri
autori
carti
cititori
oferte
Figura 1-8: Schema conceptual a bazei de date
20
comenzi
facturi
sarcini de laborator
Citii cu atenie urmtoarea problem.
Pe baza dosarului candidatului, alctuit din certificatul de natere (CN), fia de
nscriere (FI) i avizul epidemiologic (AE), secretariatul colii nregistreaz numele,
coala de unde vine elevul, profilul la care se nscrie pentru admitere n registrul de
nscriere (RI) i trece pe dosar numrul de ordine.
Dup terminarea nscrierilor, se completeaz o list alfabetic a candidailor (LA1)
n dou exemplare, dintre care unul este afiat la poarta colii. Se face ordonarea
alfabetic i se repartizeaz candidaii pe sli de examen (trebuie verificate slile i
numrul de locuri din fiecare sal).
Numrul de locuri la fiecare profil al colii este decis de forurile superioare i nscris
pe un document numit plan de colarizare (PS). El este trimis colii naintea nceperii
nscrierilor.
Profesorii din comisie cu numele, gradul didactic, coala unde sunt titulari,
specialitatea etc. sunt nscrii pe documentul lista comisiei de examen (LC) de ctre
inspectorat i trimis secretariatului liceului.
Pe baza listei alfabetice a candidailor (exemplarul rmas la secretariat, nu cel de la
poart) i a listei comisiei se scrie catalogul de examen (C).
Dup susinerea probelor, se trec notele pe catalog, se semneaz catalogul de
comisie i se calculeaz, de ctre secretariat, mediile fiecrui candidat. Se afieaz n
cel mai scurt timp lista alfabetic a candidailor (LA2), lista admiilor (LA) i lista
respinilor (LR). Aceste documente au de fapt acelai format, dar datele sunt diferite!
Comisia ntocmete un proces verbal de examen (PV) n care va trece situaiile
statistice cerute: numr nscrii, numr reuii, cea mai mare medie la matematic etc.
Catalogul, mpreun cu un exemplar din lista alfabetic de dup examen i cu procesul
verbal (primul exemplar) se depun n arhiva colii. Un exemplar din PV merge la
inspectorat. Dosarele candidailor rmn la secretariat.
Secretariatul colii ar dori o aplicaie informatic care s simplifice munca de
eviden a datelor despre candidai, comisii, sli de examen i, desigur, s permit
raportarea informaiilor ctre decideni n formatele i momentele solicitate.
Facei analiza i proiectarea bazei de date necesare secretariatului liceului.
21
Capitolul
nume
Liceu Art
Informatic
adresa
Pcii 9
Cminelor 9
antetul tabelului =
familie de caracteristici
anul
1850
1971
linia = realizare de
entitate
coloana = domeniul
caracteristicii
Cheia primar a unei relaii este un atribut (sau grup) care identific fr ambiguitate
fiecare linie a relaiei. Atunci cnd cheia este compus, nici un atribut al su nu poate
fi eliminat fr distrugerea unicitii tuplului.
O cheie strin este un grup de atribute care pune n legtur linii din dou relaii (tabele).
Legtura dintre tabele este stabilit ntre o tabel (numit printe) i o alta (numit
copil) prin intermediul unui cmp comun.
Ca efect, atunci cnd se deplaseaz pointerul de fiier n tabela printe, automat se
poziioneaz i pointerul fiierului copil pe primul articol care are valoarea cheii egal
cu cea din fiierul printe.
22
Tipuri de relaii
A. Relaia 1-1: Un articol al tabelei printe are legtur cu un singur articol al
tabelei copil sau cu nici unul.
Exemplu
Exemplu
23
sala
P2
15
P6
Media
7.50
10
8.90
10
8.00
Alte-informatii
Cod-clasa
12b
12c
12c
12a
12b
24
De exemplu, definim o tabel virtual pe tabelele Elevi i Clase, care reine doar
numele elevilor i profilul clasei n care nva.
ELEVI
nume
Albu
Barbu
CLASE
codcl
9a
9b
9c
Codcl
9a
9c
PROFIL_ELEVI
nume
Profil
Albu
Info
Barbu
Bio
Profil
Info
Mate
Bio
Orice modificare a datelor din tabelele surs se reflect automat n tabela virtual.
Studiu de caz
elevi
codcl
codcl
obiecte
Codel
incadrare
codcl
codo
codo
nume
profesori
codp
codp
nume
spec
25
sarcini de laborator
Fie urmtoarea schem conceptual a unei baze de date care reine informaii
despre discurile, piesele, autorii i cntreii de romane i muzic popular pe plan
naional i internaional.
I.
II.
Exemplu
com
006
007
data
01.03.98
01.09.98
furn
f1
f1
adr
Bc
Bc
cod1
a23
c33
cod2
b66
cod3
c33
cod4
cant
10
12
val
12980
12000
data
01.03.98
01.03.98
01.03.98
01.09.98
furn
f1
f1
f1
f1
adr
Bc
Bc
Bc
Bc
codprod
a23
b66
c33
c33
cant
10
10
10
12
pret
100
200
150
150
valoare
12980
12980
12980
12000
27
S recapitulm:
Prima form normal este identificat cu definiia unei relaii.
A doua form normal impune ca toate atributele non-cheie s fie dependente de
ntreaga cheie.
A treia form normal presupune inexistena dependenelor tranzitive.
n concluzie, prin normalizare spectrul anomaliilor de care sufer o relaie se
restrnge foarte mult. Toate aceste forme normale sunt folositoare, dar niciuna nu
garanteaz c au fost eliminate toate anomaliile!
28
Studiu de caz
Varianta 1
LECTURI
(nr_inventar, titlu_carte, autor,
anul_intrarii, numele_cititorului,
adresa, telefon, data-imprumutului)
Observaii
Baza de date permite desfurarea operaiilor de actualizare a crilor, dar prezint
anomalii legate de actualizarea cititorilor.
Astfel:
dac tergem articolul corespunztor unei cri la scoaterea sa din inventar,
atunci vor fi terse i informaiile despre cititor! n acest caz, spunem c exist
anomalii de tergere.
nu putem aduga un nou cititor dect atunci cnd acesta mprumut o carte.
Spunem c exist anomalii de inserare.
datele despre un cititor le gsim n toate articolele corespunztoare crilor
mprumutate de acesta i nerestituite. Spunem c exist date redundante.
Deficienele se datoreaz reinerii ntr-o singur tabel i a informaiilor despre cri
i a celor despre cititori.
Varianta 2
CARTI
(nr_inventar, titlu, autor, editura,
an_intrare, an_ieire)
CITITORI
(cod_cit, nume, adresa, telefon,
nr_inventar, data_imprumutului)
Observaii
Structura bazei de date separ datele n dou tabele (cele despre cri i cele
despre cititori) i permite desfurarea operaiilor de intrare/ieire a crilor i cititorilor.
Dar exist restricia mprumutului unei singure cri, ceea ce nu este deloc credibil.
Dac tot am mers la bibliotec.. .Desigur, putem fixa de la nceput numrul maxim de
cri pe care l-ar putea mprumuta un cititor (s zicem 3!) i structura tabelei CITITORI
ar fi forma (cod_cit, nume, date-personale, cod_carte1, data1, cod_carte2, data2,
Capitolul 2 Baze de date relaionale
29
codcarte3, data3). n aceast situaie, cutarea devine mai dificil, att la restituirea
unei cri (unde valoarea corespunde cu numrul de inventar a crii restituite), ct i
la mprumut (unde este loc liber). n plus, utilizarea memoriei este ineficient nu toi
cititorii au exact 3 cri mprumutate! Observai o astfel de tabel! Pe de alt parte, ce
ne-am face cu o bibliotec unde este permis mprumutul a 20 cri?
Varianta 3
CARTI
(nr_inventar, titlu, autor, editura,
an_intr, an_ies, cod_cititor,
data_imprumut)
CITITORI
(cod, nume, date-pers)
Baza de date separ informaiile despre cri i cele despre cititori. La mprumut se
trece codul cititorului i data, iar la restituirea crii se terg valorile din cmpul Cod
cititor i data mprumutului. Deci putem identifica crile nerestituite prin valoarea
diferit de Null n coloana Carti. Dar este ineficient s parcurgem n bibliotec fiecare
carte pentru a afia restanierii!
Un alt dezavantaj ar fi legat de imposibilitatea obinerii unor situaii de felul care
sunt preferinele cititorului X? sau de cte ori a fost citit cartea Y? care ar necesita
un istoric al imprumuturilor.
Varianta 4
CARTI
(nr-inv, titlu, autor, editura, an_intr,
an_ies)
CITITORI
(cod_cit, nume, date_pers)
OPERATII
(nr_inv, cod_cit, data_imprumut,
data_restituire)
Baza de date separ informaiile relativ constante despre crti i despre cititori i
cele curente, legate de mprumut/restituire. Raiunea acestei separri vine din
periodicitatea diferit de actualizare a datelor din cele 3 colecii. Observm reinerea n
tabela Operaii doar a codului crii i a codului cititorului pentru a putea face referire la
informaiile lungi (detaliate) despre cartea sau cititorul care a mprumutat-o!
30
Este realizat separarea informaiilor vechi (cele de care nu mai avem nevoie dect
accidental, pentru situaiile de felul: crile preferate de o persoan, numrul cititorilor
unei cri, activitatea bibliotecii c numr de operaii ntr-un interval etc.) de cele
recente (cri aflate la cititori).
Faptul c tabela Operaii reine doar crile mprumutate i nerestituite scurteaz
dimensiunea tabelei i, implicit, timpul de accesare. Pe baza ei poate fi cutat rapid o
carte pentru a vedea la cine este sau a afla restanierii.
sarcini de laborator
1.
Cod-elev
1
2
nume_elev
popa
iancu
adresa
iasi
bacau
diriginte
albu
albu
31
2.
specializari
muzica
muzica
foto
film
sporturi
atletism
tenis
atletism
tenis
3.
nume_prof
popa
popa
florea
nume_elev
albu
barbu
doltu
Nr-ore
100
100
200
grad
prof.def
prof.gr.1
lector
4.
nume_sala
biliard
minigolf
tenis
cafenea
taxa
1200
2000
3000
1200
5. Evidena cazrilor turitilor n hotelurile unei staiuni este inut n tabela TURIST.
Este corect evidena?
Turist
apopei eduard
dorneanu mihai
enache sorin
6.
hotel
lido
lido
parc
taxa/loc
1200
1200
1400
depozit
d1
d1
d2
32
bi
as123456
gf345675
bv512345
material
suruburi
suruburi
carcase
furnizor
Astra
Zalau
Metalcar
stoc
10
20
19
Capitolul
Introducere n mediul
FoxPro
Prezentarea general a produsului FoxPro
Interfaa
Configurarea
Obinerea asistenei
Moduri de lucru
Gestiunea fiierelor
33
34
Fereastra de comenzi
Meniul principal sau meniul Sistem permite: operaii cu fiiere (creare, deschidere,
salvare, afiare la imprimant (FILE); operaii legate de editare (EDIT); operaii cu baze de
date (DATABASES/TABLE); operaii relative la programe (PROGRAM); utilizarea
ferestrelor (WINDOW); obinerea informaiilor de asisten, alte utilitare (HELP).
Meniul contextual apare prin clic dreapta pe un item (text,
icon, bar de instrumente) i conine comenzi referitoare la itemul
respectiv (figura 3-2).
Ferestrele standard FoxPro sunt ferestre Windows cu aceleai
caracteristici. Tipurile de ferestre sunt:
Exemple
35
Figura 3-3:
Fereastra Options
Moduri de lucru
Spre deosebire de limbajele de programare algoritmice pe care le-am studiat n anii
anteriori (PASCAL, C), n care, la rezolvarea unei probleme, orict de simple, trebuia
s scriem un program, s-l compilm i s-l lansm n execuie, pachetul de programe
FoxPro ne permite o varietate de modaliti de lucru. Acestea vor fi prezentate pe scurt
n continuare.
Exemplu
37
Exemplu
sarcini de laborator
I.
Intrai n mediul FoxPro; observai meniul principal, selectai diverse opiuni; folosind
fereastra de comenzi, executai cteva operaii:
1.
2.
3.
4.
5.
38
mutare
minimizare
redimensionare
nchidere
expandare
deschidere
Creai cu un editor de texte oarecare un fiier text denumit APLIC.TXT.
Deschidei fereastra de editare a fiierului APLIC.TXT.
Modificai poziia ferestrei de editare; redimensionai fereastra.
tergei vechiul coninut; scriei un alt text. Selectai o zon din acest text i
multiplicai-o de 3 ori.
Selectai o zon din acest text i tergei-o; duplicai textul, crend un alt fiier,
denumit APLIC2.TXT.
Deschidei cele dou fiiere n dou ferestre, prezente simultan pe ecran.
6. Schimbai ntre ele poziiile celor dou ferestre; salvai i nchidei ferestrele.
7. Informai-v asupra opiunii CUT din meniul EDIT prin utilitarul HELP.
8. Aflai ce face comanda CLEAR folosind utilitarul HELP contextual.
9. Capturai o zon a ecranului ntr-un fiier.
10.Deschidei fiierul APLIC2.TXT i ncadrai titlul documentului ntr-un chenar cu
ajutorul caracterelor speciale ASCII.
II.
39
Gestiunea fiierelor
La lansare, SGBD-ul FoxPro este ncrcat n memoria de lucru de ctre sistemul de
operare sub care este instalat i funcioneaz n concordan cu restriciile acestui
sistem de operare. Un fiier este descris n sistemul de operare prin: nume, extensie,
poziie logic pe disc (calea de directoare), dimensiune, data i ora ultimei actualizri,
atributele asociate accesului la fiier, drepturi de acces. Fiierele FoxPro stocheaz
date, programe i informaii pentru generatoarele sistemului. Evidena acestui
ansamblu de fiiere este dificil, mai ales cnd numrul lor este mare.
Utilitarul Project Builder servete la gestiunea fiierelor dintr-o aplicaie Fox. l
putei lansa selectnd File, New, Project din meniul principal sau prin comanda
CREATE PROJECT.
Fereastra principal a utilitarului afieaz un arbore de
directoare standard, construit
dup natura fiierelor ce pot fi
gestionate:
1. Data conine subdirectoare pentru baze de date
(.DBC), tabele izolate
(.DBF), interogri (.QPR).
2. Documents conine subdirectoare pentru formulare (.SCX), rapoarte
(.FRX), etichete (.LBX).
3. Classes conine biblio- Figura 3-4: Fereastra Project Manager
tecile de clase (.VCX).
4. Code conine fiierele de proceduri (.PRG, .FXP).
5. Other conine fiiere auxiliare (.BMP).
Pe baza acestui arbore cu fiierele aplicaiei, putei genera o aplicaie executabil,
aa cum vei vedea n leciile urmtoare. Din fereastra gestionarului de fiiere putei
realiza interactiv operaiile dorite cu fiiere: proiectarea sau crearea unui fiier,
deschiderea n vederea consultrii, a execuiei, a modificrii, tergerea fiierului etc.
Atenie
Utilitarul nu creeaz structura de directoare! Este doar o grupare pe care
o face n funcie de tipul fiierelor.
Cnd ncepei s lucrai la o aplicaie, este bine s v creai o structur de
directoare asemntoare celei din fereastra Project Manager; astfel vei
regsi uor fiierele dup tipul lor!
40
Efect
Schimbarea directorului curent.
ERASE <fis.*>
=CURDIR()
=FILE("<fis>")
=GETFILE()/ =GETDIR()
Exemplu
.set default to d:\fox\exempl
set path to d:\fox, c:\
use elevi
Dir
dir *.*
dir d:\fox\*.txt
!copy *.txt a:
Erase *.txt
rename elevi.dbf to student.txt
?curdir()
Cd getdir()
41
sarcini de laborator
I.
Urmrii comenzile, verificnd dac sunt corecte sintactic i ncercnd s compunei structura discului C. Atenie! Presupunem c apelul FoxPro s-a fcut prin
comanda: C:\>FOX\FOX.EXE, deci directorul curent este rdcina discului C.
! md exemple
dir \fox26\programe\*.prg
set default to exemple
!copy *.txt \texte
! copy con exempl.txt
!copy file elevi.dbf to \*.dbf
copy file exemp.txt to exe.txt !mkdir \bazedate
copy to texte
cd \bazedate
delete file exempl.000
!rd exemple
modify command \program
? curdir()
II.
rename c:\util\tabel.txt to a:
copy file c:\util\tabel.txt to a:\lista.doc
delete file c:\util\tabel.txt
move c:\util\tabel.txt a:\lista.doc
Capitolul
Tipul numeric
Tipul ir de caractere
Tipul dat calendaristic
Tipul logic
Comenzi legate de manevrarea variabilelor i a expresiilor
Principalele tipuri de date cu care lucreaz FoxPro sunt datele numerice, irurile de
caractere, datele logice i datele calendaristice. Datele de tip memo sau de tip general
pot fi definite numai n contextul bazei de date, iar operaiile cu aceste tipuri vor fi
prezentate n leciile urmtoare.
Tipul numeric
Este folosit n diferite variante, alese n funcie de domeniul de valori n care se va
ncadra variabila sau cmpul de acest tip.
Varianta
Numeric
Float
Double
Integer
Currency
Descriere
ntregi sau fracii. Ocup 8 B n memorie. Pn la 20 B n tabela 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.
Operatori
Aritmetici
Relaionali
Efect
Valoarea absolut.
Exemplu: ABS(-15)=15.
<n1> este rotunjit la zecimala al crei ordin e dat de <n2>
Exemplu: ROUND(1.7567,3)=1.757;
Restul mpririi ntregi a lui n1 la n2.
Exemplu: MOD(5,2)=1
Partea ntreag a lui <n>.
Exemple: INT(7.25)=7; INT(7.87)=7
Capitolul 4 Tipuri de date n Visual FoxPro i operaii specifice
43
Aproximare la cel mai mic ntreg mai mare sau egal cu <n>.
Exemple: CEILING(5.87)=6; CEILING(-5.87)=-5
=FLOOR(n)
Aproximare la cel mai mare ntreg mai mic sau egal cu <n>.
Exemplu: FLOOR(5.87)=5; FLOOR(-5.87)=-6
=STR(n1[,n2[,n3]]) Conversie la ir a lui n1; n2 este lungimea; n3 este
numrul de poziii zecimale.
Exemplu: STR(1432.456,12,4)="1432.456"
=CEILING(n)
Tipul ir de caractere
Acest tip este folosit pentru variabilele sau cmpurile care conin caractere ASCII
delimitate prin apostrof, ghilimele sau paranteze ptrate.
Exemplu: "Scarlet OHara"
Operatori
De concatenare + (concatenarea irurilor);
Exemplu: [buna ]+'dimineata'='buna dimineata'
- (concatenare cu mutarea spaiilor de la sfritul primului ir la
sfritul irului rezultat
Exemplu: [buna ]-'dimineata'=[bunadimineata ]
Relaionali
<; <=, >, >=, =, # sau !=, sau <> (diferit) $ (inclus)
Exemple: [alb] = 'albastru returneaz adevrat pentru
SET EXACT OFF; [alb] = 'albastru' returneaz fals
pentru SET EXACT ON; [alb] $ 'albastru'=adevarat
=LEFT/RIGHT(s,n)
=LEN(s)
=LTRIM/RTRIM/
ALLTRIM (s)
=AT(s1,s2)
=LOWER/UPPER/
PROPER(s)
44
Efect
Extrage un subir din irul <s> ncepnd cu caracterul
de pe poziia <n1>, de lungime <n2>.
Exemplu: SUBSTR('ABCD',2,2)='BC'
Extrage primele/ultimele <n> caractere din irul <s>.
Exemple: LEFT("ABCD",2)="AB"
RIGHT('ABCD',2)='CD'
Returneaz lungimea irului <s>.
Exemplu: LEN('ALFA')=4
Elimin spaiile de la stnga irului (LTRIM), de la
dreapta irului (RTRIM) sau din ambele pri (ALLTRIM).
Exemplu: LTRIM('
MIA ')="MIA "
Returneaz poziia irului <s1> n <s2>.
Exemplu: AT('NR','str Ploii nr 5')=0;
Transform irul n minuscule/majuscule/tip titlu.
Exemple: LOWER('VARA')='vara'
UPPER('galben')='GALBEN'
PROPER('ana maria')='Ana Maria'
=VAL(s)
=OCCURS(s1,s2)
45
Tipul logic
Acest tip este folosit pentru variabile sau cmpuri ce pot avea doar dou valori,
notate .T. (true=adevrat) i .F. (false=fals).
Operatorii logici sunt OR, AND, NOT sau !
=BETWEEN(e1,e2,e3)
=EMPTY(e)
INLIST(e1,e2[,e3...])
Efect
Calculeaz extremul dintre valorile <e1>, <e2>,...
Exemple: max(14,3)=14; min(14,3,15,6)=3
Returneaz litera corespunztoare tipului de dat.
Exemplu: TYPE ("12")=N; TYPE("[12]")=C
Dac e1=.T. returneaz e1, altfel returneaz e2.
Exemplu: IIF(3=5,"corect","incorect")=
"incorect".
Testeaz dac e1 aparine intervalului (e2,e3).
Exemplu: BETWEEN(3,0,20)=.T.
Testeaz dac expresia dat ca parametru este vid.
Exemple: Empty("")=.t.; empty({//})=.t.;
empty(5)=.f.
Testeaz dac e1 aparine listei date de urmtorii
parametri.
Exemple: inlist(2,1,2,3,4)=.t.;
inlist('d','a','b','c')=.f.
Gestiunea variabilelor
O variabil de memorie reprezint o modalitate prin care FoxPro depoziteaz i
utilizeaz temporar date ntr-un program. Variabilele utilizator sunt zone de memorie
crora li se atribuie un nume, un tip i o valoare. Numele variabilei este un ir de
caractere alfanumerice. Tipul variabilei este atribuit acesteia odat cu valoarea.
Tablourile sau masivele de date sunt structuri statice neomogene. Pot avea cel
mult dou dimensiuni.
Declararea tablourilor
DIMENSION / DECLARE <tablou(dim1[,dim2])>,.>
Iniializarea unui tablou se face odat cu declararea dimensiunii la valoarea .F. Alt
iniializare global a tuturor elementelor unui tablou se poate face prin comanda STORE.
O matrice se poate redimensiona fr ca prin aceast schimbare s i se reiniializeze
componentele.
Exemplu:
dimension a[2, 2]
store 5 to a
&& o matrice ptrat 2x2 este iniializat pe valoarea 5
dimension a[3, 3]
&& redimensionare
?a[1,1],a[1,2],a[1,3],a[2,1],a[2,2],a[2,3],a[3,1],a[3,2],a[3,3]
5
46
f.
.f.
.f.
.f.
.f.
Efect
Definirea dimensiunii tabloului ca numr total de
elemente (dac n=0), numr de linii (dac n=1), sau
numr de coloane (dac n=2).
=ains(T,P[,N])
Inserare n tabloul T pe poziia P a unui element (dac lipsete
N), a unei linii (dac N=1), a unei coloane (dac N=2).
=adel(T,P[,N])
tergerea unui element (dac lipsete N), a unei linii
(dac N=1), a unei coloane (dac N=2).
=ascan(T,E[,P[,L]]) Returneaz poziia unei expresii E prin cutarea n tabloul T,
ncepnd de la poziia P pe lungimea L.
=acopy(T1,T2[,P[,L]]) Copierea elementelelor din T1, ncepnd cu cel de pe
poziia P pe lungime L n tabloul T2.
=asort(T,[P[,L[,N]]]) Sortarea unui tablou T n mod cresctor (dac N=0) sau
descresctor (dac N0), ncepnd cu elementul de pe
poziia P pe lungimea L.
Exemplu
Sarcina
Inserarea unei linii pe poziia 3 din A
Inserarea unui element pe poziia 4 din B
Inserarea unei coloane pe poziia 1 din A
tergerea elementului al 4-lea din B
tergerea liniei 3 din A
tergerea coloanei 2 din A
Rezolvare
=ains(a,3)
=ains(b,4)
=ains(a,1,2)
=adel(b,4)
=adel(a,3)
=adel(a,2,2)
Efect
B(1, 3, 5, 7, 10) cresctor ntregul tablou
B(10, 7, 5, 3, 1) descresctor ntregul tablou
B(7, 5, 3, 1, 10) descresctor, primele 3 elemente
B(3, 5, 1, 7, 10) cresctor, ncepnd de la poziia 3
sortare descresctoare dup coloana 3
sortare cresctoare dup coloana 3
sortare cresctoare a liniilor 3 i 4 dup valorile coloanei 2
Variabilele pot fi locale (private) unei uniti funcionale sau globale (publice),
recunoscute de toate unitile funcionale subordonate.
Declararea variabilelor publice:
PUBLIC [ARRAY] <lista-var>
Dac variabilele sunt tablouri, se specific clauza ARRAY.
Declararea variabilelor private:
PRIVATE/LOCAL <lista-var>/ALL LIKE/EXCEPT <sablon>
Clauza ALL LIKE permite declararea privat a tuturor variabilelor care verific un
anumit <sablon>. Clauza ALL EXCEPT declar ca locale toate variabilele definite n
modul, cu excepia celor care verific <sablon>.
Capitolul 4 Tipuri de date n Visual FoxPro i operaii specifice
47
? <lista-expresii> AT <col>
@ <r,c> SAY <exp>
RELEASE <lista_var> /
ALL [LIKE/EXCEPT <sablon>]
SAVE TO <fis.mem>
[ALL LIKE/EXCEPT <sablon>
RESTORE FROM <fis.mem>
[ADDITIVE]
WAIT [<mesaj>] [TO <var>]
[WINDOWS] [NOWAIT]
=MESSAGEBOX(<mesaj>)
Efect
Se atribuie variabilei valoarea expresiei.
Comanda Store permite atribuiri multiple.
Comad de citire. Variabila primete
valoarea i tipul expresiei introduse de la
tastatur.
Comanda de citire a unei variabile de tip
caracter.
Comanda de editare a unei variabile sau
cmp al unei tabele la execuia comenzii
READ. <r,c> specific poziia pe ecran
a variabilei. PICTURE specific un ablon
de editare; DEFAULT este valoarea iniial;
VALID este condiia de validare.
Permite afiarea expresiilor pe linia curent,
ncepnd din coloana specificat.
Afieaz valoarea expresiei <exp>
ncepnd din punctul <r, c>.
tergerea unei liste de variabile sau a
tuturor sau a celor ce verific un ablon.
Salvarea pe disc n fiierul .mem
a variabilelor.
Restaurarea prin suprascriere sau
adugare a variabilelor din fiierul .mem
n zona de lucru.
Pauz n program cu afiarea unui mesaj
(eventual ntr-o fereastr); tasta apsat
este transmis variabilei <var>.
Funcie pentru afiarea unui mesaj.
Lucrul cu imprimanta
Sunt disponibile dou comenzi care direcioneaz efectul comenzilor de afiare
ctre imprimant.
Comanda
SET PRINTER ON/OFF
SET DEVICE TO PRINTER/ TO SCREEN
48
Efect
Activarea/dezactivarea imprimatei.
Direcionarea comenzii ctre imprimat
sau ecran.
Exemple
Comenzi
store 0 to a, b, c
b=alfa
? "a=",a
x={01. 09. 95}
@ 1,5 say "data="+dtoc(x)
input "nume?" to nume
accept "nume?" to nume
accept "varsta?" to v
release all like a*
save to beta all like a
@ 2,2 get b picture 99.99
default 2.00 valid b<=10.00
read
set printer on
? 'text'
Set device to printer
Set printer on
@ 1,5 say 'text'
Efect
Variabilele numerice a, b, c sunt iniializate
cu valoarea zero; este modificat
coninutul i tipul variabilei b.
Se afieaz a=0.
Se creeaz variabila x de tip dat calendaristic.
Se afieaz din punctul 1,5 expresia
data=01091995.
Pentru citirea unui ir trebuie dai i
delimitatoriii acestuia.
Nu mai este nevoie de delimitatori.
Atenie! Vrsta va fi tot de tip caracter.
Se terg variabilele care ncep cu a.
Se salveaz n fiierul beta.mem variabila a.
Se afieaz o zon de editare i se
ateapt introducerea valorii pentru
variabila b; iniial variabila b=2.00;
nu se prsete zona de editare dac
valoarea introdus este mai mare ca 10.
Se direcioneaz efectul comenzii de
afiare ? ctre imprimant.
Se direcioneaz efectul comenzii de
afiare @ ctre imprimant.
Exemple
Alfa='elevi'
Beta='alfa'
? beta
alfa
? &beta
elevi
use alfa
use &alfa
49
sarcini de laborator
1.
a=1234
b=mod(a,23)
lung=5
zecim=3
? str(a,lung,zecim)
? str(a,3)
? str(b, lung)
? str(b,10,zecim)
? str(b,lung)
2.
Urmrii rezultatul afiat n fiecare caz. Ce efect are comanda SET EXACT?
a='abcd-'
b='ef-gh'
c=a+b+'*'
d=a-b+'*'
?c, d
e=b-a+'*'
f='bc'
3.
4.
set century on
? year(x), x
? dmy(x)
? mdy(x)
?
?
?
?
cmonth(x)
cdow(x)
len(month(x)
ymd(x)
x=time()
h=val(left(x, 2))
m=val(substr(x, 4, 2))
s=val(right(x, 2))
y=str(h,2) + ":"+ iif(len(alltrim(str(m)))==1, 0'+;
str(m, 1), str(m, 2))+ ":"+ iif(len(alltrim(str(s)))==1, "0"+;
str(s, 1), str(s, 2))
5. Pentru o dat calendaristic primit din exterior sub forma luna/zi/an prin
instructiunea ACCEPT s se afieze sub formatul anul:ziua:luna.
6.
Pentru o dat calendaristic primit din exterior sub forma luna/zi/an prin
instruciunea INPUT s se afieze sub formatul anul:ziua:luna.
7.
Introducei n variabila AZI data curent i afiai numele zilei de azi, de ieri i de mine.
8.
9.
Care sunt funciile care permit afiarea numrului N=145.567 sub forma
urmtoarelor iruri:
"145.567"
" 145.57"
"145.56"
"0.14"
" 146"
"145"
"291"
"14.567"
" 145.6"
"-14"
"567"
"0.00145"
11. tiind c la o staie PECO s-a format o coad de n maini i c timpul de servire
cu benzin a unei maini este n medie X minute, aflai ct timp va atepta ultima
main n zile, ore i minute.
12. La un magazin trebuie s se achite suma S n hrtii de valoare 10000, 5000 sau
1000 uniti monetare (u.m.). Care va fi numrul minim de bacnote de fiecare valoare
pentru acoperirea sumei i ce rest (n monede de 100 u.m.) primete clientul?
Exemplu: Dac S=126400, clientul va plti 12*10000+1*5000+2*1000 i va primi rest 600 lei.
13. Se dau trei numere, reprezentnd laturile unui triunghi. Afiai ce fel de triunghi
este: dreptunghic, ascuitunghic, obtuzunghic.
Urmrii rezolvrile propuse i corectai dac este cazul erorile!
*varianta I*
&& a, b, c sunt date numerice citite deja!
x=a^2
y=b^2
z=c^2
?iif(x=y+z or y=x+z or z=x+y, 'drept', iif(x<y+z and y<x+z and
z<x+y,; 'ascutit',iif(x>y+z or y>x+z or z>x+y, 'obtuz', '')))
*varianta a II-a*
lmax=max(a, b, c)
lmin=min(a, b, c)
lmijl=iif((lmax=a and lmin=b) or (lmax=b and lmin=a),;
c, iif((lmax=a and lmin=c ) or;
(lmax=c and lmin=a), b, a))
ncercai s vedei efectele noilor funcii
l1=lmax^2
standard care apar prin asistentul Help!
l2=lmin^2
l3=lmijl^2
?iif(l1=l2+l3, 'drept', iif(l1<l2+l3, 'ascutit', 'obtuz')
*varianta a III-a*
a1=acos((b^2+c^2-a^2)/(2*b*c))
a2=acos((a^2+c^2-b^2)/(2*a*c))
a3=acos((a^2+b^2-c^2)/(2*a*b))
x=max(a1, a2, a3)
?iif (x=pi()/2,'drept',iif ( x<pi()/2), 'ascutit','obtuz' ))
*varianta a IV-a*
lmax=max(a,b,c)
l2l3=iif(max=a,'bc',iif(max=b,'ac','ab')
l2s=left(l2l3,1)
l3s=right(l2l3,1)
l2=evaluate(ls)
l3=evaluate(l3s)
?iif(lmax^2=l2^2+l3^2,'drept',iif(lmax^2<l2^2_l3^2,'ascutit'; ,'obtuz'))
Capitolul 4 Tipuri de date n Visual FoxPro i operaii specifice
51
Capitolul
Crearea tabelelor
nume de coloan
= FIELD NAME
ELEVI.DBF
cod
nume
med
cls
......
101
TOMA
7.04
12a
......
102
VLAD
4.50
11b
......
antetul tabelei
= STRUCTURE
o linie n tabel
= RECORD
n acest fel, tabela (relaia) este definit ca fiier secvenial cu extensia .DBF,
avnd articole de lungime fix i, ca prim nregistrare, un antet care reine structura
tabelei. Celelalte articole conin datele propriu-zise ale tabelei.
O baz de date este definit ca o colecie de tabele relaionate, mpreun cu indecii,
procedurile stocate i imaginile asociate tabelelor. Extensia acestui fiier este .DBC.
Proiectarea structurii unei tabele se poate realiza direct, prin definirea direct a
cmpurilor n cadrul comenzii CREATE TABLE, sau interactiv, prin comanda-ecran CREATE.
a. Comanda CREATE permite proiectarea interactiv a structurii. Din meniul sistem,
selectai File, New, Table. Apare fereastra de dialog Table Designer. Fereastra are trei
seciuni (tab-uri), dintre care vom lucra deocamdat doar cu tab-ul Fields, care permite
definirea informaiilor de structur. Astfel:
a) Name permite introducerea numelui cmpului pn la 10 caractere;
b) Type permite introducerea tipului de dat al cmpului poate fi numeric,
caracter, logic, dat calendaristic, Memo, General etc.;
c) Width permite specificarea altei lungimi a cmpului dect cea implicit;
d) Decimal permite introducerea numrul de poziii zecimale;
1 Sunt folosite i acceptate n domeniu denumirile tabel i tabel, convenie pe care o urmm i n manual.
52
Cmpul este
reper index
Schimbarea
ordinii
cmpurilor
Tipul cmpului se
alege dintr-o list
nchis
Lungimea i numrul
de poziii zecimale
Cmpul poate
conine valori video
e) Index permite crearea unui index avnd cmpul curent drept cheie;
f) NULL este un comutator pentru acceptarea sau nu a valorilor nule.
b. Comanda CREATE TABLE permite specificarea direct a structurii:
CREATE TABLE/ DBF <fis.dbf> (<lista-definitii>)
<definitie>:=<nume-cmp> <tip>[([<lungime>], <zecimale>])]
Exemplu: Fie tabela ELEVI.DBF
nume
pren
cls
camin
absn
c, 20
c, 20
c, 3
l, 1
n, 2
Comanda de creare a acestei tabele este:
med
n, 5, 2
adr
m, 10
dn
d, 8
sit
c, 10
create dbf elevi (nume C(20), pren C(20), cls C(3), camin L,
absn N(2), med N(5,2), adr M, dn D, sit C(10))
Exemple
Interogri
Analiza
53
55
Exemple
Select 2
use profesori
modify structure
Filtrarea articolelor
Operaia de filtrare a articolelor care vor suporta efectul unei comenzi este realizat
prin clauzele: <domeniu>, FOR, WHILE. Dac aceeai selecie va fi folosit de mai
multe ori, este util comanda:
SET FILTER TO [<cond>]
Comanda permite accesul numai la articolele care ndeplinesc condiia <cond>.
Spunem c se deschide un filtru pe baza de date, care va fi activ pn cnd se
nchide baza de date (prin USE, CLOSE DATABASES) sau se nchide filtrul prin SET
FILTER TO.
56
Studiu de caz
BIBLIOTECA
Relum activitatea de proiectare a structurii tabelelor, innd cont
de informaiile solicitate i rezolvarea cererilor.
4. Sunt i profesori de la
Liceul de Informatic inscrii
la bibliotec?
sarcini de laborator
I.
II.
data
d,8
furnizor
c,10
adr
c,10
tel
n,8
valoare
n,8
Capitolul 5 Crearea tabelelor
57
Dac dorim s cunoatem informaiile despre un furnizor, le vom putea obine doar
dac acesta are facturi neachitate. Este firesc? Cum se poate schimba structura astfel
nct s eliminm aceast anomalie? Cum se numete operaia?
1. Introducei date prin APPEND. Adugai valori fictive n cmpurile Furnizor, adr,
tel pe toat lungimea atributelor. Observai trecerea automat la urmtorul cmp
la depirea lungimii declarate a cmpului curent. Observai avertizarea sonor.
2. Lansai comanda SET CONFIRM ON; reluai adugarea de valorilor; observai
terminarea lungimii unui cmp; se trece automat la urmtorul cmp?
3. Vrem s introducem mai multe facturi ale aceluiai furnizor, deci numele, adresa
i telefonul se vor repeta. Pentru a facilita introducerea datelor, ncercai
comenzile SET CARRY TO i SET CARRY ON/OFF.
4. Lansai comanda SET DATE cu diferite formate, prelund formatul general din
HELP. Observai schimbarea datei calendaristice peste tot n tabel, sub efectul
momentan al comenzii.
5. Modificai structura, schimbnd tipul cmpului NRFACT la ir, iar numele la NRF.
Afiai datele. Ce se ntmpl cu valorile din primul cmp?
6. Modificai cmpul FURNIZOR prin redimensionarea la 4 caractere. Afiai.
Modificai lungimea cmpului VALOARE prin micorare la 4 poziii. Afiai.
7. Schimbai ordinea cmpurilor, punnd pe prima poziie numele furnizorului i
apoi numrul facturii. Afiai. S-au piedut valori?
III. Evidena judectorilor din diferite judectorii i a activitaii fiecrui judector este
inut n fiierul JUDECATORI. Proiectai structura necesar pentru a afla:
1.
2.
3.
4.
5.
Cte cazuri de trafic de valut au fost anul acesta comparativ cu anul trecut?
Care au fost dosarele n care verdictul a fost achitat?
n ce dosare s-a dat pedeapsa maxim?
La ce dosare (cazuri) a lucrat persoana X?
Cte dintre cazurile la care a lucrat anchetatorul X au fost abandonate?
58
Capitolul
Vizualizarea, cutarea
i sortarea datelor
Efect
Specific toate articolele fiierului.
Urmtoarele <n> articole fa de articolul curent.
Toate articolele pn la sfritul fiierului.
Selecteaz doar articolul cu numrul <n>.
Exemplu
#
cods
1
1
2
2
3
3
4
4
5
5
Go top
numes
grupa
Dumitru Alina
1
Luca Stefan
1
Amarandei Ion
1
Alexa Ioana
2
Nucu Mary
3
&& poziionare pe primul
anul
1
1
2
1
2
articol
numec
info
mate
info
engleza
chineza
59
List "*", grupa, "*", numes while anul =1 && afiare ct vreme anul=1
#
1
2
*
*
*
grupa
1
1
*
*
*
nume
Dumitru Alina
Luca Stefan
List "*", grupa, "*", numes for anul =1 &&afiare studeni din anul=1
&& observai rspunsul sistemului
#
1
2
4
*
*
*
*
grupa
1
1
2
*
*
*
*
nume
Dumitru Alina
Luca Stefan
Alexa Ioana
numec
info
mate
engleza
Exemplu
#
1
2
60
cods
1
2
grupa
1
1
anul
1
1
numec
info
mate
3
4
5
3
4
5
Amarandei Ion
Alexa Ioana
Nucu Mary
1
2
3
2
1
2
info
engleza
chineza
Use student
? recno()
1
skip -1
? bof()
.T.
locate for anul=2
? eof ()
.F.
display numes
Amarandei Ion
continue
display numes
Nucu Mary
continue
End of locate scope
? eof ()
.T.
Deschiderea tabelei
Poziionare pe pe primul articol
?lookup(numes,1,grupa)
Dumitru Alina
Skip 1
?lookup(numes,1,grupa)
Dumitru Alina
Devans cu o poziie
funcia BOF ntoarce true
Cutm un student din grupa 2; poziionarea s-a
facut n interiorul fiierului:
funcia eof() returneaz fals.
Afim articolul cutat
Cutm un alt student din grupa 2
Atenie
Operaia de sortare duplicheaz datele! Este preferabil ca dup folosirea rezultatelor sortrii s tergei fiierele de manevr i s pstrai baza de date iniial.
Capitolul 6 Vizualizare, cutare, sortare
61
b. Comanda COPY permite copierea ntregului coninut al unei tabele (sau o parte
din ea) n alt tabel.
COPY TO <fis.dbf> [FIELDS <lista-cmp>][STRUCTURE]/
[[<domeniu>] [FOR <conditie>] [WHILE <conditie>]]
Articolele tabelei active vor fi copiate ntr-o nou tabel, al crei nume este precizat
n clauza TO <fis.dbf>. Clauzele de selecie a cmpurilor (FIELDS) i de filtrare
<domeniu>, FOR, WHILE permit fixarea structurii i a coninutului noii tabele.
Exemple
1. Dorim afiarea elevilor din Iai pe clase, pentru fiecare clas n ordinea
descresctoare a mediilor, iar la medii egale n ordine alfabetic.
Considerm structura Elevi(cod N(5), nume C(10), clasa C(3), adresa M, Media N(5,2)).
Use elevi
Sort on cls/ac, media/d, nume/ac to man for "iasi" $ adresa
Use man
List
2. Dorim spargerea tabelei Elevi n dou tabele, Caminiti i Externi, fiecare din ele
avnd datele ordonate alfabetic.
Use elevi
Sort on nume to man
Use man
Copy to caminist for caminist
Copy to externi for not caminist
Use
Erase elevi.dbf
Erase man.dbf
3. Relum interogrile2 folosite la identificarea tipurilor de date n baza de date
BIBLIOTECA i le rezolvm. Vom deschide tabele n trei zone:
Use carti in 1
Use cititori in 2
Use operatii in 3
a) Care sunt crile
existente (ordonate
dup autori)?
sele 1
sort on autori to man
use man
list titlu,autori,editura,colectia,pret
sele carti
list titlu, autori for an-intrare>=1994 or;
an-iesire>=1994
sele carti
list for colectie=dragoste
sele 2
list for year(date())-year(data-nastere)<15
62
Sele cititori
e) Sunt i profesori de la
Liceul de Informatic nscrii Locate for ocupatie="prof" and;
loc-munca="informatica"
la bibliotec?
? iif (found() "da", "nu")
f) Sunt restanieri?
sele operatii
set filter to empty(data-rest) and;
date()-data-impr>14
copy to man
use man in 4
? iif (reccount(4)=0,"nu", "da")
sele operatii
go bottom
sele carti
? lookup(titlu, a.cod-carte, b.cod-carte)
sele cititori
?? lookup(nume, a.cod-cititor, c.cod-cititor)
sarcini de laborator
I.
Sarcini3:
1. Afiai echipele n care a jucat Popescu i cnd.
2. Afiai arbitrii care au fost la primele 3 meciuri.
3. Afiai unde a arbitrat Popescu, la ce meciuri, cnd.
4. Afiai echipele din grupa A.
5. Afiai componena echipei RAPID (la ultimul joc).
6. Afiai localitile unde a jucat sau va juca echipa Rapid.
7. Afiai echipele care au jucat acas i au pierdut.
8. Afiai componena echipelor care joac la data {01.06.99}, pe stadionul
Plieilor. Presupunem c este un singur meci.
9. Afiai cpitanii celor dou echipe care joac n primul meci nregistrat
(presupunem c prima persoana trecut n fiier la o echip este cpitanul).
10.Doi prieteni fotbaliti, Albu i Barbu, se ntlnesc n campionat de dou ori (tur i
retur). Aflai data i locul.
11.Listai programul competiional de sptmna viitoare ordonat cronologic.
12.Afiai meciurile dup numele echipei (care joac acas), iar pentru fiecare
echip dup data desfurrii.
3
63
II.
tip imobil
suprafaa
nr apartamente
tip nclzire
64
Capitolul
Actualizarea datelor
Adugarea articolelor
tergerea articolelor
Modificarea sau corectarea datelor
Actualizarea interactiv a tabelelor
Lucrul cu cmpurile de tip Memo
Lucrul cu cmpurile de tip General
Adugarea articolelor
Adugarea articolelor se face la sfritul tabelei active, fie prelund datele n mod
interactiv, prin introducerea lor direct de ctre operator, fie din alt tabel Fox, fie dintr-un
masiv (tablou de memorie), fie chiar din alt tip de fiier (Excel, text etc.). Vom discuta
pe rnd toate aceste modaliti de adugare a datelor pe parcursul mai multor lecii.
a. Adugarea unui articol vid. Un cmp vid are una dintre valorile: zero pentru
cmpul numeric, spaiu pentru cmpul caracter, .F. (fals) pentru cmpurile logice,
valoarea {} sau { / / } pentru dat calendaristic. Comanda de adugare
este APPEND BLANK.
b. Comanda APPEND FROM pemite adugarea la tabela activ a datelor din alt
tabel, specificat n clauza FROM.
APPEND FROM <fis.dbf> [FOR <cond>] [FIELDS <lista-cmp>]
n mod implicit, sunt preluate toate cmpurile. Condiia din clauza FOR este testat
dup plasarea articolului pe noua structur. Clauza FIELDS permite selectarea
cmpurilor care vor fi folosite la adugare.
Exemplu
#
1
2
3*
cods
10
2
5
grupa
1
1
5
anul
1
1
2
numec
info
mate
italo
Use studenti
Append from concurs
from admis
use concurs
copy to man for admis
use studenti
append from man fields
nume,bi,media
65
tergerea articolelor
Operaia de tergere a articolelor dintr-o tabel activ se realizeaz n dou etape:
Etapa 1. Are loc o tergere logic sau o marcare pentru tergere, care poate fi
ignorat sau nu de comenzile de cutare sau afiare i care poate fi anulat prin
comanda RECALL.
Etapa 2. Are loc o tergere fizic efectiv, situaie n care datele sunt pierdute definitiv.
a. Comanda DELETE marcheaz pentru tergere articolele care ndeplinesc
condiiile de filtrare. Comanda acioneaz pe articolul curent.
DELETE [<domeniu>] [FOR<cond>] [WHILE<cond>]
Marcarea pentru tergere nu influeneaz nici comanda de afiare (observm *
naintea primului cmp!), nici o eventual cutare prin LOCATE, o copiere (COPY) sau
o sortare (SORT) etc. Acest lucru se datoreaz valorii OFF pe care este poziionat
implicit comanda comutator SET DELETED ON/OFF. Setarea comutatorului pe valoarea
ON determin ignorarea articolelor marcate pentru tergere.
Pentru a afla dac un articol este sau nu marcat pentru tergere se folosete funcia
DELETED([<zona>]) care returneaz .T. dac articolul curent din zona indicat prin
<zona> este marcat pentru tergere.
b. Comanda PACK permite tergerea fizic din fiier a tuturor articolelor marcate
anterior, fr posibilitatea de recuperare a datelor. Clauza MEMO este folosit pentru
diminuarea spaiului de disc nefolosit din fiierul Memo asociat, fr a afecta baza de
date. Clauza DBF este folosit la tergerea articolelor marcate din baza de date, fr a
modifica fiierul Memo asociat.
PACK [MEMO][DBF]
c. Comanda ZAP permite tergerea definitiv din fiier a tuturor articolelor, fr
marcarea prealabil.
d. Comanda RECALL permite revenirea unui articol la starea anterioar operaiei de
tergere, numai n cazul unei tergeri logice.
RECALL [<domeniu>] [FOR<cond>] [WHILE<cond>]
Aciunea comenzii are articolul curent ca domeniu implicit.
Exemplu
use student
delete for cods>=5
recall all for grupa # 1
pack
66
use studenti
delete record 3
list
Exemplu
#
1
2
3
cods
11
23
34
grupa
1
1
1
anul
1
1
2
fac
info
mate
info
use student
repl all cods with recno() && modificm peste tot codul la numar articol
repl grupa with 4, anul with 5 for numes=[Luca]
list
&& observai corecia fcut!!
#
1
2
3
cods
1
2
3
Numes
Dumitru Alina
Luca Stefan
Amarandei Ion
grupa
1
4
1
anul
1
5
2
fac
info
mate
info
67
Pe prima linie sunt afiate denumirile cmpurilor din structura tabelei, iar n
continuare sunt liniile cu date.
Formatul comenzii cu cele mai uzuale clauze este:
BROWSE [FIELDS <cmp1> [:R][:V][<cmp-calc1>=<exp1>]
[LOCK < nr>][<domeniu>][FOR <conditie>][FREEZE <nume-cmp>]
[NOAPPEND] [NOMENU] [NOEDIT] [NODELETE]
Clauza FIELDS permite enumerarea cmpurilor care vor forma coloanele
tabelului; n lipsa clauzei se rein toate cmpurile din baza de date, n ordinea
structurii. Pentru un cmp putem interzice editarea [:R] sau putem preciza
condiia de validare la introducerea valorilor n cmpul respectiv [:V]. n lista de
cmpuri pot aprea i cmpuri calculate care primesc un nume i o expresie de
calculare. Cmpurile calculate nu pot fi editate, ci numai afiate, dar valorile din ele
se modific odat cu modificrile n cmpurile ce formeaz expresia de calculat.
Clauzele <domeniu> i FOR permit selectarea liniilor care vor fi afiate n
fereastr dup comanda Browse.
Clauza LOCK <nr> permite nghearea pe ecran a primelor <nr> coloane
(cmpuri) n timpul derulrii prin BROWSE spre stnga sau spre dreapta. Se
recomand ca n structura conceptual s fie afiate informaiile de identificare
a unui obiect la nceput. Dac, totui, acest lucru nu este realizat, putem schimba
ordinea de afiare pe ecran a cmpurilor prin clauza FIELDS, astfel nct s
avem pe primele coloane succesive informaiile necesare.
Clauza FREEZE <nume-cmp> permite meninerea cursorului pe o singur coloan.
Clauza NOAPPEND interzice adugarea de noi articole n fiier; n lipsa clauzei
este posibil adugarea.
NOMENU nu afieaz linia de meniuri i impiedic accesul la meniuri.
NODELETE impiedic tergerea accidental de articole.
NOEDIT interzice editarea articolelor.
Exemplu
68
Fie fiierul ELEVI.DBF(Matr N(3), nume C(10), cls C(3), adr M, camin L,
poza G, absm N(2), absn N(2), foto G, med N(5,2)). Sarcini:
Browse lock 3
Pentru separare, se poziioneaz cursorul n colul din stnga jos (colorat cu negru)
i se trage partiia pn la obinerea dimensiunii dorite. Cele dou partiii pot avea o
evoluie independent sau nu (Link Partitions).
69
Studiu de caz
BIBLIOTECA
Studiul de caz conine prezentarea operaiilor de actualizare
pentru baza de date analizat:
1. Scoaterea din evidena bibliotecii a unui cititor se face la cererea sa. Se vor terge i
articolele din tabela Operaii. Dac are restane, va aprea un mesaj.
Se citete numele cititorului care se
retrage.
Sele cititori
Cod=lookup(cod_cit, x, nume)
Delete all for nume=X
Pack
Sele operatii
Set filter to cod_cit=y
Copy to man2 for empty(data_rest)
Delete all
Pack
Use man2 in 4
? IIf(reccount(4) #0,"sunt restante","")
Select operatii
Append blank
Replace cod_carte with codx, cod_cit
with cody, data_impr with date()
Select operatii
Locate for cod_carte=x and cod_cit=Y
and data_rest={//}
replace data_rest with date()
70
accept
Accept
Accept
Accept
"cod-cititor" to X
"nume? " to y
"adresa?" to Z
"data nasterii?" to w
Select cititori
Append blank
replace cod_cit with val(x)
replace nume with y, adresa with y
replace data_n with ctod(w)
Select carti
delete for uzat
copy to deterior for deleted()
pack
Use manuale
Replace all alte_inf with "manual"
Use carti
Append from manuale
Use
Delete file manuale.dbf
Use carti
List for alte_inf=manual" to print
Var 2.prg
use carti n 1
use carti n 2 again
sele 1
locate for cod_carte=200
sele 2
append blank
replace b.titlu with a.titlu
replace b.autor with a.autor
....etc se vor copia toate campurile
sele 2
use
sele 1
delete
pack
Var 1.prg
use carti
copy to man for
cod_carte=200
pack
append from man
erase man.dbf
71
sarcini de laborator
I.
tiind c mai sunt manuale colare n tabela LICEU (Cod, titlu, clasa, autor,
editura, pret) adugai articolele n tabela CARTI.DBF (inventar, titlu, autor, pre,
editura, data-intrrii, data-ieirii, uzat, alte_inf). Titlul crii n tabela CARTI va conine
i clasa pentru care este manualul (de exemplu, Informatic clasa a IX-a).
LICEU.DBF
Titlu
Cls
Autor
Editura
pret
Informatica
IX
T.Sorin
L&S infomat
57000
Informatica
X
M.Cerchez
Polirom
45000
Care dintre cele dou variante rezolv problema?
Varianta 1.
Varianta 2.
use liceu
copy to man for cls=IX
use man
replace all titlu;
with alltrim(titlu)+ "cls."+ cls
use carti
append from man
erase man.dbf
use liceu
dele for between(cls, 9, 12)
repl titlu with;
titlu+cls for deleted()
use carti
append from manuale;
for deleted()
III. Fie un fiier PERSONAL inut pentru o societate, cu urmtoarele informaii (cod,
nume, numr-buletin, salar, data-naterii, nr_copii, alocaia, costul-ora-noapte, numrnopi, suma-spor-noapte, reineri, rest-plat). Se cere:
1.
2.
3.
4.
72
nume
funcie
rest-plat
semntura
studii
POPA
ADR1
IONEL
ADR2
PERSONAL.FPT
Academia de Sudii Economice
Facultatea de Cibernetic, Bucureti
Liceul de Informatic, Iai
Efect
Deschiderea unei ferestre de editare pentru
fiecare cmp Memo dintr-o list dat.
Capitolul 7 Actualizarea datelor
73
Comanda
APPEND MEMO <memo>
FROM <fisier> [OVERWRITE]
Exemple
#
1
2
3
cods
1
2
3
Efect
Introducerea datelor dintr-un fiier text n
cmpul Memo. Clauza Overwrite este
necesar cnd dorim suprascrierea coninutului
fiierului text peste vechiul coninut al cmpului
Memo. Operaia implicit este de adugare.
Extragerea dintr-un cmp Memo a informaiilor
ntr-un fiier text. Operaia implicit este de
suprascriere. Dac dorim ca vechiul coninut s
nu se piard, trebuie folosit clauza ADDITIVE.
grupa
1
1
1
anul
1
1
2
alte_inf
Memo
Memo
Memo
Vrem s afim informaiile din cmpul alte_inf pentru persoanele din Iasi.
Observai plasarea numelui de cmp Memo n comanda List!
use student
list alte_inf for Iasi$alte_inf
Record# ALTE_INF
1
adresa: Iai, str. Vasile Alecsandri nr 13
telefon: 245678
buletin: seria AD, numr 457890
3
74
Varianta 2
use telefon
nrtel=lookup(telefon,;
"Dumitru Alina", nume)
use student
repl alte_inf;
with adresa +str(nrtel);
for numes="Dumitru Alina"
Vom crea o tabel fictiv cu un cmp Memo n care vom copia fiierul text. Folosim
funcia Strtran care caut toate apariiile unui ir parametru 2 i le
nlocuiete cu alt ir parametru 3.
Observai programul urmtor:
Create table x(cmp M)
Append blank
Append memo cmp from date_pers.txt
Replace cmp with strtran(cmp, [dk123456],[AS121212])
Copy memo cmp to date_pers.txt
Use
Erase x.dbf
75
Server
Microsoft Excel Chart grafic
Microsoft Excel foaie de calcul
Microsoft Graph grafic
Microsoft Word 6.0 document
Microsoft Word 6.0 imagine
PaintBrush imagine
imagine Bitmap
Sunet
Texte
Id-server
ExcelChart
ExcelWorksheet
MSGraph
WordDocument.6
Word.Picture.6
Pbrush
StaticDib
SoundRec
Textfile
Se alege
tipul
obiectului.
Deschide o
fereastr
pentru
alegerea
obiectului.
Figura 7-4: Introducerea interactiv a unui obiect ntr-un cmp General
1.
2.
3.
4.
5.
76
ncorporarea coninutului
clipboard-ului n cmpul
General
Legarea coninutului
clipboard-ului de cmpul
General
b) Deschidei submeniul Edit. Clauza de apelare a aplicaiei server difer dup tipul
obiectului existent n cmp. Observai figura n care am surprins ecranul Browse
unde, pentru cmpul foto, s-a deschis fereastra de editare care conine o
imagine. Meniul Edit are o opiune corespunztoare tipului obiectului (Edit Paint
Shop Pro Image Object).
5. Revenirea n mediul Fox: dup efectuarea coreciilor n aplicaia server, revenii n
mediul FoxPro.
Exemple
Comenzi
Efect
Crearea tabelei
Poziionare pe director prin fereastra
de dialog
NR=Numr de fiiere copiate
Dac avem documente, atunci adugm
cte un articol n fiier reinnd numele
documentului i coninutul su.
Nr = ADIR(A, "*.doc")
IF nr > 0
FOR i = 1 to nr
APPEND BLANK
REPLACE fisier.Nume WITH A(i,1)
77
sarcini de laborator
Creai fiierul Concurs cu informaii despre concurenii la Olimpiada de Informatic,
cum ar fi: numele concurentului, coala i localitatea de unde vine, o scurt prezentare a
concurentului (curriculum vitae, fotografia, amprenta vocal), rezultatele la diverse probe.
1. Populai cu articole prin Browse.
2. Punei la primul articol n cmpul Foto o imagine .gif (.bitmap etc.).
3. Punei la primul articol n cmpul Evoluie un grafic al evoluiei rezultatelor
respectivului concurent realizat prin Excel (Microsoft) Graph.
4. Punei la primul articol n cmpul Voce un fiier sunet.
5. Punei la primul articol n cmpul CV (curriculum vitae) un fiier document Word.
6. Afiai cmpurile speciale.
7. Scriei un program care s afieze poza unui concurent dat prin nume de la tastatur.
8. Editai diversele obiecte.
9. Copiai de la articolul unu la articolul doi coninutul cmpului Test.
10.Aflai numele i scoala de unde vine primul concurent nscris.
11.Presupunnd c n cmpul Total_punctaj se adun rezultatele la cele 3 probe de
concurs, realizai calculul prin comenzi adecvate!
12.Afiai concurenii n ordinea descresctoare a punctajelor, la punctaje egale, alfabetic.
13.Aflai ci concureni au venit din localitatea X?
&&
&&
&&
&&
accept 'loc?" to x
copy to man for localitate=X
use man
? reccount()
Use concurenti
Sort on proba1/d to man
Use man
X=proba1
List while proba1=
Capitolul
Indexarea tabelelor
Indexarea este o metod de accesare rapid, ntr-o manier ordonat, a coninutului unei tabele, fr a duplica datele propriu-zise, fr a le depune n alt tabel i a
avea grij de ele. Alte avantaje ale indexrii sunt posibilitatea folosirii expresiilor drept
criteriu de ordonare, selectarea dup criterii unice, actualizarea n timp real etc.
S lum ca exemplu tabela ELEVI. Parcurgerea ei ordonat dup nume se poate face
prin construirea unui index care s rein numrul nregistrrii din tabel i criteriul
nume. Liniile acestui index sunt ordonate dup valorile cheii. Solicitarea de a accesa
tabela ELEVI prin cheia nume va impune parcurgerea indexului. Pentru fiecare linie din
index se ajunge prin pointer la articolul cu datele propriu-zise.
Indexarea realizeaz o legtur logic ntre index i fiierul de date prin numrul
articolului. Observai desenul urmtor.
#
1
2
3
4
5
nume
popescu
albule
stan
marinic
albule
pren
teo
geo
ana
ion
ina
cls
11b
11a
11c
11d
9c
absn
5
4
6
0
7
cls
#
5
2
1
3
4
cheie
9c
11a
11b
11c
11d
nume
#
2
5
4
1
3
cheie
albule
albule
marinic
popescu
stan
Indecii pot fi depui n fiiere index (.CDX) asociate tabelei, au acelai nume i se
deschid sau se nchid odat cu tabela, orice operaie de actualizare asupra acesteia
reflectndu-se automat i asupra tuturor indecilor membri.
O tabel poate avea mai muli indeci, dar numai unul este la un moment dat activ
i determin criteriul de parcurgere.
Tipuri de indeci
Indexul obinuit (regular) este folosit pentru selectarea ordinii de parcurgere
din cmpurile non-cheie.
Indexul unic (unique) este folosit pentru selectarea ordinii de parcurgere
bazate pe prima apariie a valorii n cmpul specificat.
Indexul candidat (candidate) este folosit n tabelele care au deja fixat indexul
primar, dar n care este necesar verificarea valorilor unice i n alt cmp dect
n cmpul cheie.
Capitolul 8 Indexarea i cutarea rapid
79
Indexul primar (primary) este folosit n contextul unei tabele incluse ntr-o baz
de date i asigur introducerea valorilor unice pentru cheia articolelor. O tabel
poate avea un singur index primar.
Exemple
nume
popescu
albule
stan
marinic
albule
80
Efect
Numele unui reper-index care ocup pozia
<nr_index>
Poziia pe care o ocup un index dat.
Expresia cheii de indexare pentru reperul-index
care ocup poziia <nr-index>
Numele indexului activ.
Numrul de repere index din multiindex.
Cls
11b
11a
11c
11a
11a
absn
5
4
6
0
7
admis
.T.
.T.
.T.
.F.
.F.
Dn
11/11/94
09/09/95
07/11/95
08/09/95
09/09/95
list
#
2
1
3
nume
albule
popescu
stan
pren
geo
teo
ana
cls
11a
11b
11c
absn
4
5
6
admis
.T.
.T.
.T.
dn
09/09/95
11/11/94
07/11/95
index on dtos(dn)+nume
tag dn
index on nume +
str(abssn)tag x
set order to 0
81
Efect
Comanda de cutare rapid
Funcie care caut <exp> i returneaz .T.
dac a gsit un articol.
Funcii care returneaz .T. dac articolul
a fost gsit.
= FOUND() / =EOF()
Exemple
#
1
2
3
4
5
6
nume
albule
albule
marinic
popescu
stan
galeriu
pren
geo
ina
ion
teo
ana
sanda
cls
11a
11a
11a
11b
12c
9a
absn
4
7
0
5
6
0
admis
.T.
.F.
.F.
.T.
.T.
.F.
dn
09/09/95
09/09/95
08/09/95
11/11/94
07/11/95
/ /
82
var=popescu
find &var
? recno()
4
find 9a
? eof()
.T.
? found()
.F.
find 9a
? eof()
.F.
Set order to tag nume
seek var
? found()
.T.
? seek(popescu)
.T.
2. Fie baza de date MECIURI care reine toate meciurile unui campionat:
#
1
2
3
4
cod
e1
dinamo
poli
rapid
steaua
e2
farul
corvinul
dinamo
rapid
loc
constana
iai
bucureti
bucureti
data
08.09.95
08.09.95
07.09.95
08.09.95
ora
10
15
10
15
Varianta 2
use meciuri
index on
dtos(data)+loc+str(ora; tag v
I=1
scan
repl cod with i
i=i+1
endscan
use
sarcini de laborator
1.
Fie o tabel CINEMA (cod-film, nume-film, productor, regia, anul, gen, scenariu,
premii) cu principalele producii cinematografice din anul 1948 ncoace i o tabel
ACTORI (nume, data-naterii, sex, cod-film, naionalitate, data-deces) cu informaii
despre stelele filmului. Se cere:
a) codificarea filmelor, odat cu nregistrarea lor, printr-o informaie compus:
nume-ar + - + genul + - + numr-curent;
b) afiai care a fost primul film (cronologic) al fiecrui gen;
c) scriei rile ale cror producii au fost nregistrate n baza de date.
d) afiai filmele produse n UZBEKISTAN n anul 1994;
e) lista filmelor pe genuri;
f) afiai scenaritii pe genuri cinematografice, dup 1990;
Capitolul 8 Indexarea i cutarea rapid
83
g)
h)
i)
j)
2.
Secvena 1:
use elevi
index on cls tag cls
find 11a
? iif (found(), da,nu)
Secvena 2:
use elevi
index on cls tag cls
? iif (seek
(11a,cls).da,nu)
3.
Dorim s gsim media elevului Stan Ana din 12C folosind comanda Seek. Care
variant este corect?
use elevi
index on cls+nume+pren tag x
seek 12CStan
Ana
? iif(found(), media,nu este eleva)
Use elevi
Index on cls+nume+pren tag x
Seek Stan
Ana 12c
? iif(not eof(), media, nu este
eleva)
4.
Fie date mai multe cri de joc identificate prin culoare (trefl, caro, cup, pic) i
valoare (2-14). Asul este 11. Verificai dac pachetul este complet!
6.
Capitolul
Relaionarea tabelelor
Tipuri de relaii
Crearea i tergerea unei relaii
Tipuri de relaii
ntr-o baz de date relaional, aa cum am vzut n leciile anterioare, se pot stabili
ntre tabele numai relaii de tipurile 1-1 i 1-n.
Relaia 1-1 este stabilit ntre o tabel numit printe i o alta numit copil prin
intermediul unui cmp sau al unei expresii comune. Atunci cnd pointerul de fiier se
deplaseaz n tabela printe, pointerul fiierului copil se poziioneaz automat pe
primul articol care are valoarea expresiei de legtur egal cu cea din fiierul printe.
Aceeai tabel poate fi legat de mai multe tabele.
Funcionarea relaiilor 1-n este urmtoarea: la poziionarea pe o nregistrare din
fiierul printe se leag toate articolele fiierului copil cu aceeai valoare a cheii.
Trebuie ndeplinite urmtoarele condiii:
Ambele tabele trebuie deschise naintea comenzii.
Tabela printe trebuie s fie ultima selectat.
Tabela copil este indexat dup aceeai expresie ca i a legturii.
Nu sunt permise cicluri: o tabel nu poate fi i printe i copil al uneia i aceleiai tabele.
Tabela poate fi legat de mai multe tabele prin chei distincte.
Legturile unei tabele se numeroteaz n ordinea definirii lor.
85
Funcii
Funcie
=RELATION(<nr-relatie>)
=TARGET(<nr-relatie>)
Studiu de caz
Efect
Returneaz expresia relaiei date prin <nr-relatie>.
Returneaz numele tabelei secundare legate prin
relaia <nr-relatie> de fiierul deschis n zona
specificat.
use elevi in
use clase in
sele 1
set relation
list a->cls,
ELEVI
nume
1
albule
2
albule
3
Marinic
4
popescu
5
Stan
1
2 order cls
pren
geo
ina
ion
teo
ana
cls
11a
11a
9a
11b
11c
absn
4
7
0
5
6
admis
.T.
.F.
.F.
.T.
.T.
to cls into B
a->nume, b->dirig
ELEVI
nume
1
albule
2
albule
3
Marinic
4
popescu
5
Stan
pren
geo
ina
ion
teo
ana
cls
11a
11a
11a
11b
11c
absn
4
7
0
5
6
admis
.T.
.F.
.F.
.T.
.T.
eof
use elevi in
use clase in
sele 2
set relation
list a->cls,
86
1 order cls
2
to cls into a
a->nume, b->dirig
#
1
2
3
4
5
nume
albule
albule
marinic
popescu
stan
pren
geo
ina
ion
teo
ana
sele 1
set relation to cls into B
sele b
set relation to cls into C
sele 1
list c.sala for a.nume=x and a.pren=y
cls
11a
11a
11a
11b
11c
cls
9a
10a
11a
11b
dirig
barbu
carp
doltu
nanu
cls
11a
11b
11c
11d
sala
1.1
1.2
2.1
2.2
87
nume
Albulet Ion
Albulet Jan
Marinica B
Popescu K
stan
cls
11a
11a
11a
11b
11c
use elevi in 1
use obiecte in 2 order cls
use profesori in 3 order codp
sele 1
set relation to cls into obiecte
cls
11a
11a
11a
obiect
mate
fizica
chim
codp
1
2
3
codp
1
2
3
nume
POPA
ALBU
NICU
set skip to b
sele 2
set relation to codp into c
sele 1
list b.obiect, c.nume for
a.nume=x
sarcini de laborator
I.
BIBLIOTECA
4. Ce se obine?
5. Care sunt restanierii (numele tuturor cititorilor i ale crilor nerestituite dac au
trecut mai mult de dou sptmni de data mprumutului)?
Aceeai relaie ca n sarcina anterioar.
Ordonai tabela OPERATII dup cod-cititor.
Filtrai tabela operaii: date()-data-impr<14 and empty(data-rest).
6. Aflai cine i cnd a mprumutat cri de Mihai Eminescu.
Indexai unic CARTI pe numele autorului i titlul crii.
Fixai relaia CARTI1-n>OPERATII1-1>CITITOR.
7. Aflai care este cmpul de legtur pentru prima relaie i care este cmpul de
legtur pentru cea de a doua relaie.
8. Aflai care este numele fiierului copil din cele dou legturi.
II.
Cu un copil
Ionescu
Minulescu
Enachescu
Contabil
Ionescu
Minulescu
Enachescu
inginer
Vasilescu
Albulescu
Nasuescu
Pentru fiecare baz de date proiectai relaiile dintre tabele i imaginai interogri pe
care s le rezolvai folosind aceste relaii.
Capitolul 9 Relaionarea tabelelor
89
Capitolul
10
Transferul de date
ntre tabele Visual FoxPro
i alte structuri
Importarea i exportarea datelor din i ctre masive de memorie
Importarea i exportarea datelor din i ctre fiiere de alte tipuri
90
Efect
GATHER FROM
<tablou>/MEMVAR
[FIELDS <lista-cmp>]
[MEMO]
SCATTER [FIELDS
<lista-cmp>][memo]
TO <tablou>/MEMVAR
Exemple
1. Adugai la tabela ELEVI elementele masivului NOTE.
note [2, 6]
ELEVI.DBF
nume
rom
ION
10
x
8
y
10
mat
8
8
9
fiz
8
7
8
chim
6
8
9
x
y
8
10
8
9
7
8
8
9
10
10
2. Copiai n matricea Note toi elevii cu nota 10 la romn. Matricea NOTE nu este
necesar s fie declarat anticipat. Ea va avea ca dimensiuni numrul de linii egal cu
numrul de articole filtrate, iar numrul de coloane egal cu numrul de cmpuri.
ELEVI.DBF
nume
rom
ION
10
LUCA
8
POPA
10
note [2, 6]
mat
8
8
9
fiz
8
7
8
chim
6
8
9
ION
POPA
10
10
8
9
8
8
6
9
.F.
.F.
3.
Use elevi
scatter to array a
? nume,a[1], a[2]
ION ION 10
go bottom
scatter memvar
p1
8.77
10
5.66
p2
7.63
10
6.50
proiect
10
10
9
COMISIE1.DBF
p1 reine nota la romn,
iar p2 nota la matematic.
nume
barba
baciu
bucur
mate
10
10
10
lrom
9
7
7
med
9.50
8.50
8.50
COMISIE2.DBF
Numele cmpurilor corespund
obiectelor de examen
91
candidat
carp
crbune
ciurea
cocea
proba1
10
10
10
10
proba2
4.66
8.99
5
10
coala
economic
informatic
informatic
economic
COMISIE3.DBF
Proba1 = romn,
Proba2 = matematic
Avnd nume de cmp diferit, nu vom putea folosi comanda Append from. O
variant de rezolvare este copierea datelor n tablouri n ordinea dorit a cmpurilor i
apoi adugarea ntr-o nou tabel BAC.
use comisie1 in 1
use comisie2 in 2
use comisie3 in 3
select 4
create dbf bac (nume C(10),;
rom N(5,2),mate N(5,2),;
med N(5,2))
sele 1
copy to array a
sele 2
copy to array b fields nume,;
lrom, mate
sele c
copy to array c fields
candidat,;
proba2, proba1;
for scoala=informatic
sele d
append from array a
append from array b
append from array c
close databases
release all
Efect
Exemple
#
1
2
3
4
5
nume
popescu
ionescu
zaharescu
fictiv
albu
dn
cls
11a
11a
11b
11b
11a
absn
10
0
12
absn
15
5
1
m1
6
9
2
m2
7
7
10
m3
8
8
10
an
8
8
10
10
10
10
10
10
10
bi
Dorim o operaie de copiere a tabelei elevi ntr-un fiier .TXT avnd ca separatori
de cmpuri virgula, iar irurile delimitate prin ghilimele.
copy to xxx delimited
type xxx. txt
popescu, , , 11A, 10, 15, 6, 7, 8, 8,
ionescu, , , 11A, 0, 5, 9, 7, 7, 8, ,
zaharescu, , , 11B, 12, 1, 2, 10, 10, 10,
fictiv, , , 11B, , , , , , , , , ., ., .,
albu, , , 11A, 10, 10, 10, 10, 10, 10, ,
append from xxx delimited
go 6
dele rest
pack
copy to zzz type sdf
type zzz.txt
Observai clauza
Delimited!
popescu 11A1015 6 7 8 8
ionescu 11A 0 5 9 7 8 8
zaharescu 11B12 1 2101010
fictiv 11B.. ..
albu 11A101010101010
sarcini de laborator
Ce execut secvenele urmtoare?
Secvena 1
Use elevi
scatter to memvar
accept to nume
input to rom
input to mat
fiz=elevi.fiz
append blank
gather from memvar
Secvena 2
Use elevi
scatter memvar
accept to nume
go bottom
fiz=elevi.mat+1
append blank
gathr memvar
Secvena 3
Use elevi
go 2
scatter memvar
?memvar(1)
Secvena 4
Use elevi
goto 2
scatter to
memvar
?m.nume, m.mat
93
Capitolul
11
Prelucrri statistice
i financiare
Scopul principal pentru care sunt create bazele de date este obinerea ntr-un timp
ct mai scurt a unor informaii cu privire la datele coninute n tabele. Aceste informaii
pot fi de natur diferit, mai detaliate sau mai sintetizate, sub form de liste, tabele sau
simple valori, informaii statistice, totalizatoare.
cls
11B
11A
11C
11C
11C
11A
absm
10
4
5
10
4
0
absn
5
4
6
6
6
0
p1
10
10
10
10
10
10
p2
10
10
10
9
9
9
Numrul total de
elevi se calculeaz
n variabila V
Count to V
?V
95
Exemple
1. Fie tabela ELEVI din exemplul anterior. Dorim obinerea totalului de absene
(motivate i nemotivate) pe clase.
use elev
index on cls tag cls
total on cls to man fields absm, absn
use man
list cls, absm, absn
2. n fiierul ELEVI avem trecute notele la diferite probe de examen. Dorim s mai
adaugm dou articole: un articol cu mediile i altul cu notele maxime la fiecare prob.
Nume
Popescu
...
Medii
Nota maxima
Proba1
10.00
...
Proba2
3.78
...
Proba3
8.00
...
8.75
10
use elevi
declare a[3], b[3]
average all proba1, proba2, proba3 to array a
calculate max(proba1), max(proba2), max(proba3) to array b
append blank
gather from a fields proba1,;
proba2, proba3
repl nume with medii
append blank
gather from b fields proba1,;
proba2, proba3
repl nume with nota maxima
Funcii financiare
FV(<expN1>, <expN2>, <expN3>)
Funcia calculeaz valoarea viitoare a unei depuneri regulate <expN1> cu o cretere
constant n cadrul unei investiii, cu o dobnd fix <expN2> pe o perioad dat <expN3>.
Exemplu: Presupunem c am deschis un cont la o banc ce practic o dobnd de
1% lunar. Suma lunar pe care dorim s o depunem este de 3000 uniti monetare. Ne
intereseaz ce sum vom avea n cont dup 36 luni:
? fv(3000, 0.01, 36) && 129230. 64
PV(<expN1>, <expN2>, <expN3>)
96
sarcini de laborator
I.
97
Fiierul PERSONAL are informaii despre salariaii unei societi: (cod, nume,
loc-munc, grad, funcie, salar, impozit, reineri, sporuri).
1. Aflai:
a) salariul mediu pe locuri de munc;
b) salariul mediu pe funcii;
c) fondul total de salarii;
d) numrul de salariai pe locuri de munc;
e) impozitul total, reinerile totale, totalul sporurilor pe locuri de munc;
f) funcia i numele persoanei cu salariul maxim.
2. S presupunem c avem grila de impozitare a salariailor n tabloul IMPOZ reinut
n fiierul IMPOZ.MEM pe directorul curent. Modificai aceast gril conform
noilor reglementri (precizai reglementrile!).
Grad /salar
gr1
gr2
def
4-10
10%
...
5%
10-20
25%
...
15%
>20
30%
...
20%
Numerele reprezint
sute de RON.
RECAPITULARE
Operaii elementare asupra tabelelor n Visual FoxPro
SINTEZE: Operaiile curente cu tabele FoxPro
Pentru lucrul cu structura:
Deschidere/nchidere
Afiarea coninutului
Cutare i poziionare
Ordonarea coninutului
Duplicarea coninutului
unei tabele
Adugarea datelor
tergerea datelor
Corecia datelor
Relaionarea tabelelor
5. use bancheri
copy stru to ban
copy to array to ban
use ban
append from array ban
release ban
9. use bancheri
list to file;
ban
10. use
11. use
bancheri
bancheri
copy stru to ban copy to ban
use ban
append from;
bancheri
12. use
bancheri
copy file;
bancheri.dbf to;
ban.dbf
Recapitulare
99
Testul 1
data
d, 8
furnizor
c, 20
produs
c, 10
cant
n, 10, 2
pret
n, 10
term-livr
D, 8
onorat
l, 1
conditii
m, 10
furnizor
valoare
termen
100
Testul 2
categorie
n, 2
H=hotel
M=motel
V=vil
C=csue
agentie
c, 15
Numele ageniei
care a nchiriat
unitatea
Fiierul CAMERE reine toate camerele din toate unitile de cazare, pentru fiecare
indicndu-se numrul de paturi i starea de ocupare.
cod_unit
cod_cam
nr_pat are_tel
are_tv
Pret
este_ocup
n, 4
n, 3
n, 1
l, 1
l, 1
n, 5
l, 1
Fiierul OCUPARE ine evidena sosirii i a plecrii tuturor turitilor n anul curent,
codul camerei i al hotelului.
cod_unit
n, 4
cod_cam
n, 3
data_s
d, 8
data_p
d, 8
nume_pers
c, 15
b_i
c, 10
Recapitulare
101
Testul 3
Testul 4
COPY
CLOSE
USE
RESTORE
LIST
DELETE
SORT
TOTAL
APPEND
FIND
COUNT
ACCEPT
SUM
SAVE
APPEND
WAIT
Testul 5
Indexarea
Recapitulare
103
Testul 6
104
Testul 7
Senatori
3. Dublai venitul senatorilor numai dac de la ultima majorare a trecut cel puin o
lun. Ultima modificare se gsete n fiierul DATE_IMP.MEM sub numele DUA
(Data Ultimei Actualizri).
4. S-a anunat c venitul trebuie exprimat n dolari; tiind cursul de schimb, facei
coreciile necesare.
5. Aflai:
a) Pentru fiecare imobil, din ce partid face parte proprietarul?
b) Care sunt membrii senatori sau deputai din patidul X?
c) Exist vreun membru al partidului X fr cas?
d) Care sunt cei mai bogai parlamentari (primii 10)?
Punctaj. Se acord cte 2 puncte pentru subiectele 1, 2, 3, 5, un punct pentru subiectul 4 i
un punct din oficiu.
105
Capitolul
12
Programarea clasic
n FoxPro
Comenzi pentru structuri de control
Proceduri i funcii utilizator
Depanarea programelor
106
Exemple
1. Dorim s introducem ntr-o tabel numele i coninutul mai multor documente pe
care le avem ntr-un director. Vom folosi cmpul General.
CREATE TABLE Fisier (nume C(24),text G)
CD GETDIR()
Nr = ADIR(A, *.doc)
IF nr > 0
FOR i = 1 to nr
APPEND BLANK
REPLACE fisier.Nume WITH A(i,1)
APPEND GENERAL fisier.text FROM A(i,1)
ENDFOR
ELSE
=MESSAGEBOX(Nu sunt documente!)
ENDIF
Crearea tabelei;
poziionare pe director
prin GETDIR.
Funcia ADIR copiaz
ntr-un masiv informaiile
despre fiierele din
directorul curent.
NR=Numr de fiiere
copiate n matricea A.
Dac avem documente,
atunci adugm cte un
articol n fiier, reinnd
numele i coninutul
documentului.
107
3. Problema celebritii
Spunem c o persoan este celebritate pentru un grup, dac este cunoscut de toi
membrii grupului, dar nu cunoate pe nimeni. Stabilii cine este celebritatea (dac
exist o astfel de persoan).
Rezolvare
Presupunem existent o tabel RELATII(P1 N(4), P2 N(4)) cu semnificaia
persoana de cod P1 cunoate persoana de cod P2.
P1 i P2 conin coduri de persoane (valori numerice ntregi mai mari ca 1). Valoarea
maxim a acestor coduri poate da numrul total de persoane.
1) Determinarea codului maxim n variabila nr
Varianta 1
Varianta 2
Use relatii
Do while not eof()
calc max(p1), max(p2) to n, m
if nr<max(p1,p2)
nr=max(n, m)
nr=max(p1,p2)
skip
enddo
endscan
2) Afiarea celebritii
Index on p1 tag p1
for i=1 to nr
y=0
scan for p2=i
&&numarare
y=y+1
endscan
if y=nr-1 &&pers i este
&&cunoscuta
seek i
if .not. found() &&nu cunoaste
?persoana,i,e celebritate
exit
&& iesirere fortata
endif
endif
endfor
use
108
Figura 12-1:
Fiierul locuri.dbf
n Table Designer
Vanzare.prg
use locuri in 1
input trenul to t
input nr-bilete? to n
accept data? to d
d=ctod(d)
accept clasa? (1,2,d,c) to c
sele 1
set filter to a.tren=t and a.data=d and a.tip_vagon=c
count to v
if v<n
messagebox(atentie, nu sunt bilete)
else
locate for tren=t and data=d and tip_vagon=c and not ocupat
i=0
do while found() and i<n
i=i+1
@ 5+i,5 say aveti locul+str(nr_vagon)+str(compartiment)+str(nr_loc)
replace ocupat with .T.
continue
enddo
sarcini de laborator
1. Cum modificai procedura de ocupare a locurilor dac s-ar cere ca toate biletele
unui grup s fie n acelai compartiment sau acelai vagon? Este necesar precizarea
staiei de coborre? Cum s-ar schimba programul dac ar fi o baz de date distribuit
pe o reea de calculatoare i toate ageniile CFR din ar ar avea acces direct la ea?
2.
109
3.
4.
Fie tabela meciuri, cu rezultatele meciurilor planificate ntr-o etap MECI(e1, e2,
g1, g2). Realizai un clasament pe echipe, dup punctaje i golaveraje.
La un concurs de orientare turistic se fixeaz de ctre arbitri momente decalate
de plecare n curs pentru fiecare participant. Organizarea participanilor se face pe
grupe de vrst i sex. Grupa este un cod format din litera m sau f i un numr care
indic limita maxim a intervalului de vrst. De exemplu grupa m10 desemneaz
bieii ntre 9 i 10 ani, f8 fetele ntre 7 i 8 ani.
n fiierul START (grupa, moment-start, interval) se introduc pentru fiecare grup
momentul de plecare n concurs i intervalul ntre dou plecri sucesive ale membrilor
aceleiai grupe. n fiierul CONCURENT (grupa, nr, nume, moment-plecare, momentsosire) se vor trece concurenii.
La nscriere, pentru fiecare concurent se citesc numele, data naterii, sexul i se
determin grupa. Cmpul Nr va conine numrul curent dup ordonarea alfabetic pe
grupe. Momentul de plecare va fi calculat n funcie de momentul de start al grupei i
de poziia n grup.
Scriei un program pentru:
1) introducerea concurenilor (nume, vrst, sex);
2) codificarea persoanelor (cmpul Nr);
3) introducerea momentelor de start pentru fiecare grup;
4) completarea momentului de plecare n curs a fiecrui participant (atenie la
intervalul ntre plecrile celor din aceeai grup);
5) nregistrarea momentului de sosire a fiecrui participant (pentru o persoan
indicat prin cod se va trece timpul sistem);
6) determinarea ctigtorului din fiecare grup;
7) afiarea listelor de final pe grupe, n funcie de durata cursei;
8) afiarea tuturor concurenilor n ordine alfabetic.
5.
1
2
110
Proceduri utilizator
Procedurile utilizator sunt uniti funcionale care realizeaz o anumit sarcin i
returneaz sau nu valori n modulul apelant. Pot fi plasate n fiierul surs n care se
gsete modulul apelant sau n alt fiier, numit fiier de proceduri. Definirea procedurii:
PROCEDURE <nume-proc>
[PARAMETERS <lista-parametri -formali>]
<comenzi>
[ENDPROC]
Comunicarea ntre modulul apelant i procedur se poate face prin parametri.
Definirea listei de parametri formali se realizeaz prin comanda PARAMETERS, care
trebuie s fie pe prima linie dup numele modulului.
Apelul unei proceduri se face prin comanda DO:
DO <nume-proc> [WITH <lista parametri-efectivi>]
Lista parametrilor reali sau efectivi este precizat n clauza WITH a comenzii de apel.
Revenirea n programul apelant se poate face prin una dintre comenzile:
RETURN[TO MASTER]/CANCEL/RETRY
Funcii utilizator
Funcia este o unitate funcional care returneaz programului apelant o valoare,
ca rezultat al prelucrrilor sale. O funcie utilizator (UDF User Defined Function) poate
intra n componena unei expresii.
Definirea unei funcii se face prin comanda FUNCTION:
FUNCTION <nume-functie>
[PARAMETERS <lista-parametri-formali>]
<comenzi>
RETURN <expr>
[ENDFUNC]
Comunicarea rezultatului funciei se face comanda RETURN <exp>.
Apelul pentru execuia funciei se face prin numele acesteia n cadrul unei expresii.
La execuie, n locul identificatorului se va introduce valoarea returnat de funcie.
Transmiterea parametrilor se poate face prin valoare sau prin referin. n mod
implicit, parametrii sunt transmii prin valoare n funcie i prin referin n subprograme
sau proceduri. Schimbarea modului de transmitere a parametrilor la funcii utilizator se
poate realiza prin comanda:
SET UDFPARMS TO VALUE / REFERENCE
111
Exemplu
function adun
parameters x
x=x+1
return x
Exemple
112
&& criptare
replace all adresa;
with cripto(adresa)
&& decriptare
Scan
wsir=
do decripto with elevi.adresa, wsir
replace adresa with wsir
endscan
function cripto
parameters s
w=
for i=1 to len(s)
el=substr(s,i,1)
if el $ aAeEiIoOuU
el=el+p+el && p+vocala
endif
w=w+el
endfor
return w
procedure decripto
parameters s,w
w=
i=1
do while i<= len(s)
el=substr(s,i,1)
if upper(el) $ AEIOU
i=i+2
endif
w=w+el
i=i+1
enddo
cod
n,8
nr1
n,2
use bingo
declare a[6]
input cate buletine ?;
to nrb
input seria primului ?;
to ns
for b =1 to nrb
append blank
nr2
n,2
nr3
n,2
nr4
n,2
nr5
n,2
nr6
n,2
function verif
verif=.t.
y=1
do while y<h
if a[y]=x
verif =.f.
endif
y=y+1
enddo
return verif
3. n vederea vnzrii biletelor, fiierul LOCURI din aplicaia anterioar trebuie completat
cu locurile la toate trenurile din
perioada urmtoare (maxim 10
zile). S presupunem c exist
un fiier GARNITURA, actualizat
de un dispecer, ce ofer informaii despre structura fiecrui
tren: cte vagoane are, de ce Figura 12-2: Fiierul GARNITURA n Table Designer
tipuri.
Scriei un program care, pe baza unui meniu, s ofere mai multe activiti: editarea
tabelei Garnitura, generarea locurilor, vnzarea biletelor. Observai o modalitate de
realizare. Atenie la folosirea procedurilor cu parametri!
113
Procedure generare
sele 2
scan
do gen_loc with 1,b.nr_vag_1,8,6
do gen_loc with
2,b.nr_vag_2,10,8
do gen_loc with
c,b.nr_cusete,6,6
do gen_loc with
d,nr_vag_dormit,6,3
endscan
close all
return
Procedure gen_loc
parameters t,v,c,l
for i=1 to v
for j=1 to c
for k=1 to l
sele 1
append blank
replace id with recno()
replace a.tren with b.tren
replace data with date()+10
replace tip_vagon with t
replace nr_vagon with i
replace compartiment with j
replace nr_loc with k
endfor
endfor
endfor
sele 2
return
sarcini de laborator
I.
114
**fiier2.prg
clear
do unu
? doi
return
**fiier4.prg
clear
do unu(5)
do doi
return
**fiier5.prg
procedure unu
parameters a
?a*10
function doi
?a/10
return .t.
**fiier3.prg
function unu
parameters a
return a*10
procedure doi
parameters a
return a/10
**fiier6.prg
clear
? unu(5)
?doi(5)
Care este
perechea
corect?
115
Tipuri de erori
a) Erori de sintax. Sunt depistate la compilarea programului. Sistemul afieaz
ntr-o fereastr de mesaje eroarea ntlnit.
b) Erori logice. Sunt mai greu de depistat sau de remediat. Nu sunt detectate la
compilare, ci la execuie. De exemplu:
operaia de restaurare Restore, chiar dac folosim clauza Additive, poate
determina tergerea vechilor variabile, dac au acelai nume;
depirea capacitii unui cmp numeric conduce la pierderea valorilor
(observai steluele!);
expresii complicate, unde au fost inversate valorile etc.;
alt eroare greu de detectat survine cnd lucrm cu mai multe zone i
pointerul de fiier nu este bine gestionat.
c) Erori de tip excepie. Sunt acele situaii care nu pot fi anticipate la testarea
programului. De exemplu, mutarea unui fiier n alt director sau tergerea unui index
care se face n afara aplicaiei pot conduce la prsirea pe caz de eroare a
programului.
O idee: Luai programul care nu merge i plasai pe rnd proceduri ntre comentarii
pn cnd acesta va funciona. Refacei invers drumul, activnd cte o procedur pn
depistai eroarea!
117
Exemple
1. De multe ori, deschiderea unui fiier nu este posibil din cauza inexistenei lui. n
asemenea cazuri, sistemul afieaz un mesaj i ntrerupe programul. Pentru rezolvarea
erorii putem concepe un modul special:
If ! file (elevi.dbf)
Rezolv.prg
do rezolv
create elevi
endif
use
use elevi
return
2. Pentru situaia detectrii sfritului de fiier la o comand SKIP se poate construi
o procedur care face poziionarea pe ultimul articol. Pentru a elimina dependena de
fiierul care a cauzat eroarea vom folosi comanda ON ERROR.
on error do rezolv
rezolv.prg
use elevi
if error()=4 && codul de eroare este 4
skip
go bottom
...
endif
return
Comanda ON ERROR redirecioneaz execuia ctre o anumit subrutin cnd
procesorul de evenimente detecteaz o eroare.
Exemplu
PROCEDURE tratare_erori
Parameters nreroare, mesaj, Cprogram,nlinie
Do case
nu se gsete tabela n
case nreroare=1
directorul precizat
noufis=getfile(dbf, alegeti un fisier) vom deschide ecranul de
selecie a fiierelor
if empty(noufis)
prsirea programului
cancel
n caz de eroare
118
else
return
case nreroare=38
goto top
case nreroare=4
go bottom
endcase
ne ntoarcem n programul
apelant dup selecia fiierului.
pointerul este naintea primului articol
pointerul este dup ultimul articol
Strategii de depanare
Cnd survine o eroare n timpul execuiei programului, sistemul afieaz o caset
de dialog coninnd mesajul i trei butoane: Ignore, Suspend, Cancel.
Ignore ignor eroarea i continu programul (este cazul unor erori minore,
cum ar fi inexistena unui set de culori).
Suspend suspend execuia, las fereastra de editare deschis i cursorul
plasat pe linia greit. Mediul este lsat intact. Operatorul ncearc corectarea i
se revine cu comanda RESUME din fereastra de comenzi. Aceasta reexecut linia
de la care a aprut eroarea. Este cazul unei erori mai grave, cum ar fi lipsa
fiierului care trebuie deschis, dar care poate fi corectat manual, direct. Poate
fi executat o comand de creare a unei tabele i apoi se poate reveni. Se pot
deschide ferestrele de depanare Trace, Debug.
Cancel anuleaz execuia programului i v plaseaz n fereastra de editare
pe linia greit.
119
Urmrirea execuiei unui program se poate face prin rularea acestuia linie cu linie i
observarea efectelor asupra variabilelor, cmpurilor, tabelelor. Compararea valorilor
expresiilor cu cele ateptate poate s conduc la depistarea erorii. Dac depistm o
eroare i nchidem fereastra depanatorului, intrm n editarea sursei i facem modificarea.
Opiunile de rulare a unui program n regim de depanare sunt:
a) opiunea step into rularea pas cu pas intrnd i n subrutine. Permite avansul
la urmtoarea instruciune numai dac utilizatorul apas tasta Enter. Observai
n figura 12-3 semnul sgeat ctre instruciunea curent.
b) opiunea step over rularea pas cu pas, dar srind peste subrutine. Opiunea
step out este folosit dac, indiferent pe ce instruciune am fi, dorim terminarea
programului ntr-un singur pas.
c) opiunea run to cursor executarea tuturor instruciunilor de la cea curent
(marcat prin sgeat) ntr-un singur pas pn la instruciunea pe care am pus
cursorul.
d) opiunea de rulare ncetinit se alege selectnd Debug, Throttle. Dup un anumit
numr de secunde, precizat de utilizator, se trece la instruciunea urmtoare.
e) opiunea breakpoint rulare pn se ajunge la un punct de ntrerupere.
Punctele de ntrerupere se plaseaz prin dublu clic pe banda din stnga a liniei, cu
instruciunea sau expresia unde se dorete oprirea sau prin butonul toggle breakpoint
(observai un punct rou!). tergerea unui punct de ntrerupere se face prin dublu clic
pe el sau cu opiunea Clear Breakpoint.
120
sarcini de laborator
I.
121
5. Deschidei fereastra Watch prin Window, Watch sau clic pe butonul utilitar.
6. Trecei n urmrire variabilele de lucru: n, i, p prin tragere i plasare.
7. Apsai butonul Step Over. Ce se ntmpl? Programul se va opri la introducerea
lui n i va afia gata!. Valoarea rezultatului este zero! Mai mult, se terge sursa
din fereastra Trace.
8. Redeschidei sursa i rulai-o pas cu pas prin butonul Step Into. Observai
deplasarea sgeii de la o instruciune la alta i modul de variaie a variabilelor i
i p. Ai depistat eroarea? Dac nu, continuai depanarea.
9. Fixai un punct de ntrerupere pe instruciunea FOR i activai butonul Step over.
Automat programul trece peste celelalte comenzi i se oprete doar la FOR.
Observai n fereastra Watch valoarea lui i i a lui p. Continuai alt Step over. Ai
observat sursa erorii? Ce s-a ntamplat cu p? Care este ultima valoare a lui i
(cnd iese din FOR)?
9. Deschidei fereastra Breakpoint i observai ce aciune este implicit la fixarea
punctului de ntrerupere pe o linie de comand!
10.tergei punctul de ntrerupere de pe linia FOR i punei unul pe variabila p n
fereastra Watch. Apsai butonul Step over. De cte ori s-a oprit programul?
Niciodat? De ce?
11.Punei un alt punct de oprire pe linia p=p*i din subrutin i plasai n fereastra
Breackpoint opiunea Breack at line when changed. Executai rularea pas cu pas.
De cte ori s-a oprit programul? Niciodat? De ce?
12.Ce trebuie fcut pentru a modifica sursa? Comanda Modify Command este suficient?
122
II.
Fereastra 1
Figura 12-5: Fereastra 1
Dei pare ciudat, rezultatul afiat pe ecran ca urmare a execuiei programului a fost
urmtorul:
Unde am greit?
2. Scriei ce aciuni au fost executate pentru a obine fiecare dintre cele patru ferestre!
Fereastra 2
Fereastra 3
Figura 12-6:
Ferestrele 2 i 3
123
Capitolul
13
Operaii cu baze de
date n Visual FoxPro
incluse ntr-un Dicionar de date care asigur aa cum am prezentat n aspectele teoretice
independena sau autonomia datelor fa de programe.
124
DELETE DATABASE
<dbc>[DELETETABLES]
DISPLAY DATABASES
DISPLAY TABLES
Meniul Database
125
Nou View
la distan
Nou View
local
terge
Modific
sarcini de laborator
1. Creai o baz de date cu numele Bib, prelund baza de date predefinit Books.
2. Observai fiierele componente i aranjarea lor n fereastra Database Designer.
Vizualizai coninutul tabelelor.
&& ne putem poziiona pe bara de titlu i prin dublu clic deschidem fereastra Browse
&& sau prin comanda Browse din meniul contextual sau din meniul Table
7. Activai cnd una, cnd cealalt baz de date i observai fereastra Database Designer.
&& se poate folosi comanda Modify database
127
2 Este parial cunoscut din leciile despre proiectarea structurii tabelelor neincluse ntr-o baz
de date; o vom dezvolta prezentnd clauzele necesare definirii structurii unei tabele incluse
ntr-o baz de date.
128
Exemplu
Fie tabele ELEVI i CLASE legate prin atributul cls. Vom scrie comenzile de creare
a acestei baze. Cmpul cod este cheie unic pentru Elevi, iar cls este cheie unic
pentru Clase.
CREATE DATABASE elevi
&& definim baza de date
CREATE TABLE clase(cls C(3) NOT NULL DEFAULT "999" PRIMARY KEY,;
profil C(10) NULL DEFAULT "Info",;
diriginte C(30) NULL DEFAULT space(30))
CREATE TABLE elevi(cod N(3) NOT NULL DEFAULT 999 PRIMARY KEY,;
nume C(30) DEFAULT SPACE(30), med N(5,2) default 9.99,;
cls C(3) NOT NULL DEFAULT "12A";
CHECK val(left(codcls),2)>=9 ERROR "Atentie anul",;
FOREIGN KEY cls TAG cls REFERENCE clase)
2. Modificarea structurii
Modificarea structurii unei tabele se poate face i printr-o comand SQL. Sunt mai
multe forme ale comenzii pe care le prezentm pe rnd:
ALTER TABLE <dbf> ADD <cmp><tip> [(<lung>[,<zecim>])]
[NULL/NOT NULL]
[CHECK <expl>[ERROR <msg>]
[DEFAULT <exp>]
[PRIMARY KEY ][REFERENCES <dbf> [TAG <tag>]]
sau
ALTER TABLE <dbf> ALTER COLUMN <cmp> [NULL/NOT NULL]
[SET CHECK <expl>[ERROR <msg>]/ DROP CHECK]
[SET DEFAULT <exp>]/DROP DEFAULT]
sau
ALTER TABLE <dbf> DROP COLUMN <cmp>
[SET CHECK <expl>[ERROR <msg>]/ DROP CHECK]
[ADD PRIMARY KEY <exp> TAG <tag>/DROP PRIMARY KEY]
[ADD FOREIGN KEY<exp> TAG<tag> REFERENCES<dbf>[TAG<tag>]]
/DROP FOREIGN KEY
TAG <tag> [SAVE]
[RENAME COLUMN <cmp_vechi> TO <cmp_nou>]
Exemple
Fie comanda de creare a tabelei pentru evidena mprumuturilor de cri.
CREATE TABLE imprumut (inv N(5), data_i D, data_r D)
Se adaug o coloan.
ALTER TABLE imprumut ADD COLUMN cod_cit C(3) NOT NULL
129
nchide tabela <dbf> din baza de date curent, toate tabelele din baza curent sau
toate tabelele libere din toate zonele dac nu este deschis nici o baz de date.
Exemple
CREATE DATABASE D1
CREATE DATABASE D2
SET DATABASE TO D1
CREATE TABLE T1 (CMP1 n(3))
CLOSE TABLES
REMOVE TABLES T1
SET DATABASE TO D2
ADD TABLE T1
RENAME TABLE T1 TO T2
&&
&&
&&
&&
&&
&&
&&
&&
&&
Creeaz d1.dbc
Creeaz d2.dbc
Fixeaz d1 baz curent
Creeaz t1.dbf n baza d1
nchide fiierul t1.dbf
terge t1 din baza d1
Fixeaz d2 baz curent
Adaug t1.dbf la baza d2
Schimb numele la t2.dbf
5. Inserarea datelor
Este o comand care nu trebuie confundat cu versiunea Fox a acesteia pe care
am prezentat-o la leciile de actualizare. Ea permite adugarea unei nregistrri la
sfritul unei baze de date.
Sintaxa comenzii:
INSERT INTO <tabela> [(<lista campuri>)] VALUES (<lista valori>)
sau
INSERT INTO <tabela> FROM ARRAY <vector> / FROM MEMVAR
Comanda nu afecteaz numrul zonei de lucru curente. Dac tabela n care dorim
s facem inserarea este deschis n alt zon de lucru dect cea curent se va aduga
o nregistrare la sfritul su fr ca tabela s fie activ.
Exemple
S se adauge un elev:
INSERT INTO ELEVI VALUES (100, "POPESCU",9.66, "9A")
INSERT INTO ELEVI(nume, cod, med) VALUES ("ionescu", 200, 10)
130
6. tergerea datelor
tergerea poate fi efectuat i printr-o comand SQL cu formatul general:
DELETE FROM [<nume-baza>!]<nume-tabela> WHERE <cond>
Exemplu
tergerea elevilor din clasa "9a":
DELETE FROM ELEVI WHERE cls="9a"
7. Actualizarea datelor
O alt comand pentru corectarea valorilor este comanda SQL Are formatul general:
UPDATE [<nume-baza>!]<nume-tabela> SET <cmp1>=<exp1>,
<cmp2>=<exp2>,..WHERE <cond>
Exemplu
Modificarea clasei elevului "Popescu" la valoarea "9x":
UPDATE ELEVI SET cls="9x" WHERE nume="Popescu"
n comanda Browse pentru asocierea unui alt identificator pentru o coloan dect numele
cmpului se folosete opiunea H.
Capitolul 13 Operaii cu baze de date
131
132
Reamintim tipurile de indeci care pot fi folosii ntr-o tabel inclus ntr-o baz de
date:
Index primar (Primary index) asigur introducerea valorilor unice ntr-o tabel.
O tabel are un singur index primar;
Index candidat (Candidate index) tabela are deja un index primar, dar dorim
verificarea valorilor unice i n alt cmp;
Index obinuit (Regular index) permit nregistrri duplicate;
Index unic (Unique indexes) selecteaz ordinea de parcurgere bazat pe
prima apariie a valorii n cmpul specificat.
Tab-ul Table permite specificarea condiiilor de validare la nivelul ntregului articol
(Rule) i al mesajului asociat situaiei de eroare (Message), a declanatorului (trigger)
pentru inserarea articolelor (Insert trigger), pentru corecii (Update trigger) i pentru
tergere (Delete trigger). Despre declanatoare vom discuta ntr-o tem special.
133
Exemplu
sarcini de laborator
1. Folosind fereastra de comenzi creai o baz de date FOTBAL cu tabelele
MECIURI, ECHIPE, JUCATORI. Stabilii cmpurile necesare evidenei tuturor
meciurilor dintr-un campionat, a juctorilor i echipelor de fotbal.
2. Folosind Database Designer i Table Designer proiectai o baz de date
TURISM cu tabelele UNITATI (care va reine toate unitile de cazare cu numele,
categorie, adresa, dac are sau nu piscin, restaurant, etc), LOCURI (care va
reine toate locurile/camere din unitile de cazare cu numrul de paturi, dac au
sau nu televizor, telefon, orientare, pret, etc.) Stabilii proprieti pentru cmpuri,
valori implicite, cheia fiecrei tabele.
3. Deschidei ambele baze de date i trecei controlul de la una la alta. Facei o
modificare n structura unei tabele. |nchidei odat ambele baze de date.
134
Atenie:
Tipul relaiei va fi dat de tipul indexului din tabela copil. Dac indexul este cheie unic
(de tip unique, primary, candidate), atunci relaia va fi 1-1; dac este cheie comun
(de tip regular), atunci relaia va fi 1-n.
Exemplu
Reamintim c relaiile realizate prin comanda SET RELATION sunt temporare, disparnd la
terminarea programului sau a sesiunii de lucru.
Capitolul 13 Operaii cu baze de date
135
136
sarcini de laborator
I.
137
5. Pentru toti studentii care i-au ales deja cursuri, aflai numele lor i al cursurilor alese.
6. Afiai cursurile fr studeni.
7. Afiai numai profesorii la cursurile crora s-au nscris studeni. |mpreun cu
numele cursului se pot afia i numele studenilor care au optat pentru curs?
Proceduri stocate
Procedurile stocate sunt memorate n baza de date i sunt deschise odat cu
aceasta. Operaia de adugare a procedurii la baza de date este precedat de scrierea
ei ntr-un fiier text.
Procedur
MODIFY PROCEDURE
APPEND PROCEDURE
FROM<fis.txt> [OVERWRITE]
DISPLAY PROCEDURES
COPY PROCEDURE TO <fis.txt>
[ADDITIVE]
Efect
Editarea unei proceduri.
Adugarea unei proceduri stocate la baza
de date curent dintr-un fiier <Fis.txt>,
cu sau fr suprascriere.
Afiarea procedurilor memorate din baza
curent.
Copierea procedurii stocate ntr-un fiier
text, de unde poate fi manipulat.
Exemple
Open database D1
Create table t1 free (cmp M)
Append blank
Replace cmp with procedure;
fictiv+chr(13)+chr(10)
Copy memo cmp to fis.txt
Use
Append procedure from;
fis.txt
Display procedures
138
Observaie:
Fereastra de editare a
procedurilor stocate ntr-o
baz de date se poate
deschide i direct,
selectnd Database, Edit
Stored Procedures.
Declanatoare
Declanatoarele (triggers) sunt acele proceduri stocate, rulate dup o operaie de
inserare, actualizare sau tergere, care ataeaz anumite aciuni anumitor evenimente.
Se folosesc n special la pstrarea integritii refereniale ntr-o baz de date.
CREATE TRIGGER ON <dbf> FOR
Crearea unui declanator ataat tabelei
DELETE/INSERT/UPDATE AS <expl> <dbf> din baza de date curent.
Dac <expl> este .T., atunci se d curs
operaiei de inserare, actualizare, tergere.
DELETE TRIGGER ON <dbf>
tergerea unui declanator asociat
FOR DELETE/ INSERT/UPDATE
tabelei <dbf> incluse n baza curent.
Pentru fiecare tabel a unei baze de date se pot crea maxim 3 declanatoare.
Procedura de validare indicat prin <expl> va trebui s returneze .T. sau .F. Expresia
poate fi i o funcie utilizator sau o procedur memorat (creat cu MODIFY PROCEDURE).
Atenie, baza de date curent trebuie s fie deschis n mod exclusiv!
Capitolul 13 Operaii cu baze de date
139
Exemplu
n tab-ul Rules for Deleting se stabilesc reguli atunci cnd se tege un articol n
tabela printe. Opiunile disponibile sunt:
Cascade terge toate articolele cu aceeai valoare ca a cheii strine;
Restrict interzice tergerea dac n tabela copil sunt articole cu aceeai
valoare a cheii strine ca i cea a cheii terse;
Ignore permite tergerea din tabela printe i las articolele orfane n tabela copil.
Atenie! ntotdeauna trebuie bine gndit aciunea de tegere. Desigur, dac tergem o carte
din evidenele noastre, toate operaiile asupra ei ar trebui terse. Dar acestea sunt
operaii trecute, reinute poate n fiierul Operaii pentru a se vedea activitatea,
succesul unei cri. Faptul c ea este pierdut nu-i scade din valoare! Pe de alt parte,
putem proiecta mecanismul de protecie astfel ca s nu putem terge o carte dac ea
este mprumutat cuiva!
141
BIBLIOTECA
Dorim s fixm restriciile de integritate. Astfel:
a. Vom interzice adugarea n tabela Operatii a unei nregistrri pentru o carte, s
zicem cu valoarea inexistent n tabela Carti. Acest lucru impune folosirea unui
declanator pentru inserare de tip Restrict.
b. Modificarea codului unei cri n tabela Carti va determina modificarea peste tot
a cheii cod_carte la noua valoare. Acest lucru impune folosirea unui declanator pentru
actualizare de tip Cascade.
tergerea unei cri din fiierul Carti va determina tergerea tuturor articolelor din
fiierul Operatii. Acest lucru impune folosirea unui declanator pentru tergere de tip
Cascade.
Pai:
1. Fixm relaia Carti1-nOperatii prin cmpul cod-carte.
2. Deschidem Edit Referential Integrity i fixm pentru inserare declanatoare de
tip Restrict, iar pentru actualizare i tergere folosim tipul Cascade.
3. Verificm funcionarea declanatoarelor astfel: deschidem n fereastra Browse
tabelele Cari i Operaii. Marcm pentru tergere o linie cu un cod-carte care
apare n tabela Operaii. Articolele referite de cod sunt automat marcate!
Studiu de caz
142
sarcini de laborator
I.
1. Folosind fereastra de comenzi, creai baza de date coal cu tabelele: Elevi
(clas, nume, adres), Clase (clas, sal, diriginte), Sli (sal, inventar, poziie)
Profesori (nume, clas, specialitate).
2. Stabilii relaiile Elevi-Clase, Sli-Clase, Profesori-Clase, fixnd tipul relaiei i
cheia de legtur.
3. Deschidei baza de date n fereastra Database Designer i vedei legturile create.
4. n fereastra de comenzi, scriei comenzile pentru:
a) scoaterea fiierului Sli din contextul bazei de date;
b) modificarea structurii fiierului Clase;
c) tergerea legturii Elevi-Clase.
II.
n vederea realizrii orarului, sunt proiectate tabelele urmtoare: Orar (ziua, ora,
codul disciplinei, codul profesorului, codul clasei), Profesori (codul profesorului,
numele, catedra), Discipline (codul disciplinei, numele, catedra, nivelul sau anul/anii la
care se pred disciplina respectiv).
Discipline
bi
Ia
so
Bazele informaticii
Informatic aplicat
Sisteme de operare
Info
Info
Info
Profesori
P1
P2
Popescu Emilian
Zaharescu Vasilache
9,10,11,12
10,11,12
10
Orar
Mate
Info
L
L
8
9
bi
so
P2
P2
9a
10b
Convenii:
Ora poate fi n intervalul 8-14.
Ziua se codific pe dou caractere i aparine mulimii {L,Ma,Mi,J,V}.
ntr-o catedr sunt mai multe discipline.
Acelai profesor poate s aib ore la diferite clase, dar nu n acelai timp. El
poate s predea orice disciplin din catedra sa.
Sarcini:
1. Creai baza de date cu numele ORE.
2. Adugai tabelele menionate anterior. Fixai cheile unice ale fiecreia.
Capitolul 13 Operaii cu baze de date
143
144
Capitolul
14
Interogarea bazelor
de date
Rezolvare
select nume from elevi
select distinct cls as
cod_clasa from elevi
select all from elevi
select * from elevi
Capitolul 14 Interogarea bazelor de date
145
Destinaia rezultatelor este specificat prin dou clauze: INTO/TO, dintre care
INTO este prioritar. Clauza INTO <dest_into> determin forma de stocare
a datelor; lipsa clauzei permite afiarea ntr-o fereastr BROWSE a datelor.
<Dest_into> poate fi: ARRAY <tablou>/CURSOR< fis>/DBF <fis.dbf>.
Forma de stocare cursor este o tabel temporar, de tip Read Only, tears
automat n momentul nchiderii ei. Clauza TO este folosit cnd lipsete clauza
INTO. <Dest_to> poate fi: TO FILE <fis.txt> [ADDITIVE] / TO
PRINTER [PROMPT] / TO SCREEN, unde TO FILE direcioneaz ieirea ctre
un fiier ASCII (fie prin suprascriere, implicit, fie prin adugarea datelor la vechiul
coninut, folosind clauza ADDITIVE), TO PRINT ctre imprimant, iar TO
SCREEN ctre ecran.
Exemple:
Cerere
Afiai elevii claselor la imprimant
Copiai numai numele i codul elevilor
ntr-o alt tabel
Rezolvare
select cls, nume from elevi to print
select cod, nume from elevi;
into dbf manelevi.dbf
Rezolvare
select nume, med from elevi;
where med between 8 and 10 and cls=12A
select elevi.nume, elevi.cls,
clase.diriginte;
from elevi, clase where
elevi.cls=clase.cls; and elevi.med=10
Accept nume profesor diriginte? to x
Select elevi.nume, elevi.med from
elevi, clase; where clase.cls=elevi.cls
and clase.diriginte=x
146
Rezolvare
select elevi.cls, clase.diriginte;
elevi.nume from elevi, clase;
where elevi.cls=clase.cls and;
elevi.med=10 group by cls
Rezolvare
select elevi.cls, count(*) from;
elevi, clase where elevi.cls=clase.cls;
group by cls having clase.profil=info
Rezolvare
select elevi.nume from elevi, clase where;
elevi.cls=clase.cls and clase.diriginte=Popa;
order by elevi.nume asc
sarcini de laborator
Considerm o firm care produce i comercializeaz produse din pielrie.
1.
147
e.
f.
g.
h.
i.
Exemplu
148
Pasul 4. Scdem din stocul existent necesarul total i aflm necesarul de aprovizionat.
SELECT Stoc.codm, Stoc.stoc-fnectotal.nectotal;
FROM aproviz!fnectotal INNER JOIN aproviz!stoc;
ON fNectotal.codm = Stoc.codm;
GROUP BY fNectotal.codm;
ORDER BY Stoc.codm;
INTO DBF fnecaprov
USE
ADD TABLE fnecaprov && trecem fiierul fnecaprov n baza de date
Mediul de lucru
Pentru utilizatorii FoxPro, interfaa utilitarului Query Designer este foarte prietenoas, punnd la dispoziie o multitudine de elemente pentru realizarea operaiilor
dorite: bara cu butoane, un meniu contextual, un meniu pe linia principal Query.
Bara Query Designer
Butonul Run
Butonul Add Table permite deschiderea
ferestrei pentru includerea tabelelor n
interogare.
Butonul Add Join permite adugarea de relaii temporare ntre tabelele interogrii.
Butonul View SQL permite vizualizarea comenzii SELECT.
Butonul Maximize/Minimize permite modificarea dimensiunii zonei de
vizualizare a tabelelor.
Butonul Query Destination deschide fereastra pentru precizarea destinaiei interogrii.
Capitolul 14 Interogarea bazelor de date
149
Meniul contextual
Se deschide, aa cum tim, prin clic dreapta i conine cteva
aciuni legate de interogare, cum ar fi execuie (Run), adugarea
unei tabele (Add table), tergerea unei tabele (Remove table),
vizualizarea comenzii SELECT (View SQL), deschiderea ferestrei
cu butoane pentru alegerea destinaiei interogrii (Output setting).
Figura 14-3:
Meniul contextual
Meniul Query
Permite
precizarea
coloanelor:
clauza
SELECT
Legturile dintre
tabele clauza
FROM ON
Zona de vizualizare
a tabelelor.
Se deschide prin
fereastra Add Table
Condiii
de filtrare
clauza
WHERE
Cmpurile folosite
pentru ordonarea
datelor clauza
ORDER
Cmpurile folosite
la gruparea
articolelor
clauza GROUP BY
Numrul de
valori, dac
sunt distincte;
dac este o
interogare
ncruciat
Exemple
151
(Criteria) i lista celor logici (Logical) care vor forma condiia. Nu ncadrm irurile ntre
ghilimele, nici datele calendaristice ntre apostrofuri, pentru c Query Designer
asociaz constantei tipul cmpului.
Pot fi alese maxim 3 cmpuri pentru ordonarea datelor. n problema noastr, vom
folosi Contracte.data. Dac trebuie introduse mai multe cmpuri, ordinea este
esenial, ca i la comanda Sort. Putem inversa cmpurile n fereastra Ordering
Criteria, prin tragere i plasare a butonului asociat liniei.
Pasul 5. Vizualizm interogarea prin clic pe butonul Run Query
153
Rezolvare
Pasul 1. Lansm generatorul de interogri
selectnd File, New, Query, New sau prin
comanda CREATE QUERY.
Pasul 2. n fereastra de poiectare a interogrii
deschidem tabelele Contracte i Facturi fie din
meniul contextual, fie selectnd Query, Add Table.
Pasul 3. Fixm condiia de legtur n tab-ul
Join. Observm conservarea legturii dintre tabelele
Contracte i Facturi, definit la nivelul bazei de date.
155
156
Exemple
Tema 5 Folosirea aplicaiei Query Wizard
Problema
Obinei situaia contractelor, ordonat pe beneficiari, care au facturri dup 1 ianuarie 2002.
Vom afia de fapt informaii despre contracte, pentru fiecare contract informaii
despre facturile trimise n contul acestuia(cmpul; Nr_fact i data).
Pasul 1. Selectm cmpurile care vor forma ieirea din interogare.
Atenie, sunt cmpuri din tabele, nu expresii. Dac dorim folosirea
expresiilor, editm fiierul .Qpr creat cu aplicaia Wizard n Query
Designer.
Pasul 2. Dac sunt mai multe tabele, specificm relaia. n cazul nostru
scriem:
Contracte.nr_contr= facturi.nr_contr
Capitolul 14 Interogarea bazelor de date
157
Pasul 3. Filtrm datele rezultate printr-o expresie logic format din mai
multe expresii relaionale. n cazul nostru scriem:
Facturi.data greater then or equal 01/01/02
Pasul 4. Fixm cmpurile de ordonare, n cazul nostru,
contracte.nume_benef. La fel, numrul de cmpuri este limitat la 3.
Ordinea plasrii acestor cmpuri n lista Avaible Fields conteaz pentru
c d prioritatea cheii la sortare.
Pasul 5. Salvm ca fiier .Qpr; putem rula imediat fiierul (opiunea
Save and run) sau putem intra n Query Designer (opiunea Save
query and modify it in Query Designer).
Exemple
Tema 6 Etapele i specificul operaiei de creare a unui fiier View
Problema
Fie baza de date DESFACERE. Creai o vedere cu beneficiarii unui produs X. Va fi
permis editarea cmpurilor, cu excepia cheii de legtur (nr_contr) i a numelui
beneficiarului (nume_benef).
Rezolvare
1. Deschidem baza de date Contracte prin OPEN DATABASE.
ATENIE! Vederile pot fi create numai n contextul unei baze de date deschise, unde de
fapt, sunt i memorate.
158
159
Trebuie tiut c:
Un cmp cheie nu poate fi modificat. Dac am stabilit deja nite cmpuri
cheie diferite de cele din tabela iniial, alegem Reset Key i sistemul va
cuta n tabela surs cmpurile cheie dup indecii primari existeni i va
permite fixarea altuia drept cheie.
Vom modifica doar cmpurile marcate pentru
aceast operaie. n fereastra Update
observm c numele beneficiarilor nu poate
fi modificat.
Schimbarea setrii iniale a indicatorilor
asociai coloanelor vederii se face prin pozi- Figura 14-24: Cmpurile marcate
ionarea pe numele cmpului i selectarea pot fi modificate
comutatorului corespunztor (primul pentru
fixarea cheii, al doilea pentru actualizare).
Comutatorul Send SQL Updates trebuie activat pentru a folosi vederea la
actualizarea datelor din surse.
Partea dreapt a ferestrei Update (SQL WHERE) este folosit pentru vederi
la distan i o vom discuta la lecia urmtoare.
8. Salvm i ieim din proiectare.
Exemple
Tema 7 Proiectarea interogrilor ncruciate cu Crosstab Wizard
O interogare ncruciat este rezultatul unei interogri speciale, care permite
analizarea relaiei dintre un cmp al tabelei de date i alt cmp al aceluiai tabel.
Problema
Fie baza de date DESFACERE. Afiai cantitatea total vndut din fiecare produs
n fiecare lun din anul curent. Situaia va fi afiat sub forma unei matrici: pe linii avem
produsele, iar pe coloane avem lunile. La fiecare produs, calculai totalul vnzrilor.
Observai rezultatul obinut printr-o interogare ncruciat pornind de la tabela
Facturi, dat n continuare.
Rezolvare
Pasul 1. Pregtirea sursei de date pentru
Crosstab Wizard.
Observai tabela Facturi. Prima problem pe
care o avem de rezolvat este asocierea numelui
de produs pentru fiecare factur. tiind c o
factur se refer la un anumit contract i un
contract se semneaz pentru un produs, este
suficient legtura ntre tabelele Contracte i
Facturi. De exemplu, contractele 122 sunt
pentru pantofi, 123 pentru papuci, iar 125
pentru sandale. O alt problem care trebuie Figura 14-25: Tabela Facturi
rezolvat naintea proiectrii interogrii Crosstab
este identificarea lunii din data facturii.
160
Pasul 2. Lansm Cross Tab Wizard selectnd Tools, Wizard, Query, Cross-Tab Wizard.
a. Selectm cele trei necesare: luna, numele produsului, cantitatea din fiierul cursor.
b. Completm axele: dorim pe linii produsele (sunt multe), pe coloane trecem lunile,
iar n celulele matricii trecem cantitatea.
c. Specificm operaia de calcul pe care o va face utilitarul (SUM).
n mod implicit, n ultima
coloan se face suma, dar
putem solicita i alte calcule,
cum ar fi: numrarea celulelor
care conin date (de exemplu,
numrul de luni n care a fost
solicitat fiecare produs) sau
calcularea procentajului (ct la
sut din totalul vnzrilor
reprezint fiecare produs) etc.
d. Salvm ca fiier .qpr; acesta
poate fi rulat imediat (opiunea
Figura 14-28: Stabilirea layout-ului
Save and run) sau putem intra
n generatorul de interogri
pentru modificri.
161
162
Pasul 2. Folosim tabela virtual creat anterior. Pentru fiecare codmaterial din
vederea necplan creat calculm suma.
Pasul 3. Aflm necesarul de aprovizionat la fiecare material prin diferena stocnecesar total. Noul fiier vedere folosete vederea Nectotal creat anterior i tabela
Stoc. Relaia trebuie fixat pe cmpul codm.
163
sarcini de laborator
I.
164
II.
165
Capitolul
15
Comunicarea aplicaiei
Visual FoxPro
cu alte aplicaii
6. Adugarea tabelelor necesare din baza de date: fiecare nou tabel trebuie s
aib o legtur cu cele existente deja, altfel FoxPro face produsul cartezian al
articolelor celor dou tabele.
7. Adugarea criteriilor de selecie prin tab-ul Join: nu se pot lega ntre ele tabele
aparinnd unor conexiuni diferite. |n schimb, odat creat vederea, se poate
crea o interogare sau un formular care s utilizeze date de la mai multe surse.
167
Atenie! Fiecare vedere la distan poate accesa o singur surs de date. Pentru a
combina un fiier Paradox cu unul FoxPro trebuie create dou vederi ale
celor dou tabele. Apoi, presupunnd c exist un cmp care permite
definirea unei relaii, se pot combina cele dou vederi n mediul de date Data
Environment al unui formular sau al unui raport.
168
169
Exemplu
n vederea elaborrii scrisorii i trimiterii prin e-mail, vom lansa utilitarul Mail Merge
Wizard.
Pasul 1. Selectm cmpurile din tabela Agenda: numele i adresa de
e-mail. Atenie, nu putem folosi cmpuri din mai multe tabele. |n aceste
situaii va trebui creat o vedere.
Pasul 2. Indicm procesorul de texte pentru editatea scrisorii. Cel
implicit este Microsoft Word.
Pasul 3. Selectm opiunea de creare a documentului. Pentru a selecta
un document existent, introducem numele acestuia sau l cutm.
Pasul 4. Alegem Form Letter ca tip de document. Celelalte tipuri sunt
Label, Envelope sau Catalog.
Pasul 5. Deschidem Word-ul ca editor de texte. Compunem textul
scrisorii, avnd grij s inserm cmpul nume din baza de date prin
lista Insert Merge Field. Butoanele barei de instrumente care apare
aparin Word-ului i se presupun a fi cunoscute.
170
Indicm numele cmpului din tabel care conine adresa de e-mail a fiecrei
persoane. n vederea filtrrii datelor (nu toi prietenii vor fi invitai) se poate folosi
domeniul de nregistrri sau o condiie pus prin Query Options. Executm clic pe
butonul Merge pentru a expedia la toate adresele gsite n articolele selectate.
sarcini de laborator
Creai o aplicaie n FoxPro pentru concursul Info-Baby care se va desfura n
coala dumneavoastr. Se vor afia pe internet:
a) Informaiile generale despre concurs i organizatori, condiiile de participare;
b) Programul concursului pe zile, ore, activiti, locuri de desfurare;
c) Membrii juriului;
d) Concurenii, n ordinea nscrierilor, alfabetic, pe zile;
e) Problemele date n fiecare zi;
f) Situaiile zilnice rezultatele obinute de fiecare participant n ziua respectiv,
eventual clasamentul pn n momentul curent;
g) Clasamentul final pe judee, pe grupe de vrst;
h) Perlele, evenimentele deosebite, comentariile prietenilor.
171
RECAPITULARE
Prelucrarea procedural a datelor n FoxPro i SQL
SINTEZE. Limbajul de programare FoxPro i
Limbajul de comenzi SQL
Definirea structurilor de control
IF ... ENDIF
DO WHILE....ENDDO
SCAN....ENDSCAN
FOR ..ENDFOR
DO CASE....ENDCASE
Definirea procedurilor i a
funciilor utilizator
PROCEDURE..ENDPROC
FUNCTION...ENDFUNC.
RETURN
PUBLIC / PRIVATE/LOCAL
PARAMETERS
SET UDFPARMS
SELECT...FROM...TOFILE / INTO...
...WHILE...GROUP BY [HAVING]..
Proceduri stocate
MODIFY/APPEND/DISPLAY PROCEDURE
COPY PROCEDURE TO..
Declanatoare
CREATE/DELETE TRIGGER ON ..
...FOR ....DELETE/INSERT/UODATE
Actualizare (sql)
UPDATE SET...WHERE...
INSERT...INTO...VALUE...
DELETE FROM...WHERE...
Modificarea structurii
ALTER TABLE
Testul 1
Structuri de control
Testul 2
Fie o baz de date necesar evidenei unitilor de cazare i turitilor, cu urmtoarele tabele:
UNITATI(cod N(5), nume C(15), fel C(1), categorie N(2),agentie C(15)) pentru
reinerea unitilor de cazare. Numele unitii va fi dat cu numele staiunii pe primele
poziii apoi numele unitii; separator este caracterul /.
Atributul Fel conine o liter: H pentru hotel; M pentru motel etc.
CAMERE(cod_unit N(4), cod_cam N(3), nr_pat N(1), are_tel L, are_tv L, pret N(5),
este_ocup L) pentru informaiile despre camere.
OCUPARE(cod_unit N(4), cod_cam N(3), data_s D, data_p D, nume_pers C(15),
b_i C(10)) pentru informaii despre turiti.
Recapitulare
173
Cerine:
1) tiind c o nou unitate de cazare Y are exact aceleai caracteristici cu hotelul
Alfa din Sinaia, s se adauge informaiile despre noua unitate n baza de date.
(Are aceleai camere, confort etc., dar camerele sunt iniial neocupate!)
2) Trecei toate unitile de cazare din Sinaia n alt fiier, cu structura
CAZARE.DBF(cu N(3), sta C(10), nu C(10, fel N(1), cat N(1), ag C(10)), unde
cu=codul unitii; sta=numele staiunii; nu=numele unitii; fel=tipul unitii
(astfel:1=Hotel, 2=Motel, 3=Vila, 4=Csua); cat=categoria, ag=agenia de turism
3) Modificai codul unei uniti de cazare.
4) Pentru toate unitile de cazare din staiunea X, aflai numrul de camere neocupate.
5) Afiai numrul de camere libere pe uniti, sub forma:
Nume-staiune...unitate...fel...nr-camere...
Not: Se acord cte dou puncte pentru fiecare sarcin, cu excepia sarcinii 3 notat cu un punct;
se acord un punct din oficiu.
Testul 3
Operaii in SQL
Se ine evidena vnzrilor mai multor magazine ale aceleiai societi comerciale
SC INTIM SRL ntr-o baz de date cu tabelele MAGAZINE (cod-magazin, nume,
adresa), PRODUSE (cod-produs, nume-produs, unitate de msur, pre unitar), RAIOANE
(cod-raion, nume), VINZARI (dat, cod-magazin, cod-raion, cod-produs, um, cantitate).
Cerine:
A. S se proiecteze baza de date i tabelele prin comenzi SQL.
B. S se scrie comenzile pentru inserarea unei nregistrri noi n fiecare tabel.
C. S se tearg din tabela VANZARI toate articolele care au data vnzrii nainte
de 1 ianuarie anul curent.
D. Magazinul care are numele "Metro-golden" s-a mutat n "str. Iancului, nr. 456".
Facei modificarea corespunzatoare prin comenzi SQL
E. S se afle prin comenzi SELECT:
- cantitatea total de hrtie vndut azi;
- numrul total de raioane distincte;
- valoarea total a vnzrilor pe magazine;
- care sunt primele 3 magazine fruntae (au vndut cele mai multe produse cantitativ!).
Punctaj:
A. 2p; B., C., D, cte 1 p; E. 4p i 1 p din oficiu.
174
Capitolul
16
Elemente de programare
orientat spre obiecte
Obiecte, proprieti, evenimente, metode
Comenzi necesare programrii obiectuale n Visual FoxPro
175
Pagini sau
tab-uri
Comutatoare=
CheckBox
Zone de
editare
Butoane radio
Liste combinate
Declanatoare
176
Exemple
Exemplul 1: Definirea unei subclase cu
numele Fer1 cu caracteristicile clasei
printe.
DEFINE CLASS fer1 AS FORM
ENDDEFINE
177
Exemplul 3: Subclasa fer2 are alte proprieti: poziie pe ecran, alte dimensiuni, fond
galben, text rou1.
DEFINE CLASS fer2 AS Form
Top=2
Left=10
Hight=10
Width=80
BackColor=RGB(255,255,0)
ForeColor=RGB(128,0,0)
ENDDEFINE
O definiie de subclas poate s conin obiecte ale altor clase. Ele sunt specificate
prin clauza ADD OBJECT. Clauza PROTECTED previne accesul la modificri exterioare
ale acestor obiecte. Clauza WITH d proprietile obiectelor adugate.
Exemplul 4: Adugarea unui obiect de tip buton declanator la o clas container derivat
(Fer2). Noua clas va moteni textul rou, poziia (Top=2, Left=10) i dimensiunile
(10X80) dar va avea fondul alb.
DEFINE CLASS Fer4 AS fer2
Backcolor=RGB(0,0,0)
ADD OBJECT X As CommandButton
WITH Caption=More>>, Top=0, Left=0, Height=4, Widht=12
ENDDEFINE
Pentru subclasa definit se pot specifica evenimentele i metodele ca set de funcii
utilizator sau proceduri.
Evenimentele sunt apelate prin: <nume-obiect>.<eveniment>, iar metodele prin
construcia: <nume-obiect>.<metoda>.
Referinele relative se exprim prin:
Parent
&& Primul container al obiectului curent
This
&& Obiectul curent
ThisForm
&& Formularul care conine obiectul curent
Exemplul 5. Definim o clas de butoane (declanatori) care au scris textul More>> i
care s coboare cu 40 de pixeli la selectare.
DEFINE CLASS buton1 AS CommandButton
Caption=More>>
PROCEDURE CLICK
Buton1.TOP=50
&&sau This.TOP=50
ENDPROC
ENDDEFINE
178
Exemplul 6. Definim o fereastr care afieaz un mesaj cnd se execut clic. Clasa
de baz este Form. Observai motenirea proprietilor clasei de baz. Definim doar
aciunea la evenimentul clic.
DEFINE CLASS fer_mesaj AS Form
Procedure click
=Messagebox(in fereastra s-a apasat mouse-ul)
endproc
ENDDEFINE
179
sarcini de laborator
I.
1. Creai o clas cu numele Fereastra pentru orice fereastr cu fundal galben, cu
proprietile de a putea fi redimensionat, minimizat, maximizat, mutat,
nchis prin butoanele corespunztoare. Fixai i dimensiunile.
2. Creai dou obiecte ale clasei Fereastr: un obiect va moteni culoarea, dar va
avea alte dimensiuni, cellalt va moteni dimensiunile, dar va avea ca fundal o
imagine. Numii-le Fer1, fer2.
3. Creai un buton de comand care s se numeasc fereastra 1 i care s
afieze prima fereastr la evenimentul clic.
4. Creai un buton de comand care s se numeasc fereastra 2, care s afieze
a doua fereastr la evenimentul dublu clic.
5. Plasai cele dou butoane de comand pe o fereastr cu numele fer3.
II.
180
Capitolul
17
Proiectarea formularelor
Formularul ca element de interfa cuprinde una sau mai multe ferestre, pe care
sunt plasate informaii. Formularele pot fi folosite pentru prezentarea aplicaiei sau
drept panou de bord, avnd butoane care deschid ferestrele specifice anumitor sarcini
ale aplicaiei. Cel mai adesea formularele sunt folosite pentru vizualizarea i editarea
datelor din tabelele unei baze de date.
Principalele informaii ce trebuie avute n vedere la formatarea ecranului pentru
actualizarea datelor pot fi grupate1 astfel:
1. informaii pentru explicarea semnificaiei cmpurilor din baza de date;
2. cmpurile din baza de date sau variabilele de memorie;
3. mesaje de eroare, date eronate, texte explicative privind corectarea lor;
4. liste de valori posibile care se pot atribui variabilelor;
5. opiuni utilizator pentru prelucrarea datelor;
6. informaii statistice, informaii de ntreinere i de ghidare a operatorului pe
durata sesiunii de lucru;
7. informaii interogative i rspunsuri posibile privind continuarea operaiilor sau
renunarea la acestea.
Observai formularul din
figura 17-1, realizat cu Form
Wizard n FoxPro. Este o
fereastr care are proprietile de a putea fi micorat,
mrit sau nchis prin butoanele situate pe bara de
titlu a ferestrei. De asemenea,
se poate fixa i titlul ferestrei.
Pe fereastr sunt plasate
diferite obiecte de control,
care permit vizualizarea datelor
i editarea lor. Proiectarea
formularelor se poate face
scriind cod (n modul tradiional sau n modul orientat
spre obiecte) sau n mod
vizual, prin Form Designer i Figura 17-1: Exemplu de formular
Form Wizard.
181
x.scx
procedure init
parameters intr
.
Procedure unload
Return ies
Mediul de lucru
Cuprinde o fereastr de proiectare pe care vor fi dispuse obiectele de control
necesare, fereastra de proprieti, ferestre de dialog, meniuri i bare cu butoane.
182
Apel autoformat
Fereastra Properties
Caracteristicile fiecrui obiect plasat pe formular pot fi
observate n fereastra Properties, o fereastr comun
tuturor obiectelor. Aceasta permite att vizualizarea
proprietilor, ct i introducerea codului pentru metode i
evenimente. Se poate deshide selectnd View, Properties
din meniul contextual asociat ferestrei Form Design sau
cel asociat obiectului pe care dorim s-l editm.
Fereastra Properties afieaz pe prima linie numele
obiectului curent, ale crui proprieti sunt afiate.
Deschiznd lista putem s observm ierarhia obiectelor
din formularul curent.
Fereastra are mai multe tab-uri (All, Data, Method, Figura 17-3: Fereastra
Layout, Other) i o zon de afiare cu dou coloane: Properties
prima pentru numele caracteristicii, iar a doua pentru
valoarea sa. Iat pe scurt coninutul tab-urilor: ALL afieaz toate proprietile, Data
afieaz proprietile legate de date, Method afieaz metodele, Layout afieaz
proprieti legate de aspect (culoare, font etc.), Other afieaz alte proprieti.
183
Meniul Form
184
Meniul View
Schimbarea ordinii obiectelor de pe formular
Deschiderea ferestrei pentru mediul de date
Deschiderea ferestrei Properties
Deschiderea ferestrelor de proceduri
Afiarea barei de instrumente Form Controls
Afiarea barei de instrumente Layout
Afiarea barei de instrumente Color Palette
Afiarea/ascunderea liniilor de gril
Vizualizarea poziiei obiectului n proiectare
Alegerea barelor de instrumente ce vor fi afiate
185
Select Object
Label
Editbox
CommandGroup
CheckBox
List
Grid
Timer
OLE Container Control
Line
Container
HyperLink
BuilderLock
View classes
TextBox
CommandButton
OptionButton
ComboBox
Spinner
Image
PageFrame
OLEBound Control
Chenare, cercuri, elipse
Separator
ButtonLock
prezint ecrane de dialog pentru construirea rapid a obiectului. (Nu este posibil
chiar pentru toate obiectele, dar pentru majoritatea se poate i vom prezenta
modalitatea de lucru n temele urmtoare.)
ButtonLock permite adugarea de instane multiple ale aceluiai obiect.
Manevra obinuit pentru crearea unui obiect este selectarea butonului
corespunztor de pe bara de instrumente FormControls, apoi tragere i plasare
pe suprafaa de lucru. Dac dorim plasarea aceluiai obiect, se poate folosi
ButtonLock. Selectai-l, apoi selectai obiectul dorit (un CheckBox, de exemplu).
Executai tragere i plasare pentru o instan, clic pentru a doua etc.
186
187
Exemple
Tema 1. Proiectarea rapid a unui formular prin Quick Form
Problema
Fiierul Elevi conine cmpurile nume C(10), media N(5,2), clasa C(3). S se
realizeze un formular care permite adugarea unui nou elev.
Pasul 4) Selectm toate cmpurile, fixm aranjarea pe coloane i ieim din Form
Builder. Vom deplasa cu mouse-ul obiectele, astfel nct numele cmpului
s se afle deasupra zonei de editare.
Pasul 5) Pentru c formularul este folosit la adugarea unui singur elev, plasm
comanda APPEND BLANK n metoda INIT a formularului.
n fereastra Properties, ne poziionm pe prima linie la nivelul obiectului
Form1 (observai numele atribuit obiectelor de ctre generator!), iar n tab-ul
Method alegem Init. Se deschide fereastra de coduri i scriem comanda
Append Blank.
Pasul 6) Lansm n execuie, de prob, prin butonul Run:
.
Pasul 7) Introducem date i deschidem fereastra Browse pentru verificare.
Pasul 8) Salvm.
188
sarcini de laborator
Exerciii cu Quick Form i primele manevre cu un formular:
1. Proiectai un formular de culegere a datelor, utiliznd opiunea Quick Form
pentru fiierul ELEVI. Aranjai cmpurile pe linii.
2. Vizualizai caracteristicile tuturor obiectelor din formular i rspundei la ntrebrile:
a) Ce valoare s-a atribuit proprietii ControlSource la nivelul formularului? Dar
pentru primul cmp Nume?
b) Care este culoarea de fundal a formularului? Putei s o schimbai cu galben?
Cum sunt codificate culorile?
3. Fixai posibilitatea de adugare a unui nou articol dac trecei (cu bine) de ultimul cmp!
4. Ce manevr trebuie s facei pentru a mri tabela ELEVI prin adugarea unui
ultim articol vid la ieirea din formular?
5. Scriei programul care apeleaz formularul de culegere. Schimbai dimensiunea
formularului, centrai-l!
6. Ce manevr trebuie s facei pentru a terge din tabel ultimul articol vid,
adugat fictiv la ieirea din formular?
7. nchidei fiierul Elevi n fereastra de comenzi i executai o machet anterior
definit, prin comanda DO FORM. Ce se observ? Aveam fiierul Elevi nchis, i
totui formularul permite citirea cmpurilor. De ce?
8. Introducei valori i nchidei formularul prin clic pe butonul de nchidere.
9. ncercai s vedei efectul n Browse. Ce se observ? Fiierul Elevi este nchis
sau deschis? Cum v explicai?
10.Schimbai culoarea de fundal a formularului n albastru deschis. Punei bordur
roie. Aranjai formularul n centrul ecranului.
11.ncercai s vedei coninutul fiierului ELEVI dup fiecare rulare a programului
sau chiar n momentul ncrcrii formularului.
12.Construii formulare de culegere a datelor pentru tabelele bazei de date DESFACERE.
Capitolul 17 Proiectarea formularelor
189
Metode specifice
Valid este folosit atunci cnd terminm introducerea unei valori n cmp.
Dac valoarea ndeplinete condiia de validare, controlul poate trece la alt
obiect. Dac nu, revenim la editarea valorii.
When se folosete nainte ca obiectul s devin inta intrrilor. Valoarea logic
a acestei proceduri determin accesul la cmp sau interzice acest lucru.
KeyPress este o activitate lansat atunci cnd se apas o tast. Procedura
ncepe cu instruciunea Parameters x,y, unde x conine codul tastei apsate,
iar y un numr care indic dac a fost apsat una dintre tastele de control
(Shift, Ctrl, Alt).
Interactivechange este o activitate de schimbare imediat a valorii unui alt
obiect chiar n timpul introducerii datelor n obiectul curent.
Exemple
Exemplul 1. S realizm un formular care citete o
parol i o ntoarce programului apelant.
Obiectul folosit este de tip TextBox, iar dup
plasarea sa pe formular vom seta proprietile (vezi
prima coloan a tabelului de mai jos). Va trebui ns
ca la ieirea din formular irul introdus drept parol Figura 17-11: Formularul pentru
n TextBox s fie comunicat programului apelant. introducerea parolei
Pentru aceasta vom lansa formularul prin comanda
Do With TO, iar pentru obiectul Form vom scrie metodele Init, Load, Unload.
Text1 (parola)
Metoda Init
Metoda Load
Metoda Unload
Passwordchar=X
Controlsource=m.parola
Parameters
parola
parola=
initial
Return
parola
Pai:
1. salvm cu numele x.scx i nchidem generatorul.
2. scriem codul de apel al formularului n cuvant.prg
parola=
191
Text2 (caminist)
controlSource=caminist
variabila=n
metoda Valid
Text1 (nume)
if this.value=.t.
thisform.text3.enabled=.t.
else
thisform.text3.enabled=.f.
endif
Value = n
ControlSource=
m.variabila
ControlSource
=elevi.nume
ReadOnly= .T.
Text3 (taxa)
Enabled=.t.
ControlSource=elevi.taxa
metoda Valid
if this.value`dD
if eof()
go bottom
wait window sunteti
deja la final
else
skip
endif
endif
Exemplu
Fie tabela Elevi n care cmpul
Adresa este de tip Memo. Dorim un
formular pentru introducerea datelor
generale despre un nou elev, inclusiv
a adresei sale, folosind obiectul
EditBox. n cmpul adresa vor fi scrise
pe rnduri separate localitatea, strada Figura 17-14: Formular pentru introducerea datelor
i telefonul elevului.
generale ale unui elev
Pai:
1. Deschidem Data Environment cu tabela ELEVI.
2. Plasm cmpurile pe formular, precedndu-le de texte explicative.
3. Pentru fiecare indicm sursa de date.
TextBox
EditBox
ControlSource= Elevi.nume
ControlSource=elevi.adresa,
AllowTabs=.t.
ScollBars=2
Alignment=1.
193
Exemplu
Dezvoltm formularul pentru adugarea elevilor, introducnd i informaia din
cmpul de tip logic Cminist. n plus, pentru continuarea introducerii datelor despre un
nou elev, am folosit tot un comutator.
1. Deschidem proiectul anterior cu Modify Form.
2. Deschidem Data Environment i adugm tabela Elevi.
3. Plasm obiectele pe suprafaa de lucru, selectndu-le din Form Controls i le
fixm proprietile i metodele:
Check2
Caption=continuti?
ControlSource=;
m.continuare
Form1
Metoda init
Continuare=.F.
Append blank
Metoda Valid
If m.continuare
Append blank
Endif
Check1
Caption=Caminist
ControlSource=;
elevi.caminist
Cancel=.t. arat c obiectul este declanator de ieire implicit la tasta Esc (se
va executa codul din click la apsarea tastei Esc);
Default=.t. arat un declanator implicit la tasta Enter.
n general, nu se asociaz cmpuri unui astfel de obiect, ci doar aciuni, de aceea
metoda principal este Click, care nseamn selectarea butonului i determin
execuia codului precizat la metod. Alte evenimente sunt DblClick, RightClick,
MidlleClick, Rightclick, care nu mai necesit explicaii, numele evenimentului
sugernd momentul declanrii lui.
Butoanele de comand se pot grupa, formnd un obiect de tip container
CommandGroup. Avantajul const n faptul c se poate asocia un cod comun
metodelor o singur dat pentru toate butoanele aparinnd grupului. Dup plasarea
obiectului pe suprafaa de proiectare se poate edita fiecare component prin meniul
contextual asociat obiectului container la opiunea Edit. Putem deci schimba poziiile,
dimensiunile fiecrei componente etc.
Proprieti ale unui grup de butoane:
Value numrul butonului care a fost selectat din grup.
ButtonCount numrul butoanelor.
Editarea rapid a butoanelor de comand prin Command Group Builder
i pentru acest obiect de control exist un asistent de editare rapid, numit
Command Group Builder, care poate fi lansat din meniul contextual ataat obiectului,
dup depunerea lui pe suprafaa de lucru. Primul tab permite specificarea numrului de
butoane i atribuirea unui text sau a unei imagini. Al doilea tab permite alegerea
designului obiectului.
Exemple
Exemplul 1. Adugm la formularul de citire a elevilor dou butoane: butonul continua
i butonul gata.
La activarea butonului continua sunt acceptate
datele de pe ecran i se trece la un alt articol. La
activarea butonului gata se termin execuia
formularului i se afieaz fereastra Browse pentru Figura 17-15: Cele dou butoane
adugate n formular
tabela activ.
Pai:
1. Deschidem cu Modify Form proiectul anterior de formular;
2. Adugm cele dou butoane de control i definim proprietile i metodele click
asociate:
Cmd1
Caption=continua
Procedure Click
Append blank
endproc
Cmd2
Caption=gata
Procedure click
Browse
endproc
195
196
Exemplu
Pe formularul de introducere a elevilor citim profilul
la care s-a nscris concurentul cu ajutorul butoanelor
radio afiate. Reamintim structura fiierului Elevi (nume
C(20), profil N(1), clasa C(3), alte cmpuri). Pai:
1. Selectm butonul OptionGrop de pe bara de
instrumente Form Controls i l plasam pe
formular prin tragere i plasare;
2. Deschidem fereastra Properties i specificm la
nivelul grupului proprietile:
Buttoncount=3,
ControlSource=elevi.profil;
Observaie: Dac alegem pentru cmpul care va primi valoarea citit prin butonul radio
tipul numeric, va fi memorat poziia butonului radio selectat n cadrul
grupului. Dac tipul cmpului este caracter, va fi reinut textul explicativ
asociat butonului.
197
Exemplu
Pentru acelai fiier ELEVI i formularul de citire am
introdus taxa de admitere printr-un contor spinner.
Pai:
1. Deschidem formualrul precedent.
2. Plasm obiectul i fixm:
SpinnerLowValue=200,000
SpinnerHighValue=1,500,000,Increment=1000,
ControlSource=elevi.taxa
Numele unei
tabele
=1
=2
=3
=4
=5
=6
=7
=8
198
Rowsourcetype
Surs nespecificat; elementele
listei se vor specifica dinamic la
rularea formularului
Value
Elementele sunt enumerate
Alias
Se preiau elementele
dintr-o tabel
SQL
Elemente date de comanda SQL
Query
Elemente date de un Query
Array
Elementele sunt preluate
dintr-un tablou
Fields
Elementele sunt preluate din
valorile cmpului
Files
Elementele sunt nume de fiiere
care verific ablonul
Structure Lista este alctuit din
cmpurile (structura) tabelei
=0 none
Alte proprieti:
Sorted=.t. d posibilitatea sortrii alfabetice a elementelor listei la afiare.
IncrementalSeach=.T. este o facilitate deosebit pentru cutarea asistat n listele
mari. Astfel, imediat ce utilizatorul introduce primul caracter, cursorul se plaseaz pe
linia elementului care ncepe cu acel caracter.
De obicei este selectat un singur element dintr-o list. Dac trebuie selectate mai
multe, folosim proprietatea MultiSelect=.t. Selectarea se face cu mouse-ul (innd
tasta Ctrl apsat i executnd clic pe elementele respective) sau cu tastatura
(Ctrl+Space). Pentru a testa dac o opiune a fost selectat se folosete proprietatea
Selected, un vector boolean care are pentru fiecare element al listei valoarea .T. dac
a fost selectat i .F. dac nu. Numrul elementelor listei este reinut n proprietatea
ListCount, iar valorile propriu-zise sunt reinute n proprietatea List.
Exemple
Exemplul 1: Liste deschise cu diferite surse
Folosim o list deschis pentru alegerea clasei noului elev. Elevi (nume, adresa,
clasa, media).
Pai:
1. Executm clic pe butonul ListBox din bara de instrumente Form Controls i
proiectm poziia i dimensiunea pe suprafaa de lucru.
2. Definim proprietile. Pentru cmpul unde se face citirea, definim
ControlSource=elevi.clasa. Pentru specificarea elementelor listei,
alegem din trei variante pe care le vom explica pe rnd.
Varianta 1. Elementele listei sunt trecute manual la proiectarea obiectului.
Folosim proprietile: RowSourcetye=1; Rowsource= 12a,12b,12c,12d.
Varianta 2. Elementele listei sunt preluate dintr-un tablou numit A.
Proprietile sunt RowSourcetye=5 Array; Rowsource=A; Adugm la
metoda Load a formularului comanda DECLARE A[4], iar n metoda Init vom
iniializa elementele tabloului: a[1]=12a, a[2]=12b etc.
Varianta 3. Elementele listei sunt preluate dintr-un fiier.
Extragerea elementelor listei se face din cmpul clasa
al tabelei Clase.dbf (clasa C(3), diriginte C(10), sala
c(4)). Pentru aceasta deschidem fiierul n Data
Environment (deschidem fereastra prin clic pe butonul
din Form Designer, apoi din meniul contextual alegem
ADD). Proprietile listei sunt:
RowSource=clase.clasa, RowSourceType=6.
Figura 17-19:
Varianta 4. Lista este format din mai multe cmpuri List deschis
unite ntr-o expresie.
introdus n formular
Afim numele dirigintelui i sala mpreun cu numele
clasei, dar extragem doar clasa. Proprieti: RowsourceType=2 alias
Rowsource= clase.clasa+ clase.diriginte+ clase.sala
3. Dup fixarea proprietilor, lansm formularul prin Run i, bineneles, deschidem
fereastra Browse s verificm corectitudinea citirilor.
Capitolul 17 Proiectarea formularelor
199
200
Procedure Lostfocus
select fisiere
for i=1 to thisform.list1.listcount
if thisform.list1.selected[i]
append blank
replace nume;
with thisform.list1.list[i]
endif
endfor
endproc
Exemple
201
Form1.destroy
thisform.refresh
if mess(Vrei sa inchizi?,36, Inchidere) = 6
thisform.release
else
if mess(Vrei sa inchizi?,36,Inchidere)=7
endif
endif
Form1.caption=actualizare
Form1. init
if !used(comision)
use comision in 0
endif
set deleted on
Form1. release
set deleted off
sele comision
pack
Tip_comision.ControlSource=comision.tipcomision
Dencomision. lostfocus
Iesire. caption=iesire
Iesire. click
thisform.release
if thisform.comm1.tag=t
reindex
thisform.list_com.refresh
thisform.comm1.tag=f
else
thisform.list_com.refresh
sterger.click
sele comision
dele
skip-1
thisform.refresh
Procent_comision.click
if thisform.comm1.tag=t
reindex
thisform.list_com.refresh
thisform.comm1.tag=f
else
thisform.list_com.refresh
endif
endif
List_comision.click
sele comision
go top
locate for;
tipcomision=val(thisform.list_com.value)
thisform.tip_com.refresh
thisform.den_com.refresh
thisform.proc_com.refresh
list_comision
Rowsource=comision.tipcomision,denco
mision,;
procent
RowSourceType=fields
Tabindex=4
Columncount=3
Name=list_com
Adaugare.click
go bottom
append blank
thisform.comm1.tag=t
thisform.refresh
tabele/vederi. Antetul grilei este folosit pentru denumirile coloanelor. Exist o coloan
pentru tergere i o coloan pentru selectarea liniilor. Grila este plasat ntr-o fereastr
cu bare de derulare verticale i orizontale atunci cnd dimensiunea matricii depete
dimensiunea zonei proiectate.
selectare
tergere
TextBox
header
Form1
Grid1
Column1
Header1
Text1
Column2
Header1
Text1
Check1
Column3
Header1
Text1
Column4
Header1
Spinner1
203
204
Exemplu
Pentru Grid1:
ColumnCount=2,
AllowAddNew=.t.
RowSource=elevi
Rowsourcetype=0
La Metoda Lostfocus
Browse
Pentru Column1:
Controlsource=elevi.n
ume
Pentru Column2:
Controlsource=elevi.c
lasa
Pentru Header1:
Caption=nume-elev
Pentru Header1:
Caption=clasa
205
Pai:
1. Ne poziionm n fereastra de lucru a generatorului de formulare i executm
tragere i plasare de la butonul Grid de pe bara de isntrumente Form Controls
pe formular.
2. Deschidem meniul contextual prin clic dreapta i alegem Builder.
3. Rspundem la ntrebri i rulm prin Run.
Observaie: Proiectarea unei grile prin Data Environment asociaz coloanelor doar
TextBox-uri.
O metod de a pune alte obiecte drept coloane ale grilei este adugarea
obiectelor prin codul metodei Init asociate grilei. De exemplu, pentru o gril
unde dorim pe coloana corespunztoare cmpului caminist un obiect de tip
CheckBox, iar pe coloana unde este taxa un spinner scriem codul urmtor:
**Procedure Init ***pentru grid
This.column2.addobject(check1,checkbox)
This.column4.addobject(spinner1,spinner)
This.column2.currentControl=check1
This.column4.currentControl=spinner
This.column2.check1.visible=.T.
This.column2.check1.caption=elevi.caminist
This.column4.spinner1.spinnerhighvalue=2000
This.column4.spinner1.spinnerlowvalue=100
This.column4.spinner1.increment=100
This.column4.spinner1.controlSource=elevi.taxa
206
La
Exemplu
Acordarea numelui paginii 3
Pageframe1.Page3.caption=Listare
sau
Pageframe1.Pages[3].caption=Listare
Activarea paginii 1
Pageframe1.page[1].ActivePage=.t.
Pageframe1.page1.textbox5.setfocus
sau
Pageframe1.page[1].controls[12].setfocus
Odat configurat, obiectul Set de pagini poate fi editat separat, accesnd meniul
contextual, opiunea Edit sau selectndu-l n arborele de obiecte a paginii dorite.
207
Page1
Page2
Command1
Pagecount=2
Caption=elevi
Caption=clase
Caption=gata
Procedure click
Thisform.release
Exemplu
Exemplul pe care l folosim plimb o imagine
de la dreapta formularului la stnga i invers. Iniial
se afieaz doar poza din stnga. La clic pe buton
apare n dreapta timp de 2 secunde, apoi se mut
din nou n stnga. Pai:
1. Proiectm pe formular obiectul Timer, apoi
obiectul Image1 (pe care apoi l copiem i l
denumim Image2) i Command1.
2. Scriem proprietile i metodele (conform
tabelului urmtor):
Timer1
Interval=2000
Procedure Timer
thisform.image1.visible=.t.
thisform.image2.visible=.f.
Image1
(stnga)
Visible=.t.
formular
Image2
(dreapta)
Visible=.f.
Command1
Procedure click
thisform.image1.visible=.f.
thisform.image2.visible=.t.
209
210
211
n concluzie
Formularul este un element central al unei interfee Windows care poate fi proiectat
att prin comenzi Visual FoxPro (obiectul aparine clasei container Form) ct i
interactiv, prin utilizarea instrumentului de proiectare Form Designer i a asistenilor
(Builder) asociai.
Formularele pot fi folosite ca ferestre de prezentare a aplicaiei sau ca panou de bord.
Principalul lor rol este ns vizualizarea i editarea datelor din unul sau mai multe tabele.
Trebuie avute n vedere cteva principii3 la proiectarea interfeelor utilizator, astfel
nct orice utilizator, chiar dac nu a folosit niciodat aplicaia, s fie n msur s
neleag i s lucreze cu programul aplicaiei.
212
sarcini de laborator
I.
213
6. Proiectai un formular
de culegere a datelor
cu dou pagini. Prima
va permite introducerea unei cri i,
dac autorul respectivei cri nu este
nregistrat n tabela
autori, se va deschide
pagina de introducere
a autorului. Desigur,
paginile pot fi de
dimensiuni
diferite, Figura 17-33: Pagin a formularului
colorate etc.
7. Proiectai un formular pentru introducerea unor noi cititori pn cnd se nchide
fereastra formularului. Se vor folosi obiecte de control diferite. Codul noului cititor
se va realiza prin program, fiind chiar poziia n cadrului fiierului.
8. Realizai formularul urmtor, care s permit editarea simultan a tabelelor Carti
i operaii. Fixai opiuni diferite de adugare a datelor.
215
216
Capitolul
18
Rapoarte
Rapoartele sau situaiile finale constituie o modalitate de valorificare a coninutului
informaional al bazei de date, servind ca instrument de cunoatere a aspectelor
pozitive (i negative) dintr-o situaie pentru care am cules date, le-am transportat,
le-am verificat i depozitat ntr-o baz de date. innd seama de aceste aspecte,
raportul apare ca un instrument al cunoaterii, care conine o cantitate mare de
informaii selectate, prelucrate, sistematizate dup anumite reguli de prezentare,
conform cerinelor de informare ale utilizatorilor.
n practic se disting mai multe tipuri de rapoarte1:
dup aria de cuprindere i locul de obinere, rapoartele pot fi de uz local (pe
secii, compartimente) sau de uz global (pe societi, firme);
dup gradul de prelucrare a datelor, rapoartele pot fi analitice sau sintetice;
dup perioadele de referin a coninutului informaional, rapoartele pot fi zilnice,
decadale, lunare etc.;
dup natura informaiilor oferite, rapoartele pot fi sub form tabelar (text sau
numeric) sau grafic (histograme, grafice).
Editarea unui raport presupune o anumit succesiune de operaii:
1. Definirea coninutului informaional al raportului (se stabilesc datele care vor
compune raportul, fiierele care le conin, denumirea i ordinea cmpurilor din
structura unei nregistrri, din liniile raportului).
2. Colectarea datelor care compun raportul (operaii de selecie, interclasare,
ordonare, filtrarea datelor care vor compune raportul).
3. Efectuarea calculelor matematice (dac este cazul, pentru rapoartele care conin
indicatori, acetia sunt calculai i memorai n variabile sau cmpuri ale tabelelor).
4. Definirea machetei raportului (operaie complex de definire a formei de
prezentare i explicitare a informaiilor ntr-un cadru limitat pagina sau ecranul
innd seama de cerinele utilizatorilor).
217
Apelarea editorului
CREATE/MODIFY REPORT <fis.frx>
Lansarea n execuie
Lansarea n execuie a raportului se face prin comanda:
REPORT FORM <fis.frx> [HEADING<sir>] [NOEJECT]
[SUMMARY] <domeniu> [FOR <cond>] [WHILE <cond>]
TO PRINTER/TO FILE <fis.txt>
Comanda REPORT
FORM permite listarea fiierului/vederii deschise anterior
comenzii sau a fiierelor contextuale proiectate odat cu macheta raportului. Clauza
HEADING are ca efect afiarea unui antet care va fi listat la nceputul fiecrei pagini.
EJECT inhib saltul la pagina nou naintea afirii raportului. SUMMARY inhib afiarea
rndului curent i are ca efect listarea numai a liniilor de totaluri.
218
Mediul de proiectare
n vederea facilitrii proiectrii vizuale, Report Designer v pune la dispoziie o bar
de meniuri, un meniu contextual, o bar de instrumente, fereastra de proiectare,
ferestre de dialog.
1. Fereastra de proiectare are mai multe benzi, unde vor fi depuse categoriile de
informaii ale raportului
Bara de
instrumente
Bara de
titlu
Bara-antet
de grup
Se trec variabile, cmpuri, expresii
Bara-final
de grup
Bara-final
de pagin
Bara de
totalizare
Meniul Report
Vom explica particularitile editrii rapoartelor rezolvnd pas cu pas o problem.
deschiderea benzilor de titlu i nsumarea la final de raport
deschiderea benzilor de grup
editarea variabilelor
fixarea fontului implicit de raport
sursa de date este independent de proiectul de raport
realizarea automat a unui raport rapid
execuia raportului
219
Exemple
Tema 1. Folosirea Quick Report
Problema
Fie baza de date CONTRACTE (nr_contr N(3), data D, nume_benef C(10),
nume_prod C(10), pret_promis N(5), cant N(5), data_livr D), care reine contractele
comerciale a produselor unei firme. Se cere afiarea situaiei contractelor ncheiate la
data curent sub forma unui raport:
LISTA CONTRACTELOR
nr_contr
data
..
nume_benef
pret_promis
cant
Rezolvare:
1. Apelm generatorul de rapoarte cu comanda CREATE
REPORT sau selectnd File, New, Report.
2. Deschidem tabela CONTRACTE n mediul de date
asociat raportului, selectnd Data Environment din
meniul View sau din meniul contextual al raportului.
3. Selectm Report, Quick Report; se deschide
fereastra Field Layout, ce permite alegerea formei i a
coninutului raportului (Fields).
4. Cmpurile care vor fi folosite pot fi selectate din
fereastra Field Picker.
5. Plasm o band de titlu selectnd Report, Title i dm
titlul raportului folosind butonul Text.
Figura 18-3:
Tabela CONTRACTE
6. Inversm coloanele Cant cu Pret_promis.
n Data Environment
7. Selectm File, Page Setup i stabilim caracteristicile
globale ale raportului
Aranjarea
din fereastra care
datelor pe
Aranjarea
apare. Putem preciza
coloane
datelor pe linii
(tabel)
numrul de coloane
(etichet)
(Number),
distana
Valorile vor
pn la prima coloan
avea ca
(Left Margins), limea
Deschide
titlu numele
ecranul Fields
de cmp
coloanelor (Width) i
Picker pentru
distana dintre ele
selectarea
Cmpurile
(Spacing). Raportul
cmpurilor
vor fi
poate fi structurat pe
calificate
coloane sau pe linii
prin clic pe butonul Figura 18-4: Fereastra Quick Report
Print Order.
n general, imprimantele las o zon la marginea hrtiei unde nu se afieaz nimic
(opiunea Printable page). Dac alegem Whole page, atunci ntreaga pagin fizic este
folosit pentru raport.
220
221
Rezolvare:
1. Deschidem tabela Contracte.
2. Crem variabilele globale D1 i D2 ca interval de selecie dorit; prin fereastra de
comenzi li se atribuie valori.
3. Intrm n generatorul de rapoarte prin CREATE REPORT Z.
4. Deschidem benzile de titlu i nsumare (Report, Title) i plasm textele dorite
pentru titlu i cap de tabel (clic pe butonul Text).
5. Plasm intervalul D1-D2 n fereastra de proiectare pe banda de titlu astfel:
a) Executm clic pe butonul Field; se deschide fereastra Report Expression,
n care introducem direct numele unei variabile sau deschidem fereastra
Expression Builder.
S
comentm
puin
aceast fereastr: pe linia
Expression putem introduce
direct expresia care va fi
afiat. Prin clic pe butonul
alturat
se
deschide
Expression Builder, care
permite construirea rapid a
expresiei. Poziia expresiei
afiate n banda unde este
definit poate fi precizat i Figura 18-7: Fereastra Report Expression
prin butoanele radio: Float
mobil fa de liniile deasupra ei2; Fix relative to top fix fa de marginea
superioar a benzii; Fix relative to bottom fix fa de marginea de jos a benzii.
Opiunea Stretch with overflow permite extinderea n jos a cmpului raportului ct
este necesar pentru a cuprinde tot coninutul sursei de date.
2
222
Este de obicei asociat unui cmp Memo i clauzei strech. De exemplu, o adres care
poate avea mai multe linii deplaseaz obiectul plasat sub ea. Este o situaie pe care o vom
exemplifica ulterior.
Informatic Manual pentru clasa a XII-a
Expresia de calcul
a valorii poate fi
introdus direct
sau compus
Variabila va fi
reiniializat la
terminarea unui
grup/pagin/raport
6.
7.
8.
9.
223
Putem seta condiiile de tiprire pentru fiecare cmp prin fereastra Print When.
224
225
Indicaii:
1. Deschidem tabelele (izolate) n baza de date Contracte i stabilim o legtur 1-n
ntre Contracte i Facturi.
2. Intrm n proiectare prin Create Report sau selectnd File, New, Report.
226
227
Apel_fff.prg
report form fff
return
function contr
cvar=
select facturi
seek facturi.nr_contr
scan while facturi.nr_contr=contracte.nr_contr
cvar=cvar+str(nr_fact,5)+
+ dtoc(data)+
str(pret*cant)+;
chr(13)+chr(10)
&& trecerea la un nou rand
endscan
select contracte
return cva
Etichete
Etichetele (labels) sunt o alt modalitate de afiare a datelor. Etichetele pot avea
declarat o dimensiune, ca numr de linii i coloane, pot fi afiate cte una sau mai
multe pe limea hrtiei.
S ne gndim la necesitatea scrierii unor etichete pentru medicamente, colete
potale, cri de vizit. Tot etichete pot fi fluturaii cu informaiile despre salariul
fiecrei persoane dintr-o unitate. Informaiile nume-persoan, funcie, salar_brut,
reineri, sporuri etc. vor fi nsoite de comentarii, ncadrate n chenar i afiate pe mai
multe coloane pentru a face economie de hrtie.
Aceast form special de raport poate fi proiectat prin intermediul utilitarului
Label Designer. Utilitarul este asemntor cu Report Designer, folosete aceleai
instrumente (meniu, fereastr de proiectare, bar de instrumente). Singura diferen
este mrimea paginii folosite: dac Report Designer seteaz o pagin ntreag, Label
Designer i seteaz o mrime potrivit ncadrrii informaiilor n etichet.
Apelarea generatorului de etichete se face prin comanda:
CREATE / MODIFY LABEL <fis.lbx>
Comanda lucreaz n modul ecran i afieaz un meniu care permite proiectarea
unei etichete i salvarea proiectului ntr-un fiier special cu extensia .Lbx. Ecranul de
proiectare este acelai cu cel afiat de generatorul de rapoarte.
Lansarea n execuie
LABEL FORM <fis.lbx> TO PRINTER / TO FILE <fis.txt>
[<domeniu>] [FOR <cond>] [WHILE <cond>] [SAMPLE]
Comanda actioneaz pe articolele selectate prin clauzele <domeniu>, FOR, WHILE.
Afiarea poate fi fcut pe ecran, sub forma etichetelor de prob (cnd este prezent
clauza SAMPLE), la imprimant (TO PRINTER) sau ntr-un fiier text (TO FILE <fis. txt>).
229
Exemplu
Tema 6. Proiectarea unei etichete cu Label Designer
Problema
n vederea elaborrii unor invitaii, dorim afiarea numelui i adresei tuturor
destinatarilor (beneficiarilor) sub forma unor etichete, ca n exemplul urmtor:
Rezolvare:
1. Deschidem fiierul Contracte i indexm unic dup Nume_benef.
2. Apelm generatorul
de etichete selectnd
File, New (.)Label
sau prin comanda
Dimensiunea
Create Label
zonei de
<nume-eticheta
proiectare
3. Alegem forma de
este calculat
etichet din formele
automat n
funcie de
predefinite afiate la
formatul
deschiderea
etichetei
generatorului.
4. Introducem informaiile
n banda de detaliu.
5. Previzualizm
prin Figura 18-14: Proiectarea etichetei
Report, Preview.
6. Salvm prin File, Save.
Executm prin comanda LABEL FORM sau selectnd Run, Label.
Dispunerea etichetelor pe foaia de afiare este realizat n funcie de configurarea
din fereastra Page setup, prezentat la Report Designer.
230
O schi a
etichetei
poate fi
observat n
acest ecran
Zona de
editare a
textelor
Grafice
Un alt tip de raport care poate fi realizat n mediul Windows prin intermediul
sistemului FoxPro i pe baza coninutului tabelelor gestionate de acesta, este raportul
sub form grafic. Dac o balan de pli a beneficiarilor poate fi reprezentat sub
forma unui tabel, fiele de cont ale clienilor arat bine realizate cu Label Designer,
un raport privind situaia vnzrilor lunare pe magazine este mult mai sugestiv sub
forma unui grafic. Desigur, o histogram poate fi realizat printr-un program de grafic,
dar pentru muli dintre noi este o activitate destul de dificil.
Utilitarul care realizeaz grafice este Graph Wizard, apelat selectnd Tools, Wizard,
All, Graph. Ca i la celelalte programe de asisten, parcurgnd paii indicai, poate fi
realizat un grafic care va fi salvat ntr-un cmp de tip General, numit Olegraph, al unei tabele
numit implicit Vfpgraph.dbf sau ca fiier .scx ce poate fi editat i executat prin DO FORM.
Capitolul 18 Afiarea datelor sub form e rapoarte
231
Atenie! Trebuie bine gndit ce grafic dorim s realizeze utilitarul, ce surse de date
are la dispoziie, pentru c reprezentarea grafic nu se poate referi dect la cmpurile
din tabela curent.
Exemplu
Tema 7. Proiectarea unui raport de tip grafic
Problema
Pentru fiierul contracte dorim variaia cantitii contractate de beneficiari pentru
produsul Pantofi.
Rezolvare:
1. Folosim generatorul de interogri pentru a totaliza tabela Contracte pe cmpul
nume_benef, cu filtrare pe produsul pantofi. Vom obine n coloana Cant totalul
cantitilor contractate pe beneficiari.
2. Deschidem utilitarul prin Tools, Wizard, All, Graph.
Pasul 1. Deschidem tabela de date pe care dorim s o folosim pentru
grafic (Contracte). Fixm cmpurile care vor fi trecute pe axe.
Pasul 2. Fixm axele. Pentru o ax OY este necesar un cmp numeric i
vom trece Cant. Pentru axa OX fixm cmpul Nume_benef i executm
tragere i plasare pn la fereastra din stnga.
Pasul 3. Alegem forma graficului.
sarcini de laborator
I.
loc
adversar
scor
echipa1
echipa2
scor
233
Capitolul
19
Proiectarea meniurilor
Generatorul de meniuri Menu Builder
/MODIFY
MENU <fis.mnx>
Exist dou tipuri de meniuri care pot fi create cu acest utilitar: meniuri utilizator
clasice, aezate pe linia zero, n locul sau n completarea barei de meniuri (tip menu)
i meniuri scurttur, de dimensiuni mici, afiate prin clic dreapta, plasate n fereastra
utilizatorului.
Pentru crearea meniului, proiectantul va indica numele opiunilor, operaiile
declanate de alegerea acestora, precum i caracteristicile globale ale mediului. Pe
baza specificrilor fcute n fereastra de proiectare, este generat un program care prin
lansare n execuie va activa meniul.
Programul obinut are extensia .Mnx i poate fi executat, ca orice program, prin
DO <fis.mnx>.
La lansare, Menu Builder deschide o fereastr de
proiectare i un meniu pe prima linie. Meniul Menu permite
construirea rapid a unui meniu asemntor celui standard
(Quick Menu), inserarea opiunilor (Insert item), inserarea
submeniurilor (Insert bar), tergerea opiunilor (Delete Item).
Comanda Generate permite transformarea proiectului ntr-un
fiier executabil. Preview ofer o previzualizare a
proiectulului nainte de finalizare.
Figura 19-1:
Fereastra de proiectare a meniului cuprinde elementele Meniul Menu
definitorii pentru proiectarea meniului principal al aplicaiei.
Partea principal conine numele opiunilor (Prompt), tipul aciunii declanate prin
selectarea opiunii (Rezult), care poate fi deschiderea unui submeniu, execuia unei
comenzi sau a unei proceduri. Fiecare opiune poate fi numit sau editat local n zona
alturat.
234
235
Exemple
Tema 1. Paii proiectrii unui meniu
Problema
Fie baza de date CONTRACTE cu informaii despre contractele comerciale ale unei
societi comerciale i FACTURI cu evidena facturilor trimise beneficiarilor n contul
contractelor ncheiate. Structura celor dou fiiere este: CONTRACTE (nr_contr N(3),
data D, nume_benef C(10), nume_prod C(10), pret_promis N(5), cant N(5), data_livr D);
FACTURI(Nr_fact N(5), nr_contr N(5), data D, nume_prod C(10), cant N(5), pret N(5)).
Se cere elaborarea unui program care grupeaz principalele operaii legate de
evidena contractelor i facturilor.
Un astfel de meniu poate
fi cel alturat:
Rezolvare
Pasul 1. Apelm generatorul de meniuri prin comanda CREATE MENU sau selectnd
File, New (.)Menu. Se deschide fereastra de configurare a meniului principal (bar).
Pasul 2. Definim opiunile meniului principal:
tastm textul n zona Prompt (i indicm tasta rapid) (Introducere,
Actualizare, Afiare).
alegem aciunea dorit n cazul selectrii opiunii din lista nchis Result
(submeniu, procedur sau comand).
Butonul Edit deschide ecranul pentru modificare. Pentru fiecare opiune, definim
submeniul dorit n acelai mod ca la meniul principal.
La ultima opiune de ieire din meniul bar se poate pune comanda SET SYSMENU
TO DEFAULT. De asemenea, se poate scrie comanda CLEAR EVENTS, ce determin
ncheierea tratrii evenimntelor.
236
sarcini de laborator
1. Scriei un programmeniu care permite planificarea meciurilor dintr-un campionat,
nscrierea rezultatelor pentru toate meciurile dintr-o zi dat, afiarea clasamentului.
(Punctajul se calculeaz astfel: 3 puncte pentru un meci ctigat, 1 punct pentru
meci egal, zero puncte pentru un meci pierdut. Golaverajul reprezint diferena
ntre golurile date i cele primite.)
2. Realizai un meniu scurttur, ca n figura 19-6.
3. Realizai un submeniu pentru activitatea de aprovizionare a unei uniti economice, i anume determinarea
necesarul de aprovizionare. Revedei modalitile de
calcul la capitolul despre interogri.
Figura 19-6:
Realizai un meniu ca n figura 19-7:
Meniu scurttur
237
Capitolul
20
Proiecte i aplicaii
Observaie: la realizarea unei aplicaii informatice este foarte important s fie creat
un mediu stabil i coerent, fr a face presupuneri legate de parametrii implicii.
Configurarea existent a mediului va fi salvat la intrarea n aplicaie i refcut la
terminarea aplicaiei.
Mediul este configurat cu comenzi SET. Preluarea valorii curente a oricrui
parametru stabilit cu comanda SET se face prin funcia SET().
Iat cteva aspecte de luat n considere la proiectarea programului principal al aplicaiei:
1. Sunt salvate valorile curente ale parametrilor de mediu SET.
2. Sunt ncrcate toate fiierele de proceduri i de clase, precum i bibliotecile API
necesare.
3. Sunt deschise bazele de date.
4. Sunt configurai n mod corespunztor parametrii aplicaiei (mai ales cei referitori
la tabele, SET DELETED, SET EXCLUSIVE, SET MULTILOCK etc.).
5. Este stabilit o rutin de tratare a erorilor cu comanda ON ERROR.
6. Este selectat i deschis fiierul de asisten.
7. Sunt stabilite i iniializate variabilele globale sau variabilele clasei aplicaiei.
8. Sunt activate meniul principal i bara de instrumente. Comanda DO apeleaz
programul generat de Menu Builder ca fiier .mpr.
9. Este pornit procesorul de evenimente.
10.Sunt restabililii parametrii de mediu modificai.
238
Exemple
Exemplul 1: n tema anterioar am proiectat un meniu al aplicaiei Contracte.mpr.
Pentru aplicaia noastr ne propunem s scriem un program cu 3 funcii: una de
salvare a parametrilor de mediu; alta de lansare a meniului aplicaiei i a treia de
restaurare a parametrilor dup terminarea aplicaiei.
Principal.prg
Configurarea mediului
Do contracte.mpr
salvare parametri de mediu
OldEx=SET(exclusive)
Read Events
Oldtalk= SET(talk)
Olddel=SET(Deleted)
Oldpath=SET(Path)
Olddir=FULLPATH(CURDIR())
Restabilirea mediului
Pop menu _Msysmenu
Set exclusive &OldEx
Set talk &Oldtalk
Set deleted &Olddel
! Cd (Olddir)
Set path to (Oldpath)
239
240
Atenie! n produsele executabile exist unele comenzi sau opiuni care nu sunt
disponibile: SET STEP, SET ECHO, BUILD PROJECT, MODIFY MENU/PROJECT,
MODIFY QUERY, SUSPEND, CREATE VIEW.
Ecranul Project information din meniul Project poate consemna diferite informaii
despre un proiect. |n afara informaiilor pivind autorul i asigur drepturile de autor
codul generat este individualizat cu ajutorul informaiilor referitoare la autor i dat.
Directorul Home este directorul rdcin al proiectului. Caseta Debug info permite
includerea sau excluderea numerelor de linie din codul surs n fiierele compilate.
Acest lucru este esenial
la depanarea aplicaiei.
Informaiile referitoare la
programul i liniile care au
generat eroarea rmn n
fiierul de erori i permit
corectarea.
Caseta de validare
Encrypt comunic
programului FoxPro
s cifreze fiierele
compilate, asigurnd
protecia mpotriva
pirateriei software.
Caseta Attach Icon
permite asocierea
unei pictograme
proiectului.
241
Lista lung de fiiere din tab-ul Files al ferestrei Project Information specific informaii
despre toate fiierele coninute n proiect. Ordinea de afiare poate fi schimbat prin
clic pe butoanele Type, Name i Last Modified.
Caseta Included permite includerea sau neincluderea fiierului n aplicaia .App sau .Exe.
242
243
Pasul 4: Introducem titlul aplicaiei n caseta de dialog Setup Dialog Box Caption.
Numele autorilor i informaiile de copyright vor fi introduse n Copyright Information.
Post Setup Executable permite introducerea numelui unui program care va fi
executat la sfritul instalrii aplicaiei.
Pasul 5: Precizm directorul implicit care va fi creat pe discul de destinaie, n care
vor fi plasate fiierele aplicaiei la instalare, Default Directory. Dac dorim adugarea
aplicaiei n meniul Start al sistemului de operare Windows sau, n general, pentru
crearea unui grup de pictograme ale aplicaiei, folosim Program Group.
Pasul 6. Afim o tabel cu
fiierele aplicaiei. Pentru fiecare
poate fi specificat n coloana
Target Dir dac fiierul urmeaz
s fie instalat n directorul aplicaiei (AppDir) sau n directorul
Windows (WinDir) sau n directorul Windows/System (WinSysDir).
n vederea specificrii unor
proprieti ale fiierului, cum ar fi
asocierea unei pictograme, se Figura 20-8: Fereastra Program Group Menu Item
deschide fereastra Program Manager Item prin clic pe PM Item.
Pasul 7: nainte de nceperea generrii kit-ului, putem crea o arhiv autoextractiv
n vederea distribuirii optime pe internet, prin opiunea Generate a web executable file.
Pentru crearea dischetelor de instalare, Setup Wizard efectueaz urmtoarele operaii:
1. Verific arborele de distribuie n cutarea fiierelor noi sau actualizate;
2. Actualizeaz propriul tabel de fiiere;
3. Comprim toate fiierele;
4. Sparge fiierele n felii de dimensiunea unei dischete.
Dup generarea dischetelor, este afiat o statistic asupra numrului de dischete,
spaiul ocupat de fiierele de pe fiecare dischet etc.
244
sarcini de laborator
Liceul de Informatic are o baz de date necesar evidenei personalului i
calculul salariilor. Considerm urmtoarele tabele:
PERS (cod, nume, adres, studii, data-naterii, data-angajrii, funcia, salar-brut,
este-diriginte, specialitatea, catedra, grad didactic, alte-inf), care reine toate datele
personale ale fiecrui angajat;
REINERI (cod-persoana, cod-reinere, suma, perioada-de-reinere), cu obligaiile
personalului ctre terI; perioada de reinere poate fi dat ca interval de dou date
calendaristice;
SALARII (luna, cod-persoan, numar-ore-suplimentare, total-reineri, total-sporuri,
impozit, rest-plata), cu date despre salariile angajailor n fiecare lun a anului current.
tim c:
Vechimea este calculat n ani i se acord un spor de vechime (mrit
procentual cu 5% din salariu la fiecare 5 ani vechime).
Ora suplimentar se pltete ca o or obinuit, dar este impozitat cu 10%.
Salariul brut se consider cuvenit pentru o norm de 18*4 ore/lun.
Se acord spor de periculozitate tuturor cadrelor didactice care sunt dirigini
(3% din salariul brut).
Avansul chenzinal este 45% din salariul brut.
Realizai un program condus de un meniu principal pentru activitatea de
administrare a salariilor, care s cuprind urmtoarele activiti:
a. vizualizarea i editarea informaiilor legate de persoane, reineri, salarii;
b. afiarea listei avansului chenzinal ca o situaie simpl cu numele i avansul
cuvenit persoanei;
c. afiarea raportului retribuiilor sub forma urmtoare:
LISTA RETRIBUIILOR........
cod
nume
sporuri
reineri
total sume
xxxxxx
xxxx
xxxx
avans rest-plat
xxxx
xxxxx
245
Capitolul
21
Dezvoltarea profesional
n domeniul IT
247
Capitolul
22
Teme opionale
Protecia bazelor de date
Tehnici avansate de gestiune a structurii conceptuale
a tabelelor
Confidenialitatea datelor
nseamn protecia mpotriva accesului neautorizat la bazele de date. Este rolul
administratorului de sistem de a decide necesitatea unui sistem de securitate i de a
menine integritatea acestuia. nainte de a defini un plan de securitate, este necesar s
fie detectate toate riscurile posibile i s fie analizate consecinele directe i indirecte
ale riscurilor. Iat cteva mecanisme de asigurare a confidenialitii datelor:
1. Parolele sau cuvintele de trecere (password) sunt organizate pe niveluri,
pentru identificarea utilizatorilor i a drepturilor lor de acces. Pot fi acordate drepturi
numai de citire sau/i de actualizare la ntreaga baz de date sau la o parte a ei.
Memorarea parolelor se face, de regul, de ctre administrator ntr-un fiier care are
drept cmpuri parola, utilizatorul i nivelul de acces. E bine ca numele dat acestui fiier
s fie ales cu grij. O bun idee ar fi criptarea parolelor.
2. Mecanismul de utilizare a fiierelor virtuale (imaginilor) adic a schemelor
externe ale bazei de date permite securitatea bazei n sensul restricionrii la nivelul
schemelor conceptuale a accesului la date al diferiilor utilizatori.
3. Criptarea datelor este operaia de codificare pe timpul stocrii sau transportului,
astfel nct descifrarea lor s fie posibil numai de ctre posesorii cheii. n practic este
frecvent utilizat sistemul DES (Data Encryption Standard), care are la baz un algoritm
de criptare public, dar utilizeaz o cheie de criptare privat.
4. Metodele biometrice de identificare, autentificare i acceptare/refuz a intrrii n
sistem a unei persoane se bazeaz pe amprente digitale sau genetice, decodarea vocii
sau studiul semnturii etc. Sunt deja larg folosite n sistemele militare, dar pot pune
unele probleme de etic.
248
Integritatea datelor
Un alt aspect legat de protecia datelor privete corectitudinea datelor introduse i
manipulate i se concretizeaz prin:
asigurarea integritii semantice a datelor;
controlul accesului concurent;
salvarea i restaurarea bazei de date.
Explicit
Nivel tabel
Append
Delete All
Recall All
Replace All
Update
Set Exclusive On
Set Lock On
Nivel articol
Nivel cmp
Append Memo
Modi Memo
Browse/Edit
Replace Record
Delete/Recall Record
Flock()
Lock()
Rlock()
Capitolul 22 Teme opionale
249
Exemple
Exemplul 1: Listarea unei tabele la imprimant fr ca, ntre timp, altcineva s poat
modifica fiierul.
use elevi
set lock on
list to printer
set lock off
use
Exemplul 2: Repetarea ncercrii de blocare a unei baze de date pn cnd aceasta
reuete.
set reprocess to 0
on error do eroare
procedure eroare
use test
retry
if flock()= .t.
return
sort on nume to man
unlock
use man
endif
B. Mecanismul tranzaciilor
Un alt mod de protejare a datelor n reea este organizarea operaiilor n tranzacii.
O tranzacie const dintr-o succesiune de comenzi elementare asupra unei tabele i a
fiierelor index i memo care o nsoesc. Orice tranzacie este caracterizat printr-un
punct de ncepere, o secven de operaii i un punct de sfrit.
n reea, euarea unei tranzacii poate avea loc din urmtoarele cauze: ntreruperea
curentului electric, eroare hardware la citire/scrire pe disc, eroare software, incident la
cablu sau conector etc. ntreruperea executrii unei tranzacii poate conduce la
alterarea datelor.
Spunem c este asigurat starea consistent a bazei de date atunci cnd baza
reflect rezultatele finale ale execuiei unor tranzacii, nici o tranzacie nu este n curs
de execuie i sunt respectate restriciile de integritate semantic.
250
251
Exemplu
use elev
=afields(a)
poz=ascan(a, NUME, 1)
if poz# 0
a[poz]=PRENUME
endif
=ASORT(a)
create table b from array a
Exemple
Exemplul 1. Fie baza de date ELEVI (nume, pren, cls, media, absn, absm, dn). Vrem
s realizm o alt tabel care s aib numai primele trei cmpuri i ultimul (nume, pren,
cls, dn) fr s folosim denumirile acestor cmpuri1.
Varianta 1:
use elevi
copy to man structure extended
use man
go 4
dele rest
&&
#
1
2
3
4
5
6
FIELD_IDX
Y
N
Y
N
N
N
Varianta 2
use elevi
for i=1 to 3
x=field(i)
set fields to &x
&& lista de campuri
endfor
copy to man
&&se va copia structura
use man
append from elevi
Varianta 3
use elevi
=afield(a)&& copiem structura
n=alen(a,1)
for i=1 to n-4
=adel(a,4,1)&&stergem coloanele
endfor
dimension a4,m
create table man from array a
use man
procedure creare_2
use manevra
set fields to nume, mg
input NR. DE PROBE: to n
for i=1 to n
var=ob+ltrim(str(i, 2))
set fields to &var
endfor
copy stru to concurs
use concurs
return
use manevra
copy stru exte to man
use man
dele all for field_name #NUME and.;
field_name#MG
input numar probe? to n
for i=1 to n
var=OB+ltrim(str(i))
recall for field_name=var
endfor
pack
create concurs from man
use concurs
return
procprocedure creare_3
procedure creare_4
253
sarcini de laborator
1.
total-val
xxxxxxx
nr_chit
nume_pers
adr
nume_rev
L01
....
L12
254
Capitolul
23
Dezvoltarea unei
aplicaii informatice
Aspecte teoretice
Proiect final, sugestii de rezolvare
Aspecte teoretice
Ingineria software sau ingineria produselor program (software engineering) este un
domeniu care ncearc o abordare sistemic a proiectrii, operrii, ntreinerii i
dezvoltrii produselor informatice. Numele vine din alturarea cuvintelor software (care
reprezint att codul surs al unui program, ct i documentaia corespunztoare) i
engineering (care se refer la aplicarea unei abordri sistematice, tiinifice a
problemei, abordare care are drept scop rezolvarea corect i cu minim de efort a
problemei).
255
Ce doresc utilizatorii?
rspunsuri exacte i clare la probleme foarte diferite;
comunicare direct cu calculatorul n limbaje accesibile, de nivel conversaional;
independen a aplicaiilor fa de sistemul de calcul, astfel nct schimbarea
calculatorului s nu impun schimbarea softului;
produse compatibile cu cele anterioare i standarde (mai ales pentru
comunicaii);
controlul asupra datelor proprii;
un mod variat de introducere a datelor i de obinere a rezultatelor (voce,
imangine, text);
un pre mic i o durat de realizare mic.
Ingineria produselor informatice conine metode, tehnologii (instrumente) i
proceduri pentru conducerea i controlul produciei de software. Unii autori numesc
acest domeniu de activitate metodologia sau tehnologia realizrii produselor program.
256
257
258
Etapa 3. Proiectarea
Urmrete conturarea unui model al viitoarei aplicaii, att al datelor ct i al
funcionalitilor. Soluia informatic aprobat n etapa precedent este structurat pe
componente relativ independente, sunt determinate resursele necesare i termenele
de realizare. Tot acum sunt estimate eficiena i impactul asupra oamenilor din
organizaia n care va fi implementat produsul. Etapa conine:
a) Proiectarea bazei de date, a tabelelor, a relaiilor dintre acestea, a regulilor de
validare, a condiiilor de integritate referenial etc.;
b) Proiectarea interfeelor de intrare: documentele noi care intervin n sistemul
informaional, fluxurile de informaii de la sursele de date ctre calculator,
precum i formularele de introducere a datelor n calculator;
c) Proiectarea interfeelor de ieire: documentele de raportare, graficele, precum i
fluxurile acestor documente ctre utilizatori;
d) Proiectarea prelucrrilor automate: proceduri sau interogri directe, modalitile
de apel;
e) Proiectarea programului monitor i a meniului principal al aplicaiei.
259
260
Proiectul final
Trebuie s realizai la nivelul fiecrei echipe de 2-3 elevi cte un proiect final, care
s demonstreze c avei att cunotinele necesare dezvoltrii unui proiect cu baze de
date, ct i deprinderile de a lucra n echip i de a v prezenta lucrarea.
Ce se cere?
1. s alegei o problem din lumea real;
2. s modelai baza de date necesar rezolvrii problemei;
3. s dovedii cunotinele necesare proiectrii bazei de date, a formularelor,
interogrilor, formularelor si rapoartelor n FoxPro;
4. s elaborai documentaia proiectului (Word+PowerPoint);
5. s prezentai lucrarea n faa colegilor i a profesorului vostru.
4. Proiectarea aplicaiei
Identificai fluxurile de prelucrri, intrrile i ieirile, legturile dintre ele. Stabilii
entitile cu proprietile (atributele, tipul i lungimea) lor i cerinele de validare.
Determinai legturile dintre entiti; normalizai. Proiectai formularele pentru
culegerea datelor, pentru vizualizare i editare. Proiectai forma rapoartelor utilizator:
situaii centralizatoare sau grafice. Proiectai panoul de bord cum va fi prezentat
aplicaia, cum vor fi selectate operaiile specifice acesteia: meniuri, butoane, taste
funcionale. Proiectai schema de sistem a aplicaiei.
261
6. Implementarea aplicaiei
Pregtii datele de test i realizai testarea componentelor pe rnd, apoi integrai-le
n proiectul final. Realizai un grafic de implementare.
7. Documentarea
Fiecare echip va realiza o documentaie de prezentare a rezolvrii problemei n
fata clientului (n PowerPoint) i o documentaie de utilizare, cu detalii despre fiecare
component n parte (n Word).
8. Prezentarea proiectului
Trebuie s demonstrai c tii s lucrai n echip, c fiecare v-ai asumat un anumit
rol i l-ai realizat foarte bine. ncepei prin a prezenta membrii grupei, apoi problema.
Putei preciza restriciile i variantele de soluii propuse (dac sunt). Accentul ar trebui
pus pe explicarea clar a modelului conceptual al bazei de date (SCHEMA).
Aplicaia trebuie s fie modularizat, deci fiecare modul (fereastr) ar trebui s fie
explicat clientului prin funcionalitatea sa.
Prezentai documentaia scris. Puteti sugera i o posibil dezvoltare a proiectului.
Asigurai-v c v ncadrai n timp. La sfritul prezentrii, rspundei la ntrebrile
celorlalte grupe.
V reamintim cele 10 reguli pentru susinerea cu succes a unei prezentri:
1. relaxai-v i respirai adnc;
2. stai drept, adoptai o atitudine de ncredere n ceea ce vei spune;
3. concentrai-v asupra mesajului pe care dorii s-l transmitei, nu v lsai
perturbat de alte lucruri;
4. folosii un limbaj accesibil, corect;
5. pstrai contactul vizual cu ceva fee prietenoase i captai-le atenia asupra
subiectului pe care l dezvoltai;
6. nu v ludai i nici nu v cerei scuze;
7. ncadrai-v n timp;
8. nu v jucai cu indicatorul pe plan sau pe diapozitivul pe care l prezentai;
9. nu punei minile n buzunare;
10.mbrcai-v corespunztor.
Not. Este foarte important s discutai dup prezentarea proiectului final urmtoarele
aspecte: Ce parte din ciclul de via a dezvoltrii unei aplicaii informatice vi s-a prut mai
grea? Ce etap a durat mai mult? Preferai s analizai cerinele problemei, sau s
construii tabelele sau s scriei documentaia? Ce v-a plcut mai mult? Care funcie?
262
Exemple de probleme
1. Firma Cori_Flame este specializat n producerea i comercializarea produselor cosmetice
i i organizeaz vnzarea ctre populaie prin intermediul distribuitorilor autorizai.
Fiecare persoan care dorete s fie distribuitor trebuie s fie recomandat de un distribuitor
deja autorizat, care va fi numit sponsor. La nscriere, persoana viitor distribuitor semneaz un
contract de fidelitate, comunicnd codul sponsorului i primete un cod sau numr de distribuitor,
care va fi folosit n toate tranzaciile cu firma. Codul este astfel realizat nct s permit legtura
cu sponsorul. Un distribuitor este activ dac are cel puin o comand n ultimele 6 luni.
Distribuitorul prospecteaz piaa i face o comand ctre firm, angajndu-se s comercializeze
anumite produse n anumite cantiti. Pe comand va fi notat codul distribuitorului i, pentru
fiecare produs, codul i cantitatea cerut. Marfa cerut nu poate fi returnat dect dac are
defecte. Operaiile de vnzare a mrfii se realizeaz de ctre distribuitor, care primete marfa
cerut prin comanda sa odat cu documentul numit factur. n factur sunt identificate
produsele, cantitile trimise, precum i preul de distribuie (separat se trece TVA). Factura are
un numr i o dat. Factura trebuie achitat n termen de 30 zile, altfel se percep penalizri.
Produsele comercializate de firma Cori_Flame au un pre de distribuie (pe care l pltesc
distribuitorii la achitarea facturii), un pre de vnzare (la care poate fi comercializat ctre
populaie) i un punctaj pentru stabilirea unei bonificaii de stimulare a vnzrii. Pe parcursul unei
luni sunt totalizate facturile achitate de un distribuitor i punctajul de vnzare. Nu este permis
nregistrarea unei noi comenzi de ctre un distribuitor care nu i-a achitat factura anterioar.
Comenzile servesc i la orientarea produciei. De obicei, mrfurile solicitate se afl n stocul
depozitului firmei, dar uneori cererea poate depi stocul existent, deci vor fi livrate i facturate
mrfurile (n ordinea nregistrrii cererilor), n funcie de cantitile existente.
Firma dorete:
evidena distribuitorilor (ci sunt nscrii, activi, cu credite restante etc.);
operaii de nscriere a noi distribuitori, retragere la cerere, scoatere din eviden
pentru distribuitorii inactivi n ultimul an;
gestiunea produselor comercializate de firm, prin nregistrarea intrrilor i a ieirilor,
modificri de preuri sau punctaje;
gestiunea cererilor (nscriere cerere, facturare cu scoaterea cererii din eviden;
gestiunea facturilor (trimiteri, achitri).
2. Suntei angajat al unei companii specializate de recrutare i selectie a personalului.
Orice firm trimite oferta de posturi disponibile, cu avantajele i cerinele fiecruia.
Candidaii au acces la oferte i i trimit CV-ul.
Dumneavoastr avei sarcina de a asista firmele n decizia de angajare, ordonnd CVurile primite n funcie de cerinele postului.
Cum vei face?
1. V documentai pe Internet i vedeti ce posturi n domeniul IT sunt oferite n ar.
2. Pentru fiecare post, facei o list cu avantajele oferite: salariu, transport, concedii,
condiii de lucru.
3. Pentru fiecare post, facei o list cu cerinele postului: studii, experien, calificri
suplimentare.
4. Memorai ntr-o baz de date persoanele care se nscriu la concurs, nregistrnd
CV-ul fiecreia, poza, telefonul.
5. Notai observaiile dup interviu.
6. Afiai CV-urile n funcie de studii.
7. Ordonai CV-urile dup experien.
Sarcini suplimentare
1. Completai-v CV-ul personal!
2. Facei o list cu intrebrile interviului pentru ocuparea unui post n domeniul IT.
Capitolul 23 Dezvoltarea unei aplicaii informatice
263
STUDIUL
DE CAZ
Problema
La casa de schimb valutar S.C. PATRICIA S.R.L. este necesar un program care
ajut agentul de schimb la desfurarea activitilor sale. Astfel, agentul primete
dimineaa cursul valutar i sumele disponibile din fiecare moned. Pe parcursul zilei,
desfoar operaii de cumprri i vnzri de valut, iar seara afieaz situaii
centralizatoare, precum:
a. lista tranzaciilor din ziua respectiv;
b. situaia financiar: stoc iniial n lei la nceputul zilei, total lei intrai prin operaii
de vnzare valut, total lei pltii din cas prin operaii de cumprare valut,
stocul final;
c. lista operaiilor de tip vnzare valut, pe tipuri de monede, cronologic.
S se realizeze o aplicaie care s permit att gestiunea diferitelor monede, ct i
a tranzaciilor efectuate la o cas de schimb valutar.
Analiza diagnostic
F1. Cine i ce face?
Prezentm principalele sarcini legate de problem, pe posturi de lucru, urmrind
care pot fi reduse, eliminate, schimbate sau automatizate.
264
Cine?
Ce face?
Perioada
Poate fi automatizat?
eful
Hotrte CE valute se
tranzacioneaz i preurile
de vnzare-cumprare ale
acestora.
Zilnic
Nu, deocamdat.
Operator
Zilnic
Operator
Zilnic
n documente primare
numite buletin de schimb
valutar.
Operator
Zilnic
Operator
Zilnic
Nume document
Buletin de schimb
Listt
listv
Volum, tip
200 exemplare/zi;
de ieire.
Observaii
Elaborat de operator; certific
desfurarea tranzaciei;
un exemplar este dat clientului i
unul este pstrat la sediul firmei.
Elaborat de operator; folosete la
evidena centralizat a tranzaciilor;
este trimis efului.
Elaborat de operator; folosete la
situaia centralizat i la
informarea clienilor; este
trimis efului.
Valuta
Cumparare
vanzare
Dolar
30000
3200
Euro
28000
29000
Studiul de caz I
265
Restricii i limite
1. Presupunem c vom solicita doar numele clientului nu i buletinul, adresa etc.
2. Pstrm tranzaciile n ordinea sosirii lor nu nregistrm ora!
266
Studiul de caz I
267
Pasul 5. Plasm pe formular cmpurile de tip textbox pentru preul valutei i nivelul
stocului final. Denumirile acestor obiecte sunt sugestive! Pentru c nu dorim ca prin operare
s fie modificate valorile, folosim proprietatea ReadOnly=.T. Observm schimbarea
culorii asociate cmpurilor de editare. De fapt, este de preferat ca pentru operaia de
cumprare s fie afiat preul de cumprare, iar cellalt s nu fie vizibil i invers.
De aceea, vom fixa deocamdat proprietatea Visible=.F. n procedura click
asociat butonului Cmccalcule schimbm proprietatea la valoarea .t. fie pentru
txtpret_cump, fie pentru txtpret_vanz.
Pasul 6. Pentru stocul2 n lei lum dou variabile: lei_init i lei_final, pe
care le memorm n fiierul Stoc_lei.mem. n fereatra de comenzi dm valori iniiale
celor dou variabile i salvm cu SAVE TO STOC_LEI.
Pasul 7. Proiectm caseta de text (textbox) pentru stocul final n lei i dm ca
valoare coninutul variabilei m.lei_final; vezi procedura click asociat butonului
Cmccalcule.
CmdCalcule. clic()
RESTORE FROM STOC_LEI
thisform.txtlei_final.value=m.lei_final
**************cautare valuta si pozitionare
******************pe articolul acesteia
sele VALUTE
locate for valute.cod_valuta=;
thisform.combo1.value
thisform.refresh
****************schimbare atribut Visible
thisform.txtstoc.visible=.T.
if thisform.txttip_tranzactie.VALUE$Cc
****************cumparare valuta
thisform.txtpret_cump.visible=.t.
thisform.txtpret_vanz.visible=.f.
2
268
thisform.txtvaloare.value=thisform.txtcantitate.value * thisform.txtpret_cump.value
thisform.txtleidupatranzactie.value=;
m.lei_final-thisform.txtvaloare.value
iif thisform.txtleidupatranzactie.value<=0
=messagebox(atentie, nu aveti bani suficienti!)
endif
else
*******************vanzare valuta
thisform.txtpret_cump.visible=.f.
thisform.txtpret_vanz.visible=.t.
thisform.txtvaloare.value=thisform.txtcantitate.value*thisform.txtpret_vanz.value
thisform.txtleidupatranzactie.value=;
m.lei_final+thisform.txtvaloare.value
iif thisform.txtstoc.value<;
thisform.txtcantitate.value
=messagebox(atentie, valuta existenta insuficienta!)
endif
endif
CmdOK.click()
***************acceptare tranzactie
RESTORE FROM STOC_LEI
M.LEI_FINAL=thisform.txtleidupatranzactie.value
IF thisform.txttip_tranzactie.value$cC
replace valute.stoc_final with;
valute.stoc_final+thisform.txtcantitate.value
else
replace valute.stoc_final with;
valute.stoc_final-thisform.txtcantitate.value
endif
replace tranzactii.valoare with;
thisform.txtvaloare.value
SAVE TO STOC_LEI
CmdAnulare.click()
**************este situatia in care s-au facut
******************modificari in fisiere si le anulam
RESTORE FROM STOC_LEI
if m.lei_final<>thisform.txtlei_final.value
lei_final=thisform.txtlei_final.value
endif
*********************************
IF thisform.txttip_tranzactie.value$cC
replace valute.stoc_final with;
valute.stoc_final-thisform.txtcantitate.value
else
replace valute.stoc_final with valute.stoc_final+;
thisform.txtcantitate.value
endif
*********************************
select tranzactii
go bottom
delete
SAVE TO STOC_LEI
Studiul de caz I
269
CmdNotOK.click()
SELECT TRANZACTII
GO BOTTOM
DELETE
Form1.init()
SET SAFETY OFF
set default to d:\manuale\aplicatii
use valute in 1
use tranzactii in 2
restore from stoc_lei
select tranzactii
APPEND BLANK
270
STUDIUL
DE CAZ
II
Problema
Doresc o agend cu informaii despre cunotinele mele, prieteni, rude, colegi etc.
A vrea s pot aduga uor noii mei prieteni i s pot terge la fel de uor pe cei cu
care nu mai in legtura; cu alte cuvinte, o aplicaie care s-mi permit:
1. s m deplasez n agend oricum, de la nceput ctre sfrit sau invers, dar
alfabetic dup numele persoanei;
2. s aflu imediat ce telefon are X;
3. s pot afia toate cunotinele din localitatea Y;
4. s aflu informaii despre posesorul unui anumit numr de telefon Z;
5. s redactez felicitri (de Crciun!) pentru fiecare prieten.
Etape de lucru
1. Crem directorul C:\alfa unde vom
depune fiierele aplicaiei.
2. Deschidem Project Manager, selectnd
File, New, Project.
3. Crem o baz de date direct din Project
Manager, astfel: n fereastra utilitarului ne
poziionm pe directorul Database, apsm
butonul New i apelm aplicaia wizard.
Alegem baza de date AdressBook. La
ultimul pas selectm butonul radio pentru
modificarea bazei i intrm n Database Figura S2-1: Proiectarea bazei de date
Designer. Prin meniul contextual
intrm n fereastra Table Designer i
dm un nume corespunztor cmpurilor.
Atenie: trebuie schimbate i expresiile
de indexare.
4. Crem o machet ecran (un formular)
pentru introducerea datelor: ne poziionm
n fereastra Project Manager pe directorul
Documents/ Forms i ncepem crearea
Figura S2-2: Proiectarea formularului
unei machete prin clic pe butonul Add.
Studiul de caz II
271
Atenie! Pentru ca parola s fie considerat variabil, ea trebuie definit n fereastra View
Parameters din meniul Query. Pentru aceasta, ieim din View Wizard cu opiunea
Save local view and modify it in View Designer, care deschide automat View
Designer. Intrm n tab-ul Filter i vedem condiia pus. Selectm Query, View
Parameters i se deschide fereastra care se precizeaz c variabila Parola este
de tip caracter i este parametru de intrare. La rulare se cere introducerea valorii
acestui parametru. Astfel este creat fiierul Cutelefonul.vue care selecteaz
persoanele dintr-o anumit localitate introdus de operator.
8. Pentru obinerea persoanelor dintr-o localitate ca interogare lansat din meniul
aplicaiei vom folosi fiierul vedere creat anterior ntr-o interogare. Selectm
directorul Data, Queries i apsm butonul Add. Alegem Query Wizard. La
primul pas, indicm fiierul vedere pe care dorim s-l folosim, de exemplu
Dinlocalitatea. Selectm toate cmpurile acestei vederi, nu completm
clauza Filter i salvm sub numele Dinlocal.qpr. Destinaia va fi o fereastr
Browse. Deci cnd executm interogarea va fi solicitat numele localitii i vor fi
afiai ntr-o fereastr Browse prietenii din acea localitate.
9. Aplicaia este structurat ntr-un meniu. Dorim ca o prim parte s conin opiuni
despre aplicaie i autori, a doua s lanseze programul de introducere/vizualizare
prin formular. Consultrile vor fi alese dintr-o list de opiuni: informaii despre o
persoan dat prin numrul ei de telefon, cine are porecla X etc.
Pentru proiectarea meniului, ne poziionm pe directorul Other, subdirectorul
Menus. Butonul New apeleaz utilitarul Menu Builder. Trecem opiunile liniei
principale. Pentru afiarea unor scurte informaii, folosim editorul de texte, apoi
introducem n meniu comanda de deschidere Modify file text.txt.
Pentru apelarea formularului, nu uitm comanda DO FORM fis.sc.
Operaiile de consultare vor fi alese dintr-un submeniu. Comenzile asociate sunt DO
<numefis>.qpr. Pentru apelul raportului folosim comanda REPORT FORM
fis.frx, iar pentru etichete, LABEL FORM fis.lbx. Opiunii de iesire i asociem
comanda SET SYSMENU TO DEFAULT, pentru revenirea la meniul sistem.
Studiul de caz II
273
do meniuadrese.mpr
read events
release all
set talk (oldtalk)
return
STUDIUL
DE CAZ
III
275
276
Fiierul
executabil
webapp.exe este versiunea optim a distribuiei pentru internet (n
fereastra a aptea am
bifat opiunea Generate a web executable
file!). Prin lansare n
execuie, dezarhiveaz
automat pachetul de
distribuie ntr-un director
temporar, apoi lanseaz acelai setup.exe.
Directorul Disk144 este
creat pentru instalarea cu
dischete. n directorul Disk1 se
afl programul setup.exe,
care va realiza instalarea
aplicaiei.
9. Copiem coninutul directoarelor
pe cte o dischet i le predm
clientului.
10.Sfaturi pentru client:
Figura S3-4: Coninutul directorului pentru
Copiai pe hard disc cele trei
instalarea cu dischete
dischete i lansai aplicaia
setup.exe.
Alegei directorul unde va fi instalat aplicaia; eventual, pstrai calea
implicit, C:\BIBLI.
277
278
RSPUNSURI, COMENTARII,
INDICAII
Pag. 29
Tabela LECTURI conine:
titlu
autor
editura
an_i
an_e
nume_cit
date_pers
di
c,20
c,20
c,20
n,4
n,4
c,20
d,8
Dar,
Ce se ntmpl dac tergem articolul corespunztor unei cri scoase din inventar? Se vor
terge i informaiile despre cititor! ==> sunt anomalii de tergere
Ce se ntmpl dac se dorete adugarea unui nou cititor? Se va atepta mprumutarea
unei cri. ==> sunt anomalii de inserare
Unde gsim datele despre un cititor? n toate articolele corespunztoare crilor mprumutate
i nerestituite ==> sunt date redundante
Deficienele se datoreaz reinerii ntr-o singur tabel i a informaiilor despre cri i a celor
despre cititori. Rezolvarea acestor deficiene se realizeaz prin normalizare: mprirea relaiei
n alte dou relaii, iar fiecare s se ocupe de o tem distinct. Obinem urmtoarea structur:
CARTI.DBF(cod-carte, titlu, autor, date-despre-carte)
CITITORI.DBF(cod-cititor, nume, date_pers, cod-carte, data-imprumut)
Atunci cnd se mprumut o carte, se adaug un articol n tabela Cititori, iar cnd se restituie
cartea se caut articolul i se terge.
Dar,
Un cititor are adresa, date personale trecute de cte ori mprumut o carte, ceea ce
nseamn redundan.
Dac cititorul Z a mprumutat o singur carte i a restituit-o, pierdem datele personale ale acestuia!
Nu putem afla activitatea bibliotecii printr-un indicator de felul: numrul de cri mprumutate
ntr-un interval dat pentru c atunci cnd se restituie cartea, se va terge articolul din tabela
Cititori
Nu putem afla numrul de cititori nscrii la bibliotec pentru c fiierul CITITORI i reine doar
pe cei ce au mprumutat cel puin o carte.
Nu putem afla preferinele unui cititor, de cte ori a fost citit o carte etc.
Rafinm structura, mprind-o n alte tabele: una pentru informaiile de baz legate de cri, alta
pentru datele personale ale cititorilor bibliotecii i, n sfrit, o tabel cu operaii. Vom face codificarea
crilor printr-o informaie unic folosit pentru identificare i legtur ntre tabele (numr de inventar).
CARTI.DBF
Cod-carte
titlu
autor
editura
editie
an_i
cod_cit
nume
date_pers
Cod-carte
cod_cit
di
an_e
CITITOR.DBF
OPERATII.DBF
dr
279
Pag. 32
4. Comentarii: Cheia relaiei nu poate fi dect perechea (student, sala). Dar atributul Taxa este
dependent doar de sal. Nu ar exista anomalii dac dependena ar fi total. Observai c taxa
pentru o sal este pierdut dac se terge articolul despre studentul care a nchiriat-o. Nu putem
introduce informaii despre sli i taxe pn cnd nu exist un student care s nchirieze
respectivele sli. Se normalizeaz relaia i se obin relaiile SALI (nume-sal, taxa) i CHIRII
(cod_student, sala).
5. Comentarii: Cheia este buletinul turistului (un atribut) dar, se pare c, mpreun cu atributul
hotel, determin atributul Taxa, ceea ce nu este corect. Spunem c Buletin determin funcional
atributul Taxa. Putem i trebuie s nlturm anomalia prin separarea relaiei n alte dou relaii
CAZARE (turist, buletin, hotel) i TAXE (hotel, taxe/loc).
6. Comentarii: n exemplul acesta apar dou chei posibile: (depozit, material) i (depozit,
furnizor). n plus, fa de cele dou chei candidate, exist i o dependen funcional ntre
furnizor i material. Anomalii de actualizare: dac tergem articolul al treilea, se pierde informaia
c furnizorul Metalcar produce Carcase. Se rezolv prin spargerea relaiei n alte dou relaii:
STOC (depozit, material, stoc) i FURNIZOR (furnizor, material).
Pag. 63
I.
ECHIPE (echipa C(9),grupa C(1))
Sarcini
280
Rezolvri
sele 2
list for nume=Popescu
sele camp
list next 3 alte_inf
sele campion
list e1, e2, data for Popescu $ arbitri
sele ec
list for grupa=A
sele juc
list for echipa=Rapid and iesire={//}
sele camp
set filter to e1=Rapid or e2=Rapid
list loc, data, e1, e2
sele 1
list e1 for p1<p2
Afiai componena
echipelor care joac la data
{01.06.99}, pe stadionul
Plaiesilor? Presupunem
c este un singur meci.
select 1
locate for data={01.06.99} .and. loc=Sportu
sele 2
? echipa + a->e1+ este formata din :
list nume for b->echipa=a->e1
? echipa + a->e2+ este formata din :
list nume for b->echipa=a->e2
go top in 1
sele 2
? capitanul echipei +a->e1, este, lookup
(b->nume, a->e1 , b->echipa)
? capitanul echipei +a->e2, este
?? lookup(b->nume, a->e2, b->echipa)
sele b
echipa1=lookup(b->echipa,Albu,b->nume)
echipa2=lookup(b->echipa,Barbu,b->nume)
sele 1
list for A->e1=echipa1 .and. A->e2=echipa2 or
A->e1=echipa2 .and. A->e2=echipa1
Listai programul
competiional de sptmna
viitoare, ordonat cronologic.
sele camp
sort on data to man for between(data, date(),
date()+7)
select 0
use man
list fields e1,e2,data, loc
Sele camp
Sort on e1,data to man
Select 0
Use man
List
Pag. 110
3. Fie tabela MECI (e1 C(10), e2 C(10), g1 N(2) ,g2 N(2)) unde e1, e2 =codul celor dou echipe,
g1=numrul de goluri marcate de e1; g2=numrul de goluri marcate de e2.
&& clasam.prg
create dbf manevra (cod N(2), echipa C(10), puncte N(5), golaveraj N(5))
use manevra in select (0) alias man
sele meci
&&parcurgem meciurile i completm tabela menevra
scan
sele man
locate for man.cod=meci.e1
if not foun()
append blank
replace cod with meci.e1
endif
repl man.puncte with man.puncte+iif(meci.g1>meci.g2,2,;
iif(meci.g1=meci.g2,1,0))
repl man.golaveraj with man.golaveraj+meci.g1-meci.g2
locate for man.cod=meci.e2
Rspunsuri, comentarii, indicaii
281
if not found()
append blank
replace man.cod with meci.e2
endif
repl man.puncte with man.puncte+iif(meci.g2>meci.g1,2,;
iif(meci.g1=meci.g2,1,0))
repl man.golaveraj with man.golaveraj+meci.g2-meci.g1
sele meci
endscan
sele man
index on str(punctaj)+str(golaveraj) tag v
List
4. Concurenti (nume C(10),grupa C(3),nr N(2),ts
Concurs(grupa C(3), start C(5), interval N(2))
1) Procedura de citire a concurenilor
sele concurenti
clear
accept nume to m.nume
accept data nasterii to dn
accept SEX to sex
C(8),tp C(8))
varsta=year(date())-year(dn)
replace grupa with
sex+ltrim(str(varsta))
replace nume with m.nume
282
Varianta 4:
use concurenti in 1
index on grupa tag xx unique
copy to array A
index on grupa+nume tag x
for i=1 to alen(A,1)
n=0
locate for grupa=A[i,1]
do while found()
n=n+1
replace nr with m.n
continue
enddo
endfor
283
284
function f1
&&verificare completitudine date
public array p[10]
if not (file(conc.dbf) and;
file(minime.mem) and;
file(rezult.dbf))
wait date de plecare incomplete
rezult=.F.
else
restore from minime
additive
select 1
use rezult
&& verificare corectitudine fisier
&& rezult
nr_criterii=alen(P)
select 2
use conc
nr_candidat=reccount(2)
use
sele rezult
index on nume+str(criteriu);
tag n unique
count to z
if z # nr_candidat*nr_criterii
rezult=.f.
else
rezult=.T.
endif
set order to 0
&& fisierul rezult este lasat
&& neordonat
delete tag n
&& stergem reperul index
anterior
&& creat
endif
return rezult
function f2
&& punctajul maxim la un criteriu
dat
&& ca parametru
parameters x
calculate max(punctaj) for;
criteriu=x to y
return y
procedure p3
&& lista castigatorilor pe
criterii
select rezult
set heading off
for i=1 to alen(p)
ma=f2(i)
?rezultatul cel mai bun la;
criteriul , i
list nume, punctaj for
criteriu=i;
and punctaj=ma
endfor
set heading on
return
procedure p1
&& trece sub forma de tabel
&& rezultatele
select rezult
index on nume tag nume unique
count to g
nr_criterii=alen(p)
dimension a[g, nr_criterii+1]
copy to array a field nume
delete tag nume
index on nume tag nume
&& fara selectie unica
text
&& varianta de rezolvare
scan
poz=ascan(a, a.nume,1)
a[asubscript(a,poz,1),
criteriu+1]=punctaj
endscan
endtext && sfarsit varianta
for i=1 to alen(a,1)
locate for nume= a[i,1]
do while found()
a[i,criteriu+1] =punctaj
continue
enddo
endfor
*afisare tablou*
for i=1 to alen(a,1)
?
for j=1 to alen(a,2)
?? a[i,j],
endfor
endfor
return
function f4
&& determina persoanele
necalificate
&& la un criteriu si castigatoare
&& la altul
public array pers[20]
nr_caz=0
select rezult
index on nume tag nume
do while not eof()
x=nume
store .f. to bun, rau
do while not eof() and nume=x
rau=deleted()
if punctaj = f2(criteriu)
bun=.T.
endif
procedure p2
&& marcare persoane care nu au
&& punctajul de calificare
select rezult
recall all
delete all for
punctaj<p[criteriu]
copy to manevra for deleted()
select 2
use manevra
scan
sele 1
delete for b.nume=a.nume
sele 2
endscan
use
erase manevra.dbf
sele 1
index on nume tag nume unique
list for deleted()
set order to 0
return
function f3
&& criteriile unde sunt mai
multi
&& castigatori
sir=
for i=1 to alen(p)
ma=f2(i)
count for criteriu=i and;
punctaj=ma to zz
if zz>1
sir=sir+iif(empty(sir),str(i,3),
,+str(i,3))
endif
endfor
return sir
procedure p4
&& lista primilor trei clasati*
sele rezult
index on nume tag nume for;
not deleted()
total on nume field punctaj to
total
sele 2
use total
index on punctaj tag pct1;
descending unique
copy to man_unic
index on punctaj tag pct2 desc
sele 3
use man_unic
i=0
scan next 3
285
i=i+1
? premiul , i
sele 2
list nume for b.punctaj=c.punctaj
sele 3
endscan
sele 3
use
erase man_unic.dbf
return
skip
if eof()
exit
endif
enddo
if bun and rau
nr_caz=nr_caz+1
pers[nr_caz]=x
endif
enddo
return nr_caz
Pag. 147
1. Calculul necesarului de aprovizionat
procedure calcul
create dbf nec (mat n(1), nt n(5), na
n(5))
use stoc in 1
use plan in 2
use consum in 3
use nec in 4
sele 3
index on mat tag mat
do while not eof(3)
x=mat
sum c.cant* cautplan(c.prod) while;
c.mat=x to y
do adauga_art with x, y
enddo
sele 4
repl all na with nt-cautstoc(d.mat)
list
return
function cautplan
param cod
sele 2
locate for b.prod=cod
if found()
rez=b.cant
else
rez=0
endif
sele 3
return rez
286
Varianta 1:
Se va crea un fiier NEC cu necesarul
total (cmpul NT) i necesarul de
aprovizionat (cmpul NA) pentru
fiecare cod-material (cmpul MAT).
Ordonm fiierul CONSUM pe
materiale.
Pentru fiecare material i:
facem suma produselor dintre
cantitatea unitar necesar pentru
produsul j i planul pentru produsul j
generm un articol n fiierul NEC
Completm cmpul NA
Afiare
procedure adauga_art
param x, y
sele 4
append blank
repl mat with x,nt;
with y
sele 3
return
function cautstoc
param x
sele 1
locate for a.mat=x
sele 4
return
iif(found(1),a.cant,0)
Varianta 2:
1. Se folosete o tabel de manevr
(copie a fiierului CONSUM)
nlocuind cmpul CANT cu
produsul dintre cantitatea necesar
i planul pentru produsul
corespunztor.
2. Se face totalizarea pentru acelai
material n fiierul TOT.
3. Se poate completa necesarul de
aprovizionat n cmpul PROD
(atenie la lungimea codului de
produs!) prin diferena dintre
necesarul total (aflat n cmpul
CANT) i stocul din materialul
corespunztor.
4. Se afieaz.
function cautstoc
param x
sele 3
return iif(seek(x, 1), a.cant, 0)
sele 2
use plan
index on prod tag prod
sele 3
use consum
set relation to prod into b
sele 1
create table nec (mat N(5),;
cant N(5), na N(5))
append from stoc
repl all a.na with suma(a.mat)
? material, necesar total, necesar;
de aprovizionat
list mat, na, na-cant
return
function suma
param x
sele 3
sum c.cant*b.cant for c.mat=x to y
sele 1
return y
Varianta 3:
Se folosete relaia dintre fiierul
CONSUM i PLAN pe atributul PROD.
Se presupune c fiierul STOC are
toate codurile de materiale chiar dac
stocul este zero.
Pentru fiecare cod material din stocuri
se scade suma produselor consum
unitar i plan
Varianta 4:
Putem organiza datele n tablouri i vom nota:
1. Tabloul consum specific C(i,j) conine: cantitatea necesar din materialul i pentru realizarea
unei uniti din produsul j (i = 1,n produse, j = 1,m materiale);
2. Vectorul plan P(i) = cantitatea planificat a fi realizat din produsul i;
287
Presupunem c fiierul STOC nu are toate codurile de materiale, ci numai cele cu stoc
pozitiv, fiierul Plan, de asemenea, nu conine dect acele coduri de produse care se
fabric la un moment dat.
Pentru dimensionarea tablourilor vom determina att codul de valoare maxim pentru
materiale, ct i pentru produse din fiierele corespunztoare.
Dup calculare, se trec rezultatele n baza de date NEC(mat, nt, na), unde mat=codul
materialelor, nt=necesar total, na= necesar de aprovizionat.
&& program principal
nmat=det_cod(1)
nprod=det_cod(2)
dimension
cs(nmat,nprod),P(nprod),s(nmat),;
nt(nmat), na(nmat)
store 0 to cs, s, p, nt, na
do incarca with 1
do incarca with 2
do incarca with 3
do calcul_nt && Nt= CS*P
do afis with nt
&& afisare vector NT
do calcul_na
&& NA=NT-S
do afis with na
&& afisare vector NA
function det_cod
param cod
sele 1
use consum
calculate max(mat),
max(prod) to xm, xp
if cod=1
use stoc
calculate max(mat) to ym
use
return max(xm, ym)
else
use plan
calculate max(prod) to yp
use
return max(xp, yp)
endif
endif
288
&&continuare
sele 1
create dbf nec (mat N(5),nt;
N(5),na N(5))
for i=1 to nmat
append blank
repl mat with i,nt with
nt[i],;
na with na[i]
endfor
delete for nt=0
pack &&articole
close all
&&nefolosite
return
procedure incarca
param x
do case
case x=1
use consum
scan for mat#0 and
prod#0
CS[mat, prod]=cant
endscan
case x=2
use plan
scan for prod#0
P[prod]=cant
endscan
otherwise
use stoc
scan for mat#0
S[mat]=cant
endscan
endcase
return
procedure calcul_nt
for i=1 to nmat
nt[i]=0
for j=1 to nprod
nt[i]=nt[i]+cs[i, j]*P[j]
endfor
endfor
return
procedure calcul_na
for i=1 to nmat
NA[i]=NT[i]-S[i]
endfor
return
procedure afis
param v
?
for i=1 to alen(v)
if v[i]>0
?? str(v[i], 5)
endif
endfor
return