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:


VALIDAREA



Validarea


Validarea este procesul care determina daca informatia introdusa in forma este valida. SQL*Forms face validarea la patru nivele:


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



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




     [DOWN]

     _____________________
     |            |//////|
     |            |//////|- - -> POST-FIELD- - - - - >POST-RECORD
     |            |//////|                                |
     ---------------------                                |
                     |                                    |
                     |                                    |
                     \/                                   |
      ___________________                                 |
     |            |      |                                \/
     |            |      |< - - - PRE-FIELD< - - - - - - PRE-RECORD
     |____________|______|



MAI MULTE EXEMPLE DE NAVIGARE



Feriti-va de 'Trapa' Navigarii


  1. [Next Field]

  2.                     __________________
                            |                  |
                            |                  \/
                            |
                       POST-FIELD           PRE-FIELD
                            |
                    ________________     ______________
                   |                |   |              |
               A   |________________|   |______________|  B
            
    

  3. PRE-FIELD esueaza in B

  4.                        _____________________
                          |                     |
                          \/                    |
                      PRE-FIELD                 |
                     ______________       _____________
                    |              |     |             |
                    |______________|     |_____________|
    
    

  5. PRE-FIELD esueaza in A

  6. FATAL ERROR la forma!


Un Alt Tip de Forma - On-New-Record