Aplicatie Pentru Sistemul de Finantare a Spitalelor pe Grupe de Diagnostice

1. INTRODUCERE

Această lucrare își propune să prezinte o soluție modernă și mai eficientă a aplicației DRG Național, folosită de Guvernul României pentru finanțarea spitalelor. Noi propunem o aplicație on-line bazată pe tehnologia JSP și baze de date MySql pentru a înlocui vechea aplicație realizată în MS Access 2000.

Cu o astfel de aplicație , Biroul Național DRG poate vedea, în orice moment, datele, și chiar să le trimită la organizațiile internationale. Această soluție păstrează structura si multe meniuri din aplicația veche, astfel încat utilizatorii se pot acomoda ușor cu noua aplicație. Accentul este pus pe securitatea datelor deoarece utilizatorii au drepturi de acces diferite, setate de către administrator.

1.1 Sistemul DRG

Guvernul României folosește sistemul DRG de clasificare ca o metodă de finanțare a 185 spitale, și își propune ca pe viitor sa extinda acest numar. . Noul sistem ofera ocazia intelegerii si compararii tipurilor de pacienti tratati si costul lor relativ in cadrul spitalului, intre spitale, intre judete si intre tari, deoarece DRG-urile sunt folosite larg la nivel international

DRG-urile sunt un sistem de clasificare a pacientilor pe baza diagnosticului, procedurilor si a altor informatii clinice despre pacient, care ofera posibilitatea de a lega tipul de pacienti pe care spitalul ii trateaza (adica indicele de complexitate a cazurilor sau casemix index) de costurile aferente ale spitalului.

Elaborarea si dezvoltarea DRG-urilor a început la sfarsitul anilor '60 la Universitatea Yale din Statele Unite. Motivul initial pentru dezvoltarea DRG-urilor a fost acela de a crea un cadru eficient de monitorizare a utilizarii serviciilor intr-un spital. Prin urmare, DRG-urile trebuie sa fie considerate in primul rand si mai mult decat orice ca un sistem de clasificare si nu ca unul de finantare. Daca DRG-urile sunt folosite ca baza pentru un sistem de finantare atunci multe alte componente trebuie sa fie create si implementate. Prima aplicare la scara larga a DRG-urilor pentru finantare a fost la sfarsitul anilor 1970 in Statul New Jersey din Statele Unite.

De atunci peste 30 de țări folosesc DRG-urile pentru măsurarea activitatii clinice, îmbunatatirea managementului clinic, alocarea resurselor/bugetelor pentru îngrijirea sănătății, pregatirea ghidurilor de practica etc. Cu toate ca implementarea DRG-urilor in Romania ca baza pentru finantarea spitalelor este un fenomen nou, conceptul DRG nu este nou si de multi ani, in numeroase tari au fost inregistrate rezultate ale utilizarii sale. Printre acestea se numara cresterea eficientei si scaderea duratei de spitalizare cu mentinerea ingrijirilor de calitate, pentru a mentiona doar cateva aspecte.

Datele necesare pentru gruparea pacientilor pe baza codurilor diagnosticelor si procedurilor, in categorii DRG sunt enumerate mai jos. Aceste date definesc sistemul de clasificare DRG.

varsta

sex

durata de spitalizare

diagnostic principal

diagnostice secundare

proceduri

starea la externare

greutatea la nastere (in cazul nou nascutilor)

Prin sistemul grupelor de diagnostice (DRG) se analizeaza caracteristicile fiecarui pacient externat (varsta, gen, durata de spitalizare, diagnostice principale si secundare, proceduri, starea la externare si greutatea la nastere in cazul nou-nascutilor), iar in functie de acestea pacientii sunt trimisi intr-o categorie distincta. In acest mod, sistemul DRG realizeaza o "fotografie" a rezultatelor spitalului, incercand să standardizeze rezultatele activitatii acestuia.

Grupele de diagnostice au doua caracteristici esentiale:

(1) omogenitatea clinica, adica intr-un anume DRG cazurile (pacientii) sunt similare, din punct de vedere clinic, dar nu identice ;

(2) omogenitatea costurilor, adica fiecare DRG contine cazuri ce necesita un consum asemanator de resurse.

Grupele de diagnostice sunt medicale si chirurgicale in functie de prezenta sau absenta unei interventii chirurgicale si sunt concepute pentru a acoperii patologia asociata pacientilor acuti ce solicita spitalizarea. Ele sunt concepute in lumina standardizarii rezultatelor spitalului (exprimate in termenii pacientilor externati, "omogenizati" in interiorul acestor grupe) si merg intr-o directie opusa scolilor medicale ce sustin eterogenitatea bolnavilor exprimata prin sloganul "nu exista boli, ci bolnavi".

Pentru a putea clasifica fiecare pacient externat intr-o grupa de diagnostice sunt necesare parcurgerea a patru mari etape:

disponibilizarea datelor clinice despre pacientii externati. Clasificarea DRG necesita obligatoriu 7 variabile pentru fiecare pacient: varsta, gen, durata de spitalizare, diagnostice principale si secundare, interventii chirurgicale sau alte proceduri efectuate, starea la externare, si greutatea la nastere (numai pentru nou-nascuti);

codificarea datelor necesare (pentru diagnostice si proceduri), in vederea utilizarii unui limbaj standardizat pentru acest variabile si pentru a putea fi folosite cu mai multa usurinta;

colectarea sub forma electronica a ancestor date;

trimiterea automata a fiecarui pacient intr-o grupa de diagnostice.

In momentul de fata, pentru colectarea informatiilor despre pacienti este folosita aplicatia DRGNational v4.0 care este distribuita in teritoriu. Aplicatia trebuie instalata pe fiecare calculator folosit pentru colectarea datelor legate de pacienti. Inregistrarea electronica a pacientilor, pe toata perioada cat pacientul sta in spital, este in concordanta cu foaia de observatie introdusa de Ministerul Sanatatii si Familiei din România . Odata colectate, datele sunt adaugate intr-o baza de date care trebuie trimisa lunar la Biroul Central DRG din Bucuresti.

La ora actuala, plicatia DRGNational v4.0 este distribuita pe un CD, ca o aplicatie runtime implemtata in Microsoft Acces 2000, care culege informatiile despre pacient la nivel de sectie, le cripteaza si apoi le trimite catre Biroul National DRG folosind posta electronica. Este posibila, de asemenea, si centralizarea datelor de pe toate sectiile spitalului pe un singur calculator, pe care trebuie de asemnea instlata aplicatia, si trimiterea lor centralizata catre Biroul National DRG. Aplicatia are cerinte hardware minime, iar pentru statiile de unde se face trimiterea datelor catre Biroul National DRG mai este necesară o conexiune la Internet.

1.2 Descrierea unei noi soluții pentru aplicație – prezentare generală

Propunem o nouă soluție de implementare a aplicației DRGNațional, care elimină dificultățile celei foloste astăzi.

Întâi de toate, MS Access 2000 este un sistem de administrare a bazelor de date și aministrează eficient un număr redus de înregistrări : în jur de 20000-30000 înregistări, folosit în general in activitatea de management în companiile mici. Acesta este motivul pentru care, în loc să folosim MS Access 2000 noi propunem un sistem de adminitrarea a bazelor de date mult mai puternic, numit MySQL.

În al doilea rand, propunem o aplicație online care oferă mai multe avantaje:

anulează faza de criptare a datelor și transmiterea lor prin e-mail, deoarece poate aduce o mulțime de probleme; datele primite prin e-mail de către Biroul Național DRG trebuie salvate într-un anumit format, eventual bază de date, pentru a putea fi folosite pentru vizualizate sau pentru elaborarea unor rapoarte, statistici sau grafice ; când se adaugă în aceeași bază de date informații de la diverse surse, pot aparea probleme(de exemplu, valoarea cheii primare poate fi identica in unele fise. În acest caz trebuie făcute procese suplimentare înainte de salvarae în baza de date ; toatea acestae necesita timp).

datele văzute la Biroul Național DRG sunt totdeauna actulaizate(up to date); nu este necesar să se aștepte sfârșitul unei anumite perioade de timp pentru a primi aceste date ; oricand datele pot fi vizualizate ca rapoarte, statistici sau grafice, lucru care este foarte important pentru domeniul medical.

Aplicația, baza de date și serverul de baze de date trebuie instalate pe un singur computer(server) ; acesta va fi accesat de orice utilizator, în limita drepturilor sale, de pe propriul calculator, folosind un browser ; în acest fel nu este necesar ca aplicația să fie instalată pe computerul fiecărui utilizator(client) ; bine inteles performanta serverului trebuie să fie foarte ridicată.

Aplicația descrisă in continuare este o aplicație client-server și reprezintă soluția ideală de implementare a unei baze de date competitive cu costuri minime. Este realizată folosind tehnologia JavaServer Page(JSP) , impreună cu baze de date MySQL.

2. NOȚIUNI TEORETICE

2.1 Caracteristici MySql

JDBC(engl. Java DataBase Connectivity) reprezintă API-ul(engl. Application Programming Interface) dezvoltat de Sun Microsystems în colaborare cu diverși parteneri pentru a oferi aplicațiilor Java acces spre bazele de date gestionate de diverse DBMS-uri (Sisteme de Gestiune a Bazelor de Date). Într-o arhitectura client-server, bazele de date se pot afla pe aceeași mașină sau pe o altă mașină cu care clientul este conectatdintr-un intranet sau chiar Internet. Cea mai importantă funcție a JDBC-ului este posibilitatea lucrului cu instrucțiuni SQL și procesarea eventualelor rezultate obținute în urma interogărilor într-o manieră independentă și consistentă. Putem privi API-ul JDBC ca o interfață standard între aplicații și diverse DBMS-uri, creatorii aplicațiilor programând conform acestui API într-un mod uniform și independent de DBMS. Urmează ca apelurile SQL să fie preluate, traduse și trimise mai departe de diverse drivere scrise în parte pentru fiecare DBMS.

Pentru început putem spune că JDBC furnizează acces orientat pe obiecte(OOP) la bazele de date prin definirea de clase și interfețe care înfășoară diverse concepte abstracte, cum ar fi cele prezentate în tabelul următor:

Ceea ce trebuie remarcat este faptul că aplicațiile care folosesc bazele de date trebuie să includă pachetul ”java.sql”, și nu pachetul care conține implementarea driver-ului particular folosit. Totuși, calea spre pachetul conținând driverul trebuie să fie prezentă în CLASSPATH.

Unul dintre cele mai simple și cunoscute servere de baze de date este MySQL, care și-a dovedit în timp stabilitatea și fiabilitatea, fiind deseori soluția aleasă pentru gestionarea bazelor de date. Serverul MySQL este oferit gratuit pentru sistemele UNIX, Windows și MacOS, sub licență GNU General Public License(GPL), de către firma suedeză MySQL AB. Site-ul oficial MySQL este http://www.mysql.com , care poate fi consultat pentru a descărca ultimele distribuții MySQL, deja stabile, sau încă în probă, împreună cu documentația aferentă.

După instalare, bazele de date pe care serverul le va deservi clienților vor fi poziționate în directorul /data al distribuției. În subdirectorul /bin al distribuției MySQL se va găsi executabilul mysqld, care permite startarea serverului de baze de date. În același director se află și alte facilități, cum ar fi WinMySQLAdmin pentru sistemul de operare Windows, care permite administrarea serverului MySQL dontr-o interfață grafică prietenoasă.

Datorită faptului că serverul MySQL este open source, deci are surse accesibile și bien documentate, există mai multe implementări și drivere JDBC libere, disponibile pentru MySQL și realizate de diferiți dezvoltatori independenți. O listă a driverelor existente o prezentăm în continuare:

Dintre acestea, mmMySQL(mm- provine de la Mark Matthews, autorul lui) este driverul recomandat în manualul MySQL, fiind considerat cel mai performant driver gratuit până la apariția lui Connector/J, care nu este altceva decât o îmbunătățire a acestuia. Driverul este împachetat într-un fișier .jar care trebuie adăugat în CLASSPATH. Numele complet al driverului este org.gjt.mm.mysql.Driver, sub protocolul mysql și formatul URL-ului JDBC este:

Jdbc:mysql// [numegazdă][:port]/numebazădate[?param1=val1][&param2=val2]…

O dată cu numele mașinii, al portului performant driver gratuit până la apariția lui Connector/J, care nu este altceva decât o îmbunătățire a acestuia. Driverul este împachetat într-un fișier .jar care trebuie adăugat în CLASSPATH. Numele complet al driverului este org.gjt.mm.mysql.Driver, sub protocolul mysql și formatul URL-ului JDBC este:

Jdbc:mysql// [numegazdă][:port]/numebazădate[?param1=val1][&param2=val2]…

O dată cu numele mașinii, al portului și al bazei de date, driverul mai permite setarea unor proprietăți interne cu diverse valori date de utilizatori prezentate în tabela următoare:

Valorile proprietăților pot fi transmise în momentul realizării conexiunii, folosind diferitele suprascrieri ale metodei getConnection() pe care clasa DriverManager o pune la dispoziție.

Pentru obținerea de informații dintr-o bază de date folosind JBC implică în principiu cinci pași:

înregistrarea driverului JDBC folosind gestionarul de drivere DriverManager;

stabilirea unei conexiuni către baza de date;

execuția unei instrucțiuni SQL;

procesarea rezultatelor;

închiderea conexiunii cu baza de date.

Funcționalitatea managerului de drivere este aceea de a menține o referință către toate obiectele driver disponibile în aplicația curentă. Un driver JDBC ste înregistrat automat de mangerul de drivere atunci când clasa driver este încărcată dinamic. Pentru încărcarea dinamică a unui driver JDBC, se folosesc metodele Class.forName().

Ex: – încărcarea driverului MySQL Connector/J, care permite conectarea la serverul de baze de date MySQL:

Class.forName(”com.mysql.jdbc.Driver”)

Class.forName() este o metodă statică ce permite mașinii virtuale Java să aloce dinamic, să încarce și să facă o legătură la clasa specificată ca argument printr-un șir de caractere. În cazul în care clasa nu este găsită se aruncă o excepție ClassNotFoundException. Driverele pot fi înregistrate și folosind metoda DriverManager.registerDriver().

Odată ce s-a încărcat un driver, putem să-l folosim pentru stabilirea unei conexiuni către baza de date. Pentru stabilirea unei conexiuni la o bază de date,se folosește metoda statică getConnection() din clasa DriverManager.

Ex.: Connection conn = DriverManager.getConnection(”jdbc:mysql://

localhost/numebazadate”)

Pentru baze de date care necesită autentificare, se utilizează o formă a acestei metode cu trei argumente.

Ex.:Connection conn = DriverManager.getConnection(”jdbc:mysql://

localhost/ numebazadate”, nume_utilizator, parola);

După ce s-a stabilit conexiunea, se pot trimite instrucțiuni SQL către baza de date. API-ul JDBC nu verifică corectitudinea instrucțiunii și nici apartenența ei al un anumit standard SQL, permițându-se astfel trimiterea chiar ed instrucțiuni non-SQL. Programatorul este cel care știe dacă DBMS-ul interogta suportă interogările pe care le trimite și, dacă nu, el este cel care va tarta excepțiile primite drept răspuns. Dacă instrucțiunea este SQL, atunci aceasta poate face anumite operații asupra bazei de date, cum ar fi căutare, inserare, actualizare sau ștergere.

Pentru execuția unei instrucțiuni SQL neparametrizate, se folosește metoda createStatement(), aplicată unui obiect Connection. Această metodă întoarce un obiect din clasa Statement

Ex.: Statement instructiune = conn.createStatement() ;

Putem aplica apoi una dintre metodele executeQuery(), executeUpdate() sau execute() obiectuluide tip Statement pentru a trimite DBMS-ului instrucțiunile SQL. Metoda executeQuery() este folosită în cazul interogărilor care returnează mulțimi rezultat (instanțe ale clasei ResultSet), așa cum este cazul instrucțiunilor SELECT. Pentru operațiile de actulaizare sau ștergere, cum ar fi INSERT, UPDATE sau DELETE, se folosește metoda executeUpdate() aplicată obiectului de tip Statement, rezultând un întreg care reprezintă numărul înregistrărilor afectate. Aceeași metodă este folosită pentru interogările SQL DDL, cum ar fi CREATE TABLE, DROP TABLE și ALTER TABLE, în acest caz returnând întotdeauna zero. Metoda execute() este folosită în cazul în care se obțin mai mult de o mulțime rezultat sau un număr de linie.

Pentru parcurgerea simplă a înregistrărilor unui obiect din clasa resultSet, putem folosi metoda next().

Ex.: while (rs.next()) // implicit cursor poziționat inainte de prima linie

{

System.out.println(rs.getString(”nume”) + ”,” + rs.getString(”prenume”));

}

Atunci când este vorba despre resurse exterioare, așa cum este cazul accesului spre DBMS-uri via JDBC, ”colectorul de gunoaie” nu știe nimic despre starea acestor resurse, dacă este sau nu cazul să le elibereze. De aceea, este recomandat ca, după ce procesarea datelor s-a încheiat, programatorii să închidă explicit conexiunile către baza de date. Pentru aceasta se folosește metoda close() aplicată obiectului Connection. În plus trebuie închise, înainte conexiunii, și obiectele Statement și ResultSet folosind metodele lor close().

Ex.: try {

//….

rs.close();

instructiune.close();

}

catch(SQLException e) {

System.out.println(”Eroare la inchidere interogare: ”+ e.toString());

}

finally {

try{

if(conexiuneBazaDate!= null) {

conexiuneBazaDate.close();

}

}

catch (SQLException ex) {

System.out.println(”Eroare la închidere onexiune:”+ ex.toString());

}

}

Cu MySQL ca server de baze de date se câștigă viteză în accesarea informațiilor, compatibilitate cu majoritatea sistemelor de gestiune a datelor, siguranță și fiabilitate in manipularea unor cantități mari de date.

Două exemple concludente vin să susțină alegerea acestei soluții:

a.) Site-ul Yahoo Finance care folosește soluții MySQL pe Server Linux răspunzând prompt la miile de utilizatori.

b.) NASA care are o rețea de Servere interconectând 12 locații proprii folosește MySQL ca SGBDR. Tehnologia anterior folosită a fost ORACLE iar optarea pentru MySQL a fost determinată printre altele de următoarele caracteristici: costul limitat doar la suport tehnic; compatibilitate: MySQL poate comunica ușor cu mai toate motoarele de DB prin ODBC.
Echipa NASA considera MySQL cel mai robust motor de Baze de Date disponibil pe piață la ora actuală.

