Apelarea altor forme


Scopul acestui capitol:



In acest capitol vom afla cum poate fi apelata o forma dintr-o alta. Vom discuta urmatoarele aspecte:





Forme apelind alte forme

        -----------   CALL               -----------
        | FORMA 1 | -------------------->| FORMA 2 |
        |         |< -------------------- |         |
        -----------             EXIT     -----------

        -----------   CALL_QUERY         -----------
        | FORMA 1 | -------------------->| FORMA 2 |
        |         |< -------------------- |    ?    |
        -----------              EXIT    -----------

        -----------   NEW_FORM           -----------
        | FORMA 1 | -------------------->| FORMA 2 |
        |         |                      |         |
        -----------                      -----------
                                   EXIT         |
                                                |
                                                V

  -----------   CALL   -----------  NEW_FORM  -----------
  | FORMA 1 | -------->| FORMA 2 | ---------->| FORMA 3 |
  |         |          |         |            |         |
  -----------          -----------            -----------
       ^                                           |
       |                   EXIT                    |
       ---------------------------------------------



Apelarea unor forme de catre altele



Exista trei proceduri predefinite pentru acest tip de apelare. Acestea se numesc CALL, CALL_QUERY si NEW_FORM. Diferenta dintre ele este evidenta daca priviti diagrama de mai sus.

Indiferent ce procedura folositi pentru a apela o forma, SQL*Forms va rula noua forma cu aceleasi optiuni "Runform" ca si forma parinte.

CALL
CALL este folositor cind este nevoie destul de des sa fie transferat controlul intre cele doua forme. Datorita faptului ca forma apelant ramine in memorie chiar si dupa ce forma apelata este activata, operatorul poate cistiga timp la intoarcerea din forma apelata la cealalta. Daca memoria este o problema totusi, ar trebui folosita procedura NEW_FORM.

NEW_FORM
Cind aceasta procedura apeleaza o forma, ea renunta la memoria formei apelant (ce s-a terminat). De aceea, NEW_FORM poate fi folosita ca o forma "de legatura" ca in imagine, sau de catre o forma meniu de la care e putin probabil sa se revina. Folositi NEW_FORM ori de cite ori rulati mai multe forme, dar aveti nevoie sa pastrati memoria libera.

CALL_QUERY
CALL_QUERY permite doar cereri in forma apelata; nu sint permise modificari ale utilizatorului sau operate de vreun trigger. Este adesea folosit pentru "help screens" unde o lista de valori nu poate fi adaptata datorita specificitatii aplicatiei ( de exemplu, daca doriti ca ecranul de help sa afiseze mai multa informatie decit este in lista de valori, sau pentru a afisa amindoua inregistrarile - de baza "master" si detaliata ).

Comunicarea intre forme




Comunicarea intre forme



O "variabila globala" este o variabila SQL*Forms care e activa in cadrul unei sesiuni "Runform"; cu alte cuvinte, dupa cum sugereaza si numele, variabilele globale sint accesibile de catre toate formele executate in timpul unei asemenea sesiuni. Aceasta face din ele un mijloc natural de comunicare intre forme. Variabilele de sistem si cimpurile de pe ecran, pe de alta parte, sint locale formei curente. O forma nu poate accesa continutul unei alte forme.

Transmiterea parametrilor



Metoda de transmitere a parametrilor folosind variabile locale e cit se poate de simpla:


Dupa ce o variabila globala a fost definita, aceasta poate fi folosita oriunde ati folosi o variabila obisnuita SQL*Forms.
Retineti ca aceste variabile ramin definite pina cind sint sterse in mod explicit sau pina cind sesiunea curenta este terminata.

Scenariul 1: QUERY-ONLY Help Form


Lavinia insereaza o factura pentru pogo sticks folosind forma "Orders".
        1. Forma Orders:

-------------------------------------------------------------------------
|   Action   Edit   Block   Field  Record  Query  Help                  |
| -------------------- OLYMPIA OWLS Order Entry Screen ---------------- |
|     ------------------------------------------------------------      |
|     |   Order No: 610   CommPlan: A       Order Date: 07/01/87 |      |
|     |  Customer:  101   TKB SPORT SHOP     Ship Date: 08/01/87 |      |
|     |  Sales Rep - ID#: 7521 Name: WARD       Total:    101.40 |      |
|     ------------------------------------------------------------      |
| --------------------------------------------------------------------- |
| | Item  Code      Descrip       StdPrice  ActualPr   Qty    ItemTot | |
| | 1    100860 ACE TENNIS RACKET    40.00     35.00  1         35.00 | |
| | 2    100870 ACE TENNIS BALLS-3    2.80      2.80  3          8.40 | |
| | 3    100890 ACE TENNIS NET       58.00     58.00  1         58.00 | |
| | 4    90909  PIGGLEY WIGGLEY PO   54.99                            | |
| --------------------------------------------------------------------- |
|   Today: Friday, the 31st of May                 User: Aunt Lavinia   |
|                                                                       |
| Press Help to access the price history of this product                |
| Count: x3                                                  Replace>   |
-------------------------------------------------------------------------


Ea doreste mai multe informatii despre preturile produselor asa ca apasa [Help] asa cu ii sugereaza imaginea. Triggerul Key-Help este activat, el selecteaza PRODID din inregistrarea curenta si apeleaza forma Price-History:
   Key-Help on ITEM.ACTUALPRICE
   ---------------------------------------
   :GLOBAL.prodid := :item.prodid;
   CALL_QUERY('price_history');
   ---------------------------------------

        2. Forma Price_History:

        La intrarea in forma Price_History, Key_Startup executa o cautare:

   Key-Startup
   ---------------------------------------
   do_key( 'execute query' );
   ---------------------------------------


Inainte de a prelua inregistrarile este executat un trigger Pre-Query care va restringe cautarea numai la liniile in care este gasita valoarea ceruta pentru PRODID:
   Pre-Query on Product Block
   ---------------------------------------
   :product.prodid := :GLOBAL.prodid;
   ---------------------------------------

        Forma arata cam asa:

---------------------------------------------------------------------------
| ----------------------------------------------------                    |
| | ------------------------------------------------ |                    |
| | | Product: 90909  PIGGLEY WIGGLEY POGO STICKS  | |                    |
| | ------------------------------------------------ |                    |
| | ---------Prices--------- ---------Dates--------- |                    |
| | | Std. Price Minimum   | | Starting  Ending    | |                    |
| | |      15.00     13.50 | | 01-JAN-89 30-JUN-89 | |                    |
| | |      18.00     16.20 | | 01-JUL-89 30-JUN-90 | |                    |
| | |      54.99     45.00 | | 01-JUL-90           | |                    |
| | ------------------------ ----------------------- |                    |
| ----------------------------------------------------                    |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
---------------------------------------------------------------------------


Cind Lav apasa [Exit] se revine automat la forma Orders.

        Exemplu:

    ------------
    |  ORDERS  |
    |----------|
    |          |
    | PRODID   |
    |  ______  |
    ------------
       1. |
          |
          V
       -----------------
   ----| global.prodid |
   |   -----------------
   |   2. CALL_QUERY('PRICE_HISTORY');
   |
   -----------
             |
             V
       4. Pre-Query        3. Key-Startup face un
          Trigger             EXECUTE_QUERY
             |         -----------------
             |         | Price History |
             |         |---------------|
             --------->|               |
                       |               |
                       -----------------


Folosirea lui "Call" in loc de "Call_Query"




Procedura predefinita "POST"





Folosirea procedurii predefinite "POST"
        Sintaxa: POST;


Procedura predefinita POST salveaza modificarile in baza de date, dar nu le face permanente. Asemenea inregistrari devin vizibile numai de catre utilizatorul curent, nu si de ceilalti.
De obicei POST este folosita atunci cind o forma a fost apelata cu modificari majore in forma apelanta.

