Sunteți pe pagina 1din 11

AUTORI: BDRU tefan, 350C4 STANCIU Andrei, 350C4 BLA Radu, 350C4

PROIECT PBD APLICAIE PENTRU LANSAREA N PRODUCIE I GESTIUNEA REETELOR

1. Descriere general Aplicaia gestioneaz lansarea n producie a anumitor produse. Exista faciliti ca implementarea unei biblioteci de reete, gestiunea stocurilor i a produselor. Aplicaia are la baz dou baze de date, cu cte 4, respectiv 8 tabele (WIS_RETETE_BIBLIOTECA, respectiv WIS_LANSARE). Acestea corespund unei biblioteci de reete dup care se va produce, respectiv unei gestiuni a lansrilor n producie ( gestiunea i rezervarea stocurilor, gestiunea reetelor, a magziilor, articolelor, seciilor, a comenzilor i, nu n ultimul rnd, a lansrilor n producie). Se folosete o baza de date, iar pentru interfaarea cu aceasta se folosesc un server de web i php. Utilizatorul acceseaza baza de date printr-o forma, accesabila printr-un browser. 2. Funcionarea formei Forma, n momentul n care este accesat, va avea disponibile opiunile utilizatorului privind baza de date ce se va folosi i tabela utilizat. Aceati parametrii, mpreun cu alii, sunt transmii prin intermediul sesiunilor php de ctre pagina de index (care mai nti i determina, apoi redirecteaz ctre form).

Figur 1 - Forma

