Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Sql


Index » educatie » » informatica » Sql
» - Proiect ASSI - Proces organizational - Aplicatie farmacie


- Proiect ASSI - Proces organizational - Aplicatie farmacie


Universitatea Politehnica Bucuresti

Facultatea de Automatica si Calculatoare

Proiect ASSI -

Proces organizational - Aplicatie farmacie



Bucuresti,

Justificarea metodelor folosite

Cerintele proiectului "Aplicatie farmacie" au fost de a crea un program functional si simplu care sa permita managementul si buna functionarea a unui lant de farmacii de dimensiuni mici sau medii. De mentionat este ca produsul este conceput in scop pur didactic iar o folosire a acestuia in productie este foarte putin probabila in stadiul sau actual. Totusi datorita metodelor folosite si alegerii unei strategii adaptive, acest proiect ar putea fi scheletul unei aplicatii cu adevarat fezabile care sa poata fi folosita cu succes.

Fiindca noutatea domeniului din punct de vedere al informatizarii este destul de mic iar gradul de previzibilitate a actiunilor de modelat este mare am ales o strategie clasica. Desi experienta echipei in realizarea de siteme informatice similare este destul de redusa si astfel efortul pentru stabilirea solutiei a fost destul de mare ceea ce ar fi indicat o strategie a prototipizarii am ales totusi strategia clasica datorita faptului ca astfel de aplicatii au mai fost create. Atunci care este noutatea ? Noutatea este folosirea tehnologiilor software de ultima generatie si a modelului client-server , spre deosebire de alte aplicatii care folosesc medii de programare invechite si se apropie de sfarsitul ciclului de viata.

Din punct de vedere al mediului de programare am ales PHP 5 pentru crearea interfetei cu utilizatorul si MySQL pentru bazele de date. Desi MySQL nu este foarte indicat pentru cantitati foarte mari de date, capabilitatile sale sunt mai mult decat suficiente. Oricum daca aplicatia fiind adaptabila, cu mici modificari se poate schimba MySQL cu ORACLE, mediu adecvat pentru aplicatii de mari dimensiuni. Un avantaj al MySQL este faptul ca fiind un program free, nu necesita o investitie initiala foarte mare.

Pe de alta parte, aplicatiile Web Based sunt din ce in ce mai folosite in ziua de astazi iar PHP are toate facilitatile necesare pentru crearea unui astfel de soft.

Proiectarea de ansamblu si de detaliu

Analiza procesului tehnologic

Dupa cum am precizat, stadiul informatizarii este destul de avansat pentru acest tip de aplicatie dar unele metode sunt destul de invechite si tot timpul este loc de mai bine.

Analiza noastra a inceput folosind interviul asupra unor persoane care lucreaza in domeniu si care cunosc fluxul evenimentelor care se desfasoara in acest tip de unitate.

Pe baza datelor obtinute in acest mod am aplicat doua metode de creativitate: mai intai brainwriting pentru a observa parerile individuale ale fiecarui participant si a le sublinia pe cele comune iar apoi brainstorming pentru a gasi eventualele solutii intr-un fel inovative.

Folosind o analiza diagnostic am ajuns la concluzia ca proiectul va fi conceput pentru a memora sub forma unei baze de date, informatiile necesare pentru managementul unei farmacii. In cadrul bazei de date sunt mai multe tabele: angajat, magazine, resurse_umane, produs, client, comanda, dsitribuitor, reteta si stoc. Un utilizator poate adauga, sterge, modifica sau extrage informatii din baza de date, astfel putand sa o conduca o astfel de firma. Iata structura bazei de date:

Principalele cazuri de utilizare sunt urmatoarele:

Volumul de informatii, tipul de informatii

S-a incercat pe cat posibil folosirea celei de a doua forme normale in cazul bazei de date pentru a evita redundanta datelor si a usura munca utilizatorului (nu trebuie sa introduca aceleasi date de mai multe ori).

Toate informatiile necesare au fost cuprinse in tabele bazei de date si sunt de urmatoarele tipuri, in functie de utilitate unele nu pot fi egale cu 0 iar altele se incrementeaza automat:

Tabelul angajat:

angajat_id int(10) NOT NULL auto_increment,

nume varchar(30) NOT NULL default '0',

prenume varchar(30) NOT NULL default '0',

adresa varchar(255) default NULL,

nr_telefon decimal(18,0) unsigned default '0',

functia varchar(30) NOT NULL default '0',

salariu float unsigned default '0',

Tabelul magazine:

magazin_id int(10) NOT NULL auto_increment,

nume_mag varchar(30) NOT NULL default '0',

adresa_mag varchar(255) default NULL,

nr_telefon_mag decimal(18,0) unsigned default '0',

Tabelul resurse_umane:

id_angajat int(10),

id_magazin int(10),

Tabelul produs :

produs_id int(10) NOT NULL auto_increment,

nume_produs varchar(50) NOT NULL default '0',

cod_bare decimal(18,0) unsigned default '0',

producator varchar(30), tip varchar(30), pret float,

descriere varchar(255),

Tabel stoc :

cantitate int(10) NOT NULL,

id_magazin int(10),

id_produs int(10),

Tabel distribuitor:

distribuitor_id int(10) NOT NULL auto_increment,

nume_dist varchar(30) NOT NULL default '0',

adresa_dist varchar(255) default NULL,

nr_telefon_dist decimal(18,0) unsigned default '0',

Tabel comanda :

id_produs int(10),

id_magazin int(10),

id_distribuitor int(10),

cantitate_comanda int(10) NOT NULL,

cost float,

Tabel client :

client_id int(10) NOT NULL auto_increment,

nume_client varchar(30) NOT NULL default '0',

prenume_client varchar(30) NOT NULL default '0',

nr_telefon_client decimal(18,0) unsigned default '0',

nr_asigurat decimal(18,0) unsigned default '0',

Tabel reteta :

cod_reteta decimal(18,0) auto_increment,

tip varchar(10),

id_client int(10),

id_produs int(10),



cantitate int(10),

Din cate se observa cele mai folosite tipuri de date sunt : varchar(sir de caractere), decimal, integer, si float.

Functiile sistemului informatic

Sistemul informatic indeplineste o serie de functii specifice acestui tip de aplicatie, functii care sunt mai bine edificate prin diagramele cazurilor de utilizare:

Introducere date

Acest meniu are urmatoarele submeniuri:

      Anagajat nou

      Comanda noua

      Stoc nou

      Reteta noua

      Magazin nou

Exemplu de interfata cu utilizatorul:

Modificare date

In acest meniu toate datele introduse pot fi modificate. Din punct de vedere al interfetei cu utilizatorul si al cazurilor de utilitzare actiunile sunt similare, singura diferanta fiind programarea care este mai complicata.

Stergere date

Din nou acest meniu difera de celelalte doua mai mult din prisma programarii, si nu a cazurilor de utilizare. Astfel, utilizatorul poate sterge datele de care nu mai are nevoie si ocupa spatiu in baza de date fara niciun scop bine definit.

Exemplu:

Extragere date

Daca pana acum a fost folosita mai intens partea de programare PHP, in cazul extragerii datelor primeaza programarea query-urilor SQL, iar aceastea vor fi edificate in partea 2.4 a proiectului.

Extragerea datelor indeplineste urmatoarele functii:

1. Afisare angajati si magazinul(magazinele) la care lucreaza.

2.Afisare angajatii de la toate magazinele care au salariu mai mare de o anumita suma.

3.Afisare produse care se gasesc pe o reteta dar nu se afla o cantitate necesara in stoc

4.Afisare inventar.

5.Afisare ce distribuitori aprovizioneaza magazinele.

6.Afisare care este stocul total pentru toate produsele din toate magazinele(stored function) .

7.Afisare care distribuitor livreaza fiecare produs comercializat de farmacie.

8.Afisare produsele care se gasesc pe retetele clientilor.

9. Afisare numarul de ordine al retetelor in concordanta cu numarul de asigurat al clientilor cu retete gratuite.

10.Afisare costul comenzilor de la toti distribuitorii.

Este de mentionat faptul ca aplicatia poate fi extinsa foarte usor din acest punct de vedere, putand-se adauga noi functionalitati in functie de cerintele clientului.

Exemplu:

Structura sistemului informatic

In ceea ce priveste partea hardware, nu sunt multe de spus acesta aplicatie fiind orientata software. Totusi se poate spune ca pentru aplicatia sa functioneze este nevoie de un server Windows sau Linux (varianta cu mici modificari a aplicatiei), pe care sa fie instalat un server WEB, un server PHP si unul MySQL. Din punct de vedere al clientului, acesta trebuie sa fie conectat la o retea privata sau la reteaua publica si sa i se permita accesul la server. Clientul poate fi orice calculator sau Pocket PC care are instalat un browser de web (preferabil Internet Explorer).

Dupa cum am aratat si in partea de analiza, software-ul se bazeaza pe o baza de date relationala implementata in MySQL. Am folosit o realizare de tip Top - Down, realizarea pe care am considerat-o cea mai potrivita. O data ce am avut privirea de ansamblu, am inceput implementarea pas cu pas a fiecarei componente in parte. Programarea interfetei cu utilizatorul s-a facut in PHP folosindu-se cate un script pentru fiecare functionalitate majora.

Vom prezenta in continuare tehnicile de programre folosite, pentru a se intelege mai bine structura sistemului informatic.

Scopul acestui proiect nu este de a prezenta intregul cod sursa si de aceea vom prezenta doar partile mai importante si cele mai interesante din punct de vedere al programarii.

Tabelele descrise anterior au fost create, prin script-uri SQL , folosind foreign keys si constraints pentru a ne asigura ca datele sunt in a doua forma normala si de interdependenta datelor . De exemplu nu poate fi sters un client care are de ridicat o reteta.

Exemplu de cod:

CREATE TABLE angajat (

angajat_id int(10) NOT NULL auto_increment,

nume varchar(30) NOT NULL default '0',

prenume varchar(30) NOT NULL default '0',

adresa varchar(255) default NULL,

nr_telefon decimal(18,0) unsigned default '0',

functia varchar(30) NOT NULL default '0',

salariu float unsigned default '0',

PRIMARY KEY (angajat_id)

)type = INNODB ;

CREATE TABLE magazine (

magazin_id int(10) NOT NULL auto_increment,

nume_mag varchar(30) NOT NULL default '0',

adresa_mag varchar(255) default NULL,

nr_telefon_mag decimal(18,0) unsigned default '0',

PRIMARY KEY (magazin_id)

)type = INNODB ;

CREATE TABLE resurse_umane (

-- resurse_umane_id int(10) NOT NULL auto_increment,

id_angajat int(10),

id_magazin int(10),

-- PRIMARY KEY (resurse_umane_id),

CONSTRAINT res_angajat_fk FOREIGN KEY (id_angajat) REFERENCES angajat (angajat_id) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT res_magazin_fk FOREIGN KEY (id_magazin) REFERENCES magazine (magazin_id) ON DELETE CASCADE ON UPDATE CASCADE

)type = INNODB ;

CREATE TABLE produs (

produs_id int(10) NOT NULL auto_increment,



nume_produs varchar(50) NOT NULL default '0',

cod_bare decimal(18,0) unsigned default '0',

producator varchar(30), tip varchar(30), pret float,

descriere varchar(255),

PRIMARY KEY (produs_id)

)type = INNODB ;

CREATE TABLE stoc (

-- stoc_id int(10) NOT NULL auto_increment,

cantitate int(10) NOT NULL,

id_magazin int(10),

id_produs int(10),

-- PRIMARY KEY (stoc_id),

CONSTRAINT stoc_produs_fk FOREIGN KEY (id_produs) REFERENCES produs (produs_id) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT stoc_magazin_fk FOREIGN KEY (id_magazin) REFERENCES magazine (magazin_id) ON DELETE CASCADE ON UPDATE CASCADE

)type = INNODB ;

CREATE TABLE distribuitor (

distribuitor_id int(10) NOT NULL auto_increment,

nume_dist varchar(30) NOT NULL default '0',

adresa_dist varchar(255) default NULL,

nr_telefon_dist decimal(18,0) unsigned default '0',

PRIMARY KEY (distribuitor_id)

)type = INNODB;

CREATE TABLE comanda (

-- comanada_id int(10 ) NOT NULL auto_increment,

id_produs int(10),

id_magazin int(10),

id_distribuitor int(10),

cantitate_comanda int(10) NOT NULL,

cost float,

-- PRIMARY KEY (comanada_id),

CONSTRAINT comanda_produs_fk FOREIGN KEY (id_produs) REFERENCES produs (produs_id) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT comanda_magazin_fk FOREIGN KEY (id_magazin) REFERENCES magazine (magazin_id) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT comanda_distribuitor_fk FOREIGN KEY (id_distribuitor) REFERENCES distribuitor (distribuitor_id) ON DELETE CASCADE ON UPDATE CASCADE

)type = INNODB;

CREATE TABLE client (

client_id int(10) NOT NULL auto_increment,

nume_client varchar(30) NOT NULL default '0',

prenume_client varchar(30) NOT NULL default '0',

nr_telefon_client decimal(18,0) unsigned default '0',

nr_asigurat decimal(18,0) unsigned default '0',

PRIMARY KEY (client_id)

)type = INNODB;

CREATE TABLE reteta (

-- reteta_id int(10) NOT NULL auto_increment,

cod_reteta decimal(18,0) unsigned default '0',

tip varchar(10),

id_client int(10),

id_produs int(10),

cantitate int(10),

CONSTRAINT reteta_produs_fk FOREIGN KEY (id_produs) REFERENCES produs (produs_id) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT reteta_client_fk FOREIGN KEY (id_client) REFERENCES client (client_id) ON DELETE CASCADE ON UPDATE CASCADE

)type = INNODB;

O parte intersanta este implementarea procedurilor si functiilor stocate, tehnici de programare folosite pentru a mari viteza de executie si pentru a implemnta functii mult mai greu implemntabile altfel. Astfel, pentru a putea, de exemplu, sterge mai multi angajati a trebuit creata o procedura stocata numita split_string , utila pentru aflarea id-urilor tuturor retetelor de sters, selectate de utilizator. Ruland procedura id-urile care se gaseau intr-un vector de tip string despartite de virgula vor fi despartite ca valori intr-o tabela auxiliara si astfel se poate crea o noua procedura, sterg_multi, prin care se sterg cu usurinta retetele.

Iata codul sursa pentru realizarea acestor proceduri:

CREATE PROCEDURE `split_string`(IN input TEXT, IN delimiter VARCHAR(10))

BEGIN

DECLARE cur_position INT DEFAULT 1 ;

DECLARE remainder TEXT;

DECLARE cur_string VARCHAR(1000);

DECLARE delimiter_length TINYINT UNSIGNED;

DROP TEMPORARY TABLE IF EXISTS SplitValues;

CREATE TEMPORARY TABLE SplitValues (

value VARCHAR(1000) NOT NULL PRIMARY KEY

) ENGINE=MEMORY;

SET remainder = input;

SET delimiter_length = CHAR_LENGTH(delimiter);

WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO

SET cur_position = INSTR(remainder, delimiter);

IF cur_position = 0 THEN

SET cur_string = remainder;

ELSE

SET cur_string = LEFT(remainder, cur_position - 1);

END IF;

IF TRIM(cur_string) != '' THEN

-- multiple inserts inside this helper procedure

INSERT INTO SplitValues VALUES (cur_string);

END IF;

SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);

END WHILE;