Exemplu:
Un utilizator insereaza o noua factura si descopera ca aceasta este pentru un nou client. Exista posibilitatea de a apela forma CUSTOMER fara a pierde informatia deja inserata in factura, astfel:
        KEY-HELP on ORD.CUSTID
        ----------------------
        CALL('CUSTOMER');       - CALL executa "savepoint"
                                - CUSTID poate fi lasat vid
                                - CUSTOMER este apelat in mod POST-ONLY

        Utilizatorul insereaza noua inregistrare si iese din forma:

        KEY-EXIT/KEY-COMMIT at form level
        ---------------------------------
        POST;                   - scrie inregistrarea in baza de date
        EXIT_FORM( NO_VALIDATE, - validarea trebuie sa fi avut deja loc
                                  la executia POST
                   NO_ROLLBACK  - altfel schimbarile efectuate vor fi anulate !


Intors la forma ORDERS, acum utilizatorul poate sa:


ATENTIE (ORACLE V6): Nu trebuie sa folositi POST pe sisteme care nu au instalata optiunea de prelucrare a tranzactiilor. Efectuind POST intr-o forma apelata va distruge lock-urile SRX de pe tabelele respective, in acest fel impiedicind alti useri sa faca DML pe acele tabele pina cind forma apelanta este salvata. Aceasta metoda ignora principiul de baza care spune ca lock-urile de acest tip trebuie tinute cit mai putin timp posibil - accesul la terminal ar trebui sa fie blocat pe perioada existentei lock-ului.


Scenariul 2: Returnarea unei valori de la forma Help


        1. Lucrind tot la forma Orders, acum Lavinia vrea sa insereze o
noua inregistrare in tabela de preturi pentru ??? pogo sticks.

-------------------------------------------------------------------------
|   Action   Edit   Block   Field  Record  Query  Help                  |
| -------------------- OLYMPIA OWLS Order Entry Screen ---------------- |
|     ------------------------------------------------------------      |
|     |   Order No: 610   CommPlan: A       Order Date: 07/01/87 |      |
|     |  Customer:  101   TKB SPORT SHOP     Ship Date: 08/01/87 |      |
|     |  Sales Rep - ID#: 7521 Name: WARD       Total:    101.40 |      |
|     ------------------------------------------------------------      |
| --------------------------------------------------------------------- |
| | Item  Code      Descrip       StdPrice  ActualPr   Qty    ItemTot | |
| | 1    100860 ACE TENNIS RACKET    40.00     35.00  1         35.00 | |
| | 2    100870 ACE TENNIS BALLS-3    2.80      2.80  3          8.40 | |
| | 3    100890 ACE TENNIS NET       58.00     58.00  1         58.00 | |
| | 4    90909  PIGGLEY WIGGLEY PO   54.99                            | |
| --------------------------------------------------------------------- |
|   Today: Friday, the 31st of May                 User: Aunt Lavinia   |
|                                                                       |
| Press Help to access the price history of this product                |
| Count: x3                                                  Replace    |
-------------------------------------------------------------------------


Asa ca apasa [Help]. Triggerul Key-Help modificat foloseste procedura CALL de data asta.
        Key-Help on ITEM.ACTUALPRICE
        -----------------------------------------
        :GLOBAL.prodid := :item.prodid;
        CALL('price_history');
        /* on return from price_history */
        :item.scr_stdprice := :GLOBAL.stdprice;
        -----------------------------------------

        2. Forma Price_History:

        La intrarea in forma Price_History sint executate aceleasi triggere:

Key-Startup                    Pre-Query on Product Block
-------------------------      ----------------------------
do_key('execute_query');       :product.prodid := :GLOBAL.prodid;
-------------------------      ----------------------------


Acum Lav insereaza si salveaza o noua inregistrare. Cind ea apasa [Exit] este executat triggerul Key-Exit care permite POSTarea noii inregistrari in baza de date si transfera STDPRICE curent inapoi spre forma apelanta.
---------------------------------------------------------------------------
| ----------------------------------------------------                    |
| |                   Price History                  |                    |
| ----------------------------------------------------                    |
| | ------------------------------------------------ |                    |
| | | Product: 90909  PIGGLEY WIGGLEY POGO STICKS  | |                    |
| | ------------------------------------------------ |                    |
| | ---------Prices--------- ---------Dates--------- |                    |
| | | Std. Price Minimum   | | Starting  Ending    | |                    |
| | |      15.00     13.50 | | 01-JAN-89 30-JUN-89 | |                    |
| | |      18.00     16.20 | | 01-JUL-89 30-JUN-90 | |                    |
| | |      54.99     45.00 | | 01-JUL-90           | |                    |
| | |      70.00     60.00 | | 1-JUN-91            | |                    |
| | ------------------------ ----------------------- |                    |
| ----------------------------------------------------                    |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
---------------------------------------------------------------------------

        Key-Exit/Key-Commit
        --------------------------------------
        :GLOBAL.stdprice := :price.stdprice;
        POST;
        EXIT_FORM( no_validate, no_rollback );
        --------------------------------------

Un alt exemplu:



"Dynamic_Help"



Forma "Dynamic_Help"



Executa o cautare bazata pe numele formei apelante si pozitia cursorului:
        Key-Startup                  Pre-Query
        ---------------------        -----------------------------------
        execute_query;               :form_name := :global.form_name;
        ---------------------        :block_and_field :=
                                        :global.block_and_field;
                                     -----------------------------------

------------------------------------------------------------------------
| ---------------- Ordentry - Aunt Lavinia Style --------------------- |
|      ---------------------------------------------------------       |
|      | I was called from: UNIT17       ORD.ORDERDATE         |       |
|      | -------------------------------------------------------       |
|      | | Orderdate is the date that the order was first      |       |
|      --| phoned in. Many of our order dates refer to 1987 and|       |
|        | earlier. Isn't it about time that we brought the    |       |
|  ------| database up to date ?                               |-----  |
|  | Item|                                                     |ot  |  |
|  |     |                                                     |    |  |
|  |     -------------------------------------------------------    |  |
|  |                                                                |  |
|  ------------------------------------------------------------------  |
|                                                                      |
| Today: Friday, the 31st of May              User: ITOWER             |
|                                                                      |
|        *** For dynamic field level help, press [PF1 F10] ***         |
| Field is protected against update. Press Do or PF4 to cancel         |
| Count: *1                                            Replace         |
------------------------------------------------------------------------

Forma apelanta:



Apeleaza forma "Dynamic_help", setind variabilele globale corespunzatoare cu valoarile numelui formei curente, respectiv pozitia cursorului.
        Key-Help on Form level
        ------------------------------------------------
        :global.form_name := :system.current_form;
        :global.block_and_field := :system.cursor_field;
        call query( 'dynamic_help', no_hide );
        ------------------------------------------------


Folosirea SQL*Forms pentru crearea de meniuri

<

In cazul in care nu dispunem de SQL*Menu, avem totusi citeva posibilitati de creare a meniurilor folosind SQL*Forms.

Meniul blocurilor de control ca forma separata.
  1. Creati o forma bazata pe un bloc de control cu un cimp modificabil, care va fi meniul.
  2. Scrieti un trigger (Key sau Event) pentru verificarea datelor introduse de utilizator si apelarea formei sau raportului necesar.
                                                     ------------------
                                                     | ORDER          |
                                                    /| ENTRY          |
                                                  /  | FORM           |
                 -----------------------        /    ------------------
                 |                     |      /
                 |  MAIN MENU          |    /        ------------------
                 |                     |  /          | PRODUCT        |
                 | 1.Order Entry       |< ------------| MAINT.         |
                 | 2.Product Maint.    | \           | FORM           |
                 | 3.Reporting         |   \         ------------------
                 |                     |     \
                 |                     |       \     ------------------
                 -----------------------         \   | REPORT         |
                                                   \ | .............. |
                                                    \| .............. |
                                                     ------------------
    


Aceasta metoda este usor de folosit. Cantitatea de memorie folosita depinde de care procedura a fost chemata (CALL sau NEW_FORM).

Meniul integral (Integral Menu)



Pentru a micsora consumul de memorie, probabil ati dori sa utilizati un meniu integral, adica unul care exista in majoritatea aplicatiilor accesate in mod curent din aplicatia dvs.
  1. Creati un bloc de control pe cea mai accesata forma din aplicatie.
                   ---------------------------------
                   |  MENU                         |--
                   | 1. Order Entry                | |
                   | 2. Pricelist Maintenance      | |
                   | 3. Product Maintenance        | | ORDENTRY
                   | 4. Reporting                  | |( pag. 2 )
                   |                               | |
                   --------------------------------- |
                     |                   /^\         |
                     ------------------/--|--\--------
                                     /    |    \
                                   /      |      \
                                 /        |        \
                               /          |          \
                  -------------   ----------------   --------------
                  | PRICELIST |   | PRODUCT      |   | .......... |
                  | MAINT.    |   | MAINT.       |   |  REPORT    |
                  | FORM      |   | FORM         |   | .......... |
                  -------------   ----------------   --------------
    


  2. Create on non-base table field

  3. Folositi triggerele Key-Nxtfld sau Key-Others pentru a verifica datele introduse de utilizator si pentru a transfera controlul mai departe dupa cum e necesar. A trigger non-key nu va functiona aici, deoarece n-ar putea permite trecerea la alt bloc din forma.

  4. Cind scrieti triggerele asigurati-va ca operatorul nu se poate intoarce la meniu apasind tastele [Next Block] sau [Previous Block] din blocurile (care nu sint meniuri) apartinind formei.


Alt meniu integral



Metoda descrisa mai jos implica existenta unui meniu al blocurilor de control asociat fiecarei forme din aplicatia respectiva. Formele sint conectate intre ele folosing procedura NEW_FORM, de aceea doar o singura forma este activa in memorie la un moment dat.
  1. Creati un bloc de control cu un singur cimp inserabil pentru fiecare forma din toata aplicatia.
                 --------------------------------------
                 |                                    |
                 |    |---------       ----------|    |
                 V    V        |       |         V    V
             -------------     |       |     --------------
             |  MENU     |     |       |     |  MENU      |
             |  FORM1    |     |       |     |  FORM2     |
             -------------     V       V     --------------
                             -------------
                             | MENU      |
                             | FORM3     |
                             -------------
    


  2. Combinatia de triggere este asemanatoare cu aceea descrisa anterior. Aveti grija sa folositi NEW_FORM pentru apelarea formelor, si nu CALL.


Un meniu cu o tabela de baza



Un astfel de meniu contine coloanele DESCRIPTION, ACTION si TYPE. DESCRIPTION apare pe mai multe linii.

Dupa mutarea cursorului pe optiunea dorita, un trigger tip "Key" este activat sa evalueze tipul (TYPE) actiunii ( de exemplu apelarea unei forme, executia unei comenzi ), si sa substituie numele formei sau comanda folosind cimpul ACTION.
        IF :MENU.TYPE = 'F' THEN CALL (:MENU.ACTION);

        ELSEIF :MENU.TYPE = 'H' THEN HOST
        (:MENU.ACTION); . . . END IF;


                                                 ------------------
                                                 | ORDER          |
                                                /| ENTRY          |
                                              /  | FORM           |
             -----------------------        /    ------------------
             |                     |      /
             |  MAIN MENU          |    /        ------------------
             |                     |  /          | PRODUCT        |
             | 1.Order Entry       |< ------------| MAINT.         |
             | 2.Product Maint.    | \           | FORM           |
             | 3.Reports           |   \         ------------------
             |                     |     \
             |                     |       \     ------------------
             -----------------------         \   | REPORT         |
                                               \ | .............. |
                                                \| .............. |
                                                 ------------------



Sumar Capitolul 18



Trei proceduri predefinite pentru apelarea altor forme:
        CALL            (form_name[,HIDE|NO_HIDE[,DO_REPLACE|NO_REPLACE]]);

        CALL_QUERY      (form_name[,HIDE|NO_HIDE[,DO_REPLACE|NO_REPLACE]]);

        NEW_FORM        (form_name);


        Comparatie intre CALL, NEW_FORM si CALL_QUERY

Numele          CALL            CALL_QUERY              NEW_FORM

Restrictionata  nu              nu                      da

Daca forma ape- forma apelata   Nu e nici o             trebuie
lanta are modi- ruleaza in mod  diferenta               salvata
ficari          POST-Only

Este salvat
contextul       da              da                      nu
apelantului?

Operatii        toate in afara      numai query         toate
admise in       de salvare daca
forma apelata   sintem in mod
                POST-Only

Folositi variabile globale pentru transmiterea parametrilor intre forme:
        :GLOBAL.value := :any_block.desired_value;
        :GLOBAL.flag  := '1';


Odata creata, o variabila globala poate fi accesata de oriunde ati folosi un cimp sau o alta variabila:
        IF :GLOBAL.name = 'HILDEGARD' THEN ...


Pentru operarea unei cautari folosind o variabila globala:
        PRE-QUERY
        --------------------------------------------
        :price.prodid := :global.prodid;
        --------------------------------------------


Folositi Default_Value pentru a va asiguraca o variabila globala exista inainte de a o folosi:
        DEFAULT_VALUE( 'anything', 'GLOBAL.flag' );

Exercitii:


Apelarea altor forme
  1. Creati o forma master/detail numita PRICEHIS. Definiti doua blocuri, dupa urmatoarele specificatii:
            Nume    Tabela de baza  Nr.Crt. Inregistr.afisate Master/Detail
            ------- --------------  ------- ----------------- -------------
            Product Product         1                       1       Master
            Price   Price           2                       5       Detail
    
            Nu selectati "Use Constraints" sau "Delete Details".
            Unificati (Join) dupa PRODID.
    


  2. Modificati atributele tuturor cimpurilor din blocul Price, in afara de ENDDATE, astfel incit sa fie ne-modificabile. Mutati PRODID in pagina 0.

  3. Puneti forma intr-o pagina Pop-up.

  4. Generati si testati forma.

  5. Scrieti triggerele necesare pentru:
    1. Efectuarea un "Query" la intrarea in forma PRICEHIS. Pentru amindoua blocurile, actiunea se petrece ca si cum utilizatorul ar fi apasat [Execute Query].
    2. La "Query", setati PRODUCT.PRODID cu valoarea din GLOBAL.PRODID, numai daca acesta exista. Incercati sa rulati forma direct. Merge totul ok ?
    3. De fiecare data cind STDPRICE isi schimba valoarea ( de exemplu cind inserati o noua inregistrare de preturi ), asignati aceasta valoare la GLOBAL.STDPRICE. ( Probabil veti folosi pentru asta un trigger On-Validate-Field ). Aceasta valoare poate fi pusa in :ITEM.STDPRICE la intoarcerea din forma ORDER.
    4. La iesire sau scriere pe disc, POSTati schimbarile si iesiti din forma fara validare sau refacere. Aveti grija sa schimbati descrierea actiunii tastelor corespunzatoare din meniul [Show Keys].


  6. Generati PRICEHIS. Apoi reincarcati ORDER si faceti urmatoarele modificari:
    1. Redefiniti cimpul ACTUALPRICE:
                      - activati atributul "Automatic Hint"
      
                      - inlocuiti informatia despre cimp cu un mesaj similar cu
                      acesta:
                      "Press [Help] to access the price history of this product"
      
      <

    2. Scrieti un trigger pentru redefinirea KEY-HELP numai pentru cimpul ACTUALPRICE, si care sa faca urmatoarele:
                      - sa puna valorile PRODID si SCR_STDPRICE in variabilele
                      GLOBAL.PRODID si GLOBAL.STDPRICE.
      
                      - sa apeleze PRICEHIS. Asigurati-va ca se pot efectua
                      operatii de tip DML, si de asemenea ca forma Order este in
                      continuare afisata.
      
                      - la iesirea din PRICEHIS scrie continutul GLOBAL.STDPRICE
                      in cimpul SCR.STDPRICE.
      
                      - sterge GLOBAL.PRODID si GLOBAL.STDPRICE.
      


  7. Generati si testati forma.
                    - rulati ORDER.
    
                    - apelati PRICEHIS.
    
                    - actualizati cimpul ENDDATE din ultima inregistrare de pret.
    
                    - Inserati o noua inregistrare de pret.
    
                    - parasiti forma.
    
                    - salvati schimbarile in forma ORDER.
    


SOLUTII


5a.

        KEY-STARTUP la forma
        -------------------------------------
        DO_KEY ('execute_query');
        -------------------------------------
b.
        PRE-QUERY pe blocul PRODUCT
        -------------------------------------
        DEFAULT_VALUE( NULL, 'GLOBAL.PRODID' );
        IF :GLOBAL.PRODID IS NOT NULL THEN
                :PRODUCT.PRODID := :GLOBAL.PRODID;
        END IF;
        -------------------------------------
c.
        ON-VALIDATE-FILELD pentru PRICE.STDPRICE
        -------------------------------------
        :GLOBAL.STDPRICE := :PRICE.STDPRICE;
        -------------------------------------
d.
        KEY-EXIT/KEY-COMMIT la nivelul formei
        -------------------------------------
        :SYSTEM.MESSAGE_LEVEL := 5;
        POST;
        :SYSTEM.MESSAGE_LEVEL := 0;
        EXIT_FORM( NO_COMMIT, NO_ROLLBACK );
        -------------------------------------

6a. Selectati "Automatic Hint" pentru cimpul ITEM.ACTUALPRICE si schimbati
atributul "Hint":
        Hint: Press Help to access the price history of this product.

b.
        KEY-HELP pentru ITEM.ACTUALPRICE
        -------------------------------------
        :GLOBAL.PRODID := :ITEM.PRODID;
        :GLOBAL.STDPRICE := :ITEM.SCR_STDPRICE;
        CALL( 'pricehis', no_hide );

        -- la iesire
        :ITEM.SCR_STDPRICE := :GLOBAL.STDPRICE;
        ERASE ( 'GLOBAL.STDPRICE' );
        ERASE ( 'GLOBAL.PRODID' );
        -------------------------------------