Forma obine informaii despre cmpurile bazei de date, apoi afieaza, ntr-o tabel, aceste cmpuri (numele lor i daca sunt chei lucru marcat cu (#)), iar dedesubtul foecrui cmp afieaz un cmp de introducere a textelor, n care se pot introduce valori. Exist 5 aciuni principale ce se pot aplica formei fiecare avnd un buton corespunztor : Inserare, Stergere, Cautare, Modificare, Ieire. Datele necesare sunt introduse in campurile de introducere a textelor, apoi se actioneaz butonul corespunztor aciunii dorite. 2.1 Inserare Se completeaz cmpurile cu valorile dorite, apoi se apasa butonul de Inserare. Inregistrarea va fi introdus n tabela bazei de date doar daca nu ncalc restriciile puse asupra tabelei (chei primare, chei externe, ). n cazul n care nu se poate face inserarea se va afia un mesaj de eroare. n ambele cazuri se va afia i interogarea SQL ce s-a fcut. 2.2 tergere Se completeaz cmpurile cu valorile corespunztore nregistrrii ce va fi terse. Nu se iau n seam dect valorile din cmpurile chei. Cmpurile chei trebuiesc completate toate, altfel nu se va face tergerea i se va genera un mesaj de eroare. Daca toate cmpurile chei sunt completate se va ncerca tergere. Se va afia interogarea SQL ce s-a facut. n cazul unui eec se va afia i un mesaj de eroare.

Figur 2 - Stergerea unui articol

2.3 Cutare La fel ca la tergere, se iau n seam doar cmpurile ce corespund unei chei. De data aceasta ns nu este nevoie ca acestea sa fie completate. Nu se va cauta dup campurile necompletate. De exemplu, dac nici un camp corespunztor unei chei nu este completat, se va afia toat tabela (nu se cauta dup nici un cmp). Se afieaz i interogarea SQL ce a fost fcut.

Figur 3 - Rezultat cutare

n cazul n care apar mai multe inregistrri ca rezultat al unei intergri, prima dintre ele este folosit ca nregistrare curent (asupra creia se poate opera), iar celelalte sunt afiate, ele putnd fi selectate ca nregistrare curent. n cazul acesta va aprea i un buton ce permite selectarea, precum i butoane radio ce permit indicare nregistrrii dorite. 2.4 Modificare Se completeaz cmpurile ca la Inserare. Trebuie completate toate cmpurile ( o eroare se va genera dac cele corespunztoare cheilor nu sunt completate toate, dar cele care rmn necompletate vor aparea n baza de date NULL). Din acest motiv se recomand ca modificarea s se fac asupra valorilor ce sunt rezultatul unei cutri precedente, n felul acesta asigurndu-se modificarea controlat doar a cmpurilor dorite. 2.5 Ieire Butonul permite rentoarcerea utilizatorului la formularul de alegere a bazei de date i a tabelei folosite. Poate fi folosit pentru alegerea altei tabele asupra creia se va opera. 3. Detalii asupra implementarii bazelor de date (motorul de baze de date, opiunile folosite) S-a ales motorul de baze de date Mysql. Pentru implementare i testare a fost folosit versiunea 4.1.0 alpha. Tipul de baz de date ales a fost InnoDB, deoarece acesta este singurul care ofer faciliti privind cheile externe, faciliti necesare aplicaiei. Aplicaia poate rula i pe motoare Mysql cu versiunea mai mic dect 4.1.0, n care acestea sunt compilate cu InnoDB. Se folosesc chei externe pentru a asigura integritatea bazei de date (vezi anexa pentru o schem bazelor de date i a relaiilor ntre ele). Pentru fiecare cheie extern se introduc, n cazul n care nu sunt dai implicit de cheia primar, indeci, deoarece motorul InnoDB cere ca sa existe index att pe coloanele referite, ct i pe coloanele care refer. Fiierul WIS.txt conine comenzile SQL ce trebuie date pentru a crea bazele de date i tabelele. Se poate folosi din linia de comand, cu comanda mysql h hostname u username < WIS.txt. Exist de asemenea i un script php, creareBD.php, care atunci cnd este rulat creaz bazele de date. 4. Detalii asupra implemetrii formei i asupra instalrii Aplicaia conine 4 scripturi php: comun.inc, index.php, forma.php, creareBD.php. Se mai cere i existena unui director Sesiuni, n care vor fi inute datele referitoare la sesiuni. 4

Comun.inc este un script inclu de toate celelalte. El asigur pornirea sesiunilor, conectarea la baza de date, funciile comune celorlalte scripturi i constantele globale ale aplicaiei. Index.php asigur logarea unui utilizator, alegerea nazei de date i a sesiunii. Forma.php asigur implementarea aciunilor aplicaiei. Aceasta este aplicaia propriu-zis. CreareBD.php asigur crearea bazei de date i a tabelelor. Scriptul de start al aplicaiei, index.php, cere logarea utilizatorului nainte de a-i permite acestuia accesarea formei. Daca forma este accesata direct, se va face o redirectare la index.php pentru ca utilizatorul s se logheze. Logarea utilizatorului se face comparnd numele i parola introduse cu nregistrrile din tabela useri a cele-i de-a treia baze de date, WIS.

Figur 4 - Logarea unui utilizator

Forma nu este accesibil dect utilizatorilor logai. Se creeaz o sesiune pentru fiecare utilizator. n sesiune se vor inregistra date precum numele de utilizator, baza de date folosit i tabela folosit.

Figur 5 - Alegerea unei tabele

5. Listinguri
WIS.txt USE WIS_RETETE_BIBLIOTECA; CREATE TABLE w_unitati_masura (cod_um numeric(2) NOT NULL, den_um varchar(20), PRIMARY KEY (cod_um)) TYPE=INNODB; CREATE TABLE w_articole (clasa numeric(4) NOT NULL, tip numeric(4) NOT NULL, nr numeric(4) NOT NULL, den varchar(30), densit numeric(8,2), cod_um numeric(2), caract varchar(30), PRIMARY KEY (clasa, tip, nr), INDEX (cod_um), FOREIGN KEY (cod_um) REFERENCES w_unitati_masura(cod_um) ON DELETE RESTRICT ON UPDATE RESTRICT) TYPE=INNODB; CREATE TABLE w_produse (clasa_p numeric(4) NOT NULL, tip_p numeric(4) NOT NULL, nr_p numeric(4) NOT NULL, den_p numeric(4), nr_ret numeric(4) NOT NULL, cant_norm numeric(8,2), cod_um numeric(2), tehnolog varchar(30), data date, PRIMARY KEY (clasa_p, tip_p, nr_p, nr_ret), INDEX (cod_um), FOREIGN KEY (cod_um) REFERENCES w_unitati_masura(cod_um) ON DELETE RESTRICT ON UPDATE RESTRICT, FOREIGN KEY (clasa_p, tip_p, nr_p) REFERENCES w_articole(clasa, tip, nr) ON DELETE RESTRICT ON UPDATE RESTRICT) TYPE=INNODB; CREATE TABLE w_retete (poz numeric(2) NOT NULL, clasa_p numeric(4) NOT NULL, tip_p numeric(4) NOT NULL, nr_p numeric(4) NOT NULL, clasa numeric(4), tip numeric(4), nr numeric(4), cant numeric(8,2), cod_um numeric(2), obs varchar(30), nr_ret numeric(5) NOT NULL, PRIMARY KEY (poz, clasa_P, tip_p, nr_p, nr_ret), INDEX (cod_um), FOREIGN KEY (cod_um) REFERENCES w_unitati_masura(cod_um) ON DELETE RESTRICT ON UPDATE RESTRICT, INDEX (clasa_p, tip_p, nr_p, nr_ret), FOREIGN KEY (clasa_p, tip_p, nr_p, nr_ret) REFERENCES w_produse(clasa_p, tip_p, nr_p, nr_ret) ON DELETE RESTRICT ON UPDATE RESTRICT) TYPE=INNODB; USE WIS_LANSARE; CREATE TABLE w_comenzi (nr_cmd numeric(4) NOT NULL, den_cmd varchar(30), PRIMARY KEY (nr_cmd)) TYPE=INNODB;

CREATE TABLE w_articole (clasa numeric(4) NOT NULL, tip numeric(4) NOT NULL, nr numeric(4) NOT NULL, den varchar(30), densit numeric(8,2), cod_um numeric(2), caract varchar(30), PRIMARY KEY (clasa, tip, nr)) TYPE=INNODB; CREATE TABLE w_sectii (cod_sect numeric(20) NOT NULL, den_sect varchar(30), PRIMARY KEY (cod_sect)) TYPE=INNODB; CREATE TABLE w_magazii (cod_mag numeric(1) NOT NULL, den_mag varchar(20), PRIMARY KEY (cod_mag)) TYPE=INNODB; CREATE TABLE w_unitati_masura (cod_um numeric(2) NOT NULL, den_um varchar(20), PRIMARY KEY (cod_um)) TYPE=INNODB; CREATE TABLE w_lansari (doc_lans varchar(5) NOT NULL, data_lans date NOT NULL, cod_sect numeric(2) NOT NULL, cod_mag numeric(1), NR_RET numeric(5) NOT NULL, clasa_p numeric(4) NOT NULL, tip_p numeric(4) NOT NULL, nr_p numeric(4) NOT NULL, den_prod varchar(30), cant_lan numeric(10,2), cod_um numeric(2), tehnolog varchar(30), term_final date, obs varchar(30), nr_cmd numeric(4), operator varchar(20), data_op date, PRIMARY KEY (doc_lans, data_lans, cod_sect, nr_ret, clasa_p, tip_p, nr_p), INDEX (nr_cmd), FOREIGN KEY (nr_cmd) REFERENCES w_comenzi(nr_cmd) ON DELETE RESTRICT ON UPDATE RESTRICT, INDEX (clasa_p, tip_p, nr_p), FOREIGN KEY (clasa_p, tip_p, nr_p) REFERENCES w_articole(clasa, tip, nr) ON DELETE RESTRICT ON UPDATE RESTRICT, INDEX (cod_sect), FOREIGN KEY (cod_sect) REFERENCES w_sectii(cod_sect) ON DELETE RESTRICT ON UPDATE RESTRICT, INDEX (cod_mag), FOREIGN KEY (cod_mag) REFERENCES w_magazii(cod_mag) ON DELETE RESTRICT ON UPDATE RESTRICT, INDEX (cod_um), FOREIGN KEY (cod_um) REFERENCES w_unitati_masura(cod_um) ON DELETE RESTRICT ON UPDATE RESTRICT) TYPE=INNODB; CREATE TABLE w_retete_lan (cod_sect numeric(2) NOT NULL, nr_ret numeric(5) NOT NULL, poz numeric(2) NOT NULL, clasa_p numeric(4) NOT NULL, tip_p numeric(4) NOT NULL, nr_p numeric(4) NOT NULL, clasa numeric(4), tip numeric(4), nr numeric(4), doc_lans varchar(5) NOT NULL, data_lans date NOT NULL, cant_nec numeric(10,2), cod_um numeric(2), PRIMARY KEY (cod_sect, nr_ret, poz, clasa_p, tip_p, nr_p, doc_lans, data_lans), INDEX (clasa, tip, nr), FOREIGN KEY (clasa, tip, nr) REFERENCES w_articole(clasa, tip, nr) ON DELETE RESTRICT ON UPDATE RESTRICT, INDEX(doc_lans, data_lans, cod_sect, nr_ret, clasa_p, tip_p, nr_p), FOREIGN KEY (doc_lans, data_lans, cod_sect, nr_ret, clasa_p, tip_p, nr_p) REFERENCES w_lansari(doc_lans, data_lans, cod_sect, nr_ret, clasa_p, tip_p, nr_p) ON DELETE RESTRICT ON UPDATE RESTRICT, INDEX (cod_um), FOREIGN KEY (cod_um) REFERENCES w_unitati_masura(cod_um) ON DELETE RESTRICT ON UPDATE RESTRICT) TYPE=INNODB; CREATE TABLE w_cant_blocate (doc_lans varchar(5) NOT NULL, data_lans date NOT NULL, cod_sect numeric(2) NOT NULL, nr_ret numeric(5) NOT NULL, poz numeric(2) NOT NULL, clasa_p numeric(4) NOT NULL, tip_p numeric(4) NOT NULL, nr_p numeric(4) NOT NULL, clasa numeric(4), tip numeric(4), nr numeric(4), nr_nir numeric(6) NOT NULL, poz_nir numeric(2) NOT NULL, data_nir date NOT NULL, cod_mag numeric(1) NOT NULL, cant_bloc numeric(10,2), cod_um numeric(2), PRIMARY KEY (doc_lans, data_lans, cod_sect, nr_ret, poz, clasa_p, tip_p, nr_p, nr_nir, poz_nir, data_nir, cod_mag), INDEX (cod_sect, nr_ret, poz, clasa_p, tip_p, nr_p, doc_lans, data_lans), FOREIGN KEY (cod_sect, nr_ret, poz, clasa_p, tip_p, nr_p, doc_lans, data_lans) REFERENCES w_retete_lan(cod_sect, nr_ret, poz, clasa_p, tip_p, nr_p, doc_lans, data_lans) ON DELETE RESTRICT ON UPDATE RESTRICT) TYPE=INNODB; USE WIS; CREATE TABLE useri (usid varchar(15) NOT NULL, parola varchar(15), PRIMARY KEY (usid)) TYPE=INNODB; forma.php <?php include("comun.inc"); //daca $usid nu exista, atunci nu avem sesiune existenta //sau daca nu este utilizator valid

//sau iesire -> ne ducem la index if(!session_is_registered("usid") || !verificareUtilizator($usid, "") || $HTTP_POST_VARS["Iesire"]) { header("Location: index.php"); exit; } //afisam utilizatorul, BD si tabela curente echo("\n<p>Utilizator: ".$usid."</p>"); echo("\n<p>Baza de date: ".$HTTP_SESSION_VARS["bd"]."</p>"); echo("\n<p>Tabela: ".$HTTP_SESSION_VARS["tabela"]."</p>"); //aflam campurile tabelei $interog=mysql_query("DESCRIBE ".$bd.".".$tabela.";"); $campuriTabela=array(); $tipuriCampuriTabela=array(); while($rand=mysql_fetch_assoc($interog)) //pt. fiecare camp { $campuriTabela[$rand["Field"]]=($rand["Key"]=="PRI" ? "cheiePrimara" : "nuECheie"); $tipuriCampuriTabela[$rand["Field"]]=(eregi("decimal", $rand["Type"]) ? "faraGhilimele" : "cuGhilimele"); } $interog=false; if($HTTP_POST_VARS["Cautare"]) //daca se face cautare { $primaCond=true; $query="SELECT * FROM ".$bd.".".$tabela; foreach($campuriTabela as $cheie => $val) if($val=="cheiePrimara" && $HTTP_POST_VARS[$cheie]) if($primaCond) { $primaCond=false; $query.=" WHERE ".$cheie."=".($tipuriCampuriTabela[$cheie]=="faraGhilimele" ? $HTTP_POST_VARS[$cheie] : "\"".$HTTP_POST_VARS[$cheie]."\"")." "; } else $query.=" AND ".$cheie."=".($tipuriCampuriTabela[$cheie]=="faraGhilimele" ? $HTTP_POST_VARS[$cheie] : "\"".$HTTP_POST_VARS[$cheie]."\"")." "; $query.=";"; echo("\n<p>Interogarea: ".$query."</p>"); if($interog=mysql_query($query)) echo("\n<p>Cautare efectuata cu succes - ".mysql_num_rows($interog)." rezultate</p>"); else echo("\n<p>Cautare esuata</p>"); } else if($HTTP_POST_VARS["Inserare"]) //daca se face inserare { $primaCond=true; $query="INSERT INTO ".$bd.".".$tabela." VALUES ("; foreach($campuriTabela as $cheie => $val) if($primaCond) { $primaCond=false; $query.=($tipuriCampuriTabela[$cheie]=="faraGhilimele" ? $HTTP_POST_VARS[$cheie] : "\"". $HTTP_POST_VARS[$cheie]."\""); } else $query.=", ".($tipuriCampuriTabela[$cheie]=="faraGhilimele" ? $HTTP_POST_VARS[$cheie] : "\"". $HTTP_POST_VARS[$cheie]."\"");

$query.=");"; echo("\n<p>Interogarea: ".$query."</p>"); if($interog=mysql_query($query)) echo("\n<p>Inserare efectuata cu succes</p>"); else echo("\n<p>Inserare esuata</p>"); } else if($HTTP_POST_VARS["Stergere"]) //daca se face stergere { $primaCond=true; $query="DELETE FROM ".$bd.".".$tabela." WHERE "; foreach($campuriTabela as $cheie => $val) if($val=="cheiePrimara") if($HTTP_POST_VARS[$cheie]) if($primaCond) { $primaCond=false; $query.=$cheie."=".($tipuriCampuriTabela[$cheie]=="faraGhilimele" ? $HTTP_POST_VARS[$cheie] : "\"".$HTTP_POST_VARS[$cheie]."\"")." "; } else $query.=" AND ".$cheie."=".($tipuriCampuriTabela[$cheie]=="faraGhilimele" ? $HTTP_POST_VARS[$cheie] : "\"".$HTTP_POST_VARS[$cheie]."\"")." "; else $lipsesteCheie=true; $query.=";"; if($lipsesteCheie) echo("\n<p>Stergerea nu se poate efectua, lipseste o cheie</p>"); else { echo("\n<p>Interogarea: ".$query."</p>"); if($interog=mysql_query($query)) echo("\n<p>Stergere efectuata cu succes</p>"); else echo("\n<p>Stergere esuata</p>"); } } else if($HTTP_POST_VARS["Modificare"]) //daca se face modificare { $primaCond=true; $query="UPDATE ".$bd.".".$tabela." SET "; foreach($campuriTabela as $cheie => $val) if($primaCond) { $primaCond=false; $query.=$cheie."=".($tipuriCampuriTabela[$cheie]=="faraGhilimele" ? $HTTP_POST_VARS[$cheie] : "\"".$HTTP_POST_VARS[$cheie]."\""); } else $query.=", ".$cheie."=".($tipuriCampuriTabela[$cheie]=="faraGhilimele" ? $HTTP_POST_VARS[$cheie] : "\"".$HTTP_POST_VARS[$cheie]."\""); $primaCond=true; $query.=" WHERE "; foreach($campuriTabela as $cheie => $val) if($val=="cheiePrimara") if($HTTP_POST_VARS[$cheie]) if($primaCond) { $primaCond=false; $query.=$cheie."=".($tipuriCampuriTabela[$cheie]=="faraGhilimele" ? $HTTP_POST_VARS[$cheie] : "\"".$HTTP_POST_VARS[$cheie]."\"")." "; }

else $query.=" AND ".$cheie."=".($tipuriCampuriTabela[$cheie]=="faraGhilimele" ? $HTTP_POST_VARS[$cheie] : "\"".$HTTP_POST_VARS[$cheie]."\"")." "; else $lipsesteCheie=true; $query.=";"; if($lipsesteCheie) echo("\nModificarea nu se poate efectua, lipseste o cheie<br>"); else { echo("\n<p>Interogarea: ".$query."</p>"); if($interog=mysql_query($query)) echo("\n<p>Modificare efectuata cu succes</p>"); else echo("\n<p>Modificare esuata</p>"); } } else if($HTTP_POST_VARS["SelectieRezultat"]) //s-a selectat un rezultat al cautarii { if($HTTP_POST_VARS["sR"]) { echo("\n<p>S-a selectat rezultatul nr. ".$HTTP_POST_VARS["sR"]."</p>"); $interog=mysql_query($HTTP_POST_VARS["cautarea"]); for($i=0; $i<=$HTTP_POST_VARS["sR"]; $i++) $rand=mysql_fetch_assoc($interog); $eSelRez=true; } else echo("\n<p>N-ati selectat nici unul din rezultate.</p>"); } //afisam campuri pt. campurile tabelei ?> <p> <form name="formTab" method="post" action="forma.php"> <table border="1"> <thead> <tr> <?php //afisam capul de tabel foreach($campuriTabela as $cheie => $val) { ?> <th align="center"> <?php echo($cheie.($val=="cheiePrimara" ? " (#)" : "")."\n"); } ?> </tr> </thead> <tbody> <?php //daca avem cautare vom afisa aici mai multe randuri, cate unul pt. fiecare rez. $eCautare=$HTTP_POST_VARS["Cautare"] && $interog && mysql_num_rows($interog)>0; if($eCautare) { $nrLinii=mysql_num_rows($interog); ?> <input type="hidden" name="cautarea" value=<?php echo("\"".eregi_replace("\"", "\\\"", $query)."\"");?>> <?php } for($i=0; $i<($eCautare ? $nrLinii : 1); $i++)

