Shik Mahamood Ali Forms

1

Definition Forms used for presenting and manipulating data can be developed. It is GUI used for developing client server database application. .FMB .FMT .FMX Form Module Binary Form Module Text Form Module Executable

COMPONENTS OF FORMS 1.Form Builder It is used to create a form. The design and layout of data entry screens the creations of event driven PL/SQL code used for data validation and navigate can be done via form builder.

2.Form Compiler It is required to compile the file created in form builder and create a binary file, which can be executable form runtime. 3.Form Runtime It is used to run the complied code created by forms compiler. COMPONENTS OF FORM BUILDER 1. Object Navigator It is hierarchical browsing and editing interface that enables you locate and manipulate application objects quickly and easily. 2.Property Palette It is used set and modify the properties for all objects in form modules. 3.Layout Editor It is graphical design facility for creating and arranging interface items and graphical objects in your application. 4.PL / SQL Editor It is the integrated functionality of oracle procedure builder that exists with in form builder. It provides: Development of Trigger, Procedures, Functions and Packages Development of libraries to hold PL/SQL program unit. FORM MODULE TYPES 1.Form Module It is a collection of objectives such as block, canvas, items and event based PL/SQL code blocks called trigger . 2.Menu Module It is a collection of menu items. It can be main menu or sub menu. 3.PL / SQL Libraries The library module is a collection of PL/SQL function and package stored ion a single library file. This library file is the attached to form / menu modules. All other objects in the form or menu can now access share the collection of PL/SQL functions and procedures. 4.Object Libraries

Shik Mahamood Ali 2 It is a collection of form objects that you can use in other modules. You can create it to store, maintain and distribute standard objects that can be reuse across the entire development organization. 5. Object Group (Form Builder) An object group is a container for a group of objects. You define an object group when you want to package related objects so you can copy or subclass them in another module.

OBJECTS OF FORMS 1.Blocks Block is logical owner of items. It provides a mechanism for grouping related items into a functional unit for storing, displaying and manipulating records. 2.Items These are interface objects that present data values to the user or enable the user to interact with the form. 3. Canvas A canvas is the background object upon which interface items appear. 4. Frames Frames are used to arrange items with in a block. 5. Windows Windows contains for all visual objects that make up a form builder application. 6. PL/SQL Code Block It is used for event driven code. That code automatically executes when a specific event occurs. Form Built - ins 1.CLEAR_FORM Causes Form Builder to remove all records from, or flush, the current form, and puts the input focus in the first item of the first block. 2.COMMIT_FORM Causes Form Builder to update data in the database to match data in the form. Form Builder first validates the form, then, for each block in the form, deletes, inserts, and updates to the database, and performs a database commit. As a result of the database commit, the database releases all row and table locks. 3.DEBUG_MODE Toggles debug mode on and off in a menu. When debug mode is on in a menu, Form Builder issues an appropriate message when a menu item command executes. 4. ENTER Validates data in the current validation unit. (The default validation unit is Item.)

5.ERASE Removes an indicated global variable, so that it no longer exists, and releases the memory associated with the global variable. Global always allocate 255 bytes of storage. To ensure

Shik Mahamood Ali 3 that performance is not impacted more than necessary, always erase any global variable when it is no longer needs 6. EXECUTE_TRIGGER EXECUTE_TRIGGER executes an indicated trigger. 7. EXIT_FORM Provides a means to exit a form, confirming commits and specifying rollback action. 8.FIND_FORM Searches the list of forms and returns a form module ID when it finds a valid form with the given name. You must define an appropriately typed variable to accept the return value. Define the variable with a type of Form module. 9. FORM_FAILURE Returns a value that indicates the outcome of the action most recently performed during the current Runform session. Use FORM_FAILURE to test the outcome of a built–in to determine further processing within any trigger. To get the correct results, you must perform the test immediately after the action executes. That is, another action should not occur prior to the test. Example: /* ** Built–in: FORM_FAILURE ** Example: Determine if the most recently executed built–in ** failed. */ BEGIN GO_BLOCK(’Success_Factor’); /* ** If some validation failed and prevented us from leaving ** the current block, then stop executing this trigger. ** ** Generally it is recommended to test ** IF NOT Form_Success THEN ... ** Rather than explicitly testing for FORM_FAILURE */ IF Form_Failure THEN RAISE Form_Trigger_Failure; END IF; END;

FORM_FATAL Returns the outcome of the action most recently performed during the current Runform session.

Use FORM_FATAL to test the outcome of a built–in to determine further processing within any trigger. To get the correct results, you must perform the test immediately after the action executes. That is, another action should not occur prior to the test. Example: /* ** Built–in: FORM_FATAL

Shik Mahamood Ali 4 ** Example: Check whether the most–recently executed built–in had a fatal error.*/ BEGIN User_Exit(’Calculate_Line_Integral control.start control.stop’); /* ** If the user exit code returned a fatal error, print a ** message and stop executing this trigger. ** ** Generally it is recommended to test ** ** IF NOT FORM_SUCCESS THEN ... ** ** Rather than explicitly testing for FORM_FATAL

IF Form_Fatal THEN Message(’Cannot calculate the Line Integral due to internal error.’); RAISE Form_Trigger_Failure; END IF; END; FORM_SUCCESS Returns the outcome of the action most recently performed during the current Runform session. Use FORM_SUCCESS to test the outcome of a built–in to determine further processing within any trigger. To get the correct results, you must perform the test immediately after the action executes. That is, another action should not occur prior to the test. Note: FORM_SUCCESS should not be used to test whether a COMMIT_FORM or POST built–in has succeeded. Because COMMIT_FORM may cause many other triggers to fire, when you evaluate FORM_SUCCESS it may not reflect the status of COMMIT_FORM but of some other, more recently executed built–in. A more accurate technique is to check that the SYSTEM.FORM_STATUS variable is set to ’QUERY’ after the operation is done. Example: /* ** Built–in: FORM_SUCCESS ** Example: Check whether the most–recently executed built–in ** succeeded. BEGIN /* ** Force validation to occur*/ Enter; /* ** If the validation succeeded, then Commit the data. ** */ IF Form_Success THEN Commit; IF :System.Form_Status <> ’QUERY’ THEN Message(’Error prevented Commit’); RAISE Form_Trigger_Failure; END IF; END IF; END;

FORMS_DDL FORMS_DDL( statement); Issues dynamic SQL statements at runtime, including server–side PL/SQL and DDL.

COLn).. ELSE Message (’Table Created’). my_stmt := my_stmt||’)’. IF NOT Form_Success THEN Message (’Table Creation Failed’). Do not end the PL/SQL block with a slash. BEGIN my_stmt := ’create table tmp(COL1 NUMBER’..COL’||TO_CHAR(i)||’ NUMBER’. ** TEMP(COL1. */ PROCEDURE Create_N_Column_Number_Table (n NUMBER) IS my_stmt VARCHAR2(2000). are not required. END IF. BEGIN . IF NOT Form_Success THEN Message (’Table Creation Failed’). Enclose the PL/SQL block in a valid BEGIN/END block structure. Example 2: /* ** Built–in: FORMS_DDL ** Example: The string can be an expression or variable. ** Create a table with n Number columns.. COL2.N LOOP my_stmt := my_stmt||’. END. use FORMS_DDL to execute a single DML or DDL statement: Example 1: /* ** Built–in: FORMS_DDL ** Example: The expression can be a string literal. ELSE Message (’Table Created’). END LOOP. END IF. while permitted. Example 3: /* ** Built–in: FORMS_DDL ** Example: The statement parameter can be a block ** of dynamically created PL/SQL code. create the table. If you • • • • • If you use FORMS_DDL to execute a valid PL/SQL block: Use semicolons where appropriate.. . */ Forms_DDL(my_stmt).. END. */ DECLARE procname VARCHAR2(30). FOR I in 2. /* ** Now.. Line breaks.*/ BEGIN Forms_DDL(’create table temp(n NUMBER)’).Shik Mahamood Ali 5 Note: All DDL operations issue an implicit COMMIT and will end the current transaction without allowing Oracle Forms to process any pending changes.

** and return a number representing the outcome of ** executing the SQL statement. END IF . END.’). ** A result of zero represents success. ELSE RETURN Dbms_Error_Code. GET_FORM_PROPERTY Returns information about the given form. as well as about the current. End. Forms_DDL(stmt). IF Check_For_Locks AND :System.Form_Status = ’CHANGED’ THEN Message (’DO_SQL: Form has outstanding locks pending.Shik Mahamood Ali 6 IF :global.flag = ’TRUE’ THEN procname := ’Assign_New_Employer’. END IF. END IF. END IF. check_for_locks BOOLEAN := TRUE) RETURN NUMBER IS SQL_SUCCESS CONSTANT NUMBER := 0. */ FUNCTION Do_Sql (stmt VARCHAR2. RETURN SQL_SUCCESS. If your application is a multi-form application. or called form. NEW_FORM .’). BEGIN IF stmt IS NULL THEN Message (’DO_SQL: Passed a null statement. IF Form_Success THEN RETURN SQL_SUCCESS.’). END. ID_NULL Returns a BOOLEAN value that indicates whether the object ID is available. Forms_DDL(’Begin ’|| procname ||’. ELSE Message (’Employee Maintenance Successful’). Example 4: /* ** Built–in: FORMS_DDL ** Example: Issue the SQL statement passed in as an argument. then you can call this built-in to return information about the calling form. RETURN SQL_SUCCESS. END IF. ELSE procname := ’Update_New_Employer’. IF NOT Form_Success THEN Message (’Employee Maintenance Failed’).

Oracle Forms runs the new form with the same Runform options as the parent form.query_mode. FULL_ROLLBACK Oracle Forms rolls back all uncommitted changes (including posted changes) that were made during the current Runform session.paramlist_name ) formmodule_name Specifies the formmodule name of the called form. To avoid losing the locks issued by the calling form. If the calling form had been called by a higher form.) query_mode Takes one of the following constants as an argument: NO_QUERY_ONLY Runs the indicated form normally. A parameter list passed to a form via NEW_FORM cannot contain parameters of type DATA_PARAMETER (a pointer to record group). NO_ROLLBACK Oracle Forms exits the current form without rolling back to a savepoint. Specify a parameter list when you want to pass parameters from the calling form to the new form. The data type of the ID is PARAMLIST. which means that you retain any locks across a NEW_FORM operation. The name must be enclosed in single quotes. Oracle Forms prevents any commit processing in the called form. You cannot specify a FULL_ROLLBACK from a form that is running in post–only mode. Oracle Forms keeps the higher call active and treats it as a call to the new form. The locks are still in effect when you regain control from Oracle Forms. NEW_FORM (formmodule_name VARCHAR2. rollback_mode. updates. If the parent form was a called form. Oracle Forms releases memory (such as database cursors) that the terminated form was using. paramlist_name . QUERY_ONLY Runs the indicated form as a query–only form. The data type of the name is CHAR. allowing the operator to perform inserts. Oracle Forms runs the new form with the same options as the parent form.data_mode. paramlist_id Specifies the unique ID Oracle Forms assigns when it creates the parameter list. These locks can also occur when invoking Oracle Forms from an external 3GL program. You can leave the top level form without performing a rollback. (Post–only mode can occur when your form issues a call to another form while unposted records exist in the calling form. The calling form is terminated as the parent form. and deletes in the form.Shik Mahamood Ali 7 Exits the current form and enters the indicated form. rollback_mode TO_SAVEPOINT Oracle Forms rolls back all uncommitted changes (including posted changes) to the current form’s savepoint.

QUERY_ONLY Causes Oracle Forms to run the indicated form in Query Only mode. HIDE is the default parameter. switch_menu NUMBER. query_mode NUMBER. NO_HIDE Causes Oracle Forms to display the called form without clearing the calling form from the screen. The data type of the name is CHAR. CALL_FORM (formmodule_name VARCHAR2. CALL_FORM. display Specify one of the following constants as an argument: HIDE Causes Oracle Forms to clear the calling form from the screen before drawing the called form. and deletes from within the called form. Runs an indicated form while keeping the parent form active. Parameters: formmodule_name Specifies the formmodule name of the called form. query_mode Takes one of the following constants as an argument: NO_QUERY_ONLY Causes Oracle Forms to run the indicated form in normal mode. update. A parameter list passed to a form via NEW_FORM cannot contain parameters of type DATA_PARAMETER (a pointer to record group). Oracle Forms runs the called form with the same Runform preferences as the parent form. DO_REPLACE Causes Oracle Forms to replace the default menu application of the calling form with the default menu application of the called form. display NUMBER. or delete records. The name must be enclosed in single quotes. When the called form is exited Oracle Forms processing resumes in the calling form at the point from which you initiated the call to CALL_FORM. allowing the operator to perform inserts. but not to insert. The data type of the name is CHAR.Shik Mahamood Ali 8 The name you gave the parameter list object when you defined it. paramlist_id . switch_menu Takes one of the following constants as an argument: NO_REPLACE Causes Oracle Forms to keep the default menu application of the calling form active for the called form. allowing the operator to query. data_mode NUMBER. updates. paramlist_name VARCHAR2).

paramlist_name Specifies the CHAR name of a parameter list to be passed to the opened form.NO_HIDE.Shik Mahamood Ali 9 Specifies the unique ID Oracle Forms assigns when it creates the parameter list.DO_REPLACE. form_name. NO_ACTIVATE Opens the form but does not set focus to the form.activate_mode. form_name. OPEN_FORM( OPEN_FORM( OPEN_FORM( OPEN_FORM( OPEN_FORM( REPLACE_MENU form_name). paramlist_name The name you gave the parameter list object when you defined it. paramlist_id Specifies the unique ID that Oracle Forms assigns to the parameter list at the time it is created. applications that open more than one form at the same time.session_mode. form_name Specifies the CHAR name of the form to open. A COMMIT operation in any form will cause validation and commit processing to occur for all forms running in the same session. form_name.activate_mode. that is.paramlist_name).session_mode. SESSION Specifies that a new. separate database session should be created for the opened form. The data type of the ID is PARAMLIST. The data type of the name is CHAR. The current form remains current.activate_mode).session_mode). form_name. session_mode NUMBER. paramlist_id PARAMLIST). activate_mode ACTIVATE Sets focus to the form to make it the active form in the application. activate_mode NUMBER. Call OPEN_FORM to create multiple–form applications. OPEN_FORM Opens the indicated form. session_mode NO_SESSION Specifies that the opened form should share the same database session as the current form.activate_mode. OPEN_FORM (form_name VARCHAR2. Call_Form(’lookcust’.paramlist_id).QUERY_ONLY). . You can optionally include a parameter list as initial input to the called form. Use the GET_PARAMETER_LIST function to return the ID to a variable of type PARAMLIST. data_mode NUMBER.

the_connect := Get_Application_Property(CONNECT_STRING).FORM_STATUS represents the status of the current form. Indicates that a query is open. The value can be one of three character strings: CHANGED Indicates that the form contains at least one block with a Changed record. SYSTEM.CURRENT_FORM represents the name of the form that Form Builder is executing. value). 2. for use in calling ** another Tool. Description: The GET_APPLICATION_PROPERTY built–in returns information about the current Oracle Forms application. END.Form_Status = ’CHANGED’THEN Commit_Form. the_connect IN OUT VARCHAR2) IS BEGIN the_username := Get_Application_Property(USERNAME). value). SET_FORM_PROPERTY( formmodule_name. the_password IN OUT VARCHAR2. property.SYSTEM.System Variables 1.Shik Mahamood Ali 10 Replaces the current menu with the specified menu. Syntax: SET_FORM_PROPERTY( formmodule_id.FORM_STATUS SYSTEM. SET_FORM_PROPERTY Sets a property of the given form. The value is always a character string. . END. Indicates that the form contains only New records. REPLACE_MENU also allows you to change the way the menu displays and the role. PROCEDURE STORE_FORMNAME IS BEGIN :GLOBAL. tm_name := Get_Application_Property(TIMER_NAME).Current_Form. The form contains at least one block with QUERY records and no blocks with CHANGED records. the_password := Get_Application_Property(PASSWORD). You must call this built–in once for each value you want to retrieve.FORM_STATUS becomes CHANGED only after at least one record in the form has been changed and the associated navigation unit has also changed. property. */ PROCEDURE Get_Connect_Info( the_username IN OUT VARCHAR2. Form.CURRENT_FORM SYSTEM. NEW QUERY IF :System.Calling_Form := :System. Example 2: /* ** Built–in: GET_APPLICATION_PROPERTY ** Example: Capture the username and password of the ** currently logged–on user. but does not make the new menu active. The value of SYSTEM.

a data block can also be a master or detail block: Master block displays a master record associated with detail records displayed in a detail block.MODE indicates whether the form is in Normal. Example: Assume that you want Oracle Forms to display an LOV when the operator enters query mode and the input focus is in a particular text item. The value is always a character string. update. displaying and manipulating records. All blocks are either single-record or multi-record blocks: A single-record block displays one record at a time.EMPNO’ and :System. and delete rows within a database. A detail block displays detail records associated with a master record displayed in master block.Shik Mahamood Ali END IF. END IF. 3. 2. /* ** When–New–Item–Instance Trigger */ BEGIN IF :System.Cursor_Item = ’EMP. Clear_Form. A multi-record block displays more than one record at a time. Indicates that the form is currently in fetch processing mode. SYSTEM. insert. Indicates that the form is currently in Enter Query mode. and the items in a control block do not relate to table columns within a database. It provides a mechanism for grouping related items into a functional unit for storing. the association between a data block and the database allows operators to automatically query. or transactional triggers. By default. BLOCKS Block is logical owner of items. MODE 11 SYSTEM. In addition. Types of Blocks 1. Data Blocks Data blocks are associated with data (table columns) within a database. procedures.Mode = ’ENTER–QUERY’ THEN IF NOT Show_Lov(’my_lov’) THEN RAISE Form_Trigger_Failure. . END. End if. Enter Query. NORMAL ENTER-QUERY QUERY Indicates that the form is currently in normal processing mode. Data blocks can be based on database tables. or Fetch Processing mode. The following trigger accomplishes that operation. Control Blocks A control block is not associated with the database. meaning that a query is currently being processed. views.

You must define an appropriately typed variable to accept the return value. Clear_Block(No_Validate). Syntax: GET_BLOCK_PROPERTY( block_id. and flushes the current block without prompting the end user. Form Builder sets the input focus to the first enterable item in the block you select from the LOV. . FIND_BLOCK Searches the list of valid blocks and returns a unique block ID. NO_VALIDATE Form Builder flushes the current block without validating the changes. property).Cursor_Block. BEGIN BLOCK_MENU. Example: /* ** Built–in: BLOCK_MENU ** Example: Calls up the list of blocks in the form when the ** user clicks a button. or "flush.Shik Mahamood Ali Block Built . committing the changes. 3. BLOCK_MENU built-in 12 Displays a list of values (LOV) containing the sequence number and names of valid blocks in your form. NO_COMMIT Form Builder validates the changes and flushes the current block without performing a commit or prompting the end user. END IF. 4. Define the variable with a type of Block. property). GET_BLOCK_PROPERTY( block_name. or prompting the end user." the current block. You must issue a call to the built-in once for each property value you want to retrieve.Cursor_Block <> prev_blk THEN Message(’You successfully navigated to a new block!’). 2. */ DECLARE prev_blk VARCHAR2(40) := :System.ins 1. DO_COMMIT Form Builder validates the changes. IF :System. END. and prints a message if ** the user chooses a new block out of the list to ** which to navigate. COMMIT_MODE The optional action parameter takes the following possible constants as arguments: ASK_COMMIT Form Builder prompts the end user to commit the changes during CLEAR_BLOCK processing. GET_BLOCK_PROPERTY Returns information about a specified block. performs a commit. CLEAR_BLOCK built-in Causes Form Builder to remove all records from.

7. property.PROPERTY_FALSE). top_rec := Get_Block_Property( bk_id. GO_BLOCK GO_BLOCK navigates to an indicated block. If the target block is non-enterable . */ PROCEDURE Make_Block_Query_Only( blk_name IN VARCHAR2 ) IS blk_id Block. value). updates.DELETE_ALLOWED. ID_NULL Returns a BOOLEAN value that indicates whether the object ID is available. Set_Block_Property(blk_id. CURRENT_RECORD). Otherwise signal ** an error. Set_Block_Property(blk_id. 6. BEGIN /* Lookup the block’s internal ID */ blk_id := Find_Block(blk_name). Example: /* ** Built–in: SET_BLOCK_PROPERTY ** Example: Prevent future inserts. TOP_RECORD). SET_BLOCK_PROPERTY( block_name.PROPERTY_FALSE). */ cur_rec := Get_Block_Property( bk_id.PREVIOUS_BLOCK Navigates to the first navigable item in the previous enterable block in the navigation sequence 9.Shik Mahamood Ali 13 ** Determine the (1) Current Record the cursor is in. */ IF NOT Id_Null(blk_id) THEN Set_Block_Property(blk_id. Syntax: SET_BLOCK_PROPERTY( block_id. value).SET_BLOCK_PROPERTY Sets the given block characteristic of the given block.PROPERTY_FALSE). /* ** If the block exists (ie the ID is Not NULL) then set ** the three properties for this block. NEXT_BLOCK Navigates to the first navigable item in the next enterable block in the navigation sequence 8. 5.UPDATE_ALLOWED. and deletes to ** queried records in the block whose name is ** passed as an argument to this procedure. property. ** (2) Current Record which is visible at the ** first (top) line of the multirecord ** block. an error occurs.INSERT_ALLOWED. ELSE .

Example: Assume that you want to create a trigger that performs a commit before clearing a block if there are changes to commit within that block. the value of SYSTEM.SYSTEM. Indicates that the block contains only New records.and Post-Form triggers).CURSOR_BLOCK is NULL.BLOCK_STATUS SYSTEM. END IF.CURRENT_BLOCK The value that the SYSTEM. and Block triggers).Block_Status = ’CHANGED’ THEN Commit_Form. Record.Shik Mahamood Ali 14 Message(’Block ’||blk_name||’ does not exist. the value of SYSTEM. IF :System. the value of SYSTEM. the value of SYSTEM.SYSTEM. RAISE Form_Trigger_Failure. 2. or item (as in the Pre. record. Block . or the current data block during trigger processing. . If the current navigation unit is the form (as in the Pre.BLOCK_STATUS represents the status of a Data block where the cursor is located.Item. 3. The following Key–CLRBLK trigger performs this function.CURSOR_BLOCK system variable represents depends on the current navigation unit: If the current navigation unit is the block.CURRENT_BLOCK is the name of the block that Form Builder is processing or that the cursor is in.SYSTEM. The value can be one of three character strings: CHANGED NEW QUERY Indicates that the block contains at least one Changed record.’). END.and Post. If the current navigation unit is the form (as in the Pre. Clear_Block. The value is always a character string.Item. Indicates that the block contains only Valid records that have been retrieved from the database.CURSOR_BLOCK is the name of the block where the cursor is located.and Post-Form triggers).CURRENT_BLOCK is NULL. and Block triggers).System Variables 1. Record.and Post.CURRENT_BLOCK system variable represents depends on the current navigation unit: If the current navigation unit is the block.CURSOR_BLOCK The value that the SYSTEM. record. or item (as in the Pre. END IF.

or Post-Form trigger. and on which master block of a master/detail relation. When-Remove-Record MASTER-DETAIL RELATIONSHIP A master-detail relationship is an association between two data blocks that reflects a primaryforeign key relationship between the database tables on which the two data blocks are based. A Detail Block Can Be a Master You can create block relationships in which the detail of one master-detail link is the master for another link. A master-detail relationship equates to the one-tomany relationship in the entity relationship diagram. and the detail data block is based on the table with the foreign key. The following trigger performs this function. ELSIF curblk = ’CUSTOMERS’ THEN Go_Block(’ORDERS’). When-Clear-Block. 5. The value is always a character string. When-Database-Record.TRIGGER_BLOCK represents the name of the block where the cursor was located when the current trigger initially fired. What Is a Relation? . using :SYSTEM. SYSTEM. IF curblk = ’ORDERS’ THEN Go_Block(’ITEMS’).COORDINATION_OPERATION to help an On-Clear-Details trigger determine what type of coordination-causing operation fired the trigger.MASTER_BLOCK This system variable works with its companion SYSTEM.Trigger_Block’)).TRIGGER_BLOCK SYSTEM. BEGIN curblk := :System. The following statement performs this function. The master data block is based on the table with the primary key. Example: Assume that you want to write a form–level procedure that navigates to the block where the cursor was when the current trigger initially fired.Shik Mahamood Ali Example: 15 Assume that you want to create a Key–NXTBLK trigger at the form level that navigates depending on what the current block is.Cursor_Block. Go_Block(Name_In(’System.CURSOR_BLOCK stored in a local variable. ELSIF curblk = ’ITEMS’ THEN Go_Block(’CUSTOMERS’). SYSTEM. DECLARE curblk VARCHAR2(30). END IF. Block – Based Triggers [Block Processing Trigger] When-Create-Record. END. 4. The value is NULL if the current trigger is a Pre.

S_ORD_S_ITEM. • MASTER DELETES PROPERTY RESULTING TRIGGERS Non-Isolated (the default) On-Check-Delete-Master On-Clear-Details On-Populate-Details Cascading On-Clear-Details On-Populate-Details Pre-Delete Isolated On-Clear-Details On-Populate-Details . or isolate deletion of a record in a master block when corresponding records exist in the detail block by setting the Master Deletes property. PL/SQL program units and triggers are created automatically when you explicitly create a relation. Changing the Master Deletes property from the default of Non-Isolated to Isolated results in the removal of the On-Check-Delete-Master trigger.Delete trigger. for example. propagate. You can create a relation either: • Implicitly with a master-detail form module • Explicitly in the Object Navigator Implicit Relations When you create a master-detail form module.Shik Mahamood Ali 16 A relation is a Form Builder object that handles the relationship between two associated blocks. Explicit Relations If a relation is not established when default blocks are created. This relation is named masterblock_detailblock. Master Deletes You can prevent. you can create your own by setting the properties in the New Relation dialog box. For example. Property Use Ø Non-Isolated Ø Cascading Ø Isolated Prevents the deletion of the master record when the detail records exist Deletes the detail records when a master record is deleted Deletes only the master record What Happens When You Modify a Relation? • Changing the Master Deletes property from the default of Non-Isolated to Cascading replaces the On-Check-Delete-Master trigger with the Pre. Like implicitly created relations. you can delete all corresponding line items when an order is deleted. a relation is automatically created.

but whose structure and values can be modified programmatically at runtime. and lengths from the database columns referenced in the SELECT statement. Auto-Query False) Deferred with Auto Query Oracle Forms defers fetching the associated detail records until the operator navigates to the detail data block. data types. When a coordination-causing event occurs. To fetch the detail records. Non-query record group A non-query record group is a group that does not have an associated query. Prevent Masterless Operation Ensures that the detail data block cannot be queried or used to insert records when a master record is not currently displayed. Non-query record groups can be created and modified only at runtime. Default [Immediate] The default setting. Query record groups can be created and modified at design time or at runtime. Deferred Without Auto Query When coordination-causing event occurs. (Deferred False. the operator must navigate to the detail data block and explicitly execute a query. the detail records are fetched immediately. Query record group A query record group is a record group that has an associated SELECT statement. For example. On-Populate-Details.Shik Mahamood Ali Coordination 17 You can control how the detail records are displayed when a master block is queried by setting the coordination property. Static record group . Oracle Forms does not automatically fetch the detail records. The records in a query record group are the rows retrieved by the query associated with that record group. On-Clear-Details RECORD GROUP This object represents an internal Form Builder data structure that has a column/row framework similar to a database table. Join Condition Use to: • • • • • Create links between blocks using SQL Alter links between blocks using SQL Define using: Usual SQL equi-join condition syntax Block names instead of the base table names Item names that exist in the form module instead of base table column names Ø Master-detail triggers On-Check-Delete-Master. The columns in a query record group derive their default names. you can defer querying the line items for an order until the operator navigates to the item block.

row_number NUMBER. array_fetch_size NUMBER) Creates a non-query record group with the given name B] CREATE_GROUP_FROM_QUERY (recordgroup_name VARCHAR2. POPULATE_GROUP returns a 0 (zero).Shik Mahamood Ali 18 A static record group is not associated with a query. Sets the value for the record group cell identified by the given row and column. Executes the query associated with the given record group and returns a number indicating success or failure of the query. The record group has columns representing each column you include in the select list of the query C] DELETE_GROUP (recordgroup_name VARCHAR2). row_number Adds a row to the given record group. query VARCHAR2. Modifying a group's structure: ADD_GROUP_COLUMN (recordgroup_name VARCHAR2. The record group is cleared and rows that are fetched replace any existing rows in the record group. column_width NUMBER) Adds a column of the specified type to the given record group.cell_value VARCHAR2) Sets the value for the record group cell identified by the given row and column. Upon a successful query. SET_GROUP_CHAR_CELL(groupcolumn_id GroupColumn. NUMBER). The rows that are retrieved as a result of a successful query replace any rows that exist in the group. Record Group built-in subprograms Creating and deleting groups: A] CREATE_GROUP (recordgroup_name VARCHAR2. DELETE_GROUP_ROW (recordgroup_id RecordGroup. Form Builder automatically decrements the row numbers of all rows that follow a deleted row. row_number NUMBER. Populating Groups: POPULATE_GROUP (recordgroup_id RecordGroup). query VARCHAR2) Populates a record group with the given query. array_fetch_size NUMBER). ADD_GROUP_ROW (recordgroup_name VARCHAR2. POPULATE_GROUP_WITH_QUERY (recordgroup_id RecordGroup. Creates a record group with the given name. the appropriate memory is freed and available to Form Builder. and they remain fixed at runtime. When rows are deleted.column_type NUMBER. scope NUMBER. Static record groups can be created and modified only at design time. groupcolumn_name VARCHAR2. cell_value DATE). SET_GROUP_DATE_CELL (groupcolumn_id GroupColumn. scope NUMBER. Deletes a programmatically created record group. instead. . you define its structure and row values at design time. An unsuccessful query generates an ORACLE error number that corresponds to the particular SELECT statement failure. row_number NUMBER) Deletes the indicated row or all rows of the given record group.

*/ DECLARE rg_name VARCHAR2(40) := ’Salary_Range’. NUMBER_COLUMN). END IF. Sets the value for the record group cell identified by the given row and column. Searches the list of record groups and returns a record group ID when it finds a valid group with the given name. gc_id GroupColumn. NUMBER_COLUMN). errcode NUMBER.cell_value NUMBER). A cell is an intersection of a row and column. You must define an appropriately typed variable to accept the return value. ’Emps_In_Range’.Shik Mahamood Ali 19 SET_GROUP_NUMBER_CELL(groupcolumn_id GroupColumn. gc_id := Add_Group_Column(rg_id. Returns the VARCHAR2 or LONG value for a record group cell identified by the given row and column. row_number NUMBER). BEGIN /* ** Make sure the record group does not already exist. */ IF Id_Null(rg_id) THEN rg_id := Create_Group(rg_name). */ rg_id := Find_Group(rg_name). /* ** If it does not exist. Getting cell values: GET_GROUP_CHAR_CELL (groupcolumn_id GroupColumn. create it and add the two ** necessary columns to it. GET_GROUP_DATE_CELL (function) GET_GROUP_NUMBER_CELL (function) Processing rows: GET_GROUP_ROW_COUNT (function) GET_GROUP_SELECTION_COUNT (function) GET_GROUP_SELECTION (function) RESET_GROUP_SELECTION (procedure) SET_GROUP_SELECTION (procedure) UNSET_GROUP_SELECTION (procedure) Object ID functions: FUNCTION FIND_GROUP (recordgroup_name VARCHAR2). ’Base_Sal_Range’. /* ** Populate group with a query */ . /* Add two number columns to the record group */ gc_id := Add_Group_Column(rg_id. rg_id RecordGroup. FIND_COLUMN (function) Example: /* ** Built–in: CREATE_GROUP ** Example: Creates a record group and populates its values ** from a query. row_number NUMBER. Define the variable with a type of RecordGroup.

or programmatically.SHOW_LOV Displays a list of values (LOV) window at the given coordinates. an LOV can be attached to one or more text items in the form. Ø LOV values are derived from record groups. as long as the input focus is in a text item that has an attached LOV. when the end user navigates to a text item with an associated LOV. x. LOV Properties 1. LOV Built-in subprograms 1.1000).LIST_VALUES LIST_VALUES displays the list of values for the current item. independent of any specific text item. x. END. LOV [ LIST OF VALUES ] An LOV is a scrollable popup window that provides the end user with either a single or multi-column selection list. y). SHOW_LOV( lov_id. SHOW_LOV( lov_name. Ø LOV values that are selected by the end user can be assigned to form items according to the return items you designate.’). . SHOW_LOV( lov_name). RAISE Form_Trigger_Failure. Ø At design time.COUNT(EMPNO) ’ ||’FROM EMP ’ ||’GROUP BY SAL–MOD(SAL. ’SELECT SAL–MOD(SAL. 2. y). Default Key for LOV – F9 LOVs provide the following functionality: Ø LOVs can be displayed by end user request (when an LOV is available). Bell. Example: /* ** Built–in: SHOW_LOV ** Example: Display a named List of Values (LOV) */ DECLARE a_value_chosen BOOLEAN. property LOV). END IF. GET_LOV_PROPERTY (lov_id.1000) ’ ||’ORDER BY 1’). Ø LOV auto-reduction and search features allow end users to locate specific values. SHOW_LOV( lov_id). BEGIN a_value_chosen := Show_Lov(’my_employee_status_lov’). IF NOT a_value_chosen THEN Message(’You have not selected a value.Shik Mahamood Ali 20 errcode := Populate_Group_With_Query( rg_id. and returns TRUE if the operator selects a value from the list. The list of values remains displayed until the operator dismisses the LOV or selects a value. and FALSE if the operator Cancels and dismisses the list.

'new_group').GROUP_NAME.colnum NUMBER. Long List It is used to append a ‘ where clause ‘ to the select statement. When this property is true a dialog box appear. When Automatic Skip is set to No. property NUMBER. . value NUMBER). 6. SET_LOV_COLUMN_PROPERTY (lov_id NUMBER. 4. 7. SET_LOV_COLUMN_PROPERTY Sets the given LOV property for the given LOV. Set_LOV_Property('my_lov'.Title property Specifies the title to be displayed for the object.Automatic Select property Specifies what happens when an LOV has been invoked and the user reduces the list to a single choice when using auto-reduction or searching: When Automatic Confirm is set to Yes.>If it is not specified then value from Lov cannot assigned to the block. 9. Automatic Skip (LOV) property Moves the cursor to the next navigable item when the operator makes a selection from an LOV to a text item. from this value entered the where clause constructed. 8.Validation from Lov to text item. 10.Column Mapping This property is used to specify the return item. 2.GROUP_NAME Specifies the name of the record group on which an LOV is based. 12. the LOV is dismissed automatically and column values from the single row are assigned to their corresponding return items. In this dialog box any value can be entered. Key-LISTVAL Trigger: List_Values. SET_LOV_PROPERTY(lov_id LOV. the focus remains in the text item after the operator makes a selection from the LOV. 3. property 5. 11. Sets the given LOV property for the given LOV. giving the operator the option to explicitly select the remaining choice or dismiss the LOV.Automatic Refresh property Determines whether Form Builder re-executes the query to populate an LOV that is based on a query record group.value VARCHAR2).Automatic Display property Specifies whether Form Builder displays the LOV automatically when the operator or the application navigates into a text item to which the LOV is attached. LOV. LOV for Validation [ Yes / No ] If it is true so that the system check value entered with the list of values Validation from LOV – text item property .Shik Mahamood Ali 21 Returns information about a specified list of values (LOV). the LOV remains displayed. When Automatic Confirm is set to No.

Data type – char – 2555 char maximum Global variables are visible across multiple forms Parameter values are not visible across multiple forms. either by list ID or name. The name of the parameter. key VARCHAR2. 3. END IF.id'). Text Parameter It is passed between forms. but before Form Builder returns to the normal event sequence. 2. an IF statement is added to the previous trigger: Key-LISTVAL Trigger: List_Values. But not between forms. key VARCHAR2) Deletes the parameter with the given key from the parameter list. Adds parameters to a parameter list. 2. list or name Specifies the parameter list. 5. ADD_PARAMETER (list VARCHAR2. key VARCHAR2.CREATE_PARAMETER_LIST (name VARCHAR2). The value of the text parameter is a character string.Shik Mahamood Ali 22 This trigger. Each parameter consists of a key. GET_PARAMETER_ATTR (list VARCHAR2. PARAMETER LIST List of Parameter or list that contains parameter names and their values Input values required for a form as startup are provided by parameters. The data type of the key is VARCHAR2. Data Parameter It is name of the record group present in the current form. IF :customer.PROCEDURE DESTROY_PARAMETER_LIST (list VARCHAR2) Deletes a dynamically created parameter list and all parameters it contains. The actual parameter can be either a parameter list ID of type PARAMLIST.value VARCHAR2).id IS NULL THEN Go_Item ('customer. paramtype VARCHAR2. is of little value since it merely duplicates default Form Builder functionality. DELETE_PARAMETER (list VARCHAR2. its type. VARCHAR2). list or name . paramtype NUMBER. However. Creates a parameter list with the given name. key 4. In the following example. or the VARCHAR2 name of the parameter list. Types 1. Returns the current value and type of an indicated parameter in an indicated parameter list. using a Key-LISTVAL trigger allows you to add subsequent PL/SQL statements that execute after the LOV is displayed. It can also passed between different oracle products. Parameter – Built Ins 1. It is passed between oracle products. and an associated value. as written.

GRAPHICS specifies Oracle Graphics. Value An OUT parameter of type VARCHAR2. Key The VARCHAR2 name of the parameter. Syntax: RUN_PRODUCT( product. 6. key VARCHAR2. display). Paramtype An OUT parameter of type NUMBER. commmode. display). paramtype NUMBER) Sets the type and value of an indicated parameter in an indicated parameter list. commmode Specifies the communication mode to be used when running the called product. report. If the called product is unavailable at the time of the call. the value is the name of a record group. REPORTS specifies Oracle Reports. Valid values are the name of a form module. or Oracle Book document. SYNCHRONOUS specifies that control returns to Oracle Forms only after the called product has been exited. location. document. location. RUN_PRODUCT( product. execmode. Valid numeric constants for this parameter are SYNCHRONOUS and ASYNCHRONOUS. document.list. RUN_PRODUCT built-in Invokes one of the supported Oracle tools products and specifies the name of the module or module to be run. The actual parameter you supply must be a variable of type NUMBER. or the VARCHAR2 name of the parameter list. Executing the parameter sets the value of the variable to one of the following numeric constants: DATA_PARAMETER Indicates that the parameter's value is the name of a record group. The actual parameter can be either a parameter list ID of type PARAMLIST.SET_PARAMETER_ATTR (list PARAMLIST. product Specifies a numeric constant for the Oracle product you want to invoke: FORMS specifies a Runform session. If the parameter is a data type parameter. The application looks for the module or document in the default paths defined for the called product. BOOK specifies Oracle Book. commmode. execmode . If the parameter is a text parameter.Shik Mahamood Ali 23 Specifies the parameter list to which the parameter is assigned. and cannot be an expression. Oracle Graphics display. TEXT_PARAMETER Indicates that the parameter's value is an actual data value.name. Form Builder returns a message to the end user. execmode. even if the called application has not completed its display. document Specifies the CHAR name of the document or module to be executed by the called product. the value is an actual text parameter. The operator cannot work in the form while the called product is running. ASYNCHRONOUS specifies that control returns to the calling application immediately.

use a variable of type PARAMLIST.5 report. When you run Oracle Reports and Oracle Graphics. Valid numeric constants for this parameter are BATCH and RUNTIME. When you run Oracle Forms. To specify a parameter list ID. Data passing is supported only for master queries. . then delete it before we create it again in ** case it contains parameters that are not useful for our ** purposes here. location Specifies the location of the document or module you want the called product to execute. the ID of the parameter list. parameter lists that contain parameters of type DATA_PARAMETER (pointers to record groups) can only be passed to Oracle Reports and Oracle Graphics in SYNCHRONOUS mode.Shik Mahamood Ali 24 Specifies the execution mode to be used when running the called product. */ PROCEDURE Run_Emp_Report IS pl_id ParamList.) Note: You can pass text parameters to called products in both SYNCHRONOUS and ASYNCHRONOUS mode. always set execmode to RUNTIME. or NULL. passing the ** data in record group ’EMP_RECS’ to substitute ** for the report’s query named ’EMP_QUERY’. Valid values for this parameter are the CHAR name of the parameter list. (This parameter is only required when you are using an Oracle Graphics chart item in a form. (SYNCHRONOUS mode is required when invoking Oracle Graphics to return an Oracle Graphics display that will be displayed in a form chart item. However.item_name.) Note: You can prevent Oracle Graphics from logging on by passing a parameter list that includes a parameter with key set to LOGON and value set to NO. bar chart. either the file system or the database. Valid constants for this property are FILESYSTEM and DB. /* ** If it does. ** Presumes the Emp_Recs record group already ** exists and has the same column/data type ** structure as the report’s Emp_Query query. execmode can be either BATCH or RUNTIME. The name of the chart item must be specified in the format block_name. display Specifies the CHAR name of the Oracle Forms chart item that will contain the display (such as a pie chart. Note: You cannot pass a DATA_PARAMETER to a child query in Oracle Reports. */ IF NOT Id_Null(pl_id) THEN Destroy_Parameter_List( pl_id ). list or name Specifies the parameter list to be passed to the called product. or graph) generated by Oracle Graphics. Example: /* ** Built–in: RUN_PRODUCT ** Example: Call an Oracle Reports 2. */ pl_id := Get_Parameter_List(’tmpdata’). BEGIN /* ** Check to see if the ’tmpdata’ parameter list exists.

’EMP_RECS’). ’dept_recordgroup’). */ BEGIN . DATA_PARAMETER. */ DECLARE pl_id ParamList.’EMP_QUERY’.’19’). END IF. IF Id_Null(pl_id) THEN Message(’Error creating parameter list ’||pl_name). SYNCHRONOUS. */ Add_Parameter(pl_id. IF NOT Id_Null(pl_id) THEN Add_Parameter(pl_id. Example: /* ** Built–in: DELETE_PARAMETER ** Example: Remove the ’NUMBER_OF_COPIES’ parameter from the ** already existing ’TEMPDATA’ parameter list. Add_Parameter(pl_id. passing the parameter list */ Run_Product(REPORTS. then add a data parameter to ** the list to associate named query ’DEPT_QUERY’ ** with record group ’DEPT_RECORDGROUP’. END. RAISE Form_Trigger_Failure. ELSE Message(’Parameter list ’||pl_name||’ already exists!’). END IF. */ DECLARE pl_id ParamList. 25 /* ** Create the ’tmpdata’ parameter list afresh. /* ** Add a data parameter to this parameter list that will ** establish the relationship between the named query ** ’EMP_QUERY’ in the report.’number_of_copies’. ’dept_query’. END. */ pl_id := Create_Parameter_List(’tmpdata’). BEGIN pl_id := Get_Parameter_List(pl_name). Signal an error ** if the list already exists or if creating the ** list fails.DATA_PARAMETER.FILEYSTEM. and the record group named ** ’EMP_RECS’ in the form. RAISE Form_Trigger_Failure. Example: /* ** Built–in: CREATE_PARAMETER_LIST ** Example: Create a parameter list named ’TEMPDATA’. END. Example: /* ** Built–in: ADD_PARAMETER ** Example: Add a value parameter to an existing Parameter ** List ’TEMPDATA’. IF Id_Null(pl_id) THEN pl_id := Create_Parameter_List(pl_name). NULL). ’empreport’. /* ** Run the report synchronously. pl_name VARCHAR2(10) := ’tempdata’. then ** attempt to create a new list. pl_id. RUNTIME. BEGIN pl_id := Get_Parameter_List(’tempdata’).TEXT_PARAMETER. END IF.Shik Mahamood Ali END IF. First ** make sure the list does not already exist.

TEXT_PARAMETER. –– SYNCHRONOUS. */ Run_Product(REPORTS. wc VARCHAR2(2000). –– FILESYSTEM. –– The Where Clause to Pass BEGIN /* ** Create a parameter list for parameter passing */ pl := Create_Parameter_List(’tmp’). END IF. passing parameters in the ** parameter list. add a text parameter to the parameter ** list to specify the parameter name and its ** value. END. END.NAME_IN The The The The The The Product to call name of the report definition communications mode Execution Mode Location of the reports document Handle to the parameter list –– –– –– –– –– Handle to the ParamList Name of Parameter in the Report Type of Parameter String Value for Parameter . –– ’rep0058. /* ** Get the Where Clause from the Last Query ** using a user–defined function */ wc := Last_Where_Clause. /* ** If there is a Non–NULL Last Where clause to ** pass. BEGIN pl_id := Get_Parameter_List(’tempdata’).Shik Mahamood Ali 26 Delete_Parameter(’tempdata’. –– BATCH. Example 2: PROCEDURE Run_Report_For_Last_Query IS pl ParamList. Referencing Form Builder items indirectly 1. –– /* Delete the parameter list */ Destroy_Parameter_List(pl).rdf’. –– pl ). ’the_Where_Clause’. */ IF wc IS NOT NULL THEN Add_Parameter(pl. /* ** Launch the report.’number_of_copies’). IF NOT Id_Null(pl_id) THEN Destroy_Parameter_List(pl_id). Example: /* ** Built–in: DESTROY_PARAMETER_LIST ** Example: Remove the parameter list ’tempdata’ after first ** checking to see if it exists */ DECLARE pl_id ParamList. End. In this case the report definition has ** a parameter named ’the_Where_Clause’ that ** it’s expecting. END IF. wc ).

Use the NAME_IN function to get the value of an item without referring to the item directly.BLOCK_STATUS represents the status of a Data block where the cursor is located.CURRENT_BLOCK system variable represents depends on the current navigation unit: If the current navigation unit is the block. VARIABLES It is used to store values from form items. COPY(NAME_IN(source).ename = 'smith' -.System Variable It is used to track of runtime status condition. or item (as in the Pre.COORDINATION_OPERATION This system variable works with its companion SYSTEM.a’). IF :emp.indirect reference 2.COPY built-in Copies a value from one item or variable into another item or global variable. If the current navigation unit is the form (as in the Pre. 1.Local Variables The local variable is PL/SQL variable whose value is only accessible with in the trigger or user named sub Programs 2. 3. Copy( cur_val. Indicates that the block contains only New records. The value can be one of three character strings: CHANGED NEW QUERY Indicates that the block contains at least one Changed record.Global Variable Whose value is accessible to trigger and subprograms in any modules – limit – 255 char length 3.Empno' ). Indicates that the block contains only Valid records that have been retrieved from the database.SYSTEM. and Block triggers).Shik Mahamood Ali 27 The NAME_IN function returns the contents of an indicated variable or item. or the current data block during trigger processing. record.CURRENT_BLOCK is the name of the block that Form Builder is processing or that the cursor is in. System Variable 1. destination). SYSTEM. cur_val VARCHAR2(40). SYSTEM. 'Emp.direct reference IF NAME_IN('emp. 2.and Post-Form triggers). the value of SYSTEM.ename') = 'smith' -.CURRENT_BLOCK s The value that the SYSTEM. the .and PostItem. and on which master block of a master/detail relation. Record.BLOCK_STATUS SYSTEM. Destroy global variable - erase(‘global.MASTER_BLOCK to help an OnClear-Details trigger determine what type of coordination-causing operation fired the trigger.

The value of SYSTEM.CURSOR_RECORD SYSTEM. 4. The value is always a character string. 6. SYSTEM.CURSOR_ITEM SYSTEM. 12. The value is always a character string.FORM_STATUS becomes CHANGED only after at least one record in the form has been changed and the associated navigation unit has also changed. The value can be one of three character strings: CHANGED Indicates that the form contains at least one block with a Changed record. item.LAST_QUERY SYSTEM.Shik Mahamood Ali 28 value of SYSTEM. Enter Query. The value is a CHAR string in the following format: DD-MON-YYYY HH24:MM:SS 5.CURSOR_VALUE SYSTEM. SYSTEM.MODE indicates whether the form is in Normal. 8. or Fetch Processing mode.Details trigger determine what type of coordination-causing operation fired the trigger.LAST_QUERY represents the query SELECT statement that Form Builder most recently used to populate a block during the current Runform session. 9. The value is always a character string. SYSTEM. Indicates that the form contains only New records. 7. This number represents the record's current physical order in the block's list of records.CURRENT_FORM represents the name of the form that Form Builder is executing. where the input focus (cursor) is located.CURRENT_FORM SYSTEM.CURSOR_RECORD represents the number of the record where the cursor is located. The value is always a character string.CURRENT_BLOCK is NULL. Indicates that the form is currently in Enter Query mode.FORM_STATUS represents the status of the current form. The value is always a character string.CURRENT_DATETIME SYSTEM.MASTER_BLOCK This system variable works with its companion SYSTEM. and on which master block of a master/detail relation. SYSTEM. SYSTEM. The form contains at least one block with QUERY records and no blocks with CHANGED records. SYSTEM. NEW QUERY 10. block. SYSTEM. NORMAL ENTER-QUERY Indicates that the form is currently in normal processing mode. 11. . The value is always a character string.COORDINATION_OPERATION to help an On-Clear.CURRENT_DATETIME is a variable representing the operating system date.FORM_STATUS SYSTEM.CURSOR_VALUE represents the value of the item where the cursor is located. SYSTEM. SYSTEM.MODE s SYSTEM. Indicates that a query is open.CURSOR_ITEM represents the name of the block and item.

or Post-Form trigger. The Property Palette is where you set the properties of objects you create in form and menu modules. Once you create a property class you can base other objects on it. An object based on a property class can inherit the settings of any property in the class that is appropriate for that object.TRIGGER_ITEM SYSTEM. The value can be one of four character strings: CHANGED INSERT NEW QUERY Indicates that a queried record's validation status is Changed. When referenced in a key trigger. SYSTEM. Indicates that the record's validation status is Changed and that the record does not exist in the database. Property Window method Property class can not be change programmatically. The value is always a character string.TRIGGER_BLOCK represents the name of the block where the cursor was located when the current trigger initially fired. SYSTEM. The value is NULL if the current trigger is a Pre. the value for SYSTEM. The value is always a character string.MOUSE_ITEM is NULL if: Ø the mouse is not in an item Ø the operator presses the left mouse button. SYSTEM. 13. 15. For example.ITEM) in the scope for which the trigger is currently firing.TRIGGER_BLOCK SYSTEM. meaning that a query is currently being processed.MOUSE_ITEM If the mouse is in an item. then moves the mouse Ø the platform is not a GUI platform. SYSTEM. it represents the item where the cursor was located when the trigger began. if the mouse is in Item1 in Block2. 16.Shik Mahamood Ali QUERY 29 Indicates that the form is currently in fetch processing mode. Indicates that the record's validation status is New. and pattern properties that you set for form and menu objects that appear in your application's interface. Indicates that the record's validation status is Valid and that it was retrieved from the database.MOUSE_ITEM is :BLOCK2. b.ITEM1.TRIGGER_ITEM represents the item (BLOCK. Visual attributes can include the following properties: . VISUAL ATTRIBUTES Visual attributes are the font. Object Navigator method.MOUSE_ITEM represents the name of that item as a CHAR value. 14. SYSTEM. PROPERTY CLASS This object is a named object that contains a list of properties and their associated settings. There are 2 ways to creating property class a. SYSTEM. color.RECORD_STATUS SYSTEM.RECORD_STATUS represents the status of the record where the cursor is located.

White on Black It can be changed dynamically. A named visual attribute is a separate object in a form or menu module that defines a collection of visual attribute properties. Visual attribute name is connected to an object by setting visual attribute name property Set_item_property(‘text1’. Once you create a named visual attribute. User-Named Editor A user-named editor has the same text editing functionality as the default editor. 3. When Visual Attribute Group is set to Default. system editor. The SHOW_EDITOR procedure displays a user-named editor at the specified display coordinates. SHOW_EDITOR(editor_name. you can apply it to any object in the same module.Shik Mahamood Ali 30 Font properties: Font Name. You create a user-named editor when you want to display the editor programmatically with SHOW_EDITOR. result). message_in. or when you want to specify custom editor attributes such as scroll bar and title. x. Named Setting the Visual Attribute Group property to a named visual attribute defined in the same module specifies that the object should use the attribute settings defined for the named visual attribute. and the window manager. the individual attribute settings reflect the current system defaults. The actual settings are determined by a combination of factors. message_out.EXE 2. pattern. Font Style. much like styles in a word processing program. and font settings. The editor specified must use the ASCII text format. Form Builder determines its display size and position dynamically based on the size and position of the text item from which the editor was invoked. System Editor The system editor to be used is defined by the FORMS60_EDITOR environment variable. FORMS60_EDITOR = C:\WINDOWS\NOTEPAD. 1. There are three types of editor objects: default editor. y. For information on environment variables and system editor availability. Default Editor Default editor is invoked at runtime. SHOW_EDITOR takes message_in and message_out parameters that . Visual Attribute Types 1.’v1’). Font Size. including the type of object. Charmode Logical Attribute. Custom When the attribute of an objects are changed at design tome. EDITOR This object enables the operator to edit text.current_record_attribute. the resource file in use. Background Color Fill Pattern. they are custom VAT 3. refer to the Form Builder documentation for your operating system. Default Setting the Visual Attribute Group property to Default specifies that that the object should be displayed with default color. Font Width. 2. Font Weight Color and pattern properties: Foreground Color. and user-named editor.

IF Get_Menu_Item_Property(mi_id. IF itm_x_pos > 40 THEN Edit_TextItem(1. width.1. ELSE Edit_TextItem(60. height). mi_id MenuItem. ed_ok BOOLEAN. END IF. The EDIT_TEXTITEM procedure invokes the editor associated with the current text item in the form (the default editor.comments := val. Use the system editor if the user has ** checked the ”System_Editor” menu item under the ** ”Preferences” menu in our custom menu module. END IF. ed_ok). /* ** Show the appropriate editor at position (10. y.comments. */ val := :emp. val. */ DECLARE itm_x_pos NUMBER. END.Cursor_Item.20. Pass the contents of the :emp.CHECKED) = ’TRUE’ THEN ed_name := ’system_editor’. ed_name VARCHAR2(40). ed_id := Find_Editor( ed_name ).Shik Mahamood Ali 31 allow you to pass a text string in to the editor and to get the edited text string back when the operator accepts the editor.1.X_POS). BEGIN itm_x_pos := Get_Item_Property(:System. val VARCHAR2(32000).SYSTEM_EDITOR’). ELSE ed_name := ’my_editor1’.20. Edit_Textitem(x. Show_Editor( ed_id.8). BEGIN mi_id := Find_Menu_Item(’PREFERENCES. val.comments item ** into the editor and reassign the edited contents if ** ’ed_ok’ returns boolean TRUE.14) on the ** screen. Example: /* ** Built–in: SHOW_EDITOR ** Example: Accept input from the operator in a user–defined ** editor. Example: /* ** Built–in: EDIT_TEXTITEM ** Example: Determine the x–position of the current item ** then bring up the editor either on the left ** side or right side of the screen so as to not ** cover the item on the screen. .8). or the current system editor). IF ed_ok THEN :emp. END IF. 10. a user-named editor.14. */ DECLARE ed_id Editor.

You must define at least one content canvas for each window you create. You can display more than one stacked canvas in a window at the same time. partly obscuring it.Tab Canvas A tab canvas—made up of one or more tab pages —allows you to group and display a large amount of related information on a single dynamic Form Builder canvas object. While every new form automatically includes a default window named WINDOW1. visible. property_false). visible. Showing and hiding a canvas programmatically SHOW_VIEW('a_stack').Toolbar Canvas A toolbar canvas often is used to create toolbars for individual windows. and data retrieval is performed. WINDOW A window is a container for all visual objects that make up a Form Builder application. 3. including canvases. A content canvas is the "base" view that occupies the entire content pane of the window in which it is displayed. . A single form can include any number of windows. There are two window styles: Document Document Windows Document windows typically display the main canvases and work areas of your application where most data entry. Stacked canvases obscure some part of the underlying content canvas.Shik Mahamood Ali END. HIDE_VIEW('a_stack'). 2. and often are shown and hidden programmatically. or SET_VIEW_PROPERTY('a_stack'. Stacked. containers typically used for modal dialogs that require immediate user interaction.Stacked Canvas A stacked canvas is displayed atop—or stacked on—the content canvas assigned to the current window. Horizontal Toolbar. There are four types of canvas objects: Content. 4. You can create two types of toolbar canvases: horizontal or vertical. radio groups. Like stacked canvases. or SET_VIEW_PROPERTY('a_stack'. and Vertical Toolbar.Content Canvas The most common canvas type is the content canvas (the default type). Horizontal toolbar canvases are displayed at the top of a window. you can create additional windows as needed by inserting them under the Windows node in the Object Navigator. such as check boxes. just under its menu bar. and text items. 1. while vertical toolbars are displayed along the far left edge of a window. Dialog Dialog Windows Dialog windows are free-floating. Tab pages (that collectively comprise the tab canvas) each display a subset of the information displayed on the entire tab canvas. CANVAS 32 This object represents a background entity on which you place interface items. tab canvases are displayed on top of a content canvas. property_true).

When-Window-Deactivated . Multiple Document Interface MDI applications display a default parent window.Shik Mahamood Ali Window Modality 33 1. or iconify a modal window. determines whether Form Builder hides the window automatically when the end user navigates to an item in another window. 2. and Note. MDI and SDI windows 1. When- There are three styles of alerts: Stop. you can layer modeless windows so that they appear either in front of or behind other windows. 2. and end users can navigate freely among them (provided your application logic allows it). Modeless Windows You can display multiple modeless windows at the same time.Document windows always are displayed within the MDI application window frame. Message severity is represented visually by a unique icon that displays in the alert window. . Hide on Exit property For a modeless window. On some platforms. REPLACE_CONTENT_VIEW built-in Replaces the content canvas currently displayed in the indicated window with a different content canvas. Trigger . called the application window. Caution. When-Window-Closed . scroll. */ BEGIN Replace_Content_View('employee_status'. Form Builder also provides support for an SDI root window on Microsoft Windows. Use alerts to advise operators of unusual situations or to warn operators who are about to perform an action that might have undesirable or unexpected consequences. ** Built-in: REPLACE_CONTENT_VIEW ** Example: Replace the 'salary' view with the 'history' ** view in the 'employee_status' window. END. On most GUI platforms. Modal windows are often displayed with a platform-specific border unique to modal windows. On some platforms. Single Document Interface Although MDI is the default system of window management during Forms Runtime. end users cannot resize.Windows When-Window-Activated Window-Resized ALERT An alert is a modal window that displays a message notifying the operator of some application condition. and have restricted functionality compared to modeless windows. . view_name VARCHAR2). modal windows are "always-ontop" windows that cannot be layered behind modeless windows.'history').Modal Windows Modal windows are usually used as dialogs. REPLACE_CONTENT_VIEW (window_name VARCHAR2. for example. Each style denotes a different level of message severity. All other windows in the application are either document windows or dialog windows.

You must return the ID to an appropriately typed variable. Changes the message text for an existing alert. You can use object groups to bundle numerous objects into higher-level building blocks that you can use again in another application.property VARCHAR2. OBJECT GROUPS An object group is a container for a group of objects. Returns a BOOLEAN value that indicates whether the object ID is available. VARCHAR2). ** Built-in: SET_ALERT_PROPERTY ** Example: Places the error message into a user-defined alert ** named 'My_Error_Alert' and displays the alert. the subprogram returns an alert ID. You define an object group when you want to package related objects so you can copy or subclass them in another module. and returns a numeric value when the operator selects one of three alert buttons. alert_message_text. SET_ALERT_PROPERTY (alert_id ALERT. Set_Alert_Property(al_id. BEGIN al_id := Find_Alert('My_Error_Alert'). message SHOW_ALERT (alert_id Alert). value VARCHAR2). al_button Number. Using Object Groups • Blocks include: Items Item-level triggers Block-level triggers Relations • Object groups cannot include other object groups • Deleting: An object group does not affect the objects An object affects the object group Copying an Object . Displays the given alert. Searches the list of valid alerts in Form Builder.button NUMBER. property NUMBER. Changes the label on one of the buttons in an alert. Object groups provide a way to bundle objects into higher-level building blocks that can be used in other parts of an application and in subsequent development projects. err_txt ). SET_ALERT_BUTTON_PROPERTY(alert_id ALERT. al_button := Show_Alert( al_id ). END. When the given alert is located.Shik Mahamood Ali 34 FIND_ALERT (alert_name VARCHAR2). Define the variable with a type of Alert. al_id Alert. You define an object group when you want to package related objects for copying or sub classing in another module. ID_NULL (Alert BOOLEAN). ** Trigger: On-Error */ DECLARE err_txt VARCHAR2(80) := Error_Text.

Unlike other Object Library members. and they support corporate. object groups. Any objects owned by the copied object are also copied. unique version of that object in the target module. and personal standards Simplifies the sharing of reusable components Object libraries are convenient containers of objects for reuse. Subclassing Subclassing is an object-oriented term that refers to the following capabilities: • Inheriting the characteristics of a base class (Inheritance) • Overriding properties of the base class (Specialization) OBJECT LIBRARY This object provides an easy method of reusing objects and enforcing standards across the entire development organization. An object library can contain simple objects. project. store. maintain.Shik Mahamood Ali 35 Copying an object creates a separate. you can rapidly create applications by dragging and dropping predefined objects to your form. it can be used to subclass existing objects in a form using the SmartClass option from the right mouse button popup menu. for a consistent look and feel • Reuse complex objects such as a Navigator Benefits of the Object Library • Simplifies the sharing and reuse of objects • Provides control and enforcement of standards • Eliminates the need to maintain multiple referenced forms SMARTCLASS A SmartClass is a special member of an Object Library. In addition. • Changes made to a copied object in the source module do not affect the copied object in the target module. • • • • Is a convenient container of objects for reuse Simplifies reuse in complex environments Supports corporate. project. but they are protected against change in the library. Objects can be used as standards (classes) for other objects. Use copying to export the definition of an object to another module. You can use the Object Library to create. and distribute standard and reusable objects. property classes. . such as buttons and items. Reusing components enables you to: • Apply standards to simple objects. by using Object Libraries. They simplify reuse in complex environments. and personal standards. Object libraries simplify the sharing of reusable components. Object Library members which are not SmartClasses can only be used to create new objects in form modules into which they are added. and program units.

Shik Mahamood Ali 36 If you frequently use certain objects as standards. or graphic modules Ø Supports dynamic loading of program units FUNCTION locate_emp(bind_value IN NUMBER) RETURN VARCHAR2 IS v_ename VARCHAR2(15). date items. RETURN(v_ename). END. A library: Ø Is produced as a separate module and stored in either a file or the database Ø Provides a convenient means of storing client-side code and sharing it among applications Ø Means that a single copy of program units can be used by many form. report. Reasons to share objects and code: Ø Increased productivity Ø Increased modularity Ø Decreased maintenance Ø Maintaining standards . BEGIN SELECT ename INTO v_ename FROM emp WHERE empno = bind_value. and packages.MMT Menu Module Text . and alerts. • Is an object in an object library that is frequently used as a class • Can be applied easily and rapidly to existing objects • Can be defined in many object libraries You can have many SmartClasses of a given object PL/SQL Libraries A library is a collection of PL/SQL program units. You can mark many different objects that are spread across multiple object libraries as SmartClasses.MMX Menu Module Executable Form Builder Built-in Package EXEC_SQL Provides built-ins for executing dynamic SQL within PL/SQL procedures .MMB Menu Module Binary .PLD . you can mark them as SmartClasses by selecting each object in the object library and choosing Object—>SmartClass. functions. including procedures. such as standard buttons.menu.PLL . A single library can contain many program units that can be shared among the Oracle Developer modules and applications that need to use them.PLX PL/SQL Library Module Binary PL/SQL Library Module Text PL/SQL Library Module Executable .

Shik Mahamood Ali 37 VBX Provides built-ins for controlling and interacting with VBX controls; this package works only in a 16-bit environment and is provided for backward compatibility WEB Provides built-ins for the Web environment OLE2 Provides a PL/SQL API for creating, manipulating, and accessing attributes of OLE2 automation objects

SUBPROGRAM A subprogram can be either a procedure or a function. Built-in subprograms are therefore called in two distinct ways: • Built-in procedures: Called as a complete statement in a trigger or program unit with mandatory arguments. • Built-in functions: Called as part of a statement, in a trigger or program unit, at a position where the function’s return value will be used. Again, the function call must include any mandatory arguments. TRIGGER Triggers are blocks of PL/SQL code that are written to perform tasks when a specific event occurs within an application. In effect, a Form Builder trigger is an event-handler written in PL/SQL to augment (or occasionally replace) the default processing behavior. Every trigger has a name, and contains one or more PL/SQL statements. A trigger encapsulates PL/SQL code so that it can be associated with an event and executed and maintained as a distinct object.

Trigger Scope

1.Form Level The trigger belongs to the form and can fire due to events across the entire form. 2.Block Level The trigger belongs to a block and can only fire when this block is the current block. 3.Item Level The trigger belongs to an individual item and can only fore when this item is the current item.

Trigger Properties
Execution Style

Execution Hierarchy property Specifies how the current trigger code should execute if there is a trigger with the same name defined at a higher level in the object hierarchy. The following settings are valid for this property: Override Specifies that the current trigger fire instead of any trigger by the same name at any higher scope. This is known as "override parent" behavior.

Shik Mahamood Ali 38 Before Specifies that the current trigger fire before firing the same trigger at the next-higher scope. This is known as "fire before parent" behavior. After Specifies that the current trigger fire after firing the same trigger at the next-higher scope. This is known as "fire after parent" behavior.

What are triggers used for?
Ø Validate data entry Ø Protect the database from operator errors Ø Limit operator access to specified forms Ø Display related field data by performing table lookups Ø Compare values between fields in the form Ø Calculate field values and display the results of those calculations Ø Perform complex transactions, such as verifying totals Ø Display customized error and information messages to the operator Ø Alter default navigation Ø Display alert boxes Ø Create, initialize, and increment timers

Groups of triggers
GROUP FUNCTION

When-triggers On-triggers Pre- and Post-triggers Key-trigger

Execute in addition to default processing Replace default processing Add processing before or after an event Change default processing assigned to a specific key

Trigger Categories ü Block-processing triggers o When-Create-Record o When-Clear-Block o When-Database-Record o When-Remove-Record ü Interface event triggers o When-Button-Pressed o When-Checkbox-Changed o When-Image-Activated o When-Image-Pressed o When-Radio-Changed

Shik Mahamood Ali o o o o o o o o o o o ü When-Timer-Expired When –List-Changed When –List-Activated When –Tree-Note-Activated When –Tree-Note-Expanded When –Tree-Note-Selected Key- [all] When-Window-Activated When-Window-Closed When-Window-Deactivated When-Window-Resized

39

Master-detail triggers o On-Check-Delete-Master o On-Clear-Details o On-Populate-Details

ü Message-handling triggers o On-Error o On-Message ü Navigational triggers o Pre- and Post- Triggers § § § § § § § § o Pre-Form Pre-Block Pre-Record Pre-Text-Item Post-Text-Item Post-Record Post-Block Post-Form

When-New-Instance-Triggers § § § § When-New-Form-Instance When-New-Block-Instance When-New-Record-Instance When-New-Item-Instance

ü

Query-time triggers o o Pre-Query Post-Query

ü Transactional triggers. o o o o o o o o On-Count On-Delete. On-Insert. On-Lock. On-Logon. On-Logout. On-Select. On-Update.

Shik Mahamood Ali o Post-Database-Commit. o Post-Delete. o Post-Forms-Commit. o Post-Insert. o Post – Select. o Post-Update. o o o o o Pre-Commit. Pre-Delete. Pre-Insert. Pre-Select. Pre-Update.

40

ü Validation triggers o o ü When-Validate-Item When-Validate-Record

Mouse Event Triggers o o o o o o o o When-Custom-Item-Event When-Mouse-Click When-Mouse-Double Click When-Mouse-Down When-Mouse-Enter When-Mouse-Leave When-Mouse-Move When-Mouse-Up

ü

Key-Fn Trigger o A Key-Fn trigger fires when an operator presses the associated key. o Use Key-Fn triggers to create additional function keys for custom functions.

ü Calling user-named triggers

TRIGGER CATEGORIES Ø A. BLOCK-PROCESSING TRIGGERS
Block processing triggers fire in response to events related to record management in a block.

1. When-Create-Record
Fires when Form Builder creates a new record. For example, when the operator presses the [Insert] key, or navigates to the last record in a set while scrolling down, Form Builder fires this trigger.

Used For
• Perform an action whenever Form Builder attempts to create a new record in a block. For example, to set complex, calculated, or data-driven default values that must be specified at runtime, rather than design time.

Fires In
• CREATE_RECORD

END. • 4. When-Database-Record Fires when Form Builder first marks a record as an insert or an update.Due_Date := SYSDATE + :Customer..Custid AND pref = 'SHIP'. thus indicating that the record should be processed by the next COMMIT_FORM operation Use a When-Database-Record trigger to perform an action every time a record is first marked as an insert or an update. and after the operator attempts to navigate out of the item. FETCH ship_dflt INTO :Invoice. In a When-Clear-Block trigger. removes all records from the block. BEGIN /* ** Default Invoice Due Date based on Customer's ** Net Days Allowed value from the Customer block. the value of SYSTEM. An alternative is to use GET_RECORD_PROPERTY to obtain the record status. */ OPEN ship_dflt. to adjust a running total that is being calculated for all of the records displayed in a block. Used For • Perform an action whenever Form Builder changes a record's status to Insert or Update.Shik Mahamood Ali WHEN-CREATE-RECORD TRIGGER 41 This example assigns data-driven or calculated default values without marking the record as changed.. 2. When-Clear-Block Perform an action whenever Form Builder flushes the current block. Used For • Use a When-Clear-Block trigger to perform an action every time Form Builder flushes the current block. The When-Clear-Block trigger does not fire when Form Builder clears the current block during the CLEAR_FORM event. That is the trigger fires as soon as Form Builder determines through validation that the record should be processed by the next post or commit as an insert or update.RECORD_STATUS is unreliable because there is no current record. stored in a preference table. */ :Invoice. Perform an action whenever a record is cleared or deleted. • Fires In • • • CLEAR_BLOCK COUNT_QUERY ENTER_QUERY Clear_Block(No_Validate). /* ** Default the shipping method based on this customers ** preference. Because GET_RECORD_PROPERTY requires reference to a specific record. When-Remove-Record Fires whenever the operator or the application clears or deletes a record.Ship_Method. This generally occurs only when the operator modifies the first item in a record. DECLARE CURSOR ship_dflt IS SELECT val FROM cust_pref WHERE Custid = :Customer. CLOSE ship_dflt. you might want to perform an automatic commit whenever this condition occurs.INTO. that is. For example. For example. . its value is always accurate. 3. We could ** use SELECT.Net_Days_Allowed. but explicit cursor is more ** efficient.

Usage Notes • Use a When-Button-Pressed trigger to perform navigation. the value of the check box item remains as it was before the operator navigated to it. When an operator clicks in a check box.If the check box is set off.INTERFACE EVENT TRIGGERS Interface event triggers fire in response to events that occur in the form interface. When-Checkbox-Changed Fires when an operator changes the state of a check box. /* If the Form_Status is not back to 'QUERY' ** following a commit. or form level functionality. BEGIN IF :System.Form_Status = 'CHANGED' THEN Commit_Form. So for all navigation triggers that fire before the When-Checkbox-Changed trigger. can fire in response to both operator input and programmatic control. fire only in response to operator input or manipulation.Shik Mahamood Ali Fires In • • CLEAR_RECORD DELETE_RECORD 42 B. by clicking with a mouse. to calculate text item values. then the Date_Shipped item is enabled. END. like When-Window-Activated. Some of these trigger. then the commit was not successful..')..order_filled item prevents the date_shipped item from being updated if the user marks the order as filled ( checked on ).Form_Status <> 'QUERY' THEN Message('Unable to commit order to database. either by clicking with the mouse. . or using the keyboard. 2. such as When-Button-Pressed. 1. or using the keyboard. block. Thus. Initiate an action when the operator toggles the state of a check box. RAISE Form_Trigger_Failure. the internal value of that item does not change until navigation is completed successfully. */ IF :System. When-Checkbox-Changed Trigger examples This trigger on the :S_ord. When-Button-Pressed Fires when an operator selects a button. This example executes a COMMIT_FORM if there are changes in the form. either with the mouse or through keyboard selection Usage Notes • • Use a When-Checkbox-Changed trigger to initiate a task dependent upon the state of a check box. Others. or for other item. the When-Checkbox-Changed trigger is the first trigger to register the changed value of a check box item. END IF. END IF.

STID)||’.JPG’. The display style of a list item is determined by the List Style property. Begin READ_IMAGE_FILE(‘ST_’||TO_CHAR(:STMAST.property_true). 5. Fires when an operator uses the mouse to: • Single-click on an image item • Double-click on an image item Note : That When-Image-Activated also fires on a double-click. Else Set_Item_Property(‘s_ord. End if. not for dropdown lists or combo box style list items.Update_allowed’.’STMAST:STIMAGE’). 6. Fires when an operator uses the mouse to: • Single-click on an image item. 3.date_shipped’. When-Image-Pressed Initiate an action whenever an operator clicks on an image item. End. Usage Notes • Use a When-Image-Pressed trigger to perform an action when an operator clicks or double clicks on an image item.Update_allowed’. 4. End. When-List-Changed Trigger Description . When-List-Activated Trigger Fires when an operator double-clicks on an element in a list item that is displayed as a T-list. The above When_Image_Pressed trigger on the stimage item displays a image of the current student (in the stmast block) when the user clicks the image item. When-Image-Activated Initiate an action whenever the operator double-clicks an image item.filled’) then Set_Item_Property(‘s_ord.Shik Mahamood Ali 43 Begin If checkbox_checked(‘s_ord.’JPG’.property_false). § Note : That When-Image-Pressed also fires on a double-click.date_shipped’. Usage Notes • A When-List-Activated trigger fires only for T-list style list items. Double-click on an image item.

) When an operator clicks an item in a radio group. For all navigation triggers that fire before the When-Radio-Changed trigger. 8. End. If v_credit NOT_IN(‘GOOD’. the When-List.payment_type:=’CASH’.credit_rate%type. Exception When no_data_found then Message(‘Invalid Student ‘). message(‘Warning – Customer must pay cash‘). End. Thus. the value of the radio group remains as it was before the operator navigated to it. the When-Radio-Changed trigger is the first trigger to register the changed value of a radio group.Shik Mahamood Ali 44 Fires when an end user selects a different element in a list item or de-selects the currently selected element. Populate student name based on the selected student id. • When-Radio-Changed Trigger examples When the user selects credit as the payment type for an order. When-Radio-Changed Description A fire when an operator selects a different radio button in a radio group. The When-List-Changed trigger is not fired if the value of the list is changed programmatically such as by using the DUPLICATE_ITEM built-in.custid.’EXCELLENT’) then :s_ord. (De-selecting a radio button in a radio group sets the radio group value to NULL. either by clicking with the mouse. Begin Select stname into :stname from the stmast where stid=:stid. it fires each time the end user enters or modifies entered text. the internal value of that item does not change until navigation is completed successfully. Declare v_credit customer. End if. End if. In addition. Initiate an action when an operator changes the current radio button selected in a radio group item. Begin If :s_ord. or if the end user causes a procedure to be invoked which changes the value. or using the keyboard. 7.Changed trigger will not fire if an end user duplicates the item using a key mapped to the DUPLICATE_ITEM built-in.payment_type=’CREDIT’ then Select credit_rate into v_credit from customer where custid=:s_ord. operators use this technique in Enter Query mode to exclude a radio group from a query. this trigger immediately confirms whether the customer has a good or excellent credit rating. For example. if a When-List-Changed trigger is attached to a combo box style list item. then the payment type is set to cash. or de-selects the currently selected radio button. Usage Notes • Use a When-Radio-Changed trigger to perform an action depending on the state of a radio group. Usage Notes • Use a When-List-Changed trigger to initiate an action when the value of the list is changed directly by the end user. If not. When-Timer-Expired .

' two_minutes NUMBER(6) := (120 * 1000). NO_CHANGE). alert_id ALERT. • • • The When-Timer-Expired trigger can not fire during trigger. IF call_status = ALERT_BUTTON1 THEN Delete_Timer(timer_id). alert_id := FIND_ALERT('tele_alert'). msg_2 VARCHAR2(80) := 'Move into your close. The following example is from a telemarketing application. ALERT_MESSAGE_TEXT. navigation. msg_3 VARCHAR2(80) := 'Ask for the order or repeat the close. msg_1 VARCHAR2(80) := 'Wrap up the first phase of your presentation'. ELSIF call_status = ALERT_BUTTON2 THEN :GLOBAL. .Shik Mahamood Ali Description 45 Fires when a timer expires. two_minutes. The message box is displayed each time a repeating timer expires. Usage Notes Timers are created programmatically by calling the CREATE_TIMER built-in procedure. You can call GET_APPLICATION_PROPERTY(TIMER_NAME) in a When-Timer-Expired trigger to determine the name of the most recently expired timer. and message boxes are displayed to prompt the salesperson through each stage of the call. Next_Record. or transaction processing.timer_count = 1 THEN Set_Alert_Property(alert_id. msg_1). call_status NUMBER. ELSE Set_Timer(timer_id. Use a When-Timer-Expired trigger to initiate an event. update item values.timer_count := 0. BEGIN :GLOBAL. END IF. Initiate an action when a programmatic timer expires.'. one_and_half NUMBER(5) := (90 * 1000). call_status := Show_Alert(alert_id). in which sales calls are timed. IF :GLOBAL. or perform any task that should occur after a specified interval. Fires In • Process Expired Timer When-Timer-Expired Trigger examples Example The following example displays a message box each time a repeating timer expires. DECLARE timer_id TIMER.timer_count := 1 BEGIN timer_id := FIND_TIMER('tele_timer').

ELSIF call_status = ALERT_BUTTON2 THEN :GLOBAL. msg_2). IF call_status = ALERT_BUTTON1 THEN Delete_Timer(timer_id). 9. IF call_status = ALERT_BUTTON1 THEN Delete_Timer(timer_id). Note that on some window managers. END IF.EVENT_WINDOW to a variable or global variable. • Enforce navigation to a particular item whenever a window is activated. This operation is independent of navigation to an item in the window. say. call_status := Show_Alert(alert_id). ELSIF call_status = ALERT_BUTTON2 THEN :GLOBAL. Thus. ELSE Set_Timer(timer_id. Next_Record. End. END IF. :GLOBAL. NO_CHANGE).timer_count = 2 THEN Change_Alert_Message(alert_id. a window can be activated by. Fires when a window is made the active window.timer_count := 0. Usage Notes: Use this trigger to perform the following types of tasks: • Capture initial settings of window properties. When-Window-Activated Initiate an action whenever an operator or the application activates a window. by way of the GET_WINDOW_PROPERTY built–in. msg_3). NO_REPEAT). ELSE Change_Alert_Message(alert_id. call_status := Show_Alert(alert_id). END IF. navigating to an item in a different window always activates that window. NO_CHANGE.timer_count := 0.Shik Mahamood Ali 46 ELSIF :GLOBAL. END. ELSE Set_Timer(timer_id. This occurs at form startup and whenever a different window is given focus. . Next_Record. clicking on its title bar.timer_count = 2. property). Example: Begin GET_WINDOW_PROPERTY( window_name. one_and_half. • Keep track of the most recently fired window trigger by assigning the value from SYSTEM. but window activation can also occur independently of navigation.

Set input focus in an item on the target window. Example: /* ** Built–in: RESIZE_WINDOW ** Example: Set Window2 to be the same size as Window1 */ PROCEDURE Make_Same_Size_Win( Window1 VARCHAR2. either by the operator or programmatically. Fires when a window is resized. • You can hide the window that contains the current item. h NUMBER. resizing the window programmatically fires the When–Window–Resized trigger. PROPERTY_OFF). height. Usage Notes: • Use this trigger to programmatically close a window when the operator issues the window–manager Close command. Example: The following example of a call to SET_WINDOW_PROPERTY from this trigger closes a window whenever the operator closes it by way of the window manager operation: Set_Window_Property(’window_name’. Audit the actions of an operator. 11. When-Window-Resized Initiate an action whenever a window is resized. Maintain certain visual standards by resetting window size if the window was improperly resized. Window2 VARCHAR2) IS wn_id1 Window. (Even if the window is not currently displayed. such as width. Usage Notes: Use this trigger to audit the state of a window whenever the operator deactivates the window by setting the input focus in another window. or y coordinate. when the root window is first drawn. VISIBLE. It does not fire when a window is iconified. • You can close a window with the HIDE_WINDOW . x coordinate. When-Window-Deactivated Initiate an action whenever a window is deactivated as a result of another window becoming the active window. 12. w NUMBER. SET_WINDOW_PROPERTY.Shik Mahamood Ali 47 10 . either by the operator or programmatically through a call to RESIZE_WINDOW or SET_WINDOW_PROPERTY. Fires when an operator deactivates a window by setting the input focus to another window. .) This trigger also fires at form startup. Usage Notes: Use this trigger to perform any one of the following types of tasks: • • • • Capture the changed window properties. and EXIT_FORM built–in subprograms.When-Window-Closed Initiate an action whenever an operator closes a window with the window manager's Close command.

Key–Fn Trigger A Key–Fn trigger fires when an operator presses the associated key.HEIGHT). /* ** Resize Window2 to the same size */ Resize_Window( Window2. These keys are referred to as Key–F0 through Key–F9. you can define a Key-EXIT trigger to replace the default functionality of the [Help] key.e. i.[ALL] ( KEY TRIGGERS ) Key Triggers have a one-to-one relationship with specific keys. h ). You can attach Key–Fn triggers to 10 keys or key sequences that normally do not perform any Oracle Forms operations. C. h := Get_Window_Property(wn_id1. Lock command on the default menu 1. */ wn_id1 := Find_Window(Window1). END. Replace the default function associated with a function key. Key Triggers and Function Keys KEY TRIGGER Key–CLRBLK Key–CLRFRM Key–CLRREC Key–COMMIT Key–CQUERY Key–CREREC Key–DELREC Key–DOWN Key–DUP–ITEM Key–DUPREC Key–EDIT Key–ENTQRY Key–EXEQRY Key–EXIT Key–HELP Key–LISTVAL Key–MENU Key–NXTBLK Key–NXT–ITEM Key–NXTKEY Key–NXTREC Key–NXTSET Key–PRINT Key–PRVBLK Key–PRV–ITEM Key–PRVREC Key–SCRDOWN Key–SCRUP Key–UP Key–UPDREC ASSOCIATED FUNCTION KEY [Clear Block] [Clear Form] [Clear Record] [Accept] [Count Query Hits] [Insert Record] [Delete Record] [Down] [Duplicate Item] [Duplicate Record] [Edit] [Enter Query] [Execute Query] [Exit] [Help] [List of Values] [Block Menu] [Next Block] [Next Item] [Next Primary Key] [Next Record] [Next Set of Records] [Print] [Previous Block] [Previous Item] [Previous Record] [Scroll Down] [Scroll Up] [Up] Equivalent to Record. . For example. Usage Notes: Use Key–Fn triggers to create additional function keys for custom functions. the trigger fires when operator presses a specific key or key-sequence.WIDTH). Before you can attach key triggers to these keys. w. KEY.Shik Mahamood Ali BEGIN 48 /* ** Find Window1 and get it’s width and height. you or the DBA must use Oracle Terminal to map the keys to the appropriate functions. w := Get_Window_Property(wn_id1.

KEY-DELREC TRIGGER ON S_CUSTOMER BLOCK DELETE_RECORD.MASTER-DETAIL TRIGGERS Form Builder generates master/detail triggers automatically when a master/detail relation is defined between blocks. • Perform one specific action whenever an operator presses any key. END. KEY-COMMIT TRIGGER AT FORM LEVEL: EMPLOYEES FORM BEGIN IF GET_APPLICATION_PROPERTY( CALLING_FORM ) IS NULL THEN COMMIT_FORM. Usage Notes: Use Key–Others triggers to limit an operator’s possible actions. 1. ELSE POST.’). Specifically.total THEN Message(’PO Distributions do not reconcile. On-Clear-Details . Oracle Forms still displays the function key’s default entry in the Show Keys screen. ’Do you really want to leave the form?’). 2. Key–Others Trigger A Key–Others trigger fires when an operator presses the associated key. BEGIN SELECT SUM(dollar_amt) INTO the_sum FROM po_distribution WHERE po_number = :purchase_order. When this occurs. A Key–Others trigger is associated with all keys that can have key triggers associated with them but are not currently defined by function key triggers (at any level). On-Check-Delete-Master Fires when Form Builder attempts to delete a record in a block that is a master block in a master/detail relation. IF SHOW_ALERT (’question_alert’) = ALERT_BUTTON1 THEN EXIT_FORM. use Key–Others triggers to perform the following tasks: • Disable all keys that are not relevant in a particular situation. A Key–Others trigger overrides the default behavior of a Runform function key (unless one of the following restrictions apply). END. END IF. ALERT_MESSAGE_TEXT.number. END IF. IF the_sum <> :purchase_order. DECLARE the_sum NUMBER. D. The default master/detail triggers enforce coordination between records in a detail block and the master record in a master block. KEY-EXIT AT FORM LEVEL SET_ALERT_PROPERTY (’question_alert’. however. RAISE Form_Trigger_Failure.Shik Mahamood Ali 49 2. END IF.

BEGIN IF (lv_errcod = 40nnn) THEN /* ** Perform some tasks here */ ELSIF (lv_errcod = 40mmm) THEN . • When Deferred coordination is set and this trigger fires. Usage Notes Use an On–Error trigger for the following purposes: • • To trap and recover from an error To replace a standard error message with a custom message Use the ERROR_CODE.Shik Mahamood Ali 50 Fires when Form Builder needs to clear records in a block that is a detail block in a master/detail relation because those records no longer correspond to the current record in the master block.MESSAGE-HANDLING TRIGGERS Form Builder automatically issues appropriate error and informational messages in response to runtime events. Usage Notes: Oracle Forms creates the On–Clear–Details trigger automatically when you define a master– detail block relation. lv_errtxt VARCHAR2(80) := ERROR_TEXT. this causes the details of the instantiated master to be populated immediately. ERROR_TYPE. Immediate coordination is the default. you can call the SET_BLOCK_PROPERTY(COORDINATION_STATUS) built–in. E. • When Immediate coordination is set. Message handling triggers fire in response to these default messaging events. ERROR_TEXT. DECLARE lv_errcod NUMBER := ERROR_CODE. 1. • Example: The following example checks specific error message codes and responds appropriately. On–Error triggers should be attached to the form. Trapping certain errors at the block or item level can be difficult if these errors occur while Oracle Forms is performing internal navigation. rather than to a block or item. • If you intend to manage block coordination yourself. DBMS_ERROR_TEXT. In most cases. lv_errtyp VARCHAR2(3) := ERROR_TYPE. or to trap and recover from an error. or DBMS_ERROR_CODE built–in function in an On–Error trigger to identify a specific error condition. On-Populate-Details Fires when Form Builder needs to fetch records into a block that is the detail block in a master/detail relation so that detail records are synchronized with the current record in the master block. such as during a Commit process. On-Error Replace a default error message with a custom error message. Usage Notes: • Use an On–Populate–Details trigger when you have established a master–detail relationship and you want to replace the default populate phase of a query. 3. Oracle Forms marks the blocks as needing to be coordinated.

RAISE Form_Trigger_Failure. END.. Date Ordered. for example. 2. ELSE Message(lv_errtyp||’–’||to_char(lv_errcod)||’: ’||lv_errtxt). BEGIN IF lv_errcod = 40350 THEN alert_button := Show_Alert(’continue_alert’). ELSIF (lv_errcod = 40zzz) THEN ** More tasks here */ ELSE Message(lv_errtyp||’–’||to_char(lv_errcod)||’: ’||lv_errtxt). 1. IF alert_button = ALERT_BUTTON1 THEN ..Shik Mahamood Ali /* ** More tasks here */ 51 . just before sending the SELECT statement to the database... On-Message To trap and respond to a message. END IF. .. lv_errtype VARCHAR2(3) := MESSAGE_TYPE. END. This Pre-Query trigger on the S_ORD block only permits queries if there is a restriction on either the Order ID. This prevents attempts at very large queries. RAISE Form_Trigger_Failure. F. lv_errtxt VARCHAR2(80) := MESSAGE_TEXT. Usage Notes: Use an On–Message trigger for the following purposes: • To trap and respond to an informative message • To replace a standard informative message with a custom message • To exclude an inappropriate message Example: The following example responds to an error message by displaying an alert that gives the user a message and gives the user the choice to continue or to stop: DECLARE alert_button NUMBER. END IF. END IF.. to replace a default message issued by Form Builder with a custom message. lv_errcod NUMBER := MESSAGE_CODE. ELSE . or Date Shipped.QUERY-TIME TRIGGERS Query-time triggers fire just before and just after the operator or the application executes a query in a block. Pre-Query Validate the current query criteria or provide additional query criteria programmatically.

Shik Mahamood Ali • • • 52 To test the operator’s query conditions. Note that the trigger only fires on the initial fetch of a record not when a record is subsequently scrolled back into view a second or third time. Make sure the user has given one of the two Columns which we have indexed in their search criteria.*/ OPEN lookup_payplan.Zip. Post-Query fires for each record that is fetched into the block as a result of a query. ** Use Explicit Cursor for highest efficiency. and displays this number as a summary value in the non base table item :Lineitem_count. Begin SELECT COUNT(ord_id) INTO :S_ORD.Payplan_Id. BEGIN /* Lookup the Payment Plan Description given the Payplan_Id in the Employee Record just fetched. [ exact_match – Check Box User can specify if or not a query condition for a customer name should exactly match the table value. Use Post-Query as follows: • • • To populate non database items as records are returned from a query To calculate statistics A Post-Query trigger fires as each record is fetched (except array processing).’). Use it to check or modify query conditions. RAISE Form_Trigger_Failure. B] This Post-Query trigger on the S_ORD block selects the total count of line items for the current Order. Example: This example retrieves descriptions for code fields. and to fail the query process if the conditions are not satisfactory for the application To add criteria for the query by assigning values to base table items A Pre-Query trigger fires before a query executes. CURSOR lookup_area IS SELECT Area_Name FROM Zip_Code WHERE Zip = :Employee. Post-Query Perform an action after fetching a record. END IF.name:=’%’||:S_customer. END IF.Mgr IS NULL THEN Message(’Supply Employee Name and/or Manager Id ’||’for Query. End. DECLARE CURSOR lookup_payplan IS SELECT Payplan_Desc FROM Payplan WHERE Payplan_Id = :Employee. [ Set the initial value property to “Y”. FETCH lookup_payplan INTO :Employee. This trigger is defined at block level or above. for display in non–database items in the current block.exact_match.Ename IS NULL AND :Employee.id. such as looking up values in other tables based on a value in the current record. Fires once for each record fetched into the block.name || ‘%’. ] IF nvl(:control. Use it to perform calculations and populate additional items. 2.lineitem_count FROM S_ITEM WHERE ord_id = :S_ORD.’Y’)=’N’ then :S_Customer. otherwise fail the query with a helpful message A] IF :Employee.Payplan_Desc_Nondb. .

What Happens When a Navigation Trigger Fails? . For instance. when the operator clicks on a text item in another block.AND POST. Example The Pre-Text-Item trigger fires just before entering a text item. Pre-query trigger fires before pre-select trigger.navigation triggers fire during navigation. • • A Pre-Query trigger fires before a query executes.NAVIGATIONAL TRIGGERS Navigational triggers fire in response to navigational events. I ] PRE. When Do Navigation Triggers Not Fire? The Pre. Use Explicit ** Cursor for highest efficiency.Area_Desc_Nondb. Pre. 53 /* ** Lookup Area Descript given the Zipcode in ** the Employee Record just fetched. FETCH lookup_area INTO :Employee.and Post-Navigation Triggers Fire? The Pre. POST-QUERY fires 10 times.and Post. What is a difference between pre-select and pre-query? Fires during the execute query and count query processing after oracle forms constructs the select statement to be issued. but before the statement is actually issued. */ OPEN lookup_area. if the validation unit is Record.navigation triggers do not fire if they belong to a unit that is smaller than the current validation unit.TRIGGERS Fire as Form Builder navigates internally through different levels of the object hierarchy. For instance. Use it to check or modify query conditions. When Do Pre. navigational events occur as Form Builder moves the input focus from the current item to the target item. CLOSE lookup_area.Shik Mahamood Ali CLOSE lookup_payplan. A query fetched 10 records How many times does a PRE-QUERY Trigger and POST-QUERY Trigger will get executed? PRE-QUERY fires once. that is just before entry to or just after exit from the object specified as part of the trigger name. END. Use it to perform calculations and populate additional items. The pre-query trigger fires just before oracle forms issues the select statement to the database after the operator as define the example records by entering the query criteria in enter query mode. G.and Post.and Post-Text-Item triggers do not fire. A Post-Query trigger fires as each record is fetched (except array processing).

Pre-Form Perform an action just before Form Builder navigates to the form from "outside" the form. 1. RAISE form_trigger_failure. END IF. Fires during the Enter the Block process. during navigation from one block to another. PAUSE. it appears that the input focus has not moved at all.Shik Mahamood Ali 54 If a Pre.or Post navigation trigger fails.IS_ROLE_ENABLED(’TECHNICAL’) THEN MESSAGE(’You are not authorized to run this application’). Pre-Block Perform an action before Form Builder navigates to the block level from the form level. the input focus returns to its initial location (where it was prior to the trigger firing).IS_ROLE_ENABLED(’ADMINISTRATIVE’) or (DBMS_SESSION. Usage Notes: Use a Pre–Block trigger to: • Allow or disallow access to a block • Set variable values Disabling stock_button when leaving CONTROL block: . To the user. 2. such as at form startup. IF not (DBMS_SESSION.

when a form is exited. The following trigger prevents the user from entering a new record given some dynamic condition and the status of SYSTEM.Record_Status = ’NEW’) THEN RAISE Form_Trigger_Failure. Record the current value of the text item for future reference. 4. based on other items previously entered into the same record. Usage Notes: Use a Pre–Text–Item trigger to perform the following types of tasks: • • Derive a complex default value. IF (( dynamic–condition) AND :System. This trigger does not fire when the form is exited abnormally. Usage Notes: You can use a Post–Form trigger for the following tasks: • • To clean up the form before exiting. property_false). To display a message to the operator upon form exit. 6. and store that value in a global variable or form parameter.RECORD_STATUS evaluating to NEW. 5. For example. Usage Notes: . Fires during the Leave the Form process. for example. Use a Pre–Record trigger to keep a running total. Usage Notes: • • Fires during the Enter the Record process. 3. during navigation to a different record. such as when exiting the form. Pre-Record Perform an action before Form Builder navigates to the record level from the block level. End. if validation fails in the form. Post-Block Manipulate the current record when Form Builder leaves a block and navigates to the form level. Pre-Text-Item Perform an action before Form Builder navigates to a text item from the record level. Post-Form Perform an action before Form Builder navigates to "outside" the form. END IF. use a Post–Form trigger to erase any global variables that the form no longer requires.stock_button’.Shik Mahamood Ali begin 55 SET_ITEM_PROPERTY(’CONTROL. enabled.

II] WHEN-NEW-INSTANCE-TRIGGERS . IF cur_itm = lst_itm THEN Next_Record. you can do so from within this trigger. including INSERT_RECORD.Cursor_Item. Fires during the Leave the Item process for a text item. cur_blk VARCHAR2(80) := :System. then skip to the next record instead of ** the default of going back to the first item in ** the same block ** Trigger: Key–Next–Item */ DECLARE cur_itm VARCHAR2(80) := :System.cmdsave’. BEGIN lst_itm := cur_blk||’. 7.’||Get_Block_Property(cur_blk. CREATE_RECORD. lst_itm VARCHAR2(80). if you want to set a visual attribute for an item as the operator scrolls down through a set of records. NEXT_RECORD. Fires during the Leave the Record process. Post-Record Manipulate a record when Form Builder leaves a record and navigates to the block level. this trigger fires when the input focus moves from a text item to any other item. the Post–Record trigger fires whenever the operator or the application moves the input focus from one record to another. NEXT_BLOCK. The Leave the Record process can occur as a result of numerous operations. Example Set_item_property (‘control. END. property_false). Example: /* ** Built–in: NEXT_RECORD ** Example: If the current item is the last item in the ** block. Post-Text-Item Manipulate an item when Form Builder leaves a text item and navigates to the record level. 8. Specifically. You might also use this trigger to test a condition and prevent the user from leaving a block based on that condition.Cursor_Block. For example. DELETE_RECORD. that is. ELSE Next_Item.LAST_ITEM). PREVIOUS_BLOCK. etc. the record that had input focus when the Leave the Block event occurred.Shik Mahamood Ali • • 56 Use a Post–Block trigger to validate the block’s current record. END IF. Usage Notes: Use a Post–Record trigger when you want to perform an action whenever the operator or the application moves the input focus from one record to another. enabled. Specifically.

:GLOBAL. SET_BLOCK_PROPERTY(’prod_lov_blk’. a record group is created and the hierarchical tree is populated. WINDOW_STATE.HEIGHT).WIDTH). TITLE. Example This code could be used in a WHEN-NEW-FORM-INSTANCE trigger to initially populate the hierarchical tree with data. v_ignore NUMBER. :GLOBAL. 1c. Specifically. When Do When-New. END. When-New-Form-Instance Perform an action at form start-up. 1d. When-New-Form-Instance Trigger at Form Level BEGIN SET_WINDOW_PROPERTY( forms_mdi_window. by including the following code in your When-New-Form-Instance trigger: 1a. Example The When-New-Item-Instance trigger fires immediately after navigation to a new instance of an item.where_cls’). BEGIN EXECUTE_QUERY.height_win_order := GET_WINDOW_PROPERTY(’win_order’.height_win_inventory := GET_WINDOW_PROPERTY(’win_inventory’.width_win_order := GET_WINDOW_PROPERTY(’win_order’. DECLARE htree ITEM. when the form returns to a quiet state to wait for operator input. Perform a query of all orders. BEGIN DEFAULT_VALUE(’’.width_win_inventory := GET_WINDOW_PROPERTY(’win_inventory’. SET_WINDOW_PROPERTY( forms_mdi_window.HEIGHT). :GLOBAL. END. (Occurs after the Pre-Form trigger fires). ’'GLOBAL.Shik Mahamood Ali 57 Fire at the end of a navigational sequence that places the input focus on a different item.where_cls). rg_emps RECORDGROUP. MAXIMIZE ).“object”-Instance Triggers Fire? The When-New-”object”-Instance triggers fire immediately after navigation to the object specified as part of the trigger name. Then. DEFAULT_WHERE.:GLOBAL. EXECUTE_QUERY. WIDTH). The example locates the hierarchical tree first. :GLOBAL. when the ORDERS form is run. ’Summit Sporting Goods Application’). END. . 1. 1b. these triggers fire just after Form Builder moves the input focus to a different item. EXECUTE_QUERY.

PRODUCT_ID).a Example: Brings up the debugging window for a particular ** value of the ’JOB’ item anytime the user changes records. fires after the When-New-Block-Instance trigger. Else Read_Image_File(filename. Example The following example of a When-New-Block-Instance trigger conditionally sets the DELETE ALLOWED property to FALSE. For example. END IF. If Filename= ‘ No file’ then Null. NULL. when an operator presses [Down] to scroll through a set of records.DELETE_ALLOWED. rg_emps := Create_Group_From_Query('rg_emps'.’S_ITEM. ename. rg_emps). Ftree. End if End.*/ BEGIN IF :Emp. v_ignore := Populate_Group(rg_emps). Ftree.Job = ’CLERK’ THEN Break.htree3').RECORD_GROUP. 2] 1. level.product_image’). END. Oracle Forms fires this trigger each time the input focus moves to the next record. Usage Notes: Use a When–New–Record–Instance trigger to perform an action every time Oracle Forms instantiates a new record. When-New-Block-Instance Perform an action immediately after the input focus moves to an item in a block other than the block that previously had input focus. When-New-Record-Instance Perform an action immediately after the input focus moves to an item in a different record. and populates the product_image item with a picture of the products.Shik Mahamood Ali 58 BEGIN htree := Find_Item('tree_block. IF GET_APPLICATION_PROPERTY(username) = ’SCOTT’ THEN SET_BLOCK_PROPERTY(’S_ITEM’.’select 1. 3. PROPERTY_FALSE). . if one exists 1] Declare Filename varchar2(20).’tiff’. each time Oracle Forms instantiates a new record in the block. in other words. to_char(empno) ’ ||' from emp ' ||'connect by prior empno = mgr ' ||’start with job = ’’PRESIDENT’’’). 2. Example The Cursor arrives in each record of the S_Item block.Set_Tree_Property(htree. but before the When-New-Item-Instance trigger. Begin Filename:=get_product_image(:S_ITEM. If the new record is in a different block. Usage Notes: Use a When–New–Block–Instance trigger to perform an action every time Oracle Forms instantiates a new block.

END. If the new item is in a different block.mode = 'ENTER-QUERY') THEN Exit_Form.date_shipped’. GO_ITEM(’S_ORD. Assume that you want Oracle Forms to display an LOV when the operator enters query mode and the input focus is in a particular text item.] BEGIN IF (:global. fires after the When-New-Block-Instance trigger. BEGIN IF :Emp. The WhenNew-Item-Instance trigger is especially useful for calling restricted (navigational) built-ins.Mode = ’ENTER–QUERY’ THEN IF NOT Show_Lov(’my_lov’) THEN RAISE Form_Trigger_Failure. END.Shik Mahamood Ali Call_Form(’clerk_timesheet’).EMPNO’ and :System. :global. END. END IF. End if. BEGIN IF TO_CHAR(:Emp. END IF.When-New-Item-Instance Fires when the input focus moves to an item. Break.Employee_Id := :Emp.cancel_query = 'Y' and :system. 2] Built–in: CLEAR_ITEM . END IF. 59 3. 3]. Specifically. Message(’This date must be of the form 01–MON–YY’). 4. The following trigger accomplishes that operation. BEGIN IF :System. when Form Builder is ready to accept input in an item that is different than the item that previously had input focus. Usage Notes Use a When-New-Item-Instance trigger to perform an action whenever an item gets input focus.date_shipped’).Hiredate. Perform an action immediately after the input focus moves to a different item. 1] IF CHECKBOX_CHECKED(’S_ORD. . property_true).Example: Clear the current item if it does not represent ** the first day of a month.Empno IS NOT NULL THEN :Global. 4]. END IF.’DD’) <> ’01’ THEN Clear_Item. END. Clear_Block(No_Validate).order_filled’)THEN SET_ITEM_PROPERTY(’S_ORD.Cursor_Item = ’EMP.UPDATE_ALLOWED. END IF.cancel_query = 'N'. END IF.Empno. it fires after navigation to an item.

Range (Lowest-Highest Allowed Value) . If an item has been changed and is not yet marked as valid. The following events then occur. At validation time. These checks are carried out before firing any When-Validate-Item triggers that you have defined.Shik Mahamood Ali END. then all records in the form are validated. you can optionally use the LOV contents to validate data entered in the item. Validation occurs at item. block. then control is passed back to the appropriate level. the LOV is not displayed. validation succeeds. This includes when changes are committed. and a When-Validate-Record trigger is then fired. if you commit (save) changes in the form. unless you have suppressed this action.Validate from List (see later in this lesson) • Record level: After leaving a record. Form Builder checks to see whether the record is valid. If not. then Form Builder first performs standard validation checks to ensure that the value conforms to the item’s properties. The validation unit is discussed in the next section. so that the operator can make corrections.Required (if so. Do this by setting the Validate from List property to Yes for the item. H. all records below that level are validated. or default processing. If validation fails. Validation occurs at: • Item level: Form Builder records a status for each item to determine whether it is currently valid. if present. such as a Commit operation. • Block and form level: At block or form level. and processing continues normally. • The operator or a trigger navigates out of the validation unit. When Does Validation Occur? Form Builder carries out validation for the validation unit under the following conditions: • The [Enter] key is (ENTER command is not necessary mapped to the key that is physically labeled Enter) pressed or the ENTER built-in procedure is run (whose purpose is to force validation immediately). Using LOVs for Validation When you attach an LOV to a text item by setting the LOV property of the item. depending on the circumstances: • If the value in the text item matches one of the values in the first column of the LOV. programmatic control. The default validation unit is item.Format mask . For example. then the status of each item in the record is checked. and form levels. Standard checks include the following: . record. When the record passes these checks. Form Builder performs validation checks during navigation that occurs in response to operator input. block. Form Builder then automatically uses the item value as a non case-sensitive search string on the LOV contents. but can also be set to record. • Validation happens when: – [Enter] Key or ENTER built-in is activated – Control leaves the validation unit due to navigation or commit Validation Process Form Builder performs a validation process at several levels to ensure that records and individual values follow appropriate rules. or form by the designer. then is the item null?) . it is set to valid. .Data type . VALIDATION TRIGGERS 60 Validation triggers fire when Form Builder validates data in an item or record.

WHEN Too_Many_Rows THEN Message('Error. While this behavior is necessary to avoid validation loops. RAISE Form_Trigger_Failure. it does make it possible for your application to commit an invalid value to the database. Usage Notes • • Use a When-Validate-Item trigger to supplement Form Builder default item validation processing. then the full LOV contents are displayed to the operator. • If the item value causes multiple records to be found in the LOV.Data_Found THEN Message('Invalid Commission Plan. RAISE Form_Trigger_Failure. The Defer_Required_Enforcement property postpones enforcement of the Required property from item validation to record validation. If validation succeeds. • When-Validate-Item Trigger You have already used this trigger to add item-level validation. END. This implies PL/SQL may attempt to fetch data twice from the table in question to insure that there aren't two matching rows. • If no match is found. When – Validate -Item Fires during the Validate the Item process. When – Validate -Record . but is a partial value of the LOV value. and input focus is returned to the item if the trigger fails. Duplicate entries in COMMPLAN table!').INTO statement must return an error if more than one row is retrieved that matches the criteria. then the full LOV column value is returned to the item (providing that the item is defined as the return item in the LOV). it fires as the last part of item validation for items with the New or Changed validation status.Shik Mahamood Ali 61 • If the item’s value causes a single record to be found in the LOV. Example The SELECT. Form Builder displays the LOV and uses the text item value as the search criteria to automatically reduce the list. Setting the Defer_Required_Enforcement property to Yes allows the operator to move freely among the items in the record.. The item then passes this validation phase. The trigger fires after standard item validation.Commplan_Desc FROM commplan WHERE commcode = :Employee. EXCEPTION WHEN No. It is possible to write a When-Validate-Item trigger that changes the value of an item that Form Builder is validating. Specifically. When an item has the Required property set to Yes. by default Form Builder will not allow navigation out of the item until a valid value is entered. 2. so that the operator must choose. Use <List> for help'). Validation Triggers • Item level When-Validate-Item • Block level When-Validate-Record 1.Commcode. Form Builder marks the changed item as Valid and does not re-validate it. BEGIN SELECT description INTO :Employee..

For all deleted records of the block (in reverse order of deletion): . This code presumes both date items are mandatory and that neither will be NULL. 3 Fire the Pre-Commit trigger. when the operator has left a new or changed record. . END IF. it fires as the last part of record validation for records with the New or Changed validation status. END. When-Validate-Record must be defined at block level or above. Specifically. 4 Validate the block (for all blocks in sequential order). it does make it possible for your application to commit an invalid value to the database. When-Validate-Record Trigger This trigger fires after standard record-level validation.Shik Mahamood Ali 62 Fires during the Validate the Record process.TRANSACTIONAL TRIGGERS Transactional triggers fire in response to a wide variety of events that occur as a form interacts with the data source. I. Example The following example verifies that Start_Date is less than End_Date.Delete the row from the base table or fire the On-Delete trigger. you can use this trigger to perform additional checks that may involve more than one of the record’s items.End_Date THEN Message('Your date range ends before it starts!'). Form Builder marks the record and all of the fields as Valid and does not re-validate. in the order they were entered. .Fire the Post-Delete trigger. For all inserted or updated records of the block in sequential order: .Start_Date > :Experiment. While this behavior is necessary to avoid validation loops. Transaction processing includes two phases: • Post: – Writes record changes to base tables – Fires transactional triggers • Commit: Performs database commit Errors result in: • Rollback of the database changes • Error message The Commit Sequence of Events The commit sequence of events (when the Array DML size is 1) is as follows: 1 Validate the form. Use a When-Validate-Record trigger to supplement Form Builder default record validation processing. Because Form Builder has already checked that required items for the record are valid. rather than check each item separately. Note that it is possible to write a When-Validate-Record trigger that changes the value of an item in the record that Form Builder is validating. 2 Process save point. Since these two text items have values that are related. it's more convenient to check the combination of them once at the record level. RAISE Form_Trigger_Failure. the chance this code will ** be reusable in other forms we write is pretty low because of dependency on block and item ** names.*/ BEGIN IF :Experiment. /* Method 1: Hardcode the item names into the trigger. ** Structured this way.Fire the Pre-Delete trigger. If validation succeeds.

before base table blocks are processed.Shik Mahamood Ali 63 If it is an inserted record: . ELSE CLOSE C1. Pre-Delete Journaling. Final checks before row deletion 3. Usage Notes • Use a Pre-Delete trigger to delete the detail record of a master record. 7 Fire the Post-Database-Commit trigger. Pre-Commit: Fires once if form changes are made or uncommitted changes are posted 2. such as setting up special locking requirements.dummy. Pre-Commit Check user authorization. Fire the Post-Update trigger. implement foreign-key delete rule Fires during the Post and Commit Transactions process. .Check the record uniqueness.Fire the Post-Insert trigger.Copy Value From Item. anytime a database commit is going to occur. before a row is deleted. even if there are no changes to post. then: 6 Issue an SQL-COMMIT statement. IF C1%FOUND THEN MESSAGE(’There are orders for this customer!’). set up special locking Pre-Commit Fires once during commit processing. PRE-DELETE TRIGGER -DECLARE CURSOR C1 IS SELECT ’anything’ FROM S_ORD WHERE customer_id = :S_CUSTOMER. If the current operation is COMMIT. Commit Triggers Uses 1. Check the record uniqueness Update the row in the base table or fire the On-Update trigger. END. RAISE form_trigger_failure. • Use a Pre-Delete trigger to prevent the deletion of a record if that record is the master record for detail records that still exist.Insert the row into the base table or fire the On-Insert trigger. END IF. fires if there are changes to base table items in the form or if changes have been posted but not yet committed (This trigger always fires in case of uncommitted posts. If it is an updated record: Fire the Pre-Update trigger. . .) Usage Notes: Use a Pre–Commit trigger to perform an action. BEGIN OPEN C1.id. Pre-Insert . It fires once for each record that is marked for delete.Fire the Pre-Insert trigger. 5 Fire the Post-Forms-Commit trigger. . FETCH C1 INTO :GLOBAL.

USER. Begin SELECT S_ORD_ID.. journaling. If you use this method. FETCH next_ord INTO :Order.id should be No. then two transactional triggers are usually involved: • Use Pre-Insert to select the next available number from the sequence table (locking the row to prevent other users from selecting the same value) and increment the value by the required amount. check constraints Usage Notes: Use a Pre–Insert trigger to perform the following tasks: • Example:1 • change item values keep track of the date a record is created and store that in the record prior to committing This Pre-Insert trigger on the S_ORD block assigns an Order ID from the sequence S_ORD_ID. DECLARE CURSOR next_ord IS SELECT orderid_seq.nextval INTO :S_ORD. End. 4. before a row is updated. It fires once for each record that is marked for insert. END.SYSDATE ). Note: The Insert Allowed and Keyboard Navigable properties on :S_ORD.id FROM SYS. check constraints . You can also assign sequence numbers from a table. which will be written to the ID column when the row is subsequently inserted. Journaling.OrderId.. Generate sequence numbers. END IF. Example:2 This example assigns a primary key field based on a sequence number. It fires once for each record that is marked for update. timestamp ) VALUES ( :Order.Shik Mahamood Ali 64 Fires during the Post and Commit Transactions process. username.INTO.NEXTVAL FROM dual.. ** but explicit cursor is more efficient. automatically generated columns.dual. Could use SELECT.OrderId IS NULL THEN Message(’Error Generating Next Order Id’).. /* ** Make sure we populated a new order id ok. and then writes a row into an auditing table. RAISE Form_Trigger_Failure. recording the new upper value for the sequence. auto-generated columns. CLOSE next_ord.OrderId. so that the user does not enter an ID manually. operation. • Use Post-Insert to update the sequence table. */ OPEN next_ord. /* ** Insert a row into the audit table */ INSERT INTO ord_audit( orderid. implement foreign-key update rule. before a row is inserted. BEGIN /* ** Fetch the next sequence number from the ** explicit cursor directly into the item in ** the Order record. flagging creation of a new order. */ IF :Order. ’New Order’. Pre-Update Fires during the Post and Commit Transactions process.

Discount_Pct will be the *new* value we’re getting ready to commit and we want to record for posterity the old and new values. We need to do this since the value of :Customer. We could use SELECT. BEGIN IF Get_Application_Property(DATA_SOURCE) = ’ORACLE’ THEN .Shik Mahamood Ali 65 Usage Notes: Use a Pre–Update trigger to audit transactions..Discount_Pct. If the application is running against ORACLE. */ OPEN old_value. • To perform the default processing from this trigger. CURSOR old_value IS SELECT discount_pct FROM customer WHERE CustId = :Customer. inserts.g. FETCH old_value INTO old_discount.CustId. 5.SYSDATE ). e.USER. CLOSE old_value. call to the COMMIT_FORM built–in.CustId. username.INTO but choose an explicit cursor for efficiency. Example: This example disables the commit operation when running against a datasource that does not support transaction control. DECLARE old_discount NUMBER. By default. including timestamp and username making the change. oper_desc VARCHAR2(80). ** ’Changed Discount from 13. and deletes have been posted to the database. new_discount NUMBER := :Customer. then we need to write out an audit record */ IF old_discount <> new_discount THEN /* Construct a string that shows the operation of Changing the old value to the new value. On-Commit Fires whenever Oracle Forms would normally issue a database commit statement to finalize a transaction. Example: The following example writes a row into an Audit Table showing old discount and new discount for a given customer. END. the commit operation behaves normally. END IF. /* ** Insert the audit record with timestamp and user */ INSERT INTO cust_audit( custid. /* ** If the old and current values are different. BEGIN /* ** Fetch the old value of discount percentage from the database by CustomerId. operation.5% to 20%’ */ oper_desc := ’Changed Discount from ’|| TO_CHAR(old_discount)||’% to ’|| TO_CHAR(new_discount)||’%’.. Usage Notes: • Use an On–Commit trigger to change the conditions of normal Oracle Forms commit processing to fit the particular requirements of a commit to a non–ORACLE database. this operation occurs after all records that have been marked as updates. timestamp ) VALUES ( :Customer.oper_desc.

do the right thing. To perform the default Form Builder processing from this trigger. It fires once for each row that is marked for insertion into the database. replacing the actual database delete of a given row.Empno. Description When called from an On-Insert trigger. Specifically. inserts the current record into the database during Post and Commit Transactions processing.Using_Transactional_Triggers = 'TRUE' THEN User_Exit('my_insrec block=EMP'). The trigger fires once for each row that is marked for deletion from the database. 6. Syntax PROCEDURE INSERT_RECORD. when Form Builder would normally insert a record in the database. /* ** Otherwise. it fires after the Pre–Delete trigger fires and before the Post–Delete trigger fires. it fires after the Pre-Insert trigger fires and before the Post-Insert trigger fires. Specifically. On-Insert Fires during the Post and Commit Transactions process when a record is inserted. To perform the default Oracle Forms processing from this trigger. END IF. no action is performed */ END. .Shik Mahamood Ali 66 Commit_Form. /* ** otherwise. On-Delete Fires during the Post and Commit Transactions process. 7. Usage Notes: • • Use an On–Delete trigger to replace the default Oracle Forms processing for handling deleted records during transaction posting. Usage Notes • • Use an On-Insert trigger to replace the default Form Builder processing for handling inserted records during transaction posting. BEGIN UPDATE emp SET termination_date = SYSDATE WHERE empno = :Emp. that is. include a call to the INSERT_RECORD built-in. include a call to the DELETE_RECORD built–in. to delete a record from your form or from the database. This built-in is included primarily for applications that will run against a nonORACLE datasource. rather than actually deleting the employee from the database. END. */ ELSE Insert_Record. /* ** Built-in: INSERT_RECORD ** Example : Perform Form Builder standard insert processing ** based on a global flag setup at startup by the ** form. Example: This example updates the employee table to set the Termination_Date. perhaps based on a parameter. ** Trigger: On-Insert */ BEGIN /* ** Check the global flag we setup at form startup */ IF :Global.

DML Statements Issued During Commit Processing INSERT INTO base_table ( base_column.. 9.. . but before the transaction has been finalized by issuing the Commit. Usage Notes Use a Post-Database-Commit trigger to perform an action anytime a database commit has occurred.WHERE ROWID = :ROWID DELETE FROM base_table WHERE ROWID = :ROWID DML Statements Issued During Commit Processing Rules: • DML statements may fire database triggers. The Post-DatabaseCommit Trigger fires after Form Builder issues the Commit to finalize the transaction. Begin UPDATE RECORD. Specifically. It fires once for each row that is marked for update in the form. End. This built-in is included primarily for applications that run against a non-ORACLE data source. Usage Notes: • • Use an On–Update trigger to replace the default Oracle Forms processing for handling updated records during transaction posting. initiates the default Form Builder processing for updating a record in the database during the Post and Commit Transaction process.'Global. END.Did_DB_Commit = 'FALSE'). To perform the default Oracle Forms processing from this trigger. .) UPDATE base_table SET base_column = :base_item. Example /* ** FUNCTION recs_posted_and_not_committed ** RETURN BOOLEAN IS BEGIN Default_Value('TRUE'. Note that the Post-Forms-Commit trigger fires after inserts. base_column = :base_item. it fires after the Pre–Update trigger fires and before the Post–Update trigger fires..Form_Status = 'QUERY' AND :Global. when Oracle Forms would normally update a record in the database. • The Update Changed Columns Only and Enforce Column Security properties affect UPDATE statements. and deletes have been posted to the database. after the database commit occurs..Did_DB_Commit'). When called from an On-Update trigger. • Locking statements are not issued. . :base_item..) VALUES ( :base_item.Shik Mahamood Ali END IF. • Form Builder uses and retrieves ROWID. Post – Database Commit Description Fires once during the Post and Commit Transactions process. updates. RETURN (:System. 8. END. include a call to the UPDATE_RECORD built–in.. On-Update 67 Fires during the Post and Commit Transactions process.. base_column.

timestamp. If there are records in the form that have been marked as inserts.Did_DB_Commit := 'FALSE'.Commit Fires once during the Post and Commit Transactions process.1 Begin INSERT INTO delete_audit (id. uncommitted changes 10. updates.2 Begin Delete from S_ORD SET WHERE id = :S_ORD.Shik Mahamood Ali */ BEGIN :Global. Post – Delete Fires during the Post and Commit Transactions process. or deletes. If the operator or the application initiates a Commit when there are no records in the form have been marked as inserts. RAISE form_trigger_failure. END. . such as updating an audit trail. IF SQL%NOTFOUND THEN MESSAGE(’Record not found in database’). */ BEGIN :Global. /* FUNCTION recs_posted_and_not_committed RETURN BOOLEAN IS BEGIN Default_Value('TRUE'. Example . It fires once for each row that is deleted from the database during the commit process. form or block Usage Notes: Use a Post–Delete trigger to audit transactions. SYSDATE. Usage Notes • • Use a Post-Forms-Commit trigger to perform an action.id. or deletes. END. RETURN (:System. End. updates. without posting changes to the database. USER ). 68 Post-Database-Commit Determines if commit was successful. Post-Forms-Commit Checks complex multirow constraints Example This example can be used in concert with the Post-Database-Commit trigger to detect if records have been posted but not yet committed. END. who_did_it)VALUES ( :S_ORD.Form_Status = 'QUERY'AND :Global. Example . after a row is deleted.Did_DB_Commit = FALSE'). Form Builder fires the Post-Forms-Commit trigger immediately. 11.Did_DB_Commit := 'FALSE'. Post – Form .Did_DB_Commit'). anytime a database commit is about to occur. the Post-Forms-Commit trigger fires after these changes have been written to the database but before Form Builder issues the database Commit to finalize the transaction. determines if there are posted.id.'Global.

Example . This Post-Update trigger writes the current record ID to the UPDATE_AUDIT table. End. End. Example . Example 2 To handle exceptions.id.username). Example 1 Keeping an Audit Trail :GLOBAL. Query Processing Triggers Uses . Post-Insert trigger: Begin INSERT INTO LOG_TAB (LOG_VAL. LOG_USER) VALUES(:S_DEPT. RAISE form_trigger_failure. 13.2 Begin UPDATE S_ORD SET date_shipped = SYSDATE WHERE id = :S_ORD. after a row is updated.:GLOBAL. Post – Insert Fires during the Post and Commit Transactions process. End. Write changes to nonbase tables. IF SQL%NOTFOUND THEN MESSAGE(’Record not found in database’). Post – Update Fires during the Post and Commit Transactions process. who_did_it)VALUES ( :S_ORD.id. • • • Use a Post-Insert trigger to audit transactions. USER ). End. Usage Notes: Use a Post–Update trigger to audit transactions.||SQLERRM). END IF. 12. EXCEPTION WHEN OTHERS THEN MESSAGE(’Error! ’. include EXCEPTION section in trigger. timestamp.insert_tot := TO_CHAR(TO_NUMBER(:GLOBAL. END IF.id.insert_tot)+1). SYSDATE.1 Begin INSERT INTO update_audit (id. Gather statistics on applied changes. It fires once for each row that is updated in the database during the commit process. just after a record is inserted. It fires once for each record that is inserted into the database during the commit process.Shik Mahamood Ali Else 69 Messafe(SQL%rowcount|| “ rows Deleted”).along with a time stamp and the user who performed the update.

to perform a query against a database.NEXTVAL FROM dual. On . IF Form_Failure OR Form_Fatal THEN ABORT_QUERY. flagging creation of a neworder. DECLARE CURSOR next_ord IS SELECT orderid_seq.' and a built-in subprogram. Note that the SELECT statement can be examined in a Pre-Select trigger by reading the value of the system variable SYSTEM. Usage Notes • Use an On-Select trigger to open and execute the database cursor.LAST_QUERY Fires after Form Builder has constructed the block SELECT statement based on the query conditions. END. ** but explicit cursor is more efficient. Could use SELECT. */ .. timestamp ) VALUES ( :Order. ELSE /* ** Perform the default Form Builder task of opening the query. the On-Select trigger is used to call a user exit. IF :Order. and then writes a row into an auditing table. • Example . CLOSE next_ord.’New Order’. Pre – Select 70 Fires during Execute Query and Count Query processing. 15.1 In the following example. username. This example assigns a primary key field based on a sequence number.Shik Mahamood Ali 14. and execute phases. RAISE Form_Trigger_Failure.INTO. use this trigger when you are retrieving data from a non-ORACLE data source. BEGIN /** Fetch the next sequence number from the Explicit cursor directly into the item in the Order record.Select Fires when Form Builder would normally execute the open cursor. */ OPEN next_ord. but before the statement is actually issued.USER. to identify the records in the database that match the current query criteria. To perform the default Form Builder processing from this trigger. END IF. operation.OrderId IS NULL THEN Message(’Error Generating Next Order Id’). and execute phases of a query. On-Select replaces open cursor. parse. but before it issues this statement Use a Pre-Select trigger to prepare a query prior to execution against a non-ORACLE data source. 'Query. include a call to the SELECT_RECORDS built-in.OrderId. /** Insert a row into the audit table INSERT INTO ord_audit( orderid.SYSDATE ). parse. Begin IF Get_Application_Property(DATASOURCE) = 'DB2' THEN User_Exit ( 'Query' ). FETCH next_ord INTO :Order..OrderId. The On-Select trigger can be used in conjunction with the On-Fetch trigger to replace the processing that normally occurs in the EXECUTE_QUERY built-in subprogram. SELECT_RECORDS. END IF. Specifically. after Form Builder constructs the SELECT statement to be issued.

Usage Note: Use the Post-Select trigger to perform an action based on the outcome of the Select phase of query processing such as an action based on the number of records that match the query criteria. Post-Select Trigger Description Fires after Form Builder has constructed and issued the block SELECT statement. END IF. END. On–Fetch: DECLARE j NUMBER := Get_Block_Property(blk_name. On – Fetch Fires when Form Builder performs a fetch for a set of rows (You can use the CREATE_QUERIED_RECORD built-in to create queried records if you want to replace default fetch processing. or after the successful execution of the On-Select trigger. – The query is closed by the user or by ABORT_QUERY. BEGIN FOR ctr IN 1. RECORDS_TO_FETCH).EMPNO. On – Count Fires when Form Builder would usually perform default Count Query processing to determine the number of rows that match the query conditions . Create_Queried_Record.ENAME.) • On-Fetch continues to fire until: – It fires without executing CREATE_QUERIED_RECORD.ROWID. :Emp. */ EXIT WHEN NOT MyPackage.j LOOP /* ** Try to get the next row. END IF. 16. The trigger will fire once for each record that is to be fetched. :Emp. IF form_fatal OR form_failure THEN raise form_trigger_failure.empno := emprow. END LOOP. 15. – It raises FORM_TRIGGER_FAILURE. :Emp.Get_Next_Row(emprow).ename := emprow. It fires before any records are actually retrieved through fetch processing. but before it fetches the records The Post-Select trigger fires after the default selection phase of query processing. End.Shik Mahamood Ali Select_Records.rowid := emprow. emprow emp%ROWTYPE. 71 16..

Example 3 /* ** Built-in: COUNT_QUERY ** Example: Perform Form Builder count query hits processing. END. Set_Block_Property('DEPT'. the message reports 0 records identified.Shik Mahamood Ali 72 Fires when Form Builder would normally perform default Count Query processing to determine the number of rows in the database that match the current query criteria.DNAME')). */ User_Exit('my_count'). BEGIN j := Recs_Returned('DEPT'. * Trigger: On-Count */ BEGIN /* ** Check the global flag we set during form startup */ IF :Global. perhaps based on a parameter. Decide whether to use this Built-in or a user ** exit based on a global flag setup at startup by the form. END. In such a case. When the On-Count trigger completes execution.Using_Transactional_Triggers = 'TRUE' THEN /* ** User exit returns query hits count back into the ** CONTROL. • To perform the default Form Builder processing from this trigger. • Form Builder will display the query hits message (FRM-40355) even if the On-Count trigger fails to set the value of the Query_Hits block property.Name_In('DEPT. . */ BEGIN Count_Query. include a call to the built-in. Example . you can set the value of the Query_Hits block property to indicate the number of records in the non-ORACLE data source that match the query criteria. and sets the Query_Hits property appropriately. Usage Notes • Use an On-Count trigger to replace default Count Query processing in an application running against a non-ORACLE data source.j).HITS item. Example 2 /* ** Built-in: COUNT_QUERY ** Example: Display the number of records that will be retrieved ** by the current query.QUERY_HITS.1 This example calls a user-named subprogram to count the number of records to be retrieved by the current query criteria. Form Builder issues the standard query hits message: FRM-40355: Query will retrieve <n> records. DECLARE j NUMBER. • If you are replacing default processing.

To perform the default Form Builder processing from this trigger.hits).Using_Transactional_Triggers = ’TRUE’ THEN User_Exit(’my_seqnum seq=EMPNO_SEQ’). 17.QUERY_HITS. */ ELSE Count_Query. • Example: /* ** Built–in: GENERATE_SEQUENCE_NUMBER ** Example: Perform Oracle Forms standard sequence number processing based on a global flag setup at ** startup by the form. do the right thing. Replaces the default series of events that occurs when Form Builder interacts with the database to get the next value from a SEQUENCE object defined in the database. ** Trigger: On–Sequence–Number */ BEGIN /* ** Check the global flag we setup at form startup */ IF :Global. END. the On-Check-Unique trigger fires when Form Builder normally . END. */ ELSE Generate_Sequence_Number. On-Check-Unique Trigger Description During a commit operation.On-Sequence-Number Trigger Description Fires when Form Builder would normally perform the default processing for generating sequence numbers for default item values.Shik Mahamood Ali 73 /* ** Deposit the number of query hits in the appropriate ** block property so Form Builder can display its normal ** status message.Trigger_Block. Suppress or override this functionality with an On-Sequence-Number trigger. END IF. call the GENERATE_SEQUENCE_NUMBER built-in. perhaps based on a parameter. Form Builder queries the database to get the next value from the SEQUENCE whenever the Create Record event occurs. 18. Usage Notes • When a SEQUENCE is used as a default item value. END IF. /* ** Otherwise. do the right thing. /* ** Otherwise.:control. */ Set_Block_Property(:System.

specifically. In the case of an update. When a block has the PRIMKEYB property set to Yes. DECLARE CURSOR chk_unique IS SELECT 'x' FROM dept WHERE deptno = :dept. RAISE Form_Trigger_Failure. and free memory. END IF. BEGIN IF NOT my_data source_open('DX110_DEPT') THEN my_datasource_close('DX110_DEPT'). Form Builder closes a query when all of the records identified by the query criteria have been fetched. Form Builder always checks for unique primary key values. by default. Replaces the default processing for checking record uniqueness. close cursors. 19. For a record that has been marked for insert. Form Builder displays message FRM-40600: Record has already been inserted. Form Builder.deptno. checks the uniqueness of a record by constructing and executing the appropriate SQL statement to select for rows that match the current record's primary key values. Example The following example releases memory being used by a user-defined data access method via the transactional triggers. IF tmp IS NOT NULL THEN Message('This department already exists. Form Builder checks for unique primary key values only if one or more items that have the Primary Key item property have been modified. END. On-Check-Unique Trigger examples The following example verifies that the current record in question does not already exist in the DEPT table. Usage Notes To perform the default processing from this trigger. call the CHECK_RECORD_UNIQUENESS built-in. BEGIN OPEN chk_unique. The On-Close trigger fires automatically when the ABORT_QUERY built-in is called from an On-Select trigger. tmp VARCHAR2(1). On-Close Trigger Description Fires when an operator or the application causes a query to close. Usage Notes • • Use an On-Close trigger after using the On-Select or On-Fetch triggers.').Shik Mahamood Ali 74 checks that primary key values are unique before inserting or updating a record in a base table. . The On-Close trigger augments the normal Form Builder "close cursor" phase of a query. By default. to close files. or when the operator or the application aborts the query. It fires once for each record that has been inserted or updated. FETCH chk_unique INTO tmp. CLOSE chk_unique. END IF. If a duplicate row is found.

On-Rollback Trigger Description Fires when Form Builder would normally issue a ROLLBACK statement.ENABLED.Comm'). include a call to the . itm_id := Find_Item('Emp. Form Builder enforces column security by querying the database to determine the base table columns to which the current form operator has update privileges. For columns to which the operator does not have update privileges.on_or_off). ELSE on_or_off := PROPERTY_ON. On-Column-Security Trigger Description Fires when Form Builder would normally enforce column-level security for each block that has the Enforce Column Security block property set On. DECLARE itm_id Item.Shik Mahamood Ali END. itm_id := Find_Item('Emp. 75 20. BEGIN IF NOT role_is_set('SUPERUSER') THEN on_or_off := PROPERTY_OFF.on_or_off). Example The following example sets salary and commission text items in the current block to disabled and non-updateable.on_or_off). Set_Item_Property(itm_id. 21. By default. Usage Notes Use an On-Rollback trigger to replace standard Form Builder rollback processing. on_or_off NUMBER. processing each block in sequence.ENABLED.UPDATEABLE. To perform default Form Builder processing from this trigger. Usage Notes To perform the default processing from this trigger. unless the SUPERUSER role is enabled. call the ENFORCE_COLUMN_SECURITY built-in.Sal').UPDATEABLE. END IF. Set_Item_Property(itm_id. Set_Item_Property(itm_id. Set_Item_Property(itm_id. Form Builder performs this operation at form startup. Form Builder makes the corresponding base table items in the form non-updateable by setting the Update Allowed item property Off dynamically.on_or_off). Only users with the user-defined SUPERUSER role can change these number fields. to roll back a transaction to the last savepoint that was issued. END.

** Decide whether to use this built-in based on a ** global flag setup at startup by the form. ELSE Issue_Rollback(sp_name). cs VARCHAR2(30). 2. END IF . BEGIN /* Get the name of the savepoint to which Form Builder needs to ** rollback. • • • Pre–Logon and Post–Logon triggers fire as part of the logon procedure.LOGON TRANSACTION TRIGGERS 1. END. . include a call to the LOGON built–in.Using_Transactional_Triggers = 'TRUE' THEN User_Exit('my_rollbk name='||sp_name). (NULL = Full Rollback)*/ sp_name := Get_Application_Property(SAVEPOINT_NAME). J. To perform the default Oracle Forms processing from this trigger. Usage Notes: Use an On–Logon trigger to initiate a logon procedure to a non–ORACLE data source. DECLARE connected BOOLEAN:=FALSE. You can supply a NULL command to this trigger to bypass the connection to a data source. Usage Notes Use a Pre-Logon trigger to prepare the form for the logon procedure. /* ** Check the global flag we setup at form startup */ IF :Global. ** Trigger: On-Rollback */ DECLARE sp_name VARCHAR2(80). particularly to a nonORACLE data source. ** perhaps based on a parameter. un NUMBER. Pre-Logon Trigger Fires just before Form Builder initiate a logon procedure to the data source. ISSUE_ROLLBACK examples 76 /* ** Built-in: ISSUE_ROLLBACK ** Example: Perform Form Builder standard Rollback processing. pw VARCHAR2(30). On-Logon Trigger Fires once per logon when Oracle Forms normally initiates the logon sequence. tries NUMBER:=3. if you want to create an application that does not require a data source.Shik Mahamood Ali ISSUE_ROLLBACK built-in.

Usage Notes • • Use a Pre-Logout trigger to prepare the form for logging out from the data source. BEGIN User_Exit('LogCrypt '|| USER||' ' ||TO_CHAR(SYSDATE. pw || ‘@’ || CS . Tries:=tries-1. 4. WHILE CONNECTED = FALSE AND tries > 0 LOOP LOGON_SCREEN.'YYYYMMDDHH24MISS')). 3. If you call certain built-ins from within one of the Logout triggers. Because the form is no longer accessible at this point. END. POST-LOGON TRIGGER Description Fires after either of the following events: • • The successful completion of Form Builder default logon processing. RAISE FORM_TRIGGER_FAILURE. the results are undefined. The successful execution of the On-Logon trigger. IF NOT CONNECTED THEN MESSAGE(‘Too many tries’). un:=GET_APPLICATION_PROPERTY( USERNAME ). END IF. END IF. END LOOP. the COPY built-in cannot be called from a Pre-Logout trigger because Pre-Logout fires after the Leave the Form event.’DEFAULT’). Pre-Logout Trigger Fires once before Form Builder initiate a logout procedure. LOGON( un. END. particularly a non-ORACLE data source. IF FORM_SUCESS THEN Connected:=TRUE. cs:= GET_APPLICATION_PROPERTY( CONNECTION_STRING ). FALSE ). . the COPY operation is not possible. For example.Shik Mahamood Ali BEGIN 77 SET_APPLICATION_PROPERTY(CURSOR_STYLE. Example This example calls a user exit to log the current username and time to an encrypted audit trail file on the file system. pw:=GET_APPLICATION_PROPERTY( PASSWORD ). which for security reasons is outside the database.

Because the form is no longer accessible. a COPY operation is not possible. BEGIN User_Exit(’LogCrypt ’||USER||’ ’ || TO_CHAR(SYSDATE. include a call to the LOGOUT built-in. If you call certain built-ins from within one of the Logout triggers. J. To perform the default Form Builder processing from this trigger. the results are undefined. which for security reasons is outside the database. Post-Logout Trigger Description Fires after either of the following events: • • Form Builder successfully logs out of ORACLE. a COPY operation is not possible. you cannot call the COPY built-in from a Pre-Logout trigger because Pre-Logout fires after the Leave the Form event. The successful execution of the On-Logout trigger. 6. When-Mouse-Click Trigger Description Fires after the operator click the mouse if one of the following events occurs: • • if attached to the form. Because the form is no longer accessible. This example calls a user exit to log the current username and time to an encrypted audit trail file on the file system. For example.MOUSE TRIGGERS 1. Usage Notes • • • Use an On-Logout trigger to replace the default logout processing either from the RDBMS or from a non-ORACLE data source. END.’YYYYMMDDHH24MISS’)). you cannot call COPY from a Pre-Logout trigger because Pre-Logout fires after the Leave the Form event. On-Logout Trigger 78 Fires when Form Builder normally initiates a logout procedure from Form Builder and from the RDBMS.Shik Mahamood Ali 5. If you call certain built-ins from within one of the Logout triggers. For example. the results are undefined. Usage Notes • • Use a Post-Logout trigger to audit or to perform tasks on an Form Builder application that does not require or affect the RDBMS or other data source. when the mouse is clicked within any canvas or item in the form if attached to a block. when the mouse is clicked within any item in the block .

if the operator clicks the mouse. 2. When-Mouse-DoubleClick Trigger Description Fires after the operator double-clicks the mouse if one of the following events occurs: • • • if attached to the form. when the mouse is clicked within the item Three events must occur before a When-Mouse-Click trigger will fire: • • • Mouse down Mouse up Mouse click Any trigger that is associated with these events will fire before the When-Mouse-Click trigger fires. When-Mouse-DoubleClick Trigger examples Example Assume that an application requires Behavior A when the operator clicks the mouse and Behavior B when the operator double-clicks the mouse. Usage Notes Use the When-Mouse-Click trigger to perform an action every time the operator clicks the mouse within an item and/or canvas. an online help window must appear. when the mouse is double-clicked within any canvas or item in the form if attached to a block. If the operator double-clicks the mouse. when the mouse is double-clicked within the item Six events must occur before a When-Mouse-DoubleClick trigger will fire: • • • • • • Mouse Mouse Mouse Mouse Mouse Mouse down up click down up double-click Any trigger that is associated with these events will fire before the When-Mouse-DoubleClick trigger fires. When-Mouse-Down Trigger Description . a product information window must appear.Shik Mahamood Ali 79 • if attached to an item. when the mouse is double-clicked within any item in the block if attached to an item. For example. Usage Notes Use a When-Mouse-DoubleClick trigger to perform an action every time the operator DoubleClick the mouse within an item and/or canvas. 3.

when the mouse is pressed down within any canvas or item in the form if attached to a block. Note: The mouse down event is always followed by a mouse up event. when the mouse is pressed within the item Usage Notes • Use a When-Mouse-Down trigger to perform an action every time the operator presses down the mouse button within an item and/or canvas. when the mouse enters any item in the block if attached to an item. assume that Alert_One displays within Canvas_Two's border. Assume also that your application contains two canvases. For example.id’). Canvas_One and Canvas_Two do not overlap each other.save_item_name := :SYSTEM. GO_ITEM(’s_ord. Further. Changing a tooltip's property in a When-Mouse-Enter trigger cancels the tooltip before it is ever shown. the trigger fires and returns focus to the previous target. but appear side by side on the screen. when the operator moves the mouse out of Canvas_Two. . When-Mouse-Enter Trigger Description Fires when the mouse enters an item or canvas if one of the following events occurs: • • • if attached to the form. Doing so may cause the modal window to appear unnecessarily. When the operator dismisses the message box. This may not be the desired behavior. Be careful when calling a modal window from a When-Mouse-Enter trigger. However. Finally. Iconic buttons and items on the canvas below the initial window cannot be selected. any When-Mouse-Leave triggers associated with this event will fire. Do not use the When-Mouse-Enter trigger on a canvas that is larger than the window. The user is able to scroll the canvas to see the items. when the mouse enters any canvas or item in the form if attached to a block. Canvas_One and Canvas_Two. when the mouse is pressed down within any item in the block if attached to an item. In addition.Shik Mahamood Ali 80 Fires after the operator presses down the mouse button if one of the following events occurs: • • • if attached to the form. begin :GLOBAL. when the mouse enters the item Usage Notes Use a When-Mouse-Enter trigger to perform an action every time the mouse enters an item or canvas. as soon as the mouse enters that area.CURSOR_ITEM. so the user is never able to click on those items. Alert_One will appear again unnecessarily if the operator subsequently enters Canvas_One with the mouse. 4. assume that your When-Mouse-Enter trigger causes Alert_One to appear whenever the mouse enters Canvas_One. assume that the mouse has entered Canvas_One causing the When-Mouse-Enter trigger to fire which in turn causes Alert_One to appear.

WHEN-MOUSE-LEAVE trigger on control. End. 6. when the mouse moves within any item in the block if attached to an item. GO_ITEM(:GLOBAL.show_help_button begin HIDE_VIEW(’cv_help’).MOUSE_CANVAS = ’CV_ORDER’ THEN :control. when the mouse leaves any item in the block if attached to an item. 7. WHEN-MOUSE-ENTER at Form Level begin 81 IF :SYSTEM. The When-Mouse-Move trigger may have performance implications because of the number of times this trigger can potentially fire. When-Mouse-Up Trigger Description Fires each time the operator presses down and releases the mouse button if one of the following events occurs: . 5. when the mouse moves within the item Usage Notes • Use the When-Mouse-Move trigger to perform an action every time the operator moves the mouse. End. When-Mouse-Move Trigger Description Fires each time the mouse moves if one of the following events occurs: • • • if attached to the form. when the mouse leaves any canvas or item in the form if attached to a block. When-Mouse-Leave Trigger Description Fires after the mouse leave an item or canvas if one of the following events occurs: • • • if attached to the form.Shik Mahamood Ali SHOW_VIEW(’cv_help’). END IF. End. when the mouse leaves the item Usage Notes Use a When-Mouse-Leave trigger to perform an action every time the mouse leaves an item and/or canvas.save_item_name). when the mouse moves within any canvas or item in the form if attached to a block.show_help_button := ’?’.

K. when the mouse up event is received within any item in a block • if attached to an item. but then releases the mouse on Item_Two. Create a user-named trigger to execute user-named subprograms defined in a form document from menu PL/SQL commands and user-named subprograms. This behavior is analogous to pressing the corresponding function key. the scope of a user-named trigger is the definition level and below.Shik Mahamood Ali 82 • if attached to the form.) In the menu PL/SQL. If the operator presses down the mouse on Item_One. (User-named subprograms defined in a form cannot be called directly from menu PL/SQL. the mouse up trigger will fire for Item_One. which in turn calls the user-named subprogram defined in the current form. Usage Notes User-named PL/SQL subprograms can be written to perform almost any task for which one might use a user-named trigger. Note: You can write user–named PL/SQL subprograms to perform almost any task for which you might use a user–named trigger. which is defined in a different document.OTHER TRIGGERS 1. and then call explicitly from other triggers or user–named subprograms. To execute a user–named trigger. as shown here: Execute_Trigger(’my_user_named_trigger’). DO_KEY built-in Executes the key trigger that corresponds to the specified built-in subprogram. When more than one user-named trigger has the same name. User-Named Trigger A user–named trigger is a trigger that you define yourself in a form. For example. As with all triggers. call the EXECUTE_TRIGGER built-in to execute a usernamed trigger. assume that there is a When-Mouse-Up trigger attached to Item_One. The mouse up event is always associated with the item that received the mouse down event. then the specified subprogram executes. It is most practical to define user-named triggers at the form level. when the mouse up event is received within an item Two events must occur before a When-Mouse-Up trigger will fire: • • Mouse down Mouse up Usage Notes Use the When-Mouse-Up trigger to perform an action every time the operator presses and releases the mouse. Syntax PROCEDURE DO_KEY . you must call the EXECUTE_TRIGGER built–in procedure. when the mouse up event is received within any canvas or item in a form • if attached to a block. the trigger defined at the lowest level has precedence. Each user–named trigger defined at the same definition level must have a unique name. If no such key trigger exists. rather than for Item_Two.

Form Builder issues savepoints at form startup. /* Check the global flag we setup at form startup */ IF :Global. END. When Savepoint Mode is Off. Savepoint_Name returns the name of the savepoint to which Form Builder would roll back. */ BEGIN Do_Key('Execute_Query'). END IF. ** Trigger: On-Savepoint */ DECLARE sp_name VARCHAR2(80). if no On-Savepoint trigger were present. use the EXECUTE_TRIGGER built-in: EXECUTE_TRIGGER('KEY_F11'). Post-Change Trigger .perhaps based on a parameter. By default.Using_Transactional_Triggers = 'TRUE' THEN User_Exit('my_savept name='||sp_name). Suppress default savepoint processing by setting the Savepoint Mode form document property to Off. ** Decide whether to use this built-in based on a global flag setup at startup by the form. 3. To accept a specific key name. On-Savepoint Trigger Fires when Form Builder would normally issue a Savepoint statement. 2.consequently.Shik Mahamood Ali 83 (built-in_subprogram_name VARCHAR2). /* Otherwise. and at the start of each Post and Commit Transaction process. In an On-Savepoint trigger. Form Builder does not issue savepoints and. DO_KEY restrictions DO_KEY accepts built-in names only. DO_KEY examples /* ** Built-in: DO_KEY ** Example: Simulate pressing the [Execute Query] key. /* ** Built-in: ISSUE_SAVEPOINT ** Example: Perform Form Builder standard savepoint processing. BEGIN /* Get the name of the savepoint Form Builder needs to issue */ sp_name := Get_Application_Property(SAVEPOINT_NAME). END. */ ELSE Issue_Savepoint(sp_name). the On-Savepoint trigger never fires. include a call to the ISSUE_SAVEPOINT built-in. not key names: DO_KEY(ENTER_QUERY). do the right thing. Usage Notes To perform default Form Builder processing from this trigger. In an On-Rollback trigger . the Savepoint_Name application property returns the name of the next savepoint that Form Builder would issue by default.

Form Builder marks the corresponding items and records as changed. Its use is not recommended in new applications.Non_Oracle_Datasource = 'TRUE' THEN . Also. For example. you must include a Post-Query trigger in addition to your When-Validate-Item trigger. for every row that is to be locked.Shik Mahamood Ali 84 Fires when any of the following conditions exist: • • • The Validate the Item process determines that an item is marked as Changed and is not NULL. the trigger fires once. and the item is not NULL. The trigger does not fire during subsequent modifications to items in the same record. you can use the On–Lock trigger to speed processing by bypassing all lock processing. include a call to the LOCK_RECORD built–in. Usage Notes: • Use an On–Lock trigger to replace the default Oracle Forms processing for locking rows. In this case. You can use Post-Query to make changes to the fetched database values. The Post-Query trigger does not have the restrictions of the Post-Change trigger. An operator returns a value into an item by making a selection from a list of values. Form Builder fetches a non-NULL value into an item. To perform the default Oracle Forms processing from this trigger. When the On–Lock trigger fires as a result of an operator trying to modify data. 3. Usage Notes • • The Post-Change trigger is included only for compatibility with previous versions of Form Builder.perhaps based on a parameter. Given such changes. On-Lock Trigger Fires whenever Oracle Forms would normally attempt to lock a row. the When-ValidateItem trigger does not fire. The trigger fires between the key press and the display of the modified data. In other words. the trigger fires only the first time the operator tries to modify an item in the record. use On–Lock if you are accessing a non–ORACLE data source directly. If you want to circumvent this situation and effectively get rid of the Post-Change trigger. See "Usage Notes" below. • • • /* ** Built-in: LOCK_RECORD ** Example: Perform Form Builder standard record locking on the queried record which has just been deleted or updated. Use this trigger to lock underlying tables for non–updateable views. Decide whether to use default processing or a user exit by consulting a global flag setup at startup by the form. such as when an operator presses a key to modify data in an item. if you are designing an application for use on a single–user system. not by way of Open Gateway. ** Trigger: On-Lock */ BEGIN /* ** Check the global flag we set up at form startup */ IF :Global.

8. This trigger is called when a query operation is necessary. (In a Microsoft Windows environment. but the Query Data Source Columns property must be set so that those items can be passed to the query stored procedure. do the right thing. 5. Pre-Popup-Menu Trigger This trigger is called when a user causes a pop-up menu to be displayed. Update-Procedure Trigger Automatically created by Form Builder when the update data source is a stored procedure.) Actions defined for this trigger are performed before the pop-up menu is displayed. Then.custom_item_event. END IF. Example: This is an example of a procedure that can be called when Oracle Forms fires the When–Custom–Item–Event Trigger. the query stored procedure has to use those values to filter the data.CUSTOM_ITEM_EVENT stores the case–sensitive name of the event that occurred. This means that the enter query mode does not happen automatically unless you specify it. Query-Procedure Trigger Automatically created by Form Builder when the query data source is a stored procedure. Usage Notes When constructing a query.CUSTOM_ITEM_EVENT_PARAMETERS stores a parameter name that contains the supplementary arguments for an event that is fired by a VBX control. 7. BEGIN TabEvent := :system. . Think of this as an On-Update trigger that is called by the system instead of doing default update operations. Usage Notes Use this trigger to enable or disable menu items on a pop-up menu before it is displayed. this occurs when a user presses the right mouse button. The system variable SYSTEM. END. DECLARE TabEvent varchar2(80). 6. any of the items may be used. Think of this as an On-Query trigger that is called by the system instead of doing default query operations. When-Custom-Item-Event Trigger Fires whenever a VBX control sends an event to Oracle Forms. Usage Notes: Use a When–Custom–Item–Event trigger to respond to a selection or change of value for a VBX control. and the system variable SYSTEM.Shik Mahamood Ali 85 User_Exit('my_lockrec block=EMP'). TabNumber Number. /* ** Otherwise. */ ELSE Lock_Record. This trigger is called when a update operation is necessary.

When-Tab-Page-Changed Fires whenever there is explicit item or mouse navigation from one tab page to another in a tab canvas.’CurrTab’). END. Usage Notes • • Use a When-Tab-Page-Changed trigger to perform actions when any tab page is changed during item or mouse navigation. For example. form Use a When–Form–Navigate trigger to perform actions when any cross form navigation takes place without relying on window activate and window deactivate events. .MAXIMIZE).MINIMIZE).to uppercase (to indicate to end users if they already have ** navigated to the tab page): */ DECLARE tp_nm VARCHAR2(30). tp_lb VARCHAR2(30). and use the user–defined Goto_Tab_Page procedure to navigate to the selected page. END IF. else SET_WINDOW_PROPERTY(win_id. 10. end if. but the trigger will not fire if an end user presses [Next Item] (Tab) to navigate from one field to another field in the same block. END. tp_id := FIND_TAB_PAGE(tp_nm). Goto_Tab_Page(TabNumber). tp_id TAB_PAGE. tp_lb := GET_TAB_PAGE_PROPERTY(tp_id. When-Tab-Page-Changed does not fire when the tab page is changed programmatically. */ IF (UPPER(TabEvent) = ’CLICK’) THEN TabNumber := VBX. topmost_tab_page). When-Form-Navigate Trigger Fires whenever any peer form navigation takes place. DECLARE win_id WINDOW := FIND_WINDOW(’WINDOW12’). it does not respond to implicit navigation. BEGIN tp_nm := GET_CANVAS_PROPERTY('emp_cvs'. the trigger will fire when the mouse or keyboard is used to navigate between tab pages. but on different tab pages.WINDOW_STATE. This is an example of a procedure that can be called when Oracle Forms fires the When–Form– Navigate Trigger. identify the ** tab selected.WINDOW_STATE. When-Tab-Page-Changed fires only when tab page navigation is explicit. • Example /* Use a When-Tab-Page-Changed trigger to dynamically change a tab page's label from lower. BEGIN if (GET_WINDOW_PROPERTY(win_id. label).WINDOW_STATE) = ’MAXIMIZE’ THEN SET_WINDOW_PROPERTY(win_id.Get_Property(’TABCONTROL’.Shik Mahamood Ali 86 /* ** After detecting a Click event. 9.

13. When-Tree-Node-Selected Trigger Fires when a node is selected or deselected. When-Tree-Node-Expanded Trigger Fires when a node is expanded or collapsed.TRIGGER_NODE is the node the user clicked on. END. Combines the features found in list and text items. When the operator selects the list icon. allowing the operator to view and select undisplayed values. SYSTEM. label. a vertical scroll bar appears. Usage Notes • SYSTEM. 'VACATION'). Only enduser action will generate an event.Shik Mahamood Ali 87 IF tp_lb LIKE 'Sa%' THEN SET_TAB_PAGE_PROPERTY(tp_id. Usage Notes • • SYSTEM. END IF. The combo box list item appears as an empty box with an icon to the right. 'SALARY'). 12.TRIGGER_NODE returns a value of type NODE. a list of available choices appears. Usage Notes • • SYSTEM. SYSTEM.TRIGGER_NODE is the node the user clicked on.TRIGGER_NODE returns a value of type NODE. Only end-user action will generate an event. text list. 11. or combo box LIST ITEM Poplist Text List DESCRIPTION Combo Box Appears initially as a single field (similar to a text item field). The user can enter text directly into the combo field or click the list icon to display a list of available values. . No programmatic action will cause the When-Tree-Node-Activated trigger to fire. When-Tree-Node-Activated Trigger Fires when an operator double-clicks a node or presses Enter when a node is selected. Appears as a rectangular box which displays a fixed number of values. • No programmatic action will cause the When-Tree-Node-Selected trigger to fire. Only end-user action will generate an event. No programmatic action will cause the When-Tree-Node-Expanded trigger to fire. ELSE null. label. Defining list items A list item displays a predefined set of choices that Ø are mutually exclusive Ø can be displayed as either a poplist. Unlike the poplist or the text list style list items. SYSTEM.TRIGGER_NODE returns a value of type NODE.TRIGGER_NODE is the node the user clicked on. the combo box style list item will display fixed values and accept one operator-entered value. ELSIF tp_lb LIKE 'Va%' THEN SET_TAB_PAGE_PROPERTY(tp_id. When the text list contains values that cannot be displayed (due to the displayable area of the item).

Shik Mahamood Ali 88 .

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.