Sunteți pe pagina 1din 7

Aplicaii Profesionale in Baze de Date OO - Master Laborator 2 (Oracle 10g Forms Developer)

1. n forma F_EMP, scriei un trigger care populeaz cmpurile min_salary, max_salary ale blocului BL_JOBS (care, dac nu exist, va fi creat) cu maximul i minimul salariilor pentru job-ul respectiv din EMPLOYEES_PNU.
Obs: POST-QUERY la nivelul blocului BL_JOBS SELECT MIN(salary), MAX(salary) INTO :bl_jobs.min_salary, :bl_jobs.max_salary FROM employees_pnu WHERE job_id = : bl_jobs.job_id GROUP BY job_id;

Asigurai-v c trigger-ul a funcionat, observnd valoarea maxim i minim a salariului pentru job-ul FI_MGR n cmpurile blocului BL_JOBS, iar apoi n tabel. Pentru aceasta, n SQL*Plus se d comanda:
select * from jobs_pnu where job_id ='FI_MGR';

2. Asigurai-v c Exit_Button nu are efect n modul Enter Query.


Obs: n proprietile trigger-ului WHEN-BUTTON-PRESSED asupra butonului, setm Fire in EnterQuery Mode la valoarea No.

3. Ajustai interfaa de cereri implicit, astfel: deschidei forma F_EMP; adugai un check box numit Case_Sensitive n blocul CONTROL din form pentru ca utilizatorul s poat specifica dac un query asupra numelui angajailor s fie sau nu case-sensitive. (Se va crea trigger-ul When_Checkbox_Changed asupra lui Control.Case_Sensitive). Obiectul creat se va afla pe Toolbar. Eticheta sa va fi Cautare case-sensitive dupa nume?. Valoarea Checked va fi considerat 1, valoarea Unchecked 0. Se presupune c valoarea iniial este 1 (bifat). Proprietatea Mouse Navigate va avea valoarea No.
Obs: WHEN-CHECKBOX-CHANGED la nivelul lui Case_Sensitive IF :control.case_sensitive = 1 THEN SET_ITEM_PROPERTY( 'bl_emp.last_name' , case_insensitive_query , property_false ); ELSE SET_ITEM_PROPERTY( 'bl_emp.last_name' , case_insensitive_query , property_true ); END IF;

4. Adugai un check box CONTROL.Exact_Match pentru ca utilizatorul s poat specifica dac o condiie dintr-un query asupra numelui unui angajat trebuie sau nu s se potriveasca exact cu valoarea din tabel (dac este acceptata o potrivire inexact, valoarea cutat poate fi parte din valoarea din tabel). (Se va crea trigger-ul Pre-Query asupra blocului BL_EMP ). Setai propretile noului item ca la exerciiul precedent.
Obs: PRE-QUERY la nivelul blocului BL_EMP IF :control.exact_match = 0 THEN :bl_emp.last_name := '%' || :bl_emp.last_name || '%';

END IF;

5. n forma F_DEP, determinai ca ID_LOV s se afieze ori de cte ori utilizatorul introduce o valoare location_id necorespunztoare.
Obs: Proprietatea Validate from list a item-ului location_id va avea valoarea Yes.

6. n forma F_EMP, scriei un trigger de validare pentru a verifica dac hire_date nu este ulterioar datei curente. (Se va crea triggerul When-Validate-Item asupra item-lui hire_date).
Obs: WHEN_VALIDATE_ITEM la nivelul item-ului hire_date IF :bl_emp.hire_date > sysdate THEN MESSAGE ( ' Data angajarii invalida! ' ); RAISE form_trigger_failure; END IF;

7. n forma F_EMP, scriei un trigger de validare pentru a verifica dac pentru angajaii avnd job-ul SA_REP comisionul nu este null. (Se va crea triggerul When-Validate-Record asupra blocului bl_emp). Cnd este necesar un trigger When-Validate-Item i cnd este adecvat unul When-Validate-Record?
IF UPPER(:bl_emp.job_id) ='SA_REP' AND :bl_emp.commission_pct IS NULL THEN MESSAGE ( ' Reprezentantii de vanzari trebuie sa aiba comision! ' ); RAISE form_trigger_failure; END IF;

8. n forma F_EMP, creai un trigger pentru a scrie valorile corecte pentru last_name, job_id, manager_id oricnd apare o validare asupra lui employee_id. Trigger-ul va eua dac angajatul nu este gsit. (When-Validate-Item asupra lui BL_EMP.employee_id).
Obs: WHEN_VALIDATE_ITEM la nivelul lui "employee_id" SELECT last_name, job_id, manager_id INTO :bl_emp.last_name, :bl_emp.job_id, :bl_emp.manager_id FROM employees_pnu WHERE employee_id = :bl_emp.employee_id; EXCEPTION WHEN NO_DATA_FOUND THEN MESSAGE ( ' Cod invalid ' ); RAISE form_trigger_failure;

9. Scriei un trigger When-New-Form-Instance asupra formei F_EMP pentru a executa un query nerestricionat la pornirea formei.
Obs: WHEN_NEW_FORM_INSTANCE la nivelul formei execute_query;

10. n blocul BL_EMP setai proprietatea enabled = No pentru item-ul employee_id. 11. a) Creai o secven pentru a genera valori pentru employee_id. b) Modificai trigger-ul de la exerciiul 8 astfel nct s acioneze doar dac itemul employee_id este enabled.

c) n forma F_EMP, scriei un trigger tranzacional asupra blocului BL_EMP care populeaz cmpul employee_id cu urmtoarea valoare a secvenei. (PreInsert asupra blocului BL_EMP)
a) n SQL*Plus, se d comanda: CREATE SEQUENCE seq_emp_pnu START WITH 900 INCREMENT BY 1 MAXVALUE 1000 NOCYCLE; b) if get_item_property('bl_emp.employee_id', enabled) = 'true' then ... c) PRE_INSERT la nivelul blocului bl_emp SELECT seq_emp_pnu.nextval INTO :bl_emp.employee_id FROM dual; EXCEPTION WHEN OTHERS THEN MESSAGE ( ' Exceptie ' ); RAISE form_trigger_failure;

12. Creai un trigger similar asupra blocului BL_DEP din forma F_DEP care atribuie lui department_id o valoare cnd este salvat o nregistrare. (se consider codul noii nregistrri = codul maxim al nregistrrilor existente + 1). Setai proprietile Required i Enabled =No pentru BL_DEP.department_id. 13. n forma F_EMP, creai trei variabile globale numite GLOBAL.INSERT, GLOBAL.UPDATE, GLOBAL.DELETE, care vor indica respectiv numrul de inserri, actalizri i tergeri. Creai trigger-ii Post-Insert, Post-Update i PostDelete pentru a iniializa i incrementa valoarea fiecrei variabile globale.
Obs: POST_INSERT la nivel de form default_value( '0', 'global.insert' ); --se declara si se -- initializeaza variabila globala insert :global.insert := :global.insert + 1; --procedati asemanator pentru celelalte doua variabile globale, -- in trigger-ii corespunzatori

14. Creai o procedur numit HANDLE_MESSAGE, cu dou argumente. Primul argument va fi numrul mesajului, iar al doilea va fi un indicator de eroare boolean. Aceast procedur folosete cele trei variabile globale pentru a afia un mesaj de salvare particularizat, iar apoi terge variabilele globale. Apelai procedura cnd apare o eroare; parametrii vor fi codul erorii i TRUE. Apelai procedura cnd apare un mesaj; parametrii vor fi codul mesajului i FALSE.
procedure handle_message ( nr_mesaj number, ind_eroare boolean ) is begin if nr_mesaj in (40400, 40406, 40407) then default_value ( ' 0 ', ' global.insert ' ); default_value ( ' 0 ', ' global.update ' ); default_value ( ' 0 ', ' global.delete ' ); message ( ' S-au salvat: ' || :global.insert || ' inreg. introduse ' || :global.update || ' inreg. actualizate ' || :global.delete || ' inreg. sterse '); erase ( ' global.insert ' ); erase ( ' global.update ' );

end;

erase ( ' global.delete ' ); ind_eroare = true then message ( ' A aparut eroarea ' || error_text ); else message ( message_text ); end if; elsif

Obs: ON_ERROR la nivel de form handle_message ( error_code, true ); ON_MESSAGE la nivel de form handle_message ( message_code, false );

15. n forma F_EMP, scriei un trigger On-Logon pentru a controla numrul de ncercri de conectare (s nu fie mai mare dect 3). Folosii procedurile predefinite LOGON_SCREEN (pentru a simula ecranul de logare implicit) i LOGON pentru conectare la baza de date.
Obs: ON_LOGON la nivel de form declare nr_incerc number := 3; conect boolean := false; user_name varchar2(20); passw varchar2(10); host varchar2(10); begin while nr_incerc>0 and conect=false loop logon_screen; user_name := get_application_property(username); passw := get_application_property(password); host := get_application_property(connect_string); logon(user_name, passw || '@' || host, false); if form_success then conect := true; end if; nr_incerc := nr_incerc - 1; end loop; if not conect then message ( ' Ati depasit nr. de incerc ' ); raise form_trigger_failure; end if; end;

16. a) Suprimai coloana imagine din tabelul DEPARTMENTS_PNU. b) Adugai un item imagine n blocul de control. Scriei un trigger care se declaneaz cnd cursorul ajunge n fiecare nregistrare a blocului BL_DEP i populeaz item-ul Imagine cu sigla departamentului, dac exist. Trigger-ul va apela o funcie Get_Dep_Image, care returneaz numele fiierului care conine imaginea departamentului respectiv; funcia va avea ca parametru codul departamentului.
alter table departments_pnu drop(imagine); function Get_Dep_Image ( p_cod return varchar2 is in number )

begin

v_file varchar2(20);

select department_id || ' .gif ' into v_file from departments_pnu where department_id = p_cod; if v_file is null then v_file := ' Nu exista fisier ' ; end if; return v_file; exception when no_data_found then return ' Nu exista fisier ' ; end; Obs: WHEN_NEW_RECORD_INSTANCE la nivel de bloc BL_DEP declare v_file varchar2(20); begin if get_item_property( 'control.imagine ' , visible ) = ' TRUE ' then v_file := Get_Dep_Image(:bl_dep.department_id ); if v_file = ' Nu exista fisier ' then null; else read_image_file( 'c:\my_folder\' || v_file , 'gif' , 'control.imagine ' ); end if; end if; end;

17. n forma F_DEP, modificai trigger-ul care populeaz item-ul imagine atunci cnd este afiat imaginea.
Obs: WHEN_BUTTON_PRESSED la nivelul butonului image_button declare imagine_id item := find_item ( ' departments.imagine ' ); buton_id item := find_item ( ' control.image_button ' ); begin if get_item_property ( ' departments.imagine ' , visible ) = ' TRUE ' then set_item_property ( ' departments.imagine ' , visible, property_false); set_item_property ( ' control.image_button ' , label, ' Imagine On ' ); else set_item_property ( ' departments.imagine ' , visible, property_true ); set_item_property ( ' control.image_button ' , label, ' Imagine Off ' ); end if; end;

18. n forma F_EMP, creai un grup de obiecte, numit Job_Objects, constnd n blocul BL_Jobs, CV_JOBS i WIN_JOBS. 19. Creai un nou modul i copiai grupul de obiecte Job_Objects n acesta.

20. n noua form, creai o clas de proprieti numit ClassA. Includei urmtoarele proprieti i valori:
Proprietate Font Name Format Mask Font Size Justification Delete Allowed Background Color Valoare Arial 99,999 8 Right No Dark Red

21. Aplicai ClassA lui CV_JOBS, max_salary, job_title. 22. Creai un obiect bibliotec, numit Biblio_Obj. Creai dou tab-uri n aceast bibliotec, numite Personal i Corporate. Adugai blocul Control, TOOLBAR i Question_Alert tab-ului Personal al bibliotecii. S se salveze obiectul bibliotec n Biblio_Obj.olb. 23. Creai o form nou si un nou bloc de date pe baza tabelului DEPARTMENTS_PNU. Tragei canvas-ul TOOLBAR, blocul CONTROL i Question_Alert din obiectul bibliotec n noua form. Subclasai obiectele. Unele item-uri nu sunt aplicabile acestei forme. Setai proprietatea Canvas la NULL pentru urmtoarele item-uri: Image_Button, Show_Help_Button, Id_Lov_Button, Hide_Help_Button. Pentru aceast form, TOOLBAR va fi bara orizontal de instrumente. Setai proprietatea Window la Window1 pentru canvas-ul TOOLBAR. Salvai, compilai i rulai forma pentru a testa. 24. ncercati s tergei item-urile de pe canvas-ul NULL. Ce se ntmpl i de ce? 25. S se creeze dou butoane model (sample), unul pentru butoane mari i unul pentru butoane medii n ceea ce privete limea. S se creeze un cmp sample de tip dat calendaristic. Setai limea si formatul corespunztor. Tragei aceste elemente n biblioteca de obiecte. Marcai-le ca SmartClasses. Creai o form nou i un bloc nou de date n aceasta. Aplicai SmartClasses n aceast form. 26. n forma F_DEP, creai un trigger Pre-Form care s asigure c exist o variabil global numit Dep_Id.
Obs: Trigger-ul PRE-FORM va conine instruciunea: DEFAULT_VALUE('', 'GLOBAL.dep_id');

27. Adugai un trigger care s asigure c interogrile asupra blocului BL_DEP sunt restricionate de valoarea lui GLOBAL.Dep_Id.
Obs: Trigger-ul PRE-QUERY pe BL_DEP va conine instruciunea: :BL_DEP.department_id := :GLOBAL.dep_id;

28. n forma F_EMP, creai un buton n blocul de control numit dep_button. Eticheta acestuia va fi Departament. 29. Definii un trigger pentru butonul Control.dep_button care iniializeaz GLOBAL.Dep_Id cu ID-ul departamentului angajatului curent, iar apoi deschide

forma F_DEP, transfernd controlul acesteia. Salvai i compilai fiecare form, iar apoi rulai aplicaia.
Obs: Trigger-ul WHEN-BUTTON-PRESSED va conine: :GLOBAL.dep_id := :BL_DEP.department_id; OPEN_FORM('F_DEP');

30. Modificai trigger-ul asupra lui Dep_Button din F_EMP astfel nct s utilizeze GO_FORM pentru a transfera controlul formei F_DEP dac forma ruleaz deja. n acest scop, folosii funcia predefinit FIND_FORM. 31. Creai un trigger When-Create-Record asupra blocului BL_DEP astfel nct valoarea lui GLOBAL.Dep_Id s fie folosit ca valoare implicit pentru BL_DEP.department_id.
Obs: Trigger-ul WHEN-CREATE-RECORD va conine: :BL_DEP.department_id := :GLOBAL.dep_id;

32. Adugai cod formei F_EMP, astfel nct GLOBAL.Dep_Id s fie actualizat cnd se modific department_id pentru angajatul curent.
Obs: Trigger-ul WHEN-VALIDATE-ITEM va conine: :GLOBAL.department_id := :BL_DEP.dep_id;

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