Sunteți pe pagina 1din 77

MODELE DE FIŞIERE ACCESS PENTRU ANTRENARE

1 GESTIUNE PRODUSE FINITE .............................................................................................................. 2


1.1 STRUCTURA BAZEI DE DATE ................................................................................................................2
1.2 SCHEMA BAZEI DE DATE .....................................................................................................................2
1.3 RESTRICŢII ..........................................................................................................................................3
1.3.1 Restrictii la nivel de atribut .........................................................................................................3
1.3.2 Restrictii la nivel de inregistrare .................................................................................................3
1.4 ALTE „ACCESORII” ..............................................................................................................................4
1.4.1 Format .........................................................................................................................................4
1.4.2 Input Mask ..................................................................................................................................4
1.4.3 Default value (valoare implicită) ................................................................................................5
1.5 POPULAREA CU DATE ..........................................................................................................................5
1.6 INTEROGĂRI ........................................................................................................................................6
1.6.1 Filtrarea şi ordonarea directă a datelor dintr-o tabelă .................................................................6
1.6.2 Actualizarea directă a datelor .....................................................................................................6
1.6.3 Crearea de interogări cu instrumente de tip Wizard ...................................................................6
1.6.4 Definirea interogărilor prin Query Design................................................................................11
1.6.5 Interogări SQL ..........................................................................................................................14
1.1 RAPOARTE ........................................................................................................................................18
1.1.1 Asistentul de rapoarte ...............................................................................................................18
1.1.2 Raport simplu din două tabele ..................................................................................................19
1.1.3 Raport cu gruparea înregistrărilor şi subtotaluri .......................................................................21
1.2 FORMULARE......................................................................................................................................22
2 EVIDENŢĂ STUDENŢI ........................................................................................................................ 26
2.1 Crearea tabelelor şi definirea restricţiilor ........................................................................................26
1. Crearea tabelelor şi declararea valorilor implicite ....................................................................26
2. Reguli de validare .....................................................................................................................26
3. Declararea restricţiilor referenţiale ...........................................................................................27
2.2 Editarea tabelelor şi navigarea prin înregistrări ...............................................................................27
2.3 Obţinerea de informaţii din baza de date .........................................................................................27
1. Setul nr. 1 de întrebări...............................................................................................................28
2. Setul nr. 2 de întrebări...............................................................................................................30
3. Setul nr. 3 de întrebări...............................................................................................................30
4. Setul nr. 4 de întrebări...............................................................................................................30
5. Setul nr. 5 de întrebări...............................................................................................................31
6. Setul nr. 6 de întrebări...............................................................................................................32
7. Setul nr. 7 de întrebări...............................................................................................................33
3 EVIDENŢA VÂNZĂRILOR ................................................................................................................. 34
3.1 Detalii bază date ...............................................................................................................................34
3.2 Schema bazei de date .......................................................................................................................35
3.3 Interogări ..........................................................................................................................................35
4 EVIDENŢĂ BIBLIOTECĂ.................................................................................................................... 53
5 MODELE LUCRĂRI PRACTICE ......................................................................................................... 68
Lucrarea practică nr. 1 ...........................................................................................................................68
Lucrarea practică nr. 2 ...........................................................................................................................69
Lucrarea practică nr. 3 ...........................................................................................................................70
Lucrarea practică nr. 4 ...........................................................................................................................72
Lucrarea practică nr. 5 ...........................................................................................................................74
Note
1. Este posibil să fie anumite “scăpări”, materialul fiind lucrat în timp (muuult timp)… “printre picături”.
2. În anumite locuri din document există o zonă în care se face trimitere la fişierul pe care este bine de lucrat, fişier care se găseşte
în secţiunea Attachments (Ataşamente). Zona arată cam aşa:
3. Deseori, în informatică, se poate ajunge la un rezultat pe mai multe căi (totul este să nu ajungeţi … „pe mai multe cărări” ;) )
1
1 GESTIUNE PRODUSE FINITE
1.1 STRUCTURA BAZEI DE DATE
Tabela Denumire atribut Tip dată
i Lungime Tabela Denumire atribut Tip dată Lungime
Documente de intrare  numar nota intrare Short Text 8 Incasari  numar document Short Text S
 data document Date/Time Short Date  data document Date/Time Short Date
 cod gestiune Short Text 8  cod client Short Text 8
 suma Number Single
 tip de document Text 20
Linii in documente  numar nota intrare Short Text 8 Produse  cod produs Short Text 8
 cod produs Short Text 8  denumire produs Short Text 20
 cantitate Number Single  unitate de măsură Short Text 3
 pret Number Single
 stoc Number Single
Avize de expeditie  numar aviz Short Text 8 Clienti  cod client Short Text 8
 data aviz Date Time Short Date  denumire client Short Text 20
 cod gestiune Short Text 8  cod localitate Short Text 4
 cod client Short Text 8  sold Number Single
Linii in avize  numar aviz Short Text 8 Localitati  cod localitate Short Text 8
 cod produs Short Text 8  denumire localitate Short Text 20
 cantitate Number Single  denumire judet Short Text 20
 procent tva Number Byte
 pret Number Single
Gestiune  cod gestiune Short Text 8
 denumire gestiune Short Text 20
 nume gestionar Short Text 20
Câmpurile care au conţinut numeric, dar nu sunt folosite în calcule pot fi configurate de tip Text, fiind mai uşor de
gestionat.
Cheia primară se setează dând clic dreapta pe câmpul stabilit ca având acest rol şi alegând din meniul contextual
opţiunea Primary Key. Aceeaşi opţiune poate fi aleasă din meniul Design.
În cazul în care este nevoie de cheie primară compusă, se selectează primul câmp, apoi se „alunecă” spre celălalt, dacă
sunt alăturate sau se ţine apăsată tasta Ctrl şi se apasă şi pe celălalt câmp.
În acest punct, pentru antrenare, descarcă  Baza de date se află în cadrul acestui document PDF
GestProdFin-simpla.accdb Baza de date în forma în care se pot stabili cheile primare, introdus valori implicite, reguli de
validare etc.

1.2 SCHEMA BAZEI DE DATE


1. Pentru a crea legăturile între tabele, se alege, din meniul Database Tools, opţiunea Relationships. Dacă este aleasă prima
dată pentru respectiva bază de date, va apărea un formular de unde se pot introduce tabelele. Dacă a mai fost apelată
această opţiune pentru acea bază de date, pentru a mai adăuga tabele:
- fie se alege din meniul Design, butonul Show Table;
- fie se dă clic dreapta pe zona gri unde sunt tabelele şi se alege, din meniul contextual, aceeaşi opţiune Show Table;
- fie se dă clic în panoul din stânga unde sunt tabelele, pe tabela dorită şi, ţinând apăsat butonul mouse-ului, se trage
peste fundalul gri, unde sunt tabelele.
2. Se dă clic pe cheia primară din tabela-părinte, ţinându-se apăsat butonul stânga al mouse-ului, şi se trage mouse-ul peste
tabela-copil, eliberând butonul mouse-ului peste cheia străină (corespondentul cheii primare din tabela părinte). Va apărea
un formular precum cel de jos. În cazul în care nu apare corespondenţa cheie primară – cheie străină, se poate schimba
dând clic pe câmpul eronat şi alegerea, din combobox.

2
Gestiune produse finite
De regulă, se bifează primele două casete (Enforce Referential Integrity1 şi Cascade Update Related Fields2). Cascade Delete
Related Records3 nu prea se obişnuieşte a fi bifată, decât ca excepţie.

1.3 RESTRICŢII
1.3.1 Restrictii la nivel de atribut4
1. În tabela Clienti, denumirea clientului să fie obligatoriu cu majuscule.
 Validation Rule: StrComp(UCase([denumire client]);[denumire client];0)=0
 Validation Text: "DENUMIREA CLIENTULUI - CU MAJUSCULE !!!"
2. În tabela Linii in documente, cantitatea trebuie să fie pozitivă.
 Validation Rule: >0
 Validation Text: „CANTITATEA TREBUIE SA FIE POZITIVA!!!”
3. Tabela Produse, unitate de masura să aibă prima literă scrisă cu majuscule.
 Validation Rule5: StrComp(Left(UCase([unitate de masura]);1);Left([unitate de masura];1);0)=0
 Validation Text: "INTRODUCETI PRIMA LITERA MAJUSCULA !!!"
4. În tabela Incasari, suma să fie cuprinsă între 100 şi 1000 lei
 Validation Rule: Between 100 And 1500
 Validation Text: „Suma trebuie să fie între 100 şi 1500!!!”
5. În tabela Incasari, documentul poate fi doar de tip „CEC”, „Ordin de plată”, „Chitanţă”
 Validation Rule: In ("Chitanta";"Ordin de plata";"CEC")
 Validation Text: „DOCUMENTUL - Chitanta, Ordin de plata sau CEC!!!”
6. În tabela Încasări, data document să fie cuprinsă între 1 ianuarie 2006 şi 31 martie 2006.
 Validation Rule: Between #01.01.2006# And #31.03.2006#
 Validation Rule: „Data necorespunzătoare”
7. În tabela Documente de intrare, data documentului trebuie să nu depăşească data curentă
 Validation Rule: <=Date()
 Validation Rule: „Data documentului trebuie să nu depăşească data curentă!”

1.3.2 Restrictii la nivel de inregistrare6


În tabela Incasari, pentru chitante suma trebuie să fie mai mică de 500 de lei:
 Validation Rule: IIf(UCase([tip de document])="CHITANŢĂ";IIf([suma]<=500;True;False);True)
 Validation Text: "CU CHITANŢĂ, NU MAI MULT DE 500 RON !!!"

1 Nu va fi permisă introducerea unei înregistrări în tabelul-copil dacă valoarea din cheia străină nu există în cheia primară din tabelul părinte.
2 La modificarea valorii cheii primare din tabelul părinte se modifică toate înregistrările aferente din tabelul copil.
3 Selectarea acestei opţiuni determină ca la o ştergere a valorii unei chei primare din tabela părinte să se şteargă toate înregistrările aferente

din tabela copil.


4 Atenţie: regula de validare să fie aplicată câmpului solicitat! Asta presupune ca, întâi să dăm clic pe câmpul respectiv apoi se completează

Validation Rule şi Validation Text.


5 După cum se observă delimitatorul argumentelor funcţiilor este punctul şi virgula (;), dar poate fi şi virgula (,), funcţie de setările regionale

ale sistemului de operare (punct şi virgulă pentru setările româneşti, virgula pentru cele americane). La versiunile actuale de Access, când
începem scrierea unei funcţii, în momentul în care este recunoscută, i se va reda sintaxa – de văzut acolo ce sugerează Access-ul: punct şi
virgulă sau virgulă.
6 Atunci când regula de validare solicită cel puţin două atribute, din meniul Design se alege opţiunea Property Sheet, afişând un panou în

partea dreaptă, unde se introduce regula de validare în fereastra Validation Rule. Dacă se doreşte să se lucreze mai uşor, se poate apăsa pe
butonul cu trei puncte ( ), care apare când se selectează opţiunea Validation Rule. Astfel va fi afişat formularul Expression Builder.
3
Gestiune produse finite
1.4 ALTE „ACCESORII”
1.4.1 Format7
Se foloseşte pentru a afişa datele într-o manieră mai prietenoasă. De exemplu, într-un fel arată 128934 şi altfel
128.934 lei. Sau, într-un fel este 01/01/2016 şi altfel arată 1 ianuarie 2016. Setările se realizează, din formularul din partea de
jos, unde se regăseşte opţiunea Format.

Exemple pentru valori numerice şi pentru valori dată-timp

Exemple pentru valori de tip text


 @@@-@@-@@@@ - Depozit→D-ep-ozit (desigur, acest format este mai util pentru valorile ce conţin cifre, dar sunt în
câmpuri de tip Text.
 @@@@@@@@@ - Depozit → Depozit.
D-ep-ozit→D-ep-ozit
 > Va afişa cu majuscule, indiferent cum este scris: Depozit → DEPOZIT
DEPOZIT →DEPOZIT
depozit →DEPOZIT
 < Va afişa cu litere mici, indiferent cum este scris: Depozit → depozit
DEPOZIT →depozit
depozit →depozit
@;"Lipsa produs" – dacă nu sunt valori într-o celulă de tip text (Null) sau valori de lungime 0, va afişa textul scris între
ghilimele. Va simula şi opţiunea Default Value, apărând ca valoare potenţială

1.4.2 Input Mask


Uşurează modul de introducere a datelor. Afişarea ulterioară, însă, va fi după setările de la proprietatea Format. Pentru
unele tipuri de date (Number, Date) poate fi util Wizard-ul; are avantajul că poate să dea feedback rapid asupra corectictudinii.

Tabelul 1 Exemple de măşti de intrare


0 Trebuie introdusă o cifră
9 Poate fi introdusă o cifră
# Poate fi introdusă o cifră, spaţiu, semnul plus sau minus. Dacă este sărit, Access-ul va introduce un spaţiu gol.
L Trebuie introdusă o literă
? Poate fi introdusă o literă
A Trebuie introdusă o literă sau o cifră – literele vor fi afişate cu majuscule
a Poate fi introdusă o literă sau o cifră – literele vor fi afişate cu majuscule
Sursa: http://en.tekstenuitleg.net/articles/software/create-an-input-mask-in-access-tutorial

Tabelul 2 Exemple de măşti de intrare


Provides this type of
This input mask Notes
value
(000) 000-0000 (206) 555-0199 In this case, you must enter an area code because that section of the mask (000, enclosed in
parentheses) uses the 0 placeholder.
(999) 000-0000! (206) 555-0199 In this case, the area code section uses the 9 placeholder, so area codes are optional. Also, the
( ) 555-0199 exclamation point (!) causes the mask to fill in from left to right.
(000) AAA-AAAA (206) 555-TELE Allows you to substitute the last four digits of a U.S. style phone number with letters. Note the
use of the 0 placeholder in the area code section, which makes the area code mandatory.
#999 -20 Any positive or negative number, no more than four characters, and with no thousands
2000 separator or decimal places.

7 Mai multe detalii pot fi găsite accesând acest link: https://support.office.com/en-us/article/Specify-how-data-displays-by-using-custom-


formatting-a5e5bcde-85da-4c7a-8164-1fe286636668
4
Gestiune produse finite
Provides this type of
This input mask Notes
value
>L????L?000L0 GREENGR339M3 A combination of mandatory (L) and optional (?) letters and mandatory numbers (0). The
MAY R 452B7 greater-than sign forces users to enter all letters in uppercase. To use an input mask of this
type, you must set the data type for the table field to Text or Memo.
00000-9999 98115- A mandatory postal code and an optional plus-four section.
98115-3007
>L<?????????????? Maria A first or last name with the first letter automatically capitalized.
Pierre
ISBN 0- ISBN 1-55615-507-7 A book number with the literal text, mandatory first and last digits, and any combination of
&&&&&&&&&-0 letters and characters between those digits.
>LL00000-0000 DB51392-0493 A combination of mandatory letters and characters, all uppercase. Use this type of input mask,
for example, to help users enter part numbers or other forms of inventory correctly.
Sursa: https://support.office.com/en-us/article/Control-data-entry-formats-with-input-masks-e125997a-7791-49e5-8672-4a47832de8da

1.4.3 Default value (valoare implicită)


Se foloseşte atunci când se doreşte evitarea repetiţiei obositoare, în popularea datelor identice. De exemplu, la un
câmp unde s-ar stoca numărul matricol al unui student, primele caractere (31040701SL15), pot fi deja introduse, completând
doar celelalte patru.
Dacă se doreşte afişarea datei curente, la introducerea unei înregistrări noi, se poate folosi funcţia Date().

1.5 POPULAREA CU DATE


În acest punct, pentru antrenare, descarcă  Baza de date se află în cadrul acestui document PDF
Baza de date utilizabilă pentru antrenament la popularea cu date.
GestProdFin-restrictii.accdb
Conţine deja chei primare, legăturile între tabele, restricţii
Ordinea de populare (introducere de date) se face începând cu tabelele părinte, apoi cu tabelele copil. Pentru a evita
anumite surprize, se poate face popularea unei tabele-copil, din interiorul tabelei-părinte, apăsând acel plus ce se regăseşte în
stânga primului atribut. Se ve deschide un subformular 8 ce afişează câmpurile tabelei-copil (mai puţin, cheia străină, care va fi
introdusă automat dacă, la setarea restricţiilor referenţiale, se bifează Cascade Update Related Fields.

8 Dacă tabela-părinte are mai multe tabele subordonate, înaintea acelui subformular, va fi afişat un formular de unde se poate alege care
dintre tabelele-copil se doreşte a fi conectată.
5
Gestiune produse finite
În acest punct, pentru antrenare, descarcă  Baza de date se află în cadrul acestui document PDF
GestProdFin-populata.accdb Baza de date pentru antrenarea interogărilor, formularelor, rapoartelor etc.

1.6 INTEROGĂRI
1.6.1 Filtrarea şi ordonarea directă a datelor dintr-o tabelă9
[Ex. 1] Să se identifice clienţii din localitatea cu codul 1002, folosindu-se filtrarea directă a datelor.
Se dă clic dreapta pe câmpul unde se doreşte a se face filtrarea, iar din meniul contextual se alege una din variantele dorite.

După cum se constată, pe lângă opţiunea avansată Text Filters (dacă câmpul este configurat de tip Number, apare
Number Filters), se poate face filtrare rapidă, funcţie de înregistrarea pe care ne aflăm (în cazul de faţă 1002)

1.6.2 Actualizarea directă a datelor


Se dă clic dreapta pe banda din stânga înregistrărilor, pentru a se selecta tot rândul, apoi se alege, din meniu, opţiunea dorită.

Adăugare
Ştergere

1.6.3 Crearea de interogări cu instrumente de tip Wizard

1.6.3.1 Crearea unei interogări cu Simple Query Wizard

[Ex. 2] Să se obţină o listă cu toţi clienţii şi toate localităţile din care aceştia fac parte. Lista trebuie să conţină numele
clienţilor şi numele localităţilor.
Din meniul Create  Query Wizard

9 Se foloseşte doar pentru a obţine rezultate rapide, dar nu se prea practică într-o manieră profesionistă.
6
Gestiune produse finite


Variantă Query Design Variantă SQL
SELECT [denumire client], [denumire localitate]
FROM localitati INNER JOIN clienti
ON localitati.[cod localitate] = clienti.[cod localitate]

1.6.3.2 Crearea unei interogări cu Crosstab Query Wizard

[Ex. 3] Să se creeze o listă cu încasările de la fiecare client pe tipuri de documente. Lista trebuie să conţină pe prima
coloană clienţii şi câte o coloană pentru fiecare tip de document. La intersecţia fiecărui client cu fiecare tip de
document trebuie să apară suma încasărilor.

7
Gestiune produse finite

sau sau
Variantă Query Design: Variantă SQL:
TRANSFORM Sum([suma]) AS SumOfsuma
SELECT [cod client], Sum([suma]) AS [Total suma]
FROM incasari
GROUP BY [cod client]
PIVOT [tip de document]

8
Gestiune produse finite
1.6.3.3 Găsirea unei valori-duplicat folosind Query Wizard

[Ex. 4] Să se afişeze înregistrările avizelor de expediţie cu preţ identic.

Variantă Query Design Variantă SQL


SELECT pret, [numar aviz],
[cod produs], cantitate,
[procent TVA]
FROM [linii in avize]
WHERE pret In (
SELECT pret
FROM [linii in avize]
GROUP BY pret
HAVING Count(*)>1
)
ORDER BY pret

9
Gestiune produse finite
1.6.3.4 Afişarea valorilor dintr-o tabelă care nu au corespondent în altă tabelă folosind Query Wizard

[Ex. 5] Să se afişeze clienţii de la care nu sunt încasări

10
Gestiune produse finite
Variantă Query Design Variantă SQL
SELECT C.[cod client], [denumire client], [cod localitate], sold
FROM clienti C LEFT JOIN incasari I
ON C.[cod client] = I.[cod client]
WHERE I.[cod client] Is Null

1.6.4 Definirea interogărilor prin Query Design10


Pentru a ajunge la aceste interogări, din meniul Create  Query Design se ajunge la formularul Show Table. Se pot
adăuga tabelele prin mai multe metode:
 Dublu clic pe tabela/tabelele ce se doresc a fi interogate (este şi metoda cea mai comodă), sau
 Clic pe fiecare tabelă în parte şi apăsarea, de fiecare dată a butonului Add, sau
 Selectarea tabelelor necesare (dacă e nevoie, la selecţie, se poate folosi şi tasta Ctrl sau Shift, după caz), apoi apăsarea
butonului Add

Obs.
 Adăugarea de mai multe ori a unei tabele nu trebuie să sperie. După închiderea formularului Show Table, pur şi simplu, se
dă clic pe tabela inutilă şi apoi tasta Delete.
 Dacă se doreşte a se mai include în interogare şi altă tabelă, se poate apela din nou formularul Show Table, fie din meniul
Design, fie dând clic dreapta pe fundalul unde sunt afişate simbolurile tabelelor şi alegerea opţiunii Show Table.

1.6.4.1 Interogări de selecţie


[Ex. 6] Să se întocmească lista clienţilor din localitatea cu codul 1002. lista va cuprinde numai denumirea clienţilor.
SELECT [denumire client]
FROM clienti
WHERE [cod localitate]="1002"

Dacă, în loc de SELECT, din meniul QUERY se alege opţiunea Make-Table Query, se poate crea o nouă tabelă cu
rezultatul respectivei interogări. Mult mai simplu este, introducerea la fraza SQL, expresia INTO si numele noii tabele:
SELECT [denumire client] INTO [Tabela Noua]
FROM clienti
WHERE [cod localitate]="1002"
Parametru
Pentru realizarea unui parametru cu specificaţie clară a tipului de dată solicitat, se alege din meniul Design, opţiunea
Parameters, unde, în formularul ce apare se introduce expresia ce solicită inserarea unui element.

10 Ca şi în exemplificările de mai sus, vom prezenta la fiecare interogare utilizând Query Design şi alternativa SQL.
11
Gestiune produse finite

Aceeaşi expresie se introduce cu rol de criteriu.

PARAMETERS [Introdu codul localitatii] Text ( 255 );


SELECT [denumire client], [cod localitate]
FROM clienti
WHERE [cod localitate]=[Introdu codul localitatii]

[Ex. 7] Care este conţinutul avizului de expediţie cu numărul 1002. lista va conţine câmpurile: data aviz, denumire gestiune,
denumire client, denumire localitate (localitatea clientului), denumire produs, cantitate, procent TVA, preţ.

SELECT [avize de expeditie].[numar aviz], [data aviz], [denumire gestiune], [denumire client], [denumire localitate], [denumire produs],
cantitate, [procent TVA], [linii in avize].pret
FROM produse
INNER JOIN ((gestiune
INNER JOIN (
(localitati
INNER JOIN clienti
ON localitati.[cod localitate] = clienti.[cod localitate])
INNER JOIN [avize de expeditie]
ON clienti.[cod client] = [avize de expeditie].[cod client])
ON gestiune.[cod gestiune] = [avize de expeditie].[cod gestiune])
INNER JOIN [linii in avize]
ON [avize de expeditie].[numar aviz] = [linii in avize].[numar aviz])
ON produse.[cod produs] = [linii in avize].[cod produs]
WHERE [avize de expeditie].[numar aviz]="1002"
Obs. Câmpurile [numar aviz] şi pret au nevoie de referinţă la tabele deoarece, în interogarea dată, se găsesc în cel puţin două
tabele. La joncţiuni, însă este evident că trebuie şi referinţa pentru a şti de unde este cheia primară, respectiv cheia străină.

1.6.4.2 Interogări de adăugare


[Ex. 8] Introduceţi în tabela Clienţi clientul SC BENNY HILL S.R.L. cu codul 1008, din localitatea cu codul 1001, ce are
soldul 777.
Se apelează, ca la interogarea de selecţie, meniul Create  Query Design, doar că, din Show Table, nu se adaugă nicio
tabelă, ci se apasă Close. Apoi, din meniul Design se alege opţiunea Append Query (sau dând clic dreapta pe fundalul unde ar
fi fost tabelele.

12
Gestiune produse finite

INSERT INTO clienti (


[cod client], [denumire client], [cod localitate], sold
)
SELECT 1008, "SC BENNY HILL SRL", 1001, 777

1.6.4.3 Interogări de modificare


[Ex. 9] Să se modifice pentru clientul cu codul 1008 soldul în 888

UPDATE clienti SET sold = 888


WHERE [cod client]="1008"

1.6.4.4 Interogări de ştergere


[Ex. 10] Ştergeţi clientul cu codul 1008

DELETE *
FROM clienti
WHERE [cod client]="1008"

13
Gestiune produse finite
1.6.4.5 Interogare folosind două tabele

SELECT [denumire client], [denumire localitate]


FROM localitati INNER JOIN clienti
ON localitati.[cod localitate] = clienti.[cod localitate]

1.6.5 Interogări SQL


1.6.5.1 Primele argumente ale interogărilor SQL
Formatul specific unei interogări: SELECT câmp_1, câmp_2, ……, câmp_n
FROM tabel_1, tabel_2, ………., tabel_n
WHERE condiţie
ORDER BY câmp_i, câmp_j
[Ex. 11] Lista clienţilor din localitatea cu codul 1002. Lista [Ex. 12] Care sunt clienţii din localitatea cu codul 1006 care
va cuprinde numai denumirea clienţilor. au soldul >1000. Lista va cuprinde: denumire
SELECT [denumire client] client, cod client.
FROM clienti SELECT [denumire client], [cod client]
WHERE [cod localitate]= "1002" FROM clienti
WHERE [cod localitate]="1006"
Obs: Constantele de tip text pot fi scrise între ghilimele (“)
AND sold>1000
sau apostrof (’)
Obs: Pot fi folosiţi şi operatorii logici (AND/OR/NOT)

[Ex. 13] Care sunt documentele de intrare emise între 15 februarie şi 15 martie 2006. Lista va cuprinde numărul şi data
documentului.
SELECT [numar nota intrare], [data document] SELECT [numar nota intrare], [data document]
FROM [documente de intrare] FROM [documente de intrare]
sau
WHERE [data document]>=#2006/02/15# WHERE [data document] BETWEEN
AND [data document]<=#2006/03/15# #2006/02/15# AND #2006/03/15#
Obs: Data calendaristică s-a scris în format ISO: YYYY/MM/DD. Se pot folosi şi: DD/MM/YYYY sau MM/DD/YYYY.
În loc de slash (/) se poate folosi ca delimitator şi cratimă (-)

[Ex. 14] Care sunt clienţii din judeţul cu codul IS. Lista va cuprinde doar denumirea clienţilor.
Varianta 111) Varianta 2)
SELECT [denumire client] SELECT [denumire client]
FROM clienti, localitati FROM localitati INNER JOIN clienti
WHERE clienti.[cod localitate]=localitati.[cod localitate] ON localitati.[cod localitate] = clienti.[cod localitate]
AND [denumire judet]= "IS" WHERE [denumire judet]="IS"

[Ex. 15] Întocmiţi lista clienţilor din judeţul Iaşi în ordinea [Ex. 16] Întocmiţi lista clienţilor din judeţul Iaşi, ordonată
alfabetică a denumirii acestora. Lista va cuprinde: după soldul descrescător. Lista va cuprinde
denumirea clientului şi soldul acestuia. denumire client şi sold
SELECT [denumire client], [sold] SELECT [denumire client], sold
FROM clienti c, localitati l FROM clienti AS c, localitati AS l
WHERE c.[cod localitate]=l.[cod localitate] WHERE c.[cod localitate]=l.[cod localitate]
AND [denumire judet]= "IS" AND [denumire judet]="IS"
ORDER BY [denumire client] ORDER BY sold DESC

1.6.5.2 Utilizarea principalilor operatori


Operatori: =,<,>,<=,>=,AND, OR, BETWEEN, UNION, LIKE, IN

11 Atunci când se lucrează cu interogări SQL, un avantaj al scrierii eficiente este redată de alias-uri: în loc de numele unei tabele, se declară o
literă sau două pentru a înlocui numele tabelei cu acel alias.
SELECT [denumire client]
FROM clienti c, localitati l
WHERE c.[cod localitate]=l.[cod localitate]
AND [denumire judet]= "IS"
14
Gestiune produse finite
Reluarea [Ex. 13]
SELECT [numar nota intrare], [data document]
FROM [documente de intrare]
WHERE [data document] BETWEEN #2006/02/15# AND #2006/03/15#

[Ex. 17] Ce încasări s-au făcut în perioada 1 ianuarie 2006 – 31 martie 2006, cu valori între 1000 şi 10000 de la clienţii a
căror denumire începe cu una din literele de la A la S.
Varianta 1) Varianta 2)
SELECT i.* SELECT i.*
FROM incasari i, clienti c FROM incasari i, clienti c
WHERE i.[cod client]=c.[cod client] WHERE i.[cod client]=c.[cod client]
AND [data document] BETWEEN #2006/01/01# AND MONTH([data document]) BETWEEN 1 AND 3
AND #2006/03/31# AND YEAR([data document])
AND suma BETWEEN 1000 AND 10000 AND suma BETWEEN 1000 AND 10000
AND MID([denumire client],1,1) BETWEEN "A" AND "S" AND LEFT([denumire client],1) BETWEEN "A" AND "S"

