Episodul 5 – Creerea formurilor principale



Episodul 5 – Creerea formurilor principale

In cadrul episodului de fata vom folosi, din nou, metoda modelarii obiectelor dintr-o baza de date sau dintr-o aplicatie. De data asta, vom modela formurile principale ale aplicatiei.

Am modelat formurile folosind Microsoft Visio. Acest mod de lucru ne ajuta sa ne dam seama de lipsurile unui design inainte sa investim timp si efort in ceva si ne permite sa facem modificarile usor, fara a afecta designul in ansamblul lui.

Modul de lucru folosind modelarea obiectelor inainte de a trece la designul lor este o practica si un mod de lucru recomandat si la mare cautare. In cazul nostru, probabil ca am fi putut trece peste faza de modelare, pentru ca vorbim de un produs care dispune de editoare vizuale (WYSIWYG), deci se putea obtine acelasi rezultat trecind direct la design. Ce am vrut sa transmit este conceptul de modelare si sa incerc sa evidentiez putin citeva din avantajele acestui mod de lucru. Ca si tool-uri de modelare, exista destule si pentru fiecare buzunar. Pentru ca trebuie spus ca aceste tool-uri nu sint free (sau cel putin eu nu am stire de vreunul free). Personal folosesc Microsoft Visio, pentru ca ofera tot ce am nevoie in domeniul bazelor de date. In cazul formurilor din Access, Visio imi ofera doar imaginea finala a ceea ce dorim sa obtinem, fara posibilitatea generarii codului sau definitiilor necesare. Ne ajuta sa ne facem o idee asupra ergonomiei formului si unde putem aduce imbuntatiri.

Sa incepem…

Primul form la care trebuie sa ne gindim este cel care va afisa continutul colectiei noastre si va oferi acces la principalele operatii asupra datelor. Sa ne concentram putin pe acest aspect, al operatiilor pe care le dorim.

In primul rind, dorim sa putem interveni asupra datelor primare si anume asupra colectiei de discuri.

In al doilea rind, dorim sa putem efectua tranzactii cu discurile din colectie, dar si cu discurile care le imprumutam.

Evident, sint situatii in care dorim sa introducem un disc nou in colectie (proaspat achizionat) sau stergerea unui disc din colectie, in cazul in care este deteriorat si nu se mai poate folosi. Trebuie avute in vedere si aceste situatii.

Mai trebuie prevazuta o modalitate de acces la rapoartele predefinite.

Inainte de a incepe lucrul propriu-zis la formul principal, trebuie sa ne gindim la toate aspectele evidentiate mai sus, pentru ca acest form va fi elementul care va crea prima-impresie pentru un utilizator. Nu am pretentia ca sint un bun designer de interfete grafice (aici trebuie spus ca sint job-uri dedicate pe aceasta tema si cursuri care te invata elemente de ergonomie a interfetelor) dar am vrut sa evidentiez importanta acestui pas, de analiza a elementelor si optiunilor pe care vrem sau trebuie sa le includem in interfata. In plus fata de optiunile si facilitatile pe care dorim sau trebuie sa le includem, trebuie sa ne gindim si la cum prezentam datele in acest form, care date le prezentam, etc.

Pentru scopul aplicatiei noastre, vom adopta o interfata similara cu cea din imaginea de mai jos.

[pic]

In partea din stinga vom afisa lista discurilor din colectie, iar in partea din dreapta vom afisa detaliile discului curent selectat in partea stinga.

Butoanele din partea de jos ne vor permite accesul usor la operatiile de baza asupra colectiei. Accesul la rapoarte ne este permis prin intermediul butonului Rapoarte. Butonul Iesire va asigura optiunea de inchidere a aplicatiei. Am pozitionat butonul de stergere mai departat de restul butoanelor pentru a ne asigura ca nu se apasa acest buton din greseala. In plus, ofera si un punct de balans pentru restul butoanelor, fiind pozitionat relativ la mijlocul formului.

Ca si modele, am inclus si modelele pentru inca 2 formuri, pentru a avea o imagine comuna si unitara asupra obiectivelor exercitiului.

Formul de editare detalii disc este inclus in imaginea de mai jos. Acelasi form va fi folosit si pentru introducerea unui disc nou in colectie.

[pic]

Formul de acces la rapoarte este prezentat in imaginea urmatoare. In lista vor fi selectate obiectele de tip Report din baza de date Access si userul va selecta raportul dorit si apoi va specifica operatia dorita: afisarea raportului pe ecran (Preview) sau tiparirea acestuia (Print).