END;

Stergere rapida a mai multor campuri:

CREATE PROCEDURE `sterg_multi`(IN id_list TEXT,IN ntab CHAR(15))

BEGIN

CALL split_string(id_list, ',');

IF ntab='angajat' THEN DELETE FROM angajat WHERE angajat_id IN (SELECT value FROM SplitValues);



END IF;

IF ntab='client' THEN DELETE FROM client WHERE client_id IN (SELECT value FROM SplitValues);

END IF;

IF ntab='magazine' THEN DELETE FROM magazine WHERE magazin_id IN (SELECT value FROM SplitValues);

END IF;

END;

Afisarea se face cu ajutorul query-urilor, care includ functii specifice. Exemplu:

SELECT angajat.nume, angajat.prenume, angajat.functia, magazine.nume

FROM angajat

INNER JOIN resurse_umane ON angajat.angajat_id = resurse_umane.id_angajat

INNER JOIN magazine ON resurse_umane.id_magazin = magazine.magazin_id

ORDER BY magazine.nume

Exemplu de programare PHP pentru inserarea unor angajati in baza:

<?php

require_once('config.php');

?>

<?php

$result1 = mysql_query ('SELECT angajat_id FROM angajat') or die (mysql_error());

$i=0;

while ($row = mysql_fetch_array ($result1))

if (isset($_GET['submitEnterAngajatForm']))

$imax++;

$sqlQuery = 'INSERT INTO angajat (angajat_id , nume , prenume , adresa , nr_telefon , functia , salariu )

VALUES ('$imax' , '$nume' , '$prenume' , '$adresa' , '$nr_telefon' , '$functia' , '$salariu' )';

$result = MYSQL_QUERY($sqlQuery);

echo 'Angajatul '.$nume.' cu id-ul '.$imax.' a fost introdus!';

$j= count($_GET['mag']);

echo '<br>El lucreaza la ',count($_GET['mag']),' magazin(e).<br>';

if (isset($_GET['mag']))

foreach($_GET['mag'] as $key => $value)

for($k=0; $k<$j; $k++)

Se observa folosirea metodei de preluare a datelor de tip GET.

Programul are deci o structura modularizata, folosind scripturi denumite sugestiv pentru fiecare functionalitate.

Elaborarea documentatiei

Programul este foarte usor de utilizat, fiind foarte intuitiv. Este necesara o minima experienta de folosire a calculatorului.

Utilizatorul poate obtine functionalitatea dorita prin simpla apasare pe butoanele intitulate sugestiv.

Meniul este format din:

Extragere date

1. Afisare angajati si magazinul(magazinele) la care lucreaza.

2.Afisare angajatii de la toate magazinele care au salariu mai mare de o anumita suma.

3.Afisare produse care se gasesc pe o reteta dar nu se afla o cantitate necesara in stoc

4.Afisare inventar.

5.Afisare ce distribuitori aprovizioneaza magazinele.

6.Afisare care este stocul total pentru toate produsele din toate magazinele.

7.Afisare care distribuitor livreaza fiecare produs comercializat de farmacie.

8.Afisare produsele care se gasesc pe retetele clientilor.

9. Afisare numarul de ordine al retetelor in concordanta cu numarul de asigurat al clientilor cu retete gratuite.

10.Afisare costul comenzilor de la toti distribuitorii.

Modificare date

Modificare angajat

Modificare comanda

Modificare stoc

Modificare reteta

Modificare magazin

Stergere date

Stergere angajat

Stergere comanda

Stergere stoc

Stergere reteta

Stergere magazin

Introducere date

Introducere angajat nou

Introducere comanda noua

Introducere stoc nou

4. Introducere reteta noua

5. Introducere magazin nou

Aceasta aplicatie poate fi extinsa in functie de dorintele utilizatorului.

Echipa

Echipa care a lucrat la acest proiect este formata din:

Gradici Radu 356AB

Salajan Alexandru 356AB

Stoica Dragos 352AA







Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate