Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Baze de date


Index » educatie » » informatica » Baze de date
» Lucrare de laborator - Proiectarea Bazelor de Date


Lucrare de laborator - Proiectarea Bazelor de Date


Universitatea Sibiu

Facultatea de Inginerie

Catedra Electrotehnica si Calculatoare

Lucrare de laborator la disciplina



Proiectarea Bazelor de Date

Tema lucrarii: Notiuni generale despre bazele de date.

Crearea fisierelor baza de date.

1. Notiuni teoretice

O baza de date este o colectie de date, de obicei foarte voluminoasa, precum si descrierea acestordate sia relatiilor

existente intre ele. Aceste date sint utilizate de sistemele de aplicatii dintr‑un anumit domeniu.

In general, o baza de date este alcatuita din mai multe fisiere de date. Aceste fisiere de date sint structurate sub forma

unei multimi de inregistrari sau articole.

Un articol este o parte din fisier, logic constituita, care reflecta obiectul informatiei. Articolele dintr‑un fisier de

date sint identice ca structura, ele fiind alcatuite din mai multe cimpuri.

Un cimp este un element component al unei inregistrari, fiind un element de descriere a articolului respectiv. Cimpul

descrie o anumita proprietate a articolului.

In fiecare cimp al unui articol se inscrie o valoare care va defini in final articolul.

Toate articolele din fisier trebuie sa contina aceleasi cimpuri, ca tip si lungime si identificate prin acelasi nume. Identitatea fiecarui articol este determinata de valorile atribuite cimpurilor constituente ale inregistrarii.

Este posibil ca pentru anumite inregistrari unele cimpuri sa nu contina nici o valoare sau ca mai multe inregistrari sa contina aceeasi valoare intr‑un cimp.

Pentru o mai buna intelegere a notiunilor prezentate pina acum sa consideram un posibil exemplu de baza de date:

‑ totalitatea studentilor din Facultatea de Inginerie poate fi constituita intr‑o baza de date;

‑ un fisier de date al bazei respective poate fi considerat cel constituit din studentii sectiei Calculatoare si Electrotehnica;

‑ presupunind ca pentru fiecare student ne intereseaza informatii de genul: nume, prenume, adresa, grupa, bursa vom institui cite un cimp pentru fiecare din aceste informatii.

In acest context, fiecare dintre dumneavoastra va constitui o inregistrare in baza de date respectiva.

De exemplu, articolul destinat studentului POPESCU ION va fi urmatorul:

NUME POPESCU <‑‑‑‑‑‑‑‑ cimp 1

PRENUME ION <‑‑‑‑‑‑‑‑ cimp 2

ADRESA N.TECLU NR 12 <‑‑‑‑‑‑‑‑ cimp 3

GRUPA 231/2 <‑‑‑‑‑‑‑‑ cimp 4

BURSA 67120 <‑‑‑‑‑‑‑‑ cimp 5

Se observa ca articolul este alcatuit din 5 cimpuri, fiecare continind o anumita valore, spre exemplu 'POPESCU' pentru cimpul 1 de NUME.

Un alt student se va regasi ca o noua inregistrare in baza de date.

De exemplu, un alt articol va fi destinat studentului IONESCU ION.

NUME IONESCU

PRENUME ION

ADRESA BANATULUI NR 7

GRUPA 232/1

BURSA 63200

Asupra acestor fisiere de date ce alcatuiesc baza de date se pot executa operatii de prelucrare variate.

Intr‑o prima faza este necesara crearea fisierului prin inregistrarea articolelor sale, carora in prealabil li s‑a stabilit structura.

O operatie deosebit de importanta este cea de actualizare care consta in:

‑ adaugarea de noi inregistrari in baza de date, inregistrari ce au aceeasi structura cu cele deja existente in baza de date;

‑ stergerea de inregistrari din baza de date, ce consta in inlaturarea logica sau chiar si fizica a unor inregistrari din fisierele de date;

‑ modificarea inregistrarilor, ce consta in atribuirea unor noi valori pentru unele cimpuri din inregistrare.

Alte operatii de prelucrare a fisierelor de date sint:

‑ exploatarea fisierelor, ce consta in extragerea datelor prin citirea nedistructiva a inregistrarilor;

‑ sortarea datelor din fisiere, ce consta in aranjarea inregistrarilor in ordine crescatoare sau descrescatoare a valorilor unor cimpuri;

‑ reorganizarea datelor, ce consta in rearanjarea inregistrarilor in ordinea corespunzatoare unui criteriu;

‑ fuziunea datelor, ce consta in comasarea ordonata a inregistrarilor a doua sau mai multe fisiere conform cu un criteriu comun de ordonare;

‑ divizarea datelor dintr‑un fisier, ce consta in posibilitatea de a crea noi fisiere de date ce vor contine doar o parte a inregistrarilor din fisierul de baza.

Toate aceste prelucrari precum si alte obligatii revin in sarcina sistemului de gestiune a bazei de date.

Sistemul de gestiune a bazelor de date (SGBD) este un set

de programe si proceduri specializate destinate prelucrarii complexe a datelor.

Unele din functiile SGBD‑urilor sint:

‑ descrierea datelor, folosind limbaje de descriere a datelor specializate sau limbaje gazda;

‑ accesul la datele bazei de date;

‑ prelucrarea datelor din baza de date;

‑ refacerea datelor in caz de incident;

‑ securitatea datelor prin sisteme de parole;

‑ partajarea datelor intre diferitii utilizarori ai bazei de date;

‑ conversia datelor de la un sistem de reprezentare la altul, specifica bazelor de date distribuite.

2. Crearea fisierelor baza de date

Fisierele baza de date sint cele mai importante tipuri de fisiere folosite in domeniul bazelor de date. In ele se memoreaza datele existente in baza de date sub forma de inregistrari si cimpuri. Fiecare inregistrare tinde sa contina un set de informatii unice astfel incit sa se elimine pe cit posibil fenomenul de redundanta a informatiilor.

2.1. Structura bazei de date

Structura unui fisier baza de date, este stabilita prin definirea fiecarui cimp din baza de date. Acest lucru este posibil prin folosirea comenzilor CREATE si MODIFY STRUCTURE. Definirea cimpurilor presupune specificarea urmatoarelor elemente:

1. NUMELE CIMPULUI

Numele cimpului poate fi format din maxim 10 caractere. El trebuie sa inceapa cu o litera si nu poate contine spatii. Sint permise numai litere, numere si liniuta de subliniere.

2. TIPUL CIMPULUI

In general, in toate limbajele specifice bazelor de date, pot fi folosite urmatoarele tipuri de cimpuri:

C ‑ caracter

D ‑ data

L ‑ logic

M ‑ memo

N ‑ numeric

3. LUNGIMEA CIMPULUI

Lungimea cimpului reprezinta numarul maxim de caractere sau cifre ce pot fi continute in cimp. In cazul cimpurilor numerice, punctul zecimal si semnul(daca exista) trebuie numarate in lungimea cimpului. Cimpurile de date, logice si memo au lungime fixata.

CIMPURILE DE TIP CARACTER

Cimpurile de tip caracter pot fi folosite pentru a memora orice caracter afisabil ce poate fi introdus de la tastatura (inclusiv spatii). El poate include litere, numere, simboluri speciale si spatii. Lungimea maxima a unui astfel de cimp este de 254 de caractere.

CIMPURILE DE TIP DATA

Acestea sint utilizate pentru a memora date calendaristice. Datele pot fi introduse si afisate in formate variate utilizind optiunea PICTURE din comanda @SAYGET. Formatul implicit de introducere si afisare este luna/zi/an. Lungimea cimpului este de 8 caractere.

O data poate fi adunata la un numar, o data poate fi scazuta dintr‑un numar, un numar poate fi scazut dintr‑o data.

CIMPURI DE TIP NUMERIC

Cimpurile numerice pot fi de doua feluri: intregi si zecimale. Lungimea unui cimp numeric este data de numarul de cifre pe care‑l poate memora acel cimp. Punctul zecimal, semnul si pozitiile zecimale (daca exista) sint adunate la lungimea cimpului, contind fiecare ca o cifra.

CIMPURI LOGICE

Cimpurile logice pot memora un singur caracter reprezentind

valoarea True (adevarat) sau valoarea False (fals). Valoarea logica adevarat este introdusa ca T, t, Y, y iar valoarea logica fals ca F, f, N, n.

CIMPURI MEMO

Aceste cimpuri sint destinate memorarii unor blocuri mari de text. Ele sint memorate in fisiere auxiliare, create automat de sistem, cu acelasi nume cu fisierul baza de date ce contine cimpuri memo si cu extensie (.dbt) si sint indicate in fisierul baza de date prin cuvintul Memo. Dimensiunea cimpului memo este variabila. Daca nu este introdusa nici o data dimensiunea cimpului este 0. Daca sint introduse date sint asignate blocuri de cite 512 octeti pina la numarul maxim de octeti ai cimpului. Fiecare cimp memo foloseste 10 octeti in fiecare inregistrare a bazei de date (.dbf).

De exemplu, informatiile despre studentii unei facultati pot fi memorate intr‑o baza de date denumita STUDENT.DBF ce poate avea urmatoarea structura:

DENUMIRE CIMP TIP LUNGIME ZECIMALE

NUME C 15 0

PRENUME C 10 0

SECTIA C 3 0

GRUPA N 3 0

ADRESA C 20 0

BURSA N 7 2

ST_CIV L 1 0

DATA_N D 8 0

MENTIUNI M 10

2.2. Comanda de creare a fisierelor baza de date

Crearea fisierelor baza de date se face cu urmatoarea comanda:

CREATE <nume fisier>

CREATE defineste structura unui nou fisier baza de date si adauga fisierul in directorul discului. Daca nu este specificat altfel, se adauga extensia implicita .dbf la numele fisierului. Structura bazei de date se defineste prin precizarea urmatoarelor informatii pentru fiecare cimp:

‑ numele cimpului,

‑ tipul cimpului,

‑ lungimea cimpului,

‑ numarul de pozitii zecimale.

Daca se definesc cimpuri de tip Memo in structura bazei de date atunci se creaza implicit si un fisier baza de date‑memo cu extensie .dbt asociat fisierului .dbf.

Structura unui fisier baza de date existent poate fi modificata cu urmatoarea comanda:

MODIFY STRUCTURE

Fisierul a carui structura se va modifica trebuie sa existe si sa fie deschis in momentul executiei comenzii. Modificarile de structura pot sa fie de urmatorul tip:

‑ adaugarea de noi cimpuri;

‑ inlaturarea unor cimpuri existente;

‑ modificarea numelui unui cimp;

‑ modificarea tipului de data a unui cimp;

‑ modificarea lungimii unui cimp, etc.

Trebuie sa aveti grija cum modificati structura fisierului, pentru ca in anumite situatii se pot pierde informatiile memorate in baza de date. De ex., la conversia tipului de data dintr‑un cimp (C‑>N) sau la micsorarea lungimii cimpului.

3. Sarcini ale studentilor

1. Se va crea o baza de date avind structura de la punctul 1.

2. Se va modifica structura fisierului creat anterior astfel incit ea sa coincida cu cea de la punctul 2.1.

3. Se vor adauga cite 3 inregistrari in fisierul STUDENT.DBF

4.Fiecare student va crea cite un fisier baza de date cu o structura proprie.

5. Pentru fisierul mai sus creat se vor defini cite 3 inregistrari.

Universitatea Sibiu

Facultatea de Inginerie

Catedra Electrotehnica si Calculatoare

Lucrare de laborator la disciplina

Proiectarea Bazelor de Date

Tema lucrarii: Notiuni despre variabilele de memorie, expresii si tipuri de operatori.

Crearea si folosirea fisierelor index.

1. Notiunea de variabila de memorie, expresie si tipuri de operatori

1.1. Variabile de memorie

Variabilele de memorie sint tipuri speciale de variabile ce memoreaza datele in afara bazelor de date. Ele furnizeaza un mijloc convenabil pentru memorarea temporara a unor date. Ele pot fi folosite pentru calcule intermediare, pentru a controla executia programului, e.t.c..

Numele variabilelor de memorie poate fi format din 1 pina la 10 caractere. Ele pot contine litere, numere si liniuta de subliniere. Trebuie sa inceapa cu o litera si sa nu includa spatii.

Nu puteti folosi ca nume de variabila de memorie un nume de comanda. Atunci cind cimpurile din baza de date au acelasi nume cu variabilele de memorie cimpurile au prioritate asupra variabilelor. In acest caz puteti preciza variabila de memorie folosind sintaxa m‑> inaintea numelui de variabila.

