Documente Academic
Documente Profesional
Documente Cultură
2
DESCRIEREA PROBLEMEI DE REZOLVAT
Reguli de gestiune
3
Structura modulară a aplicaţiei
4
STRUCTURA BAZEI DE DATE
În Figura1 sunt prezentate relaţiile stabilite între tabelele din baza de date:
Proprietăţile câmpurilor
5
Figura 2. Proprietăţi pentru SerieCI.
Cheia externă IDTestare din tabelul Înscrieri trebuie să aibă ca sursă înregistrările corespunzătoare din
tabelul Testări. (Figura3).
În mod similar, cheia externă CNP din tabela Rezultate are ca sursă înregistrările corespunzătoare din
tabelul Testări, în proprietatea Row Source avem: SELECT CNP FROM Candidati. Cheia externă
IDModul din acelaşi tabel va avea ca sursă înregistrările corespunzătoare din tabela Module (Row
Source: SELECT Module.IDModul, Module.DenumireModul, Module.NivelModul FROM [Module]
ORDER BY Module.IDModul;). De asemenea, câmpul IDExaminator va avea ca sursă cheia primară din
Examinatori (Row Source: SELECT IDExaminator, NumePrenumeExaminator FROM [Examinatori]
ORDER BY IDExaminator;), iar câmpul NumarSala va avea ca sursă cheia primară din tabela Sali (Row
Source: SELECT NumarSala FROM Sali). Pentru câmpul DurataTestare se va alege tipul de date
Number. Durata testării se va selecta dintr-o lista cu elementele: 2 ore şi 3 ore, prin schimbări în
categoriile General şi Lookup (Figura4).
6
Figura 4. Câmpul DurataTestare din Testari
În cadrul tabelului Module, câmpul NivelModul poate lua numai valorile Avansat, Mediu sau Începător,
valori ce pot fi selectate dintr-un ComboBox, schimbând proprietăţi ale categoriei Lookup. (Figura5)
Figura 4. Module.NivelModul
7
INTEROGĂRI
2. Se afişează pentru un candidat o listă a modulelor pentru care a obţinut punctaj de promovare
la testările susţinute. Promovarea unui test presupune obţinerea a minim 80 de puncte.
CNP-ul candidatului se introduce la rularea interogării:
3. Următoarea interogare afişează toate modulele de nivel avansaţi, pentru care au fost organizate
mai mult de 20 de testări, în anii 2008 şi 2009.
SELECT Module.DenumireModul, Count(IDTestare) AS NumarTestari
FROM [Module] LEFT JOIN Testari ON Module.IDModul=Testari.IDModul
WHERE Module.NivelModule="avansati"
AND Year(DataTestare) In (2008,2009)
GROUP BY Module.DenumireModul
HAVING Count(IDTestare)>20;
8
4. Afişarea primilor 10 candidaţi înscrişi la testări în prima lună a anului curent. În cazul în care
un candidat s-a înscris la mai multe module, numele acestuia va apărea o singură dată pe listă.
SELECT DISTINCT TOP 10 Candidati.CNP, Candidati.NumePrenume
FROM Candidati INNER JOIN Inscrieri ON Candidati.CNP=Inscrieri.CNP
WHERE (((Month(DataInscriere))=1) AND ((Year(DataInscriere))=Year(Date())));
5. Ştergerea testărilor programate la date anterioare datei curente, dar care nu au avut loc efectiv
deoarece nu s-a înscris niciun cursant.
DELETE *
FROM Testari
WHERE DataTestare<Date() AND IDTestare NOT IN
(SELECT Inscrieri.IDTestare
FROM Testari INNER JOIN Inscrieri
ON Testari.IDTestare=Inscrieri.IDTestare);
6. Următoarea interogare afişează numărul de candidaţi înscrişi pe module, în fiecare an, din anul
2007 până în prezent. Modulele vor fi grupate pe nivele, afişându-se mai întâi cele corespunzătoare
nivelului începatori.
TRANSFORM Count(Candidati.CNP) AS NrCandidati
SELECT Module.NivelModul, Module.DenumireModul
FROM ([Module] INNER JOIN Testari ON Module.IDModul = Testari.IDModul)
INNER JOIN (Candidati INNER JOIN Inscrieri ON Candidati.CNP=Inscrieri.CNP) ON
Testari.IDTestare=Inscrieri.IDTestare
WHERE Year(DataTestare) Between 2007 And Year(Date())
GROUP BY Module.NivelModul, Module.DenumireModul
ORDER BY Module.NivelModul DESC
PIVOT Year(DataTestare);
9
FORMULAR PENTRU ÎNSCRIEREA CANDIDAŢILOR LA TESTĂRILE
PROGRAMATE PENTRU DIFERITE MODULE
10
Figura 5. Formular inscriere candidati
11
On Load: Cod VBA11
În următorul tabel sunt prezentate toate controalele folosite împreună cu proprietăţile modificate
ale acestora:
Control Proprietăţi
Name: cmdAfisareTestariProgramate
Caption: Afisare testari programate
Tip Control: Button On click: Event procedure -> Cod VBA2 (Vezi
Anexa)
Name: lstTestariProgramate
Row source: TestariProgramate
Row source type: Table/Query
Limit to list: Yes
Column count: 5
Column Heads: Yes
Column widths: 2cm, 2.5cm,3.5cm,2.5cm,2cm
Tip Control: List Box
Lista derulantă are drept sursă interogarea
TestariProgramate
Name: cmdFisaInscriere
Caption: FisaInscriere
Tip control: Button
On click: Event procedure -> Cod VBA3 (Vezi
1
Notă: Codurile VBA şi interogările SQL folosite pentru realizarea acestui formular se regăsesc în Anexă
12
Anexa)
Name: txtDataInscriere
Data inscriere:
Tip control: Text Box DefaultValue: Date()
Enabled: No
13
Enabled: No
Se doreşte crearea unui formular care să permită adăugarea unui nou candidat în baza de
date. Acest formular se va deschide la apăsarea butonului Adăugare candidat din cadrul formularului de
înscriere a candidaţilor pentru susţinerea unei testări (prezentat în capitolul anterior). În acest formular,
suplimentar faţă de datele candidatului va fi afişată data naşterii, în funcţie de codul numeric personal.
14
Astfel, formularul va cuprinde casete text pentru introducerea următoarelor date ale candidatului: CNP,
nume şi prenume, serie carte de identitate, număr carte identitate, adresă şi localitate. Suplimentar se vor
adăuga o casetă text în care va fi afişată data naşterii, precum şi un buton Revenire, care închide
formularul, permiţând revenirea la formularul de înscriere a candidatului pentru susţinerea unei testări. În
următorul tabel sunt prezentate aceste două controale suplimentare cu proprietăţile aferente modificate.
Control Proprietăţi
Name: txtDataNasterii
La obţinerea datei de naştere din CNP s-a folosit funcţia Mid care extrage o anumită parte dintr-
un şir de caractere. Argumentele funcţiei sunt:
o şirul de caractere din care se face extragerea
o valoarea poziţională a caracterului de la care se începe extragerea
o numărul de caractere de extras.
15
Figura 6. Formularul Candidati, pentru introducerea a noi candidaţi în baza de date după apăsarea butonului Adăugare
candidat din capitolul anterior.
16
Se urmăreşte crearea unui raport pentru afişarea rezultatelor obţinute de către candidaţi la o
anumită testare, care se va selecta dintr-o listă înainte de deschiderea raportului. În funcţie de punctajul
obţinut, de va afişa calificativul corespunzător astfel:
Dacă punctaj < 80 de puncte => calificativul “nepromovat”
Dacă punctaj >= 80 de puncte => calificativul “promovat”
Rezultatele vor fi afişate în ordine descrescătoare a punctajelor, iar calificativele vor fi formatate
cu culori diferite: roşu pentru nepromovat şi verde pentru promovat.
La finalul raportului, se vor calcula: numărul total de candidaţi, numărul de candidaţi promovaţi
şi numărul de candidaţi respinşi.
Butonul Printare raport din acelaşi formular conţine o comandă macro pentru printarea
raportului obţinut.
Apăsarea butonului Vizualizare raport va avea ca efect deschiderea raportului din figura 7.
17
Figura 7. Raportul rezultatelor obţinute deschis din lista anterioară.
Pentru crearea raportului, au fost folosite drept sursă câmpurile aparţinând mai multor tabele,
după cum urmează:
Tabelul Rezultate: CNP, PunctajObtinut
Tabelul Candidati: NumePrenume
Tabelul Testari: IDTestare, DataTestare
Tabelul Module: DenumireModul, NivelModul
Se va alege opţiunea de vizualizare a datelor în funcţie de Testari (by Testari) şi se va face o
sortare a acestora după câmpul PunctajObtinut, descendent.
Formatarea condiţională a calificativelor, în vederea afişării lor în culori diferite, se face cu
ajutorul butonului Conditional, prezentat în figura următoare:
18
Figura 8. Formatarea condiţională a calificativelor
În antetul raportului se vor muta controalele ce cuprind informaţii privind IDTestare, DataTestare,
DenumireModul şi NivelModul.
Pentru ca raportul creat să afişeze informaţii privind testarea care a fost selectată din listă
(cboTestare), înainte de deschiderea raportului, este necesară adăugarea filtrului: [IDTestare]=Forms!
[Form1]![Combo1].value.
Se adaugă un control de tip Text Box, pentru afişarea calificativului corespunzător fiecărui
candidat. Pentru acesta, se modifică proprietăţile:
În subsolul raportului (Report Footer) se adaugă 3 controale de tip Text Box, pentru calcularea
numărului total de candidaţi, a numărului de candidaţi promovaţi şi a numărului de candidaţi respinşi.
Calcularea acestor elemente şi modificările proprietăţii Control Source ale casetelor text sunt prezentate
în tabelul de mai jos.
19
ANEXĂ
Codul VBA 1.
La încărcarea formularului Inscrieri (evenimentul On Load), controalele aferente fişei de
înscriere nu trebuie să fie vizibile, deoarece înainte de completarea acestora este necesară selectarea
testării pentru care se face înscrierea. Astfel, este necesara definirea următoarei proceduri VBA:
Codul VBA 2.
La apăsarea butonului Afisare testari programate (evenimentul On click) se vor afişa testările
programate pentru modulul selectat la rubrica Denumire modul. În cazul în care nu a fost selectat niciun
modul, se va afişa mesajul “Selectati denumirea modulului”. Procedura aferentă acestui eveniment este
următoarea:
Interogarea TestariProgramate:
SELECT Testari.IDTestare, Testari.DataTestare, Testari.OraIncepereTestare,
Testari.DurataTestare, Testari.TarifTestare, Testari.IDModul,
[NumarLocuriDisponibilePentruFiecareTestare].NumarLocuriDisponibile
FROM Testari INNER JOIN NumarLocuriDisponibilePentruFiecareTestare
20
ON Testari.IDTestare= [NumarLocuriDisponibilePentruFiecareTestare].IDTestare
WHERE (((Testari.DataTestare)>Date())
AND ((Testari.IDModul)=[Forms]![Inscriere]![cboDenumireModul].[value])
AND (([NumarLocuriDisponibilePentruFiecareTestare].NumarLocuriDisponibile)>0));\
În cadrul acestei interogări, au fost utilizate rezultatele altei interogări –
NumarLocuriDisponibilePentruFiecareTestare, care calculează numărul de locuri care au rămas
disponibile pentru fiecare testare programată:
SELECT Testari.IDTestare, Count(Inscrieri.IDInscriere) AS NumarCandidatiInscrisi,
Sali.NumarLocuri, [NumarLocuri]-[NumarCandidatiInscrisi] AS NumarLocuriDisponibile
FROM (Sali INNER JOIN Testari ON Sali.NumarSala = Testari.NumarSala)
LEFT JOIN Inscrieri
ON Testari.IDTestare = Inscrieri.IDTestare
GROUP BY Testari.IDTestare, Sali.NumarLocuri;
Codul VBA 3.
Butonul Fisa inscriere va afişa la executarea evenimentului On click controalele aferente fişei de
înscriere; în cazul în care nu a fost selectată nicio testare din listă, se afişează mesajul “Selectati o testare
din lista”.
Codul VBA 4.
La completarea fişei de înscriere, în situaţia în care candidatul există în baza de date, CNP-ul
acestuia se va selecta din listă la rubrica CNP candidat. În caz contrar, se va utiliza butonul Adaugare
candidat, pentru adăugarea acestuia în baza de date şi apoi se va selecta CNP-ul din listă. În funcţie de
CNP-ul selectat se vor afişa numele şi prenumele candidatului la rubrica Nume candidat. La modificarea
CNP-ului, trebuie să se realizeze şi modificarea numelui şi prenumelui aferente candidatului respectiv.
21
Din acest motiv, este necesară definirea următoarei proceduri la evenimentul On Change aferent
contrulului cboCNP:
Codul VBA 5.
În cazul în care s-a utilizat butonul Adaugare candidat pentru adăugarea unui nou candidat în
baza de date, la revenirea în formularul de înscriere este necesară actualizarea listei CNP-urilor când
aceasta este accesată. Astfel, va fi definită următoarea procedură pentru evenimentul On Got focus aferent
controlului cboCNP:
Codul VBA 6.
Butonul Adaugare candidat are ataşat codul VBA pentru deschiderea formularului Candidati,
utilizat pentru introducerea unui candidat în baza de date. Formularul va fi deschis în modul acFormAdd,
care permite doar introducerea unui nou candidat în baza de date, nu şi modificarea celor existenţi.
Codul VBA 7.
Salvarea înscrierii în baza de date se face prin apăsarea butonului Salvare inscriere. În cazul în
care nu a fost completat CNP-ul candidatului, sistemul afişează un mesaj de atenţionare. Codul VBA
aferent butonului Salvare inscriere este urmatorul:
22