Oracle Apps Forms


MODEL WINDOW
---------------------
--IF IT IS ACTIVE,NAVIGATION NOT POSSIBLE TO   ANY OTHER WINDOW
#IT ALWAYS NEESD RESPONSE

MODELESS WINDOW--default
                                    --generally used
------------------------
--IF IT IS ACTIVE,NAVIGATION POSSIBLE TO ANY   OTHER WINDOW

CONTENT CANVAS
-----------------------
--ONLY ONE CONTENT CANVAS CAN BE DISPLAYED AT   RUN TIME ON ONE APPL WINDOW AT A TIME
  WHY?
  --CONTENT CANVAS OCCUPIES THE WHOLE AREA      OF APPLICATION WINDOW


STACKED CANVAS
-----------------------
--MORE THAN ONE STACKED CANVAS CAN BE   DISPLAYED AT RUN TIME ON ONE APPL WINDOW     AT SAME TINE
  HOW?

CONDITIONAL QUERY
--by using default menu
---------------------------------
--CLICK ON ENTER(QUERY)
   --ENTER THE COND VALUE INTO THE ITEM
      --CLICK THE EXECUTE(QUERY)

COMPLEX QUERY COND
----------------------------
--CLICK ON ENTER(QUERY)
    --ENTER THE BIND VARIABLE IN ANY ITEM
        --CLICK ON EXECUTE
           # IT OPEN A QUERY/WHERE WINDOW
         --WRITE THE QUERY COND
             IN THE WINDOW AS REQUIREMENT

--------------------------------------A--
DESIGNING AN APPLICATION BASED ON
CONTROL BLOCK
-----------------------------------------------
--CREATE CONTROL BLOCK(manually)
    --CREATE A CANVAS
      --PLACE AT LEAST ONE  USER         INTERACTIVE ITEM  ON CANVAS
         --go to item property
           --go to physical section
               --go to canvas
                   --select the canvas name

# TABLE NAME & BLOCK NAME MAY BE
            --SAME   OR
            --DIFFERENT
           
CONTROL BLK ----->DATA BLK
-----------------------------------
--GO TO CONTROL BLK PROPERTY
    --GO TO DATABASE SECTION
         * DATABASE BLOCK=YES    --default
         * Query data source type=table --default
         * Query data source name=<tbl_name>  emp

DATA BLK ----->CONTROL BLK
* Query data source name=<no any table name>
--------------------------------------------------

HOW TO CREATE GUI ITEM
-------------------------------
            * LIST ITEM
            * RADIO BUTTON
            * CHECK BOX
-----------------------------------------------------------
* LIST ITEM
----------------
TYPE OF LIST ITEM
---------------------
            1. POPULIST
            2. TLIST
            3. COMBO BOX


CREATE TABLE SUPPL
(
ID NUMBER(4),
NAME VARCHAR2(10),
SEX VARCHAR2(1),
CATEGORY VARCHAR2(1),
LOCAL VARCHAR2(1),
COUNTRY VARCHAR2(1),
FOREIGN VARCHAR2(1),
TAX_TYPE VARCHAR2(3)
);

# WHEN WE DELETE THE ITEM FROM CANVAS   ,THAT ALSO DELETED FROM BLOCK

1. POPULIST
--------------------
--CREATE A POPULIST LIST ITEM
--DEFINE FOR LIST ITEM
            1. ELEMENTS    &
            2. VALUE

ELEMENTS
--VISIBLE TO USER FOR SELECTION AT RUN TIME

VALUE
--FOR SELECTED ELEMENTS,THIS VALUE GOES TO
   COLUMN OF TABLE AFTER COMMIT

# ELEMENT & VALUE MAY BE
            --SAME OR
            --DIFFERENT
                depending on requirement

stps
---------
GO TO LIST ITEM PROPERTY
    --CLICK ON
            ELEMENTS IN LIST
        --DEFINE
            * ELEMENT &
            * VALUES

--DEFAULT VALUE FOR LIST ITEM
-----------------------------------------
--GO TO LIST ITEM PROPERTY
    --GO TO DATA SECTION
       --GO TO INITIAL VALUE=S

$$DATE$$
--------------------------------
TLIST
------
--SCROLL BAR VISIBLE AT RUN TIME,NOT AT    DESIGN TIME
   --IT IS VISIBLE IF ALL ELEMENTS NOT       DISPLAYED IN TLIST AT RUN TIME

--DEFINE
            --ELEMENTS
            --VALUES
--GO TO TLIST PROPERTY
    --CLICK ON ELEMENTS IN LIST


#THE SELECT ELEMENT FROM TLIST ALWAYS    ACTIVATED

RADIO BUTTON
------------------------
--CREATE RD GRP
--CREATE RD BUTTON
--DEFINE THE VALUE FOR RD BUTTON
   --GO TO RD BUTN PROPERTY
       --RADIO BUTTON VALUE=M/F
--DEFINE THE INITIAL VALUE FOR
        RADIO GROUP
--------------------------------
CHECK BOX
---------------
--CREATE CHK BOX
--DEFINE THE VALUE FOR
            * WHEN CHECK BOX CHECKED
                 * WHEN CHECK BOX UNCHECKED
                 --any one is mandatory  
                 --go to chk box propertry

# HOW TO REMOVE ANY ITEM FROM CANVAS
    WHICH SHOULD BE AT OBJ NVG

--SEND THE ITEM TO PRE-DEFINED CANVAS
           
                  <NULL>

HOW TO MAKE AN ITEM
            NON-INTERACTIVE
