Apelarea altor forme
Scopul acestui capitol:
In acest capitol vom afla cum poate fi apelata o forma dintr-o alta.
Vom discuta urmatoarele aspecte:
- Proceduri predefinite pentru apelarea formelor.
- Folosirea variabilelor globale pentru transmiterea parametrilor.
- Citeva triggere folositoare ecranele de ajutor.
- Crearea meniurilor in SQL*Forms.
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
- foloseste variabile globale
- singurele variabile care sint globale pentru sesiunea
de executie a formei ("Runform").
- pentru transmiterea de parametri intre forme:
- Incarcati variabila globala cu valoarea dorita
- Apelati alta forma
- Variabila globala este referita in cea de-a doua forma
pentru:
- a executa un query
- sau incarcarea unui cimp de pe ecran
- sau pentru efectuarea unui test
___----___ ___---___
/ \_____/ \__
/ \
----------- ZONA -----------
| | GLOBALA | |
| FORMA A | | FORMA B |
| | | |
----------- -----------
\_______________________________/
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 CALL
- nu valideaza forma curenta
- executa "savepoint" inaintea apelului
- permite formelor apelate sa foloseasca DML.
- Daca forma apelata contine cimpuri modificate ce n-au fost salvate
- forma apelata se executa in mod "Post-Only"
- numai forma apelanta poate salva.
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:
- salveze factura si noul client.
- apeleze functia CLEAR_RECORD. Aceasta va sterge factura dar va
pastra clientul (daca dupa asta va fi salvat)
- sterge forma, fapt care va strege factura si va anula inregistrarea
noului client.
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.
- Creati o forma bazata pe un bloc de control cu un cimp
modificabil, care va fi meniul.
- 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.
- 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 | | .......... |
------------- ---------------- --------------
- Create on non-base table field
- 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.
- 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.
- 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 |
-------------
- 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
- 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.
- Modificati atributele tuturor cimpurilor din blocul Price, in afara de
ENDDATE, astfel incit sa fie ne-modificabile. Mutati PRODID in pagina 0.
- Puneti forma intr-o pagina Pop-up.
- Generati si testati forma.
- Scrieti triggerele necesare pentru:
- Efectuarea un "Query" la intrarea in forma PRICEHIS. Pentru
amindoua blocurile, actiunea se petrece ca si cum utilizatorul ar
fi apasat [Execute Query].
- La "Query", setati PRODUCT.PRODID cu valoarea din GLOBAL.PRODID,
numai daca acesta exista. Incercati sa rulati forma direct.
Merge totul ok ?
- 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.
- 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].
- Generati PRICEHIS. Apoi reincarcati ORDER si faceti urmatoarele
modificari:
- 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"
<
- 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.
- 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' );
-------------------------------------