2.2 Java Server Pages(JSP)

Java Server Pages(JSP) este una dintre cele mai puternice tehnologii Web și este ușor de utilizat. JSP combină HTML și XML cu servleturile și tehnologia JavaBeans pentru a crea un mediu productiv pentru dezvoltarea de site-uri Web independente de platformă și de o înaltă performanță.

Tehnologia JSP facilitează crearea conținutului dinamic pe partea de server a paginilor Web. Este asemănătoare cu ASP (Active Server Pages) de ep platforma Microsoft Windows și cu PHP, care este independent de platformă. JSP este o soluție Java pentru programarea pe partea de server, fiind o alternativă la CGI-urile clasice(Common Gateway Interface). JSP integrează numeroase tehnologii Java cum ar fi servleturile, JavaBeans și JDBC.

JSP extinde limbajul HTML oferind posibilitatea inserării de secvențe de cod Java prin intermediul unor taguri speciale. Programatorul ar posibilitatea de a crea noi taguri și componente JavaBeans cu semnificațiile indicate de acesta. Astefel, se pot crea noi facilități pentru cei care se ocupă de partea de Web design.

În avelași timp, JSP este o extensie a servletilor. În loc să scriem cod Java care să genereze pagini Web, vom crea pagini Web care vor conține elemente dinamice. Atunci când se primește o cerere de pagină JSP, se creează un servlet din respectiva pagină și acesta este executat, iar rezultatul este trimis ca răspuns la cererea primită.

Un avantaj important al JSP-urilor față de servleti este faptul că se seapară conținutul HTML static de cel dinamic. În cazul servletilor, orice modificare minoră referitoare la designul paginii Web implică recompilarea respectivului servlet. La JSP-uri, partea de generare a conținutului dinamic este păstrată separat de cea statică prin utilizarea componentelor JavaBeans externe. Orice modificare a părții statice va fi vizibilă celor ce accesează respectivul JSP, întrucât la primirea cererii se recompilează automat și foarte repede pagina JSP, apoi se sexecută și rezultatul este trimis.

O dată scrisă, o pagină JSP poate fi stocată pe orice sever Web(care are suport pentru JSP), oricare ar fi platforma pe care se afla acesta, fără a suferi modificări.

Nu există limitări referitoare la tipul conținutului generat de părțile dinamice ale JSP-urilor. Acestea pot fi text obișnuit, HTML/DHTML, XML, WML, VRML etc.

Jsp-urile sunt mai ușor e creat și pot extinde funcționalitatea serverului Web (servicii de autentificare, validarea bazelor de date etc.) și pentru comunicarea cu appleturi sau alte aplicații Web.

Crearea paginilor JSP

Deoarece paginile JSP sunt executate pe partea de server, avem nevoie de un server Web. Pentru testarea exemplelor vom utiliza serverul TOMCAT. Paginile JSP vor fi stocate în directorul tomcat_dir/webapps/root.

Paginile JSP au extensia .jsp. Orice pagină HTML poate fi pagină JSP.

In cadrul paginilor JSP se pot utiliza trei tipuri de comentarii :

comentarii HTML încep cu simbolurile <!—și se termină cu –>

Aceste comentarii pot fi vazute atât de programator cât și de utilizatori. Utilizatorii pot vedea comentariile HTML în momentul vizualizării sursei paginii HTML. Comentariile HTML pot conține taguri specifice JSP care vor fi înlocuite la momentul execuției de către server.

comentarii JSP apar înte delimitatorii <%– și –%>

Aceste comentarii sunt eliminate în momentul transformării paginii JSP în servlet. Orice comentariu JSP va fi ignorat la transformarea paginii JSP în servlet și nu va fi vizibil utilizatorului. Din acest motiv se mai numesc și comentarii ascunse.

comentariile Java (/* comentariu java */)pot fi utilizate atunci când apar secvențe de cod Java. Acestea nu vor apărea în paginile Web trimies de cître serverul Web, deoarece sunt eliminate la transformarea paginii JSP în servlet.

Directivele oferă posibilitatea de adăugare de informații adiționale și pentru descrierea atributelor paginii. De exemplu, directivele sunt utilizate pentru importarea pachetelor Java, includerea fișierelor și pentru accesarea librăriilor de taguri definite de utilizator.

Sintaxa generală pentru directive este:

<%@ directivă [….] %>

sau utilizând spațiul de nume jsp:

< jsp: directive.directiva [….] />

Directiva page poate fi utilizată pentru a importa pachete și clase Java, la fel ca instrucțiunea import. Acesată directivă poate poseda următoarele atribute:

language – specifică limbajul de programare

extends – indică superclasa pentru clasa servletului care se va genera

import – importă lista de pachete și/sau clase specificate

session (true/false) – indică dacă se stabilește o sesiune

buffer – stabilește dimensiunea bufferului(în kilo-octeți)

autoFlush (true/false) – indică dacă se golește automat bufferul

info – specifică informații despre pagina JSP

errorPage – indică URL-ul paginii care av fi transmisă utilizatorului în caz de eroare

isErrorPage (true/false) – indică dacă este pagina pentru erori

contentType – specifică tipul documentului returnat.

Se poate observa că directiva page stabilește informațiile privitoare la pagina JSP.

Directiva include conduce la includerea unui alt fișier în pagina JSP. Acest lucru este util atunci când dorim să creăm un site unitar în care fiecare pagină același meniu de navigare. Respectivul meniu se va include într-un fișier separat(se va scrie secțiunea de cod HTML/JSP corespunzătoare meniului), iar acesta va fi inclus prin intermediul directivei include în cadrul tuturor paginilor. Dacă respectivul fișier conține elemente JSP, acestea vor fi și ele considerate în momentul transformării paginii JSP în servlet.

Această directivă are un singur atribut (file) care indică numele și locul unde se găsește respectivul fișier.

Crearea librăriilor de taguri proprii este una dintre importantele facilități ale tehnologiei JSP. Noi capabilități ale paginilor JSP se pot încapsula prin intermediul tagurilor particularizate. Acestea pot fi utilizate de către persoanele care nu posedă cunoștințe de programare. Astfel se separă partea de interfață de partea de funcționalitate.

Directiva taglib inclde o librărie de taguri definite de programtori. Aceasta conține două atribute:

uri – stabilește fișierul care conține definiția tagurilor

prefix – fixează un prefix unic pentru respectiva librărie de taguri, pentru a nu apărea conflicte la utilizarea unui același tag care este definit în două librării distincte.

În partea de declarații se pot declara date și funcții membre pentru utilizarea în interiorul paginilor JSP. Acestea vor face parte din servletul generat din pagina JSP.

Declarațiile se pot insera astfel:

<%! declarații %>

sau prin:

< jsp: declaration> declarații < /jsp: declaration>

Există numeroase obiecte implicite definite de arhitectura JSP. Acestea furnizează accesul la mediul din momentul execușiei. Se poate întâmpla de multe ori să nu avem nevoie în mod direct de obiectele prefedinite. Lista obiectelor predefinite, precum și o scurtă descriere a acestora se poate vedea în tabela următoare:

O expresie JSP este o expresie Java care este evaluată la momentul execuției, rezultatul fiind convertit al tipul String și scris în fluxul de ieșire. Sintaxa generală a expresiilor este:

<%= expresie_Java %>

sau prin:

< jsp: expression> expresie_Java < /jsp: expression>

Având la baza tehnologia servleturilor, JSP-urile permit crearea de pagini Web dinamice. Sunt mult mai ușor de implementat decât servleturile și oferă posibilitatea de a crea aplicații Web complexe, putându-se utiliza componentele JavaBeans, documente text sau binare, conexiuni la baze de date sau la diverse servere din rețea etc.

Asemenea servleturilor, se bucură de întregul suport oferit de limbajul Java.

DESCRIEREA APLICAȚIEI

3.1 Structura bazei de date

Exista o serie de tabele care contin coduri. Fiecare dintre aceste tabele contin un camp Id, care identifica in mod unic o inregistrare si un nume.

Tabela tblStatus permite inregistrarea statutului unui pacient, si este alcatuita din doua capmuri: IdStatut (cheie primara) si TipStatut.

Statutul unui pacient(tipStatut) poate fi :

asigurat

neasigurat

strain

Pentru codificarea diagnosticelor exista trei tabele tblClasa, tblSubclasa si tblDiagnostic conectate intr-o relatie de tip 1 :m, deoarece intr-o clasa sunt mai multe subclase, iar intr-o subclasa exista mai multe diagnostice.

Tabela Diagnostic este alcătuită din următoarele câmpuri:

IdDiagnostic – de tip Integer, cu autoincrementare, reprezintă cheia primară a tabelei tblDiagnostic;

DenumireDiag – de tip varchar(20), este folosit pentru introducerea numelui diagnosticului;

CodDiag – de tip varchar(20), este utilizat pentru introducerea codului unui diagnostic, cod ce este regasit in lista de diagnostice pe care sistemul DRG o pune la dispoziția spitalelor;

PozaDiag – de tip varchar(255), în cadrul căruia se va specifica calea de unde se va încărca poza aferentă diagnosticului introdus.