Variabilele de memorie pot fi salvate pe disc, in fisiere de tip (.mem), folosind comanda SAVE si pot fi readuse in memorie pentru o folosire ulterioara cu ajutorul comenzii RESTORE.

FISIERE DE MEMORIE

Fisierele de memorie sint folosite pentru a salva continutul variabilelor de memorie, in vederea folosirii lor ulterioare.

Aceste fisiere sint create cu comanda SAVE si sint recitite in memorie cu comanda RESTORE.

SAVE TO <nume fisier> [ALL LIKE / EXCEPT <sablon>]

SAVE TO creaza un fisier de memorie in care sint salvate toate variabilele de memorie existente in acel moment. Daca nu este precizata nici o extensie, este adaugata implicit extensia (.mem).

Daca se doreste salvarea numai a anumitor variabile de memorie se poate preciza numele lor folosind una din sintaxele:

‑ ALL LIKE <sablon>,

‑ ALL EXCEPT <sablon>.

In sablon pot fi folosite caracterele * si ?.

De exemplu, pentru a salva in fisierul de memorie MEM_VAR variabilele de memorie de tipul AA123 AB1245 AC1234 se foloseste urmatoarea comanda

SAVE TO MEM_VAR ALL LIKE A*12?

RESTORE FROM <nume fisier> [ ADDITIVE ]

RESTORE FROM citeste variabilele de memorie existente in fisierul cu nume precizat si le incarca in memoria interna a calculatorului. In mod obisnuit refacerea variabilelor de memorie dintr‑un fisier implica stergerea din memoria calculatorului a tuturor variabilelor existente pina in acel moment si inlocuirea lor cu cele existente in fisier. Daca se doreste ca variabilele existente sa fie pastrate, trebuie folosita optiunea ADDITIVE, care adauga acestor variabile pe cele memorate in fisier.

Exista patru tipuri de variabile de memorie: caracter, data, logic si numeric.

Variabilele de memorie pot fi create cu comenzile: =, STORE, ACCEPT, INPUT, WAIT, AVERAGE, COUNT, SUM, sau prin intermediul comenzii DIMENSION care defineste variabile de tip masiv. Variabilele sint modificate prin atribuirea unor noi valori, care inlocuiesc valorile anterioare. O variabila de memorie poate fi editata cu comanda @GET.

Tipurile caracteristice ale unei variabile de memorie sint:

CARACTER

Folosit pentru memorarea sirurilor de caractere. Pot fi memorate si secvente binare folosind functia CHR. Variabilele de tip caracter pot contine pina la 256 caractere. Spatiul de memorie ocupat de o variabila de memorie de tip caracter este dat de lungimea ei plus 2 octeti. Exemple de variabile de tip caracter: A='Hello !', STORE ' studenti ' TO B, C=A+B.

DATA

Este folosita pentru memorarea datelor calendaristice. Lungimea variabilei de acest tip este de 8 caractere. Totalul de memorie ocupat este de 9 octeti. Variabilele de tip data sint validate la introducerea unei date sau la modificarea acesteia. Formatul standard pentru variabilele de tip data este cel american mm/dd/yy (luna/zi/an). Acesta poate fi modificat cu comenzile SET DATE si SET CENTURY.

