Sunteți pe pagina 1din 23

2.

Interogări QBE (Query by Example)

Înainte de a începe, o întrebare: la ce folosesc interogările?

Răspunsul rapid: la tot! De exemplu:

 Când facem login pe Facebook, are loc o interogare care verifică dacă există înregistrarea cu
utilizatorul și parola introduse în interfața web; apoi, orice pagină FB este generată din zeci e
interogări, care „scot” conținutul relevant din baza de date (imagini, postări etc)
 Când ne uităm pe site de shopping on-line, articolele sunt extrase cu ajutorul interogărilor
din baza de date;
 Când facem o plată cu cardul bancar, se interoghează soldul din baza de date a băncii;
 Tot cu ajutorul interogărilor, se realizează facturile de mobil sau curent electric ;

Așadar, interogările sunt esențiale în orice aplicație.

În acest capitol vom introduce treptat interogările, folosind baza de date supermarket.accdb, care
are următoarele tabele:

Ne aducem aminte că avem Magazine care emit Bonuri. La rândul lor, Bonurile conțin Produse.
Deoarece un bon poate conține multe produse, iar un produs se poate regăsi pe multe bonuri, avem
tabela de legătură ContinutBon, care înregistrează produsele vândute pe fiecare bon și cantitatea în
care s-a vândut fiecare produs.
Interogările sunt folosite pentru a extrage date din baza de date. Rezultatul unei interogări este
întotdeauna o altă tabelă; de exemplu, o interogare care găsește lista bonurilor emise astăzi este tot
o tabelă care conține detalii despre bonuri.

O interogare se poate realiza fie:

 Folosind interfața grafică -- Query Design;


 Folosind limbajul SQL -- Structured Query Language (despre care vom discuta mai târziu)
Cele două metode sunt echivalente. De fapt, metoda grafică este doar o interfață care în final
„produce” fraze SQL.

Să analizăm următoarea interogare:


Obțineți lista cu numele și prețurile produselor care au prețul mai mic de 10 RON.

Pentru a realiza interogarea, trebuie să analizăm cu atenție cerința și răspundem la următoarele


întrebări:

1. Mai întâi, determinăm ce date trebuie să apară în rezultatul nostru. Mai precis, ne întrebăm
ce coloane trebuie afișate? Și din ce tabele provin aceste coloane?
2. Trebuie să determinăm condițiile pe care trebuie să le îndeplinească coloanele respective.
Atenție: pașii de mai sus trebuie reținuți deoarece se aplică pentru orice interogare!

În cazul nostru, vrem să obținem:

1. Următoarele coloane: Numele, Pretul – care observăm că provin din tabela Produs;
2. Condiții: Pret < 10
Pentru implementare, din bara principală alegem CREATE  Query Design. Apare fereastra cu
tabelele disponibile și specificăm din ce tabelă provin coloanele pe care dorim să le obținem în
cadrul interogării.

Selectăm tabela Produs și apăsăm butonul OK.

În ecranul următor, dăm dublu-clic în tabelă pe coloanele Nume si Pret, pentru a le include ca
rezultat al interogării. Ecranul trebuie să arate astfel:
Observăm următoarele:

 În zona (1) se afișează tabelele din care extragem date pentru interogare;
 În zona (2) se afișează coloanele ce vor apărea în interogare și condițiile pe care trebuie să le
îndeplinească fiecare înregistrare pentru a fin inclusă în rezultat.
În zona (2) introducem datele ca în imaginea de mai sus:

1. La Criteria, pe coloana Pret condiția: <10,


2. Pe linia Sort alegem Descending pentru a ordona rezultatul descrescător
3. Rulăm interogarea apăsând butonul ! Run (stânga-sus):

Acum se afișează rezultatul interogării:


Să observăm rezultatul interogării: o listă cu numele și prețurile produselor, ordonată descrescător
după preț.

Acum, să presupunem că dorim să afișăm produsele cu prețul mai mare de 10 RON. Deci trebuie să
edităm interogarea, și navigăm din ecranul curent cu rezultatul interogării, în ecranul anterior, unde
am definit interogarea. Avem mai multe posibilități de navigare:

1. Apăsăm View și alegem Design (Zona 1 din imaginea de mai sus) sau
2. Folosim butoanele din dreapta-jos (Zona 2)
Intrați în modul Design și modificați condiția astfel încât prețul >10 și rulați interogarea. Veți observa
rezultatele aferente. Navigați înapoi în Design și schimbați la varianta inițială, <10.

Vom salva interogarea apăsând butonul de închidere X (1 în imaginea de mai jos), și trecem
denumirea „01 – Produse cu pretul mai mic de 10” (2):

Interogarea trebuie să apară în zona unde se listează obiectele:


Dați dublu-clic pe interogare și aceasta se deschide, afișând rezultatele. Putem trece în modul de
editare al interogării, putem salva modificările, etc. La final, închideți interogarea.

Acum dorim să creăm o nouă interogare, similară cu cea anterioară:

Să se afișeze codurile bonurilor care conțin produse cu prețul mai mic de 10, în cantitate
mai mică de 5 bucăți.

În primul rând, stabilim coloanele de care avem nevoie:

CodBon | Nume | Pret | Cantitate

Observăm că interogarea este similară cu cea anterioară; în plus, trebuie să adăugăm coloanele
CodBon și Cantitate care provin din tabela ContinutBon. Așa că vom crea o copie a interogării
anterioare, și vom edita copia pentru a adăuga tabela ContinutBon din care vom prelua coloanele
necesare. Urmăm pașii descriși în continuare:

1. Din lista de obiecte, clic dreapta pe interogarea anterioară (01 – Produse…) apoi Copy
2. Tot în lista de obiecte, clic dreapta și Paste. Modificăm denumirea astfel încât să fie „02 –
Bonuri cu produse cu prețul mai mic de 10 - sub 5 buc”
3. Intrăm în modul de editare al noii interogări, dând clic-dreapta pe noua interogare, apoi
Design View:
1. Prin drag-drop tragem tabela ContinutBon în zona interogării (Zona 1 în imaginea de mai
sus)
2. În tabela ContinutBon dăm dublu-clic pe CodBon și Cantitate pentru a le adăuga în zona de
rezultate;
3. Selectăm coloana CodBon: clic pe zona gri din partea de sus a coloanei (3) și apoi o mutăm în
stânga coloanei Nume;
4. La Cantitate, punem condiția < 5.
Rulam interogarea (butonul ! Run). Este posibil să avem coduri de bon care apar de mai multe ori,
aceasta se întâmplă deoarece un bon poate conține mai multe produse cu pretul mai mic de 10 și în
cantitate mai mică de 5. Pentru a obține valori unice pentru CodBon:

1. Clic în zona de tabele pentru a activa proprietățile interogării (Property Sheet)


2. Alegem Unique Values
3. Trebuie să de-bifăm Show pentru coloanele din tabela Produs (deoarece acestea cauzează
duplicarea datelor) și să scoatem ordonarea după Pret (de la Sort).
Rulăm interogarea și observăm că acum se afișează valori unice pentru codurile de bonuri. Salvăm
interogarea și închidem.

Felicitări! ...acum este rândul Dvs.!

În continuare creați interogări pentru a afișa date conform cerințelor de mai jos. Salvați interogările
folosind nume relevante, sub forma „Nr - Descriere interogare” Observație: Prefixarea interogărilor
cu numere ne asigură că acestea se afișează în ordinea dorită de noi. În plus, este întotdeauna o idee
bună să dăm nume relevante interogărilor, astfel încât colegii care lucrează la același proiect--și
profesorii care evaluează exercițiile—să poată înțelege ușor menirea interogării respective! Și acum,
interogările de rezolvat:

1. Numele magazinului unde s-a emis bonul 24 – folosiți tabelele Magazin și Bon, condiție pe
CodBon;
2. Numerele bonurilor emise în magazinul cu CodMagazin 3;
3. Numele mărfurilor vândute în anul curent--folosiți ca și criteriu:
Year([DataBon]) = Year(Now()).
Observație 1: aduceți-vă aminte că DataBon este de tipul DateTime, ceea ce înseamnă că
stochează anul, luna, ziua, ora, minutul șî secunda. Noi avem nevoie de anul în care a
fost emis bonul, așadar vom folosi funcția Year() pentru extrage anul din data
completă a bonului. Remarcăm că am dat numele coloanei între paranteze pătrate --
[DataBon]. În dreapta semnului egal, extragem anul folosind tot funcția Year(), pe
care o aplicăm însă datei curente, pe care o aflăm cu funcția Now().
Observație 2: de obicei în câmpul Criteria punem un operator de comparație (> ,<, =) urmat
de o valoare. În cazul de față am folosit o egalitate între doi termeni; să reținem
această posibilitate!
4. Listați magazinele unde s-au vândut produse de panificație. Sfat: folosiți criteriul LIKE
"*Paine*". Explicație: dorim să găsim toate produsele al căror nume conține textul „Paine”,
de aceea folosim LIKE și abrevierea *, care înlocuiește orice caracter. Alt exemplu: dacă
dorim produse care încep cu textul „Paine…” vom folosi LIKE "Paine*" – acum caracterul *
este doar după text.
5. Magazinele care au emis bonuri între iulie și septembrie 2013 – datele calendaristice se
izolează folosind caracterul diez, în felul următor: BETWEEN #7/1/2013# AND #9/30/2013#
6. Produse cu prețul cuprins între 5 și 10 RON sau 20 și 30 RON. Explicație: aici avem două
intervale, iar prețul produsului trebuie să se situeze în primul SAU al doile interval. Deci, la
Pret vom folosi criteriul BETWEEN 5 AND 10, și pe linia or: (imediar sub Criteria) adăugăm al
doilea interval.

7. Aflați codurile bonurilor emise in ultimele doua luni. Atenție: acest gen de interogare se
referă la ultimele două luni de la data execuției interogării! Deci trebuie să luăm ca punct de
referință data curentă:

Datele calendaristice pe care le căutăm sunt ulterioare momentului Now() – 2 luni. Totuși,
nu putem pune condiția Month([DataBon]) > Month(Now())-2. Dacă suntem în luna
Februarie (adică luna 2), condiția va evalua dacă Month(DataBon) > 2 – 2 
Month(DataBon) > 0, condiție care va fi întotdeauna adevărată, deoarece lunile încep de la 1
și se termină la 12. În consecință toate bonurile vor satisface această condiție și ca urmare
vor fi afișate în lista de rezultate (incluzând bonurile emise după februarie!). Încercați și Dvs.
și convingeți-vă! Soluția este să folosim o funcție care returnează data calendaristică precisă
a momentului cu 2 luni în urmă. Funcția este DateAdd(interval, număr_intervale,
data_inițială) – uitați-vă în help sau Google la descrierea funcției, pentru a înțelege cum
funcționează (important pt. examen). Condiția pe care o folosim pentru data bonului va fi: >

DateAdd("m"; -2; Now())

În cuvinte: la data curentă – exprimată prin Now() adaugă -2 intervale de tip „m” – adică
month.

Modificați apoi interogarea pentru a afișa bonurile din ultima lună, și observați că avem mai
puține rezultate.

Observații:

 Textele se includ în ghilimele


 Datele se includ folosind caracterul diez #
 Numerele se scriu direct, fără a folosi caractere pentru a le include
 Numele de coloane se izolează folosind paranteze pătrate: [Coloana]
Observație: în câmpul de criterii putem adăuga oricâte condiții legate prin operatorii logici AND și
OR. Ordinea de verificare a condițiilor poate fi influențată prin folosirea parantezelor.

1.1. Operații și Coloane Sintetice

Dacă putem folosi funcții în zona de criterii, rezultă că vom putea folosi și operații matematice. Ne
putem convinge creând o interogare simplă pe tabela Produs, cu condiția Pret > 5+5. Putem
introduce operații oricât de complexe, și putem influența ordinea evaluării prin paranteze.

Operațiile pot fi folosite și pentru a adăuga în rezultatul interogării coloane noi, care nu există în
tabelele originale. De pildă, vrem să afișam produsele și o coloană care să conțină prețul produsului
majorat cu 10%. Creăm o interogare bazată pe tabela Produs, după cum urmează:

Am introdus coloanele Nume și Pret, apoi în a treia coloana am intrdous formula:

PretMajorat: [Pret]*1,1
Cuvântul PretMajorat reprezintă numele noii coloane, și este despărțit de formula propriu-zisă prin
simbolul „:” (două puncte). Putem folosi orice denumiri dorim pentru noua coloană, dar în general
este de preferat să folosim „notația cămilă”, ca și în cazul celorlalte nume de coloane sau variabile.

Rulăm interogarea și rezultatul este:

Observați a treia colană, care afișează rezultatul operației [Pret] * 1.1. Dorim să formatăm această
coloană ca și valută, astfel încât valorile să fie prefixate cu simbolul aferent (În cazul de față „$”, dar
acesta poate fi determinat de setările regionale ale calculatorului). Ne întoarcem în Design View și:

1. Activăm Property Sheet (este posibil să fi fost deja activat).


2. Selectăm coloana PretMajorat, pentru a-i modifica proprietățile.
3. La Format alegem valuta relevantă. De asemenea, putem modifica celelalte proprietăți
pentru a modifica numărul de decimale etc.
Evident, în expresiile de calcul ale coloanelor putem combina mai multe coloane; vom exemplifica
mai târziu când vom înmulți prețul cu cantitatea produselor pentru a calcula totalul unui bon.
1.2. Funcții de Agregare
Funcțiile de agregare sunt folosite pentru a sumariza informațiile dintr-un set de rezultate. În esență,
informația disponibilă pe mai multe linii ale rezultatului este sumarizată în mai puține linii.

Creați acum o interogare simplă, care afișează codurile tuturor produselor, și rulați-o. Rezultatul
constă într-o singură coloană:

În cazul de mai sus aveam în baza de date 5 produse, și au fost afișate codurile lor. Acum întoarceți-
vă în Design View și dați click pe Totals (1)

Observați că în zona coloanelor (2) apare linia Total, care ne permite să adăugăm funcții de agregare
pentru coloane. Din lista derulantă, alegeți Count. Rulați apoi interogarea. În imaginea de mai jos am
afișat în stânga rezultatul anterior, fără Count, iar în dreapta am afișat rezultatul nou:
Observăm că funcția Count, aplicată coloanei CodProdus, a sintetizat informația returnând o singură
linie cu numărul total de produse. De asemenea, observați că numele coloanei a fost schimbat în
CountOfCodProdus. Salvați acum interogarea folosind o denumire relevantă.

Exercițiu: creați o nouă interogare în care să găsiți prețul mediu al tuturor produselor. Folosim
coloana Pret din tabela Produs și aplicăm funcția de agregare Avg(). În mod similar putem găsi
valorile minime, maxime, deviația standard etc.

1.2.1. Agregare cu Grupare


Funcțiile de agregare sunt deosebit de folositoare pentru sinteza datelor. În exemplul următor, vom
găsi numărul total de produse de pe fiecare bon. Informația de care avem nevoie se găsește în tabela
ContinutBon. Dați dublu-clic pe această tabelă pentru a observa înregistrările:

Vom folosi coloanele:

 CodBon, pe care aplicăm funcția Group, pentru a crea „grupuri” în cadrul rezultatului.
Pentru fiecare CodBon se crează câte un grup. În imaginea de mai sus avem 3 grupuri,
corespunzător celor 3 bonuri diferite (24, 25, și 26).
 Cantitate, pe care aplicăm funcția Sum, pentru a însuma numărul de produse din cadrul
fiecărui grup creat pe CodBon. De exemplu, pentru bonul 24, numărul total de produse este
10 + 8 = 18.
Acum creați o nouă interogare bazată pe tabela ConținutBon, cuprinzând câmpurile CodBon și
Cantitate, și activați butonul Totals.
Alegeți Group By pentru CodBon și Sum pentru Cantitate. Rulați interogarea și observăm rezultatul.
În imaginea de mai jos am inclus și rezultatul anterior:

Observăm că pentru fiecare CodBon s-au însumat cantitățile de produse aferente. Salvați
interogarea cu un nume relevant.

Exerciții: creați interogări pentru cerințele de mai jos:

Observație: folosiți doar două coloane: una pentru grupare, și cealaltă pentru funcții agregate—
chiar dacă aveți nevoie de mai multe tabele. Începeți prin a determina tabelele și coloanele
necesare. Salvați fiecare interogare folosind nume relevante.