------------------------------------------
            --DISPLAY ITEM     OR
                   --only for text item
                 --ENABLED=YES/NO    --select NO
                                                      --default  YES

                   for
                     text_item
                     GUI ITEM

-----------------------------------------------------
LOV--list of values
------
-- IT IS A DATA STRUCTURE LIKE A TBALE
--IT GET DATA FROM
            RECORD GROUP
#RECORD GROUP
--IT IS ALSO A DATA STRUCTURE LIKE A TABLE
--IT POPULATE DATA TO
            --LOV
            --LIST_ITEM
--RGP CAN ALSO BE USED AS
            PARAMETER FOR
            --REPORTS OR
                --GRAPHICS
             to pass a bunch of values at a time

TYPE OF RECORD GROUP
---------------------------
            1. QUERY-BASED RGP
            2. NON-QUERY BASED RGP
            3. STATIC RGP

1. QUERY-BASED RGP
------------------------
-- A QUERY IS ASSOCIATED TO THE RGP
--IT IS DYNAMIC
--IT CAN BE CREATED AT
            # DESIGN TIME--object navigator
            # RUN TIME --using program
--it is generally used


2. NON-QUERY BASED RGP
--------------------------------
--NO QUERY ASSOCIATED TO THE RGP
--IT MAY BE
            * DYNAMIC  OR
            * STATIC
--IT CAN BE CREATED AT
            # RUN TIME ONLY
            # DESIGN TIME --not allowed


3. STATIC RGP
---------------
--NO QUERY ASSOCIATED WITH RGP
--IT IS ALWAYS
            * STATIC
--IT CAN BE CREATED AT
            # DESGIN TIME ONLY
            # RUN TIME --not allowed

NOTE
--------
--A LOV CAN BE ATTACHED TO ONLY ONE RGP    AT A TIME
--AT RUN TIME,WE CAN ATTACH SAME LOV TO    DIFFERENT RGP BUT AT A TIME TO ONLY ONE    RGP
--MORE THAN ONE LOV CAN BE ATTACHED TO    SAME RGP
--RGP & LOV CAN BE CREATED SEPARATELY    AND WILL BE ATTACHED TOGETHER
--LOV CAN BE CREATED BY
            * WIZARD--generally used
            * MANUALLY
# WHEN WE CREATE LOV THROUGH WIZARD
   AND BASED ON QUERY,automatically a RGP    created and attached to the LOV
   --this technique is generally used

USE OF LOV
------------
            1. HELP BOX
            2. ASSIGNMENT
            3. VALIDATION

------------------------------------------------
HOW TO CREATE A LOV
             WIZARD(based on query)
---------------------------------------------
--DB CLICK ON LOV AT OBJ NVG
   --SELECT (based on query)
     --WRITE THE RGP QUERY
          SELECT * FROM DEPT


--ATTACH LOV TO ITEM
    --GO TO ITEM PROPERTY
       --GO TO LOV SECTION
          --SELECT THE LOV NAME


HOW TO INVOKE LOV WHICH
IS ATTACHED TO ITEM

 PRESS F9 when control on the item

--to customise the look of lov
    --go to lov property
      --design as requirement
              FONT
              COLOR


HOW TO DO ASSIGNMENT
------------------------------
--GO TO PROPERTY OF LOV
  --GO TO COLUMN MAPPING PROPERTIES
      --DEFINE THE
              # RETURN ITEM VALUE
                 <BLK_NAME>.<ITEM_NAME>
                   EMP.DEPTNO
        OR
      --click on browse  &
          select the item name from list

HOW TO DO VALIDATION
------------------------------
--GO TO ITEM PROPERTY(LOV ATTACHED)
   --GO TO LOV SECTION
      --VALIDATE FROM LIST=YES

-------------------------------

SEARCHING TECHNIQUE IN LOV
--------------------------------------
            1. FIND  method
            2. PANEL method

----------------------------------------

# CREATING
          RECORD GROUP &
          LOV SEPARATELY
   AND ATTACH THEM TOGATHER
---------------------------------------
--DB CLICK ON RGP AT OBJ NVG
           * STATIC
           * BASED ON QUERY  --click on it
   --WRITE THE QUERY

--DB CLICK ON LOV
            * WIZARD
                      # based on query
                      # existing record group
            * MANUALLY
               --select any one


* MANUALLY
--GO TO LOV PROPERTY
   --CLICK ON COLUMN MAPPING
      --DEFINE THE LOV COLUMNS BASED ON
         RECORD GROUP
#attaching the lov to rgp
--CLICK ON RECORD GROUP(LOV PROPERTY)
    --SELECT THE RGP NAME

-----------------------------------------
STATIC RGP
--DB CLICK ON RGP
   --CLICK ON  * STATIC
     --DEFINE
            # RGP COLUMN/datatype   &
                # RGP COLUMN VALUE

     
NOTE
---
WE CAN POPULATE LIST ITEM DYNAMICALLY
AT RUN TIME BASED ON DATABASE
  --by using program
---------------------------------------------

HOW TO USE TAB CANVAS
--------------------------------

HOW TO DESIGN
            MASTER/DETAIL FORM
-----------------------------------------------
                REQUISITION FORM
            PURCHASE ORDER FORM
                RECEIVING FORM
                INVOICE
----------------------------------------------

IMPLEMENTATION OF
MASTER/DETAIL FORM
------------------------------
# CREATE MASTER FORM
       --based on pk table
# CREATE DETAIL FORM
      --based on fk table

TYPE OF BLOCK
--based on no of records dispalyed
---------------------------------------
            1. SINGLE RECORD BLOCK
                    --only one recd dispalyed
            2. MULTI-RECORD BLOCK
                    --more than one recd displayed
---------------------------------------------------

nxt class

--CREATING RELATION B/W
   MASTER/DTL BLOCKS
-----------------------------------------------
# EACH BLOCK HAVING ITS OWN RELATION    NODE AT OBJECT NVG

--WE CAN CREATE RELATION BY USING THE
            RELATION NODE
                --used when both blocks have been  created
# USE relation node of master block
--DB CLICK ON RELATION NODE OF MASTER       BLOCK AT OBJ NVG
     --CLICK ON SELECT button
         --SELECT THE DETAIL BLOCK NAME
             --WRITE THE JOIN-CONDITION
                in-side the join-cond window
  <blkm_name>.<commn_item>=
       <blkd_name>.<commn_item>   
             EMP.DEPTNO=DEPT.DEPTNO
          click on   ok button
---------------------------------------------------

# WHEN WE CREATE    RELATION,AUTOMATICALLY
            FORM TRIGGERS  &
                PROGRAM UNITS(procedures)
                created to maintain the data integrity      b/w master & detail block

HOW MANY FORM TRIGGERS & PROGRAM UNITS?
------------------------------------------------
FORM TRIGGERS=03
     trg levels
     -----------
     1. form level             =01 trigger
                                       ON-CLEAR-DETAILS
     2. master block level=02 triggers
                                      ON-POPULATE-DETAILS
                                                ON-CHECK-DELETE-MASTER

    PROGRAM UNITS=03
            * Check_Package_Failure
            *Clear_All_Master_Details
            *Query_Master_Details

Relation Name
------------------
    <mst_blok>_<dtl_blk>
--it can be changed

 EMP.DEPTNO=DEPT.DEPTNO

MASTER DELETE COMDITIONS
--------------------------------------
            1. CASCADING
            2. ISOLATED
            3. NON-ISOLATED --default

1. CASCADING
--WHEN WE DELETE MASTER   DATA ,AUTOMATICALLY  
  CHILD DATA ALSO   DELETED
                 --PRE-DELETE
2. ISOLATED
--WHEN WE DELETE MASTER DATA,
  NO EFFECT ON CHILD DATA
3. NON-ISOLATED --default
--WE CAN NOT DELETE MASTER DATA IF ANY    CHILD DATA EXISTS
   --1st delete child data then
      delete master data

--------------------------------------------------

COORDINATION PROPERTY
-------------------------------
--IT CONTROL THE QUERY BEHAVIOUR OF    DETAIL BLOCK WHEN WE DO QUERY AT      MASTER BLOCK

TYPE
------
1. AUTO-QUERY --default
2. DEFERRED


1. AUTO-QUERY --default
--when master data retrieved,immediately child    data also retrieved

2. DEFERRED
    --child data not displayed immediately
       along with master data

      type
      -----
        1. deferred with auto-query
        2. deferred without auto-query

1. deferred with auto-query
--when control goes to detail block,immediately    child data displayed

 2. deferred without auto-query
--we have to do separate query
    for child data

PREVENT MASTERLESS OPERATION
            CHECKED
            UNCHECKED  --default

--------------end---------------------------
# COMBINATION BLOCK
# SUMMARY BLOCK --6i
----------------------------------------
--for salcomm
------------------------
--GO TO PROPERTY OF SALCOMM
   --GO TO CALCULATION SECTION
      --CALCULATION MODE=FORMULA
         --CLICK ON FORMULA
             --WRITE THE PRGM
                  :SAL+NVL(:COMM,0)


--for sum(sal)
-------------------
--go to property of sumsal
   --go to calculation section
     --calculation mode=summary
        *summary function=sum
        *summarized block=emp
        *summarized item=sal

--go to block property
   --go to records section
     --query all records=yes

------------------------------------

PROGRAMMING IN D2K
-----------------------------
--BY USING
            * FORM TRIGGERS
            * FORM BUILT-INS
                 WITH PL/SQL BLOCK



FORM TRIGGERS
--------------------
--IT IS A PL/SQL BLOCK ASSOCIATED WITH ANY    EVENT
--IT IS FIRED WHEN EVENT OCCURED
--IT IS USED FOR
            --DATA PROCESSING
            --VALIDATION
            --PASSING PARAMETER
--FORM BUILDER HAVING ITS OWN EVENTS
TYPE OF EVENTS
------------------
            1. EXTERNAL EVENTS
                     --done by user
            2. INTERNAL EVENTS
                     --due to navigation

COMPONENT OF FORM TRIGGERS
---------------------------------------
            * TYPE--pre-defined
            * SCOPE--pre-defined
            * CODE--user written progm

nxt class

TYPE
-------
PRE-
POST-
WHEN-
ON-
KEY-
-------------------
PRE-
--IT IS FIRED JUST BEFORE THE EVENT TAKE PLACE
            PRE-FORM
            PRE-BLOCK
            PRE-RECORD
            PRE-TEXT-ITEM
POST-
--IT IS FIRED JUST AFTER THE EVENT TAKE PLACE
           
            POST-FORM
            POST-BLOCK
            POST-RECORD
            POST-TEXT-ITEM