Pentru a crea o variabila de tip data de la tastatura se foloseste functia CTOD (de ex., A=CTOD('05/23/95').

O data poate fi scazuta dintr‑o alta data rezultatul fiind un numar ce reprezinta numarul de zile dintre cele doua date. La o data poate fi adaugat sau scazut un numar rezultatul fiind tot o data.

NUMERIC

Este folosit pentru a memora date folosite in calcule. Tipul numeric intreg sau zecimal al variabilei este stabilit de tipul datei memorata in variabila (de ex., A=123, B=12.34,C=‑ 0.76).

LOGIC

Variabilele logice sint memorate ca adevarat (true) sau fals (false). Lungimea variabilei de tip logic este de 1 octet. Ea ocupa in total 2 octeti de memorie. Variabilele logice accepta valorile T, t, Y, y pentru adevarat si F, f, N, n pentru fals specificate intre doua puncte (de ex., A=.t.).

Atunci cind un program este terminat toate variabilele de memorie create de acel program sint sterse din memorie,cu exceptia celor declarate PUBLIC. O variabila declarata PUBLIC poate fi stearsa numai explicit folosind comanda RELEASE.

Doua variabile de memorie nu pot avea acelasi nume. Comanda PRIVATE poate fi folosita pentru a face 'invizibile' variabilele create in programele de nivel superior programului sau subrutinei curente. Aceasta comanda ofera posibilitatea folosirii pentru o variabila din subrutina a aceluiasi nume pe care‑l are o variabila dintr‑un program de nivel mai inalt, fara ca cele doua variabile sa fie suprapuse.

1.2.Expresii

O expresie este formata ca o combinatie intre:

‑ cimpuri;

‑ variabile de memorie;

‑ constante;

‑ functii;

‑ operatori.

De exemplu, pentru baza de date STUDENT definita anterior putem afla numele si prenumele unui student cu ajutorul expresiei NUME+PRENUME ce insumeaza continutul cimpului NUME cu cel al cimpului PRENUME. De asemenea, o majorare a bursei cu un procent de 11,2% poate fi realizata cu ajutorul expresiei BURSA*1.112.

Sint acceptate urmatoarele tipuri de expresii:

‑ caracter (expC);

‑ data (expD);

‑ logic (expL);

‑ numeric (expN).

1.3.OPERATORI

Exista patru tipuri de operatori :

‑ matematici;

‑ relationali;

‑ logici;

‑ pentru siruri de caractere.

OPERATORI MATEMATICI

Operatorii matematici genereaza rezultate numerice:

+ adunare

‑ scadere

* inmultire

/ impartire

** sau ^ ridicare la putere

() gruparea operatiilor

OPERATORI RELATIONALI

Operatorii relationali genereaza rezultate logice. Operatorii relationali pot fi folositi in expresii caracter, numerice sau de date. Ambele expresii trebuie sa fie de acelasi tip.

< mai mic

> mai mare

= egal

<>,!=,# diferit

<= mai mic sau egal

>= mai mare sau egal

$ comparare de subsiruri

De exemplu, A='abcd', B='abf' si C='ab' .In acest caz

A<B true

A>B false

B$A false

C$A true (adevarat daca sirul C este identic cu A sau este continut in A)

A=12.5 B=0.76 C=0.76

B<A si B=C true

A<=B false

A=CTOD('10/12/92') B=CTOD('10/25/92')

A<=B true

OPERATORI LOGICI

Operatorii logici determina un rezultat de tip logic, prin compararea a doua expresii logice.

.AND. SI logic

.OR. SAU logic

.NOT. negare logica

() parametru pentru gruparea operatorilor

De exemplu, A='date' B='datele' C='a'

(A$B).AND.(C<B) true

(C<A).OR.(C>B) false

OPERATORI PENTRU SIRURI DE CARACTERE

Operatorii pentru siruri de caractere au ca rezultat tot un sir de caractere. Ei sint:

+ ‑ operator de concatenare a sirurilor

‑ ‑ operator de concatenare a sirurilor cu suprimarea spatiilor dintre siruri si adaugarea lor la sfirsitul celui de al doilea sir.

De exemplu, A='abcd ' B='fgh '

A+B='abcd fgh '

A‑B='abcdfgh '

1.4.Precedenta operatorilor

Fiecare tip de operator are un set de reguli ce determina ordinea in care fiecare operator este executat.

Operatorii relationali si cei pentru siruri de caractere au un singur nivel de precedenta. Aceste operatii sint executate de la stinga la dreapta. Nivelele de precedenta pentru operatorii matematici sint:

1. unar (semnul + si semnul ‑)

2. ridicarea la putere

3. inmultirea si impartirea

4. adunarea si scaderea

Nivelele de precedenta pentru operatorii logici sint:

1. .NOT.

2. .AND.

3. .OR.

Atunci cind in aceiasi expresie sint folosite mai multe tipuri de operatori nivelele de precedenta sint:

1. matematic si sir de caractere

2. relational

3. logic

Toate operatiile din interiorul aceluiasi nivel de precedenta sint executate de la stinga la dreapta. Parantezele pot fi folosite pentru a modifica ordinea de executie. Sint executate primele operatiile din interiorul parantezelor cele mai interioare.

2.Crearea si folosirea fisierelor index

FISIERE INDEX

Fisierele index permit folosirea bazelor de date in ordinea logica dorita si nu in ordinea fizica in care sint pastrate inregistrarile. Ordinea fizica este ordinea in care sint introduse inregistrarile. Ordinea logica dorita poate fi cea alfabetica, cronologica sau numerica, in functie de tipul cimpului folosit.

Fisierele index leaga o cheie (un cimp mai important) de numarul inregistrarii din baza de date. Atunci cind este folosita o baza de date impreuna cu un fisier index, inregistrarile din baza de date apar in ordinea data de cimpul cheie. Cheia, ce poate fi formata dintr‑un cimp sau din mai multe cimpuri, poate fi folosita pentru accesul direct la o anumita inregistrare.

Fisierele index sint create cu comanda INDEX ON.

INDEX ON <expresie cheie > TO <nume fisier>[UNIQUE]

INDEX creaza un fisier index asociat unui fisier baza de date pe baza caruia inregistrarile din baza de date sint ordonate alfabetic, numeric sau cronologic in functie de tipul expresiei cheie. Fisierul index contine valoarea cheii si numarul inregistrarii corespunzatoare, pentru fiecare inregistrare din baza de date. Daca nu este specificat altfel, sint adaugate automat specificatorul unitatii de disc si extensia .idx.

Drept cheie de indexare pot fi utilizate un cimp sau o expresie ce include unul sau mai multe cimpuri. Cimpurile logice si cimpurile memo nu pot figura in exresia cheie. Atunci cind cheia de indexare este constituita din mai multe cimpuri, plasati cimpul cel mai important primul in expresie. Pentru a folosi cimpuri numerice si cimpuri de tip data impreuna cu cimpuri caracter intr‑un index, folositi functiile STR si respectiv DTOC.

Atunci cind mai multe inregistrari din fisierul baza de date au aceeasi valoare in cimpul cheie, folosind optiunea UNIQUE numai prima inregistrare, din cele cu aceeasi valoare a cheii, care este intilnita este inclusa in fisierul .idx.

De exemplu, pentru fisierul STUDENT.DBF putem crea un fisier index INUME1 avind ca si cimp cheie cimpul de nume

INDEX ON NUME TO INUME1

un fisier index INUME2 avind ca expresie cheie o expresie rezultata pe baza cimpurilor de nume si prenume

INDEX ON NUME+PRENUME TO INUME2

un fisier index INUME3 avind ca expresie cheie o expresie rezultata pe baza cimpurilor de nume, prenume si bursa

INDEX ON NUME+PRENUME+STR(BURSA) TO INUME3

Daca fisierul index este activ, atunci orice actualizare facuta in fisierul baza de date, care implica cheia de indexare, se va reflecta automat si in index.

Activarea unui fisier index se poate face simultan cu deschiderea fisierului baza de date, folosind comanda:

USE <nume fisier dbf> INDEX <lista fisiere index>

Primul fisier din lista va fi fisier index master, el va stabili ordinea in care sint vazute inregistrarile din fisierul dbf.

Se poate activa un fisier index si ulterior deschiderii fisierului dbf asociat, folosind comanda:

SET INDEX TO [<lista fisiere index>]

De asemenea primul fisier din lista este fisier index master. Pentru a schimba acest fisier cu altul din lista se foloseste comanda SET ORDER TO <exprN>, unde exprN este numarul fisierului care va deveni fisier index master.

Pentru dezactivarea fisierelor index se pot folosi comenzile:

SET INDEX TO sau CLOSE INDEXES

3.Sarcini ale studentilor.

1. Se vor defini variabile de memorie din fiecare din cele 4 tipuri existente;

2. Se vor construi expresii de diferite tipuri;

3. Se vor testa regulile de la precedenta operatiilor.

4. Se vor crea mai multe fisiere index pentru fisierul baza de date STUDENTI.DBF, folosind diverse chei de indexare.

5. Se va analiza modul de ordonare a inregistrarilor in functie de fisierul index activ, sau in cazul mai multor fisiere index active simultan in functie de fisierul index master.

Universitatea Sibiu

Facultatea de Inginerie

Catedra de Calculatoare

Lucrare de laborator la disciplina

Proiectarea Bazelor de Date

Tema lucrarii: Comenzi folosite in domeniul bazelor de date pentru adaugarea informatiilor in fisierele de date. Modalitati de folosire a acestor comenzi in scrierea unor programe care isi propun adaugarea de noi informatii in baza de date.

1. Adaugarea datelor in fisierele baza de date

Urmatoarele comenzi permit adaugarea unor noi inregistrari intr‑o baza de date:

APPEND [BLANK]

APPEND permite adaugarea unor inregistrari la sfirsitul fisierului baza de date deschis in zona de lucru curenta. Este cea mai folosita comanda pentru introducerea datelor in mod ecran. Pe ecran este prezentata macheta de introducere a valorilor unei noi inregistrari. Cind procesul de introducere a unei inregistrari este terminat se trece la o noua inregistrare tastind <CR>, salvarea inregistrarilor adaugate se face cu CTRL‑ END sau cu ESC, caz in care ultima valoare introdusa nu este salvata. Puteti folosi si un alt format de ecran decit cel standard, prin precizarea anterioara executiei comenzii a numelui programului ce contine formatul de ecran definit cu SCREEN BUILDER‑ul.

Optiunea BLANK adauga inregistrari goale la sfirsitul bazei de date, fara afisarea machetei de introducere in mod ecran, urmind ca aceste inregistrari sa fie completate ulterior. Inregistrarea goala adaugata devine inregistrarea curenta.

Toate fisierele index active in timpul executiei comenzii sint actualizate pentru a cuprinde si noua inregistrare.

APPEND FROM <nume fisier> [FIELDS <lista_cimpuri>]

[FOR<conditie>][TYPE<tip fisier>]

APPEND FROM copiaza inregistrari dintr‑un fisier existent, specificat prin nume, la sfirsitul bazei de date active. Fisierul &sursa nu trebuie sa fie neaparat un fisier baza de date. Daca este de alt tip se specifica acest tip prin clauza TYPE. Daca se specifica clauza FIELDS se vor copia doar cimpurile specificate in lista, iar daca se specifica clauza FOR vor fi copiate doar acele inregistrari care satisfac conditia de selectie.

BROWSE [FIELDS<lista cimpuri>][FOR <conditie>]

[LOCK<expresie numerica>][FREEZE<cimp>][NOAPPEND]

[NOEDIT][NODELETE][NOMENU][WIDTH<exp. numerica>]

Comanda BROWSE permite adaugarea si actualizarea inregistrarilor in baza da date .dbf si in fisiere view .vue in mod ecran. Ea prezinta pina la 17 inregistrari pe acelasi ecran. Pentru fiecare inregistrare sint prezentate atitea cimpuri cite incap pe latimea ecranului. Vizualizarea tuturor cimpurilor se face cu ajutorul tastelor ‑> si <‑.

Optiunea FIELDS specifica ce cimpuri vor fi vizualizate si ordinea lor de aparitie.

Optiunea FOR permite numai afisarea acelor inregistrari care satisfac conditia indicata.

Optiunea LOCK precizeaza numarul cimpurilor contigue la stinga ecranului ce nu trebuie mutate la apasarea tastelor ‑> si <‑.

Daca specificati un cimp cu optiunea FREEZE, acesta va fi singurul cimp ce va putea fi editat cu comanda BROWSE respectiva.

Optiunea NOAPPEND nu permite adaugarea de noi inregistrari cu ajutorul comenzii BROWSE.

Optiunea NOEDIT sau NOMODIFY nu permite modificarea valorilor afisate cu BROWSE.

Optiunea NODELETE nu permite stergerea de inregistrari din fereastra BROWSE.

Optiunea NOMENU nu afiseaza meniul de ajutor al comenzii BROWSE.

Optiunea WIDTH limiteaza numarul caracterelor afisate pentru toate cimpurile din fereastra BROWSE la expresia numerica indicata.

INSERT [BLANK] [BEFORE]

Comanda INSERT adauga o singura inregistrare in baza de date.

INSERT afiseaza un ecran pentru introducerea valorilor din noua inregistrare. Noua inregistrare este inserata imediat dupa inregistrarea curenta. De exemplu, daca numarul inregistrarii curente este 5, INSERT creaza noua inregisrtare in pozitia 6, vechea inregistrare din pozitia 6 devine inregistrarea cu numarul 7 si asa mai departe. Datorita acestei deplasari a tuturor inregistrarilor de dupa cea curenta, comanda nu este prea indicata a se folosi deoarece se pierde timp cu rescrierea inregistrarilor.

Daca se foloseste optiunea BEFORE se adauga inregistrarea inaintea inregistrarii curente. De exemplu, daca inregistrarea curenta are numarul 5, INSERT BEFORE creaza noua inregistrare la pozitia 5, vechea inregistrare 5 devine inregistrarea 6 si asa mai departe.

Daca se doreste ca inserarea datelor sa nu se faca in formatul de ecran standard trebuie specificat un alt format de ecran la fel ca in cazul comenzii APPEND. Inregistrarea adaugata este salvata cu CTRL‑END sau este abandonata cu ESC.

Optiunea BLANK determina inserarea unei noi inregistrari, fara a permite si introducerea valorilor noii inregistrari in mod conversational, ecranul de introducere nefiind afisat. Datele pot fi introduse ulterior in noua inregistrare folosind comenzi de editare sau actualizare.

2. Modalitati de folosire a acestor comenzi in programe:

In continuare sint prezentate 3 programe care va permit sa adaugati date intr‑o baza de date formata din fisierul baza de date ANGAJATI.DBF cu urmatoarea structura:

MARCA N 4

NUME C 20

FUNCTIE C 10

SALAR N 8 2

SECTIE N 2

Gradul de dificultate al programelor creste gradat.

** ** *ADAUG1.prg ** **

* Se va adauga o singura inregistrare la apelarea programului.

* Datele sint preluate de la tastatura.

* Valorile preluate sint introduse direct in inregistrare.

set color to gr+/r,g/w

clear

use angajati

append blank

@ 3,10 say ' Adaugarea unei noi inregistrari'

@ 5,5 say 'Specificati :'

@ 6,7 say 'marca : ' get marca picture '9999'

@ 7,7 say 'numele : ' get nume

@ 8,7 say 'functia : ' get functie

@ 9,7 say 'salariul : ' get salar picture '99999.99'

@10,7 say 'departamentul : ' get sectie picture '99'

read

use

** ** *ADAUG2.prg ** **

* Se vor adauga mai multe inregistrari la o singura apelarea

* a programului.

* Se iese din program tastind ENTER pentru marca.

* Datele sint preluate de la tastatura in variabile de memorie.

*Valorile preluate sint introduse in inregistrare numai daca * sint validate.

set color to gr+/r,g/w

set talk off

set scoreboard off

set status off

use angajati

do while .t.

clear

vm=0

vn=space(20)

vf=space(10)

vs=0

vd=0

@ 1,1,24,79 box ''+chr(178)

@ 3,10 say ' Adaugarea unei noi inregistrari'

@ 5,5 say 'Specificati :'

@ 6,7 say 'marca : ' get vm picture '9999'

read

if vm=0

use

clear

return

endif

@ 7,7 say 'numele : ' get vn

@ 8,7 say 'functia : ' get vf

@ 9,7 say 'salariul : ' get vs picture '99999.99'

@10,7 say 'departamentul : ' get vd picture '99'

read

rasp='d'

wait 'date introduse corect d/n ?' to rasp

if rasp$'Dd'

append blank

replace marca with vm,nume with vn,functie with vf,salar with vs,sectie with vd

else

loop

endif

enddo

** ** *ADAUG3.prg ** **

* Se vor adauga mai multe inregistrari la o singura apelarea

* a programului.

* Se iese din program tastind ENTER pentru marca.

* Fisierul baza de date este indexat dupa marca.

* Nu se pot adauga mai multi angajati cu aceeasi valoare a * marcii.

* Datele sint preluate de la tastatura in variabile de memorie.

* Valorile preluate sint introduse in inregistrare numai daca * sint validate.

set color to gr+/r,g/w

set talk off

set scoreboard off

set status off

use angajati index imarca

do while .t.

clear

vm=0

vn=space(20)

vf=space(10)

vs=0

vd=0

@ 1,1,24,79 box ''+chr(176)

@ 3,10 say ' Adaugarea unei noi inregistrari'

@ 5,5 say 'Specificati :'

@ 6,7 say 'marca : ' get vm picture '9999'

read

if vm=0

use

clear

return

endif

seek vm

if found()

@15,5 say 'Aceasta marca exista deja !!!'

wait ''

loop

endif

@ 7,7 say 'numele : ' get vn

@ 8,7 say 'functia : ' get vf

@ 9,7 say 'salariul : ' get vs picture '99999.99'

@10,7 say 'departamentul : ' get vd picture '99'

read

rasp='d'

wait 'date introduse corect d/n ?' to rasp

if rasp$'Dd'

append blank

replace marca with vm,nume with vn,functie with vf,salar with vs,sectie with vd

else

loop

endif

enddo

3. Sarcini ale studentilor:

1. Se vor testa pe rind toate comenzile.

2. Se vor adauga date in fisierul baza de date ANGAJATI.DBF folosind machetele de ecran standard ale comenzilor APPEND si INSERT.

3. Se va urmari modul cum se modifica numarul de inregistrari din fisier in cazul folosirii comenzilor de adaugare.

4.Se va scrie un program care sa permita adaugarea de noi date in baza de date formata din fisierele ANGAJATI.DBF si PERSONAL.DBF in urmatoarele conditii:

‑ se pot adauga mai multe inregistrari la o singura apelare a programului;

‑ nupot exista mai multi angajati cu aceeasi marca;

‑nu se vor putea adauga inregistrari in fisierul PERSONAL.DBF daca nu exista inregistrarea corespunzatoare acelui angajat in fisierul ANGAJATI.DBF;

‑datele sint preluate de la tastatura in variabile de memorie;

‑daca se confirma corectitudinea datelor acestea se introduc in baza de date;

‑ se iese din program atunci cind marca angajatului este 0;

‑ structura fisierului PERSONAL.DBF este urmatoarea:

MARCA N 4

ADRESA C 30

DATA_N D 8

ST_CIV L 1

NR_COPII N 2

Universitatea Sibiu

Facultatea de Inginerie

Catedra de Calculatoare

Lucrare de laborator la disciplina

Proiectarea Bazelor de Date

Tema lucrarii: Comenzi folosite in domeniul bazelor de date pentru modificarea informatiilor memorate. Modalitati de folosire a acestor comenzi in scrierea unor programe care isi propun modificarea informatiilor memorate in baze de date.

1. Comenzi folosite pentru modificarea datelor memorate in fisiere

Urmatoarele comenzi va permit modificarea datelor dintr‑o baza de date, in special in mod interactiv:

BROWSE ‑comanda a fost detaliata in laboratoarele precedente.

Ea permite editarea uneia sau a mai multe inregistrari in mod ecran.

CHANGE <scop> [FIELDS <lista cimpuri>] [WHILE <conditie>]

[FOR <conditie>]

Comanda permite editarea cimpurilor si inregistrarilor specificate. Deplasarea in interiorul inregistrarii este comandata prin tastele sageti. Tasta PgUp permite revenirea la inregistrarea anterioara, iar tasta PgDn trecerea la inregistrarea urmatoare. Tasta CTRL‑END determina iesirea din comanda CHANGE cu salvarea tuturor modificarilor efectuate. Comanda poate fi incheiata si cu tasta ESC, caz in care modificarile din ultima inregistrare nu sint salvate. Daca se specifica prin scop sau prin conditii numai anumite inregistrari asupra carora se vor face modificari, dupa incheierea setului respectiv de inregistrari de revine automat in mod comanda. Cu ajutorul optiunii FIELDS se specifica cimpurile asupra carora se pot face modificari. Daca aceasta optiune lipseste se pot modifica toate cimpurile din inregistrare.

EDIT <scop> [FIELDS <lista cimpuri>] [WHILE <conditie>]

[FOR <conditie>]

Este o comanda executabila in mod ecran, ce permite modificarea continutului unei inregistrari din fisierul baza de date activ. Daca EDIT este folosita fara parametrii este editata numai inregistrarea curenta. Este o comanda identica cu comanda CHANGE.

Comenzile prezentate anterior sint folosite in special in cazul modificarii datelor in mod interactiv, ele nu sint folosite de obicei in programe. In cadrul programelor sint folosite cel mai adesea urmatoarele comenzi:

REPLACE <scop> <cimp1> WITH <expr1> [,<cimp2> WITH <expr2>]

[WHILE <conditie>] [FOR <conditie>]

REPLACE permite modificarea continutului cimpurilor dintr‑o baza de date. Daca nu este precizat altfel prin scop sau clauzele WHILE sau FOR este modificata doar inregistrarrea curenta. Cimpul si expresia WITH trebuie sa fie de acelasi tip. Pentru cimpurile numerice expresia WITH trebuie sa nu fie mai larga decit lungimea cimpului. Daca expresia genereaza un rezultat ce nu poate fi cuprins in lungimea cimpului, cimpul este umplut cu (*). Modificarea continutului unui cimp indexat determina si actualizarea indexului, daca acesta este deschis in momentul modificarii. Dupa ce este executata modificarea, pointerul inregistrarii este mutat pe o noua pozitie in fisierul index. Din acest motiv nu trebuie folosite <scop>, WHILE sau FOR atunci cind sint executate modificari intr‑un cimp indexat. Daca fisierul index asociat nu era deschis modificarile efectuate asupra bazei de date nu se reflecta si la nivelul indexului si este indicat sa realizati o reindexare a datelor din baza de date inaintea folosirii lor indexate.

De exemplu, o majorare de salariu cu un procent de 11,2% pentru toti angajatii se realizeaza astfel:

USE PERSONAL

REPLACE ALL SALAR WITH SALAR*1.112

iar in cazul in care se doreste majorarea cu acest procent doar a salariilor salariatilor ce au un salariu mai mic decit 45000 lei comanda va fi:

REPLACE SALAR WITH SALAR*1.112 FOR SALAR < 45000

UPDATE ON <cimp cheie> FROM <alias> REPLACE <cimp1> WITH <expr1>

[, <cimp2> WITH <expr2>] [RANDOM]

Comanda UPDATE foloseste datele unui fisier existent ca baza pentru modificarea inregistrarilor din fisierul baza de date curent. Modificarile sint executate prin combinarea inregistrarilor din cele doua baze de date dupa un cimp cheie. Baza de date sursa trebuie sa fie si ea activa intr‑o zona de lucru neselectata. Cimpul cheie trebuie sa aiba acelasi nume in ambele baze de date. Daca cimpul cheie din baza de date actualizata nu este unic pentru fiecare inregistrare din fisier, doar prima inregistrare este actualizata. Ambele fisiere trebuie sa fie sortate sau indexate dupa cimpul cheie, cu exceptia cazului in care se foloseste optiunea RANDOM. In acest caz doar fisierul ce va fi actualizat trebuie sa fie indexat.

De exemplu, considerind o baza de date TREN.DBF ce memoreaza trenurile ce circula printr‑o gara si numarul de locuri disponibile la acele trenuri si o alta baza de date REZERVAT.DBF ce memoreaza rezervarile de locuri, se poate actualiza fisierul TREN.DBF astfel incit sa se cunoasca numarul de locuri ce mai sint disponibile la fiecare tren, numar de locuri ce va fi trimis altor gari ca disponibil.

SELECT 2

USE REZERVAT

SELECT 1

USE TREN

INDEX ON NR_TREN TO ITREN

UPDATE ON NR_TREN FROM REZERVAT REPLACE

LOCURI WITH LOCURI‑B‑>LOCURI RANDOM

2. Modalitati de folosire a acestor comenzi in programe:

In continuare sint prezentate 3 programe care va permit sa modificati datele memorate in baza de date ANGAJATI.DBF cu structura precizata in laboratoarele precedente. Gradul de dificultate al programelor creste gradat.

** ** *MODIF1.prg ** **

* Se va modifica o singura inregistrare la apelarea programului.

* Se verifica daca inregistrarea cu marca specificata exista.

* Daca nu exista se afiseaza un mesaj de eroare.

* Daca inregistrarea exista:

* ‑ datele sint preluate de la tastatura;

* ‑ valorile preluate sint introduse direct in inregistrare.

clear

use angajati

vm=0

@ 3,10 say ' Modificarea unor inregistrari'

@ 5,5 say 'Specificati :'

@ 6,7 say 'marca : ' get vm picture '9999'

read

locate for marca=vm

if eof()

@10,5 say 'Angajatul cu aceata marca nu exista !!!'

wait ''

use

return

endif

@ 7,7 say 'numele : ' get nume

@ 8,7 say 'functia : ' get functie

@ 9,7 say 'salariul : ' get salar picture '99999.99'

@10,7 say 'departamentul : ' get sectie picture '99'

read

use

** ** *MODIF2.prg ** **

* Se vor modifica mai multe inregistrari la o singura apelarea

* a programului.

* Se iese din program tastind ENTER pentru marca.

* Se verifica daca inregistrarea cu marca specificata exista.

* Daca nu exista se afiseaza un mesaj de eroare.

* Daca inregistrarea exista:

* ‑ datele sint preluate de la tastatura in variabile de memorie;

* ‑valorile preluate sint introduse in inregistrare numai daca * sint validate.

set talk off

set scoreboard off

set status off

use angajati

do while .t.

clear

vm=0

@ 1,1,24,79 box ''+chr(178)

@ 3,10 say ' Modificarea unor inregistrari'

@ 5,5 say 'Specificati :'

@ 6,7 say 'marca : ' get vm picture '9999'

read

if vm=0

use

clear

return

endif

locate for marca=vm

if eof()

@10,5 say 'Angajatul cu aceasta marca nu exista !!!'

wait ''

loop

endif

vn=nume

vf=functie

vs=salar

vd=sectie

@ 7,7 say 'numele : ' get vn

@ 8,7 say 'functia : ' get vf

@ 9,7 say 'salariul : ' get vs picture '99999.99'

@10,7 say 'departamentul : ' get vd picture '99'

read

rasp='d'

wait 'date introduse corect d/n ?' to rasp

if rasp$'Dd'

replace marca with vm,nume with vn,functie with vf,salar with vs,sectie with vd

else

loop

endif

enddo

** ** *MODIF3.prg ** **

* Se vor modifica mai multe inregistrari la o singura apelarea

* a programului.

* Se iese din program tastind ENTER pentru marca.

* Fisierul baza de date este indexat dupa marca.

* Se verifica daca inregistrarea cu marca specificata exista.

* Daca nu exista se afiseaza un mesaj de eroare.

* Daca inregistrarea exista:

* ‑ datele sint preluate de la tastatura in variabile de memorie;

* ‑ valorile preluate sint introduse in inregistrare numai daca * sint validate.

set talk off

set scoreboard off

set status off

use angajati index imarca

do while .t.

clear

vm=0

@ 1,1,24,79 box ''+chr(176)

@ 3,10 say ' Modificarea unor inregistrari'

@ 5,5 say 'Specificati'

@ 6,7 say 'marca : ' get vm picture '9999'

read

if vm=0

use

clear

return

endif

seek vm

if .not.found()

@15,5 say 'Angajatul cu aceasta MARCA nu exista !!!'

wait ''

loop

endif

vn=nume

vf=functie

vs=salar

vd=sectie

@ 7,7 say 'numele : ' get vn

@ 8,7 say 'functia : ' get vf

@ 9,7 say 'salariul : ' get vs picture '99999.99'

@10,7 say 'departamentul : ' get vd picture '99'

read

rasp='d'

wait 'date introduse corect d/n ?' to rasp

if rasp$'Dd'

replace marca with vm,nume with vn,functie with vf,salar with vs,sectie with vd

else

loop

endif

enddo

3. Sarcini ale studentilor:

1. Se vor testa pe rind toate comenzile.

2. Se vor modifica unele din datele existente in baza de date ANGAJATI.DBF folosind machetele de ecran standard ale comenzilor EDIT si CHANGE.

3. Se va crea un exemplu de utilizare a lui UPDATE.

4.Se va scrie un program care sa permita modificarea datelor stocate in fisierele baza de date ANGAJATI.DBF si PERSONAL.DBF in urmatoarele conditii:

‑ se pot modifica mai multe inregistrari la o apelare a programului;

‑ se vor putea modifica simultan datele din ambele fisiere corespunzatoare aceluiasi angajat;

‑ nu se va putea modifica marca angajatilor;

‑datele sint preluate de la tastatura in variabile de memorie;

‑ daca se confirma corectitudinea datelor acestea se introduc in baza de date;

‑ daca confirmarea nu apare se pastreaza vechile valori ale datelor si se ofera posibilitatea de a introduce alte date;

‑ se iese din program atunci cind marca angajatului este 0.

Universitatea Sibiu

Facultatea de Inginerie

Catedra de Calculatoare

Lucrare de laborator la disciplina

Proiectarea Bazelor de Date

Tema lucrarii: Comenzi folosite in domeniul bazelor de date pentru stergerea informatiilor memorate. Modalitati de folosire a acestor comenzi in scrierea unor programe care isi propun stergerea informatiilor memorate in baze de date.

1. Comenzi folosite pentru modificarea datelor memorate in fisiere

In domeniul bazelor de date stergerea unui articol poate fi de doua tipuri:

‑ stergere logica, ce presupune numai o invalidare a acelui articol astfel incit acesta nu va fi vizibil pentru toate comenzile de tip baza de date;

‑ stergere fizica, ce presupune o stergere a respectivului articol de pe suportul fizic pe care a fost memorat.

DELETE < scop> [WHILE <conditie>] [FOR <conditie>]

Comanda DELETE realizeaza o stergere logica a articolului. Ea marcheaza pentru stergere inregistrarile din fisierul baza de date curent. Daca nu este astfel specificat prin scop sau clauzele FOR si WHILE doar inregistrarea curenta este marcata pentru stergere. Inregistrarile marcate pentru stergere apar precedate de un asterisc.

Cazurile posibile pentru <scop> sint:

ALL ‑ toate inregistrarile

NEXT n ‑urmatoarele n inregistrari incepind cu inregistrarea curenta

RECORD n ‑ inregistrarea cu numarul de inregistrare n

REST ‑toate inregistrarile incepind de la inregistrarea curenta pina la sfirsitul

fisierului.

PACK

Aceasta comanda sterge fizic din baza de date curenta toate inregistrarile ce au fost marcate pentru stergere anterior cu o comanda DELETE. Toate fisierele index deschise sint reindexate automat. Dupa executarea lui PACK spatiul disc ocupat de inregistrarile sterse este cedat sistemului de operare la inchiderea fisierului. Numarul de inregistrari listat in director nu este schimbat dupa o operatie de tip PACK decit dupa ce fisierul a fost inchis.

RECALL <scop> [WHILE <conditie>] [FOR <conditie>]

RECALL reactiveaza inregistrarile ce au fost marcate pentru stergere in fisierul baza de date activ. Daca nu este specificat altfel prin scop sau clauzele WHILE si FOR este reactivata numai inregistrarea curenta. RECALL nu poate reactiva inregistrari ce au fost deja sterse prin comenzile PACK si ZAP.

ZAP

Comanda realizeaza o stergere fizica a tuturor inregistrarilor din baza de date curenta. Inregistrarile sterse cu aceasta comanda nu mai pot fi reactivate, deci aveti mare grija cum si cind folositi aceasta comanda. Aceasta comanda are acelasi efect cu folosirea urmatoarei secvente de comenzi:

DELETE ALL

PACK

Deci, in urma executiei acestei comenzi se va pastra numai structura fisierului baza de date curent pierzind toate articolele existente in momentul executiei comenzii.

BROWSE ‑comanda a fost detaliata in laboratoarele precedente.

Ea permite stergerea logica a uneia sau a mai multor inregistrari in mod ecran. In momentul cind va aflati cu bara luminoasa pe o inregistrare o puteti sterge tastind DEL.

2. Modalitati de folosire a acestor comenzi in programe:

In continuare sint prezentate 3 programe care va permit sa stergeti unele din datele memorate in baza de date ANGAJATI.DBF cu structura precizata in laboratoarele precedente. Gradul de dificultate al programelor creste gradat.

** ** ****** STERG1.PRG ** ** ******

* Sesterge fizic o singura inregistrare la o apelare a * programului

* Regasirea inregistrarii dorite se face in functie de MARCA

* Inregistrarea stearsa nu poate fi reactivata

clear

use angajati

vm=0

@ 3,10 say ' Stergerea unor inregistrari'

@ 5,5 say 'Specificati :'

@ 6,7 say 'marca : ' get vm picture '9999'

read

locate for marca=vm

if eof()

@10,5 say 'Angajatul cu aceata marca nu exista !!!'

wait ''

use

return

endif

@ 7,7 say 'numele : ' + nume

@ 8,7 say 'functia : ' + functie

@ 9,7 say 'salariul : ' + str(salar,8,2)

@10,7 say 'departamentul : ' +str(sectie,2)

rasp='n'

@15,5 say 'Doriti stergerea inregistrarii D/N ?' get rasp

read

if rasp$'Dd'

delete

pack

endif

use

** ** ********** STERG2.PRG ** ** ****

* Se pot sterge mai multe inregistrari la o apelare a programului

* Regasirea inregistrarii dorite se face dupa MARCA

* Inregistrarea este initial stearsa logic

* Cind se decide iesirea din program toate inregistrarile care au * fost sterse logic sint sterse si fizic

* Inregistrarile sterse nu mai pot fi activate

set talk off

set scoreboard off

set status off

use angajati

do while .t.

clear

vm=0

@ 1,1,24,79 box ''+chr(176)

@ 3,10 say ' Stergerea unor inregistrari'

@ 5,5 say 'Specificati :'

@ 6,7 say 'marca : ' get vm picture '9999'

read

if vm=0

pack

use

clear

return

endif

locate for marca=vm

if eof()

@10,5 say 'Angajatul cu aceasta marca nu exista !!!'

wait ''

loop

endif

@ 7,7 say 'numele : ' +nume

@ 8,7 say 'functia : ' +functie

@ 9,7 say 'salariul : ' +str(salar,8,2)

@10,7 say 'departamentul : ' +str(sectie,2)

rasp='n'

wait 'doriti stergerea inregistrarii d/n ?' to rasp

if rasp$'Dd'

delete

else

loop

endif

enddo

** ** ******** STERG3.PRG ** ** ********

* Se pot sterge mai multe inregistrari la o apelare a programului

* Regasirea inregistrarii dorite se face dupa NUME, in acest scop

* se foloseste un fisier indexat dupa NUME

* Inregistrarea este initial stearsa logic

* Cind se decide iesirea din program toate inregistrarile care au * fost sterse logic pot fi: fie reactivate, fie sterse fizic

set talk off

set scoreboard off

set status off

use angajati index inume

do while .t.

clear

vn=space(20)

@ 1,1,24,79 box ''+chr(177)

@ 3,10 say ' Stergerea unor inregistrari'

@ 5,5 say 'Specificati'

@ 6,7 say 'numele : ' get vn

read

if vn=space(20)

rasp='n'

@17,5 say 'Doriti sa anulati stergerile anterioare d/n ?' get rasp valid rasp$'DdNn'

read

if rasp$'dD'

recall all

else

pack

endif

use

clear

return

endif

seek vn

if .not.found()

@15,5 say 'Nu exista un angajat cu aceast NUME !!!'

wait ''

loop

endif

do while nume=vn.and..not.eof()

@ 7,7 say 'marca : ' +str(marca,4)

@ 8,7 say 'functia : ' +functie

@ 9,7 say 'salariul : ' +str(salar,8,2)

@10,7 say 'departamentul : ' +str(sectie,2)

rasp='d'

wait 'Doriti sa stergeti acest articol d/n ?' to rasp

if rasp$'Dd'

delete

endif

skip

enddo

enddo

3. Sarcini ale studentilor:

1. Se vor testa pe rind toate comenzile.

2. Se vor sterge inregistrari din baza de date ANGAJATI.DBF

folosind comenzile DELETE, RECALL si PACK.

3. Se va scrie un program care sa permita stergerea de articole din bazele de date ANGAJATI.DBF si PERSONAL.DBF in urmatoarele conditii:

‑ se pot sterge mai multe inregistrari la o apelare a programului;

‑ stergerea unei inregistrari din fisierul ANGAJATI.DBF atrage dupa sine stergerea inregistrarii cu aceeasi marca din fisierul PERSONAL.DBF (folositi mesaje de atentionare);

‑ se pot sterge inregistrari numai din fisierul PERSONAL.DBF; ‑ initial se efectueaza numai stergeri logice;

‑ inregistrarile sterse logic pot safieulterior revalidate

sau safie sterse fizic;

‑ se iese din program atunci cind marca angajatului este 0.

Universitatea Sibiu

Facultatea de Inginerie

Catedra de Calculatoare

Lucrare de laborator la disciplina

Proiectarea Bazelor de Date

Tema lucrarii: Comenzi folosite in domeniul bazelor de date pentru cautarea datelor memorate si pentru pozitionarea pe o anumita inregisrare. Modalitati de folosire a acestor comenzi in scrierea unor programe care isi propun realizarea acestor deziderate.

1. Comenzi folosite pentru cautarea datelor in fisiere

Cautarea articolelor dintr‑o baza de date,care satisfac o anumita conditie, se poate realiza cu una din urmatoarele comenzi:

‑ pentru baze de date neindexate se folosesc comenzile :

LOCATE <scop> [WHILE<conditie>] [FOR<conditie>]

LOCATE cauta in baza de date curenta inregistrarea care satisface criteriul specificat. Daca nu este precizat altfel prin scop sau prin clauzele WHILE si FOR, LOCATE cauta prin toata baza de date incepind cu prima inregistrare. Pentru a cauta urmatoarele aparitii ale conditiei specificate folositi comanda CONTINUE. Daca este gasita o inregistrare ce corespunde conditiei precizate, pointerul de inregistrare este mutat pe aceasta inregistrare si numarul inregistrarii este afisat. Functia FOUND() intoarce valoarea true (.T.). Daca nu este gasita nici o inregistrare corespunzatoare conditiei precizate, pointerul inregistrarii este pozitionat pe sfirsitul fisierului, EOF() este true, sau pe ultima inregistrare precizata de scop. Se afiseaza mesajul 'End of locate scope' si functia FOUND() intoarce valoarea False (.F.).

CONTINUE

Comanda determina continuarea cautarii lansate de comanda LOCATE. Ea cauta urmatoarea inregistrare din baza de date curenta care corespunde conditiei specificate in ultima comanda LOCATE. Comanda este terminata fie atunci cind este gasita o inregistrare ce corespunde conditiei precizate de ultima comanda LOCATE, caz in care se afiseaza numarul inregistrarii, fie atunci cind este intilnit sfirsitul scopului precizat de comanda LOCATE, caz in care se afiseaza mesajul 'End of locate scope'. Daca aceasta este ultima inregistrare din baza de date, EOF() este pozitionat pe true.

‑ pentru baze de date indexate :

FIND <sir caractere>/<n>

Comanda FIND cauta in indexul bazei de date prima inregistrare cu cheia specificata ce poate fi de tip sir de caractere sau numar. Daca sirul de caractere sau numarul precizat nu este gasit, pe ecran este afisat mesajul 'No find'. Pointerul inregistrarii este mutat pe sfirsitul fisierului, EOF() este true si FOUND() devine false. Sirul de caractere specificat este delimitat numai daca cheia incepe cu spatiu. In acest caz sirul precizat trebuie sa contina acelasi numar de spatii si sa fie incadrat intre apostroafe simple sau duble sau intre paranteze drepte. FIND lucreaza numai pentru caracterul sau caracterele precizate in cheie. Atunci cind cautarea este executata dupa continutul unei variabile de memorie, variabila trebuie folosita impreuna cu functia macro &. Daca variabila de memorie contine inainte spatii, trebuie sa incadrati functia intre apostroafe '&<var. mem>'.

De exemplu, avind fisierul baza de date PERSONAL.DBF indexat dupa nume sa se gaseasca inregistrarea cu numele Popescu

USE PERSONAL

INDEX ON NUME TO INUME

FIND Popescu

sau in cazul in care numele este memorat intr‑o variabila de memorie:

USE PERSONAL

INDEX ON NUME TO INUME

STORE ' ' TO VNUME

@ 10,10 SAY 'NUMELE:' GET VNUME

READ

FIND &VNUME

SEEK <expresie>

SEEK cauta prima inregistrare dintr‑o baza de date ce corespunde cheii precizate. Cautarea este executata prin intermediul unui fisier index. SEEK este o comanda de cautare foarte rapida a inregistrarii dorite. Daca <expresie> este un sir de caractere, acesta trebuie inchis intre apostroafe simple (') sau duble (') sau intre paranteze drepte ([]). Daca <expresia> este o variabila de memorie sau o expresie numerica ea nu trebuie sa fie delimitata cu apostroafe sau paranteze. Subsirurile sau cheile partiale de cautare lucreaza numai daca expresia de cautare si expresia din index incep cu acelasi caracter. De exemplu, daca expresia cheii din index este 'Popescu Ion', 'Pop' este o expresie de cautare valida, dar 'Ion' nu. Daca in urma cautarii nu este gasita nici o inregistrare care sa corespunda expresiei de cautare, este afisat mesajul 'No find' si pointerul inregistrarii este mutat pe sfirsitul de fisier (EOF()=.T.)

USE PERSONAL INDEX INUME

STORE ' ' TO VN

@2,5 SAY 'INTRODUCETI NUMELE :' GET VN

READ

SEEK VN

DISPLAY

sau

USE PERSONAL INDEX INUME

SEEK 'Popescu'

sau

USE PERSONAL INDEX ISALAR

SEEK 1125

2. Comenzi pentru pozitionarea pointerului de inregistrare

Urmatoarele comenzi pozitioneaza pointerul de inregistrare pe inregistrarea precizata:

GO /GOTO <expresie numerica> / BOTTOM /TOP

Comanda GO/GOTO pozitioneaza pointerul de inregistrare pe inregistrarea precizata in fisierul baza de date activ. <expresie numerica> precizeaza numarul inregistrarii din baza de date. BOTTOM se refera la ultima inregistrare, iar TOP la prima inregistrare din baza de date. Daca baza de date este deschisa cu un index activ, TOP si BOTTOM se vor referi la prima, respectiv ultima inregistrare data de index.

SKIP <expr.numerica>

Comanda SKIP permite mutarea pointerului inregistrarii curente, inainte sau inapoi, in baza de date curenta. Daca exista un fisier index activ, pentru baza de date curenta, SKIP urmareste ordinea indicata de acel index. Daca baza de date curenta nu este indexata, pointerul inregistrarii este mutat secvential, pe baza numarului de inregistrare. Pointerul de inregistrare se deplaseaza inapoi numai daca <expr.numerica> reprezinta un numar negativ. Daca <expr.numerica> nu este precizata pointerul de inregistrare se muta pe inregistrarea urmatoare.

3. Modalitati de folosire a acestor comenzi in programe:

In continuare sint prezentate 3 programe care va permit sa cautati unele din datele memorate in baza de date ANGAJATI.DBF cu structura precizata in laboratoarele precedente. Gradul de dificultate al programelor creste gradat.

** ** ****** CAUT1.PRG ** ** ******

* Se cauta angajatii care au acelasi nume cu cel specificat * de utilizatorul programului. * Cautarea este exacta.

* Cautarea articolelor se realizeaza intr‑un fisier neindexat.

* Se iese din program daca nu se precizeaza nici un nume.

*Daca nu exista ingeristrarile cautate se afiseaza un mesaj de * eroare

* Daca acestea exista sint afisate in ecrane succesive.

set talk off

set scoreboard off

set status off

set exact on

use angajati

do while .t.

clear

vn=space(20)

@ 1,1,24,79 box ''

@ 3,20 say ' Cautarea unor inregistrari'

@ 5,7 say 'Specificati'

@ 6,10 say 'numele : ' get vn

read

if vn=space(20)

use

clear

return

endif

vn=rtrim(vn)

locate for nume=vn

if .not.found()

@15,5 say 'Nu exista astfel de date in baza de date !!!'

wait ''

loop

endif

do while .not.eof()

@ 5,5,21,74 box'********'

@ 7,15 say 'Inregistrarea cautata :'

@10,10 say 'Marca : '+str(marca,4)

@11,10 say 'Numele : '+nume

@12,10 say 'Functia : '+functie

@13,10 say 'Salariul : '+str(salar,8,2)

@14,10 say 'Departamentul : '+str(sectie,2)

wait ''

continue

enddo

enddo

** ** ********** CAUT2.PRG ** ** ****

* Se cauta angajatii care au acelasi nume cu cel specificat * de utilizatorul programului * Cautarea este inexacta, adica se pot specifica numai unul sau

* mai multe caractere care trebuie sa se regaseasca la inceputul

* numelui angajatului

* Cautarea articolelor se realizeaza intr‑un fisier indexat

* Se iese din program daca nu se precizeaza nici un nume.

*Daca nu exista ingeristrarile cautate se afiseaza un mesaj de * eroare

* Daca acestea exista sint afisate in ecrane succesive.

set talk off

set scoreboard off

set status off

set exact off

use angajati index inume

do while .t.

clear

vn=space(20)

@ 1,1,24,79 box ''

@ 3,20 say ' Cautarea unor inregistrari'

@ 5,7 say 'Specificati'

@ 6,10 say 'numele : ' get vn

read

if vn=space(20)

use

clear

return

endif

vn=rtrim(vn)

seek vn

if .not.found()

@15,5 say 'Nu exista astfel de date in baza de date !!!'

wait ''

loop

endif

i=len(vn)

do while .not.eof().and.substr(nume,1,i)=vn

@ 5,5,21,74 box'********'

@ 7,15 say 'Inregistrarea cautata :'

@10,10 say 'Marca : '+str(marca,4)

@11,10 say 'Numele : '+nume

@12,10 say 'Functia : '+functie

@13,10 say 'Salariul : '+str(salar,8,2)

@14,10 say 'Departamentul : '+str(sectie,2)

wait ''

skip

enddo

enddo

** ** ******** CAUT3.PRG ** ** ********

* Se pot efectua cautari in functie de marca, nume, functie, * salar si sectie * Dupa ce utilizatorul programului si‑a ales criteriul de * cautare se specifica valoarea cautata * Cautarea este exacta

* Cautarea articolelor se realizeaza in fisiere indexate create * in functie de criteriul de cautare

* Se iese din program daca se selecteaza Abandon sau ESC.

*Daca nu exista ingeristrarile cautate se afiseaza un mesaj de * eroare

* Daca acestea exista sint afisate in ecrane succesive.

set talk off

set scoreboard off

set status off

set safety off

set exact on

use angajati

do while .t.

clear

@ 1,1,24,79 box ''

@ 3,20 say ' Cautarea unor inregistrari'

@ 5,10 say ' Dupa : '

@ 7,18 prompt ' Marca '

@ 8,18 prompt ' Nume '

@ 9,18 prompt ' Functie '

@10,18 prompt ' Salar '

@11,18 prompt ' Sectie '

@13,18 prompt ' Abandon '

menu to a

do case

case a=1

va=0

v_cimp='marca'

@17,5 say 'Specificati marca :' get va picture '9999'

case a=2

va=space(20)

v_cimp='nume'

@17,5 say 'Specificati numele :' get va

case a=3

va=space(10)

v_cimp='functie'

@17,5 say 'Specificati functia :' get va

case a=4

va=0

v_cimp='salar'

@17,5 say 'Specificati salariul :' get va picture '99999.99'

case a=5

va=0

v_cimp='sectie'

@17,5 say 'Specificati sectia :' get va picture'99'

case a=6.or.a=0

use

return

endcase

read

index on &v_cimp to &v_cimp

seek va

if .not.found()

@19,5 say 'Nu aveti date de acest tip in baza de date !!!'

wait ''

loop

endif

do while .not.eof().and.&v_cimp=va

@ 5,5,21,74 box '********'

@ 7,15 say 'Inregistrare cautata :'

@10,14 say 'Marca : '+str(marca,4)

@11,14 say 'Numele : '+nume

@12,14 say 'Functia : '+functie

@13,14 say 'Salariul : '+str(salar,8,2)

@14,14 say 'Departamentul : '+str(sectie,2)

wait ''

skip

enddo

enddo

4. Sarcini ale studentilor:

1. Se vor testa pe rind toate comenzile de pozitionare a pointerului de inregistrare;

2. Se vor testa comenzile ce permit cautatea articolelor intr‑o baza de date neindexata sau indexata.

3. Sa se scrie un program care sa va permita sa obtineti informatii complete despre oricare dintre angajatii memorati in baza de date ce contine fisierele baza de date ANGAJATI.DBF si PERSONAL.DBF. Regasirea articolelor se va putea face atit dupa marca, nume, functie, salar, sectie cit si dupa adresa, data nasterii, stare civila si numar de copii.

Universitatea Sibiu

Facultatea de Inginerie

Catedra de Calculatoare

Lucrare de laborator la disciplina

Proiectarea Bazelor de Date

Tema lucrarii: Comenzi folosite in domeniul bazelor de date pentru afisarea informatiilor memorate. Modalitati de folosire a acestor comenzi in scrierea unor programe care isi propun afisarea informatiilor memorate in baze de date.

1. Comenzi folosite pentru afisarea datelor memorate in fisiere

Urmatoarele comenzi va permit afisarea datelor dintr‑o baza de date pe ecranul calculatorului sau la imprimanta. Pentru afisare puteti folosi un format definit de dumneavoastra sau un format predefinit pus la dispozitie de limbaj.

Formatele predefinite poarta denumirea de etichete (label) si rapoarte (report).

Pentru crearea formatelor proprii de afisare a informatiilor pe ecran sau la imprimanta se folosesc comenzile:

@ <rind,coloana> [SAY <expr>[PICTURE<clauza>]

[FUNCTION<clauza>]]

Afiseaza datele pe ecran sau la imprimanta in formatul ales de utilizator. Se va afisa expresia ce urmeaza dupa SAY, in formatul precizat de clauza PICTURE si/sau FUNCTION, incepind din punctul de coordonate (rind,coloana). Codurile FUNCTION pot fi incluse intr‑o clauza PICTURE. In acest caz, clauza PICTURE trebuie sa inceapa cu @. Codurile de formatare care pot fi folosite cu clauza FUNCTION sint:

B‑aliniaza la stinga datele numerice in regiunea de afisare;

C ‑ afiseaza CR (credit) dupa un numar pozitiv;

D ‑ afiseaza data in formatul curent SET DATE;

E ‑ afiseaza data in format britanic;

X ‑ afiseaza DB (debit) dupa numere negative;

Z ‑ afiseaza zerourile ca spatii;

! ‑ converteste caracterele alfabetice in majuscule;

( ‑ incadreaza numerele negative cu paranteze;

$ ‑ afiseaza date in formatul monetar.

Codurile clauzei PICTURE sint:

X ‑ permite orice caracter;

Y ‑ permite numai valorile logice Y, y, N, n;

! ‑ converteste caracterele minuscule in majuscule;

$ ‑ afiseaza simbolul monedei specificat de SET CURRENCY;

* ‑ asteriscurile sint afisate in fata valorilor numerice;

. ‑ specifica pozitia virgulei zecimale;

, ‑ specifica pozitia virgulei zecimale.

Pentru precizarea rindului si a coloanei se pot folosi si functiile:

ROW() ‑ returneaza numarul rindului curent de pe ecran(cel pe care se afla cursorul)

COL() ‑ returneaza numarul coloanei curente de pe ecran

PROW() ‑ returneaza numarul rindului curent de pe pagina

PCOL() ‑ returneaza numarul coloanei curente de pe pagina

@ <rind1,coloana1> TO <rind2,coloana2> [DOUBLE]

Comanda traseaza linii si chenare simple sau duble. <rind1,coloana1> indica coltul din stinga sus al chenarului, iar <rind2,coloana2> coltul din dreapta jos. Pentru trasarea de linii se pastreaza acelasi rind sau aceeasi coloana in functie de directia liniei. Pentru trasare de linii si chenare cu linie dubla se foloseste optiunea DOUBLE.

@ <rind1,coloana1> [CLEAR TO <rind2,coloana2>]

Comanda efectueaza stergerea unei portiuni a ecranului. <rind1,coloana1> reprezinta coordonatele coltului stinga sus al zonei ce va fi stearsa, iar <rind2,coloana2> coordonatele coltului dreapta jos. Daca omiteti <rind2,coloana2> va fi stearsa o zona cuprinsa intre <rind1,coloana1> si coltul inferior dreapta al ecranului. CLEAR sterge tot ecranul. Are efect numai in mod ecran.

@ <rind1,coloana1,rind2,coloana2> BOX <exprC>

Comanda deseneaza un dreptunghi pe ecran si va permite sa specificati atit caracterele care vor defini colturile si liniile dreptunghiului, cit si caracterul de umplere al acestuia. <exprC> trebuie sa contina 9 caractere, care au urmatoarea semnificatie:

1 ‑ colt stinga sus;

2 ‑ linia orizontala de sus;

3 ‑ colt dreapta sus;

4 ‑ linia verticala dreapta;

5 ‑ colt dreapta jos;

6 ‑ linia orizontala jos;

7 ‑ colt stinga jos;

8 ‑ linia verticala stinga;

9 ‑ caracter de umplere.

?/?? <lista expresii>

Comanda evalueaza si afiseaza expresii. Un singur semn de intrebare determina pozitionarea cursorului la inceputul rindului urmator inainte de afisarea listei de expresii. Doua semne de intrebare determina afisarea expresiilor din lista fara un salt la inceputul unui nou rind.

Alte comenzi care va permit afisarea datelor dintr‑o baza de date sint:

DISPLAY [<scop>] [<lista expresii>] [WHILE<conditie>]

[FOR<conditie>] [OFF] [TO PRINT]

Comanda DISPLAY este utilizata pentru a vizualiza continutul fisierelor baza de date. Se afiseaza numai inregistrarea curenta in cazul in care nu se specifica altfel prin scop sau clauzele WHILE si FOR. Sint afisate toate cimpurile daca nu este specificat altfel. Numarul inregistrarii nu se mai afiseaza daca se foloseste optiunea OFF. Afisarea se poate face la imprimanta cu optiunea TO PRINT.

Comanda DISPLAY dispune si de urmatoarele forme :

DISPLAY HISTORY [ LAST <expresie>] [TO PRINT]

Aceasta comanda furnizeaza o lista a ultimelor comenzi executate, memorate in bufferul HISTORY.

DISPLAY MEMORY [TO PRINT]

Indica numele, tipul, dimensiunea si starea fiecarei variabile de memorie active. Este aratat, de asemenea, numarul variabilelor de memorie active precum si numarul de variabile de memorie ce mai pot fi activate, dimensiunea memoriei folosite si dimensiunea memoriei disponibile inca pentru astfel de variabile.

DISPLAY STATUS [TO PRINT]

Comanda furnizeaza informatii despre sesiunea curenta. Pentru fiecare fisier baza de date se afiseaza urmatoarele informatii: numele bazei de date, numarul zonei de lucru, numele alias al zonei, legaturile bazei de date, numele fisierelor index deschise, cheia de indexare pentru fiecare index deschis, numele fisierelor baza de date‑memo deschise, calea de cautare curenta a fisierului, unitatea de disc implicita, perifericul de iesire, setarile curente ale principalelor comenzi (ON/OFF), setarea stabilita pentru DEVICE SCREEN sau PRINT si asignarea tastelor functionale.

DISPLAY STRUCTURE [TO PRINT]

Comanda furnizeaza urmatoarele informatii despre baza de date activa: numele fisierului, numarul inregistrarilor de date, data la care au fost efectuate ultimile modificari, definitia fiecarui cimp si numarul de octeti ai inregistrarii.

LIST [OFF] <scop> [<lista expresii>] [WHILE<conditie>]

[FOR<conditie>] [TO PRINT]

Aceasta comanda este folosita pentru a vizualiza continutul unui fisier baza de date. Daca nu exista limitari precizate prin scop sau clauzele WHILE si FOR sint afisate toate inregistrarile din baza de date. Clauza OFF inhiba afisarea numarului de inregistrare. LIST afiseaza implicit toate inregistrarile bazei de date fiind similara cu DISPLAY ALL, fara a se opri insa dupa afisarea fiecarui ecran.

LIST HISTORY [LAST <expresie numerica>] [TO PRINT]

LIST MEMORY [TO PRINT]

LIST STATUS [TO PRINT]

LIST STRUCTURE [TO PRINT]

Acestea sint comenzi similare cu cele prezentate la comanda DISPLAY.

Afisarea datelor la imprimanta trebuie precedata de comanda:

SET PRINT ON ‑ care activeaza imprimanta.

In cazul folosirii comenzii @ pentru afisare trebuie sa utilizati si comanda:

SET DEVICE TO PRINT ‑ care transmite expresia de dupa SAY catre imprimanta

Comanda EJECT determina salt la pagina noua.

Pentru a redirecta expresiile catre ecran trebuie folosita comanda :

SET DEVICE TO SCREEN

Pentru a dezactiva imprimanta se foloseste comanda:

SET PRINT OFF

Comanda SET CONSOLE ON/OFF activeaza sau dezactiveaza directionarea iesirii spre ecran. Valoarea implicita este ON.

2. Modalitati de folosire a comenzilor in programe:

In continuare sint prezentate doua programe care va permit sa afisati date din baza de date ANGAJATI.DBF :

** ** ******** LIST1.PRG ** ** ******

* se afiseaza pe ecran angajatii care lucreaza in acelasi * departament

* numarul departamentului se stabileste de catre utilizator

* la o apelare a programului se pot obtine informatii cu privire * la angajatii diferitelor departamente

* se iese din program pentru departament 0

set talk off

set scoreboard off

set status off

set exact off

set safety off

use angajati

index on str(dept,2)+nume to i1

do while .t.

clear

vdept=0

@ 1,1,24,79 box ''

@ 3,20 say ' Afisarea unor inregistrari'

@ 5,7 say 'Specificati'

@ 6,10 say 'departamentul : ' get vdept picture '99'

read

if vdept=0

use

clear

return

endif

vdept1=str(vdept,2)

seek vdept1

if .not.found()

@15,5 say 'Nu exista astfel de date in baza de date !!!'

wait ''

loop

endif

i=8

k=1

l1=replicate('',7)

l2=replicate('',61)

do while .not.eof().and.dept=vdept

clear

@1,2 say date()

@3,10 say 'Angajatii departamentului '+vdept1

@5,1 say ''+l1+''+l1+''+l2+''

@6,1 say 'Nr.crt. Marca '+space(5)+'Numele si prenumele'

@6,79 say ''

@7,1 say ''+l1+''+l1+''+l2+''

do while .not.eof().and.dept=vdept.and.i<24

@ i,1 say ''+str(k,7)+' '+str(marca,5)+'  '+nume

@i,79 say ''

i=i+1

k=k+1

skip

enddo

@i,1 say ''+l1+''+l1+''+l2+''

wait ''

i=8

enddo

enddo

** ** ******** LIST2.PRG ** ** ******

* se afiseaza la imprimanta angajatii care lucreaza in acelasi * departament

* numarul departamentului se stabileste de catre utilizator

* la o apelare a programului se pot obtine informatii cu privire * la angajatii diferitelor departamente

* se iese din program pentru departament 0

set talk off

set scoreboard off

set status off

set exact off

set safety off

use angajati

index on str(dept,2)+nume to i1

do while .t.

clear

vdept=0

@ 1,1,24,79 box ''

@ 3,20 say ' Afisarea unor inregistrari'

@ 5,7 say 'Specificati'

@ 6,10 say 'departamentul : ' get vdept picture '99'

read

if vdept=0

use

clear

return

endif

vdept1=str(vdept,2)

seek vdept1

if .not.found()

@15,5 say 'Nu exista astfel de date in baza de date !!!'

wait ''

loop

endif

set print on

set device to print

i=8

k=1

l1=replicate('',7)

l2=replicate('',61)

do while .not.eof().and.dept=vdept

eject

@1,2 say date()

@3,10 say 'Angajatii departamentului '+vdept1

@5,1 say ''+l1+''+l1+''+l2+''

@6,1 say 'Nr.crt. Marca '+space(5)+'Numele si prenumele'

@6,79 say ''

@7,1 say ''+l1+''+l1+''+l2+''

do while .not.eof().and.dept=vdept.and.i<66

@ i,1 say ''+str(k,7)+' '+str(marca,5)+'  '+nume

@i,79 say ''

i=i+1

k=k+1

skip

enddo

@i,1 say ''+l1+''+l1+''+l2+''

wait ''

i=8

enddo

set print off

set device to screen

enddo

3. Sarcini ale studentilor :

1. Se vor testa comenzile de afisare pe ecran,scriind un mic program care sa afiseze texte, linii, dreptunghiuri pe ecran si care sa va permita sa stergeti informatiile din anumite zone ale ecranului, care sa fie ulterior rescrise.

2. Se vor testa comenzile de afisare la imprimanta.

3. Se va scrie un program care sa va permita afisarea datelor din bazele de date ANGAJATI.DBF si PERSONAL.DBF in urmatoarele conditii:

‑ listarea pe ecran sau la imprimanta, la alegerea utilizatorului programului, a informatiilor despre marca, numele si adresa angajatilor ordonati alfabetic dupa nume.

Universitatea din Sibiu

Facultatea de Inginerie

Catedra de Calculatoare

Lucrare de laborator la disciplina

Proiectarea Bazelor de Date

Tema lucrarii: Comenzi folosite la crearea unor structuri de programare de tip secvential, alternativ, repetitiv. Modalitati de folosire a acestor comenzi in cadrul unor programe.

1. Comenzi folosite la crearea diferitelor tipuri de structuri de programare.

Structura secventiala de programare presupune parcurgerea comenzilor unui program in ordinea fireasca in care ele apar in cadrul programului. Liniile de comanda sint executate una dupa alta o singura data fiecare, fara a fi omisa vreuna dintre ele sau fara a se executa un numar de linii de comanda de mai multe ori in cadrul unei singure lansari in executie a programului. Aceasta este cea mai simpla structura de programare ce poate fi folosita.

Structura alternativa de programare presupune executia unora dintre liniile de comanda sau a altora in functie de rezultatul unui test care este evaluat. Comenzile folosite la crearea unor structuri de acest tip sint:

DO CASE

CASE <conditie1>

<comenzi>

[CASE <conditie2>

<comenzi>]

[OTHERWISE

<comenzi>]

ENDCASE

Este o comanda de programare structurata ce selecteaza o singura actiune din mai multe posibile. CASE <conditie> initializeaza evaluarea conditiei. Conditia este o expresie logica. Daca conditia este adevarata se executa setul de comenzi ce-i urmeaza pina la urmatorul CASE, dupa care se executa comanda ce urmeaza dupa ENDCASE. Daca nici una dintre conditiile evaluate nu este adevarata se executa comenzile de dupa OTHERWISE, in cazul in care aceasta optiune exista, sau comenzile ce urmeaza dupa ENDCASE, daca optiunea OTHERWISE lipseste.

IF <conditie>

<comenzi>

[ELSE

<comenzi>]

ENDIF

IF este o comanda de programare structurata ce permite executarea comenzilor in mod conditionat. Orice comanda structurata din interiorul acestei comenzi trebuie sa fie complet imbricata. Conditia este o expresie logica. Daca conditia este evaluata ca adevarata, sint executate toate comenzile ce urmeaza dupa IF pina se intilneste optiunea ELSE sau ENDIF (pentru cazul cind ELSE lipseste). Daca conditia este falsa se executa comenzile dintre ELSE si ENDIF, sau, in cazul in care ELSE lipseste, se executa comenzile ce urmeaza dupa ENDIF.

IIF(<conditie>,<expresie1>,<expresie2>)

Functia IIF, cunoscuta si sub denumirea de IF imediat, evalueaza conditia si returneaza ca raspuns rezultatul uneia dintre expresii. Conditia trebuie sa fie o conditie logica. Daca conditia este evaluata ca adevarata este executata expresia 1, daca conditia este falsa se executa expresia 2. Functia este indicata a se folosi in locul comenzii IFENDIF in cazul in care este necesara executia unor expresii simple, deoarece este mai rapida.

Structura de programarea repetitiva presupune executarea unui numar de linii de comanda din cadrul programului de mai multe ori, atita timp cit o anumita conditie evaluata este gasita adevarata. Comenzile folosite la crearea unor astfel de structuri de programare sint urmatoarele:

DO WHILE <conditie>

<comenzi>

[LOOP]

<comenzi>

[EXIT]

<comenzi>

ENDDO

Este o comanda de programare structurata, ce permite ca toate comenzile cuprinse intre DO WHILE si ENDDO -ul asociat sa fie executate in mod repetat. Conditia este o conditie logica. Atita timp cit conditia specificata este evaluata ca adevarata, comenzile din cadrul ciclului sint executate. Evaluarea conditiei are loc inainte de a se intra in ciclu. Daca conditia este falsa se executa comenzile ce urmeaza dupa ENDDO. Orice comanda structurata din interiorul comenzii DO WHILEENDDO trebuie sa fie complet imbricata. Sint permise comenzi DO WHILE imbricate. Comanda LOOP poate fi prezenta in interiorul unei bucle de comenzi DO WHILE. LOOP intoarce controlul la inceputul structurii DO WHILEENDDO neconditionat. Conditia de intrare in bucla de comenzi este reevaluata. LOOP evita executia unor comenzi din corpul comenzii DO WHILE. Comanda trebuie folosita,cu precadere, in interiorul unei constructii IFENDIF.

Comanda EXIT poate fi si ea prezenta in interiorul comenzii DO WHILEENDDO. EXIT transfera controlul, neconditionat, din interiorul buclei DO WHILEENDDO la prima comanda de dupa ENDDO. Conditia de intrare in bucla DO WHILE nu mai este reevaluata. Comanda trebuie folosita, cu precadere, in interiorul unei constructii IFENDIF.

FOR <var_mem>=<exprN1> TO <exprN2> [STEP <exprN3>]

<comenzi>

[EXIT]

<comenzi>

[LOOP]

<comenzi>

ENDFOR/NEXT

Comanda FOR permite executarea unui set de comenzi dintr-o bucla de un numar specificat de dati. O variabila de memorie sau un element al unui tablou este utilizat pentru a preciza elementul ce va contoriza numarul de executii. Valoarea initiala a contorului este data de expresia numerica 1. Comenzile de dupa FOR si pina la ENDFOR sau NEXT sint executate, dupa care contorul este incrementat cu valoarea specificata de expresia numerica 3 in cazul in care exista optiunea STEP, sau cu 1 altfel, dupa care noua valoare a contorului este comparata cu expresia numerica 2. Daca contorul este mai mic sau egal decit expresia numerica 2 bucla de comenzi este executata din nou. Daca contorul este mai mare decit expresia numerica 2 se executa prima comanda de dupa ENDFOR. Daca valoarea lui expN3 este negativa si valoarea initiala a lui expN1 este mai mare decit expN2, atunci contorul este decrementat la fiecare trecere prin bucla. Comenzile EXIT si LOOP au acelasi efect ca si in cazul comenzii DO WHILEENDDO.

SCAN [NOOPTIMIZE][<scop>][FOR<expL1>][WHILE<expL2>]

<comenzi>

[LOOP]

<comenzi>

[EXIT]

<comenzi>

ENDSCAN

Comanda SCAN muta pointerul de inregistrare in fisierul baza de date curent si executa blocul de comenzi specificat asupra fiecarei inregistrari care satisface conditiile logice indicate prin scop, FOR sau WHILE. SCAN avanseaza automat pointerul de inregistrare la urmatoarea inregistrare care satisface conditia si executa comenzile blocului asupra ei. Comenzile EXIT si LOOP au acelasi efect ca si in cazul comenzii DO WHILEENDDO. Optiunea NOOPTIMIZE dezactiveaza optimizatorul sistemului in regasirea inregistrarilor ce vor fi prelucrate.

2. Modalitati de folosire a acestor comenzi in programe.

** ** ******PROG1.PRG ** ** ***********

* Programul va permite selectarea unor optiuni dintr-un meniu.

* Daca ati introdus o optiune invalida a meniului, aveti * posibilitatea unei noi selectii.

* In functie de optiunea selectata puteti prelucra intr-un anumit * mod baza de date ANGAJATI.DBF.

*program meniu de selectie

set talk off

set scoreboard off

set status off

use angajati

do while .t.

aleg=' '

clear

@5,5 say 'A - Adaugare inregistrari '

@7,5 say 'M - Modificare inregistrari'

@9,5 say 'S - Sfirsit program '

@15,5 say 'Selectati' get aleg

read

if .not.aleg$'AaMmSs'

loop

endif

do case

case aleg$'Aa'

append

case aleg$'Mm'

edit

case aleg$'Ss'

exit

endcase

enddo

use

*sfirsit program

** ** *******PROG2.PRG ** ** ** **

* Se vizualizeaza cite 5 inregistrari din baza de date

* ANGAJATI.DBF.

* Procesul de vizualizare continua atita timp cit utilizatorul

* programului nu tasteaza x.

*program vizualizare inregistrari

set talk off

set scoreboard off

set status off

use angajati

do while .not.eof()

clear

list off next 5 marca,nume,functie,salar

?

accept 'Apasati tasta x/X pentru a opri afisarea' to vt

if vt$'Xx'

exit

endif

skip

enddo

use

*sfirsit program

** ** *******PROG3.PRG ** ** ** **

* Se vizualizeaza inregistrarile, cu numar de inregistrare par,

* din baza de date ANGAJATI.DBF.

* Daca sectia angajatului nu este cunoscuta se afiseaza mesajul

* 'Sectie necunoscuta !!!'

set talk off

set scoreboard off

set status off

use angajati

store 2 to i

store recno() to j

store 2 to k

for contor=i to j step k

goto record nr

display off marca,upper(nume),upper(functie),' '

??iif(empty(sectie),'Sectie necunoscuta !!!',sectie)

endfor

use

3. Sarcini ale studentilor

1. Sa se scrie un program avind o structura secventiala de programare.

2. Sa se scrie un program contind mai multe structuri alternative si repetitive de programare, in care sa folositi comenzile DO CASEENDCASE, IFENFIF, DO WHILEENDDO, FORENDFOR, SCANENDSCAN si functia IIF().

Universitatea din Sibiu

Facultatea de Inginerie

Catedra de Calculatoare

Lucrare de laborator la disciplina

Proiectarea Bazelor de Date

Tema lucrarii: Comenzi folosite pentru modularizarea aplicatiilor. Modalitati de folosire a acestor comenzi in cadrul unor programe.

1. Comenzi folosite pentru modularizarea aplicatiilor.

Principala trasatura a problemelor practice o constituie complexitatea lor, sub aspect structural, functional si relational. De aceea, cunoasterea si solutionarea lor cu ajutorul calculatorului reclama un efort de analiza, proiectare, programare si implementare.

Se impune inca din faza de proiectare, descompunerea problemei in parti componente si abordarea modulara pentru a contura mai clar principalele caracteristici ale fiecarei parti componente, legaturile dintre ele si ierarhizarea lor fata de ansamblu.

1.1. Definirea procedurilor

Procedura reprezinta o secventa logica de instructiuni, apelabila printr-un nume dintr-o alta procedura externa si realizeaza una sau mai multe functii. Ea returneaza controlul executiei procedurii apelante, la urmatoarea instructiune dupa cea da apel. Controlul este returnat odata cu eventualele rezultate de natura locala sau cu un caracter global.

unui test care este evaluat. Comenzile folosite pentru definirea unei proceduri sint:

PROCEDURE <nume_procedura>

[PARAMETERS <lista_parametri>]

<comenzi>

RETURN

Comanda PROCEDURE marcheaza inceputul fizic al unei anumite proceduri, cea cu numele specificat de <nume_procedura>. Numele procedurii este obligatoriu, avind o lungime maxima de 8 caractere, primul caracter sa fie obligatoriu o litera sau caracterul'_', nu se admit caractere speciale.

Partea de parametri nu este obligatorie. Rolul acesteia este de a atribui parametrilor transmisi dintr-un program, cel apelant, numele unor variabile de memorie locale, ce pot fi folosite in corpul procedurii pentru realizarea unor prelucrari. Transmiterea parametrilor intre programul apelant si procedura se realizeaza in mod implicit prin adresa. Daca se doreste transferul prin valoare este necesara introducerea parametrilor intre paranteze. Daca valoarea unui parametru este modificata in cadrul procedurii, el va fi returnat programului apelant insotit de noua sa valoare. Avind in vedere rolul pe care pot sa-l indeplineasca parametrii din lista, in raport cu executia grupului de instructiuni din procedura, parametrii pot fi de intrare si de iesire. Dupa efectul lor in raport cu procedura executata sau cea apelanta, parametrii pot fi locali si globali. Utilizatorul poate afla numarul de parametri transferati catre ultima procedura apelata prin functia PARAMETERS().

Corpul procedurii este alcatuit dintr-o succesiune de comenzi care realizeaza una sau mai multe prelucrari.

Comanda RETURN marcheaza sfirsitul fizic al unei proceduri si transfera controlul executiei catre procedura apelanta.

1.2. Comunicatia intre proceduri

Comunicatia intre proceduri este activata prin comanda urmatoare:

DO <nume_fisier>/<nume_procedura>[WITH <lista_parametri>]

[IN <nume_fisier>]

Comanda permite lansarea in executie a unui program avind numele specificat prin <nume_fisier>, sau a unei proceduri cu numele <nume_procedura>. Clauza WITH permite specificarea unei liste de parametri care sint transmisi catre procedura apelata prin adresa. Daca se doreste transmiterea parametrilor prin valoare, elementele listei sunt incluse intre paranteze. Clauza IN permite executarea procedurii dintr-un program specificat.

In procedura apelata pot exista alte instructiuni DO care vor transfera controlul executiei catre alte proceduri. Aceste apeluri in cascada sint cunoscute si sub numele de apeluri imbricate. Pot fi imbricate maxim 256 de apeluri. Din interiorul unei proceduri nu se pot face apeluri la ea insasi (nu permite recursivitatea). Din interiorul unei proceduri apelate nu poate fi chemata procedura apelanta.

1.3. Parametrizarea procedurilor

Lista de parametri a comenzilor PARAMETER si DO poate contine variabile, tablouri, constante sau functii. In lista de parametri pot figura parametri de intrare si de iesire, cu efecte locale sau globale. De obicei, parametrii de intrare sint definiti si initializati cu date in procedura apelanta influentind executia procedurii apelate si conducind la obtinerea unor rezultate ce ulterior pot fi atribuite parametrilor de iesire. Este bine de retinut ca dupa revenirea in programul apelant continutul parametrilor de intrare ramine neschimbat.

Parametrii de iesire, pot fi definiti in procerura apelanta si contin rezultate obtinute in urma executiei procedurii apelate.

Parametrii locali sint definiti in procedura apelata, continutul lor fiind recunoscut numai in procedura in care au fost definiti. Parametri locali se declara prin comanda:

PRIVATE <lista_var_mem>

PRIVATE ALL [LIKE/EXCEPT <sablon>]

Ambele forme permit declararea unor variabile sau tablouri de memorie locale cu nume identice cu cele ale unor variabile sau tablouri deja existente. Prin aceste comenzi nu se si creaza respectivele variabile.

Parametrii globali sint definiti in procedura apelanta continutul lor fiind recunoscut atit in procedura apelanta cit si in toate procedurile apelate 'in aval'. Comanda de definire a parametrilor globali este:

PUBLIC <lista _var_mem>

PUBLIC [ARRAY] <tablou1>(<expN1>[,<expN2>])[,<tablou2>

(<expN3>[,<expN4>])]

Comanda PUBLIC odata cu declararea variabilelor respective le si creaza.

1.4. Definirea functiilor

Comanda care permite definirea unei functii este urmatoarea:

FUNCTION <nume_functie>

[PARAMETERS <lista_parametri>]

<comenzi>

RETURN [<valoare>]

Precizarile facute in legatura cu numele, clauza PARAMETERS si lista parametrilor transferati sint valabile si pentru functii. Functia returneaza o valoare. Aceasta poate fi logica sau de tipul precizat prin <valoare>. Apelul unei functii se face prin numele acesteia urmat intre paranteze deschise de parametrii transferati nume_functie(lista_parametri). Parametrii din lista sint separati prin virgula.

Procedurile si functiile unui program se introduc, de regula, dupa ultima instructiune a programului, in acelasi fisier cu acesta. Acestea se pot introduce si in fisiere separate care vor fi asociate programului apelant prin comanda:

SET PROCEDURE TO [<nume_fisier>]

Aceasta comanda asociaza la programul curent, cel in executie, fisierul <nume_fisier> (cu extensia implicita .PRG), unde se vor cauta procedurile care nu se gasesc in fisierul programului apelant. Comanda SET PROCEDURE TO, fara alti parametri, determina inchiderea fisierului de proceduri curent asociat programului in executie.

Comanda CLOSE PROCEDURE, de asemenea, inchide fisierul de proceduri curent.

2. Modalitati de folosire a acestor comenzi in programe.

** ** *******PROG1.PRG ** ** ** **

* Se preiau de la tastatura valorile A si B

* Se selecteaza operatia dorita (adunare, scadere, produs).

* Se apeleaza procedura in care se efectueaza calculele.

* Se afiseaza rezultatul.

* Se iese din program apasind ESCAPE.

*programul apelant

set talk off

do while .t.

clear

store 0 to val1, val2, rezultat

@3,5 say 'Specificati valorile:'

@5,10 say ' A :' get val1

@6,10 say ' B :' get val2

read

@10,12 prompt 'Adunare'

@11,12 prompt 'Scadere'

@12,12 prompt 'Produs '

menu to aleg

do calcul with aleg,val1,val2,rezultat

if rezultat>0

@15,10 say 'Rezultatul este '+str(rezultat)

wait ''

else

exit

endif

enddo

*procedura apelata

procedure calcul

parameters t,a,b,c

if t=1

c=a+b

else

if t=2

c=a-b

else

c=a*b

endif

endif

return

*sfirsit program

** ** *******PROG2.PRG ** ** ** **

* Se preiau de la tastatura valorile A, B, C si D.

* Se apeleaza functia care efectueaza calculele.

* Se afiseaza rezultatul.

*programul apelant

set talk off

r='D'

do while upper(r)='D'

clear

store 0 to val1, val2, val3, val4

@3,5 say 'Specificati valorile pentru calculul expresiei:'

@4,15 say '(A*B)+(C*D)'

@7,10 say ' A :' get val1

@8,10 say ' B :' get val2

@9,10 say ' C :' get val3

@10,10 say ' D :' get val4

read

rezultat=calcul(val1,val2,val3,val4)

@15,10 say 'Rezultatul este '+str(rezultat)

wait 'Continuati [D/N] ?' to r

enddo

*functia apelata

function calcul

parameters a,b,c,d

r=(a*b)+(c*d)

return r

*sfirsit program

** ** ******PROG3.PRG ** ** ***********

* Programul va permite selectarea unor optiuni dintr-un meniu.

* Daca ati introdus o optiune invalida a meniului, aveti * posibilitatea unei noi selectii.

* In functie de optiunea selectata puteti prelucra intr-un anumit * mod baza de date ANGAJATI.DBF. Prelucrarile se executa in

* proceduri distincte aflate in fisierul de proceduri PROC.PRG

*program meniu de selectie

set talk off

set scoreboard off

set status off

use angajati

set procedure to proc

do while .t.

aleg=' '

clear

@5,5 say 'A - Adaugare inregistrari '

@7,5 say 'M - Modificare inregistrari'

@9,5 say 'S - Sfirsit program '

@15,5 say 'Selectati' get aleg

read

if .not.aleg$'AaMmSs'

loop

endif

do case

case aleg$'Aa'

do adaug

case aleg$'Mm'

do modific

case aleg$'Ss'

exit

endcase

enddo

set procedure to

use

*sfirsit program

*fisier cu proceduri

*procedura de adaugare

procedure adaug

set index to imarca

do while .t.

clear

vm=0

vn=space(20)

vf=space(10)

vs=0

vd=0

@ 1,1,24,79 box ''+chr(176)

@ 3,10 say ' Adaugarea unei noi inregistrari'

@ 5,5 say 'Specificati :'

@ 6,7 say 'marca : ' get vm picture '9999'

read

if vm=0

clear

return

endif

seek vm

if found()

@15,5 say 'Aceasta marca exista deja !!!'

wait ''

loop

endif

@ 7,7 say 'numele : ' get vn

@ 8,7 say 'functia : ' get vf

@ 9,7 say 'salariul : ' get vs picture '99999.99'

@10,7 say 'departamentul : ' get vd picture '99'

read

rasp='d'

wait 'date introduse corect d/n ?' to rasp

if rasp$'Dd'

append blank

replace marca with vm,nume with vn,functie with vf,salar with vs,sectie with vd

else

loop

endif

enddo

return

*sfirsit procedura adaugare

*procedura de modificare

procedure modific

set index to imarca

do while .t.

clear

vm=0

@ 1,1,24,79 box ''+chr(176)

@ 3,10 say ' Modificarea unor inregistrari'

@ 5,5 say 'Specificati'

@ 6,7 say 'marca : ' get vm picture '9999'

read

if vm=0

clear

return

endif

seek vm

if .not.found()

@15,5 say 'Angajatul cu aceasta MARCA nu exista !!!'

wait ''

loop

endif

vn=nume

vf=functie

vs=salar

vd=sectie

@ 7,7 say 'numele : ' get vn

@ 8,7 say 'functia : ' get vf

@ 9,7 say 'salariul : ' get vs picture '99999.99'

@10,7 say 'departamentul : ' get vd picture '99'

read

rasp='d'

wait 'date introduse corect d/n ?' to rasp

if rasp$'Dd'

replace marca with vm,nume with vn,functie with vf,salar with vs,sectie with vd

else

loop

endif

enddo

return

*sfirsit procedura modificare

3. Sarcini ale studentilor

1. Sa se scrie un program care sa apeleze o functie si o procedura aflate in acelasi program, apelul acestora sa se faca din mai multe puncte ale programului, transmitindu-se valori diferite ale parametrilor.

2. Sa se scrie un program care sa apeleze proceduri existente intr-un fisier de proceduri.





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate