Sunteți pe pagina 1din 92

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/320518695

Baze de date - Visual Foxpro 6.0. Indrumar de laborator

Book · June 2006

CITATION READS

1 76

2 authors:

Adrian Runceanu Ion Marian Popescu


University of Craiova University of Craiova
26 PUBLICATIONS   22 CITATIONS    6 PUBLICATIONS   1 CITATION   

SEE PROFILE SEE PROFILE

All content following this page was uploaded by Adrian Runceanu on 20 October 2017.

The user has requested enhancement of the downloaded file.


Nici o parte din această carte nu poate fi reprodusă sub
nici o formă sau metodă fără acordul scris al autorului.
Aveţi drepturi de utiliza acestă carte doar pentru propria
persoană.
Această carte digitală nu poate fi revândută sau dată
către alte persoane.
Dacă doriţi să folosiți părți din această carte sunteți liber
să o faceți doar cu citarea corectă a cărții și precizarea link-
ului de unde ați accesat-o.
MARIAN POPESCU ADRIAN RUNCEANU

Baze de date – Visual Foxpro 6.0


Îndrumar de laborator

Editura Academica Brâncuşi


ISBN 978-973-144-008-8
Referenţi ştiinţifici:
Prof. univ. dr. ing. Popescu Luminiţa
Prof. univ. dr. ing. Cozma Vasile

Descrierea CIP a Bibliotecii Naţionale a României


POPESCU, MARIAN
Baze de date - Visual Foxpro 6.0. Îndrumar de
laborator / Popescu Marian, Runceanu Adrian – Târgu-Jiu:
Academica Brâncuşi, 2007
Bibliogr.
Index
ISBN 978-973-144-008-8

1. Runceanu Adrian

004.43 FOXPRO 6.0

Coperta şi design:
Silviu Runceanu
http://savepotatoes.com/
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Lucrarea 1

Funcţiile SGBD-ului Visual Foxpro.


Tipuri de fişiere Visual Foxpro.
Limitele SGBD-ului Visual Foxpro.

A. Consideraţii teoretice

Funcţiile SGBD-ului Visual Foxpro:

1. Descrierea structurii tabelelor din cadrul bazei de date


2. Actualizarea bazei de date prin:
a. Adăugare de înregistrări
b. Modificare de înregistrări
c. Ştergere de înregistrări
3. Interogarea bazei de date utlizând atât un limbaj propriu, cât şi
limbajul SQL
4. Asigurarea dialogului sistem-utilizator printr-o interfaţă dezvoltată
faţă de alte SGBD-uri
5. Utilizarea tehnicilor avansate de regăsire, selectare şi grupare a
datelor

Tipuri de fişiere Visual Foxpro

 Baza de date - .DBC – pentru tabele de date


 Baza de date – .DCT – pentru fişiere memo
 Baza de date - .DCX – pentru fişiere index
 Tabela - .DBF
 Fişier index simplu - .IDX
 Fişier index compus - .CDX
 Fişier ecran - .SCX
 Fişier format generat - .FRT
 Fişier format compilat - .PRX
 Fişier vedere - .VUE
 Fişier text ASCII - .TXT
 Fişier salvarea variabile memorie - . MEM
 Fişier de tip memo - .FPT
 Fişier ecran memo - .SCT

1
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
 Fişier raport - .FRX
 Fişier raport memo - .FRT
 Fişier program - .PRG
 Fişier program compilat- .PRG
 Fişier program executabil - .EXE
 Fişier backup - .BAK
 Fişier meniu - .MNT
 Fişier program meniu generat - .MPR
 Fişier program meniu compilat - .MPX
 Fişier proiect - .PJX
 Fişier erori - .ERR
 Fişier aplicaţie generală - .APP
 Fişier document raport - .DOC

Limitele SGBD-ului Visual Foxpro

 1 bilion de înregistrări într-o tabelă


 65000 octeţi pe înregistrare
 255 câmpuri pe înregistrare
 254 caractere pe fiecare înregistrare
 20 caractere pentru fiecare câmp de tip numeric
 8 caractere pentru fiecare câmp de tip data calendaristică
 1 caracter pentru fiecare câmp de tip logic
 32767 zone de lucru
 tablouri cu două dimensiuni
 număr nelimitat de linii într-un program sursă
 25 de ferestre BROWSE deschise simultan

Meniul sistem are următoarele opţiuni:

2
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Submeniul File conţine următoarele opţiuni:

Optiune din
Efect
meniu
Se deschide o fereastra de dialog, care ofera cateva
optiuni cu ajutorul carora se pot crea diferite fisiere:
fisiere de tip proiect ; fisiere de tip baze de date ; fisiere
de tip tabela; fisiere de tip interogare ; fisiere de tip
New . . .
views; fisiere de tip formular ; fisiere de tip program;
fisiere de tip rapoarte ; fisiere de tip etichete ; fisiere de
tip clase; fisiere de tip meniu;
fisiere de tip text
Se deschide o fereastra de dialog care permite
Open . . . deschiderea orcarui tip de fisier şi care se afla pe
calculator sau in retea
Close Inchide fereastra activa
Deschide o fereastra de dialog pentru a salva
Save informatiile din fisierul curent, sau salveaza modificarile
efectuate pana in acel moment
Se foloseste pentru crearea unei copii a fisierului curent
Save as . . .
sub o alta denumire specificata de utilizator
Save as HTML . . . Salveaza fisierul sub format HTML

3
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Anuleaza toate modificarile efectuate in fisierul curent. Este


Revert asemanatoare cu comanda UNDO, dar spre deosebire de
aceasta anuleaza toate modificarile
Importa in Visual Foxpro, un fisier cocntruit cu o alta
Import . . .
aplicatie
Exporta un fisier al Visual Foxpro intr-un alt format (de
Export . . .
exemplu: Microsoft Excel, Lotus 1-2-3, Dbase, etc.)
Page setup . . Formateaza paginele documentului şi stabileste configurarea
. imprimantei pentru acel fisier
Prezinta fisierul într-o fereastra, exact asa cum va aparea la
Print preview
imprimanta
Print . . . Listeaza fisierul curent
Send . . . Permite trmiterea unui e-mail
Inchide aplicatia Visual Foxpro. Este echivalenta cu comanda
Exit
QUIT ce poate fi efectuata in fereastra de comenzi

Submeniul Edit contine urmatoarele optiuni:

4
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Optiune din
Efect
meniu
Anuleaza un numar nelimitat de schimbari facute in
sesiunea de editare curenta. Schimbarile facute dupa
Undo
ultima salvare, pe durata aceleiasi sesiuni de lucru, sunt
ireversibile.
Este efectul invers al optiunii Undo (reface ceea ce a
Redo
fost anulat cu Undo)
Muta textul selectat sau obiectul din documentul current
Cut
sil il plaseaza in Clipboard
Efectueaza o copiere a unui text selectat anterior sau a
Copy
unui obiect, plasandu-l in Clipboard
Copiaza continutul din Clipboard in locul unde este
Paste
plasat cursorul in acel moment
Este folosit la inserarea obiectelor OLE dîntr-o alta
Paste Special . . .
aplicatie intr-un câmp general.
Clear Sterge textul selectat fara copierea lui in Clipboard
Selecteaza toate obiectele din fereastra cuirenta.
Aceasta optiune este utilizata in modul de lucru Form
Select All
Designer şi Raport Designer pentru a muta sau a
formata toate obiectele in acelasi timp
Afiseaza caseta de dialog “Find” care este utilizata la
localizarea unui text intr-un fisier. Aceasta optiune ofera
Find . . . posibilitatea cautarii unui text fara a face diferentieri
intre litere mari şi mici, de la inceputul documentului
pana la sfarsit şi invers.
Permite reluarea cautarii de unde a ramas pozitionat
Find Again cursorul pentru acelasi cuvant care indeplineste aceleasi
conditii de cautare
Afiseaza caseta de dialog “Replace” care este utlizata la
Replace . . . localizarea şi inlocuirea textului respectiv in fisierul
curent.
Permite deplasarea la o anumita linie intr-un fisier
Go to line . . .
program
Similar cu Paste Special, exceptand cazul cand nu este
Insert Object . . . preluat un obiect deja existent şi cand este memorat in
Clipboard.

5
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Object . . . Permite selectarea unui obiect


Deschide fisierele legate intre ele şi este capabil sa
Links . . .
editeze legaturile
Afiseaza caseta de dialog “Edit properties” ce permite
definirea unor optiuni de ditare, de salvare şi de scriere
Properties . . . cum ar fi : alinierea textului, numarul se spatii intr-un
Tab, fontul cu care dorim sa editam, precum şi culoarea
cuvintelor rezervate SGDB-ului Visual Foxpro.

Submeniul View contine doar submeniul Toolbars(instrumente)


care are urmatoarele
optiuni:

Submeniul Format contine


urmatoarele optiuni care apar atunci cand
se apeleaza o optiune din modul de lucru
Designers (editarea unui program,
realizarea unui formular sau a unui
raport, etc.):

6
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Optiune din
Efect
meniu
Permite selectarea fontului şi a caracteristicilor acestuia,
Font . . .
in cadrul editarii unui program
Enlarge Font Permite marirea fontului utilizat in fereastra curenta
Reduce Font Permite reducerea fontului utilizat in fereastra curenta
Seteaza un singur spatiu intre randurile de text prezente
Single Space
in fereastra activa
Seteaza o linie şi jumatate ca spatiu intre randurile de
1 ½ Space
text prezente in fereastra activa
Seteaza doua linii ca spatiu intre randurile de text
Double Space
prezente in fereastra activa
Adăuga un numar de spatii inaintea liniei curente sau a
Indent
liniilor selectate din cadrul ferestrei active
Unindent Este efectul invers a optiunii Indent
Transforma linia curenta sau cele selectate in comentarii,
Comment
fiind ignorate la lansarea in executie a programului
Uncomment Anuleaza efectul optiunii Comment
Deschide optiunile de aliniere a obiectelor selctate atunci
Align
cand se luicreaza cu formulare şi rapoarte
Deschide optiunile de stabilire a marimii obiectelor
Size
selectate din cadrul formularelor şi a rapoartelor
Horizontal Furnizeaza optiuni de ajustare a spatiului, pe orizontala,
Spancing intre obiectele selectate
Vertical Furnizeaza optiuni de ajustare a spatiului, pe verticala,
Spacing intre obiectele selectate
Muta obiectele selectate inaintea obiectelor dintr-un
Bring to Front
formular sau raport
Muta obiectele selectate in spatele obiectelor dintr-un
Send to Back
formular sau raport
Grupeaza o selectie de obiecte dintr-un formular într-o
Group entitate, avand astfel posibilitatea prelucrarii simultate a
acestora
Ungroup Este efectul invers al optiunii Group

Atunci cand dorim sa mutam obiectele din cadrul unui


formular sau raport, coltul din stanga sus al acestora se
Snap to Grid
repozitioneaza in cea mai apropriata intersectie a retelei
dupa eliberarea butonului de mouse

7
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Set Grid Stabileste distanta dintre liniile orizontale şi verticale din


Scale cadrul unui formular sau raport
Text Permite alinierea textului din interiorul obiectului selectat
Aligment
Defineste un model de umplere pentru forme. Este activa
Fill
numai in cadrul raportelor in sectiunea Detail
Stabileste grosimea şi stilul liniei pentru forme. Este activa
Pen
numai in cadru unui raport in sectiunea Detail
Stabileste dacă background-ul unui obiect este opac sau
Mode
transparent

Submeniul Tools contine urmatoarele optiuni:

Optiune
Efect
din meniu
Listeaza şi permite accesul la asistentii Visual Fozpro care
Wizards
creeaza tabele, formulare, rapoarte, interogari, etichete, etc.
Spelling . . . Permite verificarea ortografica a canpurilor text şi memo
Macros . . . Defineste şi intretine macrocomenzile asociate tastaturii
Examineaza continutul oricarei clase pentru vizualizarea
Class
proprietatilor şi metodelor ei sau codul actual utilizxat la
Browser
crearea obiectului

8
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Specific fisierelor de tip program, ofera posibilitatea unei


vizualizari mai clare a textului respective facand diferentieri
Beautify . . .
intre cuvintele cheie şi restul cuvintelor din text. Are efect
asupra intregului document.
Deschide fereastra Debugger. Aceasta aduce imbunatatiri
ferestrelor Debud şi Trace adăugand şi fereste pentru
Debugger supravegherea variabilelor locale, apelarii stivelor, urmaririi
evenimentelor şi analiza corelatiilor pe durata testarii
programului respectiv
Permite accesul la optiunile de configurare ale SGBD Visual
Options . . .
Foxpro (View, Regional, Genral, Data, etc.)

Submeniul Programs contine urmatoarele optiuni:

Optiune
Efect
din meniu
Lanseaza in executie programul selectat din caseta de dialog
Do . . .
ce se activeaza
Cancel Anuleaza executia programului curent
Reia executia programului curent din starea in care a fost
Resume
suspendata aceasta executie
Opreste executia programului curent, dar nu il elimina din
Suspend
memorie
Compile . . . Converteste fisierul sursa in cod obiect
Lanseaza in executie programul curent (apare sub forma
Run
Do nume.prg)

9
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Submeniul Window contine urmatoarele


optiuni:

Optiune
Efect
din meniu
Aranjeaza ferestrele deschise sub forma unor dreptunghiuri
Arrange All
adiacente pe intreaga suprafata a ecranului
Hide Ascunde fereastra activa, insa nu o elimina din memorie
Sterge textul din spatiul de lucru al unei aplicatii in
Clear momentul lansarii ei inexecutie sau din fereastra de iesire
curenta şi anume fereastra Command
Cycle Trece de la o fereastra activa la alta, activand-o pe ultima
Command Activeaza fereastra de comanda şi o afiseaza deasupra
Window celorlalte
Activeaza fereastra Data Session şi o afiseaza deasupra
celorlalte. Aceasta fereasta serveste ca instrument de
Data Session
evaluare pentru monitorizarile tabelelor care sunt deschise
in fiecare ddin cele 32767 zone de lucru

Submeniul Help contine urmatoarele


optiuni:

10
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Optiune din
Efect
meniu
Afiseaza informatii de asistenta prin intermediul unui format
Contents
de structura
Technical Furnizeaza o lista de resurse Microsoft disponibile pentru
Support obtinerea de informatii suplimentare de asistenta.
About Afiseaza ecranul copyright dedicat produsului, care contine şi
Microsoft informatii despre posesorul licentei, data versiunii, numele
Visual Foxpro . fisierului de resurse, direcorul prestabilit şi indicativul
.. produsului (ID)

11
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Lucrarea 2

Actualizarea tabelelor prin comanda BROWSE.


Căutare şi pozitionare. Sortare şi duplicare(copiere).
Comenzi de actualizare.

A. Consideratii teoretice

1. Actualizarea tabelelor prin comanda BROWSE

Pentru a actualiza datele introduse într-o tabelă, se poate folosi o


comandă, ce permite modificarea interactivă a informaţiilor prin apariţia
unei ferestre de modificare. Aceasta comandă se numeşte BROWSE şi
are următoarea sintaxă:

BROWSE [FIELDS <câmp1>] [LOCK <nr>] [<domeniu>] [FOR


<conditie>] [FREEZE <nume_câmp>] [NOAPPEND] [NOMENU]
[NOEDIT] [NODELETE]

 Clauza FIELDS permite specificarea câmpurilor care vor forma


coloanele tabelului; dacă lipseşte se vor afişa toate coloanele
tabelului, în ordinea în care apar ele în tabel.
 Clauza <domeniu> permite selectarea liniilor care vor fi afişate
 Clauza FOR <condiţie> permite de asemenea selectarea liniilor
care vor fi afişate
 Clauza LOCK <nr> permite îngheţarea pe ecran a primelor <nr>
coloane (câmpuri) în timpul defilării tabloului BROWSE spre stânga
sau spre dreapta
 Clauza FREEZE <nume_câmp> permite menţinerea cursorului pe o
singură coloană
 Clauza NOAPPEND interzice adăugarea de noi articole în tabel; în
lipsa acestei clauze se pot adăuga, pe rând noi linii(înregistrări) în
tabel, prin combinaţia de taste CTRL+Y
 Clauza NODELETE împiedică ştergerea accidentală de articole
 Clauza NOEDIT interzice editarea articolelor

12
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Odată cu comanda BROWSE, pe


ecran, mai exact în meniul sistemului apare
un nou meniu numit TABLE, cu
următoarele opţiuni:

Opţiunea Properties deschide un


ecran de dialog care permite utilizatorului
să filtreze datele, să selecteze câmpurile, sî
precizeze câmpul index activ, etc.
o Opţiunea Go to Record permite
poziţionarea pe o anumită
înregistrare dată prin numărul ei sau
prin căutare cu Locate
o Opţiunea Append New Record
adăugă o nouă înregistrare
o Opţiunea Toggle Deletion Mark
marchează pentru ştergere
înregistrarea curentă
o Opţiunea Append Records permite compunerea comenzii
APPEND FROM
o Opţiunea Delete Records deschide ecranul pentru ştergerea
înregistrărilor
o Opţiunea Recall Records permite anularea marcajelor de ştergere
o Opţiunea Remove Records ştergerea efectivă a înregistrărilor
marcate
o Opţiunea Replace Field deschide ecranul pentru compunerea
comenzii REPLACE
o Opţiunea Size Field permite modificarea interactivă a dimensiunii
câmpului pe care este cursorul (cu butonul stâng al mouse-ului se
schimbă mărimea acestuia)
o Opţiunea Move Field permite schimbarea ordinii coloanelor
o Opţiunea Resize Partitions permite afişarea tabelei în două
partiţii.

13
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

B. Probleme rezolvate

1. Comanda BROWSE
Considerăm tabela STUDENT.DBF (Matricol N(4),
Exemplu 1.1. Nume C(20), Prenume C(20), Cnp C(13), Grupa C(4),
Media N(5,2)). Să se efectueze următoarele operaţii:

- să se afişeze toţi studenţii înghetând primele trei coloane


- să se afişeze numai numele şi grupa studentilor, precum şi media
fiecăruia
- să se afişeze numai studenţii din grupa 116a
- să se afişeze primii 15 studenţi, fixând pentru modificare câmpul
media
Pentru aceste cerinţe se pot introduce următoarele comenzi:

BROWSE LOCK 3

BROWSE FIELDS NUME,GRUPA,MEDIA

BROWSE FOR GRUPA=’116a’

BROWSE NEXT 15 FREEZE MEDIA

2. Cautare şi pozitionare

Exemplu 2.1. Considerăm tabela STUDENT.DBF (Matricol N(4), Nume


C(20), Prenume C(20), Cnp C(13), Grupa C(4), Media
N(5,2)). Să se afişeze prima, ultima şi penultima înregistrare din tabela
STUDENT.DBF.
Rezolvare: USE STUDENT
GO TOP
DISPLAY
GO BOTTOM
DISPLAY
SKIP –1
DISPLAY

14
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Exemplu 2.2. Să se poziţioneze pointerul după 4 înregistrări din poziţia


curentă şi să afişeze numărul înregistrării.
Rezolvare:
USE STUDENT
SKIP 4
?RECNO()

Exemplu 2.3. Să se afişeze a 5-a înregistrare din tabela STUDENT,


apoi să se afişeze următoarea şi anterioara.
Rezolvare:
USE STUDENT
GO 5
DISPLAY
SKIP –1
DISPLAY
SKIP +2
DISPLAY

3. Sortare şi duplicare

Exemplu 3.1. Să se sorteze tabela STUDENT după câmpul


GRUPA/descrescător şi după câmpul MEDIA/crescător,
numai studenţii care au codul numeric personal
>=1212121212121.
Rezolvare:

USE STUDENT
SORT TO STUD1 ON GRUPA/D, MEDIA/A FOR CNP >=
‘1212121212121’
USE
USE STUD1
BROWSE

Considerăm tabela CARTI cu următoarea


Exemplu 3.2.
structură: COTA C(7), AUTOR C(30), TITLU C(50),
PRET N(9), AN_AP N(4), NRBUC N(3), EDITURA C(30),
în care vom introduce cel puţin 20 de înregistrări.

15
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

 Să se creeze o tabelă CSORT cu cărţile ordonate crescător dupa an


apariţie şi preţ.
Rezolvare: USE CARTE
SORT TO CSORT ON AN_AP, PRET
USE
USE CSORT
BROWSE

 Să se sorteze tabela CARTE după autor/descrescător, titlu/crescător,


numai pentru cărţile din editura “TEORA”.
Rezolvare:
USE CARTE
SORT TO CSORT1 ON AUTOR/CD,
TITLU/CA FOR EDITUTA=”TEORA”
USE
USE CSORT1
BROWSE

4. Comenzi de actualizare

Considerăm tabela CLIENTI cu următoarea


Exemplu 4.1.
structură : CODC N(5), DENC C(30), STR C(20), NR
N(3), LOC N(20), TEL N(7), CONT C(30), în care vom
introduce cel puţin 20 de înregistrări.
 Să se scrie secvenţa de comenzi care permite modificarea câmpurilor
codc şi loc pentru codc=111
Rezolvare:
USE CLIENTI
BROWSE FIELDS CODC, LOC FOR CODC=111

Exemplu 4.2. Considerăm tabela PERSONAL.DBF.


Să se scrie secvenţa de comenzi pentru creşterea
salariului cu 15% pentru angajaţii din secţia 2.

Rezolvare: USE PERSONAL


REPLACE ALL SALARIU WITH SALARIU +
SALARIU*10/100 FOR SECTIA=2
LIST
16
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

 Să se şteargă fizic toţi angajaţii care au salariul <=2500000.

USE PERSONAL
DELETE ALL FOR SALARIU <= 2500000
PACK
LIST

C. Probleme propuse spre rezolvare

Problema 1 Să se construiască tabela ELEVI.DBF cu


următoarele câmpuri: Nr_matricol N(4), Nume C(15),
Prenume C(15), Clasa C(4), Absente N(2), Nota1 N(2), Nota2 N(2),
Nota3 N(2), Media N(5,2).

- să se introducă cel putin 10 înregistrări în tabelă


- folosind comanda BROWSE să se execute următoarele cerinţe:
 modificaţi interactiv datele din câmpul Absente
 afişati numai elevii din clasa a 9A
 afişati numai numele, clasa şi media elevilor care nu au nici o
absenţă
 poziţionati-vă numai pe câmpul media şi efectuaţi modificări

Problema 2
Să se construiască tabela ANGAJATI.DBF cu
următoarele câmpuri:
COD N(4), NUME C(15),PRENUME C(15), NUMAR_BULETIN C(8),
SALARIU N(8), FUNCTIE C(12), DATA_N D(8), NR_COPII N(2),
ALOCATIA N(7), COSTUL_ORA_NOAPTE N(7), NUMAR_NOPTI N(2),
RETINERI N(7), REST_PLATA N(8), SPOR_NOAPTE N(6). Se cer:
 să se introducă cel putin 20 înregistrări în tabelă
 să se afişeze persoanele care lucrează în societate
 care sunt persoanele fără copii în funcţii de administraţie?
 alocaţia de stat pentru copii se calculează ca o sumă fixă înmulţită
cu numărul de copii. Treceţi în baza de date alocaţia.
 modificaţi salariul prin majorare cu 15% la toţi lucrătorii în funcţii
de contabilitate, cu 30% la cei în funcţii de administraţie.

17
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
 treceţi codul unei persoane ca fiind chiar numărul articolului
current
 să se afişeze pentru fiecare persoană suma de primit, ştiind că
reţinerile se scad, iar sporurile şi alocaţia se adună la salariu
 treceţi sporul de noapte ca fiind calculat după formula: spor noapte
= salariu/zi*nr. nopti *0.17
 să se afişeze persoanele care au rest de plată <=0
 toate persoanele care lucrează în funcţii de administraţie, au copii
şi sunt în vârstă de peste 60 ani, se vor pensiona (marcare
ştergere)
 se vor afişa posturile vacante după pensionarea personalului
 afişati care este numele persoanei care are codul 4
 înaintea persoanei (cu codul 4) inseraşi o înregistrare vidă apoi
completaţi cu date
 completaţi acelaşi salariu cu al primei persoane la toate celelalte
care au acceaţi funcţie

Observatie: În câmpul FUNCTIE se introduc doar valorile „administraţie”,


„contabilitate”, „producţie” şi „vânzări”.

18
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Lucrarea 3

Citirea informaţiilor de la tastatură şi memorarea lor în variabile


de memorie.
Indexarea tabelelor, tipuri de indecşi.
Căutare şi poziţionare rapidă în tabele indexate.

A. Consideraţii teoretice

1. Citirea informaţiilor de la tastatură şi memorarea lor în


variabile de memorie

Citirea informaţiilor de la tastatură se poate efectua prin


următoarele comenzi:

1. Comanda INPUT cu următoarea sintaxă:


INPUT [<mesaj>] TO <variabila>

Funcţionarea acestei comenzi constă în afişarea opţională a unui


mesaj (scris între ghilimele), şi memorarea informaţiei date de la
tastatura în variabila cu numele specificat.
Exemplu 1.1.
Pentru a putea citi valoarea 10 de la tastatură şi a o
memora în variabila n, procedăm astfel:
INPUT “Dati n= ” TO n
?n &&afisam valoarea memorata in n

Dacă vrem să memorăm informaţii de tip şir de caractere, trebuie


să le introducem între ghilimele.
Exemplu 1.2.

INPUT “Dati numele ” TO nume


?nume &&afisam valoarea memorata in nume

19
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

2. Comanda ACCEPT, se utilizează exclusiv pentru memorarea


variabilelor de tip şir de caractere, astfel încât nu mai este necesară
folosirea ghilimelelor la introducerea de la tastatură. Sintaxa comenzii
ACCEPT este:

ACCEPT [<mesaj>] TO <variabila>

Exemplu 1.3.

ACCEPT “Dati numele ” TO nume


?nume &&afisam valoarea memorata in nume

B. Probleme rezolvate

2. Indexarea tabelelor

Exemplu 2.1. Considerăm tabela STUDENT.DBF (Matricol N(4), Nume


C(20), Prenume C(20), Cnp C(13), Grupa C(4), Media
N(5,2)). Să se indexeze tabela după câmpul compus
Matricol şi Nume. Să se afişeze tabela indexată.
Rezolvare:

USE STUDENT
INDEX ON STR(MATRICOL)+NUME TAG INDEX1
LIST

Exemplu 2.2.
Considerăm tabela MECIURI.DBF cu următoarea
structură: Cod N(3), Echipa1 C(12), Echipa2 C(12) ,
Localitate C(15), Data D(8), Ora N(2). Să se completeze codul fiecărui
meci cu o informaţie care să conţină numărul înregistrării respective, iar
informaţiile din tabelă să apară în ordine alfabetică după localitatea unde
se desfăşoară meciurile.
Rezolvare:
USE MECIURI
INDEX ON LOCALITATE TAG LOC
REPLACE ALL COD WITH RECNO()
LIST
20
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Considerăm tabela PRODUSE.DBF cu următoarea


Exemplu 2.3.
structură: Cod N(5), Denumire C(15), Cantitate N(5),
UM C(3), Pret N(7), Furnizor C(15). Să se indexeze
această tabelă după o cheie compusă formată din două câmpuri
Denumire şi Cod, fără a permite existenţa dublurilor.
Rezolvare:
USE PRODUSE
INDEX ON DENUMIRE+STR(COD,5) TO INDEX2 UNIQUE
LIST

3. Căutare şi pozitionare rapidă în tabele indexate

Considerăm tabela CARTE cu următoarea


Exemplu 3.1. structură: COTA C(7), AUTOR C(30), TITLU C(50),
PRET N(9), AN_AP N(4), NRBUC N(3), EDITURA C(30),
în care vom introduce cel puţin 20 de înregistrări.

a) Să se afişeze indexate după titlu toate cărţile care au apărut în


perioada 1990-2000.

Rezolvare:
USE CARTE
INDEX ON RTRIM(TITLU) TAG TITLU FOR
BETWEEN(AN_AP,1990,2000)
LIST

b) Să se afişeze indexate după preţ şi an apariţie toate cărtile care


aparţin editurii L&S Infomat.

Rezolvare:
USE CARTE
INDEX ON STR(PRET)+STR(AN_AP,4) TAG INDEX1 FOR
UPPER(EDITURA)=”L&S INFORMAT”
LIST

21
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

C. Probleme propuse spre rezolvare

Problema 1
Să se construiască tabela CONTRACTE.DBF
create la data de 1 noiembrie 2002 cu toate
contractele încheiate de o societate comercială cu diverşi furnizori
pentru livrarea produselor necesare producţiei sale.Tabela are
următoarea structură:
NRC N(5), DATA D(8), FURNIZOR C(20), PRODUS C(10), CANT N(10,2),
PRET N(10), TERM_LIVR D(8). , ONORAT L(1).Unde NRC = număr
contract, DATA = data semnării contractului, TERM_LIVR = termenul de
livrare, ONORAT = arată dacă contractul a fost sau nu onorat.
Se cer:
1. să se introducă cel puţin 20 înregistrări în tabelă
2. să se afişeze toate contractele încheiate cu “SC COSTICA SRL”
anul trecut
3. aflaţi care este valoarea fiecărui contract (presupunând că pe un
contract este un singur produs) al furnizorului X (citit de la
tastatură)
4. aflaţi contractele cu termenul de livrare depăşit
5. afişati ultimele 5 înregistrări din tabelă
6. aflaţi câte contracte are furnizorul X (citit de la tastatură)
7. aflaţi dacă există vreun contract cu furnizorul X. Dacă da, afişaţi
numărul şi data acestui contract. Cum am putea afla şi
următorul contract al aceluiaşi furnizor?
8. să se indexeze descrescător înregistările tabelei după data
contractelor
9. să se identifice rapid toate contractele onorate până la data de
1 ianuarie 2004

Problema 2 Se consideră tabela REVISTE.DBF care are


structură: Nume_r C(25), Cod_r N(3), Pret N(7),
Nr_luni N(2), Valoare N(20).
1. Să se introducă minim 10 înregistrări în tabelă;
2. Să se completeze câmpul Valoare (care iniţial era vid) cu
expresia corespunzătoare pentru fiecare înregistrare din tabelă;
3. Să se afişeze lista revistelor care au codul cuprins între 130 şi
150, după numărul de apariţii lunare (se presupune că există în
tabelă astfel de înregistrări);
4. Să se adauge o nouă revistă în tabelă.
22
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Problema 3 Se consideră tabela OLIMPIADA.DBF care are


structura: Nume C(25), Judet C(10), Scoala C(20),
Clasa C(4), Punctaj1 N(3), Punctaj2 N(3), Total N(6) în care se
gestionează rezultatele obţinute de elevi la faza naţională a unei
olimpiade. Câmpurile Punctaj1 şi Punctaj2 reprezintă punctele obţinute
de elevi la cele două probe ale olimpiadei şi nu depăşesc 100 de puncte
fiecare.

1. Să se introducă minim 10 înregistrări în tabelă;


2. Să se afişeze în ordine alfabetică, pe clase, toţi elevii participanţi
(nume, judeţ);
3. Să se completeze câmpul Total (care iniţial era vid) cu suma
dintre punctajele obţinute de fiecare elev în parte şi să se
afişeze pe clase clasamentul, în ordinea descrescătoare a
punctajului total (nume, puncte, judeţ).
4. Să se modifice punctajele unui elev al cărui nume este citit de la
tastatură.

23
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Lucrarea 4

Prelucrări statistice şi financiare.

A. Consideraţii teoretice

1. Prelucrări statistice şi financiare

Exemplu 1.1. O societate comercială înregistrează repartiţia


produselor date spre vânzare la diferite magazine în
tabela REPART.DBF cu următoarea structură (Data D(8), Cod N(3),
Nume C(12), Pret N(8), Grupa C(2), Mag N(1), Cant N(8)). 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.m.d. Se consideră că vom introduce câteva înregistrări
asemănătoare cu cele de mai jos:

Se cer următoarele:

 să se afişeze câte produse distincte comercializează societatea


USE REPART.DBF
INDEX ON NUME TAG NUME
COUNT TO NR
?”NUMARUL DE PRODUSE DISTINCTE ESTE ”,NR

 să se calculeze pentru fiecare cod-produs cantitatea totală repartizată


în întreaga perioadă de evidenţă
INDEX ON COD TAG COD &&indexam dupa cod
TOTAL ON COD TO TOT.DBF FIELDS CANT
USE
USE TOT
LIST
24
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

 să se calculeze pentru fiecare magazin din subordine valoarea


produselor repartizate

INDEX ON MAGAZIN TAG MAGAZIN &&indexam dupa magazin


TOTAL ON MAGAZIN TO TOT.DBF FIELDS PRET,CANT
USE
USE TOT
LIST

 să se afle cel mai scump produs


INDEX ON STR(PRET)+NUME TAG X UNIQUE
&&indexam dupa pret şi numele produsului
X=PRET
&&retinem cea mai mare valoare
LIST NUME FOR PRET=X
&&afisam doar numele produselor care au pretul egal cu variabila X

Exemplu 1.2. Considerăm tabela CARTE cu următoarea structură


: COTA C(7), AUTOR C(30), TITLU C(50), PRET N(9),
AN_AP N(4), NRBUC N(3), EDITURA C(30), în care vom introduce cel
puţin 10 de înregistrări.

 să se afiseze valoarea medie, valoarea minimă şi valoarea maximă a


cărţilor, folosind comanda CALCULATE
CALCULATE AVG(PRET*NRBUC), MIN(PRET*NRBUC),
MAX(PRET*NRBUC) TO medie,, minim, maxim
?”Valoarea medie este ”,medie
?”Valoarea minima este ”,minim
?”Valoarea maxima este ”,maxim
 să se afişeze valoarea totalp a cărţilor

SUM (PRET*NRBUC) TO total


?”Valoarea totala este ”,total

 să se calculeze numărul cărţilor apărute de la 1 ianuarie 2000 la


editura “TEORA”

COUNT FOR AN_AP>={01/01/00} AND


EDITURA=”TEORA” TO numar
?”Numarul cartilor aparute dupa 1 ian. 2000 la editura
Teora este ”, numar

25
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

C. Problemă propusă spre rezolvare

Problema Se consideră o tabelă numită VANZARI.DBF în


care se ţine evidenţa la mai multe magazine ale
aceleiaşi societăţi comerciale “SC COSTICA SRL”.
Tabela are următoarea structură: Data D(8), Cod_magazin N(2),
Cod_raion C(5), Cod_produs C(12), Um C(3), Cantitate N(5).

Să se efectueze următoarele calcule:

1. câte raioane au vândut azi produsul x?


2. cantitatea totală din produsul x vândută astăzi
3. la câte magazine se găsesc raioane de papetărie (cod_raion=2)?
4. numărul total de magazine al societaţii şi numărul de raioane
distincte
5. totalul cantităţii vândute din produsul x în fiecare magazin
6. valoarea totală a vânzarilor pe lista raioane (fiecare raion o singură
dată, chiar dacă el aparţine la magazine diferite)
7. valoarea medie a vânzarilor pe magazine
8. care este produsul vândut cel mai scump şi unde s-a vândut el?
9. care sunt cele 3 magazine fruntaşe (au avut cele mai mari vânzări
în perioada ultimei luni)?

26
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Lucrarea 5

Programare structurată (clasică) în Visual Foxpro

A. Consideraţii teoretice

Exemplu 1. Se consideră tabela PERSONAL.DBF.

a) Se cere să se afişeze pentru fiecare angajat numele şi salariul initial şi


apoi salariul mărit cu 10%.
Rezolvare:
Se construieşte un program sursă Visual Foxpro cu următorul conţinut.

use personal
set talk off
clear
scan
?"salariul initial este ",SALARIU," "
??"pentru persoana ",NUME
?"Salariul indexat este ",SALARIU*0.1+SALARIU
endscan
wait ‘apasa o tasta pentru terminare’
use

b) Se cere să se afişeze numai acei angajaţi care au salariul între


1000000 şi 2500000. Pentru aceştia să se afişeze numele, salariul şi
funcţia.
Rezolvare:
Se construieşte un program sursă Visual Foxpro cu următorul conţinut.

use personal
set talk off
clear
scan
if salariu>=1000000 and salariu<=2500000
?nume+' '+str(salariu,8)+' '+functie
endif
endscan
wait ‘apasa o tasta pentru terminare’
use
27
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

c) Se cere să se modifice prin majorare cu 20% a valorii din câmpul


MARCA, pentru toţi angajaţii care au salariul mai mare de 3000000.
Rezolvare:
Se construieşte un program sursă Visual Foxpro cu următorul conţinut.
use personal
set talk off
clear
do while not eof()
if salariu>=3000000
replace marca with marca+marca*0.2
endif
skip
enddo
list
wait 'apasa o tasta pentru terminare '
use

d) Să se scrie un program cu ajutorul căruia să se localizeze persoana cu


MARCA 1234, iar în cazul când este gasită să modifice salariul
indexându-l cu 15%, iar prenumele să devină "ION"; în cazul în care nu
se gaseşte să se afişeze un mesaj de avertisment "Lipsa MARCA în
tabelă". Să se afişeze conţinutul tabelei înainte şi după modificare.

Rezolvare:

USE PERSONAL
SET TALK OFF
LIST
WAIT 'TABELA INAINTE DE MODIFICARE'
SCAN
LOCATE FOR MARCA=1234
IF FOUND()
REPLACE SALARIU WITH SALARIU+SALARIU*15/100
REPLACE PRENUME WITH 'ION'
DISPLAY
WAIT
ELSE
WAIT 'LIPSA MARCA IN TABELA'
ENDIF
ENDSCAN
LIST
WAIT 'TABELA DUPA MODIFICARE'
USE

28
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Se consideră baza de date PERSOANE.DBF cu


Exemplu 2.
următoarea structură: COD N(3), NUME C(15),
PRENUME C(15), ADRESA C(20), ORAS C(10). Să se
introducă minim 5 articole în baza de date.
Să se scrie un program cu ajutorul căruia să se şteargă datele
despre o anumită persoană citindu-i numele de la tastatură. Ştergerea se
va executa doar dacă numele persoanei există deja, în cazul în care nu
există se va afişa un mesaj "Persoana cu acest nume nu există". Să se
listeze conţinutul bazei de date înainte şi după ştergere.
Rezolvare:
use PERSOANE
set talk off
clear
list
wait
input “Introduceti numele persoanei care se sterge ” to num
for i=1 to reccount()
goto i
if nume=num
delete
pack
list
wait ‘apasa o tasta pentru continuare’
else
wait 'persoana cu acest nume NU exista '
endif
endfor
use

Exemplu 3. Se consideră tabela STUDENTI.DBF cu urmatoarea


structură: Nume C(20), Prenume C(15), Nota1 N(2),
Nota2 N(2), Nota3 N(2), Nota4 N(2), Nota5 N(2), Nota6 N(2), Media
N(5,2), în care numai primele 8 câmpuri conţin informaţii, câmpul Media
fiind iniţial vid. Să se scrie un program care să calculeze următoarele:

a) afişarea studenţilor în ordinea descrescătoare a mediilor


b) marcarea studenţilor care au picat un examen (una din cele şase note
să fie <5.00)
c) afişarea separată a studenţilor (nume, prenume şi medie) care au
trecut sesiunea şi a celor restanţieri.

29
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

set talk off


clear
use studenti
&& punctul a)
?"Studentii in ordinea descrescatoare a mediilor"
do while not eof()
x=(nota1+nota2+nota3+nota4+nota5+nota6)/6
replace media with x
skip
enddo
sort to stud1.dbf on media/d
use
use stud1
list fields nume,prenume,media
use
wait "apasa o tasta pentru trecerea la punctul urmator"

&& punctul b)
use studenti
?"Lista studentilor restantieri"
delete all for (nota1<5.00) or (nota2<5.00) or (nota3<5.00) or
(nota4<5.00) or (nota5<5.00) or (nota6<5.00)
list fields nume,prenume,nota1,nota2,nota3,nota4,nota5,nota6 for
(nota1<5.00) or (nota2<5.00) or (nota3<5.00) or (nota4<5.00) or
(nota5<5.00) or (nota6<5.00)
wait "apasa o tasta pentru trecerea la punctul urmator"

&& punctul c)
?"Lista studentilor admisi"
use studenti
list fields nume,prenume,media for media>=5.00
wait "apasa o tasta"
?"Lista studentilor restantieri"
scan
if media<5.00
display fields nume,prenume,media
endif
endscan
wait"apasa o tasta pentru terminare"
use

30
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

C. Probleme propuse spre rezolvare

Problema 1 Să se construiască tabela care conţine datele


referitoare la rezultatele unei sesiuni de examene.
Numele tabelei este SESIUNE.DBF şi are următoarea structură: Nume
C(20), Grupa C(4), Media N(5,2).
a) să se afişeze primii trei şi ultimii trei studenţi, în ordinea mediilor,
din facultate
b) ştiind că studentul x (citit de la tastatură) are media greşită, să se
remedieze greşeala
c) să se şteargă din tabelă studenţii care nu au promovat sesiunea.

Problema 2
Fie tabela PRODUSE.DBF cu următoarea structură:
Cod_produs N(5), Cod_magazin N(5), Cantitate N(5),
Pret N(5), cu produsele vândute la o societate comercială:
a) care este cantitatea totală din produsul x (citit de la tastatură)?
b) câte magazine are societatea respectivă?
c) afişaţi valoarea totală a vânzărilor pentru fiecare magazin.

Problema 3 Fie tabela AGENDA.DBF cu următoarele câmpuri:


Nume C(20), Prenume C(15), Adresa M(10), Telefon
N(10).
a) afişaţi numărul de persoane din tabelă care au acelaşi nume cu cel
precizat de utilizator de la tastatură
b) localizaţi persoana cu numele şi prenumele precizate de utilizator şi
afişaăi numărul ei de telefon. Dacă persoana respectivă nu există
afişaţi un mesaj corespunzător
c) ordonaţi tabela după câmpurile nume şi prenume.

31
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Lucrarea 6

Programare structurată (clasică) în Visual Foxpro –


operaţii de actualizare înregistrări în tabele.

Exemplu 1. Se consideră tabela STOCURI.DBF, cu următoarea


structura: Cod_prod N(5), Den_prod C(20), Stoc N(8),
Um C(5), unde Um reprezintă unitate de masură. Tabela va fi indexată la
creare pe câmpul Cod_prod. Se cere să se realizeze următoarele operaţii
de actualizare:
 Adăugarea unui nou produs
 Modificarea unui produs existent în tabelă
 Ştergerea unui produs
 Vizualizarea conţinutului tabelei

Rezolvare:
În funcţie de alegerea unei opţiuni dintr-un meniu dat, se execută
operaţia selectată. Astfel:
 Operaţia de adăugare - se citeşte codul unui produs şi se caută
acesta în tabelă. Dacă nu se gaseşte, atunci se citesc informaţiile
care trebuie depuse în tabelă şi se adăugă acestea la sfârşitul
tabelei. Dacă este găsit, atunci se presupune că se realizează o
intrare în stoc, astfel se citeşte doar cantitatea şi se adăugă la
stocul deja existent.
 Operaţia de modificare – se citeşte codul unui produs şi se
caută în tabelă. Dacă nu este găsit, atunci se afişeaza un mesaj
corespunzător. Dacă este găsit, atunci se afişeaza valorile tuturor
câmpurilor existente în tabelă şi apoi se citesc noile valori ale
câmpurilor care vor fi asociate codului respectiv.
 Operaţia de ştergere - se citeşte codul unui produs şi se caută în
tabelă. Dacă nu este găsit, atunci se afişează un mesaj
corespunzător. Dacă este găsit, atunci se afişează valorile celorlate
câmpuri ale tabelei pentru înregistrarea al cărui cod de produs a
fost citit, iar utilizatorul hotărăşte dacă îl şterge sau nu.
 Operaţia de vizualizare – se afişează conţinutul tabelei făcându-
se o pauză după fiecare ecran plin de informaţii
 Terminarea programului şi întoarcerea în mediul Visual Foxpro.

32
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Codul sursă al programului:

set talk off


clear
store space(1) to optiune
do while .T.
@1,30 say "A - Adăugare"
@2,30 say "M - Modificare"
@3,30 say "S - Stergere"
@4,30 say "V - Vizualizare"
@5,30 say "T - Terminare"
@6,30 say "Introduceti optiunea dumneavoastra: " get optiune
function "!"
read
do case

case optiune="A"
&& operatia de adăugare
clear
use stocuri order cod_prod
opt='D'
do while upper(opt)='D'
clear
store 0 to vcod_prod,vcant
store space(20) to vden_prod
store space(5) to vum
@10,10 say "Dati codul produsului care urmeaza sa
fie adăugat " get vcod_prod picture "99999"
read
seek vcod_prod
if not found()
@15,10 say "Dati denumirea produsului " get vden_prod function "!"
@16,10 say "Dati cantitatea " get vcant picture "999999999"
@17,10 say "Dati unitatea de masura " get vum function "!"
read
append blank
replace cod_prod with vcod_prod, den_prod
with vden_prod, stoc with vcant, um with vum
else
@20,10 say " Produsul deja exista, vom adăuga cantitatea "
@21,10 say "Dati cantitatea " get vcant picture "999999999"
read
replace stoc with stoc+vcant
33
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
endif
opt=space(1)
@40,15 say "Doriti sa continuati? [D/N]" get opt function "!"
read
enddo
use

case optiune="M"
&& operatia de modificare
clear
use stocuri order cod_prod
opt='D'
do while upper(opt)='D'
clear
store 0 to vcod_prod
@10,10 say "Dati codul produsului pe care doriti sa-l modificati " get
vcod_prod pict "99999"
read
seek vcod_prod
if not found()
@15,10 say "Produsul nu exista in tabela"
wait "apasa o tasta pentru continuare"
else
@21,25 say "denumire "
@21,45 say den_prod
@22,25 say "stoc "
@22,45 say stoc
@23,25 say "um "
@23,45 say um
store space(20) to vden_prod
store space(5) to vum
store 0 to vstoc
@33,10 say "Introduceti noile valori: "
@34,10 say "Dati denumirea produsului " get
vden_prod
@35,10 say "Dati stocul " get vstoc
@36,10 say "Dati unitatea de masura " get
vum
read
replace den_prod with vden_prod, stoc with
vstoc, um with vum
endif
@40,15 say "Doriti sa continuati? [D/N]" get opt
function "!"
read

34
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
enddo
use

case optiune="S"
clear
&& operatia de stergere
use stocuri order cod_prod
opt="D"
do while upper(opt)="D"
clear
store 0 to vcod_prod
@10,10 say "Dati codul produsului pe care doriti sa-l
stergeti " get vcod_prod pict "99999"
read
seek vcod_prod
if not found()
@15,10 say "Produsul nu exista in tabela"
wait "apasa o tasta pentru continuare"
else
@21,25 say "denumire "
@21,45 say den_prod
@22,25 say "stoc "
@22,45 say stoc
@23,25 say "um "
@23,45 say um
store space(1) to opt1
@30,10 say "Doriti sa stergeti? [D/N]" get
opt1 function "!"
read
if upper(opt1)="D"
delete
endif
endif
store space(1) to opt
@40,15 say "Doriti sa continuati? [D/N]" get opt
function "!"
read
enddo
use

case optiune="V"
clear
&& operatia de vizualizare
use stocuri order cod_prod
@15,10 say "==== LISTA STOCURI ============"

35
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
@16,10 say "--------------------------------------------------"
@17,10 say "|COD |DENUMIRE | STOC | UNITATE |"
@18,10 say "| PRODUS | PRODUS | | DE MASURA |"
@19,10 say "--------------------------------------------------"
go top
k=20
do while not eof()
@k,15 say cod_prod picture "99999"
@k,35 say den_prod picture
"XXXXXXXXXXXXXXXXXXXX"
@k,50 say stoc picture "999999999"
@k,55 say um picture "XXXXX"
k=k+1
if k>40
wait "Pentru continuare apasati o tasta"
k=20
@6,1 clear to 24,79
endif
skip
enddo
use

case optiune="T"
EXIT
otherwise
?"A-ti ales o optiune gresita"
loop
endcase
enddo

Exemplu 2. Se consideră tabela STUDENTI.DBF, cu următoarea


structură: GRUPA C(4), NUME C(20), PRENUME C(20),
N_ALGEBRA N(2), N_BAZE N(2), N_ANALIZA N(2), N_TS N(2),
N_LIMBAJE N(2), MEDIA N(5,2) unde N_ALGEBRA reprezintă nota la
algebră, N_BAZE reprezintă nota la baze de date, N_ANALIZA reprezintă
nota la analiză matematică, N_TS reprezintă nota la teoria sistemelor, iar
N_LIMBAJE reprezintă nota la limbaje de programare. Iniţial table este
vidă. Câmpul MEDIA se calculează pe baza notelor la cele cinci materii.
Se cere să se realizeze următoarele operaţii de actualizare:
 Introducerea informaţiilor în tabelă, prin program
 Adăugarea unui nou student la cerere
 Vizualizarea conţinutului tabelei
36
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Rezolvare:

clear
set talk off
USE STUDENTI

&& Introducerea informaţiilor în tabelă, prin program

nr=0
@10,10 say "Dati numarul de studenti care vreti sa-i introduceti " get
nr
read
for i=1 to nr
vgrupa=space(4)
vnume=space(20)
vprenume=space(20)
valgebra=0
vbaze=0
vanaliza=0
vts=0
vlimbaje=0
@11,10 say "Grupa " get vgrupa
@12,10 say "Numele " get vnume
@13,10 say "Prenumele " get vprenume
@14,10 say "Nota la algebra " get valgebra
@15,10 say "Nota la baze de date " get vbaze
@16,10 say "Nota la analiza matematica " get vanaliza
@17,10 say "Nota la teoria sistemelor " get vts
@18,10 say "Nota la limbaje de programare " get vlimbaje
read
append blank
replace grupa with vgrupa, nume with vnume, prenume with
vprenume, n_algebra with valgebra, n_baze with vbaze, n_analiza
with vanaliza, n_ts with vts, n_limbaje with vlimbaje
endfor

&& Adăugarea unui nou student la cerere


clear
index on nume tag nume
opt='D'
do while upper(opt)='D'
clear
vnume=space(20)

37
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
@10,10 say "Dati numele studentului care urmeaza a fi adăugat " get
vnume
read
seek vnume
if not found()
vgrupa=space(4)
vprenume=space(20)
valgebra=0
vbaze=0
vanaliza=0
vts=0
vlimbaje=0
@11,10 say "Grupa " get vgrupa
@13,10 say "Prenumele " get vprenume
@15,10 say "Nota la algebra " get valgebra
@17,10 say "Nota la baze de date " get vbaze
@19,10 say "Nota la analiza matematica " get vanaliza
@21,10 say "Nota la teoria sistemelor " get vts
@23,10 say "Nota la limbaje de programare " get vlimbaje
read
append blank
replace grupa with vgrupa, nume with vnume, prenume
with vprenume, n_algebra with valgebra, n_baze with vbaze,
n_analiza with vanaliza, n_ts with vts, n_limbaje with vlimbaje
else
@27,10 say " Studentul deja exista "
wait
endif
opt=space(1)
@40,15 say "Doriti sa continuati? [D/N]" get opt function "!"
read
enddo
use
&& Vizualizarea conţinutului tabelei
clear
@10,10 say "Lista studentilor "
use STUDENTI
do while not eof()
?" "+grupa+" "+nume+" "+prenume+" " +
str(n_algebra,2)+ "" + str(n_baze,2)
+""+str(n_analiza,2)+""+str(n_ts,2)+""+str(n_limbaje,2)+""+str(
media,2,2)
skip
enddo
wait

38
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

C. Probleme propuse spre rezolvare

Problema 1 Se consideră tabela CASA_SCHIMB.DBF care


conţine informaţii despre evidenţa unei case de
schimb valutar. Tabela are următoarea structură: COD N(4),
OPERATIUNE C(12), TIP_VALUTA C(15), SUMA N(6), CURS N(5),
VALOARE N(15). Să se scrie un program care să efectueze următoarele
operaţii specifice:
1. Cumpărare valută
2. Vânzare valută
3. Total încasări

Problema 2 Se consideră tabela MEDICAMENTE.DBF care


conţine informaţii despre evidenţa medicamentelor
dîntr-o farmacie. Tabela are următoarea structură: COD N(5),
DENUMIRE C(25), UM C(5), CANTITATE C(7), PRET N(9), VALOARE
N(25). Să se scrie un program care să efectueze următoarele operaţii
specifice:

1. Adăugarea unui nou medicament, cu denumire introdusă de la


tastatură, dacă acel medicament nu este în tabelă, sau
suplimentarea stocului existent în cazul în care medicamentul este
în tabelă;
2. Modificarea preţului unui medicament a cărei denumire se citeşte
de la tastatură;
3. Afişarea tuturor medicamentelor aflate la un moment în tabelă.

Problema 3 Se consideră tabela LOCATARI.DBF care conţine


informaţii despre evidenţa medicamentelor dintr-o
farmacie. Tabela are următoarea structură: Nume
C(20), Prenume C(15), Nr_apart N(2), Statut C(10), Nr_pers N(2),
Suprafata N(6,2). Câmpul Statut reprezintă starea apartamentului din
punct de vedere al ocupării sale, adicî dacă este sau nu ocupat de
locatari (are sau nu propietari), astfel valorile care vor fi reţinute în acest
câmp sunt: ‘Ocupat’ sau ‘Neocupat’. Să se scrie un program care să
efectueze următoarele operaţii specifice:
1. Să se mute o persoană într-un apartament care se verifică în
prealabil dacă este neocupat;
2. Să se elibereze un apartament, specificând numele persoanei care
se mută.
39
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Lucrarea 7

