A Ap pl li ic ca a i ii i p pr ro of fe es si io on na al le e n n b ba az ze e d de e d da at te e o or ri ie en nt ta at te e o ob bi ie ec ct t
Master Baze de date i tehnologii web Anul I, Semestrul I
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 2 Cuprins 1. INTRODUCERE ...................................................................................................... 4 2. ORACLE9I FORMS DEVELOPER......................................................................... 6 2.1. INTRODUCERE .................................................................................................... 6 2.2. ARHITECTURA SERVICIILOR FORMS................................................................... 7 2.3. PUBLICAREA FORMELOR.................................................................................... 8 2.4. PROIECTAREA FORMELOR................................................................................ 10 2.4.1. Diagrama conceptuala exemplu.............................................................. 10 2.4.2. Componentele Forms Builder.................................................................. 11 Object Navigator .................................................................................................. 11 Paleta de proprieti (Property Palette)................................................................. 13 Editorul vizual (Layout Editor) ............................................................................ 15 Editorul PL/SQL................................................................................................... 16 2.4.3. Instrumente de tip wizard........................................................................ 17 2.4.4. Testarea formelor .................................................................................... 27 Modul insert ......................................................................................................... 31 Modul query ......................................................................................................... 35 2.4.5. Rafinarea formelor .................................................................................. 40 2.4.6. Palete de proprieti................................................................................ 43 2.4.7. Atribute vizuale........................................................................................ 47 2.4.8. Proprietile ferestrelor .......................................................................... 48 2.4.9. Proprietile unui bloc de date................................................................ 49 2.5. BLOCURI MASTER-DETAIL................................................................................ 58 2.6. GESTIONAREA ELEMENTELOR TEXT ................................................................. 71 2.7. BUTOANE (PUSH BUTTONS)............................................................................... 83 2.8. CANVAS-URI DE TIP SUPRAPUS (STACKED CANVAS)............................................ 87 2.9. LISTE DE VALORI (LOVS) ................................................................................ 92 2.10. ALTE TIPURI DE ELEMENTE INTR-UN FORMULAR............................................. 99 2.10.1. Casete de validare................................................................................... 99 2.10.2. Elemente lista ........................................................................................ 100 2.10.3. Grupuri de butoane radio...................................................................... 101 2.11. DECLANATORI (TRIGGER-I)........................................................................... 103 2.11.1. Trigger-i de interogare (query triggers) ............................................... 109 2.11.2. Trigger-i de validare ............................................................................. 111 2.11.3. Trigger-ii navigationali ......................................................................... 114 2.11.4. Trigger-ii tranzactionali........................................................................ 115 3. ORACLE9I REPORTS DEVELOPER................................................................. 120 3.1. INTRODUCERE ................................................................................................ 120
3 3.2. PROIECTAREA RAPOARTELOR........................................................................ 123 3.2.1. Componentele Reports Builder.............................................................. 123 Object Navigator ................................................................................................ 124 Report Editor ...................................................................................................... 125 Property Inspector .............................................................................................. 127 Editorul PL/SQL................................................................................................. 127 3.2.2. Instrumente de tip wizard...................................................................... 127 3.3. REPORT EDITOR 5 MODURI DE VIZUALIZARE A RAPORTULUI ..................... 136 3.4. RAPOARTE CU GRUPURI MASTER-DETAIL ...................................................... 145 3.5. MODIFICAREA RAPOARTELOR FOLOSIND DATA MODEL ............................... 152 3.5.1. Crearea manuala a grupurilor.............................................................. 153 3.5.2. Adaugarea manuala a coloanelor......................................................... 156 3.6. MODIFICAREA RAPORTULUI FOLOSIND PAPER LAYOUT ................................ 159 3.6.1. Cele 3 sectiuni ale raportului: header, main, trailer ............................ 159 3.6.2. Margini.................................................................................................. 162
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 4
1. 1. Introducere Introducere Corporaia Oracle ofer un set complet de instrumente pentru gestionarea datelor i dezvoltarea de aplicaii performante. Produsele incluse n versiunea 9i sunt: Oracle9i Developer Suite (Oracle9iDS), care permite crearea de aplicaii ce vor fi stocate i rulate pe Oracle9i Application Server (Oracle9iAS) i care acceseaz datele din Oracle9i Database. Versiunea 9i a sistemului Oracle prezint o arhitectur pe 3 niveluri (3-tier): clientul este pe primul nivel, Oracle9i Application Server pe nivelul din mijloc i server- ul de baze de date este pe cel de-al treilea nivel. Oracle9iDS (Developer Suite) este un set complet de instrumente pentru crearea de aplicaii i servicii web, asigurnd ntregul ciclu de via al unei aplicaii, de la modelare, scriere de cod de orice tip (incluznd Java Server Pages, servlet-uri, forme), pn la testare i depanare. Produsele Oracle9i folosesc un set comun de tehnologii, care permit utilizarea aceleiai aplicaii n medii cu configuraii arhitecturale variate. Java, XML i PL/SQL sunt limbaje complementare utilizate pentru dezvoltarea de aplicaii, iar Oracle9iDS permite folosirea n paralel a celor trei. Oracle9i Developer Suite ofer instrumente vizuale, wizard-uri, utilitare pentru verificarea automat a sintaxei, pentru editarea elementelor grafice i de interfa, toate acestea permind dezvoltarea rapid de aplicaii i uurarea muncii programatorului. Aplicaii de tipuri diferite cer instrumente de dezvoltare diferite. Aceast idee este implementat cu succes n Oracle9i Developer Suite unde gsim, n principal, urmtoarele componente: 1. Oracle Designer conine instrumente ce permit specificarea cerinelor i proiectarea schemei aplicaiei ntr-un mediu vizual, oferind utilitare de reverse enginnering i generare automat de cod; 2. Oracle Forms Developer se ocup de prezentarea logic a aplicaiei, genernd formulare sofisticate ce permit operaii DML pe tabelele bazei de date; formularele pot conine cmpuri calculate, sume totale sau pariale, liste diverse, alerte toate create cu un efort de programare minim; 3. JDeveloper este un mediu integrat pentru crearea, depanarea i gestionarea aplicaiilor XML pe mai multe niveluri i a componentelor bazate pe J2EE;
5 4. Oracle Portal organizeaz toat informaia (coninut web, aplicaii) sub forma unui portal. Poate fi permis accesul de la distan al dispozitivelor wireless, opiune util pentru persoanele care cltoresc des; 5. Oracle Reports Developer, Oracle Discoverer, Oracle Express permit analizarea informaiei din surse diverse, crearea de rapoarte complexe i distribuirea lor n formate diverse i n medii diverse (email, imprimant, fiier, portlet). Un raport poate fi mprit logic n mai multe seciuni i, printr-o singur rulare, seciuni diferite vor fi trimise ctre destinatari diferii. Oracle9iDS face saltul de la arhitectura client-server la cea web-enabled. n versiunile 6i i anterioare acesteia era necesar instalarea de componente Oracle pe fiecare client. Pentru rularea formularelor i a rapoartelor trebuia instalate pe client componentele Forms RunTime i Reports RunTime. n versiunea 9i aceste runtime-uri se instaleaz pe Oracle9iAS. Deci, pe client nu este necesar instalarea de aplicaii Oracle, fiind ncarcata, la rulare, doar interfaa grafic a aplicaiei. Algoritmul parcurs la rularea unui formular este urmtorul: clientul (reprezentat de un browser web) trimite o cerere ctre server-ul de aplicaii (Application Server - AS). Aceast cerere este preluat de server-ul HTTP Oracle (Apache), care recunoate tipul ei i o redirecioneaz prin server-ul web ctre instrumentele corespunztoare (de exemplu, dac este un formular, l trimite ctre Oracle Forms). n urma prelucrrii cererii naintate de ctre browser, Oracle9iAS i rspunde acestuia printr-un document HTML care poate fi construit n unul din mai multe moduri: PL/SQL, Java, printr-un program CGI etc. Oracle9iAS prezint o arhitectur pe niveluri, cu urmtoarele tipuri de servicii: de comunicare pentru recunoaterea unui numr mare de protocoale; un container J2EE creeaz un mediu runtime pentru aplicaii; servicii sistem; servicii de conectivitate pentru sisteme diverse. Dintre componentele Oracle9i Developer Suite ne vom opri, n capitolele urmtoare, asupra urmtoarelor dou: Forms Developer i Reports Developer.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 6 2. 2. Oracle9i Forms Developer Oracle9i Forms Developer 2.1. 2.1. Introducere Introducere Oracle Forms are dou componente: Oracle Forms Developer, un mediu de dezvoltare de aplicaii, care este inclus n Oracle9i Developer Suite i Oracle9i Forms Services, un mediu pentru publicarea aplicaiilor, aflat pe Oracle9i Application Server. Oracle Forms Developer ofer un mediu pentru dezvoltarea de formulare complexe ce permit accesul la datele din baza de date. Integrarea sa cu Oracle Designer permite folosirea unui model creat n acest mediu de programare i generarea automat de formulare conform cerinelor proiectate n Oracle Designer. Mecanismul de inginerie invers (reverse engineering) permite ca modificrile fcute apoi n Oracle Forms Developer s fie implementate automat n model, pstrndu-se, astfel, integritatea dintre model i aplicaie. Limbajul de programare folosit n Forms este PL/SQL, codul aplicaiilor fiind interpretat n timpul rulrii. Interfaa web a unei aplicaii Forms este un applet Java, obinut fr ca utilizatorul s scrie un singur rnd de cod Java. Oracle9i Forms folosete un interpretor runtime, dar nlocuiete motorul client/server din versiunile anterioare cu unul web, care ncarc pe staia client interfaa aplicaiei folosind un set generic de clase Java. Principalul avantaj este c se pot publica formele pe web fr a modifica nici o linie de cod. Formele web sunt accesibile printr-un URL scris n bara de adrese a browser-ului. Iat, n continuare, cteva din caracteristicile reprezentative ale produsului: Oracle Forms Developer conine wizard-uri pentru crearea rapid de aplicaii n care nu este nevoie de nici o linie de cod. Funcionalitatea formularelor este asigurat de proceduri i funcii predefinite (numite built-ins). Unitile de program PL/SQL pot fi plasate pe server-ul bazei de date sau n interiorul aplicaiei, n funcie de cerine. Se poate face drag-and-drop asupra obiectelor, deplasndu-le ntre module i server-ul bazei de date. Aplicaiile Oracle9iDS pot fi folosite de un singur utilizator sau de mai muli utilizatori simultan, fr nici o modificare n cadrul sursei. Oracle Forms Developer folosete modelul de motenire obiectual, care permite motenirea atributelor i a codului ntre obiecte i module.
7 2.2. 2.2. Arhitectura serviciilor Forms Forms Arhitectura serviciilor Componenta Forms Services reprezint un cadru de lucru pe trei niveluri folosit pentru a publica formularele dumneavoastr pe Internet, folosind interfee Java deosebite. Cele trei niveluri sunt: clientul, server-ul de aplicaii i baza de date Oracle9i. Modul de lucru cu o aplicaie Oracle9i Forms respect urmtorul algoritm: 1) utilizatorul (reprezentat printr-un browser web) nainteaz o cerere sub forma unei aplicaii, ce va fi accesat printr-o adres URL. Acest URL este trimis server-ului HTTP (Apache), care sesizeaz c este vorba despre o aplicaie Developer Forms i trimite cererea ctre Forms Servlet. 2) Forms Servlet-ul detecteaz ce browser are utilizatorul, apoi creeaz dinamic o pagin HTML coninnd toat informaia necesar pentru iniierea unei sesiuni Forms (numit i motor runtime). Dup ce pagina este ncarcat n browser, acesta iniiaz descrcarea unui applet Java client, constnd ntr-un set de clase Java (doar dac acest applet nu a fost deja descrcat n cadrul unei alte sesiuni, caz n care este pstrat n memoria cache). Clientul Forms Java ruleaz pe o main virtual Java (care, implicit, este JInitiator) i acceseaz servlet-ul Forms Listener (aflat pe nivelul din mijloc unde este server-ul de aplicaii). Forms Listener deschide un motor runtime web, crend pentru aceast sesiune un cookie, depozitat n memorie sau ataat URL-ului la fiecare cerere i rspuns. Acest cookie nu este niciodat stocat pe calculatorul utilizatorului. 3) Pentru fiecare client Forms listener demareaz cte un proces runtime web nou (ifweb90.exe). Acest proces este cel care se conecteaz la baza de date i comunic cu clientul Forms, gestionnd logica aplicaiei i procesarea. Astfel, datele nu sunt ncrcate n browser-ul client, ci interschimbate ntre server-ul de aplicaii (Application Server) i server-ul de baz de date (Database Server), reducndu-se traficul n reea i mbuntindu-se performanele. Procesul runtime comunic cu clientul Java folosind protocoalele HTTP sau HTTPS. 4) Servlet-ul Forms Listener stabilete o conexiune cu motorul runtime, care se conecteaz la baza de date. El este cel care, prin intermediul server-ului HTTP sau al container-ului OC4J gestioneaz comunicarea dintre applet-ul Forms i motorul runtime. Motorul runtime web comunic inteligent cu clientul Java, comparnd mesajul actual cu cel transmis anterior i transmind doar informaia ce a fost actualizat. Astfel, traficul n reea este redus substanial. 5) Interfaa utilizator Forms este un applet Java care folosete un set de clase Java prestabilit. Acesta afieaz interfaa utilizator a aplicaiei n fereastra
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 8 browser a utilizatorului. Odat descrcat acest applet n browser-ul clientului, pot fi rulate orict de multe i de complexe aplicaii Forms, fr descrcri ulterioare. Setul de clase Java este pstrat n memoria cache pn la detectarea unei versiuni noi a Forms-ului, caz n care va fi actualizat. Interfeele Java utilizate n Oracle9i Developer Forms ofer acelai design i calitate ca cele utilizate n aplicaiile client/server, fr a cere din partea utilizatorului final cunotinte superioare. n plus, logica aplicaiei este mutat pe nivelul din mijloc, al server-ului pe aplicaii, asigurnd performane sporite aplicaiei.
2.3. 2.3. Publicarea formelor Publicarea formelor Procesul de publicare pe web a formelor este implementat, deci, conform ideii c logica aplicaiei i motorul runtime al serviciilor Forms se afl pe server-ul de aplicaii. Toate procesele ce acioneaz asupra datelor se execut la nivelul bazei de date i al server-ului de aplicaii, n timp ce interfaa aplicaiei se afl pe clientul Forms. Utilizatorul final ruleaz o aplicaie Forms Developer ntr-un browser web, invocnd-o printr-o adres URL care pointeaz ctre aplicaie. Componenta Forms Services genereaz apoi un fiier HTML care descarc un applet Java pe maina client. Acest mic applet este cel care permite afiarea interfeei formei, n timp ce logica aplicaiei se execut pe server-ul de aplicaii. La rularea formei sunt vizibile urmtoarele: 1. fereastra browser-ului; 2. applet-ul Java (coninut n fereastra browser-ului); 3. meniul implicit (coninut n applet); 4. meniul smartbar (coninut n applet); 5. bara de stare (coninut n applet). O cerere naintat de utilizator va avea urmtorul rezultat:
9
3 4 1 2 5 Meniul implicit este parte a tuturor aplicaiilor Forms i conine intrri pentru operaiile de baz ce se pot efectua asupra datelor din form (salvare n baza de date, ncrcarea n formular a unei nregistrri noi, tergerea din baza de date a nregistrrii curente, operaii de commit i rollback etc.) Acest meniu poate fi eliminat sau personalizat, aa cum vom vedea ntr-un capitol ulterior. Meniul smartbar conine butoane a cror apsare are aceeai aciune cu unele dintre opiunile meniului implicit i este utilizat pentru accesarea direct a acestora. n runtime, acest meniu este afiat deasupra oricrui eventual meniu definit de utilizator. Ca i cel precedent, i meniul smartbar poate fi eliminat sau personalizat. Bara de stare este afiat n partea inferioar a ferestrei i conine informaii dependente de context, cum ar fi: Record:n/m - sunt afiate nregistrri ncepnd de la a n-a din grupul de m nregistrri ncrcate de pe server; Enter-Query blocul curent este n modul Enter-Query;
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 10 LOV elementul curent (cel pe care este concentrat focus-ul) are asociat o list de valori; n bara de adrese a browser-ului se poate observa URL-ul prin care este invocat aplicaia. n cazul nostru, acesta este: http://smart.com:8888/forms90/f90servlet?form=D:\carte\rulare.fmx&userid=C ARTE/C@o9i&buffer_records=NO&debug_messages=NO&array=YES&query_only=N O&quiet=NO&RENDER=YES Componentele URL-ului sunt: Protocolul http Domeniul smart.com Portul pentru server-ul HTTP sau pentru OC4J Xxxx implicit pentru server-ul http 8888 implicit pentru OC4J Alias-ul servlet-ului Forms /forms90/f90servlet Parametri: seciunea ncepe cu caracterul ?; parametrii sunt separati prin & i pot fi specificai n URL sau n fiierul de configurare Forms form=D:\carte\rulare.fmx userid=CARTE/C@o9i buffer_records=NO debug_messages=NO array=YES query_only=NO quiet=NO RENDER=YES
URL-ul pointeaz, deci, ctre servlet-ul Forms (/forms90/f90servlet). Acesta este un servlet Java care creeaz o pagin HTML dinamic n conformitate cu informaia luat din urmtoarele surse: fiierul de configurare web (formsweb.cfg), fiierul HTML de baz al Forms-ului (basejini.html) i parametrii din adresa URL a aplicaiei.
2.4. 2.4. Proiectarea formelor Proiectarea formelor 2.4.1. 2.4.1. Diagrama conceptual exemplu Diagrama conceptual exemplu Exemplele din lucrare se refer la un model de gestiune a componentelor de calculatoare dintr-un depozit. Modelul ales este simplu, astfel nct nelegerea sa s necesite efort minim, scopul nostru constnd n focalizarea ateniei cititorului ctre nsuirea modului de lucru cu produsul Oracle Forms. Schemele relaionale din exemplele folosite n lucrare sunt:
11 stoc (cod_prod#, tip_prod, den_prod, pret_unit, cantit); clienti (cod_firma#, nume_firma, sold); facturi (cod_fact#, cod_firma, data, io); produse (cod_fact#, cod_prod#, cantit). S facem urmtoarele precizri: clienii emit facturi pe baza crora pot cumpra sau vinde componente de calculatoare. Datele fiecrei facturi sunt reinute n tabela facturi; fiecare factur are un cod_fact care o individualizeaz. Cmpul io va reine tipul facturii (1 dac factura este de intrare, 0 dac este de ieire). Pe o factur pot fi cumprate (sau vndute) mai multe produse. Acestea sunt gestionate de tabela produse. Tabela stocuri conine informaii despre componentele aflate n depozit. Dorim s crem o aplicaie care s permit operarea facturilor emise de clieni. La inserarea unei facturi noi, stocul i soldul firmei vor fi automat reactualizate.
2.4.2. 2.4.2. Componentele Forms Builder Forms Builder Componentele Object Navigator Object Navigator (figura 2.3.1) reprezint o interfa ce ofer o prezentare ierarhic a obiectelor (aflate att pe client, ct i pe server) din modulele deschise. Obiectele sunt grupate dup nodurile corespunztoare. De exemplu, toate ferestrele create pentru modulul curent sunt grupate n nodul windows.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 12 Bara de instrumente folosite pentru crearea, tergerea, expandarea sau contractarea nodurilor.
Figura 3.2.1. Interfaa Object Navigator. Nodurile de nivel cel mai nalt n ierarhia Object Navigator sunt: forme, meniuri, biblioteci PL/SQL, biblioteci de obiecte, pachete predefinite i obiecte ale bazei de date. Toate celelalte noduri sunt indentate pentru a arta faptul c ele aparin acestor noduri de nivel superior. Obiectele i nodurile sunt afiate cu un + sau n fa, semnificnd faptul c sunt sau nu expandate. Obiectele care nu pot conine obiecte de nivel inferior sunt afiate cu un disc n fa. Fiecare obiect din Object Navigator are ataat un icon care i sugereaz tipul. n general, dublu click pe icon-ul ataat invoc un editor corespunztor obiectului (pentru stil sau coninut). Prin intermediul interfeei Object Navigator se pot efectua operaii complexe i diverse asupra obiectelor din form: expandarea i restrngerea nodurilor pentru vizualizarea optim a obiectelor; selectarea, crearea i tergerea de obiecte; copierea i mutarea obiectelor ntre noduri;
13 accesarea altor moduri de vizualizare a obiectelor i proprietilor lor; localizarea rapid a obiectelor prin folosirea opiunii FastSearch. Paleta de proprieti (Property Palette) Fiecare obiect dintr-un modul (inclusiv modulul nsui) are proprieti specifice tipului su. Ele sunt accesibile prin intermediul paletei de proprieti, care se acceseaz din meniul de context al obiectului selectat (click dreapta pe obiect) opiunea Property Palette sau apsnd tasta F4 cnd obiectul (sau grupul de obiecte) pentru care se vrea afiat paleta de proprieti este selectat. Paletele de proprieti ale obiectelor de acelai tip au ntotdeauna aceleai capitole i aceleai detalii; putem numai seta aceste proprieti, nu le putem terge sau aduga unele noi. Fiind pozitionai pe o proprietate, apsarea tastei F1 are ca efect afiarea unei ferestre-help cu descrierea proprietii respective.
Figura 3.2.2. Paleta de proprieti a unui obiect modul
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 14 n figura 3.2.2 este afiat paleta de proprieti a unui modul. Observai faptul c proprietile sunt grupate logic ntr-o ierarhie, n raport cu funcionalitatea lor. Intrrile care au fost lsate la valoarea implicit sunt prefixate de un disc gri, pe cnd celor ce au fost modificate le este ataat un dreptunghi verde. Exist proprieti motenite, care sunt marcate printr-o sageat, precum i proprieti care iniial au fost motenite, apoi au fost suprascrise, caz n care sunt prefixate de o sageat urmat de un x rou. Lista proprietilor unui obiect conine dou coloane: prima indic numele proprietii, iar a doua valoarea proprietii (atributului). Se pot modifica atributele selectnd proprietatea corespunztoare; n cea de-a doua coloan, dedicat atributelor, poate aprea, n funcie de proprietatea selectat, un cmp text (pentru editarea atributului), o list de tip pop-up (pentru atributele care au un set specificat de valori valide) sau un buton More (cnd proprietatea curent cere valori mai complexe). Paleta de proprieti este dependent de context. Totui, exist cteva intrri comune majoritii obiectelor utilizate n formulare: zona General d obiectului un nume i-i definete tipul; zona Functional - stabilete modul de funcionare a cursorului, atunci cnd se afl n cmpul asociat obiectului; zona Navigation definete ordinea i stilul de navigare ntre obiecte; zona Data controleaz tipul obiectului i eventuala legtur dintre acesta i baza de date. Implicit, paleta de proprieti se actualizeaz automat la selectarea unui alt obiect. Cnd este necesar compararea proprietilor a dou obiecte, se poate deschide o palet adiional acionnd n prealabil butonul Pin/Unpin . Selectarea mai multor obiecte (realizat prin inerea apsat a tastei Shift i click pe fiecare dintre obiecte) afieaz o palet de proprieti comun obiectelor selectate, ca n figura 3.2.3:
15
1 2 Figura 3.2.3. Paleta de proprieti comun unui set de obiecte Implicit, este afiat intersecia proprietilor obiectelor. Acest mod se poate schimba prin apsarea butonului marcat cu 2 n figura 3.2.3 (butonul Intersection/Union). Atributele (valori ale proprietilor) diferite ale aceleiai proprieti sunt marcate prin ***** (vezi marcajul 1 din figura 3.2.3). Editorul vizual (Layout Editor) Editorul vizual este un instrument folosit pentru crearea i modificarea interfeei grafice a formei. De aici se pot seta culori, setul de caractere, mrimea i poziia elementelor incluse n form. Acestea se aeaz ntr-un canvas, care este afiat n runtime ntr-o fereastr (window). Un canvas este o suprafa aflat ntr-o fereastr-container, pe care se poziioneaz obiectele cu care interacioneaz utilizatorul la rularea formularului. Setnd proprietatea window a canvas-ului, specificm n ce fereastr va fi afiat acesta. Utilitarul Layout Editor permite lucrul, la un moment dat, cu un singur canvas. Canvas-ul conine doar elemente cu care utilizatorul nu poate interaciona: texte statice (care pot fi formatate ntr-o diversitate de moduri de ctre programator), elemente grafice etc. Fcnd analogie cu munca unui pictor, fereastra este cadrul pe care acesta i fixeaz pnza, reprezentat de canvas.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 16
n bara de titlu a ferestrei editorului vizual avem informaii despre contextul de lucru, inclusiv canvas-ul i blocul n care lucrm. Putem schimba canvas-ul curent selectnd un altul din lista indicat de sgeata din figura anterioar. Folosind bara vertical de instrumente din stnga ferestrei editorului vizual putem crea obiecte noi, care vor fi automat asignate canvas-ului i blocului curent. Editorul PL/SQL Editorul PL/SQL permite inserarea i compilarea de cod PL/SQL, precum i asocierea acestuia obiectelor din formular. Invocarea editorului PL/SQL se face prin click dreapta pe obiectul care permite ataarea de cod PL/SQL. Obiectele care suport cod n Forms Developer sunt trigger-ii, subprogramele (funcii i proceduri), pachetele.
17
Opiunea Type din partea superioar a ferestrei editorului PL/SQL definete tipul obiectului ce va fi creat (n cazul nostru trigger), iar opiunea Object ataeaz codul unui obiect specificat. n colul stnga-sus al ferestrei se afl butonul Compile PL/SQL Code, la apsarea cruia compilatorul detecteaz erorile de sintax, semantic i referinele ctre obiecte inexistente. 2.4.3. 2.4.3. Instrumente de tip wizard wizar Instrumente de tip d Orice form este creat pentru a interaciona cu un set de date, care se pot gsi n tabele sau pot fi generate de o procedur stocat. Paii care trebuie parcuri pentru crearea unei forme noi sunt, n general, urmtorii:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 18 crearea unui modul nou s-a efectuat prin click pe semnul verde (marcat n figura de mai jos cu sgeat) din bara de instrumente a ferestrei Object Navigator (sau, echivalent, File New Form) i are rezultatul urmtor:
crearea blocurilor de date i a elementelor sale (n general, se face cu ajutorul instrumentului Data Block Wizard); definirea proprietilor vizuale ale formei (cu ajutorul lui Layout Wizard sau Layout Editor); setarea proprietilor obiectelor (din paleta de proprieti a fiecrui obiect); adugarea de cod PL/SQL, acolo unde este cazul (folosim editorul PL/SQL); testarea formei (dnd click pe butonul Run Form , reprezentat n bara de instrumente sub forma unui semafor verde).
19 S parcurgem mpreun aceti pai i s crem un formular simplu, care s permit gestionarea clienilor firmei. Primul pas const, dup cum am precizat, n stabilirea blocului de date pe care se bazeaz formularul. Exist dou tipuri de blocuri: de date i de control. Blocurile de ultimul tip conin, n general, butoane care permit efectuarea unor aciuni (definite prin trigger-i asociai unor evenimete cum ar fi click pe buton), cmpuri totalizatoare, cmpuri ascunse (folosite pentru a memora variabile) i orice obiect ce nu trebuie asociat cu un bloc de date. Blocurile de date sunt cele prin intermediul crora manevrm datele din baza de date. ntr-un bloc de date se stocheaz liniile ce provin dintr-o tabel sau cele ce vor fi introduse n tabel; un bloc de date este, de fapt, un container pentru duplicarea informaiei din baza de date. Fiecare bloc de date gestioneaz o singur tabel (folosirea n form a datelor dintr-o alt tabel implic definirea unui nou bloc de date) i are o funcionalitate implicit pentru modurile insert i query (cele dou moduri de lucru cu o form vor fi prezentate n mod detaliat n continuare). Modul n care funcioneaz un bloc de control trebuie definit explicit, programatic. ncepem, deci, cu definirea blocului de date pe care se bazeaz forma. Dublu click pe intrarea Data Block din Object Navigator determin apariia unei casete de dialog prin care definim modul n care vom crea blocul de date: folosind Data Block Wizard sau manual. Pentru nceput, s dm click pe OK, lsnd bifat opiunea implicit - Use the Data Block Wizard. Acesta este un utilitar care permite crearea sau modificarea rapid a blocurilor de date folosite n aplicaie, precum i generarea automat de cod pentru respectarea constrngerilor de integritate definite n baza de date. Primul pas al wizard-ului const n afiarea unei ferestre de ntmpinare, a crei apariie poate fi inhibat prin deselectarea casetei Display this page next time. Click pe butonul Next determin apariia unei ferestre n care suntem invitai s precizm sursa blocului de date: dintr-o tabel sau generate de o procedur. (vezi figura de mai jos)
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 20
Pentru nceput, vom crea o form ce va permite gestionarea clienilor firmei care lucreaz cu depozitul de componente pentru calculatoare, deci vom lsa bifat opiunea Table or View i vom da click pe butonul Next, fapt ce va determina trecerea la urmtorul pas al wizard-ului:
21
n cmpul Table or View va trebui sa selectm tabela sau vizualizarea pe baza creia construim forma. Click pe butonul Browse ataat acestui cmp determin apariia unei casete de dialog Connect, prin care facem conectarea la baza de date, apoi afiarea tuturor tabelelor i vizualizrilor din schema utilizatorului curent. Am ales, din lista ce a aprut, tabela clienti i zona Available Columns a fost ncrcat cu coloanele din aceast tabel. Folosind butoanele etichetate > , >> , < , << populm zona DataBase Items cu coloanele ce vor fi utilizate n formular. La acest pas va fi creat, pentru fiecare dintre coloanele selectate de noi, cte un obiect de tip text item. Selectarea butonului Enforce Data Integrity determin impunerea automat a constrngerilor de integritate definite la nivelul bazei de date. Un click pe butonul Next ne va conduce la pasul urmtor al wizard- ului, unde denumim blocul de date pe care l crem. Implicit, numele blocului de date este acelai cu cel al tabelei sau vizualizrii pe baza creia a fost creat. Din motive didactice, schimbm numele blocului de date n BL_CLIENTI. Click pe butonul Next determin afiarea unei noi ferestre:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 22
n care suntem anunai c am parcurs cu succes toi paii wizard-ului i suntem ntrebai dac vrem doar s crem blocul de date sau s invocm urmtorul utilitar, Layout Wizard. Crearea blocului de date nu a implicat i crearea reprezentrii vizuale a obiectelor incluse n el, aa c n continuare ne vom ocupa de modul cum vom afia coninutul blocului de date n scopul interaciunii cu utilizatorul. Putem face acest lucru manual sau dnd click pe butonul Finish i continund, deci, cu instrumentul Layout Wizard. Dup o fereastr de ntmpinare a crei apariie poate fi inhibat ca i n wizard- ul precedent, urmeaz pasul al doilea al wizard-ului, n care stabilim tipul canvas-ului n care vor fi plasate obiectele din blocul de date, precum i alte obiecte noi, pe care le vom defini pe parcurs.
23
n mod implicit, o form se bazeaz pe un canvas de tip content (coninut), ns o fereastr poate conine mai multe tipuri de canvas: stacked (stiv), folosit n special pentru afiarea de informaii la declanarea unui eveniment (de exemplu, atunci cnd focus-ul intr pe cmpul clieni vrem s apar n fereastr un canvas - din punct de vedere vizual va fi un dreptunghi care are definite elemente vizuale - care s ofere informaii despre clieni; la click pe suprafaa canvas-ului, acesta va disparea); vertical toolbar (bar vertical de instrumente), folosit, n general, pentru definirea unei bare verticale de instrumente. Poate conine butoane la apsarea crora se vor declana aciuni specificate, de exemplu, prin secvene de cod PL/SQL ataate butoanelor; horizontal toolbar (bar orizontal de instrumente) identic, ca funcionalitate, cu bara vertical. Va fi poziionat automat n partea superioar a ferestrei, pe toat limea ei;
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 24 tab creeaz aplicaii tab-type n care datele nrudite sunt grupate pe aceeai pagin de tab. Sunt folosite, n general, cnd avem tabele cu un numr mare de coloane i aezarea tuturor n acelai canvas ar produce confuzie. Alegem ca datele s fie afiate ntr-un canvas de tip content i trecem la urmtorul pas al wizard-ului, n care va trebui s specificm ce cmpuri din blocul de date vor fi afiate n form:
Dintre cmpurile disponibile (Available Items) va trebui s selectm, folosind grupul de butoane etichetate <, <<, >, >> pe cele care dorim s fie afiate. Cmpurile care nu vrem s fie afiate ca atare i care vor fi folosite (de exemplu, n formule de calcul) sau vor fi completate automat cu ajutorul unor formule trebuie lsate n zona din partea stng. S selectm toate cmpurile, dnd click pe butonul >>. n colul din stnga-jos al ferestrei observm o list etichetat Item Type. Implicit, tipul obiectelor create astfel este de tip text item i la acest moment le lsm i noi de acest tip. Dnd click pe butonul Next ajungem la urmtorul pas al wizard-ului:
25
Wizard-ul deduce tipul, lungimea i alte informaii referitoare la cmp din tabela pe baza creia este construit blocul. Putem schimba aici eticheta (Prompt), lungimea i limea pe care va fi afiat coninutul obiectului din coloana Name, aceste modificri influennd layout-ul formei, nicidecum structura bazei de date. Dnd click pe Next ajungem la urmtorul pas al wizard-ului, unde suntem ntrebai ce stil de prezentare alegem pentru formular: Form sau Tabular. La selectarea uneia sau alteia dintre cele dou opiuni, n stnga ferestrei va fi afiat o imagine sugestiv a modului n care va arta formularul. Menionnd c stilul Tabular este folosit tradiional pentru forme de tip master-detail, lsm bifat opiunea Form i trecem mai departe dnd click pe familiarul de acum buton Next. Urmtorul pas al utilitarului Layout Wizard ne cere s dm un nume cadrului n care va fi afiat blocul de date (s-l completm: Clientii firmei mele), numrul de nregistrri ce vor fi afiate la un moment dat (lsm valoarea implicit, 1), distana dintre nregistrri, n cazul n care sunt afiate mai multe) precum i apariia sau nu a unei bare
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 26 verticale de derulare. Toate aceste lucruri pot fi modificate ulterior, cu ajutorul paletei de proprieti a obiectelor, aa c la acest moment le lsm neschimbate i trecem la urmtorul pas, apsnd butonul Next. La ultimul pas al wizard-ului dm click pe butonul Finish i este afiat rezultatul:
n partea stng a ferestrei Forms Builder avem Object Navigator, n care au aprut toate obiectele coninute n forma noastr: nodul Data Blocks are ca subnod pe BL_CLIENTI, care conine cele trei elemente de tip text, folosite pentru afiarea unei nregistrri din tabela CLIENTI. Aceste elemente sunt aezate n canvas-ul cu numele implicit Canvas4. Putem schimba numele canvas-ului dnd dou click-uri (dar nu dublu click) pe nume, apoi tastnd numele dorit. Automat, numele canvas-ului va fi actualizat pentru obiectele aflate n orice fel de relaie cu el. Dup cum putei observa n captura anterioar de ecran, odat cu crearea unui bloc de date cu ajutorul instrumentului Data Block Wizard, Forms Builder-ul creeaz automat urmtoarele:
27 un modul care are o funcionalitate motenit (sunt implementate automat operaiile de insert, delete, update i query pentru coloanele din tabela pe care este bazat blocul de date); un obiect frame (suportul vizual pe care sunt aezate item-urile); cte un item pentru fiecare coloan din tabela inclus n blocul de date (un item este reprezentarea grafic a unui obiect; cele mai multe dintre item-uri sunt asociate coloanelor din tabel); o etichet pentru fiecare item (implicit, eticheta este numele coloanei); declanatori (sau trigger-i) pentru impunerea constrngerilor de la nivelul bazei de date, n cazul n care caseta de validare Enforce data integrity a fost bifat. n partea din dreapta a ferestrei Builder-ului s-a deschis automat utilitarul Layout Editor, care permite rafinarea aspectului formei. S observm c cele dou ferestre se sincronizeaz, n sensul c selectarea unui obiect n una din ele duce la selectarea automat a aceluiai obiect n cealalt fereastr. Dac nu avem pretenii prea mari de la aplicaia noastr, putem considera c am ncheiat faza de proiectare a formularului. Probabil c scopul muncii noastre nu este crearea unei forme de unic folosin, aa c este indicat s salvm rezultatul impresionantului nostru efort intelectual. Facem acest lucru dnd click pe File Save sau direct, pe butonul Save din meniul Forms Builder. O ferestr de dialog cunoscut deja din mediul windows ne invit s alegem un nume i o locaie pentru fiierul pe care suntem pe cale s l crem. Dnd click pe butonul OK obinem un fiier cu extensia .fmb. Acesta nu este un executabil i poate fi deschis numai cu Forms Builder-ul. Dac lucrm simultan cu mai multe module, acestea vor fi stocate n fiiere separate, deci operaia de salvare trebuie fcut pentru fiecare n parte. 2.4.4. 2.4.4. Testarea formelor o Testarea formel r nainte de rularea formei trebuie compilat fiierul .fmb creat. Automat, va fi creat un fiier executabil cu acelai nume i extensia .fmx. Operaia de compilare poate fi efectuat: explicit, n unul din modurile: n meniul Forms Builder dm click pe Program Compile Module lansnd Form Compiler din meniul Start al Windows-ului:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 28
lansnd executabilul Form Compiler (ifcmp90.exe) din linie de comand implicit, setnd opiunea Build Before Running aflat n meniul Forms Builder: Edit Preferences
29
n concluzie, modulele Forms pe care le crem sunt stocate n fiiere binare .fmb care sunt portabile ntre platforme. Fiierele executabile .fmx sunt stocate, de asemenea, n format binar, dar nu sunt portabile ntre platforme. Pentru fiecare modul poate fi generat un fiier text (portabil) cu extensia .fmt: n meniul Form Builder alegem File Convert, iar n caseta de dialog ce apare selectm tipul modulului, fiierul pe care trebuie s l convertim i direcia (Binary-to-Text sau invers). Putem genera automat documentaie pentru modulul nostru, selectndu-l n Object Navigator i dnd click pe File Administration Object List Report. Aceast operaie va produce un fiier ASCII cu numele identic cu cel al modulului i extensia .txt. Cu toate c modulele create pot fi testate pe maina client, pentru dezvoltarea unor aplicaii profesionale aceste module trebuie transferate pe server-ul de aplicaii. n cazul n care acesta ruleaz pe o platform diferit, se transfer (cu ajutorul utilitarului ftp, de exemplu) fiierul .fmb pe maina pe care se afl server-ul de aplicaii, iar acolo se invoc Form Compiler, pentru recompilare. n cazul n care server-ul de aplicaii ruleaz pe aceeai platform ca cea pe care a fost dezvoltat aplicaia, poate fi transferat direct fiierul .fmx. Dup ce fiierele executabile au fost transferate pe Oracle9iAS, aplicaia poate fi ncrcat n fereastra unui browser prin intermediul URL-ului su, care pointeaz ctre servlet-ul Forms.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 30 Deocamdat ne aflm, ns, n faza de testare i depanare a aplicaiei, iar acestea se pot face i pe maina pe care rulm Form Builder. n acest scop, n Oracle9i Developer Suite a fost inclus Oracle9iAS Containers for J2EE (OC4J), astfel nefiind necesar instalarea produsului Oracle9i Application Server pentru testarea aplicaiilor Developer Forms. Instana OC4J se pornete dnd dublu click pe fiierul startinst.bat i ofer un mediu complet pentru rularea aplicaiilor Java 2 Enterprise Edition (J2EE) coninnd, printre altele, i servlet-ul Forms Listener. OC4J ruleaz ntr-o fereastr DOS, care poate fi minimizat, dar nu nchis atta timp ct vrem s rulm modulele create. Pentru oprirea instanei OC4J se ruleaz fiierul de comenzi stopinst.bat. Ne ntoarcem acum la formularul creat pentru gestionarea clienilor firmei. S startm, deci, instana OC4J i s apsm butonul Run Form, pe care l cutam n bara de instrumente a Form Builder-ului i l recunoatem dup semaforul verde cu care este etichetat. Rezultatul obinut este afiat n fereastra unui browser:
31
Comportamentul implicit al lui Oracle Forms const n dou moduri de funcionare: modul insert (inserare); modul query (interogare). Modul insert La deschiderea unei forme, aceasta se gsete n modul de lucru insert, care permite operaii DML pe tabel. n bara de stare a applet-ului Java este semnalat modul n care lucrm. n cazul modului insert, mesajul Record: 1/1 semnific faptul c suntem poziionai pe prima nregistrare, din grupul de 1 care sunt ncrcate n applet. Pentru exemplificare, verificm ce clieni are, deocamdat, firma. S lucrm ntr- un mediu presupus cunoscut: deschidem o sesiune SQL*Plus i afim toate nregistrrile tabelei clienti:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 32 S presupunem c dorim adugarea unui nou client al firmei, al crui cod este 510, iar nume - RDC Computers. Soldul iniial este 0. Completm aceste date n cmpurile corespunztoare din form. Simpla completare a cmpurilor nu va duce la salvarea datelor n tabel (i ne putem convinge de acest lucru interognd, n SQL*Plus, tabela clienti). n cazul n care dorim editarea la acest moment a datelor mai multor clieni, apsm tasta sgeat n jos i observm, n bara de stare, c s-a trecut la o nou nregistrare, vid, care se ateapt a fi completat. Practic, a fost creat o nregistrare nou, vid. O completm i salvm rezultatul muncii noastre (prin click pe Action Save din meniul implicit al produsului Developer Forms), aciune care este echivalent cu binecunoscutul commit. Exist i un echivalent al instruciunii rollback , invocat prin Action Clear All (sunt anulate toate modificrile facute de la ultima instruciune commit).
Observai bara de stare, n care avem confirmarea salvrii celor dou nregistrri. Dac nu avem, deocamdat, destula ncredere n abilitile noastre, putem verifica printr- o comand SQL faptul c cei doi clieni se afl n tabela clienti:
33
Dup cum ai sesizat deja, n form putem lucra cu mouse-ul sau cu tastatura. Fiecare buton are asociat cte o cheie funcional. La crearea unei aplicaii profesionale, trebuie gsit modul optim n care toate aceste faciliti s fie comunicate end-user-ului. Corespondenele dintre butoane i taste se gasesc la Help Keys (sau Ctrl+K):
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 34
Navigarea ntre obiectele din form se poate face n mai multe moduri: utiliznd tasta Tab; folosind opiunile Field Previous sau Next din meniul implicit Forms; dnd click pe cmpul pe care dorim s l editm; ncercarea de a prsi cmpul cod_firma fr ca acesta s aib un coninut va eua, fapt care intr n comportamentul implicit al formei; acest cmp mapeaz coloana cod_firma a tabelei, care este cheie primar i, implicit, se presupune c nu trebuie lsat vid. Cum se poate modifica acest mod de lucru vom vedea ceva mai trziu. Ordinea cmpurilor n Object Navigator este foarte important; n aceast ordine vor fi accesate n form la navigarea cu tasta Tab (sau cu Field Next).
35 Modul query Trecerea din modul insert n modul query se face prin opiunea din meniul implicit Query Enter:
Utilizatorul aduce n formular o copie a nregistrrilor asupra crora vrea s lucreze. Modul Query permite definirea unui criteriu (filtru) pe baza cruia sistemul va crea fraza select executat n momentul populrii blocului de date. Eventualele modificari ale nregistrrilor nu vor fi operate n baza de date dect la comanda Action Save. Exist dou feluri de cereri: nerestricionate (sau globale), prin care utilizatorul aduce n form copii ale tuturor rndurilor tabelei pe care se bazeaz blocul de date asupra cruia se efectueaz cererea;
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 36 restricionate, acestea fiind echivalentul selectrii unei submulimi a mulimii rndurilor tabelei, conform unui filtru indicat de utilizator. Pentru realizarea unei cereri nerestricionate, vom efectua una din aciunile: selectm Query Execute; click pe butonul Execute Query din meniul smartbar; apsm combinaia de taste Ctrl+F11. Oricare din aceste actiuni are ca efect popularea blocului de date cu toate nregistrrile din tabela de baz. S ncercm acum efectuarea unei cereri restricionate: comutm n modul query (Query Enter) i introducem, n cmpul cod_firma, criteriul: >505. Dup cum v-ai dat seama, click pe Query Execute va avea ca rezultat generarea unei cereri SQL cu o clauz where creat conform filtrului introdus de utilizator, n cazul nostru ncrcarea n formular a copiilor nregistrrilor pentru care cod_firma este mai mare dect 505. Observai cum, n bara de stare, este semnalat faptul c formularul se afl n modul Enter-Query. n acest moment, blocul pe care am fost surprini nu poate fi prsit, singurele aciuni posibile fiind: introducerea unui filtru i executarea cererii (cu Ctrl+F11 sau Query Execute); abandonarea modului query prin apsarea tastei F4 sau Query Cancel. Se pot introduce filtre complexe, pe mai multe cmpuri simultan. Urmtorul filtru:
37
va afia toate firmele al cror cod este mai mare dect 505 i care au litera a n numele firmei. S subliniem, deci, c introducerea de filtre pe mai multe item-uri se transpune ntr-o fraz select cu o clauz where n care ntre aceste condiii este pus operatorul AND. Dac vrem o clauz where cu disjuncie ntre condiii, procedm n felul urmtor: s presupunem c vrem s aducem n form copii ale nregistrrilor n care cod_firma este mai mare dect 505 SAU ale celor care conin irul Comp n denumire. Pentru aceasta invocm modul Enter Query i completm n cmpul cod_firma valoarea :a, iar n cmpul nume_firma valoarea :b. ntrebarea imediat este: cine sunt a i b, prefixati de :? Acestea reprezint variabile de legtur (bind variable), semnul : semnificnd faptul c acestea nu sunt interne mediului curent. Selectarea opiunii Query Execute va determina afiarea unei ferestre numite Query/Where, unde se ateapt introducerea clauzei where, dup toate regulile din SQL:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 38
Dup stabilirea clauzei where ca n figura anterioar, click pe OK va determina aducerea n form a tuturor firmelor al cror cod este mai mare dect 505 SAU al cror nume conine irul Comp. Comutm ntre nregistrri cu ajutorul tastelor-sgei sus i jos sau din meniul implicit Forms, Record Next sau Previous. n meniul smartbar exist, de asemenea, butoane corespunztoare acestor funcii. Le putei descoperi uor, deoarece au ataate imagini sugestive i, mai mult dect att, trecerea cu mouse-ul peste fiecare determin apariia unui text informativ relativ la butonul curent. Dup introducerea filtrelor exist posibilitatea aflrii (naintea aducerii de copii n form) numrului de nregistrri ce verific criteriul, folosind opiunea din meniul implicit Query Count Hints:
39
Observai mesajul din bara de stare: cererea va gsi 6 nregistrri (ce ndeplinesc criteriul cod_firma>505). Sintetiznd, obinem urmtoarele asemnri i diferene ntre cele dou moduri implicite de lucru n form:
Aciuni Modul Insert Modul Query cereri restricionate (cu clauza where)
cereri nerestricionate (fr clauza where)
caseta de dialog Query/Where
insert/update/delete
navigarea n afara blocului curent
shutdown-ul procesului runtime
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 40 Criteriile dup care vor fi formulate cererile restricionate sunt urmtoarele: completarea (n modul Query) a unui item cu o valoare i executarea cererii va implica aducerea n form a nregistrrilor pentru care cmpul corespunztor item-ului are valoarea specificat; completarea unui item cu un ir coninnd % sau _ va duce la formularea unei cereri cu o clauz where coninnd operatorul like; folosii semnul # n faa operatorilor SQL; exemplu: #between 501 and 505; utilizai formatul implicit al datei: DD-MON-YY; n caseta de dialog Query/Where irurile de caractere i datele calendaristice vor fi incluse ntre apostrofuri. 2.4.5. 2.4.5. Rafinarea formelor ea formelo Rafinar r Dup crearea modulului (folosind cele dou wizard-uri prezentate anterior), utilizatorul va dori sa l personalizeze sau s l modifice, lucru ce poate fi fcut n unul sau mai multe moduri: 1) rafinarea blocului de date se poate face: invocnd Data Block Wizard n modul reentrant; efectund modificri manual, de exemplu adugarea sau tergerea de item- uri; modificnd proprietile obiectelor, folosind paleta de proprieti; 2) rafinarea machetei modulului se poate face: invocnd Layout Wizard n modul reentrant; invocnd Layout Editor (prin selectarea Tools Layout Editor sau click drepta pe un obiect n Object Navigator Layout Editor) i efectund manual modificri; modificnd proprietile cadrului n paleta sa de proprieti. O caracteristic foarte util a celor dou wizard-uri prezentate anterior este capacitatea de a putea fi apelate n modul reentrant (chiar i pentru blocurile sau frame- urile care nu au fost create cu Data Block Wizard, respectiv Layout Wizard), mod n care toi paii parcuri sunt prezentai ntr-o singur fereastr de tip tab. Pentru invocarea utilitarului Data Block Wizard n modul reentrant:
41 selectm un obiect din blocul de date sau frame-ul n Object Navigator sau n Layout Editor (observai c cele dou ferestre sunt sincronizate la selectarea unui obiect n oricare dintre ele, acelai obiect va fi automat selectat n cealalt fereastr); apelm instrumentul Data Block Wizard n oricare dintre modurile nvate pn acum: o selectnd Tools Data Block Wizard din meniul Form Builder; o click dreapta i selectnd Data Block Wizard din meniul de context ce apare; o click pe butonul Data Block Wizard din meniul numit main toolbar al Builder-ului; Rezultatul oricreia dintre aceste aciuni va fi:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 42
Observai n fereastra care a aprut cele trei pagini Tab corespunztoare celor trei pai parcuri de utilitarul Data Block Wizard. Invocarea instrumentului Layout Wizard n modul reentrant se face: selectnd cadrul (frame) n Object Navigator sau Layout Editor; lansnd Layout Wizard, n oricare dintre modurile: o click pe Tools Layout Wizard; o click dreapta pe cadru i selectnd Layout Wizard; o click pe butonul Layout Wizard din meniul Builder-ului. Rezultatul va fi, ca i n cazul precedent, o fereastr tab-type avnd pe fiecare pagin tab cte unul din paii parcuri de wizard:
43
Modificm, pe pagina a doua, eticheta item-urilor, apoi acionm butonul Finish (care determin o aciune prealabil implicit Apply). Rulai aplicaia i observai modificrile fcute. 2.4.6. 2.4.6. Palete de proprieti Palete de proprieti O alt modalitate de a rafina modulele create este modificarea comportamentului sau a modului de afiare a obiectelor folosind paletele lor de proprieti. Primul pas n dezvoltarea unei aplicaii Forms const n crearea unui modul. Acesta are proprieti predefinite, care pot fi, ns, modificate folosind paleta de proprieti a modulului. Selectm modulul n Object Navigator i din meniul de context ce apare la click drepta selectm Property Palette (acelai lucru se putea obine apsnd tasta F4 atunci cnd modulul este selectat n Object Navigator):
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 44
Se pot obine informaii despre fiecare din proprietile ce se pot seta la acest nivel selectnd proprietatea i apsnd tasta F1. Proprietile care au nc valoarea implicit sunt prefixate, n paleta de proprieti, de un disc, n timp ce acelea care au fost modificate sunt marcate cu un ptrat verde. O proprietate ce a fost modificat poate fi adus la valoarea implicit prin apsarea butonului Inherit din bara de meniu a paletei de proprieti. Toate modulele vor avea aceleai intrri n paleta de proprieti. Capitolul General ofer informaii generale legate de modul. Intrarea Name permite modificarea numelui modulului (lucru ce poate fi realizat i n Object Navigator, dnd de dou ori click pe numele modulului i editnd noul nume), iar Comments este folosit pentru adugarea de comentarii utile pentru dezvoltatorii de aplicaii, uurnd astfel munca de ntreinere i depanare. La capitolul Funcional se poate seta fereastra n care va aprea modulul (Console Window), precum i meniul care va fi asociat acestuia. Implicit, modulul va fi afiat cu cele dou meniuri precizate anterior, aa c la intrarea Menu Module vom gasi
45 DEFAULT&SMARTBAR. tergerea oricruia dintre cele dou nume va determina dispariia meniului respectiv la rularea aplicaiei. Putem defini, de asemenea, meniuri- utilizator, iar aici este locul n care le asociem modulului curent. Capitolul Menu Security conine intrarea Menu Role. Aici se specific rolul care i este acordat utilizatorului la rularea meniului. Capitolul Navigation conine dou proprieti: Mouse Navigation Limit n care se precizeaz ct de departe poate naviga end-user-ul cu mouse-ul; implicit, proprietatea este setat la Form, nsemnnd c este permis navigarea n orice item din form; alte valori posibile sunt: o block permite navigarea cu mouse-ul doar n interiorul item-urilor ce aparin blocului curent; o record utilizatorul se poate deplasa cu mouse-ul numai n item-urile din nregistrarea curent; o item previne navigarea cu mouse-ul n afara item-ului curent (valoarea este aplicat n cazul n care se vrea interzicerea folosirii mouse-ului n forma curent). First Navigation Data Block specific numele blocului cu care Forms Developer-ul ncepe navigarea la ncrcarea formularului sau dup o operaie CLEAR_FORM (de aducere la valoarea implicit a tuturor obiectelor din form). Capitolul Database definete modul de interaciune a modulului cu baza de date, prin definirea proprietilor: Validation Unit determin domeniul de validare al formularului n runtime; pentru cele mai multe din aplicaii, valoarea default este setat la item, semnificnd faptul c validarea datelor introduse de utilizator se face la nivel de item, adic odat cu ncercarea de prsire a respectivului obiect; Interaction Mode determin modul de interaciune a utilizatorului cu formularul, n cazul modului Enter-Query; implicit, aceast proprietate este setat la Blocking, ceea ce previne orice posibilitate de interaciune a utilizatorului cu formularul atta timp ct nu au fost ncrcate toate nregistrrile din baza de date. Dac valoarea este setat la Non-blocking, end-user-ul poate interaciona cu forma n timpul n care nregistrrile sunt ncrcate. Aceast valoare este folosit n special cnd se emit cereri consumatoare de timp i se vrea ca utilizatorul s poat ntrerupe executarea cererii.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 46 Maximum Query Time permite specificarea timpului dup care orice cerere va fi ntrerupt, dac execuia ei nu a fost terminat. Valoarea implicit este 0 care semnific, de fapt, faptul c cererea nu va fi ntrerupt automat (vom vedea c n Oracle Forms Developer valoarea 0 are, n multe din cazuri, alt semnificaie fa de cea atribuit ei de matematicieni cu mai bine de dou milenii n urm). Orice valoare nenul este luat n considerare doar dac proprietile Query Allowed i Query All Records sunt setate la Yes (avei rbdare, despre ele vei afla ceva mai tarziu!). Maximum Records Fetched specific numrul de nregistrri ce vor fi ncrcate n formular nainte de abandonarea execuiei cererii. Comentariile referitoare la valoarea implicit 0 sunt valabile i n acest caz. Isolation Mode permite definirea modului de rezolvare a concurenei tranzaciilor; proprietatea se seteaz pe Serializable n cazul n care civa utilizatori lanseaz un numr mic de tranzacii pe o baz de date de dimensiuni mari, deci atunci cnd ansa ca dou tranzacii concurente s ncerce modificarea aceleiai nregistrri este mic. Dac acest lucru se ntmpl, unul din user-i va primi eroarea cu mesajul Cannot serialize access. n cazul n care se lanseaz tranzacii intensive, este recomandat lsarea acestei proprieti la valoarea implicit, Read Commited. Capitolul Physical conine informaii referitoare la atributele fizice ale obiectelor modulului: Coordinate System permite definirea unitii de msur folosite pentru stabilirea dimensiunii de afiare i a poziiei obiectelor. Aceast unitate de msur se poate exprima n: o caractere, mrimea unui caracter fiind dat de setul implicit de caractere sau putnd fi specificat de programator; o uniti de msur reale, avnd posibilitatea de a alege ntre: pixeli, centimetri, puncte etc.. Use 3D Controls proprietate valabil doar pe sistemele ce ruleaz Microsoft Windows i a crei setare la valoarea Yes permite afiarea item-urilor cu efecte tri-dimensionale; Form Horizontal Toolbar Canvas permite specificarea (prin numele su), pentru Microsoft Windows, a unui canvas de tip horizontal toolbar care s fie afiat ca bar orizontal de meniu; Form Vertical Toolbar Canvas proprietate echivalent cu cea precedent, folosit pentru cazul meniurilor verticale.
47 Capitolul International conine proprietatea Direction, a crei valoare ar trebui lsat neschimbat deoarece end-user-ul nu va fi ncntat, probabil, de posibilitatea scrierii de la dreapta la stnga. Am trecut, n descrierea capitolelor de proprieti ale unui modul, peste capitolul Records, care conine o singur intrare, Current Record Visual Attribute Group. Aceast proprietate este specific att modulelor, ct i blocurilor de date i item-urilor i permite specificarea unui atribut vizual pentru obiectul cruia i este aplicat. 2.4.7. 2.4.7. Atribute vizuale Atribute vizuale Un atribut vizual este un obiect pe care l crem n Object Navigator (selectnd nodul Visual Attributes i dnd click pe butonul New) i care are proprieti ce definesc: setul de caractere, culoarea i modul de haurare. Un atribut vizual aplicat unui obiect va determin motenirea de ctre obiect doar a acelor proprieti care sunt setate n atributul vizual, restul rmnnd neschimbate.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 48 Observai n fereastra Object Navigator crearea, la nodul Visual Attributes, a obiectului numit ATR_MEU_VIZ. Invocarea paletei de proprieti a acestui obiect are efectul prezentat n fereastra din dreapta. Numele proprietilor legate de font i culoare sunt sugestive i pot fi setate cu usurin. Proprietatea Visual Attribute Type stabilete domeniul de aplicare al atributului: common, prompt sau title. 2.4.8. 2.4.8. Proprietile ferestrelor Proprietile ferestrelor Scopul crerii unui obiect este folosirea (i refolosirea) lui, aa c vom utiliza atributul vizual creat anterior pentru setarea proprietilor ferestrei n care este ncrcat modulul. Apare urmtoarea ntrebare: pentru ce ne trebuie un atribut vizual, prin care se definesc proprieti cum ar fi culoarea fundalului i a setului de caractere, cnd pot face acest lucru direct, la nivelul capitolului Color al paletei de proprieti a ferestrei? Unul din avantajele (re)utilizarii unui obiect este acela c orice modificare a unei proprieti a obiectului se va moteni automat de toate instanele respectivului obiect. n paleta de proprieti a ferestrei:
49 modificm proprietatea Visual Attribute Group, selectnd atributul vizual creat anterior din lista pop-up corespunztoare. Remarcm modificarea imediat a valorilor proprietilor legate de culoare i font ale ferestrei conform celor motenite de la atributul vizual i faptul c proprietile motenite sunt marcate cu o sageat. S presupunem c dorim ca fontul cu care apare textul n item-uri s fie altul dect cel definit n atributul vizual i motenit, implicit, de ctre fereastr. Modificnd valoarea fontului observm c sgeii care prefixeaz proprietatea respectiv i este adugat un x rou, semnificnd faptul c, iniial, proprietatea a fost motenit, dar am renunat la motenire i am suprascris-o. Acionarea n aceast situaie a butonului Inherit va determina aducerea valorii la cea motenit de la obiectul atribut vizual ATR_MEU_VIZ. Dou capitole importante n paleta de proprieti a ferestrei merit detaliate: Funcional i Physical. Capitolul Physical permite specificarea locului n care va aprea obiectul (n cazul nostru, fereastra) pe ecran, prin stabilirea coordonatelor colului din stnga-sus (proprietile X Position i Y Position) i a dimensiunilor sale (proprietile Width i Height). Proprietatea Bevel seteaz tipul chenarului obiectului, iar ultimele dou proprieti comut ntre afisrea/inhibarea barelor de scroll verticale i orizontale pentru obiectul respectiv. Capitolul Funcional permite definirea modului de funcionare a ferestrei, setnd proprieti cum ar fi: Close Allowed (este sau nu permis comanda Close window), Move Allowed, Resize Allowed etc. Stilul ferestrei este definit de proprietatea Window Style, care poate fi setat la una din valorile Document sau Dialog. Proprietatea Modal stabilete tipul ferestrei. O fereastr de tip modal nu poate fi prsit liber (dnd click n afara ei), ci numai programatic. Implicit, o fereastr Modalless, adic nerestricionat, este o fereastr pe care utilizatorul o poate prsi liber. Ferestrele de acest tip nu sunt n mod necesar active atunci cnd sunt afiate. 2.4.9. 2.4.9. Proprietile unui bloc de date Proprietile unui bloc de date ntorcndu-ne la aplicaia pe care vrem s o crem (nu am avansat extraordinar de mult, aa e?), haidei s ne reamintim c ne aflm la etapa n care creasem, folosind dou utilitare (DataBlock Wizard i Layout Wizard), un modul prin care vrem s gestionm clienii firmei. Am creat un atribut vizual pe care l-am aplicat ferestrei n care va aprea modulul, iar rezultatul este urmtorul:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 50
Modulul conine un singur bloc de date, numit BL_CLIENTI. Acesta are 3 item- uri (elemente), corespunztoare celor 3 cmpuri din tabela clienti. Utilizatorul poate modifica interfaa i comportamentul unui bloc setndu-i proprietile. S analizm paleta de proprieti a blocului de date (pentru accesarea acesteia folosim una din metodele prezentate ntr-un capitol anterior, de exemplu: ne poziionm pe blocul de date n Object Navigator i apsm tasta F4). Primul grup de proprieti este General, cu intrrile deja cunoscute. Urmeaz grupul Navigation, care gestioneaz modul de navigare cu tastatura n interiorul blocului. Implicit, pentru efectuarea unui salt circular ntre item-urile din modul se folosete tasta Tab pentru navigarea nainte i combinaia Shift+Tab pentru navigare inapoi. Proprietile ce se pot seta din grupul Navigation sunt:
51
Navigation Style implicit, la navigarea din ultimul item al blocului, Forms returneaz focusul pe primul item din bloc. Acest mod de lucru corespunde valorii Same Record al acestei proprieti; alte valori posibile (ce se pot selecta din meniul pop-up ce apare la click pe aceast proprietate) sunt: Change Record caz n care cursorul se mut pe primul item al urmtoarei nregistrri la prsirea ultimului item din nregistrarea curent Change Data Block aceast valoare determin saltul la blocul urmtor odat cu prsirea ultimului item din nregistrarea curent Previous (Next) Navigation Data Block valoare setat implicit la Null, semnificnd faptul c blocul anterior (respectiv urmtor) blocului curent este cel ce se afl n Object Navigator naintea blocului curent, respectiv dup acesta. Aici este permis definirea unui alt bloc la care se va face
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 52 saltul cursorului n cazul unei navigri cu tastatura spre blocul anterior (urmtor). Urmtorul grup de proprieti al unui bloc de date poart numele Records i arat cam aa:
Grupul Records controleaz modul n care nregistrrile din tabel sunt ncrcate de Forms n modul i conine urmtoarele proprieti: Current Records Visual Attribute Group permite specificarea unui atribut vizual care va fi folosit ca masc pentru afiarea nregistrrilor Query Array Size specific numrul maxim de nregistrri pe care Forms-ul le ncarc la o accesare a bazei de date. O valoare mic a acestei proprieti va implica un timp de rspuns per accesare a bazei de date mic; o valoare mare implic un numr mai mic de accesri a bazei date i, prin urmare, un trafic n reea redus i un timp total de procesare mai mic. Valoarea implicit
53 a acestei proprieti este 0, semnificnd faptul c la o accesare a bazei de date numrul de nregistrri ncrcate n form este egal cu valoarea proprietii Number of Records Displayed Number of Records Buffered este o proprietate ce se folosete pentru a mri viteza de lucru. Buffer-ul este o zon de memorie n care Forms Builder-ul i aduce nregistrrile care sunt n ateptare. Valorea implicit 0 nseamn, de fapt, numrul de nregistrri afiate (setat prin proprietatea Number of Records Displayed) plus 3. nregistrrile adiionale sunt salvate de Forms pe hard-disk, ntr-un fiier temporar. O valoare mare a acestei proprieti mbuntete viteza de lucru, dar folosete mai mult spaiu de stocare. Number of Records Displayed aceast proprietate seteaz numrul de nregistrri pe care un bloc le afieaz n canvas la un moment dat. Setai aceast proprietate la o valoare mai mare, apoi rulai forma i observai rezultatul! (Asigurai-v de faptul c n canvas este loc suficient pentru afiarea simultan a mai multor nregistrri. n caz contrar, poziionai-v pe un obiect din Object Navigator i apsai tasta F2 pentru accesarea instrumentului Layout Editor (aceasta este doar una din multiplele posibiliti n care acesta poate fi invocat); redimensionai frame-ul, eventual i canvas- ul, astfel nct s poat fi vizualizate toate nregistrrile. Query All Records dac aceast proprietate este setat la valoarea Yes vor fi aduse n form toate nregistrrile odat. Implicit, aceasta valoare este setat la No pentru mbuntirea performanelor de lucru, dar este esenial modificarea ei la valoarea Yes n cazul cnd n form se fac calcule statistice (de exemplu: sume, medii etc.) Este logic faptul c, pentru un calcul corect, trebuie luate n considerare toate valorile din baza de date, deci acestea trebuie aduse n form de la prima accesare a ei. Record Orientation determin orientarea nregistrrilor n bloc (vertical sau orizontal) Single Record se seteaz la Yes n cazul unui bloc de control care conine un cmp de tip item calculat conform unei formule statistice i specific faptul c acest bloc trebuie sa conin, la un moment dat, numai o nregistrare. Urmtorul grup din paleta de proprieti al unui bloc determin modul de interaciune dintre elementele blocului i tabelul pe baza cruia este construit acesta. Sub denumirea Database gsim urmtoarele proprieti:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 54
Database Data Block valoarea Yes nseamn c blocul va fi populat cu informaie din baza de date (exist i blocuri populate prin proceduri PL/SQL) Enforce Primary Key precizeaz dac Forms-ul va verifica sau nu constrngerea de cheie primar de la nivelul tabelei nainte de inserarea sau modificarea nregistrrilor n baza de date Query Allowed sunt sau nu permise interogri pe acest bloc urmtoarele proprieti permit specificarea tabelei i a cmpurilor pe baza crora este construit blocul curent. Exist, de asemenea, proprieti care controleaz aciunile care se pot efectua de ctre utilizator asupra nregistrrilor din blocul de date: Query/Insert/Update/Delete Allowed. Where Clause dac vrem s impunem un filtru la nivelul blocului de date, aici este locul lui; orice cerere restricionat efectuat asupra blocului de date va fi automat conjuncionat cu condiia impus la
55 clauza where. De exemplu, condiia cod_firma>505 va avea ca efect ncrcarea tuturor nregistrrilor care verific att condiia impus de utilizator, ct i condiia: codul firmei mai mare dect 505. Order by Clause determin un mod implicit de afiare a nregistrrilor, sortate dup item-ul precizat aici. Aceast ordine poate fi stabilit i n runtime, folosind caseta Query Where, procedur care a fost discutat anterior n acest capitol. Locking Mode precizeaz modul de blocaj al unei nregistrri. Implicit, valoarea este setat la Automatic, care n cazul bazelor de date Oracle este echivalent cu Immediate, iar n cazul altor baze de date ncearc un comportament ct mai apropiat: atunci cnd utilizatorul iniiaz editarea unui item, nregistrarea corespunztoare din tabel este blocat i nimeni nu o poate modifica (din Forms sau din alt orice alt mediu, de exemplu SQL), ci o poate doar accesa. La salvarea datelor din formular (i efectuarea unui commit asupra bazei de date), nregistrarea este deblocat. Modul de lucru Delayed realizeaz blocarea nregistrarii doar n timpul operaiei de salvare. Update Changed Columns Only cnd proprietatea este setat la Yes doar acele item-uri modificate de utilizator vor fi salvate n coloanele din baza de date corespunztoare lor. Enforce Column Security cnd aceast proprietate are valoarea Yes, elementele blocului de date pot fi modificate doar dac utilizatorul curent are acest drept asupra coloanelor din tabela crora le corespund elementele respective Maximum Query Time ofer posibilitatea precizrii unui interval de timp la expirarea cruia o cerere nesoluionat de ctre sistem este abandonat; este util atunci cnd proprietatea Query All Records este setat la valoarea Yes Maximum Records Fetched permite precizarea unui numr maxim de nregistrri ce vor fi aduse n form; dup aducerea acestui numr de nregistrri, execuia cererii este abandonata. Capitolul Scrollbar conine proprieti legate de apariia i funcionalitatea unei bare de derulare la nivelul blocului de date. n cazul cnd este afiat o singur nregistrare din blocul de date nu i are sensul crearea unei bare de derulare, aa c vom studia ulterior, n detaliu, modul de definire al unui asemenea obiect. Totui, s menionm proprietile unei bare de derulare:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 56
Prima dintre acestea, Show Scroll Bar, determin/inhib apariia barei de derulare. n cazul setrii acestei proprieti la valoarea Yes, elementele ce urmeaz n paleta de proprieti permit definirea canvas-ului n care bara va aprea, a orientrii sale (Vertical/Horizontal), precum i a poziiei (colul din stnga-sus al barei vezi sgeata 1 din figura urmatoare) i a dimensiunilor ei (limea barei de derulare, indicat de sageata 2 i lungimea sgeata 3 din figura de mai jos):
57
1 3 2 Renunm deocamdat la afiarea unei bare de derulare (setnd proprietatea Show Scroll Bar a blocului de date la valoarea No) i analizm urmtoarele elemente din paleta sa de proprieti. Acestea sunt legate de eventualele atribute vizuale folosite pentru afiarea sa (ce se seteaz n capitolul Visual Attributes), precum i de precizarea irului de caractere, a culorii i a modului de haurare a spaiului pe care se afieaz elementele blocului de date (capitolul Color). De fapt, stabilirea unor valori pentru proprietile legate de culoare/haurare la nivel de bloc nu are nici un efect, ele aplicndu-se doar n cazul: item-urilor, paginilor tab, canvas-urilor, ferestrelor i butoanelor radio. Sintetiznd ceea ce facem de cteva pagini bune ncoace (atributul bune se refer, evident, la numr i nu la calitatea paginilor, ultima caracteristic fiind lsat la latitudinea cititorului), concluzionm c am nvat s crem un formular simplu, pe care apoi l putem rafina folosind paletele de proprieti ale obiectelor pe care le conine. Transferul de informaie dintre formular i baza de date se efectueaz prin intermediul meniului implicit.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 58
2.5. 2.5. Blocuri master-detail master-detail Blocuri Formularul creat de noi gestioneaz datele referitoare la clienii firmei (inserare de noi clieni, modificarea informaiei legate de cei existeni, tergerea celor care ne-au suprat, precum i interogarea tabelei clienilor). Ar fi mult mai plcut dac afiarea datelor clientului x ar fi nsoit de afiarea, n acelai formular, a facturilor clientului respectiv. Acest lucru este posibil datorit existenei, la nivelul bazei de date, a unei relaii one-to-many (unu-la-mai-multe) ntre cele dou tabele pe care se bazeaz blocurile de date, fapt ce se implementeaz n Forms Developer prin crearea unui formular de tip master-detail. ntr-un astfel de formular va exista o sincronizare ntre nregistrrile din blocul detail i cele din blocul master. Un formular poate, deci, conine unul sau mai multe blocuri de date. Fiecare bloc de date poate gestiona o singur tabel. Blocurile de date pot fi independente sau corelate printr-o relaie de tip master-detail; efectul unei astfel de relaii const n sincronizarea datelor ntre blocul de date master, care este bazat pe tabela care conine cheia primar i cel detail, ce se bazeaz pe tabela care conine cheia extern. Pot fi create relaii complexe, n care blocul detail al uneia este master pentru o alta, sau n care un bloc master are mai multe blocuri detail. De asemenea, se pot defini formulare de tip master- detail fr ca ntre tabelele pe care se bazeaz blocurile de date s fie explicit definit o relaie unu-la-mai-muli, caz mai rar ntlnit ns. S revenim la exemplul nostru, n care, pn acum, am construit un formular pentru gestionarea clienilor firmei noastre. Unicul bloc de date definit, BL_CLIENTI, este bazat pe tabela clienti. Vom construi nc un bloc de date, care va gestiona nregistrrile din tabela facturi. Procedeul de construire, cu ajutorul instrumentului Data Block Wizard, este deja cunoscut. La un moment dat, ns, s observm c apar elemente specifice unei aplicaii master-detail; ne poziionm, deci, pe blocul BL_CLIENTI, apsm butonul New, reprezentat, n partea din stnga a ferestrei Object Navigator, prin icon-ul : . Primii pai ai wizard-ului sunt cei prezentai la crearea blocului anterior. Definim blocul ca fiind bazat pe tabela facturi, selectm toate coloanele pentru a fi aduse din tabel n aplicaia Forms, iar la pasul urmtor este sesizat existena unui alt bloc n formular i suntem chestionai n legtur cu crearea unei relaii ntre cele dou blocuri. n pagina Master-detail care apare se selecteaz butonul Create Relationship, iar din lista de valori care apare se alege blocul BL_CLIENTI. Astfel, dac la nivelul celor dou tabele este definit o cheie extern, atunci instrumentul Data Block Wizard va genera automat o condiie de join ntre cele dou blocuri; n caz contrar, va trebui s o definim explicit, alegnd din cele dou liste de valori Detail Item i Master Item elementele dup care se va face corelarea ntre blocurile de date:
59
Urmtoarele pagini sunt cele cunoscute. S continum, apelnd Layout Wizard. Vom proceda la afiarea tuturor elementelor blocului asupra cruia lucrm (numit de noi FACT_CLIENTI), cu excepia item-ului cod_firma. Acesta va fi afiat n blocul BL_CLIENTI i, datorit faptului c cele doua blocuri vor fi corelate, afiarea acestui item va produce informaie redundanta. S alegem, de data aceasta, modul tabular de afiare (n care nregistrrile vor fi prezentate sub form de tabel), precum i afiarea simultan a 4 instane din blocul detail la un moment dat:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 60
Rezultatul procesului de creare a acestui al doilea bloc este prezentat n figura urmtoare:
61
Corelarea ntre blocul master i cel detail este realizat de un obiect nou, de tip Relations, aparinnd nodului blocului de date master. Implicit, numele relaiei se formeaz dup urmtoarea regul: NumeBlocMaster_NumeBlocDetail. Sunt generate automat uniti de program (trigger-i) care menin coordonarea ntre cele dou blocuri. Privii figura de mai sus i vei remarca imediat acesti trigger-i, la creare sunt automat selectai n Object Navigator. Exist cazuri (de exemplu cel amintit anterior) n care ntre cele dou tabele nu este definit o relaie one-to-many. Dac vrem, totui, o coordonare ntre blocurile de date, trebuie s crem obiectul Relations manual. Dnd dublu click pe capitolul Relations al blocului de date master, obinem urmtoarea fereastr:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 62
n care specificm blocul de date detail, conditia de join, precum i modul n care va lucra corelarea dintre cele dou blocuri. Atenie: definii condiia de join folosind sintaxa SQL de definire a unei astfel de condiii, dar utilizai numele blocurilor n locul numelor tabelelor, precum i numele item-urilor n locul coloanelor tabelelor. Acum sincronizarea dintre cele dou blocuri se efectueaz automat la schimbarea focus-ului n cadrul blocului master, n dou etape: se golete blocul detail, apoi se repopuleaz conform frazei select-SQL definit de condiia de join. Mecanismul de repopulare are la baz folosirea proprietii Copy Value from Item din paleta de proprieti a elementului cod_firma din blocului detail. Astfel, cnd se actualizeaz blocul detail (n urma apariiei unui eveniment care necesit sincronizare), item-ul care are rol de cheie extern din blocul detail ia valoarea item-ului cheie primar din blocul master i sunt afiate numai nregistrrile care verific aceast condiie:
63
Modul n care se efectueaz tergerile i coordonarea dintre cele dou blocuri se poate seta din fereastra n care am definit relaia de join sau poate fi modificat ulterior, folosind paleta de proprieti a relaiei:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 64
Una din cele mai importante proprieti este Delete Record Behaviour, care determin modul n care se fac tergerile n blocul master. Implicit, valoarea acestei proprieti este setat la Non Isolated, nepermind tergerea unei nregistrri din blocul master atta timp ct exist detalii care se refer la ea. Dac nu renunai la ideea tergerii nregistrrii master, ar trebui terse, nti, nregistrrile corespondente ei din blocul de detalii, sau putei seta proprietatea despre care tot discutm la valoarea cascading, fapt ce va determina tergerea automat a nregistrrilor detail corespunztoare nregistrrii master pe care ncercm s o tergem. O alt variant este selectarea valorii Isolated pentru proprietatea Delete Record Behaviour, fapt ce permite tergerea nregistrrii master, chiar dac exist nregistrri detail care se refera la ea. Cu siguran ai observat deja faptul c modificarea modului de tergere a nregistrrilor din formular a produs schimbri ale trigger-ilor generai de relaia dintre cele dou blocuri: s ne reamintim c, n cazul modului de tergere implicit, Non Isolated, trigger-ii (sau, pe romanete, declanatorii) care au aprut automat au fost:
65
on-clear-details (definit la nivel de modul), on-populate-details, on-check-delete-master (definit la nivelul blocului master). Un declanator este un fragment de cod care se execut la declanarea unui eveniment. S ncercm mpreun s ntelegem ce este cu aceti trigger-i: primul dintre ei, on-clear-details, se declaneaz cnd are loc un eveniment de coordonare ntre dou blocuri. Dac vei da dublu-click n Object Navigator pe icon-ul ataat acestui declanator, vei vedea codul surs, n PL/SQL. Poate deocamdat pare mai complicat, dar sperm ca, treptat, s lmurim lucrurile. La declanarea lui, acest trigger va goli blocul detail, urmnd ca repopularea s fie efectuat de ali trigger-i, definii la nivel de bloc master. Acolo vedem declanatorul on-populate-details, generat implicit de Forms la crearea relaiei ntre cele dou blocuri. Acest trigger se ocup de popularea blocului detail cu nregistrri corelate cu nregistrarea curent din blocul master, conform strategiei definite de Forms. Putem schimba, ns, modul de populare a blocului detail, modificnd codul PL/SQL al acestui trigger. Atenie, acest trigger nu se va declana n
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 66 absena unui trigger de tip on-clear-details. Ultimul dintre trigger-i, on-check-delete- master, se declaneaz la ncercarea de tergere a unei nregistrri dintr-un bloc master aparinnd unei relaii master-detail. S privim mpreun codul acestui trigger:
-- -- Begin default relation declare section -- DECLARE Dummy_Def i ne CHAR( 1) ; - - - - Begi n FACT_CLI ENTI det ai l decl ar e sect i on - - CURSOR FACT_CLI ENTI _cur s I S SELECT 1 FROM FACTURI F WHERE F. COD_FI RMA = : BL_CLI ENTI . COD_FI RMA; - - - - End FACT_CLI ENTI det ai l decl ar e sect i on - - - - - - End def aul t r el at i on decl ar e sect i on - - - - - - Begi n def aul t r el at i on pr ogr amsect i on - - BEGI N - - - - Begi n FACT_CLI ENTI det ai l pr ogr amsect i on - - OPEN FACT_CLI ENTI _cur s; FETCH FACT_CLI ENTI _cur s I NTO Dummy_Def i ne; I F ( FACT_CLI ENTI _cur s%f ound ) THEN Message( ' Cannot del et e mast er r ecor d when mat chi ng det ai l r ecor ds exi st . ' ) ; CLOSE FACT_CLI ENTI _cur s; RAI SE For m_Trigger_Fai l ur e; END I F; CLOSE FACT_CLI ENTI _cur s; - - - - End FACT_CLI ENTI det ai l pr ogr amsect i on - - END; - - - - End def aul t r el at i on pr ogr amsect i on - -
67 Dup cte v amintii, un program PL/SQL are 3 seciuni: cea declarativ (opional), corpul programului i o seciune de tratare a excepiilor (tot opional). n cazul nostru, n prima parte este declarat un cursor. Acesta reprezint o zon de memorie n care Oracle stocheaz nregistrrile returnate de o comand SQL. Orice instruciune select genereaz un cursor, care este gestionat automat de sistem, ns utilizatorul poate crea cursoare proprii, apoi poate prelucra, nregistrare cu nregistrare, coninutul cursorului. Lucrul cu un cursor explicit implic urmtorii pai: crearea cursorului, n seciunea de declaraii (adic specificarea comenzii SQL care va popula cursorul); la acest moment cursorul este doar declarat, nu i populat; deschiderea cursorului (cu comanda open nume_cursor), fapt ce induce popularea sa; extragerea, nregistrare cu nregistrare, a coninutului cursorului n scopul prelucrrii (cu comanda fetch nume_cursor into nume-variabla); nchiderea cursorului (cu close nume_cursor). Observai, n trigger-ul on-check-delete-master, definirea i deschiderea unui cursor care conine toate codurile de facturi ale clientului al crui cod este valoarea item- ului cod_client din blocul master BL_CLIENTI: CURSOR FACT_CLI ENTI _cur s I S SELECT 1 FROM FACTURI F WHERE F. COD_FI RMA = : BL_CLI ENTI . COD_FI RMA; Deci, n cazul n care nregistrarea master are detalii corelate cu ea, instruciunea FACT_CLIENTI_curs%found va ntoarce valoarea true, n bara de stare va fi afiat mesajul Message('Cannot delete master record when matching detail records exist.'); cursorul va fi nchis, iar instruciunea RAISE Form_Trigger_Failure va produce euarea trigger-ului i ntreruperea aciunii curente (de tergere a nregistrrii master cnd are nregistrri detail corelate). n cazul n care cursorul nu conine nregistrri, acesta este nchis, trigger-ul se termin cu succes i tergerea este permis. Acetia au fost, deci, trigger-ii creai automat n cazul unei relaii master-detail cu condiie de tergere Non Isolated. S schimbm, n paleta de proprieti a relaiei, aceast valoare cu Isolated. Observai dispariia trigger-ului on-clear-details, lucru care era de ateptat deoarece acum tim c acest mod de lucru permite tergerea nregistrrilor master chiar n cazul existenei unor nregistrri detail corelate cu aceasta. Ultimul mod de tergere este Cascading. Reamintim c n acest caz, la tergerea unei nregistrri master, vor fi terse automat nregistrrile detail corespunztoare acesteia. Ce nseamn de fapt automat? Cine efectueaz aceast tergere? Binenteles
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 68 c trigger-ul pre-delete care a fost generat la nivel de bloc. Trigger-ii pre- se declaneaz nainte de eveniment, n cazul nostru acesta se va declana nainte de ncercarea de a terge o nregistrare master i va terge toate nregistrrile detail corelate cu aceasta. Secvena de cod PL/SQL este, de aceasta dat, mult mai simpl (terge din tabela facturi toate nregistrrile corespunztoare clientului al crui cod este n blocul BL_CLIENTI, item-ul cod_firma): - - - - Begi n def aul t r el at i on pr ogr amsect i on - - BEGI N - - - - Begi n FACT_CLI ENTI det ai l pr ogr amsect i on - - DELETE FROM FACTURI F WHERE F. COD_FI RMA = : BL_CLI ENTI . COD_FI RMA; - - - - End FACT_CLI ENTI det ai l pr ogr amsect i on - - END; - - - - End def aul t r el at i on pr ogr amsect i on - - n urma execuiei acestui trigger nu vor mai exista n tabela nregistrri copil ale nregistrrii ce se vrea tears din tabela printe i operaia se termin cu succes. Cred c este timpul s v luai o clip de rgaz i s rulai aplicaia, ncercnd s vedei cum funcioneaz n fiecare din cele trei cazuri. Nu v bucurai, nu am terminat cu paleta de proprieti a relaiei! Mai sunt cteva lucruri interesante, cum ar fi Prevent Masterless Operaion. Valoarea implicit este No, nsemnnd c se poate face query pe blocul detail, indiferent dac blocul master este sau nu populat cu vreo nregistrare. n cazul contrar, cnd valoarea acestei proprieti este Yes, ncercarea de a efectua o cerere pe blocul detail eueaz, eroarea obinut fiind: FRM-41105: You cannot query records without a saved parent record Ultimul nod n paleta de proprieti a relaiei, Coordination, se refer la modul n care se face coordonarea ntre blocuri. Proprietatea Deferred este setat implicit la No, valoarea Yes determinnd popularea blocului detaliu doar atunci cnd focus-ul intr pe el. Acest mod de lucru poart numele de populare cu ntrziere, iar ea poate fi de dou feluri: n cazul cnd proprietatea Automatic Query are valoarea No, popularea se numete a fi cu ntrziere, dar cu subcerere, pentru popularea blocului detail fiind necesar nc o dat comanda Execute Query;
69 n cazul cnd proprietatea Automatic Query are valoarea Yes, popularea se numete a fi cu ntrziere i cu cerere implicit, pentru popularea blocului detail fiind necesar doar mutarea focus-ului pe acesta. Primul mod de coordonare (populare cu ntrziere i cu subcerere) este folosit atunci cnd se dorete obinerea nregistrrilor ce ndeplinesc un filtru cu o condiie dubl, att din primul ct i din al doilea bloc. n acest caz se scrie condiia n primul bloc, se acioneaz butonul Execute Query, se d click pe al doilea (nu va fi nc populat), se introduce i a doua condiie, apoi se acioneaz din nou butonul Execute Query. Am creat, deci, un formular de tip master-detail, i-am asigurat funcionalitatea necesar, iar acum ar trebui s fim mulumii de rezultatele efortului nostru:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 70 S reamintim c ntre cele dou blocuri corelarea se face automat (n cazul interogrilor blocului master, blocul detail va fi populat automat; insernd o nregistrare detail, ea va fi automat asociat cu nregistrarea afiat n blocul master), iar regula implicit de tergere este urmtoarea: nu se poate terge o nregistrare master atta timp ct ea are nregistrri detail corespondente (aceste moduri de lucru pot fi modificate, aa cum am aratat anterior). Remarcai afiarea simultan, n blocul detail, a 4 nregistrri. Acest fapt a fost setat la crearea interfeei blocului de date (fcut, va amintii?, cu Layout Wizard) i se regsete, bineneles, n paleta de proprieti a blocului de date, de unde poate fi i modificat:
71 2.6. 2.6. Gestionarea elementelor text text Gestionarea elementelor Un element de tip text este o interfa prin care putei interoga i actualiza datele. n general, un obiect text corespunde unei coloane dintr-o tabel. La crearea unui element nou, tipul su implicit este text. Proprietile elementului sunt, apoi, definite n paleta sa de proprieti. Crearea unui element text nou se poate face n unul din mai multe moduri: folosind utilitarele de tip wizard; convertind un element deja existent ntr-unul de tip text (n paleta sa de proprieti, la Item Type, alegem din lista de valori ataata intrarea text); acionnd instrumentul Text Item din Layout Editor; apsnd butonul Create icon din Object Navigator; Pentru exemplificarea celei de a treia metode de creare a unui element text, s invocm Layout Editor, s lrgim cadrul ce conine blocul de date FAC_CLIENTI, s mutm bara de scroll spre dreapta, pentru a face loc unui element de tip text, apoi, selectnd butonul pentru crearea unui astfel de obiect, s l poziionm pe locul n care vrem s apar. Atenie, n partea superioar a acestui editor avem dou liste pop-up de valori din care trebuie s selectm blocul de date i canvas-ul crora vrem s le aparin elementul nou creat.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 72
Ar fi foarte bine dac am reui s asociem elementului creat o etichet. Pentru aceasta acionm butonul etichetat cu litera A din bara de instrumente aflat n partea stng i crem un element nou, deasupra celui de tip text creat anterior.Dup ce adugm textul dorit, selectarea simultan (innd tasta Ctrl apsat) a celor dou obiecte i acionarea butonului Associate prompt (vezi figura anterioar) va determina asocierea etichetei cu elementul text i tratarea lor unitar (orice ncercare de deplasare a unuia dintre elemente va determina deplasarea celuilalt, tergerea se face n grup etc). Remarcai faptul c, deoarece noul element text aparine blocului FACT_CLIENTI, care afieaz simultan cte 4 nregistrri, acesta va avea afiate tot cte 4 instane ale sale. Noul item nu ne va fi, ns, de prea mare folos dac nu i setm proprietile. Trebuie s specificm ce vrem s afieze noul element; este sau nu bazat pe o coloan dintr-o tabel, se calculeaz dup vreo formula etc. Haidei s facem un pas important (sperm c acesta va fi nainte) i s ncercm s convingem acest element s ne arate, pentru fiecare factur, valoarea total a Butonul Associate prompt
73 produselor pe care aceasta le conine. Pentru nceput s acionm tasta F4 invocnd, astfel, paleta de proprieti a acestui item:
Dup ce, la intrarea Name, am numit acest element ntr-un mod mai uman (total, de exemplu), i setm tipul ca fiind Number, lucru foarte important. Implicit, acest element ar fi fost tratat ca fiind de tip ir de caractere. Capitolul Calculation este locul n care vom defini modul de calcul pentru noul element. Nu vom folosi funciile oferite la intrarea Summary Funcion (sunt cele disponibile i n SQL), ci vom seta Calculation Mode la valoarea Formula, iar la intrarea Formula va trebui sa specificam o expresie PL/SQL mai complex. Putem s trecem ca formul o expresie aritmetic ce are ca operanzi item-urile din formularul curent (folosind sintaxa NumeBloc.NumeItem) sau, dac avem nevoie de informaie care nu a fost nc ncrcat n formular (cazul nostru trebuie s interogm tabela stoc), vom crea o funcie ce va ntoarce valoarea ce se dorete a fi atribuit noului element. Funcia va fi creat cu ajutorul cunotintelor pe care le avem (sau pe care ar trebui s le avem) relativ la limbajul PL/SQL. Putem crea aceast funcie la nivelul bazei de date, caz n care poate fi reutilizat n orice mediu de programare
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 74 Oracle sau la nivel de modul, caz n care poate fi utilizat doar n modulul n care a fost creat. Optm pentru a doua varianta i, n Object Navigator, selectam nodul Program Units, apoi acionm butonul New. n caseta de dialog care apare selectm tipul obiectului ce va fi creat la valoarea Function, iar numele: tot_fact. Click pe OK determin invocarea editorului PL/SQL:
S ne reamintim c vrem ca aceast funcie s calculeze, pentru o factur dat, suma produselor existente pe acea factur. Ca s funcioneze n caz mai general, codul facturii ar trebui dat ca parametru al funciei. Ne reamintim c n specificaia unei funcii PL/SQL trebuie s precizm tipul de dat returnat de funcie (n cazul nostru number). n variabila rez calculm suma produselor dintre valoarea unitar a produselor de pe factur i cantitate. Preul fiecrui produs se afl n tabela stoc, n timp ce cantitatea se afl n tabela facturi, aa ca am facut un join ntre aceste tabele. Este returnat valoarea variabilei rez:
75
Acionarea butonului din stnga-sus al editorului PL/SQL (etichetat Compile) va determina compilarea funciei i, n cazul fericit, afiarea n dreapta jos a mesajului Successfully Compiled. Dac exist erori, acestea vor fi afiate n partea de jos a ferestrei editorului PL/SQL i vor trebui corectate. Odat creat, funcia poate fi invocat oriunde n aplicaia curent. n paleta de proprieti a item-ului total setm modul de calculare la valoarea Formula, iar valoarea pe care o ia acest element va fi cea returnat de funcia tot_fact, calculat pentru parametrul :cod_prod. S precizm doar faptul c un item poate s nu fie prefixat de numele blocului din care face parte doar n cazul n care el este invocat n acelai bloc. Rezultatul este:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 76
Dup ce vei rula aplicaia i v vei convinge c totalul de pe fiecare factur este afiat corect, v propun s revenim la elementele de tip text, acestea fiind cele mai frecvente n aplicaiile Forms, i s analizm, n continuare, proprietile lor. Am creat un item de tip text folosind instrumentul Layout Editor. Precizam, cu cteva pagini n urm, c acesta putea fi creat i din Object Navigator, dnd click pe butonul New n timp ce este selectat un alt element text din acelai bloc cu cel ce se dorete a fi creat. Un element text obinut n acest mod, nu va fi regsit n Layout Editor i aceasta deoarece nu i se asociaz implicit nici un canvas n care s fie afiat. S analizm paleta de proprieti a unui element text: capitolul General permite modificarea numelui elementului i selectarea, din lista pop-up a proprietii Item Type, a tipului su. Capitolul Functional permite modificarea funcionalitii implicite a elementului i conine urmtoarele proprieti: Enabled este corelata cu proprietatea Keyboard Navigable a capitolului Navigation, astfel: Enabled Keyboard navigable Comportament
77 Yes Yes Item-ul este inclus n navigare; poate fi accesat i cu ajutorul mouse-ului Yes No Item-ul nu poate fi accesat prin navigarea implicit, cu tastatura; poate fi accesat doar cu mouse-ul No No Item-ul este practic exclus din procedeul de navigare; nu poate fi manipulat nici cu mouse-ul, nici cu tastatura No Yes Item-ul nu este activ, el nu poate fi manipulat. Valoarea celei de a doua proprieti este, practic, tot No. Justification permite specificarea modului de aliniere a valorii item-ului; Multi-line este sau nu permis spaierea textului pe mai multe linii; Wrap Style - modul n care se efectueaz trecerea la linie nou n cazul n care textul depete suprafaa de editare; Case Restriction textul este convertit la majuscule, litere mici sau este afiat aa cum este introdus de utilizator; Conceal Data este o proprietate specific doar item-urilor text pe un singur rnd i este folosit pentru introducerea parolelor: la fiecare tast apsat de utilizator, n cmpul respectiv este afiat caracterul *. Keep Cursor Position cursorul nu se mic n timp ce utilizatorul tasteaz valoarea cmpului; Automatic Skip salt la item-ul urmtor cnd cel curent este completat pe toat lungimea sa. Capitolul Navigation stabilete modul de navigare spre i de la item la apsarea tastei Tab, permind specificarea item-urilor anterior i urmtor celui curent, n cazul n care acesta este Keyboard Navigable. Valoarea implicit No a acestor dou proprieti determin navigarea n ordinea n care item-urile apar n Object Navigator. Capitolul Data este utilizat pentru controlul modului n care datele sunt introduse i afiate. Cel mai des folosite proprieti sunt: Data Type specificarea tipului de valori pe care Forms Developer le permite a fi introduse; Maximum Length lungimea maxim a valorii introduse de utilizator;
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 78 Initial Value valoarea implicit pe care Forms Developer o asociaz respectivului item de fiecare dat cnd e creat o nregistrare nou; poate fi, de exemplu, o valoare fix, sau poate fi selectat dintr-o secven, folosindu-se sintaxa :sequence.NumeSecventa.nextval; pentru o variabil de tip date pot fi folosite data i ora sistemului de operare, n forma $$DATE$$, $$DATETIME$$, $$TIME$$. Required dac aceast proprietate este setat la valoarea Yes, nregistrarea curent este considerat invalid n cazul cnd acest item are valoarea Null; Format Mask pemite definirea unui prototip (conform standardelor SQL) pentru introducerea datelor. Se pot defini prototipuri-utilizator, prin inserarea caracterelor adiionale ntre ghilimele (de ex., pentru elementul total, care afieaz valoarea total a unei facturi, un prototip ar putea arata aa: 999.999euro); Lowest/Higher Value specific domeniul maxim de valori acceptate; Copy Value from Item indic sursa valorii pe care Forms-ul o folosete pentru a popula item-ul. Este util n cazul unei relaii master-detail, fapt discutat ntr-un capitol anterior; Synchronize with Item specific numele unui item (care poate fi ales dintr-o list de valori coninnd item-urile din blocul curent) cu care item-ul curent se va sincroniza. Orice modificare a valorii acelui item va produce actualizarea celui curent. ncercati s convingei aplicaia noastr s fac urmtoarele lucruri: Lng numele cadrului al doilea s fie un item care s arate numele firmei ale crei facturi sunt afiate; Valoarea total a facturii s fie afiat conform capturii de ecran urmtoare; La crearea unei nregistrri pentru o factur nou, cmpul data s fie completat automat cu data sistemului:
79
Indicaii: observai c lng numele celui de al doilea cadru apare i denumirea firmei care trebuie s se sincronizeze cu item-ul nume-firma din blocul BL_CLIENTI. Creai, deci, n blocul master un element nou, de tip text. Poziionai-l ca n captura anterioar de ecran i setai-i proprietatea Synchronize with Item la valoarea nume_firma. Setai, pentru item-ul total, proprietatea Format Mask la 999.999euro, iar proprietatea Initial Value a cmpului data la data sistemului, n forma $$DATE$$. Capitolul Calculation a fost prezentat odat cu crearea item-ului numit total, aa c trecem la capitolul Records. Una din cele mai importante proprieti se afl aici: Number of Items Displayed. Valoarea implicit 0 nseamn, de fapt, c numrul de instane afiate este acelai cu numrul de nregistrri afiate simultan, proprietate setat la nivelul blocului de date (v mai amintiti? Se numea Number of Records Displayed.) Modificarea acestei valori determin afiarea unui numr de instane corespunztor noii valori. Capitolul Database conine proprieti ce controleaz sursa informaiei din item- ul curent (este bazat pe o tabel sau este item de control), precum i modul de comunicare ntre acesta i tabel. La nodul Database gsim:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 80 Database Item setai aceast proprietate la valoarea Yes dac elementul curent ia informaia dintr-o tabel; Column Name numele coloanei (din tabela pe care este construit blocul curent) din care item-ul ia informaia; Primary Key coloana pe care se bazeaz item-ul conine sau nu cheie primar; n caz afirmativ, Forms Developer verific unicitatea valorii acordate acestui item; Query Only implicit are valoarea No; schimbarea ei la valoarea Yes permite includerea item-ului numai n executarea de cereri, nu i n operaii insert sau update; Query/Insert/Update Allowed - controleaz ce operaii DML sunt permise; Query Length specific lungimea maxim a unui ir ce poate fi stocat n acest item n cazul efecturii unei cereri. Valoarea implicit 0 nseamn, de fapt, lungimea maxim a cmpului, setat prin proprietatea Maximum Length, de la capitolul Data; Case Insensitive Query permite sau nu utilizatorului s efectueze pentru item-ul respectiv cereri case-insensitive; Update Only if Null setat la valoarea Yes, aceast proprietate nu permite utilizatorului modificarea item-ului curent dect dac acesta are valoarea Null; Lock Record blocheaz (sau nu) rndul din tabel corespunztor nregistrrii curente n cazul cnd aceasta este modificat. Urmtoarele dou capitole din paleta de proprieti a unui element text, List of Values i Editor vor fi studiate n detaliu ulterior; acum ne oprim asupra proprietilor grupate sub numele Physical, care se refer la poziia i dimensiunile item-ului. Gsim aici: Visible care setat la valoarea Yes produce afiarea elementului; n caz contrar, elementul exist, poate fi folosit, de exemplu, pentru calculul unor valori, dar nu va fi vizibil; Canvas n ce canvas va fi afiat elementul; Tab Page n cazul canvas-urilor de tip Tab permite specificarea paginii canvas-ului pe care va fi afiat elementul; X/Y Position permite specificarea coordonatelor colului din stnga-sus al elementului relativ la acelai col al canvas-ului; Width i Height - seteaz limea i nlimea item-ului curent;
81 Bevel permite setarea chenarului item-ului curent; Rendered la ieirea focus-ului de pe element, acesta i va modifica sau nu aspectul; Show Vertical Scrollbar este evident la ce se refer, nu? Urmatoarele grupe de proprieti, Visual Attributes, Color i Font contin proprieti deja familiare noua, aa ca trecem la capitolul Prompt, care personalizeaza apariia etichetei elementului text curent: Prompt textul afiat ca etichet; Prompt Display Style cum s fie afiat eticheta: doar o dat, lng prima instan a elementului, cte o dat pentru fiecare instan sau s fie ascuns; Prompt Justification modul de aliniere al textului; Prompt Attachment Edge lng ce latur a elementului va fi afiat eticheta; Prompt Alignment seteaz modul n care este aliniata eticheta de-a lungul laturii stabilit prin proprietatea anterioar; Prompt Attachment Offset distana dintre item i eticheta sa; Capitolele Prompt Color i Prompt Font stabilesc culoarea fundalului pe care va fi afiata eticheta, precum i caracteristicile font-ului folosit la afiarea acestuia. Capitolul Help permite programatorului afiarea de mesaje ajuttoare, case- sensitive, pentru utilizatorul final al aplicaiei. Textul care este atribuit proprietii Help va fi afiat n bara de stare a aplicaiei, la rulare, n modul urmtor: dac proprietatea Display Hint Automatically este lsat la valoarea implicita, No, mesajul ajuttor va fi afiat doar cnd focus-ul se afl pe element i utilizatorul apas tasta F1. n cazul n care aceast proprietate are valoarea Yes, mesajul va fi afiat la intrarea focus-ului pe elementul curent. Proprietatea Tooltip permite definirea unui text care va fi afiat ntr-o caset alturat elementului, cnd utilizatorul mic mouse-ul deasupra acestuia. Atributul vizual folosit pentru afiarea tooltip-ului se seteaz la proprietatea Tooltip Visual Attribute Group. ncercai s setai grupul de proprieti Help pentru elementul cod_prod la valorile urmtoare:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 82
Vei obine, n runtime, urmtorul efect:
83 2.7. . Butoane (push buttons) push buttons 2.7 Butoane ( ) Un buton este o interfa grafic pe care utilizatorul d click pentru iniierea unei aciuni. Acesta este, n general, reprezentat sub forma unui dreptunghi ce include o etichet coninnd text i/sau imagine; nu poate reine sau afia valori (cu toate c eticheta sa poate fi modificat programatic n timpul rulrii). n general, butoanele sunt adugate formularelor pentru obinerea unei funcionaliti sporite i a unui mod rapid de acces la cel mai des utilizate operaii. Este recomandat poziionarea butoanelor n blocuri speciale, numite blocuri de control. S crem, n aplicaia noastr, un bloc nou, pe care sa l denumim CONTROL. Exist mai multe modaliti prin care se poate crea un buton: 1. convertind un element deja existent la unul de tip buton (n paleta de proprieti setm Item Type la valoarea Push Button); 2. crend, n Object Navigator, un element nou, de tipul buton; 3. n Layout Editor acionm butonul din bara de instrumente, apoi prin drag&drop, poziionm obiectul pe locul dorit, avnd grij s fie selectat blocul de control:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 84
Obiectului nou creat i modificm proprietile n modul deja cunoscut:
85
Setnd proprietatea Name, numim butonul but_ies (acesta va fi un buton la a crui apsare se va nchide formularul), iar eticheta (Label) va fi setat la valoarea Iesire. Proprietatea Iconic permite specificarea modului de afiare a butonului imagine sau text? n primul caz, la intrarea Icon Filename precizm numele fiierului (fr extensie!) care va fi folosit ca etichet pentru butonul curent. Putem s stabilim, cu ajutorul proprietii Access Key o combinaie de taste (de exemplu Alt-J) la a crei apsare s fie acionat butonul. Celelalte proprieti sunt cunoscute, ele fiind aceleai cu cele ale elementelor text create ntr-un capitol precedent. Dup crearea prii grafice a butonului, ar trebui sa i acordm funcionalitate. Pentru aceasta avem la dispozitie triger-ii, secvene de cod care se declaneaz la anumite evenimente. Efectund click dreapta pe buton, din meniul de context care apare alegem intrarea smart triggers, reprezentnd cel mai des utilizai trigger-i pentru obiectul respectiv. La click pe buton se va declana, dup cum ai bnuit deja, trigger-ul when- button-pressed. l selectm:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 86
i va fi invocat editorul PL/SQL, unde suntem invitai s scriem codul trigger-ului:
Am folosit procedura predefinit exit_form, care nchide formularul curent. Rulm forma i testm butonul creat. S-ar putea s deranjeze faptul c, atunci cnd focus- ul se afl pe un cmp care are proprietatea Data Required setat la valoarea Yes, nu putem aciona butonul pn cnd nu completm cmpul curent. Acest context va fi neplcut
87 pentru utilizatorul care nu va nelege de ce trebuie s scrie n cmpul respectiv o valoare arbitrar ca s poat nchide forma. Putem salva situaia printr-un truc: setm proprietatea Mouse Navigate a butonului la valoarea No, acest lucru nensemnand c butonul nu poate fi accesat cu mouse-ul, ci c focus-ul rmne pe cmpul anterior.
2.8. . Canvas-uri de tip suprapus (stacked canvas) Canvas 2.8 -uri de tip suprapus (stacked canvas) Clarificasem, ntr-un capitol anterior, faptul c o fereastr este un container pentru obiecte, iar canvas-ul este pnza pe care le aezm. Pentru a fi afiat n runtime, un canvas trebuie s fie asociat unei ferestre. Exist 4 tipuri de canvas-uri. Pn acum am folosit doar canvas-uri de tipul implicit, numit coninut (content canvas). Trebuie respectate cteva reguli n lucrul cu canvas-uri de tip coninut: acestea ocup toat suprafaa ferestrei; este obligatoriu ca fiecare fereastr s conin cel puin un canvas, iar acesta s fie de tip content; nu pot fi afiate simultan mai multe canvas-uri coninut, comutarea ntre acestea fcndu-se programatic (putem s aducem simultan dou canvas-uri pe ecran doar dac le asignm la ferestre diferite). Partea vizibil n runtime este determinat de proprietile Viewport X/Y Position on Canvas (care determin coordonatele, relativ la canvas, ale colului stnga-sus al suprafeei vizibile). La nodul Functional al paletei de proprieti a unui canvas gsim proprietile Heigh i Width, care se refer, ns, la dimensiunile canvas-ului, nu la cele ale viewport-ului.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 88
Adiional canvas-urilor coninut, Forms Buider ofer alte 3 tipuri de asemenea elemente, care au un comportament diferit, n sensul c pot fi afiate peste canvas-urile content, n acelai timp cu acestea. Stacked canvas (suprapus) se afieaz n aceeai fereastr cu un canvas de tip coninut, peste acesta; dimensiunile lui sunt, n general, mai mici; ntr-o fereastr pot fi definite mai multe canvas-uri suprapuse; este utilizat, n general, pentru afiarea mesajelor de help, a informaiei aditionale, a antetelor cu informaie static; Toolbar canvas reprezint o alternativ pentru meniuri; pe un asemenea canvas putem aeza mai multe butoane, fiecare cu o funcionalitate specific; Tab canvas permite organizarea i afiarea informaiei pe pagini separate, care se pot accesa prin click pe eticheta acestora; sunt afiate peste un canvas de tip coninut.
89 Fiind narmai cu noiunile de baz referitoare la canvas-uri, s purcedem la crearea unuia de tip stacked. Dorim ca, la acionarea unui buton, s fie afiat ntr-un mod atractiv numele firmei (eventual o sigl, n cazul n care aceasta este disponibil):
Paii care trebuie urmai pentru crearea noului canvas sunt: 1. n Object Navigator efectum dublu-click pe icon-ul canvas-ului content n care vrem sa crem canvas-ul suprapus; 2. Click pe butonul Stacked Canvas din bara de instrumente, pe care l recunoatei dup eticheta sa: 3. Efectum click i drag cu mouse-ul n canvas-ul de tip content, acolo unde vrem s poziionm canvas-ul suprapus. Atenie: la afiarea unui canvas nu trebuie s opturm cu el cmpul curent (pe care se afl focus-ul). n caz contrar, afiarea nu se face.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 90 4. Invocm paleta de proprieti a noului element, pentru a-i seta funcionalitatea:
n primul rnd, schimbm numele acordat implicit canvas-ului la valoarea suprapus. Proprietile Viewport X/Y Position stabilesc coordonatele colului din stnga- sus al canvas-ului relativ la acelai col al ferestrei n care acesta este afiat, n timp ce proprietile Viewport Width/Heigh permit setarea dimensiunilor parii vizibile la rulare a canvas-ului. Proprietatea Visible aflat la nodul Physical indic dac acest canvas este afiat sau nu la rulare. Setm aceast proprietate la valoarea No, urmnd s afim acest canvas programatic: crem, n blocul de control, dou butoane, unul pentru afiarea siglei clientului, cellalt pentru ascunderea siglei. Funcionalitatea lor este dat de trigger-ii when-button-pressed, n care vom folosi dou proceduri built-in (predefinite): show_view(NumeCanvas) determin afiarea canvas-ului hide_view(NumeCanvas) produce inhibarea afirii canvas-ului. Ce afim n canvas? Hotrsem s afim, ntr-un mod mai spectaculos, numele firmei. Avem n formular aceast informaie n blocul BL_CLIENTI, ns un item nu poate fi folosit dect ntr-un singur canvas, aa c definim un nou bloc de date, pe care l numim STACKED_CLIENTI i l asociem tabelei CLIENTI. Coninutul acestui canvas va fi afiat n canvas-ul numit suprapus. Crem o relaie master-detail ntre blocul BL_CLIENTI i noul bloc, astfel nct s existe sincronizare ntre item-urile nume_firma. O mic problem apare: n cazul n care nici o nregistrare nu este adus n formular, acionarea butonului etichetat sigla client va produce un canvas vid, a crui afiare poate fi neplacut. Putem, atunci, rezolva aceasta problem n unul din dou moduri: afim, n acest caz, un mesaj predefinit sau, pur i simplu, nvm butonul s
91 nu afieze canvas-ul, dac nu conine informaie. n primul din cele dou cazuri, procedura PL/SQL arat aa:
Bineneles, butoanele (push buttons) nu reprezint singura modalitate de a afia/ascunde un canvas de tip suprapus. Codul PL/SQL anterior poate fi convins s se declaneze i n alte situaii, de exemplu, cnd focus-ul este transferat pe elementul cod_firma. Dar pentru a obine un asemenea comportament va trebui sa nvm mai multe despre tipologia trigger-ilor. Putem, totui, s nlocuim cele dou butoane folosite pentru afiarea, respectiv inhibarea siglei firmei cu unul singur, care s i schimbe eticheta n funcie de context. Generaliznd afirmaia din capitolul anterior (conform creia un buton i poate schimba programatic, n runtime, eticheta), precizm c orice element i poate schimba programatic, n timpul rulrii, proprietile. Motorul PL/SQL din Forms are cteva extensii legate de particularitile elementelor specifice formularelor. Astfel, pentru a accesa proprietile acestora nu se folosete sintaxa clasic obiect.proprietate=valoare, ci au fost create funcia predefinit GET_TipObiect_PROPERTY (avnd doi parametri, numele obiectului i proprietatea) i procedura predefinit SET_TipObiect_PROPERTY (cu trei parametri: numele obiectului, proprietatea, noua valoare). Folosind aceste built-ins-uri, s crem n blocul CONTROL un nou buton (n locul celor dou) pentru afiarea canvas-ului, avnd numele af i eticheta iniial afiare. Trigger-ul when-button-pressed asociat lui va arta aa:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 92
2.9. 2.9. Liste de valori (LOVs) Liste de valori (LOVs) Listele de valori sunt obiecte ale modulului care i deschid propria fereastr la apelarea n timpul rulrii aplicaiei. Ele ofer utilizatorului posibilitatea de a alege un item dintr-o list cu mai multe coloane, list care poate fi definit static (are aceleai valori indiferent de context) sau dinamic, creat pe baza unei instruciuni select. Obiectele LOV sunt definite la nivel de modul, astfel nct pot fi utilizate oriunde n modulul curent. Tipologia unei liste de valori implic existena a trei elemente: 1. un grup de nregistrri (record group) - un obiect Forms Buider folosit pentru stocarea unei mulimi de valori; acesta poate fi static sau dinamic; poate fi creat independent sau odat cu crearea LOV-ului; poate fi utilizat pentru definirea uneia sau mai multor liste de valori, fiecare dintre acestea afind o mulime specificat de coloane ale grupului; 2. LOV lista nsi, format din una sau mai multe coloane ale grupului de valori pe care se bazeaz; permite utilizatorului selectarea unei valori din list, care va fi automat asignat unui item; 3. Un element text beneficiarul listei de valori, cel cruia LOV-ul i returneaz o valoare; un singur LOV poate returna valori mai multor item-uri simultan; un LOV poate fi afiat automat, la intrarea focus-ului pe respectivul element sau manual, la apsarea de ctre utilizator a combinaiei de taste Ctrl-L sau a opiunii Edit Display List din meniul implicit Forms.
93 S exemplificm crearea i afiarea unei liste de valori statice asociate elementului FACT_CLIENTI.IO. Valoarea pe care o poate lua cmpul IO din tabela FACTURI este 1 sau 0, aa nct dorim ca la completarea item-ului corespunztor acestui cmp, utilizatorul s aib posibilitatea de a alege, dintr-o list, una din cele dou valori. Procedm nti la crearea unui grup de valori pe care se va baza LOV-ul. n Object Navigator selectm nodul Record Groups i acionm butonul Create. Din caseta de dialog care apare alegem opiunea Based on Static Values, dup care suntem invitai s completm valorile ce vor aprea n grup. S crem dou coloane, una ce va conine valorile 1 i 0, iar alta cu explicaii referitoare la cele dou valori:
S numim acest grup GRUP_IO i s trecem la crearea listei de valori dorite. Procedm n acelai mod, selectnd n Object Navigator nodul LOVs i acionnd butonul Create. Din caseta de dialog afiat s alegem crearea listei cu ajutorul unui instrument de tip wizard , iar n prima fereastr ce apare s specificm faptul c noua list va fi creat pe baza unui grup deja existent (cel creat anterior). Dorim ca, la invocarea LOV-ului, s fie afiate utilizatorului ambele coloane ale grupului de nregistrri, deci n caseta urmtoare selectm ambele elemente:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 94
Pasul urmtor este foarte important; precizm cror elemente le vor fi asignate coloanele LOV-ului:
95
Am acionat butonul Look up return item i din lista de valori ce a aprut (cuprinznd toate elementele din modul) am selectat FACT_CLIENTI.IO, element cruia vrem s i fie atribuit valoarea coloanei VAL_ADMISE selectate de utilizator. Cea de a doua coloan a listei este doar informativ, aa c nu i asociem nici un element. n caseta urmtoare dm un nume ferestrei n care este afiat lista de valori (de exemplu Tipul facturii) i putem stabili poziia pe care aceasta va aprea pe ecran. Dnd click pe butonul Next ajungem la pagina Advanced, unde putem s i permitem sau nu utilizatorului s filtreze la afiare lista de valori creat. Pagina final selecteaz dintre item-urile care primesc valori din list pe cele care, avnd focus-ul pe ele, pot afia (n modul specificat anterior) LOV-ul. Observm n Object Navigator crearea unui obiect LOV nou, pe care s l denumim LOV_IO. Analiznd paleta sa de proprieti, remarcm faptul c toate elementele setate cu ajutorul instrumentului LOV Wizard se regsesc i pot fi modificate aici. Analiznd paleta de proprieti a elementului FACT_CLIENTI.IO observm c sub nodul LOV a fost modificat automat proprietatea List of Values, fiindu-i atribuit valoarea LOV_IO. Proprietatea Validate from List a fost lasat la valoarea implicit No,
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 96 permind astfel utilizatorului i inserarea de alte valori, n afara celor din LOV. Noi nu dorim acest lucru, aa c l obligm pe utilizator s aleag una dintre cele dou valori oferite de noi setnd aceast proprietate la valoarea Yes. Rulnd aplicaia, observam c atunci cnd focus-ul se afl pe cmpul IO n bara de stare este semnalat prezena unei LOV pentru acest element, iar la apsarea combinaiei de taste Ctrl-L este afiat lista:
Dublu click pe nregistrarea dorit (sau click simplu urmat de acionarea butonului OK) va atribui item-ului Io valoarea selectat din list. Curiozitatea v va face s ncercai completarea elementului cu o alt valoare, diferit de 1 sau 0, caz n care Forms Developer va afia lista de valori i nu va permite trecerea la alt item nainte de completarea corect a celui curent. Lista de valori poate fi determinat s apar automat, la intrarea focus-ului pe cmpul Io, prin setarea proprietii Automatic Display aflate la nodul Functional al listei. Am construit astfel un grup de nregistrri statice, pe baza cruia am creat un LOV pe care l-am asignat unui element text. S exemplificm obinerea unui LOV dinamic, creat pe baza unei comenzi select. Vom selecta, n Object Navigator, nodul LOVs, apoi vom aciona butonul Create. Alegem i de aceast dat crearea listei cu
97 ajutorul utilitarului LOV Wizard, iar la pasul urmtor precizm c lista i va lua nregistrrile dintr-un grup nou, bazat pe o cerere (selectm opiunea New Record Group Based on a Query). Pasul urmtor al wizard-ului cere definirea instruciunii select care va popula grupul. Putem invoca utilitarul Built SQL Query (acionnd butonul corespunztor), iar n caseta ce apare selectm tabelele ce vor participa la instruciunea select, precum i cmpurile ce vor fi utilizate. S presupunem c vrem mai mult dect poate acest utilitar: dorim ca grupul de nregistrri s conin 3 coloane: pe prima s avem codul firmei, pe a doua numele firmei, iar pe a treia suma valorilor tuturor facturilor operate de firma respectiv (indiferent dac sunt de intrare sau iesire) astfel vom avea o imagine a intensitii activitii firmei respective. Ceea ce permite utilitarul amintit anterior este selectarea celor 4 tabele pentru includerea lor n cerere, depistarea corect a relaiilor dintre ele i alegerea cmpurilor ce vor participa la rezultat:
Acionarea butonului OK va produce o cerere pe care o modificm manual, conform cerinelor prezentate anterior (modificrile operate de noi sunt scrise cu litere mici):
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 98
La paii urmtori includem toate cele trei coloane ale grupului n LOV i returnm valorile primelor dou elemente BL_CLIENTI.COD_FIRMA, respectiv BL_CLIENTI.NUME_FIRMA (folosind opiunea Look up Return Item). Pentru o afiare elegant, este recomandat redimensionarea spaiului pe care sunt afiate coloanele grupului. La pasul urmtor putem da un titlu ferestrei n care va fi afiat LOV-ul; urmtoarea caset permite specificarea numrului maxim de nregistrri care va fi afiat n fereastra LOV-ului i dac instruciunea select ce populeaz lista va fi executat la fiecare afiare sau o singur dat, la prima sa afiare (proprietatea Refresh Record Group Data Before Displaying LOV). Bifarea ultimei casete (Let the user filter records before displaying them) permite utilizatorului introducerea unui filtru la afiarea listei de valori. Click pe butonul Next ne conduce la pasul urmtor, unde specificm cror elemente le asignm lista de valori (de pe ce item-uri poate fi aceasta invocat). S selectm aici doar BL_CLIENTI.COD_FIRMA. Butonul Finish ncheie procesul de creare a listei de valori, al crei nume l vom modifica din Object Navigator (s l numim, de exemplu, LOV_CLIENTI). ncheind i aceast etap, rmne doar s rulm aplicaia i s admirm rezultatele obinute.
99 2.10. 2.10. Alte tipuri de elemente ntr-un formular Alte tipuri de elemente ntr-un formular n afara elementelor text, un formular poate conine i alte tipuri de elemente utilizate pentru introducerea datelor de ctre utilizator. Cel mai des folosite sunt casetele de validare (check boxes), grupurile de butoane radio (radio groups) i elementele list. 2.10.1. 2.10.1. Casete de validare Casete de validare O caset de validare este un obiect-interfa ce poate avea una din dou stri: bifat sau nebifat. Un astfel de obiect poate fi obinut prin convertirea unui obiect deja existent sau prin crearea unuia nou, n Layout Editor, selectnd butonul corespunztor: . S exemplificm crearea unui obiect caset de validare folosind prima metod. Elementul FACT_CLIENTI.IO poate lua una din dou valori (1 sau 0) i se preteaz, deci a fi transformat ntr-o caset de validare. Acionnd paleta sa de proprieti, o modificm pe cea care definete tipul elementului, alegnd check box:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 100 Unele dintre proprietile acestui nou obiect sunt comune cu cele ale unuia de tip text. La nodul Functional se afl, totui, cteva proprieti specifice: Value when Checked permite specificarea unei valori corespunztoare strii bifat. Atunci cnd o valoare egal cu cea specificat aici este ncrcat din tabel i atribuit casetei, aceasta va aprea bifat. Reciproc, atunci cnd utilizatorul va bifa caseta, valoarea asignat acestei proprieti va fi transferat coloanei pe care o mapeaz caseta. Value when Unchecked este echivalentul proprietii anterioare pentru cazul cnd caseta rmne nebifat. Check Box Mapping of Other Values se folosete n cazul n care pot fi ncrcate sau asignate casetei alte valori, n afara celor specificate prin cele dou proprieti anterioare i permite definirea modului n care orice alt valoare va fi procesat (Not Allowed, Checked sau Unchecked) 2.10.2. 2.10.2. Elemente list Elemente list Un element list este un obiect care afieaz o mulime predefinit de elemente, fiecare corespunznd unei valori specificate de programator. Exist trei tipuri de liste i n nici unul dintre cele trei nu se pot face selectri multiple: Poplist apare ca un cmp de tip text avnd ataat un buton reprezentat printr- o sgeat. Acionarea butonului va determina expandarea listei, sub forma:
Plist apare ca un dreptunghi care afieaz elementele listei. Cnd suprafaa de afiare nu este suficient, i va fi ataat automat o bar de derulare:
Combo Box apare ca un element text cu o sgeat n jos ataat, a crei apsare determin afiarea elementelor listei. Spre deosebire de listele de tip poplist, elementele combo box permit introducerea de ctre utilizator i a altor valori, n afara celor din lista de valori predefinite: .
101 O proprietate important, comun tuturor tipurilor de liste, este Elements in List, locul unde se definesc elementele listei i valorile corespunztoare acestor elemente. Click pe aceast proprietate va afia o caset de editare a acestor valori:
n partea superioar a casetei vor fi editate elementele listei (valorile afiate n runtime), iar n partea inferioar va fi definit, pentru fiecare element al listei, o valoare asociat lui. Celelalte proprieti ale listelor sunt cunoscute din capitolele anterioare.
2.10.3. 2.10.3. Grupuri de butoane radio Grupuri de butoane radio Un grup radio este un obiect format (din punct de vedere vizual) dintr-o mulime de butoane radio, reprezentnd toate valorile posibile pe care le poate lua acest element. Dintre acestea, unul i numai unul poate fi bifat (utilizatorului i se ofer posibilitatea unei selectri unice din mulimea de valori permise). Acest tip de element reprezint o alternativ la casetele de validare (n cazul cnd mulimea de valori permise are dou elemente) sau la liste (n cazul cnd aceast mulime are mai puin de 4 elemente). Pentru mulimi de valori cuprinznd mai mult de patru elemente, este recomandat folosirea listelor, afiarea unor grupuri de butoane radio att de numeroase aglomernd inutil suprafaa de afiare. Valoarea grupului de butoane radio poate fi sprecificat de utilizator (n timpul rulrii aplicaiei), prin proprietatea Initial value sau programatic. Se pot executa, de asemenea, interogri folosind acest tip de element. Un grup de butoane radio poate fi creat n oricare din modurile deja cunoscute de creare a elementelor Forms : Convertind un element deja existent la tipul radio group;
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 102 Crend un element nou n Layout Editor, caz n care acionm, n bara de instrumente, butonul corespunztor: Utiliznd, n Object Navigator, icon-ul Create ; aceast aciune va avea ca efect crearea unui element nou, de tipul (implicit) text, care va fi transformat n grup radio prin setarea corespunztoare a proprietii Item Type. Crend astfel grupul de butoane radio, acesta nu va fi afiat n Layout Editor pn n momentul cnd vom seta proprietatea Canvas, specificnd astfel canvas-ul n care elementul va aprea. Butoanele vor fi poziionate n colul din stnga sus al formularului, pasul urmtor fiind repoziionarea lor .
103 2.11. 2.11. Declanatori (trigger-i) trigger Declanatori ( -i) Declanatorii reprezint cea mai important modalitate de a aduga funcionalitate unui formular sau de a-i redefini funcionalitatea implicit. Un declanator are trei elemente definitorii: Tipul definete evenimentul care va declana trigger-ul; Codul definete aciunea efectuat de trigger (este scris n PL/SQL); Domeniul definete nivelul la care sunt ascultate evenimentele de ctre respectivul trigger. Numele trigger-ilor este format din dou componente, separate prin cratim: prefixul, care determina cnd (n raport cu evenimentul generator) se declaneaz trigger- ul i evenimentul, care determin tipul de aciune ce va declana trigger-ul. n funcie de prefix, trigger-ii se mpart n urmtoarele categorii: When-eveniment procesrii asociate implicit evenimentului i sunt adugate aciunile definite de trigger (de exemplu, When-validate-item se declaneaz imediat ce Forms valideaz datele dintr-un cmp; when-new-item-instance se declaneaz cnd focus-ul prsete cmpul curent) On-eveniment funcionalitatea definit implicit n cazul declanrii acestui eveniment este nlocuit cu aciunile definite n corpul trigger-ului (de exemplu, On-logon se declaneaz n locul conectrii la baza de date Oracle i este folosit, de exemplu, cnd se dorete conectarea programatic la alt baz de date); Pre-eveniment se declaneaz chiar nainte de eveniment; acetia preced trigger-ii when-eveniment sau on-eveniment i sunt folosii n scopul pregtirii obiectelor i a datelor pentru evenimentul ce se va declana; Post-eveniment se declaneaz imediat dup trigger-ii when-eveniment sau on-eveniment i este folosit, de obicei, pentru a valida datele sau pentru a efectua anumite aciuni bazate pe evenimentul ce doar a avut loc; Key se declaneaz la apsarea de ctre utilizator a tastei sau a combinaiei de taste creia i sunt asignai (amintii-v c cele mai multe interfee grafice ofer utilizatorului mai multe moduri pentru accesul la acelai obiect). Exist, n Forms Developer, peste 100 de declanatori predefinii, fiecare identificat unic prin numele su, format ntotdeauna conform sintaxei: prefix-eveniment. Evenimentele ce au loc la nivelul bazei de date pot declana, de asemenea, anumii trigger-i, dar acetia sunt diferii de cei din Forms. Exist, deci, trigger-i la
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 104 nivelul bazei de date i trigger-i la nivel de formular, acetia tratnd evenimente specifice formularului. Forms Builder-ul suport declanatoare definite de programator, dar acestea se vor executa doar atunci cnd sunt apelate dintr-un alt trigger sau dintr-o unitate de program, folosind sintaxa execute NumeTrigger. Codul unui trigger definete aciunile care vor fi efectuate atunci cnd acesta se declaneaz. Sintaxa este aceeai cu a unui bloc PL/SQL; dac lipsesc partea de declaraii i cea de tratare a erorilor, nu este necesar includerea corpului trigger-ului ntre begin i end. Secvenele de cod PL/SQL scrise pentru aplicaiile Forms cuprind adesea apeluri de subprograme. Subprogramele PL/SQL folosite n aplicaiile Forms sunt: funciile i procedurile predefinite (Built-in) sau cele definite de utilizator. Primele se gsesc n Object Navigator la nodul Built-in Packages, iar urmtoarele la nodul Program Units. Observai n figura de mai jos existena funciei tot_fact, creat anterior de noi. Funciile i procedurile built-in sunt grupate n pachete, conform funcionalitii lor i se apeleaz folosind sintaxa: NumePachet.NumeProcedura. Pentru cele aflate n pachetul standard numele acestuia poate fi omis.
Teoretic, aceste built-ins-uri pot fi folosite n orice subprogram PL/SQL sau trigger. Practic, unele dintre acestea ofer funcionaliti care nu sunt permise n anumii trigger-i. Acesta este motivul pentru care Built-ins-urile au fost mprite n dou categorii:
105 nerestricionate nu afecteaz navigaia logic sau fizic i pot fi apelate n orice trigger sau subprogram; restricionate afecteaz navigaia n formular i pot fi apelate doar n trigger-ii care nu genereaz navigaie intern. De exemplu, apelul unui built-in restricionat (cum ar fi go_block(numeBloc);) ntr-un trigger navigaional (ca when-new-item-instance, explicat mai jos) se compileaz cu succes, dar genereaz eroare la rulare. S ne amintim c am folosit pn acum cteva dintre built-ins-urile definite n pachetul standard: show_view, hide_view, exit_form, get_item_property, set_item_property. Forms Builder permite un mod rapid de inserare a prototipului unui built-in n secvena de cod curent, astfel: 1. poziionm cursorul n editorul PL/SQL exact n locul n care dorim s fie inserat apelul de subprogram; 2. expandm nodul Built-in Packages din Object Navigator i selectm procedura sau funcia pe care vrem s o utilizm; 3. selectm Edit Paste Name sau Edit Paste Arguments din meniul Forms Builder (prima opiune va genera inserarea doar a numelui, pe cnd cea de a doua va include att numele, ct i argumentele subprogramului); 4. prototipul built-in-ului va fi copiat la poziia curent a cursorului, iar utilizatorul va continua, dac este cazul, cu completarea numelor argumentelor. Variabilele folosite pentru stocarea valorilor n aplicaiile Forms sunt de dou tipuri: Variabile PL/SQL se definesc n seciunea declarativ i sunt disponibile pn la ncheierea execuiei blocului curent; nu sunt prefixate de : ; pot fi definite n pachete, caz n care se apeleaz prin NumePachet.NumeVariabila i sunt accesibile din toi trigger-ii care utilizeaz respectivul pachet; Variabile Forms Builder - sunt gestionate de Forms Builder i sunt vzute de PL/SQL ca variabile externe; pentru deosebirea lor de obiectele PL/SQL se impune prefixarea cu semnul : (exceptnd cazul n care numele lor este transmis ca parametru unui subprogram). Exist patru tipuri de variabile Forms Builder:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 106 Tipul variabilei Domeniul Scopul utilizrii Sintaxa Item (text, list, radio group etc.) Modulul curent i meniul ataat Interaciunea cu utilizatorul :NumeBloc.NumeItem Variabil global Toate modulele din sesiunea curent Stocarea valorilor pe parcursul unei sesiuni de lucru :GLOBAL.NumeVariabila Variabil sistem Formularul curent i meniul ataat Controlul mediului de lucru :SYSTEM.NUME_VARIABILA (numele acestor variabile se scriu cu majuscule) Parametri Modulul curent Transferul valorilor spre i de la modulul curent :PARAMETER.Nume Domeniul de aciune al unui trigger (numit n engleza trigger scope) este determinat de poziia sa n ierarhia obiectelor din Object Navigator:
Dup cum vedei n figura anterioar, exist trigger-i la nivel de: modul, bloc i element. Unii trigger-i nu pot fi definii sub un anumit nivel. Un trigger rspunde unui
107 eveniment asociat obiectului care deine acel trigger sau oricrui alt obiect care este deinut de primul. Putem avea, n formular, mai muli trigger-i cu acelai nume pe niveluri diferite; n mod implicit, pe un obiect se declaneaz un singur trigger de acelai tip: cel deinut de obiectul respectiv sau, n cazul n care nu exist, cel aflat pe nivelul ierarhic superior cel mai apropiat. Acest comportament este definit de proprietatea Execution Hierarchy, setat la valoarea Override. Alte valori posibile ale acestei proprieti sunt: Before (caz n care trigger-ul aparinnd obiectului curent se va declana naintea oricruia de acelai tip aflat pe nivelul superior cel mai apropiat) i After (caz n care trigger-ul curent se va declana dup oricare altul de acelai tip aflat pe nivelul superior cel mai apropiat). Cu ct un trigger este mai sus, cu att el ascult mai multe evenimente. S lum ca exemplu trigger-ul when-new-item-instance, care se declaneaz la prsirea de ctre focus a item-ului curent i navigarea ctre un alt item. Putem crea acest trigger (i oricare altul) n unul din mai multe moduri: Selectnd din meniul de context al obiectului cruia vrem s i asociem trigger-ul intrarea Smart triggers, care va afia un LOV cu trigger-ii cel mai des declanati de obiectul curent:
Selectnd, n Object Navigator, nodul Trigger al obiectului cruia vrem sa i atam trigger-ul i acionnd butonul Create. Rezultatul oricreia dintre aceste aciuni va fi afiarea instrumentului PL/SQL Editor, unde vom scrie secvena de cod ce va fi rulat la declanarea trigger-ului:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 108
Built-in-ul message(text) are ca efect afiarea mesajului n bara de stare a ferestrei Forms-ului. Apelarea de dou ori consecutiv a acestei proceduri are ca efect aglomerarea mesageriei i apariia pe ecran a unei casete de alert, rezultat mult mai vizibil utilizatorului. Dup ce ai scris codul asociat trigger-ului, nu uitai s acionai butonul care l compileaz i corectai eventualele erori. Putem crea trigger-ul when-new- item-instance la nivel de element, bloc sau modul. Dac vom scrie un singur trigger de acest tip pentru item-ul cod_firma, de exemplu, el se va declana doar atunci cnd focus- ul prsete acest item. Dac, ns, trigger-ul va fi asociat blocului bl_clienti, el va fi declanat de evenimentul de prsire a oricrui element aflat n acest bloc, iar dac acest trigger va fi asociat modulului, va fi declanat de mutarea focus-ului de pe oricare dintre elementele formularului. Putem, de asemenea, defini trei trigger-i when-new-item- instance, la toate cele trei niveluri (vezi figura anterioar), caz n care ordinea de declanare este stabilit de proprietatea Execution Hierarchy detaliat anterior. ncercai toate modalitile de definire a acestor trigger-i, apoi rulai, n fiecare caz, aplicaia i observai rezultatele! Am clasificat trigger-ii dup mai multe criterii, dar cel mai important este cel referitor la contextul n care se declaneaz. Astfel, exist:
109 trigger-i de validare se declaneaz cnd Forms Developer valideaz date dintr-un cmp sau nregistrare. Exist conceptul de unitate de validare, reprezentnd volumul maxim de date pe care operatorul le poate introduce nainte de a se efectua validarea lor (verificarea corectitudinii). Implicit, unitatea de validare este item-ul, ceea ce nseamn c Forms Developer iniiaz procesul de validare imediat ce se ncearc navigarea (programatic sau de ctre operator) ctre alt item; trigger-i tranzacionali apar ca rspuns a unor evenimente generate de interaciunea dintre formular i baza de date; trigger-i de interogare se declaneaz nainte (pre-query) sau dup (post- query) ce operatorul sau aplicaia execut o cerere; trigger-i navigaionali permit controlul asupra poziiei mouse-ului, definind, de asemenea, aciuni ce se vor declana atunci cnd focus-ul intr sau prsete un obiect; trigger-i de procesare a blocului de date se declaneaz la operaii de interaciune a formularului cu baza de date, creare de nregistrri noi, eliberare a celor existente n bloc; trigger-i master-detail au fost prezentai detaliat la crearea unui modul master-detail; acetia sunt: on-check-delete-master, on-clear-detail, on- populate-detail; trigger-i interface-event se declaneaz la evenimente specifice interfeei utilizator: when-mouse-click; when-mouse-down, when-button-pressed, when- list-changed, etc. trigger-i pentru interceptarea erorilor definesc aciunea ce trebuie ntreprins la apariia unui mesaj sau a unei erori (exemplu: On-Error, On-Message). 2.11.1. 2.11.1. Trigger-i de interogare (query triggers) Trigger-i de interogare (query triggers) Evenimentele asociate interogrilor asupra tabelelor de baz ale blocurilor de date pot fi controlate prin intermediul trigger-ilor de interogare, care permit personalizarea modului de lucru query. Pentru a ntelege tipologia acestor trigger-i, ar trebui s cunoastem modul n care are loc procesul de interogare a bazei de date de ctre formular. Cnd, ntr-un bloc de date, este iniiat o cerere (de ctre operator sau programatic) formularul parcurge urmtoarele etape: 1. aflat n modul enter-query, Forms Developer declaneaz trigger-ul pre- query, dac acesta exist; n cazul eurii, interogarea este abandonat; dac trigger-ul se termin cu succes, se trece la pasul urmtor;
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 110 2. Forms-ul construiete, apoi execut fraza select utilizat pentru interogarea tabelelor bazei de date; aceasta este creat folosind filtrele definite n blocul de date, filtre care sunt introduse de utilizator sau/i de trigger-ul pre-query; 3. o linie ntoars de cerere este ncrcat ntr-o nregistrare nou, care va fi marcat ca valid; 4. este declanat trigger-ul post-query; atenie: acest trigger se declaneaz pentru fiecare nregistrare n parte i este folosit, n general, pentru popularea elementelor non based-table, pentru efectuarea de calcule statistice. Dac acest trigger eueaz, nregistrarea curent este abandonat i eliminat din blocul de date. Se revine la pasul 3. 5. dac trigger-ul se termin cu succes, vor fi validate modificrile efectuate n nregistrarea curent. n afara celor doi trigger-i prezentai anterior, specifici modului de funcionare query al formularului, se pot declana i ali trigger-i, dac proprietatea Fire in Query Mode asociat lor este setat la valoarea Yes. n cazul cnd un trigger poate fi declanat n ambele moduri (normal i query), este util de detectat starea n care se afl formularul; n funcie de aceasta, vor fi efectuate aciuni diferite. Variabila sistem mode permite detectarea modului de lucru n care se gsete formularul, avnd una din urmtoarele trei valori: Valoarea variabilei :SYSTEM.MODE Semnificaie NORMAL Formularul se gsete n modul de procesare normal ENTER-QUERY Formularul este n modul enter-query, se ateapt introducerea criteriului pentru interogare QUERY Formularul se afl n etapa de procesare a nregistrrilor aduse de pe server S presupunem c dorim s crem propriul buton pentru lansarea de cereri asupra blocului bl_clienti. Vom crea un buton, numit cerere, care poate fi poziionat n orice canvas, dar va trebui s aparin blocului asupra cruia se va executa interogarea. Motivul este acela c, ntr-un trigger care se declaneaz n modul query nu avem voie s folosim anumite build-ins-uri, printre care i cele care execut navigarea (go_block, go_record, next_block, next_record etc.). n trigger vom folosi procedurile predefinite enter_query,
111 pentru comutarea n modul query i execute_query. Abandonarea modului query i comutarea la modul normal se face cu ajutorul build-in-ului abort_query. Dac butonul creat va fi n alt bloc dect cel care se dorete a fi interogat, acionarea lui nseamn schimbarea focus-ului pe blocul cruia i aparine butonul i interogarea acelui bloc. Crem, deci, butonul cerere n blocul bl_clienti, iar secvena de cod PL/SQL a trigger- ului when-button-pressed va fi urmtoarea:
2.11.2. 2.11.2. Trigger-i de validare Trigger-i de validare Forms Developer execut un proces de validare implicit, la diferite niveluri, pentru a se asigura c nregistrrile i elementele individuale respect anumite reguli (definite n paletele de proprieti ale elementelor, n trigger-i etc). Forms-ul declaneaz fenomenul de validare la nivel de: element (item) fiecare element are un status care indic validitatea acestuia. Dac un item a fost modificat i nu este nc marcat ca valid (validat), Forms efectueaz o validare a sa, verificnd dac valoarea este conform cu condiiile impuse prin paleta de proprieti a elementului (format mask; required; data type; range; validate from list). Aceste verificri preced declanarea trigger-ului when-validate-item. nregistrare (record) la ncercarea (iniiat programatic sau de ctre utilizator) de a prsi o nregistrare, este verificat status-ul acesteia. n cazul cnd nu a fost validat, este verificat status-ul fiecrui item, apoi este declanat un eventual trigger when-validate-record. Dup ce toate aceste etape sunt parcurse, nregistrarea este marcat ca valid;
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 112 bloc sau modul toate nregistrrile aflate sub acest nivel vor fi validate (de exemplu, la efectuarea unui commit). Unitatea de validare definete maximul de date ce pot fi introduse nainte de declanarea automat a procesului de validare. Implicit, aceasta este setat la nivel de item, dar poate fi definit, de asemenea, la nivel de record, block sau form. Procesul de validare se declaneaz la navigarea din unitatea de validare (programatic, printr-un trigger, sau de ctre utilizator) sau la rularea built-in-ului enter. Acesta este un subprogram creat pentru forarea imediat a validrii la nivelul la care se afl definit. De exemplu, crearea unui buton pentru care trigger-ul when-button-pressed invoca built-in-ul enter va efectua validarea imediat a elementului pe care se afla focus- ul. Odat cu aducerea de pe server a nregistrrilor ce sunt folosite n formular, Forms-ul ncarc adiional cteva pseudo-coloane (numite flag-uri interne), cum ar fi row_id (un numr ce definete unic nregistrarea n baza de date) i valid (reprezentnd status-ul obiectului curent). Astfel, Forms-ul urmrete cu uurin aciunile efectuate de utilizator. Pentru a determina dac validarea datelor trebuie sau nu efectuat, Forms-ul utilizeaz statutul nregistrrii sau al item-ului curent. Astfel, statutul unui item poate avea una din valorile: Status Explicaie NEW La crearea unei nregistrri noi, fiecrui item i este acordat acest status. CHANGED Un item este marcat cu acest status dac valoarea sa este modificat (programatic, de ctre un trigger, sau de ctre utilizator); de asemenea, n cazul n care un item este modificat, toate item-urile aparinnd aceleiai nregistrri vor fi marcate ca changed. VALID Forms-ul marcheaz un item ca valid dac: toate item-urile din nregistrarea ncrcat din baza de date sunt marcate ca fiind valide; procesul de validare al item-ului curent s-a terminat cu succes; dup o instruciune post sau commit terminat cu succes; fiecare item dintr-o nregistrare duplicat motenete status-ul de la surs
113 Validarea are loc, dup cum precizam anterior, i la nivel de nregistrare. Orice nregistrare primete un statut, dup regulile:
Status Explicaie NEW La crearea unei nregistrri noi, acesteia i este acordat statutul new. CHANGED Ori de cte ori un element dintr-o nregistrare este marcat ca changed, acest statut i este acordat ntregii nregistrri. VALID Forms-ul marcheaz o nregistrare ca valid dac: toate item-urile din nregistrare au fost validate cu succes; dup o instruciune post sau commit terminat cu succes; o nregistrare duplicat motenete status-ul de la sursa sa. Statutul unui element poate fi modificat programatic de ctre trigger-i care conin built-ins-uri ce influeneaz procesul de validare: clear_block, clear_form, exit_form primul parametru al acestor proceduri indic modul n care vor fi operate modificrile fcute atunci cnd un bloc sau un modul sunt reiniializate, respectiv cnd formularul se nchide (n cazul procedurii exit_form). Atunci cnd este folosit valoarea NO_VALIDATE, eventualele modificri nu vor fi operate. Absena unui parametru va produce afiarea unei casete de dialog care ofer posibilitatea alegerii unei opiuni de salvare. Item_is_valid se pot folosi procedurile get_item_property i set_item_property pentru a afla sau modifica proprietatea item_is_valid a unui element. Acest mod de setare a status-ului unui element nu poate fi aplicat i nregistrrilor. Totui, setnd status-ul fiecrui item al respectivei nregistrri, avem controlul asupra status-ului nregistrrii nsei. Enter este un built-in care foreaz validarea imediat a unitii curente de validare; Validate (domeniu) produce validarea imediat la nivel de domeniu, care poate lua una din valorile: default_scope, block_scope, record_scope, item_scope.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 114 2.11.3. 2.11.3. Trigger-ii navigaionali Trigger-ii navigaionali Forms Builder ofer o varietate de modaliti pentru deplasarea focus-ului. Aceast aciune, iniiat de utilizator sau generat programatic, poart numele de navigare. Pentru a defini statutul navigaional al unui modul a fost definit noiunea de unitate navigaional: aceasta este un obiect intern, invizibil, folosit pentru a reine poziia curent a focus-ului i poate fi setat la una din valorile (se respect ierarhia urmtoare): outside the form (n afara formularului), form, block, record, item. Cnd se navigheaz n afara unui obiect, se schimb unitatea navigaional; Forms-ul parcurge ierarhia precedent pn cnd elementul pe care se afl cursorul este atins. Spre deosebire de unitatea navigaional, cursorul este un obiect vizibil, extern, care indic poziia curent a focus-ului. n timpul procesului navigaional, Forms-ul prsete un obiect i intr ntr-un altul. Ptrunderea ntr-un obiect nseamn modificarea unitii navigaionale de la obiectul anterior ctre cel curent. Forms-ul nu va deplasa cursorul pn cnd unitatea navigaional nu ia noua valoare. Dac navigarea eueaz, Forms-ul modific unitatea navigaional la vechea valoare. Dac aceast tentativ eueaz, Forms-ul nchide formularul. Cursorul rmne pe poziia iniial pn cnd unitatea navigaional devine stabil. Cnd utilizatorul iniiaz rularea unui formular, acesta observ cursorul poziionat pe primul item din primul bloc navigaional (n ordinea din Object Navigator). Accesarea primului item al formularului a implicat, ns, desfurarea unor procese navigaionale complexe; adiional navigaiei externe (care poate fi observat de utilizator) are loc i o navigare intern, care const n: intrarea focus-ului n formular; intrarea focus-ului n bloc; intrarea pe prima nregistrare; intrarea n item. Prsirea item-ului curent i accesarea unui alt item, aparinnd altei nregistrri, implic urmtoarele aciuni: prsirea item-ului curent; prsirea nregistrrii curente; intrarea focus-ului pe noua nregistrare; intrarea focus-ului pe item-ul dorit. Modul n care se realizeaz navigarea se poate defini cu ajutorul proprietilor obiectelor. Au fost detaliate anterior intrri din paletele de proprieti cum ar fi:
115 la nivel de modul: Mouse Navigation Limit (determin ct de departe relativ la item-ul curent poate naviga utilizatorul cu mouse-ul), First Navigation Block (neprecizarea unei valori pentru aceast proprietate va determina navigarea, la iniierea formularului, n primul bloc, n ordinea n care sunt aezate n Object Navigator); la nivel de bloc de date: Navigation Style, Previous Navigation Data Block, Next Navigation Data Block; la nivel de item: Enabled, Keyboard Navigable, Mouse Navigate, Previous Navigation Item, Next Navigation Item. Navigarea dintr-un formular este influenat, n afara proprietilor specifice ale obiectelor, i de trigger-ii navigaionali, care se mpart n dou categorii: Post- i Pre- cnd ne deplasm din obiectul x n obiectul y, pentru primul se declaneaz trigger-ul post-, iar pentru cel de al doilea trigger-ul pre-. Acetia nu se declaneaz dac sunt definii pentru un nivel ierarhic inferior unitii curente de validare. La euarea oricruia din aceti trigger-i focus-ul se ntoarce pe obiectul prsit anterior. When-new-<obiect>-instance se declaneaz imediat ce focus-ul este pe obiectul <obiect> i unitatea de navigare este stabil. Adesea poate avea loc, n timpul procesului navigaional, un fenomen interesant: s presupunem c, la navigarea din obiectul x spre obiectul y, trigger-ul pre- definit pentru al doilea obiect eueaz. Atunci unitatea navigaional tinde s se ntoarc la obiectul x. Dac acesta are un trigger pre- definit i care eueaz, cursorul logic nu are unde s se ntoarc i este generat o eroare. Euarea n lan a dou trigger-e se numete capcana navigrii. Procesul de navigare poate fi iniiat i programatic, folosind built-ins-uri restricionate (acelea care afecteaz navigarea), cum ar fi: go_form, go_block, next_block, up (navigheaz ctre instana item-ului curent aflat n nregistrarea anterioar), down, next_set etc. Acestea nu pot fi, ns, utilizate n trigger-ii pre- i post-. 2.11.4. 2.11.4. Trigger-ii tranzacionali Trigger-ii tranzacionali Procesul tranzacional este iniiat la apsarea de ctre utilizator a butonului Save (sau, echivalent, selectarea opiunii Action Save din meniu) sau la apelarea, ntr-un trigger, a procedurii commit_form. La ncercarea de a salva modificrile fcute de utilizator ntr-un formular, se declaneaz o secven de aciuni care poate fi algoritmizat dup urmtoarea schem: 1. validarea formularului;
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 116 2. declanarea trigger-ului pre-commit; 3. validarea blocurilor de date (n ordinea apariiei acestora n Object Navigator); 4. executarea operaiilor DML: a. n cazul unui delete: i. declanarea trigger-ului pre-delete; ii. tergerea rndului din tabela de baz sau declanarea trigger-ului On-Delete; iii. declanarea trigger-ului Post-delete; b. n cazul unui insert: i. verific proprietatea Copy Value from Item; ii. declaneaz trigger-ul pre-insert; iii. verific unicitatea nregistrrii; iv. insereaz rndul n tabela de baz sau declaneaz trigger-ul on- insert; v. se declaneaz trigger-ul post-insert c. n cazul unui update: i. se declaneaz trigger-ul pre-update; ii. se verific unicitatea nregistrrii; iii. se modific rndul corespunztor din tabela de baz sau se declaneaz trigger-ul on-update; iv. se declaneaz trigger-ul post-update; 5. se declaneaz trigger-ul post-form-commit; dac operaia urmtoare este commit, atunci: 6. se execut o comanda SQL commit; 7. se declaneaz trigger-ul post-database-commit. Enumerm n tabela urmtoare cteva din caracteristicile celor mai uzitai trigger-i tranzacionali:
Trigger-i Caracteristici Pre-commit Se declaneaz o singur dat, nainte ca blocurile de date s fie procesate. Verificarea privilegiilor utilizatorului.
117 Pre-delete S presupunem c utilizatorul vrea s tearg o nregistrare care are fii; server-ul va returna o eroare, dar putem preveni aceast situaie cutand eventualii fii i tergndu-i prin acest trigger. Pre-insert Dac vrem s populm un item dintr- o secven, putem seta proprietatea Initial Value cu numele secvenei, caz n care de fiecare dat cnd rulm formularul valoarea curent a secvenei se incrementeaz; putem preveni aceast situaie folosind acest trigger. Doar la declanarea lui va fi incrementat secvena. Pre-update Permite implementarea regulii cheii externe. Putem simula un update n cascad, n trigger actualiznd fiii, apoi, n formular, tatl. Post-DML (update, delete, insert) Se declaneaz o singur dat pentru fiecare nregistrare marcat pentru o operaie DML; trigger-ii pre-DML sunt folosii i pentru jurnalizare (memorarea, ntr- o alt tabel, a operaiilor DML efectuate asupra tabelei de baz).
On-DML Se declaneaz pentru fiecare nregistrare marcat pentru insert, update sau delete, nlocuind instruciunile DML standard cu cele precizate n codul trigger-ului. De obicei, includ un apel la built-ins- urile insert_record, update_record, delete_record. Post-forms- commit Se declaneaz o singur dat, dup ce blocurile de date sunt procesate, dar nainte de execuia instruciunii SQL commit. Post-database- commit Se declaneaz o singur dat, dup executarea unui SQL-commit.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 118 Desigur, utilitatea acestor trigger-i se definete programatic, n funcie de cerinele utilizatorului, care pot fi cu totul altele dect cele prezentate n tabelul anterior. S premiem acum cititorii care au avut rbdarea necesar atingerii acestei ultime pagini a acestei pri a lucrrii de fa cu cateva task-uri: 1.. Ce efect credei c are definirea, la nivel de bloc de date, a trigger-ului on- delete coninnd doar instructiunea null;? 2.. Ce efect va avea definirea, la nivel de bloc bl_clienti, a trigger-ului:
3.. Creai un canvas de tip toolbar vertical, unde aezai butoanele necesare n formular. Creai un buton la a crui apsare formularul va intra n modul enter-query. Utilizatorul va introduce criteriul de cutare, butonul i va schimba eticheta, iar acionarea din nou a sa va avea efectul execute_query. Dublu click pe codul unei facturi va determina apariia unui canvas de tip stacked care va conine informaii referitoare la datele respectivei facturi:
119
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 120
3. 3. Oracle9i Reports Developer Oracle9i Reports Developer 3.1. 3.1. Introducere Introducere Raportarea este procesul de oferire a informaiei ctre clieni ntr-o form accesibil, bine structurat. Oracle9i Reports Developer reprezint soluia pentru publicarea att pe web, ct i pe hrtie a oricrui tip de date, din orice surs, n orice format. Cu Oracle9i Reports nu efectum modificri n tabele, ci doar extragem datele n scopul prelucrrii lor i a afirii ntr-o form atrgtoare. ntr-un mediu bazat pe Internet, clienii ateapt un rspuns prompt la cererile lor. Una dintre modalitile de reducere a timpului de ateptare este dezvoltarea rapid a rapoartelor, fr necesitatea scrierii a sute de linii de cod sau a formatrii manuale a structurilor. n Oracle9i Reports ntregul mediu de dezvoltare este bazat pe instrumente de tip wizard, urmate de generarea automat de cod i posibilitatea transmiterii ctre browser a rapoartelor n formate diverse: Hypertext Markup Language (HTML) cu Cascade Style Sheets (CSS), Extensible Markup Language (XML), Rich Text Format (RTF), PostScript, Portable Document Format (PDF). Productivitatea muncii programatorului este mbuntit i prin posibilitatea construirii, n afara modulelor de tip raport, a nc dou tipuri de module: template-uri (un schelet coninnd reguli generale de afiare a datelor ntr-un raport) i biblioteci de programe PL/SQL (conin uniti de program ce pot fi apoi apelate din raport). Tot mai muli utilizatori caut informaia n primul rnd pe Internet. Totui, printarea informaiei are importana sa de necontestat. Aceste dou modaliti de publicare sunt complementare una alteia, neexcluzndu-se reciproc. n majoritatea cazurilor, nu putem afirma despre un fiier HTML care arat excelent ntr-o pagin web c va avea acelai aspect i la printare, dup cum macheta unui raport creat pentru a fi printat nu este satisfctoare pentru afiarea ntr-un browser. Instrumentul Reports Builder, care permite proiectarea rapoartelor, construiete, n acelai timp, dou machete: una specific web-ului, cealalt n scopul printrii. Macheta web este optimizat pentru HTML, pe cnd macheta paper este proiectat pentru formatele PDF i PostScript. Avantajul major const n faptul c modelul de date este unic, productivitatea fiind astfel mbuntit. Ca i n cazul formularelor, raportul poate fi construit (cu ajutorul instrumentului Reports Builder) i testat pe maina client (amintii-v, trebuie startat instana OC4J), apoi transferat pe server-ul de aplicaii, care, fizic, se poate afla pe alt calculator. Orice browser acceseaz raportul, aflat pe Oracle Application Server, printr-o adres web. Raportul va accesa datele, aflate pe server-ul de baze de date. Algoritmul folosit pentru
121 crearea, testarea i rularea aplicaiilor Oracle9i Reports Developer este similar cu cel utilizat de Oracle9i Forms Developer. Oracle9i Reports Developer este, deci, o colecie de programe folosite pentru a uura munca de raportare. Componenta Report Builder permite definirea modelului de date pentru raport, crearea i testarea machetelor web i paper, posibilitatea atarii de coninut dinamic unui raport HTML prin ataarea de marcaje Java Server Page (JSP) etc. Componenta Oracle9iAS Reports Services ofer mediul pentru rularea, distribuirea i publicarea aplicaiilor Oracle9i Reports Developer. Executabilele incluse n Reports Developer au fost denumite n Windows conform regulii rw<?>.exe i sunt prezentate pe scurt n tabelul urmtor:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 122 Numele fisierului executabil Numele aplicaiei Descriere rwbuilder Reports Builder Creeaz i rafineaz raportul. rwrun Reports runtime Mediu runtime pentru testare. D e v e l o p e r
rwconverter Reports Converter Convertete raportul n diferite formate de stocare. rwserver Reports Server Instaleaz/apeleaz componente de pe Internet Application Server (IAS) care gestioneaz rapoartele ce se vor executa. rwclient Reports Client Acceseaz server-ul de rapoarte i trimite acolo linia de comand pentru executarea raportului curent. rwrqm Reports Queue Manager Vizualizeaz i programeaz la ore stabilite execuia rapoartelor. rwservlet Reports Servlet Ruleaz raportul pentru web, asigurnd procesarea server-side ce const, de obicei, n accesarea bazei de date. R e p o r t s
S e r v i c e s
rwcgi Reports CGI Este meninut doar pentru compatibilitatea cu versiunile anterioare; ofer o conexiune ntre server-ul web i Reports Services.
Crearea unui raport include definirea a dou elemente (distincte n faza de proiectare) ce vor determina, la rulare, coninutul i aspectul raportului. Cele dou pri logice ale unui raport sunt: Modelul de date, constnd n datele ce vor fi afiate la ieire i structura lor;
123 Macheta (layout), ce definete modul de afiare a datelor la ieire. Macheta poate fi de tip paper (utilizat pentru rapoartele destinate printrii) sau de tip web (utilizat pentru rapoartele ce se vor publica pe web). Macheta de tip web are n spate cod surs (HTML i JSP). Un raport poate conine: Un model de date i o macheta paper; Un model de date i o macheta web; Un model de date, o macheta web i una paper.
3.2. 3.2. Proiectarea rapoartelor Proiectarea rapoartelor 3.2.1. 3.2.1. Componentele Reports Builder Reports Builde Componentele r Aplicaia Report Builder include patru componente: 1. Object Navigator; 2. Report Editor; 3. Property Inspector; 4. Editorul PL/SQL. ncercai s le identificai n captura de ecran urmtoare:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 124
Object Navigator Acesta const, ca i n cazul produsului Forms Builder, ntr-o prezentare ierarhic a tuturor obiectelor aplicaiei, permind accesarea i manipularea lor rapid. Toate nodurile din Object Navigator, mai puin Database Objects, conin obiecte aflate pe parte de client. La crearea unui raport nou (prin click pe butonul marcat cu o cruce verde i aflat n partea superioar a barei de instrumente), acestuia i va fi automat asignat numele ModuleN, N fiind numrul su. Numele raportului nu poate fi modificat la fel ca n cazul formularelor. Salvarea raportului va produce modificarea automat a numelui su n Object Navigator acordndu-i-se aceeai valoare cu numele fiierului. Obiectele coninute n raport se mpart n mai multe categorii (reflectate i n ierarhia din Object Navigator):
125 Raport se afl proprieti generale, legate de setrile pentru previzualizare, dimensiuni ale paginilor etc.; Data Model obiectele aflate la acest nivel definesc datele publicate n raport i structura lor. Exist 11 parametri-sistem care ateapt s fie setai, se pot defini parametri-utilizator, sunt coninute frazele select, mpreun cu eventualele grupuri returnate de acestea. Ierarhia de la nodul Groups indic tipul raportului: master-detail sau simplu. Putem avea mai multe fraze select, dar acestea trebuie conectate logic; n acest scop exist nodul Data Links. Web Layout bazndu-se pe frazele select, Reports Builder construiete dou machete: Paper Layout i Web Layout, n spatele creia este cod HTML mpnat cu marcaje JSP; Paper Layout obiectele aflate sub acest nod definesc formatul raportului: poziionarea i frecvena de apariie a datelor, text i elemente grafice; Paper Parameter Form definete apariia n runtime a unui formular pentru parametri; crem, de exemplu, un raport care s afieze toate comenzile unui client. La rularea raportului va aprea o form de parametri, n care utilizatorul va introduce codul clientului, iar raportul va afia doar comenzile acestuia. Astfel, este creat un singur raport i rulat pentru mai multe seturi de date; Report Triggers conine proceduri PL/SQL care se vor declana n timpul populrii cu date i al formatrii lor. Reports Builder conine cinci trigger-i, care sunt: o Before Report trigger; o After Report trigger; o Between Pages trigger; o Before Parameter Form trigger; o After Parameter Form trigger. Program Units Attached Libraries . Report Editor Acesta este un utilitar care conine cinci moduri de vizualizare utilizate pentru gestionarea modelului de date i a machetelor raportului. Fiecare din acestea poate fi accesat printr-un buton aflat n colul din stnga sus al ferestrei editorului de rapoarte sau din meniul Reports Builder, selectnd View Change View, apoi modul de vizualizare dorit. S le prezentam pe scurt, urmnd s revenim asupra lor, n ordinea apariiei n fereastra editorului de rapoarte:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 126 Data Model (nu confundai modul de vizualizare Data Model cu nodul Data Model din Object Navigator!) const n reprezentarea simbolic a structurilor de date afiate n raport. Sunt marcate special tipul obiectelor i relaiile dintre acestea. Obiectele aflate aici nu vor aprea ca atare n raport, la rularea acestuia, dar vor influena macheta. Web Source acest mod permite vizualizarea codului surs care produce publicarea pe web a raportului. Dup cum precizam, la definirea cu ajutorul instrumentului Report Wizard a raportului se poate alege crearea ambelor machete (web i paper), ns modificarea ulterioar a oricreia dintre acestea nu se va reflecta i n cealalt machet, care va trebui modificat manual. Paper Layout reprezint o zon de lucru n care putem defini modul de afiare a datelor. Se lucreaz cu obiecte specifice machetelor, cum ar fi: cadre, cadre repetitive, cmpuri, ancore i obiecte grafice. La rulare, Reports Builder folosete aceast machet ca pe un schelet de baz, pe care l expandeaz astfel nct datele s poat fi poziionate n el. Paper Design este un mod de vizualizare care ofer un preview al raportului i permite manipularea coninutului efectiv al acestuia (acest mod de vizualizare este ideal pentru a modifica, de exemplu, limea unei coloane). Paper Parameter Form permite crearea, cu ajutorul instrumentului Paper Parameter Builder, a unui formular unde utilizatorul va introduce proprii parametri sau va fi invitat s aleag valorile dintr-un LOV.
127 Reamintim c Data Model este responsabil cu partea logic a raportului, livrnd informaia, n timp ce paper layout i web layout se ocup de modul de afiare a acesteia. Legtura dintre modelul de date i machet se face la rularea raportului n modul urmtor: pentru fiecare grupare din Data Model, Report Builder construiete n machet cte un cadru repetitiv (repeating frame) i reciproc, orice cadru repetitiv are la baz o grupare. n cadrul unui repeating frame avem cmpuri (fields). Ele sunt populate conform instruciunii select definite la acest pas. Property Inspector Toate obiectele din Object Navigator au cte o palet de proprieti specifice, care descriu comportamentul obiectului. Paleta de proprieti a oricrui obiect se obine apsnd tasta F4, atunci cnd obiectul este selectat sau alegnd opiunea Property Inspector din meniul de context al obiectului. Editorul PL/SQL Acest instrument este identic cu cel folosit n Forms Builder i permite scrierea i compilarea de cod PL/SQL asignat unei proceduri definite de utilizator sau unui trigger. 3.2.2. 3.2.2. Instrumente de tip wizard wizar Instrumente de tip d Indiferent de modul de stocare a raportului, definiia acestuia trebuie s conin un model de date, o surs web i/sau o machet pentru printare, uniti de program i formulare pentru parametri. Modelul de date i unitile de program sunt comune ambelor machete (web i paper). n Oracle9i Reports avem mai multe posibiliti pentru a crea un raport: folosind Reports Builder; definind modelul de date i/sau macheta ntr-un fiier XML. Ne vom opri asupra primei posibiliti i ne vom uura munca folosind instrumentele de tip wizard incluse n Report Builder, apoi vom rafina manual raportul obinut. Reamintim faptul c orice modificare manual ntr-una din machetele paper sau web nu se va reflecta i n cealalt. Sa purcedem, deci, la construirea unui raport. Din aceleai considerente cu cele prezentate n capitolul Oracle9i Forms Developer trebuie startat instana OC4J (care creeaz un mediu virtual ce permite rularea rapoartelor, n vederea testrii), apoi aplicaia Report Builder, al crei shortcut poate fi gsit la meniul Start al Windows-ului:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 128
Invocarea Reports Builder-ului va produce afiarea unei casete de dialog cu opiuni privind modul de creare a raportului:
129 Una dintre cele mai uzitate modaliti este folosirea instrumentului Report Wizard, urmat de rafinarea manual a raportului. S lsm, deci, opiunea Use the Report Wizard bifat i s continum. Report Wizard ofer o interfa de tip step-by-step pentru crearea unui raport. Prima sa caset de dialog cuprinde un mesaj introductiv i poate fi inhibat prin deselectarea casetei de validare Display at Startup. Pagina urmtoare culege informaie referitoare la modul de publicare a raportului, n funcie de care creeaz machetele paper, web sau pe amndou. Acionarea butonului Next determin afiarea casetei Report Style, n care specificm titlul i tipul raportului ce va fi creat:
n campul Title completm textul titlului raportului, aa cum vrem s apar la afiare (partea de formatare a sa se definete ulterior), apoi selectm un buton din grupul radio ce permite specificarea tipului raportului ce va fi creat. Observai faptul c, la acest moment, ultimele trei opiuni (legate de etichete i scrisori) sunt inhibate, deoarece am ales i generarea machetei web, unde nu are sens publicarea a astfel de documente. n cazul cnd, n caseta de dialog anterioar (Layout Type) am fi ales Paper Layout Only am fi avut, la acest pas, i ultimele trei posibilitati disponibile. Pentru o nelegere mai bun a acestor tipuri de rapoarte, s reamintin c se lucreaz cu un model de date, bazat pe o fraz select executat n runtime i care are ca efect ncrcarea de pe server a setului de date necesar raportului. Aceste date sunt afiate conform unei machete. Report Builder organizeaz datele, crend grupuri. La scrierea unei instruciuni select pe o tabel este creat automat un grup, care conine coloanele selectate n cerere. Se pot defini grupuri adiionale (pentru a crea niveluri de diviziune ale raportului) manual sau folosind Report Wizard, opiunile group-above i group-left.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 130 Revenim la caseta de dialog ce permite determinarea tipului raportului. Exist, dup cum observai, mai multe tipuri de rapoarte: tabulare cel mai des ntlnite; fiecare coloan a raportului corespunde unei coloane dintr-o tabel; group-left mparte rndurile din tabel n submulimi, n fiecare submulime fiind coninute rndurile pentru care valoarea uneia dintre coloane este aceeai; se folosete pentru evitarea repetrii afirii informaiei; group-above conine dou sau mai multe grupuri de date; pentru fiecare valoare din grupul master, sunt afiate valorile corespunztoare din grupurile detail; matrix un raport de tip matricial conine un rnd de etichete, o coloan de etichete, iar informaia aflat la intersecia acestora este corelat cu semnificaia etichetelor. O caracteristic important a acestui tip de rapoarte este acela c numrul de coloane nu este cunoscut pn la ncrcarea datelor din baza de date; matrix with groups este un raport de tip group-above cu o matrice pentru fiecare valoare a grupului master. S construim un raport tabular lsnd, deci, bifat primul buton al grupului radio, tabelar. Urmtoarea caset de dialog, Data Source Type, permite specificarea sursei de date a raportului. Vom construi un raport pe baza unei instruciuni select, deci selectm opiunea SQL Query i apsm butonul Next, care permite definirea sursei de date:
131
Pentru a accesa datele din baza de date trebuie s ne conectm la aceasta (observai butonul Connect), apoi putem tasta fraza select ce va popula raportul. Pentru utilizatorii nu prea familiarizai cu limbajul SQL avem la dispoziie un utilitar pentru automatizarea crerii cererilor, numit Query Builder. Invocarea sa (prin acionarea butonului corespunztor) va determina apariia unei casete ce conine toate tabelele din schema utilizatorului curent, n vederea selectrii acelora care vor participa la fraza select:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 132 S crem un raport simplu, care va afia toate produsele aflate n stoc. Selectm tabela stoc, apoi acionm butonul Include. Procedm la fel cu toate tabelele ce vor oferi date n vederea publicrii, apoi dm click pe butonul Close. Urmtoarea fereastr conine toate tabelele selectate la pasul anterior i permite specificarea coloanelor care vor intra n cerere i a relaiilor dintre tabele (n cazul rapoartelor master-detail) . Putem da dublu click pe numele tabelei, rezultatul fiind selectarea tuturor coloanelor:
Dm click pe OK i automat Query Builder va copia sintaxa cererii n Report Wizard:
133
Caseta urmtoare de dialog, numit Fields, permite selectarea cmpurilor care vor participa la output. Cmpurile selectate n zona Available Fields pot fi mutate n zona cmpurilor ce vor fi afiate (Displayed Fields) prin acionarea butonului >. Pentru selectarea rapid a tuturor coloanelor se apas butonul >>. Ordinea apariiei cmpurilor n zona Displayed Fields va determina ordinea apariiei coloanelor raportului n runtime. ntr-un raport tabelar, acestea vor fi aezate n ordinea specificat, de la stnga la dreapta. Folosind tehnica drag putem modifica ordinea de apariie a coloanelor n raport. Cmpurile rmase n zona Available Fields pot fi referite n raport (ele se numesc ascunse) i folosite n calcule statistice sau n codul trigger-ilor. Acionnd butonul Next ajungem la urmtoarea caset de dialog, Totals, unde putem crea totaluri bazate pe funciile statistice SQL standard afiate de Report Wizard:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 134
Toate funciile, mai puin count, folosesc valori numerice. Acionnd butonul corespunztor funciei dorite, aceasta va fi aplicat cmpului selectat n zona Available Fields. Wizard-ul va crea cte un total la fiecare nivel al raportului, adic: pentru ntregul raport i pentru fiecare grup n parte, n cazul existenei acestora. Urmtoarea caset de dialog permite ataarea unor etichete cmpurilor, precum i setarea dimensiunii acestora, iar ultimul pas al wizard-ului ofer posibilitatea alegerii unei machete pentru publicarea raportului, dintr-o serie de template-uri disponibile. Utilizatorul i poate defini propriile machete, pe care le va salva ca template-uri n vederea aplicrii lor ulterioare asupra altor rapoarte. Acionarea butonului Finish va determina invocarea utilitarului Report Editor, n modul Paper Design, care permite o vizualizare a raportului:
135
Este momentul s salvm rezultatul muncii noastre de pn acum. Ceea ce vom salva de fapt nu este raportul, aa cum apare el n runtime, ci definiia sa. La fiecare rulare va fi executat fraza select ce va popula raportul, iar informaia returnat de aceasta va fi afiat conform specificaiilor machetei. S selectam, deci, din meniul Report Builder opiunea File Save. Aceast aciune va invoca o bine-cunoscut caset de dialog specific mediului Windows, ce permite alegerea locului unde va fi stocat raportul, a numelui su i a formatului n care este salvat:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 136
Formatul implicit este .jsp. Remarcai n LOV-ul afiat anterior existena formatului .rdf, specific versiunii 6 a produsului Oracle Reports i introdus n aceast versiune doar pentru compatibilitatea cu cele anterioare.
3.3. . Report Editor 5 moduri de vizualizare a raportului Report Editor ortului 3.3 5 moduri de vizualizare a rap Macheta raportului fiind salvat, ne ntoarcem la utilitarul Report Editor, unde vom analiza modurile de vizualizare a raportului i modificrile ce se pot efectua n fiecare din acestea. Primul, n ordinea apariiei butoanelor care le apeleaz, este modul ce permite vizualizarea modelului de date:
137
A fost creat o cerere, numit implicit Q_1, iar ea a generat un grup, numit G_1. (Fiecare cerere genereaz un grup propriu!) Toate coloanele returnate de fraza select se afl n grupul G_1. Coloanele singulare (create de utilizator pentru calcule statistice) se afl n afara grupului. Observai sgeata orientat n sus i aflat n stnga fiecrui element al grupului G_1. Aceasta este adaugat implicit i determin o clauza order by. Pentru creterea vitezei de rulare a raportului este recomandat anularea acestei clauze pentru coloanele unde ea nu este necesar (setnd proprietatea Break Order a coloanei la valoarea dorit: Null, Ascending sau Descending). Proprietile obiectului Q_1 i ale grupului generat de acesta pot fi modificate prin intermediul inspectorului de proprieti. Proprietile specifice unei cereri pot fi observate n figura urmtoare:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 138 Acesta este locul de unde putem modifica numele cererii, tipul i numrul maxim de rnduri returnate de aceasta (opiune extrem de util n cazul n care suntem n faza de testare a raportului, iar baza de date conine mii de nregistrri), precum i fraza select. Este recomandabil ca ntr-un model de date complex numele atribuite automat cererilor s fie modificate de ctre utilizator, pentru o mai bun nelegere a acestora. Comentariile pot fi inserate la proprietatea Comments sau direct n fraza SQL, folosind delimitatorii: utilitarului Query Builder, coninutul -- pentru comentariu la sfarsitul liniei curenta; /* comentariu */ pentru comentarii multi-linie. Coloanele returnate de fraza select nu pot fi terse cu tasta Del n Data Model. Doar coloanele create de utilizator pot fi terse n acest mod; pentru primul caz, trebuie modificat chiar fraza select: la efectuarea unui click pe proprietatea SQL Query Statement vom obine aceeai caset de dialog cu cea ntlnit n Report Wizard, n care utilizatorul poate modifica manual sau cu ajutorul cererii:
Aceeai caset de dialog poate fi invocat i dnd dublu click pe numele cererii, Q_1.
139 Urmrii, n figura de mai jos, legtura dintre elementele modelului de date i cmpurile afiate la rularea raportului: obiectul Q_1 genereaz o fraz select ce populeaz grupul de nregistrri G_1. Fiecare nregistrare ncrcat din baza de date va deveni o instan a grupului. Fiecare element al unei nregistrri este ncrcat n coloana corespunztoare a grupului de date. Fiecare coloan ntoarce valori care sunt afiate n cmpurile corespunztoare. Un cmp trebuie s afieze toate instanele coloanei asociate; consecin, fiecare nregistrare instan a grupului este reprezentat de un cadru etitiv (repeating frame).
SELECT.. n rep
\
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 140 Modificrile fcute n Data Model, nu se vor reflecta automat n Layout. Toate aceste eventuale modificri din Data Model trebuie fcute manual i n Layout: o coloan care a fost tears din modelul de date va trebui tears i n layout; dac adugm manual n fraza select o coloan, aceasta va aprea n modelul de date la nivelul cel mai de jos. Utilizatorul va trebui s o trag cu mouse-ul la nivelul dorit, apoi s fac modificarea corespunztoare i n layout. Din pcate, la acest nivel nu ne putem permite sa invo iionarea elementelor n ciat; cadrele repetitive sunt odul z o singur dat; Acionnd, n fereastra Report Editor, butonul corespunztor modului de vizualizare Paper Layout va fi afiat urmtoarea fereastr: cm Layout Wizard-ul, care mi recreeaz macheta, distrugnd-o pe cea veche (asupra creia se presupune c s-au efectuat rafinri complexe ce vor fi pierdute). Urmtorul mod de vizualizare a raportului este accesat cu ajutorul butonului Web Source. Vom reveni ulterior asupra acestuia, trecnd acum la macheta pe care i-o construiete Report Builder-ul pentru a printa raportul i definit n modul Paper Layout. Obiectele specifice acestui mod de vizualizare definesc poz pagin, precum i modul n care vor fi afiate datele, elementele text i graficele. Cele mai des ntlnite obiecte, specifice modului Paper Layout sunt: Cadru repetitiv (repeating frame) conine obiecte care sunt afiate o singur dat pentru fiecare nregistrare a grupului aso figurate ca dreptunghiuri pe ale cror laturi se afl sgei, n funcie de m de expandare (gsii explicaii detaliate mai jos); cadru (frame) - grupeaz mai multe obiecte i se afiea cmp (field) conine date i modul lor de formatare; boilerplate conine text sau imagini ce pot aprea oriunde n raport.
141
Remarcai, n Object Navigator, existena a trei sub-noduri ale nodului Paper Layout: Header Section (coninnd informaia ce va fi afiat la nceputul raportului), Main Section (coninutul efectiv al raportului) i Trailer Section (coninnd informaia ce va fi afiat la sfritul raportului). n fereastra Report Editor este apsat butonul corespunztor seciunii Main (vezi sgeata). Pentru afiarea celorlalte seciuni se vor aciona butoanele corespunztoare (alturate celui prezentat anterior). S rearanjm obiectele n machet, mrind spaiul dintre ele. Aceast aciune are ca scop nelegerea tipurilor de obiecte ce pot fi manipulate n modul de vizualizare curent. Mutarea obiectelor trebuie fcut ns cu mult atenie. Cele mai grave i dese erori provin din poziionarea unui cmp care trebuie s afieze o ntreag coloan de date n afara cadrului repetitiv ce l conine. Selectm n Object Navigator ntregul cadru M_G_1_GRPFR (dnd click pe el). n fereastra Report Editor mutm ntregul grup, folosind sgeile (jos i dreapta). Acelai rezultat poate fi obinut i cu ajutorul mouse- ului. Selectm n continuare cadrul M_G_1_FTR, care genereaz n raport ultima linie, n care este afiat totalul. n fereastra Report Editor mutm i acest cadru mai jos. n sfrit, selectm cadrul repetitiv R_G_1 i procedm n acelai mod. Observai, n Object Navigator, dreptunghiul marcat cu sgeat asociat cadrului R_G_1, care indic faptul c acesta este de tip repetitiv. Cadrele anterioare pot fi selectate, de asemenea, prin
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 142 selectarea unui obiect coninut n ele i acionarea butonului Select Parent Frame: . Rezultatul deplasrilor anterioare de cadre este urmtorul:
S urmrim nc o dat cadrele generate pentru acest raport: cadrul printe este numit implicit M_G_1_GPRFR i este ncadrat n Report Editor ntr-un dreptunghi marcat pe laturile verticale cu cte un romb. Acest romb indic tipul de elasticitate a cadrului (n cazul nostru, se expandeaz pe vertical, astfel nct s poat cuprinde ntregul volum de date). Exist mai multe tipuri de elasticitate, iar acestea pot fi setate cu ajutorul inspectorului de proprieti al cadrului, capitolul General Layout: cadru cu elasticitate fix (fixed elasticity)- mrimea cadrului nu variaz n funcie de dimensiunea sau numrul obiectelor pe care le include; este reprezentat printr-un dreptunghi fr marcaje adiionale; cadru ce se poate contracta (contracting elasticity) dimensiunea cadrului se poate micora n funcie de mrimea obiectelor pe care le include, dar nu poate crete; este reprezentat printr-un dreptunghi avnd cte un cerc pe dou laturi opuse;
143 cadru ce se poate expanda (expanding elasticity)- dimensiunea cadrului se poate mri n funcie de mrimea obiectelor pe care le include, dar nu se poate micora; este reprezentat printr-un dreptunghi avnd cte dou liniue paralele pe dou laturi opuse; cadru cu elasticitate variabil (variable elasiticty) dimensiunea cadrului se ajusteaz (mrindu-se sau micorndu-se) n funcie de obiectele coninute n cadru; este reprezentat printr-un dreptunghi avnd cte un romb pe dou laturi paralele. n funcie de laturile dreptunghiului pe care se afl marcajele, elasticitatea poate aciona pe vertical sau pe orizontal. Adugnd doar faptul c sgeata n jos ataat dreptunghiului cadrului G_R_1 semnific faptul c acesta este repetitiv, suntem n msur s nelegem toate elementele ce apar n fereastra Report Editor, modul Paper Layout. Acionnd urmtorul buton, Paper Design, obinem un preview al raportului proiectat pentru tiprire. Acesta este un editor de tipul WYSIWYG, n care putem face modificri direct asupra setului de date reale.
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 144 Selectai coloana Pret Unit i ncercai s formatai modul de afiare a sa acionnd grupul de butoane din bara de instrumente formatting (asemntoare cu cea din aplicaiile Microsoft): Ultimul grup de butoane permite adugarea automat a unuia din semnele dolar, procent sau virgul. S adugm semnul monedei americane i s presupunem c dorim formatri mai complexe, cum ar fi: toate cantitile mai mici dect 150 s fie marcate (avertizndu-ne, astfel, c respectivul produs tinde s fie epuizat). Ne poziionm pe coloana Cantit i din meniul de context (obinut dnd click dreapta pe respectiva coloan) alegem opiunea Conditional Formatting. Din caseta de dialog afiat alegem opiunea new (crem o nou condiie de formatare) i trecem la urmtorul pas, specificarea condiiilor:
Specificm, aa ca n figura anterioar, condiia (valoarea cmpului cantit mai mic dect 150), iar n partea de jos a ferestrei precizm modul n care va fi formatat cmpul dac ndeplinete condiia anterioar. Am ales culoarea textului - albastr, iar pentru haurare i chenar dou nuane de galben. Rezultatul va fi urmtorul:
145
Putem aduga, de asemenea, numrul paginii curente, precum i data, eventual ora la care a fost generat raportul. Acest lucru se face ntr-un mod asemntor aplicaiilor Microsoft Office, prin selectarea din meniul Insert a opiunilor Page Number, respectiv Date and Time. Opiunea AutoText permite stocarea i inserarea automat a unor poriuni de text, grafice, cmpuri i a altor elemente care sunt folosite frecvent.
3.4. 3.4. Rapoarte cu grupuri master-detail master detail Rapoarte cu grupuri - Am creat i analizat n capitolele precedente un raport simplu, bazat pe un singur grup de date. O s continum cu rapoarte mai complexe, analiznd structura datelor care sunt afiate i modul n care poate fi modificat raportul prin manipularea modelului de date. S generm un nou raport, n care s afim pentru fiecare firm toate facturile existente (de intrare sau ieire). Pentru fiecare factur vom afia produsele corespunztoare, precum i cantitatea. Raportul final va arta astfel:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 146
S invocm bine-cunoscutul Report Wizard. n pagina Style dm un titlu raportului (de exemplu, Facturi i produse) i alegem tipul de raport Group Left. Sursa de date va fi, ca i pn acum, rezultatul unei cereri SQL. La pasul urmtor invocm Query Builder-ul i selectm trei tabele: produse, facturi i stoc. Relaia de join dintre cele trei tabele este generat automat, iar noi precizm ce coloane dorim s apar n raport, bifnd casetele de validare din stnga fiecreia:
147
Acionnd butonul OK, va fi generat automat fraza SQL:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 148 Urmtorul pas al wizard-ului permite definirea unor grupuri de date; dorim ca produsele s fie grupate pe firme, iar n cadrul fiecrei firme dup factur. Pentru a realiza acest lucru, procedm n felul urmtor: n caseta Groups a wizard-ului mutm din zona Available Fields n zona Group Fields cmpul cod_firma. Astfel, va fi creat un grup dup acest cmp. Dorim ca, n cadrul acestui grup, produsele s fie grupate dup codul facturii. Putem proceda n unul din dou moduri: avnd selectat grupul cod_firma din caseta din dreapta, mutm cmpul cod_factura din zona cmpurilor disponibile n cea a gruprilor. Rezultatul va fi urmtorul:
Al doilea mod n care putem proceda este s mutm cmpul cod_fact n zona Groups avnd selectat n caseta din dreapta Level 1. Rezultatul va fi altul:
149
Diferena dintre cele dou metode este c n primul caz vor fi create n Data Model doar dou grupuri de date, pe cnd n cazul al doilea vor fi create trei grupuri. Care din cele dou metode este cea corect? Analizndu-le pe amndou, vor hotr mpreun acest lucru, pe parcursul prezentului capitol. Deci, s procedm conform primului caz; n caseta urmtoare, Fields, precizm care din cmpuri vor fi folosite la afiare. Le selectm pe toate i le mutm n zona Displayed Fields. Ordinea n care sunt cmpurile afiate la printarea raportului este aceeai cu ordinea n care se gsesc n zona Displayed Fields i poate fi schimbat n mai multe moduri; unul dintre ele este rearanjarea cmpurilor chiar n aceast caset, prin drag&drop. Urmtorii pai ai wizard-ului sunt cei deja cunoscui, iar rezultatul final ar trebui s fie raportul din figura de la nceputul prezentului subcapitol. S analizm modelul de date pe care se bazeaz acest raport:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 150
A fost generat o cerere SQL (prezentat anterior) i dou grupri, unul master, cellalt detail. Aceast structur poate fi observat att n Data Model, ct i n Object Navigator. S ne reamintim c un raport tabular se bazeaz pe o cerere care genereaz un singur grup, pe cnd rapoartele de tip Group Above i Group Left conin o cerere i dou sau mai multe grupuri. Pentru fiecare nregistrare din grupul master vor fi listate toate nregistrrile din grupul detail. Sgeile afiate n Data Model n stnga fiecrei coloane indic faptul c nregistrrile sunt sortate. Proprietatea corespunztoare (accesibil prin Property Inspector) se numete Break Order. Sgeile sunt, ns, valabile doar pentru grupul master. n grupul detail ele nu au nici un efect, sortarea realizndu-se prin modificarea de ctre utilizator a cererii SQL, introducnd manual o clauz order by. Este recomandat eliminarea sgeilor care nu sunt necesare, pentru mbuntirea performanelor raportului. Observai, n raportul generat, un lucru mai putin plcut: pentru o firm care are mai multe facturi, codul firmei va fi afiat de mai multe ori, odat cu fiecare factur. nelegnd corect modelul de date, realizm i de ce se ntmpl acest lucru. Folosind acest model de date, nu putem determina afiarea codului firmei o singur dat. Putem realiza ns acest lucru modificnd Data Model: pentru fiecare firm, trebuie s am o
151 grupare detail care s afieze toate facturile. Acest scenariu corespunde celui de al doilea mod de creare a gruprilor, folosind dou niveluri (n acest subcapitol spuneam c putem crea n Report Wizard grupul cod_factura avnd selectat Level 1 n pagina Groups, caseta Group Fields. Rulai Report Wizard n modul reentrant, facei modificarea corespunztoare i vei observa c raportul arat n felul urmtor:
Modelul de date este, ns, altul fa de cel prezentat anterior:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 152
Dup cum observai, n Oracle9i Reports grupurile sunt organizate conform unei ierarhii. Aceasta poate fi modificat invocnd Report Wizard-ul n modul reentrant; exist ns situaii cnd nu vrem s folosim acest mod de a modifica Data Model (de exemplu, n cazul cnd vrem s evitm pierderea unor rafinri efectuate dup ncheierea procesului de generare a raportului cu ajutorul wizard-ului). n acest caz, putem crea grupuri noi chiar n Report Editor.
3.5. 3.5. Modificarea rapoartelor folosind Data Model Data Model Modificarea rapoartelor folosind Modelul de date definete datele care apar n raport i ierarhia acestora, deci structura raportului, ns nu permite definirea nici unui atribut de formatare a raportului. Modelul de date este creat odat cu raportul, la rularea instrumentului Report Wizard. Artam ntr-un capitol anterior c pasul urmtor rulrii acestui wizard este rafinarea manual a raportului. Dup ce toate aceste etape au fost parcurse, poate aprea necesitatea modificrii structurii datelor, prin crearea unui grup nou, introducerea unor coloane suplimentare etc. Toate aceste modificri vor fi fcute manual, n Data Model.
153 S revenim la modelul de date anterior:
Pentru evitarea afirii de mai multe ori a codului clientului vom crea, de aceasta dat manual, un nou grup de date. Astfel, primul grup master va conine cmpul cod_firma, iar pentru fiecare firm va fi generat grupul detail al facturilor asociate respectivei firme. La rndul su, acest grup va avea ca grup copil pe G_COD_PROD. 3.5.1. 3.5.1. Crearea manual a grupurilor Crearea manual a grupurilor Putem crea un grup master al grupului G_1 trgnd cmpul cod_fact n partea stng, apoi elibernd mouse-ul sau putem crea un grup detail pentru G_1 trgnd cmpul cod_firma n partea dreapt i elibernd mouse-ul; n cel de al doilea caz, Data Model va arta astfel:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 154
Odat creat noul grup, n el pot fi mutate i alte coloane, trgndu-le cu mouse-ul n ierarhie de sus n jos, dintr-un grup superior n cel nou sau ntr-unul inferior lui. Ordinea n care grupurile apar n Data Model are efect asupra modului n care vor fi afiate. Trebuie s ne asigurm c ntotdeauna grupurile printe (master) sunt afiate naintea grupurilor copil (detail).
155
Ne ntoarcem la primul model de date, cu doar dou grupuri. Proprietile grupurilor pot fi vizualizate i modificate folosind Inspector Property: observai posibilitatea introducerii unui filtru la nivel de grup, prin selectarea proprietii Filter Type. Exist trei tipuri de filtru: First, urmat de specificarea unui Number of Rows determin afiarea, pentru fiecare nregistrare master, a numrului de nregistrri detail specificate de utilizator. Urmtoarea proprietate, Last, acioneaz asemntor, ns produce afiarea ultimelor rnduri din gruparea detail. Aceste proprieti sunt foarte utile n faza de testare a raportului. Cea de a treia valoare a proprietii Filter Type, PL/SQL, permite inserarea de cod PL/SQL pentru stabilirea filtrului. Filtrul PL/SQL este o funcie boolean, care ntoarce, deci, una din valorile true sau false. Funcia se declaneaz pentru fiecare instan: dac este ntoars valoarea true, nregistrarea este afiat; n caz contrar, ea este eliminat din raport. S presupunem c dorim s afim doar acele produse pentru care cantitatea este mai mare de 50. Funcia boolean care realizeaz acest lucru este:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 156
3.5.2. 3.5.2. Adugarea manual a coloanelor Adugarea manual a coloanelor Coloanele existente n Data Model provin, aa cum am artat anterior, din cererea select care populeaz raportul folosind coloanele existente n tabelele bazei de date. Reports Builder-ul impune cteva restricii n manipularea acestor tipuri de coloane: O parte din proprietile lor sunt read-only: Name, Column Type, Data Type i Width. Aceste informaii provin din tabelele bazei de date i nu pot fi modificate n Report Builder; Nu pot fi terse direct n grup (cu tasta Del, de exemplu), ci trebuie eliminate din cererea select. n afara coloanelor bazate pe cmpurile tabelelor, utilizatorul poate crea propriile coloane, care pot fi de mai multe feluri: Summary aplic funciile statistice standard unei alte coloane sau unui grup de coloane; poate fi definit la momentul crerii raportului, folosind instrumentul Report Wizard; numele acordat implicit de ctre Reports Builder unei astfel de coloane este CS_1;
157 Formula se calculeaz ca rezultat al unei funcii scrise de utilizator n PL/SQL; numele acordat implicit de ctre Reports Builder unei astfel de coloane este CF_1; Placeholder primete valoare n runtime, de la un alt obiect; numele acordat implicit de ctre Reports Builder unei astfel de coloane este CP_1. O coloan de tip placeholder este, de fapt, un container populat cu elemente aduse, n general, dintr-o coloan sau dintr-un trigger. Fiecare din cele trei tipuri de coloane poate fi creat folosind toolbar-ul vertical din Report Editor:
S ne amintim c raportul asupra cruia lucrm de vreo dou subcapitole ncoace afieaz situaia comenzilor corespunztoare fiecrei facturi, pentru fiecare produs fiind afiate numele acestuia, cantitatea i preul unitar. S presupunem c, dup formatri complexe asupra machetei, a aprut necesitatea inserrii unei coloane noi, care s afieze pentru fiecare produs preul total, adic valoarea produsului (cantitatea * pretul unitar). Nu dorim s alterm rafinrile efectuate asupra layout-ului, aa c vom introduce manual o nou coloan de tip formula. S crem, n Data Model, o nou coloan care s calculeze produsul dintre preul i cantitatea corespunztoare fiecrui produs. Pentru aceasta selectm butonul Formula Column, apoi dm click n grupul G_COD_PROD, unde este locul noii coloane. Astfel, modelul de date a fost modificat:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 158
Acionnd paleta de proprieti a coloanei nou create, putem modifica numele acesteia i i acordm funcionalitate. O coloan de tip formula va avea valorile calculate conform unei funcii PL/SQL definite de utilizator. Funcia trebuie s ntoarc o singur valoare, de tipul specificat conform proprietii Datatype i de lungimea definit prin proprietatea Length.
Acionnd butonul corespunztor proprietii PL/SQL Formula va aprea caseta bine-cunoscut, care permite inserarea codului PL/SQL ce se va executa la fiecare instan a grupului cruia i aparine cmpul curent. Funcia care va calcula valoarea dorit este: 159
Nu uitai s compilai funcia, acionnd butonul corespunztor, Compile. Vizualizarea raportului n modul Paper Design (care reprezint, dup cum precizam anterior, un instrument WYSIWYG) nu prezint nici o modificare, coloana nou creat neaprnd. Ne ateptam, ns, la acest lucru, deoarece am precizat c modificrile efectuate manual n Data Model nu se regsesc automat n layout. Modificarea manual a machetei raportului este o operaie deosebit de dificil, care trebuie efectuat cu mult atenie. Deplasarea elementului grafic ce desemneaz un cmp n afara grupului cruia i aparine respectivul cmp (n Object Navigator) duce la o eroare fatal i la imposibilitatea rulrii raportului. Pentru a modifica cu succes macheta raportului trebuie s aprofundm elementele ce o definesc i comportamentul acestora.
3.6. 3.6. Modificarea raportului folosind Paper layout Paper layout Modificarea raportului folosind 3.6.1. 3.6.1. Cele 3 seciuni ale raportului: header, main, trailer le header main trai Cele 3 seciuni ale raportului: , , r Un raport este implementat, din punctul de vedere al aplicaiei Oracle Reports, asemntor cu o carte: informaia pe care cererea select o aduce din baza de date este depozitat ntr-o seciune numit main. Putem crea, ns, pagini-antet i pagini ce vor fi ataate la sfritul raportului. Acestea pot conine simplu text sau informaii din modelul de date. Seciunea antet (header section) conine una sau mai multe pagini care vor fi afiate o singur dat, la nceputul raportului. Seciunea trailer se comport ntr-un mod similar, dar informaia corespunztoare acesteia va fi afiat la sfritul raportului. Cele trei seciuni ale raportului sunt afiate n Object Navigator la nodul Paper Layout. La fel ca n cazul seciunii main, n seciunile header i trailer machetele pot fi construite cu ajutorul instrumentelor de tip wizard sau manual. Comutarea ntre cele trei seciuni ale raportului se face prin acionarea butoanelor corespunztoare aflate n partea superioar a ferestrei Paper Layout:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 160
Acionai primul din cele trei butoane; va aprea o zon fr informaii, n care putei insera informaiile ce dorii a aprea pe prima pagin a raportului. Acionnd butonul text, putei insera text static, iar cu ajutorul butonului Field putei insera informaia corespunztoare unuia din cmpurile existente la nivel de raport. Acionai paleta de proprieti a cmpului nou creat i alegei, la proprietatea Source, afiarea datei la care a fost rulat raportul:
161
Prima pagin a raportului poate fi vizualizat cu ajutorul instrumentului Report Editor, n modul Paper Design :
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 162
Aa cum precizam anterior, seciunile header i trailer pot conine de asemenea informaie dinamic, generat n runtime. Un exemplu a fost prezentat anterior i a constat n inserarea datei la care a fost generat raportul. Macheta seciunilor sus-amintite poate fi creat manual sau automat, cu ajutorul instrumentelor de tip wizard. Simpla invocare a utilitarului Report Wizard va produce rularea lui n modul reentrant i afectarea machetei seciunii main. Se dorete, ns, crearea unei machete adiionale, pentru seciunea header, iar acest lucru se obine prin acionarea prealabil a butonului Report Block, ultimul din bara vertical de instrumente aflat n fereastra Paper Layout i marcat prin semnul . Apsarea acestui buton, urmat de rularea instrumentului Report Wizard, va determina crearea unei machete adiionale, pentru seciunea header. Paii specifici acestui wizard sunt deja cunoscui. ncercai s afiai, pe aceast prim pagin a raportului, numele firmelor cu care firma curent are schimburi de marf, precum i codurile tuturor facturilor operate (grupate pe firme). 3.6.2. 3.6.2. Margini Margini
163 Editorul Paper Layout permite att modificarea corpului celor trei seciuni ale raportului, ct i setarea marginilor lor. Fiecare pagin fizic (indiferent de seciunea care o genereaz) conine dou zone: corpul paginii i marginea sa. Comutarea ntre cele dou zone se poate face, la orice moment, acionnd butonul Body/Margin aflat n zona superioar a ferestrei Paper Layout i marcat prin icon-ul . Marginile pot conine text static, grafice, imagini, numerotarea paginilor, totaluri etc. Cnd utilizatorul selecteaz butonul Body/Margin pentru a vizualiza i modifica marginile, zona body rmne, de asemenea, vizibil, dar nu poate fi modificat (este read-only). Ea este ncadrat ntr-un dreptunghi cu laturile negre, care stabilete grania dintre margini i corpul paginii. Modificarea dimensiunilor marginii poate fi fcut selectnd dreptunghiul negru care o ncadreaz i redimensionndu-l, cu ajutorul mouse-ului. S ncercm inserarea unei imagini dintr-un fiier n zona margins. Apsm n bara vertical de instrumente a ferestrei Paper Layout butonul File Link, reprezentat prin imaginea , apoi dm click n zona unde vrem s fie afiat figura. Va fi creat un obiect nou, a crui funcionalitate o vom stabili folosind paleta sa de proprieti:
Oracle9i Developer Suite - Crearea aplicaiilor profesionale cu Forms i Reports 164
Proprietatea File Source Format va trebui setat la valoarea Image, iar actionarea butonului atasat proprietii Source filename conduce la afiarea ferestrei Open, n care putem selecta fisierul al carui continut va fi afiat. Efectul ultimelor modificari poate fi vizualizat folosind modul Paper Design: