Acest proiect trateaz crearea unei baze de date pentru a ine evidena vnzrilor dintr- o farmacie unde se vnd medicamente fr prescripie medical.
Farmacia are un stoc de medicamente pentru care sunt reinute urmtoarele informaii: Un cod unic de indetificare Denumirea medicamentului Preul unitar al medicamentului Numr de buci Pentru a ine evidea unei vnzri farmacia va elibera o factura ce conine: Un cod unic de indetificare Data la care s-a efectuat vnzarea Preul total achiat de client Detalierea acestei facturi va conine urmtoarele informaii: Un cod unic de indentificare Numarul de buci cumprate dintr-un anumit produs Codul medicamentului Codul facturii
3 | P a g e
2. COLECTAREA I ANALIZA DATELOR. MODELUL CONCEPTUAL
Primul pas n realizarea unei aplicatii de baze de date este analiza datelor si realizarea unei scheme conceptuale a acestora. In aceasta etapa sunt analizate natura si modul de utilizare a datelor. Sunt identificate datele care vor trebui memorate si procesate, apoi se impart aceste date in grupuri logice si se identifica relatiile care exista intre aceste grupuri. Odata obtinute informatiile necesare realizarii modelului conceputual din intervievarea oamenilor din cadrul farmaciei, acestea trebuie reprezentate intr-o forma convetionala, care sa poata fi usor inteleasa de toata lumea. O astfel de reprezentare este diagrama entitati-relatii : ERD ( Entity Relationship Diagram). In cele ce urmeaza vom prezenta elementele ERD-ului farmaciei noastre.
apare contine
Un medicament poate sa apara pe una sau mai multe facturi, iar o factura trebuie sa contina unul sau mai multe medicamente. Relatia dintre entitatea medicament si entitatea factura este de tipul many-to-many. Rezolvarea relatiei many-to-many consta in introducerea unei noi entitati, numita entitate de intersectie, pe care o legam de entitatile originale, prin cate o relatie one-to-many. In cazul de fata entitatea de intersectie se va numi vanzare, relatiile, care pleaca din ea, fiind obligatorii in aceasta parte.
MEDICAMENT #cod *denumire *pret *prezentare *buc FACTURA #id *data *pret_total 4 | P a g e
Un medicament poate sa fie vandut cel putin o data. O vanzare trebuie sa contina un medicament. O factura trebuie sa fie emisa pentru una sau mai multe vanzari. O vanzare trebuie sa aiba o factura. Urmatorul pas este adaugarea de atribute in cazul entitatii de intersectie.
a r e
c o n t i n e
VANZARE #cid *buc_med
MEDICAMENT #cod *denumire *pret *prezentare *buc FACTURA #id *data *pret_total VANZARE 5 | P a g e
3. Implementarea modelului conceptual Transformarea modelului conceptual al ERD-ului in modelul fizic, adica in baza de date propriu-zisa, se numeste mapare. Acest process implica transformarea fiecarui element al ERD- ului. Prima etapa a acestui proces consta in crearea tabelelor bazei de date astfel: Fiecarei entitati ii va corespunde cate un table. Fiecare atribut al unei entitati va deveni o coloana a tabelei Fiecare coloana va memora date de acelasi tip; Fiecare instanta a unei entitati se va transforma intr-un rand al tabelului corespunzator Unicul identificator al entitatii devine cheia primara a tabelei Informatiile despre o tabela a bazei de date vor fi prezentate folosind DIAGRAMA DE TABELA.
Maparea entitatilor Pentru entitatea MEDICAMENT vom crea tabela MEDICAMENTE astfel:
MEDICAMENT #cod *denumire *pret prezentare *buc
7 | P a g e
MEDICAMENTE numele entitatii la plural numele tabelei atributul coloana
instanta linia
DIAGRAMA DE TABELA: MEDICAMENTE Numele coloanei Tip de date Tip cheie Optionalitate cod Number PK * denumire Varchar2 - * pret Number(7,2) - * prezentare Varchar2 - buc Number - *
Pentru entitatea FACTURA vom crea tabela FACTURI astfel:
CREATE TABLE `pharmacy`.`Facturi` ( `ID` INT NOT NULL , `data` DATETIME NOT NULL , `pret_total` VARCHAR(45) NOT NULL , PRIMARY KEY (`ID`) ); 11 | P a g e
Popularea tabelei FACTURI cu date: INSERT INTO `pharmacy`.`Facturi` (`ID`, `data`, `pret_total`) VALUES ('4', '12-05-2012', '26.4'); INSERT INTO `pharmacy`.`Facturi` (`ID`, `data`, `pret_total`) VALUES ('7', '14-12-2012', '90.6');
c) Vanzari
CREATE TABLE `pharmacy`.`Vanzari` ( `CID` INT NOT NULL , `cod_med` INT NOT NULL , `buc_med` INT NOT NULL , `id_factura` INT NOT NULL , PRIMARY KEY (`CID`) );
12 | P a g e
ALTER TABLE `pharmacy`.`vanzari` ADD CONSTRAINT `med` FOREIGN KEY (`cod_med` ) REFERENCES `pharmacy`.`medicamente` (`cod` ) ON DELETE NO ACTION ON UPDATE NO ACTION, ADD CONSTRAINT `fact` FOREIGN KEY (`id_factura` ) REFERENCES `pharmacy`.`facturi` (`ID` ) ON DELETE NO ACTION ON UPDATE NO ACTION , ADD INDEX `med_idx` (`cod_med` ASC) , ADD INDEX `fact_idx` (`id_factura` ASC) ;
Popularea tabelei VANZARI cu date: INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('41', '102', '1', '4'); INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('44', '41', '1', '7'); INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('45', '123', '2', '7'); INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('61', '124', '1', '7'); INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('62', '102', '2', '7'); 13 | P a g e
Pentru factura cu id-ul 4 in tabela vanzari avem 2 linii deoarece au fost vandute medicamentele cu codurile 102 si 1, din primul o bucata, iar din al doilea doua bucati. Vom modifica acum in tabela medicamente numarul de bucati din medicamentele cumparate. update medicamente set buc=buc-1 where cod=102 update medicamente set buc=buc-2 where cod=1 Pentru factura cu id-ul 7 vom proceda analog. update medicamente set buc=buc-2 where cod=124
update medicamente set buc=buc-1 where cod=41 update medicamente set buc=buc-1 where cod=81 update medicamente set buc=buc-2 where cod=21 update medicamente set buc=buc-1 where cod=122
14 | P a g e
update medicamente set buc=buc-2 where cod=102
5. Interogari
SELECT * FROM pharmacy.medicamente;
Cate cutii de comprimate exista in farmacie? SELECT sum(buc) FROM pharmacy.medicamente; WHERE prezentare='comprimate'; In ce data s-a efectuat vanzarea cu codul 41? SELECT data FROM pharmacy.facturi a, pharmacy.vanzari b WHERE a.ID=b.id_factura and b.CID=41; Efectuati modificarile necesare pentru o vanzare. o Vom avea nevoie de o procedura de cautare cu 5 parametri, dintre care unul de intrare, care reprezinta denumirea medicamentului cerut si 4 de iesire prin care procedura va scoate codul, pretul, numarul de bucati si daca medicamentul exista sau nu in baza de date. create or replace procedure cautare (x pharmacy.medicamente.denumire%type, y out pharmacy.medicamente.cod%type, z out pharmacy.medicamente.pret%type, t out pharmacy.medicamente.buc%type, g out int) is begin select pret, cod, buc,1 into z,y,t,g from pharmacy.medicamente where upper(denumire)=upper(x); 15 | P a g e
exception when no_data_found then z:=0; y:=0; t:=0; g:=0; end;
o Blocul anonim in care se efectueaza modificarile necesare in tabele:
Declare x varchar2(20); y pharmacy.medicamente.cod%type; z pharmacy.medicamente.pret%type; t pharmacy.medicamente.buc%type; g number; c number; xx number; yy number; stotal decimal(8,2); begin
stoal:=0; select "FACTURI_SEQ".nextval into xx from dual; insert into pharmacy.facturi values (xx,sysdate,0); x:= :dati_med; cautare(x,y,z,t,g); 16 | P a g e
if(g=0) then dbms_output.put_line('Nu avem '||x); else dbms_output.put_line('Avem '||t||'bucati din medicamentul '||x||' la pretul '||z||' lei'); c:= :dati_cantitatea; if c>t then dbms_output.put_line('Nu avem cantitatea ceruta'); else update medicamente set buc=buc-c where cod=y; select "VANZARI_SEQ".nextval into yy from dual; insert into pharmacy.vanzari values (yy,y,c,xx); stotal:=stotal+c*z; end if; end if; if(g=1) then update pharmacy.facturi set pret_total=stotal where id=xx; else delete from facturi where id=xx; end if; end;
17 | P a g e
Farmacia primeste ca marfa: 2 bixtonim picaturi, 2 tusin comprimate, 5 mucosin sirop la pret 20.3 lei. update pharmacy.medicamente set buc=buc+2 where cod=41;
update pharmacy.medicamente set buc=buc+10 where cod=121;
Afisati in ordine alfabetica medicamentele sub forma de comprimate select * from pharmacy.medicamente where prezentare='comprimate' order by denumire; o Procedura ce ordoneaza alfabetic medicamentele si are un parametru de intrare create or replace procedure alfa(x pharmacy.medicamente.prezentare%type) is cursor c is select denumire,prezentare from medicamente where prezentare=x 18 | P a g e
order by 1; begin for v in c loop dbms_ouput.put_line(initcap(v.denumire)||' '||v.prezentare); end loop; end; o Blocul anonim in care apelam procedura begin alfa(comprimate); end; Cate facturi s-au efectuat intre anumiti ani? o Vom folosi o functie care numara facturile si are drept parametrii de intrare doua numere: create or replace function catef (a number, b number) return number is cate number; begin select count(*) into cate from facturi where to_number(to_char(data,'yyyy')) between a and b; return cate; end; o Blocul anonim: declare a number; b number; begin a:= :dati_an1; b:= :dati_an2; dbms_output.put_line('S-au eliberat '||catef(a,b)||' facturi in perioada '||a||'- '||b);end;
19 | P a g e
Care este cea mai mare incasare? select max(pret_total), count(id_factura) from pharmacy.vanzari a, pharmacy.facturi b where a.id_factura=b.id ;
Care este pretul mediu al vanzarilor? select avg(pret_total) from pharmacy.facturi ; Scumpiti cu 10% medicamentele sub forma de picaturi. update pharmacy.medicamente set pret=1.1*pret where prezentare='picaturi'; select * from pharmacy.medicamente where prezentare='picaturi';
20 | P a g e
6. Bibliografie Manual de informatica autor Carmen Popescu, editura L&S 2007 https://academy.oracle.com