WHEN-
--IT IS FIRED JUST AFETR ALL DEFAULT    PROCESSING   OVER
  --it is fired when the control focused to the form     object
 --generally used for initialization

            WHEN-NEW-FORM-INSTANCE
            WHEN-NEW-BLOCK-INSTANCE
            WHEN-NEW-RECORD-INSTANCE
            WHEN-NEW-ITEM-INSTANCE

ON-
--IT IS USED TO REPLACE THE DEFAULT PROCESEE
   IN CASE OF DML operation
  --generally used for non-base table
            ON-INSERT
            ON-DELETE
            ON-UPDATE

KEY-
--SOME FORM TRIGGERS ARE ASSOCIATED TO THE    SPECIFIC KEY
--IF THE KEY IS PRESSED,THE TRIGGER IS FIRED
            KEY-NEXT-ITEM
                          when we press(ENTER/TAB)
                 KEY-UP
                 KEY-DOWN
                 etc
                # function key
                         F1/F2/F3--
---------------------------------------------


When-Clear-Block
When-Create-Record
When-Database-Record
When-Remove-Record

BIND VARIABLE OF D2K
----------------------------------
--A VARIABLE DEFINED IN HOST ENVIRONMENT IS  KNOWN AS BIND VARIABLE
--IT USES   :  AS PREFIX
--IT CAN HOLD ONLY ONE VALUE AT A TIME
TYPE OF BIND VARIABLE USED IN D2K
------------------------------------------------
            1. ITEM VARIABLE
            2. GLOBAL VARIABLE
            3. PARAMETER VARIABLE
            4. SYSTEM VARIABLE

--------------------------------------------------------
1. ITEM VARIABLE
--ITEM CAN BE USED AS VARIABLE IN PL/SQL    BLOCK
    :<BLOCK_NAME>.<ITEM_NAME>

    :EMP.EMPNO
     --block name is not mandatory

2. GLOBAL VARIABLE
--IT IS USED TO PASS/RECEIVE VALUE FROM
            FORM TO FORM
            FORM TO REPORTS
            FORM TO GRAPHICS
--DATATYPE=CHAR(255)
--IT MUST BE INITIALIZED
   --its value can be changed during execution
--it is open till session
--it uses a keyword
            GLOBAL
--IT CAN BE DEFINED AT ANY LEVEL
            F/B/I
   WHEN-NEW-FORM-INSTANCE
   WHEN-NEW-BLOCK-INSTANCE
    :GLOBAL.<VAR_NAME>:=' ';
    :GLOBAL.DNO:=' ';

--recomendation to avoid it if not required

3. PARAMETER VARIABLE
--it is also used to pass value
            FORM TO FORM
            FORM TO REPORTS
            FORM TO GRAPHICS
--DATATYPE=NUMBER/DATE/CHAR
--INITIALIZTION IS NOT MANDATORY
--NOT OPEN TILL SESSION
--IT USES A KEYWORD
            PARAMETER
--IT IS DEFINED AT DESIGN TIME AT OBJECT    NAVIGATOR

      :PARAMETER.<VAR_NAME>
      :PARAMETER.PDNO:=10;
    
--recomendation to use in place
  of GLOBAL variable

4. SYSTEM VARIABLE
--IT IS PRE-DEFINED VARIABLE
--USED BY FORM BUILDER TO KEEP THE STATUS OF    FORM AT RUN TIME
--WE CAN NOT DO
            --DML operation on system variable
--we can use the value of system variable
                 --exception
                 #some system variable can be changed by    user
                  * which system variable can be changed    by user????
                        1. ---
                        2. ---
--IT USES A KEYWORD
            SYSTEM
            :SYSTEM.<VAR_NAME>
                 :SYSTEM.BLOCK_STATUS
                          NEW
                          CHANGED
                                    QUERY

--DATATYPE=CHAR
--VALUE IN UPPER CASE

----------------------------------------------

AN INITIALIZED VARIABLE WHICH VALUE NEVER CHANGES DURING THE EXECUTION

BUILT-INS USED IN D2K
-----------------------------
--IT IS PRE-DEFINED NAMED PL/SQL BLOCK
   AS A PART OF D2K
--THEY ARE CATEGORISED IN TWO GROUPS
            # PROCEDURE  OR
            # FUNCTIONS
--FORM BUILT-INS ARE KEPT IN D2K BUILT-IN    PACAKGE
            STANDARD EXTENSIONS --pkg name
                 note
                 ------
                 form builder having other packages also which   is used for special task
                 --for example
            TEXT_IO  --used for data migration
                  FTREE  --used for hierarchical data dispaly
                 etc
TYPE OF BUILT-INS
----------------------
            * RESTRICTED BUILT-INS
            * UNRESTRICTED BUILT-INS

* RESTRICTED BUILT-INS
---------------------------------
--SUCH BUILT-INS NOT ALLOWED TO ALL TRIGGERS
--HOW TO KNOW?
-----------------------
--THE BUILT-INS WHICH INITIATE THE NAVIGATION
   ARE KNOWN AS
            restricted built-ins
            GO_BLOCK();
                 NEXT_ITEM
                 NEXT_RECORD

* UNRESTRICTED BUILT-INS
--SUCH BUILT-INS  ALLOWED TO ALL TRIGGERS
            MESSAGE();
------------------------------------------------------------

LIST OF USEFUL BUILT-INS
--------------------------------
DML operation
-----------------
COMMIT_FORM;     --just like commit;
CLEAR_BLOCK(DO_COMMIT);
                          NO_COMMIT
CLEAR_BLOCK;
EXIT_FORM(DO_COMMIT);
                      NO_COMMIT
                       ASK_COMMIT