[Ex. 18] Care sunt codurile produselor ce apar în documentele de intrare sau în avizele de expediţie?
SELECT [cod produs] FROM [linii in documente]
UNION
SELECT [cod produs] FROM [linii in avize]
Obs: Cu ajutorul operatorului UNION se realizează reuniunea a două sau mai multe interogări.
Se elimină automat liniile identice. Dacă se doreşte obţinerea tuturor liniilor din respectivele mulţimi, se foloseşte clauza ALL
Este obligatoriu ca, numărul câmpurilor din tabelele reunite să fie egal.

[Ex. 19] Întocmiţi fişa produsului având codul 1001 (fişa produsului conţine stocul iniţial, intrările şi ieşirile pentru
produsul respectiv)
SELECT 'Stoc initial' AS TipDoc, SPACE(8) AS NrDoc, stoc AS Cantitate
FROM produse
WHERE [cod produs] = '1001'
UNION
SELECT 'Nota intrare', [numar nota intrare], cantitate
FROM [linii in documente]
WHERE [cod produs]='1001'
UNION
SELECT 'Aviz de expeditie', [numar aviz], cantitate
FROM [linii in avize]
WHERE [cod produs]='1001'
Obs: Funcţia SPACE returnează un şir de caractere spaţiu de o anumită lungime.

[Ex. 20] Întocmiţi fişa produsului având codul 1001, în care ordinea liniilor din rezultat să fie ordinea cronologică de
apariţie a documentelor (prima linie va fi ocupată de soldul iniţial)
SELECT #2006-01-01# AS Data, 1 AS Ord, 'Stoc initial' AS TipDoc, SPACE(8) AS NrDoc, Stoc AS Cantitate
FROM produse
WHERE [cod produs]='1001'
UNION
SELECT [data document], 2, 'Nota intrare', i.[numar nota intrare], cantitate
FROM [linii in documente] L, [documente de intrare] i
UNION
SELECT [data aviz], 3, 'Aviz de expeditie', a.[numar aviz], cantitate
FROM [linii in avize] L, [avize de expeditie] a
WHERE L.[numar aviz] = a.[numar aviz]
AND [cod produs]='1001'
[Ex. 21] Care sunt clienţii de tip SRL12? [Ex. 22] Care sunt gestionarii care au numele de familie format
SELECT * din 7 caractere şi se termină în ‘escu’13?
FROM clienti SELECT *
WHERE [denumire client] LIKE '*SRL*' FROM gestiune
WHERE UCASE([nume gestionar]) LIKE '???ESCU*'

[Ex. 23] Întocmiţi lista clienţilor din judeţul Iaşi, Vaslui, Suceava, Botoşani.

12 Caracterul asterix (*) înlocuieşte un şir de caractere


13 Semnul întrebării (?) înlocuieşte un singur caracter.
15
Gestiune produse finite
Varianta 1) Varianta 2) Se poate şi prin utilizarea operatorului logic OR
SELECT c.* SELECT c.*
FROM clienti c, localitati l FROM clienti c, localitati l
WHERE c.[cod localitate]=l.[cod localitate] WHERE c.[cod localitate]=l.[cod localitate]
AND l.[denumire judet] IN ('IS','VS', 'SV', 'BT') AND (l.[denumire judet] = 'IS'
OR l.[denumire judet] = 'VS'
Obs: Operatorul IN este folosit pentru a testa dacă o OR l.[denumire judet] = 'SV'
expresie se regăseşte într-o listă de valori. OR l.[denumire judet] = 'BT')
Varianta 3) Mulţimea în care caută IN nu e neapărat o listă de valori; poate fi mulţimea obţinută dintr-o subinterogare
SELECT *
FROM clienti
WHERE [cod localitate] IN
(SELECT[cod localitate]
FROM localitati
WHERE [denumire judet] IN ('IS', 'VS', 'SV', 'BT'))

[Ex. 24] Întocmiţi lista clienţilor din localitatea Iaşi. (Rezolvarea unei solicitări prin trei modalităţi)
Varianta 1 (Design View) Varianta 2 – SQL cu INNER JOIN
SELECT [denumire client]
FROM localitati l INNER JOIN clienti c
ON l.[cod localitate] = c.[cod localitate]
WHERE [denumire localitate]="Iaşi"

Varianta 1 (Design View) Varianta 2 – SQL cu INNER JOIN


SELECT [denumire client]
FROM localitati l, clienti c
WHERE l.[cod localitate] = c.[cod localitate]
AND [denumire localitate]="Iaşi"

1.6.5.3 Funcţii de agregare


COUNT, SUM, AVG, MIN, MAX
[Ex. 25] Câţi clienţi aveau soldul mai mare ca zero? [Ex. 26] Câţi clienţi sunt din judeţul Iaşi?
SELECT COUNT (*) SELECT COUNT (*)
FROM clienti FROM clienti
WHERE sold>0 WHERE [cod localitate] IN (
SELECT [cod localitate]
FROM localitati
WHERE [denumire judet]='IS')
[Ex. 27] Câte documente de intrare s-au întocmit în gestiunea lui Popescu în anul 2006
SELECT COUNT (*)
FROM gestiune g, [documente de intrare] d
WHERE g.[cod gestiune]=d.[cod gestiune]
AND UCASE([nume gestionar]) LIKE '*POPESCU*'
AND YEAR([data document])=2006
[Ex. 28] Care este valoarea încasărilor de la clientul cu [Ex. 29] Care a fost suma totală a soldurilor clienţilor?
codul 1001? SELECT SUM(sold) AS Total
SELECT SUM(suma) AS Total FROM clienti
FROM incasari
WHERE [cod client]='1001'

[Ex. 30] Care este suma încasată de la clienţii din municipiul Iaşi?
Varianta 1) Varianta 1’) Folosind o subinterogare şi operatorul IN
SELECT SUM(i.suma) AS Total SELECT SUM(suma) AS Total
FROM incasari i, clienti c, localitati l FROM incasari
WHERE i.[cod client]=c.[cod client] WHERE [cod client] IN (
AND c.[cod localitate]=l.[cod localitate] SELECT [cod client]
AND UCASE([denumire localitate]) LIKE 'IA?I' FROM clienti c, localitati l
WHERE c.[cod localitate]=l.[cod localitate]
AND UCASE([denumire localitate]) LIKE 'IA?I')

16
Gestiune produse finite
Varianta 2) Folosind o subinterogare şi operatorul IN, dar o Varianta 3) Folosind o subinterogare şi operatorul NOT IN
subinterogare mai mică
SELECT SUM(i.suma) AS Total SELECT SUM(suma) AS Total
FROM incasari i, clienti c FROM incasari
WHERE i.[cod client]=c.[cod client] WHERE [cod client] NOT IN (
AND c.[cod localitate] IN ( SELECT [cod client]
SELECT [cod localitate] FROM clienti c, localitati l
FROM localitati WHERE c.[cod localitate]=l.[cod localitate]
WHERE UCASE([denumire localitate]) LIKE 'IA?I') AND UCASE([denumire localitate]) NOT LIKE 'IA?I')
Varianta 4) Folosind două subinterogări imbricate Varianta 5) Folosind funcţia IIF
SELECT SUM(suma) AS Total SELECT SUM(IIF([denumire localitate] LIKE 'Ia?i', i.suma,0))
FROM incasari AS Total
WHERE [cod client] IN ( FROM incasari i, clienti c, localitati l
SELECT [cod client] WHERE i.[cod client]=c.[cod client]
FROM clienti c AND c.[cod localitate]=l.[cod localitate]
WHERE [cod localitate] IN (
SELECT [cod localitate]
FROM localitati
WHERE UCASE([denumire localitate]) LIKE 'IA?I'))

[Ex. 31] Care este volumul încasărilor din luna [Ex. 32] Care este totalul vânzărilor din luna februarie 2006?
februarie 2006? SELECT SUM(cantitate*pret*(1+[procent TVA]/100))
SELECT SUM(i.suma) AS Total FROM [avize de expeditie] a, [linii in avize] l
FROM incasari i WHERE a.[numar aviz]=l.[numar aviz]
WHERE MONTH([data document])=2 AND MONTH([data aviz])=2
AND YEAR([data document])=2006 AND YEAR([data aviz])=2006
[Ex. 33] Care este totalul valorii producţiei din luna februarie 2006?
SELECT SUM(cantitate*pret) AS Productie
FROM [documente de intrare] d, [linii in documente] l, produse p
WHERE d.[numar nota intrare]=l.[numar nota intrare]
AND l.[cod produs]=p.[cod produs]
AND MONTH([data document])=2
AND YEAR([data document])=2006
[Ex. 34] Care este valoarea totală a avizului de expediţie cu numărul 1001?
SELECT SUM(cantitate*pret*(1+[procent TVA]/100)) AS [Valoare Totala]
FROM [linii in avize]
WHERE [numar aviz]='1001'
[Ex. 35] Ce cantitate de lapte s-a vândut, pe piaţa municipiului Iaşi, în anul 2006?
SELECT SUM(la.cantitate) AS Cantitate_Totala
FROM localitati l, clienti c, [avize de expeditie] a, [linii in avize] la, produse p
WHERE l.[cod localitate]=c.[cod localitate]
AND c.[cod client]=a.[cod client]
AND a.[numar aviz]=la.[numar aviz]
AND la.[cod produs]=p.[cod produs]
AND UCASE(l.[denumire localitate]) LIKE 'IAS?I'
AND UCASE(p.[denumire produs]) LIKE '*LAPTE*'
[Ex. 36] Care este valoarea medie a încasărilor? [Ex. 37] Care este produsul care avea la începutul anului
SELECT AVG(suma) AS [Media incasarilor] cel mai mare stoc?
FROM incasari SELECT [denumire produs]
FROM produse
WHERE stoc IN (
SELECT MAX(stoc) FROM produse)
[Ex. 38] Care este cea mai mare încasare din anul 2006?
SELECT *
FROM incasari
WHERE suma IN(
SELECT MAX(suma)
FROM incasari
WHERE YEAR([data document])=2006)

1.6.5.4 Gruparea înregistrărilor


[Ex. 39] Care sunt documentele de intrare cu cele mai multe linii (pot exista mai multe documente cu acelaşi număr maxim de
linii)? Lista va cuprinde doar numerele documentelor de intrare.
SELECT [numar nota intrare]
FROM [linii in documente]
GROUP BY [numar nota intrare]
17
Gestiune produse finite
HAVING COUNT(*)=(
SELECT MAX(cate) FROM (
SELECT COUNT(*) AS cate
FROM [linii in documente]
GROUP BY [numar nota intrare]))

