Proiectarea Unei Aplicatii Informatice Privind Calculul Cheltuielilor Lunare ale Asociatiilor de Proprietari

Listă de figuri

Figura 2.1. Modul de compilare și generare a bytecode – 6 –

Figura 2.2. Disponibilitate pe mai multe sisteme de operare – 7 –

Figura 3.1. Pornire server Apache și MySQL – 12 –

Figura 4.1. Diagrama de generare a unui raport – 20 –

Figura 4.2. Fereasta principală a aplicației – 22 –

Figura 5.1. Exemplu de fereastră Help – 25 –

Figura 5.2. Exemplu de proiect – 26 –

Figura 6.1. Baza de date a aplicației – 27 –

Figura 6.2. Ecranul de întâmpinare al programului – 29 –

Figura 6.3. Modificare adresă – 31 –

Figura 6.4. Adăugare date corespunzătoare fiecărui apartament – 32 –

Figura 6.5. Defalcare facturi – 34 –

Figura 6.6. Operații în baza de date – 35 –

Figura 6.7. Zona de introducere date – 37 –

Figura 6.8. Tabel cu date extrase – 38 –

Figura 6.9. Introducere facturi – 40 –

Figura 6.10. Afișare cheltuieli lunare – 44 –

Figura 6.11. Design preview afișare – 45 –

Figura 6.12. Panouri cu tabele – 48 –

Figura 6.13. Vizualizare tabel cu cheltuieli – 49 –

Figura 7.1. Fereastra Help – configurare adrese asociații – 51 –

Prezentarea programului

Programul de față își propune să rezolve problema calculului cheltuielilor lunare ale asociațiilor de proprietari. În viața de zi cu zi se constată că calculul acestor cheltuieli este cel mai mare consumator al timpului unui administrator. Aceste calcule se pot face și în programe de calcul tabelar dar la aceste programe le lipsește una din caracteristicile programului și anume faptul că acest program stocând datele într-o bază de date, aceste valori sunt accesibile oricând avem nevoie de ele fără a fi nevoie să salvăm lună de lună toate fișierele generate în cursul acestui proces.

Scopul acestui program este de a ușura generarea de liste pentru cheltuielile lunare, de a memora datele într-o bază de date. Fiind memorate într-o bază de date, ele se pot exporta foarte ușor și pot fi mutate între calculatoare foarte ușor.

De asemenea, aceste baze de date pot să lucreze instalate pe servere care nu este necesar să ruleze pe calculatorul pe care se introduc datele, rezultând o mai mare flexibilitate în lucru deoarece datele pot fi introduse pentru mai multe adrese de mai mulți operatori și deci crește viteza de lucru.

Un alt aspect urmărit în acest program a fost portabilitatea lui pe sisteme de operare diferite, deoarece nu toată lumea folosește sistemul de operare Windows, iar pe sisteme de operare de tip Unix, folosirea programelor scrise pentru Windows se poate face, dar pentru aceasta, trebuie instalate alte programe și astfel se îngreunează procesul de lucru cu ele.

Pentru a rezolva problema portabilității, programul a fost executat folosind ca limbaj de programare Java versiunea 7,care, pentru afișarea tabelelor,folosește framework-ul JasperReports, iar pentru help-ul programului a fost folosit JavaHelp.

Bazele de date folosite sunt cele de tip MYSQL care de asemenea sunt folosite pe mai multe sisteme de operare de la Windows și până la sistemele de tip Unix. De asemenea ele pot fi accesate de pe orice sistem de operare astfel că chiar dacă pe calculatorul de lucru rulează Windows iar pe server rulează Unix utilizatorul nu simte nici o diferență.

Lucrarea de față este structurată pe mai multe capitole care prezintă în prima parte limbajele și tehnicile de programare folosite, iar în partea a doua se prezintă structura programului și modul de lucru a claselor care compun acest program.

Limbajul Java

Limbajul de programare Java este proiectat pentru a răspunde provocărilor de dezvoltare de aplicații în contextul aplicațiilor distribuite la nivelul întregii rețele de date. Una dintre provocări era livrarea sigură de aplicații care consumă un minim de resurse de sistem, să se poate rula pe orice hardware și platformă software, și să poată fi extinsă dinamic.Limbajul de programare Java a apărut ca parte a unui proiect de cercetare pentru a dezvolta software-ul avansat pentru o mare varietate de dispozitive de rețea și sisteme integrate.Scopul a fost de a dezvolta o platformă de operare mică, fiabilă, portabilă, distribuită, care să ruleze în timp real.

Când a început proiectul, limbajul ales a fost C ++, dar în timp, dificultățile întâlnite în C ++ au crescut până în punctul în care problemele pot fi cel mai bine abordate prin crearea unei platforme limbaj complet nouă. Rezultatul este o platformă de limbaj care s-a dovedit a fi ideală pentru dezvoltarea de aplicații end-user sigure, distribuite, bazate pe rețea,în medii variind de la dispozitive de rețea încorporate, la World-Wide Web și pe desktop.

Creșterea masivă a Internetului conduce la un mod cu totul nou de a privi dezvoltarea și distribuția de software. Pentru a supraviețui în lumea comerțului distribuției electronice, tehnologia Java trebuie să permită dezvoltarea de aplicații sigure, de înaltă performanță și extrem de robuste pe mai multe platforme în rețelele eterogene, distribuite.Pentru a supraviețui în această junglă a sistemelor de operare, limbajul de programare Java trebuie să aibă arhitectură neutră, să fie portabil, dinamic și adaptabil.

Sistemul care a apărut pentru a satisface aceste nevoi este simplu, astfel încât să poată fi ușor programat de către majoritatea dezvoltatorilor; familiar, astfel încât dezvoltatorii pot trece cu ușurințăla limbajul de programare Java; orientat obiect, pentru a profita de metodologii moderne de dezvoltare software și pentru a se potrivi în aplicațiile client-server distribuite; multithreaded, de înaltă performanță în aplicații care au nevoie pentru a efectua activități multiple concurente, cum ar fi multimedia; și interpretate, pentru portabilitate maximă și capabilități dinamice.Împreună, cerințele de mai sus cuprind o colecție de cuvinte cheie.

Caracteristicile de bază ale limbajului de programare Java includ un limbaj simplu, care poate fi programat fără o pregătire vastă a programatorului în timp ce este în armonie cu practicile actuale de software. Conceptele fundamentale ale tehnologiei Java sunt prinse repede; programatorii pot fi productivi de la bun început.

Limbajul de programare Java este proiectat pentru a fi orientat obiect de jos în sus. Tehnologia obiect a găsit în cele din urmă drumul său în curentul principal de programare, după o perioadă de gestație de treizeci de ani. Nevoile de sisteme distribuite, bazate client-server,coincide cu încapsularea -mesajele transmise într-un software bazat pe obiecte.

Pentru a funcționa în medii din ce în ce mai complexe, bazate pe rețea, sistemul de programare trebuie să adopte concepte orientate obiect. Tehnologia Java oferă o platformă de dezvoltare curată și eficientă, bazată pe obiect.

Programatorii care folosesc limbajul de programare Java pot accesa bibliotecile existente de obiecte testate care oferă funcționalitate de la tipurile de date de bază, prin intermediul I / O și de rețea și până la interfețe grafice de interfață cu utilizatorul. Aceste biblioteci pot fi extinse pentru a oferi un comportament nou.

Chiar dacă C ++ a fost respins ca un limbaj de punere în aplicare a proiectului, păstrând limbajul de programare Java, arătând ca C ++ pe cât posibil, rezultatul fiind un limbaj familiar, și în același timp eliminarea complexității inutile din C ++. Deoarece păstrează multe dintre caracteristicile orientat-obiect și "look and feel" de C ++, înseamnă că programatorii pot migra cu ușurință la platforma Java și pot fi mai productivi.

Limbajul de programare Java este proiectat pentru crearea de software extrem de fiabil.Acesta oferă control extins în timpul compilării, urmat de un al doilea nivel de verificare în timpul rulării programului.Modelul de management al memoriei este extrem de simplu – obiectele sunt create cu un operator nou.Nu există tipuri pointer explicite definite de programator, nu există aritmetică cu pointeri, și gestionarea memoriei nefolosite se face prin colectarea automată a ”gunoiului”.

Acest model simplu de management al memoriei elimină clase întregi de erori de programare care dau peste cap programatorii de C și C ++.Se poate dezvolta cod Java cu încrederea că sistemul va găsi multe erori rapid și că problemele majore nu vor bloca sistemul după ce codul produs a fost expediat.

Tehnologia Java este proiectată pentru a funcționa în medii distribuite, ceea ce înseamnă că securitatea este de o importanță capitală. Cu caracteristici de securitate concepute în limbaj, cât și în timpul rulării, tehnologia Java vă permite să construiții aplicații care nu pot fi invadate de la exterior.

În mediul de rețea, aplicațiile scrise în limbajul de programare Java sunt protejate de intruziune de cod neautorizat de încercarea de a obține acces în spatele scenei și a crea viruși sau a invada sisteme de fișiere.

Tehnologia Java este concepută pentru a sprijini aplicațiile care vor fi implementate în medii de rețea eterogene.În astfel de medii, aplicațiile trebuie să fie capabile de a se executa pe o varietate de arhitecturi hardware. În cadrul acestei varietate de platforme hardware, aplicațiile trebuie să ruleze pe o varietate de sisteme de operare și să interacționeze cu interfețe a multiplelor limbaje de programare.

Pentru a acomoda diversitatea de medii de operare, produsul Java Compiler TM generează bytecodes – un format intermediar neutru arhitectură proiectat pentru a transporta cod eficient pentru mai multe platforme hardware și software. Tehnologia Java,fiind un limbaj interpretat,rezolvă atât problema de distribuție binară și problema versiunilor – codurile byte ale limbajului de programare Java vor rula pe orice platformă.

În Figura 2.1 se poate vedea modul de compilare și generare a bytecode.

Figura 2.1. Modul de compilare și generare a bytecode

Neutralitatea arhitecturii este doar o parte dintr-un sistem cu adevărat portabil. Tehnologia Java duce portabilitateala un nivel superior prin faptul că este strictă în ceea ce privește definițiile limbajului de bază.Tehnologia Java precizează dimensiunile tipurilor de date de bază și comportamentul operatorilor săi aritmetice. Programele sunt la fel pe orice platformă – nu există incompatibilități între tipurile de date din hardware și software.

Deoarece Java VM este disponibil pe mai multe sisteme de operare diferite, fișierele.class sunt capabile să ruleze pe Microsoft Windows, sistemul de operare Solaris ™ (Solaris OS), Linux sau Mac OS.

Figura 2.2. Disponibilitate pe mai multe sisteme de operare

Platforma neutră din punct de vedere al limbajului și portabilitatea tehnologiei Java este cunoscută sub numele de mașină virtuală Java. Este specificația unei mașini abstracte pentru care compilatoarele limbajului de programare Java poate genera cod.

Mașina virtuală Java se bazează în principal pe specificațiile de interfață POSIX – o definiție standard în industrie de interfață de sistem portabil. Punerea în aplicare a Java Virtual Machine pe noi arhitecturi este o sarcină relativ simplă, atâta timp cât platforma țintă îndeplinește cerințele de bază, cum ar fi suport pentru multithreading.

Performanța este întotdeauna luată în considerație. Platforma Java atinge o performanță superioară, prin adoptarea unui sistem prin care interpretorul poate rula la viteză maximă, fără a fi nevoie pentru a verifica mediul de rulare. Colectorul automat de ”gunoi”rulează ca un fir de fundal cu prioritate redusă, asigurând o mare probabilitate ca memoria să fie disponibilă atunci când este necesar, ceea ce duce la o performanță mai bună.

Aplicații care necesită cantități mari de putere de calcul pot fi proiectate astfel încât secțiunile de calcul intensiv poate fi rescrise în cod mașină nativ după cum este necesar și interfațate cu platforma Java. În general, utilizatorii percep ca aplicațiile interactive să răspundă repede, chiar dacă acestea sunt interpretate.