10

{ ?> <tr> <?php //afisam corpul de tabel if($eCautare) $rand=mysql_fetch_assoc($interog); foreach($campuriTabela as $cheie => $val) { ?> <td align="center"> <input type="text" size=<?php echo("\"".$marimeCampText."\"");?> name=<?php echo("\"".$cheie.($eCautare && $i>0 ? $i : "")."\"");?> value=<?php echo("\"".($eCautare || $eSelRez ? $rand[$cheie] : $HTTP_POST_VARS[$cheie])."\"");?>> <?php } if($eCautare) { ?> <td align="center"> <?php if($i==0) echo("<== Selectat"); else { ?> <input type="radio" name="sR" value=<?php echo("\"".$i."\"");?>> <?php } } ?> </tr> <?php if($eCautare && $i==0) { ?> <tr><td colspan=<?php echo("\"".(count($campuriTabela)+1)."\"");?>>Restul de rezultate:</tr> <?php } } ?> </tbody> </table> <input type="Submit" name="Inserare" value="Inserare"> <input type="Submit" name="Stergere" value="Stergere"> <input type="Submit" name="Cautare" value="Cautare"> <input type="Submit" name="Modificare" value="Modificare"> <input type="Submit" name="Iesire" value="Iesire"> <?php if($eCautare) { ?> <input type="Submit" name="SelectieRezultat" value="Selectie rezultat (din restul de rezultate)"> <?php } ?> </form> </p>

11

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