1. Numărul de bonuri emis de fiecare magazin. Sfat: Coloanele de care avem nevoie sunt:
CodMagazin și CodBon, ambele din tabela Bon. grupăm după magazin, numărăm bonurile.
2. Numărul total de produse vândute în fiecare oraș. Sfat: avem nevoie de tabelele magazin și
bon. Orașul provine din tabela magazin. Grupăm după oraș, numărăm CodBon.
3. Numărul total de unități vândut din fiecare produs. Ordonați descrescător după numărul
total de unități, pentru a obține topul celor mai bine vândute produse.
4. Similar cu interogarea de mai sus, ordonați crescător pentru a afla cele mai slab vândute
produse.
5. Numărul total de produse vândute în fiecare lună calendaristică (grupați după
Month([DataBon]))
1.2.2. Agregare cu Criterii
Să revenim acum asupra interogării în care calculam numărul total de produse vândut pe fiecare
bon. Dorim să găsim doar bonurile care conțin mai mult de 20 de produse, deci vom adăuga această
condiție la Criteria:

Rezultatul va conține bonurile care îndeplinesc această condiție.

Acum dorim să modificăm interogarea noastră pentru a găsi pe fiecare bon, numărul total de
produse care au prețul mai mare de 7. Intrăm în DesignView și:

1. Ștergem condiția >20 de la Cantitate.


2. Adăugăm tabela Produs (drag-drop din lista de obiecte din stânga).
3. În tabela Produs, dăm dublu-clic pe Pret pentru a-l adăuga în rezultat.
4. Pe linia Total, în dreptul coloanei Produs, alegem din lista derulantă Where. Astfel,
specificăm că această coloană este folosită pentru o comparație (filtrare) și deci nu va
apărea în rezultate. Observați că Access de-bifează automat Show din dreptul coloanei.
5. La Criteria, introduceți condiția >7.

Rulăm interogarea și rezultatul interogării trebuie să arate așa:

Observăm că acum avem mai puține bonuri, cu un număr mai mic de produse, deoarece prin
îndepărtarea produselor cu preț mai mic decât 7, am redus numărul de produse însumat pe fiecare
bon.
În concluzie: cerințele interogărilor trebuie citite cu atenție, pentru a determina coloanele pe care
punem condițiile. Dacă aceste coloane nu sunt cuprinse în rezultat, trebuie să alegem din funcțiile de
agregare opțiunea Where.

Observație: Ca regulă generală: ORICÂND folosim funcția Group By, trebuie să avem o altă coloană
cu un rezultat agregat (Sum, Count, Average etc) și eventual mai multe coloane cu condiții.

Acum rezolvați următoarele interogări. (Observație: deoarece tabelele conțin—în mod intenționat—
puține date, puteți verifica manual rezultatele interogărilor).

1. Numărul total de bonuri emis după 1 noiembrie 2013. Observație: nu avem grupare! În zona
de rezultat vom avea Count pe CodBon, și adăugăm condiția pentru data calendaristică.
2. Afișați prețul celui mai scump produs. Sfat: fără grupare, folosim Max() din toate produsele.
3. Afișați prețul mediu al produselor care conțin textul „Paine”.
4. Afișați numărul total de produse vândut în fiecare oraș, pentru produsele cu prețul cuprins
între 5 și 10 lei.
5. Afișați magazinul cu cel mai mare număr de produse vândut în luna curentă.

1.3. Parametru de la Tastatura

Să presupunem că am salvat o interogare care afișează magazinul cu CodMagazin = 1. Dacă am vrea


să afișăm magazinul cu codul 10, ar trebui să edităm interogarea și să schimbăm parametrul. Însă cel
mai elegant ar fi să lăsăm utilizatorul să specifice valoarea în momentul execuției interogării.

Pentru aceasta, în loc de valoare efectivă „1”, introducem între paranteze pătrate un text, care va fi
afișat la momentul rulării:

La Criteria în dreptul coloanei CodMagazin introducem expresia:

[Introduceti codul magazinului]

1. Realizați acum interogarea de mai sus,


2. Rulați interogarea cu diverse valori,
3. Salvați interogarea.
Parametrii pot fi folosiți și pentru calcule în cadrul coloanelor. Realizați o interogare conform imaginii
de mai jos, pentru a afișa prețurile majorate cu un procent introdus de utilizator:

Salvați interogarea și închideți-o.

1.4. Interogări și sub-interogări (avansat)

Să presupunem că dorim să găsim produsele al căror preț este mai mare decât prețul mediu al
tuturor produselor. Este evident că va trebui să adăugăm un criteriu pentru preț. Dar prețul mediu
este obținut în urma aplicării unei funcții de agregare, iar noi trebuie să comparăm prețul fiecărui
produs cu prețul mediu.

Soluția este să realizăm mai întâi o interogare care calculează prețul mediu al produselor, apoi
interogarea finală, care compară prețul produselor cu prețul mediu obținut în prima interogare.

1. Realizați o interogare pentru a afișa prețul mediu al produselor, ca în imaginea de mai jos.

Schimbați denumirea coloanei astfel încât să fie PretMediu, și pe linia Total alegeți funcția
Avg. Rulați interogarea și observați valoarea rezultatului, precum și numele coloanei:
2. Salvați interogarea, cu numele „Media Preturilor Produselor”.
3. Creați o nouă interogare și alegeți ca surse de date tabela Produs și interogarea Media
Preturilor Produselor (salvată anterior), conform imaginii de mai jos:

Pentru coloana Pret am introdus la Criteria condiția > [PretMediu], care provine din
interogarea anterioară. (Să observăm că între tabelă și interogare nu există nicio relație,
deoarece nu au chei comune). Rulați interogarea, obsevați rezultatul și apoi salvați.

Observație: când realizăm interogări bazate pe alte interogări, este foarte important:

 Să comparăm aceleași tipuri de date, adică prețuri cu prețuri, coduri cu coduri etc;
 Să fim atenți la numărul de rezultate (linii) pe care le returnează sub-interogarea. În cazul de
mai sus, comparam valoarea prețului cu media prețurilor—adică verificăm dacă o singură
valoare este mai mare decât o altă valoare. Dacă sub-interogarea ar fi returnat mai mult de
o valoare ca rezultat, atunci comparația nu putea fi realizată (deoarece am fi comparat o
valoare cu mai multe valori) și interogarea nu se executa. Pentru a vă convinge, modificați
interogarea cu prețul mediu și scoateți funcția Avg, apoi rulați din nou interogarea
principală.
De acum devine evident că interogările pot fi deosebit de complexe, combinând criterii, grupări, sub-
interogări etc. Vom reveni asupra sub-interogărilor în capitolul despre SQL. Până atunci, nu vă faceți
prea multe griji despre sub-interogări.

1.5. Interogări de Modificare a Datelor


În jargonul bazelor de date, operațiile pe tabele se abreviază RCUD – Read, Create, Update, Delete.
Până acum am discutat despre interogări de extragere a datelor (read); în continuare vom prezenta
ștergerea și modificarea datelor.

1.5.1. Actualizare/Modificare a Datelor (Update)


În următorul exemplu vom mări cu 10% prețurile tuturor produselor care au TVA-ul mai mic de 20%.
Înainte de a rula interogarea, să observăm produsele al căror preț va fi modificat:
1. Creați o nouă interogare bazată pe tabela Produs.
2. Activați butonul Update, și completați zona de detalii conform cu imaginea de mai jos:

Atenție: numele coloanelor trebuie întotdeauna inclus între paranteze pătrate!

3. Rulați interogarea și confirmați modificarea datelor. După execuție, interogarea rămâne în


același ecran. Pentru a observa datele modificate, trebuie să deschideți tabela Produs:

Observați că pâinea de casă costă acum 6,05 față de 5,50 înainte de modificare.

1. Închideți și salvați interogarea,


2. Modificați prețurile la valoarea inițială (pentru a menține consecvența rezultatelor pe
parcursul exercițiului). Sfat: dacă am înmulțit cu 1.1, pentru a reveni la valoarea inițială
trebuie să împărțim la 1.1.

Deoarece următoarele cerințe modifică ireversibil datele, creați o copie a bazei de date, închizând-o
și apoi duplicând fișierul.
Realizați interogări pentru următoarele cerințe, pe fișierul de rezervă:

1. Să se modifice prețurile produselor cu un procent introdus ca parametru de la tastatură.


2. Să se reducă cu 15% prețul celor mai slab vândute produse în anul curent (ultimele două
produse). Aici avem nevoie de o sub-interogare care să găsească CodProdus pentru cele mai
slab vândute produse. Rezultatul trebuie limitat la 2 produse, modificând proprietățile
interogării (Top Values). Experimentați până obțineți codurile de produs corecte. Apoi,
interogarea principală (care modifică prețurile) trebuie să pună condiția CodProdus IN
(rezultatul sub-interogării).
1.5.2. Interogări de Ștergere
Atenție: nu există Undo pentru ștergerea datelor din tabele! Citiți cu atenție alertele emise de Access
la rularea interogărilor de ștergere! O interogare fără niciun fel de restricție poate șterge deodată
câteva tabele fără posibilitatea de a recupera datele! De aceea e esențial să testăm interogările de
ștergere pe copii de siguranță (backup) ale bazei de date. Atenție cu interogările de ștergere în
special pe bazele de date din sistemele de producție!

În continuare vom adăuga o înregistrare în tabela Produs, după care o vom șterge.

1. Deschideți tabela Produs și adăugați un nou produs. Notați-vă valoarea lui CodProdus,
deoarece îl vom folosi pentru ștergere.

2. Închideți tabela Produs și creați o nouă interogare, bazată pe tabela Produs. Apăsați din bara
de instrumente butonul Delete și configurați interogarea ca în ecranul de mai jos, astfel încât
să ștergem produsul cu CodProdus = 7.
3. Rulați interogarea. Apare următorul mesaj. Citiți-l cu atenție!

Access ne atenționează că vom șterge o înregistrare, și că nu avem opțiunea Undo.

4. Dați clic pe Yes pentru a confirma ștergerea. Mesajul de atenționare dispare și revenim în
ecranul Design View al interogării. Deși nu este aparent, ștergerea s-a realizat. Pentru a vă
convinge, deschideți tabela Produs și observați că produsul a fost șters.
5. Închideți și salvați interogarea.

Acum vom aborda un caz mai complex. Să presupunem că (după ce am efectuat o copie de rezervă a
bazei de date) vrem să ștergem toate bonurile mai vechi de o lună, pentru a preveni umplerea
discului cu date vechi.

1. Închideți baza de date și creați o copie, apoi deschideți copia.


2. Creați o nouă interogare bazată pe tabela Bon.
3. Nu apăsăm încă butonul Delete din bara de opțiuni. Pornim prin a crea mai întâi o interogare
de selecție, pentru a ne asigura că obținem doar înregistrările care trebuie șterse.
Configurați interogarea ca în imaginea de mai jos:
Funcția DateAdd returnează momentul în timp situat la o lună înaintea datei curente, deci
comparația cu acest moment ne asigură că vom obține bonurile mai vechi de o lună.

4. Rulați interogarea și observați că datele calendaristice ale bonurilor rezultate sunt mai vechi
de o lună. Notați-vă și numărul de înregistrări returnate de această interogare. Apoi
întoarceți-vă în Design View.
5. Acum activați butonul Delete din bara de opțiuni, și rulați interogarea. Apare fereastra de
confirmare, care ne anunță numărul de înregistrări ce vor fi șterse. Acest număr trebuie să
fie același cu numărul de înregistrări returnat la pasul anterior (3).
6. Apăsați Yes pentru a confirma ștergerea. Apare un nouă fereastră:

Mesajul ne anunță că interogarea nu poate fi executată din cauză de încălcare a regulilor


referitoare la chei, și din zero motive legate de încălcarea regulilor de încuiere (blocare) a
scrierii în tabele (vom explica mai târziu despre regulile de blocare). Deci, problema este
cauzată de încălcarea regulilor referitoare la chei. Dar care sunt aceste reguli? Dacă apăsați
Help e posibil să le găsiți. Mai simplu este să căutați în Google textul „access delete key
violations”.

7. Apăsați No pentru a renunța la execuția interogării.


8. Salvați interogarea și închideți-o, pentru a putea reveni mai târziu.
9. Din bara de opțiuni, accesați DATABASE TOOLS > Relationships. În imaginea de mai jos avem
relațiile:
Să ne aducem aminte că fiecărei înregistrări din tabela Bon îi corespund mai multe
înregistrări în tabela ContinutBon, pentru a marca produsele și cantitățile vândute pe bonul
respectiv. Dacă ștergem un bon, atunci în tabela ContinutBon bon vor rămâne înregistrări
orfane—adică fără corespondent în tabela Bon. În imaginea de mai jos am afișat în stânga
tabela de bonuri. Cele tăiate cu linie roșie vor fi șterse (CodBon 24 și 25). În dreapta avem
tabela ConținutBon și observăm produsele vândute pe bonurile 24 ș 25.

