Sunteți pe pagina 1din 6

Dezvoltarea Aplicaiilor de Baze de Date - Anul 2 Master ID Laborator 1 (Oracle 9i Forms Developer)

1. Analizai diagrama exemplu HR (Human Resources), observnd cheile primare i externe ale tabelelor, precum i relaiile dintre tabele. 2. Iniiai o sesiune SQL*Plus. Analizai structura tabelelor din schema HR i listai coninutul acestor tabele. Exemplu: DESC employees SELECT * FROM employees; 3. S se creeze cte o copie a tabelelor EMPLOYEES, DEPARTMENTS, JOBS i JOB_HISTORY. Noile tabele se vor numi EMPLOYEES_PNU, DEPARTMENTS_PNU, JOBS_PNU, JOB_HISTORY_PNU, unde sufixul PNU este format astfel: P = prima liter din prenumele dumneavoastr, NU = primele dou litere din nume. 4. S se creeze o form, numit F_EMP, care s conin informaii referitoare la angajai i joburile lor precedente. a) Creai cu ajutorul Data Block Wizard cte un bloc de date pe baza tabelelor EMPLOYEES_PNU si JOB_HISTORY_PNU. Blocurile se vor numi BL_EMP, BL_HISTORY. b) Blocul BL_EMP va fi blocul master al lui BL_HISTORY. c) BL_HISTORY va avea layout tabelar. n editorul Layout, repoziionati elementele n mod convenabil (mai nti redimensionai canvas-ul i frame-ul). d) Informaiile vor fi afiate pe un canvas numit CV_EMP. e) Salvai forma ntr-un fiier numit F_EMP.fmb. 5. - Executati modulul creat anterior. - Executai o cerere nerestrictionat. - Executai o cerere restricionat pentru a gsi informaii referitoare la angajaii avnd codul job-ului SA_REP. - Executai o cerere restricionat pentru a gsi informaii referitoare la angajaii al cror job_id incepe cu litera S i al cror salariu este mai mare dect 2500. - Executai o cerere restricionat pentru determinarea angajailor al cror salariu se afl n intervalul 4500-5000 sau care au a treia liter din nume A. Indicaie: n item-urile corespunztoare cmpurilor salary, respectiv last_name se scrie :a, :b. La execuia cererii va aprea o fereastr n care se poate introduce condiia: :a between 4500 and 5000 or lower(:b) like __a% 6. - Adugai o nou nregistrare n blocurile corespunztoare lui EMPLOYEES. Vizualizai, n SQL*Plus, coninutul tabelului. Apare i noua nregistrare? - Salvai nregistrarea introdus i vizualizai din nou coninutul tabelului.. - Actualizai data angajrii pentru nregistrarea introdus anterior i salvati. 7. - Creai un nou modul de form.

2 - Creai un bloc singular, folosind Data Block Wizard, pe baza nregistrrilor din DEPARTMENTS i includeti toate coloanele. Blocul se va numi BL_DEP. Afiati blocul pe un canvas nou, numit CV_DEP; se va afia cte o singur nregistrare. Titlul frameului va fi departamente. - Salvai noul modul ntr-un fiier numit F_DEP. - Rulai modulul si executai o cerere (s se gseasc departamentele al cror nume ncepe cu litera M). - In Object Navigator, schimbati numele modulului in F_DEP. 8. - Creati manual un bloc nou i redenumii acest bloc Control. Setai proprietile Database Data Block, Query Allowed, Insert Allowed, Update Allowed i Delete Allowed la valoarea No. Setai proprietatea Query Data Resource Type la None. Celelalte proprieti se vor lsa cu valorile lor implicite. Mutai blocul Control dup blocul DEPARTMENTS (drag&drop n Object Navigator). - Asigurai-v c nregistrrile corespunztoare blocului DEPARTMENTS sunt sortate dup codul departamentului. (ORDER BY department_id n Properties Palette) - Setai proprietile frame-ului pentru blocul DEPARTMENTS astfel: tergeti titlul frame-ului i setai proprietatea Update Layout la Manually. - Salvai i rulai forma. 9. n forma (modulul) F_DEP, creai un LOV (list of values) pentru a afia codurile locaiilor i oraele corespunztoare. Setai proprietatea Name la ID_lov, proprietii Title dai-i valoarea Locaii, proprietile X=30, Y=30, Width=200, Height=250. Pentru coloana location_id setai, ca element de ntoarcere, departments.location_id. Obs: Cu excepia numelui formei, toate celelalte proprieti se seteaz cu ajutorul lui LOV Wizard. 10. Creai un buton n blocul de control al formei F_DEP; numii acest buton ID_lov_button. Modificai-i proprietatea Label = Locatii i setai canvas-ul, iar apoi poziionai corespunztor butonul n Layout Editor. Obs: Pentru crearea butonului se poate proceda astfel: prin click pe nodul Items al blocului Control se creeaz un element nou, iar apoi, prin Property Palette se stabilete tipul elementului (Push Button), numele i label-ul. 11. n forma F_DEP, scriei un trigger pentru a afia ID_lov cnd este apsat butonul ID_lov_button.
Indicaie: Trigger WHEN-BUTTON-PRESSED la nivelul butonului ID_lov_button IF show_lov('ID_lov') THEN null; end if;

