-poti deasemenea executa functii simulate de taste (Key-Like Functions)
Key-trigger-ele sunt usor de identificat deoarece toate au nume ce incep
cu KEY-.Majoritatea Key-trigger-elor au o legatura one-to-one cu apasarea
tastelor specifice.Adica trigger-ul se activeaza numai cand se apasa o
anumita tasta sau o secventa de taste.
Asa cum se poate vedea din exemplul de mai sus key-trigger-ele ofera
posibilitatea de a atribui multiple functii unei singure taste.Majoritatea
trigger-elor care sunt generate automat cand se creaza un detail form sau un
default master sunt key-trigger-e care realizeaza mutiple functii ale
tastelor.
Nota:Nu se pot redefini toate functiile de taste din SQL*FORMS cu functii
key-triggers.De obicei nu poti redefini urmatoarele functii statice de
taste pentru ca ele sunt des utilizate de catre terminal sau sistemul de
management al interfetei utilizator si nu de catre SQL*FORMS.
Acest trigger se activeaza la intrarea intr-un camp.Este o singura
exceptie aceea ca key-trigger-ele pot executa functii de tasta.Utilizatorii
pot include afisarea unei liste de valori sau un popup editor pentru a
introduce un camp.
Folositi forma de definire a trigger-ului ca sa creati Key trigger si
Event trigger.Doua caracteristici ale trigger-elor regasite numai la key
trigger sunt:
Situatiile speciale sunt:
Limitarea tastelor disponibile in situatiile anterioare
Urmatoarele proceduri suspenda actiunra unui trigger:
In pagina anterioara a trigger-ului,proiectantul a redefinit tastele
[Enter Query] pentru a realiza functii multiple.
Trigger-ul apartine blocului ORD.Aceasta inseamna ca atunci cand cursorul
este intr-un bloc ORD si operatorul apasa [ENTER QUERY] trigger-ul devine activ,
facand prioritare functiile asociate cu [Enter Query].
Actiunile trigger-ului sunt urmatoarele:
Observati ca nu exista corpul procedurii packaged Execute_Query in cadrul
trigger-ului.Functia Enter_Query (pasul 2) suspenda actiunea trigger-ului pana
cand utilizatorul alege o actiune (adica apasarea lui [Execute Query].Pasii 3,
4 si 5 se executa in afara prelucrarii trigger-ului.Trigger-ul reincepe imediat
ce chestionarul este complet.
Redefinirea functiilor tastelor
Nu uitati sa generati si sa testati cum trebuie.
Exemplu de key-trigger:
KEY-EXEQRY on the DEPT Block
---------------------------------------------
EXECUTE_QUERY; GO_BLOCK('EMP');EXECUTE_QUERY;
GO_BLOCK('DEPT');
---------------------------------------------
_________________________________________________________________
| |
| Each Function Key Performs |
| a Standard Action |
| |
| ______ ______ ______ ______ |
| Function | F1 | | F2 | | F3 | | F4 | |
| Keys |____| |____| |____| |____| |
| | | | | |
| | | | | |
| ------- ------- --------- ------- |
| | | | | | | | | |
| |Next | |Next | |Execute| |Clear| |
| |Field| |Block| |Query | |Field| |
| Standard | | | | | | | | |
| Actions |_____| |_____| |_______| |_____|_ |
|________________________________________________________________|
_________________________________________________________________
| |
| Key Triggers Allow Keys |
| To Change Roles |
| |
| ______ ______ ______ ______ |
| Function | F1 | | F2 | | F3 | | F4 | |
| Keys |____| |____| |____| |____| |
| \ | | | |
| \ | | | |
| \ | | | |
| ------- ------- --------- ------- |
| | | | | | | | | |
| |Next | |Next | |Execute| |Clear| |
| |Field| |Block| |Query | |Field| |
| Standard | | | | | | | | |
| Actions |_____| |_____| |_______| |_____| |
|________________________________________________________________|
KEY-TRIGGER-E SI TASTELE ASOCIATE LOR
Tip trigger Functia asociata tastei
----------- -----------------------
Key-CLRBLK [Clear Block]
Key-CLRFRM [Clear Form]
Key-CLRRAC [Clear Record]
Key-COMMIT [Commit/Accept]
Key-CQUERY [Count Query Hits]
Key-CREREC [Insert Record]
Key-DELREC [Delete Record]
Key-DOWN [Down]
Key-DUPFLD [Duplicate Field]
Key-DUPREC [Duplicate Record]
Key-EDIT [Edit]
Key-ENTER [Enter]
Key-ENTQRY [Enter Query]
Key-EXEQRY [Execute Query]
Key-EXIT [Exit]
Key-HELP [Help]
Key-LISTVAL [List]
Key-MENU [Block Menu]
Key-NXTBLK [Next Block]
Key-NXTFLD [Next Field]
Key-NXTKEY [Next Primary Key Field]
Key-NXTREC [Next Record]
Key-NXTSET [Next Set of Records]
Key-PRINT [Print]
Key-PRVBLK [Previous Block]
Key-PRVFLD [Previous Field]
Key-PRVREC [Previous Record]
Key-SCRDOWN [Scroll Down]
Key-SCRUP [Scroll Up]
Key-UP [Up]
Key-UPDREC [Lock Record]
[Beginning of Line] [End of Line] [Refresh]
[Clear Field] [First Line] [Right]
[Copy] [Insert Line] [Scroll Left]
[Cut] [Insert/Replace] [Scroll Right]
[Delete Backward] [Last Line] [Search]
[Delete Character] [Left] [Select]
[Delete Line] [Menu] [Show Keys]
[Display Error] [Paste] [Transmit]
ON-NEW-FIELD-INSTANCE TRIGGER
_________________________________________________________________
| |
| One Key Can Perform |
| Multiple Functions |
| |
| ______ |
| Execute | | |
| Query Key |____| |
| | |
| | |
| | |
| --------- ------- --------- --------- |
| | | | | | | | | |
| |Execute|-->|Next |-->|Execute|-->|Previous| |
| |Query | |Block| |Query | |Block | |
| Standard | | | | | | | | |
| Actions |_______| |_____| |_______| |________| |
|________________________________________________________________|
DEFINIREA UNUI KEY TRIGGER:
KEY-EXEQRY on Master Block
--------------------------
EXECUTE_QUERY;
NEXT_BLOCK;
EXECUTE_QUERY;
PREVIOUS_BLOCK;
REDEFINIREA FUNCTIILOR TASTELOR
KEY-NXTBLK on CUS
---------------------
MESSAGE('This is the last block');
OR
KEY-NXTBLK on CUS
---------------------
PREVIOUS_BLOCK;
KEY-CLRFRM
---------------------
CLEAR_FORM;
:CTL.TODAY := :GLOBAL.TODAY;
:CTL.CURR_USER := :GLOBAL.CURR_USER;
FOLOSIREA LUI KEY-OTHERS PENTRU A ASIGNA ACEEASI FUNCTIONALITATE LA TOATE
TASTELE
-------------------------------------------------
| |
| 1. List of Customers |
| |
| 2. Product Pricelist |
| |
| 3. Order Entry |
| |
| 4. Exit |
| ___ |
| Enter choise and press any key: |__| |
|_______________________________________________|
KEY-OTHERS on MENU block
------------------------------------------------
IF :MENU.CHOISE = 1 THEN
GO_BLOCK('CUS');
ELSIF :MENU.CHOISE = 2 THEN
GO_BLOCK('PRICE');
ELSIF :MENU.CHOISE = 3 THEN
GO_BLOCK('ORD');
ELSIF :MENU.CHOISE = 4 THEN
EXIT_FORM;
ELSE
MESSAGE('Enter a 1, 2, 3 or 4, please');
END IF;
------------------------------------------------
TRIGGER SCOPE SI KEY-OTHERS
_________
| Press |
| [Help]|
|_______|
|
|
----------------------- ------------------------- -----------
| Look for Key-Help on| -->| Look for KEY-OTHERS on| -->| Perform |
| FIELD. If not then | | | FIELD. If not then | | | HELP |
| BLOCK. If not then | | | BLOCK. If not then | | | function|
| FORM. If not then |__| | FORM. If not then |__| |_________|
|_____________________| |_______________________|
| |
If found | If found |
| |
Fire KEY-HELP Fire KEY-OTHERS
FOLOSIREA LUI KEY-OTHERS PENTRU A DEZACTIVA TASTE
KEY-OTHERS on EMP
--------------------------
MESSAGE('Function key unavailable');
KEY-UP on EMP KEY-DOWN on EMP
-------------- ---------------
UP; DOWN;
KEY-PRVBLK on EMP KEY-EXIT on FORM
----------------- ---------------
PREVIOUS_BLOCK; EXIT_FORM;
FEREASTRA DE DEFINIRE A TRIGGER-ULUI SETARILE LUI KEY-TRIGGER
___________________________________________________________________
| |
| ---------------------Trigger Definition----------------------- |
| ------------------------------------------------------------ |
| | Trigger: KEY-MENU | ----For Key Triggers Only---- | |
| | Block: | [ X ] Show Keys | |
| | Field: | Descrip: Purge Directory | |
| | Trigger Style: V3 | | |
| |----------------------------------------------------------| |
| | ---------------------Trigger Text----------------------- | |
| | HOST< 'pu/keep=1'>; | |
| | | |
| | | |
| |----------------------------------------------------------| |
| | ------------------------Comment------------------------- | |
| | | |
| |__________________________________________________________| |
| |
| Enter the name of the block the trigger is attached to. |
| Frm: UNIT17 Blk: ord Fld: Trg: List Rep |
| |
|_________________________________________________________________|
TRIGGER-UL NU AU EFECT IN ANUMITE SITUATII
UN EXEMPLU DE SUSPENDARE A ACTIUNII UNUI TRIGGER
KEY-ENTQRY on the ORD block
---------------------------------------------------------
next_block; clear_block; previous_block;clear_block;
enter_query;
if :ORD.ORDID is not null then
go_block('ITEM'); execute_query; go_block('ORD');
end if;
---------------------------------------------------------
the trigger pauses until
user presses [Execute Query]
ENTER_QUERY
EXECUTE_QUERY
UTILIZAREA KEY TRIGGER-ELOR PENTRU CHESTIONARI
MAI MULTE DESPRE MODUL ENTER QUERY
KEY-EXEQRY on ORD
------------------------------
execute_query; next_block;
execute_query; previous_block;
------------------------------
Acest triggercomplementeaza Key-Exeqry:
KEY-ENTQRY on ORD
--------------------------------
enter_query;
/* trigger suspended */
next_block;
execute_query; previous_block;
--------------------------------
PROCEDURILE RESTRICTED PACKAGED
Aceste proceduri pot fi apelate doar din key trigger-e si din trigger-ele
On-New-Field-Instance.
3 BLOCK MENU * EXIT_FORM(+)
* CLEAR BLOCK 3 FIRST_RECORD
3 CLEAR_EOL GO_BLOCK+
CLEAR_FIELD GO_FIELD+
* CLEAR_FORM(+) 3 GO_RECORD+
CLEAR_RECORD HELP
COMMIT_FORM 3 LAST_RECORD
COUNT_QUERY * LIST_VALUES(+)
CREATE_RECORD * NEW_FORM+
DELETE_RECORD NEXT_BLOCK
3 DO_KEY+ NEXT_FIELD
DOWN NEXT_KEY
DUPLICATE_FIELD NEXT_RECORD
DUPLICATE_RECORD NEXT_SET
3 EDIT_FIELD(+) 3 POST
ENTER PREVIOUS_BLOCK
ENTER_QUERY(+) PREVIOUS FIELD
EXECUTE_QUERY(+) PREVIOUS_RECORD
EXECUTE_TRIGGER+ SCROLL_DOWN
SCROLL_UP
SHOW_KEYS
UP
Key:
+ necesita argument(e)
* echivalent cu V2 dar cu functii suplimentare
(+) argumet(e) optional(e)
3 nou in V3
SINTAXA SI O DESCRIERE PE SCURT A PROCEDURILOR RESTRICTED PACKAGED
afiseaza blocurile meniului si accepta cererile
operatorului.Daca intrarea operatorului este o selectie
valida,cursorul se duce pe blocul cu propietatea
respectiva.
goleste blocul curent.Daca exista schimbari in blocul
curent care nu au fost plasate sau executate,actiunea
lui CLEAR_BLOCK depinde de parametri care au fost
furnizati.
sterge valoarea campului curent de la pozitia curenta a
cursorului pana la sfarsitul liniei sau campului.
sterge intrage valoare a campului curent-indiferent de
pozitia cursorului-shimba valoarea campului la NULL.
goleste form-ul curent.Daca exista schimbari in form-ul
curent care nu au fost plasate sau executate,actiunea
lui CLEAR_FORM depinde de parametri care au fost
furnizati.
goleste inregistrarea curenta din bloc.Daca un query
este deschis in bloc,SQL*Forms scoate o inregistrare
pentru a umple blocul.
identifica numarul de randuri pe care query il
va atribui blocului curent.Daca sunt modificari de facut
in bloc,SQL*Forms permite operatorului sa le faca
inaintea procesului COUNT_QUERY.
creaza o noua inregistrare in blocul curent dupa
inregistrarea curenta.SQL*Forms trece la noua
inregistrare.
sterge inregistrarea curenta din block.Daca un query
este deschis in bloc,SQL*Forms scoate o inregistrare
pentru a umple blocul daca este necesar.
executa key trigger-ul pentru tasta corespunzatoare
procedurii packaged specificate.Daca trigger-ul nu
exista insasi procedura packaged este apelata.
se muta pe instanta,din campul curent,in urmatoarea
inregistrare cu numarul de secventa mai mare.
atribuie campului curent aceeasi valoare pe care o are
instanta acestui camp in inregistrarea anterioara.
copiaza valoarea fiecarui camp din inregisrarea
curenta in campurile corespunzatoare din urmatoarea
inregistrare cu numarul de secventa mai mic.
EDIT_FIELD activeaza SQL*Forms(Run Form) editorul de
camp pentru campul curent si pune form-ul in modul
Edit.
valideaza datele din unitatea curenta
Nota:Acesta este utilizat in special in cadrul blocului.
goleste blocul curent si pune form-ul in modul Enter
Query.Daca sunt modificari de facut,SQL*Forms permite
operatorului sa le realizeze in timpul evenimentului
ENTER_QUERY.
Nota:Puteti specifica anumiti parametri pentru
ENTER_QUERY;pentru detalii vezi SQL*Forms Designers
Reference.
goleste blocul curent,deschide un chestionar,
intoarce numarul de inregistrari selectate.Daca sunt
modificari de facut,SQL*Forms permite operatorului
sa le realizeze in timpul procesului EXECUTE QUERY.
Nota:Puteti specifica anumiti parametri pentru EXECUTE
QUERY;pentru detalii vezi SQL*Forms Designers Reference.
te scoate din form.Daca in form-ul curent sunt
modificari care nu au fost realizate,modul cum
actioneaza EXIT_FORM depinde de parametri pe care i-ati
furnizat.
se muta pe prima inregistrare din lista de inregistrari
a blocului.
se muta pe blocul indicat.Daca blocul respectiv nu
poate fi accesat se intoarce eroare.
se muta pe campul indicat.
foloseste o secventa numerica pentru a se muta pe
inregistrarea respectiva.
HELP afiseaza mesaje corespunzatoare campului curent in
in linia de mesaje.Daca mesajul este deja afisat,HELP
afiseaza fereastra detaliata de help pentru campul
respectiv.
se muta pe ultima inregistrare din lista de inregistrari
a blocului.Daca un chestionar este deschis in bloc,
SQL*Forms aduce inregistrarile ramase selectate in
lista de inregistrari a blocului.
afiseaza lista valorilor campului curent.Lista valorilor
ramane afisata pana cand operatorul apasa [Exit/Cancel]
sau selecteaza o valoare in camp.
Implicit LIST_VALUES utilizeaza parametrul NO_RESTRICT.
Daca utilizati parametrul RESTRICT,SQL*Forms foloseste
cautarea automata si descrierea completa(ca mai jos).
Daca valoarea campului va limita lista la o singura
valoare,SQL*Forms nu afiseaza lista de valori,dar
automat citeste valoarea corecta in camp.
iese din form-ul curent si intra in cel indicat.S-a
terminat form-ul curent.SQL*Forms elibereaza memoria
daca form-ul de iesirea fost folosit.
se muta pe blocul de validare cu urmatorul numar de
secventa mai mare decat blocul curent.Daca nu exista un
astfel de bloc,NEXT_BLOCK se muta pe blocul de validare
cu cel mai mic numar de secventa.
se muta pe blocul de validare cu urmatorul numar de
secventa mai mare decat campul curent.Daca nu exista un
astfel de bloc,NEXT_FIELD se muta pe blocul de validare
cu cel mai mic numar de secventa.
trece la validarea principalei taste camp cu urmatorul
numar de secvecta mai mare decat campul curent.Daca nu
exista o astfel de tasta in campul curent se intoarce
eroare.
se muta pe inregistrarea cu urmatorul numar de secventa
mai mare decat inregistrarea curenta.Daca o astfel de
inregistrare nu exista,SQL*Forms trebuie sa aduca sau
sa creeze o inregistrare.Daca inregistrarea curenta este
o noua inregistrare,NEXT_RECORD esueaza.
aduce alt set de inregistrari din baza de date si se
muta pe prima inregistrare din set.NEXT_SET reuseste
doar daca un chestionar este deschis in blocul curent.
POST scrie date in form pentru baza de date,
dar nu le salveaza in baza.
Nota:POST este prezentat pe larg in unit-ul
Transaction Trigger.
se muta pe blocul de validare cu urmatorul numar de
secventa mai mic decat blocul curent.Daca nu exista un
astfel de bloc,PREVIOUS_BLOCK se muta pe blocul de
validare cu cel mai mare numar de secventa.
se muta pe campul de validare cu urmatorul numar de
secventa mai mic decat campul curent.Daca nu exista un
astfel de camp,PREVIOUS_FIELD se muta pe campul de
validare cu cel mai mare numar de secventa.
se muta pe inregistrarea cu urmatorul numar de
secventa mai mic decat inregistrarea curenta.
scrolleaza lista de inregistrari a blocului curent in
sus pe aproximativ 80% din blocurile afisate.Aeasta
afiseaza inregistrarile de mai jos din blocul
afisate.Daca sunt inregistrari disponibile si un
chestionar este deschis in bloc,SQL*Forms aduce
inregistrari in timpul procesului SCROLL DOWN.
Dupa scrollare,SCROLL_DOWN se muta pe campul din
pozitia cursorului din inregistrarea cu cel mai mic
numar de secventa dintre cele afisate.
scrolleaza lista de inregistrari a blocului curent in
jos pe aproximativ 80% din blocurile afisate.Aceasta
afiseaza inregistrarile de mai sus din blocul afisat.
Dupa scollare,SCROLL UP se muta pe campul din pozitia
cursorului din inregistrarea cu cel mai mic numar de
secventa dintre cele afisate.
SHOW_KEYS afiseaza fereastra Show Keys.Cand operatorul
apasa o tasta functionala,SQL*Forms reafiseaza form-ul
cum era inainte de utilizarea lui SHOW_KEYS.
se muta pe campul din pozitia cursorului din
inregistrarea cel mai mic numar de secventa.
PROCEDURI PACKAGED - EXEMPLE
ON-NEW-FIELD-INSTANCE ON CUS COMMENTS
EDIT_FIELD (10,4,40,10);
KEY-STARTUP on Form
DO_KEY ('execute_query');
KEY-EXIT on Form
EXIT_FORM (DO_COMMIT);
KEY-PRVFLD on ITEM.ITEMID
UP;
KEY-LISTVAL on CUS.CUSTID
LIST_VALUES (RESTRICT);
CATEVA SFATURI LA TRIGGER-E
CAND UTILIZATI PROCEDURI NU UITATI:
ON-VALIDATE-FIELD on EMP.JOB
----------------------------
IF ... THEN
GO_FIELD('EMP.COMM');
END IF;
FRM-40737:Folosirea ilegala a procedurii speciale go_field
in trigger-ul on-validate-field
KEY-NXTFLD on EMP.JOB
---------------------
IF ... THEN
GO_FIELD('EMP.COMM');
END IF;
UNIT 12 EXERCITII
Daca aveti timp:
Pasii a. si b. trebuie utilizati in ordine inversa.De ce?
UNIT 12:SOLUTII
1.
KEY-LISTVAL on ORD.CUSTID
------------------------------------
LIST_VALUES(RESTRICT);
------------------------------------
2.
KEY-CLRFRM
----------------------------------------------------
CLEAR_FORM;
:CTL.TODAY1 := :GLOBAL.TODAY;
:CTL.TODAY2 := :GLOBAL.TODAY;
:CTL.USER1 := :GLOBAL.CURR_USER;
:CTL.USER2 := :GLOBAL.CURR_USER;
----------------------------------------------------
Atentie ca atribuirile globale de sarcini pot fi inlaturate si adaugate
din PRE-FORM TRIGGER.
3.
KEY-NXTFLD on ITEM.QTY
-----------------------------------------
NEXT_RECORD;
-----------------------------------------
4.
KEY-PRVFLD on ITEM.ITEMID
-----------------------------------------
PREVIOUS_FIELD; UP;
-----------------------------------------
5.
KEY-NXTFLD on ITEM.ACTUALPRICE
-----------------------------------------------------
IF : ITEM.ACTUALPRICE IS NULL THEN
:ITEM.ACTUALPRICE: = :ITEM.SCR_STDPRICE;
END IF;
NEXT_FIELD;
-----------------------------------------------------
6.Daca aveti timp:
ON-NEW-FIELD-INSTANCE on CUS.COMMENTS field
------------------------------------------------------------------
MESSAGE('You are in the pop-up editor for the < comments> field');
EDIT_FIELD(1,1,80,22);
------------------------------------------------------------------