Interpretorul de Java poate execută Java bytecodes direct de pe orice mașină pe care interpretorul și sistemul au fost portate. Într-o platformă interpretată, cum este un sistem bazat pe tehnologia Java, faza de legare de un program este simplă, incrementală și ușoară. Astfel se beneficiindu-se de cicluri mult mai rapide de dezvoltare – prototipuri, experimentarea și dezvoltarea mai rapidă sunt normale.

Aplicații moderne bazate pe rețea, cum ar fi browser-ul HotJava TM pentru World Wide Web, trebuie să facă mai multe lucruri în același timp.Un utilizator care lucrează cu HotJava Browser poate rula mai multe animații în același timp în timp ce descărcă o imagine și derulează pagina.Capacitatea de multithreading a tehnologiei Java oferă mijloacele de a construi aplicații cu mai multe fire concurente de activitate. Multithreading astfel rezultat are un grad ridicat de interactivitate pentru utilizatorul final.

Platforma Java suportă multithreading la nivelul limbajului, cu adaos de primitive de sincronizare sofisticate: biblioteca limbajului oferă clasa Thread, iar sistemul de run-time oferă monitorizarea și blocarea primitivelor. La nivel de bibliotecă, în plus, bibliotecile de sistem la nivel înalt ale tehnologiei Java au fost scrise pentru a fi sigure la rularea mai multor fire de execuție. Funcționalitatea oferită de către biblioteci este disponibilă fără a genera un conflict între mai multe fire concurente de execuție.

Pentru crearea interfețelor grafice se folosește tehnologia Swing. Această tehnologie face parte din familia produselor Java cunoscută ca Java Foundation Class.

Dintre cele mai folosite componente Swing putem aminti:

JLabel – afișează text sau icoane,

JTextField – permite utilizatorului să introducă date de la tastatură. Poate de asemenea să fie folosit pentru introducerea de text editabil sau needitabil,

JButton – generează un eveniment când este apăsat,

JCheckBox – specifică o opțiune care poate sau nu să fie selectată,

JComboBox – oferă o listă derulantă care permite utilizatorului să selecteze un element sau chiar să scrie direct în căsuța de editare,

JList – oferă o listă de elemente de la care utilizatorul poate face o selecție, făcând clic pe orice element din listă. Oferă posibilitatea de a selecta elemente multiple,

JPanel – oferă o zonă care componentele pot fi introduse și organizate. Poate fi de asemenea folosită ca o zonă de desen pentru grafică.

În momentul de față există două seturi de componente grafice în Java. Înainte de Swing care a fost introdus în Java 2 interfața grafică se construia folosind componente din Abstract Window Toolkit (AWT).

Principala problemă apărea atunci când o aplicație Java cu o interfață grafică AWT se executa pe diferite platforme Java și componentele GUI ale aplicației se afișau diferit pe fiecare platformă.

De exemplu să luăm o aplicație care afișează un obiect de tip Button (pachetul java.awt). Pe un calculator pe care rulează sistemul de operare Microsoft Windows, butonul va avea același aspect ca și butoanele din alte aplicații Windows. În mod similar, pe un calculator care rulează sistemul de operare Apple Mac OS X, butonul va avea același aspect ca butoanele din alte aplicații Macintosh. Uneori, modul în care un utilizator poate interacționa cu o anumită componentă AWT poate să difere între platforme.

În schimb componentele Swing ne permit să folosim același aspect indiferent de sistemul de operare folosit. De asemenea aspectul componentelor vizuale se poate schimba în timpul funcționării programului.

Comparând cele două implementări putem să evidențiem următoarele avantaje și dezavantaje între cele clase de componente:

AWT

Avantaje

Viteza de execuție,

Datorită faptului că folosește componente ale sistemului de operare arată similar cu alte aplicații .

Dezavantaje

Portabilitate redusă datorită faptului că se folosesc componente ale sistemului de operare,

Oferă doar un număr redus de componente vizuale.

Swing

Avantaje

Portabilitatea deoarece sunt implementate în Java,

Oferă o gama largă de componente,

Componentele adoptă stilul sistemul de operare.

Dezavantaje

Viteză mai mică față de componentele AWT datorită faptului că nu folosește API-ul sistemului de operare,

Componentele pot fi ușor diferite față de cele ale sistemului de operare.

Interfața vizuală din acest program a fost creată folosind componentele Swing care au fost integrate în diferite JPanel-uri pentru a crea diverse moduri de afișare.

Pe lângă diversele avantaje ale limbajului Java el prezintă și unele mici bug-uri care în unele cazuri pot să îngreuneze dezvoltarea unor aplicații.

Una din problemele care a apărut a fost legată de backup-ul bazei de date din Java. Backup-ul se face folosind utilitarul mysqldump din cadrul serverului MySQL. A fost folosită această metodă deoarece fișierul rezultat poate fi folosit și independent pentru restaurarea bazelor de date deoarece este un fișier care conține comenzi SQL.

Problema este datorată unui bug din Java care nu permite rularea programelor care conțin în linia de comandă parametri despărțiți prin spațiu. Pentru a putea totuși folosi această metodă s-a folosit un artificiu și anume la momentul backup-ului se creează un fișier temporar care după rulare este șters. Fișierul conține comenzile necesare pentru crearea fișierul de backup.

Comanda este creată din un șir predefinit care conține apelarea programului mysqldump la care se adaugă calea unde se salvează fișierul. După ce șirul este creat se salvează în fișierul temporar. Fișierul astfel creat nu conține spatii și nici parametri în numele lui deci poate fi rulat de către Java fără probleme.

Rularea fișierului se face cu ajutorul clasei Runtime care se găsește în JDK-ul Java. Codul care realizează această operație se găsește mai jos:

Runtime runtime = Runtime.getRuntime();

p = runtime.exec("backup.bat");

processComplete = p.waitFor();

if (processComplete == 0) {

file.delete(); }

Această secvență de cod trebuie introdusă între o secvență de cod try-catch pentru a trata eventualele excepții ce pot apărea. După cum se vede în secvența de cod dacă codul de ieșire este 0 atunci se consideră că operațiunea a avut succes și se șterge fișierul creat. În cazul unei erori se afișează un mesaj de eroare prin care utilizatorul este anunțat de eroare.

Din păcate această metodă limitează folosirea programului doar la sistemului de operare Windows dar cu mici modificări poate fi făcut să ruleze și în mediul Unix.

În cazul în care fișierul trebuie comprimat este folosită clasa ZIP existentă de asemenea în JDK-ul Java. Fișierul SQL generat cum s-a văzut mai sus este preluat și comprimat folosind o secvență de cod clasică după care fișierul SQL este șters, singurul fișier care rămâne fiind fișierul arhivă.

Aceeași metodă este folosită și pentru restaurarea datelor din baza de date. De această dată se folosește o comandă a serverului de MySQL și anume:

”/bin/MySQL -u root –password= data<”

La acest șir se mai adaugă numele fișierului primit de la clasa Backupfrm după apăsarea butonului de restaurare.

Salvarea se face în format SQL dar există posibilitatea de a salva datele și în format xml și csv cu mici modificări în codul sursă. Pentru salvarea datelor în format xml se poate folosi tot utilitarul mysqldump deoarece are posibilitatea de salvare a datelor și în acest format.

Pentru salvarea în format xml se mai poate folosi și o bibliotecă externă care realizează această operațiune. Dacă se implementează și cele două moduri de salvare atunci la metodele de restaurare trebuie adăugate și metode pentru citirea datelor din acest format.

Bazele de date MySQL

Pentru implementarea bazelor de date în această lucrare s-au folosit bazele de date de tip MySQL. MySQL este un sistem de gestiune a bazelor de date relațional (SGBD). Deși se folosește foarte des împreună cu limbajul PHP se pot totuși crea aplicații folosind orice limbaj de programare major.

Prin Bază de date (BD) se înțelege o colecție de informații stocate pe calculator astfel încât să poată fi accesate, modificate sau șterse. Sistemul de gestiune a bazelor de date (SGBD) este un software care realizează interfața între sistemul de operare al calculatorului și beneficiarul care solicită informații din BD.Cele mai importante funcții ale SGBD sunt:

stocarea, regăsirea și actualizarea datelor din BD – utilizatorul poate crea consulta și manipula informațiile;

crearea și întreținerea dicționarului de date (catalogul de sistem);

facilitează accesul simultan al mai multor utilizatori la BD;

păstrarea unor copii de siguranță (back-up) și recuperarea datelor în cazul căderii sistemului;

securizarea datelor prin parolarea accesului utilizatorilor și gestiunea drepturilor de intervenție în BD.

MySQL vine cu tot ce este necesar pentru a instala programul, crea diferite nivele de acces ale utilizatorilor, administrarea sistemului, siguranță și back-up a datelor. Se pot dezvolta aplicații de baze de date, în cele mai multe limbaje de programare folosite astăzi și care să ruleze pe majoritatea sistemelor de operare.

MySQL utilizează Structured Query Language (SQL), limbajul folosit de către toate bazele de date relaționale. SQL vă permite să creați baze de date, precum și a adăuga, manipula, și de a prelua datele în funcție de criterii specifice. Cel mai simplu mod de a înțelege o bază de date este o colecție de fișiere legate.

O bază de date și software-ul care controlează baza de date, numit un sistem de management al bazelor de date (SGBD), ajută cu acest tip de sarcină. Cele mai multe baze de date de astăzi sunt baze de date relaționale, numite astfel pentru că ele conțin tabele de date legate între ele de un câmp comun.

Tabele dintr-o bază de date sunt organizate după cum urmează:

Fiecare tabel este format din mai multe rânduri și coloane,

Fiecare rând conține date despre o singură entitate (cum ar fi un produs sau o comandă). Aceasta se numește o înregistrare,

Fiecare coloană (de asemenea, numită și tuplă) conține o bucată de date care se referă la înregistrare.

MySQL poate fi rulat local sau poate fi instalat pe un server iar programele care folosesc bazele de date se conectează la acel server. Pentru a instala pe calculator serverul de MYSQL, se folosesc mai multe metode de instalare. Acest server se poate instala folosind doar fișierele descărcate de pe site-ul producătorului sau folosind programe ajutătoare care instalează tot ce este necesar pentru rularea serverului.

Aceste programe sunt XAMPP și WAMPSERVER. În cazul de față a fost folosit programul XAMPP. Acest program sau mai bine zis pachet de programe conține pe lângă un server MYSQL și un server APACHE necesar rulării interfeței web a serverului precum și alte programe care nu sunt necesare rulării programului descris în această lucrare.

După instalarea programului se folosește un panou de control din care se poate seta ca serverul de MYSQL și serverul APACHE să pornească odată cu sistemul de operare sau se pot porni manual ori de câte ori este nevoie după cum se vede în figura 3.1.

În figura 3.1 cele două servere au fost programate pentru a porni odată cu sistemul de operare. Chiar dacă sunt pornite manual, după pornire, panoul de control trebuie să afișeze ceva asemănător cu figura 3.1.

Figura 3.1. Pornire server Apache și MySQL

Odată cu instalarea serverului de MYSQL se mai instalează și o interfață web care poate fi accesată din orice browser pentru a putea lucra cu serverul.

Această interfață este scrisă în php și se poate accesa introducând în linia de adrese a browserului adresa serverului MYSQL. Această adresă depinde de felul cum este instalat serverul care poate fi instalat local sau în rețea.

Instalarea locală înseamnă că pe calculatorul utilizatorului se află și serverul de baze de date iar la instalarea în rețea serverul de baze da date poate să fie instalat oriunde în rețea.

Pentru instalarea locală, adresa serverului de MYSQL este de forma http://localhost/phpmyadmin iar pentru instalarea în rețea se înlocuiește localhost cu adresa IP a serverului. După introducerea adresei, dacă totul este în regulă, ne conectăm la baza de date de unde putem să facem toate operațiile necesare.

La pornirea pentru prima oară a serverului parola implicită este root iar utilizatorul implicit este de asemenea root. Se recomandă schimbarea acestor valori cu altele pentru o siguranță mai mare a datelor.