Pentru codificarea investigatiilor RX si a investigatiilor functionale, exista tabelele tblInvestigRx, respectiv tblExplFct.

Tabela tblInvestigRx este alcătuită din următoarele câmpuri:

IdInvestigRx – de tip Integer, cu autoincrementare, care este cheia primara a acestei tabele;

DataInvestigRx – de tip data calendaristica, ca memora data la care s-a efectuat investigatia RX;

Rezultat – de tip varchar(20), este folosită pentru memorarea rezultatului investigatiei radilogice

Tabela tblExplFct este formată din următoarele câmpuri :

IdExplFct – de tip Integer, cu autoincrementare, reprezintă cehia primară a tabelei ;

DataExpl – de tip data calendaristica, reprezintă data la care a fost făcută explorarea funcțională ;

Rezultat – de tip varchar(20) va conține rezultatul explorarii funcționale

Exista de asemenea o tabela care permite codificarea interventiilor chirurgicale, numită tblIntervCh.

Această tabelă este alcătuită din următoarele cămpuri:

IdIntervCh – de tip Integer, cu autoincrementare, reprezintă cheia primară a tabelei tblIntervCh;

Data – de tip data calendaristică, reprezintă data la care s-a efectuat intervenția chirurgicală;

Rezultat – de tip varchar(20), va conține reyultatul intervenției chirurgicale

Alte tabele in baza de date sunt:

In tabela tblSpital sunt inregistrari legate de spital ; Structura acestei tabele este următoarea:

IdSpital – de tip Integer, autoincrement, reprezintă cheia primară a tabelei;

NumeSpital – de tip varchar(20), va conține numele spitalului;

Județ – de tip varchar(20), conține judetul in care se găsește spitalul ;

Localitate – reprezintă localitatea corespunzătoare spitalului.

In tabela tblSecție sunt stocate datele despre secțiile din cadrul fiecarui spital:

IdSectie – de tip Integer , cu autoincrementare, reprezintă cheia primara a tabelei

NumeSecție – de tip varchar(2)- conține numele secției ;

NumarSecție – de tip integer, va contine numărul secției (în cazul în care acesta există)

NrPaturi – va conține numțrul de paturi din cadrul sectiei ;

IDSpital reprezintă cheia externă care face legătura între tabela tblSectie și tabela tblSpital, pentru implementarea relatiei 1:m intre cele două tabele

In fiecare sectie lucreaza un numar de doctori despre care avem informatii in tabela tblMedic.

Structura acestei tabele este următoarea:

IdMedic – de tip Integer, reprezintă cheia primară a tabelei ;

NumeMedic – de tip varchar(20), conține numele medicului ;

SpecialitateMedic – va indica specializarea medicului ;

IdSectie – chie externa folosită a implementa relatia 1:m intre tabelele tblSectie si tblMedic.

Pentru fiecare sectie si un anumit doctor sunt inregistrati pacienti care au o noua foaie la fiecare inregistrarea in spital. Pentru datele acestora exista tabela tblPacient care are urmatoarea structura :

IdPacient – cheia primara a tebelei, de tip integer ;

NumePacient – de tip varchar(20)

PrenumePacient

Data NasterePacient – de tip dată calendaristică ;

SexPacient

CNP – reprezintă codul numeric personal al pacinetului ;

DataInternare – de tip data calendaristică, reprezintă data la care pacientul a fost internat

DataExternare – data la care pacientul a fost externat ;

IdMedic – cheie externa, utilizată pentru a putea cunoaște doctorul care s-a cupat de pacient ;

IdStatut – cheie externă utilizată pentru specificarea statutului unui pacinet ;

IdDiagpr1,IdDiagsec1 – chei externe la tabela tblDiagnostic .

Baza de date mai contine de asemenea o serie de tabele ca rezultata al implemetarii unor relații de tipul m:m între tabelele mentionate anterior.

Tabela tblCodInvestigRx retine pentru fiecare foaie de observatie, identificata prin IdPacient codurile investigatiilor RX efectuate.

Această tabelă este alcătuită din următoarele cîmpuri :

IdCodInvestigRx – cheie primara a tabelei ;

Denumire – de tip varchar(20), indica numele investigatiei Rx ;

IdInvestigRx – cheie externă la tabela tblInvestigRx ;

Tabela tblCodExplFct retine pentru fiecarea foaie de observatie, identificata prin IdPacient codul investigatilor functionale efectuate.

Tabela tblCodInvestigCh retine pentru fiecarea foaie de observatie, identificata prin IdPacient codul interventiilor chirurgicale efectuate pe timpul spitalizarii.

Structura bazei de date

3.2 Administratori, useri și drepturi

Pentru protejarea aplicatiei avem definite cateva nivele definite, pe care le vom descrie mai tarziu.

Nivelul cel mai inalt este nivelul 0, nivelul administratorului bazei de date, care are drepturi depline asupra acesteia. Pentru identificare este folosit un username si o parola. Unul dintre rolurile sale este sa introduca in tabela tblSpital o inregistrare noua pentru fiecare spital care este adaugat in sistemul DRG.

Pentru fiecare spital vom crea un administrator nou, care va avea drepturi asupra informatiilor din cadrul spitalului sau. Acesta reprezinta ceea ce numim nivelul 1 .

Administratorul de la nivelul 1 este cel care are posibilitatea sa vada toate datele sharate de ceilalti useri(ca de exemplu: tabel de diagnostice, tabela de investigatii)

Adimistratorul de spital (de nivel 1) are dreptul de a adauga o noua inregistrare pentru fiecare sectie din cadrul spitalului in tabela tblSectie. El de asemenea trebuie sa creeze pentru fiecare sectie unul sau mai multi useri, care pot modifica inregistrarile din cadrul unei sectii. Acesta este nivelul 2.

Un user(nivel 2) va avaea acces doar la informațiile din cadrul sectiei sale(sectie asupra careia i s-a dat acces).

Aceste trei nivele sunt prezentate in figura urmatoare:

Figura – Nivele de securitate

Se poate observa ca fiecare persoana care interactioneaza cu baza de date are acces limitat: are anumite drepturi pe o parte din baza de date. Administatorul de nivel 0 are acces la toata baza de date, administratorul de nivel 1 are acces la informatiiile din cadrul spitalului sau, si userii de nivel 2 au drepturi numai la informatiile din cadrul sectiilor lor.

In acest fel, un user din sectie 11 nu are drepturi asupra datelor din sectia 12.

Operatiile din baza de dtae care se executa in mod uzual sunt: inserare inregistrare noua, update, stergere si cautarea a unor inregistrari.

De exemplu, unii useri nu au dreptul sa vada toate inregistrari deoarece nu le este permis sa vada date care nu el apartin, ptotejându-se in acest fel accesul al date si informații. Alti useri nu au dreptul sa introduca datele, ci doar sa le vada.

Aspectele prezentate mai sus, garanteaza o securitate buna pentru baza de date care are o importanta nationala.

Interfața grafică

In momentul pornirii aplicației se va deschide o fereastra in care utilizatorul trebuie sa introducă userul și parola pentru a putea avea acces mai departe la meniuriel aplicatiei.

Fereastar principala (de logare) a aplicației este prezentată în figura următoare:

În funcție de user, parolă și gradul specificat utilizatorul va acces la diferite module ale aplicatiei (in funcție de nivelul de administrarea la care se află).

In funcție de tipul de utilizator aplicația va deschide unmeniu personalizat, specific fiecărui tip de utilizator.

Pentru a realiza acest lucru s-a realizat un meniu care va fi la toti utilizatorii, la care se vor adauga optiuni specifice fiecărui utilizator.

Meniul care se va incărca la toți useri este realizat in cadrul fisierului meniu.js. In funcție de tipul userilor (user0, user1, user2) la acest meniu vom mai adauga optiuni, după cum se poate observa in cadrul codului următor:

<script language="JavaScript" type="text/JavaScript" src="meniu.js"></script>

<% if (request.getParameter("user").equals("user0A")){

%>

<script language="JavaScript" type="text/JavaScript" src="optiuni0.js"></script>

<%

}

%>

<% if (request.getParameter("user").equals("user0C")){

%>

<script language="JavaScript" type="text/JavaScript" src="optiuni01.js"></script>

<%

}

%>

<% if (request.getParameter("user").equals("user1")){

%>

<script language="JavaScript" type="text/JavaScript" src="optiuni1.js"></script>

<%

}

%>