12. Creai un trigger When-Window-Closed la nivel de form pentru a iei din aceasta.
Indicaie: WHEN-WINDOW-CLOSED la nivelul formei exit_form;

13. Creai un bloc de control n forma F_EMP, n care adugai un buton numit exit_button. Scriei un trigger care determin ieirea din form cnd este selectat exit_button. Textul butonului va fi Ieire. Unde trebuie plasat blocul de control?
Indicaie: WHEN-BUTTON-PRESSED la nivelul butonului "exit_button"

3
exit_form;

14. Modificai fereastra din forma F_EMP. Schimbai-i numele n WIN_EMP i titlul n Informatii angajati. Verificai dac dimensiunea i poziia sunt corespunztoare. Salvai, compilai i executai forma pentru a testa modificrile. 15. Creai un nou bloc, numit BL_JOBS bazat pe tabelul JOBS_PNU (fr a crea relaii cu celelalte blocuri), pentru a fi afiat coninutul acestuia pe un canvas diferit, de tip content, numit CV_JOB. Se vor afia cte 4 linii i se va folosi un layout tabular, n care se va include i un scrollbar. Titlul frame-ului va fi functii. 16. n forma F_EMP, creai o nou fereastr numit WIN_JOB. Dimensionai fereastra corespunztor. Titlul ferestrei va fi JOB, iar proprietatea Hide on Exit va fi setata Yes. Plasai noua fereastr ntr-o poziie potrivit relativ la WIN_EMP. Asociai ferestrei WIN_JOB canvas-ul CV_JOB. 17. n forma EMP, creai un canvas de tip toolbar orizontal, numit Toolbar, n fereastra WIN_EMP. (proprietatea Window) 18. Creai cele 3 butoane de mai jos n blocul de control i plasai-le pe canvas-ul Toolbar. Exit_button a fost creat anterior, este nevoie doar s i modificm proprietile. Toate proprietile, cu excepia lui Label i a numelor butoanelor, pot fi setate simultan, printr-o selecie multipl. Buton Detalii Job_button Label: JOB; Mouse Navigate: No; Keyboard Navigable: No; Canvas: Toolbar Show_help_button Label: Show Help; Mouse Navigate: No; Keyboard Navigable: No; Canvas: Toolbar Exit_button Label: Exit; Mouse Navigate: No; Keyboard Navigable: No; Canvas: Toolbar 19. Creai un canvas de tip stacked numit CV_HELP pentru a afia help-ul n fereastra WIN_EMP a formei F_EMP. Dimensiunile vizibile recomandate sunt Viewport Width 270, Viewport Height 215 (pt). Adugai un text corespunztor n acest canvas. 20. Pozitionai canvas-ul precedent n aa fel nct s apar n centrul ferestrei WIN_EMP; organizai CV_HELP astfel nct s fie ultimul canvas din secven. 21. Comutai pe No proprietatea Visible a lui CV_HELP i apoi creai un buton n blocul de control pentru a ascunde informaia din Help atunci cnd nu mai este necesar. Afiai acest buton pe CV_HELP. Butonul se va numi Hide_Help_Button (Label: Ascunde Help; Canvas: CV_HELP).

4 22. Modificai forma F_EMP pentru a folosi un canvas de tip tab, astfel: n Layout Editor, tergei obiectul frame care acoper blocul corespunztor lui EMPLOYEES; creai canvas-ul de tip tab, n Layout Editor setai Background Color convenabil, iar n Property Palette setai Corner style = square, Bevel = none. 23. Redenumii canvas-ul de tip tab TAB_EMP. Creai 4 pagini de tab i etichetai-le Informatii, Angajare, Colectiv si Joburi. Numele vor fi Pag_Info, Pag_Angajati, Pag_Colectiv, Pag_Job. 24. Arangai paginile tab-ului (utiliznd selecia multipl pentru item-uri), astfel nct: - employee_id, first_name, last_name, email, phone_number s se afle n pagina Informatii; - hire_date, job_id, salary, commission_pct s se afle n pagina Angajare; - manager_id i department_id se vor afla n pagina Colectiv, iar n pagina Joburi se vor afia elementele blocului JOBS. n Layout Editor, repoziionai item-urile. 25. Creai un trigger When-Button-Pressed asupra lui Show_Help_Button, care folosete procedura predefinit SHOW_VIEW pentru a afia CV_HELP.
Indicaie: WHEN-BUTTON-PRESSED la nivelul butonului Show_Help_Button
show_view('CV_HELP'); go_item('hide_help_button');

26. Creai un trigger When-Button-Pressed asupra lui Hide_Help_Button care ascunde CV_HELP. Pentru aceasta, folosii procedura predefinit HIDE_VIEW.
Indicaie: WHEN-BUTTON-PRESSED la nivelul butonului Hide_Help_Button
hide_view( 'CV_HELP' ); go_block( 'bl_emp' );

27. Creai un trigger When-Button-Pressed asupra lui Job_Button care folosete procedura predefinit GO_BLOCK pentru a afia blocul corespunztor (BL_JOBS).
Indicaie: WHEN-BUTTON-PRESSED la nivelul butonului Job_Button
go_block( 'bl_jobs' );

28. n fiierul F_DEP.fmb, creai o procedur numit list_of_values care are 2 parametri de tip VARCHAR2: primul parametru reprezint numele obiectului LOV (ID_lov), iar al doilea parametru va furniza semnificaia unui element din lista de valori (ex: locatie). Modificai trigger-ul When-Button-Pressed al lui ID_lov_button astfel nct s apeleze aceast procedur. Compilai i rulai forma n mod Debug. Stabilii un breakpoint ntr-unul din trigger-i i cercetai Call stack. Rulai pas cu pas.
Indicaie:
create or replace procedure list_of_values(obj_name in varchar2, elem in varchar2) is v_bool boolean; begin v_bool := show_lov ( ' ID_lov ' ); if v_bool then message( ' Ati selectat o ' || elem ) ; else

5
message( ' Ati inchis lista de valori ' ); end if; end;

Trigger-ul va avea forma : list_of_values( ' ID_lov ' , ' locatie ' ) ;

29. In forma F_DEP, scriei un trigger care se declaneaz atunci cnd se ncearc modificarea codului managerului unui departament. Codul noului manager va trebui s fie al unui angajat din departamentul respectiv.
Indicaie:

POST_CHANGE la nivelul item-ului manager_id


Declare V_nr NUMBER; begin select count(*) into v_nr from employees where employee_id = :bl_dep.manager_id and department_id = :bl_dep.department_id; if v_nr = 0 then message ( ' Managerul trebuie sa fie angajat al departamentului ' ); end if; end;

30. S se introduc un nou cmp n tabelul DEPARTMENTS_PNU, numit Imagine. S se introduc acest nou element pe plansa CV_DEP (din forma F_DEP) i s se modifice valoarea prompt-ului su n Sigla. n forma F_DEP, creati o plan (canvas) de tip toolbar, numit CV_TOOL. n blocul CONTROL al formei F_DEP, s se creeze un buton nou, numit Image_Button, i s se poziioneze pe CV_TOOL. Setai proprietatea Label = Image Off. Pe plana CV_TOOL, se va poziiona i un buton de ieire. Plasai i butonul id_lov_button pe CV_TOOL. Indicaie: Pe server a fost creat un obiect de tip Directory astfel (din contul SYS):
create or replace directory dir as 'd:\img\'; grant read on directory dir to public;

Pentru introducerea unei coloane n table, corespunztoare unei imagini, se efectueaz comanda:
alter table departments_pnu add (imagine bfile);

Pentru asocierea cmpului imagine cu imaginea stocat ntr-un fiier din dir, se execut o comand de tipul:
update departments_pnu set imagine=bfilename('DIR', 'poza3.TIF') where department_id = 10;

31. S se creeze un trigger care acioneaz cnd este apsat butonul Image_Button. Trigger-ul va determina valoarea curent a proprietii visible a item-ului Imagine. Dac valoarea curent este true, valoarea proprietii visible devine false. Eticheta se

6 va schimba pe Image_Button pentru a reflecta urmtoarea sa stare (dac item-ul Imagine este invizibil, eticheta butonului devine Image On).
Indicaie: WHEN_BUTTON_PRESSED la nivelul butonului Image_Button
if get_item_property ( 'bl_dep.imagine' , visible ) = 'TRUE' then set_item_property ( 'bl_dep.imagine' , visible, property_false ); set_item_property ( 'control.image_button' , label, 'Imagine On' ); else set_item_property ( 'bl_dep.imagine' , visible, property_true ); set_item_property ( 'control.image_button' , label, 'Imagine Off' ); end if; go_item('bl_dep.department_id'); --este nevoie de aceasta linie? De ce?

32. Creai o alert (de tip Caution) numit manager_alert n F_DEP, cu un singur buton (OK). Mesajul sau va fi Departamentul trebuie condus de un angajat al sau!. 33. Modificai trigger-ul creat la ex. 29 pentru a afia manager_alert n loc de mesaj.
Indicaie: POST_CHANGE la nivelul lui manager_id
declare v_nr number; alerta number; begin select count(*) into v_nr from employees where employees_id = :bl_dep.manager_id and department_id = :bl_dep.department_id; if v_nr = 0 then alerta := show_alert ( 'manager_alert' ) ; end if; end;

34. Creai o alert generic (de tipul Stop) n F_EMP, numit Question_Allert care accept replicile Da si Nu. 35. Modificati trigger-ul When_Button_Pressed asupra lui CONTROL.Exit_Button, folosind Question_Alert pentru a cere utilizatorului s confirme dac execuia formei se termin.
Indicaie:

WHEN_BUTTON_PRESSED la nivelul butonului exit_button


set_alert_property( 'question_alert' , alert_message_text , 'Doriti sa parasiti forma ?' ); if show_allert ( 'question_alert' ) = alert_button1 then exit_form; end if;

S-ar putea să vă placă și