După conectarea la serverul de MySQL se poate trece la crearea bazei de date precum și la crearea tabelelor ce formează baza de date cu care vom lucra. Pentru a crea baza de date din fereastra principală a programului phpmyadmin se selectează tab-ul SQL și folosind comanda CREATE DATABASE nume_database se creează o bază de date. După crearea bazei de date se poate trece la crearea tabelelor ce vor conține datele. Tabelele se creează tot folosind limbajul SQL cu sintaxa CREATE TABLE urmată de numele tabelului și toate câmpurile de care avem nevoie.

Tabele din baza de date pot să conțină diverse tipuri de date în funcție de ce avem nevoie. Astfel câmpurile tabelei pot să conțină date de tip întreg, zecimal, șir de caractere, date logice, dată și timp precum și date de tip blob.

După ce tabele de date au fost create se pot introduce în ele datele manual sau se pot importa din fișiere text care trebuie să fie de tip CSV sau care să conțină comenzi SQL.

După crearea tabelelor și eventual introducerea datelor în ele este bine să se creeze o salvare de siguranță. Pentru realizarea salvărilor de siguranță se folosește programul mysqldump.Acest program exportă baza de date ca o succesiune de comenzi SQL care apoi sunt folosite pentru a recrea și popula cu date noua bază de date. Această metodă se folosește și pentru a exporta bazele de date pe sisteme diferite. Trebuie ținut cont de faptul ca nu toate sistemele suportă aceleași caracteristici SQL. Comanda mysqldump se folosește cu următoarele opțiuni:

–add-locks:plasează o declarație LOCK TABLES înainte, și o declarație TABLE UNLOCK după, fiecare salvare a tabelelor.

– add-drop-table: adaugă o declarație DROP TABLE înainte de fiecare CREATE TABLE. Dacă tabelul există deja, poate interfera cu restaurarea, astfel încât prin aceasta declarație se asigură că tabela nu mai există.

–no-create-info: nu se include CREATE TABLE, astfel încât se presupune că există deja tabelele care se restaurează.

Rezultatul rulării acestei comenzi este un fișier care conține toate date extrase din tabele conținute în baza de date pe care dorim să o salvăm. Fișierul astfel rezultat se poate importa foarte ușor în baza de date rezultând un sistem de salvare a datelor simplu și rapid.

Interfața pentru accesarea bazelor de date relaționale din Java este Java Database Connectivity (JDBC). Prin intermediul JDBC se poate crea o conexiune la baza de date, se pot realiza interogări de baze de date și să se actualizeze precum și extragerea rezultatelor.JDBC oferă o interfață care ne permite efectuarea operațiunilor SQL independent de instanța bazei de date utilizate.

Pentru a utiliza JDBC, este nevoie de folosirea driverului specific fiecărei baze de date. Pentru a ne conecta la MySQL din Java, va trebui să utilizăm driver-ul JDBC de la MySQL. Driverul MySQL JDBC este numit MySQL Connector / J.

În această aplicație baza de date a fost implementată folosind opt tabele care conțin toate datele necesare rulării programului. Fiecare tabel conține datele necesare unei anumite parți a programului. În funcție de necesități, tabelele au fost legate între ele cu ajutorul indecșilor. Organizarea tabelelor în baza de date este prezentată în cele ce urmează:

Tabelul adresa conține următoarele câmpuri:

Tabelul apart conține următoarele câmpuri:

Tabelul date_luna conține următoarele câmpuri:

Tabelul defalcare conține următoarele câmpuri:

Tabelul facturi conține următoarele câmpuri:

Tabelul furnizori conține următoarele câmpuri:

Tabelul afisare conține următoarele câmpuri:

Tabelul adresa conține următoarele câmpuri:

După cum se poate observa din tabelele de mai sus, tabelele adresa,apart,date_luna și facturi au câte un câmp comun și anume idstrada. Cu ajutorul acestui câmp aceste tabele sunt legate între ele. De asemenea tabelele apart și date_luna mai sunt legate între ele prin intermediul câmpului id_apart. Aceste câmpuri sunt la rândul lor indexate pentru a crește viteza de lucru în operații în care se folosesc legăturii de tip JOIN.

Tabelul afisare este un tabel de sine stătător. El nu este legat de nici un alt tabel din baza de date. Acest tabel a fost creat pentru a fi folosit la crearea rapoartelor, iar datele din el sunt introduse doar în momentul în care se dorește afișarea unei liste.

Pentru lucrul cu baza de date se folosesc diferite comenzi SQL care operează asupra datelor din tabele, executând operațiile de introducere date, extragerea datelor, reîmprospătarea datelor precum și ștergerea datelor.

Aceste comenzi sunt grupate în:

Instrucțiuni de definire a datelor,

Instrucțiuni de manipulare a datelor,

Instrucțiuni de selecție a datelor.

Dintre instrucțiunile de definire a datelor putem să amintim instrucțiunile care sunt folosite la crearea bazelor de date, la crearea tabelelor, adăugarea de câmpuri noi la o tabelă, ștergerea unei tabele precum și ștergerea unei bazei de date.

Instrucțiunile de manipulare a datelor sunt cele cu care modificăm datele din tabelele din baza de date. Dintre ele putem să amintim instrucțiunile de inserare a datelor în table,cele de modificare a valorilor din celulele tabelelor precum și instrucțiunile de ștergere a datelor din tabele.

Cele mai importante sunt instrucțiunile de selecție a datelor din tabele. Aceste instrucțiuni sunt construite în jurul instrucțiunii SELECT care este folosită împreună cu diverse clauze.

Această comandă se folosește pentru extragerea datelor din baza de date înfuncție de parametrii comenzii. Sintaxa acestei comenzi este:

SELECT nume_coloană(s)FROM nume_tabel

Următoarea comandă care se folosește este INSERT. Această comandă se folosește pentru a introduce înregistrări noi în tabelele din baza de date. Sintaxa comenzii este:

INSERT INTO nume_tabel (coloana1, coloana2, coloana3,…)
VALUES (valoare1, valoare2, valoare3,…)

Pentru modificare valorilor din bazele de date se folosește comanda UPDATE. Sintaxa comenzi este

UPDATEnume_tabel
SET coloana1=valoare1,coloana2=valoare2,…
WHERE coloana_oarecare=valoare;

Clauza WHERE din comanda poate să lipsească dar atunci toate înregistrările din baza de date se vor modifica.

Tot în cadrul programului se folosesc comenzi de creare a bazei de date precum și comenzi de creare a tabelelor din cadrul bazei de date.

Framework-ul JasperReports

JasperReports este un program open-source de generare a rapoartelor din bazele de date, care poate exporta datele de ieșire în fișiere PDF, HTML, EXCEL, CSV, RTF, ODF sau XML. De asemenea rapoartele pot fi afișate pe ecran sau listate la imprimantă.

Acest program poate fi integrat în orice aplicație Java.Rapoartele JasperReports sunt definite într-un fișier XML, denumit JRXML, care poate fi codat manual sau generat, folosind programe auxiliare. În cazul de față fișierele JRXML au fost generate folosind programul iReport care este un program de grafică open-source, și care oferă capabilități de designer de rapoarte și este capabil să ruleze rapoartele generate folosind sursele de date folosite de JasperReports. De asemenea iReport poate compila fișierele JRXML generând fișiere jasper, fișiere care sunt rulate mai repede la generarea rapoartelor deoarece nu mai trebuie procesate de clasa JasperCompileManager.

În plus față de date de tip text, JasperReports este capabil să genereze rapoarte profesionale, inclusiv imagini, diagrame și grafice. Unele dintre caracteristicile majore ale JasperReports includ:

Aspectul raportului este flexibil,

Este capabil de prezentare a datelor textual sau grafic,

Permite dezvoltatorilor de software să furnizeze datele în mai multe moduri,

Acceptă date de la mai multe baze de date,

Poate genera watermark-uri în rapoarte,

Poate genera sub-rapoarte,

Este capabil de a exporta rapoarte într-o varietate de formate.

Rapoartele create permit împărțirea în mai multe zone independente pentru afișarea datelor. Aceste secțiuni sunt:

Titlu care apare o singură dată în partea de sus a raportului,

Antetul care apare în partea de sus a fiecăreia pagini a raportului,

Detaliul care de obicei conține partea de date a raportului,

Subsolul paginii care apare în partea de jos a fiecărei pagini a raportului,

Sumarul care apare pe ultima pagină a raportului generat.

De asemenea există posibilitatea de a defini propriile secțiuni de date ale raportului, datele existente pot fi grupate în secțiuni logice. Gruparea datelor poate fi folosită pentru calcularea sub-totalurilor și pentru crearea seturilor de date pentru afișarea graficelor și diagramelor.

JasperReportsoferă posibilitatea de a afișa datele din rapoarte textual sau grafic cu ajutorul diagramelor. JasperReports ne permite să folosim expresii pentru a genera rapoarte care afișează date dinamice. În acest fel datele nu sunt trimise direct la raport sau stocate în variabile, dar se calculează pe baza datelor conținute în baza de date și / sau parametri raportului.

JasperReports permite dezvoltatorilor de software să transmită datele la un raport ca și parametri. Parametri pot să fie orice instanța a oricărei clase Java. Datele pot fi trimise către raport folosind clasele speciale numite datasource. Aceste clase pot fi combinate cu parametri raportului pentru maximum de flexibilitate.

JasperReports poate genera rapoarte folosind orice bază de date relațională suportată de JDBC. Totuși nu este limitat doar la rapoarte din bazele de date. El poate genera rapoarte din fișiere XML, orice clasă care implementează java.util.Map sau orice clasă care implementează interfața javax.swing.TableModel.

JasperReports este capabil să genereze imagini de fundal sau text în rapoarte. Aceste fundaluri pot fi folosite pentru a marca rapoartele pentru a fi mai greu de falsificat sau pentru a imprima eventual numele firmei în fundalul raportului. Toate paginile raportului vor avea aceeași imagine de fundal.

Rapoartele generate de JasperReports pot fi exportate într-o varietate de formate incluzând PDF, XLS( Excel ), RTF, un format editabil de majoritatea editoarelor de texte, HTML, XML, CSV sau text simplu.

Setările dintr-un raport sunt definite folosind formule, cum ar fi condițiile pentru a ascunde un element, calculele speciale sau prelucrările de text care necesită unele cunoștințe ale unui limbaj de scripting. Formulele pot fi scrise în trei limbaje de programare, dintre care două (JavaScript și Groovy) pot fi folosite fără cunoașterea metodelor de programare. Toate formulele din JasperReports sunt definite prin expresii.

Limbajul folosit pentru scrierea expresiilor este Java dar dacă cel care folosește acest framework nu este programator este recomandat să se folosească JavaScript sau Groovy. Limbajul folosit este o proprietate a documentului astfel pentru a se stabili limbajul folosit în cadrul raportului se selectează nodul rădăcină din document și se selectează limbajul dorit.

O expresie este o formulă care lucrează cu anumite valori și returnează un rezultat, exact ca o formulă într-o celulă de calcul tabelar. O celulă poate
avea o valoare simplă sau poate conține o formulă complexă, care se referă la alte valori.

De asemenea rapoartele permit inserarea de cod Java care extind funcționalitatea rapoartelor prin executarea de comenzi complexe, calcule asupra celulelor din baza de date. Aceste bucăți de cod poartă numele de scriplet.

Aceste scriplet-uri sunt executate de către raport în anumite momente bine definite cum ar fi:

Înainte de inițializarea raportului,

După inițializarea raportului,

Înainte sau după fiecare inițializare a paginii,

Înainte sau după fiecare inițializare a coloanelor raportului,

Înainte sau după fiecare evaluare a unei înregistrări din baza de date care se află în partea de detalii a raportului.

De asemenea aceste scriplet-uri pot accesa variabilele și parametrii unui raport precum și datele din raport. Astfel putem să modificăm dinamic anumite date din raport în funcție de nevoile programului care folosește raportul.

O altă facilitate a rapoartelor este de a putea folosi caracteristicile limbajului Java de internaționalizare și a genera rapoartele în diferite limbi în funcție de setările calculatorului pe care rulează programul.

Totuși pentru folosirea acestei facilități în cadrul raportului trebuie să fie prezente fișierele cu textele în limbile în care vrem să fie afișate rapoartele, altfel raportul nu va ști care traducere să o folosească.

Altă facilitate a rapoartelor este posibilitatea de a introduce hyperlink-uri și ancore pentru a putea naviga mai ușor prin raport. De asemenea la exportarea unui raport în format PDF se pot genera bookmarks-uri care apar în fișierul PDF în cuprinsul raportului.

Diagrama de generare a unui raport esteprezentată în Figura 4.1:

Figura 4.1. Diagrama de generare a unui raport

Pentru a putea folosi acest framework în aplicația realizată toate clasele necesare pentru rularea lui se pot descărca de la adresa http://sourceforge.net/projects/jasperreports/. Putem adăuga cu ușurință capabilități de raportare aplicațiilor Java, profitând de clasele incluse în biblioteca JasperReports. JasperReports poate fi ușor integrat atât în aplicațiile de tip client cât și cele de tip server, pur și simplu prin adăugarea bibliotecile necesare și apelarea metodelor necesare din API –ul JasperReports. Pentru a putea rula acest framework mai avem de asemenea nevoie de următoarele biblioteci:

Jakarta Commons Digester,

Jakarta Commons Collections,

Jakarta Commons Logging,

Jakarta Commons BeanUtils.

După instalarea tuturor bibliotecilor necesare se poate trece la crearea șabloanelor rapoartelor necesare. Există două moduri pentru a crea șabloanele rapoartelor:

Crearea directă folosind API-ul disponibil.

Editând fișierele JRXML cu o unealtă specializată GUI, cu un editor de texte simplusau un editor XML.

Prima opțiune se recomandă numai în cazul în care aplicația utilizează JasperReports pentru a crea formatele de raport în momentul execuției. În majoritatea cazurilor nu este nevoie de această operație deoarece formatele de raport nu au nevoie de modificări la fiecare execuție de umplere a raportului. Doar informațiile cu care vor fi umplute aceste rapoarte sunt generate dinamic. Există cazuri când formatul de raport real este rezultatul unor date primite de la utilizator. În cazurile acestea, aranjamentul raportului real nu este complet la momentul proiectării și poate numai să fie pus împreună după introducerea datelor de către utilizator.

Opțiunea a doua pentru creare șabloanelor de raport este editarea fișierelor JRXML și utilizarea acestora împreună cu biblioteca JasperCompileManager(), pregătindu-le pentru conectarea cu bazele de date.

Există două metode pentru a genera rapoarte din bazele de date. Una din metode este de a încorpora interogarea SQL în cadrul șablonului,iar cealaltă prin trecerea datelor din baza de date la raport folosind datasource.

Un raport este definit prin intermediul unei pagini. Această pagină este împărțită în diferite porțiuni orizontale numite "benzi". Aceste benzi pot să fie toate prezente în raport sau anumite benzi să nu fie prezente în funcție de opțiunea programatorului.

Raportul folosit în această aplicație folosește doar două benzi pentru afișarea datelor. În banda superioară se afișează datele care apar doar o dată iar în banda detaliu se afișează datele pentru fiecare înregistrare din baza de date.

În cadrul aplicației descrise în această lucrare programul folosit pentru generarea șabloanelor pentru rapoartele folosite se numește iReport. Acest soft este un mediu vizual de generare a șabloanelor necesare pentru generarea rapoartelor folosite de aplicație.

Fereastra principală a aplicațieivizuale este prezentată în figura 4.2.

Figura 4.2. Fereasta principală a aplicației

După cum se vede în figura de mai sus ecranul principal al aplicație este împărțit în trei zone. În partea dreaptă se află o fereastră cu componentele principale ale raportului, în partea din mijloc se află reprezentarea vizuală a raportului propriu zis, iar în partea stângă se află o fereastră cu toate tipurile de elemente ce pot fi inserate în raport precum și proprietățile lor.

Într-un raport pot fi inserate nouă elemente de bază după cum urmează:

Linie,

Dreptunghi,

Elipsă,

Text static,

Text dinamic,

Imagine,

Cadru,

Sub-raport,

Raport încrucișat,

Grafic,

Pauză.

Prin combinația acestor elemente, este posibil să se producă orice fel de raport.Toate elementele au proprietăți comune, cum ar fi înălțimea, lățimea, poziția, și banda din care fac parte. Elementele sunt inserate în benzi, și fiecare element este asociat indisolubil cu banda din care face parte. Dacă un element nu este complet conținut în banda din care aceasta face parte în cadrul raportului, compilatorul va returna un mesaj care vă informează despre poziția
elementului. Raportul va fi întocmit cu toate că prezintă o eroare, iar elementele greșit poziționate nu vor fi afișate.

În aplicația descrisă în această lucrare raportul generat are doar două benzi în care se afișează. Astfel există banda de titlu și banda de detalii. În banda de titlu există doi parametri în care se vor primi datele din program și care conțin luna pentru care se creează tabelul și adresa pentru care este creat tabelul.

În banda de detalii este inserat un tabel care va conține datele de afișat în fiecare lună. Datele sunt extrase folosind proprietatea rapoartelor de a conține interogări SQL încorporate. Astfel, la apelarea raportului, se execută interogarea SQL și datele sunt introduse în tabel. De asemenea în tabel mai există două celule care se calculează din datele din celelalte celule.

Tabelul din banda de detalii va avea atâtea rânduri câte rânduri de date se citesc din tabelul din care se citesc datele.

Aspectul raportului poate fi setat la crearea lui prin setarea mărimii paginii pe care se va imprima raportul, prin setarea orientării paginii, prin setarea mărimii caracterelor folosite.

Framework-ul JavaHelp

Pentru crearea sistemului de help asociat aplicației a fost folosit sistemul JavaHelp. Sistemul JavaHelp oferă dezvoltatorilor de programe un sistem, ușor de utilizat, cu funcții complete, pentru prezentarea de informații on-line pentru utilizatorii de aplicații Java.

În plus, sistemul JavaHelp a fost proiectat pentru a funcționa bine în special într-o varietate de medii de rețea. Sistemul JavaHelp este independent de platformă și funcționează în toate browserele care acceptă platforma Java.

Afișarea conținutului se face în trei tipuri de ferestre care se pot configura de către programator. Aceste ferestre sunt:

Fereastra principală,

Fereastra secundară,

Fereastra de tip pop-up.

Fereastra principală a sistemului de JavaHelp standard are trei panouri, nu este distrusă atunci când ieșiți din fereastra, și este configurabilă. Din construcție fereastra principală are următoarele panouri:

Bara de unelte care poate fi configurată pentru a conține diverse butoane cum ar fi Înainte,Înapoi,Print

Panoul de navigare care este o interfață cu tab-uri care apar pe partea stângă, și care permite utilizatorilor să comute între cuprins, index și afișareacăutării

Panoul de conținut care este afișat în partea dreaptă și care afișează topicul dorit în format HTML 3.2

Fereastra secundară în mod implicit această fereastră conține un singur panou, în care se vizualizează conținutul topicului selectat. Este similar cu panoul de conținut din fereastra principală.

O fereastră secundară are un nume și poate fi configurată pentru a avea un panou de navigare și o bară de instrumente.În cazul în care fereastra este deja deschisă, conținutul său este înlocuitde programul Java care o deschide și o folosește din nou. Atunci când utilizatorul închide o fereastră secundară, acesta este distrusă (spre deosebire de fereastra principală, care nu este distrusă la ieșire).

Fereastra de tip pop-up rămâne deschisă atât timp cât aceasta este în prim plan. Atunci când utilizatorul face un clic în altă parte, fereastra este distrusă. Un pop-up are un singur panou și anume un vizualizator de conținut.

În figura 5.1 se află un exemplu de fereastră de help cu toate cele trei panouri.

Figura 5.1. Exemplu de fereastră Help

Pentru a crea un sistem de help pentru o aplicație trebuie urmați următorii pași:

Crearea topicurilor HTML,

Crearea unui fișier helpset,

Crearea unui fișier hartă,

Crearea unui fișier de tip cuprins,

Crearea unui fișier de index,

Crearea unei baze de date de căutare full-text,

Comprimarea și încapsularea fișierelor de ajutor într-un fișier JAR pentru livrare.

Dacă pentru crearea fișierului de help se folosesc programe specializate, o parte din cele expuse mai sus sunt rezolvate de către programele respective. Unul din programele folosite pentru a crea fișiere de necesare este și helpsetmaker care este un program scris în Java și care creează fișierele necesare implementării acestui sistem de help.

În acest program fișierele de help se scriu folosind un limbaj propriu denumit STML – care permite scrierea aproape ca un fișier text pe care programul îl transformă în conținut HTML. Acest limbaj permite inserarea de imagini, adrese WWW, precum și formatarea lui în paragrafe.

De asemenea conținutul fișierul de help poate fi modificat cu ajutorul fișierului de tip css în care se pot defini stilurile grafice pentru fiecare tag folosit în parte.

Un proiect deschis în acest program arată ca în figura 5.2.

Figura 5.2. Exemplu de proiect

Astfel, în panoul din mijloc se scrie textul dorit precum și comenzile de inserare a imaginilor, iar în partea din dreapta apare textul așa cum va fi compilat în fișierul de help.

În panoul din stânga sunt afișate toate fișierele care formează fișierul de help precum și starea legăturilor dintre fișiere. Pentru a putea prelua imaginile în cadrul proiectului acestea trebuie salvate într-un director separat care trebuie declarat în program în partea de Image Library .

După ce au fost declarate imaginile pot fi accesate doar prin nume și programul le inserează automat în fișier.

Pentru a putea fi folosit ca și help, acest proiect trebuie să fie exportat într-un format care poate fi folosit de programele Java. Aceste formate sunt cele de tip helpset, formatul HTML sau se poate opta pentru exportul fișierului în format jar, format care poate fi inclus în orice program Java.

În această aplicație formatul ales a fost cel de tip jar deoarece fiind încorporat în corpul programului nu mai este nevoie să fie livrat ca un fișier separat.

Prezentarea aplicației

Aplicația a fost realizată folosind Java JDK 7 și MySQL 5.5. Pentru rularea aplicației mai este nevoie de niște biblioteci suplimentare care sunt necesare pentru conexiunea programului cu baza de date, pentru afișarea listelor, pentru afișarea topicului de help precum și pentru modificare aspectului ferestrelor.

Pentru salvarea datelor necesare programului a fost creată o bază de date care poate fi stocată local sau pe un server.

Baza de date conține 8 tabele care stochează toate datele necesare programului. Din cele 8 tabele 7 sunt folosite pentru datele utilizatorului iar una este folosită pentru afișarea listelor lunare ale asociațiilor.

Figura 6.1. Baza de date a aplicației

Cele 8 tabele sunt după cum urmează:

adresa : folosit pentru stocarea adreselor asociațiilor,

apart : folosit pentru stocarea datelor aferente apartamentelor,

date_luna : folosit pentru stocarea datelor care se modifica lunar la fiecare apartament,

facturi : folosit pentru stocarea facturilor lunare pentru fiecare asociație în parte,

defalcare : folosit pentru stocarea modului de defalcare a facturilor lunare pentru fiecare asociație în parte,

furnizori : folosit pentru stocarea denumirilor furnizorilor de servicii specifice asociațiilor de locatari,

nivel : stochează valorile posibile ale etajelor sau scărilor de bloc aferente adreselor,

afisare : acest tabel se folosește de către partea de afișare a programului.

În figura 6.1sunt prezentatetabelele din baza de date, precum și legăturile dintre ele.

Programul principal este împărțit în mai multe clase care împreună execută toate comenzile primite de la utilizator și afișează pe ecran rezultatele procesării datelor.

Legătura dintre programul principal și baza de date se face prin clasa conect. Aceasta clasa este publică astfel încât accesul la ea se poate face fără să fie instanțiată. Clasa conect este compusă din doua metode. Una din metode se ocupă de conectarea efectivă la baza de date, iar cea de a doua metodă este folosită la începerea programului pentru inițializarea bazei de date.

Astfel la pornirea programului se apelează procedura Init_Dbmysql care verifică dacă există conexiune cu serverul de MySQL. În cazul în care serverul nu este pornit programul afișează un mesaj de eroare și se încheie execuția. Dacă serverul este pornit metoda verifică dacă baza de date este prezentă. În cazul în care baza de date nu există, se folosește un fișier extern care se găsește în directorul de bază al programului și se creează baza de date împreună cu toate tabelele aferente.

Pentru conectarea efectivă la baza de date din program se folosește metoda conectDbmysql. Metoda este de asemenea publică. Metoda returnează un obiect de tip Connection care este folosit pentru execuția comenzilor SQL. Conectarea la baza de date se face folosind utilizatorul root fără parolă. Acest lucru face ca securitatea datelor să fie scăzută dar ținând cont de faptul că programul a fost gândit să ruleze local nu este o problemă deosebită.

La pornirea programului, după apelarea proceduri de inițializare a bazei de date, programul așteaptă comenzi de la utilizator.

Figura 6.2. Ecranul de întâmpinare al programului

Programul este compus dintr-o clasă principală care se ocupă de managementul celorlalte ferestre, aplicația fiind de tipul MDI. Fereastra principala a programului este de tip JFrame și conține o bară de meniu și un panou de tip JDesktopPane. În panou se afișează toate celelalte ferestre ale programului.

Pentru managementul ferestrelor se folosește eventul de tip internalFrameClosed care este tratat de o metodă a ferestrei principale. Această metodă eliberează resursele folosite de fereastra care a generat eventul. Fereastra principala gestionează celelalte ferestre ale programului astfel încât nu se permite crearea unei ferestre de două ori.

Acest lucru se face prin verificarea existenței unei ferestre la apăsarea unei comenzi din meniu. Dacă se constată că fereastra există, se aduce în prim plan, în caz contrar se creează.

În fereastra principala mai există, după cum se vede în figura 6.2. un JMenuBar care conține toate comenzile necesare pentru crearea ferestrelor care compun programul și activarea funcțiilor programului.

Fiecare metodă care creează o fereastră calculează poziția unde apare fereastra și în funcție de dimensiunile ferestrei o poziționează în centrul ferestrei principale a programului. După ce fereastra a fost afișată pe ecran controlul este trecut acesteia până la închiderea acesteia sau până se deschide altă fereastră.

Meniul este compus din 3 comenzi principale care la rândul lor sunt compuse din mai multe subcomenzi în funcție de secțiunea din program pe care o accesează.

Comenzile din bara de meniu sunt după cum urmează:

Configurare

Adresa

Asociatie,

Apartamente,

Facturi.

Baza de date

Ieșire

Operații

Introducere date,

Introducere facturi,

Afisare cheltuieli.

Ajutor

Continut,

Despre.

Configurare

Partea de configurare a programului este compusă din:

configurarea asociațiilor de locatari care presupune adăugarea/editarea/ștergerea adreselor,datelor despre apartamente,

modificarea modului de defalcare a cheltuielilor pentru fiecare furnizor în parte,

backup-ul, respectiv restaurarea datelor din baza de date.

De asemenea în meniul configurare a fost introdusă și o comandă de ieșire din program.

Configurarea adreselor

Partea de configurare a adreselor este compusă din două clase:

Adresa_class.java,

Adresafrm.java .

Clasa Adresafrm.java este cea care conține codul care se ocupă de crearea ferestrei în care se introduc datele necesare pentru adresele asociațiilor de locatari. După cum se observă din figura 6.3 fereastra este formată dintr-o parte de afișare formată dintr-un JTable cu 2 coloane și o parte de editare formată dintr-un un câmp JTextField și trei butoane care execută următoarele acțiuni:

Adăugare adresa,

Modificare adresa,

Ștergere adresa.

Pentru adăugarea unei adrese noi se va scrie adresa în câmpul de editare după care se apăsa pe butonul Adauga adresa.

Pentru modificarea adreselor se selectează adresa dorită care este copiată în fereastra de editare, se modifică adresa, după care se apăsa butonul Modifica adresa. Pentru ștergerea adresei de asemenea se selectează adresa dorită, după care se apăsa butonul Șterge adresa.

Figura 6.3. Modificare adresă

Logica din spatele acestei ferestre se află în clasa Adresa_class.java. Astfel în momentul când fereastra este creată se și instanțiază Adresa_class. În această clasă se află metodele care execută toate cele trei operații care trebuie executate la apăsarea butoanelor aferente din fereastră.

La instanțierea acestei clase se creează variabilele necesare pentru memorarea datelor care se prelucrează în această clasă. După ce sunt create variabilele se execută metoda get_adresa(), metoda care citește datele din tabelul cu adresele și le memorează într-o structură de tip HashMap care memorează adresele citite din baza de date.

În același timp se creează trei modele de afișare care vor fi folosite în timpul programului. Această clasă este folosită în tot programul pentru a extrage adresele și id-ul adresei, id folosit pentru interogările ulterioare ale bazei de date.

În această clasă se află și cele trei metode apelate la apăsarea butoanelor din fereastra din figura 6.3.

Astfel metoda de adăugare a adreselor primește ca parametru șirul de caractere din câmpul de editare. Acest șir de caractere este transformat în caractere majuscule după care cu ajutorul unei instrucțiuni SQL INSERT este introdusă în tabelul adresă. După introducerea adresei se introduc în tabelul defalcare înregistrări pentru adresa introdusă. Aceste înregistrări sunt puse cu valoarea default.

Metoda care tratează modificarea adresei primește ca parametri indexul adresei de modificat și noul nume al adresei. Cu aceste date, folosind instrucțiunea SQL UPDATE, se modifică datele în baza de date.

Metoda care tratează ștergerea adreselor din baza de date primește de asemenea ca date de intrare, indexul adresei care trebuie ștearsă din baza de date. Ștergerea se face punând în câmpul ”șters” valoarea true, folosind instrucțiunea SQL UPDATE.

Această metodă face ca ștergerea să nu fie definitivă, putându-se reveni la starea inițială dacă se dorește. După modificarea câmpului din tabelul adresa se modifică câmpurile similare din tabelele apart,date_luna,defalcare și facturi.

După apelul oricărei metode din cele trei se apelează o metodă care recitește datele din baza de date și afișează noile date în lista din fereastra din figura 6.3.

Această metodă citește numărul de înregistrări din tabel și îl memorează într-o variabilă, după care se citesc datele din tabel. În cazul în care numărul de înregistrări este egal cu zero se dezactivează butoanele de modificare respectiv ștergere pentru a nu permite aceste operații dacă nu sunt date în tabelul de adrese.

Adăugarea apartamentelor

A doua fereastră din meniu este fereastra în care se introduc datele corespunzătoare fiecărui apartament din cadrul unei asociații de locatari după cum se vede în figura 6.4.

Figura 6.4. Adăugare date corespunzătoare fiecărui apartament

De asemenea această parte a programului este alcătuită din două clase. O clasă care se ocupă de afișarea ferestrei și o clasă care se ocupă de partea logică din spatele fiecărei componente în parte. După cum se vede din figura 6.4 fereastra este alcătuită din două paneluri. În cel superior este un JComboBox din care se selectează adresa de lucru curentă și un JTable în care sunt afișate apartamentele de la fiecare adresă.

În panoul din partea de jos a ferestrei se află trei câmpuri de editare de tip JtextField în care se editează numele proprietarului, numărul apartamentului și suprafața apartamentului precum și un JComboBox în care sunt încărcate datele din tabelul nivel. De asemenea în același panou se află trei butoane care execută la apăsare, operațiile de adăugare, modificare și ștergere a datelor din tabelul apart.

La inițializarea acestei ferestre se creează structurile de date necesare pentru afișarea datelor citite din baza de date. După crearea structurilor de date, apelând metodele din clasa adresa_class, se citesc datele din tabelul de adrese și se adaugă datele citite în lista de adrese. Pentru a putea schimba datele din tabelul de apartamente odată cu schimbarea adresei a fost implementată o metodă care prelucrează mesajul generat de schimbarea adresei. Această metodă schimbă valoarea variabilei care memorează idstrada și apelează metoda care recitește datele din baza de date.

Cele trei butoane din interfață sunt legate la trei metode din clasa Apart_class și execută fiecare o comandă specifică. Astfel la apăsarea butonului Adaugă înainte se verifică dacă toate câmpurile necesare sunt completate după care valorile sunt trimise metodei care se ocupă de introducerea datelor în baza de date. Modificarea datelor este identică cu introducerea lor în baza de date singura deosebire este că comanda SQL folosită este UPDATE în loc de INSERT. Comanda de ștergere a înregistrărilor pentru un apartament se face ca și la adrese adică modificând valoarea câmpului șters din tabelul de adrese. De asemenea odată cu modificare acestui câmp se modifică și valoarea câmpului șters din toate tabelele care sunt legate prin câmpul idapart de tabela apart.

Clasa Apart_class conține metodele necesare pentru tratarea evenimentelor generate de apăsarea butoanelor, de selectarea unui anumit apartament din lista de apartamente. De asemenea în aceeași clasă se află și o metodă care citește apartamentele din baza de date și creează un model de tabel care este folosit în fereastra pentru afișarea apartamentelor.

Defalcarea facturilor

A treia sub-comandă din cadrul meniului Configurare este comanda de setare a modului de defalcare a facturilor pentru fiecare asociație. Pentru afișarea și modificarea acestor informații se folosesc două clase și anume Defalcarefrm care se ocupă de afișarea ferestrei pe ecran și clasa Furnizori_class care extrage datele din baza de date prin intermediul clasei Defalcarefrm.

După cum se observă în figura 6.5., fereastra de afișare este formată dintr-o listă de adrese implementată cu ajutorul unei componente JList, un tabel în care sunt afișate modurile de defalcare în funcție de furnizor care este implementat folosind un JTable precum și două butoane pentru salvarea, respectiv anularea, modificărilor făcute în tabelul cu modul de defalcare.

Figura 6.5. Defalcare facturi

În momentul în care această fereastră este activată, se instanțiază și clasa Adresa_class. Această clasă conține și o metodă care crează un model de listă care este folosit pentru a crea lista cu adresele. De asemenea tot la activarea ferestrei se creează un JComboBox în care se memorează modul de defalcare a cheltuielilor. Pentru a putea afișa datele în tabel sub formă de listă derulantă se folosește un editor pentru valorile din celulele tabelului după cum se vede în secvența de cod de mai jos:

mod_def=new JComboBox();

mod_def.addItem("Apartament");

mod_def.addItem("Metru patrat");

mod_def.addItem("Metru cub");

mod_def.addItem("Persoane");

mod_def.setSelectedIndex(0);

modColumn.setCellEditor(new DefaultCellEditor(mod_def));

Modul de lucru al interfeței vizuale se bazează pe tratarea mesajului primit de la lista de adrese în momentul efectuării unui click cu mouse-ul sau selectării cu ajutorul săgeților a unei alte adrese. În acel moment se folosește noul id al adresei selectate și se folosește metoda create_tbl pentru a afișa noile valori din tabel.

Salvarea datelor se face la apăsarea butonului aferent din fereastră. În acel moment metoda care interceptează mesajul generat de apăsarea butonului citește conținutul tabelului rând cu rând și datele extrase le trimite către clasa Furnizori_class care introduce valorile în baza de date.

La apăsarea butonului de anulare se afișează un mesaj prin care se cere confirmarea utilizatorului pentru ieșirea fără salvare. În cazul în care utilizatorul acceptă ieșirea fără salvare fereastra se închide fără a salva datele.

