Laborator1 APBDOO Master

6

Click here to load reader

Transcript of Laborator1 APBDOO Master

Page 1: Laborator1 APBDOO Master

Aplica ţii profesionale în baze de date orientate obiect Anul 1 Master „Baze de date şi tehnologii web” Laborator 1 (Oracle Forms Developer) 1. Analizaţi diagrama exemplu HR (Human Resources), observând cheile primare şi externe ale tabelelor, precum şi relaţiile dintre tabele.

2. Iniţiaţi o conexiune la baza de date indicată la laborator. Analizaţi structura tabelelor din schema HR şi listaţi conţinutul acestor tabele.

Exemplu: DESC employees SELECT * FROM employees;

3. Dacă lucraţi într-un cont de grupă, să se creeze câte 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ă conţină informaţii referitoare la angajaţi şi joburile lor precedente.

a) Creaţi cu ajutorul Data Block Wizard câte un bloc de date pe baza tabelelor EMPLOYEES si JOB_HISTORY. 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, repoziţionati

elementele în mod convenabil (mai întâi redimensionaţi canvas-ul şi frame-ul). d) Informaţiile vor fi afişate pe un canvas numit CV_EMP. e) Salvaţi forma într-un fişier numit F_EMP.fmb.

5. - Executati modulul creat anterior. - Executaţi o cerere nerestrictionată. - Executaţi o cerere restricţionată pentru a găsi informaţii referitoare la angajaţii având codul job-ului SA_REP. - Executaţi o cerere restricţionată pentru a găsi informaţii referitoare la angajaţii al căror job_id incepe cu litera “S” şi al căror salariu este mai mare decât 2500. - Executaţi o cerere restricţionată pentru determinarea angajaţilor al căror salariu se află în intervalul 4500-5000 sau care au a treia literă din nume “A”. Indica ţie: în item-urile corespunzătoare câmpurilor salary, respectiv last_name se scrie :a, :b. La execuţia cererii va apărea o fereastră în care se poate introduce condiţia: :a between 4500 and 5000 or lower(:b) like ‘__a%’

6. - Adăugaţi o nouă înregistrare în blocurile corespunzătoare lui EMPLOYEES. Vizualizaţi, în SQL*Plus, conţinutul tabelului. Apare şi noua înregistrare? - Salvaţi înregistrarea introdusă şi vizualizaţi din nou conţinutul tabelului.. - Actualizaţi data angajării pentru înregistrarea introdusă anterior şi salvati.

7. - Creaţi un nou modul de formă.

Page 2: Laborator1 APBDOO Master

2

- Creaţi un bloc singular, folosind Data Block Wizard, pe baza înregistrărilor din DEPARTMENTS şi includeti toate coloanele. Blocul se va numi BL_DEP. Afişati blocul pe un canvas nou, numit CV_DEP; se va afişa câte o singură înregistrare. Titlul frame-ului va fi “departamente”. - Salvaţi noul modul într-un fişier numit F_DEP. - Rulaţi modulul si executaţi o cerere (să se găsească departamentele al căror nume începe cu litera M). - In Object Navigator, schimbati numele modulului in “F_DEP”.

8. - Creati manual un bloc nou şi redenumiţi acest bloc Control. Setaţi proprietăţile Database Data Block, Query Allowed, Insert Allowed, Update Allowed şi Delete Allowed la valoarea “No”. Setaţi proprietatea Query Data Resource Type la “None”. Celelalte proprietăţi se vor lăsa cu valorile lor implicite. Mutaţi blocul Control după blocul DEPARTMENTS (drag&drop în Object Navigator). - Asiguraţi-vă că înregistrările corespunzătoare blocului DEPARTMENTS sunt sortate după codul departamentului. (ORDER BY department_id în Properties Palette) - Setaţi proprietăţile frame-ului pentru blocul DEPARTMENTS astfel: ştergeti titlul frame-ului şi setaţi proprietatea Update Layout la Manually. - Salvaţi şi rulaţi forma.

9. În forma (modulul) F_DEP, creaţi un LOV (list of values) pentru a afişa codurile locaţiilor şi oraşele corespunzătoare. Setaţi proprietatea Name la ID_lov, proprietăţii Title daţi-i valoarea “Locaţii”, proprietăţile X=30, Y=30, Width=200, Height=250. Pentru coloana location_id setaţi, ca element de întoarcere, departments.location_id. Obs: Cu excepţia numelui formei, toate celelalte proprietăţi se setează cu ajutorul lui LOV Wizard.

10. Creaţi un buton în blocul de control al formei F_DEP; numiţi acest buton ID_lov_button. Modificaţi-i proprietatea Label = “Locatii” şi setaţi canvas-ul, iar apoi poziţionaţi corespunzător 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 stabileşte tipul elementului (Push Button), numele şi label-ul.

11. În forma F_DEP, scrieţi un trigger pentru a afişa ID_lov când este apăsat butonul ID_lov_button. Indica ţie: Trigger WHEN-BUTTON-PRESSED la nivelul butonului ID_lov_button IF show_lov('ID_lov') THEN null; end if;

12. Creaţi un trigger When-Window-Closed la nivel de formă pentru a ieşi din aceasta. Indica ţie: WHEN-WINDOW-CLOSED la nivelul formei exit_form;

13. Creaţi un bloc de control în forma F_EMP, în care adăugaţi un buton numit exit_button. Scrieţi un trigger care determină ieşirea din formă când este selectat exit_button. Textul butonului va fi “Ieşire”. Unde trebuie plasat blocul de control? Indica ţie: WHEN-BUTTON-PRESSED la nivelul butonului "exit_button"

Page 3: Laborator1 APBDOO Master

3

exit_form;

14. Modificaţi fereastra din forma F_EMP. Schimbaţi-i numele în WIN_EMP şi titlul în “Informatii angajati”. Verificaţi dacă dimensiunea şi poziţia sunt corespunzătoare. Salvaţi, compilaţi şi executaţi forma pentru a testa modificările.

15. Creaţi un nou bloc, numit BL_JOBS bazat pe tabelul JOBS (fără a crea relaţii cu celelalte blocuri), pentru a fi afişat conţinutul acestuia pe un canvas diferit, de tip content, numit CV_JOB. Se vor afişa câte 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, creaţi o nouă fereastră numită WIN_JOB. Dimensionaţi fereastra corespunzător. Titlul ferestrei va fi JOB, iar proprietatea “Hide on Exit” va fi setata Yes. Plasaţi noua fereastră într-o poziţie potrivită relativ la WIN_EMP. Asociaţi ferestrei WIN_JOB canvas-ul CV_JOB.

17. În forma EMP, creaţi un canvas de tip toolbar orizontal, numit Toolbar, în fereastra WIN_EMP. (proprietatea Window)

18. Creaţi cele 3 butoane de mai jos în blocul de control şi plasaţi-le pe canvas-ul Toolbar. Exit_button a fost creat anterior, este nevoie doar să îi modificăm proprietăţile. Toate proprietăţile, cu excepţia lui Label şi a numelor butoanelor, pot fi setate simultan, printr-o selecţie 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. Creaţi un canvas de tip stacked numit CV_HELP pentru a afişa help-ul în fereastra WIN_EMP a formei F_EMP. Dimensiunile vizibile recomandate sunt Viewport Width 270, Viewport Height 215 (pt). Adăugaţi un text corespunzător în acest canvas.

20. Pozitionaţi canvas-ul precedent în aşa fel încât să apară în centrul ferestrei WIN_EMP; organizaţi CV_HELP astfel încât să fie ultimul canvas din secvenţă.

21. Comutaţi pe No proprietatea Visible a lui CV_HELP şi apoi creaţi un buton în blocul de control pentru a ascunde informaţia din Help atunci când nu mai este necesară. Afişaţi acest buton pe CV_HELP. Butonul se va numi Hide_Help_Button (Label: Ascunde Help; Canvas: CV_HELP).

Page 4: Laborator1 APBDOO Master

4

22. Modificaţi forma F_EMP pentru a folosi un canvas de tip tab, astfel: în Layout Editor, ştergeţi obiectul frame care acoperă blocul corespunzător lui EMPLOYEES; creaţi canvas-ul de tip tab, în Layout Editor setaţi Background Color convenabil, iar în Property Palette setaţi Corner style = square, Bevel = none.

23. Redenumiţi canvas-ul de tip tab TAB_EMP. Creaţi 4 pagini de tab şi etichetaţi-le “Informatii”, “Angajare”, “Colectiv” si “Joburi”. Numele vor fi Pag_Info, Pag_Angajati, Pag_Colectiv, Pag_Job.

24. Arangaţi paginile tab-ului (utilizând selecţia multiplă pentru item-uri), astfel încât: - 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 afişa elementele blocului JOBS. În Layout Editor, repoziţionaţi item-urile.

25. Creaţi un trigger When-Button-Pressed asupra lui Show_Help_Button, care foloseşte procedura predefinită SHOW_VIEW pentru a afişa CV_HELP. Indica ţie: WHEN-BUTTON-PRESSED la nivelul butonului Show_Help_Button show_view('CV_HELP'); go_item('hide_help_button');

26. Creaţi un trigger When-Button-Pressed asupra lui Hide_Help_Button care ascunde CV_HELP. Pentru aceasta, folosiţi procedura predefinită HIDE_VIEW. Indica ţie: WHEN-BUTTON-PRESSED la nivelul butonului Hide_Help_Button hide_view( 'CV_HELP' ); go_block( 'bl_emp' );

27. Creaţi un trigger When-Button-Pressed asupra lui Job_Button care foloseşte procedura predefinită GO_BLOCK pentru a afişa blocul corespunzător (BL_JOBS). Indica ţie: WHEN-BUTTON-PRESSED la nivelul butonului Job_Button go_block( 'bl_jobs' );

28. În fişierul F_DEP.fmb, creaţi 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 semnificaţia unui element din lista de valori (ex: ‘locatie’). Modificaţi trigger-ul When-Button-Pressed al lui ID_lov_button astfel încât să apeleze această procedură. Compilaţi şi rulaţi forma în mod Debug. Stabiliţi un breakpoint într-unul din trigger-i şi cercetaţi Call stack. Rulaţi pas cu pas. Indica ţie: 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

Page 5: Laborator1 APBDOO Master

5

message( ' Ati inchis lista de valor i ' ); end if; end; Trigger-ul va avea forma : list_of_values( ' ID_lov ' , ' locatie ' ) ;

29. In forma F_DEP, scrieţi un trigger care se declanşează atunci când se încearcă modificarea codului managerului unui departament. Codul noului manager va trebui să fie al unui angajat din departamentul respectiv. Indica ţie: 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 câmp în tabelul DEPARTMENTS, numit Imagine. Să se introducă acest nou element pe plansa CV_DEP (din forma F_DEP) şi să se modifice valoarea prompt-ului său î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 poziţioneze pe CV_TOOL. Setaţi proprietatea Label = Image Off. Pe planşa CV_TOOL, se va poziţiona şi un buton de ieşire. Plasaţi şi butonul id_lov_button pe CV_TOOL. Indica ţie: 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, corespunzătoare unei imagini, se efectuează comanda:

alter table departments add (imagine bfile); Pentru asocierea câmpului imagine cu imaginea stocată într-un fişier din dir, se execută o comandă de tipul:

update departments set imagine=bfilename('DIR', 'poza3.TIF') where department_id = 10;

31. Să se creeze un trigger care acţionează când este apăsat butonul Image_Button. Trigger-ul va determina valoarea curentă a proprietăţii visible a item-ului Imagine. Dacă valoarea curentă este true, valoarea proprietăţii visible devine false. Eticheta se

Page 6: Laborator1 APBDOO Master

6

va schimba pe Image_Button pentru a reflecta următoarea sa stare (dacă item-ul Imagine este invizibil, eticheta butonului devine “Image On”). Indica ţie: 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, pr operty_false ); set_item_property ( 'control.image_button' , label , 'Imagine On' ); else set_item_property ( 'bl_dep.imagine' , visible, pr operty_true ); set_item_property ( 'control.image_button' , label , 'Imagine Off' ); end if; go_item('bl_dep.department_id'); --este nevoie de a ceasta linie? De ce?

32. Creaţi 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. Modificaţi trigger-ul creat la ex. 29 pentru a afişa manager_alert în loc de mesaj. Indica ţie: 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. Creaţi 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ă execuţia formei se termină. Indica ţie: WHEN_BUTTON_PRESSED la nivelul butonului exit_button set_alert_property( 'question_alert' , alert_messag e_text , 'Doriti sa parasiti forma ?' ); if show_allert ( 'question_alert' ) = alert_button 1 then exit_form; end if;