[pic]

Acum, ca ne-am facut o idee asupra cum trebuie sa arate formurile, sa ne oprim putin asupra sursei datelor pentru fiecare form in parte.

Pentru a putea afisa datele in formul principal, vom avea nevoie de un query care sa ne ofere toate detaliile pe care le dorim afisate, atit in partea din stinga, cit si cea din dreapta.

Ce este acest query ? Este o instructiune SQL care ne returneaza un set de inregistrari din baza de date, inregistrari selectate pe baza unor criterii specificate in sintaxa acestui query. Optional, se pot specifica criterii de sortare, grupare a datelor, criterii de filtrare a datelor, sumarizare a lor, etc. Foarte “din avion”, aceasta sintaxa, in cazul nostru ar arata similar cu aceasta:

SELECT Cimp1, Cimp2, Cimp3, … Cimp n FROM nume_tabela

Despre sintaxa completa a unei instructiuni SQL s-ar putea scrie destul de mult. Sa nu uitam ca pe tema asta exista un curs dedicat de la Microsoft (curs de 2 zile) cursul cu numarul 2071B, Querying a Microsoft SQL Server 2000 Database Using Transact-SQL ().

Problema noastra insa, cu acest query, este ca datele nu sint toate in aceeasi tabela, ci in mai multe. Cum le aducem inapoi, toate datele pe care le dorim, in scopul afisarii acestora in form ? Ne folosim de relatiile pe care le-am definit si construim un query ceva mai complex, care foloseste clauza JOIN (alaturare).

Sa vedem cum folosim aceste JOINuri si ce tool-uri avem la dispozitie. In containerul Queries, avem optiunea Create view in designer.

[pic]

Dublu-click pe aceasta optiune si avem pe ecran Query Designer

[pic]

Adaugam prima data tabela tbl_Colectie (este important ca prima tabela inserata in Query Designer sa fie aceasta tabela), dupa care, in ce ordine doriti, celelalte tabele. Obtinem un ecran similar cu cel de mai jos (observatie: am obtinut ecranul de mai jos dupa ce am rearanjat elementele afisate sa incapa pe ecran).

[pic]

Liniile afisate intre tabele semnifica relatiile deja stabilite intre tabele si ne va ajuta la regasirea datelor necesare. De exemplu, SQL va folosi cimpul StandardID din tabela tbl_Colectie ca sa regaseasca in tabela tbl_Standarde denumirea asociata acelui ID din tabela tbl_Colectie.

Urmeaza sa facem selectarea cimpurilor pe care le vrem afisate in query. Pentru aceasta, faceti selectiile ca in imaginea de mai sus. In coloana Sort Order, putem specifica ordinea in care sa se faca sortarea datelor (in cazul nostru intii pe DenumireStandard si apoi pe Titlu). Se mai pot specifica eventualele criterii de filtrare a datelor (coloana Criteria, iar daca e nevoie de mai multe criterii, aceste se pot specifica in coloanele Or… ).

Pentru a vedea codul SQL generat de designer, apasam butonul SQL din toolbar (in cercul rosu). Efectul este urmatorul:

[pic]

Apare in plus, in Designer, o zona in care este afisat scriptul SQL generat in urma actiunilor noastre de pina acum.

In plus, nu toate discurile apartin de sau au legaturi directe cu o persoana din tabela tbl_Agenda. Pentru a evita returnarea unui set de inregistrari vid in aceasta situatie sau omiterea inregistrarilor din tabela tbl_Colectie pentru care nu se gaseste nici o inregistrare in tbl_Agenda, facem modificarea din imaginea de mai sus pe legatura dintre tbl_Colectie si tbl_Agenda. Meniul il activam cu click dreapta pe linia de legatura dintre cele doua tabele si selectam optiunea Select All Rows from tbl_Colectie.

Inainte de a face orice test, salvam query-ul nostru. Pentru aceasta, selectam optiunea File, Save si introducem numele dorit pentru query-ul nostru. Un exemplu de dialog in acest sens este in imaginea de mai jos:

[pic]

Pentru a verifica efectul query-ului nostru, putem apasa butonul ! din toolbar. Efectul este urmatorul:

[pic]

Pentru ca nu avem inregistrari in acest moment in baza de date, rezultatul este o “tabela” vida. Am folosit termenul de tabela, pentru ca view-urile (sau query-urile) sint folosite ca niste tabele, cu diferenta ca acestea sint stocate in baza de date doar ca definitii (mai exact, prin intermediul unei instructiuni SELECT), nu au si date asociate in mod direct. Datele sint regasite numai cind view-ul este rulat, pentru diverse scopuri. Mai multe despre view-uri, in books online, urmind linikul de mai jos:

mk:@MSITStore:C:Program%20FilesMicrosoft%20SQL%20Server80ToolsBooksarchitec.chm::/8_ar_da_2d9v.htm

NOTA: Linkul de mai sus va functiona numai daca se face instalarea SQL Server in calea implicita propusa de installer.

Am creat query-ul care va returna datele pentru formul principal. Sa trecem la designul formului.

Pentru aceasta, ne mutam in containerul Forms din Access si dam click pe optiunea Create form in design view.

[pic]

Apare designer-ul de formuri. Redimensionam formul propus de designer pina ajunge la o dimensiune apropiata de cea modelata de noi si incepem pozitionarea diferitelor elemente necesare functionalitatilor dorite pe acesta. Sa recapitulam putin aceste elemente (sau controale, cum sint denumite in Access):

1. Listbox pentru afisarea sumara a colectiei

2. Push-buttons pentru a accesa diferitele functionalitati dorite. Astfel, vom avea cite un push-button pentru fiecare din operatiile: adaugare, editare, stergere, acces la rapoarte si iesire din aplicatie.

3. O zona de afisare a detaliilor inregistrarii selectate in listbox. In aceast zona vom avea nevoie de cite un textbox pentru fiecare cimp inclus in query-ul care ne returneaza datele pentru listbox-ul de la pct 1.

Din motive tehnice, nu am putut captura tot procesul de drag&drop sau resizing pentru fiecare control, asa ca va voi prezenta versiunea finala a pozitionarii pe form a controalelor si va voi arata de unde le accesati pe fiecare in parte:

[pic]

Va invit pe fiecare in parte, daca nu ati mai lucrat cu Access, sa va familiarizati putin cu celelalte tipuri de controale oferite de Access. Mai trebuie spus, ca paranteza, ca aceasta lista de controale nu este inchisa. Aceasta se poate extinde prin instalarea de controale user-defined (sau ActiveX).

In imaginea de mai sus nu am inclus inca text-box-urile din zona de detalii, pentru ca inca nu am folosit view-ul creat anterior, deci nu avem inca informatia asupra numarului de cimpuri pe care le dorim afisate. Deci, sa continuam designul nostru.

Fiecare control de pe un form are niste proprietati. Aceste proprietati depind, evident, in functie de tipul controlului in cauza, dar orice control are asociate aceasta colectie de proprietati. Printre acestea, daca controlul respectiv, poate afisa sau manipula date, se numara si proprietatile Row Source Type si Row Source. Acestea specifica de unde-si va lua controlul respectiv datele (dintr-o tabela, dintr-un view sau functie) pe care le va manipula si cine anume este furnizorul acestor date (care anume din obiectele de tipul selectat la Row Source Type este acel furnizor).

[pic]

Prin pasul de mai sus, am atasat ca date rezultatele returnate de view-ul pe care l-am creat putin mai inainte. Pentru semnificatia celorlalte optiuni disponibile pentru Row Source Type, puteti consulta Access Help.

O alta proprietate importanta este Bound Column. Cum folosim aceasta proprietate ? Fiecare form poate avea propriul set de inregistrari pe care sa-l manipuleze. Acesta se specifica la proprietatile formului. In cazul nostru, la formul principal nu avem nevoie de un set de date la nivel de form. Insa, la formul de editare detalii, de exemplu, unde vom afisa o singura inregistrare, avem nevoie. Cum determinam care inregistrare sa o afisam ? Trebuie sa putem determina cumva inregistrarea curent selectata in listboxul nostru si doar acea inregistrare sa o afisam. Putem face aceasta determinare folosind aceasta proprietate, Bound Column. Vom vedea putin mai incolo cum se face, practic, aceasta determinare.

Deocamdata, lasam aceasta proprietate pe valoarea implicita si ne continuam tutorialul.

Alte proprietati importante, care urmeaza sa le adaptam aplicatiei noastre:

[pic]

Column Count – specifica numarul de coloane returnate de view-ul nostru

Column Heads – daca dorim ca in listbox sa se afiseze numele de coloane asa cum ele setate in view

Column Widths – latimile, in inch, pe care sa fie afisate datele in lista box.

