Sunteți pe pagina 1din 17

Aplicația 4 - GESTIUNEA CONTRACTELOR

Firma SC Conta Consulting SRL oferă servicii de consultanţă financiară şi contabilitate pe


bază de contract firmelor-client. Creşterea numărului de firme-client şi necesitatea
urmăririi gradului de încărcare a personalului din firma SC Conta Consulting SRL a
determinat reproiectarea aplicaţiei existente.

Analiza efectuată a stabilit următoarele reguli de gestiune:


 o firmă-client poate avea la un moment dat mai multe contracte cu firma de
consultanţă şi contabilitate;
 pe baza vechimei şi experienţei, fiecare persoană angajată primeşte un grad
profesional: ES (economist senior) sau EJ (economist junior);
 pentru fiecare contract, firma de consultanţă desemnează un responsabil care va
ţine legătura cu firma client;
 pentru fiecare firmă client va lucra o echipă formată dintr-un economist senior
(care este şi responsabil) şi unul sau mai mulţi economişti juniori;
 pot fi responsabili numai persoanele cu gradul profesional ES;
 o persoană din firma de consultanţă financiară şi contabilitate cu gradul
profesional ES poate fi responsabilă în mai multe contracte;
 fiecare economist junior se va regăsi în mai multe contracte, posibil în echipe
diferite.
Se cunosc datele de identificare ale firmelor client: nume, CUI, cont, adresa,… Pentru
fiecare contract încheiat se cunosc: data_încheierii, valoare, data_început, data_finală,
resposabilul desemnat de firma de executantă.

Diagrama entitate – asociere (E-A)


Pentru modelarea aplicaţiei propuse de gestiune a contractelor se consideră patru tipuri
de entităţi: Angajat, Firma, Contract, Echipa.
Asocierea Angajat – Contract stabileşte responsabilul pentru fiecare contract. Este de
tipul 1:N deoarece un angajat (cu gradul profesional ES) poate fi responsabil la mai
multe proiecte.
Asocierea Contract – Firma este de tipul N:1 deoarece o firmă client poate avea la un
moment dat mai multe contracte încheiate cu firma SC Conta Consulting SRL.
Asocierea Contract – Echipa este de tipul 1:1 deoarece la fiecare contract lucrează, în
afara responsabilului, o echipă formată din unul sau mai mulţi economişti cu gradul
profesional EJ.
Asocierea Angajat – Echipa este de tipul M:N deoarece fiecare angajat cu gradul EJ
poate face parte din mai multe echipe şi fiecare echipă cuprinde unul sau mai mulţi
angajaţi.
În modelul prezentat, asocierile sunt reprezentate prin termenii: responsabil, aparţine,
lucrează, încheiat.

1
Observaţii.
 Entitatea Echipa este o entitate slabă, existenţa ei fiind determinată de entitatea
Angajat cu care este asociată.
 În diagrama E-A prezentată am precizat pentru fiecare entitate numai atributele
care vor constitui cheile primare în tabelele asociate.

IDangajat IDcontract
responsabil

1 N
Angajat M Contract
1
M 1 N
1 M
1
aparţine lucrează încheiat

N
M 1 1
1
Echipa Firma

IDcontract IDangajat
CUI

Dicţionarul datelor (DD)


Pe baza regulilor de gestiune se stabileşte dicţionarul datelor (atributelor) care vor face
obiectul operaţiunilor de normalizare.

Nr.crt. Identificator Denumirea


1. IDangajat Marca angajatului (identificator)
2. Nume Numele şi prenumele angajatului
3. CNP Codul numeric personal al angajatului
4. Grad Gradul profesional (ES sau EJ)
5. Tel Numărul de telefon al angajatului
6. Email Adresa de email a angajatului
7. IDcontract Codul de identificare al contractului
8. CUI Codul unic de înregistrare al firmei beneficiare
9. CodResp Codul responsabilului de contract (IDangajat)
10. Val Valoarea totală a contractului (valoarea cu TVA)

2
Continuare
Nr.crt. Identificator Denumirea
11. DataContr Data de început a contractului
12. DataFin Data finală a contractului
13. Firma Denumirea firmei beneficiare (firma client)
14. Cont Contul bancar al firmei beneficiare

Observaţie.
 În situaţii reale dicţionarul datelor cuprinde mai multe atribute. În exemplul
prezentat am considerat numai un număr redus de atribute pentru a mări
claritatea expunerii. De exemplu, la firmele beneficiare au fost omise informaţiile
legate de datele firmei (adresa, numărul de înregistrare fiscală), de persoana de
contact cu executantul, alte clauze.

Definirea modelului relaţional al datelor


Analiza dependenţelor funcţionale şi eliminarea atributelor repetitive conduc la
următoarea structură de relaţii (tabele):

CONTRACT [ IDcontract, CUI, CodResp, Val, DataContr, DataFin ]


Cheia primară este IDcontract , iar CUI este cheie externă care permite efectuarea
legăturii cu tabela FIRMA.

FIRMA [ CUI, Firma, Cont ]


Cheia primară este CUI.

ANGAJAT [IDangajat, Nume, CNP, Grad, Tel, Email ]


Cheia primară este IDangajat , iar CNP este cheie secundară.

ECHIPA [IDcontract, IDangajat ]


Cheia primară este compusă (IDcontract, IDangajat). Această tabelă este necesară
pentru a elimina eventualele atribute repetitive care ar fi apărut în tabela ANGAJAT dacă
se indicau pentru fiecare angajat contractele la care acesta lucrează.

Baza de date proiectată este în forma normală trei (3NF) deoarece:


 toate atributele sunt atomice şi nu există atribute repetitive (1NF);
 nu există dependenţe funcţionale parţiale (2NF);
 nu există dependenţe funcţionale transitive (3NF).

Descrierea restricţiilor de integritate


A. Integritatea domeniului
 IDcontract are valori în intervalul 1-999.
 IDangajat are valori în intervalul 1-99.
 Grad (gradul profesional al angajaţilor) poate lua valorile ES sau EJ.

3
B. Integritatea entităţii
 Valorile cheilor primare trebuie să fie unice şi nenule.
C. Integritatea referirii
 Valorile cheilor externe trebuie să admită valori duplicate.
 Valorile cheilor externe trebuie să figureze printre valorile cheii primare din
relaţia referită. De exemplu, să nu se poată introduce un nou contract dacă
valoarea atributului CUI nu se regăseşte în tabela FIRMA.

Exemplu de populare a tabelelor cu respectarea restricţiilor de integritate

FIRMA [ CUI, Firma, Cont ]

CUI Firma Cont


1234 SC Alfa SRL BCR2233
3456 SC Beta SA BRD3344
5678 SC Gama SRL RZB7711
6789 SC Delta SRL BCR5599

ANGAJAT [IDangajat, Nume, CNP, Grad, Tel, Email ]

IDangajat Nume CNP Grad Tel Email


12 Ardeleanu A. 189… ES 07213 aa@x.ro
23 Dobrogeanu D. 185… EJ 07234 dd@y.ro
34 Olteanu O. 286… EJ 07474 oo@z.com
45 Moldoveanu M. 184… EJ 07451 mm@x.com
56 Braşoveanu B. 295… ES 07225 bb@y.com
67 Munteanu I. 184… ES 07227 mi@z.ro
78 Vrânceanu V. 182… EJ 07418 vv@x.com
89 Mureşanu S. 282… ES 07722 ms@x.com

CONTRACT [ IDcontract, CUI, CodResp, Val, DataContr, DataFin ]

IDcontract CUI CodResp Val DataContr DataFin


111 1234 12 1000 01.06.2016 01.06.2017
222 3456 56 5000 01.01.2016 30.11.2016
333 1234 12 7000 01.01.2016 31.12.2016
444 5678 56 3000 01.10.2016 31.12.2017
555 6789 56 4000 01.11.2016 01.06.2017
777 5678 56 8000 15.03.2015 15.12.2016
888 6789 12 2000 01.01.2017 31.12.2017
999 1234 67 9000 15.08.2016 15.08.2017

4
ECHIPA [IDcontract, IDangajat ]

IDcontract IDangajat
111 34
111 45
111 78
222 78
333 45
333 78
444 34
555 23
555 34
555 45
555 78
777 23
777 45
777 78
888 34
888 45
999 23
999 78

Aplicaţiile care vor fi prezentate în continuare au fost realizate în SQL MS Access. La


crearea tabelelor au fost impuse o serie de restricţii de integritate legate de cheia
primară, cheia externă, valorile anumitor cîmpuri definite implicit prin domeniul
valorilor sau explicit prin enumerarea posibilelor valori, de exemplu:
 valori cuprinse în intervalul (1,100) pentru atributele IDangajat şi CodResp;
 valori cuprinse în intervalul (1,1000) pentru IDcontract;
 valorile “ES” sau “EJ” pentru atributul Grad;
 lungimea atributului CNP de 13 cifre.

Table Field Name Data Type Validation Rule Indexed


ANGAJAT IDangajat Number >0 AND <100 Yes (No Duplicates)
CNP Number Len ([cnp])=13 Yes (No Duplicates)
Grad Text =”ES” OR “EJ”
CONTRACT
IDcontract Number >0 AND <1000 Yes (No Duplicates)
CodResp Number >0 AND <100 No
ECHIPA
IDcontract Number >0 AND <1000 Yes (Duplicates OK)
IDangajat Number >0 AND <100 Yes (Duplicates OK)
FIRMA
CUI Text Yes (No Duplicates)

5
Schema legăturilor dintre tabelele bazei de date

Notă. Pentru toate aplicaţiile care vor fi prezentate Data curentă este 18.01.2017.

P1. Ce contracte sunt în derulare la data curentă?

Lista: | IDcontract | Beneficiar (Firma) | Nume responsabil contract | Valoare |

Algebră relaţională
R1 = SELECT (CONTRACT; DataContr<DATE()<DataFin)
R2 = NATURAL JOIN (R1, FIRMA; CUI)
R3 = NATURAL JOIN (R2, ANGAJAT; CodResp=IDangajat)
R4 = PROJECT (R3; IDcontract, Firma, Nume, Val)
R5 = RENAME (R4; IDcontract, Beneficiar, Responsabil_contract, Valoare)

SQL Access
SELECT IDcontract, Firma AS Beneficiar, Nume AS Responsabil_contract, Val AS Valoare
FROM Contract, Firma, Angajat
WHERE DATE() BETWEEN DataContr AND DataFin
AND Contract.CUI=Firma.CUI
AND CodResp=IDangajat;

6
Rezultatul interogării (Query1)

Report generat pe baza Query1 (ordonat alfabetic dupa Beneficiar)

Raportul (report) se crează din meniul Create Report pe baza interogării (query) salvate,
cu precizarea câmpurilor din query care vor apare. Se pot realiza grupări ale datelor,
ordonări după valorile unuia sau mai multor câmpuri şi alegerea template-ului.

P2. Ce contracte s-au finalizat?

Lista: | IDcontract | Beneficiar (Firma) | Data finalizării | Valoare |

SQL Access
SELECT IDcontract, Firma AS Beneficiar, DataFin AS Data_finalizarii, Val AS Valoare
FROM Contract, Firma
WHERE DATE() > DataFin
AND Contract.CUI=Firma.CUI;

7
Rezultatul interogării (Query2)

Report generat pe baza Query2 (ordonat crescător dupa Data_finalizarii)

P3. La ce contracte aflate în derulare este responsabil angajatul cu IDangajat=56?

Lista: | IDcontract | Beneficiar (Firma) | Responsabil (Nume) | Valoare |

SQL Access
SELECT IDcontract, Firma AS Beneficiar, Nume AS Responsabil_contract, Val AS Valoare
FROM Contract, Firma, Angajat
WHERE DATE() BETWEEN DataContr AND DataFin
AND Contract.CUI=Firma.CUI
AND CodResp=IDangajat
AND CodResp=56;

Rezultatul interogării (Query3)

Observaţie.
Dacă se doreşte introducerea în mod conversaţional a codului responsabil:

8
SELECT IDcontract, Firma AS Beneficiar, Nume AS Responsabil_contract, Val AS Valoare
FROM Contract, Firma, Angajat
WHERE DATE() BETWEEN DataContr AND DataFin
AND Contract.CUI=Firma.CUI
AND CodResp=IDangajat
AND Cod_Responsabil=CodResp;

Interogarea codului responsabil

Rezultatul obţinut este evident acelaşi:

Rezultatul interogării (Query3) în varianta introducerii


în mod conversaţional a codului responsabil

P4. La ce contracte finalizate a fost responsabil angajatul cu IDangajat = 56?

Lista: | IDcontract | Beneficiar (Firma) | Data finalizării | Valoare |

SQL Access
SELECT IDcontract, Firma AS Beneficiar, DataFin AS Data_finalizarii, Val AS Valoare
FROM Contract, Firma
WHERE DATE() > DataFin
AND Contract.CUI=Firma.CUI
AND Cod_Responsabil=CodResp;

Codul responsabilului se introduce în mod conversaţional:

9
Rezultatul interogării (Query4)

P5. Există economişti seniori (grad ES) care nu sunt responsabili la niciun contract?

Lista: | IDangajat | Nume | Grad |

Algebră relaţională
R1 = SELECT (ANGAJAT; Grad=”ES”)
R2 = PROJECT (R1; IDangajat)
R3 = PROJECT (CONTRACT; CodResp)
R4 = DIFFERENCE (R2, R3)
R5 = NATURAL JOIN (R4, ANGAJAT; IDangajat)
R6 = PROJECT (R5; IDangajat, Nume, Grad)

SQL Access
SELECT IDangajat, Nume, Grad
FROM Angajat
WHERE IDangajat NOT IN (SELECT CodResp FROM Contract)
AND Grad="ES";

Rezultatul interogării (Query5)

P6. Care este colectivul (economişti juniori) care lucrează la contractul IDcontract =
333?

Lista: | IDcontract | | IDangajat | Nume | Grad |

SQL Access
SELECT IDcontract, Angajat.IDangajat, Nume, Grad
FROM Angajat, Echipa
WHERE Angajat.IDangajat=Echipa.IDangajat
AND Numar_contract=IDcontract;

10
Numărul contractului (IDcontract) se introduce în mod conversaţional:

Rezultatul interogării (Query6)

Report generat pe baza Query6

P7. Generaţi un raport al contractelor finalizate la data curentă cu evidenţierea


colectivelor care au lucrat.

Forma raportului:

IDcontract Data finala IDangajat Nume Grad


xxx ll/zz/aaaa
yy nnnn ES
zz mmmm EJ
... … …
xxx ll/zz/aaaa
… … …

11
SQL Access
SELECT Contract.IDcontract, DataFin AS Data_finala, Angajat.IDangajat, Nume, Grad
FROM Contract, Angajat, Echipa
WHERE DATE()>DataFin
AND Angajat.IDangajat=Echipa.IDangajat
AND Contract.IDcontract=Echipa.IDcontract
UNION
SELECT Contract.IDcontract, DataFin AS Data_finala, Angajat.IDangajat, Nume, Grad
FROM Contract, Angajat
WHERE DATE()>DataFin
AND IDangajat=CodResp;

Rezultatul interogării (Query7)

Report generat pe baza Query7

12
Obseravţie. Raportul este grupat după IDcontract şi ordonat descrescător dupa Grad,
astfel încât responsabilul să fie pe prima poziţie a colectivului.

P8. Generaţi un raport util managerului firmei SC Conta Consulting SRL din care să
rezulte valoarea centralizată pe responsabili (economişti seniori) a contractelor în
derulare.

Forma raportului:

Nume responsabil Valoarea totala


xxx nnnn
… …

SQL Access
SELECT Nume AS Nume_responsabil, Valoare_totala
FROM Angajat, [SELECT CodResp, SUM(Val) AS Valoare_totala
FROM contract
WHERE (DATE() BETWEEN DataContr AND DataFin)
GROUP BY CodResp]. AS Tmp1
WHERE IDangajat=CodResp;

Rezultatul interogării (Query8)

Report generat pe baza Query8

13
P9. La ce contracte lucrează împreună economiştii juniori Olteanu O. (IDangajat = 34)
şi Moldoveanu M. (IDangajat = 45) ?

Algebră relaţională
R1 = SELECT (ANGAJAT; IDangajat=”34” OR IDangajat=”45”)
R2 = PROJECT (R1; IDangajat)
R3 = DIVISION (ECHIPA, R2)

Comentariu. Relaţia R2 are numai un singur atribut (IDangajat) şi două tupluri:

R2 IDangajat
34
45

Relaţia R3, obţinută ca rezultat al diviziunii, are un singur atribut (IDcontract) şi trei
tupluri:
R3 IDcontract
111
555
888

SQL Access

SELECT Tmp34.IDcontract
FROM (SELECT IDcontract
FROM Echipa
WHERE IDangajat =34) AS Tmp34,
(SELECT IDcontract
FROM Echipa
WHERE IDangajat =45) AS Tmp45
WHERE Tmp34.IDcontract=Tmp45.IDcontract;

Rezultatul interogării (Query9) Report generat pe baza Query9

14
Observaţie.
Dacă se doreşte introducerea în mod conversaţional a codurilor pentru responsabili:

SELECT Tmp1.IDcontract
FROM [SELECT IDcontract
FROM Echipa
WHERE IDangajat=Primul_IDangajat]. AS Tmp1,
[SELECT IDcontract
FROM Echipa
WHERE IDangajat=Al_doilea_IDangajat]. AS Tmp2
WHERE Tmp1.IDcontract=Tmp2.IDcontract;

Rezultatul interogării (Query9) Report generat pe baza Query9

P10. Să se determine angajaţii (economişti juniori) care fac parte concomitent din
colectivele contractelor IDcontract = 555 şi IDcontract = 888.

Algebră relaţională
R1 = SELECT (CONTRACT; IDcontract=”555” OR IDcontract=”888”)
R2 = PROJECT (R1; IDcontract)
R3 = DIVISION (ECHIPA, R2)
R4 = NATURAL JOIN (R3, ANGAJAT; IDangajat)
R5 = PROJECT (R4; Nume)

Comentariu. Relaţia R2 are numai un singur atribut (IDcontract) şi două tupluri:

R2 IDcontract
555
888

15
Relaţia R3, obţinută ca rezultat al diviziunii, are un singur atribut (IDangajat) şi două
tupluri:
R3 IDangajat
34
45

Relaţia R4, obţinută ca rezultat al joncţiunii naturale dintre relaţiile R3 şi Angajat, este:

IDangajat Nume CNP Grad Tel Email


34 Olteanu O. 286… EJ 07474 oo@z.com
45 Moldoveanu M. 184… EJ 07451 mm@x.com

Relaţia R5 rezultat al proiecţiei pe atributul Nume este:

Nume
Olteanu O.
Moldoveanu M.

SQL Access

SELECT Nume
FROM Angajat
WHERE IDangajat IN
(SELECT Tmp555.IDangajat
FROM (SELECT IDangajat
FROM Echipa
WHERE IDcontract=555) AS Tmp555,
(SELECT IDangajat
FROM Echipa
WHERE IDcontract=888) AS Tmp888
WHERE Tmp555.IDangajat=Tmp888.IDangajat);

Rezultatul interogării (Query10) Report generat pe baza Query10

16
Dacă se doreşte introducerea în mod conversaţional a codurilor pentru contracte:

SELECT Nume
FROM Angajat
WHERE IDangajat IN
(SELECT Tmp1.IDangajat
FROM (SELECT IDangajat
FROM Echipa
WHERE IDcontract=Primul_IDcontract) AS Tmp1,
(SELECT IDangajat
FROM Echipa
WHERE IDcontract=Al_doilea_IDcontract) AS Tmp2
WHERE Tmp1.IDangajat=Tmp2.IDangajat);

Rezultatul interogării (Query10) Report generat pe baza Query10

17

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