Obs: Clauza GROUP BY determină grupuri pe baza valorilor luate de unul sau mai multe câmpuri. Această clauză are sens
doar dacă se foloseşte în interogare cel puţin o funcţie de agregare.
Clauza HAVING este asemănătoare cu clauza WHERE, numai că operează cu funcţii de agregare asupra grupului.

1.1 RAPOARTE
1.1.1 Asistentul de rapoarte
[Ex. 40] Să se realizeze un raport simplu care să conţină toate informaţiile despre gestiunile existente şi persoanele
responsabile cu administrarea lor.
Alegerea tabelei Gestiune, fără a se deschide, dând clic panoul obiecte, din stânga. Apoi, click pe opţiunea Report,
din meniul Create, grupul de butoane Report14.

Rezultatul este afişat în modul de vizualizare Layout View, de unde se mai pot ajusta dimensiunile obiectelor. Dacă se
doreşte vizualizarea produsului finit, se alege Print Preview sau Report View.
[Ex. 41] Periodic serviciul vânzări solicită o listă actualizată a clienţilor pentru a analiza sumele încasate şi debitele pe care
le au produsele vândute fiecăruia dintre ei.

14 În aceeaşi manieră rapidă se poate realiza şi un formular, în cazul de faţă pentru actualizarea gestiunii.
18
Gestiune produse finite

1.1.2 Raport simplu din două tabele


[Ex. 42] Periodic, serviciul de vânzări solicită lista actualizată a clienţilor în vederea elaborării politicilor de marketing pe
localităţi.
1. Proiectarea raportului

Macheta raportului
Lista clienţilor la data de 3/21/2007

Codul Denumirea Denumirea Codul Denumirea clientului


localităţii localităţii judeţului clientului
1005 Bârlad VS 1001 SC KOMBASAN SA
19
Gestiune produse finite
1002 Iaşi IS 1002 SC UNIREA SA
1002 Iaşi IS 1003 SC HOFFER SA
1006 Galaţi GL 1004 SC CORAL SRL
1005 Bârlad VS 1005 SC AMBRAS SA
1006 Galaţi GL 1006 SC VADUL SA
1007 Tecuci GL 1007 SC HORBAD SRL
Pag 1
2. Pregătirea datelor sursă
Interogarea Rap_3_clienti_pe_localitati15
SELECT l.[cod localitate], [denumire localitate], [denumire judet], [cod client], [denumire client]
FROM localitati l, clienti c
WHERE l.[cod localitate]=c.[cod localitate]
3. Construirea raportului

Click dreapta pe raport şi selectarea opţiunii Properties sau din meniul Design, alegerea opţiunii Property Sheet.

Inserarea câmpurilor prin tragere, din acest tabel, în zona Detail a raportului.
Controlul de tip Label, care conţine denumirea câmpului respectiv va fi dusă în zona Page Header.
Afişarea/ascunderea zonelor Page Header/Footer sau Report Header/Footer se poate realiza
fie dând clic pe butoanele din meniul Arrange sau din meniul contextual, dând clic dreapta pe
una din „benzile” pe care scrie Detail, Page Header sau Report Header ori Report Footer sau
Page Footer.
Atribuirea unui titlu raportului şi inserarea datei curente se
face alegând opţiunea Title, respectiv Date &Time din meniul Design. Va apărea un obiect de tip
Label, în care se introduce textul: „Lista clienţilor pe localităţi la data de” şi formatarea textului de
tip Garamond, 16 pt.

15 Readucem aminte că, pentru a economisi timp, în loc de a scrie numele unei tabele, într-o interogare se poate folosi „alias-ul” care ajută
înlocuind un cuvânt sau mai multe cu o literă sau două... (astfel, în loc de Localităţi ajunge doar un L, iar în loc de Clienţi se poate folosi un
sugestiv C)
20
Gestiune produse finite
1.1.3 Raport cu gruparea înregistrărilor şi subtotaluri
[Ex. 43] Periodic, serviciul marketing solicită o situaţie a produselor vândute, grupate pe clienţi, care să conţină denumirea
clienţilor, denumirea produselor, cantităţile livrate, unităţile de măsură, procentul TVA, preţurile, numărul şi data
avizelor de expediţie. Valoarea totală a vânzărilor se va determina atât pentru fiecare client, cât şi pentru toţi clienţii
la sfârşitul raportului.
1. Proiectarea raportului
Lista produselor vândute clienţilor până la data 3/21/2006

Denumirea clientului Numărul Data Denumirea Cantitatea Unitatea Procentul Preţul


avizului avizului produsului de TVA
măsură
SC HOFFER SA
1005 02.06.2006 Cornuri 30 Buc 19 25
1006 02.06.2006 Lapte 12 L 19 12,5
Valoarea produselor vândute clientului SC HOFFER SA 17,5
SC KOMBASAN SA Kg
1002 02.05.2006 Biscuiţi 25 Buc 19 12
1002 02.05.2006 Covrigi 10 Kg 19 15
1003 02.07.2006 Colaci 4 Buc 19 20
Valoarea produselor vândute clientului SC KOMBASAN SA 47
Valoarea totală a produselor vândute 64,5
2. Pregătirea datelor16
SELECT [denumire client], AE.[numar aviz], [data aviz], [denumire produs], cantitate, [unitate de masura], [procent TVA],
LA.pret, LA.[cod produs]
FROM clienti C, [avize de expeditie] AE, [linii in avize] LA, produse P
WHERE C.[cod client]=AE.[cod client] AND AE.[numar aviz]=LA.[numar aviz]
AND LA.[cod produs]=P.[cod produs]
3. Construirea raportului
Aidoma exemplului anterior

4. Gruparea înregistrărilor. Meniul Design  Group & Sort. La denumire client, în partea inferioară a ferestrei se alege
pentru Group Header, Group Footer se alege opţiunea Yes.

Pentru a calcula suma, se introduce un obiect de tip TextBox în zona


denumire client Footer şi se dă apoi clic dreapta pe acest obiect, alegând din meniul contextual opţiunea Properties.

16 După cum se remarcă, reamintim că după SELECT, câmpurile care sunt unice (nu se regăsesc în mai multe tabele, cum este deseori cazul
cheilor sau, ca în exemplul nostru, PRET, nu necesită referinţa la tabelă. Obligatoriu, însă ea se va trece la realizarea „punţii”, prin
intermediul cheilor. Aliasul poate fi precedat sau nu de particula AS: clienti C este identic cu clienti AS C
21
Gestiune produse finite

1.2 FORMULARE
[Ex. 44] Să se realizeze un formular care să permită actualizarea ambelor tabele: localitati şi clienti.
4. Proiectarea formularului
Macheta formularului
Actualizare clienţi

Cod localitate
Denumire localitate
Judeţ

Clienţi Cod client Denumire client Sold

22
Gestiune produse finite
5. Definirea formularului cu asistentul de formulare. Din meniul Create se alege dând clic pe More Forms, opţiunea
Form wizard.

23
Gestiune produse finite
[Ex. 45] Să se realizeze un formular, denumit Avize de expediţie, pentru actualizarea informaţiilor despre produsele livrate
clienţilor după macheta următoare
Actualizare avize de expediţie Data curentă

Numărul avizului Data Denumirea clientului

Denumire produs Cantitate Unitate de măsură Procent TVA Preţ Aviz nou

Căutare

Ştergere

Valoarea totală a avizului de expediţie numărul


Salvare

Închidere formular
|< < > >|

24
Gestiune produse finite

Pentru verificare a se descărca  Baza de date se află în cadrul acestui document PDF
GestProdFin-rezolvata.accdb Baza de date rezolvată, pentru verificare

25
2 EVIDENŢĂ STUDENŢI
2.1 Crearea tabelelor şi definirea restricţiilor
1. Crearea tabelelor şi declararea valorilor implicite
PK Atribut Tip Lungime Valori implicite
(Field Name) (Data Type) (Field Size) (Default Value)
STUDENTI
Matricol Text 10
NumePren Text 40
CNP Text 15
Specializare Text 50 "Trunchi comun"
AnStudii Number Long Integer 1
Fstudii Text 2 "ID"
Grupa Number Long Integer 1
DISCIPLINE
CodDisc Text 6
DenumireDisc Text 40
NrCredite Number Long Integer 6
NrOreCurs Number Long Integer 28
NrOreSeminar Number Long Integer 28
EXAMENE
Matricol Text 10
CodDisc Text 6 "AE1101"
DataEx Date/Time IIF(DATE()<#20/01/2006#;DATE();#20/01/2006#)
â
NotaEx Number Long Integer 7
Pentru antrenare a se descărca  Baza de date se află în cadrul acestui document PDF
EvStud-simpla.accdb Baza de date necesară pentru antrenarea cheilor, restricţiilor, regulilor de validare

2. Reguli de validare

2.1.2.1 La nivel de atribut


Atribut Restrictii
(Field Name) Validation Rule Validation Text
STUDENTI
Matricol StrComp(UCASE([Matricol]);[Matricol];0)=0 Literele din matricol, obligatoriu cu majuscule!
Specializare StrComp(LEFT(UCASE([Specializare]);1);LEFT([Specializare];1);0)=0 Prima litera din Specializare e majuscula!
AnStudii [AnStudii] BETWEEN 1 AND 5 An studii intre 1 si 5!
Fstudii [Fstudii] IN ('ZI';'ID') Forma studii doar ZI sau ID!
Grupa [Grupa]>0 Nr grupei pozitiv!
DISCIPLINE
CodDisc StrComp(UCASE([CodDisc]);[CodDisc];0)=0 Literele din CodDisc cu majuscule!
NrCredite <=8 Nr credite nu mai mult de 8!
NrOreCurs <=42 Nr orelor de curs nu mai mult de 42!
NrOreSeminar <=42 Nr orelor de seminar nu mai mult de 42!
EXAMENE
DataEx Month([DataEx]) IN (1;2;5;6;7) AND Year([DataEx])=2006 Numai lunile IAN, FEB, MAI, IUN sau IUL din 2006!
NotaEx BETWEEN 1 AND 10 Nota este cuprinsa intre 1 - 10!

2.1.2.2 La nivel de înregistrare


Se deschide tabela în modul Design View, apoi se alege, din meniul View, opţiunea Properties
Restrictii Textul de afişat
(Validation Rule) (Validation Text)
STUDENTI
[AnStudii]<>4 OR [AnStudii]=4 AND [Grupa]<=10 La anul 4 de studiu pot fi maximum 10 grupe!
DISCIPLINE
[NrOreCurs]+[NrOreSeminar]<=70 Nr ore curs + ore seminar cel mult 70!
EXAMENE
[CodDisc]<>'AE1101' OR [CodDisc]='AE1101' AND [DataEx] IN Examenele la Macroeconomie au fost programate pe 28 ian,
(#28.01.2006#;#02.11.2006#;#07.04.2006#) 11 feb si 4 iul!

26
Evidenţă studenţi
3. Declararea restricţiilor referenţiale
Legătura se realizează apelând în meniul DATABASE TOOLS, opţiunea RELATIONSHIPS.

În tabela părinte, se dă clic pe cheia primară, se ţine apăsat butonul stânga şi se deplasează peste câmpul cu acelaşi
nume din tabela părinte şi se eliberează apoi mouse-ul.

2.2 Editarea tabelelor şi navigarea prin înregistrări


În gestionarul de obiecte, se apasă dublu clic pe tabela ce se doreşte a fi editată.

2.3 Obţinerea de informaţii din baza de date


Pentru antrenare a se descărca  Baza de date se află în cadrul acestui document PDF
EvStud-populata.accdb Baza de date cu restricţii şi populată, pentru antrenamentul cu interogări.

27
Evidenţă studenţi
1. Setul nr. 1 de întrebări
a) Care sunt studenţii din anul III, specializarea Informatică economică, ZI?
Varianta 1 – utilizarea Query Design

Din meniul Create se alege Query Design, apoi tabela cerută

Varianta 2 – utilizarea SQL View


Din meniul Create se alege Query Design, dar în formularul ce apare se apasă butonul Close şi nu
Add; se alege, din meniul Design, butonul View (SQL
View)17.
Notă: Modalitatea de scriere în modul SQL View nu este dependentă
de capitalizarea sau nu a literelor dar este mai elegant. De asemenea, tot
scriptul ar putea fi scris pe un singur rând dar se citeşte mai uşor.
După ce a fost finalizată operaţiunea prin una din
cele două variante, se alege opţiunea Run din meniul
Query sau butonul de forma semnului exclamării de pe
bara de butoane (!).
b) Ce studenţi trebuie felicitaţi de Sf. Vasile (1 ianuarie)?
Se utilizează, în cadrul criteriului, simbolul * înainte şi după cuvântul/cuvintele folosite ca şi
condiţie.

17 O altă modalitate este: în zona alocată tabelei (gri) sau pe banda de titlu (Query1: Select Query) se apasă mouse-ul cu clic dreapta şi se
alege opţiunea SQL View.
28
Evidenţă studenţi
Varianta 1 – utilizarea Query Design Varianta 2 – utilizarea SQL View
SELECT *
FROM studenti
WHERE [NumePren] Like '*Vasile'
OR [NumePren] Like '*Sile'
OR [NumePren] Like '*Vasilica'

c) Ce studenţi trebuie felicitaţi de Sf. d) Componenţa grupei 4 de la specializarea Contabilitate şi Informatică


Ion (7 ianuarie)? de Gestiune, ZI, anul III;

Notă: Pentru a face proba, în tabela Studenţi am mai introdus un nou student.
e) Care sunt disciplinele cu peste 6 credite? f) Care sunt disciplinele cu peste 28 de ore de curs şi sub 42
de ore de seminar?

