Documente Academic
Documente Profesional
Documente Cultură
Cuprins 3
Capitolul 12 Programarea clasic Proiectarea paginilor web pentru vizualizarea
n FoxPro . . . . . . . . . . . . . . .106 datelor pe internet . . . . . . . . . . . . . . . . . .168
Structura alternativ i comanda IF...ENDIF . .106 Proiectarea paginilor de cutare
pe Internet . . . . . . . . . . . . . . . . . . . . . . . .169
Structura selectiv i comanda
DO CASE...ENDCASE . . . . . . . . . . . . . .106 Proiectarea i transmiterea documentelor
prin e-mail. Utilitarul Mail Merge Wizard .170
Structura repetitiv i comanda
DO WHILE...ENDDO . . . . . . . . . . . . . . . .106 Recapitulare . . . . . . . . . . . . . . . . . . . . . . .172
Structura repetitiv i comanda
SCAN...ENDSCAN . . . . . . . . . . . . . . . . .107 Capitolul 16 Elemente de programare
Structura repetitiv i comanda orientat spre obiecte . . . . .175
FOR...ENDFOR . . . . . . . . . . . . . . . . . . . .107 Proprietile definitorii ale claselor . . . . . . . .177
Ieiri forate: LOOP i EXIT . . . . . . . . . . . . . .107 Comenzile FoxPro necesare
Proceduri utilizator . . . . . . . . . . . . . . . . . . . . .111 programrii obiectelor . . . . . . . . . . . . . . .177
Funcii utilizator . . . . . . . . . . . . . . . . . . . . . . .111 Capitolul 17 Proiectarea formularelor . . .181
Activitatea de depanare a programelor . . . . .116
Generatorul de formulare (Form Designer) . .182
Sfaturi pentru depistarea i eliminarea
Proiectarea unui formular prin Quick Form . .187
erorilor . . . . . . . . . . . . . . . . . . . . . . . . . . .117
Proiectarea vizual a obiectelor de interfa . .190
Strategii de depanare . . . . . . . . . . . . . . . . . .119
Proiectarea interfeei folosind Form Wizard . .212
Utilizarea instrumentului Debugger . . . . . . . .119
Capitolul 18 Afiarea datelor sub form
Capitolul 13 Operaii cu baze de date
de rapoarte . . . . . . . . . . . . . .217
n Visual FoxPro . . . . . . . . . .124
Rapoarte . . . . . . . . . . . . . . . . . . . . . . . . . . . .217
Descrierea operaiilor cu baze de date
prin comenzi . . . . . . . . . . . . . . . . . . . . . .124 Etichete . . . . . . . . . . . . . . . . . . . . . . . . . . . . .229
Gestiunea interactiv a bazei de date. Grafice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .231
Database Designer . . . . . . . . . . . . . . . . .125 Capitolul 19 Proiectarea meniurilor . . . . .234
Crearea rapid a unei baze de date cu Generatorul de meniuri Menu Builder . . . . . .234
Database Wizard . . . . . . . . . . . . . . . . . . .126
Deschiderea i activarea Capitolul 20Proiecte i aplicaii . . . . . . . .238
unei baze de date . . . . . . . . . . . . . . . . . .127 Conducerea aplicaiei printr-un
Operaii asupra unei tabele incluse program monitor . . . . . . . . . . . . . . . . . . .238
n baza de date . . . . . . . . . . . . . . . . . . . .128 Organizarea aplicaiei sub form
Proiectarea interactiv a tabelei de proiecte. Project Builder . . . . . . . . . . .239
prin Table Designer . . . . . . . . . . . . . . . . .131 Generarea aplicaiilor executabile
Fixarea relaiilor persistente ntre tabelele cu Project Manager . . . . . . . . . . . . . . . . .241
unei baze de date . . . . . . . . . . . . . . . . . .135 Realizarea dischetelor de distribuie . . . . . . .243
Proceduri stocate . . . . . . . . . . . . . . . . . . . . .138
Declanatoare . . . . . . . . . . . . . . . . . . . . . . . .139 Capitolul 21 Dezvoltarea profesional
Proiectarea regulilor de integritate n domeniul IT . . . . . . . . . . .246
a bazei de date . . . . . . . . . . . . . . . . . . . .140 Capitolul 22 Teme opionale . . . . . . . . . .248
Capitolul 14 Interogarea bazelor de date . .145 Protecia bazelor de date . . . . . . . . . . . . . . .248
Definirea interogrilor prin comanda Tehnici avansate de gestiune a structurii
SELECT . . . . . . . . . . . . . . . . . . . . . . . . . .145 conceptuale a unei tabele . . . . . . . . . . . .251
Proiectarea vizual a interogrilor . . . . . . . . .149
Capitolul 23 Dezvoltarea unei aplicaii
Proiectarea fiierelor View . . . . . . . . . . . . . . .158
informatice . . . . . . . . . . . . . .255
Capitolul 15 Comunicarea aplicaiei Visual Aspecte teoretice . . . . . . . . . . . . . . . . . . . . . .255
FoxPro cu alte aplicaii . . . .166 Proiectul final . . . . . . . . . . . . . . . . . . . . . . . . .261
Proiectarea fiierelor vedere cu date
la distan . . . . . . . . . . . . . . . . . . . . . . . .166 Studii de caz . . . . . . . . . . . . . . . . . . . . . . .266
Proiectarea rapid a vederilor
cu Remote View Wizard . . . . . . . . . . . . .167 Rspunsuri, comentarii, indicaii . . . . . . .279
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.
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.
4. 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?
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 printr-
un 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.
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.
sarcini de laborator
1. Cutai pe Internet personaliti n domeniul tehnologiei informaiei i realizai o
prezentare PowerPoint despre una dintre ele (cine este, ce contribuie i-a adus, unde
lucreaz, de ce credei c acea persoan a devenit lider i nu s-a mulumit cu un simplu
job, ce caliti, interese, aptitudini personale are, de ce ai ales-o).
2. Scriei un eseu Ce tiu despre mine! urmrind rspunsuri la ntrebri de felul urmtor:
Ce mi place s fac? Ce meserie a face dac a fi pltit i ce a face chiar gratis
pentru c mi place foarte mult?
Ce tiu s fac? La ce sunt bun?
Unde m voi duce dup terminarea scolii? Ce carier mi se pare cea mai
probabil, judecnd dup calitile mele?
a. Modelul ierarhic
Este considerat primul model
utilizat n structurarea bazelor de
date i presupune ierarhizarea en-
Figura 1-5: Exemplu de model ierarhic
titilor ntr-o structur de tip arbore,
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 ascen-
dent. Pot fi modelate i relaiile
n-n (COLIn, nPROFESORI). Figura 1-6: Exemplu de model reea
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.
e. Modelul obiect-relaional
Este o abordare recent, care prevede extinderea modelului relaional pentru a
ncorpora elemente de programare orientat spre obiecte, dar cu pstrarea tehnologiilor
2 Pe baza modelului ierarhic au fost concepute primele SGBD-uri, cel mai reprezentativ fiind IMS
(Information Management System) al firmei IBM.
3. Grila informaional
Documente Informaii RI FC FCIT Li Of C F SIT
Titlu * * * * * *
Autor * * * * * *
Domeniu * * *
Editura * * * * *
Adresa-editurii * * *
Date-pers autori *
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.
cititori
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.
B. Relaia 1-n: Unui articol al tabelei printe i corespunde unul sau mai multe
articole ale tabelei copil, iar unui articol al tabelei copil i corespunde un singur
articol n tabela printe.
Procedurile stocate sunt secvene de program care fac parte integrant din baza
de date i sunt ncrcate automat n memorie la deschiderea bazei. Declanatoarele
(triggers) sunt folosite pentru validarea tabelelor, a valorilor unor articole sau atribute
etc. Numele de declanatoare poate fi explicat prin faptul c procedura este invocat
automat cnd un eveniment (adugare, inserare, tergere) modific o tabel.
Principalul lor obiectiv este pstrarea integritii refereniale a bazei de date.
Orice modificare a datelor din tabelele surs se reflect automat n tabela virtual.
Studiu de caz
Definirea restriciilor de integritate
Definim n contextul bazei de date SCOALA urmtoarele tabele: CLASE, ELEVI,
PROFESORI, OBIECTE, INCADRARE (codcl=codul clasei, codo=codul obiectului,
codp=codul profesorului, codel=codul elevului).
incadrare profesori
codcl codo codp codp nume spec
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. Proiectai SCHEMA RELATIONAL.
com data furn adr cod1 cod2 cod3 cod4 cant val
006 01.03.98 f1 Bc a23 b66 c33 10 12980
007 01.09.98 f1 Bc c33 12 12000
Verificm respectarea definiiei anterioare: nu sunt linii identice, nu sunt valori de
tipuri diferite n coloane, cheia este atributul Com (numr comand). Dar:
a) dac exist comenzi cu mai mult de 4 produse?
b) dac sunt comandate cantiti diferite din toate produsele?
c) unde este plasat preul fiecrui produs?
d) prelucrri de tipul valoarea total a comenzilor pentru produsul b66 necesit
verificarea tuturor coloanelor i nsumarea rezultatelor pentru ntreaga baz de
date, lucru care conduce la un timp mare de rspuns.
Deci se impune eliminarea cmpurilor care se repet i astfel se ajunge la prima
form normal:
comanda data furn adr codprod cant pret valoare
006 01.03.98 f1 Bc a23 10 100 12980
006 01.03.98 f1 Bc b66 10 200 12980
006 01.03.98 f1 Bc c33 10 150 12980
007 01.09.98 f1 Bc c33 12 150 12000
n aceast tabel, cheia este compus din atributele (comanda + codprod).
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 La sosirea unei cri adaug o linie n Carti. La
(nr_inventar, titlu, autor, editura, scoaterea din inventar trec anul ieirii crii. La
an_intrare, an_ieire) mprumut caut cartea i completez n tabela
CITITORI Cititori codul crii i data mprumutului. La
(cod_cit, nume, adresa, telefon, restituire caut cititorul i terg codul crii i
nr_inventar, data_imprumutului) data mprumutului.
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,
Varianta 3
CARTI La sosirea unei cri adaug o linie n Carti.
(nr_inventar, titlu, autor, editura, La scoaterea din inventar trec anul ieirii crii.
an_intr, an_ies, cod_cititor, La mprumut completez n tabela Carti codul
data_imprumut) cititorului i data mprumutului.
CITITORI La restituire caut cartea i terg valoarea din
(cod, nume, date-pers) codul crii i data mprumutului.
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 La sosirea unei cri adaug o linie n Carti.
(nr-inv, titlu, autor, editura, an_intr, La scoaterea din inventar trec anul ieirii crii.
an_ies) La mprumut completez n operaii un nou
CITITORI articol cu numrul de inventar codul cititorului i
(cod_cit, nume, date_pers) data_mprumutului.
OPERATII La restituire caut n operaii i completez data-
restituirii.
(nr_inv, cod_cit, data_imprumut,
data_restituire) La sosirea unui nou cititor adaug o linie n Cititori.
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!
Varianta 5
CARTI Operaiile de mprumut sunt nregistrate n
(nr-inv, date-despre carte) tabela Imprumuturi odat cu efectuarea lor. La
CITITORI restituire, caut n operaii i mut articolul n
(cod_cit, date_pers) tabela Restituiri.
IMPRUMUTURI
(nr_inv, cod_cit, data_imprumut)
RESTITUIRI
(cod-carte, cod-cititor,
data_imprumut, data-restituire)
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. Analizai i normalizai tabela ELEVI. Presupunem codul elevului ca fiind chiar
numrul curent n clas.
Clasa Cod-elev nume_elev adresa diriginte
11a 1 popa iasi albu
11a 2 iancu bacau albu
3.
Fie tabela urmtoare, coninnd numele cursurilor, profesorii, numrul de ore
pentru aceste cursuri, precum i numele elevilor care au optat pentru cursuri.
Nume_curs nume_prof nume_elev Nr-ore grad
Astronomie popa albu 100 prof.def
Astronomie popa barbu 100 prof.gr.1
Meteorologie florea doltu 200 lector
5. Evidena cazrilor turitilor n hotelurile unei staiuni este inut n tabela TURIST.
Este corect evidena?
Turist bi hotel taxa/loc
apopei eduard as123456 lido 1200
dorneanu mihai gf345675 lido 1200
enache sorin bv512345 parc 1400
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:
Fereastra de comenzi, care permite introducerea direct a
comenzilor; Figura 3-2:
Fereastra de proiectare, care permite editarea programelor, Exemplu de
meniu contextual
a machetelor, a rapoartelor etc.;
Fereastra de dialog, care permite completarea unei aciuni conform preferinelor
utilizatorului; ca exemplu, observai fereastra Open, prin care precizai discul,
directorul i fiierul care va fi deschis;
Fereastra de mesaje, prin care sistemul avertizeaz sau informeaz asupra
efectelor unei aciuni (eronate, riscante) a utilizatorului, solicitnd confirmarea
privind modalitatea de continuare sau abandonarea aciunii.
Obiectele de control sunt alte elemente de interfa cu funcii i aspect recunoscut
din mediul Windows. Lucrul cu obiectele de control este cunoscut din leciile anterioare.
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.
sarcini de laborator
I. Sarcini pentru familiarizarea cu elementele de interfa
Intrai n mediul FoxPro; observai meniul principal, selectai diverse opiuni; folosind
fereastra de comenzi, executai cteva operaii:
mutare minimizare
redimensionare nchidere
expandare deschidere
1. Creai cu un editor de texte oarecare un fiier text denumit APLIC.TXT.
Deschidei fereastra de editare a fiierului APLIC.TXT.
2. Modificai poziia ferestrei de editare; redimensionai fereastra.
3. tergei vechiul coninut; scriei un alt text. Selectai o zon din acest text i
multiplicai-o de 3 ori.
4. Selectai o zon din acest text i tergei-o; duplicai textul, crend un alt fiier,
denumit APLIC2.TXT.
5. Deschidei cele dou fiiere n dou ferestre, prezente simultan pe ecran.
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!
Exemplu
.set default to d:\fox\exempl Poziionare n directorul exempl.
set path to d:\fox, c:\ Deschide tabela elevi. Dac nu se gsete n
use elevi directorul curent, se va cuta n D:\Fox sau c:\.
Dir Afieaz bazele de date din directorul curent
dir *.* Afieaz toate fiierele din directorul curent
dir d:\fox\*.txt Afieaz lista fiierelor text din d:\fox.
set default to c:\fox Schimb directorul curent la c:\fox.
copy file elev.dbf Copiaz fiierul ELEV.DBF din directorul curent
to d:\fox\student.dbf n directorul d:\fox sub numele STUDENT.DBF.
!copy *.txt a: Copiaz toate fiierele text pe dischet.
Erase *.txt terge fiierele text din directorul curent.
rename elevi.dbf to student.txt Schimb numele fiierului.
?curdir() Afieaz numele directorului curent.
Cd getdir() Poziionare n directorul al crui nume l
introducei de la tastatur.
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 Descriere
Numeric 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.
Float n VMSP pe 4 B
Double Pentru valori ntre -4.9E-324 i 1.79E308 n VMDP pe 8 B.
Integer Pentru valori ntregi ntre -2147483647 i +2147483646 pe 4 B.
Currency Valori monetare ntre -9*10**14 i +9*10**14; pe 8 B.
Operatori
Aritmetici +, -, *, /, ** (ridicare la putere), % (modulo)
Relaionali <, >, <=, >=, # sau <>sau != (diferit), = (egal)
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
Tipul DateTime este folosit pentru a memora valori ce conin att data, ct i ora.
Regulile sunt aceleai ca la tipul Date.
Exemplu: {12/12/1999 10:03:09}
Comenzi utile
SET CENTURY ON/OFF Specific anul, inclusiv secolul.
SET DATE GERMAN/AMERICAN/... Specific formatul de dat.
Operatori
Aritmetici + (adun) sau - (scade) un numr de zile la o dat
Exemplu: {01.01.2001}+3={04.01.2001}
Relaionali <, <=, >, >=, =, <>, #, !=
Exemplu: {01.01.2001} < {12.31.2001)=T.
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 5 f. 5 5 .f. .f. .f. .f.
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>.
Lucrul cu imprimanta
Sunt disponibile dou comenzi care direcioneaz efectul comenzilor de afiare
ctre imprimant.
Comanda Efect
SET PRINTER ON/OFF Activarea/dezactivarea imprimatei.
SET DEVICE TO PRINTER/ TO SCREEN Direcionarea comenzii ctre imprimat
sau ecran.
Comenzi Efect
store 0 to a, b, c Variabilele numerice a, b, c sunt iniializate
b=alfa cu valoarea zero; este modificat
coninutul i tipul variabilei b.
? "a=",a Se afieaz a=0.
x={01. 09. 95} Se creeaz variabila x de tip dat calendaristic.
@ 1,5 say "data="+dtoc(x) Se afieaz din punctul 1,5 expresia
data=01091995.
input "nume?" to nume Pentru citirea unui ir trebuie dai i
delimitatoriii acestuia.
accept "nume?" to nume Nu mai este nevoie de delimitatori.
accept "varsta?" to v Atenie! Vrsta va fi tot de tip caracter.
release all like a* Se terg variabilele care ncep cu a.
save to beta all like a Se salveaz n fiierul beta.mem variabila a.
@ 2,2 get b picture 99.99 Se afieaz o zon de editare i se
default 2.00 valid b<=10.00 ateapt introducerea valorii pentru
read variabila b; iniial variabila b=2.00;
nu se prsete zona de editare dac
valoarea introdus este mai mare ca 10.
set printer on Se direcioneaz efectul comenzii de
? 'text' afiare ? ctre imprimant.
Set device to printer Se direcioneaz efectul comenzii de
Set printer on afiare @ ctre imprimant.
@ 1,5 say 'text'
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. Fie MATRICOL="10A25". Extragei n variabile distincte informaiile anul, litera i
numrul de ordine. Afiai o expresie, recompunnd matricolul.
5 Crearea tabelelor
Definirea structurii unui tabel 1
Modificarea structurii conceptuale a unui tabel
Editarea cmpurilor a unui tabel
Popularea (ncrcarea) tabelului cu date
Deschiderea i nchiderea unui tabel
Filtrarea structurii sau selectarea cmpurilor
Filtrarea articolelor
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.
e) Index permite crearea unui index avnd cmpul curent drept cheie;
f) NULL este un comutator pentru acceptarea sau nu a valorilor nule.
Interogri Analiza
1. Care sunt elevii colii, n ordine Tabela va trebui s conin numele i prenumele
alfabetic? fiecrui elev ca un singur cmp, de tip Caracter.
Pentru obinerea informaiilor ordonate alfabetic,
trebuie precizat cmpul drept criteriu de indexare!
2. Cine locuiete la cmin? Care Putem specifica printr-un cmp Logic dac
este adresa stabil a cminitilor? elevul este sau nu cminist. Pentru adres vom
folosi tipul Memo.
4. Care este situaia colar a Putem reine mediile la toate obiectele, iar
elevului POPA ION (promovat, comparnd aceste medii cu 5 s obinem situaia
corigent, repetent)? cerut. Dar observm c nu exist alt referire la
mediile pe obiecte (sunt i multe!), deci vom
putea reine informaia solicitat ca text.
5. Care este cea mai mare Prelucrarea tabelei va determina maximul dintre
medie? valorile unui cmp. Media de absolvire va fi
definit ca tip numeric cu 2 zecimale.
8. Cum arat eful clasei a X-a A? Pentru a reine fotografiile elevilor, vom proiecta
un cmp de tip General. Prelucrarea va
determina elevul cu media cea mai mare din
clasa a X-a i va afia fotografia sa.
Exemple
Select 2 Zona 2 va contine tabela Profesori.dbf.
use profesori
modify structure Modificarea structurii fiierului din zona curent.
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.
3. Lista crilor din colecia Este necesar n tabela Carti atributul colectie de tip ir de
De dragoste. caractere.
3. Lista cititorilor nscrii la Este necesar n tabela Cititori atributul data-naterii, de tip
bibliotec mai mici ca 15 ani. dat calendaristic.
5. Sunt cititori restanieri? Vom filtra tabela Operaii pentru data restituirii necompletat
i numrul de zile de la data mprumutului peste 14. Dac
numrul de articole accesibile este diferit de zero afim da.
6. Care a fost ultimul n tabela Operaii ne vom poziiona pe ultimul articol i vom
mprumut nregistrat? Cine afla din tabela Carti titlul i din tabela Cititori numele
a mprumutat i ce carte? persoanei.
sarcini de laborator
I. Creai structura tabelelor pentru baza de date Bibiloteca.
II. Creai structura unei tabele FACTURI.DBF cu date despre facturile neachitate
(identificate prin numr, data, valoare) trimise de ctre furnizori (nume-furnizor, adresa,
telefon). Presupunem c la sosirea unei facturi se adaug o nou linie, iar la achitare
se terge linia.
III. Evidena judectorilor din diferite judectorii i a activitaii fiecrui judector este
inut n fiierul JUDECATORI. Proiectai structura necesar pentru a afla:
1. Cte cazuri de trafic de valut au fost anul acesta comparativ cu anul trecut?
2. Care au fost dosarele n care verdictul a fost achitat?
3. n ce dosare s-a dat pedeapsa maxim?
4. La ce dosare (cazuri) a lucrat persoana X?
5. Cte dintre cazurile la care a lucrat anchetatorul X au fost abandonate?
Exemplu Fie tabela Studenti cu informaii despre studenii unei faculti. Vom
reine codul, numele, grupa, anul i numele unui curs opional.
use studenti
list && LIST are domeniul implicit ALL
# cods numes grupa anul numec
1 1 Dumitru Alina 1 1 info
2 2 Luca Stefan 1 1 mate
3 3 Amarandei Ion 1 2 info
4 4 Alexa Ioana 2 1 engleza
5 5 Nucu Mary 3 2 chineza
Go top && poziionare pe primul articol
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 sele 1
existente (ordonate sort on autori to man
dup autori)? use man
list titlu,autori,editura,colectia,pret
b) Ce cri au intrat sau sele carti
au ieit dup anul 1994? list titlu, autori for an-intrare>=1994 or;
an-iesire>=1994
c) Care este lista crilor sele carti
din colecia De dragoste? list for colectie=dragoste
sarcini de laborator
I. Fie urmtoarele tabele:
4. Care sunt apartamentele unde locuiesc mai mult de dou persoane ntr-o camer?
5. Cte apartamente sunt proprietate personal n imobilul X?
III. Stabilii structura bazei de date pentru urmtoarea situaie-problem!
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.
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!!
Exemplu 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:
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).
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 Accept 'nume cititor' to x
retrage.
Se caut n tabela CITITORI i se Sele cititori
reine codul. Cod=lookup(cod_cit, x, nume)
Delete all for nume=X
Pack
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, numr-
nopi, suma-spor-noapte, reineri, rest-plat). Se cere:
1. Afiai persoanele care lucreaz n societate.
2. Ce salariu are o persoan al crei nume este introdus de la tastatur?
3. Care sunt persoanele fr copii n funcii de administraie?
4. Alocaia de stat pentru copii se calculeaz ca o sum fix nmulit cu numrul
de copii. Trecei n baza de date alocaia.
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 Observai lipsa datelor din
buletin: seria AD, numr 457890
articolul 2?
3 adresa: Iai, str Tudor Vladimirescu, nr 5
bl e4, sc a, et 5, ap 9
telefon: 672134
buletin: seria D4, numr 9080897
Se alege Deschide o
tipul fereastr
obiectului. pentru
alegerea
obiectului.
Legarea coninutului
clipboard-ului de cmpul
Alegei tipul obiectului
General
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()
14.Aflai care este concurentul cu cel mai mare punctaj la proba 1?
&& Use concurenti
&& Sort on proba1/d to man
&& Use man
&& X=proba1
&& List while proba1=
Indexarea tabelelor
Indexarea este o metod de accesare rapid, ntr-o manier ordonat, a coninu-
tului 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.
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.
4. Funcii
Funcie Efect
=TAG (<nr-index>) Numele unui reper-index care ocup pozia
<nr_index>
=TAGNO(<nume-reper>) Poziia pe care o ocup un index dat.
=KEY (<nr-index>) Expresia cheii de indexare pentru reperul-index
care ocup poziia <nr-index>
=ORDER([<nr-zona>]) Numele indexului activ.
=TAGCOUNT([<zona>]) Numrul de repere index din multiindex.
2. Fie baza de date MECIURI care reine toate meciurile unui campionat:
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;
3. Dorim s gsim media elevului Stan Ana din 12C folosind comanda Seek. Care
variant este corect?
use elevi Use elevi
index on cls+nume+pren tag x Index on cls+nume+pren tag x
seek 12CStan Ana Seek Stan Ana 12c
? iif(found(), media,nu este eleva) ? iif(not eof(), media, nu este
eleva)
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.
Studiu de caz Fie baza de date SCOALA cu tabelele Elevi, Clase, Obiecte,
Profesori, Sali, a cror structur a fost analizat i proiectat n
leciile anterioare. Vom exemplifica modaliti diferite de fixare a
relaiilor ntre tabele.
sarcini de laborator
I. BIBLIOTECA
1. Realizai afiarea tuturor crilor mprumutate de cititorul cu codul X.
Fixai relaia OPERATII 1-n> CARTI.
Filtrai printele pe cod-cititor=X.
2. Afiai numele cititorilor care au mprumutat cartea cu numrul de inventar X.
Fixai relaia OPERATII-1-n>CITITORI.
Filtrai printele pe nr-inventar=X.
3. Care sunt crile i de cine au fost mprumutate n ziua X?
Fixai relaia OPERATII-1-1>CARTI prin nr-inventar 1-1> CITITORI.
Filtrai prin cod-cititor i printele pe data-mprumut =X.
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 note [2, 6]
nume rom mat fiz chim ION 10 8 8 6 .F.
ION 10 8 8 6 POPA 10 9 8 9 .F.
LUCA 8 8 7 8
POPA 10 9 8 9 copy to array note for rom=10
3.
Use elevi Se introduc date despre primul elev n vectorul A.
scatter to array a Numrul de elemente este egal cu numrul de cmpuri.
? nume,a[1], a[2] Putem s ne referim la elemente prin indicii lor.
ION ION 10 Observai folosirea cmpului nume!
go bottom Are loc poziionarea la ultimul articol.
scatter memvar Este creat un ir de variabile cu aceleai nume ca ale
cmpurilor cu valori din ultimul articol.
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 sele c
use comisie2 in 2 copy to array c fields
use comisie3 in 3 candidat,;
select 4 proba2, proba1;
create dbf bac (nume C(10),; for scoala=informatic
rom N(5,2),mate N(5,2),; sele d
med N(5,2)) append from array a
sele 1 append from array b
copy to array a append from array c
sele 2 close databases
copy to array b fields nume,; release all
lrom, mate
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 Secvena 2 Secvena 3 Secvena 4
Use elevi Use elevi Use elevi Use elevi
scatter to memvar scatter memvar go 2 goto 2
accept to nume accept to nume scatter memvar scatter to
input to rom go bottom ?memvar(1) memvar
input to mat fiz=elevi.mat+1 ?m.nume, m.mat
fiz=elevi.fiz append blank
append blank gathr memvar
gather from memvar
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.
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 Proba1 Proba2 Proba3
Popescu 10.00 3.78 8.00
... ... ... ... mediile la aceste probe
Medii 8.75
nota maxim la aceste probe
Nota maxima 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 append blank
gather from a fields proba1,; gather from b fields proba1,;
proba2, proba3 proba2, proba3
repl nume with medii 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>)
sarcini de laborator
I. O societate comercial nregistreaz repartiia produselor date spre vnzare la
diferite magazine n tabela REPART cu structura (data, cod-produs, nume, pre-livrare,
grupa, magazin, cant, um). Magazinele sunt codificate numeric de la 1 la 5. Grupele de
produse sunt codificate pe dou caractere, de exemplu: TE=textile, AL=alimente,
EL=electrice .a.
data cod nume pret grupa mag cant
01.01.95 tele color 1500 el 1 10
01.01.95 combina 2300 el 2 2
01.02.95 casetofon 1600 el 1 15
1. Codificai produsele astfel nct s conin grupa, primele 5 caractere din numele
produsului i preul.
&& construim o expresie din cmpurile grup (caracter), nume-produs (caracter)
i pretul (numeric)! Ce funcie trebuie folosit, val sau str???
2. Aflai pentru fiecare grup de produse numrul i valoarea produselor distincte
distribuite la toate magazinele n data X.
&& facem un artificiu i nlocuim peste tot cmpul cod cu valoarea 1
&& indexm dup grupa unic
&& totalizm pe grupe
&& n cmpul cod fictiv umplut cu valoarea 1 vom obine numrul dorit.
3. Afiai cte produse distincte comercializeaz unitatea.
&& Indexare unic i numrare
Recapitulare 99
Testul 1 Operaii de afiare, cutare i poziionare
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.
Recapitulare 101
Testul 3 Definirea structurii unei baze de date pornind de la cerine
Citii cu atenie urmtoarele cerine i proiectai structura bazei de date necesare:
1. Afiai toate piesele de teatru programate pentru oraul X, n perioada d1-d2 sub
numele afi teatral pentru localitatea....
2. Unde (n ce localiti) a avut spectacole trupa de teatru X, cnd?
3. Toate spectacolele programate n sala Majestic dup 1 decembrie vor ncepe
la ora 18 n loc de 19, i la ora 11 n loc de ora 10.
4. Se anuleaz toate spectacolele cu piesa X, programate dup data Y.
5. Sala X intr n reparaie capital la 1 decembrie. Reprogramai spectacolele n
sala Y cu o sptmn mai trziu.
6. Ce piese de teatru are trupa MASCA n stagiunea aceasta?
7. Unde (la ce teatre) s-a montat piesa X, cnd, n regia cui?
8. Cte reprezentaii a avut piesa X, n toate montrile ei?
9. Ce actori are angajai teatrul Y?
10.Ce distribuie are piesa X, de la teatrul Y, n data Z?
11.Mai sunt locuri la piesa X?
12.Care a fost cea mai de succes montare a piesei X, la ce teatru, de care trup, n
ce regie, n ce stagiune, cine a fost n distribuie?
13.Care este indicatorul de ocupare a slii X (total locuri ocupate/total locuri dispo-
nibile) la spectacolul din data Y?
14.Cte bilete au fost vndute la un spectacol X?
15.S-a mai jucat piesa X, la alte teatre, stagiuni? Cnd? Unde? n ce regie?
Punctaj: Se acord cte 0,6 puncte/subiect i un punct din oficiu.
Punctaj: Se acord cte 2 puncte pentru fiecare subiect; se acord dou puncte din oficiu.
Testul 5 Indexarea
Considerm o agenie de rezervare a biletelor de avion. Creai o aplicaie care permite:
a. Afiarea unui program al curselor interne regulate i excepionale, cronologic
dup ora plecrii. Pentru cele cu plecri excepionale sau neregulate, se va afia
data plecrii numai pentru o perioad de 3 luni fa de momentul afirii.
b. Aflarea curselor interne pentru localitatea X, pe companii de zbor i cronologic.
Se vor afia pentru fiecare curs: numrul, numele companiei de zbor creia i
aparine avionul i, dac este curs regulat, se va trece ziua i ora, iar dac
este o curs neregulat se va obine data i ora plecrii.
c. Afiarea unui program cronologic al curselor internaionale; plecrile i sosirile
de pe i pe aeroportul deservit de agenia respectiv vor fi afiate separat.
Recapitulare 103
d. Aflarea datei i orei de plecare, a datei i orei de sosire la destinaie pentru o
curs dat prin numrul ei. Dac este o curs regulat, se va afia un text zilnic/
sptmnal/lunar/anual n funcie de ritmicitatea zborului, apoi ora/ziua din
sptmn i ora/data din lun, apoi ora/luna, data din lun i ora.
e. Aflarea numrului de locuri ocupate/rezervate/libere pentru o anumit curs,
dat prin numrul ei i data zborului.
Sarcini: Proiectai baza de date i scriei comenzile necesare obinerii informaiilor
solicitate.
Punctaj: Se acord cte 2 puncte la sarcinile a-d, 1 punct la sarcina e i un punct din oficiu.
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)?
Recapitulare 105
Capitolul
Programarea clasic
12 n FoxPro
Comenzi pentru structuri de control
Proceduri i funcii utilizator
Depanarea programelor
Exemple
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.
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. Scriei un program care s calculeze numrul de locuri ocupate i neocupate, pe
categorii de vagoane i date calendaristice. Aflai care este ziua/zilele cnd au fost
ocupate integral locurile unui tren dat.
2
4. 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, moment-
sosire) 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.
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]
sarcini de laborator
I. Un concurs de frumusee3 conine mai multe probe sau criterii de selecie.
Fiecare criteriu are un punctaj minim trecut n vectorul P din fiierul MINIME.MEM. La
nscrierea concurentelor, se trec datele generale n fiierul CONCURS.DBF (nume,
adresa etc). Odat cu desfurarea probelor se nregistreaz punctajele obinute
efectiv de candidate n fiierul REZULT.DBF (nume, criteriu, punctaj). Cerine:
1. Scriei o funcie care testeaz dac fiierele aplicaiei exist i dac toate
rezultatele au fost completate n fiierul Rezult.dbf. Funcia va determina
continuarea sau prsirea programului.
2. Creai o procedur care compune un tablou cu rezultatele fiecrei concurente pe
criterii i afieaz tabloul.
3. Scriei o funcie care determin punctajul maxim obinut de participante la un
criteriu dat ca parametru.
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.
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
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
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.
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.
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.
sarcini de laborator
I. Fie un program de calcul a factorialului. Programul citete o variabil, apeleaz
funcia de calcul i la terminare afieaz un mesaj. Observai-l n fereastra Trace din
figura 12-4. De fiecare dat cnd l rulm obinem acelai rezultat: zero!
1. Scriei codul programului de calcul al factorialului exact ca i cel din figur cu
editorul de programme.
2. Apelai programul utilitar prin Tools, Debugger.
3. Deschidei fereastra Trace prin clic pe butonul Trace.
4. Deschidei programul n fereastra de urmrire prin File, Open sau clic pe butonul
cu acelai nume etc.
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?
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
Meniul Database
Legturi ntre BD
Figura 13-3:
Bara de instrumente terge Modific Editarea tabelelor prin Browse
Database Designer
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
3. nchidei baza de date.
&& nu uitai de comanda Close database!
4. nchidei fereastra Database i Table Wizard.
5. Creai o alt baz de date cu numele Studeni, ns prelund selectiv unele
tabele i relaii din baza de date predefinit Students.
6. Deschidei i baza de date Bib alturi de Studeni.
&& fileopen
7. Activai cnd una, cnd cealalt baz de date i observai fereastra Database Designer.
&& se poate folosi comanda Modify database
8. Folosii meniul contextual ataat ferestrei Database Designer pentru micorarea
tuturor tabelelor i revenirea lor la dimensiunile proiectate.
9. tergei din baza de date Bib cteva tabele. Ele vor deveni tabele libere. tergei
de pe disc cteva tabele. tergei baza de date Bib.
unde:
<lista-cmp>==<nume-cmp1><tip>[(<lung>[,<zecim>])]<clauze-cmp>,..
<clauze-cmp> se folosesc la nivelul fiecrui cmp:
NULL/ NOT NULL Atributul poate conine valori NULL
CHECK <exp> [ERROR <mesaj>] Funcia de validare cu mesajul adecvat
DEFAULT<exp> Valoarea implicit a atributului
PRIMARY KEY Declar atributul cheie primar
REFERENCES <tabela2> [TAG<reper>] Declar atributul ca fiind cheie strin n tabela
curent i cheie de indexare n <tabela2>
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.
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
Se fixeaz o cheie primar la tabela creat anterior.
ALTER TABLE imprumut ADD PRIMARY KEY str(inv)+dtos(data_i) TAG in_d
Se adaug la un cmp o regul de validare.
ALTER TABLE imprumut ALTER COLUMN data_i SET CHECK data_i>=data_r
Se adaug o relaie 1-n ntre carti i tabela Imprumut.dbf pe cheia Inv.
ALTER TABLE imprumut ADD FOREIGN KEY inv TAG inv REFERENCES carti
Se terge regula de validare.
ALTER TABLE imprumut ALTER COLUMN data_i DROP CHECK
Se terge relaia stabilit anterior.
ALTER TABLE imprumut DROP FOREIGN KEY TAG inv SAVE
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 && Creeaz d1.dbc
CREATE DATABASE D2 && Creeaz d2.dbc
SET DATABASE TO D1 && Fixeaz d1 baz curent
CREATE TABLE T1 (CMP1 n(3)) && Creeaz t1.dbf n baza d1
CLOSE TABLES && nchide fiierul t1.dbf
REMOVE TABLES T1 && terge t1 din baza d1
SET DATABASE TO D2 && Fixeaz d2 baz curent
ADD TABLE T1 && Adaug t1.dbf la baza d2
RENAME TABLE T1 TO T2 && 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)
S se adauge primul elev n tabela Bacalaureat cu aceeai structur:
Use elevi
Scatter memvar
Insert into bacalaureat from memvar
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"
3 n comanda Browse pentru asocierea unui alt identificator pentru o coloan dect numele
cmpului se folosete opiunea H.
Dorim crearea unei baze de date cu dou tabele, alese din cele
Exemplu
oferite de produsul FoxPRO: Books i Friends.
Vom parcurge urmtorii pai:
1. Vom deschide utilitarul Database Designer selectnd File, New, Database.
Fixm numele bazei de date Biblio.
2. Pentru includerea fiecreia
dintre cele dou tabele vom
apela Table Wizard din fe-
reastra de dialog pentru crearea
unei tabele noi: Database, New
Table, Wizard.
3. Vom parcurge paii necesari
alegerii tabelei, selectrii cm-
purilor, precizrii destinaiei.
4. Observm n fereastra Database
Designer cele dou tabele.
5. Pentru ca tabela Books s fie
prezent numai cu numele se Figura 13-8: Crearea unei baze de date cu dou
apeleaz din meniul contextual tabele
opiunea collapse.
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.
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.
5 Reamintim c relaiile realizate prin comanda SET RELATION sunt temporare, disparnd la
terminarea programului sau a sesiunii de lucru.
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 Efect
MODIFY PROCEDURE Editarea unei proceduri.
APPEND PROCEDURE Adugarea unei proceduri stocate la baza
FROM<fis.txt> [OVERWRITE] de date curent dintr-un fiier <Fis.txt>,
cu sau fr suprascriere.
DISPLAY PROCEDURES Afiarea procedurilor memorate din baza
curent.
COPY PROCEDURE TO <fis.txt> Copierea procedurii stocate ntr-un fiier
[ADDITIVE] text, de unde poate fi manipulat.
Exemple
Open database D1 creeaz baza de date, care este deschis automat
Create table t1 free (cmp M) tabela temporar
Append blank adaug o linie vid
Replace cmp with procedure; pune n coloana Memo linia de definiie
fictiv+chr(13)+chr(10) a unei proceduri fictive
Copy memo cmp to fis.txt copiaz coninutul cmpului Memo ntr-un fiier
Use nchide tabela temporar t1
Append procedure from; adaug la baz fis.txt ca fiind procedur stocat
fis.txt
Display procedures afieaz procedurile bazei D1
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!
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!
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 Bazele informaticii Info 9,10,11,12
Ia Informatic aplicat Info 10,11,12
so Sisteme de operare Info 10
Profesori Orar
P1 Popescu Emilian Mate L 8 bi P2 9a
P2 Zaharescu Vasilache Info L 9 so P2 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.
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 Rezolvare
Afiai elevii claselor la imprimant select cls, nume from elevi to print
Copiai numai numele i codul elevilor select cod, nume from elevi;
ntr-o alt tabel into dbf manelevi.dbf
sarcini de laborator
Considerm o firm care produce i comercializeaz produse din pielrie.
1. Proiectai o baz de date necesar pentru compartimentul comercial n
activitatea de aprovizionare.
Se cere:
a. evidena furnizorilor de materiale (care sunt, ce materiale ofer, la ce preuri,
condiii de transport, alte faciliti);
b. evidena contractelor de aprovizionare (din momentul ncheierii lor se nregis-
treaz ca obligaii de livrare de ctre furnizor a unor materiale n cantitile i la
termenele fixate);
c. evidena facturilor. Odat cu livrarea materialelor, furnizorul ntocmete o factur
n care se nscrie contractul n baza cruia se face livrarea, materialele trimise,
preuri, condiii de plat.
d. evidena achitrilor. Pentru livrrile fcute, firma trebuie s plteasc. Plata
facturii se nregistreaz pe un document numit chitan. Chitanele identific
factura, data achitrii i suma. O factur poate fi achitat prin mai multe chitane.
Desigur, putem achita i prin banc!
2. Calculai necesarul de aprovizionat pe baza planului de fabricaie i a consumului
unitar de materiale. Se va ine cont de stocurile existente!
3. Aflai prin interogri SELECT:
a. Care sunt furnizorii pentru materialul x?
b. Care este cantitatea total contractat pentru materialul x?
c. Care dintre furnizorii pentru materialul x ofer preul cel mai mic?
d. Cte facturi au fost trimise pentru contractul x?
Mediul de lucru
Pentru utilizatorii FoxPro, interfaa utilitarului Query Designer este foarte priete-
noas, 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.
Figura 14-2: Bara Query Designer
Butonul Remove table permite tergerea
tabelelor din fereastra de proiectare a interogrii.
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.
Permite
precizarea
coloanelor:
clauza Zona de vizualizare
SELECT a tabelelor.
Se deschide prin
fereastra Add Table
Numrul de
valori, dac
sunt distincte;
Legturile dintre Condiii Cmpurile folosite Cmpurile folosite dac este o
tabele clauza de filtrare pentru ordonarea la gruparea
interogare
FROM ON clauza datelor clauza articolelor
WHERE ORDER clauza GROUP BY ncruciat
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.
Exemple
Tema 5 Folosirea aplicaiei Query Wizard
Problema
Obinei situaia contractelor, ordonat pe beneficiari, care au facturri dup 1 ia-
nuarie 2002.
Vom afia de fapt informaii despre contracte, pentru fiecare contract informaii
despre facturile trimise n contul acestuia(cmpul; Nr_fact i data).
Pasul 2. Dac sunt mai multe tabele, specificm relaia. n cazul nostru
scriem:
Contracte.nr_contr= facturi.nr_contr
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.
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.
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.
n vederea elaborrii scrisorii i trimiterii prin e-mail, vom lansa utilitarul Mail Merge
Wizard.
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.
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.
Comutatoare=
CheckBox
Zone de
editare
Butoane radio
Exemple
Exemplul 1: Definirea unei subclase cu Exemplul 2: O clas pentru cri de
numele Fer1 cu caracteristicile clasei vizit non-vizual.
printe. DEFINE CLASS carti AS CUSTOM
DEFINE CLASS fer1 AS FORM Nume=Popescu
ENDDEFINE Ocupatie=artist
Adresa=Iasi
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
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. Ce realizeaz construciile urmtoare?
a) Thisform.release
b) Thisform.refresh
c) Thisform.name=frmelevi
d) Thisform.txtnume.caption=oprescu
e) This.value=5
f) This.visible=.t.
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 proprie-
tile de a putea fi micorat,
mrit sau nchis prin bu-
toanele 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 tradi-
ional sau n modul orientat
spre obiecte) sau n mod
vizual, prin Form Designer i Figura 17-1: Exemplu de formular
Form Wizard.
Dup proiectarea sa, un formular este memorat ntr-un fiier cu extensia .scx care
poate fi deschis cu USE i vizualizat cu BROWSE.
Lansarea formularului se face prin comanda:
DO FORM <fis.scx> [WITH <param-intr>][TO <param-ies>]
x.scx
procedure init
Do form fis.scx with p_intr to p_ies 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.
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.
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.
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.
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.
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 Parameters parola= Return
Controlsource=m.parola parola initial parola
Pai:
1. salvm cu numele x.scx i nchidem generatorul.
2. scriem codul de apel al formularului n cuvant.prg
parola=
do form x with parola to parola
? parola
return
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.
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 Form1
Caption=continuti? Metoda init
ControlSource=; Continuare=.F.
m.continuare Append blank
Metoda Valid
If m.continuare
Append blank
Endif
Check1
Caption=Caminist
ControlSource=;
elevi.caminist
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
tabela activ. adugate n formular
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 Cmd2
Caption=continua Caption=gata
Procedure Click Procedure click
Append blank Browse
endproc endproc
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;
3. Specificm proprietile fiecrui buton: Figura 17-17: Butoane radio
Option1.Caption=informatica, pe formular
Option2.Caption=sport
Option3.Caption=engleza
4. Rulm prin Run.
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.
Rowsource Rowsourcetype
9a,9b,... Elementele listei =0 none Surs nespecificat; elementele
elevi.dbf Tabela de date listei se vor specifica dinamic la
SELECT.. rularea formularului
A Nume masiv =1 Value Elementele sunt enumerate
Elevi.nume Nume de cmp =2 Alias Se preiau elementele
C:alfa*.db? ablon pentru dintr-o tabel
fiiere =3 SQL Elemente date de comanda SQL
elevi.dbf Numele unei =4 Query Elemente date de un Query
tabele =5 Array Elementele sunt preluate
dintr-un tablou
=6 Fields Elementele sunt preluate din
valorile cmpului
=7 Files Elementele sunt nume de fiiere
care verific ablonul
=8 Structure Lista este alctuit din
cmpurile (structura) tabelei
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.
Procent_comision.click List_comision.click
if thisform.comm1.tag=t sele comision
reindex go top
thisform.list_com.refresh locate for;
thisform.comm1.tag=f tipcomision=val(thisform.list_com.value)
else thisform.tip_com.refresh
thisform.list_com.refresh thisform.den_com.refresh
endif thisform.proc_com.refresh
list_comision Adaugare.click
Rowsource=comision.tipcomision,denco go bottom
mision,; append blank
procent thisform.comm1.tag=t
RowSourceType=fields thisform.refresh
Tabindex=4
Columncount=3
Name=list_com
Form1 Column3
Grid1 Header1
Column1 Text1
Header1 Column4
Text1 Header1
Column2 Spinner1
Header1
Text1
selectare tergere TextBox header Check1
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
Exemplu
Acordarea numelui paginii 3 Pageframe1.Page3.caption=Listare
sau
Pageframe1.Pages[3].caption=Listare
Activarea paginii 1 Pageframe1.page[1].ActivePage=.t.
Pe prima pagin avem un TextBox5 Pageframe1.page1.textbox5.setfocus
(presupunem c este al 12-lea obiect sau
pe pagin) cruia i asociem Pageframe1.page[1].controls[12].setfocus
metoda 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.
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 Figura 17-27: Obiect Timer n
denumim Image2) i Command1. formular
2. Scriem proprietile i metodele (conform
tabelului urmtor):
Timer1 Image1 Image2 Command1
(stnga) (dreapta)
Interval=2000 Visible=.t. Visible=.f. Procedure click
Procedure Timer thisform.image1.visible=.f.
thisform.image1.visible=.t. thisform.image2.visible=.t.
thisform.image2.visible=.f.
O alt posibilitate oferit de asistent este editarea simultan a datelor din dou
tabele legate ntre ele. Cmpurile din prima tabel formeaz antetul formularului, iar
cele din a doua tabel sunt dispuse pe coloane, asemeni ecranului Browse ntr-un
subformular. Se poate trece de la un articol al primei tabele la altul. Automat, n
subformularul asociat tabelei copil se pot edita doar datele legate de articolul curent din
tabela printe.
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.
sarcini de laborator
I. Sarcini pentru proiectarea unui formular cu parametri
1. Construii un formular care s primeasc din exterior (ca parametru de intrare)
un numr ntre 1 i 7, s-l afieze pe formular ntr-un chenar dac este par i fr
chenar dac este impar i s ntoarc numele zilei corespunztor acestui numr,
tot ca parametru n variabila Nume. Afiai apoi aceast variabil!
2. Imaginai o variant de rezolvare pentru ca formularul s primeasc dou
numere: primul, dac este zero, va determina considerarea celui de-al doilea ca
numr de zi (din sptmn), iar dac primul numr este 1, cel de-al doilea va
reprezenta numrul unei luni (din an). Pe formular vor fi afiate cele dou
numere primite din exterior cu culori diferite i alturat numele zilei sau a lunii.
Formularul va returna un mesaj de tipul ziua este... sau luna este... completnd
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).
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>
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.
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:
6. Inversm coloanele Cant cu Pret_promis. Tabela CONTRACTE
n Data Environment
7. Selectm File, Page Setup i stabilim caracteristicile
globale ale raportului
Aranjarea
din fereastra care datelor pe
apare. Putem preciza coloane Aranjarea
numrul de coloane (tabel) datelor pe linii
(etichet)
(Number), distana
pn la prima coloan Valorile vor
avea ca
(Left Margins), limea titlu numele Deschide
coloanelor (Width) i de cmp ecranul Fields
distana dintre ele Picker pentru
selectarea
(Spacing). Raportul Cmpurile cmpurilor
poate fi structurat pe vor fi
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.
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 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.
Expresia de calcul
a valorii poate fi
introdus direct
sau compus
Variabila va fi
reiniializat la
terminarea unui
grup/pagin/raport
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.
Lansarea n execuie
LABEL FORM <fis.lbx> TO PRINTER / TO FILE <fis.txt>
[<domeniu>] [FOR <cond>] [WHILE <cond>] [SAMPLE]
Rezolvare:
1. Deschidem fiierul Contracte i indexm unic dup Nume_benef.
2. Apelm generatorul
de etichete selectnd
File, New (.)Label
sau prin comanda
Create Label Dimensiunea
zonei de
<nume-eticheta
proiectare
3. Alegem forma de este calculat
etichet din formele automat n
predefinite afiate la funcie de
deschiderea formatul
generatorului. etichetei
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.
O schi a
etichetei
poate fi
observat n
acest ecran Pentru selectarea unui cmp se alege din list,
apoi se apas declanatorul >
Zona de
editare a Pentru excluderea ultimului obiect din
textelor linia etichetei se apas <
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.
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.
sarcini de laborator
I.
FOTBAL: Proiectai o baz de date pentru evidena echipelor, juctorilor i
meciurilor dintr-un campinat de fotbal. Populai baza de date cu date de test.
1. Scriei comenzile SQL sau proiectai interactiv interogrile pentru a afla:
a) cine face parte din echipa X;
b) programul competiional pentru cupa Romniei;
c) unde joac X (la ce echip, de cnd..);
d) care sunt arbitrii pentru meciul x-y;
e) cu ce scor s-a ncheiat meciul x-y;
f) care este ordinea echipelor dup punctaj;
g) care este ordinea echipelor dup golaveraj.
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.
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.
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 aprovizio-
nare 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
LISTA RETRIBUIILOR........
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:
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.
A. Mecanisme de blocare
Blocarea se poate aplica la nivelul ntregii baze de date, la nivelul unui fiier, al unei
nregistrri sau chiar al unui cmp al articolului.
Tip de blocare Nivel tabel Nivel articol Nivel cmp
Implicit Append Append Memo
Delete All Modi Memo
Recall All Browse/Edit
Replace All Replace Record
Update Delete/Recall Record
Explicit Set Exclusive On Flock() Lock()
Set Lock On Rlock()
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.
3. Salvarea i restaurarea bazei de date
Dac prin funcionarea anormal a reelei sau cderea SGBD-ului sau prin alte
incidente hardware, tranzaciile nu se ncheie normal i exist pericolul unei deteriorri
a datelor, trebuie s apelm la mecanismul de refacere a strii anterioare, consistente
a bazei. Salvarea, din punctul de vedere al asigurrii integritii datelor, este procesul
de stocare a datelor n vederea restaurrii contextului anterior n cazuri extreme i
poate fi fcut prin:
a) copii de siguran (backup) ale bazei de date sunt realizate automat, fie de
ctre sistem, la anumite intervale de timp, fie de ctre administratorul bazei de
date. De regul, copia bazei de date este utilizat la cderea sau pierderea sau
distrugerea suportului care pstreaz baza, de aceea este bine s fie fcut pe
alt suport (disc, band magnetic).
1. Comanda CREATE FROM ARRAY permite constituirea structurii unei tabele din
informaiile unui tablou.
CREATE TABLE <fis.dbf> FROM ARRAY <tablou>
Comanda preia numele cmpurilor din prima coloan a masivului <tablou>, tipul
din a doua coloan, lungimea fiecrui cmp din coloana a treia, iar numrul de poziii
zecimale din coloana a patra. Este creat numai structura tabelei.
Operaia invers, de transfer al informaiilor de structur ntr-un tablou, este realizat
de funcia Afields. Funcia AFIELDS (<tablou>) ncarc ntr-un tablou structura
unei tabele active. n prima coloan sunt memorate numele cmpurilor, n coloana a
doua tipul cmpurilor din structur, n coloana a treia lungimea i n coloana a patra
numrul poziiilor zecimale.
Baza de date cu structur extins nu este tears automat prin aceast manevr.
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 recall record reccount()
copy to man structure extended pack
use man create nume from man
go 4 use man
dele rest append from elevi
&& observai tabela realizat prin comanda COPY EXTENDED:
# FIELD_NAME FIELD_TYPE FIELD_LEN FIELD_DEC FIELD_IDX
1 NUME C 10 0 Y
2 PREN C 6 0 N
3 CLS C 3 0 Y
4 ABSN N 2 0 N
5 ADMIS L 1 0 N
6 DN D 8 0 N
2. Scriei un program care s creeze fiierul FIS.DBF (nume C(8), ext C(3)) cu toate
tabelele din directorul curent i s afieze toate fiierele care au structur identic.
3. La cantina colii sunt nregistrate intrrile i consumurile de alimente din fiecare
zi n fiierul ALIMENTE (data, cod-aliment, cod-micare, cantitate), unde cod-micare
este fie literele e =consum, fie i = intrri alimente).
tim c n fiierul STOCURI (nume-aliment, cod, pre, stoc) codificarea s-a fcut
odat cu sosirea unui nou aliment pe baza numelui i a preului acestuia. S se afieze
situaia urmtoare:
SITUAIA CONSUMULUI DE ALIMENTE |N LUNA...
cod/nume-aliment pret z1 z2 ... 31 total-cant total-val
total/zile - Xx xx ... xx xxxxxxx xxxxxxx
Alimentele vor fi trecute n ordinea alfabetic, pe preuri. Coloanele Z1-Z31 vor
conine totalul cantitilor de alimente consumate n zilele lunii solicitate. Pentru fiecare
aliment se calculeaz totalul cantitativ (coloana total cant) i valoric n lun (coloana
total-val). Pentru fiecare zi se calculeaz totalul valoric n ultima linie, notat total/zile.
4. 2
La un oficiu potal se ine evidena revistelor la care se poate face abonament
n fiierul REVISTE(cod_rev N(3), nume_rev C(10), pret N(6)). |n momentul sosirii unui
client care dorete abonament, se alege revista i se completeaz perioada, numrul
de buci solicitate, datele personale ale abonatului n tabela ABONAM( data D, nr_chit
N(5), cod_rev N(3), nume_pers C(10), Adr M, perioada C(5), nr_buc N(3)).
Se cer:
1. O procedur de introducere a datelor la abonarea unui client;
2. O procedur care s creeze structura unui fiier numit CENTRALIZ:
data nr_chit nume_pers adr nume_rev L01 .... L12
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).
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.
a. Tehnica interviului
Scopul tehnicii interviului este obinerea ntr-un timp redus a informaiilor privind
orientrile practice, metodele i strategiile existente sau preconizate n rezolvarea
problemelor analizate. Interviul asigur:
obinerea informaiilor ct mai recente i ct mai complete;
compararea i verificarea informaiilor obinute prin alte metode sau tehnici;
culegerea unor date semnificative la locul producerii lor.
b. Tehnica chestionarului
Tehnica chestionarului este recomandat cnd se dorete informarea asupra prerii
generale despre un anumit aspect, culegerea informaiilor de la un numr mare de
subieci n acelai timp, despre aceeai problem.
Tehnica chestionarului este folosit cnd cantitatea de informaii care trebuie
culeas este redus sau trebuie verificate anumite informaii obinute prin interviuri sau
observri directe. Fiind anonime, chestionarele ncurajeaz subiecii n completarea
rspunsurilor corect i cu sim critic (autocritic mai puin!!) dar se pierde legtura
afectiv cu persoana care rspunde i, evident, se evit rspunsurile la ntrebrile care
deranjeaz.
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.
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.
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?
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.
Operator Afieaz situaii centralizate Zilnic Da, dac sunt memorate toate
pe tipuri de tranzacii, pe datele despre o tranzacie!
valute etc.
Operator ndosariaz copiile dup Zilnic Da, vom salva activitatea unei
buletinele de schimb, cursul zile n istoric.
valutar i situaiile
centralizate n dosarul zilei.
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!
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.
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
Vom crea o aplicaie care folosete toate tipurile de fiiere: tabele, vederi, interogri,
rapoarte, etichete, formulare, grafice, meniuri.
Vom folosi aplicaiile wizard la realizarea acestora.
Controlul proiectrii aplicaiei va fi exercitat prin Project Manager.
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
unei machete prin clic pe butonul Add. Figura S2-2: Proiectarea formularului
6. Pentru a afia numele i adresa persoanelor crora le trimitem felicitri, vom proiecta
etichete prin Project Manager. Ne poziionm pe directorul Documents/Labels i
apsm butonul New. Alegem Label Wizard i selectm tabela i tipul etichetei n
care vom pune informaiile dorite. Numele asociat este Felicitare.lbx.
7. Pentru a afia persoana/persoanele care au porecla X, proiectm o vedere (fiier view).
Proiectarea vederilor (fiiere View) din Project Manager se face prin
poziionarea pe baza de date i deschiderea utilitarului Data Designer, apoi clic
pe butonul Modify al ferestrei Project Manager.
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.
CITITOR.DBF
OPERATII.DBF
Cod-carte cod_cit di dr
Pag. 63
I.
ECHIPE (echipa C(9),grupa C(1)) cu numele i grupa fiecrei echipe
JUCATORI (nume C(9), echipa C(9), intrare D, iesire D) este un istoric cu echipe i juctori
CAMPIONAT (e1 C(9), e2 C(9), data D, loc C(9), pstreaz meciurile campionatului.
p1 N(2), p2 N(2), arbitri M)
Sarcini Rezolvri
Deschidei cele trei tabele use CAMPIONAT n 1 alias camp
n trei zone. use JUCATORI n 2 alias juc
use ECHIPE in 3 alias ec
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
function f4 procedure p4
&& determina persoanele && lista primilor trei clasati*
necalificate sele rezult
&& la un criteriu si castigatoare index on nume tag nume for;
&& la altul not deleted()
public array pers[20] total on nume field punctaj to
nr_caz=0 total
select rezult sele 2
index on nume tag nume use total
do while not eof() index on punctaj tag pct1;
x=nume descending unique
store .f. to bun, rau copy to man_unic
do while not eof() and nume=x index on punctaj tag pct2 desc
rau=deleted() sele 3
if punctaj = f2(criteriu) use man_unic
bun=.T. i=0
endif scan next 3
Pag. 147
1. Calculul necesarului de aprovizionat Varianta 1:
procedure calcul Se va crea un fiier NEC cu necesarul
create dbf nec (mat n(1), nt n(5), na total (cmpul NT) i necesarul de
n(5)) aprovizionat (cmpul NA) pentru
use stoc in 1 fiecare cod-material (cmpul MAT).
use plan in 2 Ordonm fiierul CONSUM pe
use consum in 3
materiale.
use nec in 4
sele 3 Pentru fiecare material i:
index on mat tag mat facem suma produselor dintre
do while not eof(3) cantitatea unitar necesar pentru
x=mat produsul j i planul pentru produsul j
sum c.cant* cautplan(c.prod) while; generm un articol n fiierul NEC
c.mat=x to y Completm cmpul NA
do adauga_art with x, y Afiare
enddo
sele 4
repl all na with nt-cautstoc(d.mat)
list
return
function cautplan procedure adauga_art function cautstoc
param cod param x, y param x
sele 2 sele 4 sele 1
locate for b.prod=cod append blank locate for a.mat=x
if found() repl mat with x,nt; sele 4
rez=b.cant with y return
else sele 3 iif(found(1),a.cant,0)
rez=0 return
endif
sele 3
return rez
sele 2 Varianta 3:
use plan Se folosete relaia dintre fiierul
index on prod tag prod CONSUM i PLAN pe atributul PROD.
sele 3 Se presupune c fiierul STOC are
use consum toate codurile de materiale chiar dac
set relation to prod into b
stocul este zero.
sele 1
create table nec (mat N(5),; Pentru fiecare cod material din stocuri
cant N(5), na N(5)) se scade suma produselor consum
append from stoc unitar i plan
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 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;
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 &&continuare
nmat=det_cod(1) sele 1
nprod=det_cod(2) create dbf nec (mat N(5),nt;
dimension N(5),na N(5))
cs(nmat,nprod),P(nprod),s(nmat),; for i=1 to nmat
nt(nmat), na(nmat) append blank
store 0 to cs, s, p, nt, na repl mat with i,nt with
do incarca with 1 nt[i],;
do incarca with 2 na with na[i]
do incarca with 3 endfor
do calcul_nt && Nt= CS*P delete for nt=0
do afis with nt && afisare vector NT pack &&articole
do calcul_na && NA=NT-S close all &&nefolosite
do afis with na && afisare vector NA return