<% if (request.getParameter("user").equals("user2")){

%>

<script language="JavaScript" type="text/JavaScript" src="optiuni2.js"></script>

Meniul corespunzator unui user de tipul user0 (adică administrator )nu are nevoie de opțiunea FișaPacienti, utilizată de useri de tip user2 pentru a introduce pacienți în baza de date, deoarece el nu realizează această operatie.

El(user de tip user0) va avea nevoie in schimb de un meniu de setup prin care să poată crea userii de spital precum si pentru a putea adăuga un nou spital in lista de spitale existente.

Atunci când un user de grad 0 dorește să introducă un nou administrator de spital(user grad1) se av deschide o forma ca cea din figura următoare:

Pentru introducerea unui user nou este nevoie de un user și o parola, iar spitalul pe care se dorește să se definească userul va fi selectat dintr-o listă derulantă, în care vor fi afișate toate spitalele introduse in baza de date. În cazul ăn care dorim să introducem un user , iar spitalul nu se regăsește în lista derulantă a spitalelor existente în baza de date, va trebui în prealabil să creăm spitalul respectiv.

Pentru useri de grad 1(administratori de spital) există în cadrul meniului opțiunea de setup, dar această opțiune este diferită de cea pe care am prezentat-o anterior pentru userii de grad0.

Un administrator de spital ca putea să creeze o secție nouă în cadrul spitalului său, va putea introduce un user la nivel de secție, și totodata el este cel care va trebui să introducă lista de medici care lucrează în cadrul spitalului administrat de el.

Userul de grad 2, adică utilizatorul de la nivel de secție nu va avea acces la opțiunea setup din cadrul meniului, deoarece lui nu-i sunt permise operații de crearea useri sau secții. El insă va avea în cadrul meniului o opțiune numită FișaPacient, în cadrul căreia va putea să introducă pacienti din cadrul secției sale. El nu va avea acces decât la secția sa, în cadrul căreia poate adăuga pacienti.

După cum se poate observa forma pentru introducerea unui pacient în baza de date este alcătuită din două părti.

Partea din stânga este folosită pentru introducerea datelor de baza ale pacientului. Se poate observa că aplicația afișează implicit secția și spitalul carora aparține userul evitandu-se în acest fel situațiile în care un user ar încerac să intre într-o altă secție.

În partea dreaptă a formei se introduc datele specifice pacientului, de la date generale, diagnostice, investigatii etc. Valorile câmpurilor din aceasta formă se salvează în niște variabile de sesiune, variabile care la apăsarea butonului de salvare(Save) vor fi salvate în baza de date.

În afara opțiunilor prezentate mai sus, meniu onșine si opțiunea de vizualizare a datelor, opțiune prin care se pot vizualiza date din cadrul unei secții sau din cadrul unui spital, în funcție de tipul de acces pe care utilizatorul il are la baza de date. De exemplu, un user de grad1 va putea sa vizualizeze datele din cadrul spitalului său, pe diferite secții, în timp ce un user de grad 0 va putea să vizualizeze datele de la nivelul tuturor spitalelor, iar un user de grad2 va vedea doar datele din cadrul secție în cadrul căreia el are acces. În cadrul opțiunii de vizualizare se pot vedea pacienții, diagnosticele, intervențiile chirurgicale si explorările funcționale.

Pentru a face operație de vizualizare mai ușoară s-au creat și două butoane care permit afișarea informațiilor cerute ordonate dupa diferie criterii. De exemplu in cadrul vizualizarii diagnosticelor, se poate face o ordonarea a acestora după cod, sau după denumire, pentr a fi mai ușor de identificat.

Opțiunea de căutare permite cautarea unui anumit reper (diagnostic, interventie chirurgicala, explorări funcționale) în baza de date. Căutarea se face după cod sau după denumire, iar rezultatul av fi afișat pe ecran la apăsarea butonului ”Afișează”.

Opțiunea Rapoarte permite editarea unor rapoarte diverse, fie la nivel de sectie sau de spital, fie la nivel global. Ca și până cum , accesul la aceste rapoarte este determinat de gradul fiecărui utilizator. De exemplu un user de grad2, adica user la nivel de secție nu va avea acees decât la rapoartele din cadrul secției sale. Raportul poate fi realizat și intr-o anumită perioadă, caz în care trebuie specificată o dată de început și o dată de sfârșit.

Ultima opțiune a meniului aplicației este Exit care va duce utilizatorul în faza de logare, în care i se va cere un user și o parolă pentru a avea acces la aplicație.

Conexiunea la baza de date

Conexiunea la baza de date se realizează prin specificarea numelui și parolei bazei de date, cu ajutorul unui driver de conectare.

Procesul prin care se obțin informații dintr-o bază de date implică în principiu 5 pași:

înregistrarea driverului JDBC, folosind gestionarul ed drivere DriverManager;

stabilirea unei conexiuni către baza de date;

execuția unei instrucțiuni SQL;

procesarea rezultatelor;

închiderea conexiunii cu baza de date.

Funcționalitatea managerului de drivere este aceea de a menține o referință către toate obiectele driver disponibile în aplicația curentă. Un driver JDBC este înregistrat automat de managerul de drivere atunci când clasa driver este încărcată dinamic. Pentru încărcarea dinamică a unui driver JDBC s-a folosit metoda Class.forName().

Class.forName() este o metoda statică ce permite mașinii virtuale Java să aloce dinamic, să încarce și să facă legătura la clasa specificată ca argument printr-un șir de caractere . În cazul în care clasa nu este găsită se aruncă o excepție ClassNotFoundException. O dată ce s-a încărcat driverul, putem să-l folosim pentru stabilirea unei conexiuni către baza de date. O conexiune JDBC este identificată printr-un URL specific.

Conexiunea la baza de date s-a realizat in modul următor:

String dataBaseUrl = "";

String username = "";

String password="";

Connection conn = null;

try{

//load the jdbc driver

String driverName = "org.gjt.mm.mysql.Driver"; //mySql MM JDBC Driver

Class.forName(driverName).newInstance();

//create a connection to the database

dataBaseUrl = this.getServletContext().

getInitParameter("dataBaseUrl");

username = this.getServletContext().

getInitParameter("databaseUserName");

password = this.getServletContext().

getInitParameter("databaseUserPassword");

String url = "jdbc:mysql://" + dataBaseUrl; // a JDBC url

conn =DriverManager.getConnection(url, username,password);

}

catch (ClassNotFoundException e){

//could not find the database driver

System.out.println(e.getMessage());

}

catch (SQLException e){

//could not connect to the database

System.out.println(e.getMessage());

}

Operații asupra bazei de date

Pentru execuția unei instrucțiuni Sql, prin intremediul căreia se fac operatii asupra bazei ed date, se folosește metoda createStatement().

Statement stmt = conn.createStatement();

Această metodă este aplicată unui obiect Connection, și întoarce un obiect din clasa Statement. Ea se folosește pentru instrucțiuni SQL simple, fără parametrii.

În continuare s-a aplicat metoda executeQuery(), care se folosește în cazul interogărilor care returnează mulțimi rezultat(ResultSet), așa cum este cazul instrucțiunilor SELECT.

Ex. String sSql = "SELECT * from tblsectie where (tblsectie.Idsectie='"+IdSectie+"')";

ResultSet rs = stmt.executeQuery(sSql);

În cazul operațiilor de inserare în baza de date(INSERT) se folosește metoda executeUpdate(), care se aplică obiectului de tip Statement, și va rezulta un întreg care reprezintă numărul înregistrării afectate.

Ex. String sSql = "INSERT INTO tblsectie values("Medicala",1, 20)";

Int raspuns = stmt.executeUpdate(sSql);

În acest moment, pentru parcurgerea simplă a înregistrărilor din clasa ResultSet, s-a folosit metoda next(), după cum se poate observa în secvența de cod următoare:

<% while (rs.next()){

%>

<td><b><%=rs.getString("NumeSectie")%> <%=rs.getString("NumarSectie")%></b></td>

În mod implicit cursorul se poziționează înainte de prima linie, de aceea condiția din while este rs.next(). Cursorul poate fi mutat doar înainte folosind metoda next().

Pentru determinarea liniei curente se poate folosi metoda getRows(). De asemenea există metodele first() și beforeFirst() pentru poziționarea pe ultima, respectiv înainte de prima linie, last() și afterLast() pentru poziționarea pe ultima, respectiv după ultima linie.

După ce datele au fost procesate, se inchide conexiunea catre baza de date folosind metoda close(). În plus înainte de a se inchide conexiunea trebuie închise și obiectele Statement și ResultSet folosind metodele lor close().

Se mai pot realiza și operații de updatare a informațiilor din baza de date, folosind instrucțiunea UPDATE, precum și operatții de ștergere din baza de date utilizând DELETE. Aceste ultimedouă instrucțiuni vor fi implmentate pe parcurs.

Căutare

Operația de căutare a fost implementată pentru a putea găsi diferite informații legate de diagnostice, intervenții chirurgicale și explorări funcționale. In viitor aplicației i se va adăuga și un modul pentru căutarea unui pacient, fie după nume, fie după CNP, fie după numărul foii de observație.

Forma care se deschide la opțiunea cautare din cadrul meniului este prezentată în figura următoare:

La apăsarea butonului Afisează, se execută un SELECT în baza de date avand ca și condiții de căutare datele introduse în forma. Datele obținute în urma select+ului din baza de date se vor afișa în cadrul unei tabele, așa cum se poate observa in cadrul codului respectiv:

<%

if (request.getParameter("Afiseaza")!=null){

out.println("S-a gasit urmatorul rezultat:");

try{

Statement stmt = conn.createStatement();

String checkifdiag = "SELECT * from tblDiagnostic where (tblDiagnostic.Cod='"+sCod+"')OR (tblDiagnostic.DenumireDiag='"+sDenDiag+"')";

ResultSet rs = stmt.executeQuery(checkifdiag);

%>

<table bordercolor="#666666" border="3" align="center">

<tr>

<td><b>Cod Diagnostic</b></td>

<td><b>Denumire Diagnostic</b></td>

</tr>

<% while(rs.next()){

%><tr>

<td><%=rs.getString("Cod")%></td>

<td><%=rs.getString("DenumireDiag")%></td>

</tr>

<%}

%>

</table>

<%

stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

} %>

Operațiunea de căutare va fi aceeași la toți utilizatorii indiferent de gradul de acces. Acest lucru se întâmplă datorită faptului că se face o căutare în baza de date a unor informații care sunt puse la dispoziția spitalelor de către Biroul Central din București, și reprezintă informații standardizate, care sunt aceleași indiferent de loc sau de persoana care le cere.

Diferită de operația de căutarea este operația de vizualizare, care depinde foarte mult de gradul de acces pe care utilizatorul il are. În funcție de acesta, se pot vizualiza numai anumite date din baza de date.

Acest lucru a fost realizat prin adăugarea unei condiții suplimentare în cadrul instrucțiunii SELECT, prin care se cere ca informațiile să aparțină numai unei anumite categorii

De exemplu un user de grad 0 va putea vizualiza doar date legate de secția sa, iar pentru acest lucru condiția din SELECT va arăta astfel:

String checkifuser = "SELECT IdPacient,NumePacient, PrenumePacient,DataInternare,NumeMedic, SpecialitateMedic, NumeSectie,NumeSpital,Localitate

from tblpacient,tblMedic,tblsectie,tblspital

where (tblSectie.IdSectie='"+IdSectie+"')AND (tblsectie.IdSpital=tblspital.Idspital)AND (tblPacient.IdMedic=tblmedic.IdMedic)AND (tblmedic.IdSectie=tblsectie.IdSectie)";

Id-ul de secție se va transmite impreuna cu informațiile despre user pin intermediul unor variabile de sesiune.

String IdSectie = (String) session.getAttribute("IdSectie");

În cazul userilor de grad1 (administratorii de spital) forma de vizualizare va avea in plus un cîmp din care să se poată selecta secția de unde se doresc a se vizualiza date, iar cea pentru useri ed grad 0 va avea și cîmpseparat pentru selectarea spital. În funcție de spitalul selectat, în câmpul corespunzator sectiilor se vor afișa secțiile corespunzatoare spitalului anterior selectat.

Rapoarte

Rapoartele pe care aplicația le generează sunt al nivel de secție, la nivel de spital sau la nivel global.

Ca și celelalte opțiuni, accesul la aceste rapoarte este determinat de gradul de acces al utilizatorului la baza de date.

Userul de secție va avea acces la rapoartele care cuprind secția sa, alte rapoarte ne fiindu-i necesare.

După cum se poate observa în forma de mai jos, spitalu și secșie careia userul aparține sunt completate automat de către aplicație, utilizatorul trebuind să selecteze perioada de timp în care vrea sa vadă raportul.

Aplicația realizează un raport cu persoanele internate intr-o anumită perioadă, iar pe viitor vor fi realizate și alte rapoarte(ca de ex. numărul de persoane decedate intr-o secție-spital-nivel național, diagnosticele cele mai des întâlnite etc.).

La userii de grad 1(administratorii de spital) în cadrul formei de rapoarte va fi afișat un buton din care utilizatorul va trebui să aleagă secția pentru care dorește să vadă raportul. Lista de secții care se va deschide va reprezenta secțiile din cadrul spitalului caruia userul ii este administrator.

La userii de grad 0 (administratorul general) va apare în plus și un buton pentru selecția spitalului, și ca și la căutare, în momentul selectării unui spital, în lista de sectii se vor afișa doar secțiile din cadrul spitalului selectat anterior.

CONCLUZII

In aceasta lucrarea am prezentat o nouă soluție de implementare a aplicației DRGNațional, care elimină dificultățile celei foloste astăzi.

In prezent este folosita o aplicatie bazata de MS Access 2000. Întâi de toate, MS Access 2000 este un sistem de administrare a bazelor de date și aministrează eficient un număr redus de înregistrări : în jur de 20000-30000 înregistări, folosit în general in activitatea de management în companiile mici. Acesta este motivul pentru care, în loc să folosim MS Access 2000 noi propunem un sistem de adminitrarea a bazelor de date mult mai puternic, numit MySQL.

Aplicație propusa oferă mai multe avantaje:

anulează faza de criptare a datelor și transmiterea lor prin e-mail, deoarece poate aduce o mulțime de probleme; datele primite prin e-mail de către Biroul Național DRG trebuie salvate într-un anumit format, eventual bază de date, pentru a putea fi folosite pentru vizualizate sau pentru elaborarea unor rapoarte, statistici sau grafice ; când se adaugă în aceeași bază de date informații de la diverse surse, pot aparea probleme(de exemplu, valoarea cheii primare poate fi identica in unele fise. În acest caz trebuie făcute procese suplimentare înainte de salvarae în baza de date ; toatea acestae necesita timp).

datele văzute la Biroul Național DRG sunt totdeauna actulaizate(up to date); nu este necesar să se aștepte sfârșitul unei anumite perioade de timp pentru a primi aceste date ; oricand datele pot fi vizualizate ca rapoarte, statistici sau grafice, lucru care este foarte important pentru domeniul medical.

aplicația, baza de date și serverul de baze de date trebuie instalate pe un singur computer(server) ; acesta va fi accesat de orice utilizator, în limita drepturilor sale, de pe propriul calculator, folosind un browser ; în acest fel nu este necesar ca aplicația să fie instalată pe computerul fiecărui utilizator(client) ; bine inteles performanta serverului trebuie să fie foarte ridicată.

In final am vrea sa specificam ca aplicatia este in stadiu de dezvoltare

LISTING

<Fisierul de logare: login1.jsp>

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %>

<%@include file= "conexiune.jsp" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Login</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<script language="javascript"

<!–

function checkform(){

var mesaj="";

if ( (document.userform.nume.value.length==0) ||

(document.userform.parola.value.length==0) ||

(document.userform.grad.value.length==0) )

{

mesaj=mesaj+"NU ati completat toate campurile .\n";

}

if ( document.userform.nume.value.length<3 ) {

mesaj=mesaj+"Numele trebuie sa aiba minim 3 caractere.\n";

}

if ( document.userform.parola.value.length<5 ) {

mesaj=mesaj+"Parola trebuie sa aiba minim 5 caractere.\n";

}

if (!mesaj.equals(""))

{

mesaj="Corectati erorile!"+mesaj;

return false;

}

else {

return true;

}

}

–>

</script>

</head>

<body bgcolor='#EFFFFF'>

<%!

String sNume;

String sParola;

String sGrad;

%>

<% if (request.getParameter("nume")==null){

%>

<form method="post">

<center><fieldset>

<font face="Times New Roman" size="5">

<legend>Autentificare Utilizator </legend>

<img src="poze/doctor2.jpg" width="750" height="350" border="0" alt="">

<table>

<tr>

<td><table border="0" align="center" >

<tr>

<td align="right">Nume: </td>

<td align="left"><INPUT name="nume" type="text" tabindex="1" size=20 maxlength=20>&nbsp;<br></td>

<td align="right">Parola: </td>

<td align="left"><INPUT name="parola" type="text" tabindex="1" size=20 maxlength=20>&nbsp;<br></td>

</tr>

<tr>

<td align="right">Grad:</td>

<td align="left"><SELECT NAME="grad" >

<OPTION SELECTED VALUE="">Select…</OPTION>

<OPTION>0</OPTION>

<OPTION>1</OPTION>

<OPTION>2</OPTION>

</SELECT><br> </td>

</tr>

</table ></td>

</tr>

<tr><table border="0" align="center">

<tr><td align="center"><input type="submit" value="Submit"><input type="reset" value="Reset"></td></tr>

</table>

</tr>

</table>

</fieldset></center>

</form>

<%}

else{

//out.println(dataBaseUrl+" "+username+" "+password);

sNume = request.getParameter("nume");

sParola = request.getParameter("parola");

sGrad = request.getParameter("grad");

if (sGrad.equals("0")){

//verific daca exista userul

try{

Statement stmt = conn.createStatement();

String checkifuser = "SELECT * from tblusergrad0 WHERE Nume='"+sNume+"' && Parola ='"+sParola+"'";

ResultSet rs = stmt.executeQuery(checkifuser);

if (! rs.next()){

response.sendRedirect("eroare.jsp");

}

else{

String sFlag = rs.getString("Flag");

out.println(sFlag);

if (sFlag.equals("A")){

session.setAttribute("drepturi",new String("1"));

response.sendRedirect(response.encodeURL("user0A.jsp"));

}

if (sFlag.equals("C")){

session.setAttribute("drepturi",new String("2"));

response.sendRedirect(response.encodeURL("user0C.jsp"));

}

}

stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

}

if (sGrad.equals("1")){

try{

Statement stmt = conn.createStatement();

String checkifuser = "SELECT * from tblusergrad1 WHERE Nume='"+sNume+"' && Parola ='"+sParola+"'";

ResultSet rs = stmt.executeQuery(checkifuser);

if (! rs.next()){

response.sendRedirect("eroare.jsp");

}

else{

session.setAttribute("drepturi",new String("3"));

response.sendRedirect(response.encodeURL("user1.jsp"));

}

stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

}

if (sGrad.equals("2")){

try{

Statement stmt = conn.createStatement();

String checkifuser = "SELECT * from tblusergrad2 WHERE Nume='"+sNume+"' && Parola ='"+sParola+"'";

ResultSet rs = stmt.executeQuery(checkifuser);

if (! rs.next()){

response.sendRedirect("eroare.jsp");

}

else{

session.setAttribute("drepturi",new String("4"));

session.setAttribute("IdSectie",rs.getString("IdSectie"));

response.sendRedirect(response.encodeURL("user2.jsp"));

}

stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

}

}

%>

</body>

</html>

<Fisierul user0A.jsp>

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Untitled Document</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<!– *** IMPORTANT STYLESHEET SECTION – Change the border classes and text colours *** –>

<style>

<!–

.itemBorder { border: 1px solid black }

.itemText { text-decoration: none; color: #FFFFFF; font: 12px Arial, Helvetica }

.crazyBorder { border: 2px outset #663399 }

.crazyText { text-decoration: none; color: #FFCC99; font: Bold 12px Arial, Helvetica }

–>

</style>

</head>

<frameset rows="18%,*">

<frame src="<%=response.encodeURL("meniu.jsp?user=user0A")%>" noresize name="frame1" frameborder="no" >

<frame src="<%=response.encodeURL("forma.jsp")%>" noresize name="frame2" frameborder="no" >

</frameset><noframes></noframes>

<BODY >

user 0A

</BODY>

</html>

<Fisierul optiuni0.jsp>

var menu = new Array();

// Default colours passed to most menu constructors (just passed to functions, not

// a global variable – makes things easier to change later in bulk).

var defOver = '#336699', defBack = '#003366';

// Default 'length' of menu items – item height if menu is vertical, width if horizontal.

var defLength = 22;

// Menu 0 is the special, 'root' menu from which everything else arises.

menu[0] = new Array();

menu[0][0] = new Menu(false, '', 265, 15, 17, '#669999', '#006666', '', 'itemText');

// Notice how the targets are all set to nonzero values…

// The 'length' of each of these items is 40, and there is spacing of 10 to the next item.

// Most of the links are set to '#' hashes, make sure you change them to actual files.

menu[0][1] = new Item(' Cautare', 'cautare.jsp', 'frame2', 80, 10, 1);

menu[0][2] = new Item(' Vizualizare', 'vizualizare.jsp', 'frame2',100, 10, 2);

menu[0][3] = new Item(' Rapoarte', 'rap.jsp', 'frame2', 80, 10, 3);

menu[0][4] = new Item(' Setup', 'setup.jsp', 'frame2', 80, 10, 4);

menu[0][5] = new Item(' Exit', 'login1.jsp', 'frame2', 80, 10, 5);

// Cautare menu.

menu[1] = new Array();

menu[1][0] = new Menu(true, '>', 0, 22, 140, defOver, defBack, 'itemBorder', 'itemText');

menu[1][1] = new Item(' Diagnostic', 'diag0.jsp', 'frame2', defLength, 0, 0);

menu[1][2] = new Item(' Interventii Chirurgicale', 'intch0.jsp', 'frame2', defLength, 0, 0);

menu[1][3] = new Item(' Explorari Functionale', 'explfct0.jsp', 'frame2', defLength, 0, 0);

//Vizualizare menu

menu[2] = new Array();

menu[2][0] = new Menu(true, '<', 0, 22, 160, defOver, defBack, 'itemBorder', 'itemText');

menu[2][1] = new Item('Pacienti', 'pac0.jsp', 'frame2', 20, 0, 0);

menu[2][2] = new Item('Diagnostice secundare ', 'diagn0.jsp', 'frame2', 20, 0, 0);

menu[2][3] = new Item('interventii Chirurgicale', 'interv0.jsp', 'frame2',20, 0, 0);

menu[2][4] = new Item('Explorari Functionale', 'expl0.jsp', 'frame2', 20, 0, 0);

// Rapoarte menu

menu[3] = new Array();

menu[3][0] = new Menu(true, '>', 0, 22, 130, defOver, defBack, 'itemBorder', 'itemText');

//Setup menu

menu[4] = new Array();

menu[4][0] = new Menu(true, '>', 0, 22, 120, defOver, defBack, 'itemBorder', 'itemText');

menu[4][1] = new Item('Lista Spitale', 'setup.jsp', 'frame2', 20, 0, 6);

//Iesire menu.

menu[5] = new Array();

menu[5][0] = new Menu(true, '<', 0, 22, 90, defOver, defBack, 'itemBorder', 'itemText');

// Lista Spital popout

menu[6] = new Array();

// Leftwards popout with a negative x and y relative to its trigger.

menu[6][0] = new Menu(true, '>', 110, 18, 90, defOver, defBack, 'itemBorder', 'itemText');

menu[6][1] = new Item('Spital Nou', 'lspital.jsp', 'frame2', 20, 0, 0);

menu[6][2] = new Item('User NOU', 'lusersp.jsp', 'frame2', 20, 0, 0);

<Fisierul luserspital.jsp>

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %>

<%@include file= "conexiune.jsp" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Proiect Licenta</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>

<body>

<% String drepturi = (String) session.getAttribute("drepturi");

%>

drept:<%=drepturi%>

<%!

String sNume;

String sParola;

%>

<% if (request.getParameter("nume")==null){

%>

<form method="post">

<center><fieldset>

<font face="Times New Roman" size="5">

<legend>Creare user spital </legend>

<img src="poze/doctor2.jpg" width="600" height="280" border="0" alt="">

<table>

<tr>

<td><table border="0" align="center" >

<tr>

<td align="right">Nume: </td>

<td align="left"><INPUT name="nume" type="text" tabindex="1" size=20 maxlength=20>&nbsp;<br></td>

<td align="right">Parola: </td>

<td align="left"><INPUT name="parola" type="text" tabindex="1" size=20 maxlength=20>&nbsp;<br></td>

</tr>

<tr>

<td align="right">Spitalul:</td>

<td align="left"><SELECT NAME="Spital" >

<OPTION SELECTED VALUE="">Select…</OPTION>

<%

try{

Statement stmt = conn.createStatement();

String sSql = "SELECT * from tblspital";

ResultSet rs = stmt.executeQuery(sSql);

while (rs.next()){

%>

<option value="<%=rs.getString("IdSpital")%>">

<%=rs.getString("NumeSpital")%></option>

<%

}

stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

%>

</SELECT><br> </td>

</tr>

</table ></td>

</tr>

<tr><table border="0" align="center">

<tr><td align="center"><input type="submit" value="Submit"><input type="reset" value="Reset"></td></tr>

</table>

</tr>

</table>

</fieldset></center>

</form>

<%}

else{

//out.println(dataBaseUrl+" "+username+" "+password);

sNume = request.getParameter("Nume");

sParola = request.getParameter("parola");

out.println(sNume+" "+sParola);

}

%>

</body>

</html>

<Fisierul pac1. jsp>

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %>

<%@include file= "conexiune.jsp" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Proiect Licenta</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>

<body background="poze/stetoscop2.jpg" >

<% String drepturi = (String) session.getAttribute("drepturi");

String IdSpital = (String) session.getAttribute("IdSpital");

%>

drept:<%=drepturi%>

spital:<%=IdSpital%>

<%

String sNumeSec="";

%>

<center><FIELDSET>

<LEGEND><b> vizualizare </b> </LEGEND>

<table align="center">

<form method="post" >

<table border="0" align="center">

<td>

<td align="right"><B>Nume Sectie:</B></td>

<td align="left"><INPUT name="numesec" type="text" size=12 maxlength=20 value="<%=sNumeSec=request.getParameter("numesec")%>"><br></td>

<%sNumeSec=request.getParameter("numesec");%>

</td>

<td>

<table border="0" align="right">

<tr><td align="center"><input name="Afiseaza" type="submit" value="Afiseaza" ></td></tr>

<tr><td align="center"><input type="reset" value="Reset"></td></tr>

</table></td>

</table></center>

<%

if (request.getParameter("Afiseaza")!=null){

out.println("S-a gasit urmatorul rezultat:");

try{

Statement stmt = conn.createStatement();

String checkifuser = "SELECT IdPacient,NumePacient,PrenumePacient,DataInternare,NumeMedic, SpecialitateMedic,NumeSectie,NumeSpital,Localitate from tblpacient,tblMedic,tblsectie,tblspital where (tblSectie.IdSectie='"+sNumeSec+"')AND(tblsectie.IdSpital=tblspital.Idspital)AND(tblPacient.IdMedic=tblmedic.IdMedic)AND (tblmedic.IdSectie=tblsectie.IdSectie)";

ResultSet rs = stmt.executeQuery(checkifuser);

%>

<table bordercolor="#666666" border="3" align="center">

<tr>

<td><b>IdPacient</b></td>

<td><b>NumePacient</b></td>

<td><b>PrenumePacient</b></td>

<td><b>Data Internare</b></td>

<td><b>Nume Medic</b></td>

<td><b>Specialitatea</b></td>

<td><b>Nume Sectie</b></td>

<td><b>Nume Spital</b></td>

<td><b>Localitate</b></td>

</tr>

<%

while(rs.next()){

//out.println(rs.getString("NumePacient"));

%>

<tr>

<td><%=rs.getString("IdPacient")%></td>

<td><%=rs.getString("NumePacient")%></td>

<td><%=rs.getString("PrenumePacient")%></td>

<td><%=rs.getString("DataInternare")%></td>

<td><%=rs.getString("NumeMedic")%></td>

<td><%=rs.getString("SpecialitateMedic")%></td>

<td><%=rs.getString("NumeSectie")%></td>

<td><%=rs.getString("NumeSpital")%></td>

<td><%=rs.getString("Localitate")%></td>

</tr>

<%}

%>

</table>

<%

stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

}

%>

</body>

</html>

<Fisierul rapp1.jsp>

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %>

<%@include file= "conexiune.jsp" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Proiect Licenta</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>

<body background="poze/doctor11.jpg">

<% String drepturi = (String) session.getAttribute("drepturi");

String IdSectie = (String) session.getAttribute("IdSectie");

String IdSpital = (String) session.getAttribute("IdSpital");

%>

drept:<%=drepturi%><br>

<%

String sNume;

String sParola;

String sSpital="";

String sSectie="";

String sDataI="";

String sDataF="";

%>

<center><FIELDSET>

<LEGEND><b> Raport Sectie </b> </LEGEND>

<table align="center">

<form method="post" >

<td><table border="0" align="center">

<tr>

<td align="right">Spitalul:</td>

<td align="left"><SELECT NAME="Spital" >

<OPTION SELECTED VALUE="">Select…</OPTION>

<%

try{

Statement stmt = conn.createStatement();

String sSql = "SELECT * from tblspital";

ResultSet rs = stmt.executeQuery(sSql);

while (rs.next()){

%>

<option value="<%=rs.getString("IdSpital")%>"> <%=rs.getString("NumeSpital")%></option>

<%

sSpital=(String)rs.getString("NumeSpital");

out.println(sSpital);

}

stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

%>

</SELECT><br> </td>

<td align="right">Sectia:</td>

<td align="left"><SELECT NAME="Sectia" >

<OPTION SELECTED VALUE="">Select…</OPTION>

<%

try{

Statement stmt = conn.createStatement();

String sSql = "SELECT * from tblSectie where (tblSectie.IdSpital='"+sSpital+"')";

ResultSet rs = stmt.executeQuery(sSql);

while (rs.next()){

%>

<option value="<%=rs.getString("IdSectie")%>"> <%=rs.getString("NumeSectie")%><%=rs.getString("NumarSectie")%></option>

<%

}

stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

%>

</SELECT><br> </td>

</tr>

<tr>

<td align="right">Data inceput:</td>

<td align="left"><INPUT name="data_inc" type="text" size=12 maxlength=20 value="<%=sDataI=request.getParameter("data_inc")%>"><br></td>

<%sDataI = request.getParameter("data_inc");%>

<td align="right">Data sfarsit:</td>

<td align="left"><INPUT name="data_sf" type="text" size=12 maxlength=20 value="<%=sDataF=request.getParameter("data_sf")%>"><br></td>

<%sDataF = request.getParameter("data_sf");%>

</tr>

</table>

</td>

<td><table border="0" align="center">

<tr><td align="center"><input name="Afiseaza" type="submit" value="Afiseaza">

<tr><td align="center"><input type="reset" value="Reset"></td></tr>

</table>

</td>

</table></center>

<%

if (request.getParameter("Afiseaza")!=null){

out.println("Perioada:");

out.println(sSpital);out.println("–>");out.println(sDataF);

try{

Statement stmt = conn.createStatement();

String checkifuser = "SELECT NumePacient,PrenumePacient,DataInternare,NumeMedic, SpecialitateMedic from tblpacient,tblMedic,tblsectie,tblspital where (tblsectie.IdSectie='"+IdSectie+"')AND (tblPacient.DataInternare>='"+sDataI+"')AND (tblPacient.DataInternare<='"+sDataF+"')AND (tblmedic.IdSectie='"+IdSectie+"')AND(tblPacient.IdMedic=tblmedic.IdMedic)AND(tblsectie.IdSpital=tblSpital.IdSpital)";

ResultSet rs = stmt.executeQuery(checkifuser);

%>

<table bordercolor="#666666" border="3" align="center">

<tr>

<td><b>NumePacient</b></td>

<td><b>PrenumePacient</b></td>

<td><b>Data Internare</b></td>

<td><b>Nume Medic</b></td>

<td><b>Specialitatea</b></td>

</tr>

<%

while(rs.next()){

//out.println(rs.getString("NumePacient"));%>

<tr>

<td><%=rs.getString("NumePacient")%></td>

<td><%=rs.getString("PrenumePacient")%></td>

<td><%=rs.getString("DataInternare")%></td>

<td><%=rs.getString("NumeMedic")%></td>

<td><%=rs.getString("SpecialitateMedic")%></td>

</tr>

<%} %>

</table>

<% stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

}

%>

</body>

</html>

<Fisierul diagn0.jsp>

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %>

<%@include file= "conexiune.jsp" %>

<%@ page import="java.util.*"%>

<%@ page import="java.text.*"%>

<%@ page import="java.io.*"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Proiect Licenta</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>

<body>

<% String drepturi = (String) session.getAttribute("drepturi");

String IdSectie = (String) session.getAttribute("IdSectie");

%>

drept:<%=drepturi%><br>

<b>Diagnostice</b>

<center><FIELDSET>

<LEGEND><b> Vizualizare Diagnostice </b> </LEGEND>

<table align="center">

<form method="post" >

<td><table border="0" align="center">

<tr><td align="center"><input name="OrdonareCod" type="submit" value="Ordonare dupa Cod">

<tr><td align="center"><input name="OrdonareDen" type="submit" value="Ordonare dupa Denumire"></td></tr>

</table>

</TD>

</table>

<%

try{

Statement stmt = conn.createStatement();

String checkifuser = "SELECT IdDiag,DenumireDiag,Cod from tbldiagnostic ";

ResultSet rs = stmt.executeQuery(checkifuser);

%>

<table bordercolor="#666666" border="3" align="center">

<tr>

<td><b>IdDiagnostic</b></td>

<td><b>Denumire Diagnostic</b></td>

<td><b>Cod Diagnostic</b></td>

</tr>

<%

while(rs.next()){

//out.println(rs.getString("NumePacient"));

%>

<tr>

<td><%=rs.getString("IdDiag")%></td>

<td><%=rs.getString("DenumiredIag")%></td>

<td><%=rs.getString("Cod")%></td>

</tr>

<%}

%>

</table>

<%

stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

if (request.getParameter("OrdonareCod")!=null){

out.println("Lista diagnostice ordonate dupa cod:");

try{

Statement stmt = conn.createStatement();

String checkifuser = "SELECT IdDiag,DenumireDiag,Cod from tbldiagnostic Order by Cod";

ResultSet rs = stmt.executeQuery(checkifuser);

%>

<table bordercolor="#666666" border="3" align="center">

<tr>

<td><b>IdDiagnostic</b></td>

<td><b>Denumire Diagnostic</b></td>

<td><b>Cod Diagnostic</b></td>

</tr>

<%

while(rs.next()){

//out.println(rs.getString("NumePacient"));

%>

<tr>

<td><%=rs.getString("IdDiag")%></td>

<td><%=rs.getString("DenumiredIag")%></td>

<td><%=rs.getString("Cod")%></td>

</tr>

<%}

%>

</table>

<%

stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

}

if (request.getParameter("OrdonareDen")!=null){

out.println("Lista diagnostice ordonate dupa denumire:");

try{

Statement stmt = conn.createStatement();

String checkifuser = "SELECT IdDiag,DenumireDiag,Cod from tbldiagnostic Order by DenumireDiag";

ResultSet rs = stmt.executeQuery(checkifuser);

%>

<table bordercolor="#666666" border="3" align="center">

<tr>

<td><b>IdDiagnostic</b></td>

<td><b>Denumire Diagnostic</b></td>

<td><b>Cod Diagnostic</b></td>

</tr>

<%

while(rs.next()){

//out.println(rs.getString("NumePacient"));

%>

<tr>

<td><%=rs.getString("IdDiag")%></td>

<td><%=rs.getString("DenumiredIag")%></td>

<td><%=rs.getString("Cod")%></td>

</tr>

<%}

%>

</table>

<%

stmt.close();

}

catch (SQLException e){out.println(e.getMessage());}

}

%>

</body>

</html>

BIBLIOGRAFIE

1. Burdescu D, Ionescu A, Stanescu L. Databases, Universitaria, Craiova 2004

2. Elmasri R, Navathe SB. Fundamentals of Database Systems. Addison – Wesley Publishing Company , second edition 1994

3. Forta D,Smith E, Stirling S,Kim L, Kerr R,Aden D, Lei A. Dezvoltarea aplicatiilor JavaServer Pages, Teora, Bucuresti 2001

4. Goodwill J. Pure JSP, Java Server Pages: A Code-Intensive Premium Reference, Smas, 2000

5. Matthews M, Cole J, Gradecki JD, Gradecki J. MySQL and Java Developer’s Guide, Wiley 2003

6. DRG Romanian Oficial Page http://www.drg.ro , 2005

7. Welling L, Thomson L. MySQL Tutorial, MySQL Press, 2003

8. Stefan Tanasa,Cristian Olaru, Dezvoltarea aplicatiilor Web folosind Java, Polirom 2005

9. Stefan Tanasa, Cristian Olaru, Stefan Andrei, Java de la 0 la expert , Polirom 2004

10. Apache : http://www.apache.org

11. Java : http://java.sun.com

12. JavaServer Pages Technology, http://java.sun.com.products/servlet/

MySql : http://www.mysql.com

World Wide Web Consortium : http://www.w3.org

Similar Posts