Universitatea Politehnica Bucureşti Facultatea de Automatică şi Calculatoare Departamentul de Automatică şi Ingineria Sistemelor LUCRARE DE LICENŢĂ

Size: px
Start display at page:

Download "Universitatea Politehnica Bucureşti Facultatea de Automatică şi Calculatoare Departamentul de Automatică şi Ingineria Sistemelor LUCRARE DE LICENŢĂ"

Transcription

1 Universitatea Politehnica Bucureşti Facultatea de Automatică şi Calculatoare Departamentul de Automatică şi Ingineria Sistemelor LUCRARE DE LICENŢĂ Sistem Object Relational Mapping in Java Coordonator Şl. Dr. Ing. Ştefan Ioan Sacală Absolvent George-Alin Dragomir Bucureşti,2013

2 CUPRINS Abstract 4 Notaţii şi Abrevieri 5 Listă de figuri 6 Listă de secvenţe de cod 7 1. Introducere Contextul ORM (Object Relational Mapping) Motivatia dezvoltării unui sistem ORM Descrierea proiectului Alegerea Platformei Tehnologii folosite IDE(Mediu integrat de dezvoltare) Sisteme de management ale bazelor de date relaţionale PostgreSQL Microsoft Sql Server API-uri folosite API-ul de JDBC(Java Database Connectivity) API-ul de Reflection API-ul de SWT(Standard Widget Toolkit) API-ul pentru crearea de fişiere PDF Dezvoltarea aplicaţiei Cerinţele aplicaţiei Arhitectura 23

3 4.3 Structura proiectului Funcţionalităţile sistemului şi tratarea problemelor Testarea aplicaţiei Fereastra principală Fereastra Medic Fereastra Farmacist Fereastra Pacient Concluzii şi Dezvoltări ulterioare Dezvoltări ulterioare Concluzii Bibliografie 48 ANEXĂ COD 50

4 Abstract Proiectul îşi propune a fi o aplicaţie de dezvoltare a unui sistem de ORM (Object Relational Mapping) care să implementeze cele patru funcţii principale de lucru cu baza de date, select, update, insert, delete. El presupune familiarizarea cu API-urile de JDBC şi de Reflection, implementarea mini ORM-ului şi dezvoltarea unei aplicaţii de test pentru acesta. Alegerea acestui proiect se datorează lucrului cu astfel de sisteme, dar fără să fi avut o înţelegere de ansamblu asupra funcţionării interne. Pentru dezvoltarea aplicaţiei am folosit limbajul de programare Java, API-uri pentru JDBC, Reflection, SWT şi creare de PDF şi ca sisteme de management al bazelor de date am ales cele mai reprezentative două sisteme PostgreSQL şi Microsoft Sql Server.

5 Notaţii şi Abrevieri API Application Programming Interface AWT Abstract Window Toolkit DB Database GWT Google Web Toolkit IDE Integrated Development Environment JDBC Java Database Connectivity JPA Java Persistance API JVM - Java Virtual Machine J2EE Java Enterprise Edition J2ME Java Micro Edition J2SE Java Standard Edition MVC Model View Controller ORM Object Relational Mapping PDA Personal Digital Assistant PK Primary Key POO Programare Orientată pe Obiecte SGBD Sistem de Gestiune a Bazelor de Date SQL Structured Query Language SWT Standard Widget Toolkit

6 Listă de figuri Fig. 1.1 ORM legătura dintre obiecte şi SGBD Fig 2.1. Fluxul de compilare şi rulare al unei clase Fig Meniul Source Fig Fereastră generare getteri/setteri Fig Meniu apărut la apăsarea combinaţiei de taste Fig Paletă de componente Fig Paletă de elemente în SWT Fig Exemplu de casetă cu proprietăţile unui element Fig Clasă pentru dezvoltarea în mediul grafic Fig Arhitectura unei aplicaţii complete ce foloseşte un ORM Fig Organizarea internă a proiectului Fig Fereastra principală Fig Fereastra de categorii Fig Fereastra pentru medici de familie Fig Vizualizarea programărilor Fig Medicină naturistă Fig Medicină Veterinară Fig Farmacist Fig Fereastra pentru programare Fig Mesaj în cazul în care programarea s-a făcut cu success Fig Mesaj în cazul în care programarea nu este posibilă Fig Coloanele tabelului rețete Fig Clasa Reteta ce mapează tabelul retete p9 p12 p14 p14 p15 p19 p20 p20 p21 p24 p24 p38 p39 p39 p41 p42 p42 p43 p44 p44 p45 p45 p46 6

7 Listă de secvenţe Secvenţa Date pentru conexiunea la bază Secvenţa 4.2. Formarea parametrilor şi stabilirea conexiunii Secvenţa 4.3. Extragerea unei adnotări prezente pe clasă şi studierea parametrului acesteia Secvenţa 4.4. Extragerea valorii id-ului Secvenţa 4.5. Studiul adnotării Column pentru maparea unui câmp Secvenţa 4.6. Obţinerea valorii id-ului Secvenţa 4.7. Instanţierea unui obiect folosind Reflection Secvenţa 4.8. Metoda delete(object) Secvenţa 4.9. Studiul ordinii coloanelor Sevenţa Metoda save(long, List) Secvenţa Tratarea obiectelor de tip String şi Date Secvenţa Tratarea ultimei poziţii la update Secvenţa Tratarea ultimei poziţii la insert Secvenţa Metode generice Secvenţa Exemplu de apel metodă generică Secvenţa Extragerea numelui coloanei cu id-ul Secvenţa Formarea listei cu numele coloanelor Secvenţa Exemplu de utilizare listă de nume coloane Secvenţa Generarea id-ului Secvenţa Adnotarea Table Secvenţa Adnotarea PK Secvenţa Adnotarea Column Secvenţa Adnotarea NotPersistent Secvenţa Adnotarea NotNull Secvenţa Adnotarea FK Secvenţa 5.1. Salvarea unei reţete Secvenţa 5.2. Exemplu de folosire readall Secvenţa 5.3. Exemplu de folosire metoda read p27 p28 p28 p29 p30 p30 p31 p31 p32 p32 p32 p33 p33 p34 p34 p34 p35 p35 p36 p36 p37 p37 p37 p37 p38 p40 p41 p43 7

8 1. Introducere 1.1 Contextul Încă de la apariţia modelului de baze de date relaţionale programatorii au simţit nevoia să sporească posibilităţile acestui model şi să-l facă mai flexibil. Un salt uriaş în acest sens a fost făcut în anii 90, atunci când limbajele orientate-obiect au început să capete o influenţă tot mai mare. O primă încercare de a lega obiectele din POO cu tabelele unei baze de date a fost făcută în anul 1992 de compania NeXT (companie înfiinţată de Steve Jobs la mijlocul anilor 80). Soft-ul dezvoltat nu era un ORM în adevăratul sens al cuvântului, el fiind mai apropiat de JDBC-ul din Java. Acest sistem purta denumirea de DbKit şi reprezenta un layer de abstractizare, care asemănător JDBC-ului de astăzi permitea accesul la diferite baze de date fără obligativitatea de a scrie cod specific bazelor de date. Pornind de la acest sistem, dezvoltatorii de la NeXT au lansat mai apoi un framework de ORM complet. Totuşi, primul sistem ce poate fi considerat un ORM a fost dezvoltat pentru limbajul SmallTalk de o mică firmă din Canada şi s-a numit TopLink. În 1996 a apărut şi prima versiune pentru Java. Prima versiune de TopLink permitea printre altele: a) să mapeze câmpurile bazei de date pe atributele obiectelor b) să realizeze conversie între tipurile atributelor şi tipurile câmpurilor pe care se mapează c) posibilitatea de a mapa o înregistrare din baza de date pe mai multe obiecte Deşi aparent dezvoltarea unui astfel de sistem pare că a venit de la sine, o perioadă semnificativă de timp s-a lucrat la rezolvarea conflictelor dintre limbajele orientate-obiect şi sistemele de gestiune ale bazei de date. Este cunoscut faptul că o bază de date prezintă pentru fiecare tabel o cheie primară care identifică în mod unic o înregistrare. Spre deosebire de înregistrările din baza de date, obiectele din Java pot să fie identice, caz în care au aceaşi valoare şi aceeaşi adresă în memorie, sau egale, având doar acceaşi valoare. Alte diferenţe sunt legate de concepte precum moştenire, granularitate, asociere. În ceea ce priveşte moştenirea, obiectele din Java acceptă moştenire simplă şi preiau atributele şi metodele obiectului moştenit. În schimb, bazele de date nu cunosc noţiunea de moştenire. Conceptul de asociere se referă la modul de legare a două entităţi fie în Java, fie în baze de date. Dacă în Java asocierile sunt unidirecţionale, în baze de date acestea sunt bidirecţionale şi se fac prin intermediul cheii externe. În cazul în care se doresc legături bidirecţionale în Java, se poate declara în fiecare obiect un câmp de tipul celuilalt obiect. Granularitatea se referă la problema legată de numărul de obiecte din model comparativ cu numărul de tabele din bază. Pentru a se putea face maparea obiectelor pe baza de date este necesară existenţa unei corespondenţe. Prin urmare cele două numere trebuie să fie egale. 8

9 1.2 ORM (Object Relational Mapping) După cum am precizat, ORM-ul a apărut în perioada în care limbajele de programare orientate obiect au căpătat un avânt deosebit, fiind principalele limbaje de dezvoltare datorită flexibilităţii şi uşurinţei de dezvoltare. Cu toate acestea necesitatea comunicării cu un sistem de gestiune a bazelor de date a determinat piaţa IT să găsească soluţii de comunicare între obiectele create şi tabelele bazei de date, precum şi găsirea de soluţii pentru conflictele de incompatibilitate dintre cele două tehnologii. Astfel, el reprezintă un nivel de legătură între cele cele două modele: Obiect A TABEL A ORM SGBD Obiect B TABEL B Fig. 1.1 ORM legătura dintre obiecte şi SGBD Din figura de mai sus se observă corespondenţa Obiect A Tabel A, respectiv Obiect B Tabel B. Deşi faptul că asigură comunicarea cu baza de date este un aspect foarte important, ORM-ul mai are o serie de avantaje precum : a) Independenţa faţă de baza de date acest fapt reprezintă un avantaj major al sistemului ORM deoarece nu contează sistemul de management al unei baze de date relaţionale folosit, în Java codul folosit va fi acelaşi, metodele nu vor avea alţi parametri sau nu vor avea alte rezultate. Schimbarea sistemului de management al bazei de date nu va determina schimbarea vreunei linii de cod în Java. b) Simplitatea Este mult mai uşor de lucrat cu obiecte în Java şi de folosit principiile POO decât lucrul cu cod SQL. În SQL, atunci când se depăşeşte un anumit grad de dificultate lucrurile pot deveni foarte încurcate, pe când în Java tot timpul vor fi mai uşor de prelucrat datele şi de folosit aşa cum ne dorim. c) Scalabilitate Sistemul va funcţiona la fel indiferent de dimensiunea bazei de date, a tabelelor sau a tipurilor de date folosite 9

10 d) Rapiditate Operaţiile dorite se vor executa într-un timp foarte scurt, rezultatele vazându-se imediat e) Un mare avantaj pentru programator este reprezentat şi de faptul că nu va mai fi nevoit să realizeze o conexiune de fiecare dată şi să apeleze la concepte de JDBC, conexiunea se va face automat când va fi nevoie iar datele vor fi salvate în obiecte. f) Întreţinerea codului şi depanarea lui va fi foarte uşoară având în vedere cantitatea de cod mult redusă şi uşurinţa cu care acesta poate fi înţeles. 1.3 Motivaţia dezvoltării unui sistem de ORM De-a lungul timpului, atât în calitate de student cât şi în calitate de programator, am avut ocazia să folosesc mai multe sisteme de mapare a obiectelor pe tabelele unei baze de date. Dintre acestea cele mai cunoscute sunt Hibernate şi JPA(Java Persistence Api). Deşi ştiam să folosesc un ORM, nu înţelegeam pe deplin tot ce se întâmplă în spate, iar realizarea acestei lucrări a fost o bună oportunitate să studiez şi să încerc să rezolv problemele ce pot apărea la un astfel de sistem. Două probleme pe care eu le-am întâlnit şi pe care le-am considerat mai importante, necesitând o atenţie mai deosebită erau reprezentate de maparea cheii primare şi compatibilitatea şirurilor de caractere. La maparea cheii primare apar de fapt două probleme ce trebuie rezolvate: Prima din ele este necesitatea specificării printr-un parametru a numelui coloanei din bază sau numele câmpului trebuie să se potrivească cu numele coloanei din tabel. Prin soluţia propusă am făcut să nu mai fie necesară potrivirea de nume, am considerat că tratarea cheii primare ar trebui să fie una specială, în sensul că ar trebui sa fie mai uşor de mapat, nu mai greu după părerea mea, ca în Hibernate. A doua problemă la maparea cheii primare este şi cea care face ca maparea să fie mai dificilă, şi anume generarea id-urilor atunci când se face un insert. În Hibernate practic trebuia mapată şi o secvenţă pentru generarea id-urilor. De asemenea, neplăceri mai apăreau şi dacă se făceau insert-uri în sesiuni diferite de lucru,generarea secvenţei făcându-se de la o valoare cu 50 mai mare faţă de valoarea cu care s-a început sesiunea precedentă. Astfel, dacă se făceau într-o sesiune de lucru mai mult de 50 de insert-uri apăreau probleme în sesiunea următoare deoarece se încerca o inserare cu un id care deja exista. Eu am încercat ca prin simpla mapare cu o adnotare generarea să se facă automat în raport cu valoarea maximă din tabel indiferent de sesiunea de lucru. La compatibilitatea şirurilor de caractere, Hibernate impune o limitare de 255 de caractere. Dacă se folosesc şiruri de caractere mai mari, este necesar la mapare să se precizeze şi dimensiunea şirului. Am făcut ca şirurile de caractere să fie compatibile fără a fi nevoie de o mapare specială în cazul unor dimensiuni mai mari. 10

11 Deşi am utilizat mai multe astfel de sisteme de ORM, am ales să mă raportez la Hibernate deoarece este cel mai popular dintre ele şi totodată cel mai complet sistem de acest gen existent pe piaţă, acesta fiind şi sistemul cu care eu m-am iniţiat în tainele folosirii ORMurilor Descrierea proiectului Proiectul presupune dezvoltarea unui mini sistem de mapare a obiectelor pe tabelele din baza de date. Totuşi el trebuie să permită maparea obiectelor pe orice sistem de management al bazelor de date relaţionale, fără impunerea unui anumit sistem. Totodată, el trebuie să poată să facă conversie între tipurile proprietăţilor din obiectele Java şi tipul câmpurilor din tabele. Acest mini ORM trebuie să implemeteze principalele operaţii pe baza de date, cunoscute în limbajul SQL ca: SELECT, DELETE, UPDATE, INSERT. Metodele asociate acestor operaţii sunt: pentru SELECT a) read(object) această metodă primeşte ca parametru un obiect al cărui id este cunoscut şi returnează din baza de date valorile câmpurilor pentru înregistrarea cu id-ul id b) readall(object) această metodă primeşte ca parametru un obiect care corespunde unui tabel din bază şi returnează toate înregistrarile din respectivul tabel. pentru DELETE delete(object) această metodă primeşte ca parametru un obiect cu id cunoscut şi şterge din bază înregistrarea din tabelul asociat obiectului, care are id-ul id.această metodă nu returnează nici un rezultat. pentru UPDATE şi INSERT save(object) această metodă primeşte ca parametru obiectul care trebuie salvat. Această metodă reprezintă de fapt saveorupdate pentru că în urma analizării id-ului obiectului el ştie dacă să facă Update sau să facă Insert. Astfel dacă id-ul obiectului este null, ceea ce înseamnă că obiectul nu conţine date, se va face un insert în bază. În caz contrar se va face un Update. Proiectul presupune rescrierea de la capăt a metodelor de lucru pe bazele de date şi nu doar apelarea unor metode existente din alte sisteme asemănătoare. În procesul dezvoltării acestui sistem, dezvoltatorul este nevoit să facă apel la noţiuni precum: a) Reflection pentru studierea conţinutului claselor b) JDBC pentru realizarea conexiunilor cu baza de date Pentru a demonstra avantajul sistemului este neesară realizarea unei aplicaţii de test care să permită tipuri de date multiple. Această aplicaţie are ca tematică medicina şi se ocupă 11

12 în principiu de reţete medicale, programări la doctor şi vizualizarea acestora şi este dezvoltată folosind API-ul de SWT. 2. Alegerea Platformei O platformă este un mediu hardware sau software în care poate fi rulat un program. Platforma aleasă pentru dezvoltarea ORM-ului este platforma Java. Aceasta este o platformă software. Alegerea acestei platforme se justifică prin multitudinea de avantaje pe care le pune la dispoziţia dezvoltatorului: este portabilă, rulează pe orice sistem de operare(windows, Linux, Solaris, Mac OS) datorită interpretorului integrat ce furnizează cod nativ al respectivului sistem Alte motive sunt reprezentate de faptul că limbajul Java este orientat obiect ceea ce permite refolosirea codului şi duce la micşorarea semnificativă a dimensiunii codului, este robust şi nu în ultimul rând este simplu de utilizat. Platforma Java are două componente: a) Maşina virtuală Java (Java Virtual Machine) Este componenta platformei care face posibilă neutralitatea faţă de arhitectura folosită. La compilarea fişierelor.java ce conţin codul sursă se creează nişte fişiere cu extensia.class care conţin secvenţe de bytecodes. Java bytecodes reprezintă instrucţiuni în limbaj maşină pentru JVM (Java Virtual Machine). La stadiul actual instrucţiunile nu sunt încă destinate procesorului. Pentru a putea fi transformate în cod înţeles de procesor este necesară o tranformarea din bytecodes în cod nativ al platformei hardware prin intermediul Interpretorului integrat în structura JVM Clasă.java Compilare Clasă.class( bytecodes) JVM Cod maşină Fig 2.1. Fluxul de compilare şi rulare al unei clase b) A doua componentă a platformei Java este API ul de Java (Application Programming Interface) Acesta reprezintă o colecţtie de librării ce ajută la dezvoltarea mai uşoară a programelor. API-ul de Java este structurat în pachete, fiecare pachet înglobând metode, constante, parametri utilizaţi de către programatori în crearea obiectelor şi structurilor proprii. În continuare voi dezvălui câteva avantaje ce justifică alegerea unei astfel de platforme. Ele sunt după cum urmează: 12

13 a) Simplitatea Java a fost proiectat să fie un limbaj simplu de utilizat şi înţeles, el poate fi asimilat cu usurinţă de către programatori, mai ales dacă aceştia au ceva experienţă si cu C++. b) Java este un limbaj orientat obiect Oferă un grad ridicat de abstractizare şi încapsulare. Aest lucru duce la performanţe de securitate crescute, programatorul putând face vizibile doar informaţiile pe care le doreşte din interiorul obiectelor şi folosind pentru acest lucru metode dedicate accesării informaţiilor. c) Lucrul cu memoria este mult îmbunătăţit, acest lucru datorându-se în mare parte faptului că nu mai există pointeri definiţi de programator. Aceştia erau o sursă bogată de erori atunci când se făcea accesul la memorie în C/C++. Limbajul introduce de asemenea un sistem automat numit Garbage Collector care urmăreşte structura memoriei şi observă obiectele neutilizate urmând să elibereze zona ocupată de respectivele obiecte şi evitând astfel fragmentarea memorie. d) Principalul avantaj îl reprezintă portabilitatea. Un cod scris corect în limbajul Java ar trebui să ruleze pe orice platformă hardware fără nici o problemă. Acesta reprezintă un avantaj major chiar şi în faţa unor limbaje care pot rula mai repede aşa cum este C/C++. Este adevărat că Java consumă mai multă memorie şi rulează într-un timp puţin mai mare decât C/C++ dat fiind faptul că este atât un limbaj compilat cât şi un limbaj interpretat. Totuşi în ziua de azi diferenţele nu mai sunt aşa mari ca la începuturile limbajului Java, iar portabilitatea limbajului Java eclipsează micul avantaj al C++. În cazul în care un program dezvoltat în C++ ar trebui portat pe altă platformă ar fi necesare modificări majore în cod. În dezvoltarea ORM ului am ales platforma Java Standard Edition din cele trei platforme oferite de Java, celelale două fiind Java Micro Edition (platformă destinată dispozitivelor mobile aşa cum sunt PDA uri sau telefoane mobile) şi Java Enterprise Edition (platformă destinată sistemelor de calcul distribuite sau de mari dimensiuni), deoarece se pretează cel mai bine cerinţelor proiectului fiind o platformă specifică aplicaţiilor desktop. 3. Tehnologii folosite În dezvoltarea acestui ORM am folosit: un IDE(Mediu Integrat de Dezvoltare), două sisteme de management ale bazelor de date relaţionale patru API uri necesare dezvoltării sistemului și testării acestuia IDE (Mediu integrat de dezvoltare) Ca mediu integrat de dezvoltare am folosit Eclipse versiunea (Eclipse Juno) care poate fi descărcată gratuit de pe site ul cu acelaşi nume. Am făcut această alegere deoarece este un IDE foarte popular care oferă numeroase facilităţi cum ar fi generarea automată de cod, formatarea automată a codului şi folosirea scurtăturilor de taste pentru îndeplinirea mai multor acțiuni precum importuri de pachete necesare. 13

14 Cele mai folosite faciliăţi din cele amintite mai sus sunt generarea automată a codului şi realizarea importurilor necesare. Generarea automată de cod se referă în general la generarea de constructori cu sau fără parametri și generarea de getteri și setteri. Există două modalităţi de generare a getteri lor și setteri lor: a) Din meniul Source se alege opţiunea Generate Getters and Setters.... În fereastra deschisă se pot alege câmpurile pentru care să se genereze getteri şi setteri. Fig Meniul Source b) A doua metodă foloseşte combinaţia de taste ALT+S după care se apasă tasta R. După apăsarea tastelor se va deschide aceeaşi fereastră ca la punctul anterior. Fig Fereastră generare getteri/setteri 14

15 De asemenea există două modalităţi de generare a constructorilor: a) Din meniul Source se alege una din opţiunile Generate Constructor using fields... sau Generate Constructors from Superclass.... În primul caz se pot alege câmpurile ce vor fi introduse în construcor, iar în cel de al doilea se generează un constructor moştenit de la clasa Object. b) A doua metodă foloseşte combinaţia de taste ALT+S şi după aceea se apasă tasta C. Prin această combinaţie se deschide o listă similară cu cea a meniului Source din care dezvoltatorul poate alege opţiunea cea mai convenabilă. Fig Meniu apărut la apăsarea combinaţiei de taste Realizarea importurilor pachetelor se face prin combinaţia de taste CTRL+SHIFT+O. După apăsarea lor, Eclipse va face toate importurile necesare în clasa în care ne aflăm. O altă combinaţie de taste utilă este CTRL+SHIFT+F, combinație ce realizează formatarea codului. În cazul unei erori de cod, precum greşirea numelui unei variabile sau atunci când nu se cunosc toţi parametri unei metode se poate folosi combinaţia de taste CTRL+1 (Quick Fix) care îţi afişează o listă cu soluţii posibile la problemă. Un alt avantaj al folosirii acestui IDE îl reprezintă multitudinea de plug in uri disponibile gratuit ce vin în ajutorul dezvoltatorului. Din cele mai importante amintim plugin ul pentru dezvoltarea de aplicații pe platforma Android, plug-in-ul pentru interfețe web de la google(gwt), plug-in-ul pentru SWT. 15

16 3.2. Sisteme de management ale bazelor de date relaționale Am ales ca sisteme de management ale bazelor de date relaționale PostgeSQL și Microsoft SQL Server 2012 deoarece sunt printre cele mai importante și utilizate sisteme de acest gen PostgreSQL PostgreSQL este probabil cel mai apreciat sistem de management al bazelor de date relaționale datorită faptului că este disponibil pentru toate marile platforme(windows, Linux, Mac OS X) și este de asemenea apreciat pentru stabilitate, integritatea datelor și corectitudine. Oferă posibiliatea stocării de imagini, sunete și chiar clipuri video. De asemenea PostgreSQL este compatibil și cu PL/SQL de la Oracle. Succesul se datorează și faptului că sistemul este gratuit și open-source. Un alt avantaj al PostgreSQL este faptul că oferă interfețe de lucru cu numeroase limbaje de programare așa cum sunt Java, C++,.NET, PHP, Perl etc. Lucrul ce a determinat ca PostgreSQL să fie cel mai apreciat astfel de sistem atât de către mari companii cât și de utilizatorii de zi cu zi este reprezentat de limitările pe care sistemul le impune: dimensiunea unui tabel poate atinge 32TB, dimesiunea unei înregistrări 1,6 TB, numărul de înregistrari poate fi nelimitat, dimesiunea bazei de date poate fi nelimitată, numărul de coloane poate ajunge la 1600 în funcție de tipul de date și nu în ultimul rând numarul de indecși pentru un tabel este nelimitat Microsoft SQL Server Microsoft SQL Server este un sistem de management al bazelor de date relaționale dezvoltat de Microsoft. Având în vedere popularitatea sistemului de operare al celor de la Microsoft și sistemul de management al bazelor de date relaționale dezvoltat de ei este unul dintre cele mai populare, unul din dezavantaje fiind că este disponibil doar pentru sistemele de operare de la Microsoft. Sistemul nu este open-source, există unele variante gratuite dar la care se limitează dimensiunea bazei de date la 10 GB. Pentru o variantă plătită dimensiunea bazei de date este de 540 PB. Un motiv pentru care Microsoft SQL Server este popular deși este funcțional doar pe sistemele de operare de la Microsoft sunt limitările pe care le impune, pe lângă dimesiunea bazei de date mai sus amintită sistemul impune următoarele limitări: dimesiunea unei înregistrări este nelimitată, numărul de coloane pentru fiecare tabel poate ajunge la 30000, numărul maxim de caractere al numelui unei coloane este de 128, iar dimesiunea maximă a unui tabel corespunde cu dimensiunea maximă a bazei de date. Un alt avantaj al Microsoft SQL Server este integrarea cu celelalte unelte software dezvoltate de Microsoft, care sunt foarte populare, astfel o persoană sau o companie care utilizează software Microsoft nu va avea nevoie de modificări mari sau de upgrade-uri ale sistemelor deja existente atunci când vor dori instalarea acestui sistem de management al bazelor de date. Microsoft SQL Server oferă interfață de lucru cu toate limbajele suportate de platforma.net cum ar fi: C#, J#, Visual Basic, C++, F# etc. În afara limbajelor suportate de platforma.net Microsoft SQL Server mai oferă interfață de lucru cu Java, cu ajutorul unui driver de JDBC, aceasta fiind o tehnologie pe care o vom trata mai târziu. 16

17 Am ales aceste două sisteme deoarece le-am considerat reprezentative pentru sistemele de management ale bazelor de date existente API-uri folosite În dezvoltarea acestui ORM am folosit patru API-uri: API-ul de JDBC oferit de platforma Java, API-ul de Reflection, API-ul de SWT(Standard Widget Toolkit) şi API-ul pentru generarea de PDF-uri API-ul de JDBC(Java Database Connectivity) JDBC este un API dezvoltat de compania Oracle care ajută la lucrul cu o bază de date scriind cod Java. Acest API are suport pentru executarea a diferite operații pe baza de date cum ar fi INSERT, UPDATE, DELETE, SELECT. În continuare voi prezenta modul de lucru cu JDBC și pașii necesari extragerii unui set de date din bază sau executării oricărei alte operații pe baza de date. Vom presupune că avem deja o bază de date formată. Mai întâi de toate este necesară descărcarea driver-ului specific bazei de date pe care o folosim și includerea lui în proiectul nostru. Următorul pas este încărcarea driver-ului din cod cu ajutorul metodei forname( numele driverului ) aplicată pe un obiect Class în felul următor: Class.forName( numele driverului ). Aceasta metodă va căuta driver-ul, iar dacă acesta nu există va genera o excepţie corespunzătoare. În continuare este necesară stabilirea conexiunii cu baza de date. Pentru acest lucru va trebui să cunoaştem: utilizatorul bazei de date, parola pentru accesul la baza de date url-ul bazei de date împreună cu numele acesteia. Stabilirea conexiunii se face prin aplicarea metodei getconnection pe un obiect de tip DriverManager în felul următor: DriverManager.getConnection(url, utilizator, parolă) în cazul majorităţii sistemelor de management ale bazelor de date aşa cum este şi PostgreSQL, pentru Microsoft SQL Server se foloseşte metoda getconnection( şir ), care după cum se poate observa primeşte un singur parameru de tip String care conţine toate datele necesare stabilirii conexiunii. Această metodă va returna un obiect de tip Connection. Dacă conexiunea nu se realizează se va genera o excepţie în concordanţă cu problema apărută. După stabilirea conexiunii vom scrie interogarea pentru acţiunea ce urmează să o executăm pe baza de date. Aceasta va fi reţinută într-o variabilă de tip String. Pentru executarea interogării sunt necesari doi paşi. 17

18 În primul rând este necesară crearea unui obiect de tip Statement pe baza conexiunii deja create. Pot exista trei tipuri de acest fel: Statement care atunci când este folosit încarcă în memorie de fiecare dată interogarea, PreparedStatement care încarcă o singură dată interogarea în memorie şi o păstrează acolo, CallableStatement care este folosită atunci când se apelează proceduri stocate ale bazei de date. În dezvoltarea proiectului am folosit un obiect de tip Statement. Apoi vom aplica obiectului de tip Statement metoda executequery care va primi ca parametru variabila de tip String în care am reţinut interogarea.dacă s-a făcut un SELECT rezultatele vor fi reţinute într-un obiect de tip ResultSet. În cazul în care operaţia a fost una de tip UPDATE, INSERT sau DELETE vom primi ca rezultat doar numărul de rânduri afectate de către operaţia noastră. De asemenea cu ajutorul JDBC putem obţine informaţii si despre tabele, cum ar fi numele coloanelor, tipul lor, numărul lor. Acest lucru se poate realiza folosind metoda getmetadata() pe care o aplicăm pe un obiect de tip ResultSet. Meta datele sunt reţinute întrun obiect de tip ResultSetMetaData. Ultimul pas după ce ne-am îndeplinit scopul propus este închiderea conexiunii prin aplicarea metodei close() asupra obiectului de tip Connection în care am reţinut conexiunea. În cazul în care uităm să închidem conexiunea Garbage Collector-ul va închide respectiva conexiune când eliberează memoria ocupată de obiecte ce nu mai sunt folosite. Totuşi nu se încurajează lăsarea acestei probleme în seama collector-ului deoarece pot apărea alte probleme API-ul de Reflection Reflection este o tehnologie ce permite studiul structurii unui obiect şi modificarea acesteia sau luarea de decizii în timpul rulării pe baza structurii din acel moment a obiectului. În Java API-ul de Reflection permite studierea clasei unui obiect, a câmpurilor acestuia, a constructorilor, a metodelor din clasă. Este posibilă aflarea de informaţii chiar şi despre câmpurile private. Despre clase putem afla informaţii cum ar fi adnotările care sunt folosite pentru clasa respectivă, numele clasei, câmpurile clasei, metodele acesteia, constructorii acesteia, pachetul din care face parte şi pachetele importate, interfeţele pe care le implementează. Despre constructorul unei clase putem afla parametrii pe care acesta îi primeşte şi putem crea noi instanţe ale obiectului studiat prin apelul metodei newinstance(). Aceasta se aplică pe obiectul de tip Constructor în care am reţinut constructorul obiectului studiat. Această metodă primeşte ca parametri exact ce parametri primeşte şi constructorul obiectului studiat. Atunci când vrem să aflăm informaţii sau să manipulăm câmpurile putem folosi Reflection pentru a afla numele câmpurilor, adnotările ce sunt folosite pentru câmpul studiat, tipurile acestora şi putem afla şi modifica valorile acestora. 18

19 Pentru a afla informaţiile despre câmpurile private este necesar să folosim metoda getdeclaredfields().aceasta, spre deosebire de metoda getfields() care ne va returna un vector ce va conţine doar câmpurile publice, ne va returna un vector cu toate câmpurile clasei inclusiv cele private. Despre metode putem afla parametri pe care aceasta îi primeşte şi tipul pe care aceasta îl returnează. De asemenea cu ajutorul Reflection putem executa metode ale obiectului cu ajutorul metodei invoke() care va primi ca parametri obiectul pentru care se execută metoda şi parametrii pe care aceasta îi primeşte. Metoda invoke() va fi executată pentru obiectul de tip Method în care am reţinut metoda. Mai putem afla informaţii cum ar fii adnotările prezente pe parametri funcţiilor sau ai constructorilor, adnotările de pe getteri şi setteri API-ul de SWT(Standard Widget Toolkit) Standard Widget Toolkit este un plug-in destinat dezvoltării de interfeţe grafice. Acest plug-in foloseşte componente native ale sistemului de operare pe care se face dezvoltarea însă elementele grafice nu au un aspect învechit aşa cum ne-am aştepta. SWT se vrea a fi o combinaţie între rapiditatea cu care sunt încărcate elementele native la AWT şi aspectul plăcut al elementelor din Swing. Dezvoltarea se poate face atât din mediul grafic (drag and drop dintr-o paletă de elemente în fereastra noastră ) cât şi din cod. Varianta preferată de cei mai mulţi dintre programatori este dezvoltarea în mediul grafic, rămânând ca în cod sa fie scrise doar ascultătorii petru butoane şi celelalte elemente grafice folosite. Fig Paletă de componente 19

20 Fig Paleta de elemente în SWT Fig Exemplu de casetă cu proprietăţile unui element Prin adăugarea unui element din paletă în canvas, se va deschide automat o fereastră de proprietăţi din care poate fi ajustat design-ul elementului respectiv. 20

21 Pentru a putea folosi SWT este necesară instalarea plug-in-ului mai întâi deoarece acesta nu este prezent în pachetul standard al Eclipse. Acest lucru se poate face foarte uşor din Eclipse din meniul Help opţiunea Install New Software.... Plug-in-ul este gratuit şi opensource. Plug-in-ul este dezvoltat de IBM şi de aceea nu vine împreună cu API-ul standard de java, în API-ul standard de Java putem găsi Swing şi AWT, care sunt dezvoltate de compania Sun, companie ce deţine drepturile asupra Java. Pentru a putea folosi mediul grafic de dezvoltare este necesară crearea unui tip de clasă ce poate fi găsit după instalarea plug-in-ului. Crearea acestui tip de clasă se face prin click dreapta pe pachetul în care vrem să creem clasa, din meniul deschis alegem opţiunea New, iar din submeniul deschis vom alege opţiunea Other. Din fereastra deschisă vom alege tipul de clasă Application Window din folderul SWT aşa cum veţi vedea în imaginea următoare. Fig Clasă pentru dezvoltarea în mediul grafic API-ul pentru crearea de fişiere PDF Pentru crearea de fişiere PDF am folosit API-ul itext. itext este o bibliotecă ce permite crearea, citirea şi manipularea de fişiere PDF. Pentru instalarea lui este necesară decărcarea arhivei de tip jar ce conţine biblioteca şi introducerea ei în proiect. itext oferă numeroase facilităţi de formare a PDF-urilor: a) se poate face gruparea mai multor elemente într-un paragraf sau într-o frază, b) se pot seta fonturi pentru diverse elemente cum ar fi un titlu sau un paragraf, c) se pot adăuga imagini, tabele, d) se pot pune referinţe, e) se poate face împărţirea pe capitole şi secţiuni. f) de asemenea se poate scrie cu indici sau cu exponent sau se poate scrie textul subliniat, tăiat, boldat sau înclinat. 21

22 itext are elemente cu o structură ierarhică. Cea mai mică unitate din itext se numeşte Chunk. Chunk-ul reprezintă un String căruia i se poate seta doar fontul. Chunk-urile se pot organiza în structuri mai mari şi anume obiecte de tip Phrase. Obiectele de tip Phrase permit definirea de spaţiere. Pentru definirea mai multor atribute cum ar fi cele de stil se folosesc obiecte de tip Paragraph. Acestea sunt obiecte ce moştenesc obiectele de tip Phrase. O clasă de obiecte ce moşteneşte clasa Paragraph se numeşte Anchor şi permite definirea de referinţe de la anumite porţiuni din text la alte porţiuni mai îndepărtate sau la care se face referire în text. Obiectele de tip Paragraph se pot grupa în structuri de tip Chapter. În itext mai putem întâlni obiecte de tip Section pentru definirea unei secţiuni, List pentru realizarea de liste ordonate sau neordonate, obiecte de tip Font penru definirea de fonturi. 4. Dezvoltarea aplicaţiei Aplicaţia dezvoltată este reprezentată de un mini sistem de mapare a obiectelor din Java pe tabelele unei baze de date, sistem denumit Object-Relational Mapping Cerinţele aplicaţiei Scopul acestei lucrări îl reprezintă dezvoltarea unui sistem ORM care să fie uşor de folosit şi înţeles. Obiectivele acesti proiect sunt reprezentate de implementarea operaţiilor uzuale de INSERT, UPDATE, DELETE, SELECT, iar mai apoi să poată fi folosite fără a mai scrie cod SQL. Un alt obiectiv îl reprezintă funcţionarea ORM-ului pe baza unor relaţii stabilite între obiectele din Java şi tabelele din baza de date. Aceste relaţii se pot stabili fie prin folosirea adnotărilor fie prin folosirea unor fişiere de configurare de tip properties sau xml. În această lucrare am ales să folosesc varianta cu adnotări deoarece este varianta mai modernă şi care a câştigat teren în faţa celei de-a doua în ultimii ani. De asemenea varianta cu asdnotări este după părerea mea mai simplu de înţeles şi mai intuitivă. După definirea relaţiilor dintre obiecte şi tabele se vor folosi doar obiectele şi metodele implementate în ORM. ORM-ul trebuie să dispună de următoarele metode: a) read(object) citeşte toate câmpurile obiectului specificat din care iniţial este cunoscut doar id-ul b) readall(object) citeşte toate obiectele de tipul obiectului specificat fără vreo clauză WHERE c) delete(object) şterge obiectul specificat din care iniţial este cunoscut doar id-ul d) save(object) dacă id-ul este null se va face un INSERT în baza de date, se vor salva câmpurile obiectului specificat şi se va genera un id; dacă id-ul nu este null atunci se va face un UPDATE în baza de date 22

23 Conexiunea trebuie să fie realizată cu ajutorul unui fişier de configurări. Datele se vor introduce o singură dată iar apoi pe baza lor conexiunea se va face automat Arhitectura Noţiunea de arhitectură software se referă la componentele de nivel înalt ale unui sistem software. Arhitectura defineşte atât modulele sistemului pe baza unui set de reguli şi relaţiile care se stabilesc între acestea, cât şi proprietăţile pe care modulele şi relaţiile dintre ele le deţin. La cazul general, o arhitectură pentru un sistem software se compune din: Componentă de comunicaţie cu exteriorul Componentă ce se ocupă de logica de business a aplicaţiei Componentă responsabilă cu păstrarea datelor Componenta de comunicaţie cu exteriorul poate fi reprezentată în funcţie de tipul aplicaţiei de pagini web, interfeţe grafice desktop ş.a. Prin intermediul acesteia utilizatorul introduce date în sistem sau preia date din sistem. Componenta responsabilă cu prelucrarea informaţiilor provenite de la utilizator sau a informaţiilor ce îi vor fi returnate acestuia este componenta de logică de business şi reprezintă partea centrală a aplicaţiei. Toate datele care circulă prin sistem sunt întotdeauna filtrate de această componentă. Componenta responsabilă de păstrarea informaţiilor în sistem este reprezentată de un sistem de management al bazelor de date. Aceasta permite salvarea unei cantităţi mari de date, preluarea datelor, actualizarea sau ştergerea acestora. O astfel de arhitectură am folosit şi în dezvoltarea şi testarea proiectului de faţă. În cazul acestui proiect am considerat pentru componenta de baze de date cele mai utilizate două sisteme de management ale bazelor de date,postgresql şi Microsoft SQL Server. Componenta care se ocupă de comunicaţia cu exteriorul este reprezentată aici de o aplicaţie grafică în care utlizatorul interacţionează cu restul aplicaţiei prin intermediul unor formulare. Totuşi, această componentă poate fi reprezentată la fel de bine de orice altă aplicaţie ce foloseşte o conexiune la baza de date. Componenta de logică de business este reprezentată aici de ORM. Sistemul ORM funcţionează ca o legătură între aplicaţie şi baza de date. Prin intermediul lui se preiau datele de la aplicaţia grafică, pe care mai apoi le folosim pentru a accesa baza de date.totodată el permite salvarea informaţiilor introduse prin aplicaţie în baza de date sau poate extrage informaţii din bază în funcţie de acţiunile făcute de utilizator. După preluarea datelor, ORMul, le prelucrează şi le face disponibile pentru aplicaţie. În imaginea de următoare am ilustrat arhitectura unui sistem complet din viaţa reală în care se foloseşte un ORM. 23

24 Bază de date (PostgreSQL, Microsoft Server SQL, etc.) Sistem Object-Relational Mapping (Insert, Update, Delete, Read, Mapare tabele) Aplicaţie, Interfaţă cu utilizatorul Fig Arhitectura unei aplicaţii complete ce foloseşte un ORM 4.3 Strucura proiectului oferă. Codul proiectului este organizat pe pachete în funcţie de funcţionalităţile pe care le Fig Organizarea internă a proiectului 24

25 Pachetul org.licenta.miniorm.connection se ocupă de realizarea legăturii cu baza de date. Acest pachet conţine 3 fişiere: connection_data.properties - conţine informaţiile necesare unei conexiuni cu baza de date, nume bază, driver-ul pentru baza respectivă, nume utilizator şi parola acestuia pentru conectare DataConn.java se ocupă de parsarea elementelor din fişierul properties ConnectionDB.java se ocupă de preluarea informaţiilor parsate de DataConn şi stabilirea conexiunii cu baza Pachetul org.licenta.miniorm.queryactions conţine clasa QueryActions.java care se ocupă de implementarea operaţiilor SELECT, UPDATE,DELETE, INSERT pe baza de date dar cu ajutorul jdbc-ului. Pachetul org.licenţa.miniorm.annotations se ocupă de crearea tipurilor de adnotări. Acesta conţine: Table.java defineşte structura adnotării pentru maparea obiectului pe tabel; PK.java defineşte structura adnotării pentru maparea id-ului obiectului pe cheia primară din tabelul asociat, specificat de adnotarea anterioară; Column.java defineşte structura adnotării pentru maparea unei coloane oarecare pe un câmp al tabelului asociat din bază; NotPersistent.java defineşte structura adnotării care se asigură că un câmp nu va fi mapat pe o coloană din bază; NotNull.java defineşte structura adnotării care se asigură că o proprietate din obiect nu poate fi nulă. Pachetul org.licenta.miniorm.ormhandler conţine clasa OrmHandler.java care implementează metodele read, readall, delete, save utilizând metodele create în clasa QueryActions.java şi parsând obiectul pentru obţinerea adnotărilor. Acest pachet împreună cu pachetul de queryactions reprezintă centrul propriu zis aplicaţiei şi ocupându-se de ceea ce înseamnă un orm. Pachetul org.licenta.aplicatie.model conţine clasele model folosite pentru testarea orm-ului dezvoltat: Medic.java este o clasă model ce conţine câmpurile: a) idmedic este de tip Long şi prezintă adnotarea PK b) idcategorie este de tip Long şi prezintă adnotarea Column; el face legătura cu obiectul Categorie c) numemedic este de tip String şi prezintă adnotarea Column d) codidentificare este de tip String şi prezintă adnotarea Column 25

26 Categorie Medic.java este o clasă model pentru categoriile de medicină existentă şi conţine câmpurile: a) idcategorie este de tip Long şi prezintă adnotarea PK b) denumirecategorie este de tip String şi prezintă adnotarea Column Reteta.java este o clasă model ce descrie câmpurile unei reţete medicale: a) idreteta este de tip Long şi prezintă adnotarea PK b) idmedic este de tip Long şi prezintă adnotarea Column; el face legătura cu obiectul Medic c) numepacient este de tip String şi prezintă adnotarea Column d) nrstrada este de tip Long şi prezintă adnotarea Column e) câmpurile varsta (de tip int), sex(de tip String), cetatenie(de tip String), judet(de tip String), oras(de tip String), strada(de tip String), diagnostic(de tip String), medicamente(de tip String), compensata(de tip Boolean), data(de tip Date) nu prezintă nici o adnotare Column, iar numele câmpului din baza va fi automat acelaşi cu numele proprietăţii din obiect RetetaAnimal.java este o clasă model ce descrie câmpurile unei reţete prescrise de medicul veterinar: a) idretetaanimal este de tip Long şi prezintă adnotarea PK b) idmedic este de tip Long şi prezintă adnotarea Column; el face legătura cu obiectul Medic c) numeposesor este de tip String şi prezintă adnotarea Column d) nrtelefon este de tip String şi prezintă adnotarea Column e) tipanimal este de tip String şi prezintă adnotarea Column f) varstaanimal este de tip int şi prezintă adnotarea Column g) câmpurile tratament(de tip String), diagnostic(de tip String), comentariu(de tip String), data(de tip Date) nu au adnotare, numele câmpului din tabel fiind acelaşi cu numele proprietăţii din obiect FormularMedicinaNaturista.java este o clasă model ce descrie un formular pe care ar putea să îl elibereze medicul naturist şi care conţine câmpurile: a) idformular este de tip Long şi prezintă adnotarea PK b) idmedic este de tip Long şi prezintă adnotarea Column; el face legătura cu obiectul Medic c) numepacient este de tip String şi prezintă adnotarea Column d) problemeanterioare este de tip String şi prezintă adnotarea Column 26

27 e) câmpurile varsta(de tip int), diagnostic(de tip String), remediu(de tip String),data(de tip Date) nu au o adnotare, numele câmpului asociat din tabel fiind acelaşi cu numele proprietăţii Programare.java este o clasă model ce descrie câmpurile unui formular de realizare a unei programări la medic şi conţine cîmpurile: a) idprogramare este de tip Long şi prezintă adnotarea PK b) numemedic este de tip String şi prezintă adnotarea Column; el face legătura cu obiectul Medic c) numepacient este de tip String şi prezintă adnotarea Column d) dataprogramare este de tip Date şi prezintă adnotarea Column e) oraprogramare este de tip int şi prezintă adnotarea Column Pentru a ne folosi de aceste obiecte şi a le pune la lucru am creat pachetele org.licenta.aplicatie.medic, org.licenta.aplicatie.farmacist, org.licenta.aplicatie.pacient care fac apel la aceste modele prin intermediul câmpurilor din interfeţele grafice. Pentru lansarea proiectului este suficientă rularea clasei Proiect.java din pachetul org.licenta.proiect care apelează prin elementele de interfaţă clasele corespunzătoare celor trei pachete descrise anterior Funcţionalităţile sistemului și tratarea problemelor Prima şi una din cele mai importante caracteristici ale sistemului ORM trebuie să fie independenţa faţă de baza de date. Programatorul trebuie să poată să folosească ORM-ul în acelaşi mod indiferent de sistemul de management al bazei de date folosit. Pentru realizarea acestui lucru am ales să folosesc un fişier de configurare în care programatorul introduce datele de logare în acelaşi mod indiferent de sistemul de management al bazei de date folosit. Datele ce trebuie introduse în fişier sunt:numele driver-ului, url-ul bazei de date, numele bazei de date, numele de utilizator şi parola. În continuare veţi vedea cum trebuie să arate conţinutul unui astfel de fişier. 1. driver = org.postgresql.driver 2. url = jdbc:postgresql://localhost:5432/ 3. databasename = aplicatie 4. username = alin 5. userpassword = iomanigar Secvenţa Date pentru conexiunea la bază După introducerea datelor acestea vor fi preluate şi folosite pentru formarea parametrilor necesari conectării. Formarea parametrilor este o parte foarte importantă deoarece aceştia nu sunt la fel pentru toate sistemele de management ale bazelor de date relaţionale. Formarea acestora diferă în special pentru Microsoft SQL Server. 27

28 1. try { if(drivername.equals("com.microsoft.sqlserver.jdbc.sqlserverdriver")){ 4. String con =url+";databasename="+databasename+";user="+usrname+ 5. ";password="+usrpass; 6. connection = DriverManager.getConnection(con); 7. else { 8. connection = DriverManager.getConnection(url+databaseName,usrName, 9. usrpass); catch (SQLException e) { 12. System.out.println("Conectarea nu a reusit!"); 13. Secvenţa 4.2. Formarea parametrilor şi stabilirea conexiunii După cum se poate observa în cazul Microsoft conectarea se face folosind un singur parametru ce conţine toate datele de logare pe când la restul SGBD-urilor conectarea se face folosind trei parametri. În cazul în care conexiunea nu s-a făcut cu succes se va primi un mesaj corespunzător. O altă parte importantă sistemului este implementarea celor patru operaţii: read(object), readall(bbject), delete(object), save(object). Metoda read(object) trebuie să citească toate câmpurile obiectului specificat din care iniţial se cunoaşte doar id-ul. Această metodă, pe lângă studierea clasei cu ajutorul API-ului de Reflection, se foloseşte de metoda read(long) din clasa QueryActions ce returnează un HashMap(conţine înregistrari de forma cheie=valoare) în care cheia este numele coloanei din tabel şi valoarea este valoarea ce o are înregistrarea căutată în tabel. Pentru implementarea acestei metode am folosit API-ul de JDBC. Clasa QueryActions are ca şi câmp o variabila de tip String căreia i se asignează o valoare la instanţierea unui obiect de tip QueryActions prin constructor. Pentru maparea clasei pe tabel am folosit o adnotare Aceasta primește ca parametru un String ce reprezintă numele tabelului. O parte foarte importantă a implementării este reprezentată de studierea adnotărilor. În rândurile următoare voi exemplifica și explica modul de studiu al adnotărilor. 1. public <T> String gettablename(t object) { Class objectclass = object.getclass(); 4. Annotation annotation =objectclass.getannotation(table.class); 5. Table table = (Table) annotation; 6. String tablename = table.name(); return tablename; 9. Secvenţa 4.3. Extragerea unei adnotări prezentă pe clasă şi studierea parametrului acesteia 28

29 În liniile de cod de mai sus se află o metodă ce studiază dacă asupra clasei se afla adnotări. La linia patru se poate observa că se extrag doar adnotările de tip Table iar la linia șase se extrage numele tabelului ce va fi folosit mai departe. O altă metodă folosită în metoda read este metoda getid. Aceasta extrage pe baza id-ul obiectului. este folosită pentru a mapa cheia un câmp din clasă pe cheia primară din tabel. În rândurile următoare se poate vedea modalitatea de extragere a valorii id-ului. 1. if (annot instanceof PK 2. && field.gettype().getsimplename().equals("long")) 3. { 4. try { 5. id = (Long) field.get(object); 6. catch (IllegalArgumentException e) { 7. e.printstacktrace(); 8. catch (IllegalAccessException e) { 9. e.printstacktrace(); return id; Secvenţa 4.4. Extragerea valorii id-ului În liniile de mai sus se verifică două condiții necesare pentru a stabili dacă un câmp este mapat corect pe cheia primară din tabel și anume să dispună de o adnotare de si să fie de tipul Long. Verificarea tipului este necesară deoarece tabele pot ajunge la dimensiuni foarte mari, iar tipul Long oferă o gamă de valori suficient de mare pentru a permite un număr mare de înregistrări. În metoda read(object) primi paşi sunt reprezentaţi de folosirea celor două metode mai sus menţionate pentru a afla numele tabelului pe care este mapată clasa şi id-ul obiectului. Numele tabelului va fi folosit pentru a instanţia un obiect de tip QueryActions iar id-ul pentru a extrage din baza de date înregistrarea cu id-ul dat ca parametru. Asignarea de valori câmpurilor obiectului se face pe baza cheii din HashMap-ul rezultat în urma aplicării metodei read(long). Maparea Câmpurilor din obiect pe coloanele tabelului se face cu ajutorul ce primește ca parametru numele coloanei.maparea se poate face și pe baza numelui câmpului dacă numele acestuia este același cu numele coloanei din baza de date. Mai jos puteți vedea liniile de cod prin care se face maparea efectivă. 29

30 1. if (annots.length == 0) { 2. colname = field.getname(); 3. else { for (Annotation a : annots) { 6. if (a instanceof Column) { Column col = (Column) a; 9. colname = col.name(); 10. else if (!(a instanceof NotPersistent)) { colname = field.getname(); Secvenţa 4.5. Studul adnotării Column pentru maparea unui câmp câmp. Variabila annots din codul de mai sus reprezintă vectorul ce conține adnotările unui ce apare în cod este folosită pentru câmpurile ce nu vor fi folosite pentru persistența în baza de date. Următoarea metodă implementată este readall(object). Spre deosebire de metoda anterioară, aceasta nu folosește metoda getid deoarece scopul ei este să citească toata obiecte de tipul celui specificat, și nu unul anume. O metodă nouă folosită in dezvoltarea acesteia este metoda getcolumns din clasa QueryActions. Metoda getcolumns returnează o listă de String-uri ce reprezintă numele coloanelor exact în ordinea în care acestea se găsesc în tabel. Această metodă este utilă deoarece pe baza rezultatului returnat vom putea asigna valori câmpurilor din obiecte indiferent de ordinea în care acestea sunt declarate. Astfel programatorul nu va fi obligat să știe exact ordinea coloanelor din baza de date. O altă utilitate a acestei metode este și faptul că putem extrage din lista rezultată numele coloanei ce conține id-ul, acest lucru fiind necesar deoarece maparea câmpului pentru id se face doar cu nespecificând numele coloanei cu id-ul nicăieri în clasa noastră. În metoda readall(object) am folosit această metodă pentru cea de-a doua utilitate. Metoda getcolumns a fost implementată cu ajutorul JDBC. 1. try { 2. Object firstkey = columns.get(0); 3. field.set(inst, help.get(i).get(firstkey)); 4. catch (IllegalArgumentException IllegalAccessException e) { 5. e.printstacktrace(); 6. Secvenţa 4.6. Obţinerea valorii id-ului id-ul. În codul de mai sus este exemplificată modalitatea de extragere a coloanei ce conține 30

31 Acestă metodă returnează o listă cu obiectele de tipul celui specificat găsite în baza de date. Aceste lucru se realizează cu ajutorul Reflection folosind metoda newinstance() pusă la dispoiție de API-ul e Reflection. Pentru fiecare HashMap din lista de HashMap-uri returnată de metoda readall() din QueryActions se creează o noua instanță a obiectului specificat. 1. for (int i = 0; i < help.size(); i++) { 2. try { 3. inst = object.getclass().newinstance(); 4. catch (InstantiationException IllegalAccessException e) { 5. e.printstacktrace(); Secvenţa 4.7. Instanţierea unui obiect folosint Reflection În afară de câmpul ce se mapează pe coloana ce conține id-ul restul coloanelor se mapează similar cu cele de la metoda read(object). Cea de-a treia metodă este cea care ne ajută la ștergerea unui obiect de tipul celui dat ca parametru din baza de date, și anume metoda delete(object). În această metodă am folosit două metode amintite mai devreme, getid() și gettablename(), si o a treia metodă din clasa QueryActions.Această metodă din clasa QueryActions se numește delete și primește ca parametru o variabilă de tip Long(delete(Long)). Având în vedere că este o metodă de dimensiune mică voi pune mai jos întreaga metodă. 1. public <T> void delete(t object) { Long id = getid(object); String tablename = gettablename(object); QueryActions action = new QueryActions(tableName); 9. action.delete(id); 10. Secvenţa 4.8. Metoda delete(object) Ultima metodă ce trebuie implementată este metoda save(object). Această metodă trebuie fie să insereze o nouă înregistrare în baza de date dacă id-ul obiectului dat ca parametru este null, fie să facă un update asupra obiectului din baza de date dacă id-ul este o valoare ce există în baza de date. Această metodă folosește metoda getid() pentru a afla id-ul obiectului dat ca parametru, gettablename() pentru a afla numele tabelului în care se va face salvarea, getcolumns din clasa QueryActions. Aici metoda getcolumns() este folosită petru a studia ordinea coloanelor din tabel. Și nu în ultimul rând metoda save(long, List<Object>) din clasa QueryActions. Această metodată primește ca parametri id-ul înregistrării şi lista de valori pe care să le insereze sau să le modifice în baza de date. 31

32 1. if (a instanceof Column) { 2. Column col = (Column) a; 3. colname = col.name(); 4. pos = coloane.indexof(colname) - 1; Secvenţa 4.9. Studiul ordinii coloanelor În liniile de cod de mai sus se află un exemplu de aflare a poziției unei coloane în tabel. Variabila pos reprezintă poziția pe care va fi pusă valoarea câmpului obiectului în lista de valori ce va fi trimisă ca parametru metodei save din QueryActions. În metoda save(object) formăm din câmpurile obiectului dat ca parametru lista de valori necesară metodei save(long, List< Object >). În rândurile următoare voi vorbi despre metoda save(long, List< Object >) din clasa QueryActions. În această metodă se folosesc alte două metode implementate în aceeași clasă: update(long, List< Object >) și metoda insert(list< Object >). 1. public void save(long id, List<Object> valori) { if (id!= null) 4. update(id, valori); 5. else 6. insert(valori); 7. Sevenţa Metoda save(long, List) În aceste două metode partea cea mai dificilă și cea mai importantă a fost formarea interogării. O atenție specială au necesitat obiectele de tip String și cele de tip Date. Obiectele de tip String au valori ce sunt încadrate între ghilimele și nu toate sistemele de gestiune a bazelor de date relaționale acceptă valori încadrate între ghilimele, însă absolut toate acceptă încadrarea între apostrof. În liniile de cod următoare se va vedea cum am înlocuit ghilimelele cu apostrof în cazul metodei update și cum am format interogarea, aceasta trebuind să se formeze corect indiferent de numărul de elemente ale listei dată ca parametru. 1. if (valori.get(i).getclass().getname().equals("java.lang.string")) { 2. help += coloane.get(i) + "=" + "\'" + valori.get(i)+ "\', "; 3. else if (valori.get(i).getclass().getname().equals("java.util.date")) { 4. java.sql.date data = new Date(((java.util.Date) valori.get(i)).gettime()); 5. help += coloane.get(i) + "=" + "\'" + data + "\', "; 6. else { 7. help += coloane.get(i) + "=" + valori.get(i) + ", "; 8. Secvenţa Tratarea obiectelor de tip String şi Date 32

33 După cum se poate observa obiectele de tip Date trebuie convertite la un alt tip de obiect Date care să fie compatibil cu cel din baza de date. De asemenea și valorile unor asemenea obiecte trebuie încadrate cu apostrof. Diferența la metoda insert era că nu se adaugă șiruri de caractere de forma nume_coloană=valoare, ci după valoare se pune caracterul virgulă. În ambele metode mai trebuie făcută o verificare, și anume dacă valoarea se află pe ultima poziție în lista de valori, formarea interogării fiind puțin diferită. 1.if(valori.get(i).getClass().getName().equals("java.lang.String" 2. )){ 3. help += coloane.get(i) + "=" + "\'" + valori.get(i) 4. + "\' WHERE " + idtabel + "=" + id; 5. else if (valori.get(i).getclass().getname() 6..equals("java.util.Date")){ 7. java.sql.date data = new 8. Date(((java.util.Date)valori.get(i)).getTime()); 9. help += coloane.get(i) + "=" + "\'" + data + "\' WHERE " idtabel + "=" +id; Secvenţa Tratarea ultimei poziţii la update 1. if(lista.get(i).getclass().getname().equals("java.lang.string" 2. )) { 3. help += "\'" + lista.get(i) + "\') "; 4. else if 5. (lista.get(i).getclass().getname().equals("java.util.date")) { 6. java.sql.date data = new 7. Date(((java.util.Date)lista.get(i)).getTime()); 8. help += "\'" + data + "\') "; 9. Secvenţa Tratarea ultimei poziţii la insert Secvențele de cod de mai sus ilustrează modul în care se formează interogarea pentru ultima valoare din listă. Dupa cum se poate observa în prima secvență(extrasă din metoda update) după ultima valoare urmează caluză WHERE pe când în cazul metodei insert, ilustrată în cea de-a doua secvență de cod, după ultima valoare urmează închiderea unei paranteze. În cazul metodelor din clasa ORMHandler, și anume read(object), readall(object), delete(object), save(object), am implementat astfel încât acestea să accepte orice tip de obiect. Acest lucru a fost realizat făcând ca aceste patru metode să fie generice, astfel ele putând accepta orice tip de obiect. 33

34 public <T> void save(t object) public <T> List<T> readall(t object) public <T> void delete(t object) public <T> void read(t object) Secvenţa Metode generice Așa cum se poate observa în secvența de mai sus la toate cele patru metode este prezent parametrul care devine tipul obiectului dat ca parametru. Acest lucru face ca metodele să accepte ca parametru orice tip de obiect. Atunci când metodele sunt folosite nu este nevoie de vreun apel special de metodă, se va apela pur și simplu prin numele metodei și i se va da ca parametru orice tip de obiect se dorește. Mai jos voi ilustra apelul unei astfel de metode. 1. Serial serial = new Serial(); 2. serial.setid(2l); 3. ORMHandler h = new ORMHandler(); 4. h.read(serial); Secvenţa Exemplu de apel metodă generică După cum se poate observa faptul că metoda read(object) este una generică nu complică deloc folosirea ei. Prima problemă ce apare la maparea cheii primare este compatibilitatea numelui câmpului sau cum putem indica cât mai simplu faptul că un câmp este corespondentul cheii primare din tabel. În rezolvarea acestei probleme am plecat de la considerentul că pentru un tabel prima coloană va fi tot timpul reprezentată de cheia primară. 1. String helpquery = "SELECT * FROM " + this.table; 2. try { Statement helpstmt = connect.createstatement(); 5. ResultSet helprs = helpstmt.executequery(helpquery); 6. rsmd = helprs.getmetadata(); 7. idtabel = rsmd.getcolumnname(1); catch (SQLException e) { 10. e.printstacktrace(); 11. System.out.println("Probleme la metadata!"); 12. Secvenţa Extragerea numelui coloanei cu id-ul Mai sus se află una din secvenţele de cod ce rezolvă această problemă. Executarea interogării din prima linie duce la reţinerea tuturor datelor despre tabel în variabila helprs. Extragerea metadatelor se face cu metoda getmetadata(). Metadatele reprezintă numele coloanelor, tipurile acestora, numărul coloanelor etc. Metoda getcolumnname(1) returnează 34

35 numele primei coloane din tabel, adică cea care conţine cheia primară. Menţionez că metoda getmetadata returneză coloanele exact în ordinea în care ele se găesc în tabel. O altă metodă de rezolvare folosită în implementarea sistemului este reţinerea tuturor numelor coloanelor într-o listă şi folosirea primului element din listă atunci când avem nevoie de coloana pentru cheia primară. Acest lucru se realizeaza cu ajutorul metodei getcolumns din clasa QueryActions. 1. try { 2. for (int i = 1; i < rsmd.getcolumncount() + 1; i++) 3. rez.add(rsmd.getcolumnname(i)); 4. catch (SQLException e) { 5. e.printstacktrace(); 6. Secvenţa Formarea listei cu numele coloanelor Adăugarea acestei secvenţe de cod la secvenţa de mai devreme duce la formarea unei liste cu numele coloanelor. Un exemplu de folosire a celei de-a doua metode poate fi observat în metoa readall. Mai jos se află secvenţa de cod ce ilustreaza folosirea celei de-a doua metode. 1. try { 2. Object firstkey = columns.get(0); field.set(inst, help.get(i).get(firstkey) 5. catch (IllegalArgumentException IllegalAccessException e) { 6. e.printstacktrace() Secvenţa Exemplu de utilizare listă de nume coloane În liniile de cod de mai sus columns reprezintă lista cu numele coloanelor dintr-un tabel. Numele primei coloane este extras şi este folosit pentru a se extrage valoarea cheii primare dintr-un HashMap ce conţine înregistrări de tip cheie=valoare, cheia fiind numele coloanei. Cea de-a doua problemă la maparea cheii primare este generarea id-ului. Această problemă a fost rezolvată ţinând cont doar de valoarea maximă a id-ului la un moment de timp. Nu s-a ţinut cont de valoarea id-ului din sesiunile anterioare. 35

36 1. Long idrow = 0L; 2. String helpquery = "SELECT * FROM " + this.table; 3. try { 4. Statement helpstmt = connect.createstatement(); 5. resultset = helpstmt.executequery(helpquery); 6. while (resultset.next()) { 7. Long idrow1 = resultset.getlong(1); 8. if (idrow1 > idrow) 9. idrow = idrow1; catch (SQLException e) { 13. e.printstacktrace(); 14. System.out.println("Probleme la metadata!"); idrow++; Secvenţa Generarea id-ului În liniile de mai sus se poate observa că este extrasă valoarea maximă a cheii primare din tabel. La final valoarea maximă este incrementată, astfel asigurând unicitatea cheii primare. Dacă în tabel nu există înregistrări nu reprezintă o problema deoarece valoarea este iniţializată cu 0 şi este incrementată oricum la final, fie că a găsit valori sau nu în tabel. Rezolvarea celei de-a doua probleme a fost mai facilă deoarece pentru maparea oricărui tip de dată ce conţine caractere am folosit direct clasa String. În Hibernate atunci când se preiau date din baza de date sunt salvate într-un array ce conţine date de tip char. Apoi făcându-se cast-ul la String dacă este nevoie. De asemenea atunci când se salvează un şir de caractere în baza de date acestea sunt convertite în array de char-uri si pentru acest lucru este nevoia de specificarea lungimii dacă acesta depăşeşte 255. O altă parte a acestei lucrări ce a rămas neatinsă sunt adnotările. Acestea reprezintă metadate ce pot fi adăugate claselor, pachetelor, câmpurilor. Sunt caraterizate de prezenţa la început. Spre deosebire de comentarii ele sunt recunoscute de compilator şi apar ca elemente şi in API-ul de Reflection. Aici am folosit adnotări pentru maparea claselor şi câmpurilor pe tabele şi coloane. Ele pot conţine parametrii care de asemenea sunt cunoscuţi şi pot fi utilizaţi în cercetarea claselor şi a câmpurilor. Pentru mapare am folosit următoarele adnotări: aceasta poate primește ca parametru numele tabelului e care se mapează clasa. Implementarea adnotării poate fi observată ma Table { String name(); Secvenţa Adnotarea Table este folosită pentru a specifica momentul când să fie luată în considerare adnotarea. Pentru toate adnotările implementate am ales să fie active la rulare am folosit-o pentru a mapa cheia primară 36

37 @Retention(RetentionPolicy.RUN TIME) PK { Secvenţa Adnotarea PK Această adnotare nu primește nici un parametru. c) folosită pentru a mapa orice câmp pe o coloană în cazul în care numele coloanei şi cel al câmpului nu Column { String name(); String type() default ""; int length() default 100; Secvenţa Adnotarea Column Primește ca parametru numele coloanei pe care se mapează și opțional tipul de date și lungimea. Al doilea parametru și al treilea pot fi folosiți mai mult în cazul în care ORM-ul creează și tabele și trebuie specificate tipurile coloanelor și lungimea dacă este vorba de date de tip VARCHAR. d) este folosită pentru a marca faptul că un câmp nu se persistă în bază, astfel că el nu va fi luat în considerare la operațiile sistemului cu baza de NotPersistent { Secvenţa Adnotarea NotPersistent e) folosită în eventualitatea în care ORM-ul va genera și tabele pentru a specifica la crearea tabelului că o coloană nu poate lua valori NotNull { Secvenţa Adnotarea NotNull 37

38 f) folosită la la crearea de tabele pentru a mapa cheia externă din tabel. Primește ca parametru numele tabelului de care se leagă tabelul mapat de clasa în care se află câmpul FK { String name(); Secvenţa Adnotarea FK 5. Testarea aplicaţiei Pentru testarea aplicaţiei am dezvoltat o mini-aplicaţie grafică prin intermediul căreia incerc să demonstrez aplicabilitatea şi funcţionalitatea ORM-ului. În continuare voi prezenta modul de folosire al aplicaţiei de testare: 5.1. Fereastra principală Conţine câte un buton care deschide fiecare componentă a aplicaţiei: cea pentru medici, cea pentru famacişti şi cea pentru pacienţi. Fig Fereastra principală 38

39 5.2. Fereastra Medic La apăsarea butonului Medic se va intra într-o fereastră de unde se poate alege categoria din care face parte medicul, aplicaţia este destinată medicilor de familie, medicilor naturişti şi medicilor veterinari. Fig Fereastra de categorii La apăsarea butonului Medicină de familie se va deschide o fereastră de unde medicul are posibilitatea de a elibera o reţetă şi de a vizualiza programările făcute de pacienţii săi. Fig Fereastra pentru medici de familie 39

40 Pentru eliberarea unei reţete medicul va completa câmpurile din fereastră şi va apăsa butonul Salvează, astfel reţeta va fi salvată în baza de date. La apăsarea butonului Salvează se apelează metoda save(object) din ORM-ul implementat. 1. Reteta r = new Reteta(); r.setidmedic(f.getidmedic(long.valueof(text4.gettext())); 4. r.setjudet(text_1.gettext()); 5. r.setoras(text_2.gettext()); 6. r.setnumepacient(text1.gettext()); 7. r.setstrada(text_3.gettext()); r.setnrstrada(long.valueof(text_4.gettext())); 10. r.setcetatenie(text_5.gettext()); 11. r.setvarsta(integer.parseint(text_6.gettext())); 12. r.setmedicamente(text.gettext()); 13. r.setdiagnostic(text2.gettext()); int an = data.getyear()-1900; 16. int luna = data.getmonth(); 17. int zi = data.getday(); 18. Date date = new Date(an, luna, zi); 19. r.setdata(date); if (button.getselection() == true) { 22. r.setsex(button.gettext()); 23. else { 24. r.setsex(button_1.gettext()); r.setcompensata(btncheck.getselection()); ORMHandler h=new ORMHandler(); 29. h.save(r); Secvenţa 5.1. Salvarea unei reţete Secvența de cod de mai sus ilustrează modul de preluare și prelucrare a datelor din interfață și apoi salvarea lor în baza de date cu ajutorul metodei save. La apăsarea butonului Programări medicului îi sunt afişaţi toţi pacienţii ce s-au programat pentru o consultaţie la el. Pentru afişarea programărilor este folosită metoda readall() din ORM. Mai jos este exemplificată folosirea metodei readall și afișarea datelor preluate întrun tabel. 40

41 1. ORMHandler h = new ORMHandler(); 2. Programare p = new Programare(); 3. Functionalitate f = new Functionalitate(); List<Programare> pr = h.readall(p); if (f.verificamedic(long.valueof(codidentif.gettext())) == 1) { 8. for (int i = 0; i < pr.size(); i++) { 9. String nume = f.getnumemedic(long.valueof(codidentif.gettext())); 10. if (pr.get(i).getnumemedic().equals(nume)) { tableitem = new TableItem(table, SWT.NONE); 13. tableitem.settext(0, pr.get(i).getnumepacient()); 14. tableitem.settext(1, ""+pr.get(i).getdataprogramare()); 15. tableitem.settext(2, ""+pr.get(i).getoraprogramare()); Secvenţa 5.2. Exemplu de folosire readall Fig Vizualizarea programărilor 41

42 Înainte de salvarea unei reţete sau de vizualizarea programărilor un medic trebuie să introducă un cod de indentificare, unic şi cunoscut numai de el. La apăsarea butonului Medicină naturistă se va deschide o fereastră asemănătoare cu cea de la Medicină de familie în care un medic naturist va putea să prescrie un remediu pentru pacient şi va putea să vizualizeze programările. Funcţionalitatea este similară cu cea de la Medicină de familie. Fig Medicină naturistă La apăsarea butonului Medicină veterinară se va deschide o fereastră în care un medic veterinar va putea să elibereze tratamente pentru animalele pe care le consultă. Aici avem funcţionalitate de introducere în baza de date a tratamentului. Fig Medicină Veterinară 42

43 5.3. Fereastra Farmacist La apăsarea butonului Farmacist din fereastra principală se va deschide o fereastră în care farmacistul are posibilitatea de a vizualiza reţetele unui pacient şi de a le printa. Printarea se face în 2 paşi: întâi farmacistul scoate reţeta din baza de date sub forma unui fişier pdf, după aceea fişierul pdf poate fi printat. În cadrul acestei secţiuni a aplicaţiei s-au folosit metodele readall şi read(object) implementate în ORM. Long idmedic=reteta.getidmedic(); m.setidmedic(idmedic); handler.read(m); numemedic = m.getnumemedic(); Secvenţa 5.3. Exemplu de folosire metoda read Mai sus este ilustrat un exemplu de folosire a metodei read din sistemul ORM în această aplicație. Este folosită pentru a afla numele medicului în funcție de id-ul acestuia. Idul este salvat ca informație a unei rețete în baza de date, dar este folosit pentru a putea afla numele medicului. Fig 5.7. Farmacist 43

44 5.4. Fereastra Pacient La apăsarea butonului Pacient din fereastra principală se deschide o fereastră cu ajutorul căreia un pacient îşi poate face o programare la un medic. În aceasta secţiune am folosit din ORM-ul implementat metodele save(object) atunci când se salvează programarea în baza de date şi metodele readall() şi read(object) atunci când am verificat dacă programarea este posibilă. Programarea este salvată în baza de date doar dacă ora din ziua aleasă de pacient la medicul dorit de el nu este ocupată. În cazul în care programarea nu este posibilă pacientul va primi un mesaj în care este rugat să aleaga altă ora, în caz contrar acesta va primi un mesaj prin care va fi informat că înregistrarea a avut loc cu succes. Fig Fereastra pentru programare Fig Mesaj în cazul în care programarea s-a făcut cu succes 44

45 Fig Mesaj în cazul în care programarea nu este posibilă În această testare am încercat să folosesc tabele de dimensiuni şi tipuri de date cât mai variate pentru a demonstra funcţionalitatea ORM-ului şi avantajele acestuia. ORM-ul a fost testat atât pe PostgreSQL cât şi pe Microsoft SQL Server 2012 pentru a demonstra independenţa faţă de baza de date. Cel mai mare tabel din baza de date este cel de rețete de la medicii de familie.în imaginile următoare voi arăta că acestea sunt de tipuri cât mai variate și că de asemena nu este necesar ca ordinea câmpurilor din clasa ce mapează tabelul să fie aceeași cu ordinea coloanelor din tabel. Fig Coloanele tabelului rețete 45

Titlul lucrării propuse pentru participarea la concursul pe tema securității informatice

Titlul lucrării propuse pentru participarea la concursul pe tema securității informatice Titlul lucrării propuse pentru participarea la concursul pe tema securității informatice "Îmbunătăţirea proceselor şi activităţilor educaţionale în cadrul programelor de licenţă şi masterat în domeniul

More information

Versionare - GIT ALIN ZAMFIROIU

Versionare - GIT ALIN ZAMFIROIU Versionare - GIT ALIN ZAMFIROIU Controlul versiunilor - necesitate Caracterul colaborativ al proiectelor; Backup pentru codul scris Istoricul modificarilor Terminologie și concepte VCS Version Control

More information

MS POWER POINT. s.l.dr.ing.ciprian-bogdan Chirila

MS POWER POINT. s.l.dr.ing.ciprian-bogdan Chirila MS POWER POINT s.l.dr.ing.ciprian-bogdan Chirila chirila@cs.upt.ro http://www.cs.upt.ro/~chirila Pornire PowerPoint Pentru accesarea programului PowerPoint se parcurg următorii paşi: Clic pe butonul de

More information

2. Setări configurare acces la o cameră web conectată într-un router ZTE H218N sau H298N

2. Setări configurare acces la o cameră web conectată într-un router ZTE H218N sau H298N Pentru a putea vizualiza imaginile unei camere web IP conectată într-un router ZTE H218N sau H298N, este necesară activarea serviciului Dinamic DNS oferit de RCS&RDS, precum și efectuarea unor setări pe

More information

Textul si imaginile din acest document sunt licentiate. Codul sursa din acest document este licentiat. Attribution-NonCommercial-NoDerivs CC BY-NC-ND

Textul si imaginile din acest document sunt licentiate. Codul sursa din acest document este licentiat. Attribution-NonCommercial-NoDerivs CC BY-NC-ND Textul si imaginile din acest document sunt licentiate Attribution-NonCommercial-NoDerivs CC BY-NC-ND Codul sursa din acest document este licentiat Public-Domain Esti liber sa distribui acest document

More information

Metrici LPR interfatare cu Barix Barionet 50 -

Metrici LPR interfatare cu Barix Barionet 50 - Metrici LPR interfatare cu Barix Barionet 50 - Barionet 50 este un lan controller produs de Barix, care poate fi folosit in combinatie cu Metrici LPR, pentru a deschide bariera atunci cand un numar de

More information

Universitatea George Bariţiu, Braşov

Universitatea George Bariţiu, Braşov LUCRUL CU BAZE DE DATE ÎN JAVA Lect.univ.dr.ing. IOAN-GHEORGHE RAŢIU Lect.univ. NICOLETA DAVID Universitatea George Bariţiu, Braşov Rezumat O bază de date reprezintă o modalitate de stocare a unor informaţii

More information

Procesarea Imaginilor

Procesarea Imaginilor Procesarea Imaginilor Curs 11 Extragerea informańiei 3D prin stereoviziune Principiile Stereoviziunii Pentru observarea lumii reale avem nevoie de informańie 3D Într-o imagine avem doar două dimensiuni

More information

Modalitǎţi de clasificare a datelor cantitative

Modalitǎţi de clasificare a datelor cantitative Modalitǎţi de clasificare a datelor cantitative Modul de stabilire a claselor determinarea pragurilor minime şi maxime ale fiecǎrei clase - determinǎ modul în care sunt atribuite valorile fiecǎrei clase

More information

La fereastra de autentificare trebuie executati urmatorii pasi: 1. Introduceti urmatoarele date: Utilizator: - <numarul dvs de carnet> (ex: "9",

La fereastra de autentificare trebuie executati urmatorii pasi: 1. Introduceti urmatoarele date: Utilizator: - <numarul dvs de carnet> (ex: 9, La fereastra de autentificare trebuie executati urmatorii pasi: 1. Introduceti urmatoarele date: Utilizator: - (ex: "9", "125", 1573" - se va scrie fara ghilimele) Parola: -

More information

Proceduri stocate. Crearea procedurilor stocate. Varianta 1 În Management Studio se dă clic pe New Query ca în imaginea de mai jos: Fig.

Proceduri stocate. Crearea procedurilor stocate. Varianta 1 În Management Studio se dă clic pe New Query ca în imaginea de mai jos: Fig. Proceduri stocate Crearea procedurilor stocate. Varianta 1 În Management Studio se dă clic pe New Query ca în imaginea de mai jos: Fig. 1 Odată cu deschiderea editorului SQL, apare și bara de instrumente

More information

Structura și Organizarea Calculatoarelor. Titular: BĂRBULESCU Lucian-Florentin

Structura și Organizarea Calculatoarelor. Titular: BĂRBULESCU Lucian-Florentin Structura și Organizarea Calculatoarelor Titular: BĂRBULESCU Lucian-Florentin Chapter 3 ADUNAREA ȘI SCĂDEREA NUMERELOR BINARE CU SEMN CONȚINUT Adunarea FXP în cod direct Sumator FXP în cod direct Scăderea

More information

Itemi Sisteme de Operare

Itemi Sisteme de Operare Itemi Sisteme de Operare 1. Pentru a muta un dosar (folder) de pe partiţia C: pe partiţia D: folosim: a. New Folder b. Ctrl + C din bara de instrumente şi Copy; c. Ctrl + X şi Ctrl + V; d. Edit Paste;

More information

2. Setări configurare acces la o cameră web conectată într-un echipament HG8121H cu funcție activă de router

2. Setări configurare acces la o cameră web conectată într-un echipament HG8121H cu funcție activă de router Pentru a putea vizualiza imaginile unei camere web IP conectată într-un echipament Huawei HG8121H, este necesară activarea serviciului Dinamic DNS oferit de RCS&RDS, precum și efectuarea unor setări pe

More information

Reflexia şi refracţia luminii. Aplicaţii. Valerica Baban

Reflexia şi refracţia luminii. Aplicaţii. Valerica Baban Reflexia şi refracţia luminii. Aplicaţii. Sumar 1. Indicele de refracţie al unui mediu 2. Reflexia şi refracţia luminii. Legi. 3. Reflexia totală 4. Oglinda plană 5. Reflexia şi refracţia luminii în natură

More information

Ghid identificare versiune AWP, instalare AWP şi verificare importare certificat în Store-ul de Windows

Ghid identificare versiune AWP, instalare AWP şi verificare importare certificat în Store-ul de Windows Ghid identificare versiune AWP, instalare AWP 4.5.4 şi verificare importare certificat în Store-ul de Windows Data: 28.11.14 Versiune: V1.1 Nume fişiser: Ghid identificare versiune AWP, instalare AWP 4-5-4

More information

Documentaţie Tehnică

Documentaţie Tehnică Documentaţie Tehnică Verificare TVA API Ultima actualizare: 27 Aprilie 2018 www.verificaretva.ro 021-310.67.91 / 92 info@verificaretva.ro Cuprins 1. Cum funcţionează?... 3 2. Fluxul de date... 3 3. Metoda

More information

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic Proiect nr. 154/323 cod SMIS 4428 cofinanțat de prin Fondul European de Dezvoltare Regională Investiții pentru viitorul

More information

Nume şi Apelativ prenume Adresa Număr telefon Tip cont Dobânda Monetar iniţial final

Nume şi Apelativ prenume Adresa Număr telefon  Tip cont Dobânda Monetar iniţial final Enunt si descriere aplicatie. Se presupune ca o organizatie (firma, banca, etc.) trebuie sa trimita scrisori prin posta unui numar (n=500, 900,...) foarte mare de clienti pe care sa -i informeze cu diverse

More information

Figura x.1 Ecranul de pornire al mediului de dezvoltare

Figura x.1 Ecranul de pornire al mediului de dezvoltare x. Mediul de dezvoltare MICROSOFT VISUAL C++ În cadrul acestui capitol vom prezenta Microsoft Visual C++, din cadrul suitei Microsoft Visual Studio 2012, care este un mediu de programare care suportă dezvoltarea

More information

Update firmware aparat foto

Update firmware aparat foto Update firmware aparat foto Mulţumim că aţi ales un produs Nikon. Acest ghid descrie cum să efectuaţi acest update de firmware. Dacă nu aveţi încredere că puteţi realiza acest update cu succes, acesta

More information

Semnale şi sisteme. Facultatea de Electronică şi Telecomunicaţii Departamentul de Comunicaţii (TC)

Semnale şi sisteme. Facultatea de Electronică şi Telecomunicaţii Departamentul de Comunicaţii (TC) Semnale şi sisteme Facultatea de Electronică şi Telecomunicaţii Departamentul de Comunicaţii (TC) http://shannon.etc.upt.ro/teaching/ssist/ 1 OBIECTIVELE CURSULUI Disciplina îşi propune să familiarizeze

More information

Laborator 1. Programare declarativă. Programare logică. Prolog. SWI-Prolog

Laborator 1. Programare declarativă. Programare logică. Prolog. SWI-Prolog Laborator 1 Programare declarativă O paradigmă de programare în care controlul fluxului de execuție este lăsat la latitudinea implementării limbajului, spre deosebire de programarea imperativă în care

More information

REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC

REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC Anul II Nr. 7 aprilie 2013 ISSN 2285 6560 Referent ştiinţific Lector univ. dr. Claudiu Ionuţ Popîrlan Facultatea de Ştiinţe Exacte Universitatea din

More information

Propuneri pentru teme de licență

Propuneri pentru teme de licență Propuneri pentru teme de licență Departament Automatizări Eaton România Instalație de pompare cu rotire în funcție de timpul de funcționare Tablou electric cu 1 pompă pilot + 3 pompe mari, cu rotirea lor

More information

ARBORI AVL. (denumiti dupa Adelson-Velskii si Landis, 1962)

ARBORI AVL. (denumiti dupa Adelson-Velskii si Landis, 1962) ARBORI AVL (denumiti dupa Adelson-Velskii si Landis, 1962) Georgy Maximovich Adelson-Velsky (Russian: Гео ргий Макси мович Адельсо н- Ве льский; name is sometimes transliterated as Georgii Adelson-Velskii)

More information

Subiecte Clasa a VI-a

Subiecte Clasa a VI-a (40 de intrebari) Puteti folosi spatiile goale ca ciorna. Nu este de ajuns sa alegeti raspunsul corect pe brosura de subiecte, ele trebuie completate pe foaia de raspuns in dreptul numarului intrebarii

More information

Ghid pentru configurarea şi utilizarea aplicaţiei clicksign Demo

Ghid pentru configurarea şi utilizarea aplicaţiei clicksign Demo Ghid pentru configurarea şi utilizarea aplicaţiei clicksign Demo 2.6.9.223 Cuprins 1 Cadru general...2 2 Obţinerea unui certificat digital...3 3 Configurarea aplicaţiei clicksign...5 4 Utilizarea aplicaţiei

More information

GHID DE TERMENI MEDIA

GHID DE TERMENI MEDIA GHID DE TERMENI MEDIA Definitii si explicatii 1. Target Group si Universe Target Group - grupul demografic care a fost identificat ca fiind grupul cheie de consumatori ai unui brand. Toate activitatile

More information

Mai bine. Pentru c putem.

Mai bine. Pentru c putem. 1 CUPRINS: 1. SUMAR APLICAŢIE...... 3 1.1 Introducere... 3 1.2 Tipul de aplicaţie... 3 2. SPECIFICAŢII FUNCŢIONALE... 3 3. INSTALARE... 3 3.1 Introducere... 3 3.2 Ce trebuie să verificaţi înainte de a

More information

Baza de date: tabele, date. Componentele unei B.D.: tabele, constrangeri, relatii. Entitati ale unei B.D.: formulare, interogari, rapoarte

Baza de date: tabele, date. Componentele unei B.D.: tabele, constrangeri, relatii. Entitati ale unei B.D.: formulare, interogari, rapoarte 1. Introducere ~ Microsoft Access ~ Baze de Date Baza de date: tabele, date. Componentele unei B.D.: tabele, constrangeri, relatii. Entitati ale unei B.D.: formulare, interogari, rapoarte 2. Crearea unei

More information

Excel Advanced. Curriculum. Școala Informală de IT. Educație Informală S.A.

Excel Advanced. Curriculum. Școala Informală de IT. Educație Informală S.A. Excel Advanced Curriculum Școala Informală de IT Tel: +4.0744.679.530 Web: www.scoalainformala.ro / www.informalschool.com E-mail: info@scoalainformala.ro Cuprins 1. Funcții Excel pentru avansați 2. Alte

More information

Olimpiad«Estonia, 2003

Olimpiad«Estonia, 2003 Problema s«pt«m nii 128 a) Dintr-o tabl«p«trat«(2n + 1) (2n + 1) se ndep«rteaz«p«tr«telul din centru. Pentru ce valori ale lui n se poate pava suprafata r«mas«cu dale L precum cele din figura de mai jos?

More information

Auditul financiar la IMM-uri: de la limitare la oportunitate

Auditul financiar la IMM-uri: de la limitare la oportunitate Auditul financiar la IMM-uri: de la limitare la oportunitate 3 noiembrie 2017 Clemente Kiss KPMG in Romania Agenda Ce este un audit la un IMM? Comparatie: audit/revizuire/compilare Diferente: audit/revizuire/compilare

More information

INTEROGĂRI ÎN SQL SERVER

INTEROGĂRI ÎN SQL SERVER INTEROGĂRI ÎN SQL SERVER Principala operaţie efectuată într-o bază de date este operaţia de extragere a datelor, care se realizează cu ajutorul unei clauze SELECT. SELECT Clauza SELECT are o sintaxă foarte

More information

Curs 1 17 Februarie Adrian Iftene

Curs 1 17 Februarie Adrian Iftene Curs 1 17 Februarie 2011 Adrian Iftene adiftene@info.uaic.ro 1 Limbajele calculatorului Compilate Interpretate Scripting P-cod Orientate pe aspect Orientate spre date 2 Cum lucrează? Orice program trebuie

More information

Proiectarea bazelor de date. PL/SQL Înregistrări și Colecții # 13. Adrian Runceanu

Proiectarea bazelor de date. PL/SQL Înregistrări și Colecții # 13. Adrian Runceanu Proiectarea bazelor de date # 13 PL/SQL Înregistrări și Colecții 2016 Adrian Runceanu www.runceanu.ro/adrian Curs 13 Înregistrări și Colecții Proiectarea bazelor de date 2 Înregistrări și Colecții în PL/SQL

More information

Creare baza de data Deschidem aplicaţia Microsoft Access. Lansarea în execuţie a programului se face urmând calea:

Creare baza de data Deschidem aplicaţia Microsoft Access. Lansarea în execuţie a programului se face urmând calea: Baze de date Pentru început este bine să înţelegem noţiunile de bază din Access: modul de organizare a unei baze de date, a noţiunilor de tabel, înregistrare, câmp, tip de dată al câmpului, proprietăţi

More information

ISBN-13:

ISBN-13: Regresii liniare 2.Liniarizarea expresiilor neliniare (Steven C. Chapra, Applied Numerical Methods with MATLAB for Engineers and Scientists, 3rd ed, ISBN-13:978-0-07-340110-2 ) Există cazuri în care aproximarea

More information

Managementul referinţelor cu

Managementul referinţelor cu TUTORIALE DE CULTURA INFORMAŢIEI Citarea surselor de informare cu instrumente software Managementul referinţelor cu Bibliotecar Lenuţa Ursachi PE SCURT Este gratuit Poţi adăuga fişiere PDF Poţi organiza,

More information

Ce pot face pe hi5? Organizare si facilitati. Pagina de Home

Ce pot face pe hi5? Organizare si facilitati. Pagina de Home Ce este Hi5!? hi5 este un website social care, în decursul anului 2007, a fost unul din cele 25 cele mai vizitate site-uri de pe Internet. Compania a fost fondată în 2003 iar pana in anul 2007 a ajuns

More information

Reţele Neuronale Artificiale în MATLAB

Reţele Neuronale Artificiale în MATLAB Reţele Neuronale Artificiale în MATLAB Programul MATLAB dispune de o colecţie de funcţii şi interfeţe grafice, destinate lucrului cu Reţele Neuronale Artificiale, grupate sub numele de Neural Network Toolbox.

More information

Arbori. Figura 1. struct ANOD { int val; ANOD* st; ANOD* dr; }; #include <stdio.h> #include <conio.h> struct ANOD { int val; ANOD* st; ANOD* dr; }

Arbori. Figura 1. struct ANOD { int val; ANOD* st; ANOD* dr; }; #include <stdio.h> #include <conio.h> struct ANOD { int val; ANOD* st; ANOD* dr; } Arbori Arborii, ca şi listele, sunt structuri dinamice. Elementele structurale ale unui arbore sunt noduri şi arce orientate care unesc nodurile. Deci, în fond, un arbore este un graf orientat degenerat.

More information

Capitolul IV Utilizarea bazelor de date în Internet

Capitolul IV Utilizarea bazelor de date în Internet Capitolul IV Utilizarea bazelor de date în Internet 4.1 Pagini Web dinamice 4.1.1. Pagini dinamice vs. Pagini statice Paginile Web dinamice sunt folosite atunci când se doreşte modificarea dinamică, a

More information

Calculatoare Numerice II Interfaţarea unui dispozitiv de teleghidare radio cu portul paralel (MGSH Machine Guidance SHell) -proiect-

Calculatoare Numerice II Interfaţarea unui dispozitiv de teleghidare radio cu portul paralel (MGSH Machine Guidance SHell) -proiect- Universitatea Politehnica Bucureşti Facultatea de Automaticăşi Calculatoare Calculatoare Numerice II Interfaţarea unui dispozitiv de teleghidare radio cu portul paralel (MGSH Machine Guidance SHell) -proiect-

More information

MANAGEMENTUL CALITĂȚII - MC. Proiect 5 Procedura documentată pentru procesul ales

MANAGEMENTUL CALITĂȚII - MC. Proiect 5 Procedura documentată pentru procesul ales MANAGEMENTUL CALITĂȚII - MC Proiect 5 Procedura documentată pentru procesul ales CUPRINS Procedura documentată Generalități Exemple de proceduri documentate Alegerea procesului pentru realizarea procedurii

More information

R O M Â N I A CURTEA CONSTITUŢIONALĂ

R O M Â N I A CURTEA CONSTITUŢIONALĂ R O M Â N I A CURTEA CONSTITUŢIONALĂ Palatul Parlamentului Calea 13 Septembrie nr. 2, Intrarea B1, Sectorul 5, 050725 Bucureşti, România Telefon: (+40-21) 312 34 84; 335 62 09 Fax: (+40-21) 312 43 59;

More information

X-Fit S Manual de utilizare

X-Fit S Manual de utilizare X-Fit S Manual de utilizare Compatibilitate Acest produs este compatibil doar cu dispozitivele ce au următoarele specificații: ios: Versiune 7.0 sau mai nouă, Bluetooth 4.0 Android: Versiune 4.3 sau mai

More information

[{CYCLE NOCYCLE}] [{CACHE

[{CYCLE NOCYCLE}] [{CACHE Laborator 10 1. Secvenţe Secvenţa este un obiect al bazei de date ce permite generarea de întregi unici pentru a fi folosiţi ca valori pentru cheia primară sau coloane numerice unice. Secvenţele sunt independente

More information

Proiectarea Sistemelor Software Complexe

Proiectarea Sistemelor Software Complexe Proiectarea Sistemelor Software Complexe Curs 3 Principii de Proiectare Orientată pe Obiecte Principiile de proiectare orientată pe obiecte au fost formulate pentru a servi ca reguli pentru evitarea proiectării

More information

Aspecte controversate în Procedura Insolvenţei şi posibile soluţii

Aspecte controversate în Procedura Insolvenţei şi posibile soluţii www.pwc.com/ro Aspecte controversate în Procedura Insolvenţei şi posibile soluţii 1 Perioada de observaţie - Vânzarea de stocuri aduse în garanţie, în cursul normal al activității - Tratamentul leasingului

More information

APLICAŢIE INFORMATICĂ PENTRU PREGĂTIREA MISIUNILOR DE NIVEL TACTIC

APLICAŢIE INFORMATICĂ PENTRU PREGĂTIREA MISIUNILOR DE NIVEL TACTIC APLICAŢIE INFORMATICĂ PENTRU PREGĂTIREA MISIUNILOR DE NIVEL TACTIC Asist.univ.drd. Romana OANCEA Conf.univ.dr.ing. Ghiţă BÂRSAN Academia Forţelor Terestre Nicolae Bălcescu Sibiu Abstract The paper describes

More information

9. Memoria. Procesorul are o memorie cu o arhitectură pe două niveluri pentru memoria de program și de date.

9. Memoria. Procesorul are o memorie cu o arhitectură pe două niveluri pentru memoria de program și de date. 9. Memoria Procesorul are o memorie cu o arhitectură pe două niveluri pentru memoria de program și de date. Primul nivel conține memorie de program cache (L1P) și memorie de date cache (L1D). Al doilea

More information

Lucrarea Nr.1. Sisteme de operare. Generalitati

Lucrarea Nr.1. Sisteme de operare. Generalitati Lucrarea Nr.1 Sisteme de operare. Generalitati Scopul lucrarii Lucrarea îsi propune familiarizarea studentilor cu sistemele de operare disponibile în laborator, respectiv acele sisteme de operare cu ajutorul

More information

1. Creaţi un nou proiect de tip Windows Forms Application, cu numele MdiExample.

1. Creaţi un nou proiect de tip Windows Forms Application, cu numele MdiExample. Aplicaţia MdiExample Aplicaţia implementează: Deschiderea şi închiderea ferestrelor child. Minimizarea şi maximizarea ferestrelor. Aranjarea ferestrelor. Tratarea mesajului de atenţionare la ieşirea din

More information

Software Process and Life Cycle

Software Process and Life Cycle Software Process and Life Cycle Drd.ing. Flori Naghiu Murphy s Law: Left to themselves, things tend to go from bad to worse. Principiile de dezvoltare software Principiul Calitatii : asigurarea gasirii

More information

Mods euro truck simulator 2 harta romaniei by elyxir. Mods euro truck simulator 2 harta romaniei by elyxir.zip

Mods euro truck simulator 2 harta romaniei by elyxir. Mods euro truck simulator 2 harta romaniei by elyxir.zip Mods euro truck simulator 2 harta romaniei by elyxir Mods euro truck simulator 2 harta romaniei by elyxir.zip 26/07/2015 Download mods euro truck simulator 2 harta Harta Romaniei pentru Euro Truck Simulator

More information

INFORMAȚII DESPRE PRODUS. FLEXIMARK Stainless steel FCC. Informații Included in FLEXIMARK sample bag (article no. M )

INFORMAȚII DESPRE PRODUS. FLEXIMARK Stainless steel FCC. Informații Included in FLEXIMARK sample bag (article no. M ) FLEXIMARK FCC din oțel inoxidabil este un sistem de marcare personalizată în relief pentru cabluri și componente, pentru medii dure, fiind rezistent la acizi și la coroziune. Informații Included in FLEXIMARK

More information

Behavioral design patterns (comportamentale) ALIN ZAMFIROIU

Behavioral design patterns (comportamentale) ALIN ZAMFIROIU Behavioral design patterns (comportamentale) ALIN ZAMFIROIU Behavioral design patterns Furnizează soluții pentru o mai bună interacțiune între obiecte și clase. Aceste design pattern-uri controlează relațiile

More information

A Compared Aproach: ASP versus PHP

A Compared Aproach: ASP versus PHP 22 A Compared Aproach: ASP versus PHP Asist.dr. Liana-Maria STANCA Catedra de Informatică Economică, Universitatea Babeş-Bolyai, Cluj-Napoca In the development process of electronic business theory, we

More information

CERERI SELECT PE O TABELA

CERERI SELECT PE O TABELA SQL - 1 CERERI SELECT PE O TABELA 1 STUD MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS ---- ------- -- ------ --------- ---------- ----- ------- ---- 1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11 1325

More information

D în această ordine a.î. AB 4 cm, AC 10 cm, BD 15cm

D în această ordine a.î. AB 4 cm, AC 10 cm, BD 15cm Preparatory Problems 1Se dau punctele coliniare A, B, C, D în această ordine aî AB 4 cm, AC cm, BD 15cm a) calculați lungimile segmentelor BC, CD, AD b) determinați distanța dintre mijloacele segmentelor

More information

PROIECT. La Baze de date. Evidența activității pentru o firmă IT. Îndrumător: ș. l. dr. ing. Mirela Danubianu. Efectuat de: Grigoriev Sergiu gr.

PROIECT. La Baze de date. Evidența activității pentru o firmă IT. Îndrumător: ș. l. dr. ing. Mirela Danubianu. Efectuat de: Grigoriev Sergiu gr. PROIECT La Baze de date Evidența activității pentru o firmă IT Îndrumător: ș. l. dr. ing. Mirela Danubianu Efectuat de: Grigoriev Sergiu gr. 1131B Suceava 2011 Cuprins 1. DESCRIERE 3 2. MODELAREA CONCEPTUALĂ

More information

Mecanismul de decontare a cererilor de plata

Mecanismul de decontare a cererilor de plata Mecanismul de decontare a cererilor de plata Autoritatea de Management pentru Programul Operaţional Sectorial Creşterea Competitivităţii Economice (POS CCE) Ministerul Fondurilor Europene - Iunie - iulie

More information

Metoda de programare BACKTRACKING

Metoda de programare BACKTRACKING Metoda de programare BACKTRACKING Sumar 1. Competenţe............................................ 3 2. Descrierea generală a metodei............................. 4 3......................... 7 4. Probleme..............................................

More information

Relational and Object-Oriented Methodology in Data Bases Systems

Relational and Object-Oriented Methodology in Data Bases Systems Revista Informatica Economică nr.3(39)/2006 141 Relational and Object-Oriented Methodology in Data Bases Systems Marian CRISTESCU, Gabriel SOFONEA, Eugen COJOCARIU Economic Informatics Department Lucian

More information

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic Proiect nr. 154/323 cod SMIS 4428 cofinanțat de prin Fondul European de Dezvoltare Regională Investiții pentru viitorul

More information

1 Vasile Violeta Ion Popescu Avram Maria Câmpuri în tabel

1 Vasile Violeta Ion Popescu Avram Maria Câmpuri în tabel ECDL MODULUL 5 Baze de date 1.1. Concepte generale privind bazele de date 1. Utilizarea aplicaţiei Access De ce foloisim bazele de date: Atunci când avem mai multe informaţii despre un anumit lucru si

More information

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU Universitatea Constantin Brâncuşi din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU 03.03.2013 Curs 1 - BAZE DE DATE 2 Curs 1 Noţiuni

More information

MICROSOFT ACCESS 2007 (DE CĂUTAT???)

MICROSOFT ACCESS 2007 (DE CĂUTAT???) Access 2007 Modul A Pagina 1 MICROSOFT ACCESS 2007 (DE CĂUTAT???) 1. CONCEPTE GENERALE PRIVIND BAZELE DE DATE Evoluţia diferitelor metode şi tehnici de organizare a datelor pe suporturi de memorie externă

More information

CAIETUL DE SARCINI Organizare evenimente. VS/2014/0442 Euro network supporting innovation for green jobs GREENET

CAIETUL DE SARCINI Organizare evenimente. VS/2014/0442 Euro network supporting innovation for green jobs GREENET CAIETUL DE SARCINI Organizare evenimente VS/2014/0442 Euro network supporting innovation for green jobs GREENET Str. Dem. I. Dobrescu, nr. 2-4, Sector 1, CAIET DE SARCINI Obiectul licitaţiei: Kick off,

More information

TIME COMPASS: O APLICAȚIE DE TIME MANAGEMENT PENTRU ANDROID

TIME COMPASS: O APLICAȚIE DE TIME MANAGEMENT PENTRU ANDROID FACULTATEA DE AUTOMATICĂ ŞI CALCULATOARE DEPARTAMENTUL CALCULATOARE TIME COMPASS: O APLICAȚIE DE TIME MANAGEMENT PENTRU ANDROID LUCRARE DE LICENŢĂ Absolvent: Bogdan NANE Coordonator ştiinţific: Șef lucr.

More information

Proprietăţi obiectual-relaţionale în standardul SQL prof. dr. ing. Mircea Petrescu

Proprietăţi obiectual-relaţionale în standardul SQL prof. dr. ing. Mircea Petrescu Proprietăţi obiectual-relaţionale în standardul SQL prof. dr. ing. Mircea Petrescu Tipuri construite interne (build-in) Din faza iniţială a existenţei sale, SQL a permis utilizarea tipurilor atomice pentru

More information

M C I O H L BAZE DE CUNOŞTINŢE A H E O L N S I S T E M E D E R E P R E Z E N A R E Ş I P R O C E S A R E A A C U N O Ş T I N Ţ E L O R

M C I O H L BAZE DE CUNOŞTINŢE A H E O L N S I S T E M E D E R E P R E Z E N A R E Ş I P R O C E S A R E A A C U N O Ş T I N Ţ E L O R BAZE DE CUNOŞTINŢE S I S T E M E D E R E P R E Z E N A R E Ş I P R O C E S A R E A C U N O Ş T I N Ţ E L O R M C I O H L A H E O L N A TIPURI DE CUNOŞTINŢE Pentru a putea rezolva problemele complexe de

More information

Baze de date distribuite și mobile

Baze de date distribuite și mobile Universitatea Constantin Brâncuşi din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu Baze de date distribuite și mobile Lect.dr. Adrian Runceanu Curs 3 Model fizic şi model

More information

COMUNICAȚII INFORMATIZARE

COMUNICAȚII INFORMATIZARE COMUNICAȚII INFORMATIZARE 120 Migrare servicii telefonie la Vodafone S-a asigurat suportul tehnic și s-a colaborat cu echipele Vodafone la portarea numerelor UPT și migrarea infrastructuri: 1200 linii

More information

INSTRUMENTE DE MARKETING ÎN PRACTICĂ:

INSTRUMENTE DE MARKETING ÎN PRACTICĂ: INSTRUMENTE DE MARKETING ÎN PRACTICĂ: Marketing prin Google CUM VĂ AJUTĂ ACEST CURS? Este un curs util tuturor celor implicați în coordonarea sau dezvoltarea de campanii de marketingși comunicare online.

More information

manivelă blocare a oglinzii ajustare înclinare

manivelă blocare a oglinzii ajustare înclinare Twister MAXVIEW Twister impresionează prin designul său aerodinamic și înălțime de construcție redusă. Oglinda mai mare a îmbunătăți gama considerabil. MaxView Twister este o antenă de satelit mecanică,

More information

Consideratii privind structurile de date specifice sistemelor informationale geografice

Consideratii privind structurile de date specifice sistemelor informationale geografice 34 Consideratii privind structurile de date specifice sistemelor informationale geografice Ing. Laurentiu-Virgil RUSAN Ministerul Apararii Nationale În domeniul administrativ, al lucrarilor publice, al

More information

Semnare digitală configurări și proceduri de lucru Manual de utilizare

Semnare digitală configurări și proceduri de lucru Manual de utilizare Semnare digitală configurări și proceduri de lucru Manual de utilizare Servicii informatice privind activităţi ale comunităţii portuare Acest document şi informaţiile conţinute în el sunt în proprietatea

More information

Dispozitive Electronice şi Electronică Analogică Suport curs 02 Metode de analiză a circuitelor electrice. Divizoare rezistive.

Dispozitive Electronice şi Electronică Analogică Suport curs 02 Metode de analiză a circuitelor electrice. Divizoare rezistive. . egimul de curent continuu de funcţionare al sistemelor electronice În acest regim de funcţionare, valorile mărimilor electrice ale sistemului electronic sunt constante în timp. Aşadar, funcţionarea sistemului

More information

9. CURSOARE. Obiective. În acest Capitol, vom învăţa despre: Manipularea cursoarelor. Folosirea Cursor FOR Loops şi Nesting Cursors.

9. CURSOARE. Obiective. În acest Capitol, vom învăţa despre: Manipularea cursoarelor. Folosirea Cursor FOR Loops şi Nesting Cursors. 9. CURSOARE Obiective. În acest Capitol, vom învăţa despre: Manipularea cursoarelor. Folosirea Cursor FOR Loops şi Nesting Cursors. Cursoare sunt zone de memorie care ne permit să alocam o zonă de memorie

More information

Ce este o BAZA DE DATE?

Ce este o BAZA DE DATE? Ce este o BAZA DE DATE? In sens larg un sistem proiectat pentru a oferi un mecanism organizat, capabil sa stocheze, sa actualizeze si sa regaseasca informatia Exemplu: o biblioteca Noţiunea de bază de

More information

Managementul Proiectelor Software Metode de dezvoltare

Managementul Proiectelor Software Metode de dezvoltare Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic Managementul Proiectelor Software Metode de dezvoltare 2 Metode structurate (inclusiv metodele OO) O mulțime de pași și

More information

SGBD Access 2010: Query

SGBD Access 2010: Query SGBD Access 2010: Query Interogarea (Query) este un obiect ce permite vizualizarea informaţiilor obţinute prin selectarea şi prelucrarea datelor din unul sau mai multe tabele (sau interogări) Rezultatul

More information

Baze de date - Lucrare de laborator 3 -

Baze de date - Lucrare de laborator 3 - Baze de date - Lucrare de laborator 3 - PROIECTAREA BAZELOR DE DATE RELATIONALE 1. NOTIUNI TEORETICE Proiectarea unei baze de date consta din proiectarea schemei conceptuale (logice) si fizice a acesteia,

More information

Modulul 5 Baze de date

Modulul 5 Baze de date Scopul modulului Modulul 5, Baze de date, solicită din partea cititorului înţelegerea noţiunilor fundamentale despre bazele de date şi demonstrarea abilităţii de a folosi o bază de date pe un computer

More information

Modele de date utilizate în bazele de date pentru prelucrari grafice

Modele de date utilizate în bazele de date pentru prelucrari grafice 64 Revista Informatica Economica, nr. 7/1998 Modele de date utilizate în bazele de date pentru prelucrari grafice Sef lucrari dr.ing. Marius Dorian ZAHARIA Universitatea POLITEHNICA Bucuresti Lucrarea

More information

LIDER ÎN AMBALAJE EXPERT ÎN SISTEMUL BRAILLE

LIDER ÎN AMBALAJE EXPERT ÎN SISTEMUL BRAILLE LIDER ÎN AMBALAJE EXPERT ÎN SISTEMUL BRAILLE BOBST EXPERTFOLD 80 ACCUBRAILLE GT Utilajul ACCUBRAILLE GT Bobst Expertfold 80 Aplicarea codului Braille pe cutii a devenit mai rapidă, ușoară și mai eficientă

More information

Colegiul Național Calistrat Hogaș Piatra-Neamț LIMBAJUL SQL

Colegiul Național Calistrat Hogaș Piatra-Neamț LIMBAJUL SQL LIMBAJUL SQL Prezentare generală SQL (Structured Query Language) este în prezent, unul din cele mai puternice limbaje structurate pentru interogarea bazelor de date relaţionale. Este un limbaj neprocedural

More information

INFLUENŢA CÂMPULUI MAGNETIC ASUPRA DINAMICII DE CREŞTERE"IN VITRO" LA PLANTE FURAJERE

INFLUENŢA CÂMPULUI MAGNETIC ASUPRA DINAMICII DE CREŞTEREIN VITRO LA PLANTE FURAJERE INFLUENŢA CÂMPULUI MAGNETIC ASUPRA DINAMICII DE CREŞTERE"IN VITRO" LA PLANTE FURAJERE T.Simplăceanu, C.Bindea, Dorina Brătfălean*, St.Popescu, D.Pamfil Institutul Naţional de Cercetere-Dezvoltare pentru

More information

Proiectarea bazelor de date # 11. PL/SQL Funcții în PL/SQL (partea a II-a) Adrian Runceanu

Proiectarea bazelor de date # 11. PL/SQL Funcții în PL/SQL (partea a II-a) Adrian Runceanu Proiectarea bazelor de date # 11 PL/SQL Funcții în PL/SQL (partea a II-a) 2018 Adrian Runceanu www.runceanu.ro/adrian Curs 11 Funcţii în PL/SQL (partea II) Proiectarea bazelor de date 2 Cuprins Funcţii

More information

UNIVERSITATEA ŞTEFAN CEL MARE SUCEAVA

UNIVERSITATEA ŞTEFAN CEL MARE SUCEAVA UNIVERSITATEA ŞTEFAN CEL MARE SUCEAVA Facultatea de Ştiinţe Economice şi Administraţie Publică Nicolae Morariu BAZE DE DATE Îndrumar de laborator 2005 1 Referenţi ştiinţifici: Prof.univ.dr.ing. Alexandru

More information

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic Proiect nr. 154/323 cod SMIS 4428 cofinanțat de prin Fondul European de Dezvoltare Regională Investiții pentru viitorul

More information

UTILIZAREA FOILOR DE CALCUL TABELAR - EXCEL

UTILIZAREA FOILOR DE CALCUL TABELAR - EXCEL UTILIZAREA FOILOR DE CALCUL TABELAR - EXCEL 1. Deschiderea aplicaţiei Excel - Start Programs Microsoft Excel; - Dublu clic pe pictograma de pe ecran sub care scrie Microsoft Excel; Pe ecranul monitorului

More information

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU Universitatea Constantin Brâncuşi din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU 28.04.2014 Curs 1 - BAZE DE DATE 2 Curs 1 Noţiuni

More information

ACADEMIA DE STUDII ECONOMICE. Integrarea Sistemelor Informatice

ACADEMIA DE STUDII ECONOMICE. Integrarea Sistemelor Informatice ACADEMIA DE STUDII ECONOMICE FACULTATEA DE CIBERNETICĂ, STATISTICĂ ȘI INFORMATICĂ ECONOMICĂ Master Informatică Economică Integrarea Sistemelor Informatice Problemele integrării pentru big data Student

More information

The First TST for the JBMO Satu Mare, April 6, 2018

The First TST for the JBMO Satu Mare, April 6, 2018 The First TST for the JBMO Satu Mare, April 6, 08 Problem. Prove that the equation x +y +z = x+y +z + has no rational solutions. Solution. The equation can be written equivalently (x ) + (y ) + (z ) =

More information

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU

BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU Universitatea Constantin Brâncuşi din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu BAZE DE DATE LECTOR DR. ADRIAN RUNCEANU 2 Curs 1 Noţiuni introductive despre teoria

More information

GESTIUNEA BAZELOR DE DATE

GESTIUNEA BAZELOR DE DATE GESTIUNEA BAZELOR DE DATE CONŢINUTUL TEMATIC AL DISCIPLINEI BAZE DE DATE ŞI SISTEME DE GESTIUNE A BAZELOR DE DATE Conceptul de bază de date Baze de date: noi funcţionalităţi Tipuri de baze de date Sisteme

More information