Funcţii şi proceduri utilizator. Ferestre.

B. Probleme rezolvate

Exemplu 1. Se consideră tabela CARTI.DBF, cu următoarea


structură: TITLU C(25), AUTOR C(25), AN_APAR D(8).
Se cere:
 să se adauge o nouă carte în tabelă
 să se elimine cărţile unui autor al cărui an de apariţie îl citim de
tastatură

set talk off


clear
define window f1 from 1,1 to 45,120 title "BIBLIOTECA"
activate window f1
use carti
opt=0
do while opt <>3
@20,20 say "Apasati 1 - pentru adăugare"
@22,20 say "Apasati 2 - pentru eliminare"
@24,20 say "Apasati 3 - pentru iesire din program"
@30,20 get opt
read
do case
case opt=1
do ADĂUGARE
case opt=2
do ELIMINARE
case opt =3
do IESIRE
endcase
clear
enddo
deactivate window f1

40
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

procedure ADĂUGARE
clear
append blank
@30,20 say "Titlu: " get titlu
@35,20 say "Autor " get autor
@40,20 say "An aparitie" get an_apar
read
return
procedure ELIMINARE
clear
an={//}
@40,20 say "Dati anul " get an
read
delete for an_apar=an
pack
return
procedure IESIRE
clear
use
set talk on
clear all
cancel
return

Să se calculeze cel mai mare divizor a două


Exemplu 2. numere naturale citite de la tastatură.
(Se va folosi algoritmul lui Euclid prin scăderi repetate)

set talk off


clear
define window f1 from 10,10 to 35,100 title “CMMDC”
activate window f1
nr1=0
nr2=0
@22,20 say "Dati primul numar " get nr1
@24,20 say "Dati al doilea numar " get nr2
read
d=cmmdc(nr1,nr2)
@30,20 say "C.m.m.d.c. este "
@30,40 say d
deactivate window f1
41
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
function cmmdc
parameters a,b

do while a<>b
if a>b
a=a-b
else
if a<b
b=b-a
endif
endif
enddo
return a

Se consideră tabela TRANZAC.DBF cu următoarea


Exemplu 2. structură: NUME C(20), FEL_TRANZ C(10) (se introduc
valori ‘depunere’ sau ‘restituire’ ), SUMA_TRANZ N(9).
Să se realizeze operaţii de depunere/restituire ştiind că, pentru restituiri,
în banca trebuie să existe de 10 ori suma cerută pentru restituire.

set talk off


clear
use tranzac
define window f from 10,10 to 40,100 title “TRANZATII”
activate window f
vsuma=0
vtranz=space(10)
vnume=space(20)
@20,10 say "Dati numele " get vnume
@22,10 say "Felul tranzactiei " get vtranz
@24,10 say "Dati suma " get vsuma picture "999999999"
read
do case
case vtranz="depunere"
do DEPUNERE
case vtranz="restituie"
do RETITUIRE
endcase
deactivate window f
use
procedure DEPUNERE
append blank
42
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
replace nume with vnume, fel_tranz with vtranz,
suma_tranz with vsuma
return
procedure RESTITUIRE
if vsuma*10>SUMA()
@20,20 say "suma nu poate fi restituita"
else
append blank
replace nume with vnume, fel_tranz with vtranz,
suma_tranz with vsuma
endif
return
function SUMA
sum(suma_tranz) to x for fel_tranz="depunere"
sum(suma_tranz) to y for fel_tranz="restituire"
return x-y

C. Probleme propuse spre rezolvare:

Problema 1 Se consideră tabela HOTEL.DBF cu următoarea


structură: NRCAMERA N(2), PRIMAZI D(8), NR_ZILE
N(2), CATEGORIE N(1), LIBER L(1). Informaţiile prezente în această
tabelă sunt: NRCAMERA – numărul camerei, PRIMAZI – prima zi de
închiriere, NRZILE – numărul de zile în care va fi camera închiriată,
CATEGORIE – categoria camerei, LIBER – câmp care arată dacă camera
este sau nu liberă. Camerele pot fi de trei categorii: 1,2 sau 3. Să se
afişeze, pentru un turist care a venit, toate camerele libere
corespunzătoare fiecărei categorii, iar în cazul în care nu există să se
spună pe ce dată se eliberează prima cameră.

Problema 2 Evidenţa elevilor unui liceu este ţinută în tabela


ELEV.DBF care are următoarea structură: NUME
C(20), CLASA C(5), MED_SEM1 N(5,2), MED_SEM2 N(5,2). Să se scrie
câte un subprogram pentru următoarele cerinţe:
1. afişarea elevulor premianţi pentru o anumită clasă
2. afişarea elevilor corigenţi pentru o anumită clasă

43
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Lucrarea 8

Meniuri definite de către utilizator

Exemplu 1. Să se construiască pe ecran un meniu care să


respecte următoarele cerinţe:

1. să apară un text explicativ cu denumirea FISIERELE pe linia 1,


coloana 2.
2. să apară un meniu orizontal, din care să putem selecta
următoarele tabele: PRODUSE.DBF. BENEF.DBF respectiv
CONTRAC.DBF, pe linia 4.
3. un text explicativ cu denumirea FEREASTRA DE DEFILARE pe linia
5.
4. o fereastră, de la linia 6, coloana 50 la linia 16, coloana 79 pe
videoinvers, în care se va răsfoi fişierul selectat în meniul orizontal
de mai sus.
5. un meniu vertical între linia 17, coloana 10 şi linia 23, coloana 40
pentru selectarea operaţiilor de actualizare (procedurile respective
vor fi vide).

Rezolvare

m2='D'
set status off
set talk off
do while m2 $ 'Dd'
clear
m1=0
&& meniu orizontal
@1,2 say "FISIERELE: "
DEFINE MENU men1 BAR AT LINE 4
DEFINE PAD pad1 OF men1 PROMPT "1 - produse"
DEFINE PAD pad2 OF men1 PROMPT "2 - beneficiari"
DEFINE PAD pad3 OF men1 PROMPT "3 - contracte"
DEFINE PAD pad4 OF men1 PROMPT "4 - iesire"

44
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
ON SELECTION MENU men1 DO select_meniu

ACTIVATE MENU men1


DEACTIVATE MENU men1
SHOW MENU men1

&& fereastra de defilare


@5,50 say "FEREASTRA DE DEFILARE" color /i
define window f1 from 6,50 to 16,79 color /i
activate window f1
if m1=0
browse
endif
deactivate window f1
show window f1

&& meniu vertical


DEFINE POPUP pop1 FROM 17,10 TO 23,40
DEFINE BAR 1 OF pop1 PROMPT "1 - Adăugare"
DEFINE BAR 2 OF pop1 PROMPT "2 - Modificare"
DEFINE BAR 3 OF pop1 PROMPT "3 - Stergere"
DEFINE BAR 4 OF pop1 PROMPT "4 - Iesire"
ON SELECTION POPUP pop1 DO select_popup
ACTIVATE POPUP pop1
SHOW POPUP pop1
@24,2 say "Reluati? (d/n) " get m2
read
enddo

close all
deactivate menu men1
deactivate popup pop1
deactivate window f1

procedure select_meniu
use
do case
case PAD()="pad1"
USE PRODUSE
case PAD()="pad2"
USE BENEF
case PAD()="pad3"
45
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
USE CONTRAC
case PAD()="pad4"
m1=1
endcase
return

procedure select_popup
do case
case BAR() = 1
do adaug
case BAR() = 2
do modif
case BAR() = 3
do sterg
case BAR() = 4
DEACTIVATE POPUP pop1
endcase
return

procedure adaug
procedure modif
procedure sterg

return

Exemplu 2. Să se construiască meniul următor:

2,5

Raport1 Raport2

Raport3 Raport4

set talk off


clear
m=0
do while m=0
clear
@2,5 to 9,23
@3,6 to 5,22
46
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
@6,6 to 8,22
@4,14 say "|"
@7,14 say "|"
@4,7 PROMPT "Raport1"
@4,15 PROMPT "Raport2"
@7,7 PROMPT "Raport3"
@7,15 PROMPT "Raport4"
MENU TO m1
DO CASE
CASE m1=1
CASE m1=2
CASE m1=3
CASE m1=4
m=1
ENDCASE
enddo

Exemplu 2. Să se construiască meniul următor:

MENIU PRINCIPAL DESERT

Hamburger Ketchup Savarina

Mustar Inghetata

Maioneza Papanasi

Pizza Italiana

Masline

Siciliana

pepperoni

define window f1 from 10,0 to 13,45


define menu meniu
define pad pad1 of meniu prompt "\<MENIU PRINCIPAL" key
alt+m
define pad pad2 of meniu prompt "\<DESERT" key alt+d
47
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
on pad pad1 of meniu activate popup meniu_princ
on pad pad2 of meniu activate popup desert

define popup meniu_princ margin message 'avem burger şi


pizza'
define bar 1 of meniu_princ prompt "\<Hamburger"
define bar 2 of meniu_princ prompt "\<Pizza"
on bar 1 of meniu_princ activate popup burger
on bar 2 of meniu_princ activate popup pizza

define popup burger


define bar 1 of burger prompt "\<Ketchup"
define bar 2 of burger prompt "\<Mustar"
define bar 3 of burger prompt "M\<aioneza"

define popup pizza margin message "Ce fel de pizza doriti?"


define bar 1 of pizza prompt "\<Italiana"
define bar 2 of pizza prompt "\<Masline"
define bar 3 of pizza prompt "\<Siciliana"
define bar 4 of pizza prompt "\<Pepperoni"

define popup desert margin message "Lista se deserturi"


define bar 1 of desert prompt "\<Savarina"
define bar 2 of desert prompt "\<Inghetata"
define bar 3 of desert prompt "\<Papanasi"

on selection popup all do alegere

activate menu meniu

procedure alegere
activate window f1
clear
do case
case popup()="burger"
@0,0 say "Comanda: "+popup()
@1,0 say "S-a comandat un burger cu
"+lower(prompt())
case popup()="pizza"
@0,0 say "Comanda: "+popup()
@1,0 say "S-a comandat pizza cu
"+lower(prompt())
48
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
case popup()="masline"
@0,0 say "Comanda: "+popup()
@1,0 say "S-a comandat pizza cu
"+lower(prompt()) + "masline"
case popup()="desert"
@0,0 say "Comanda: "+popup()
@1,0 say "S-a comandat
"+lower(prompt())
endcase
wait window
deactivate window f1
return

C. Probleme propuse spre rezolvare:

Problema 1
Să se construiască meniul următor:

1,2

lista1

lista2
lista3

Problema 2 Să se construaiscă meniul următor:

20,20
adăugare stergere

modificare iesire

49
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Problema 3 Să se construiască sistemul de meniuri după


modelul alăturat:

1. meniul orizontal principal, pe linia 12; acesta va rămâne tot timpul


pe ecran
2. la apelul opţiunii Actualizare apare pe ecran submeniul vertical
începând cu linia 16; în acest submeniu apelul unei opţiuni se va
face prin tastarea literei subliniate
3. la apelul opţiunii Help apare pe ecran o fereastră (între punctele
20,50 şi 30,75) în care se va afişa textul “Opţiunea nu este activă”.

Consultare Actualizare Help Terminare

Adăugare
20,50
Modificare
Optiunea nu
Stergere este activa

Iesire

30,75

50
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Lucrarea 9

Limbajul SQL

Considerăm o tabelă cu denumirea


Exemplu ANGAJATI.DBF şi una cu denumirea SECTII.DBF care
conţin informaţii despre angajaţii unei firme şi
departamentele şi secţiile firmei respective.
 Structura tabelei ANGAJATI.DBF este următoarea MARCA
N(4), NUME C(20), PRENUME C(25), FUNCTIE C(10), SECTIA
N(2), SALARIU N(10), NR_DEPT N(2).

Aplicaţia va conţine un meniu cu trei submeniuri :

1. Submeniul Actualizări

2. Submeniul Interogări

3. Submeniul Ieşire

51
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Opţiunea Adăugari

Opţiunea Modificări

Opţiunea Ştergeri

52
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Opţiunea Interogare1

Opţiunea Interogare2

53
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Opţiunea Interogare3

Opţiunea Interogare4

54
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Opţiunea Interogare5

Opţiunea Interogare6

55
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Opţiunea Interogare7

Opţiunea Interogare8

56
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Codul sursă al aplicaţiei este :

SET TALK OFF


use angajati.dbf
CLEAR
&& definim meniul orizontal principal
DEFINE MENU EXEMPLU
DEFINE PAD P1 OF EXEMPLU PROMPT '\<Actualizari' AT
2,2
DEFINE PAD P2 OF EXEMPLU PROMPT '\<Interogari' AT
2,36
DEFINE PAD P3 OF EXEMPLU PROMPT '\<Iesire program'
AT 2,55

&& definim meniurile verticale cu optiunile fiecaruia in parte


DEFINE POPUP act
DEFINE BAR 1 OF act PROMPT '\<Adăugari'
DEFINE BAR 2 OF act PROMPT '\<Modificari'
DEFINE BAR 3 OF act PROMPT '\<Stergeri'
DEFINE POPUP interog
DEFINE BAR 1 OF interog PROMPT '\<interogare_1'
DEFINE BAR 2 OF interog PROMPT '\<interogare_2'
DEFINE BAR 3 OF interog PROMPT '\<interogare_3'
DEFINE BAR 4 OF interog PROMPT '\<interogare_4'
DEFINE BAR 5 OF interog PROMPT '\<interogare_5'
DEFINE BAR 6 OF interog PROMPT '\<interogare_6'

DEFINE BAR 7 OF interog PROMPT '\<interogare_7'


DEFINE BAR 8 OF interog PROMPT '\<interogare_8'

DEFINE POPUP iesire


DEFINE BAR 1 OF iesire PROMPT '\<Iesire FoxPro'
DEFINE BAR 2 OF iesire PROMPT '\=============='
DEFINE BAR 3 OF iesire PROMPT '\<Iesire Dos '

&& pentru fiecare optiune a meniului orizontal EXEMPLU


activam meniul
&& vertical corespunzator
ON PAD P1 OF EXEMPLU ACTIVATE POPUP act
ON PAD P2 OF EXEMPLU ACTIVATE POPUP interog
ON PAD P3 OF EXEMPLU ACTIVATE POPUP iesire
57
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

&& pentru fiecare meniu vertical asociem o comanda sau un


program
&&care se va executa la selectarea meniului respectiv
ON SELECTION POPUP act DO Pact
ON SELECTION POPUP interog DO Pinterog
ON SELECTION POPUP iesire DO Piesire

&& activam meniul orizontal


ACTIVATE MENU EXEMPLU

&& pentru fiecare optiune a unui meniu vertical asociem o


comanda
&& FOXPRO, folosind functia BAR() - care intoarce numarul
optiunii
&& curente din meniul vertical respectiv

PROCEDURE Pact
DO CASE
CASE BAR()=1
DO adaug
CASE BAR()=2
DO modif
CASE BAR()=3
DO sterg
ENDCASE
RETURN

PROCEDURE Pinterog
DO CASE
CASE BAR()=1
&& interogare salariu intre 1000000 şi 2000000
SELECT nume, sectia, salariu
FROM angajati
WHERE salariu BETWEEN 1000000 AND 2000000
CASE BAR()=2
&& interogare
use
use sectii
SELECT sectia, n_sectie
FROM sectii ORDER BY nr_dept
use
58
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
CASE BAR()=3
&& interogare
use angajati
SELECT * FROM angajati
WHERE nr_dept IN (1,2) ORDER BY nume
CASE BAR()=4
&& interogare
SELECT nume, salariu
FROM angajati
WHERE functie = 'inginer' AND nr_dept = 2
CASE BAR()=5
&& interogare
SELECT nume, salariu
FROM angajati
WHERE nume LIKE '%POP%' OR nume LIKE '%ION%'
CASE BAR()=6
&& Afisati lista angajatilor şi salariile marite cu 15%
SELECT nr_dept, nume, round(salariu*1.15,2) sal_nou
FROM angajati
CASE BAR()=7
&& Gasiti salariul minim, salariul maxim şi salariul mediu al
tuturor angajatilor
SELECT MAX(salariu), MIN(salariu), AVG(salariu)
FROM angajati
CASE BAR()=8
&& Afisati salariul mediu pentru fiecare tip de functie
SELECT functie, AVG(salariu) AVERAGE
FROM angajati
GROUP BY functie
ENDCASE
RETURN

PROCEDURE Piesire
DO CASE
CASE BAR()=1
CLEAR
DEACTIVATE MENU
CANCEL
CASE BAR()=3
QUIT
ENDCASE
RETURN
59
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

&& -------------------------------------
procedure adaug
&& adăugarea a mai multor înregistrări noi
set status off
clear
&& indexam tabela dupa câmpul MARCA ca sa putem accesa
rapid fiecare înregistrare
index on marca tag marca
vmarca=0
vnume=space(10)
vpren=space(10)
vfunc=space(10)
vsal=0
vsect=0
vdept=0
optiune="D"
@2,2 say "Program de adăugare"
do while optiune="D"
&& se citeste o înregistrare care eventual va fi adăugata
@5,25 say "dati marca care va fi adăugata " get vmarca
pict "9999"
read
seek vmarca
if found()
wait "înregistrarea cu aceasta marca deja exista"
else
@10,25 say "dati numele persoanei " get vnume
@11,25 say "dati prenumele persoanei " get vpren
@12,25 say "dati functia " get vfunc
@13,25 say "dati salariu " get vsal
@14,25 say "dati sectia " get vsect
@15,25 say "dati numarul departamentului " get vdept
read
append blank
replace marca with vmarca
replace nume with vnume
replace prenume with vpren
replace functie with vfunc
replace salariu with vsal
replace sectia with vsect
replace nr_dept with vdept
60
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
@17,25 say "Mai doriti adăugare? [D/N] " get optiune
read
if optiune="N"
cancel
endif
endif
clear
enddo
return
&& -------------------------------------
procedure modif
browse
return
&& -------------------------------------
procedure sterg
&& stergerea unei înregistrări
set status off
clear
&& indexam tabela dupa câmpul MARCA ca sa putem accesa
&& rapid fiecare înregistrare
index on marca tag marca
vmarca=0
optiune="D"
@2,2 say "Program de stergere"
do while optiune="D"
&& se citeste o înregistrare care eventual va fi stearsa
@5,25 say "dati marca care va fi stearsa " get vmarca pict
"9999"
read
seek vmarca
if found()
delete
pack
wait "înregistrarea a fost stearsa!"
else
wait "înregistrarea nu exista in tabela!"
@27,25 say "Mai doriti stergere? [D/N] " get optiune
read
if optiune="N"
cancel
endif
endif enddo return
61
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Lucrarea 10

Probleme rezolvate şi probleme propuse

Exemplu 1 Să se încarce şi să se valideze informaţiile, în


tabela AUTO.DBF care are următoarea structură:
NRAUTO C(6,), MARCA C(15), CAPCIL N(4). Criteriile de
validare sunt: 600<=CAPCIL<=2400, NRAUTO să înceapă cu “G”.
Macheta de încărcare a datelor se construieşte începând de la
coordonatele 3,3 şi are forma următoare:

==========MACHETA==========
* NRAUTO:
* MARCA AUTO:
* CAPACITATE CILINDRU:
==========================
REZOLVARE :

SET TALK OFF


CLEAR
USE AUTO
optiune=’d’
INDEX ON NRAUTO TO AUTO1
DO WHILE LOWER(optiune)=’d’
clear
vnr=replicate(6,’ ‘)
vmarca=replicate(15,’ ‘)
vcap=0
@3,3 say “========== MACHETA ============”
@4,3 say “ * NRAUTO:” get vnr valid substr(vnr,1,1)=’G’
message ‘prima litera G’
@5,4 say “ *MARCA AUTO:” get vmarca
@6,5 say “ *CAPACITATE CILINDRU:” get vcap picture
‘999999’ range 600,2400 message ‘intre 600 şi 2400’
@7,65 say “=”+replicate(25,’=’)

62
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
read
seek vnr
if found()
wait “numar auto existent deja!!!!!!”
else
append blank
replace nrauto with vnr, marca with vmarca, capcil
with vcap
endif
@20,2 say “Continuati incarcarea? (d/n)” get optiune
read
enddo
close all

Exemplu 2 Să se realizeze un program care să simuleze o agendă


electronică de telefoane. Se va folosi o tabelă numită
AGENDA.DBF care să conţină următoarele câmpuri:
NUME C(20), PRENUME C(20), ADRESA C(40), NRTEL C(11), DATA_NAS
D(8), ORAS C(20).
În această aplicaţie se vor construi următoarele meniuri :
1. Un meniu principal de tip popup care să conţină opţiunile :
ACTUALIZARI, MODIFICARI, CAUTARI şi EXIT.
2. La alegerea opţiunii CAUTARII se deschide un al doilea meniu de
tip popup cu opţiunile NUME, PRENUME, ADRESA, DATA NASTERII
şi Nr. TELEFON, semnificând criteriile de căutare a persoanelor din
agenda dată.

63
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

3. La alegerea opţiunii EXIT se deschide un al treilea meniu popup cu


opţiunile: PARASIREA FOXPRO-ULUI şi PARASIREA PROGRAMULUI,
semnificând modalităţile de închidere a aplicaţiei date.

REZOLVARE :

define window f1 from 1,1 to 50,120 title 'PROGRAM' double


shadow
activate window f1
clear
text

*********************************************************
* *
* AGENDA DE TELEFON *
* PROGRAMUL SIMULEAZA O AGENDA ELECTRONICA DE TELEFOANE *
* *
************************************************

APASATI O TASTA PENTRU CONTINUARE!

2007
endtext
wait' '
deactivate window f1
64
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

set talk off


close all
set printer off
clear
defi popup meniu_vertical from 0,65
defi bar 1 of de prompt " ACTUALIZARI "
defi bar 2 of de prompt " MODIFICARI "
defi bar 3 of de prompt " CAUTARI "
defi bar 4 of de prompt " EXIT "
ON SELECTION popup meniu_vertical do proc_meniu
activate popup de

procedure proc_meniu
do case
case bar()=1
do p_actu
case bar()=2
do p_modi
case bar()=3
do p_caut
case bar()=4
do p_exit
endcase
retu

&&=====================================
proc p_actu
CLEAR
use agenda
@ 1,1 to 11,52 double
store " " to a_nume, a_prenume,
a_adresa, a_nr_tel, a_data, A_ORAS
@ 3,2 SAY " NUME " get a_nume picture "!!!!!!!!!!!!!!!!!!!!"
@ 4,2 say " PRENUME " get a_prenume picture "!!!!!!!!!!!!!!!!!!!!"
@ 5,2 say " ADRESA " get a_adresa picture
"STR.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
@ 6,2 say " Nr TELEFON " get a_nr_tel picture "999/9999999"
@ 7,2 say " DATA NASTERII " get a_data picture "99/99/9999"
@ 8,2 SAY " ORASUL " GET A_ORAS PICTURE "!!!!!!!!!!!!!!!!!!!!"
read
@ 10,2 say " DORITI SALVAREA DATELOR PE DISC "
65
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
define popup act from 7,35
defi bar 1 of act prompt " YES "
defi bar 2 of act prompt " NO "
on selec popup act do act
acti popup act
retu

&&=====================================
procedure act
use agenda
do case
case bar()=1
n=reccount()
a_datan=ctod(a_data)
if a_datan > date() .or. val(left (a_data,2)) > 31 .or.
val(substr(a_data,4,2)) > 12
@ 10,2 say " IMPOSIBIL "
wait ""
clear
deact popup
endif
i=1
do while i<=n
if a_nume=nume .and. a_prenume = prenume .and.
a_datan = data_nas
@ 10,2 say " ACEASTA DATA MAI EXISTA IN ACESTA BAZA
DE DATE "
wait ""
clear
deacti popup
endif
go i
i=i+1
enddo
go bottom
append blank
replace nume with a_nume
replace prenume with a_prenume
replace adresa with a_adresa
replace nrtel with a_nr_tel
replace data_nas with a_datan
REplace oras with a_oras
66
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
do sort
deac popup
case bar()=2
clear
deacti popup
endcase
return

&&=====================================
proc p_modi
USE AGenda
browse
do sort
return

&&=====================================
proc p_caut
clear
defi popup caut from 0,0
defi bar 1 of caut prompt " NUME "
DEfi bar 2 of caut prompt " PRENUME "
defi bar 3 of caut prompt " ADRESA "
defi bar 4 of caut prompt " DATA NASTERII "
defi bar 5 of caut prompt " Nr. TELEFON "
on selec popup caut do caut1
activate popup caut
retur

&&=====================================
proc caut1
do case
case bar()=1
do nume
case bar()=2
do prenume
case bar()=3
do adresa
case bar()=4
do data_nase
case bar()=5
do nr
endcase
67
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
return

&&=====================================
proc nume
use agenda
clear
@ 10,0 say " CALCULATORUL CAUTA TOATE PERSOANELE CU
NUMELE INTRODUS DE D-VOASTRA "
NUM1=" "
?
?
@ 12,2 SAY " INTRODUCETI NUMELE " GET num1 PICTURE
"!!!!!!!!!!!!!!!!!!!!"
READ
n=reccount()
clear
i=0
wqw=1
z=0
q=0
k=0
define window ert from 10,10 to 32,100 panel color g+/bg
activate wind ert
do while i<n
i=i+1
go i
if k/6=int(k/6) .AND. K<>0
wait "APASATI O TASTA PENTRU PAGINA URMATOARE DE
INREGISTRARI"
clear
k=0
Q=0
endif
if nume=num1
do scc
endif
enddo
wait "APASATI O TASTA PENTRU A CONTINUA"
CLEAR WIND
DEACT WIND ERT
clear
if z=0
68
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
@ 11,1 say " NU S-A GASIT NICI O PERSOANA CU NUMELE
INTRODUS DE D-VOASTRA"
wait ""
ENDIF
clear
deactivate popup
return

&&=====================================
proc sort
clear
use agenda
!del aged.dbf
sort to aged on nume /a,prenume /a
use
!del agenda.dbf
use aged
sort to agenda on nume /a ,prenume /a
close all
retu

&&=====================================
PROC scc
@ 0,30 say " GASITI "
@ 2+q,3 get nume
@ 3+q,3 get prenume
@ 2+q,30 get adresa
@ 3+q,30 get data_nas
@ 3+q,50 get nrtel
@ 2+q,0 get wqw picture "99"
@ 4+q,30 get oras picture "!!!!!!!!!!!!!!!!!!!!"
k=k+1
q=q+3
wqw=wqw+1
z=z+1
retu

&&=====================================
proc prenume
use agenda
clear

69
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
@ 10,0 say " CALCULATORUL CAUTA TOATE PERSOANELE CU
PRENUMELE INTRODUS DE D-VOASTRA"
pren1=" "
@ 12,2 say " INTRODUCETI PRENUMELE " GET PREN1 picture
"!!!!!!!!!!!!!!!!!!!!"
read
n=reccount()
clear
i=0
q=0
k=0
wqw=1
z=0
define window zxc from 10,10 to 32,100 panel color g+/bg
acti wind zxc
go top
do while i<n
i=i+1
goto i
if k/6=int(k/6) .and. k<>0
wait "APASATI O TASTA PENTRU PAGINA URMATOARE"
CLEAR
k=0
Q=0
endif
if pren1=prenume
do scc
endif
enddo
wait "APASA O TASTA PENTRU A CONTINUA "
CLEAR WIND
deactivate wind zxc
clear
if z=0
@ 11,1 say "NU S-A GASIT NICI O PERSOANA CU PRENUMELE
INTRODUS DE D-VOASTRA"
wait ""
ENDIF
clear
deact popup
retu

70
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

&&=====================================
proc adresa
use agenda
clear
@ 10,0 say " CALCULATORUL CAUTA PERSOANELE CARE
LOCUIESC PE STRADA INTRODUSA DE D-VOASTRA "
ADRESA1=" "
@ 12,2 say " INTRODUCETI NUMELE STRAZII " GET ADRESA1
PICTURE "!!!!!!!!!!!!!!!!!!!!"
READ
n=reccount()
qu=" "
ss=" "
clear
ww=1
do while ww<=20
if substr (adresa1,ww,1)=" "
ss=substr(adresa1,1,ww-1)
exit
endif
ww=ww+1
enddo
i=0
q=0
k=0
wqw=1
z=0
define window mnb from 10,10 to 32,100 panel color g+/bg
acti wind mnb
do while i<n
i=i+1
go i
if k/5=int(k/5) .and. k<>0
wait " APASATI O TASTA PENTRU PAGINA URMATOARE "
CLEAR
k=0
Q=0
endif
qq=5
ass=upper(adresa)
do while qq<=20
71
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
if substr(ass,qq,1)=" "
qu=substr(ass,5,qq-5)
exit
endif
qq=qq+1
enddo
if ss=qu .and. len(qu)=len(ss)
do scc
endif
enddo
wait " APASA O TASTA PENTRU A CONTINUA "
CLEAR WIND
deac wind mnb
clear
if z=0
@ 11,1 say " NU S-A GASIT NICI O PERSOANA CU NUMELE
STRAZII INTRODUS DE D-VOASTRA"
WAIT ""
ENDIF
clear
deact popup
retu

&&=====================================
proc data_nase
use agenda
clear
@ 10,0 say " CALCULATORUL VA CAUTA TOATE PERSOANELE CU
DATA DE NASTERE INTRODUSA DE D-VOASTRA"
DATA=" "
@ 12,2 SAY "INTRODUCETI DATA DE NASTERE "GET DATA
PICTURE "99/99/9999"
READ
N=reccount()
clear
i=0
q=0
k=0
wqw=1
z=0
define window asd from 10,10 to 32,100 panel color g+/bg
acti wind asd
72
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
do while i<n
i=i+1
go i
if k/5=int(k/5) .and. k<>0
wait " APASATI O TASTA PENTRU PAGINA URMATOARE "
CLEAR
K=0
endif
qaz=DTOC(data_NAS)
if data=QAZ
do scc
endif
enddo
wait " APASA O TASTA PENTRU A CONTINUA "
CLEAR
DEACT WIND ASD
CLEAR
IF Z=0
@ 11,1 SAY " NU S-A GASIT NICI O PERSOANA CU DATA DE
NASTERE INTRODUSA DE D-VOASTRA"
WAIT ""
CLEAR
ENDIF
DEACT POPUP
RETU

&&=====================================
PROC NR
use agenda
clear
@ 10,0 say " CALCULATORUL CAUTA TOATE PERSOANELE CARE
AU NR. DE TELEFON INTRODUS DE D-VOASTRA"
NR=" "
@ 12,2 SAY " INTRODUCETI NUMARUL " GET NR PICTURE
"999/9999999"
READ
N=RECCOUNT()
CLEAR
I=0
Q=0
K=0
WQW=1
73
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
Z=0
define window wsx from 10,10 to 32,100 panel color g+/bg
ACTI WIND WSX
DO WHILE I<N
I=I+1
GO I
IF K/5=INT(K/5) .AND. K<>0
WAIT " APASA O TASTA PENTRU PAGINA URMATOARE "
CLEAR
K=0
ENDIF
IF NR=NRTEL
DO SCC
ENDIF
ENDDO
WAIT " APASA O TASTA PENTRU A CONTINUA "
CLEAR
DEACT WIND WSX
CLEAR
IF Z=0
@ 11,1 SAY " NU S-A GASIT NICI O PERSOANA CU NR DE
TELEFON INTRODUS DE D-VOASTRA"
WAIT ""
CLEAR
ENDIF
DEACT POPUP
RETU

&&=====================================
PROC P_EXIT
CLEAR
CLOSE ALL
DEFI POPUP Y FROM 10,50
DEFI BAR 1 OF Y PROMPT " PARASIREA FOXPRO-ULUI "
DEFI BAR 2 OF Y PROMPT " PARASIREA PROGRAMULUI "
ON SELECT POPUP Y DO EW
ACTI POPUP Y
DEACT POPUP
RETU

74
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

&&=====================================
PROC EW
DO CASE
CASE BAR()=1
QUIT
CASE BAR()=2
DEACT POPUP
ENDCASE
RETURN

C. Probleme propuse spre rezolvare

Problema 1 Se consideră o tabelă cu numele GEOGRAFIE.DBF


care să reţină informaţii cu caracter geografic şi care
să aibă următoarea structură: CONTINENT C(15), TARA C(15),
CAPITALA C(10), SUPRAFATA N(10), NR_LOC N(10).
Se cere să se calculeze următoarele:

1. Care este capitala unei anumite ţări, al cărui nume se citeşte de la


tastatură;
2. În ce continent se află ţările cu cel mai mare şi cel mai mic număr
de locuitori ?
3. Să se afle numele ţării, continentului, capitalei ţării cu cea mai
mare suprafaţă.

Fie tabela AGENDA.DBF cu următoarea


Problema 2 structură: NUME C(20), PRENUME C(20), ADRESA
C(30), TELEFON N(10).

Se cer următoarele :
1. Să se afişeze numărul de persoane care au acelaşi nume cu cel
precizat de utilizător de la tastatură;
2. Să se afişeze numele şi prenumele persoanei al cărui număr de
telefon este citit de utilizător de la tastatură;
3. Să se ordoneze tabela după câmpurile nume şi prenume.

75
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Lucrarea 11

Probleme recapitulative

Problema 1 Se considera tabela FILME.DBF care are structura:


NUME_FILM C(35), GEN C(15), TARA C(20), AN N(4),
in care se afla evidenta principalelor filme produse in lume.
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze care sunt filmele produse in Franta, in anul 1996;
3. Sa se afiseze cate filme de comedie au fost produse in Romania dupa
anul 1989;
4. Sa se afiseze toate filmele, pe genuri.

Problema 2 O agenţie de turism deţine hoteluri în mai multe


staţiuni. Presupunem că agenţia utilizează următoarea
tabela HOTEL.DBF, care are structura : STATIUNE C(15), HOTEL
C(12), COD_HOTEL N(3), CATEGORIE C(5), PRET N(8), NUME C(20),
BULETIN C(8), PENSIUNE L(1), TIP_CAMERA C(2), ZILE N(2).
1. Sa se introduca minim 10 inregistrari in tabela;
2. Să se afişeze hotelurile dintr-o staţiune cu o anumită categorie (cod
hotel şi preţuri) ;
3. Să se afişeze rezervarea făcută de un client şi calculul notei de plată.

Problema 3 Se considera tabela LOCATARI.DBF care are


structura: Nume C(20), Prenume C(15), Nr_apart
N(2), Nr_pers N(2), Suprafata N(6,2).
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se mute o persoana intr-un apartament care se considera
neocupat;
3. Sa se mute o persoana dintr-un apartament.

Problema 4 Se considera tabela STUDENTI.DBF care are


structura: Nume C(20), Cod_curs C(3), Denum_curs
C(10), Nota N(2).
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze denumirile cursurilor la care a fost inscris un student si
notele obtinute de el la examene; daca unui curs nu ii corespunde nici o
nota se va afisa neprezentat. Numele studentului va fi citit.

76
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
3. Sa se inregistreze un student nou; se citesc numele studentului si
denumirile cursurilor.

Problema 5 Se considera tabela CARTI.DBF care are structura:


Cota N(6), Autor C(15), Titlu C(20), Editura C(10),
Imprumutata L(1), An_apar D(8).
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se adauge o noua carte in tabela; valoarea campului Cota se
stabileste prin program (urmatoarea cota);
3. Sa se afiseze toate cartile de la o editura al carei nume il citim de la
tastatura.

Problema 6 Se considera tabela PRODUSE.DBF care are structura:


Codp N(5), Denp C(15), Cantitate N(7), Pret N(10),
Valoare N(20).
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se completeze campul Valoare (care initial era vid) cu expresia
corespunzatoare, pentru fiecare inregistrare din tabela;
3. Dandu-se un pret de la tastatura, sa se afle denumirea produselor
care au acel pret;
4. Sa se afle cea mai mica si cea mare valoare a unui produs aflat in
tabela.

Problema 7 Se considera tabela REVISTE.DBF care are structura:


Nume_r C(25), Cod_r N(3), Pret N(7), Nr_luni N(2),
Valoare N(20).
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se completeze campul Valoare (care initial era vid) cu expresia
corespunzatoare, pentru fiecare inregistrare din tabela;
3. Sa se afiseze lista revistelor care au codul cuprins intre 130 si 150,
dupa numarul de aparitii lunare (se presupune ca exista in tabela astfel
de inregistrari);
4. Sa se adauge o noua revista in tabela.

Problema 8 Se considera tabela OLIMPIADA.DBF care are


structura: Nume C(25), Judet C(10), Scoala C(20),
Clasa C(4), Punctaj1 N(3), Punctaj2 N(3), Total N(6) in care se
gestioneaza rezultatele obtinute de elevi la faza nationala a unei
olimpiade. Campurile Punctaj1 si Punctaj2 reprezinta punctele obtinute
de elevi la cele doua probe ale olimpiadei si nu depasesc 100 de puncte
fiecare.
77
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze in ordine alfabetica, pe clase, toti elevii participanti
(nume, judet);
3. Sa se completeze campul Total (care intial era vid) cu suma dintre
punctajele obtinute de fiecare elev in parte si sa se afiseze pe clase
clasamentul, in ordinea descrescatoare a punctajului total (nume,
puncte, judet).
4. Sa se modifice punctajele unui elev al carui nume este citit de la
tastatura.

Problema 9 Se considera tabela MEDICAMENTE.DBF care are


structura: Denumire C(25), Codm C(8), Um C(6), Pret
N(7), Cantitate N(5) in care se gestioneaza stocul de medicamente aflate
intr-o farmacie.
1. Sa se introduca minim 10 inregistrari in tabela;
2. Daca se primeste un nou medicament, atunci se actualizeaza stocul
existent; daca medicamentul nou sosit exista deja in farmacie, atunci se
va modifica doar cantitatea existenta; daca este un medicament nou
sosit care nu exista in farmacie, atunci se va crea o noua inregistrare cu
toate informatiile despre medicamentul respectiv;
3. Daca se vinde un medicament, atunci se verifica in prealabil daca mai
exista in stoc. In plus, se afiseaza toate medicamentele (denumire si
cantitate), aflate sub o valoare limita citita de la tastatura.

Problema 10 Se considera tabela PIESE.DBF care are structura:


Nume_c C(20), Nrauto C(10), Cod_p N(6), Nume_p
C(15), Pret N(6), Manopera N(6), Cost_rep N(7) in care se afla evidenta
pieselor si a reparatiilor de masini dintr-un service auto.
1. Sa se introduca minim 10 inregistrari in tabela;
2. Pentru fiecare client nou, se adauga o inregistrare in tabela care va
contine toate informatiile, mai putin costul reparatiei (campul Cost_rep) ;
Sa se determine costul reparatiei pentru fiecare client ;
3. Sa se calculeze totalul incasarilor obtinute in service.

Problema 11 Se considera tabela FURNIZORI.DBF care are


structura: Cod_f N(3), Nume_f C(20), Cod_m N(6),
Denumire_m C(15), Pret N(8), Cantitate N(6) in care se afla evidenta
materialelor aflate la anumiti furnizori.
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se determine furnizorul, pentru fiecare material, astfel incat sa fie
cel mai convenabil furnizor (daca exista cel putin doi furnizori pentru
fiecare material in parte);
78
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
3. Sa se stearga din tabela toti furnizorii care ofera un material al carei
denumire o citim de la tastatura.

Problema 12 Se considera tabela STUDENTI.DBF care are


structura: Cod N(4), Nume C(20), Prenume C(15),
Grupa C(4), Media N(5,2), Facultate C(15), in care se afla evidenta
studentilor dintr-o universitate. Tabela se creeaza fara a se introduce –
la inceput – nici o inregistrare.
1. Sa se introduca un numar dat de studenti, astfel incat codul sa fie
generat de program incepand cu valoarea 1;
2. Sa se afiseze – pe grupe – toti studentii in ordinea descrescatoare a
mediilor de admitere;
3. Sa se afle studentul (nume,grupa,media) cu cea mai mare medie
dintr-o facultate al carui nume il citim de la tastatura.

Problema 13 Se considera tabela PARINTI.DBF care are structura:


Cod_spital N(2), Den_spital C(20), Nume_copil
C(20), Pren_copil C(20), Data_n D(8), Nume_mama C(30), Nume_tata
C(30), in care se afla evidenta copiilor nascuti intr-un spital.
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze toti copii nascuti in luna x si anul y (citite de la tastatura)
astfel:
nume prenume copil nume prenume mama nume prenume tata
3. Sa se afiseze o situatie statistica cu numarul de copii nascuti pe o
perioada de timp data (interval de date), intr-un spital dat:
Denumire spital Numar copii

Consideram urmatoarea tabela GEOGRAFIE.DBF care


Problema 14
are urmatoarea structura: Continent C(15), Tara
C(10), Capitala C(12), Suprafata N(5), Nr_locuit N(11), in care se afla
evidenta tarilor pe continente (in campul Suprafata se considera ca
valorile sunt date in km2).
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze care este capitala si cati locuitori are o tara al carei
nume este citit de la tastatura;
3. Sa se afle in ce continent este tara cu cel mai mare numar de locuitori
si tara cu cel mai mic numar de locuitori;
4. Sa se afiseze numele, continentul si capitalele tarilor cu primele trei
cele mai mai mari suprafete.

79
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Consideram urmatoarea tabela MAGAZIN.DBF care


Problema 15
are urmatoarea structura: Produs C(15), Firma
C(20), Data_exp D(8), Pret1 N(8), Pret2 N(8),
Cantitat1 N(10), Cantitat2 N(10), Cumparator C(25) in care se afla
evidenta produselor dintr-un supermarket. Campul Pret1 are semnificatia
de pret de productie al produsului, iar campul Pret2 de pret de vanzare
al aceluiasi produs; campul Cantitat1 reprezinta cantitatea totala a unui
produs aflat in magazin, iar campul Cantitat2 reprezinta cantitatea
vanduta a aceluiasi produs. Campul Pret2 se completeaza prin program
ca fiind pretul de productie plus TVA (19% din pretul de productie).
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze pentru un anumit produs, firmele producatoare al acelui
produs si cantitatea ramasa nevandata din acel produs al carui nume de
citeste de la tastatura;
3. Sa se afiseze toate produsele care necesita o comanda urgenta la
producator (produse ce au cantitate nula sau mai mica decat un stoc
minim stabilit);
4. Sa se elimine din stoc produsele expirate, eliberandu-se stocul,
produsul ramanand in tabela.

Consideram urmatoarea tabela CURSURI.DBF care


Problema 16
are urmatoarea structura: Cod N(3), Profesor
C(25), Grad_did C(14), Denumire C(25), An N(1), Sectia C(14), in care
se afla evidenta cursurilor tinute de profesorii unei universitati.
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze toate cursurile tinute de un profesor al carui nume este
dat de tastatura;
3. Sa se afiseze toti profesorii care predau la universitatea data, pe ani
de studii;
4. Sa se adauge un nou profesor in tabela considerata.

Aplicatie: Sa se construiasca urmatorul meniu


Problema 17
orizontal care sa aiba anumite optiuni ca submeniuri
verticale:

80
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Problema 18 Se considera tabela TRANZAC.DBF cu urmatoarea


structura: NUME C(20), FEL_TRANZ C(10) (se
introduc valori depunere sau restituire), SUMA_TRANZ N(9). Sa se
realizeze operatii de depunere/restituire stiind ca, pentru restituiri, in
banca trebuie sa existe de 10 ori suma ceruta pentru restituire.

Problema 19 Fie tabela AGENDA.DBF cu urmatoarea structura:


NUME C(20), PRENUME C(20), ADRESA C(30),
TELEFON N(10). Se cer urmatoarele :
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze numarul de persoane care au acelasi nume cu cel
precizat de utilizator de la tastatura;
3. Sa se afise numele si prenumele persoanei al carui numar de telefon
este citit de utilizator de la tastatura;
4. Sa se ordoneze tabela dupa campurile nume si prenume si sa se
modifice numarul de telefon a unei persoane din tabela.

Problema 20
Sa se construiasca pe ecran meniul urmator:

a) Selectarea
meniului
principal,
optiunea Hamburger:

b) Selectarea
meniului
principal,
optiunea Pizza:

c) Selectarea
meniului
desert:

81
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Problema 21 Sa se creeze urmatorul meniu vertical:


Fiecare optiune va contine o
procedura care va executa cerinta respectiva, astfel: Optiunea
Adaugare va selecta o procedura care va adauga o noua
inregistrare in tabela, optiunea Afisare va afisa, intr-o
fereastra continutul tabelei. Tabela considerata se numeste
PRODUSE.DBF si are urmatoarea structura: Cod_p N(4), Denumire
C(20), Um C(4), Pret N(7), Cantitate N(5), Valoare N(18).

Problema 22 Sa se creeze urmatorul meniu vertical:


Fiecare optiune va contine o
procedura care va executa cerinta respectiva, astfel:
Optiunea Stergere va selecta o procedura care va sterge o
noua inregistrare in tabela, optiunea Afisare va afisa, intr-o
fereastra continutul tabelei. Tabela considerata se numeste
PRODUSE.DBF si are urmatoarea structura: Cod_p N(4), Denumire
C(20), Um C(4), Pret N(7), Cantitate N(5), Valoare N(18).

Problema 23 Sa se creeze urmatorul meniu vertical:


Fiecare optiune va contine o
procedura care va executa cerinta respectiva, astfel:
Optiunea Modificare va selecta o procedura care va
modifica o noua inregistrare in tabela, optiunea Afisare va
afisa, intr-o fereastra continutul tabelei. Tabela considerata
se numeste PRODUSE.DBF si are urmatoarea structura:
Cod_p N(4), Denumire C(20), Um C(4), Pret N(7), Cantitate N(5),
Valoare N(18).

Problema 24 Consideram urmatoarea tabela BANCA.DBF care


are urmatoarea structura: Cont N(12), Nume
C(25), Data_oper D(8), Suma N(11), Tip_oper C(11) in care se afla
evidenta clientilor dintr-o banca. Campul Data_oper semnifica data
efectuarii operatiei bancare, iar campul Tip_oper semnifica tipul operatiei
bancare (restituire sau depunere).
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze toate informatiile care contin in campul Tip_oper
informatia ‘depunere’;
3. Inaintea inregistrarii cu numarul 4, sa se adauge o noua inregistrare.

82
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Problema 25 Consideram urmatoarea tabela PERSOANE.DBF


care are urmatoarea structura: COD N(3), NUME
C(15), PRENUME C(15), ADRESA C(20), ORAS C(10),in care se afla
evidenta unor personae din diferite orase ale tarii
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se scrie un program cu ajutorul caruia sa se adauge o noua
persoana in baza de date. Adaugarea se va executa doar daca numele
persoanei nu exista deja, in cazul in care exista se va afisa un mesaj
"Persoana cu acest nume exista deja in baza de date".
3. Sa se afiseze toate persoanele din locatitatea ‘Targu-Jiu‘.

Problema 26 Consideram urmatoarea tabela


BACALAUREAT.DBF care are urmatoarea
structura: COD N(4), NUME C(25), CLASA C(4), MEDIA N(5,2), in care se
afla evidenta elevilor care participa la un examen de bacalaureat.
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze primii trei si ultimii trei elevi, in ordinea mediilor ;
3. Stiind ca un elev al carui nume se citeste de la tastatura, are media
gresita, sa se remedieze greseala;
4. Sa se stearga din tabela elevii care nu au promovat exemanul de
bacalaureat.