g) În ce zile a susţinut examene studentul cu h) La ce discipline a susţinut examene studentul cu


matricolul ELZ02001? matricolul ELZ02001?

i) Care este codul disciplinelor la care s-au susţinut examene în luna februarie 2006?

29
Evidenţă studenţi
2. Setul nr. 2 de întrebări
a) zilele în care s-a susţinut examen la b) numele studenţilor examinaţi pe 28 ianuarie 2006;
Microeconomie;

Note: 1. Clauza DISTINCT elimină apariţia repetată a unui examen, în cazul în care ar da mai multe examene în aceeaşi zi.
2. Se va avea în vedere formatul datei. Este posibil ca cel românesc să nu fie acceptat, de aceea este bine a se încerca,
spre exemplu şi formatul: #1/28/2006#. A nu se uita de simbolul #.
c) Care sunt studenţii de la Trunchi comun, Zi, Anul I care au picat măcar un examen în februarie 2006?

3. Setul nr. 3 de întrebări


a) denumirea disciplinelor la care a susţinut examen b) numele studenţilor care au picat examenul Baze de
studentul Lama W. Dalai, datele şi notele obţinute; date I măcar o dată;

c) rezultatele din 14 februarie 2006 ale grupei 1 din anul IV, specializarea Marketing, zi, la disciplina Cercetări de
marketing (situaţia va cuprinde matricolul, numele şi nota);
Notă: Pentru a face proba, a fost introdus un student la specializarea cerută şi specializarea Marketing (CodDisc: AE4002)

4. Setul nr. 4 de întrebări


a) Câte discipline au 7 credite? b) Câţi studenţi sunt în anul III, specializarea Informatică
Economică, cursuri de zi?

30
Evidenţă studenţi

c) Câte credite a obţinut studentul Barbu I. Vasile d) Câte credite s-au obţinut la nivelul anului III al specializării
(atenţie, nu se iau în calcul examenele ”picate”!)? Informatică economică, Zi?

e) Care este cea mai mare notă la f) Care este cea mai mică notă obţinută la nivelul anului III,
Microeconomie? specializarea Informatică Economică, Zi?

Notă: Chiar dacă nu este necesar, este mai prudent a plasa un câmp între paranteze pătrate, atunci când el reprezintă
argumentul unei funcţii, adică este plasat şi între paranteze rotunde. Parantezele pătrate se folosesc atunci când
denumirea unui câmp, tabelă etc. au mai mult de un cuvânt.
g) Care este media grupei 1 din anul III, specializarea h) Câte puncte (nr. de credite înmulţit cu nota de la examen)
Informatică Economică, Zi, la disciplina Baze de date a obţinut Lama W. Dalai (atenţie, nu se iau în calcul
I pentru examenul susţinut pe 24 ianuarie 2006? examenele ”picate”!)?

5. Setul nr. 5 de întrebări


a) La ce disciplină a susţinut primul examen studentul b) Care a fost disciplina/disciplinele la care s-au susţinut
Barbu I. Vasile? examenele în ultima zi de sesiune din februarie 2006?

31
Evidenţă studenţi

c) La ce discipline studentul Barbu I. Vasile a obţinut d) Care a fost ultimul examen promovat de studentul Barbu I.
note peste media sa? Vasile?

e) Care este media notelor obţinute la primul examen de Microeconomie de la anul I?

6. Setul nr. 6 de întrebări


a) Câţi studenţi sunt în fiecare an de studii? b) Câte note sub 5 au fost, în total, la fiecare disciplină?

c) Câte examene a susţinut (la câte s-a prezentat) d) Câţi studenţi au susţinut examene în fiecare zi de sesiune?
fiecare student din anul I?

32
Evidenţă studenţi

e) Câţi studenţi au fost examinaţi în cele patru luni de f) Numărul de examene picate, pentru fiecare an de studii.
sesiuni, pentru fiecare disciplină?

7. Setul nr. 7 de întrebări


a) Care dintre anii de studii numără mai mult de 1000 b) Care sunt studenţii care au susţinut în sesiunile ianuarie-
de studenţi? februarie 2006 mai mult de 3 examene?
Notă: Pentru a putea verifica interogarea, am ales ca şi
condiţie cifra 2 în locul lui 1000, neavând o bază de date
cu peste 1000 de înregistrări.

c) Ştiind că facultatea are doar patru săli pentru examinare, să se extragă zilele în care numărul examenelor este mai
mare decât cel al sălilor.

Pentru verificare a se descărca  Baza de date se află în cadrul acestui document PDF
EvStud-rezolvata.accdb Baza de date rezolvată, pentru verificare

33
3 EVIDENŢA VÂNZĂRILOR
3.1 Detalii bază date
Tipul de Valori Text
PK Denumire atribut Lungime Reguli de validare
datăii implicite validare
Clienţi
 Cod client Number Long integer 0 >=100 AND <=999 (18) (19)

 Denumire client Text 25


 Localitate Text 15
 Strada Text 15
 Numar strada Number Integer 0 >=0 (20)

 Distanta Number Integer 0 >=0 (21)

Comenzi
 Cod cda Number Long integer
 Numar cda Number Long integer
 Cod client Number Long integer >=100 AND <=999
 Cod produs Number Long integer
 Cantitate Number Long integer >=0 (22)

 Data comenzii Date/Time Short Date <=DATE() (23)

Produse
 Cod produs Number Long integer 34500 BETWEEN 34500 AND 37199 (24)

 Denumire produs Text 20


 U_M Text 3 IN ("BC";"ML";"TO";"MP";"MC") (25)

 Pret intreg Number Single, Decimal Places

(18) sau BETWEEN 100 and 999


(19) Cod client eronat. Corect este: [100,999]
(20) Numarul strazii trebuie sa fie pozitiv!
(21)Distanta este mai mare ca zero!
(22)Cantitatea trebuie sa fie pozitiva!
(23)Data comenzii depaseste data curenta!
(24)Codul produsului trebuie să fie din intervalul [34500, 37199]
(25)Unitatea de masura poate fi BC, ML, TO, MP, MC

34
Evidenţa vânzărilor

Pentru antrenare a se descărca  Baza de date se află în cadrul acestui document PDF
EvidVanzari-simpla.accdb Baza de date necesară pentru antrenarea cheilor, restricţiilor, regulilor de validare

3.2 Schema bazei de date

Idem şi pentru cealaltă legătură

3.3 Interogări
Pentru antrenare a se descărca  Baza de date se află în cadrul acestui document PDF
EvidVanzari-populata.accdb Baza de date cu restricţii şi populată, pentru antrenamentul cu interogări.

[Ex. 1.1.] Lista comenzilor (numar comanda, data comenzii, denumire client, cantitate, preţ întreg) pentru clienţii din Iaşi care
au comandat cantităţi mai mari de 2000 um.
Query Design

SQL
SELECT [Numar cda], [Data comenzii], [Denumire client], Cantitate, [Pret intreg]
FROM Produse INNER JOIN
(
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client]
35
Evidenţa vânzărilor
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
WHERE Cantitate>2000 AND Localitate="Iasi"
Rezultat

[Ex. 1.2.] Lista comenzilor (numar comanda, data comenzii, denumire client, cantitate, preţ întreg) pentru clienţii din Iaşi sau
pentru cei care au comandat cantităţi mai mari de 2000 um.
Query Design

SQL
SELECT [Numar cda], [Data comenzii], [Denumire client], Cantitate, [Pret intreg]
FROM Produse INNER JOIN (
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
WHERE Localitate="Iasi" OR Cantitate>2000
Rezultat

[Ex. 2.] Lista clienţilor care au comandat produsul Sacou AC-226 (denumire client, număr comandă, data comenzii, denumire
produs, cantitate)
Query Design

36
Evidenţa vânzărilor
SQL
SELECT [Denumire client], [Numar cda], [Data comenzii], [Denumire produs], Cantitate
FROM Produse INNER JOIN (
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client])
ON Produse.[Cod produs] = Comenzi.[Cod produs]
WHERE [Denumire produs]="Sacou AC-226"
Rezultat

[Ex. 3.] Lista clienţilor care au trimis comenzi în luna martie (denumire client, numar comanda, data comenzii, denumire
produs)
Query Design