Am sa va rog sa faceti setarile conform imaginii de mai sus, si va voi explica fiecare setare de ce am facut-o in acel fel. Pentru a avea o imagine mai concreta a setarilor mentionate si a efectelor acestora, sa facem o verificare intermediara a formului. Pentru aceasta, avem butonul incercuit cu rosu in imaginea de mai sus.

[pic]

In mare, designul se apropie de ce am modelat cu ceva timp inainte. Mai avem de scos anumite proprietati, de modificat altele. Sa identificam in acest ecran proprietatile in cauza. Pe linga cele de mai sus, daca incercam sa redimensionam formul, vom vedea ca nu este afisat integral, intr-o fereastra si este nevoie de scroll bars ca sa putem vedea tot ce am inclus in acest form. Si asta nu e bine. Sa revenim in design mode (butonul incercuit cu rosu din toolbar) si sa modificam proprietatile mentionate mai sus.

[pic]

Pentru a modifica proprietatile in cauza, in fereastra Properties, in combo-ul de sus, selectam elementul Form (ca in imaginea de mai sus) si faceti setarile la fel cu cele de mai sus. Inchidem designerul si salvam formul cu click pe butonul Save din toolbar si dam numele formului frm_Startup.

Si acum sa vedem pentru ce ne-am chinuit atit:

[pic]

Nu arata rau si nu e departe de ceea ce am dorit sa obtinem. Dar, nu putem testa totul pentru ca nu avem date in tabele si nu avem actiuni setate pe controalele incluse in form.

Sa rezolvam si partea asta. Sa introducem pentru inceput niste date in tabele. Vom incepe cu tabelele auxiliare.

Deschidem tabela tbl_CaseDeDiscuri si incepem sa introducem date in cimpul DenumireCasa. Cimpul CasaID se va completa automat cu valori incepind de la 1.

[pic]

Cind ati introdus citeva inregistrari, inchideti fereastra.

Procedam similar si cu celelalte tabele auxiliare. Aveti mai jos datele pe care am ales eu sa le introduc. Puteti introduce si alte date daca vreti, dar vom face asta mai incolo, prin intermediul interfetei pe care urmeaza sa o dezvoltam. Aceste date le vom folosi doar pentru testele preliminare.

[pic]

[pic]

Si acum, in tabela tbl_Colectie:

[pic]

Si acum repetam testul formului:

[pic]

Vedem ca in acest moment, avem afisata in listbox-ul din stinga inregistrarea pe care am adaugat-o in tabela tbl_Colectie. Inainte de a incheia acest episod, vom mai face o singura modificare in form. Si anume, vom activa ca operatie asociata butonului Iesire inchiderea MS-Access. Pentru aceasta, apasam pe butonul Design din toolbar (butonul incercuit cu rosu).

NOTA: In acest pas, vom folosi cod VBA (Visual Basic for Applications). Acest cod este foarte apropiat ca sintaxa si structura de Visual Basic (este de fapt un subset al acestuia) si este folosit ca limbaj de programare pentru aplicatiile Microsoft (Excel, Word, etc). Se presupune ca se poseda un nivel minim de cunostinte VBA (sau VB). Pentru mai mutle detalii despre VBA, puteti cauta in Help-ul oferit de Access.

In Form Designer, dam click pe butonul Iesire si incepem sa-i modificam proprietatile, conform imaginii de mai jos. Pentru inceput ii schimbam numele in btn_Iesire.

[pic]

Dupa aceea, ii asignam codul VBA (Visual Basic for Applications) care va inchide MS-Access. Pentru aceasta, dam click pe tab-ul Event si apoi in casuta On Click dam click pe butonul care are afisate simbolul ….

[pic]

Ne apare fereastra de mai jos:

[pic]

Selectam Code Builder si dam click pe OK. Se va afisa mediul de editare VB (Visual Basic), unde vom introduce codul urmator:

[pic]

Inchidem editorul, inchidem formul cu salvare si testam aplicatia. Daca ati facut totul corect, ar trebui sa obtineti urmatorul rezultat:

[pic]

Cu un click pe Yes, ati ajuns inapoi in Windows.

Si cu asta, incheiem aici acest episod, urmind ca in episodul urmator sa continuam lucrul pe formul principal si pe controalele din acesta.

Autor Alin Selicean

[pic]

[pic]

[pic]

Copyright (c) ITzone 2003 - 2008

Toate drepturile Rezervate

[pic]

Home

|

Stiri

|

Download

|

Tutoriale

|

Articole

|

Imagini

|

Securitate

|

Forum

|

Contact

[pic]

|[pic] | |

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download