Clasa Furnizori_class este partea de program care citește și modifică datele din tabelul defalcare din baza de date. La inițializarea clasei se creează două liste în care se vor memora datele înainte de a fi folosite. După inițializarea listelor folosind o instrucțiune SQL SELECT se citesc datele din tabela cu furnizori și cele din tabela defalcare. Cele două tabele sunt reunite într-o listă care este folosită pentru extragerea datelor. În cazul în care, pentru respectiva adresă nu există înregistrări în tabela defalcare, se creează o listă cu valoarea default pentru fiecare furnizor. Lista astfel creată se salvează în baza de date pentru a fi folosită de program.

Baza de date

Partea din program care se ocupă de bazele de date este formată din trei clase care se ocupă de partea de afișarea ferestrei, de partea de salvare a fișierului și de backup-ul bazei de date.

De afișarea ferestrei se ocupă clasa Backupfrm care conține toate metodele necesare afișării și tratării evenimentelor generate de ea. Fereastra este compusă din două panouri, unul pentru backup și unul pentru restaurarea bazei de date.

Figura 6.6. Operații în baza de date

După cum se observă în figura 6.6, în panoul superior se află un câmp text în care se introduce adresa unde se salvează fișierul rezultat în urma backup-ului.Se mai află și două butoane, unul pentru activarea ferestrei de selectare a directorului în care se salvează datele și celălalt pentru pornirea operației de salvare a datelor.

În panou se mai află și două selectoare care prin selectarea sau deselectarea lor stabilesc modul în care se face salvarea datelor. Dacă este selectat Folder implicit salvarea se execută în directorul implicit adică în directorul aplicației. Dacă nu este selectat se activează butonul care ne permite să alegem directorul în care dorim să salvăm datele.

Selectarea modului Comprima backup face ca fișierul rezultat în urma backup-ului să fie comprimat pentru a se economisi spațiu. Comprimarea se face în format ZIP deoarece este un format care poate fi folosit gratis iar clasele necesare sunt incluse în JDK-ul de Java.

Panoul inferior conține un câmp text în care este trecută calea fișierului care se dorește să fie restaurat. Fișierul se obține după apăsarea butonului Cauta… și selectarea fișierului dorit. După selectarea fișierului se apasă butonul Restaurează și fișierul este folosit pentru restaurarea datelor din baza de date.

La restaurarea bazei de date fișierul citit este verificat dacă este comprimat sau nu. Verificarea se face după extensie și în cazul în care extensia este ZIP atunci se decomprimă întâi apoi este preluat de metoda de restaurare și baza de date este restaurată.

Pentru selectarea directorului unde se salvează fișierul de backup sau de unde se restaurează baza de date se folosește un obiect de tip JFileChooser. Acest obiect când este creat primește ca parametru numele directorului curent al programului.

Când acțiunea selectată este backup-ul atunci titlul ferestrei care apare este setată pentru ca utilizatorul să știe că trebuie să selecteze un director unde să salveze fișierul de back-up. Șirul rezultat este returnat către metoda care a apelat rutina de selecție și este folosit pentru crearea comenzii de salvare.

Când acțiunea este restaurarea bazei de date atunci din fereastra care se deschide se selectează fișierul dorit, iar după apăsarea butonului Open șirul rezultat este de asemenea returnat metodei care a apelat metoda de restaurare și este folosit la crearea comenzii de restaurare.

Pentru a putea selecta doar fișierele de tip *.SQL sau *.ZIP trebuie creat un filtru nou pentru obiectul de tip JFileChooser. Acest filtru este creat cu ajutorul clasei Filter. În această clasă se declară un nou tip de filtru pentru fișierele de tip ZIP deoarece filtrul pentru fișiereleSQL este creat odată cu JFileChooser.

Operații

În partea de operații a programului se fac operațiile lunare în program și anume, introducerea facturilor, introducerea datelor care se schimbă în fiecare lună- consumurile lunare de apă, numărul de persoane, restanțele și penalizările.

Această parte a programului este împărțităîn trei părți mai mici care se ocupă fiecare de operațiile de mai sus. De asemenea una din cele trei părți de program se ocupă și de generarea datelor pentru afișarea listelor lunare de cheltuieli. Această parte din program este compusă din mai multe clase,din care o parte se ocupă de afișarea pe ecran a ferestrelor în care se introduc datele și alte clase se ocupă cu partea logică a programului.

Introducere date

Partea de introducere date este formată din două clase principale care cu ajutorul altor clase prezentate mai sus realizează afișarea ferestrei principale în care se introduc datele precum și logica aferentă operațiilor cu baza de date.

După cum se observă din figura 6.7, această fereastră este împărțită în patru zone. În parte de sus se află un panou în care cu ajutorul celor două obiecte de tip JComboBox și a unui obiect de tip JSpinner se selectează adresa pentru care dorim să introducem datele, luna de lucru precum și anul în care vrem să lucrăm.

Figura 6.7. Zona de introducere date

Sub acest panou implementat cu ajutorul unui obiect de tip Jpanel, se află un tabel implementat cu un obiect de tip JTable care conține șapte coloane. În acest tabel vor fi afișate datele extrase din baza de date după interogările făcute folosind ca parametrii, datele din panoul de sus.

În partea dreaptă se află se află panoul de editare implementat cu un JPanel care conține cinci căsuțe de editare în care se introduc datele din tabel precum și două butoane cu ajutorul cărora se salvează sau anulează datele introduse în căsuțele de editare.

În partea de jos a ferestrei se află două butoane care salvează modificările făcute în tabelul de date. Aceste două butoane sunt cele care fac salvările finale în baza de date.

La inițializarea ferestrei se inițializează obiectele care se folosesc pentru memorarea datelor. În partea a doua a inițializării și anume la activarea ferestrei se inițializează toate variabilele necesare. Astfel ComboBox-ul în care se afișează adresa este populat cu datele din tabelul care conține adresele folosind clasa Adresa_class și variabila care conține idstrada este actualizată la noua valoare care este citită din lista adreselor.

Lista care conține luna curentă este creată în timpul designului astfel că în momentul rulării nu mai trebuie adăugate datele în listă. Anul curent este aflat în timpul rulării folosind o componentă de tip JCalendar din care se extrage anul și numărul lunii în care ne aflăm. Indexul găsit este folosit pentru a selecta în lista cu lunile anului luna de lucru curentă.

Din valoarea din lista cu lunile anului și din valoarea anului se creează o variabilă String care se folosește ca parametru la anumite comenzi SQL.

Următoarea componentă este tabelul în care se afișează datele extrase din tabela cu datele din fiecare lună.

Figura 6.8. Tabel cu date extrase

După cum se vede din figura 6.8 tabelul are un număr de șapte coloane. Cele șapte coloane sunt create în funcție de datele pe care le vor conține, astfel că prima coloană este de tip Integer deoarece datele din acea coloană vor conține numărul de apartament, coloana a doua unde vor fi introduse numele proprietarilor va fi de tip String, coloana a treia va fi de tip Integer deoarece va conține numărul de persoane din fiecare apartament, iar ultimele patru coloane vor fi de tip float pentru că vor conține date care pot fi numere cu zecimale.

Datele sunt citite la fiecare schimbare a adresei, a lunii sau a anului prin implementarea unor metode care interceptează mesajele trimise de fiecare din cele trei obiecte vizuale folosite.Astfel, la schimbarea adresei din lista cu adrese, se citește indexul adresei din listă,după care se apelează din clasa Adresa_class o metodă care întoarce ca rezultat indexul adresei selectate. Din lista cu lunile anului împreună cu anul și cu indexul, se apelează o metodă din clasa Input_class care, folosind o comandă SQL,citește datele din baza de date.

Comanda SQL folosește pentru citirea datelor o comandă SELECT dar care folosește uniunea tabelelor din baza de date pentru a se putea genera într-un singur set de date toate câmpurile necesare afișării în tabel.

Datele citite sunt memorate într-o structură de tip HashMap unde ca și cheie se folosește indexul apartamentului și datele sunt formate dintr-o clasă care conține toate tipurile de înregistrări care sunt citite din tabela date_luna.

Pentru accesarea datelor memorate în clasa Input_class au fost create metode care extrag datele din HashMap-ul creat ca zonă tampon pentru memorarea lor . Când se inițializează fereastra, datele sunt citite rând cu rând și sunt introduse în tabel.

La tabel a fost adăugată o metodă care interceptează selectarea oricărui rând din tabel. Această metodă interceptează inclusiv folosirea săgeților de pe tastatura numerică. Pentru a verifica dacă am ajuns la capătul tabelului în această metodă se verifică numărul rândului pe care am ajuns. În cazul în care numărul rândului este -1 se setează numărul rândului ca 0 și selecția sare automat pe primul rând. De asemenea la fiecare selectare de rând sunt citite datele din rândul selectat și se afișează în panoul din dreapta ferestrei principale.

Acest panou conține mai multe câmpuri de editare în care datele sunt introduse din tabel. De asemenea mai există două butoane cu ajutorul cărora putem să salvam sau să anulăm modificările făcute asupra fiecărui apartament. Salvarea datelor la apăsarea butonului salvează nu se face în baza de date, ea se face doar în tabelul din fereastra afișată, deci datele pot fi modificate de câte ori este nevoie. Dacă se apasă butonul anulează atunci datele din câmpurile de editare se anulează și se citesc din nou datele din tabel.

Salvarea datelor în baza de date se face la folosind butoanele din partea inferioară a ferestrei. Butonul Anuleaza anulează toate modificările făcute și închide fereastra fără a salva nimic.

La apăsarea butonului Salvează datele din tabel sunt citite rând cu rând și sunt transmise unei metode din clasa Input_class. Această metoda creează o comandă SQL care introduce datele în baza de date.

În cazul în care la citirea datelor nu există înregistrări care să corespundă parametrilor din interogare,atunci se creează automat un număr de înregistrări egal cu numărul de apartamente dar toate cu valoarea 0 în coloanele care afișează numere. Dacă nu există înregistrări în baza de date de asemenea în clasa Input_class se folosește o variabilă care este modificată sau nu. Această variabilă se folosește la inserarea datelor în baza de date. Dacă variabila care este de tip boolean este adevărată atunci procedura de introducere a datelor se face cu instrucțiunea INSERT, iar dacă variabila are valoarea fals atunci introducerea datelor se face cu instrucțiunea UPDATE.

Introducere facturi

Următoarea parte a programului este partea în care se introduc facturile lunare aferente fiecărei asociații în parte. Și această parte a programului a fost împărțită în două și anume o parte care se ocupă de afișarea datelor și o parte care se ocupă de logica de calcul din spatele ferestrei.

Figura 6.9. Introducere facturi

Ca de obicei se folosește și clasa Adresa_class pentru a accesa datele din baza de date referitoare la adresele asociațiilor de locatari. După cum se vede în figura 6.9., această fereastră este compusă din trei panouri și două butoane în partea inferioară a ferestrei.

În panoul superior se află două JComboBoxși un JSpinner. În JComboBox-ul superior se află lista cu adresele asociațiilor extrasă cu ajutorul metodelor din clasa Adresa_class. În cel de al doilea JComboBox se află o listă cu lunile anului, listă creată în timpul designului la fel ca în clasa Input_frm deoarece se câștigă timp la inițializarea ferestrei deoarece valorile sunt inițializate deja. În JSpinner se afișează anul curent pentru care se introduc facturile.Setarea valorii anului se face folosind secvența de cod de mai jos:

spin_an.setValue(Calendar.getInstance().get(Calendar.YEAR));

spin_an.setEditor(new javax.swing.JSpinner.NumberEditor(spin_an, "#"));

Prima linie de cod setează valoarea folosind clasa Calendar de unde cu metoda getInstance() se află data curentă după care se extrage anul curent. Pentru a afișa valoarea fără separator pentru cifra miilor se folosește linia a doua din codul de mai sus care creează un nou editor pentru valoarea numărului din celula JSpinner-ului.