Problema 27 Consideram urmatoarea tabela FIRMA.DBF care


are urmatoarea structura: COD N(3), NUME
C(25), FUNCTIA C(20), SALARIU N(8), RETINERI N(7), in care se afla
evidenta angajatilor dintr-o firma.
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze ce retineri are o persoana al carei nume se citeste de la
tastatura;
3. Care este functia si numele persoanei care are cel mai mare salariu
din firma ?
4. Sa se afiseze care este salariul mediu din firma ? (se considera salariul
fara retineri).

Problema 28 Consideram urmatoarea tabela TELEVIZIUNE.DBF


care are urmatoarea structura: COD N(4),
EMISIUNE C(35), DURATA N(3), ORA_DIFUZ N(5,2), REALIZATOR C(25),
ZI_DIFUZ C(10) in care se afla evidenta emisiunilor dintr-o televiziune.
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze programul emisiunilor din ziua de ‘Duminica’ ;
3. Sa se adauge o inregistrare vida inaintea inregistrarii cu numarul 7;
83
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu
4. Sa se afiseze toate emisiunile care se difuzeaza dupa-amiaza (dupa
orele 12.00) in primele trei zile ale saptamanii (adica in zilele ‘Luni’,
‘Marti’ si ’Miercuri’).

Problema 29 Consideram urmatoarea tabela


BACALAUREAT.DBF care are urmatoarea
structura: COD N(4), NUME C(25), CLASA C(4), MEDIA N(5,2), in care se
afla evidenta elevilor care participa la un examen de bacalaureat.
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze toti elevii clasei 12A care au media mai mare decat 8.50;
3. Sa se afiseze numarul de elevi respinsi;
4. Sa se afiseze o situatie centralizata cu numarul de elevi de la fiecare
clasa care nu au promovat examenul de bacalaureat (media minima de
promovare fiind 6.00).

Problema 30 Consideram urmatoarele tabele: tabela


CAMPION.DBF care are urmatoarea structura:
ECHIPA1 C(12), ECHIPA2 C(12), DATA D(8), STADION C(15), in care se
afla evidenta meciurilor de fotbal dintr-un campionat si tabela
JUCATOR.DBF care are urmatoarea structura : NUME C(25), ECHIPA
C(12) si care contine evidenta jucatorilor care evolueaza in campionatul
respectiv.
1. Sa se introduca minim 10 inregistrari in tabela;
2. Sa se afiseze programul meciurlor din campionat;
3. Sa se precizeze care este componenta echipelor care joaca la o data
calendaristica citita de la tastatura, pe stadionul al carui nume la fel, se
citeste de la tastatura;
4. Sa se afiseze care sunt capitanii care joaca la o data calendaristica
citita de la tastatura, si care joaca pe un stadion al carui nume se citeste
tot de la tastatura (se presupune ca primul jucator trecut in tabela
JUCATOR la o echipa este capitanul).

84
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Bibliografie

1. I. Lungu, N. Musat, M. Nicolae, M. Velicanu, I. Teodor, A. Barta –


Sistemul Foxpro, prezentare si aplicatii, Editura All, Bucuresti,
1993.
2. M. Pantiru, I. Pantiru, I.I. Pantiru - Informatica, Baze de date.
Varianta Visual Foxpro, Editura L&S Infomat, Bucuresti, 2001.
3. M. Pantiru, I. Pantiru, I.I. Pantiru - Aplicatii cu baze de date in
Visual Foxpro. Culegere de probleme, Editura L&S Infomat,
Bucuresti, 2004.
4. I. Tamas, Gh. Popa, F. Berbec, M. Vrincianu - Sisteme de gestiune
a bazelor de date – Visual Foxpro, Editura Cison, Bucuresti, 2000.
5. I. Despi, G. Petrov, R. Reisz, A. Stepan - Teoria generală a bazelor
de date, Editura Mirton, Timişoara, 2000.
6. L.Ţâmbulea - Foxpro pentru programatori, Editura Promedia
Plus,Cluj-Napoca, 1995.
7. G. Dima, M. Dima – Visual Foxpro 7.0, Editura Teora, Bucuresti,
2002.
8. I. Despi, L. Luca - Baze de date orientate pe obiecte, Editura
Mirton, Timisoara, 1996.
9. M. Velicanu, I. Lungu, M. Muntean - Teste si probleme de
programare in Visula Foxpro si Oracle, Editura Petrion, Bucuresti,
1999.
10. M.A. Homorodean, Simona Petrescu - Limbajul de
programare Visual Foxpro 6.0, Editura Niculescu, Bucuresti, 2002.

85
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

11. C. Pribeanu – Baze de date si aplicatii, Editura Matrixrom,


Bucuresti, 2000.
12. I. Lungu, C. Bodea, G. Badescu, C. Ionita – Baze de date –
Organizare, proiectare si implementare, Editura All, Bucuresti,
1995.
13. Adrian Runceanu - Baze de date Visual Foxpro 6.0 - note de
curs (în curs de apariţie).

86
Baze de date – Visual Foxpro 6.0
Marian Popescu Adrian Runceanu

Cuprins

Lucrarea 1. Funcţiile SGBD-ului Visual Foxpro. Tipuri de fişiere 1


Visual Foxpro. Limitele SGBD-ului Visual Foxpro
Lucrarea 2. Actualizarea tabelelor prin comanda BROWSE. 12
Cautare şi pozitionare. Sortare şi duplicare(copiere).
Comenzi de actualizare
Lucrarea 3. Citirea informaţiilor de la tastatură şi memorarea lor în 19
variabile de memorie. Indexarea tabelelor, tipuri de
indecşi. Căutare şi poziţionare rapidă în tabele indexate
Lucrarea 4. Prelucrări statistice şi financiare 24
Lucrarea 5. Programare structurată (clasică) în Visual Foxpro 27
Lucrarea 6. Programare structurată (clasică) în Visual Foxpro – 32
operaţii de actualizare înregistrări în tabele
Lucrarea 7. Funcţii şi proceduri utilizator. Ferestre 40
Lucrarea 8. Meniuri definite de către utilizator 44
Lucrarea 9. Limbajul SQL 51
Lucrarea 10. Probleme rezolvate şi probleme propuse 62
Lucrarea 11. Probleme recapitulative 76
Bibliografie 85

87

View publication stats

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