
{"id":7621,"date":"2020-05-22T08:54:46","date_gmt":"2020-05-22T08:54:46","guid":{"rendered":"https:\/\/rax-stg-wp-aws.com\/blogs\/use-the-oracle-forms-app_multi-package\/"},"modified":"2026-11-03T19:28:46","modified_gmt":"2026-11-03T19:28:46","slug":"use-the-oracle-forms-app_multi-package","status":"publish","type":"blogs","link":"https:\/\/www.rackspace.com\/de\/blogs\/use-the-oracle-forms-app_multi-package\/","title":{"rendered":"Use the Oracle Forms APP_MULTI package"},"content":{"rendered":"<p>The Oracle\u00ae&nbsp;&nbsp;<em>APP\\_MULTI<\/em> package enables you to add multi-selection functionality to a form. This option is available in APPCORE Library.&nbsp;By using the APP\\_MULTI package, you can select single or multiple records and&nbsp;process them as needed. The following image illustrates random record selection:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/blog_article_images\/26456-body-Picture1_8.png\" alt=\"oracle multi pic 1\" \/><\/p>\n<p><a href=\"https:\/\/i36.me\/images\/oracle\/ebs\/ebs_frm_lnchse_with_app_multi_01.jpg\">Image Source<\/a>&nbsp;<\/p>\n<p><strong>Functionality<\/strong><\/p>\n<p>The APP\\_MULTI package enables you to perform the following actions:<\/p>\n<ul>\n<li>Click on a single record to select it.<\/li>\n<li>Press and hold the Ctrl key and click on multiple records to select several&nbsp;records at the same time.<\/li>\n<li>Choose <strong>Select All<\/strong>&nbsp;from the application menu to select all records.<\/li>\n<li>Choose <strong>Deselect All<\/strong>&nbsp;from the application menu to deselect all selected&nbsp;records.<\/li>\n<li>Click the first record, and hold down the shift key while you click the last&nbsp;record in a sequence to select several contiguous records.<\/li>\n<\/ul>\n<p><strong>APP\\_MULTI package events<\/strong><\/p>\n<p>The APP\\_MULTI package responds to the following events on a form:<\/p>\n<p>&#8211; <strong>KEY-CLRFRM<\/strong>: (form-level) Validates the record before it clears the form.&nbsp;&nbsp;Use example: <em>`APP_MULTI.EVENT(&#8216;KEY-CLRFRM&#8217;);`<\/em><\/p>\n<p>&#8211; <strong>KEY-CLRREC<\/strong>: (block-level) Fires when you clear the current record. It is&nbsp;equivalent to the <em>`clear_record`<\/em> command.<\/p>\n<p>&#8211; <strong>KEY-CREREC<\/strong>: (block-level) Fires when you create a new record. It is equivalent to the <em>`create_record` <\/em>command.<\/p>\n<p>&#8211; <strong>KEY-DELREC<\/strong>: (block-level) Fires when you delete an existing record. It is equivalent to the <em>`delete_record`<\/em> command.<\/p>\n<p>&#8211; <strong>PRE-BLOCK<\/strong>: (block-level) Fires when you enter a block.<\/p>\n<p>&#8211; <strong>POST-BLOCK<\/strong>: (block-level) Fires when you exit from a block.<\/p>\n<p>&#8211; <strong>SELECT_ALL<\/strong>: (block-level) Fires when you select all records.<\/p>\n<p>&#8211; <strong>DESELECT_ALL<\/strong>: (block-level) Fires when you deselect all records.<\/p>\n<p>&#8211; <strong>WHEN-CLEAR-BLOCK<\/strong>: (block-level) Fires when you clear the block.<\/p>\n<p>&#8211; <strong>WHEN-MOUSE-CLICK<\/strong>: (block-level) Fires when you click the mouse.<\/p>\n<p>&#8211; <strong>WHEN-NEW-RECORD-INSTANCE<\/strong>: (block-level) Fires when you create or query a&nbsp;record on the block.<\/p>\n<p><strong>Manually create triggers<\/strong><br \/>\nYou need to create the necessary triggers and explicitly call the <strong>APP_MULTI.EVENT&nbsp;<\/strong>procedure by passing the name of the event being handled, as shown in the&nbsp;following example:<\/p>\n<p><em>&nbsp;PROCEDURE event(p_event_name VARCHAR2,p_blockname<br \/>\n&nbsp; &nbsp; VARCHAR2 DEFAULT NULL);<\/em><\/p>\n<p>For example, the `KEY-CLRREC` trigger can be as simple as the following command:<\/p>\n<p><em>&nbsp; &nbsp; APP_MULTI.EVENT(&#8216;KEY-CLRREC&#8217;);<\/em><\/p>\n<p><strong>Note:<\/strong> The procedure accepts an optional argument<em> `p_blockname`.<\/em> If you don&#8217;t<br \/>\npass<em> `p_blockname`,<\/em> the procedure uses the value of <strong>SYSTEM.TRIGGER\\_BLOCK<\/strong><\/p>\n<p><strong>Selection and deselection events<\/strong><\/p>\n<p>When you implement the custom <strong>MULTI\\_RETURN\\_ACTION<\/strong> trigger (either in a data&nbsp;block or at the top level of a form), the system notifies you of the record&nbsp;selection and deselection. The trigger fires after every individual or bulk&nbsp;record selection or deselection.<\/p>\n<p><strong>&nbsp;Trigger variables<\/strong><br \/>\n&#8211; The <strong>GLOBAL.APPCORE\\_MULTI\\_BLOCK<\/strong>&nbsp;global: has the name of the data block&nbsp;that is affected by record selection or deselection.<\/p>\n<p>&#8211; The <strong>GLOBAL.APPCORE\\_MULTI\\_ACTION<\/strong> global: has any of the following values:<\/p>\n<p>&nbsp; &nbsp; &nbsp; &#8211; &#8216;<em>RECORD\\_SELECTED&#8217;<\/em>: When a record is selected<\/p>\n<p>&nbsp; &nbsp; &nbsp; &#8211; &#8216;<em>RECORD\\_DESELECTED&#8217;<\/em>: When a record is deselected<\/p>\n<p>&nbsp; &nbsp; &nbsp; &#8211; <em>&#8216;LABEL\\_CHANGE&#8217;<\/em>: When the <strong>Select All<\/strong>&nbsp;or <strong>Deselect All<\/strong>&nbsp;menu<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; items are enabled or disabled<\/p>\n<p>&#8211; The <strong>APP\\_MULTI.LOOPING<\/strong>&nbsp;package variable: has either TRUE or FALSE values,&nbsp;&nbsp; depending on whether you called <strong>MULTI\\_RECORD\\_ACTION<\/strong>&nbsp;within a loop.<\/p>\n<p><strong>&nbsp;Retrieve data selected on a form<\/strong><\/p>\n<p>For each data block, the APP\\_MULTI package has a record group with the record numbers of the currently selected records.&nbsp;You can perform the following tasks by providing the name of the data block<\/p>\n<p>&#8211; Use the <strong>APP\\_MULTI.GET\\_GROUP\\_COL <\/strong>function to access a record group&#8217;s <strong>Only&nbsp;<\/strong>column for a specific data block.<\/p>\n<p>&#8211; Use the <strong>APP\\_MULTI.GET\\_GROUP\\_COUNT<\/strong> to get the number of selected records.<\/p>\n<p>For example, given a discrete jobs form, block <strong>W\\_JOBS<\/strong>, and a field,&nbsp;<strong>WIP\\_ENTITY\\_ID<\/strong>, you can print the IDs of the selected jobs by using the&nbsp;following PL\/SQL code:<\/p>\n<p><em>&nbsp;DECLARE<br \/>\n&nbsp; &nbsp; &nbsp;record_number_column &nbsp; &nbsp;groupcolumn;<br \/>\n&nbsp; &nbsp; &nbsp;selected_record_count &nbsp; NUMBER;<br \/>\n&nbsp; &nbsp; &nbsp;BEGIN<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;record_number_column := app_multi.get_group_col (&#8216;W_JOBS&#8217;);<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;selected_record_count :=app_multi.get_group_count (&#8216;W_JOBS&#8217;);<\/em><\/p>\n<p><em>&nbsp; &nbsp; &nbsp;FOR i IN 1 .. selected_record_count<br \/>\n&nbsp; &nbsp; &nbsp; LOOP<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;DECLARE<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; record_number &nbsp; &nbsp; NUMBER;<\/em><\/p>\n<p><em>&nbsp; &nbsp; &nbsp; v_wip_entity_id &nbsp; NUMBER;<br \/>\n&nbsp; &nbsp; &nbsp; BEGIN<\/em><\/p>\n<p><em>&nbsp; &nbsp; &nbsp; &nbsp;record_number := GET_GROUP_NUMBER_CELL (record_number_column, i);<\/em><\/p>\n<p><em>&nbsp; &nbsp; &nbsp; &nbsp;GO_RECORD (record_number);<\/em><\/p>\n<p><em>&nbsp; &nbsp; &nbsp; &nbsp;v_wip_entity_id := NAME_IN (&#8216;W_JOBS.WIP_ENTITY_ID&#8217;);<\/em><\/p>\n<p><em>&nbsp; &nbsp; &nbsp; &nbsp;fnd_message.debug ( &#8216;v_wip_entity_id&#8217; || v_wip_entity_id);<\/em><\/p>\n<p><em>&nbsp; &nbsp; &nbsp; &nbsp;EXCEPTION<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; WHEN OTHERS &nbsp;THEN<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Null;<br \/>\n&nbsp; &nbsp; &nbsp; END;<br \/>\n&nbsp; &nbsp; &nbsp;END LOOP;<br \/>\n&nbsp; &nbsp; END;<\/em><br \/>\n&nbsp;<\/p>\n<p><strong>Conclusion<\/strong><\/p>\n<p>With the APP\\_MULTI package, you can process bulk data in custom Oracle forms.&nbsp;This package lets you get the details of bulk data that a user selects on the&nbsp;standard forms. You can use it in the form of personalization or <strong>custom.pll<\/strong>&nbsp;code to&nbsp;add custom functionality in a standard Oracle form.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Use the Oracle Forms APP_MULTI package<\/p>\n","protected":false},"author":2,"featured_media":7623,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","format":"standard","meta":{"content-type":"","nid":"26456","content_type":"blog","created_by":"10130","authored_on":"2024-01-08T09:54:46+00:00","field_article_industries":"","tag_category":"Technical","field_blog_author_text":"by Amit Kumar, Professional Services Delivery Engineer, Rackspace Technology","seo_description":"Explore Oracle's APP_MULTI package, enhancing Oracle Forms with multi-selection functionality for improved user productivity and interaction.\r\n","field_featured_image":"","insights_image":"\/wp-content\/uploads\/2026\/blog_technical_images\/26456-insights_image-oracle-technical-blog-1-insights.jpg","field_partners":"","rxt_platforms":"Oracle","product":"","publisheddate":"2020-05-22T08:54:46","rxt_solutions":"","opengraph_tag":"","x_tag":"","teaser_flag":"Technical Blog","seo_titile":"Oracle Forms APP_MULTI Package | Rackspace Technology","field_topics":"","field_slug":"use-the-oracle-forms-app-multi-package","footnotes":""},"categories":[178],"tags":[204],"class_list":["post-7621","blogs","type-blogs","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-technical"],"_links":{"self":[{"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/blogs\/7621","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/blogs"}],"about":[{"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/types\/blogs"}],"author":[{"embeddable":true,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/comments?post=7621"}],"version-history":[{"count":3,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/blogs\/7621\/revisions"}],"predecessor-version":[{"id":9569,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/blogs\/7621\/revisions\/9569"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/media\/7623"}],"wp:attachment":[{"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/media?parent=7621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/categories?post=7621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/tags?post=7621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}