Aplicatie Pentru Evidenta Cheltuielilor Lunare ALE Asociatiilor DE Proprietari
APLICATIE PENTRU EVIDENTA CHELTUIELILOR LUNARE ALE ASOCIATIILOR DE PROPRIETARI –
Cuprins
1. INTRODUCERE
1.1 Aplicabilitate
1.2 Specificatii de definitie
1.3 Reguli de calcul
2. MEMORIU TEHNIC
2.1 Aplicatii cu baze de date
2.2 Metodica de proiectare a aplicatiei
2.3 Etapa analiza. Entitati si Atribute
2.4 Etapa analiza. Evenimente si Functii
2.5 Etapa proiectare. Diagrama Entitate-Relatie
2.6 Etapa proiectare. Diagrama Functionala
2.7 Etapa proiectare. Arhitectura aplicatiei
2.8 Etapa implementare
3. MEMORIU JUSTIFICATIV
3.1 Proiectarea si implementarea bazei de date
3.2 Proiectarea interfetei utilizator
Meniul aplicatiei
Formulare
3.3 Implementare
Functii publice
Functia de calcul a cheltuielilor
Raportul cheltuielilor
3.4 Documentare
3.5 Testare
3.6 Pachet de instalare
4. CAIET DE SARCINI
5. MANUAL DE OPERARE
Instructiuni pentru instalarea aplicatiei
Instructiuni de utilizare
6. CONCLUZII
Aprecieri
Posibilitati de dezvoltare ulterioara
BIBLIOGRAFIE
ANEXE
Anexa 1. Listing Program
1. INTRODUCERE
In partea introductiva a lucrarii vom prezenta scopul aplicatiei, posibilitatile de utilizare practica, precum si notiunile de baza utilizate de catre administratorii de imobile, notiuni utilizate la implementarea aplicatiei sub forma elementelor de proiectare.
De asemenea, din partea introductiva va rezulta si necesitatea dezvoltarii unei astfel de aplicatii si implicatiile pe care le are utilizarea acesteia in cadrul activitatii de calcul si evidenta a cheltuielilor asociatiilor de proprietari .
1.1 Aplicabilitate
Aplicatia este destinata asociatiilor de proprietari respectiv administratorilor de imobile, prin caracterul sau general acesta putandu-se aplica in orice asociatie de proprietari sau imobil din Romania, respectand prevederile legale de calcul si evidenta aflate in vigoare.
Se urmareste automatizarea procesului de calcul si evidenta a cheltuielilor pe care le au de achitat lunar locatarii / proprietarii unui imobil. Calculele pe care administratorul blocului le face manual sunt greoaie si predispuse erorilor, in orice moment exista posibilitatea ca acesta sa introduca erori de calcul sau de evidenta, deci o aplicatie care sa-i usureze si sa ii sistematizeze activitatea este un ajutor binevenit.
In principiu, aplicatia trebuie sa permita introducerea informatiilor necesare calculului cumulativ, sa execute acest calcul pe baza informatiilor introduse sau deja existente intr-o forma de evidenta si sa genereze o lista pe care administratorul o va afisa pe panou. De asemenea aplicatia trebuie sa permita introducerea si memorarea platilor pe care le efectueaza locatarii / proprietarii lunar.
Pentru faza de documentare si testare, s-au folosit informatii puse la dispozitie de catre administratorul imobilului aflat pe strada Prof. Ciortea nr.7.
1.2 Specificatii de definitie
In urma discutiilor purtate cu administratorul de imobil precum si in urma studierii unor prevederi legale(legi, ordonante) referitoare la asociatiile de proprietari si la administrarea imobilelor, au rezultat o serie de notiuni specifice acestui domeniu, care vor fi utilizate la faza de implementare sub forma unor elemente de proiectare. Prezentam in continuare aceste notiuni si semnificatia lor.
Notiunea de asociatie de proprietari reprezinta asocierea tuturor proprietarilor sau locatarilor care locuiesc respectiv detin unul sau mai multe apartamente intr-un imobil de locuinte intr-o forma cu personalitate juridica, numita Asociatie de Proprietari in vederea gestionarii in comun a resurselor legate de serviciile furnizate de catre regiile autonome si a altor probleme legate de gestionarea in comun a unor resurse, fonduri, spatii.
Astfel, cererea pentru dobandirea personalitatii juridice a asociatiei, statutul, acordul de asociere si procesul-verbal al adunarii constitutive se inregistreaza la organul financiar pe a carui raza se afla cladirea. Asociatia dobandeste personalitate juridica in baza incheierii actului de catre judecatorul delegat la organul financiar local de presedintele judecatoriei in a carei circumscriptie teritoriala se afla imobilul.a1i
Forma de organizare a asociatiei de proprietari nu face subiectul acestei lucrari, deci vom insista doar pe partea de calcul si evidenta a cheltuielilor lunare.
In cazul de fata, la proiectarea aplicatiei ne vom referi in special la notiunea de imobil care reprezinta totalitatea apartamentelor aflate intr-o cladire cu locuinte. Acesta este caracterizat prin denumire, adresa, localitatea si judetul unde se este situat imobilul.
Prin notiunea de apartament se intelege locuinta separata, indivizibila aflata intr-un imobil. Un imobil contine unul sau mai multe apartamente si un apartament apartine unui singur imobil. In cadrul imobilului, apartamentul este identificat prin numar de apartament. De asemenea apartamentul este caracterizat prin proprietar, numar de camere, suprafata totala si numarul de persoane care locuiesc in apartament. Aceste caracteristici pot fi variabile in sensul modificarii lor de la o luna la alta.
Notiunea de furnizor reprezinta o societate comerciala, o regie autonoma, o persoana fizica sau o persoana juridica care furnizeaza servicii asociatiei de proprietari. Furnizorul este caracterizat prin denumire, cod fiscal si adresa. Contravaloarea acestor servicii fac obiectul unei facturi emise de furnizor catre asociatia de proprietari.
Astfel introducem notiunea de factura ca si documentul care contine cuantumul de consum al serviciului oferit si contravaloarea acestuia, exprimat in lei. Factura este caracterizata prin numar de document, furnizorul, tipul de serviciu furnizat, consumul, luna pentru care se face facturarea si suma care reprezinta contravaloarea serviciului. Factura se emite de catre furnizor pentru luna precedenta. Prin notiunea de luna intelegem intervalul de timp echivalent cu o luna calendaristica pentru care furnizorul a efectuat facturarea si in consecinta proprietarul apartamentului trebuie sa achite cota parte din aceasta factura care ii revine conform normelor de calcul in vigoare.a2i Luna se caracterizeaza prin indexul sau denumirea acesteia(ianuarie – decembrie) si prin anul din care aceasta face parte.
Aplicatia va utiliza astfel notiunea de luna ca si termen de referinta pentru efectuarea calculelor. Pentru o luna se pot emite una sau mai multe facturi.
Pentru ca un furnizor poate sa emita facturi pentru unul sau mai multe tipuri de consum, vom trata separat notiunea de tip de consum, care reprezinta tipul de consum pentru factura emisa de catre furnizor. Tipul de consum este caracterizat de furnizor, unitate de masura si tip de calcul. Unui tip de consum ii pot reveni astfel una sau mai multe facturi.
Notiunea tip de calcul reprezinta modalitatea in care se face calcul cuantumului aferent fiecarui apartament din imobil pentru un anumit tip de consum. Astfel, acesta poate sa fie la nivel de apartament, la nivel de numar de persoane care locuiesc in apartament in luna respectiva sau la nivel de suprafata a apartamentului.a2i Un tip de calcul este determinant pentru unul sau mai multe tipuri de consum.
Prin notiunea de incasare se intelege actiunea prin care administratorul imobilului primeste de la proprietarul apartamentului o suma de bani aferenta cuantumului rezultat in urma cheltuielilor lunare. De obicei proprietarul achita suma exacta rezultata dar poate sa achite si o parte din aceasta suma, sau chiar sa nu achite deloc suma datorata, astfel suma devenind restanta. In urma achitarii unei sume, administratorul emite o chitanta, care este dovada ca proprietarul a achitat suma respectiva. Incasarea este caracterizata de numar chitanta, data la care a fost efectuata plata si suma incasata. Astfel, pentru un apartament se pot efectua una sau mai multe incasari.
1.3 Reguli de calcul
Cuantumul cheltuielilor aferente fiecarui apartament din imobil se calculeaza pe baza facturilor lunare pe care administratorul imobilului le primeste de la furnizorii de servicii(societatile comerciale care asigura livrarea apei reci si calde menajere, furnizarea agentului termic, curentului electric, gazului metan, serviciile de salubrizare, etc.) precum si din informatiile specifice fiecarui apartament(numar de persoane, suprafata, numar de camere, etc.)
Calcul se face pe baza prevederilor legale in vigoare.
Prezentam in continuare formulele de calcul defalcate pentru cele 3 tipuri de calcul: a. Calcul la nivel de suprafata
Acest tip de calcul se face in special in cazul energiei termice.
Cheltuielile pentru incalzirea locuintelor/apartamentelor, indiferent de modul de inregistrare a consumului de energie termica si de sursa de agent termic, se repartizeaza proportional cu suprafata utila inscrisa in actul de proprietate, iar pentru incalzirea spatiilor aflate in folosinta comuna intr-o cladire (casa scarii, culoare, spalatorii, uscatorii, holuri si altele asemenea) se repartizeaza proportional cu cota-parte indiviza care ii revine fiecarui proprietar din proprietatea comuna, astfel cum aceasta este inscrisa in actul de proprietate.a7i
Consumul se calculeaza cu urmatoarea formula:
unde cas -; consumul la nivel de suprafata, pe apartament sa -; suprafata apartament cis -; consumul la nivel de suprafata, total pe imobil cics-; consumul la nivel de suprafata, contorizat total pe imobil si -; suprafata totala a tuturor apartamentelor din imobil sic -; suprafata totala a tuturor apartamentelor contorizate din imobil
Apartamentele contorizate sunt cele care au contoare separate pentru tipul de consum in discutie si care platesc separat, in functie de consumul inregistrat de aceste contoare.
In cazul energiei termice se va obtine consumul aferent unui apartament necontorizat, exprimat in m3. Cu urmatoarea formula se obtine valoarea aferenta acestui consum, exprimata in Lei, adica suma pe care o are de platit un apartament necontorizat pentru serviciul respectiv.
unde vas -; valoarea consumului la nivel de suprafata, pe apartament cas -; consumul la nivel de suprafata, pe apartament vis -; valoarea totala a serviciului facturat, la nivel de suprafata cis -; consumul la nivel de suprafata, total pe imobil
b. Calcul la nivel de numar de persoane
Acest tip de calcul se face in cazul consumului de apa curenta menajera(apa rece, apa calda, canalizare), consumului de gaze naturale, etc.
Consumul se calculeaza cu urmatoarea formula:
unde cap -; consumul la nivel de numar persoane, pe apartament pa -; numarul de persoane care locuiesc in apartament cip -; consumul la nivel de numar persoane, total pe imobil cicp -; consumul la nivel de numar persoane, contorizat total pe imobil pi -; numarul total de persoane care locuiesc in imobil pic -; numarul total de persoane care locuiesc in imobil dar la care apartamentele in care locuiesc exista contoare pentru serviciul respectiv
De exemplu, in cazul consumului de gaze naturale se va obtine consumul aferent unui apartament necontorizat, exprimat in m3. Pentru obtinerea valorii aferente acestui consum, exprimata in Lei, adica suma pe care o are de platit un apartament necontorizat pentru serviciul respectiv, se foloseste formula:
unde vap -; valoarea consumului la nivel de numar persoane, pe apartament cip -; consumul la nivel de numar persoane, total pe imobil cap -; consumul la nivel de numar persoane, pe apartament vip -; valoarea totala a serviciului facturat, la nivel de numar persoane
c. Calcul la nivel de apartament
Acest tip de calcul se face in cazul retributiilor sub forma de salarizare ale administratorului, persoanei care face curatenie in imobil, etc.
Consumul se calculeaza cu urmatoarea formula:
unde caa -; consumul la nivel de apartament, pe apartament cia -; consumul la nivel de apartament, total pe imobil cica -; consumul la nivel de apartament, contorizat total pe imobil ai -; numarul total de apartamente din imobil aic -; numarul total de apartamente din imobil in care locuiesc exista contoare pentru serviciul respectiv
De exe Lei, adica suma pe care o are de platit un apartament necontorizat pentru serviciul respectiv, se foloseste formula:
unde vap -; valoarea consumului la nivel de numar persoane, pe apartament cip -; consumul la nivel de numar persoane, total pe imobil cap -; consumul la nivel de numar persoane, pe apartament vip -; valoarea totala a serviciului facturat, la nivel de numar persoane
c. Calcul la nivel de apartament
Acest tip de calcul se face in cazul retributiilor sub forma de salarizare ale administratorului, persoanei care face curatenie in imobil, etc.
Consumul se calculeaza cu urmatoarea formula:
unde caa -; consumul la nivel de apartament, pe apartament cia -; consumul la nivel de apartament, total pe imobil cica -; consumul la nivel de apartament, contorizat total pe imobil ai -; numarul total de apartamente din imobil aic -; numarul total de apartamente din imobil in care locuiesc exista contoare pentru serviciul respectiv
De exemplu, in cazul salariului administratorului, avand in vedere ca nu exista apartamente cu regim de contorizare, cic si aic vor fi zero, deci fiecare apartament va plati aceeasi suma, egala cu salariul administratorului impartit la numarul de apartamente din imobil.
Pentru obtinerea valorii aferente acestui consum, exprimata in Lei, adica suma pe care o are de platit un apartament necontorizat pentru serviciul respectiv, se foloseste formula:
unde vaa -; valoarea consumului la nivel de apartament, pe apartament caa -; consumul la nivel de apartament, pe apartament via -; valoarea totala a serviciului facturat, la nivel de apartament cia -; consumul la nivel de apartament, total pe imobil
Dupa calcularea valorilor pentru fiecare tip de consum in parte, obtinem totalul de plata pentru fiecare apartament, dupa formula:
unde vt -; valoarea totala de plata pentru apartament, pentru luna curenta vas -; valoarea consumului la nivel de suprafata, pe apartament vap -; valoarea consumului la nivel de numar persoane, pe apartament vaa -; valoarea consumului la nivel de apartament, pe apartament ns -; numarul de servicii dependente de suprafata np -; numarul de servicii dependente de numarul de persoane na -; numarul de servicii dependente de apartament
Aceste formule de calcul se aplica pentru fiecare apartament din imobil iar valorile obtinute vt, constituie lista de cheltuieli lunare, scopul principal al dezvoltarii acestei aplicatii. Eventual, ca si optiune, se pot afisa si unele dintre consumurile vs, vp sau va, de obicei cele mai importante din punct de vedere valoric, cum ar fi energia termica sau apa curenta menajera.
2. MEMORIU TEHNIC
2.1 Aplicatii cu baze de date
O aplicatie este in principiu o colectie software consolidata cu scopul de a rezolva un set dat de probleme. Rezolvarea problemelor prin punerea in practica a software-ului se numeste software engineering. Tot asa cum in alte proiecte ingineresti cum ar fi constructia unei cladiri sau a unui aparat de zbor este depus un efort considerabil inaintea punerii primei caramizi in constructia cladirii sau inainte de conceperea primei piese a aparatului de zbor. In timpul fazei initiale (numita faza de proiectare) o serie de elemente vor intra in contact unele cu altele pentru a da forma proiectului de aplicatie. Unele din elemente sunt ne-negociabile sau resurse limitate cum ar fi timpul, banii, sau mana de lucru. Altele, cum ar fi tehnologiile disponibile, cunostintele, sau indemanarea sunt resurse dinamice si variaza pe parcursul ciclului de viata al sistemului "business".a9i
Notiunea de baza de date este strans legata de notiunea de date, care refera „fapte culese din lumea reala” a11i. Baza de date se refera la un volum mare de date, care sunt stocate pe suport fizic; ea reprezinta, in cazul sistemului computerizat, echivalentul arhivei din viata reala. Mai poate fi inteleasa ca o colectie de fisiere de date intr-un sistem de calcul a12i.
Pentru o baza de date cel mai important lucru este manipularea datelor continute in acea baza de date. Aceasta „manipulare” refera operatiile care se pot efectua asupra datelor: operatii de adaugare a unor date noi, operatii de regasire, de modificare, de stergere a datelor existente a12i.
Programarea bazelor de date constituie, de fapt, procesul de stocare -; folosind o modalitate standard -; a unei varietati de informatii, astfel incat sa fie posibila o accesare si o intretinere facila a datelor. Informatiile stocate intr-o baza de date, spre deosebire de un document creat cu un procesor de texte, respecta de obicei un format standard.a10i
Pentru aplicatia ceruta, utilizarea unei aplicatii cu baze de date in detrimentul altor metode de rezolvare a problemei date, cum ar fi calculul tabelar sau o aplicatie standard, fara baze de date, rezolva o serie de probleme si neajunsuri. Din acest punct de vedere, unele avantaje ale proiectarii aplicatiei cu baze de date au constituit un factor important de decizie atunci cand am ales modalitatea de rezolvare a problemei date, cum ar fi:
– posibilitatea stocarii unui volum relativ mare de informatii, precum si accesul ulterior la aceste informatii;
– remanenta informatiei, care in cazul unei aplicatii standard, fara baze de date, era incerta. Astfel, utilizatorul aplicatiei va avea posibilitatea sa verifice la un moment dat situatia locatarilor sau a cheltuielilor pentru luna precedenta sau chiar pentru anul trecut, existand posibilitatea intocmirii unor statistici evolutive a situatiei locatarilor, a cheltuielilor, etc.;
– simplificarea procesului de calcul, care in cazul calculului tabelar ar fi avut o complexitate ridicata, fara a avea un control real asupra fluxului de informatie gestionat;
– transparenta totala a implementarii, utilizatorul aplicatiei nu trebuie sa cunoasca modalitatile efective de implementare, modul de stocare a datelor, verificarile de corectitudine a informatiilor introduse. Utilizatorul nu trebuie sa cunoasca ce se intampla cu o informatie introdusa in sistem, dar in acelasi timp acesta trebuie sa aiba acces la informatia respectiva;
– fiind vorba de sume de bani, securitatea metodelor de calcul trebuie sa fie ridicata, trebuie sa fie eliminata pe cat posibil posibilitatea introducerii de erori in rezultatul final, iar o aplicatie care utilizeaza baze de date reuseste sa atinga acest obiectiv. In acest sens sunt necesare o serie de verificari la introducerea de informatii in sistem, care sa evite aceste erori(cum ar fi de exemplu verificarea ca la introducerea unui consum sau a unei sume, sa nu poata fi introduse valori negative).
Concluzionand, baza de date va trebui sa contina toate informatiile necesare calculului si a evidentei cheltuielilor lunare ale imobilelor. Aceste informatii vor fi introduse de catre utilizatorul sistemului, adica de catre administratorul imobilului, prin intermediul interfetei puse la dispozitie de aplicatie.
Avand in vedere ca in general administratorii de imobil nu sunt persoane cu pregatire informatica sau cunostinte de operare, cei mai multi dintre acestia nefiind familiarizati cu tehnica de calcul, aplicatia trebuie sa fie cat mai intuitiva, cat mai usor de utilizat si sa nu contina elemente care ar putea sa genereze situatii de ambiguitate. Este de asemenea important ca interfata aplicatiei sa fie realizata in intregime cu termeni in limba romana, iar termenii utilizati pentru denumirea elementelor constitutive ale interfetei sa reprezinte cat mai bine termenii corespondenti din limbajul specific al acestui domeniu, mai exact termeni gasiti si in legislatia referitoare la asociatiilor de proprietari.
Automatizarea procesului de calcul prin intermediul aplicatiei trebuie sa fie de asemenea transparent, fazele in care se obtin valori intermediare nu au importanta practica pentru administrator.
2.2 Metodica de proiectare a aplicatiei
Dezvoltarea unui sistem este o activitate laborioasa ce cuprinde o multitudine de sub-activitati("tasks") desfasurate intr-o maniera metodica. Aceste sub-activitati pot fi grupate in etape importante. Fiecare etapa are definite clar elementele livrate (adica ce produse finale sunt obtinute la incheierea etapei) etapelor ulterioare.
In cadrul fiecarei etape (stadiu) sub-activitatile tind sa fie de scurta durata si pot fi estimate cu usurinta. Fiecare sub-activitate este divizata in mai multe sub-sub-activitati. O anumita sub-sub-activitate se poate repeta de un numar de ori din diferite motive.
Vom discuta despre dezvoltarea pe baza modelului CASE(Computer-Aided Szstems Engineering).
Prezentam in mare etapele importante de dezvoltare, conform acestui model, fara a insista cu detalii asupra metodelor si sub-activitatilor corespunzatoare fiecarei etape :
– etapa de strategie -; obiectivul este de a produce un set de modele de business, un set de recomandari si un plan agreat pentru dezvoltarea sistemelor de informatii ce vor servi nevoilor curente si viitoare ale organizatiei, tinand cont de constrangerile financiare si tehnice ale organizatiei.a9i Este analizata problema care trebuie rezolvata, pe baza specificatiilor de definitie. Aceste specificatii sunt obtinute in urma discutiilor avute cu beneficiarul aplicatiei, studierea unor documentatii legate de domeniul de activitate respectiv, in acest caz este vorba de studierea legislatiei asociatiilor de proprietari si discutiile avute cu administratorul de imobil;
– etapa de analiza -; Preia si verifica lucrurile obtinute in etapa strategie si le expandeaza in detaliu suficient pentru a asigura acuratetea de business, fezabilitatea si un fundament sanatos pentru proiectare, in cadrul domeniului organizatiei si avand in minte sisteme existente;a9i
– etapa de proiectare -; pe baza etapei de analiza, se realizeaza proiectarea aplicatiei, in urma careia rezulta directive concrete pentru etapa de implementarea9i, de exemplu se realizeaza proiectarea schemei bazei de date, stabilirea functiilor de business necesare in sistem, etc.;
– etapa de implementare -; realizarea efectiva a aplicatiei, scrierea codului, realizarea bazei de date, compilarea aplicatiei sub forma unui program executabil;
– etapa de testare -; produsul software este testat in conditii normale de utilizare si se rezolva eventualele probleme;
– etapa de documentare -; se scrie documentatia aplicatiei(sub forma tiparita si/sau online), se face instruirea viitorilor utilizatori ai aplicatiei.
Figura 1. Ciclul de viata al unui sistem informatica9i
Rezultatul stadiilor strategie si analiza trebuie sa fie complet independente de orice tehnica de implementare specifica, pentru a da proiectantului oportunitatea maxima de a folosi tehnologia potrivita si pentru a proiecta in coexistenta cu sisteme curente. Metoda CASE trebuie sa fie doar scheletul, ea trebuie completata cu ideile proprii si inovatia contribuie la calitatea produsului final.
Business-urile sunt in continua miscare. In linii mari se schimba nu CE este facut ci CINE si CUM face. Modelele folosite pentru a defini cerintele business-ului trebuie sa permita modificari rezonabile in structura organizatiei. Modelele trebuie sa fie de asemenea independente de toate solutiile cunoscute.
Sistemul trebuie sa continue sa functioneze eficient cand, de exemplu, sunt adoptate proceduri noi de fabricatie, vanzare, administrare.
Cerintele ar trebui modelate si definite intr-o maniera generica. Cerintele functionale ar trebui sa defineasca ce este facut, nu cum sau de catre cine. Structura datelor trebuie sa permita modificari: in structura organizatiei, pentru exceptii si pentru limite curente si observabile.a9i
2.3 Etapa analiza. Entitati si Atribute
Pentru a ajunge la realizarea structurii bazei de date, am utilizat specificatiile de definitie(prezentate in subcapitolul 1.2). Pe baza acestor specificatii extragem entitatile si atributele care constituie puncte de plecare la proiectarea bazei de date.
NOTIUNE CALITATE(entitate sau atribut) imobil Entitate denumire imobil Atribut adresa imobil Atribut localitate Atribut judet Atribut nume administrator Atribut apartament Entitate numar apartament Atribut proprietar Atribut numar de camere Atribut numar de persoane Atribut suprafata Atribut furnizor Entitate denumire furnizor Atribut cod fiscal Atribut adresa furnizor Atribut factura Entitate numar document Atribut consum Atribut suma Atribut
incasare Entitate numar chitanta Atribut data emiterii Atribut suma Atribut luna Entitate anul Atribut tip calcul Entitate tip consum Entitate denumire consum Atribut unitate de masura Atribut consum Entitate valoare Atribut
Tabel 1. Lista cu entitati si atribute
In tabelul 2 prezentam entitatile cu tipul acestora precum si cu legaturile dintre ele.
ENTITATE TIP ENTITATE ENTITATI CU CARE ARE LEGATURA imobil entitate de baza apartament entitate de baza • luna
• incasare
• consum furnizor entitate de baza • tip consum factura entitate de baza • luna
• tip consum
incasare entitate de baza • apartament luna entitate de baza • apartament
• factura tip calcul entitate de baza • tip consum consum entitate de legatura • apartament
• tip consum tip consum entitate de baza • consum
• factura
• furnizor
• tip calcul
Tabel 2. Entitatile si legaturile dintre ele
Aceste legaturi le-am stabilit pe baza textului care constituie specificatiile de definitie si sunt piesele de baza la proiectarea structurii bazei de date. Pentru inceput, entitatile si atributele acestora sunt elementele de baza pentru alcatuirea diagramei entitate-relatie.
Modelarea ER a fost inventata la mijlocul anilor '70 de Peter Chen si ramane in continuare principala abordare pentru modelarea datelor.a9i Prin aceasta reprezentare schematica sub forma unei diagrame se reprezinta entitatile, atributele si relatiile dintre entitati precum si tipul acestor relatii.
In tabelul 3 sunt enumerate atributele, pentru fiecare dintre acestea am stabilit tipul de date pe care il vor avea la realizarea bazei de date, in vederea reprezentarii corecte si complete a informatiei. Coloana a 2-a reprezinta numele efectiv utilizat pentru implementare, astfel am dorit sa evit folosirea caracterului spatiu in structura bazei de date.
ATRIBUT NUME UTILIZAT IN BD TIP DE DATE LUNGIME ENTITATEA DE CARE APARTINE denumire imobil denumire sir de caractere 50 imobil adresa imobil adresa sir de caractere 50 imobil localitate localitate sir de caractere 50 imobil judet judet sir de caractere 50 imobil nume administrator numeAdministrator sir de caractere 50 imobil numar apartament nrApartament numeric long integer apartament proprietar proprietar sir de caractere 50 apartament numar de camere nrCamere numeric long integer apartament numar de persoane nrPersoane numeric long integer apartament suprafata suprafata numeric long integer apartament denumire furnizor denumireFurnizor sir de caractere 50 furnizor cod fiscal CF sir de caractere 50 furnizor adresa furnizor adresa sir de caractere 50 furnizor numar document nrDocument sir de caractere 50 factura consum consum numeric long integer factura suma suma numeric long integer factura numar chitanta nrChitanta sir de caractere 50 incasare data emiterii data data calendaristica incasare suma suma numeric double incasare luna luna numeric long integer luna anul anul numeric long integer luna tip calcul tipCalcul sir de caractere 50 tip calcul denumire consum denumireConsum sir de caractere 50 tip consum unitate de masura UM sir de caractere 50 tip consum valoare valoare sir de caractere 50 consum
Tabel 3. Atributele cu tipurile de date corespunzatoare si entitatile de care apartin
Pe langa aceste atribute, vom folosi si unele atribute aditionale, cum ar fi atributul „observatii” la entitatile apartament si furnizor, utile in cazul in care utilizatorul doreste sa isi noteze anumite observatii despre apartamentul sau furnizorul respectiv.
Continuand analiza specificatiilor de definitie, extragem relatiile dintre entitati, care pot sa fie dintre urmatoarele tipuri:
– 1:N (one to many) – la o instanta a unei entitati ii corespunde una sau mai multe din cea de-a doua entitate
– 1:1 (one to one) – la o instanta a unei entitati ii corespunde o instanta a celei de-a doua entitatati
– N:N (many to many) – la o instanta a unei entitati ii corespunde una sau mai multe din cea de-a doua entitate si reciproc, acesteia din urma ii corespund una sau mai multe instante ale primei entitati. In acest caz trebuie introdusa o entitate de legatura pentru implementarea relatiei.
Astfel, relatiile pentru cazul de fata vor fi:
TEXT SPECIFICATIE ENTITATE 1 ENTITATE 2 TIP DE RELATIE un imobil contine unul sau mai multe apartamente imobil apartament 1:N pentru o luna se pot emite una sau mai multe facturi luna factura 1:N unui tip de consum ii pot reveni astfel una sau mai multe facturi tip consum factura 1:N un tip de calcul poate fi determinant pentru unul sau mai multe tipuri de consum tip calcul tip consum 1:N pentru un apartament se pot efectua una sau mai multe incasari apartament incasare 1:N un apartament poate sa aiba unul sau mai multe consumuri apartament consum 1:N un tip de consum este determinant pentru unul sau mai multe consumuri tip consum consum 1:N* un furnizor poate fi determinant pentru unul sau mai multe tipuri de consum furnizor tip consum 1:N
intr-o luna exista unul sau mai multe apartamente luna apartament 1:N*
Tabel 4. Relatiile dintre entitati
Relatiile notate cu * sunt obligatorii.
2.4 Etapa analiza. Evenimente si Functii
Instantierea entitatilor se face numai in momentul aparitiei unor evenimente sau functii de business. Principala functie de business pe care trebuie sa o rezolve aceasta aplicatie ar fi calculul cheltuielilor lunare. Prezentam in continuare o lista a acestor functii.
EVENIMENT FUNCTIE ATASATA EVENIMENTULUI EXPLICATIE CU DETALII
Trecerea la o luna curenta noua Generarea unei luni de prelucrare noi – stabilirea noii luni de prelucrare
– actualizarea datelor despre apartamente (in special numarul de persoane, proprietarul)
Primirea facturilor lunare de la furnizorii de servicii Introducerea facturilor – stabilirea lunii curente de prelucrare
– stabilirea unui furnizor de servicii, cu datele de identificare ale acestuia (denumire, cod fiscal, adresa)
– stabilirea unui tip de consum, cu specificarea tipului de calcul aferent, denumirea tipului de consum si unitatea de masura utilizata
– introducerea facturii, cu stabilirea tipului de consum, specificarea numarului de document, consumul pentru serviciul respectiv si contravaloarea acestuia
Citirea contoarelor din apartamente Introducerea consumurilor – stabilirea lunii curente de prelucrare
– introducerea consumurilor citite de la contoarele de apartament cu specificarea tipului de consum si a numarului de apartament
Atingerea datei de afisare a cheltuielilor Calculul cheltuielilor lunare – stabilirea lunii curente de prelucrare
– verificare daca toate datele necesare pentru calculul cheltuielilor au fost introduse in sistem, inclusiv consumurile contorizate
– calcularea cheltuielilor lunare
– afisarea listei de cheltuieli
Proprietarul unui apartament achita contravaloarea cheltuielilor lunare Incasare – stabilirea lunii curente de prelucrare
– verificarea sumei datorate de proprietar, pe baza calculelor efectuate si a situatiei platilor pentru apartamentul respectiv pana in momentul dat
– introducerea sumei incasate
– emiterea unei chitante
Tabel 5. Evenimente si functii
2.5 Etapa proiectare. Diagrama Entitate-Relatie
In etapa de proiectare vom utiliza informatiile obtinute la faza de analiza pentru a realiza diagrama Entitate-Relatie, pe baza listelor cu entitati, atribute si relatii dintre acestea, precum si diagrama de functii, pe baza listei de evenimente si functii.
Diagrama Entitate-Relatie este o forma generalizata si abstractizata a listei de entitati si atribute, si este utilizata apoi pentru realizarea schemei bazei de date. Aceasta diagrama este independenta de sistemul de gestiune a bazelor de date utilizat in etapa de implementare.
Pentru generarea diagramei Entitate-Relatie, se pot utiliza unelte CASE, care permit editarea acesteia in mod vizual si care apoi pe baza diagramei astfel realizate pot sa genereze in mod automat structura bazei de date. Am utilizat in acest scop aplicatia AllFusion ERwin Data Modeler 4.1, dar pentru ca utiliza elemente de reprezentare a diagramei diferite de cele studiate, am decis sa realizez aceasta diagrama manual.
Prezentam in continuare cateva elemente de notatie ale diagramei Entitate-Relatie.
pentru entitati, exista urmatoarele notatii:
Dreptunghiul cu colturile rotunjite reprezinta entitatea, in care cu litere mari se noteaza denumirea entitatii, si cu litere mici se noteaza atributele.
Linia dintre entitati indica existenta unei relatii intre acestea. Astfel, linia continua indica o relatie obligatorie, linia intrerupta(punctata) reprezinta o relatie obligatorie iar „furca” reprezinta o relatie la N in partea respectiva, in cazul reprezentarii de mai sus relatia fiind de 1:N. pentru specificarea atributelor, exista 3 simboluri distincte:
# (diez) indica faptul ca atributul respectiv este un element de identificare a entitatii, numit si cheie, sau ID.
* (asterisc) indica faptul ca atributul este unul obligatoriu.
? (grad) indica faptul ca atributul este optional.
Citirea diagramei Entitate-Relatie:
Cuvintele din apropierea liniilor sunt cuvinte cheie care definesc relatia si se citesc astfel:
<ENTITATE 1> <cuvant cheie><ENTITATE 2>
Cuvintele cheie care sunt deasupra liniei sunt pentru citirea in directia de la stanga la dreapta, iar cele care sunt sub linie pentru citirea in sens invers, de la dreapta la stanga.
Exemplu: apartament are un consum consum pentru apartament luand in considerare si relatia de 1:N neobligatorie, vom citi: un apartament poate sa aiba unul sau mai multe consumuri un consum trebuie sa fie pentru un apartament
Aceasta metoda de citire a diagramei se foloseste pentru toate entitatile si toate relatiile dintre acestea.
Se poate observa in diagrama Entitate-Relatie existenta unor atribute de identificare, , identificatori unici sau de tip cheie, acestea sunt necesare pentru stabilirea legaturilor dintre entitati in faza de implementare a schemei bazei de date. In continuare vom enumera aceste atribute:
ATRIBUT ENTITATEA DE CARE APARTINE TIP ATRIBUT lunaID luna cheie primara apartamentID apartament cheie primara incasareID incasare cheie primara consumID consum cheie primara tipConsumID tipConsum cheie primara furnizorID furnizor cheie primara tipCalculID tipCalcul cheie primara facturaID factura cheie primara
Tabel 6. Atribute de identificare
Bara verticala perpendiculara pe o linie de legatura la capatul dinspre N ne indica faptul ca identificatorul unic(cheia) al entitatii respective se propaga, pe baza relatiei de legatura, si in entitatea care are aceasta bara. Acest fapt este utilizat la constructia structurii bazei de date pentru realizarea efectiva a relatiilor dintre entitati.
Am exclus entitatea imobil din diagrama Entitate-Relatie pentru ca legatura acesteia cu alte entitati a fost ignorata din considerente bine intemeiate. Astfel, in loc sa consideram ca fiind utila relatia dintre entitatile imobil si apartament, am preferat sa cream o legatura artificiala intre entitatile luna si apartament, care va fi mult mai utila la realizarea acestei aplicatii, deoarece intre aceste doua entitati exista o relatie de 1:N, adica la fiecare instanta de tip luna ii vor corespunde toate apartamentele din imobil, cu specificatia ca acestea vor avea structura(din punct de vedere al numarului de persoane, al proprietarului, al suprafetei si a numarului de camere) valabila numai pentru luna curenta de prelucrare. Astfel obtinem o flexibilitate sporita la trecerea de la o luna la alta, pentru ca modificarea unei caracteristici a unui apartament nu va influenta situatia din lunile anterioare.
2.6 Etapa proiectare. Diagrama Functionala
Figura 3. Diagrama functionala
2.7 Etapa proiectare. Arhitectura aplicatiei
Pentru dezvoltarea aplicatiilor cu baze de date, in functie de necesitatile de utilizare ale aplicatiei, se pot utiliza 3 tipuri de arhitectura, pe care le vom prezenta in continuare. a. Arhitectura Desktop
Arhitectura desktop este caracterizata de coexistenta aplicatiei si a bazei de date pe aceeasi masina fizica(pe acelasi calculator)
Figura 4. Arhitectura Desktop
Acest tip de arhitectura se utilizeaza in cazul aplicatiilor de complexitate redusa, cand baza de date este utilizata de o singura aplicatie si eventual de un singur utilizator. Accesul la baza de date se face fie direct de catre aplicatie(de exemplu in cazul unei aplicatii realizate in Visual Fox) sau prin intermediul unui motor de baze de date.
b. Arhitectura Client-Server
In cazul arhitecturii client-server, baza de date si aplicatia nu se gasesc neaparat pe acelasi calculator. Aplicatia ruleaza pe un sistem de calcul numit client, iar baza de date se gaseste pe un alt sistem de calcul, numit server, si este gestionata de un server de baze de date(de exemplu SQL Server, MySQL, etc.) Comunicarea dintre client si server se face prin intermediul unui canal de comunicatie, care este de obicei o retea locala LAN(Local Area Network) sau o retea WAN(Wide Area Network).
Acest tip de arhitectura permite accesul la baza de date de la distanta prin conectarea directa a clientului la serverul de baze de date, de exemplu printr-o conexiune de tip peer-to-peer.
Figura 5. Arhitectura Client-Server
c. Arhitectura Multistrat
Arhitectura multistrat este cea mai moderna dintre cele 3, si este caracterizata prin existenta a cel putin 3 sisteme de calcul, in mod generic. Aplicatia ruleaza pe sistemul client, pe care eventual ruleaza si un browser de web, prin intermediul caruia aplicatia poate sa emita cereri serverului de aplicatii, care poate fi de asemenea si un server de web. Serverul de aplicatii contine regulile de business ale aplicatiei, si este controlat de un administrator care cunoaste foarte bine intregul sistem si se ocupa cu eventualele actualizari ale sistemului. Un al treilea sistem este serverul de baze de date, unde se gaseste si baza de date. Serverul de aplicatii functioneaza ca un intermediar(gestionar) intre client si serverul de baze de date.
In aplicatiile prin intermediul internetului, de multe ori pe calculatorul client nu ruleaza o aplicatie specializata, ci doar serverul de web, iar utilizatorul are acces la baza de date prin accesarea unei pagini de internet.
Figura 6. Arhitectura Multistrat
Dintre cele trei arhitecturi prezentate, vom utiliza pentru dezvoltarea aplicatiei arhitectura desktop, pentru ca deocamdata nu se justifica utilizarea unei conexiuni la distanta sau prin intermediul internetului. Intr-o etapa de dezvoltare ulterioara a aplicatiei, se pot lua in considerare si celelalte tipuri de arhitectura. Aceasta problema este dezbatuta pe larg in capitolul Dezvoltari ulterioare.
2.8 Etapa implementare
Pentru implementarea aplicatiei am ales mediul de programare Visual Basic 6.
Mediul de programare Microsoft? Visual Basic este unul dintre cele mai utilizate medii de programare pentru realizarea aplicatiilor cu baze date, pentru ca acest mediu are o serie de facilitati pentru utilizarea bazelor de date.
Visual Basic 6 contine un motor complet de baze de date, care reprezinta, in esenta, o aplicatie de baze de date cu autocontinere. Spre deosebire de un procesor de texte sau alte aplicatii dotate cu interfete utilizator, o baza de date lucreaza, de regula, „in fundal”. Orice interfata vizibila de catre utilizator este cel mai adesea construita pentru o anumita aplicatie. Functionalitatea bazei de date este asigurata de un program denumit motorul bazei de date. Visul Basic simplifica programarea conectivitatii la o baza de date sau utilizarea controalelor grafice pentru configurarea modului de afisare si transformare a datelor.a10i
Prin notiunea de conectare la o baza de date intelegem stabilirea unui protocol de comunicatie intre aplicatie si motorul care gestioneaza baza de date.
Am ales acest mediu de programare pentru ca este o unealta cu un suport puternic in ceea ce priveste lucrul cu baze de date. Visual Basic permite conectarea nativa la numeroase tipuri de baze de date, cum ar fi: Acces, DBASE III, dBASE IV, dBASE 5.0, FoxPro 2.0, 3.0, Paradox 3.x-5.x, ODBC, etc.
De asemenea, acest mediu de programare contine elemente puternice de dezvoltare a interfetelor utilizator, precum si de utilizare a controalelor ActiveX.
ActiveX este o tehnologie Microsoft care permite utilizarea in cadrul unei aplicatii sau a unor unelte de dezvoltare a unor obiecte dezvoltate de catre o alta aplicatie. Aceste aplicatii sau unelte de dezvoltare se numesc formal OLE Automation Servers.a11i
Pentru conectarea la baza de date vom utiliza un control Microsoft ADO -; ActiveX Data Objects.
ActiveX Data Objects este o tehnologie dezvoltata de Microsoft pentru accesul la baze de date care implementeaza obiecte de tip data connection, data command, recordset si colectii ale acestor obiecte. Aceasta tehnologie permite si realizarea de aplicatii de tip client-server, aplicatii cu baze de date avand la baza tehnologii web sau internet.a11i
Pentru implementarea bazei de date am ales o tehnologia dezvoltata de Microsoft Acces, tehnologie care foloseste acelasi motor de baze de date ca si Visual Basic. Astfel, cu ajutorul Microsoft Acces, specializat pe lucrul cu baze de date, am creat structura bazei de date, iar ca rezultat fizic, baza de date este continuta intr-un singur fisier, cu extensia .mdb.
Aplicatia este centrata pe un formular(engleza form) de tip MDI, Multiple-Document Interface, care este un formular de tip container, mentine mai multe formulare in interiorul sau. Aceste formulare, numite si formulare child, pot sa fie deschise simultan in interiorul containerului, fiecare intr-o fereastra proprie si cu functionalitate proprie.
De asemenea, am utilizat doua controale de tip ActiveX:
VideoSoft VSFlexGrid, care este un control de tip grid, cu o functionalitate foarte bine pusa la punct, si care permite inclusiv legarea grid-ului de o sursa de date prin intermediul ADO, OLEDB sau DAO.
Data Dynamics ActiveReports este un control specializat pe generarea de rapoarte dintr-o sursa de date. Acesta prezinta multiple facilitati, cum ar fi tiparirea raportului la imprimanta, functii de marire-micsorare, exportul raportului in diferite formate.
Din punct de vedere al accesului la baza de date, acesta se face prin intermediul unor interogari SQL care au ca rezultat un recordset(set de inregistrari) sau prin comenzi directe ale instantei unui obiect de tip Connection.
Implementarea efectiva a aplicatiei, este descrisa amanuntit in capitolul 3, Memoriu Justificativ.
3. MEMORIU JUSTIFICATIV
3.1 Proiectarea si implementarea bazei de date
Proiectarea bazei de date am facut-o pe baza etapelor studiate in capitolul anterior, iar implementarea cu ajutorul produsului Microsoft Acces.
Baza de date va fi sub forma unui fisier de tip mdb, si fiecare astfel de fisier va reprezenta un imobil(sau o asociatie de proprietari), la un moment dat pot sa existe mai multe baze de date ale mai multor imobile, iar la rularea aplicatiei utilizatorul va putea sa aleaga imobilul(asociatia de locatari), si implicit baza de date curenta. Am ales aceasta metoda pentru a obtine o mai buna portabilitate a bazei de date.
In urma etapelor de analiza si de proiectare prezentate in capitolul anterior, am realizat structura bazei de date cu ajutorul produsului Microsoft Acces. Astfel, baza de date contine un numar de 11 tabele, 9 sunt cele corespunzatoare entitatilor prezentate in tabelul 1 din subcapitolul 2.3:
– apartament
– consum
– factura
– furnizor
– imobil
– incasare
– luna
– tipCalcul
– tipConsum
Celelalte 2 sunt tabele auxiliare, care nu rezulta in urma analizei, ci au fost introduse ca elemente ajutatoare pentru simplificarea codului. Acestea sunt:
– deIncasat -; se memoreaza temporar rezultate ale calculelor efectuate
– listaRap -; se stocheaza temporar diverse informatii necesare generarii de rapoarte
In figura urmatoare, prezentam structura bazei de date, cu tabelele si legaturile dintre ele. Observam ca fata de atributele prezente in diagrama entitate-relatie, sunt prezente si atributele de identificare de tip chei straine, care se propaga in momentul realizarii legaturilor dintre tabele. De exemplu, in tabela apartament, atributul LunaID, este cheie straina propagata din tabela luna, pentru a se face legatura dintre cele 2 tabele.
Figura 7. Structura bazei de date
In general, am denumit atributele de identificare cu postfixul ID(de la identificator sau index).
Mentionez ca in momentul implementarii bazei de date, prin definirea unei legaturi intre 2 tabele, am stabilit reguli de fortare a integritatii referentiale, adica motorul de baze de date nu va permite stergerea unei inregistrari din baza de date daca aceasta inregistrare are legatura cu o alta inregistrare din tabela cu care se afla in relatie. Aceasta regula se defineste in sensul de la 1 la N, adica nu pot sa sterg inregistrarea de la capatul 1 daca la capatul N exista cel putin o inregistrare care are referinta la aceasta.
Stabilirea acestei reguli se face prin bifarea optiunii „Enforce Referetial Integrity” la editarea unei relatii.
Fiecare fisier de tip mdb aflat in directorul aplicatiei va contine baza de date corespunzatoare unei asociatii de proprietari, exceptie face fisierul template.mdb, care se livreaza o data cu aplicatia, si care contine structura generica a bazei de date, fara a contine date despre o anumita asociatie. Acest fisier este folosit ca si model in momentul in care utilizatorul creeaza prima baza de date a unei asociatii de proprietari sau atunci cand creeaza o asociatie noua. Fiecare fisier nou creat va avea forma: mdb<nume_asociatie>.mdb exemplu: mdbCiortea7.mdb va contine baza de date pentru asociatia de proprietari denumita de catre utilizator Ciortea7
La initializarea aplicatiei, se apeleaza o functie care cauta toate fisierele care incep cu mdb si au extensia mdb din directorul curent si le pune la dispozitia utilizatorului, pentru ca acesta sa poata sa aleaga baza de date cu care va lucra. In acest mod am asigurat o buna portabilitate a informatiei, necesara de exemplu in cazul in care utilizatorul foloseste doua calculatoare pe care are instalata aplicatia, transportul informatiei intre cele 2 puncte de lucru se face prin simpla copiere a fisierului respectiv din directorul aplicatiei.
Numele ultimei baze de date utilizate se memoreaza la iesirea din aplicatie intr-un fisier de configurare, astfel ca utilizatorul nu va trebui sa aleaga de fiecare data cand intra in aplicatie baza de date curenta.
Acest fisier se numeste administrator.ini, se gaseste in directorul aplicatiei si are urmatoarul continut:
Afiseaza Dialog Selectie Asociatie = False
Ultima Asociatie Utilizata = Dorobantilor109
Prima optiune se refera la afisarea formularului de selectie a asociatiei curente la lansarea in executie a aplicatiei si poate sa aiba valorile True(adica afiseaza) sau False(adica nu afiseaza).
3.2 Proiectarea interfetei utilizator
Meniul aplicatiei
Meniul aplicatiei este implementat in formularul container MDI, care se numeste frmMDIPrincipal. si are urmatoarea structura arborescenta:
Figura 8. Structura arborescenta a meniului
Tabelul urmator contine categoriile, subcategoriile meniului precum si functionalitatea acestora.
CATEGORIE SUBCATEGORIE FUNCTIONALITATE
General Alege Luna Curenta Alegerea, schimbarea lunii curente de prelucrare
Alege Asociatie Alegerea, schimbarea asociatiei de proprietari curente
Optiuni Optiuni ale aplicatiei
Iesire Iesire din aplicatie
Actualizari Facturi Lunare Introducerea, modificarea si vizualizarea facturilor lunare de la furnizorii de servicii
Consumuri pe Apartament Introducerea, modificarea si vizualizarea consumurilor lunare pe apartament(apartamentele contorizate)
Incasari Locatari Introducerea, modificarea si vizualizarea incasarilor de la proprietarii de apartamente(locatari)
Afisari Lista Cheltuieli Generarea, vizualizarea si tiparirea listei lunare de cheltuieli cu suma totala de plata si restante
Lista Cheltuieli Defalcate Generarea, vizualizarea si tiparirea listei lunare de cheltuieli cu suma totala de plata, restante si sumele defalcate pe consumuri.
Situatie Apartament Vizualizarea situatiei incasarilor pentru un apartament
Nomenclatoare Apartamente Introducerea, modificarea si vizualizarea datelor despre apartamente
Date Asociatie Introducerea, modificarea si vizualizarea datelor despre asociatia de proprietari(imobil)
Tip Consum Introducerea, modificarea si vizualizarea tipurilor de consum(tipuri de servicii)
Furnizori Introducerea, modificarea si vizualizarea listei de furnizori de servicii
Ajutor Asistenta Documentatia online(help-ul) a aplicatiei
Despre Informatii despre aplicatie
Tabel 7. Structura meniului
In general, functionalitatea meniului, si implicit a aplicatiei, este legata de luna curenta de prelucrare, care se poate modifica din meniul General. Exceptie de la aceasta regula fac subcategoriile aflate in categoria General, subcategoria Situatie Apartament din categoria Afisari, precum si Date Asociatie din categoria Nomenclatoare. Luna curenta de prelucrare este afisata permanent pe bara de titlu a aplicatiei(Title Bar). Prin schimbarea lunii curente de prelucrare folosind subcategoria Alege Luna Curenta, se actualizeaza toate informatiile dependente de luna de prelucrare, inclusiv nomenclatorul de apartamente, furnizori sau tipuri de consum.
In figura 9 este prezentata o mostra referitoare la organizarea meniului. Caracterele care sunt subliniate sunt shortcut-uri pentru utilizarea cu ajutorul tastaturii.
Figura 9. Forma meniului
Pe bara de titlu a aplicatiei este afisata permanent asociatia de proprietari curenta(in figura 9 este Dorobantilor 109), luna curenta si anul curent de prelucrare(in figura 9 este vorba de iunie 2004).
Fiecare subcategorie din meniu, cu exceptia celei de Iesire, are atasat un formular, care se initializeaza si se afiseaza la activarea optiunii respective. Subcategoriile Lista Cheltuieli si Lista Cheltuieli Defalcate au atasat acelasi formular, dar la initializarea acestuia se stabileste intr-o variabila specifica care dintre optiuni a facut apelul.
Toate formularele apartin containerului MDI, cu exceptia subcategoriei Asistenta, care se deschide separat fata de aplicatie.
Mentionez ca am urmarit sa realizez interfata utilizator intr-un mod cat mai simplu si intuitiv, folosind elemente de interfata standard de Windows, astfel incat utilizatorul sa fie deja familiarizat cu o mare parte din aceste elemente.
Formulare
FORMULAR TIP FORMULAR SUBCATEGORIE sau FORMULAR FUNCTIONALITATE frmSelectieLuna dialog modal Alege Luna Curenta Alegerea, schimbarea lunii curente de prelucrare frmAlegeAsociatie dialog modal Alege Asociatie Alegerea, schimbarea asociatiei de proprietari curente frmOptiuni dialog Optiuni Optiuni ale aplicatiei frmMsgBoxRom dialog modal Utilizat pentru rezolvarea unor optiuni de tip DA/NU frmFacturi MDI child Facturi Lunare Introducerea, modificarea si vizualizarea facturilor lunare de la furnizorii de servicii frmConsum MDI child Consumuri pe Apartament Introducerea, modificarea si vizualizarea consumurilor lunare pe apartament(ap. contorizate) frmIncasare MDI child Incasari Locatari Introducerea, modificarea si vizualizarea incasarilor de la proprietarii de apartamente(locatari) frmListaCheltuieli MDI child Lista Cheltuieli
Lista Cheltuieli Defalcate Generarea, vizualizarea si tiparirea listei lunare de cheltuieli cu suma totala de plata, restante si sumele defalcate pe consumuri. frmSituatieAp MDI child Situatie Apartament Vizualizarea situatiei incasarilor pentru un apartament frmApartamente MDI child Apartamente Introducerea, modificarea si vizualizarea datelor despre apartamente frmDateAsociatie MDI child Date Asociatie Introducerea, modificarea si vizualizarea datelor despre asociatia de proprietari frmTipConsum MDI child Tip Consum Introducerea, modificarea si vizualizarea tipurilor de consum(tipuri de servicii) frmFurnizori MDI child Furnizori Introducerea, modificarea si vizualizarea listei de furnizori de servicii frmSelectieData dialog modal frmIncasare Selectarea datei frmRECSelection dialog modal frmSituatieAp Alegerea unui anumit apartament dintr-o lista frmDespre dialog Despre Informatii despre aplicatie
Tabel 8. Lista Formularelor
Formularele de tip dialog modal sunt formulare care odata afisate, vor ramane afisate peste toate formularele(ferestrele) deschise deja, interzicand accesul la acestea pana la rezolvarea dialogului, de cele mai multe ori apasarea pe un buton de pe formularul dialog.
Observam in tabelul 8 ca unele formulare, cum ar fi frmSelectieData sau frmMsgBoxRom nu sunt direct afisabile dintr-o subcategorie a meniului. Aceste formulare sunt utilizate de catre alte formulare sau sunt afisate direct, fara a avea un formular parent.
Formulare cu regim special sunt frmAlegeAsociatie, si frmSelectieLuna, ambele sunt de tipul dialog modal.
Formularul frmAlegeAsociatie este afisat la prima intrare in aplicatie sau daca este bifata optiunea respectiva, se ocupa cu selectarea asociatiei de proprietari curente
Figura 10. Formularul frmAlegeAsociatie
Asa cum am precizat deja, acest formular cauta toate fisierele a caror denumire incepe cu mdb si au extensia mdb din directorul aplicatiei si le adauga in controlul de tip lista care se vede si in figura 9. Secventa de cod care face acest lucru este urmatoarea: fisier = Dir(appPath & "\" & "mdb*.mdb")
If fisier <> "" Then comboAsociatie.AddItem (mid(fisier, 4, Len(fisier) – 7))
End If
While fisier <> "" fisier = Dir
If fisier <> "" Then comboAsociatie.AddItem (mid(fisier, 4, Len(fisier) – 7))
End If
Wend
Formularul frmSelectieLuna are de asemenea un regim special, acesta se afiseaza intotdeauna la pornirea aplicatiei precum si la apelarea subcategoriei Alege Luna din meniu. Din punct de vedere functional, acesta se ocupa cu selectarea lunii curente si a anului curent de prelucrare, prin interogarea bazei de date referitor la inregistrarile din tabelul luna.
Figura 11. Formularul de selectie a lunii de prelucrare
Dupa cum se observa in figura de mai sus, formularul incarca intr-un control de tip lista lunile de prelucrare gasite in tabela luna. Utilizatorul are posibilitatea de a selecta una din lunile de prelucrare existente deja sau poate sa creeze o luna de prelucrare noua.
Secventa de cod care ruleaza in momentul adaugarii unei luni noi este urmatoarea: anul = Val(InputBox("Introduceti anul", "Anul", Year(Date)))
If anul < 2000 Or anul > 2100 Then Exit Sub luna = Val(InputBox("Introduceti luna", "Luna", Month(Date)))
If luna < 1 Or luna > 12 Then Exit Sub
If GetFieldFromTable("lunaID", "luna", "anul=" & anul & " and luna=" & luna) = "" Then idLastLuna = GetMaxMinFieldTable("max", "lunaID", "luna") conexiune.Execute "INSERT INTO luna (anul,luna) VALUES ("&anul&","&luna& ")"
If Not IsNull(idLastLuna) Then idLuna = GetDBIdentity
OpenRS rs, "SELECT * FROM apartament WHERE lunaID=" & idLastLuna
If rs.RecordCount <> 0 Then
While Not rs.EOF conexiune.Execute "INSERT INTO apartament " _
&"(lunaID,NrApartament,Proprietar,NrPersoane,NrCamere,Suprafata) " _
&"VALUES("&idLuna&","&rs("NrApartament")&",'"&rs("Proprietar")&"'," _
&rs("NrPersoane")& "," & rs("NrCamere") & "," & rs("Suprafata") & ")" rs.MoveNext
Wend
End If
End If
Else
MsgBox "Aceasta luna este deja existenta in baza de date", vbExclamation
End If
In aceasta secventa de cod, pentru creearea unei luni noi de prelucrare se adauga o inregistrare in tabela luna si apoi se copiaza structura apartamentelor din luna cea mai recenta gasita in aceasta tabela.
Un alt formular cu regim special pe care il vom prezenta este frmRECSelection, care este afisat la apasarea butonului Cauta Ap(Cauta Apartament) din toolbar-ul formularului frmSituatieAp. Este un formular de tip dialog modal.
Figura 12. Formularul frmRECSelection
Acest formular cauta toate inregistrarile din tabela apartament chiar daca nu sunt pentru luna curenta de prelucrare. Dupa selectia unuia dintre apartamente, in formularul frmSituatieAp se vor afisa toate incasarile facute pentru apartamentul selectat.
Proiectarea acestui formular este flexibila in sensul ca i se transmite printr-o variabila un sir care reprezinta o interogare SQL: frmRECSelection.lblQueryMaster = "SELECT apartamentID, nrApartament, " _
& "proprietar FROM apartament WHERE lunaID=" & ID_LUNA& " ORDER BY nrApartament"
Un alt formular folosit de catre frmIncasare este frmSelectieData care este un dialog modal si contine un control de tip Microsoft Acces Calendar Control, utilizat pentru stabilirea datei la care s-a emis chitanta pentru o incasare.
Nu vom discuta separat fiecare formular de tip MDI child, pentru ca din punct de vedere al interfetei utilizator sunt similare, diferentele sunt minore. De aceea, vom exemplifica functionalitatea unui astfel de formular, si anume frmApartamente care se ocupa de evidenta apartamentelor din imobil. Observam in figura 12 ca formularul este centrat pe un control de tip grid, care asa cum am specificat este implementat cu controlul VSFlexGrid.
Editarea se face in interiorul grid-ului, prin scrierea informatiei direct de la tastatura sau in unele cazuri prin selectarea unei celule a gridului se deschide un combobox.
In partea de deasupra gridului exista un toolbar, unde exista butoane pentru functiile de Salvare, Linie Noua si Stergere Linie.
Figura 13. Formularul frmApartamente
Controlul de grid este legat de baza de date direct, prin secventa:
Dim rs As New ADODB.Recordset
OpenRS rs,"SELECT * FROM apartament WHERE LunaID="&ID_LUNA&" ORDER BY nrApartament"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch unde
OpenRS este o functie care deschide un recordset pe baza unei interogari SQL si grNom este instanta obiectului de grid
Modificarile pe care utilizatorul le face in grid se actualizeaza efectiv in baza de date numai la apasarea butonului Salveaza prin apelarea functiei:
Public Sub DocSave() rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
3.3 Implementare
Din punct de vedere al codului, aplicatia este compusa dintr-un modul principal, aflat in fisierul principal.bas. In acest modul se afla declaratiile variabilelor globale, definitiile functiilor publice utilizate precum si rutina Main(), care se executa la rularea aplicatiei.
Functionalitatea fiecarui formular este definita in interiorul formularului, in functii care trateaza evenimentele de interfata ale obiectelor, cum ar fi initializarea formularului(eveniment de tip Form_Load) apasarea unei taste, editarea unei celule a gridului, apasarea unui buton din toolbar, selectarea unui element dintr-un combo, etc.
Din punct de vedere al accesului la baza de date din cod, am utilizat 2 metode: a. operatii directe asupra bazei de date cu ajutorul metodei Execute a instantei numita conexiune a obiectului Connection. exemple: actualizarea unei inregistrari conexiune.Execute "UPDATE imobil SET" _
& " denumire='" & txtDenumire & "'" _
& " ,adresa='" & txtAdresa & "'" _
& " ,localitate='" & txtLocalitate & "'" _
& " ,Judet='" & txtJudet & "'" _
& " ,numeAdministrator='" & txtNumeAdministrator & "'" _
& " WHERE imobilid=" & imobilID & ""
creearea unei tabele: conexiune.Execute "CREATE TABLE listaRap" adaugarea unor campuri intr-o tabela: conexiune.Execute "ALTER TABLE listaRap ADD COLUMN ID LONG" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Ap TEXT(5)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Proprietar TEXT(100)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN NrPers TEXT(3)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Suprafata LONG"
b. interogari SQL ale bazei de date si obtinerea unui recordset cu rezultatul interogarii exemplu:
OpenRS rs,"SELECT Sum(incasare.Suma) FROM apartament INNER JOIN incasare" _
& " ON apartament.apartamentID = incasare.ApartamentID where " _
& " (((apartament.LunaID) < " & idLuna & ")) GROUP BY" _
& " apartament.NrApartament HAVING (((apartament.NrApartament)=" _
& " apartamentNo & "))"
Functii publice
Descriem in continuare principalele functii publice definite in modulul principal, functii pe care le-am implementat ca elemente pentru simplificarea si optimizarea codului:
Main -; aceasta functie se executa prima data la rularea aplicatiei.Acesta face initializari pentru buna functionare a aplicatiei, afiseaza daca este cazul dialogul de selectie al asociatiei, afiseaza dialogul de selectie a lunii curente de prelucrare si apoi afiseaza si cedeaza controlul formularului frmMDIPrincipal. conecteazaBaza -; stabileste conexiunea cu baza de date cu secventa:
Set conexiune = New Connection conString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & bazaDate & ";" conexiune.ConnectionString = conString conexiune.CursorLocation = adUseClient
On Error GoTo 10 conexiune.Open conString
EndProgram -; este apelata la iesirea din program, scrie in fisierul de configurare, inchide conexiunea cu baza de date si elibereaza resursele alocate. citesteFisierIni -; citeste din fisierul de configurare administrator.ini. scrieFisierIni -; scrie in fisierul de configurare.
OpenRS -; deschide un recordset din baza de date prin intermediul unei interogari SQL.
GetStrForCombo -; creeaza o lista pentru un control de tip combo din controlul de grid. Elementele listei se obtin din inregistrarile unui tabel transmis ca parametru.
GetFieldFromTable -; returneaza o inregistrare dintr-un tabel.
GetMaxMinFieldTable -; returneaza inregistrarea cu valoare minima sau maxima a unui camp dintr-un tabel transmis ca parametru.
GetRecordCount -; numara inregistrarile dintr-un tabel care corespund unui criteriu de selectie.
GetComboItem -; returneaza un element dintr-o lista a unui control de tip combo.
GlueStr -; „lipeste” un sir de caractere, adica sterge semnele de punctuatie si alte caractere.
GetLunaName -; returneaza un sir de caractere care contine denumirea in limba romana a lunii calendaristice corespunzatoare indexului transmis ca parametru.
GetLunaPrelucrare -; returneaza luna si anul de prelucrare pe baza identificatorului din tabela luna.
Functia de calcul a cheltuielilor
Functia de calcul efectiv al cheltuielilor lunare, este definita si apelata in formularul frmListaCheltuieli. Datorita complexitatii codului acestei functii, vom enumera doar etapele pe care le urmareste aceasta functie . Calculul cheltuielilor se face pentru luna curenta de prelucrare. Pentru calcularea cheltuielilor pentru o alta luna, trebuie schimbata luna curenta de prelucrare.
1. Defineste variabile locale
2. Creeaza tabela temporara listaRap, la care adauga campurile ID, Ap, Proprietar, NrPers, Suprafata
3. Calculeaza numarul de apartamente din imobil
4. Calculeaza suprafata totala a apartamentelor din imobil
5. Calculeaza numarul total de persoane care locuiesc in apartamentele imobilului
6. Parcurge inregistrarile tabelei tipConsum si pentru fiecare inregistrare adauga doua campuri noi in tabela listaRap, un camp pentru consum si unul pentru suma aferenta acestui consum.
7. Adauga in tabela listaRap campurile Total si Restanta.
8. Parcurge tabela apartament si adauga informatiile despre apartamente in listaRap.
9. Completeaza la apartamentele contorizate valorile consumurilor, luate din tabela consum.
10. Pentru fiecare tip de consum, citeste consumul total si contravaloarea acestuia din tabela factura si le memoreaza in variabile locale.
11. Calculeaza consumurile contorizate.
12. Completeaza tabela listaRap, cu cuantumul consumului revenit fiecarui apartament necontorizat
13. Calculeaza si scrie in tabela listaRap suma aferenta fiecarui consum, la fiecare apartament.
14. Insumeaza toate sumele pentru fiecare apartament si obtine astfel suma totala de plata pentru fiecare apartament.
15. Calculeaza restanta pentru fiecare apartament pe baza sumelor datorate si a incasarilor efectuate anterior.
Dupa parcurgerea acestor etape, in tabela listaRap vom avea rezultatele finale ale calculelor, acestea vor fi afisate in grid iar prin apasarea butonului Tipareste de pe formularul frmListaCheltuieli, aceasta tabela va deveni sursa de date a raportului arListaCheltuieli.
In functie de optiunea aleasa din meniu, se vor afisa doar sumele totale de plata sau se vor afisa si sumele defalcate pe consumuri(figura urmatoare).
Figura 14. Lista cheltuielilor lunare defalcate(exemplificare)
Gridul, care la formularele celelalte este utilizat pentru editarea informatiilor, la lista de cheltuieli este folosit numai pentru afisare, nu se pot modifica valorile afisate. In cazul in care numarul de coloane sau de linii depaseste dimensiunea ferestrei, se vor afisa bare de derulare in stanga respectiv sub grid. Calculul cheltuielilor este un proces dinamic, nedestructiv, care nu modifica nici o informatie din baza de date, si se poate face in orice moment al utilizarii aplicatiei, fara a afecta rezultatele. Dupa efectuarea unor modificari a informatiilor legate de luna curenta(apartamente, facturi, consumuri, etc.) este necesar ca procedura de calcul sa fie refacuta.
Raportul cheltuielilor
Raportul este tratat de catre Visual Basic ca si un tip special de formular, numit designer, si are denumirea de arListaCheltuieli.
Dupa afisarea listei de cheltuieli, prin apasarea butonului Tipareste se genereaza raportul de cheltuieli, implementat cu ajutorul controlului ActiveReports. Acest raport este vizualizat pe ecran exact in forma in care va fi tiparit la imprimanta, controlul are diverse functii de vizualizare, marire/micsorare, derulare a paginilor, vizualizarea simultana a mai multor pagini. La capatul raportului se face si totalul sumelor de pe coloane.
Figura 15. Raportul cu cheltuielile lunare
Pentru ca in numarul de campuri care sunt incluse in raport nu se cunosc decat in momentul executiei, am realizat o functie care calculeaza numarul maxim de caractere de pe fiecare coloana si dimensioneaza astfel coloanele incat acestea sa fie vizibile si bine proportionate.
3.4 Documentare
Documentatia online a aplicatiei am realizat-o cu produsul HTML Help WorkShop, un produs care asambleaza fisiere de tip HTML si realizeaza un fisier de tip CHM(Compiled HTML). Asistenta se deschide ca o fereastra independenta fata de fereastra aplicatiei.
Documentatia este accesibila din aplicatie prin intermediul subcategoriei Asistenta din categoria Ajutor a meniului. Documentatia este de tip contextual, adica prin accesarea acestei optiuni sau prin apasarea tastei <F1> se deschide pagina din documentatie care se refera la formularul activ.
Deschiderea contextuala a documentatiei se realizeaza cu ajutorul unei proprietati a formularelor numita HelpContextID. Acest identificator trebuie sa corespunda cu identificatorul fiecarei pagini, definit intr-un fisier de tip header si utilizat de HTML Help WorkShop.
Figura 16. Documentatia online(Asistenta)
3.5 Testare
Am testat functionalitatea aplicatiei folosind date virtuale, atat in timpul implementarii, pentru verificarea fiecarei etape parcurse, cat si dupa finalizarea implementarii.
In urma testelor efectuate, am introdus mai multe reguli de validare a corectitudinii datelor introduse de catre utilizator, cum ar fi:
– valori negative pentru sume, numar de persoane, suprafata, etc.
– valori cu zecimale pentru numar de persoane.
– introducerea de campuri vide, etc.
De asemenea, am corectat o serie de erori de programare care au aparut in timpul implementarii.
Intr-o faza ulterioara, intentionez sa supun aplicatia unui test real, cu ajutorul unui administrator de imobil care sa utilizeze vechea metoda de calcul a cheltuielilor, cea neinformatizata, in paralel cu aplicatia, pentru a verifica concordanta rezultatelor obtinute si pentru a-mi oferi diferite sugestii referitoare la ergonomia aplicatiei.
3.6 Pachet de instalare
Realizarea pachetului (kit-ului) de instalare am folosit produsul Little Setup Builder, care este specializat pe realizarea pachetelor de instalare. Cu ajutorul acestui produs se poate specifica exact ce trebuie sa contina acest pachet si ce operatii trebuie efectuate in momentul instalarii. Pachetul de instalare generat este sub forma unui fisier executabil denumit Instalare_Administrator.exe.
La proiectarea pachetului, se pot specifica numeroase optiuni, cum ar fi:
– fisierele pe care trebuie sa le includa pachetul, cu specificarea directorului unde trebuie instalat fiecare fisier.
– comenzi care trebuie executate in timpul instalarii, de exemplu daca pachetul contine fisiere executabile(subpachete cu componente sau alte tipuri de fisiere).
– modificari ale registrelor sistemului de operare, pentru inregistrarea aplicatiei sau a componentelor utilizate de aceasta.
– crearea de shortcut-uri la aplicatie in meniul sistemului de operare sau pe desktop.
– optiuni pentru dezinstalare.
4. CAIET DE SARCINI
Aplicatia Administrator se livreaza pe suport optic de tip Compact Disc sub forma unui pachet de instalare, fisier executabil.
Rularea acestui pachet duce la instalarea pe sistemul de calcul a componentelor necesare pentru executia aplicatiei, instalarea aplicatiei intr-un director propriu pe hard-disk. Aplicatia in sine este un fisier executabil rezultat in urma compilarii din mediul Visual Basic.
Pentru instalarea si rularea aplicatiei Administrator, exista urmatoarele necesitati hardware ale sistemului de calcul:
– calculator compatibil IBM PC.
– procesor Pentium la o frecventa minima de 133 Mhz, recomandat 300 Mhz.
– memorie RAM minim 32 Mb, recomandat 64 Mb.
– spatiul necesar pe hard-disk pentru instalarea aplicatiei si a componentelor necesare este de 25 Mb.
– pentru buna functionare a aplicatiei recomandam un spatiu liber de minim 100Mb pe harddisk.
– imprimanta atasata pentru tiparirea listei de cheltuieli.
Din punct de vedere software, exista urmatoarele necesitati:
– sistem de operare Microsoft Windows 98, Millennium, 2000 sau XP .
– rezolutie minima recomandata a ecranului 800×600.
– imprimanta instalata.
Observatie:
Am testat aplicatia pe un sistem de calcul cu urmatoarea configuratie:
Pentium I 166Mhz, 32Mb RAM, rezolutie ecran 800×600, Windows 98
In urma testelor am obtinut rezultate satisfacatoare.
5. MANUAL DE OPERARE
Instructiuni pentru instalarea aplicatiei
Pentru instalarea aplicatiei, se lanseaza Instalare_Administrator.exe aflat pe CD-ul de instalare. Aceasta operatiune duce la deschiderea ferestrei din figura urmatoare.
Figura 17. Instalarea aplicatiei. Pasul 1
Este afisat directorul destinatie implicit pentru instalarea aplicatiei, care este directorul uzual unde se instaleaza aplicatiile in Windows, Program Files. Daca doriti sa instalati aplicatia intr-un alt director, fie specificati exact calea in casuta respectiva, fie apasati butonul Directoare, caz in care se va deschide o alta fereastra unde veti putea alege unul din directoarele de pe harddisk.
In partea de jos a ferestrei din figura 17 se afiseaza spatiul necesar pentru instalarea aplicatiei si a componentelor acesteia precum si spatiul disponibil.
Dupa alegerea directorului apasati butonul Inainte pentru a trece la pasul 2, care deschide fereastra din figura 18.
Figura 18. Instalarea aplicatiei. Pasul 2
La pasul 2 aveti posibilitatea de a selecta grupul din meniul Programs al Windows-ului in care se vor crea shortcut-uri la aplicatie. Prin apasarea butonului Inainte se trece la pasul 3.
Figura 19. Instalarea aplicatiei. Pasul 3
La pasul 3 se afiseaza sumarul optiunilor selectate. In cazul in care doriti sa modificati unele dintre acestea, apasati butonul Inapoi. Daca nu, apasati butonul Instalare.
In timpul instalarii, este posibil sa apara mesaje de avertizare. La aceste mesaje apasati butonul Skip.
Daca instalarea a fost efectuata cu succes, se va afisa fereastra din figura 20, unde apasati butonul Iesire.
Figura 20. Instalarea aplicatiei. Pasul 2
Lansarea aplicatiei se face apasand butonul de Start al Windows-ului si apoi alegand Programs si Administrator. Se mai poate lansa aplicatia si cu dublu click pe icoana care a fost creata pe desktop.
Instructiuni de utilizare
Instructiunile de utilizare a aplicatiei Administrator se pot consulta dupa instalarea aplicatiei, fie prin lansarea aplicatiei si accesarea optiunii Asistenta din meniu(sau apasarea tastei <F1>), fie prin accesarea directa a acesteia apasand butonul de Start al Windows-ului si apoi alegand Programs si Asistenta Administrator.
6. CONCLUZII
Aprecieri
Aplicatia Administrator, destinata asociatiilor de proprietari respectiv administratorilor de imobile, are rolul de usura si de a sistematiza munca acestora din urma. In momentul de fata in Romania exista un numar mare de administratori de imobile care folosesc metode neinformatizate de calcul, un procedeu greoi, care necesita o munca obositoare, etapele de calcul fiind destul de greu de urmarit. In orice moment exista posibilitatea introducerii unor erori de calcul, care pot sa aiba implicatii grave, avand in vedere ca in fond este vorba de sume de bani si orice greseala are efect asupra locatarilor si implicit asupra administratorului de imobil. Deci automatizarea acestei munci este mai mult decat binevenita.
Prin realizarea acestei aplicatii, apreciez ca se simplifica foarte mult munca administratorului, cu o economie de timp de cel putin 50%.
Realizarea aplicatiei este flexibila, pentru ca, spre deosebire de alte aplicatii care incearca sa rezolve aceasta problema, consider ca am gasit un model foarte flexibil pentru implementarea contorizarii apartamentelor. Alte aplicatii au campuri de informatie specializate pentru contoarele de apa, de gaz, etc., iar in momentul in care se introduce un tip nou de contorizare trebuie rescris codul aplicatiei. In schimb, aplicatia Administrator rezolva aceasta problema prin introducerea termenului generic consum, cu ajutorul caruia orice tip de consum nominalizat la nomenclatorul de tipuri de consum poate fi practic contorizat. De asemenea, daca un apartament este debransat de la un anumit tip de serviciu, este suficient ca pentru apartamentul respectiv sa se introduca la consumuri un consum cu valoare zero.
De asemenea consider ca am rezolvat intr-un mod elegant problema modificarilor care survin de la o luna la alta referitor la apartamente(numarul de persoane, suprafata, proprietarul, etc.) prin legarea structurii apartamentelor de luna de prelucrare, astfel orice modificare la nivel de apartament este valabila numai pentru luna curenta de prelucrare. Acest mod de abordare permite si evidenta exacta a situatiei, pentru oricare din lunile precedente.
Posibilitati de dezvoltare ulterioara
Desi aplicatia este intr-o forma utilizabila destul de completa, totusi exista posibilitatea dezvoltarii sale ulterioare, prin adaugarea unor facilitati cum ar fi:
– introducerea unei functii de tip statistica, care sa prezinte din punct de vedere statistic situatia cheltuielilor pe imobil sau pe apartament, eventual cu posibilitatea urmaririi evolutiei cheltuielilor pentru un anumit tip de consum. O astfel de functie este relativ usor de realizat si se pot folosi elemente grafice de tip chart pentru reprezentarea valorilor statistice.
– implementarea unei functii care sa permita exportul(salvarea) bazei de date curenta pe o discheta, sub forma comprimata, iar apoi sa permita incarcarea de pe discheta a bazei de date salvata.
– elemente de securitate, care ar fi necesare mai ales in cazul in care mai multi administratori de imobil ar lucra pe acelasi sistem de calcul cu aplicatia, fiecare dintre ei administrand o alta asociatie de locatari. In acest caz ar trebui ca fiecare baza de date sa aiba o parola care sa fie introdusa la selectarea asociatiei curente.
– realizarea unei functii care sa exporte lista de cheltuieli sub forma unui fisier HTML, direct pe un server de web, si astfel locatarii ar avea posibilitatea sa consulte lista prin intermediul internetului.
– datorita conexiunii de tip ADO, se poate realiza si o arhitectura de tip client-server sau multistrat a aplicatiei, prin modificari minore ale codului si prin adaugarea unui formular care sa gestioneze conexiunea la baza de date. Astfel, baza de date ar putea sa fie gestionata de un server(SQL Server, MySQL,etc.).
– realizarea unui raport legat de formularul de Incasare, care sa permita tiparirea chitantei pentru locatar direct pe imprimanta, evitandu-se scrierea acesteia cu mana. Pentru realizarea acestei functii ar trebui un chitantier special, care sa nu fie legat, cum sunt cele valabile in momentul de fata.
– realizarea unei pagini de web interactive, unde locatarul sa poata sa isi introduca singur valorile citite de la contoarele din apartament, autentificandu-se bineinteles cu o parola proprie. Deocamdata legislatia nu permite o astfel de facilitate, contoarele trebuie sa fie de catre administrator sau de catre firme autorizate.
BIBLIOGRAFIE
1. H.G. 400/2003 – Normele metodologice privind organizarea si functionarea asociatiilor de proprietari.
2. O.M.P.F. 2329/2001 – Normele metodologice privind organizarea si conducerea contabilitatii in partida simpla de catre persoanele juridice fara scop lucrativ.
3. http://blocb7.idilis.ro, Pagina web a Asociatiei de Proprietari bloc B7, Bucuresti
4. Legea nr. 326 din 28 iunie 2001 privind serviciilor publice de gospodarie comunala Publicat In M.Of. Nr. 359 din 04.07.2001
5. ORDIN MLPAT nr. 29/1993 pentru aprobarea Normativului-cadru privind contorizarea apei si a energiei termice la populatie, institutii publice si agenti economici Publicat In M.Of. Nr. 25 din 27.01.1994
6. Hotarare nr. 1275 din 7 decembrie 2000 privind aprobarea Normelor metodologice pentru punerea in aplicare a prevederilor Legii locuintei nr. 114/1996 Publicat in Monitorul Oficial al Romaniei nr. 690 din 22 decembrie 2000
7. Hotarare nr. 366 din 4 aprilie 2001 privind modificarea Normelor metodologice pentru punerea in aplicare a prevederilor Legii locuintei nr. 114/1996, aprobate prin Hotararea Guvernului nr. 1.275/2000 Publicat in Monitorul Oficial al Romaniei nr. 178 din 9 aprilie 2001
8. HOTARIRE 41 din 14/02/2002 privind contorizarea consumurilor de apa rece, apa calda menajera si caldura la apartamentele din cadrul asociatiilor de locatari / asociatiilor de proprietari
9. Dragomir, Gabriel, Dezvoltarea aplicatiilor cu baze de date, Note de curs
10. Rahmel, Dan, Programarea bazelor de date cu Visual Basic 6 in 24 de ore, Editura Teora, 1999
11. Microsoft Developer Knowledge Base, © 1991-1998 Microsoft Corporation. All rights reserved.
ANEXE
Anexa 1. Listing Program
–––––––––––––––––––––––––––––––––––––––– principal.bas
–––––––––––––––––––––––––––––––––––––––– 'Proiect de diploma Raul Chiorean an III TC
Public conexiune As Connection
Public bazaDate As String
Public denumireAsociatie As String
Public afiseazaDialogAsociatie As Boolean
Public appPath As String
Public dataCurenta As Date
Public ID_LUNA As Long
Public Const TC_APARTAMENT = 1
Public Const TC_NRPERSOANE = 2
Public Const TC_SUPRAFATA = 3
Public Const LOG_FILE = "functionare.log"
Public Const INI_FILE = "administrator.ini"
Public Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Sub Main() dataCurenta = Date
If App.PrevInstance Then
MsgBox "O instanta a aplicatiei ruleaza deja !", vbExclamation, "Notificare"
End
End If
WriteToLog ("Pornire.") appPath = App.Path
WriteToLog ("Citire fisier ini.") citesteFisierIni
If denumireAsociatie <> "" And Dir(appPath & "\" & "mdb" & denumireAsociatie & ".mdb") = "" Then
MsgBox "Asociatia " & denumireAsociatie & " nu mai exista pe disc.", vbCritical, "Eroare fatala" denumireAsociatie = "" scrieFisierIni
End If
If afiseazaDialogAsociatie = True Or denumireAsociatie = "" Then
WriteToLog ("Alegere asociatie.") afiseazaDialogAsociatie = True frmAlegeAsociatie.Show vbModal
Else bazaDate = appPath & "\" & "mdb" & denumireAsociatie & ".mdb" conecteazaBaza
End If frmSelectieLuna.Show vbModal frmMDIPrincipal.Show
End Sub
Public Sub conecteazaBaza()
Set conexiune = New Connection conString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & bazaDate & ";" conexiune.ConnectionString = conString conexiune.CursorLocation = adUseClient
On Error GoTo 10 conexiune.Open conString
Exit Sub
10:
MsgBox "Conexiune esuata la baza de date " & bazaDate & "." & Chr(13) & "Verificati existenta fisierului sau apelati la ajutorul unui specialist.", vbCritical, "Eroare fatala" afiseazaDialogAsociatie = False denumireAsociatie = ""
End
End Sub
Public Sub EndProgram()
Dim obj
On Error Resume Next
Kill appPath & "\*.tmp"
On Error GoTo 0 scrieFisierIni conexiune.Close
Set conexiune = Nothing
For Each obj In Forms
Unload obj
Next
End
End Sub
Sub citesteFisierIni()
If Dir(appPath & "\" & INI_FILE) = "" Then
Open appPath & "\" & INI_FILE For Output As #1
Print #1, "Afiseaza Dialog Selectie Asociatie = True"
Print #1, "Ultima Asociatie Utilizata = "
Close #1
Else
Dim afiseazaDialogAsociatieStr As String
Dim denumireAsociatieStr As String
Open appPath & "\" & INI_FILE For Input As #1
Line Input #1, afiseazaDialogAsociatieStr
Line Input #1, denumireAsociatieStr
Close #1
If mid(afiseazaDialogAsociatieStr, InStr(afiseazaDialogAsociatieStr, "=") + 2) = "True" Then afiseazaDialogAsociatie = True
Else afiseazaDialogAsociatie = False
End If denumireAsociatie = mid(denumireAsociatieStr, InStr(denumireAsociatieStr, "=") + 2)
End If
End Sub
Sub scrieFisierIni()
Dim rs As New Recordset
Open appPath & "\" & INI_FILE For Output As #1
Print #1, "Afiseaza Dialog Selectie Asociatie = " & afiseazaDialogAsociatie
Print #1, "Ultima Asociatie Utilizata = " & denumireAsociatie
Close #1
End Sub
Public Sub WriteToLog(st As String)
Open appPath & "\" & LOG_FILE For Append As #1
Print #1, Format(Date, "dddd, d mmm yyyy") & " – " & Format(Time, "hh:mm:ss AMPM") & " >>> " & st
Close #1
End Sub
Public Function NormalizeStr(str As String) As String
Dim ret As String ret = str ret = Replace(ret, """", "_") ret = Replace(ret, ":", "_") ret = Replace(ret, "\", "_") ret = Replace(ret, "|", "_") ret = Replace(ret, "/", "_") ret = Replace(ret, "*", "_") ret = Replace(ret, "?", "_") ret = Replace(ret, "<", "_") ret = Replace(ret, ">", "_") ret = Replace(ret, ".", "_") ret = Replace(ret, "'", "_")
If Len(ret) > 255 Then ret = Left(ret, 254)
NormalizeStr = ret
End Function
Public Function MsgBoxRom(intrebare As String, titlu As String) As Boolean frmMsgBoxRom.Caption = titlu frmMsgBoxRom.lblIntrebare.Caption = intrebare frmMsgBoxRom.Show vbModal
MsgBoxRom = frmMsgBoxRom.Tag
Unload frmMsgBoxRom
End Function
Public Sub OpenRS(ByVal rs As ADODB.Recordset, strSql As String, Optional db As String)
' On Error GoTo err:
If rs.State = adStateOpen Then rs.Close
If db = "" Then rs.Open strSql, conexiune, adOpenStatic, adLockOptimistic
Else
Dim cn As New ADODB.Connection cn.ConnectionString = "DSN=MS Access Database;DBQ=" & App.Path & "\" & db & ";DefaultDir=" & App.Path & ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;PWD=" & DBPASSWD & ";" cn.Open rs.Open strSql, cn, adOpenStatic, adLockOptimistic
End If
Exit Sub err:
If err.Number = -2147217865 Then Resume 'nu gaseste query
End Sub
Public Function GetStrForCombo(ByRef gr As VSFlexGrid, tabel As String, fields As String, id As String, Optional filter As String, Optional order As String)
Dim rs As New Recordset
Dim strRS As String
If InStr(1, fields, "I") = 0 Then fields = "I" & fields strRS = "select " & id & "," & Replace(fields, "I", "") & " from " & tabel
If filter <> "" Then strRS = strRS & " where " & filter
End If
If order <> "" Then strRS = strRS & " order by " & order
End If
OpenRS rs, strRS
If rs.RecordCount > 0 Then
GetStrForCombo = gr.BuildComboList(rs, Replace(fields, "I", "*"), id)
Else
GetStrForCombo = "NULL"
End If rs.Close
Set rs = Nothing
End Function
Public Function GetFieldFromTable(field As String, table As String, Optional filtru As String, Optional firstlast As String) As Variant
Dim rs As New Recordset
If filtru <> "" Then rs.Open "select " & field & " from " & table & " where " & filtru, conexiune, adOpenStatic, adLockOptimistic
Else rs.Open "select " & field & " from " & table, conexiune, adOpenStatic, adLockOptimistic
End If
If rs.RecordCount > 0 Then
If firstlast = "first" Then rs.MoveFirst
GetFieldFromTable = rs.fields(0) & ""
ElseIf firstlast = "last" Then rs.MoveLast
GetFieldFromTable = rs.fields(0) & ""
Else
GetFieldFromTable = rs.fields(0) & ""
End If
Else
GetFieldFromTable = ""
End If rs.Close
Set rs = Nothing
End Function
Public Function GetMaxMinFieldTable(maxmin As String, field As String, table As String, Optional filtru As String) As Variant
Dim rs As New Recordset
If filtru = "" Then rs.Open "select " & maxmin & "(" & field & ") from " & table, conexiune, adOpenStatic, adLockOptimistic
Else rs.Open "select " & maxmin & "(" & field & ") from " & table & " where " & filtru, conexiune, adOpenStatic, adLockOptimistic
End If
If rs.RecordCount > 0 Then
GetMaxMinFieldTable = IIf(IsNull(rs.fields(0)), 0, rs.fields(0))
Else
GetMaxMinFieldTable = Null
End If rs.Close
Set rs = Nothing
End Function
Public Function GetRecordCount(table As String, Optional filtru As String) As Long
Dim rs As New Recordset
If filtru <> "" Then
OpenRS rs, "select count(*) from " & table & " where " & filtru
Else
OpenRS rs, "select count(*) from " & table
End If
GetRecordCount = rs.fields(0) rs.Close
Set rs = Nothing
End Function
Public Function GetComboItem(Row As Long, Col As Long, strCombo As String) As String
Dim kr As Long
Dim kc As Long
Dim tl As Long
Dim strTmp As String strTmp = strCombo
For kr = 0 To Row tl = InStr(1, strTmp, ";") strTmp = mid(strTmp, tl + 1, Len(strTmp) – tl)
Next
For kr = 1 To Col tl = InStr(1, strTmp, Chr(9)) strTmp = mid(strTmp, tl + 1, Len(strTmp) – tl)
Next tl = InStr(1, strTmp, Chr(9))
If tl <> 0 Then strTmp = mid(strTmp, 1, tl – 1) tl = InStr(1, strTmp, "|")
If tl <> 0 Then strTmp = mid(strTmp, 1, tl – 1)
End If
End If
GetComboItem = strTmp
End Function
Public Function GlueStr(str As String) As String
Dim ret As String ret = str ret = Replace(ret, """", "") ret = Replace(ret, ":", "") ret = Replace(ret, "\", "") ret = Replace(ret, "|", "") ret = Replace(ret, "/", "") ret = Replace(ret, "*", "") ret = Replace(ret, "?", "") ret = Replace(ret, "<", "") ret = Replace(ret, ">", "") ret = Replace(ret, ".", "") ret = Replace(ret, "'", "") ret = Replace(ret, "`", "") ret = Replace(ret, "I", "") ret = Replace(ret, "@", "") ret = Replace(ret, "#", "") ret = Replace(ret, "$", "") ret = Replace(ret, "%", "") ret = Replace(ret, "^", "") ret = Replace(ret, "&", "") ret = Replace(ret, "(", "") ret = Replace(ret, ")", "") ret = Replace(ret, "-", "") ret = Replace(ret, "_", "") ret = Replace(ret, "+", "") ret = Replace(ret, "=", "") ret = Replace(ret, "A", "") ret = Replace(ret, "S", "") ret = Replace(ret, "a", "") ret = Replace(ret, "i", "") ret = Replace(ret, ";", "") ret = Replace(ret, ",", "") ret = Replace(ret, " ", "")
GlueStr = ret
End Function
Public Function GetLunaName(L As Integer) As String
Select Case L
Case 1:
GetLunaName = "Ianuarie"
Case 2:
GetLunaName = "Februarie"
Case 3:
GetLunaName = "Martie"
Case 4:
GetLunaName = "Aprilie"
Case 5:
GetLunaName = "Mai"
Case 6:
GetLunaName = "Iunie"
Case 7:
GetLunaName = "Iulie"
Case 8:
GetLunaName = "August"
Case 9:
GetLunaName = "Septembrie"
Case 10:
GetLunaName = "Octombrie"
Case 11:
GetLunaName = "Noiembrie"
Case 12:
GetLunaName = "Decembrie"
Case Else:
GetLunaName = "???"
End Select
End Function
Public Function GetLunaPrelucrare(idLuna As Long) As String
GetLunaPrelucrare = GetLunaName(GetFieldFromTable("luna", "luna", "lunaID=" & idLuna)) & " / " & GetFieldFromTable("anul", "luna", "lunaID=" & idLuna)
End Function
–––––––––––––––––––––––––––––––––––––––– frmAlegeAsociatie
–––––––––––––––––––––––––––––––––––––––– Private Sub CheckAfisare_Click()
If CheckAfisare.Value = 1 Then afiseazaDialogAsociatie = True
Else afiseazaDialogAsociatie = False
End If
End Sub
Private Sub cmdAbandon_Click()
Dim frm As Form
For Each frm In Forms
If frm.Name = "frmMDIPrincipal" Then
Unload Me
Exit Sub
End If
Next
Unload Me
End
End Sub
Private Sub cmdAdaugaAsociatie_Click()
Dim newAsociatie As String
Dim newAsociatieNorm As String newAsociatie = InputBox("Introduceti denumirea asociatiei :", "Adaugare asociatie noua") newAsociatieNorm = NormalizeStr(newAsociatie)
If Len(newAsociatieNorm) = 0 Then Exit Sub
If Dir(appPath & "\mdb" & newAsociatieNorm & ".mdb") <> "" Then
MsgBox "Asociatia " & newAsociatieNorm & " exista deja pe disc", vbExclamation, "Notificare"
Exit Sub
End If
If newAsociatieNorm <> "" Then
FileCopy appPath & "\template.mdb", appPath & "\mdb" & newAsociatieNorm & ".mdb" citesteBazeDisc
End If
For i = 1 To comboAsociatie.ListCount
If comboAsociatie.List(i) = newAsociatieNorm Then comboAsociatie.ListIndex = i
Next
End Sub
Private Sub cmdOk_Click()
Dim rs As New ADODB.Recordset
Screen.MousePointer = vbHourglass bazaDate = appPath & "\" & "mdb" & comboAsociatie.Text & ".mdb" denumireAsociatie = comboAsociatie.Text conecteazaBaza
OpenRS rs, "SELECT * FROM luna"
Screen.MousePointer = vbDefault
ID_LUNA = 0
If rs.RecordCount = 0 Then frmSelectieLuna.Show vbModal
End If
Unload Me
End Sub
Private Sub Form_Load()
If afiseazaDialogAsociatie = True Then
CheckAfisare.Value = 1
Else
CheckAfisare.Value = 0
End If citesteBazeDisc
If comboAsociatie.ListCount = 0 Then cmdOk.Enabled = False
End If
End Sub
Sub citesteBazeDisc()
Dim fisier As String
Dim i As Integer
Screen.MousePointer = vbHourglass comboAsociatie.Clear fisier = Dir(appPath & "\" & "mdb*.mdb")
If fisier <> "" Then comboAsociatie.AddItem (mid(fisier, 4, Len(fisier) – 7))
End If
While fisier <> "" fisier = Dir
If fisier <> "" Then comboAsociatie.AddItem (mid(fisier, 4, Len(fisier) – 7))
Wend
If comboAsociatie.ListCount <> 0 Then comboAsociatie.ListIndex = 0
Screen.MousePointer = vbDefault
End Sub
Private Sub Form_Resize()
With Toolbar1
.Width = .ButtonWidth * .Buttons.Count
.Left = ScaleWidth – .Width – 70
End With
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
If Button.Index = 2 Then cmdOk_Click
Else cmdAbandon_Click
End If
End Sub
–––––––––––––––––––––––––––––––––––––––– frmApartament
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim GD_NRCAMERE As Integer
Dim GD_NRPERSOANE As Integer
Dim GD_PROPRIETAR As Integer
Dim GD_NRAPARTAMENT As Integer
Dim GD_LUNAID As Long
Dim GD_APARTAMENTID As Long
Dim GD_SUPRAFATA As Long
Dim GD_OBSERVATII As Long
Dim trebuieSalvat As Boolean
Public Sub DocSave() rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew
If grNom.Rows = 2 Then rs.fields("nrPersoane") = 1 rs.fields("nrCamere") = 1 rs.fields("nrApartament") = 1
Else rs.fields("nrPersoane") = grNom.TextMatrix(grNom.Rows – 2, GD_NRPERSOANE) rs.fields("nrCamere") = grNom.TextMatrix(grNom.Rows – 2, GD_NRCAMERE) rs.fields("suprafata") = grNom.TextMatrix(grNom.Rows – 2, GD_SUPRAFATA) rs.fields("nrApartament") = grNom.TextMatrix(grNom.Rows – 2, GD_NRAPARTAMENT) + 1
End If rs.fields("lunaID") = ID_LUNA grNom.SetFocus grNom.Col = GD_PROPRIETAR grNom.EditCell
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg Apartamentul " & grNom.TextMatrix(rw, GD_NRAPARTAMENT) & " ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_APARTAMENTID) = True grNom.ColHidden(GD_LUNAID) = True grNom.TextMatrix(0, GD_NRAPARTAMENT) = "Nr Ap"
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox Replace("Apartamentul * nu poate fi sters deoarece este utilizat in alte documente", "*", grNom.TextMatrix(rw, GD_NRAPARTAMENT)), vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_NRAPARTAMENT) = wdth * 10 grNom.ColWidth(GD_PROPRIETAR) = wdth * 25 grNom.ColWidth(GD_NRCAMERE) = wdth * 10 grNom.ColWidth(GD_NRPERSOANE) = wdth * 10 grNom.ColWidth(GD_SUPRAFATA) = wdth * 10 grNom.ColWidth(GD_OBSERVATII) = wdth * 30
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
For i = 1 To grNom.Rows – 1
If Trim(grNom.TextMatrix(i, GD_PROPRIETAR)) = "" And UCase(grNom.TextMatrix(0, 2)) = "PROPRIETAR" Then
MsgBox "Nu puteti avea proprietar fara nume", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
If Val(grNom.TextMatrix(i, GD_NRCAMERE)) <= 0 Then
MsgBox "Numarul de camere trebuie sa fie mai mare decat zero", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close
Set rs = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
End Sub
Private Sub Timer1_Timer()
Dim i As Long
Timer1.Interval = 0
Timer1.Enabled = False
OpenRS rs, "SELECT * FROM apartament WHERE LunaID=" & ID_LUNA & " ORDER BY nrApartament"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "LUNAID"
GD_LUNAID = i grNom.ColHidden(i) = True
Case "APARTAMENTID"
GD_APARTAMENTID = i grNom.ColHidden(i) = True
Case "NRCAMERE"
GD_NRCAMERE = i grNom.ColEditMask(i) = "99"
Case "NRPERSOANE"
GD_NRPERSOANE = i grNom.ColEditMask(i) = "99"
Case "NRAPARTAMENT" grNom.TextMatrix(0, i) = "Nr Ap"
GD_NRAPARTAMENT = i grNom.ColEditMask(i) = "999"
Case "PROPRIETAR"
GD_PROPRIETAR = i
Case "SUPRAFATA"
GD_SUPRAFATA = i
Case "OBSERVATII"
GD_OBSERVATII = i
End Select
Next grNom.Col = GD_PROPRIETAR
Form_Resize
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Linie Noua"
DocNou
Case "Sterge Linia"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmConsum
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim rsc As New ADODB.Recordset
Dim rst As New ADODB.Recordset
Dim GD_CONSUMID As Integer
Dim GD_TIPCONSUMID As Integer
Dim GD_APARTAMENTID As Long
Dim GD_VALOARE As Integer
Dim trebuieSalvat As Boolean
Public Sub DocSave()
Dim i As Long
For i = 1 To grNom.Rows – 1
If grNom.TextMatrix(i, GD_TIPCONSUMID) = "" Then
MsgBox "Nu poate exista consum fara tip de consum" grNom.SetFocus grNom.Col = GD_TIPCONSUMID
Exit Sub
End If
If grNom.TextMatrix(i, GD_APARTAMENTID) = "" Then
MsgBox "Nu poate exista consum fara apartament" grNom.SetFocus grNom.Col = GD_APARTAMENTID
Exit Sub
End If
Next rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew rs.fields("valoare") = 0 grNom.SetFocus grNom.Col = GD_APARTAMENTID grNom.EditCell
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg consumul ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_CONSUMID) = True grNom.ColComboList(GD_TIPCONSUMID) = grNom.BuildComboList(rsc, "denumireConsum,um", "tipConsumID") grNom.TextMatrix(0, GD_TIPCONSUMID) = "Tip Consum" grNom.ColComboList(GD_APARTAMENTID) = grNom.BuildComboList(rst, "*nrApartament,proprietar", "apartamentID") grNom.TextMatrix(0, GD_APARTAMENTID) = "Apartament"
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox "Consumul nu poate fi sters deoarece este utilizat in alte documente", vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Load()
Dim i As Long
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
OpenRS rsc, "SELECT tipConsumID,denumireConsum FROM tipConsum"
OpenRS rst, "SELECT apartamentID,nrApartament,proprietar FROM apartament WHERE lunaID=" & ID_LUNA & " ORDER BY nrApartament"
OpenRS rs, "SELECT consum.consumID,consum.apartamentID,consum.tipconsumID,consum.Valoare FROM consum INNER JOIN apartament ON consum.apartamentID=apartament.apartamentID WHERE apartament.lunaID=" & ID_LUNA & " ORDER BY apartament.nrApartament,consum.tipConsumID"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "CONSUMID"
GD_CONSUMID = i grNom.ColHidden(i) = True
Case "TIPCONSUMID"
GD_TIPCONSUMID = i grNom.ColComboList(GD_TIPCONSUMID) = grNom.BuildComboList(rsc, "denumireConsum", "tipConsumID") grNom.TextMatrix(0, GD_TIPCONSUMID) = "Tip Consum"
Case "APARTAMENTID"
GD_APARTAMENTID = i grNom.ColComboList(GD_APARTAMENTID) = grNom.BuildComboList(rst, "*nrApartament,proprietar", "apartamentID") grNom.TextMatrix(0, GD_APARTAMENTID) = "Apartament"
Case "VALOARE"
GD_VALOARE = i
End Select
Next
grNom.Col = GD_VALOARE
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_TIPCONSUMID) = wdth * 40 grNom.ColWidth(GD_APARTAMENTID) = wdth * 30 grNom.ColWidth(GD_VALOARE) = wdth * 25
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close rsc.Close rst.Close
Set rs = Nothing
Set rsc = Nothing
Set rst = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_ComboCloseUp(ByVal Row As Long, ByVal Col As Long, FinishEdit As Boolean)
FinishEdit = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
End If
If Col = GD_VALOARE And Val(Trim(grNom.EditText)) < 0 Then
MsgBox "Valoarea nu poate fi negativa", vbExclamation, "Atentie"
Cancel = True
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Linie Noua"
DocNou
Case "Sterge Linia"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmDateAsociatie
–––––––––––––––––––––––––––––––––––––––– Dim imobilID As Long
Private Sub Form_Load()
Dim rs As New Recordset
Set Me.Icon = frmMDIPrincipal.Icon
OpenRS rs, "SELECT * FROM imobil"
If rs.RecordCount <> 0 Then imobilID = rs("imobilID") txtDenumire = rs("Denumire") txtAdresa = rs("Adresa") txtLocalitate = rs("Localitate") txtJudet = rs("Judet") txtNumeAdministrator = rs("numeAdministrator")
End If rs.Close
End Sub
Public Sub DocSave()
Dim oText As Control
Dim rs As New Recordset
For Each oText In Me.Controls
If mid(oText.Name, 1, 3) = "txt" Then
If oText.Text = "" Then
MsgBox "Completati toate campurile !", vbInformation, "Atentie"
Exit Sub
End If
End If
Next
OpenRS rs, "SELECT * FROM imobil"
If rs.RecordCount = 0 Then rs.AddNew "denumire", "x" rs.Update imobilID = rs("imobilID") rs.Close
End If conexiune.Execute "UPDATE imobil SET denumire='" & txtDenumire & "'" _
& " ,adresa='" & txtAdresa & "'" _
& " ,localitate='" & txtLocalitate & "'" _
& " ,Judet='" & txtJudet & "'" _
& " ,numeAdministrator='" & txtNumeAdministrator & "'" _
& " WHERE imobilid=" & imobilID & ""
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmFacturi
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim rst As New ADODB.Recordset
Dim GD_FACTURAID As Integer
Dim GD_TIPCONSUMID As Integer
Dim GD_LUNAID As Long
Dim GD_SUMA As Integer
Dim GD_NRDOCUMENT As Integer
Dim GD_CONSUM As Integer
Dim trebuieSalvat As Boolean
Public Sub DocSave()
Dim i As Long
For i = 1 To grNom.Rows – 1
If grNom.TextMatrix(i, GD_TIPCONSUMID) = "" Then
MsgBox "Nu poate exista factura fara tip de consum" grNom.SetFocus grNom.Col = GD_TIPCONSUMID
Exit Sub
End If
Next rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew rs.fields("suma") = 0 rs.fields("consum") = 0 rs.fields("lunaID") = ID_LUNA grNom.SetFocus grNom.Col = GD_NRDOCUMENT grNom.EditCell
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg factura " & grNom.TextMatrix(rw, GD_NRDOCUMENT) & " ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_LUNAID) = True grNom.ColHidden(GD_FACTURAID) = True grNom.ColComboList(GD_TIPCONSUMID) = grNom.BuildComboList(rst, "denumireConsum,um", "tipConsumID") grNom.TextMatrix(0, GD_TIPCONSUMID) = "Tip Consum"
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox Replace("Factura * nu poate fi stearsa deoarece este utilizata in alte documente", "*", grNom.TextMatrix(rw, GD_NRDOCUMENT)), vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Load()
Dim i As Long
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
OpenRS rst, "SELECT tipconsumID,denumireConsum,um FROM tipConsum ORDER BY denumireConsum"
OpenRS rs, "SELECT * FROM factura WHERE lunaID=" & ID_LUNA & " ORDER BY nrDocument"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "FACTURAID"
GD_FACTURAID = i grNom.ColHidden(i) = True
Case "TIPCONSUMID"
GD_TIPCONSUMID = i grNom.ColComboList(GD_TIPCONSUMID) = grNom.BuildComboList(rst, "denumireConsum,um", "tipConsumID") grNom.TextMatrix(0, GD_TIPCONSUMID) = "Tip Consum"
Case "LUNAID"
GD_LUNAID = i grNom.ColHidden(i) = True
Case "SUMA"
GD_SUMA = i
Case "CONSUM"
GD_CONSUM = i
Case "NRDOCUMENT"
GD_NRDOCUMENT = i
End Select
Next grNom.Col = GD_SUMA
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_TIPCONSUMID) = wdth * 30 grNom.ColWidth(GD_SUMA) = wdth * 20 grNom.ColWidth(GD_CONSUM) = wdth * 25 grNom.ColWidth(GD_NRDOCUMENT) = wdth * 20
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close rst.Close
Set rs = Nothing
Set rst = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_ComboCloseUp(ByVal Row As Long, ByVal Col As Long, FinishEdit As Boolean)
FinishEdit = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
End If
If Col = GD_SUMA And Val(Trim(grNom.EditText)) < 0 Then
MsgBox "Valoarea nu poate fi negativa", vbExclamation, "Atentie"
Cancel = True
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Fact Noua"
DocNou
Case "Sterge Fact"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmFurnizori
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim GD_DENUMIREFURNIZOR As Integer
Dim GD_OBSERVATII As Integer
Dim GD_ADRESA As Integer
Dim GD_FURNIZORID As Long
Dim GD_CF As Integer
Dim trebuieSalvat As Boolean
Public Sub DocSave() rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew grNom.SetFocus grNom.Col = GD_DENUMIREFURNIZOR grNom.EditCell
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg Furnizorul " & grNom.TextMatrix(rw, GD_DENUMIREFURNIZOR) & " ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_FURNIZORID) = True
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox Replace("Furnizorul * nu poate fi sters deoarece este utilizat in alte documente", "*", grNom.TextMatrix(rw, GD_DENUMIREFURNIZOR)), vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
OpenRS rs, "SELECT * FROM furnizor ORDER BY denumireFurnizor"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
Dim i As Long
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "FURNIZORID"
GD_FURNIZORID = i grNom.ColHidden(i) = True
Case "DENUMIREFURNIZOR"
GD_DENUMIREFURNIZOR = i
Case "ADRESA"
GD_ADRESA = i
Case "OBSERVATII"
GD_OBSERVATII = i
Case "CF"
GD_CF = i
End Select
Next grNom.Col = GD_DENUMIREFURNIZOR
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_DENUMIREFURNIZOR) = wdth * 40 grNom.ColWidth(GD_CF) = wdth * 10 grNom.ColWidth(GD_ADRESA) = wdth * 20 grNom.ColWidth(GD_OBSERVATII) = wdth * 30
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
For i = 1 To grNom.Rows – 1
If Trim(grNom.TextMatrix(i, 2)) = "" And UCase(grNom.TextMatrix(0, 2)) = "DENUMIRE" Then
MsgBox "Nu puteti avea furnizor fara denumire", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close
Set rs = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Linie Noua"
DocNou
Case "Sterge Linia"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmIncasare
––––––––––––––––––––––––––––––––––––––––-
Dim rs As New ADODB.Recordset
Dim rst As New ADODB.Recordset
Dim GD_INCASAREID As Long
Dim GD_APARTAMENTID As Long
Dim GD_DATA As Integer
Dim GD_NRCHITANTA As Integer
Dim GD_SUMA As Integer
Dim trebuieSalvat As Boolean
Private Sub Form_Load()
Dim i As Long
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
OpenRS rst, "SELECT apartamentID,nrApartament,proprietar FROM apartament WHERE lunaID=" & ID_LUNA & " ORDER BY nrApartament"
OpenRS rs, "SELECT incasare.incasareID,incasare.apartamentID,incasare.nrChitanta,incasare.Data,incasare.Suma FROM incasare INNER JOIN apartament ON incasare.apartamentID=apartament.apartamentID WHERE apartament.lunaID=" & ID_LUNA & " ORDER BY apartament.nrApartament"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "INCASAREID"
GD_INCASAREID = i grNom.ColHidden(i) = True
Case "DATA"
GD_DATA = i grNom.ColComboList(GD_DATA) = "…" grNom.ColFormat(GD_DATA) = "dd – mm – yyyy"
Case "APARTAMENTID"
GD_APARTAMENTID = i grNom.ColComboList(GD_APARTAMENTID) = grNom.BuildComboList(rst, "*nrApartament,proprietar", "apartamentID") grNom.TextMatrix(0, GD_APARTAMENTID) = "Apartament"
Case "SUMA"
GD_SUMA = i
Case "NRCHITANTA"
GD_NRCHITANTA = i grNom.TextMatrix(0, GD_NRCHITANTA) = "Numar Chitanta"
End Select
Next
grNom.Col = GD_VALOARE
End Sub
Public Sub DocSave()
Dim i As Long
For i = 1 To grNom.Rows – 1
If grNom.TextMatrix(i, GD_APARTAMENTID) = "" Then
MsgBox "Nu poate exista incasare fara apartament" grNom.SetFocus grNom.Col = GD_APARTAMENTID
Exit Sub
End If
Next rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew rs.fields("suma") = 0 grNom.SetFocus grNom.Col = GD_APARTAMENTID
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg incasarea ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_INCASAREID) = True grNom.ColComboList(GD_APARTAMENTID) = grNom.BuildComboList(rst, "*nrApartament,proprietar", "apartamentID") grNom.TextMatrix(0, GD_APARTAMENTID) = "Apartament" grNom.TextMatrix(0, GD_NRCHITANTA) = "Numar Chitanta"
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox "Incasarea nu poate fi stearsa deoarece este utilizata in alte documente", vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_SUMA) = wdth * 20 grNom.ColWidth(GD_APARTAMENTID) = wdth * 30 grNom.ColWidth(GD_DATA) = wdth * 20 grNom.ColWidth(GD_NRCHITANTA) = wdth * 25
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close rst.Close
Set rs = Nothing
Set rst = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_CellButtonClick(ByVal Row As Long, ByVal Col As Long) dataCurenta = Date
Load frmSelectieData frmSelectieData.Calendar1.Value = grNom.TextMatrix(Row, Col) frmSelectieData.Show vbModal grNom.TextMatrix(Row, Col) = dataCurenta
End Sub
Private Sub grNom_ComboCloseUp(ByVal Row As Long, ByVal Col As Long, FinishEdit As Boolean)
FinishEdit = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
End If
If Col = GD_SUMA And Val(Trim(grNom.EditText)) < 0 Then
MsgBox "Suma nu poate fi negativa", vbExclamation, "Atentie"
Cancel = True
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Linie Noua"
DocNou
Case "Sterge Linia"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmListaCheltuieli
–––––––––––––––––––––––––––––––––––––––– Const GD_ID = 1
Const GD_NRAPARTAMENT = 2
Const GD_PROPRIETAR = 3
Const GD_NRPERSOANE = 4
Const GD_SUPRAFATA = 5
Const startConsumFieldNo = 5
Const rowCheckTipareste = 1
Dim rs As New ADODB.Recordset
Dim raportDejaAfisat As Boolean
Private Sub Timer1_Timer()
Dim rsTC As New Recordset
Dim sumaColoana As Double
Timer1.Interval = 0
Timer1.Enabled = False raportDejaAfisat = False
OpenRS rsTC, "SELECT apartament.apartamentID FROM apartament WHERE lunaID=" & ID_LUNA
If rsTC.RecordCount = 0 Then
MsgBox "Trebuie sa introduceti locatarii !", vbInformation, "Atentie"
Unload Me
Exit Sub
End If rsTC.Close
OpenRS rsTC, "select tipConsumID,denumireConsum from tipConsum"
CalculCheltuieli ID_LUNA
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch grNom.Editable = flexEDNone grNom.AddItem "" grNom.ColHidden(GD_ID) = True grNom.ColHidden(GD_SUPRAFATA) = True grNom.Cell(flexcpBackColor, grNom.Rows – 1, 1, grNom.Rows – 1, grNom.Cols – 1) = RGB(190, 225, 248) grNom.Cell(flexcpFontBold, grNom.Rows – 1, 1, grNom.Rows – 1, grNom.Cols – 1) = True grNom.TextMatrix(grNom.Rows – 1, GD_PROPRIETAR) = "TOTAL:"
For j = startConsumFieldNo To rs.fields.Count sumaColoana = 0
For i = 1 To grNom.Rows – 2 sumaColoana = sumaColoana + grNom.TextMatrix(i, j)
Next grNom.TextMatrix(grNom.Rows – 1, j) = sumaColoana
Next
While Not rsTC.EOF
For i = startConsumFieldNo To rs.fields.Count – 1
If LCase(rs.fields(i).Name) = LCase(GlueStr(rsTC("denumireConsum"))) Then
If Me.Tag = "defalcate" Then grNom.TextMatrix(0, i + 1) = rsTC("denumireConsum")
Else grNom.ColHidden(i + 1) = True
End If
End If grNom.ColFormat(i + 1) = "#,###"
Next rsTC.MoveNext
Wend grNom.AutoSize 1, grNom.Cols – 1 rsTC.Close
End Sub
Sub CalculCheltuieli(idLuna As Long)
Screen.MousePointer = vbHourglass
Dim rstmp As New Recordset
Dim rsConsumContorizat As New Record
Dim consum
Dim consumContorizat As Double
Dim totalConsum As Double
Dim totalSumaObligatie As Double
Dim totalSumaApartament As Double
Dim i As Long
Dim pierdere As Double
Dim tipCalcul As Long
Dim tipConsumID As Long
Dim nrApartamente As Long
Dim nrApartamenteContorizate As Long
Dim nrPersoane As Long
Dim nrPersoaneContorizate As Long
Dim suprafata As Double
Dim suprafataContorizata As Double
On Error Resume Next conexiune.Execute "DROP TABLE listaRap"
On Error GoTo 0 conexiune.Execute "CREATE TABLE listaRap" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN ID LONG" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Ap TEXT(5)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Proprietar TEXT(100)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN NrPers TEXT(3)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Suprafata LONG" nrApartamente = GetRecordCount("apartament", "LunaID=" & idLuna) nrPersoane = GetFieldFromTable("sum(NrPersoane)", "apartament", "LunaID=" & idLuna) suprafata = GetFieldFromTable("sum(Suprafata)", "apartament", "LunaID=" & idLuna)
'creez RS-ul in care voi lucra
OpenRS rstmp, "SELECT tipconsumID,denumireConsum FROM tipConsum"
While Not rstmp.EOF
If Val(GetFieldFromTable("consum", "factura", "LunaID=" & idLuna & " and TipConsumID=" & Val(rstmp("tipConsumID")))) <> 0 Then conexiune.Execute "ALTER TABLE listaRap ADD COLUMN " & rstmp("tipConsumID") & " DOUBLE" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN " & GlueStr(rstmp("denumireConsum")) & " DOUBLE"
End If rstmp.MoveNext
Wend conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Total DOUBLE" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Restanta DOUBLE"
OpenRS rs, "SELECT * FROM listaRap"
OpenRS rstmp, "SELECT apartament.apartamentID,apartament.NrApartament,apartament.Proprietar,apartament.NrPersoane,apartament.Suprafata FROM apartament where LunaID = " & idLuna & " ORDER BY apartament.nrApartament"
While Not rstmp.EOF rs.AddNew rs("ID").Value = rstmp("apartamentID").Value rs("Ap").Value = rstmp("NrApartament").Value rs("Proprietar").Value = rstmp("Proprietar").Value rs("NrPers").Value = rstmp("NrPersoane").Value rs("Suprafata").Value = rstmp("Suprafata").Value
For i = startConsumFieldNo To rs.fields.Count – 1 Step 2 consum = GetFieldFromTable("valoare", "consum", "ApartamentID=" & Val(rs("id").Value) & " and TipConsumID=" & Val(rs.fields(i).Name))
If consum <> "" Then rs(i).Value = consum
Next rstmp.MoveNext
Wend rstmp.Close
For i = startConsumFieldNo To rs.fields.Count – 1 Step 2 tipConsumID = Val(Right(rs.fields(i).Name, 1))
If tipConsumID = 0 Then Exit For rs.MoveFirst totalConsum = Val(GetFieldFromTable("consum", "factura", "LunaID=" & idLuna & " and TipConsumID=" & Val(rs.fields(i).Name))) totalSumaObligatie = Val(GetFieldFromTable("suma", "factura", "LunaID=" & idLuna & " and TipConsumID=" & Val(rs.fields(i).Name))) tipCalcul = GetFieldFromTable("valoare", "tipcalcul", "tipcalculID=" & Val(GetFieldFromTable("tipCalculID", "tipConsum", "tipConsumID=" & Val(rs.fields(i).Name)))) consumContorizat = 0 nrApartamenteContorizate = 0 nrPersoaneContorizate = 0 suprafataContorizata = 0
'calculez consumurile contorizate
While Not rs.EOF
If Not IsNull(rs(i).Value) Then 'daca este contorizat consumContorizat = consumContorizat + Val(rs(i).Value) nrApartamenteContorizate = nrApartamenteContorizate + 1 nrPersoaneContorizate = nrPersoaneContorizate + rs("NrPers") suprafataContorizata = suprafataContorizata + rs("Suprafata")
End If rs.MoveNext
Wend
'repartizez consumurile necontorizate rs.MoveFirst
While Not rs.EOF
If IsNull(rs(i).Value) Then
If tipCalcul = TC_APARTAMENT Then rs(i).Value = 1 * (totalConsum – consumContorizat) / (nrApartamente – nrApartamenteContorizate)
ElseIf tipCalcul = TC_NRPERSOANE Then rs(i).Value = rs("NrPers") * (totalConsum – consumContorizat) / (nrPersoane – nrPersoaneContorizate)
ElseIf tipCalcul = TC_SUPRAFATA Then rs(i).Value = rs("Suprafata") * (totalConsum – consumContorizat) / (suprafata – suprafataContorizata)
End If
End If rs.MoveNext
Wend
'testez daca sunt pierderi
If nrApartamente = nrApartamenteContorizate And totalConsum <> consumContorizat Then pierdere = (totalConsum – consumContorizat) / nrApartamente
'adaug la consumuri pierderile rs.MoveFirst
While Not rs.EOF rs(i).Value = rs(i).Value + pierdere rs.MoveNext
Wend
End If
'calculez cheltuielile pt fiecare consum in parte rs.MoveFirst
While Not rs.EOF
If totalConsum <> 0 Then rs(i + 1).Value = Round(rs(i).Value * (totalSumaObligatie / totalConsum)) rs(i).Value = Round(rs(i).Value, 2) rs.MoveNext
Wend
Next
'calcul total/apartament rs.MoveFirst
While Not rs.EOF totalSumaApartament = 0
For i = startConsumFieldNo To rs.fields.Count – 3 Step 2 totalSumaApartament = totalSumaApartament + Val(rs(i + 1).Value)
Next rs.fields("Total").Value = totalSumaApartament
If GetRecordCount("deIncasat", "ApartamentID=" & rs("id")) = 0 Then conexiune.Execute "INSERT INTO deIncasat (ApartamentID,Suma) VALUES (" & rs("ID") & "," & totalSumaApartament & ")"
Else conexiune.Execute "UPDATE deIncasat SET Suma= " & totalSumaApartament & " where ApartamentID=" & rs("ID")
End If rs.fields("Restanta") = CalculRestanta(rs("Ap"), idLuna) rs.MoveNext
Wend
OpenRS rstmp, "select tipConsumID,denumireConsum from tipConsum"
While Not rstmp.EOF
For i = 0 To rs.fields.Count – 2
If LCase(rs.fields(i).Name) = LCase(rstmp("tipConsumID")) Then rs.Close conexiune.Execute "ALTER TABLE listaRap DROP " & rstmp("tipConsumID")
OpenRS rs, "SELECT * FROM listaRap"
End If
Next rstmp.MoveNext
Wend rstmp.Close
Screen.MousePointer = vbDefault
End Sub
Function CalculRestanta(apartamentNo, idLuna As Long) As Double
Dim totalPlatit As Double
Dim totalDePlatit As Double
Dim rs As New Recordset totalPlatit = 0 totalDePlatit = 0
OpenRS rs, "SELECT Sum(incasare.Suma) FROM apartament INNER JOIN incasare ON apartament.apartamentID = incasare.ApartamentID where (((apartament.LunaID) < " & idLuna & ")) GROUP BY apartament.NrApartament HAVING (((apartament.NrApartament)=" & apartamentNo & "))"
If rs.RecordCount <> 0 Then totalPlatit = rs.fields(0)
OpenRS rs, "SELECT Sum(deIncasat.Suma) FROM apartament INNER JOIN deIncasat ON apartament.apartamentID = deIncasat.ApartamentID where (((apartament.LunaID) < " & idLuna & ")) GROUP BY apartament.NrApartament HAVING (((apartament.NrApartament)=" & apartamentNo & "))"
If rs.RecordCount <> 0 Then totalDePlatit = rs.fields(0)
CalculRestanta = totalDePlatit – totalPlatit
End Function
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next rs.Close
' conexiune.Execute "DROP TABLE listaRap"
Set rs = Nothing
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
End Sub
Private Sub DocPrint()
If raportDejaAfisat = False Then
Dim rsTC As New Recordset
If Me.Tag = "totaluri" Then
OpenRS rsTC, "select tipConsumID,denumireConsum from tipConsum"
While Not rsTC.EOF
For i = startConsumFieldNo To rs.fields.Count – 1
If LCase(rs.fields(i).Name) = LCase(GlueStr(rsTC("denumireConsum"))) Then conexiune.Execute "ALTER TABLE listaRap DROP " & LCase(GlueStr(rsTC("denumireConsum")))
End If
Next rsTC.MoveNext
Wend rsTC.Close
End If
' On Error Resume Next conexiune.Execute "ALTER TABLE listaRap DROP ID,Suprafata" raportDejaAfisat = True
' On Error GoTo 0
End If arListaCheltuieli.DataControl1.ConnectionString = conexiune.ConnectionString
Set arListaCheltuieli.Icon = frmMDIPrincipal.Icon arListaCheltuieli.Show
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Tipareste"
DocPrint
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmMDIPrincipal
––––––––––––––––––––––––––––––––––––––––-
Private Sub MDIForm_Activate()
If ID_LUNA > 0 Then
Me.Caption = App.Title & " – " & denumireAsociatie & " – " & GetLunaPrelucrare(ID_LUNA)
Else
Me.Caption = App.Title & " – " & denumireAsociatie
End If
End Sub
Private Sub MDIForm_Load()
End Sub
Private Sub MDIForm_Unload(Cancel As Integer)
EndProgram
End Sub
Private Sub mnuAlegeLuna_Click()
For Each obj In Forms
If obj.Name <> "frmMDIPrincipal" Then Unload obj
Next frmSelectieLuna.Show vbModal
End Sub
Private Sub mnuAlegereAsociatie_Click()
For Each obj In Forms
If obj.Name <> "frmMDIPrincipal" Then Unload obj
Next frmAlegeAsociatie.Show vbModal
Me.Caption = App.Title & " – " & denumireAsociatie
End Sub
Private Sub mnuApartamente_Click() frmApartamente.Show
End Sub
Private Sub mnuAsistenta_Click()
Dim sBuf As String * 512
Dim winDir As String
GetWindowsDirectory sBuf, 512
winDir = Left(sBuf, InStr(1, sBuf, Chr(0)) – 1)
If Dir(winDir & "\hh.exe") <> "" Then
Shell winDir & "\hh.exe " & App.HelpFile, vbMaximizedFocus
Else
MsgBox "Asistenta nu poate fi accesata.", vbCritical, "Eroare"
End If
End Sub
Private Sub mnuChitante_Click() frmIncasare.Show
End Sub
Private Sub mnuConsum_Click() frmConsum.Show
End Sub
Private Sub mnuDateAsociatie_Click() frmDateAsociatie.Show
End Sub
Private Sub mnuDespre_Click() frmDespre.Show
End Sub
Private Sub mnuFacturi_Click() frmFacturi.Show
End Sub
Private Sub mnuFurnizori_Click() frmFurnizori.Show
End Sub
Private Sub mnuIesire_Click()
Unload Me
End Sub
Private Sub mnuLocatari_Click() frmLocatari.Show
End Sub
Private Sub mnuListaCheltuieli_Click() frmListaCheltuieli.Tag = "totaluri" frmListaCheltuieli.Show
End Sub
Private Sub mnuListaCheltuieliDefalcate_Click() frmListaCheltuieli.Tag = "defalcate" frmListaCheltuieli.Show
End Sub
Private Sub mnuOptiuni_Click() frmOptiuni.Show
End Sub
Private Sub mnuSituatieAp_Click() frmSituatieAp.Show
End Sub
Private Sub mnuTipConsum_Click() frmTipConsum.Show
End Sub
–––––––––––––––––––––––––––––––––––––––– frmOptiuni
–––––––––––––––––––––––––––––––––––––––– Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon
If afiseazaDialogAsociatie = True Then checkAfiseazaDialogAsociatie.Value = 1
Else checkAfiseazaDialogAsociatie.Value = 0
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Accepta"
If checkAfiseazaDialogAsociatie.Value = 1 Then afiseazaDialogAsociatie = True
Else afiseazaDialogAsociatie = False
End If
Unload Me
Case "Abandon"
Unload Me
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmRECSelection
–––––––––––––––––––––––––––––––––––––––– Public selected As Long
Public Function Initializare(Optional con As Connection) As Boolean
Dim i As Long
Initializare = True
Set rsm = New Recordset
On Error GoTo noConn i = con.State
Set rsm.ActiveConnection = con resum:
On Error GoTo 0 rsm.CursorLocation = adUseClient rsm.Open lblQueryMaster.Caption
If rsm.RecordCount = 0 Then
MsgBox "Nu aveti date.", vbExclamation, "Notificare"
Unload Me
Initializare = False
Exit Function
End If
Set Me.grM.DataSource = rsm
Me.grM.DataMode = flexDMFree
For i = 0 To grM.Rows – 1
If LCase(grM.TextMatrix(i, 0)) = "id" Then grM.ColWidth(i) = 0
Next
' grM.RowHidden(0) = True grM.ColHidden(0) = True grM.Select 1, 1
Form_Resize
Exit Function noConn:
Set rsm.ActiveConnection = conexiune
GoTo resum
End Function
Private Sub cmdCancel_Click()
Tag = "" selected = grM.RowSel
HelpContextID = 0
Hide
End Sub
Private Sub cmdOk_Click()
If grM.RowSel = 0 Then
Tag = -1
Else
Tag = grM.TextMatrix(grM.RowSel, 0)
End If selected = grM.RowSel
HelpContextID = 0
Hide
End Sub
Private Sub Form_Activate()
If selected < grM.Rows Then grM.Select selected, 0 grM.SetFocus
End Sub
Private Sub Form_Deactivate() selected = grM.RowSel
End Sub
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon
End Sub
Private Sub Form_Resize() grM.Move 0, Label1.Height, ScaleWidth, ScaleHeight – Frame1.Height – Label1.Height
Frame1.Move 0, grM.Height + grM.Top, ScaleWidth
Label1.Move 0, 0, ScaleWidth
With Toolbar1
.Width = .ButtonWidth * .Buttons.Count
.Left = ScaleWidth – .Width
End With
End Sub
Private Sub grM_DblClick() cmdOk_Click
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
If Button.Index = 1 Then cmdOk_Click
Else cmdCancel_Click
End If
End Sub
–––––––––––––––––––––––––––––––––––––––– frmSelectieData
–––––––––––––––––––––––––––––––––––––––– Private Sub Calendar1_Click() dataCurenta = Me.Calendar1.Value
Unload Me
End Sub
Private Sub Calendar1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then dataCurenta = Me.Calendar1.Value
Unload Me
End If
End Sub
Private Sub Form_Unload(Cancel As Integer) dataCurenta = Me.Calendar1.Value
End Sub
–––––––––––––––––––––––––––––––––––––––– frmSelectieLuna
––––––––––––––––––––––––––––––––––––––––-
Private Sub cmdCancel_Click()
Unload Me
Unload frmMDIPrincipal
End
End Sub
Private Sub cmdOk_Click()
ID_LUNA = Val(grLuna.TextMatrix(0, 0))
If ID_LUNA = 0 Then Exit Sub
Unload Me
End Sub
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon
Dim idL As Long
Dim strCmb As String strCmb = GetStrForCombo(grLuna, "luna", "Luna,Anul", "lunaID")
If strCmb <> "NULL" Then grLuna.Enabled = True grLuna.ColComboList(0) = strCmb idL = Val(GetFieldFromTable("lunaID", "luna", "luna=" & Month(Date) & " and anul=" & Year(Date)))
If idL <> 0 Then grLuna.TextMatrix(0, 0) = idL
Else grLuna.Enabled = False grLuna.TextMatrix(0, 0) = "Trebuie sa creeati o luna noua"
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Accepta" cmdOk_Click
Case "Abandon" cmdCancel_Click
End Select
End Sub
Private Sub grLuna_ComboCloseUp(ByVal Row As Long, ByVal Col As Long, FinishEdit As Boolean)
FinishEdit = True
End Sub
Private Sub Toolbar2_ButtonClick(ByVal Button As MSComctlLib.Button)
Dim anul As Long
Dim luna As Long
Dim idLuna As Long
Dim idLastLuna
Dim rs As New Recordset anul = Val(InputBox("Introduceti anul", "Anul", Year(Date)))
If anul < 2000 Or anul > 2100 Then Exit Sub luna = Val(InputBox("Introduceti luna", "Luna", Month(Date)))
If luna < 1 Or luna > 12 Then Exit Sub
If GetFieldFromTable("lunaID", "luna", "anul=" & anul & " and luna=" & luna) = "" Then idLastLuna = GetMaxMinFieldTable("max", "lunaID", "luna") conexiune.Execute "INSERT INTO luna (anul,luna) VALUES (" & anul & "," & luna & ")"
If Not IsNull(idLastLuna) Then idLuna = GetDBIdentity
OpenRS rs, "SELECT * FROM apartament WHERE lunaID=" & idLastLuna
If rs.RecordCount <> 0 Then
While Not rs.EOF conexiune.Execute "INSERT INTO apartament " _
& "(lunaID,NrApartament,Proprietar,NrPersoane,NrCamere,Suprafata) " _
& "VALUES (" & idLuna & "," & rs("NrApartament") & ",'" & rs("Proprietar") & "'," _
& rs("NrPersoane") & "," & rs("NrCamere") & "," & rs("Suprafata") & ")" rs.MoveNext
Wend
End If
End If
Else
MsgBox "Aceasta luna este deja existenta in baza de date", vbExclamation
End If
Form_Load
End Sub
–––––––––––––––––––––––––––––––––––––––– frmSituatieAp
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim rsID As New Recordset
Dim GD_APARTAMENTID As Long
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon
End Sub
Private Sub DocUrm()
If Not rsID.EOF Then rsID.MoveNext
If Not rsID.EOF Then
IncarcaPlati (rsID("apartamentID"))
End If
End If
If rsID.AbsolutePosition = adPosEOF Then rsID.MoveLast
End If
End Sub
Private Sub DocPrec()
If Not rsID.BOF Then rsID.MovePrevious
If Not rsID.BOF Then
IncarcaPlati (rsID("apartamentID"))
End If
End If
If rsID.AbsolutePosition = adPosBOF Then rsID.MoveFirst
End If
End Sub
Public Sub DocGoto()
Dim mid As Long
frmRECSelection.Caption = "Selectie apartament …" frmRECSelection.lblQueryMaster = "SELECT apartamentID,nrApartament,proprietar FROM apartament WHERE lunaID=" & ID_LUNA & " ORDER BY nrApartament"
If frmRECSelection.Initializare Then frmRECSelection.Tag = "" frmRECSelection.Show vbModal
If frmRECSelection.Tag <> "" Then mid = frmRECSelection.Tag
If mid = -1 Then Exit Sub rsID.MoveFirst rsID.Find ("apartamentID=" & mid)
IncarcaPlati (mid)
End If
End If
End Sub
Private Sub Form_Unload(Cancel As Integer) rsID.Close
Set rsID = Nothing
Set rs = Nothing
End Sub
Private Sub IncarcaPlati(id As Long)
Dim nAp As Long
Label2.Caption = "Apartament Nr. " & rsID("nrApartament")
OpenRS rs, "SELECT incasare.incasareID,incasare.Data,incasare.NrChitanta,incasare.Suma FROM incasare INNER JOIN apartament ON incasare.apartamentID=apartament.apartamentID WHERE apartament.nrApartament=" & rsID("nrApartament")
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
Dim i As Long
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "INCASAREID" grNom.ColHidden(i) = True
Case "APARTAMENTID" grNom.ColHidden(i) = True
Case "DATA" grNom.ColFormat(i) = "dd – mm – yyyy" grNom.TextMatrix(0, i) = "Data Incasarii "
Case "NRCHITANTA" grNom.TextMatrix(0, i) = "Chitanta Nr " grNom.Cell(flexcpAlignment, 0, i, grNom.Rows – 1, i) = flexAlignRightCenter
Case "SUMA" grNom.ColFormat(i) = "#,###"
End Select
Next rs.Close grNom.AutoSize 1, grNom.Cols – 1
End Sub
Private Sub Timer1_Timer()
Timer1.Interval = 0
Timer1.Enabled = False
OpenRS rsID, "SELECT apartament.apartamentID,apartament.nrApartament FROM apartament WHERE lunaID=" & ID_LUNA & " ORDER BY nrApartament"
If rsID.RecordCount = 0 Then
MsgBox "Trebuie sa introduceti locatarii !", vbInformation, "Atentie"
Unload Me
End If
IncarcaPlati (rsID("apartamentID"))
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Precedent"
DocPrec
Case "Urmator"
DocUrm
Case "Cauta Ap"
DocGoto
End Select
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth
Label2.Move ScaleWidth – 2700 grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
End Sub
–––––––––––––––––––––––––––––––––––––––– frmTipConsum
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim rsc As New ADODB.Recordset
Dim rst As New ADODB.Recordset
Dim GD_FURNIZORID As Integer
Dim GD_TIPCONSUMID As Integer
Dim GD_DENUMIRECONSUM As Integer
Dim GD_TIPCALCULID As Long
Dim GD_UM As Integer
Dim trebuieSalvat As Boolean
Public Sub DocSave()
Dim i As Long
For i = 1 To grNom.Rows – 1
If grNom.TextMatrix(i, GD_DENUMIRECONSUM) = "" Then
MsgBox "Nu pot exista tipuri de consum fara denumire"
Exit Sub
End If
If grNom.TextMatrix(i, GD_FURNIZORID) = "" Then
MsgBox "Nu pot exista tipuri de consum fara furnizor" grNom.SetFocus grNom.Col = GD_FURNIZORID
Exit Sub
End If
If grNom.TextMatrix(i, GD_TIPCALCULID) = "" Then
MsgBox "Nu pot exista tipuri de consum fara tip de calcul" grNom.SetFocus grNom.Col = GD_TIPCALCULID
Exit Sub
End If
Next rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew grNom.SetFocus grNom.Col = GD_DENUMIRECONSUM grNom.EditCell
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg tipul de consum " & grNom.TextMatrix(rw, GD_DENUMIRECONSUM) & " ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_TIPCONSUMID) = True grNom.ColComboList(GD_FURNIZORID) = grNom.BuildComboList(rsc, "denumireFurnizor", "furnizorID") grNom.TextMatrix(0, GD_FURNIZORID) = "Furnizor" grNom.ColComboList(GD_TIPCALCULID) = grNom.BuildComboList(rst, "tipCalcul", "tipcalculID") grNom.TextMatrix(0, GD_TIPCALCULID) = "Tip Calcul"
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox Replace("Tipul de consum * nu poate fi sters deoarece este utilizat in alte documente", "*", grNom.TextMatrix(rw, GD_DENUMIRECONSUM)), vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Load()
Dim i As Long
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
OpenRS rsc, "SELECT furnizorID,denumireFurnizor FROM furnizor"
OpenRS rst, "SELECT tipCalculID,tipCalcul FROM tipCalcul"
OpenRS rs, "SELECT * FROM tipConsum ORDER BY denumireConsum"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "TIPCONSUMID"
GD_TIPCONSUMID = i grNom.ColHidden(i) = True
Case "DENUMIRECONSUM"
GD_DENUMIRECONSUM = i
Case "UM"
GD_UM = i
Case "FURNIZORID"
GD_FURNIZORID = i grNom.ColComboList(GD_FURNIZORID) = grNom.BuildComboList(rsc, "denumireFurnizor", "furnizorID") grNom.TextMatrix(0, i) = "Furnizor"
Case "TIPCALCULID"
GD_TIPCALCULID = i grNom.ColComboList(GD_TIPCALCULID) = grNom.BuildComboList(rst, "tipCalcul", "tipcalculID") grNom.TextMatrix(0, i) = "Tip Calcul"
End Select
Next grNom.Col = GD_DENUMIRECONSUM
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_DENUMIRECONSUM) = wdth * 40 grNom.ColWidth(GD_UM) = wdth * 10 grNom.ColWidth(GD_FURNIZORID) = wdth * 20 grNom.ColWidth(GD_TIPCALCULID) = wdth * 25
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
For i = 1 To grNom.Rows – 1
If Trim(grNom.TextMatrix(i, 2)) = "" And UCase(grNom.TextMatrix(0, 2)) = "DENUMIRE" Then
MsgBox "Nu puteti avea furnizor fara denumire", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close rsc.Close rst.Close
Set rs = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Linie Noua"
DocNou
Case "Sterge Linia"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– arListaCheltuieli
–––––––––––––––––––––––––––––––––––––––– Dim twPchar As Long
Const cnstTPC = 104
Dim widths() As Single
Private Sub ActiveReport_DataInitialize()
CalculWidth
Dim lft As Long
Dim ctl As DDActiveReports2.field
Dim ctTotal As DDActiveReports2.field
Dim ctLabel As DDActiveReports2.Label
Dim rs As New Recordset rs.Open "SELECT * FROM imobil", conexiune, adOpenStatic, adLockOptimistic txtDenumireAsociatie = rs("denumire") & " " & rs("adresa") rs.Close
Me.Sections("Detail").Height = 216 lft = 0
For i = 0 To DataControl1.Recordset.fields.Count – 1
If DataControl1.Recordset.fields(i).Name <> "ID" Then
Set ctLabel = Me.Sections("PageHeader").Controls.Add("DDActiveReports2.Label")
Set ctl = Me.Sections("Detail").Controls.Add("DDActiveReports2.Field") ctLabel.Top = Me.Sections("PageHeader").Height ctLabel.Caption = DataControl1.Recordset.fields(i).Name ctLabel.Left = lft ctLabel.Width = twPchar * widths(i) ctLabel.Height = 240 ctLabel.Font.Bold = True ctLabel.Font.Size = twPchar * 8 / cnstTPC ctLabel.VerticalAlignment = ddTXMiddle
If i = 0 Then ctLabel.Border.LeftStyle = ddBLSolid ctLabel.Border.BottomStyle = ddBLExtraThickSolid ctLabel.Border.RightStyle = ddBLSolid ctLabel.Border.TopStyle = ddBLSolid ctLabel.Alignment = ddTXRight ctl.DataField = DataControl1.Recordset.fields(i).Name ctl.Top = 0 ctl.Left = lft ctl.Width = twPchar * widths(i) ctl.Height = 216 ctl.Font.Size = twPchar * 8 / cnstTPC
If i = 0 Then ctl.Border.LeftStyle = ddBLSolid ctl.Border.RightStyle = ddBLSolid ctl.Border.BottomStyle = ddBLSolid ctl.VerticalAlignment = ddTXMiddle
If i > 2 Then
Set ctTotal = Me.Sections("ReportFooter").Controls.Add("DDActiveReports2.Field") ctTotal.DataField = DataControl1.Recordset.fields(i).Name ctTotal.SummaryFunc = ddSFSum ctTotal.SummaryRunning = ddSRAll ctTotal.SummaryType = ddSMGrandTotal ctTotal.Top = 0 ctTotal.Left = lft ctTotal.Width = twPchar * widths(i) ctTotal.Height = 216 ctTotal.Font.Size = twPchar * 8 / cnstTPC ctTotal.VerticalAlignment = ddTXMiddle ctTotal.Font.Bold = True ctTotal.Alignment = ddTXRight ctTotal.OutputFormat = "#,###"
End If
Dim ft ft = DataControl1.Recordset.fields(i).Type
If ft = adBSTR Or ft = adChar Or ft = adVarChar Or ft = adVarWChar Or ft = adWChar Then ctl.Alignment = ddTXLeft ctLabel.Alignment = ddTXLeft
Else ctl.Alignment = ddTXRight ctLabel.Alignment = ddTXRight ctl.OutputFormat = "#,###"
End If lft = lft + ctLabel.Width
End If
Next ctl.Border.RightStyle = ddBLSolid
Me.Zoom = -1
End Sub
Private Sub CalculWidth()
Dim totWidth As Long
Dim totCharWidth As Long
Dim rs As New Recordset
Dim convRate As Double
Dim ft twPchar = cnstTPC totWidth = Me.Width
Me.PageSettings.LeftMargin = 720
Me.PageSettings.RightMargin = 720 totCharWidth = 0
ReDim widths(0 To DataControl1.Recordset.fields.Count – 1)
For i = 0 To DataControl1.Recordset.fields.Count – 1
If DataControl1.Recordset.fields(i).Name <> "ID" Then rs.Open "SELECT max(len(cstr(" & DataControl1.Recordset.fields(i).Name & "))) FROM listaRap", conexiune, adOpenStatic, adLockOptimistic
If rs.fields(0) >= Len(DataControl1.Recordset.fields(i).Name) Then ft = DataControl1.Recordset.fields(i).Type
If ft = adBSTR Or ft = adChar Or ft = adVarChar Or ft = adVarWChar Or ft = adWChar Then
widths(i) = rs.fields(0)
Else
widths(i) = rs.fields(0) + 6
End If
Else
widths(i) = Len(DataControl1.Recordset.fields(i).Name) + 1
End If totCharWidth = totCharWidth + widths(i) rs.Close
End If
Next convRate = ((Me.PageSettings.PaperWidth – 720 – 720) / twPchar) / totCharWidth
If convRate < 1 Then
Me.PageSettings.Orientation = ddOLandscape
End If
While convRate < 1 twPchar = twPchar – 5 convRate = ((Me.PageSettings.PaperWidth – 720 – 720) / twPchar) / totCharWidth
Wend
For i = 0 To DataControl1.Recordset.fields.Count – 1
widths(i) = widths(i) * convRate
Next
End Sub
Private Sub ActiveReport_ReportStart() txtLunaAnul = GetLunaPrelucrare(ID_LUNA)
End Sub
BIBLIOGRAFIE
1. H.G. 400/2003 – Normele metodologice privind organizarea si functionarea asociatiilor de proprietari.
2. O.M.P.F. 2329/2001 – Normele metodologice privind organizarea si conducerea contabilitatii in partida simpla de catre persoanele juridice fara scop lucrativ.
3. http://blocb7.idilis.ro, Pagina web a Asociatiei de Proprietari bloc B7, Bucuresti
4. Legea nr. 326 din 28 iunie 2001 privind serviciilor publice de gospodarie comunala Publicat In M.Of. Nr. 359 din 04.07.2001
5. ORDIN MLPAT nr. 29/1993 pentru aprobarea Normativului-cadru privind contorizarea apei si a energiei termice la populatie, institutii publice si agenti economici Publicat In M.Of. Nr. 25 din 27.01.1994
6. Hotarare nr. 1275 din 7 decembrie 2000 privind aprobarea Normelor metodologice pentru punerea in aplicare a prevederilor Legii locuintei nr. 114/1996 Publicat in Monitorul Oficial al Romaniei nr. 690 din 22 decembrie 2000
7. Hotarare nr. 366 din 4 aprilie 2001 privind modificarea Normelor metodologice pentru punerea in aplicare a prevederilor Legii locuintei nr. 114/1996, aprobate prin Hotararea Guvernului nr. 1.275/2000 Publicat in Monitorul Oficial al Romaniei nr. 178 din 9 aprilie 2001
8. HOTARIRE 41 din 14/02/2002 privind contorizarea consumurilor de apa rece, apa calda menajera si caldura la apartamentele din cadrul asociatiilor de locatari / asociatiilor de proprietari
9. Dragomir, Gabriel, Dezvoltarea aplicatiilor cu baze de date, Note de curs
10. Rahmel, Dan, Programarea bazelor de date cu Visual Basic 6 in 24 de ore, Editura Teora, 1999
11. Microsoft Developer Knowledge Base, © 1991-1998 Microsoft Corporation. All rights reserved.
ANEXE
Anexa 1. Listing Program
–––––––––––––––––––––––––––––––––––––––– principal.bas
–––––––––––––––––––––––––––––––––––––––– 'Proiect de diploma Raul Chiorean an III TC
Public conexiune As Connection
Public bazaDate As String
Public denumireAsociatie As String
Public afiseazaDialogAsociatie As Boolean
Public appPath As String
Public dataCurenta As Date
Public ID_LUNA As Long
Public Const TC_APARTAMENT = 1
Public Const TC_NRPERSOANE = 2
Public Const TC_SUPRAFATA = 3
Public Const LOG_FILE = "functionare.log"
Public Const INI_FILE = "administrator.ini"
Public Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Sub Main() dataCurenta = Date
If App.PrevInstance Then
MsgBox "O instanta a aplicatiei ruleaza deja !", vbExclamation, "Notificare"
End
End If
WriteToLog ("Pornire.") appPath = App.Path
WriteToLog ("Citire fisier ini.") citesteFisierIni
If denumireAsociatie <> "" And Dir(appPath & "\" & "mdb" & denumireAsociatie & ".mdb") = "" Then
MsgBox "Asociatia " & denumireAsociatie & " nu mai exista pe disc.", vbCritical, "Eroare fatala" denumireAsociatie = "" scrieFisierIni
End If
If afiseazaDialogAsociatie = True Or denumireAsociatie = "" Then
WriteToLog ("Alegere asociatie.") afiseazaDialogAsociatie = True frmAlegeAsociatie.Show vbModal
Else bazaDate = appPath & "\" & "mdb" & denumireAsociatie & ".mdb" conecteazaBaza
End If frmSelectieLuna.Show vbModal frmMDIPrincipal.Show
End Sub
Public Sub conecteazaBaza()
Set conexiune = New Connection conString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & bazaDate & ";" conexiune.ConnectionString = conString conexiune.CursorLocation = adUseClient
On Error GoTo 10 conexiune.Open conString
Exit Sub
10:
MsgBox "Conexiune esuata la baza de date " & bazaDate & "." & Chr(13) & "Verificati existenta fisierului sau apelati la ajutorul unui specialist.", vbCritical, "Eroare fatala" afiseazaDialogAsociatie = False denumireAsociatie = ""
End
End Sub
Public Sub EndProgram()
Dim obj
On Error Resume Next
Kill appPath & "\*.tmp"
On Error GoTo 0 scrieFisierIni conexiune.Close
Set conexiune = Nothing
For Each obj In Forms
Unload obj
Next
End
End Sub
Sub citesteFisierIni()
If Dir(appPath & "\" & INI_FILE) = "" Then
Open appPath & "\" & INI_FILE For Output As #1
Print #1, "Afiseaza Dialog Selectie Asociatie = True"
Print #1, "Ultima Asociatie Utilizata = "
Close #1
Else
Dim afiseazaDialogAsociatieStr As String
Dim denumireAsociatieStr As String
Open appPath & "\" & INI_FILE For Input As #1
Line Input #1, afiseazaDialogAsociatieStr
Line Input #1, denumireAsociatieStr
Close #1
If mid(afiseazaDialogAsociatieStr, InStr(afiseazaDialogAsociatieStr, "=") + 2) = "True" Then afiseazaDialogAsociatie = True
Else afiseazaDialogAsociatie = False
End If denumireAsociatie = mid(denumireAsociatieStr, InStr(denumireAsociatieStr, "=") + 2)
End If
End Sub
Sub scrieFisierIni()
Dim rs As New Recordset
Open appPath & "\" & INI_FILE For Output As #1
Print #1, "Afiseaza Dialog Selectie Asociatie = " & afiseazaDialogAsociatie
Print #1, "Ultima Asociatie Utilizata = " & denumireAsociatie
Close #1
End Sub
Public Sub WriteToLog(st As String)
Open appPath & "\" & LOG_FILE For Append As #1
Print #1, Format(Date, "dddd, d mmm yyyy") & " – " & Format(Time, "hh:mm:ss AMPM") & " >>> " & st
Close #1
End Sub
Public Function NormalizeStr(str As String) As String
Dim ret As String ret = str ret = Replace(ret, """", "_") ret = Replace(ret, ":", "_") ret = Replace(ret, "\", "_") ret = Replace(ret, "|", "_") ret = Replace(ret, "/", "_") ret = Replace(ret, "*", "_") ret = Replace(ret, "?", "_") ret = Replace(ret, "<", "_") ret = Replace(ret, ">", "_") ret = Replace(ret, ".", "_") ret = Replace(ret, "'", "_")
If Len(ret) > 255 Then ret = Left(ret, 254)
NormalizeStr = ret
End Function
Public Function MsgBoxRom(intrebare As String, titlu As String) As Boolean frmMsgBoxRom.Caption = titlu frmMsgBoxRom.lblIntrebare.Caption = intrebare frmMsgBoxRom.Show vbModal
MsgBoxRom = frmMsgBoxRom.Tag
Unload frmMsgBoxRom
End Function
Public Sub OpenRS(ByVal rs As ADODB.Recordset, strSql As String, Optional db As String)
' On Error GoTo err:
If rs.State = adStateOpen Then rs.Close
If db = "" Then rs.Open strSql, conexiune, adOpenStatic, adLockOptimistic
Else
Dim cn As New ADODB.Connection cn.ConnectionString = "DSN=MS Access Database;DBQ=" & App.Path & "\" & db & ";DefaultDir=" & App.Path & ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;PWD=" & DBPASSWD & ";" cn.Open rs.Open strSql, cn, adOpenStatic, adLockOptimistic
End If
Exit Sub err:
If err.Number = -2147217865 Then Resume 'nu gaseste query
End Sub
Public Function GetStrForCombo(ByRef gr As VSFlexGrid, tabel As String, fields As String, id As String, Optional filter As String, Optional order As String)
Dim rs As New Recordset
Dim strRS As String
If InStr(1, fields, "I") = 0 Then fields = "I" & fields strRS = "select " & id & "," & Replace(fields, "I", "") & " from " & tabel
If filter <> "" Then strRS = strRS & " where " & filter
End If
If order <> "" Then strRS = strRS & " order by " & order
End If
OpenRS rs, strRS
If rs.RecordCount > 0 Then
GetStrForCombo = gr.BuildComboList(rs, Replace(fields, "I", "*"), id)
Else
GetStrForCombo = "NULL"
End If rs.Close
Set rs = Nothing
End Function
Public Function GetFieldFromTable(field As String, table As String, Optional filtru As String, Optional firstlast As String) As Variant
Dim rs As New Recordset
If filtru <> "" Then rs.Open "select " & field & " from " & table & " where " & filtru, conexiune, adOpenStatic, adLockOptimistic
Else rs.Open "select " & field & " from " & table, conexiune, adOpenStatic, adLockOptimistic
End If
If rs.RecordCount > 0 Then
If firstlast = "first" Then rs.MoveFirst
GetFieldFromTable = rs.fields(0) & ""
ElseIf firstlast = "last" Then rs.MoveLast
GetFieldFromTable = rs.fields(0) & ""
Else
GetFieldFromTable = rs.fields(0) & ""
End If
Else
GetFieldFromTable = ""
End If rs.Close
Set rs = Nothing
End Function
Public Function GetMaxMinFieldTable(maxmin As String, field As String, table As String, Optional filtru As String) As Variant
Dim rs As New Recordset
If filtru = "" Then rs.Open "select " & maxmin & "(" & field & ") from " & table, conexiune, adOpenStatic, adLockOptimistic
Else rs.Open "select " & maxmin & "(" & field & ") from " & table & " where " & filtru, conexiune, adOpenStatic, adLockOptimistic
End If
If rs.RecordCount > 0 Then
GetMaxMinFieldTable = IIf(IsNull(rs.fields(0)), 0, rs.fields(0))
Else
GetMaxMinFieldTable = Null
End If rs.Close
Set rs = Nothing
End Function
Public Function GetRecordCount(table As String, Optional filtru As String) As Long
Dim rs As New Recordset
If filtru <> "" Then
OpenRS rs, "select count(*) from " & table & " where " & filtru
Else
OpenRS rs, "select count(*) from " & table
End If
GetRecordCount = rs.fields(0) rs.Close
Set rs = Nothing
End Function
Public Function GetComboItem(Row As Long, Col As Long, strCombo As String) As String
Dim kr As Long
Dim kc As Long
Dim tl As Long
Dim strTmp As String strTmp = strCombo
For kr = 0 To Row tl = InStr(1, strTmp, ";") strTmp = mid(strTmp, tl + 1, Len(strTmp) – tl)
Next
For kr = 1 To Col tl = InStr(1, strTmp, Chr(9)) strTmp = mid(strTmp, tl + 1, Len(strTmp) – tl)
Next tl = InStr(1, strTmp, Chr(9))
If tl <> 0 Then strTmp = mid(strTmp, 1, tl – 1) tl = InStr(1, strTmp, "|")
If tl <> 0 Then strTmp = mid(strTmp, 1, tl – 1)
End If
End If
GetComboItem = strTmp
End Function
Public Function GlueStr(str As String) As String
Dim ret As String ret = str ret = Replace(ret, """", "") ret = Replace(ret, ":", "") ret = Replace(ret, "\", "") ret = Replace(ret, "|", "") ret = Replace(ret, "/", "") ret = Replace(ret, "*", "") ret = Replace(ret, "?", "") ret = Replace(ret, "<", "") ret = Replace(ret, ">", "") ret = Replace(ret, ".", "") ret = Replace(ret, "'", "") ret = Replace(ret, "`", "") ret = Replace(ret, "I", "") ret = Replace(ret, "@", "") ret = Replace(ret, "#", "") ret = Replace(ret, "$", "") ret = Replace(ret, "%", "") ret = Replace(ret, "^", "") ret = Replace(ret, "&", "") ret = Replace(ret, "(", "") ret = Replace(ret, ")", "") ret = Replace(ret, "-", "") ret = Replace(ret, "_", "") ret = Replace(ret, "+", "") ret = Replace(ret, "=", "") ret = Replace(ret, "A", "") ret = Replace(ret, "S", "") ret = Replace(ret, "a", "") ret = Replace(ret, "i", "") ret = Replace(ret, ";", "") ret = Replace(ret, ",", "") ret = Replace(ret, " ", "")
GlueStr = ret
End Function
Public Function GetLunaName(L As Integer) As String
Select Case L
Case 1:
GetLunaName = "Ianuarie"
Case 2:
GetLunaName = "Februarie"
Case 3:
GetLunaName = "Martie"
Case 4:
GetLunaName = "Aprilie"
Case 5:
GetLunaName = "Mai"
Case 6:
GetLunaName = "Iunie"
Case 7:
GetLunaName = "Iulie"
Case 8:
GetLunaName = "August"
Case 9:
GetLunaName = "Septembrie"
Case 10:
GetLunaName = "Octombrie"
Case 11:
GetLunaName = "Noiembrie"
Case 12:
GetLunaName = "Decembrie"
Case Else:
GetLunaName = "???"
End Select
End Function
Public Function GetLunaPrelucrare(idLuna As Long) As String
GetLunaPrelucrare = GetLunaName(GetFieldFromTable("luna", "luna", "lunaID=" & idLuna)) & " / " & GetFieldFromTable("anul", "luna", "lunaID=" & idLuna)
End Function
–––––––––––––––––––––––––––––––––––––––– frmAlegeAsociatie
–––––––––––––––––––––––––––––––––––––––– Private Sub CheckAfisare_Click()
If CheckAfisare.Value = 1 Then afiseazaDialogAsociatie = True
Else afiseazaDialogAsociatie = False
End If
End Sub
Private Sub cmdAbandon_Click()
Dim frm As Form
For Each frm In Forms
If frm.Name = "frmMDIPrincipal" Then
Unload Me
Exit Sub
End If
Next
Unload Me
End
End Sub
Private Sub cmdAdaugaAsociatie_Click()
Dim newAsociatie As String
Dim newAsociatieNorm As String newAsociatie = InputBox("Introduceti denumirea asociatiei :", "Adaugare asociatie noua") newAsociatieNorm = NormalizeStr(newAsociatie)
If Len(newAsociatieNorm) = 0 Then Exit Sub
If Dir(appPath & "\mdb" & newAsociatieNorm & ".mdb") <> "" Then
MsgBox "Asociatia " & newAsociatieNorm & " exista deja pe disc", vbExclamation, "Notificare"
Exit Sub
End If
If newAsociatieNorm <> "" Then
FileCopy appPath & "\template.mdb", appPath & "\mdb" & newAsociatieNorm & ".mdb" citesteBazeDisc
End If
For i = 1 To comboAsociatie.ListCount
If comboAsociatie.List(i) = newAsociatieNorm Then comboAsociatie.ListIndex = i
Next
End Sub
Private Sub cmdOk_Click()
Dim rs As New ADODB.Recordset
Screen.MousePointer = vbHourglass bazaDate = appPath & "\" & "mdb" & comboAsociatie.Text & ".mdb" denumireAsociatie = comboAsociatie.Text conecteazaBaza
OpenRS rs, "SELECT * FROM luna"
Screen.MousePointer = vbDefault
ID_LUNA = 0
If rs.RecordCount = 0 Then frmSelectieLuna.Show vbModal
End If
Unload Me
End Sub
Private Sub Form_Load()
If afiseazaDialogAsociatie = True Then
CheckAfisare.Value = 1
Else
CheckAfisare.Value = 0
End If citesteBazeDisc
If comboAsociatie.ListCount = 0 Then cmdOk.Enabled = False
End If
End Sub
Sub citesteBazeDisc()
Dim fisier As String
Dim i As Integer
Screen.MousePointer = vbHourglass comboAsociatie.Clear fisier = Dir(appPath & "\" & "mdb*.mdb")
If fisier <> "" Then comboAsociatie.AddItem (mid(fisier, 4, Len(fisier) – 7))
End If
While fisier <> "" fisier = Dir
If fisier <> "" Then comboAsociatie.AddItem (mid(fisier, 4, Len(fisier) – 7))
Wend
If comboAsociatie.ListCount <> 0 Then comboAsociatie.ListIndex = 0
Screen.MousePointer = vbDefault
End Sub
Private Sub Form_Resize()
With Toolbar1
.Width = .ButtonWidth * .Buttons.Count
.Left = ScaleWidth – .Width – 70
End With
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
If Button.Index = 2 Then cmdOk_Click
Else cmdAbandon_Click
End If
End Sub
–––––––––––––––––––––––––––––––––––––––– frmApartament
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim GD_NRCAMERE As Integer
Dim GD_NRPERSOANE As Integer
Dim GD_PROPRIETAR As Integer
Dim GD_NRAPARTAMENT As Integer
Dim GD_LUNAID As Long
Dim GD_APARTAMENTID As Long
Dim GD_SUPRAFATA As Long
Dim GD_OBSERVATII As Long
Dim trebuieSalvat As Boolean
Public Sub DocSave() rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew
If grNom.Rows = 2 Then rs.fields("nrPersoane") = 1 rs.fields("nrCamere") = 1 rs.fields("nrApartament") = 1
Else rs.fields("nrPersoane") = grNom.TextMatrix(grNom.Rows – 2, GD_NRPERSOANE) rs.fields("nrCamere") = grNom.TextMatrix(grNom.Rows – 2, GD_NRCAMERE) rs.fields("suprafata") = grNom.TextMatrix(grNom.Rows – 2, GD_SUPRAFATA) rs.fields("nrApartament") = grNom.TextMatrix(grNom.Rows – 2, GD_NRAPARTAMENT) + 1
End If rs.fields("lunaID") = ID_LUNA grNom.SetFocus grNom.Col = GD_PROPRIETAR grNom.EditCell
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg Apartamentul " & grNom.TextMatrix(rw, GD_NRAPARTAMENT) & " ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_APARTAMENTID) = True grNom.ColHidden(GD_LUNAID) = True grNom.TextMatrix(0, GD_NRAPARTAMENT) = "Nr Ap"
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox Replace("Apartamentul * nu poate fi sters deoarece este utilizat in alte documente", "*", grNom.TextMatrix(rw, GD_NRAPARTAMENT)), vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_NRAPARTAMENT) = wdth * 10 grNom.ColWidth(GD_PROPRIETAR) = wdth * 25 grNom.ColWidth(GD_NRCAMERE) = wdth * 10 grNom.ColWidth(GD_NRPERSOANE) = wdth * 10 grNom.ColWidth(GD_SUPRAFATA) = wdth * 10 grNom.ColWidth(GD_OBSERVATII) = wdth * 30
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
For i = 1 To grNom.Rows – 1
If Trim(grNom.TextMatrix(i, GD_PROPRIETAR)) = "" And UCase(grNom.TextMatrix(0, 2)) = "PROPRIETAR" Then
MsgBox "Nu puteti avea proprietar fara nume", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
If Val(grNom.TextMatrix(i, GD_NRCAMERE)) <= 0 Then
MsgBox "Numarul de camere trebuie sa fie mai mare decat zero", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close
Set rs = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
End Sub
Private Sub Timer1_Timer()
Dim i As Long
Timer1.Interval = 0
Timer1.Enabled = False
OpenRS rs, "SELECT * FROM apartament WHERE LunaID=" & ID_LUNA & " ORDER BY nrApartament"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "LUNAID"
GD_LUNAID = i grNom.ColHidden(i) = True
Case "APARTAMENTID"
GD_APARTAMENTID = i grNom.ColHidden(i) = True
Case "NRCAMERE"
GD_NRCAMERE = i grNom.ColEditMask(i) = "99"
Case "NRPERSOANE"
GD_NRPERSOANE = i grNom.ColEditMask(i) = "99"
Case "NRAPARTAMENT" grNom.TextMatrix(0, i) = "Nr Ap"
GD_NRAPARTAMENT = i grNom.ColEditMask(i) = "999"
Case "PROPRIETAR"
GD_PROPRIETAR = i
Case "SUPRAFATA"
GD_SUPRAFATA = i
Case "OBSERVATII"
GD_OBSERVATII = i
End Select
Next grNom.Col = GD_PROPRIETAR
Form_Resize
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Linie Noua"
DocNou
Case "Sterge Linia"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmConsum
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim rsc As New ADODB.Recordset
Dim rst As New ADODB.Recordset
Dim GD_CONSUMID As Integer
Dim GD_TIPCONSUMID As Integer
Dim GD_APARTAMENTID As Long
Dim GD_VALOARE As Integer
Dim trebuieSalvat As Boolean
Public Sub DocSave()
Dim i As Long
For i = 1 To grNom.Rows – 1
If grNom.TextMatrix(i, GD_TIPCONSUMID) = "" Then
MsgBox "Nu poate exista consum fara tip de consum" grNom.SetFocus grNom.Col = GD_TIPCONSUMID
Exit Sub
End If
If grNom.TextMatrix(i, GD_APARTAMENTID) = "" Then
MsgBox "Nu poate exista consum fara apartament" grNom.SetFocus grNom.Col = GD_APARTAMENTID
Exit Sub
End If
Next rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew rs.fields("valoare") = 0 grNom.SetFocus grNom.Col = GD_APARTAMENTID grNom.EditCell
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg consumul ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_CONSUMID) = True grNom.ColComboList(GD_TIPCONSUMID) = grNom.BuildComboList(rsc, "denumireConsum,um", "tipConsumID") grNom.TextMatrix(0, GD_TIPCONSUMID) = "Tip Consum" grNom.ColComboList(GD_APARTAMENTID) = grNom.BuildComboList(rst, "*nrApartament,proprietar", "apartamentID") grNom.TextMatrix(0, GD_APARTAMENTID) = "Apartament"
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox "Consumul nu poate fi sters deoarece este utilizat in alte documente", vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Load()
Dim i As Long
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
OpenRS rsc, "SELECT tipConsumID,denumireConsum FROM tipConsum"
OpenRS rst, "SELECT apartamentID,nrApartament,proprietar FROM apartament WHERE lunaID=" & ID_LUNA & " ORDER BY nrApartament"
OpenRS rs, "SELECT consum.consumID,consum.apartamentID,consum.tipconsumID,consum.Valoare FROM consum INNER JOIN apartament ON consum.apartamentID=apartament.apartamentID WHERE apartament.lunaID=" & ID_LUNA & " ORDER BY apartament.nrApartament,consum.tipConsumID"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "CONSUMID"
GD_CONSUMID = i grNom.ColHidden(i) = True
Case "TIPCONSUMID"
GD_TIPCONSUMID = i grNom.ColComboList(GD_TIPCONSUMID) = grNom.BuildComboList(rsc, "denumireConsum", "tipConsumID") grNom.TextMatrix(0, GD_TIPCONSUMID) = "Tip Consum"
Case "APARTAMENTID"
GD_APARTAMENTID = i grNom.ColComboList(GD_APARTAMENTID) = grNom.BuildComboList(rst, "*nrApartament,proprietar", "apartamentID") grNom.TextMatrix(0, GD_APARTAMENTID) = "Apartament"
Case "VALOARE"
GD_VALOARE = i
End Select
Next
grNom.Col = GD_VALOARE
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_TIPCONSUMID) = wdth * 40 grNom.ColWidth(GD_APARTAMENTID) = wdth * 30 grNom.ColWidth(GD_VALOARE) = wdth * 25
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close rsc.Close rst.Close
Set rs = Nothing
Set rsc = Nothing
Set rst = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_ComboCloseUp(ByVal Row As Long, ByVal Col As Long, FinishEdit As Boolean)
FinishEdit = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
End If
If Col = GD_VALOARE And Val(Trim(grNom.EditText)) < 0 Then
MsgBox "Valoarea nu poate fi negativa", vbExclamation, "Atentie"
Cancel = True
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Linie Noua"
DocNou
Case "Sterge Linia"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmDateAsociatie
–––––––––––––––––––––––––––––––––––––––– Dim imobilID As Long
Private Sub Form_Load()
Dim rs As New Recordset
Set Me.Icon = frmMDIPrincipal.Icon
OpenRS rs, "SELECT * FROM imobil"
If rs.RecordCount <> 0 Then imobilID = rs("imobilID") txtDenumire = rs("Denumire") txtAdresa = rs("Adresa") txtLocalitate = rs("Localitate") txtJudet = rs("Judet") txtNumeAdministrator = rs("numeAdministrator")
End If rs.Close
End Sub
Public Sub DocSave()
Dim oText As Control
Dim rs As New Recordset
For Each oText In Me.Controls
If mid(oText.Name, 1, 3) = "txt" Then
If oText.Text = "" Then
MsgBox "Completati toate campurile !", vbInformation, "Atentie"
Exit Sub
End If
End If
Next
OpenRS rs, "SELECT * FROM imobil"
If rs.RecordCount = 0 Then rs.AddNew "denumire", "x" rs.Update imobilID = rs("imobilID") rs.Close
End If conexiune.Execute "UPDATE imobil SET denumire='" & txtDenumire & "'" _
& " ,adresa='" & txtAdresa & "'" _
& " ,localitate='" & txtLocalitate & "'" _
& " ,Judet='" & txtJudet & "'" _
& " ,numeAdministrator='" & txtNumeAdministrator & "'" _
& " WHERE imobilid=" & imobilID & ""
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmFacturi
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim rst As New ADODB.Recordset
Dim GD_FACTURAID As Integer
Dim GD_TIPCONSUMID As Integer
Dim GD_LUNAID As Long
Dim GD_SUMA As Integer
Dim GD_NRDOCUMENT As Integer
Dim GD_CONSUM As Integer
Dim trebuieSalvat As Boolean
Public Sub DocSave()
Dim i As Long
For i = 1 To grNom.Rows – 1
If grNom.TextMatrix(i, GD_TIPCONSUMID) = "" Then
MsgBox "Nu poate exista factura fara tip de consum" grNom.SetFocus grNom.Col = GD_TIPCONSUMID
Exit Sub
End If
Next rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew rs.fields("suma") = 0 rs.fields("consum") = 0 rs.fields("lunaID") = ID_LUNA grNom.SetFocus grNom.Col = GD_NRDOCUMENT grNom.EditCell
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg factura " & grNom.TextMatrix(rw, GD_NRDOCUMENT) & " ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_LUNAID) = True grNom.ColHidden(GD_FACTURAID) = True grNom.ColComboList(GD_TIPCONSUMID) = grNom.BuildComboList(rst, "denumireConsum,um", "tipConsumID") grNom.TextMatrix(0, GD_TIPCONSUMID) = "Tip Consum"
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox Replace("Factura * nu poate fi stearsa deoarece este utilizata in alte documente", "*", grNom.TextMatrix(rw, GD_NRDOCUMENT)), vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Load()
Dim i As Long
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
OpenRS rst, "SELECT tipconsumID,denumireConsum,um FROM tipConsum ORDER BY denumireConsum"
OpenRS rs, "SELECT * FROM factura WHERE lunaID=" & ID_LUNA & " ORDER BY nrDocument"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "FACTURAID"
GD_FACTURAID = i grNom.ColHidden(i) = True
Case "TIPCONSUMID"
GD_TIPCONSUMID = i grNom.ColComboList(GD_TIPCONSUMID) = grNom.BuildComboList(rst, "denumireConsum,um", "tipConsumID") grNom.TextMatrix(0, GD_TIPCONSUMID) = "Tip Consum"
Case "LUNAID"
GD_LUNAID = i grNom.ColHidden(i) = True
Case "SUMA"
GD_SUMA = i
Case "CONSUM"
GD_CONSUM = i
Case "NRDOCUMENT"
GD_NRDOCUMENT = i
End Select
Next grNom.Col = GD_SUMA
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_TIPCONSUMID) = wdth * 30 grNom.ColWidth(GD_SUMA) = wdth * 20 grNom.ColWidth(GD_CONSUM) = wdth * 25 grNom.ColWidth(GD_NRDOCUMENT) = wdth * 20
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close rst.Close
Set rs = Nothing
Set rst = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_ComboCloseUp(ByVal Row As Long, ByVal Col As Long, FinishEdit As Boolean)
FinishEdit = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
End If
If Col = GD_SUMA And Val(Trim(grNom.EditText)) < 0 Then
MsgBox "Valoarea nu poate fi negativa", vbExclamation, "Atentie"
Cancel = True
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Fact Noua"
DocNou
Case "Sterge Fact"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmFurnizori
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim GD_DENUMIREFURNIZOR As Integer
Dim GD_OBSERVATII As Integer
Dim GD_ADRESA As Integer
Dim GD_FURNIZORID As Long
Dim GD_CF As Integer
Dim trebuieSalvat As Boolean
Public Sub DocSave() rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew grNom.SetFocus grNom.Col = GD_DENUMIREFURNIZOR grNom.EditCell
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg Furnizorul " & grNom.TextMatrix(rw, GD_DENUMIREFURNIZOR) & " ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_FURNIZORID) = True
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox Replace("Furnizorul * nu poate fi sters deoarece este utilizat in alte documente", "*", grNom.TextMatrix(rw, GD_DENUMIREFURNIZOR)), vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
OpenRS rs, "SELECT * FROM furnizor ORDER BY denumireFurnizor"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
Dim i As Long
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "FURNIZORID"
GD_FURNIZORID = i grNom.ColHidden(i) = True
Case "DENUMIREFURNIZOR"
GD_DENUMIREFURNIZOR = i
Case "ADRESA"
GD_ADRESA = i
Case "OBSERVATII"
GD_OBSERVATII = i
Case "CF"
GD_CF = i
End Select
Next grNom.Col = GD_DENUMIREFURNIZOR
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_DENUMIREFURNIZOR) = wdth * 40 grNom.ColWidth(GD_CF) = wdth * 10 grNom.ColWidth(GD_ADRESA) = wdth * 20 grNom.ColWidth(GD_OBSERVATII) = wdth * 30
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
For i = 1 To grNom.Rows – 1
If Trim(grNom.TextMatrix(i, 2)) = "" And UCase(grNom.TextMatrix(0, 2)) = "DENUMIRE" Then
MsgBox "Nu puteti avea furnizor fara denumire", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close
Set rs = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Linie Noua"
DocNou
Case "Sterge Linia"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmIncasare
––––––––––––––––––––––––––––––––––––––––-
Dim rs As New ADODB.Recordset
Dim rst As New ADODB.Recordset
Dim GD_INCASAREID As Long
Dim GD_APARTAMENTID As Long
Dim GD_DATA As Integer
Dim GD_NRCHITANTA As Integer
Dim GD_SUMA As Integer
Dim trebuieSalvat As Boolean
Private Sub Form_Load()
Dim i As Long
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
OpenRS rst, "SELECT apartamentID,nrApartament,proprietar FROM apartament WHERE lunaID=" & ID_LUNA & " ORDER BY nrApartament"
OpenRS rs, "SELECT incasare.incasareID,incasare.apartamentID,incasare.nrChitanta,incasare.Data,incasare.Suma FROM incasare INNER JOIN apartament ON incasare.apartamentID=apartament.apartamentID WHERE apartament.lunaID=" & ID_LUNA & " ORDER BY apartament.nrApartament"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "INCASAREID"
GD_INCASAREID = i grNom.ColHidden(i) = True
Case "DATA"
GD_DATA = i grNom.ColComboList(GD_DATA) = "…" grNom.ColFormat(GD_DATA) = "dd – mm – yyyy"
Case "APARTAMENTID"
GD_APARTAMENTID = i grNom.ColComboList(GD_APARTAMENTID) = grNom.BuildComboList(rst, "*nrApartament,proprietar", "apartamentID") grNom.TextMatrix(0, GD_APARTAMENTID) = "Apartament"
Case "SUMA"
GD_SUMA = i
Case "NRCHITANTA"
GD_NRCHITANTA = i grNom.TextMatrix(0, GD_NRCHITANTA) = "Numar Chitanta"
End Select
Next
grNom.Col = GD_VALOARE
End Sub
Public Sub DocSave()
Dim i As Long
For i = 1 To grNom.Rows – 1
If grNom.TextMatrix(i, GD_APARTAMENTID) = "" Then
MsgBox "Nu poate exista incasare fara apartament" grNom.SetFocus grNom.Col = GD_APARTAMENTID
Exit Sub
End If
Next rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew rs.fields("suma") = 0 grNom.SetFocus grNom.Col = GD_APARTAMENTID
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg incasarea ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_INCASAREID) = True grNom.ColComboList(GD_APARTAMENTID) = grNom.BuildComboList(rst, "*nrApartament,proprietar", "apartamentID") grNom.TextMatrix(0, GD_APARTAMENTID) = "Apartament" grNom.TextMatrix(0, GD_NRCHITANTA) = "Numar Chitanta"
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox "Incasarea nu poate fi stearsa deoarece este utilizata in alte documente", vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_SUMA) = wdth * 20 grNom.ColWidth(GD_APARTAMENTID) = wdth * 30 grNom.ColWidth(GD_DATA) = wdth * 20 grNom.ColWidth(GD_NRCHITANTA) = wdth * 25
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close rst.Close
Set rs = Nothing
Set rst = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_CellButtonClick(ByVal Row As Long, ByVal Col As Long) dataCurenta = Date
Load frmSelectieData frmSelectieData.Calendar1.Value = grNom.TextMatrix(Row, Col) frmSelectieData.Show vbModal grNom.TextMatrix(Row, Col) = dataCurenta
End Sub
Private Sub grNom_ComboCloseUp(ByVal Row As Long, ByVal Col As Long, FinishEdit As Boolean)
FinishEdit = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
End If
If Col = GD_SUMA And Val(Trim(grNom.EditText)) < 0 Then
MsgBox "Suma nu poate fi negativa", vbExclamation, "Atentie"
Cancel = True
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Linie Noua"
DocNou
Case "Sterge Linia"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmListaCheltuieli
–––––––––––––––––––––––––––––––––––––––– Const GD_ID = 1
Const GD_NRAPARTAMENT = 2
Const GD_PROPRIETAR = 3
Const GD_NRPERSOANE = 4
Const GD_SUPRAFATA = 5
Const startConsumFieldNo = 5
Const rowCheckTipareste = 1
Dim rs As New ADODB.Recordset
Dim raportDejaAfisat As Boolean
Private Sub Timer1_Timer()
Dim rsTC As New Recordset
Dim sumaColoana As Double
Timer1.Interval = 0
Timer1.Enabled = False raportDejaAfisat = False
OpenRS rsTC, "SELECT apartament.apartamentID FROM apartament WHERE lunaID=" & ID_LUNA
If rsTC.RecordCount = 0 Then
MsgBox "Trebuie sa introduceti locatarii !", vbInformation, "Atentie"
Unload Me
Exit Sub
End If rsTC.Close
OpenRS rsTC, "select tipConsumID,denumireConsum from tipConsum"
CalculCheltuieli ID_LUNA
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch grNom.Editable = flexEDNone grNom.AddItem "" grNom.ColHidden(GD_ID) = True grNom.ColHidden(GD_SUPRAFATA) = True grNom.Cell(flexcpBackColor, grNom.Rows – 1, 1, grNom.Rows – 1, grNom.Cols – 1) = RGB(190, 225, 248) grNom.Cell(flexcpFontBold, grNom.Rows – 1, 1, grNom.Rows – 1, grNom.Cols – 1) = True grNom.TextMatrix(grNom.Rows – 1, GD_PROPRIETAR) = "TOTAL:"
For j = startConsumFieldNo To rs.fields.Count sumaColoana = 0
For i = 1 To grNom.Rows – 2 sumaColoana = sumaColoana + grNom.TextMatrix(i, j)
Next grNom.TextMatrix(grNom.Rows – 1, j) = sumaColoana
Next
While Not rsTC.EOF
For i = startConsumFieldNo To rs.fields.Count – 1
If LCase(rs.fields(i).Name) = LCase(GlueStr(rsTC("denumireConsum"))) Then
If Me.Tag = "defalcate" Then grNom.TextMatrix(0, i + 1) = rsTC("denumireConsum")
Else grNom.ColHidden(i + 1) = True
End If
End If grNom.ColFormat(i + 1) = "#,###"
Next rsTC.MoveNext
Wend grNom.AutoSize 1, grNom.Cols – 1 rsTC.Close
End Sub
Sub CalculCheltuieli(idLuna As Long)
Screen.MousePointer = vbHourglass
Dim rstmp As New Recordset
Dim rsConsumContorizat As New Record
Dim consum
Dim consumContorizat As Double
Dim totalConsum As Double
Dim totalSumaObligatie As Double
Dim totalSumaApartament As Double
Dim i As Long
Dim pierdere As Double
Dim tipCalcul As Long
Dim tipConsumID As Long
Dim nrApartamente As Long
Dim nrApartamenteContorizate As Long
Dim nrPersoane As Long
Dim nrPersoaneContorizate As Long
Dim suprafata As Double
Dim suprafataContorizata As Double
On Error Resume Next conexiune.Execute "DROP TABLE listaRap"
On Error GoTo 0 conexiune.Execute "CREATE TABLE listaRap" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN ID LONG" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Ap TEXT(5)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Proprietar TEXT(100)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN NrPers TEXT(3)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Suprafata LONG" nrApartamente = GetRecordCount("apartament", "LunaID=" & idLuna) nrPersoane = GetFieldFromTable("sum(NrPersoane)", "apartament", "LunaID=" & idLuna) suprafata = GetFieldFromTable("sum(Suprafata)", "apartament", "LunaID=" & idLuna)
'creez RS-ul in care voi lucra
OpenRS rstmp, "SELECT tipconsumID,denumireConsum FROM tipConsum"
While Not rstmp.EOF
If Val(GetFieldFromTable("consum", "factura", "LunaID=" & idLuna & " and TipConsumID=" & Val(rstmp("tipConsumID")))) <> 0 Then conexiune.Execute "ALTER TABLE listaRap ADD COLUMN " & rstmp("tipConsumID") & " DOUBLE" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN " & GlueStr(rstmp("denumireConsum")) & " DOUBLE"
End If rstmp.MoveNext
Wend conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Total DOUBLE" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Restanta DOUBLE"
OpenRS rs, "SELECT * FROM listaRap"
OpenRS rstmp, "SELECT apartament.apartamentID,apartament.NrApartament,apartament.Proprietar,apartament.NrPersoane,apartament.Suprafata FROM apartament where LunaID = " & idLuna & " ORDER BY apartament.nrApartament"
While Not rstmp.EOF rs.AddNew rs("ID").Value = rstmp("apartamentID").Value rs("Ap").Value = rstmp("NrApartament").Value rs("Proprietar").Value = rstmp("Proprietar").Value rs("NrPers").Value = rstmp("NrPersoane").Value rs("Suprafata").Value = rstmp("Suprafata").Value
For i = startConsumFieldNo To rs.fields.Count – 1 Step 2 consum = GetFieldFromTable("valoare", "consum", "ApartamentID=" & Val(rs("id").Value) & " and TipConsumID=" & Val(rs.fields(i).Name))
If consum <> "" Then rs(i).Value = consum
Next rstmp.MoveNext
Wend rstmp.Close
For i = startConsumFieldNo To rs.fields.Count – 1 Step 2 tipConsumID = Val(Right(rs.fields(i).Name, 1))
If tipConsumID = 0 Then Exit For rs.MoveFirst totalConsum = Val(GetFieldFromTable("consum", "factura", "LunaID=" & idLuna & " and TipConsumID=" & Val(rs.fields(i).Name))) totalSumaObligatie = Val(GetFieldFromTable("suma", "factura", "LunaID=" & idLuna & " and TipConsumID=" & Val(rs.fields(i).Name))) tipCalcul = GetFieldFromTable("valoare", "tipcalcul", "tipcalculID=" & Val(GetFieldFromTable("tipCalculID", "tipConsum", "tipConsumID=" & Val(rs.fields(i).Name)))) consumContorizat = 0 nrApartamenteContorizate = 0 nrPersoaneContorizate = 0 suprafataContorizata = 0
'calculez consumurile contorizate
While Not rs.EOF
If Not IsNull(rs(i).Value) Then 'daca este contorizat consumContorizat = consumContorizat + Val(rs(i).Value) nrApartamenteContorizate = nrApartamenteContorizate + 1 nrPersoaneContorizate = nrPersoaneContorizate + rs("NrPers") suprafataContorizata = suprafataContorizata + rs("Suprafata")
End If rs.MoveNext
Wend
'repartizez consumurile necontorizate rs.MoveFirst
While Not rs.EOF
If IsNull(rs(i).Value) Then
If tipCalcul = TC_APARTAMENT Then rs(i).Value = 1 * (totalConsum – consumContorizat) / (nrApartamente – nrApartamenteContorizate)
ElseIf tipCalcul = TC_NRPERSOANE Then rs(i).Value = rs("NrPers") * (totalConsum – consumContorizat) / (nrPersoane – nrPersoaneContorizate)
ElseIf tipCalcul = TC_SUPRAFATA Then rs(i).Value = rs("Suprafata") * (totalConsum – consumContorizat) / (suprafata – suprafataContorizata)
End If
End If rs.MoveNext
Wend
'testez daca sunt pierderi
If nrApartamente = nrApartamenteContorizate And totalConsum <> consumContorizat Then pierdere = (totalConsum – consumContorizat) / nrApartamente
'adaug la consumuri pierderile rs.MoveFirst
While Not rs.EOF rs(i).Value = rs(i).Value + pierdere rs.MoveNext
Wend
End If
'calculez cheltuielile pt fiecare consum in parte rs.MoveFirst
While Not rs.EOF
If totalConsum <> 0 Then rs(i + 1).Value = Round(rs(i).Value * (totalSumaObligatie / totalConsum)) rs(i).Value = Round(rs(i).Value, 2) rs.MoveNext
Wend
Next
'calcul total/apartament rs.MoveFirst
While Not rs.EOF totalSumaApartament = 0
For i = startConsumFieldNo To rs.fields.Count – 3 Step 2 totalSumaApartament = totalSumaApartament + Val(rs(i + 1).Value)
Next rs.fields("Total").Value = totalSumaApartament
If GetRecordCount("deIncasat", "ApartamentID=" & rs("id")) = 0 Then conexiune.Execute "INSERT INTO deIncasat (ApartamentID,Suma) VALUES (" & rs("ID") & "," & totalSumaApartament & ")"
Else conexiune.Execute "UPDATE deIncasat SET Suma= " & totalSumaApartament & " where ApartamentID=" & rs("ID")
End If rs.fields("Restanta") = CalculRestanta(rs("Ap"), idLuna) rs.MoveNext
Wend
OpenRS rstmp, "select tipConsumID,denumireConsum from tipConsum"
While Not rstmp.EOF
For i = 0 To rs.fields.Count – 2
If LCase(rs.fields(i).Name) = LCase(rstmp("tipConsumID")) Then rs.Close conexiune.Execute "ALTER TABLE listaRap DROP " & rstmp("tipConsumID")
OpenRS rs, "SELECT * FROM listaRap"
End If
Next rstmp.MoveNext
Wend rstmp.Close
Screen.MousePointer = vbDefault
End Sub
Function CalculRestanta(apartamentNo, idLuna As Long) As Double
Dim totalPlatit As Double
Dim totalDePlatit As Double
Dim rs As New Recordset totalPlatit = 0 totalDePlatit = 0
OpenRS rs, "SELECT Sum(incasare.Suma) FROM apartament INNER JOIN incasare ON apartament.apartamentID = incasare.ApartamentID where (((apartament.LunaID) < " & idLuna & ")) GROUP BY apartament.NrApartament HAVING (((apartament.NrApartament)=" & apartamentNo & "))"
If rs.RecordCount <> 0 Then totalPlatit = rs.fields(0)
OpenRS rs, "SELECT Sum(deIncasat.Suma) FROM apartament INNER JOIN deIncasat ON apartament.apartamentID = deIncasat.ApartamentID where (((apartament.LunaID) < " & idLuna & ")) GROUP BY apartament.NrApartament HAVING (((apartament.NrApartament)=" & apartamentNo & "))"
If rs.RecordCount <> 0 Then totalDePlatit = rs.fields(0)
CalculRestanta = totalDePlatit – totalPlatit
End Function
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next rs.Close
' conexiune.Execute "DROP TABLE listaRap"
Set rs = Nothing
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
End Sub
Private Sub DocPrint()
If raportDejaAfisat = False Then
Dim rsTC As New Recordset
If Me.Tag = "totaluri" Then
OpenRS rsTC, "select tipConsumID,denumireConsum from tipConsum"
While Not rsTC.EOF
For i = startConsumFieldNo To rs.fields.Count – 1
If LCase(rs.fields(i).Name) = LCase(GlueStr(rsTC("denumireConsum"))) Then conexiune.Execute "ALTER TABLE listaRap DROP " & LCase(GlueStr(rsTC("denumireConsum")))
End If
Next rsTC.MoveNext
Wend rsTC.Close
End If
' On Error Resume Next conexiune.Execute "ALTER TABLE listaRap DROP ID,Suprafata" raportDejaAfisat = True
' On Error GoTo 0
End If arListaCheltuieli.DataControl1.ConnectionString = conexiune.ConnectionString
Set arListaCheltuieli.Icon = frmMDIPrincipal.Icon arListaCheltuieli.Show
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Tipareste"
DocPrint
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmMDIPrincipal
––––––––––––––––––––––––––––––––––––––––-
Private Sub MDIForm_Activate()
If ID_LUNA > 0 Then
Me.Caption = App.Title & " – " & denumireAsociatie & " – " & GetLunaPrelucrare(ID_LUNA)
Else
Me.Caption = App.Title & " – " & denumireAsociatie
End If
End Sub
Private Sub MDIForm_Load()
End Sub
Private Sub MDIForm_Unload(Cancel As Integer)
EndProgram
End Sub
Private Sub mnuAlegeLuna_Click()
For Each obj In Forms
If obj.Name <> "frmMDIPrincipal" Then Unload obj
Next frmSelectieLuna.Show vbModal
End Sub
Private Sub mnuAlegereAsociatie_Click()
For Each obj In Forms
If obj.Name <> "frmMDIPrincipal" Then Unload obj
Next frmAlegeAsociatie.Show vbModal
Me.Caption = App.Title & " – " & denumireAsociatie
End Sub
Private Sub mnuApartamente_Click() frmApartamente.Show
End Sub
Private Sub mnuAsistenta_Click()
Dim sBuf As String * 512
Dim winDir As String
GetWindowsDirectory sBuf, 512
winDir = Left(sBuf, InStr(1, sBuf, Chr(0)) – 1)
If Dir(winDir & "\hh.exe") <> "" Then
Shell winDir & "\hh.exe " & App.HelpFile, vbMaximizedFocus
Else
MsgBox "Asistenta nu poate fi accesata.", vbCritical, "Eroare"
End If
End Sub
Private Sub mnuChitante_Click() frmIncasare.Show
End Sub
Private Sub mnuConsum_Click() frmConsum.Show
End Sub
Private Sub mnuDateAsociatie_Click() frmDateAsociatie.Show
End Sub
Private Sub mnuDespre_Click() frmDespre.Show
End Sub
Private Sub mnuFacturi_Click() frmFacturi.Show
End Sub
Private Sub mnuFurnizori_Click() frmFurnizori.Show
End Sub
Private Sub mnuIesire_Click()
Unload Me
End Sub
Private Sub mnuLocatari_Click() frmLocatari.Show
End Sub
Private Sub mnuListaCheltuieli_Click() frmListaCheltuieli.Tag = "totaluri" frmListaCheltuieli.Show
End Sub
Private Sub mnuListaCheltuieliDefalcate_Click() frmListaCheltuieli.Tag = "defalcate" frmListaCheltuieli.Show
End Sub
Private Sub mnuOptiuni_Click() frmOptiuni.Show
End Sub
Private Sub mnuSituatieAp_Click() frmSituatieAp.Show
End Sub
Private Sub mnuTipConsum_Click() frmTipConsum.Show
End Sub
–––––––––––––––––––––––––––––––––––––––– frmOptiuni
–––––––––––––––––––––––––––––––––––––––– Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon
If afiseazaDialogAsociatie = True Then checkAfiseazaDialogAsociatie.Value = 1
Else checkAfiseazaDialogAsociatie.Value = 0
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Accepta"
If checkAfiseazaDialogAsociatie.Value = 1 Then afiseazaDialogAsociatie = True
Else afiseazaDialogAsociatie = False
End If
Unload Me
Case "Abandon"
Unload Me
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– frmRECSelection
–––––––––––––––––––––––––––––––––––––––– Public selected As Long
Public Function Initializare(Optional con As Connection) As Boolean
Dim i As Long
Initializare = True
Set rsm = New Recordset
On Error GoTo noConn i = con.State
Set rsm.ActiveConnection = con resum:
On Error GoTo 0 rsm.CursorLocation = adUseClient rsm.Open lblQueryMaster.Caption
If rsm.RecordCount = 0 Then
MsgBox "Nu aveti date.", vbExclamation, "Notificare"
Unload Me
Initializare = False
Exit Function
End If
Set Me.grM.DataSource = rsm
Me.grM.DataMode = flexDMFree
For i = 0 To grM.Rows – 1
If LCase(grM.TextMatrix(i, 0)) = "id" Then grM.ColWidth(i) = 0
Next
' grM.RowHidden(0) = True grM.ColHidden(0) = True grM.Select 1, 1
Form_Resize
Exit Function noConn:
Set rsm.ActiveConnection = conexiune
GoTo resum
End Function
Private Sub cmdCancel_Click()
Tag = "" selected = grM.RowSel
HelpContextID = 0
Hide
End Sub
Private Sub cmdOk_Click()
If grM.RowSel = 0 Then
Tag = -1
Else
Tag = grM.TextMatrix(grM.RowSel, 0)
End If selected = grM.RowSel
HelpContextID = 0
Hide
End Sub
Private Sub Form_Activate()
If selected < grM.Rows Then grM.Select selected, 0 grM.SetFocus
End Sub
Private Sub Form_Deactivate() selected = grM.RowSel
End Sub
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon
End Sub
Private Sub Form_Resize() grM.Move 0, Label1.Height, ScaleWidth, ScaleHeight – Frame1.Height – Label1.Height
Frame1.Move 0, grM.Height + grM.Top, ScaleWidth
Label1.Move 0, 0, ScaleWidth
With Toolbar1
.Width = .ButtonWidth * .Buttons.Count
.Left = ScaleWidth – .Width
End With
End Sub
Private Sub grM_DblClick() cmdOk_Click
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
If Button.Index = 1 Then cmdOk_Click
Else cmdCancel_Click
End If
End Sub
–––––––––––––––––––––––––––––––––––––––– frmSelectieData
–––––––––––––––––––––––––––––––––––––––– Private Sub Calendar1_Click() dataCurenta = Me.Calendar1.Value
Unload Me
End Sub
Private Sub Calendar1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then dataCurenta = Me.Calendar1.Value
Unload Me
End If
End Sub
Private Sub Form_Unload(Cancel As Integer) dataCurenta = Me.Calendar1.Value
End Sub
–––––––––––––––––––––––––––––––––––––––– frmSelectieLuna
––––––––––––––––––––––––––––––––––––––––-
Private Sub cmdCancel_Click()
Unload Me
Unload frmMDIPrincipal
End
End Sub
Private Sub cmdOk_Click()
ID_LUNA = Val(grLuna.TextMatrix(0, 0))
If ID_LUNA = 0 Then Exit Sub
Unload Me
End Sub
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon
Dim idL As Long
Dim strCmb As String strCmb = GetStrForCombo(grLuna, "luna", "Luna,Anul", "lunaID")
If strCmb <> "NULL" Then grLuna.Enabled = True grLuna.ColComboList(0) = strCmb idL = Val(GetFieldFromTable("lunaID", "luna", "luna=" & Month(Date) & " and anul=" & Year(Date)))
If idL <> 0 Then grLuna.TextMatrix(0, 0) = idL
Else grLuna.Enabled = False grLuna.TextMatrix(0, 0) = "Trebuie sa creeati o luna noua"
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Accepta" cmdOk_Click
Case "Abandon" cmdCancel_Click
End Select
End Sub
Private Sub grLuna_ComboCloseUp(ByVal Row As Long, ByVal Col As Long, FinishEdit As Boolean)
FinishEdit = True
End Sub
Private Sub Toolbar2_ButtonClick(ByVal Button As MSComctlLib.Button)
Dim anul As Long
Dim luna As Long
Dim idLuna As Long
Dim idLastLuna
Dim rs As New Recordset anul = Val(InputBox("Introduceti anul", "Anul", Year(Date)))
If anul < 2000 Or anul > 2100 Then Exit Sub luna = Val(InputBox("Introduceti luna", "Luna", Month(Date)))
If luna < 1 Or luna > 12 Then Exit Sub
If GetFieldFromTable("lunaID", "luna", "anul=" & anul & " and luna=" & luna) = "" Then idLastLuna = GetMaxMinFieldTable("max", "lunaID", "luna") conexiune.Execute "INSERT INTO luna (anul,luna) VALUES (" & anul & "," & luna & ")"
If Not IsNull(idLastLuna) Then idLuna = GetDBIdentity
OpenRS rs, "SELECT * FROM apartament WHERE lunaID=" & idLastLuna
If rs.RecordCount <> 0 Then
While Not rs.EOF conexiune.Execute "INSERT INTO apartament " _
& "(lunaID,NrApartament,Proprietar,NrPersoane,NrCamere,Suprafata) " _
& "VALUES (" & idLuna & "," & rs("NrApartament") & ",'" & rs("Proprietar") & "'," _
& rs("NrPersoane") & "," & rs("NrCamere") & "," & rs("Suprafata") & ")" rs.MoveNext
Wend
End If
End If
Else
MsgBox "Aceasta luna este deja existenta in baza de date", vbExclamation
End If
Form_Load
End Sub
–––––––––––––––––––––––––––––––––––––––– frmSituatieAp
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim rsID As New Recordset
Dim GD_APARTAMENTID As Long
Private Sub Form_Load()
Set Me.Icon = frmMDIPrincipal.Icon
End Sub
Private Sub DocUrm()
If Not rsID.EOF Then rsID.MoveNext
If Not rsID.EOF Then
IncarcaPlati (rsID("apartamentID"))
End If
End If
If rsID.AbsolutePosition = adPosEOF Then rsID.MoveLast
End If
End Sub
Private Sub DocPrec()
If Not rsID.BOF Then rsID.MovePrevious
If Not rsID.BOF Then
IncarcaPlati (rsID("apartamentID"))
End If
End If
If rsID.AbsolutePosition = adPosBOF Then rsID.MoveFirst
End If
End Sub
Public Sub DocGoto()
Dim mid As Long
frmRECSelection.Caption = "Selectie apartament …" frmRECSelection.lblQueryMaster = "SELECT apartamentID,nrApartament,proprietar FROM apartament WHERE lunaID=" & ID_LUNA & " ORDER BY nrApartament"
If frmRECSelection.Initializare Then frmRECSelection.Tag = "" frmRECSelection.Show vbModal
If frmRECSelection.Tag <> "" Then mid = frmRECSelection.Tag
If mid = -1 Then Exit Sub rsID.MoveFirst rsID.Find ("apartamentID=" & mid)
IncarcaPlati (mid)
End If
End If
End Sub
Private Sub Form_Unload(Cancel As Integer) rsID.Close
Set rsID = Nothing
Set rs = Nothing
End Sub
Private Sub IncarcaPlati(id As Long)
Dim nAp As Long
Label2.Caption = "Apartament Nr. " & rsID("nrApartament")
OpenRS rs, "SELECT incasare.incasareID,incasare.Data,incasare.NrChitanta,incasare.Suma FROM incasare INNER JOIN apartament ON incasare.apartamentID=apartament.apartamentID WHERE apartament.nrApartament=" & rsID("nrApartament")
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
Dim i As Long
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "INCASAREID" grNom.ColHidden(i) = True
Case "APARTAMENTID" grNom.ColHidden(i) = True
Case "DATA" grNom.ColFormat(i) = "dd – mm – yyyy" grNom.TextMatrix(0, i) = "Data Incasarii "
Case "NRCHITANTA" grNom.TextMatrix(0, i) = "Chitanta Nr " grNom.Cell(flexcpAlignment, 0, i, grNom.Rows – 1, i) = flexAlignRightCenter
Case "SUMA" grNom.ColFormat(i) = "#,###"
End Select
Next rs.Close grNom.AutoSize 1, grNom.Cols – 1
End Sub
Private Sub Timer1_Timer()
Timer1.Interval = 0
Timer1.Enabled = False
OpenRS rsID, "SELECT apartament.apartamentID,apartament.nrApartament FROM apartament WHERE lunaID=" & ID_LUNA & " ORDER BY nrApartament"
If rsID.RecordCount = 0 Then
MsgBox "Trebuie sa introduceti locatarii !", vbInformation, "Atentie"
Unload Me
End If
IncarcaPlati (rsID("apartamentID"))
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Precedent"
DocPrec
Case "Urmator"
DocUrm
Case "Cauta Ap"
DocGoto
End Select
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth
Label2.Move ScaleWidth – 2700 grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
End Sub
–––––––––––––––––––––––––––––––––––––––– frmTipConsum
–––––––––––––––––––––––––––––––––––––––– Dim rs As New ADODB.Recordset
Dim rsc As New ADODB.Recordset
Dim rst As New ADODB.Recordset
Dim GD_FURNIZORID As Integer
Dim GD_TIPCONSUMID As Integer
Dim GD_DENUMIRECONSUM As Integer
Dim GD_TIPCALCULID As Long
Dim GD_UM As Integer
Dim trebuieSalvat As Boolean
Public Sub DocSave()
Dim i As Long
For i = 1 To grNom.Rows – 1
If grNom.TextMatrix(i, GD_DENUMIRECONSUM) = "" Then
MsgBox "Nu pot exista tipuri de consum fara denumire"
Exit Sub
End If
If grNom.TextMatrix(i, GD_FURNIZORID) = "" Then
MsgBox "Nu pot exista tipuri de consum fara furnizor" grNom.SetFocus grNom.Col = GD_FURNIZORID
Exit Sub
End If
If grNom.TextMatrix(i, GD_TIPCALCULID) = "" Then
MsgBox "Nu pot exista tipuri de consum fara tip de calcul" grNom.SetFocus grNom.Col = GD_TIPCALCULID
Exit Sub
End If
Next rs.UpdateBatch adAffectAll trebuieSalvat = False
End Sub
Public Sub DocNou()
On Error Resume Next trebuieSalvat = True rs.AddNew grNom.SetFocus grNom.Col = GD_DENUMIRECONSUM grNom.EditCell
End Sub
Public Sub DocSterg()
Dim rw As Long
On Error GoTo 10: rw = grNom.Row
If MsgBoxRom("Sterg tipul de consum " & grNom.TextMatrix(rw, GD_DENUMIRECONSUM) & " ?", "Stergere") = True Then trebuieSalvat = True grNom.RemoveItem grNom.ColHidden(GD_TIPCONSUMID) = True grNom.ColComboList(GD_FURNIZORID) = grNom.BuildComboList(rsc, "denumireFurnizor", "furnizorID") grNom.TextMatrix(0, GD_FURNIZORID) = "Furnizor" grNom.ColComboList(GD_TIPCALCULID) = grNom.BuildComboList(rst, "tipCalcul", "tipcalculID") grNom.TextMatrix(0, GD_TIPCALCULID) = "Tip Calcul"
Form_Resize
End If
Exit Sub
10: rs.CancelUpdate grNom.Refresh
If err.Number = -2147467259 Then
MsgBox Replace("Tipul de consum * nu poate fi sters deoarece este utilizat in alte documente", "*", grNom.TextMatrix(rw, GD_DENUMIRECONSUM)), vbInformation, "Stergere"
Else
WriteToLog ("Eroare la Nomenclator nr:" & err.Number & " descriere: " & err.Description)
End If err.Clear
End Sub
Private Sub Form_Load()
Dim i As Long
Set Me.Icon = frmMDIPrincipal.Icon trebuieSalvat = False
OpenRS rsc, "SELECT furnizorID,denumireFurnizor FROM furnizor"
OpenRS rst, "SELECT tipCalculID,tipCalcul FROM tipCalcul"
OpenRS rs, "SELECT * FROM tipConsum ORDER BY denumireConsum"
Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch
For i = 0 To grNom.Cols – 1
Select Case UCase(grNom.TextMatrix(0, i))
Case "TIPCONSUMID"
GD_TIPCONSUMID = i grNom.ColHidden(i) = True
Case "DENUMIRECONSUM"
GD_DENUMIRECONSUM = i
Case "UM"
GD_UM = i
Case "FURNIZORID"
GD_FURNIZORID = i grNom.ColComboList(GD_FURNIZORID) = grNom.BuildComboList(rsc, "denumireFurnizor", "furnizorID") grNom.TextMatrix(0, i) = "Furnizor"
Case "TIPCALCULID"
GD_TIPCALCULID = i grNom.ColComboList(GD_TIPCALCULID) = grNom.BuildComboList(rst, "tipCalcul", "tipcalculID") grNom.TextMatrix(0, i) = "Tip Calcul"
End Select
Next grNom.Col = GD_DENUMIRECONSUM
End Sub
Private Sub Form_Resize()
Dim a As Integer
Dim a2 As Integer
Dim wdth As Long a = 4 a2 = a * 2
On Error Resume Next
Label1.Move 0, 0, ScaleWidth grNom.Move a, Label1.Height + a2, ScaleWidth – a2, ScaleHeight – Label1.Height – a2 * 4
wdth = (grNom.Width) / 100 grNom.ColWidth(GD_DENUMIRECONSUM) = wdth * 40 grNom.ColWidth(GD_UM) = wdth * 10 grNom.ColWidth(GD_FURNIZORID) = wdth * 20 grNom.ColWidth(GD_TIPCALCULID) = wdth * 25
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
For i = 1 To grNom.Rows – 1
If Trim(grNom.TextMatrix(i, 2)) = "" And UCase(grNom.TextMatrix(0, 2)) = "DENUMIRE" Then
MsgBox "Nu puteti avea furnizor fara denumire", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
Next
If trebuieSalvat = True Then
If MsgBoxRom("Salvati Documentul ?", "Salvare") = True Then DocSave
End If rs.Close rsc.Close rst.Close
Set rs = Nothing
End Sub
Private Sub grNom_AfterEdit(ByVal Row As Long, ByVal Col As Long) trebuieSalvat = True
End Sub
Private Sub grNom_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyInsert Then
DocNou
Exit Sub
End If
If KeyCode = vbKeyDelete Then DocSterg
End Sub
Private Sub grNom_ValidateEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
If Trim(grNom.EditText) = "" Then
MsgBox "Campul introdus nu poate fi vid", vbExclamation, "Atentie"
Cancel = True
Exit Sub
End If
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Trim(Button.Caption)
Case "Salveaza"
DocSave
Case "Linie Noua"
DocNou
Case "Sterge Linia"
DocSterg
End Select
End Sub
–––––––––––––––––––––––––––––––––––––––– arListaCheltuieli
–––––––––––––––––––––––––––––––––––––––– Dim twPchar As Long
Const cnstTPC = 104
Dim widths() As Single
Private Sub ActiveReport_DataInitialize()
CalculWidth
Dim lft As Long
Dim ctl As DDActiveReports2.field
Dim ctTotal As DDActiveReports2.field
Dim ctLabel As DDActiveReports2.Label
Dim rs As New Recordset rs.Open "SELECT * FROM imobil", conexiune, adOpenStatic, adLockOptimistic txtDenumireAsociatie = rs("denumire") & " " & rs("adresa") rs.Close
Me.Sections("Detail").Height = 216 lft = 0
For i = 0 To DataControl1.Recordset.fields.Count – 1
If DataControl1.Recordset.fields(i).Name <> "ID" Then
Set ctLabel = Me.Sections("PageHeader").Controls.Add("DDActiveReports2.Label")
Set ctl = Me.Sections("Detail").Controls.Add("DDActiveReports2.Field") ctLabel.Top = Me.Sections("PageHeader").Height ctLabel.Caption = DataControl1.Recordset.fields(i).Name ctLabel.Left = lft ctLabel.Width = twPchar * widths(i) ctLabel.Height = 240 ctLabel.Font.Bold = True ctLabel.Font.Size = twPchar * 8 / cnstTPC ctLabel.VerticalAlignment = ddTXMiddle
If i = 0 Then ctLabel.Border.LeftStyle = ddBLSolid ctLabel.Border.BottomStyle = ddBLExtraThickSolid ctLabel.Border.RightStyle = ddBLSolid ctLabel.Border.TopStyle = ddBLSolid ctLabel.Alignment = ddTXRight ctl.DataField = DataControl1.Recordset.fields(i).Name ctl.Top = 0 ctl.Left = lft ctl.Width = twPchar * widths(i) ctl.Height = 216 ctl.Font.Size = twPchar * 8 / cnstTPC
If i = 0 Then ctl.Border.LeftStyle = ddBLSolid ctl.Border.RightStyle = ddBLSolid ctl.Border.BottomStyle = ddBLSolid ctl.VerticalAlignment = ddTXMiddle
If i > 2 Then
Set ctTotal = Me.Sections("ReportFooter").Controls.Add("DDActiveReports2.Field") ctTotal.DataField = DataControl1.Recordset.fields(i).Name ctTotal.SummaryFunc = ddSFSum ctTotal.SummaryRunning = ddSRAll ctTotal.SummaryType = ddSMGrandTotal ctTotal.Top = 0 ctTotal.Left = lft ctTotal.Width = twPchar * widths(i) ctTotal.Height = 216 ctTotal.Font.Size = twPchar * 8 / cnstTPC ctTotal.VerticalAlignment = ddTXMiddle ctTotal.Font.Bold = True ctTotal.Alignment = ddTXRight ctTotal.OutputFormat = "#,###"
End If
Dim ft ft = DataControl1.Recordset.fields(i).Type
If ft = adBSTR Or ft = adChar Or ft = adVarChar Or ft = adVarWChar Or ft = adWChar Then ctl.Alignment = ddTXLeft ctLabel.Alignment = ddTXLeft
Else ctl.Alignment = ddTXRight ctLabel.Alignment = ddTXRight ctl.OutputFormat = "#,###"
End If lft = lft + ctLabel.Width
End If
Next ctl.Border.RightStyle = ddBLSolid
Me.Zoom = -1
End Sub
Private Sub CalculWidth()
Dim totWidth As Long
Dim totCharWidth As Long
Dim rs As New Recordset
Dim convRate As Double
Dim ft twPchar = cnstTPC totWidth = Me.Width
Me.PageSettings.LeftMargin = 720
Me.PageSettings.RightMargin = 720 totCharWidth = 0
ReDim widths(0 To DataControl1.Recordset.fields.Count – 1)
For i = 0 To DataControl1.Recordset.fields.Count – 1
If DataControl1.Recordset.fields(i).Name <> "ID" Then rs.Open "SELECT max(len(cstr(" & DataControl1.Recordset.fields(i).Name & "))) FROM listaRap", conexiune, adOpenStatic, adLockOptimistic
If rs.fields(0) >= Len(DataControl1.Recordset.fields(i).Name) Then ft = DataControl1.Recordset.fields(i).Type
If ft = adBSTR Or ft = adChar Or ft = adVarChar Or ft = adVarWChar Or ft = adWChar Then
widths(i) = rs.fields(0)
Else
widths(i) = rs.fields(0) + 6
End If
Else
widths(i) = Len(DataControl1.Recordset.fields(i).Name) + 1
End If totCharWidth = totCharWidth + widths(i) rs.Close
End If
Next convRate = ((Me.PageSettings.PaperWidth – 720 – 720) / twPchar) / totCharWidth
If convRate < 1 Then
Me.PageSettings.Orientation = ddOLandscape
End If
While convRate < 1 twPchar = twPchar – 5 convRate = ((Me.PageSettings.PaperWidth – 720 – 720) / twPchar) / totCharWidth
Wend
For i = 0 To DataControl1.Recordset.fields.Count – 1
widths(i) = widths(i) * convRate
Next
End Sub
Private Sub ActiveReport_ReportStart() txtLunaAnul = GetLunaPrelucrare(ID_LUNA)
End Sub
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Aplicatie Pentru Evidenta Cheltuielilor Lunare ALE Asociatiilor DE Proprietari (ID: 149462)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