SQL
SELECT [Denumire client], [Numar cda], [Data comenzii], [Denumire produs]
FROM Produse INNER JOIN (
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
WHERE Month([Data comenzii])=3
Rezultat

[Ex. 4.] Lista produselor comandate pe localităţi (localitate, denumire produs)


Query Design

SQL
SELECT Localitate, [Denumire produs]
FROM Produse INNER JOIN (
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]

37
Evidenţa vânzărilor
Rezultat

[Ex. 5.] Lista produselor comandate de clientii din Suceava şi Vaslui (denumire client, data comenzii, denumire produs,
cantitate)
Query Design

SQL
SELECT [Denumire client], [Data comenzii], [Denumire produs], Cantitate
FROM Produse INNER JOIN (
Clienti INNER JOIN Comenzi ON Clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
WHERE Localitate="Suceava" Or Localitate="Vaslui"
Rezultat

[Ex. 6.] Lista comenzilor în care cantitatea este mai mare de 2000 iar preţul de înregistrare este de peste 150000 lei.
Query Design

38
Evidenţa vânzărilor
SQL
SELECT [Numar cda], Cantitate, [Denumire produs], [Pret intreg]
FROM Produse LEFT JOIN Comenzi ON Produse.[Cod produs] = Comenzi.[Cod produs]
WHERE Cantitate>=2000 AND [Pret intreg]>=150000
Rezultat

[Ex. C1.] Lista localităţilor de unde sunt clienţii26


SQL
SELECT DISTINCT Localitate
FROM clienti
Rezultat

[Ex. C2.] Lista clienţilor în ordine alfabetică: denumire client, cod client, localitate.
Query Design

SQL
SELECT [Denumire client], [Cod client], Localitate
FROM Clienti
ORDER BY [Denumire client]
Rezultat

26 Clauza DISTICT elimină repetarea valorilor care apar mai mult de o dată.
39
Evidenţa vânzărilor
[Ex. C3.] Lista clienţilor, în ordine alfabetică, pe localităţi
Query Design

SQL
SELECT Localitate, [Denumire client], [Cod client]
FROM Clienti
ORDER BY Localitate, [Denumire client]
Rezultat

[Ex. C4.] Lista clienţilor, în ordinea alfabetică a localităţilor şi în ordinea descrescătoare a atributului cod client.
Query Design

SQL
SELECT Localitate, [Denumire client], [Cod client]
FROM Clienti
ORDER BY Localitate, [Denumire client] DESC

40
Evidenţa vânzărilor
Rezultat

[Ex. C5.] Lista comenzilor întocmite de clienţii din Iaşi: cod comanda, numar comanda, denumire client, localitate
Query Design

SQL
SELECT [cod cda], [Numar cda], [Denumire client], Localitate
FROM Clienti INNER JOIN Comenzi
ON Clienti.[Cod client] = Comenzi.[Cod client]
WHERE Localitate="Iasi"
Rezultat

[Ex. C6.] Lista produselor comandate, în ordinea descrescătoare a cantităţilor: numar comanda, cod produs, denumire
produs, cantitate, valoare

41
Evidenţa vânzărilor
Query Design

SQL
SELECT [cod cda], Produse.[Cod produs], [Denumire produs], Cantitate, Cantitate*[Pret intreg] AS Valoare
FROM Produse INNER JOIN Comenzi
ON Produse.[Cod produs] = Comenzi.[Cod produs]
ORDER BY Cantitate DESC
Rezultat

[Ex. C7.] Totalul valoric al comenzilor emise de clienţii din aceeaşi localitate: localitate, total comandat.
Query Design

SQL
SELECT Localitate, Sum([Cantitate]*[Produse].[Pret intreg]) AS Valoare
FROM Produse INNER JOIN (
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
GROUP BY Localitate

42
Evidenţa vânzărilor
Rezultat

[Ex. C8.] Lista produselor comandate în a căror denumire primele litere sunt “Sa” (cod produs, denumire produs, preţ
înregistrare)
Query Design

SQL
SELECT Comenzi.[Cod produs], [Denumire produs], [Pret intreg]
FROM Produse INNER JOIN Comenzi
ON Produse.[Cod produs] = Comenzi.[Cod produs]
WHERE [Denumire produs] Like "Sa*"
Rezultat

[Ex. C9.] Situaţia produselor comandate (cod client, nr. de comenzi, valoare)
Query Design

SQL
SELECT [Denumire client], Count(Comenzi.[cod cda]) AS [Nr comenzi], Sum([Cantitate]*[Pret intreg]) AS Valoare
FROM Clienti INNER JOIN (
Produse INNER JOIN Comenzi ON Produse.[Cod produs] = Comenzi.[Cod produs]
) ON Clienti.[Cod client] = Comenzi.[Cod client]
GROUP BY [Denumire client];

43
Evidenţa vânzărilor
Rezultat

[Ex. C10.] Situaţia produselor comandate (cod client, nr de comezi, valoare medie pe comandă, nr produse comandate)
Query Design

SQL
SELECT [Denumire client], Count([cod cda]) AS [Numarul comenzilor], Avg([Cantitate]*[Pret intreg]) AS Media
FROM Produse INNER JOIN (
Clienti INNER JOIN Comenzi ON Clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
GROUP BY [Denumire client]
Rezultat

44
Evidenţa vânzărilor
[Ex. C11.] Lista comenzilor care au comandat produsul “Sacou” (denumire client, localitate, denumire produs, cantitate)
Query Design

SQL
SELECT [Denumire client], Localitate, [Denumire produs], Cantitate
FROM Produse INNER JOIN (
Clienti INNER JOIN Comenzi ON Clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
WHERE [Denumire produs] Like "Sacou*"
Rezultat

[Ex. C12.] Lista tuturor clienţilor firmei, care au sau nu comenzi (Cod client, denumire client, localitate, Numar cda, Data
comenzii)
Query Design

SQL
SELECT Clienti.[Cod client], [Denumire client], Localitate, [Data comenzii]
FROM Clienti LEFT JOIN Comenzi
ON Clienti.[Cod client] = Comenzi.[Cod client]

45
Evidenţa vânzărilor
Rezultat

[Ex. S1.] Lista clienţilor fără comenzi


Query Design

SQL
SELECT Clienti.[Cod client], [Denumire client], Localitate
FROM Clienti LEFT JOIN Comenzi
ON Clienti.[Cod client] = Comenzi.[Cod client]
WHERE [cod cda] Is Null
Rezultat

46
Evidenţa vânzărilor
Varianta – Subquery
Query Design cu SubQuery

SQL cu SubQuery
SELECT [Cod client], [Denumire client], Localitate
FROM Clienti
WHERE [Cod client] Not In (
SELECT [cod client] FROM comenzi
)

[Ex. S2.] Liste clienţi pe localităţi, cu parametru de căutare


Query Design

 (27)

27 Acest buton poate fi apelat atunci când se doreşte ca parametrul să accepte oar un anumit tip de dată. Utilizarea sa este important, în
special pentru datele de tip numeric, monetary, date/time, deoarece utilizatorul poate fi avertizat explicit când greşeşte tipul de dată, la
introducere. Dacă parametrul este configurat să accepte date de tip text, nu va apărea niciun mesaj de eroare, orice s-ar introduce fiind
interpretat ca text.
De regulă, se ignoră folosirea acestui mod de declarare a parametrului, rezumându-se la introducerea lui direct în zona Criteria. Astfel,
varianta simplă este:
SELECT [Cod client], [Denumire client], Localitate
FROM clienti
WHERE Localitate=[Care este localitatea?]

47
Evidenţa vânzărilor

SQL
PARAMETERS [Care este localitatea?] Text ( 255 ) ;
SELECT [Cod client], [Denumire client], Localitate
FROM clienti
WHERE Localitate=[Care este localitatea?]

[Ex. S3.] Lista clienţilor de tip SRL


Query Design

SQL
SELECT *
FROM clienti
WHERE [Denumire client] Like "*Srl"
Rezultat

[Ex. S4.] Lista clienti din localitati cu nume din 7 caractere

48
Evidenţa vânzărilor
Query Design

SQL
SELECT [Denumire client], Localitate
FROM clienti
WHERE Localitate Like "???????"
Rezultat

[Ex. S5.] Lista produselor din localităţi ce nu au patru caractere


Query Design

SQL
SELECT Comenzi.[Cod produs], [Denumire produs], [Pret intreg], [Denumire client], Localitate
FROM Produse INNER JOIN (
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
WHERE Localitate Not Like "????"
Rezultat

49
Evidenţa vânzărilor
[Ex. S6.] Lista produselor din localităţi care nu se termină în „i”.
Query Design

SQL
SELECT Comenzi.[Cod produs], [Denumire produs], [Pret intreg], [Denumire client], Localitate
FROM Produse INNER JOIN (
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
WHERE Localitate Not Like "*i"
Rezultat

[Ex. S7.] Lista comenzilor grupate pe client


Query Design

SQL
SELECT Comenzi.[Cod client], [Denumire client], Count([cod cda]) AS [Nr comenzi], Sum(Cantitate*[Pret intreg]) AS Valoare
FROM Produse INNER JOIN (
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
GROUP BY Comenzi.[Cod client], [Denumire client]
Rezultat

50
Evidenţa vânzărilor
[Ex. S8.] Lista comenzi grupate pe localitati
Query Design

SQL
SELECT Localitate, Count([cod cda]), Sum(Cantitate*[Pret intreg]) AS Valoare
FROM Produse INNER JOIN (
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
GROUP BY Localitate
Rezultat

[Ex. S9.] Număr comenzi mai mari de 1


Query Design

SQL
SELECT Comenzi.[Cod client], [Denumire client], Count([cod cda]) AS [Nr comenzi], Sum(Cantitate*[Pret intreg]) AS Valoare
FROM Produse INNER JOIN (
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
GROUP BY Comenzi.[Cod client], [Denumire client]
HAVING Count([cod cda])>1
Rezultat

51
Evidenţa vânzărilor
[Ex. S10.] Lista produse comandate
Query Design

SQL
SELECT DISTINCTROW [Denumire produs], [Cod produs]
FROM Produse
WHERE [Cod produs] In (
SELECT [cod produs] FROM [Comenzi]
)
Rezultat

[Ex. S11.] Lista produse necomandate


Query Design

SQL
SELECT [Denumire produs], [Cod produs]
FROM Produse
WHERE [Cod produs] Not In (
SELECT [cod produs] FROM comenzi
)
Rezultat

52
Evidenţa vânzărilor
[Ex. S12.] Lista valorilor comenzilor pentru fiecare client
Query Design

SQL
SELECT [Denumire client], [Numar cda], [Data comenzii], Cantitate*[Pret intreg] AS Valoare
FROM Produse INNER JOIN (
clienti INNER JOIN Comenzi ON clienti.[Cod client] = Comenzi.[Cod client]
) ON Produse.[Cod produs] = Comenzi.[Cod produs]
Rezultat

Pentru verificare a se descărca  Baza de date se află în cadrul acestui document PDF
EvidVanzari-rezolvata.accdb Baza de date rezolvată, pentru verificare

4 EVIDENŢĂ BIBLIOTECĂ
Pentru antrenare a se descărca  Baza de date se află în cadrul acestui document PDF
Biblio.accdb Baza de date necesară pentru antrenarea cheilor, restricţiilor, regulilor de validare

SETUL NR. 1 DE CERINŢE


Q1. Care sunt cititorii din judeţul Suceava şi localitatea Vatra Dornei?
QUERY DESIGN

SQL
SELECT Cod_cit, NumePrenume, CNP, Strada, Localitatea, Judet
FROM CITITORI
WHERE Localitatea="Vatra Dornei"
AND Judet="Suceava"

53
Evidenţa vânzărilor
Notă: Access-ul va introduce automat valorile de tip text între ghilimele, cu condiţia ca acea valoare să nu coincidă cu anumite
expresii rezervate. (De ex. dacă pentru Judet, s-ar folosi redarea din două litere, IS ar însemna judeţul Iaşi, dar IS este şi
cuvânt rezervat de Access; ca atare, în astfel de caz, se introduc manual ghilimelele).

Q2. Care sunt cărţile publicate după 2003 şi intrate în bibliotecă în 2009?

QUERY DESIGN

SQL
SELECT Nr_inv, Cota, Autori, Titlu, Vol, Cod_editura, An_pub, Pret, Data_in
FROM CARTI
WHERE An_pub>=2003
AND YEAR(Data_in)=2009

Q3. Care sunt cărţile mai scumpe de 20 de lei, dar tipărite înainte de 2005?

QUERY DESIGN

SQL
SELECT Nr_inv, Cota, Autori, Titlu, Vol, Cod_editura, An_pub, Pret, Data_in
FROM CARTI
WHERE An_pub<=2005
AND Pret>=20

54
Evidenţa vânzărilor

Q4. Care sunt editurile din Iaşi?

QUERY DESIGN

SQL
SELECT Cod_Editura, Denumire, Localit
FROM EDITURI
WHERE Localit="Iasi"

Q5. Care sunt editurile din Bucureşti?


Idem ca interogarea Q4.

SETUL NR. 2 DE CERINŢE


Q6. Ce cărţi au fost împrumutate în luna februarie 2017?

QUERY DESIGN

SQL
SELECT Cota, Titlu, Data_impr, Month(Data_impr) AS C1, Year(Data_impr) AS C2
FROM CARTI INNER JOIN IMPRUMUT ON CARTI.Nr_inv = IMPRUMUT.Nr_inv
WHERE Month(Data_impr)=2
AND Year(Data_impr)=2017

55
Evidenţa vânzărilor
Notă: Pentru a realiza un ALIAS (ca în exemplul de mai sus – C1 şi C2 – se poate folosi sau nu AS)

Q7. Ce cărţi au fost împrumutate şi returnate în februarie 2017?

QUERY DESIGN

SQL
SELECT Cota, Titlu, Data_retur
FROM Carti INNER JOIN Imprumut
ON Carti.Nr_inv = Imprumut.Nr_inv
WHERE Month(Data_retur)=2
AND Year(Data_retur)=2017

Q8. Care sunt editurile cărţilor împrumutate în 2017?

QUERY DESIGN

56
Evidenţa vânzărilor
SQL
SELECT i.Nr_inv, Data_impr, Titlu, Denumire
FROM Edituri e INNER JOIN (Carti c INNER JOIN Imprumut i ON c.Nr_inv = i.Nr_inv)
ON e.Cod_Editura = c.Cod_editura
WHERE Year(Data_impr)=2017

Notă: Dacă se foloseşte mai des referinţa la o tabelă/un câmp, se poate utiliza un ALIAS; de ex., pentru tabela Edituri, se
poate scrie Edituri e sau Edituri AS e.

Q9. Numele cititorilor şi adresele celor care au împrumutat cărţi de la editura Polirom în 2017

QUERY DESIGN

SQL
SELECT NumePrenume, Strada, Localitatea, Judet, Titlu, Denumire, Data_impr
FROM Edituri INNER JOIN (Cititori INNER JOIN (Carti INNER JOIN Imprumut ON Carti.Nr_inv = Imprumut.Nr_inv)
ON Cititori.Cod_cit = Imprumut.Cod_cit) ON Edituri.Cod_Editura = Carti.Cod_editura
WHERE Denumire="Polirom" AND Year(Data_impr)=2017

57
Evidenţa vânzărilor
Q10. Numele cititorilor din Iaşi care au împrumutat cărţi în 2016

QUERY DESIGN

SQL
SELECT NumePrenume, Strada, Localitatea, Judet, Titlu, Data_impr
FROM Cititori INNER JOIN (Carti INNER JOIN Imprumut ON Carti.Nr_inv = Imprumut.Nr_inv)
ON Cititori.Cod_cit = Imprumut.Cod_cit
WHERE Localitatea="Iasi"
AND Year(Data_impr)=2016

Q11. Numele cititorilor şi adresele celor care nu au returnat cărţile din decembrie 2016

QUERY DESIGN

58
Evidenţa vânzărilor
SQL
SELECT NumePrenume, Strada, Localitatea, Judet, Titlu, Month(Data_impr) AS C1, Year(Data_impr) AS C2
FROM Cititori INNER JOIN (Carti INNER JOIN Imprumut ON Carti.Nr_inv = Imprumut.Nr_inv)
ON Cititori.Cod_cit = Imprumut.Cod_cit
WHERE Month(Data_impr)=12
AND Year(Data_impr)=2016
AND Data_retur Is Null

Q12. Numele cititorilor, adresele şi cărţile cu scadenţa la împrumut depăşită.

QUERY DESIGN

SQL
SELECT NumePrenume, Strada, Localitatea, Judet, Titlu, Data_impr, (Date()-[Data_impr])-[per] AS Depasire
FROM Cititori INNER JOIN (Carti INNER JOIN Imprumut ON Carti.Nr_inv = Imprumut.Nr_inv)
ON Cititori.Cod_cit = Imprumut.Cod_cit
WHERE Date()-Data_impr-per>0 AND Data_retur Is Null

59
Evidenţa vânzărilor
SETUL NR. 3 DE CERINŢE
Q13. Câte împrumuturi au fost realizate în 2010?

QUERY DESIGN

SQL
SELECT Count(*) AS Nr_impr_2017
FROM Imprumut
WHERE Year(Data_impr)=2017

Q14. Câte edituri sunt din Bucureşti?

QUERY DESIGN

SQL
SELECT Count(*) AS Nr_Edit_Buc
FROM Edituri
WHERE Localit="Bucuresti"

60
Evidenţa vânzărilor
Q15. Câte edituri sunt din afara Bucureştiului?

QUERY DESIGN

SQL
SELECT Count(*) AS Nr_Edit_Alte
FROM Edituri
WHERE Localit<>"Bucuresti"

Q16. Care este perioada de întârziere cea mai mare, înregistrată de o carte împrumutată?

QUERY DESIGN

SQL
SELECT Max(Date()-Data_impr-Per) AS Max_per
FROM Imprumut

61
Evidenţa vânzărilor
Q17. Care este media zilelor de întârziere, pe total bibliotecă, la nivelul anului 2016?

QUERY DESIGN

SQL
SELECT Avg(Date()-Data_impr-Per) AS Medie_2016
FROM IMPRUMUT
WHERE Year(Data_impr)=2016

Q18. Câte cărţi a împrumutat cititorul cu numele Zaharia Maria?

QUERY DESIGN

SQL
SELECT Count(*) AS NR_carti
FROM Imprumut
WHERE Cod_cit IN (
SELECT Cod_cit
FROM Cititori
WHERE NumePrenume="Zaharia Maria")

62
Evidenţa vânzărilor
Q19. Câte cărţi împrumutate au cea mai mare perioadă de întârziere?

QUERY DESIGN

SQL
SELECT Count(*)
FROM Imprumut
WHERE Date()-Data_impr-Per In (
SELECT Max(Date()-Data_impr-Per) AS Max_per
FROM Imprumut)

Q20. Care sunt cărţile care au înregistrat cea mai mare perioadă de întârziere?

QUERY DESIGN

SQL
SELECT Cota, Titlu
FROM Carti INNER JOIN Imprumut ON Carti.Nr_inv = Imprumut.Nr_inv
WHERE Date()-Data_impr-Per In (
SELECT Max(Date()-Data_impr-Per) AS Max_per
FROM Imprumut)

63
Evidenţa vânzărilor
SETUL NR. 4 DE CERINŢE
Q21. Numele cititorilor care au prenumele ca derivat de la Vasile

QUERY DESIGN

SQL
SELECT *
FROM Cititori
WHERE NumePrenume Like '* Vasil*'
Or NumePrenume Like '* Sile*'
Or NumePrenume Like '* Vasilica*'

Q22. Câte cărţi sunt intrate pe fiecare an în bibliotecă?

QUERY DESIGN

SQL
SELECT Year(Data_in), Count(*) AS Nr_carti
FROM Carti
GROUP BY Year(Data_in)
ORDER BY Year(Data_in)

64
Evidenţa vânzărilor
Q23. Care este numărul cărţilor publicate pe ani, din cele deţinute de bibliotecă?

QUERY DESIGN

SQL
SELECT An_pub, Count(*) AS Nr_carti
FROM Carti
GROUP BY An_pub
ORDER BY An_pub

Q24. Să se afişeze anii în care numărul cărţilor publicate şi deţinute de biblioteca este mai mare sau egal cu 3

QUERY DESIGN

SQL
SELECT An_pub, Count(*) AS Nr_carti
FROM Carti
GROUP BY An_pub
HAVING Count(*)>=3
ORDER BY An_pub

65
Evidenţa vânzărilor
Q25. Câte împrumuturi au fost sub 7 zile (inclusiv) în fiecare an?

QUERY DESIGN

SQL
SELECT Year(Data_impr), Count(*)
FROM Imprumut
WHERE Per<=7
GROUP BY Year(Data_impr)
ORDER BY Year(Data_impr)

SETUL NR. 5 DE CERINŢE


Q26. Care sunt editurile care ale căror cărţi editate au fost împrumutate în 2017?

QUERY DESIGN

SQL
SELECT DISTINCT Edituri.Cod_Editura, Denumire
FROM Edituri INNER JOIN (Carti INNER JOIN IMPRUMUT
ON Carti.Nr_inv = IMPRUMUT.Nr_inv)
ON Edituri.Cod_Editura = Carti.Cod_editura
WHERE Data_impr Between #1/1/2017# And #12/31/2017#
ORDER BY Denumire

66
Evidenţa vânzărilor
Q27. Care sunt cititorii care au împrumutat mai mult de 2 cărţi?

QUERY DESIGN

SQL
SELECT NumePrenume, Cititori.Cod_cit
FROM Cititori
WHERE Cititori.cod_cit In (
SELECT Cod_cit FROM (
SELECT COUNT(*), Cod_cit FROM Imprumut GROUP BY Cod_cit HAVING COUNT(*)>=2))

Q28. Care sunt editurile care au editate mai mult de 4 cărţi din cele deţinute de bibliotecă?

QUERY DESIGN

SQL
SELECT Denumire, Cod_Editura
FROM Edituri
WHERE Cod_Editura In (
SELECT Cod_Editura FROM (
SELECT COUNT(*), Cod_Editura
FROM Carti
GROUP BY Cod_Editura
HAVING COUNT(*)>=3))

Pentru verificare a se descărca  Baza de date se află în cadrul acestui document PDF
biblio_rezolvat.accdb Baza de date rezolvată, pentru verificare

67
5 MODELE LUCRĂRI PRACTICE
Lucrarea practică nr. 1
Dispuneţi de baza de date VANZARI cu tabelele CLIENTI(Codcl, Nume, Adresa, Zona),
AGENTI(Codag, Nume, Salbaza, Zona) şi COMENZI(Nrcom, Data, Codcl, Codag, Valoare).
 Analizaţi atributele din fiecare tabel şi stabiliţi cheile primare corespunzătoare acestora.
 Definiţi legăturile dintre tabele şi aplicaţi restricţiile referenţiale.
 Definiţi o regulä de validare pentru data comenzii (data comenzii nu poate depăşi data curentă).
 Să se adauge comanda nr. 211 din 11 mai 2010, pentru un client nou (Florio SRL, din zona Nicolina,
pentru care nu se cunoaşte adresa) care va avea codul 550. Comanda a fost preluată de agentul A3 şi
are o valoare de 58 lei.
 Să se afişeze pe ecran o listä a comenzilor din ziua de 9 mai 2010, în ordinea zonelor.
 Calculaţi totalul comenzilor pe zone.
 Să se modifice salariul de bază al agentului cu codul A1 la 460 lei.
 Să se afişeze comenzile cu valoare mai mică de 50 lei din zonele Păcurari sau Bucium (Nrcom,
Codcl, Valoare).
 Să se realizeze un raport al comenzior grupate după agentul care a preluat comanda (Nrcom, Data,
Valoare). În antetul de grup se va afişa numele agentului, iar la sfârşitul grupului valoarea totală a
comenzilor fiecărui agent.
 Definiţi un formular pentru vizualizarea/ actualizarea comenzilor.
Propunere de rezolvare
Pentru antrenare a se descărca  Baza de date se află în cadrul acestui document PDF
Vanzari.accdb Baza de date pentru antrenare
 cheile primare
Clic dreapta pe tabela AGENTI, apoi
alegerea opţiunii Design View

Clic dreapta pe
câmpul CODAG şi
alegerea opţiunii
Primary Key

La tabela CLIENTI, de aceeaşi manieră, se stabileşte cheia primară câmpul CODCL, iar pentru tabela
COMENZI, unde cheia primară este NRCOM.
 legăturile dintre tabele şi restricţiile referenţiale: a se vedea în figura de mai jos.

 regulä de validare: data comenzii nu poate depăşi data curentă.


 În tabela COMENZI, modul Design View, clic pe câmpul DATA, apoi, se completează, ca mai jos:

68
Modele lucrări practice

 comanda nr. 211 din 11 mai 2010, pentru un client nou (Florio SRL, din zona Nicolina, pentru care nu se cunoaşte adresa)
care va avea codul 550. Comanda a fost preluată de agentul A3 şi are o valoare de 58 lei.
Întrucât tabela COMENZI este tabelă copil, atât pentru AGENTI, cât şi pentru CLIENTI, întâi va fi necesar să introducem
noile înregistrări pentru celelalte două comenzi (dacă nu există agentul A3 sau clientul Florio SRL)
Pentru verificare a se descărca  Baza de date se află în cadrul acestui document PDF
Vanzari-rez.accdb Baza de date rezolvată, pentru verificare

Lucrarea practică nr. 2


Dispuneti de baza de date TRANSPORT cu tabelele AUTOBUZE(Numar, Tip, Locuri), PLECARI(Ora,
Destinatie, Marca, Numar) şi SOFERI(Marca, Numepren, CNP, Strada, Numar, Telefon).
Se cere:
 Să se analizeze structurile celor trei tabele şi să se stabilească cheile primare şi, unde este posibil,
cheile alternative.
 Să se stabilească legăturile permanente dintre tabele.
 Să se definească următoarele restricţii:
o În tabela Autobuze literele din câmpul Numar să fie majuscule.
o În tabela Plecari, valorile câmpului Ora să fie cuprinse între 6 şi 22.
o În tabela Plecari, şoferului Zaharia Cezar (marca 1010) îi sunt interzise cursele spre
Bacau.
 Să se scrie o frază SELECT SQL pentru obţinerea listei cu plecările spre Bacău, realizate cu
autobuze care au mai mult de 40 de locuri. Lista va oferi următoarele informaţii: ora plecării, numărul
de înmatriculare, tipul autobuzului, numărul de locuri.
Propunere de rezolvare
Pentru antrenare a se descărca  Baza de date se află în cadrul acestui document PDF
Transport.accdb Baza de date pentru antrenare
 cheile primare / cheile alternative: a se vedea în figura de mai jos28.
 legăturile permanente dintre tabele29.

 restricţii:
o În tabela Autobuze literele din câmpul Numar să fie majuscule.
StrComp(UCASE([numar]);[numar];0)=0
o În tabela Plecari, valorile câmpului Ora să fie cuprinse între 6 şi 22.
BETWEEN 6 AND 22
o În tabela Plecari, şoferului Zaharia Cezar (marca 1010) îi sunt interzise cursele spre Bacau30.
IIF([marca]=1010;IIF([destinatie]="Bacau";False;True);True)
 frază SELECT SQL pentru obţinerea listei cu plecările spre Bacău, realizate cu autobuze care au mai mult de 40 de locuri.
SELECT ora, Autobuze.numar, tip, locuri, destinatie
FROM Autobuze INNER JOIN Plecari

28 Cheia alternativă ar fi CNP-ul, pe care-l regăsiţi în enunţ, la tabela SOFERI, dar nemaifigurat în tabela propriu-zisă. Pe lângă atributul
Indexed, setat Yes (No Duplicates), ar mai putea fi ales şi Required cu opţiunea Yes, pentru a evita valori nule.

29 A nu se face confuzia între câmpul NUMAR, existent în tabelele AUTOBUZE şi PLECĂRI, cu câmpul NUMAR din tabela SOFERI, care
se referă la numărul străzii şi nu al autobuzului ca în primele tabele.
30 Validare la nivel de înregistrare (Property Sheet) pentru că avem nevoie de două câmpuri.

69
Modele lucrări practice
ON Autobuze.numar = Plecari.numar
WHERE locuri>=40 AND destinatie="Bacau"
Pentru verificare a se descărca  Baza de date se află în cadrul acestui document PDF
Transport-rez.accdb Baza de date rezolvată, pentru verificare

Lucrarea practică nr. 3


Dispuneţi de baza de date APROV care conţine tabelele: FURNIZOR(Codfurn, Numefurn, Localitate,
Banca), APROVIZIONARE(Nrfactura, Data, Categorie, Codfurn, Valoarefact) şi PLATI(Nrfactura,
Dataplata, Valoare).
Se cere:
 Să se analizeze structura tabelei Plati şi să se stabilească cheia primară.
 Să se stabilească legăturile permanente dintre tabele şi să se aplice restricţiile referenţiale.
 Să se înregistreze în baza de date o nouă aprovizionare: de la un furnizor nou de birotică (datele
despre furnizor: 1010, FLAMINGO SRL, Iasi, BRD), factura nr. 12445, din 10 mai 2011, în valoare
de 215 lei.
 Să se afişeze o listă a furnizorilor din Iasi sau Vaslui.
 Să se scrie o frază SELECT SQL pentru a obţine o listă a facturilor din categoria “utilitati”, cu
valoarea de peste 200 lei (Nrfactura, Numefurn, Data, Valoarefact).
 Să se întocmească un raport al aprovizionărilor (Număr factură, Data, Nume furnizor, Valoare), cu
gruparea înregistrărilor după categoria de furnizor. Pentru fiecare categorie de furnizor se va calcula
totalul valoric al facturilor.
Propunere de rezolvare
Pentru antrenare a se descărca  Baza de date se află în cadrul acestui document PDF
Aprov.accdb Baza de date pentru antrenare
 cheia primară pentru tabela Plăţi – conform figurii de mai jos.
 legăturile permanente dintre tabele şi restricţiile referenţiale.

 aprovizionare nouă: de la un furnizor nou de birotică (datele despre furnizor: 1010, FLAMINGO SRL, Iasi, BRD), factura
nr. 12445, din 10 mai 2011, în valoare de 215 lei.
INSERT INTO Aprovizionare (nrFactura, data, valoareFac, codFurn, categorie )
SELECT 12445, #5/10/2010#, 215, 1010, "birotica"

sau31

şi
INSERT INTO Furnizori ( codFurn, numeFurn, localitate, banca )
SELECT 1010, "FLAMINGO SRL", "Iasi", "BRD"

sau

În oricare din variantele alese, acţiunea se finalizează apăsând butonul Run (!) din meniul Design. Verificarea

31Varianta cu Append Query presupune următorii paşi:


 Create  Query Design.
 Se apasă butonul Close (nu se adaugă nicio tabelă).
 Se alege din meniul Design opţiunea Append Query. În acest formular se va adăuga tabela dorită (de ex. APROVIZIONARE).
 În formularul structurii interogării se scrie la Field noua înregistrare (de ex. 12445) şi la Append To câmpul unde se adaugă
înregistrarea (de ex. NrFactura). La fel se face şi cu restul înregistrărilor.
A se avea în vedere următoarele aspecte: la valori tip dată se vor scrie între simbolul #, la text, între ghilimele.
De asemenea, dacă trebuie să facem adăugări în mai multe tabele trebuie respectate ordinea populării: întâi părinţii.
70
Modele lucrări practice
operaţiunii se face deschizând tabelele şi urmărind dacă s-au operat adăugările.
 Lista a furnizorilor din Iasi sau Vaslui.
sau

SELECT codFurn, numeFurn, localitate, banca


FROM Furnizori
WHERE localitate="Iasi"
OR localitate="Vaslui"

 Lista facturilor din categoria “utilitati”, cu valoarea de peste 200 lei (Nrfactura, Numefurn, Data, Valoarefact).
SELECT nrFactura, numeFurn, data, valoareFac
FROM Furnizori INNER JOIN Aprovizionare
ON Furnizori.codFurn = Aprovizionare.codFurn
WHERE valoareFac>=200 AND categorie="utilitati"
 Raport al aprovizionărilor (Număr factură, Data, Nume furnizor, Valoare), cu gruparea înregistrărilor după categoria de
furnizor. Pentru fiecare categorie de furnizor se va calcula totalul valoric al facturilor 32.

La rulare va arăta ca mai jos:

Pentru verificare a se descărca  Baza de date se află în cadrul acestui document PDF
Aprov-rez.accdb Baza de date rezolvată, pentru verificare

32 Realizarea acestui raport se poate face din Report Wizard.


71
Modele lucrări practice

Lucrarea practică nr. 4


Dispuneţi de baza de date APROV care conţine tabelele FURNIZOR(Codfurn, Numefurn, Localitate,
Banca), APROVIZIONARE(Nrfactura, Data, Categorie, Codfurn, Valoarefact) şi PLATI(Nrfactura,
Dataplata, Valoare).
Se cere:
 Să se analizeze structura tabelei Plati şi să se stabilească cheia primară.
 Să se stabilească legăturile permanente dintre tabele.
 Să se definească o regulă de validare care să impună ca valoarea maximă a unei facturi pentru un
furnizor din categoria “birotica” să nu fie mai mare de 300 lei.
 Folosind o interogare SELECT SQL, să se afişeze o listă cu facturile care nu au fost plătite integral,
ordonate descrescător după valoarea facturii. Lista va conţine: Nrfactura, Categorie, Valoare.
 Să se obţină un formular pentru vizualizarea /actualizarea nomenclatorului de furnizori.
 Să se întocmească un raport al plăţilor (Număr factură, Nume furnizor, Data plată, Valoare), cu gruparea
înregistrărilor pe zile. Se va calcula total valoare facturi pentru fiecare zi şi valoarea medie a plăţilor zilnice.
Propunere de rezolvare33
Dispuneţi de baza de date APROV care conţine tabelele FURNIZOR(Codfurn, Numefurn, Localitate, Banca),
APROVIZIONARE(Nrfactura, Data, Categorie, Codfurn, Valoarefact) şi PLATI(Nrfactura, Dataplata, Valoare).
Se cere:
 analiza tabelei Plati şi stabilirea cheii primară – conform figurii de mai jos.
 legăturile permanente dintre tabele.

 regulă de validare care să impună ca valoarea maximă a unei facturi pentru un furnizor din categoria “birotica” să nu fie
mai mare de 300 lei34.
IIF([categorie]="birotica";IIF([valoareFac]<=300;True;False);True)
 interogare SELECT SQL, să se afişeze o listă cu facturile care nu au fost plătite integral, ordonate descrescător după
valoarea facturii.35.
SELECT Aprovizionare.nrFactura, categorie, valoarefac-SUM(NZ([valoare],0)) AS [valoare neachitata]
FROM Aprovizionare LEFT JOIN Plati
ON Aprovizionare.nrFactura = Plati.nrFactura
GROUP BY Aprovizionare.nrFactura, categorie, data, valoarefac
HAVING valoareFac >SUM(NZ([valoare],0))
ORDER BY data DESC
sau

33 Esteaceeaşi bază de date folosită la lucrarea anterioară.


34 Validare la nivel de înregistrare (Property Sheet)
35 Dacă enunţul făcea referire doar la facturi neplătite, se putea realiza următoarea interogare:

SELECT nrFactura, categorie, valoareFac


FROM Aprovizionare
WHERE nrFactura Not In (SELECT nrFactura FROM Plati)
ORDER BY data DESC
72
Modele lucrări practice
 formular pentru vizualizarea /actualizarea nomenclatorului de furnizori.

 raport al plăţilor (Număr factură, Nume furnizor, Data plată, Valoare), cu gruparea înregistrărilor pe zile. Se va calcula
total valoare facturi pentru fiecare zi şi valoarea medie a plăţilor zilnice.

73
Modele lucrări practice

 Următorii paşi ţin de gustul estetic, altfel puteţi da direct Finish.

Lucrarea practică nr. 5


Dispuneţi de o bază de date VANZ cu tabelele AGENŢI(Codag, Nume, Adresa, Telefon),
VANZARI(Nrfactura, Data, Valfact, Codag, Codzona) şi ZONE(Codzona, Denumire, Procent).
Se cere:
 Să se analizeze atributele din fiecare tabel şi să se stabilească cheile primare corespunzătoare
acestora.
 Să se stabilească legăturile permanente dintre cele 3 tabele şi să se aplice restricţiile referenţiale.
 Să se adauge factura cu numărul 2222, din data de 12 mai 2011, în valoare de 100 lei. Factura este
întocmită pentru zona Tataraşi de către un agent nou, Marinescu Ioana, de pe strada Ion Creangă, nr.
13, care are codul A10.
 Folosind o interogare SQL, să se afişeze o listă cu vânzările din zona 1, cu valori mai mici de 300 lei
(Lista va conţine: Nume agent, Număr factură, Data facturii, Valoare factură).
 Să se obţină într-un raport vânzările agentului A2, grupate pe zile. Raportul va conţine: Numele
agentului, Numărul facturii, Data facturii şi Valoarea facturii.
Propunere de rezolvare
Pentru antrenare a se descărca  Baza de date se află în cadrul acestui document PDF
Vanz.accdb Baza de date pentru antrenare
 cheile primare sunt redate în figura de mai jos.
 legăturile permanente dintre cele 3 tabele şi restricţiile referenţiale.

 factura cu numărul 2222, din data de 12 mai 2011, în valoare de 100 lei. Factura este întocmită pentru zona Tataraşi de
către un agent nou, Marinescu Ioana, de pe strada Ion Creangă, nr. 13, care are codul A10 36.
INSERT INTO Agenti ( codAg, nume, adresa )
SELECT "A10", "Marinescu Ioana", "strada Ion Creangă, nr. 13"
şi
INSERT INTO Vanzari (nrFactura, data, valFact, codAg, codZona)
SELECT 2222, #1/12/2010#, 100, "A10", 5
 lista cu vânzările din zona 1, cu valori mai mici de 300 lei
SELECT nume, nrFactura, data, valFact
FROM Agenti INNER JOIN Vanzari
ON Agenti.codAg = Vanzari.codAg
WHERE valFact<=300 AND codZona=1

36 Pentru varianta Append Query a se vedea LP2


74
Modele lucrări practice
 Raport cu vânzările agentului A2, grupate pe zile.

 Restul paşilor pot fi doar NEXT sau FINISH direct (nu sunt atât de importanţi, în cazul cerinţei noastre).
 Se închide modul de vizualizare PrintPreview (Close Print Preview). Va apărea automat fereastra Report Design.

 Se activează formularul Property Sheet.


 În acest formular se alege în fereastra Selection Type, cuvântul Report (apăsarea pe săgeţica de la ComboBox-ul
respectiv şi apoi a literei R va duce direct la Report).
 Din Tab-ul Data, la Recodr Source, se apasă butonul de extindere a ferestrei de editare.

. Va apărea Query Design, aferent acestui raport.


 Se dă dublu clic pe câmpul CodAg din tabela Agenti pentru a o introduce în structura interogării, dar se debifează
caseta Show

 Apoi, se scrie la Criteria A2 (ghilimelele vor apărea automat). Se poate face proba ca să ne convingem că sunt doar
selecţiile agentului A2, apoi se închide interogarea.
 Rularea raportului va reda doar vânzările agentului A2 grupate pe zile.
Pentru verificare a se descărca  Baza de date se află în cadrul acestui document PDF
Vanz-rez.accdb Baza de date rezolvată, pentru verificare

75
Modele lucrări practice

i
Tipuri de date
Format Utilizare
Text Valori scurte, alfanumerice, cum ar fi numele sau adresa străzii.
Memo Porțiuni lungi de text. O utilizare obișnuită a câmpului Memo este descrierea detaliată a unui produs.
Number Valori numerice, cum ar fi distanțe. Rețineți că există un tip de date separat pentru valori monetare.
Dimensiune câmp*
Selectați una dintre următoarele variante:
 Byte - Se utilizează pentru numere întregi ∈ [0 ; 255]. Cerința de stocare = 1 byte (octet).
 Integer - Se utilizează pentru numere întregi ∈ [-32,768 ; 32,767]. Cerința de stocare = 2 octeți.
 Long Integer* - Se utilizează pentru numere întregi ∈ [-2.147.483.648 ; 2.147.483.647]. Cerința de stocare = 4 octeți.
 Single - Se utilizează pentru valori numerice în virgulă mobilă, ∈ [-3,4 x 1038 ; 3,4 x 1038] și până la șapte cifre relevante. Cerința
de stocare = 4 octeți.
 Double - Se utilizează pentru valori numerice în virgulă mobilă, ∈ [-1,797 x 10308 ; 1,797 x 10308] și până la 15 cifre relevante.
Cerința de stocare = 8 octeți.
 Replication ID - Se utilizează pentru stocarea identificatorilor unici globali necesari reproducerilor. Cerința de stocare = 16 octeți.
Rețineți că reproducerea nu este utilizată în formatul de fișier .accdb.
 Decimal - Se utilizează pentru valori numerice ∈ [-9,999... x 1027 ; 9,999... x 1027]. Cerința de stocare = 12 octeți.
Date/Time Valorile de dată și oră pentru anii cuprinși în intervalul 100 și 9999.
Currency Valori ale simbolurilor monetare.
AutoNumber Numere ce sunt generate automat pentru fiecare înregistrare
Yes/No Valori Da și Nu și câmpuri care conțin o singură valoare din două. (valori booleene)
OLE Object Obiecte OLE, cum ar fi documente Word.
Hyperlink Text sau combinații de text și numere stocate ca text și utilizate ca adresă hyperlink.
Lookup Afișează o listă de valori care este regăsită dintr-un tabel sau o interogare sau un set de valori pe care l-ați specificat când ați creat
Wizard… câmpul. Va porni expertul Căutare și poate fi creat un câmp Căutare. Tipul de date al unui câmp Căutare este Text sau Număr, în
funcție de opțiunile pe care le selectați în expert.

__________________________

*
Pentru cele mai bune performanțe, specificați întotdeauna cea mia mică Dimensiune de câmp suficientă
**
Utilizați Long Integer când creați o cheie externă pentru a crea o asociere la câmpul cheie primară AutoNumber din alt tabel.

ii
Tipuri de date
Format Utilizare
Text Valori scurte, alfanumerice, cum ar fi numele sau adresa străzii.
Memo Porțiuni lungi de text. O utilizare obișnuită a câmpului Memo este descrierea detaliată a unui produs.
Number Valori numerice, cum ar fi distanțe. Rețineți că există un tip de date separat pentru valori monetare.
Dimensiune câmp*
Selectați una dintre următoarele variante:
 Byte - Se utilizează pentru numere întregi ∈ [0 ; 255]. Cerința de stocare = 1 byte (octet).
 Integer - Se utilizează pentru numere întregi ∈ [-32,768 ; 32,767]. Cerința de stocare = 2 octeți.
 Long Integer* - Se utilizează pentru numere întregi ∈ [-2.147.483.648 ; 2.147.483.647]. Cerința de stocare = 4 octeți.
 Single - Se utilizează pentru valori numerice în virgulă mobilă, ∈ [-3,4 x 1038 ; 3,4 x 1038] și până la șapte cifre relevante. Cerința
de stocare = 4 octeți.
 Double - Se utilizează pentru valori numerice în virgulă mobilă, ∈ [-1,797 x 10308 ; 1,797 x 10308] și până la 15 cifre relevante.
Cerința de stocare = 8 octeți.
 Replication ID - Se utilizează pentru stocarea identificatorilor unici globali necesari reproducerilor. Cerința de stocare = 16 octeți.
Rețineți că reproducerea nu este utilizată în formatul de fișier .accdb.
 Decimal - Se utilizează pentru valori numerice ∈ [-9,999... x 1027 ; 9,999... x 1027]. Cerința de stocare = 12 octeți.
Date/Time Valorile de dată și oră pentru anii cuprinși în intervalul 100 și 9999.
Currency Valori ale simbolurilor monetare.
AutoNumber Numere ce sunt generate automat pentru fiecare înregistrare
Yes/No Valori Da și Nu și câmpuri care conțin o singură valoare din două. (valori booleene)
OLE Object Obiecte OLE, cum ar fi documente Word.
76
Modele lucrări practice

Hyperlink Text sau combinații de text și numere stocate ca text și utilizate ca adresă hyperlink.
Lookup Afișează o listă de valori care este regăsită dintr-un tabel sau o interogare sau un set de valori pe care l-ați specificat când ați creat
Wizard… câmpul. Va porni expertul Căutare și poate fi creat un câmp Căutare. Tipul de date al unui câmp Căutare este Text sau Număr, în
funcție de opțiunile pe care le selectați în expert.

__________________________

*
Pentru cele mai bune performanțe, specificați întotdeauna cea mai mică Dimensiune de câmp suficientă
**
Utilizați Long Integer când creați o cheie externă pentru a crea o asociere la câmpul cheie primară AutoNumber din alt tabel.

77

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