CLEAR_FORM(DO_COMMIT);
                        NO_COMMIT
                        ASK_COMMIT

CLEAR_FORM;
  
DELETE_RECORD;
COMMIT;

UPDATE_RECORD;    --not allowed at item level
                                    --allowed only to
                                       form/block level
COMMIT;

NAVIGATIONAL BUILT-INS
---------------------------------
GO_BLOCK(<'BLK_NAME'>);
NEXT_BLOCK;

FIRST_RECORD;
LAST_RECORD;
PREVIOUS_RECORD;
NEXT_RECORD;
GO_RECORD(<REC_NO>);

GO_ITEM(<'BLK_NAME.ITEM_NAME'>);
NEXT_ITEM;

GO_FORM(<'FORM_NAME'>);
NEXT_FORM;

OTHER purpose built-ins
-----------------------------
EXECUTE_QUERY;
MESSAGE(<'MSG STRING'>);
SHOW_LOV(<'LOV_NAME'>);
LIST_VALUES;  --used to invoke LOV if lov attached     to the item

SHOW_EDITOR(....);
EDIT_TEXTITEM;--used to invoke EDITOR if that is       attached to the item

SHOW_VIEW(<'STACKED_CANVAS_NAME'>);
HIDE_VIEW(<'STACKED_CANVAS_NAME'>);

SHOW_ALERT(<'ALERT_NAME'>);

SET_<OBJECT>_PROPERTY(...)
--used to change the object property at run time
SET_BLOCK_PROPERTY();
SET_ITEM_PROPERTY();
SET_LOV_PROPERTY();
SET_CANVAS_PROPERTY();
SET_WINDOW_PROPERTY();
etc

GET_<OBJECT>_PROPERTY(...)
--used to get existing property of object at run      time

GET_APPLICATION_PROPERTY() --it is function
                         USERNAME
                         PASSWORD
                         CONNECT_STRING

add_list_elements()
---------------------------------
POST;
NAME_IN();
COPY()
---------------------------------------------------------

programmimn in d2k
-----------------------
HOW TO USE
            ITEM VARIABLE
            GLOBAL VARIABLE
            PARAMETER
            SYSTEM VARIABLE
-------------------------------------
smart triggers
------------------
--IT IS A COLLECTION OF FREQUENTLY USED TRIGGERS W.R.T. THE OBJECT WHERE CURRENTLY CONTROL EXISTS

POST-TEXT-ITEM(ENAME)
-----------------------------

:EMP.ENAME:=UPPER(:EMP.ENAME);

GLOBAL VARIABLE
---------------------
WHEN-NEW-FORM-INSTANCE
:global.pdno:=' ';

GO_BLOCK('DEPT');

PRE-TEXT-ITEM(DEPTNO OF DEPT BLOCK)

:DEPT.DEPTNO:=:GLOBAL.PDNO;

W.N.B.I(DEPT)

:DEPT.DEPTNO:=:GLOBAL.PDNO;

--SENDING VALUE FROM ITEM TO ITEM

GO_BLOCK('DEPT');
:DEPT.DEPTNO:=:EMP.DEPTNO;

PARAMETER
---------------
--CREATE A PARAMETER AT OBJECT NVG

:PARAMETER.PDNO:=:EMP.DEPTNO;
GO_BLOCK('DEPT');

W.N.B.I(DEPT)

:DEPT.DEPTNO:=:PARAMETER.PDNO;

SYSTEM VARIABLE
---------------------
ITS VALUE ALWAYS IN UPPER CASE
----------------------------------
W.B.P(SAVE)
------------------
IF :SYSTEM.BLOCK_STATUS='CHANGED' THEN
COMMIT_FORM;

ELSE
MESSAGE('NO DATA TO SAVE   '|| :SYSTEM.BLOCK_STATUS);
MESSAGE('NO DATA TO SAVE   '|| :SYSTEM.BLOCK_STATUS);
END IF;
--------------------------------
------------------------
UPDATE_RECORD;

DELETE_RECORD;

------------------------------
:EMP.SYSVAR:=:SYSTEM.BLOCK_STATUS;

INVOKING LOV
-----------------
SHOW_LOV
--function
   --return BOOLEAN

SHOW_LOV(<'LOV_NAME'>);

DECLARE
VLOV BOOLEAN;
BEGIN
VLOV:=SHOW_LOV('LOVDNO');
IF VLOV THEN
SELECT COUNT(*) INTO :EMP.CNT
FROM EMP
WHERE DEPTNO=:EMP.DEPTNO;
ELSE
MESSAGE('NO SELECTION FROM LOV');
MESSAGE('NO SELECTION FROM LOV');
END IF;

END;

clear_block(no_commit);
LIST_VALUES; 
if :emp.deptno is not null then
SELECT COUNT(*) INTO :EMP.CNT
FROM EMP
WHERE DEPTNO=:EMP.DEPTNO;
else
MESSAGE('NO SELECTION FROM LOV');
MESSAGE('NO SELECTION FROM LOV');
end if;









--lov must be attached to item



CLEAR_ITEM;







INVOKE SAME LOV
TO TWO DIFFERNT BLOCK
WITH ASSIGNMENT
------------------
NXT CLASS


DECLARE
VLOV BOOLEAN;
BEGIN
VLOV:=SHOW_LOV('LOVDNO');
:EMP.DEPTNO:=:PARAMETER.PDNO;
END;
-----------
--CREATE LOV
--CREATE A PARAMETER=PDNO
--COLUMN MAPPIMNG properties(LOV PROPERTY)
--RETURN ITEM=PARAMETER.PDNO

DECLARE
VLOV BOOLEAN;
BEGIN
VLOV:=SHOW_LOV('LOVDNO');
:DEPT.DEPTNO:=:PARAMETER.PDNO;
END;

----------------------------------------------
display the message at run time
------------------------------------
--by using
            # built-ins=MESSAGE()
                  --used for non-decision making message
            # form object=ALERT          
                  --used for decision making message

ALERT
--------
--it is a form object
--used for decision making message
--it has 03 buttons
            1. ALERT_BUTTON1     OK   --default
            2. ALERT_BUTTON2      CANCEL
            3. ALERT_BUTTON3   <user_label>
--IT HAS 03 STYLES(GRAPHICS)
            * NOTE
            * CAUTION
            * STOP --default
built-in used to invoke ALERT
            SHOW_ALERT() --function
                                             --return number value

STPS
-------
--DB CLICK ON ALERT AT OBJ NVG
--DEFINE
            # TITLE --optional
            # MESSAGE
              
--CALL TO FORM AT RUN TIME
--GO TO ALERT PROPERTY
    --TITLE=......DELETION.........
    --MESSAGE=DO YOU WANT TO DELETE..?
           
W.B.P(DELETE)
-------------------
DECLARE
VALT NUMBER;
BEGIN
VALT:=SHOW_ALERT('ALT1');
IF VALT=ALERT_BUTTON1 THEN
     DELETE_RECORD;
---COMMIT;
ELSIF
VALT=ALERT_BUTTON2 THEN
MESSAGE('deletion canceled');
MESSAGE('deletion canceled');
else
MESSAGE('NO DELETION');
MESSAGE('NO DELETION');
END IF;
END;

HOW TO USE SAME ALERT FOR
DIFFENT ACTION
----------------------------------
--by changing Message/Title at run time
SET_ALERT_PROPERTY()
--------------------------------------------------
DECLARE
VALT NUMBER;
BEGIN
------------defining message/TITLE---------
SET_ALERT_PROPERTY('ALT1',
                                        TITLE,
                                        '....DELETION....');

SET_ALERT_PROPERTY('ALT1',
                                        ALERT_MESSAGE_TEXT,
                                     'DO YOU WANT TO DELETE?');
-----------------------------------------------------
VALT:=SHOW_ALERT('ALT1');
IF VALT=ALERT_BUTTON1 THEN
     DELETE_RECORD;
---COMMIT;
ELSIF
VALT=ALERT_BUTTON2 THEN
MESSAGE('deletion canceled');
MESSAGE('deletion canceled');
else
MESSAGE('NO DELETION');
MESSAGE('NO DELETION');
END IF;
END;

W.B.P(SAVE)
----------------
DECLARE
VALT NUMBER;
BEGIN
------------defining message/TITLE---------
SET_ALERT_PROPERTY('ALT1',
                                        TITLE,
                                        '....INSERT....');

SET_ALERT_PROPERTY('ALT1',
                                        ALERT_MESSAGE_TEXT,
                                     'DO YOU WANT TO SAVE?');
-----------------------------------------------------
VALT:=SHOW_ALERT('ALT1');
IF VALT=ALERT_BUTTON1 THEN
     COMMIT_FORM;

ELSIF
VALT=ALERT_BUTTON2 THEN
MESSAGE('INSERT canceled');
MESSAGE('INSERT canceled');
else
MESSAGE('NO INSERT');
MESSAGE('NO INSERT');
END IF;
END;

-----------------------------------------------
HOW TO POPULATE LIST ITEM DYNAMICALLY
-----------------------------------------------------
--by using special built-ins
            # CREATE_GROUP_FROM_QUERY--function
            # POPULATE_GROUP --function
            # POPULATE_LIST
            # DELETE_GROUP--OPTIONAL
            --DATATYPE=RECORDGROUP
----------------------------------------------------
DECLARE
RG_ID RECORDGROUP;
STATUS NUMBER;
BEGIN
RG_ID:=CREATE_GROUP_FROM_QUERY('RGP1',
               'SELECT DISTINCT JOB,JOB FROM EMP');
STATUS:=POPULATE_GROUP(RG_ID);
POPULATE_LIST('JOB',RG_ID);
DELETE_GROUP(RG_ID);
END;
-----------------------------------------------------
EDITOR
-------------
--system defined editor =SYSTEM_EDITOR
--user-defined editor
------------------------------------
SYSTEM_EDITOR
--GO TO ITEM PROPERTY
   --GO TO EDITOR SECTION
      --SELECT THE EDITOR=SYSTEM_EDITOR

CTRL+e   --to invoke editor

user-defined editor
--DB CLICK ON EDITOR AT OBJ NVG
   --CUSTOMIZE THE EDITOR if required
     
DECLARE
OK BOOLEAN;
BEGIN
SHOW_EDITOR('SYSTEM_EDITOR',
                            :EMP.RMK,:EMP.RMK,OK);
END;

EDIT_TEXTITEM; 
--editor must be attached to the item

QUERY PROCESSING
-------------------------
EXIT    --EXIT_FORM;
REFRESH  ---CLEAR_BLOCK(NO_COMMIT);
QUERY  EXECUTE_QUERY;
--------------------------------
EXECUTE_QUERY  --built-in for query
--it clear the block before fetching data
--it is used as unconditional query

HOW TO DO CONDITIONAL QUERY
-----------------------------------------
--EXECUTE_QUERY does not accept query condition    from query block
--for conditional query we can use following    methods

methods
----------
            1. CONTROL BLOCK method
            2. GLOBAL variable method
            3. SET_BLOCK_PROPERTY() method
            4. SELECT statement method
            5. ENTER_QUERY (built-in) method
---------------------------------------------------------
1. CONTROL BLOCK method
-------------------------------
--create a control block for query condition
    --create items as requirement
--place the item on query block canvas
--go to item property(EMPNO)
   --go to data section
    COPY VALUE FROM ITEM=QRY1.PNO

2. GLOBAL variable method
--------------------------------
--EXECUTE_QUERY always search the query    condition at query block property at run time

    WHERE CLAUSE  --block propertry name

W.N.F.I
:GLOBAL.PNO:=' ';

W.B.P(QUERY)
----------------
:GLOBAL.PNO:=:EMP.EMPNO;
CLEAR_BLOCK(NO_COMMIT);
EXECUTE_QUERY;

--GO TO BLOCK PROPERTY(EMP)
   --GO TO DATABASE SECTION
      WHERE CLAUSE   EMPNO=:GLOBAL.PNO


3. SET_BLOCK_PROPERTY() method
--generally used


W.B.P(QUERY)
----------------
SET_BLOCK_PROPERTY('EMP',
                                         DEFAULT_WHERE,
                                         'EMPNO='||:EMP.EMPNO);

CLEAR_BLOCK(NO_COMMIT);
EXECUTE_QUERY;

SET_BLOCK_PROPERTY('EMP',
                                         DEFAULT_WHERE,
      'JOB LIKE ='''||:EMP.JOB||'''||'%' ||'AND '|| 'SAL='||:EMP.SAL||'''');

4. SELECT statement method
--------------------------------------
W.B.P(QUERY)
-------------------------

SELECT EMPNO,ENAME,JOB,DEPTNO
INTO
:EMP.EMPNO,:EMP.ENAME,
:EMP.JOB,:EMP.DEPTNO
FROM EMP
WHERE EMPNO=:EMP.EMPNO;

# DATA DISPLAYED IN THE FORM BY USING THE    SELECT STATEMENT IS ALWAYS IN INSERT STATUS

SELECT statement method
is used for
            # control block  or
            # control item on data block
--generally used for reference value

POST-QUERY(EMP BLOCK LEVEL)
--------------------------------------------
SELECT DNAME INTO :EMP.DNAME
FROM DEPT
WHERE DEPTNO=:EMP.DEPTNO;

5. ENTER_QUERY (built-in) method
----------------------------------------------
ENTER_QUERY changes the form from
            NORMAL MODE---->QUERY MODE
# ENTER_QUERY & EXECUTE_QUERY
   CAN BE USED TOGATHER
--------------------------------------------------
MULTIPLE APPLICATIONS DESIGN
---------------------------------------
--IT IS A TECHNIQUE/MACHANISM TO DESIGN MORE   THAN ONE APPLICATIONS IN SUCH  WAYS WHEN 1ST 
  APPLICATION LOADED INTO MEMOEY AREA,THAT  CAN INVOKE OTHER APPLICATIONS ALSO FROM ITS OWN
  SESSION
--MEANS INVOKING OTHER APPLICATIONS FROM A  SINGLE SESSION
# THE INVOKING APPLICATION IS KNOWN AS
            CALLING FORM
# THE INVOKED APPLICATION IS KNOWN AS
            CALLED FORM
# IT IS POSSIBLE TO PASS VALUE FROM CALLING     FORM TO CALLED FORM BY USING
            * GLOBAL VARIABLE
            * PARAMETERLIST  --generally used

--FOR THIS WE USE FOLLOWING BUILT-INS
            1. CALL_FORM
            2. OPEN_FORM
            3. NEW_FORM
                 --ALL ARE DIFFERENT IN ACTIONS

1. CALL_FORM
----------------
--ONLY ONE FORM CAN BE CALLED
--CALLING FORM IS SUSPENDED
--NAVIGATION NOT POSSIBLE B/W CALLING FORM &    CALLED FORM
--THE WINDOW BEHAVIOUR OF CALLED FORM    BECOME AS
            MODEL WINDOW
--AFTER EXIT FROM CALLED FORM THE CONTROL    GOES BACK TO CALLING FORM

2. OPEN_FORM
----------------
--MORE THAN ONE FORM CAN BE CALLED
       --CALLING FORM NOT SUSPENDED
       --NAVIGATION POSSIBLE B/W CALLING FORM &          CALLED FORM
       --WINDOW BEHAVIOUR OF CALLED FORM IS AS
            MODELESS WINDOW
--AFTER EXIT FROM CALLED FORM,THE CONTROL      GOES BACK TO CALLING FORM

3. NEW_FORM
---------------
--ONLY ONE FORM CAN BE CALLED
--CALLING FORM IS EXIT OUT
# IF CALLING FORM IS INVOKED BY ANY HIGHER FORM THEN AFTER EXIT FROM CALLED FORM THE CONTROL GOES TO THE HIGHER FORM

------------------------------------------------------
SYNTAX--CALL_FORM
---------
CALL_FORM(<called FORM_NAME>,
                       DISPLAY_MODE,
                       SWITCH_MENU_MODE,
                       QUERY_MODE,
                       PARAMETERLIST);

<FORM_NAME>  --mandatory argument
                              --others are optionals
                                 * having default values
                              --recomended to use all arguments
                              --parameterlist depends on                                                  requirement
'D:\FORMB.FMX'  --generally used
         --'D:\FORMB.FMB'  --valid
         --'D:\FORMB'--valid


 DISPLAY_MODE
--calling form visible / not visusble
-----------------------------------
            HIDE --default
            NO_HIDE


 SWITCH_MENU_MODE
--which menu visible
        calling form/called form
-----------------------------
            DO_REPLACE--menu of called form visisble
            NO_REPALCE--menu of calling form visisble
--------------------------------------------------------

QUERY_MODE
--called form can be used for
            DML/DQL opertation both    OR
                 DQL operation only
----------------------------------------------------
            QUERY_ONLY--only DQL operation on called     form
            NO_QUERY_ONLY--both DML/DQL on called        form


--------------------------------------------------------
 PARAMETERLIST
--used for passing the value from calling form to called    form
       CALLING FORM ----VALUE---->CALLED FORM
   # we have to write parameterlist progarm by usimg        some special built-ins


EXAMPLE --call_form
-------------
CALL_FORM('D:\FORMB.FMX',
                       NO_HIDE,
                       NO_REPLACE,
                       NO_QUERY_ONLY);
                      

SYNTAX--OPEN_FORM
---------
OPEN_FORM(<called FORM_NAME>,
                       ACTIVATE MODE,
                       SESSION MODE,
                       QUERY_MODE,
                       PARAMETERLIST);
-----------------------------------------------------
ACTIVATE MODE
--the control should be where
          calling form  or
          called form

            ACTIVATE--control on called form
            NO_ACTIVATE--control on calling form
---------------------------------------
SESSION MODE
--called form work on which database
-------------------------------------------------
            SESSION --called form using different            database
            NO_SESSION--called form using same          database of calling form

example --open_form
----------------------------
OPEN_FORM('D:\FORMB.FMX',
                       ACTIVATE,
                       NO_SESSION,
                       NO_QUERY_ONLY);


W.N.F.I

SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,
                                          WINDOW_STATE,
                                          MAXIMIZE);

SET_WINDOW_PROPERTY('WINDOW1',
                                          WINDOW_STATE,
                                          MAXIMIZE);
SYNTAX--NEW_FORM
---------
NEW_FORM(<called FORM_NAME>,
                      ROLLBACK MODE,
                       QUERY_MODE,
                       PARAMETERLIST);


ROLLBACK MODE
--for unsaved data of calling form
---------------------------------------
            TO_SAVEPOINT --default
                                            --generally used
            NO_ROLLBACK
            FULL_ROLLBACK


NEW_FORM('D:\FORMB.FMX',
                      TO_SAVEPOINT,
                      NO_QUERY_ONLY);
                    
-----------------------------------------
HOW TO PASS PM VALUE TO CALLED FORM
----------------------------------------------------------
-by using parameterlist


PARAMETERLIST
--------------------
--IT IS  A DATA STRUCTURE TO PASS VALUE FROM
            FORM TO FORM
            FORM TO REPORTS
            FORM TO GRAPHICS

COMPONENT OF PLIST
---------------------------
            1. KEY --name of plist
            2. TYPE--structure type
            3. VALUE --to be passed


2. TYPE--structure type
--------------------------
            # TEXT_PARAMETER
            # DATA_PARAMETER

# TEXT_PARAMETER--generally used
----------------------
--IT PASSES SINGLE VALUE AT A TIME
--ACCEPTS ONLY STRING VALUE TO PASS
--CAN BE USED FOR
            FORM TO FORM
            FORM TO REPORTS
            FORM TO GRAPHICS

# DATA_PARAMETER
-------------------------
--it can pass a bunch of values at a time by using       recordgroup
--it can be used for
            FORM TO FORM --not allowed
            FORM TO REPORTS
            FORM TO GRAPHICS

---------------------------------------------------------
# FOR PARAMETERLIST PROGRAM WE USE     FOLLOWING BUILT-INS
            * CREATE_PARAMETER_LIST
            * ADD_PARAMETER
            * DESTROY_PARAMETER_LIST --optional
                    --the pmlist created at run time works only                         once
            --DATATYPE=PARAMLIST

W.B.P(CALL)  --FORMA(CALLING FORM)
-----------------------------------------------
DECLARE
PL_ID PARAMLIST;
BEGIN
PL_ID:=CREATE_PARAMETER_LIST('LISTA');
ADD_PARAMETER(PL_ID,
                                 'PDNO',
                                TEXT_PARAMETER,
                                 :EMP.DEPTNO);
ADD_PARAMETER(PL_ID,
                                 'PNM',
                                TEXT_PARAMETER,
                                 :EMP.ENAME);

CALL_FORM('D:\FORMB.FMX',
                       NO_HIDE,
                       NO_REPLACE,
                       NO_QUERY_ONLY,
                        PL_ID);
DESTROY_PARAMETER_LIST(PL_ID);


END;

W.N.B.I(FORMB)
--------------------
:DEPT.DEPTNO:=:PARAMETER.PDNO;
:DEPT.ENAME:=:PARAMETER.PNM;

INVOKING STACKED CANVAS
------------------------------------
SHOW_VIEW(<'STACKED_CAN_NAME'>);
HIDE_VIEW(<'STACKED_CAN_NAME'>);

----------------------
VIEWPORT --control the physical property of stacked                        canvas
                        WIDTH
                        HIGHT
                        X
                        Y

SHOW_VIEW('CAN_SALG');

GO_BLOCK('EMP');
HIDE_VIEW('CAN_SALG');