EVENIMENTE DE VALIDARE SI DE NAVIGARE
Continutul acestui capitol
Acum aveti experienta in ceea ce priveste triggerele si stiti sa le
apreciati puterea. Acest capitol este alcatuit pentru a va extinde
cunostintele despre triggere prin introducerea unor noi tipuri de
triggere si concepte.
Subiectele discutate includ:
- Mai multe despre Validare
- Triggere de navigare
- Navigare interna/externa
VALIDAREA
- Validarea verifica daca informatia introdusa este valida
- SQL*Forms valideaza cand:
- cursoruliese din unuitatea de validare SAU
- este invocata functia Enter SAU
- este invocata o actiune
- Unitatea de validare
- determina cand valideaza SQL*Forms
- cea mai comuna unitate este 'campul'
Validarea
Validarea este procesul care determina daca informatia introdusa in
forma este valida. SQL*Forms face validarea la patru nivele:
- Camp
- Verifica starea campului
- Valideaza caracteristicile campului
- Activeaza trigger-ul Post-Change
- Activeaza trigger-ul On-Validate-Field
- Inregistrare
- Verifica strea inregistrarii
- Valideaza toate campurile
- Activeaza trigger-ul On-Validate-Record
- Bloc
- Valideaza toate inregistrarile din bloc
- Forma
- Valideaza toate blocurile din forma
Daca toate campurile din inregistrare sunt valide, inregistrarea este
valida. Similar, daca toate inregistrarile din bloc sunt valide, blocul
este valid; si, daca toate blocurile din forma sunt valide, forma este
valida.
Unitatea de validare
Unitatea de validare determina cantitatea maxima de informatie care
poate fi introdusa inainte ca SQL*Forms sa initieze validarea. Daca
unitatea de validare este 'camp', SQL*Forms produce validarea campului
cand iese din el. In majoritatea sistemelor unitatea de validare este
campul. Daca, cumva, ati construit forme pentru a fi rulate pe un
terminal Block Mode, va trebui probabil sa schimbati unitatea de
validare cu 'bloc'. Vezi Anexa C pentru consideratii Block Mode.
Cand face SQL*Forms validare?
SQL*Forms valideaza cand:
* cursorul iese din unitatea de validare
sau
* user-ul apasa [Enter] sau se executa procedura impachetata
Enter
sau
* e invocata o actiune
Ce trebuie sa retineti despre validare
- In Enter Query Mode nu se activeaza nici un trigger de validare.
- Cand validarea exista depinde de unitatea de validare.
- Campurile sunt marcate ca 'modificate' dupa ce un camp este alterat,
daca user-ul tipareste intr-o valoare sau trigger (Post-Query) facand
modificarea.
- Toate campurile din inregistrarea NEW sunt marcate ca modificate dupa
ce primul camp din inregistrare este alterat.
- Daca validarea modifica valoarea campului care este validat si
validarea reuseste, campul este marcat Valid. SQL*Forms nu va
revalida inregistrarea.
- Trigger-ele Post-Change pot fi folosite pentru validare dar sunt
activate si la cerere.
- Trigger-ele On-validate-field sunt cele mai comune pentru validarea
modificarilor de date la nivelul campului.
Exemple de trigger de validare
Exemplul 1: ON-VALIDATE-RECORD - Un nou tip de trigger
Avantajul lui ON-VALIDATE-RECORD este ca se activeaza dupa ce user-ul a
terminat de facut schimbarile dorite in inregistrarea curenta. In
trigger-ul de mai jos, nu conteaza daca COMM a fost inainte sau dupa
SAL.
On-Validate-Record on EMP Block
--------------------------------------------------
IF :emp.comm > :emp.sal THEN
MESSAGE ( 'Commission cannot exceed salary.' );
RAISE FORM_TRIGGER_FAILURE;
END IF;
--------------------------------------------------
Exemplul 2:
On-Validate-Field on EMP Block
---------------------------------------------------
SELECT deptno
INTO :GLOBAL.deptno
FROM emp
WHERE :emp.deptno = deptno;
EXCEPTION
WHEN NO_DATA_FOUND THEN
MESSAGE ( 'Invalid Departament - please
press [List] for help' );
RAISE FORM_TRIGGER_FAILURE;
WHEN TO_MANY_ROWS THEN NULL;
---------------------------------------------------
TRIGGERE DE NAVIGARE
Tipul Utilizari Posibile
-------- ------------------------------
Pre-Form - valideaza user-ul, ora zilei, etc.
- initializeaza blocurile de control
- apeleaza o alta forma pentru a afisa mesaje
Post-Form - realizeaza intretinerea, precum stergerea
variabilelor globale inainte de iesire
- afiseaza mesaje user-ului
Pre-Block - autorizeaza accesul la bloc
- initializeaza campurile din bloc
(intr-o singura inregistrare bloc)
Post-Block - afiseaza mesaje user-ului
- apeleaza o alta forma
____
Pre-Field |
|--- - seteaza variabilele globale
Pre-Record |
----
____
Post-Field |
|--- - 'curata' variabilele globale
Post-Record |
----
Trigger-e de navigare
'Navigare' inseamna modificarea locatiei cursorului. Ea apare cand
user-ul sau un trigger determina cursorul sa se mute catre alt obiect.
O forma a navigarii logice apare cand SQL*Forms 'se muta' intern catre
un obiect in timpul procesarii evenimentului. Vezi exemplele din
urmatoarele doua pagini.
Pe pagina anterioara se afla o lista completa a trigger-elor de
navigare cu cateva utilizari sugestive. In prima versiune de SQL*Forms,
trigger-ele de navigare au fost adesea folosite pentru a valida
intrarea user-ului. O data introduse tipurile de trigger:
On-Validate-Field si On-Validate-Record, nu va mai fi necesara
folosirea lui Post-Field si Pre-si Post-Record pentru acest scop.
In mod normal, definiti trigger-ele Pre- si Post-Field la nivelul
campului; Pre- si Post-Record/Block la nivelul blocului; si Pre-si
Post-Form la nivelul formei.
Trigger-e de navigare si unitatea de validare
Trigger-ele de navigare nu se activeaza daca apartin unei unitati mai
mici decat unitatea de validare curenta. De exemplu, daca unitatea de
validare este Inregistrare, trigger-ele Pre- si Post-Field nu sunt
active. Daca unitatea de validare este Forma, doar trigger-ele de
navigare Pre- si Post-Form vor fi active.
Cand se activeaza trigger-ele de navigare?
Trigger-ele de navigare se activeaza incepand cu cea mai mica unitate
aplicabila. De exemplu, la iesirea dintr-o forma, trigger-ele de
navigare se vor activa in aceasta ordine:
Post-Field > Post-Record > Post-Block > Post-Form
Ce se intampla cand un trigger de navigare esueaza?
Daca un trigger de navigare esueaza, cursorul se intoarce la locatia sa
initiala (adica, unde era anterior esuarii trigger-ului). User-ului i
se va parea ca cursorul nu s-a mutat deloc. Din acest motiv,
asigurati-va ca trigger-ul de navigare afiseaza un mesaj in caz de
esec; altfel, user-ul va apasa aceeasi tasta din ce in ce mai tare,
fara folos.
Esuarea unui trigger de navigare poate cauza o eroare fatala formei. De
exemplu, esuarea lui Pre-Form, Pre-Block, Pre-Record, sau Pre-Field la
intrarea in forma va anula executia formei.
NAVIGAREA
- Externa - miscarea vizibila a cursorului
- Interna - navigarea evenimentului
- realizata de SQL*Forms pentru evenimente sigure
- modificari ale unitatii de navigare (cursor 'logic')
- cursorul fizic poate sa nu se mute
- Un exemplu de eveniment navigabil
[DOWN]
_____________________
| |//////|
| |//////|- - -> POST-FIELD- - - - - >POST-RECORD
| |//////| |
--------------------- |
| |
| |
\/ |
___________________ |
| | | \/
| | |< - - - PRE-FIELD< - - - - - - PRE-RECORD
|____________|______|
MAI MULTE EXEMPLE DE NAVIGARE
- La intrarea intr-o forma:
- - - - -
| |
| |
- - - - -
\
PRE-FORM
\
PRE-BLOCK
\
PRE-RECORD
\
PRE-FIELD
__________________
| ______ ______ |
| |/ | | | |
| |/ | | | |
| ------ ------ |
| ______________ |
| |____|__|___|__| |
| |____|__|___|__| |
|__________________|
- La commit
Start Commit
/
POST-BLOCK
/
POST-RECORD
/
POST-FIELD
/
_______
| _ |
| |_| |
| |
|_______|
Feriti-va de 'Trapa' Navigarii
- [Next Field]
-
__________________
| |
| \/
|
POST-FIELD PRE-FIELD
|
________________ ______________
| | | |
A |________________| |______________| B
- PRE-FIELD esueaza in B
-
_____________________
| |
\/ |
PRE-FIELD |
______________ _____________
| | | |
|______________| |_____________|
- PRE-FIELD esueaza in A
- FATAL ERROR la forma!
Un Alt Tip de Forma - On-New-Record