Din acest panou se creează cei doi parametri care se transmit clasei care extrage din baza de date valorile facturilor dacă există pentru perioada aleasă și pentru adresa selectată. Primul parametru reprezintă valoarea indexului adresei selectată din lista de adrese. Acest index se află trimițând către metoda getIdstrada() din clasa Adresa_class șirul de caractere extras din listă. Această metodă are ca rezultat valoarea indexului. Această valoare este memorată într-o variabilă privată din cadrul clasei și este folosită de câte ori este nevoie. Valoarea acestei variabile se schimbă doar la selectarea altei adrese folosind o metodă care interceptează evenimentul cbo_adresaItemStateChanged. La interceptarea acestui eveniment se reia procedura de citire a indexului și se modifică valoarea variabilei corespunzătoare. După fiecare modificare a adresei se apelează o metodă care recitește toate datele și le reafișează în tabel.

Al doilea parametru se creează din valoarea lunii din lista lunilor anului împreună cu anul curent. Acest parametru este de tip String și este format folosind indexul lunii selectate din combobox-ul cu lunile anului. Acest index este transformat în șir de caractere folosindu-se două caractere. Dacă numărul este mai mic ca zece pe prima poziție se folosește cifra zero.

A doua parte a parametrului este format folosind anul selectat care la rândul lui este transformat în șir de caractere. Cele două șiruri sunt concatenate și se formează al doilea parametru care de asemenea este stocat într-o variabilă privată în cadrul clasei.

Și acest parametru este actualizat de fiecare dată când oricare din cele două obiecte vizuale trimit către aplicație un mesaj de eveniment de tipul StateChanged. De asemenea și la fiecare schimbare a acestui parametru se apelează rutina de reactualizare a datelor din tabelul cu facturi.

În panoul din centrul ferestrei se află un tabel în care se afișează valorile facturilor citite din tabelul date_luna din baza de date. Acest tabel este legat de câmpurile de editare din panoul inferior. În cele două câmpuri apar valorile din tabel, în câmpul de editare de sus apare numele furnizorului iar în rândul de jos apare valoarea facturii asociate furnizorului. Rândul cu numele furnizorului este de tip doar citire pentru a nu permite modificarea numelui furnizorului din această fereastră.

În momentul inițializării ferestrei după ce tabelul este umplut cu date din programare se selectează primul rând din tabel. Selecția rândurilor din tabel generează un eveniment de tipul valueChanged care este tratat de o metodă care la fiecare selecție nouă citește datele din rândul selectat și le afișează în câmpurile de editare de jos.

În câmpul de editare a valorilor facturilor se pot modifica după dorință valorile facturilor. La acest câmp a fost implementată o metodă care interceptează evenimentele generate de apăsarea tastelor. În momentul în care se apasă tasta ENTER valoarea din câmpul de editare este introdusă în tabelul de facturi pe poziția care este selectată din tabel, după care poziția avansează în jos. În momentul în care se ajunge pe ultimul rând, se sare din nou la primul rând și se reia de la început.

Cele două butoane de la baza ferestrei se folosesc pentru salvarea datelor din tabelul din fereastră respectiv pentru anularea modificărilor făcute. Astfel la apăsarea butonului Anuleaza se execută procedura de închidere a ferestrei fără ca datele din tabel să se salveze. Această ieșire se face fără avertizarea utilizatorului despre faptul că nu se salvează datele.

Salvarea datelor din tabel se face la apăsarea butonului Salvează datele. În momentul apăsării pe buton, valoarea din câmpul de editare din panoul de jos se introduce în tabel, după care toate valorile din tabel sunt trimise la clasa Facturi_class prin intermediul următoarei linii de cod :

DefaultTableModel model=(DefaultTableModel)tbl1.getModel();

Variabila model se trimite ca parametru, iar dacă salvarea are loc, se afișează un mesaj de succes.

Clasa Facturi_class conține patru metode publice care sunt accesate pentru a efectua diferite operații. La inițializarea clasei se creează structura de date în care se vor memora datele citite până la folosirea lor. Clasa mai conține o metodă care inițializează toate variabilele din clasă. A fost aleasă această metodă pentru a putea reciti datele din baza de date la fiecare schimbare de parametri din fereastra de introducere facturi.

Metoda principală din această clasă este cea care inițializează datele din tabelul principal din fereastra comenzii. Această metodă folosește o clasă internă care simulează tipul de date struct din limbajul C++. Această clasă conține toate variabilele necesare pentru citirea câmpurilor din baza de date. Această metodă este apelată la inițializarea ferestrei și ori de câte ori se modifică una din valorile selectate în panoul superior al ferestrei.

Această metodă folosește clasa conect pentru a trimite o comandă SQL către baza de date. Rezultatul primit de la baza de date este citit și se introduce în zona tampon de date. După citirea tuturor datelor se verifică dacă există date în zona tampon. În cazul în care dimensiunea este diferită de zero se întoarce controlul la programul principal. Dacă dimensiunea este zero, folosindu-se o metodă separată, zona tampon de date, se inițializează pentru fiecare apartament structura de date cu valoarea zero.De asemenea tot în această metodă se poziționează o variabilă care este folosită la verificările ulterioare pentru a vedea dacă au fost sau nu valori în baza de date. Cu aceste valori în zona de date tampon se întoarce controlul în fereastra care a apelat această metodă.

O altă metodă importantă este cea care salvează datele din tabel în baza de date. Această metodă primește ca date de intrare toate datele din tabel trimise prin intermediul proprietății tabelului numită TableModel. Din această variabilă trimisă ca parametru se citesc datele linie cu linie și se introduc într-o comandă SQL care este executată și prin aceasta se introduc în baza de date noile valori. Comanda folosită este UPDATE dacă variabila folosită pentru verificarea datelor din baza de date are valoarea FALSE sau este INSERT dacă variabila are valoarea TRUE.

Fiecare metodă care accesează baza de date are implementată o buclă de tipul try…catch pentru a intercepta eventuale erori la execuția comenzilor SQL. Astfel la interceptarea unei erori se afișează un mesaj de eroare și se așteaptă apăsarea unei taste de către utilizator.

Afișare cheltuieli

Această parte de program este cea care se ocupă de afișarea listelor de cheltuieli și de trimiterea lor către framework-ul JasperReports pentru listare sau salvare ca fișier. Această parte este formată din patru clase distincte care fiecare face câte o parte din munca necesară afișării și calculării datelor.Aceste clase sunt cele care execută cele mai multe calcule matematice. Partea vizuală este formată de data aceasta din două parți deoarece s-a ales metoda de a afișa fiecare bloc în tabele separate. Dacă un bloc are mai multe scări atunci, pentru a nu afișa mai multe ferestre în fereastra principală, se va folosi un JTabbedPane care va afișa fiecare scară sau nivel într-un tab separat. De asemenea mai sunt două clase care se ocupă de extragerea datelor din baza de date și de efectuarea calculelor pentru afișarea în tabelul aferent.

Principala fereastră după cum se vede în figura 6.10. este formată din două panouri. În panoul principal este doar o componentă JTabbedPane care este folosită cum am relatat mai sus.

În panoul inferior se află cele trei componente folosite pentru selectarea adresei precum și a perioadei pentru care se doreșteafișarea datelor în tabel. Partea de inițializare a ferestrei folosește clasa Adress_class pentru citirea adreselor și aflarea indexului adresei selectate care de asemenea ca în celelalte clase ale programului este folosită ca variabilă privată. De asemenea se inițializează variabila în care se stochează perioada curentă de lucru.

Pentru inițializarea celorlalte variabile precum și pentru inițializarea zonei tampon de date se folosește evenimentul generat de către fereastră la activarea ei de către meniul principal al programului.

În această primă parte se folosește una din cele două clase care accesează baza de date pentru a stabili numărul de nivele sau scări a blocului. Pentru această sarcină se folosește clasa Afisare_class .

Figura 6.10. Afișare cheltuieli lunare

Această clasă conține o comandă SQL care extrage numărul de înregistrări din tabela nivel din baza de date în funcție de anumiți parametri care sunt trecuți în clauza de căutare. Pentru a număra doar o singură dată înregistrările se folosește clauza DISTINCT în comanda de numărare. Această clauză face ca numărarea rândurilor din tabel să se facă doar dacă aceasta apare prima dată. Numărarea se face în funcție de indexul străzii și numără câte înregistrări au idnivel diferit. Astfel dacă există două scări la o adresă comanda SQL va număra două înregistrări. Comanda folosită este cea de mai jos:

select count(distinct idnivel) from apart where idstrada=? and șters=false

După executarea comenzii, rezultatul interogării este memorat în clasa care se ocupă de afișarea ferestrei principale într-o variabilă privată care de asemenea este modificată de fiecare dată când în oricare din cele trei componente vizuale se modifică valoarea afișată.

Și în această clasă au fost implementate metode de tratare a evenimentelor la modificarea valorilor din cele două componente JComboBox și din JSpinner care modifică valoarea variabilelor atașate la noile valori. După fiecare modificare a variabilelor se apelează o metodă care face un update al datelor.

Metoda care execută recitirea datelor verifică dacă în componenta JTabbedPane există componente JPanel, acest lucru însemnând că sunt afișate date. În cazul în care există, aceste componente se șterg pentru a putea fi afișate cele noi. După aceea se execută o comandă SQL care extrage numele scărilor care există în baza de date și care au aceeași valoare în câmpul index al străzii. Rezultatul este citit rând cu rând într-o buclă while(condiție) care este executată atâta timp cât condiție este adevărată. În această buclă se creează mai multe componente JPanel care fiecare conține câte un JTable după cum se vede în figura 6.11. după care această componentă este adăugată la JTabbedPane, fiecare JPanel având numele pe care îl citește din baza de date.

Figura 6.11. Design preview afișare

Această componentă este formată din o componentă JPanel și o componentă JTable. Tabelul este folosit pentru afișarea tuturor valorilor cheltuielilor calculate pentru fiecare apartament în parte și pentru fiecare factură în parte, practic este tabelul cu cheltuielile lunare. Aceasta clasă se ocupă de calcularea valorilor și completarea tabelului cu valorile calculate.

Parametrii trimiși către această clasă sunt indexul străzii, perioada pentru care se calculează datele precum și scara sau etajul blocului pentru care se calculează datele. Constructorul clasei inițializează toate componentele vizuale după care parametrii primiți îi memorează în niște variabile private după care apelează o metodă care face restul inițializărilor. Practic, noua metodă calculează toate valorile necesare.

Această metodă inițializează două liste de tip HashMap care memorează datele înainte de a fi afișate. Aceste liste folosesc două clase de date astfel concepute încât, una memorează datele legate de facturile din perioada dorită, iar cealaltă clasă memorează datele pentru fiecare apartament. După ce cele două liste au fost instanțiate se apelează metoda care inițializează datele blocului.

În această metodă pentru extragerea datelor se folosește un mic truc astfel se creează cu ajutorul unei comenzi SQL un view în cadrul bazei de date denumit mai departe v1. Acest tabel are proprietatea că dacă datele oricare tabel care intră în formarea lui v1 se modifică datele din v1 se modifică de asemenea automat. S-a ales această metodă pentru a micșora necesarul de memorie folosit pentru calcule deoarece altfel toate datele trebuiau memorate într-o structură de date care folosea destul de multă memorie.

După ce a fost creat acest tabel se execută o comandă SQL care numără înregistrările conținute în el. Dacă numărul este diferit de zero atunci cu ajutorul mai multe comenzi SQL se execută mai multe calcule cu valorile din tabel cum ar fi suma tuturor valorilor din coloana de metri cubi de apă consumați, totalul de metri pătrați al apartamentelor și toate valorile care ne sunt necesare pentru efectuarea calculelor. Toate valorile calculate în această metodă sunt salvate în variabile locale pentru a fi folosite când este nevoie.

Următoarea metodă apelată este cea care inițializează lista care conține facturile. Această inițializare practic calculează valoarea facturilor în funcție de unitatea de măsură după care se repartizează cheltuielile. În această metodă se citește din tabela de facturi valoarea facturilor pentru adresa și perioada specificată și în funcție de valoarea câmpului defalcare se calculează valoarea facturii pe unitatea de măsură. Această valoare se introduce în aceeași listă în care sunt memorate valoarea totală a facturilor precum și modul de defalcare.

După inițializarea listei cu facturi se trece la inițializarea listei cu datele fiecărui apartament. Acest lucru se face citind din v1 toate datele după care aceste date sunt memorate în lista de lucru lista_1. Odată cu introducerea datelor în listă se calculează și valoarea de plată pentru fiecare apartament la anumite utilități, aceste rezultate introducându-se de asemenea în listă.Datele sunt introduse în listă folosind ca și cheie pentru listă numărul apartamentului.

După inițializarea tuturor listelor folosite în program se trece la calculul datelor pentru fiecare coloană din tabel. Pentru aceasta s-au folosit nouă metode care fiecare calculează datele. Cele nouă sunt aproape identice după cum se vede mai jos:

int mod=lista_2.get(ALTE_CHELT).defalcare;

for (Record1 tmp:lista_1.values()){

switch (mod){

case APART:tmp.alte_chelt=lista_2.get(ALTE_CHELT).val;

break;

case MP:break;

case MC:break;

case PERS:tmp.alte_chelt=lista_2.get(ALTE_CHELT).val*tmp.nr_pers;

break; }}

Pentru a mai limita numărul de calcule și linii de cod nu s-au mai calculat valorile și pentru cazurile imposibile cum ar fi cheltuieli pe bloc să fie defalcate pe metru cub. Dar există posibilitatea prin introducerea unei singure linii de cod să se efectueze chiar și aceste calcule.

După terminarea tuturor calculelor se trece la introducerea datelor în tabelul din panou. Deoarece tabelul conține și două coloane de total în această metodă se calculează pentru fiecare rând din tabel totalul celulelor, total care se memorează în două variabile locale în interiorul metodei. După calculul totalurilor datele se introduc rând cu rând în tabel.

După introducerea tuturor datelor ultimul pas care se mai face în aceasta metodă este de a șterge tabelul v1 din baza de date pentru ca la o apelare ulterioară să nu avem un mesaj de eroare deoarece tabelul v1 există când încercăm să-l creăm din nou.

Datele sunt memorate în variabila model_tbl și sunt disponibile programului principal printr-o metodă de tip get().

Clasa pnl_afisare după ce este apelată în fereastra principală creează atâtea panouri cu tabele câte nivele sau scări sunt la adresa selectată. În cazul în care nu sunt date prezente în baza de date pentru a calcula toate datele necesare afișării, atunci tabelul care apare este complet gol după cum se vede în figura 6.12.

Figura 6.12. Panouri cu tabele

După cum se vede în figura de mai sus blocul care a fost selectat în perioada respectivă nu are datele necesare pentru calcularea valorilor și paginile afișate sunt goale. De asemenea se vede că acest bloc conține două scări și deci au fost afișate două pagini de date.

În partea de jos a ferestrei de afișare mai există un buton pentru a lista la imprimantă sau pentru a salva în diferite formate fișierul rezultat.

Pentru a realiza acest lucru pe lângă clasa pnl_afisare se mai folosește și clasa pdfClass. De asemenea în baza de date se mai află un tabel care este folosit doar pentru afișarea datelor. Acest tabel nu este legat de nici un alt tabel din baza de date, singura lui menire este de a face legătura dintre program și partea de afișare realizată cu JasperReports.

Afișarea datelor începe odată cu apăsarea butonului de imprimare care are implementată o metodă care procesează evenimentul produs. Folosind secvența de cod de mai jos se extrage doar panoul care este selectat și din el se extrag toate datele din tabel:

pnl_afisare tmp=(pnl_afisare)jtp.getComponentAt(jtp.getSelectedIndex());

DefaultTableModel tmp_tbl=tmp.getModel_tbl();

După execuția acestor linii de cod se execută o comandă SQL care șterge toate datele din tabelul folosit pentru afișare din baza de date. După ce datele sunt șterse folosind o buclă for care folosește ca variabilă pentru contor numărul de rânduri din tabel se citesc datele rând cu rând și folosindu-se o comandă SQL INSERT care folosește valorile din fiecare celulă a rândului curent le introduce în tabelul folosit pentru afișare. După ce datele au fost introduse în tabel se creează o variabilă folosind clasa pdfClass și se apelează o metodă din interiorul clasei care realizează afișarea propriu zisă.

Clasa care realizează afișarea tabelului conține o metodă care trimite toți parametri necesari către raportul creat. Raportul este creat înainte folosind o aplicație vizuală în care se creează toate câmpurile necesare afișării valorilor cheltuielilor fiecărui apartament în parte.

Fișierul astfel creat este salvat intr-un director separat și este încorporat în fișierul final al programului.

Acest raport conține și doi parametri prin care din program se transmit luna, respectiv adresa asociației pentru care se afișează lista. După cum se vede în figura 6.13. parametrii sunt cele două grupuri de date prin care se afișează luna pentru care se listează cheltuielile și adresa blocului respectiv.

Din fereastra respectivă se poate lista la imprimantă tabelul rezultat sau se poate salva pe disc framework-ul JasperReports având implementate metodele necesare pentru conversia tabelului în diverse formate.

Figura 6.13. Vizualizare tabel cu cheltuieli

După afișarea în fereastra de previzualizare a listei generate de către program se poate trece la listarea la imprimantă sau salvarea pe disc a raportului. Salvarea se poate face într-un format uzual cum ar fi PDF, Excel sau într-un format propriu care se poate vizualiza doar cu un soft care poate citi acel format.

După efectuare oricărei operații de mai sus sau pur și simplu după închiderea ferestrei de vizualizare se poate trece la alt bloc sau altă scară din cadrul adresei selectate, iar procesul se reia de la început.

La ieșirea din această parte a programului ultimul tabel afișat nu este șters din baza de date și rămâne stocat, ștergerea lui făcându-se doar la apelarea din nou a metodei de calcul a listelor.

Help-ul programului

În această parte a programului a fost implementat un help minimal pentru programul realizat. Pe lângă acest help a mai fost implementat și o fereastră de tip Despre… în care se afișează unele mici date despre aplicație precum și o mică imagine sugestivă la natura programului.

Figura 7.1. Fereastra Help – configurare adrese asociații

Help-ul programului este implementat folosind o clasă denumită Help_class. Această clasă este interfața dintre programul scris în Java și framework-ul care procesează fișierele de help. Help-ul este implementat folosind o fereastră de tip JFrame pentru a putea folosi help-ul și în cazul în care fereastra principală a programului este micșorată.

Folosind proprietățile ferestrelor JFrame se poate modifica titlul afișat în momentul deschiderii ferestrei. După crearea ferestrei se adaugă componenta care afișează fișierul de help în cadrul ferestrei principale și se face fereastra vizibilă rezultând afișarea ferestrei de help cum se vede în figura 7.1. în cadrul ferestrei se poate selecta orice topic din parte stânga care este afișat în partea dreaptă.

A mai fost implementată și o funcție de căutare pentru a găsi informațiile dorite mai repede. Folosind implementarea ferestrei cu JFrame, se pot deschide mai multe ferestre de help acestea nefiind condiționate în nici un fel.

Fișierul de help a fost integrat în fișierul final jar pentru a fi mai ușor de trimis utilizatorului final.

Ultima fereastră este cea care afișează unele mici informații despre program și despre autor. Această fereastră este foarte simplă și este formată din o componentă de tip JButton, o componentă de tip JLabel ambele conținute intr-o componentă de tip JPanel. Componenta JLabel a fost folosită datorită proprietății ei de a putea afișa o imagine. Butonul este folosit pentru a închide această mică fereastră.

Concluzii și direcții viitoare

Programul prezentat în această lucrare realizează calculul cheltuielilor lunare precum și afișarea listelor aferente. Memorarea datelor se face folosind baze de date ceea ce face mai ușor păstrarea pentru timp mai îndelungat a datelor fără a fi nevoit să facem copii în fiecare lună după fișierele folosite cum ar fi în cazul folosirii unui program de calcul tabelar.

Programul mai poate fi extins adăugând noi funcționalități doar prin adăugarea unor noi clase la cele existente.

Astfel se poate adăuga un modul prin care se pot introduce facturile de la furnizori împreună cu data facturii astfel să existe posibilitatea de a atenționa utilizatorul de scadența facturii.

De asemenea se mai poate adăuga facilitatea de a prelua sumele neplătite de către proprietari și de a le muta direct în secțiunea de restanțe. Combinând cu modulul de mai sus se pot calcula automat și penalizările aferente fiecărui apartament rămas restant.

Folosind un nou tip de raport se pot genera chiar și chitanțele aferente fiecărui apartament în parte. Chitanțele se pot genera la achitarea fiecărei sume de către fiecare proprietar sau se pot genera automat toate odată pentru fiecare scară sau nivel al unui bloc.

Folosind facilitățile bazelor de date se pot genera diverse rapoarte cum ar fi:

Lista cu toate adresele din baza de date,

Lista cu toți proprietari grupați pe adrese,

Lista cu consumurile la apă caldă sau rece grupate pe adrese,pe proprietari,

Lista cu variația valorii facturilor pe perioada unui an.

Toate aceste rapoarte se pot genera doar folosind framework-ul JasperReports fără a mai adăuga decât cod pentru selectarea raportului dorit.

Programul poate fi folosit și cu alte tipuri de baze de date nu doar cu MySQL. Pentru a trece la alte tipuri se modifică doar în clasa conect tipul de driver pe care dorim să-l folosim să ne conectăm.

Astfel se pot folosi ca baze de date bazele de tip sqlite , microsoft acces și cu mici modificări chiar și Oracle.

Pentru a putea fi folosite și alte tipuri de baze de date comenzile SQL au fost integrate în corpul codului Java. Dar pentru a simplifica codul sursă și dacă programul se folosește cu MySQL se pot folosi procedurile stocate în baza de date.

Astfel cele mai complexe coduri SQL pot fi introduse în baza de date și pot fi apelate din program. În acest fel codul sursă devine mai simplu și toate operațiile SQL se mută la nivel de server.

De exemplu ștergerea unei adrese din baza de date în momentul actual se face din cod ștergând prima dată adresa după care se citesc toate înregistrările legate de această adresă după care se șterg și ele.

Folosind facilitățile bazei de date se poate implementa un declanșator care interceptează un anumit tip de eveniment în cazul de față o comandă de tip UPDATE și execută toate operațiile necesare pentru ștergerea înregistrărilor.

Bibliografie

Bruce Eckel – Thinking în Java – Prentice Hall, 2006

Cristian Frăsinaru – Curs practic de Java

http://web.info.uvt.ro/~iordan/PIII/Cristian_Frasinaru-Curs_practic_de_Java.pdf

David R. Heffelfinger – JasperReports for Java Developers – Packt Publishing, 2006

Documentație Java Oracle – http://docs.oracle.com/javase/tutorial/

Kevin Lewis – Creating Effective JavaHelp – O'Reilly Media, 2000

Mark Matthews, Jim Cole, Joseph D. Gradecki – MySQL and Java Developer's Guide – Wiley, 2003

Mauro Marinilli – Professional Java User Interfaces – Wiley, 2006

Rhawi Dantas – NetBeans IDE 7 Cookbook – Packt Publishing, 2011

Y. Daniel Liang – Introduction to Java Programming, ComprehensiveVersion, 2014

http://www.cs.armstrong.edu/liang/

Bibliografie

Bruce Eckel – Thinking în Java – Prentice Hall, 2006

Cristian Frăsinaru – Curs practic de Java

http://web.info.uvt.ro/~iordan/PIII/Cristian_Frasinaru-Curs_practic_de_Java.pdf

David R. Heffelfinger – JasperReports for Java Developers – Packt Publishing, 2006

Documentație Java Oracle – http://docs.oracle.com/javase/tutorial/

Kevin Lewis – Creating Effective JavaHelp – O'Reilly Media, 2000

Mark Matthews, Jim Cole, Joseph D. Gradecki – MySQL and Java Developer's Guide – Wiley, 2003

Mauro Marinilli – Professional Java User Interfaces – Wiley, 2006

Rhawi Dantas – NetBeans IDE 7 Cookbook – Packt Publishing, 2011

Y. Daniel Liang – Introduction to Java Programming, ComprehensiveVersion, 2014

http://www.cs.armstrong.edu/liang/

Similar Posts