Dacă s-ar efectua ștergerea, ar rămâne în baza de date vânzări despre care pierdem
informația despre data calendaristică a vânzării (DataBon) și nu vom ști nici în ce magazin au
fost vândute respectivele mărfuri (dacă ștergem bonul pierdem informația despre
CodMagazin).

Access însă refuză să șteargă bonurile din cauza modului în care am definit relația între
tabele:

10. Dați clic-dreapta pe relația dintre tabelele Bon și ConținutBon, apoi Edit Relationship...
Apare ecranul de editare al relației:
Când am creat relația între tabele, am bifat Enforce Referential Integrity. Această opțiune
asigură că pentru o cheie externă, există o valoare corespondentă a cheii primare. În alte
cuvinte, pentru orice înregistrare din ConținutBon există un Bon valid. Ori dacă am fi șters
bonuri, am fi încălcat această regulă. Din acest motiv, Access nu a permis ștergerea. Soluția
este:

11. Bifați opțiunea Cascade Delete Related Records. Această opțiune va șterge înregistrările
aflate în relație cu bonurile. Adică, la ștergerea unui bon se vor șterge automat și
înregistrările corespondente în tabela ConținutBon, astfel încât baza de date să rămână într-
o stare consistentă, fără înregistrări orfane.
12. Apăsați OK pentru a edita relația, apoi închideți ecranul Relationships.
13. Rulați din nou interogarea de ștergere, apoi deschideți tabela Bon pentru a verifica dacă s-au
șters bonurile.
Acum este rândul Dvs:

 Ștergeți magazinele din București. Observație: trebuie modificată relația dintre Magazin și
Bon.

Observație: în general, nu ștergem date din sistemele de producție. De regulă datele din sistemele
live se arhivează, fără a se șterge definitiv. În cazul nostru:

 Dacă ștergem un produs, îi pierdem prețul și nu vom mai putea calcula corect valoarea
bonurilor
 Dacă ștergem un bon, rămân înregistrări „orfane” în ContinutBon, etc.
De aceea, este necesar să planificăm impactul ștergerii înregistrărilor.

1.6. Interogări Crosstab

Pentru a continua, închideți baza de date pe care ați exersat ștergerile, și deschideți baza de date
care conține toate înregistrările.

În continuare dorim să aflăm cantitatea totală de vânzări pentru fiecare produs, în funcție de zona
geografică (oraș). Observați că avem grupare în funcție de două criterii (Produs, Oraș) și funcția de
agregare Sum(Cantitate). Acest tip de cerință se realizează cu o interogare Crosstab.

1. Creați o nouă interogare în care preluați toate tabelele.


2. Dați clic pe butonul Crosstab din bara de meniuri, și configurați interogarea ca în imaginea
de mai jos:
3. Rulați interogarea. Rezultatul trebuie să arate așa:

Rezultatul arată totalul cantității vândute din fiecare produs, în fiecare oraș. Acum să analizăm
modul în care am definit cele 3 elemente din interogare (antetul liniei, antetul coloanei și valorile din
tabel):

 Pentru Row Heading (antet linie) am ales Oras, folosind funcția de agregare Group By.
 Pentru Column Heading (antet coloană) am ales Produs, folosind funcția de agregare Group
By.
 Pentru Value (valoarea efectivă prezentată în tabel) am ales Cantitate și funcția de agregare
Sum.
Interogările Crosstab sunt deosebit de importante pentru analiza datelor. De obicei, aceste
interogări sunt incluse în rapoartele pentru management și pot folosi ca punct de plecare pentru
fundamentarea deciziilor tactice și strategice, cum ar fi introducerea sau excluderea unei linii de
produse, crearea unei politici de prețuri, extinderea geografică etc.

Realizați interogări Crosstab pentru următoarele cerințe:

1. Cantitatea totală de produse vândute în fiecare lună (coloane), în funcție de Oraș (linii).
2. Prețul mediu al produselor vândute în fiecare lună (coloane), pe fiecare magazin (linii).

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