Example Form Personalization using Custom.pll

Sample CUSTOM Library Code To Customize Applications

        ·         How to make ‘Customer PO’ a Mandatory field?
For example to have Customer PO number in Sales order screen as a mandatory field
if (event_name = 'WHEN-NEW-FORM-INSTANCE') then
   if (form_name = 'OEXOEORD') then
app_item_property2.set_property('ORDER.CUST_PO_NUMBER',REQUIRED, PROPERTY_ON);
   end if;
end if;

Check the blog post for 

        ·         How to restrict cases for Custom PO field?
For example restricting Lower case in Customer PO field
if (event_name = 'WHEN-NEW-FORM-INSTANCE') then
  if (form_name = 'OEXOEORD') then
     app_item_property2.set_property('ORDER.CUST_PO_NUMBER',CASE_RESTRICTION, UPPERCASE);
   end if;
end if;

       ·         How to change the background color of the field ‘Payment Terms’ in Sales orders others screen
For example how to Change the background color to Fuchsia(r255g0b255)
if (event_name = 'WHEN-NEW-FORM-INSTANCE') then
  if (form_name = 'OEXOEORD') then
 app_item_property2.set_property('ORDER.TERMS',BACKGROUND_COLOR, 'r255g0b255');
  end if;
end if;

       ·         How to change the prompt for a field?
For changing the prompt of the field Order Number on the Release Sales Order form
if (event_name = 'WHEN-NEW-FORM-INSTANCE') then
  if (form_name = 'WSHFRREL' AND block_name = 'RELEASE') then
     app_item_property2.set_property ('RELEASE.ORDER_NUMBER', prompt_text, 'Sales Order Number');
   end if;
end if;
  
       ·         How to make a field non editable field but the values needs to be defaulted?
For disabling the customer field in orders screen
if (event_name = 'WHEN-NEW-ITEM-INSTANCE') then
  if (form_name = 'OEXOEORD' AND block_name = 'ORDER') then
   COPY ('Business World', 'ORDER.SOLD_TO');
   VALIDATE (item_scope);
   app_item_property2.set_property ('ORDER.SOLD_TO', enabled, property_false);
  end if;
end if;

        ·         How to hide Lines Tab in Sales Order form?
 my_tab_page_id TAB_PAGE;
 begin
   if (event_name = 'WHEN-NEW-FORM-INSTANCE') then
      if (form_name = 'OEXOEORD') then
         my_tab_page_id := FIND_TAB_PAGE('ORDER_REGIONS.LINE_ITEMS');
         SET_TAB_PAGE_PROPERTY(my_tab_page_id,VISIBLE,property_FALSE);
      end if;
    end if;

        ·         How to rename Lines’ tab to XX Items tab?
  my_tab_page_id TAB_PAGE;
  begin
     if (event_name = 'WHEN-NEW-FORM-INSTANCE') then
        if (form_name = 'OEXOEORD') then
           my_tab_page_id := FIND_TAB_PAGE('ORDER_REGIONS.LINE_ITEMS');
           SET_TAB_PAGE_PROPERTY(my_tab_page_id,LABEL,'XX Items');
       end if;
     end if;

       ·         How to hide Book Order Button?
For example to hide Book button on the Sales Order Form
 if (event_name = 'WHEN-NEW-FORM-INSTANCE') then
    if (form_name = 'OEXOEORD') then
       app_item_property2.set_property('ORDER_CONTROL.BOOK_ORDER',displayed, PROPERTY_false);
     end if;
  end if;

      ·         How to Rename Book Order Button?
 if (event_name = 'WHEN-NEW-FORM-INSTANCE') then
   if (form_name = 'OEXOEORD') then
      app_item_property2.set_property('ORDER_CONTROL.BOOK_ORDER',Label,'Please confirm');
   end if;
 end if;

      ·         How to make a block read-only ?
 if (event_name = 'WHEN-NEW-FORM-INSTANCE') then
    if (form_name = 'OEXOEORD'and block_name = 'ORDER') then
       set_block_property(block_name, insert_allowed,property_false);
    end if;
 end if;

      ·         How to ensure user enters not more than 3 characters in ‘Customer PO’ field and exits the field ?
 if (form_name = 'OEXOEORD') then
   if LENGTH(name_in('ORDER.CUST_PO_NUMBER'))>3
     and
  GET_ITEM_PROPERTY('ORDER.CUST_PO_NUMBER',UPDATE_COLUMN) = 'TRUE'
     then
    V_REC_NUM := name_in('SYSTEM.CURSOR_RECORD');
    SET_RECORD_PROPERTY(V_REC_NUM,'INV_SUM_FOLDER',STATUS,NEW_STATUS);
     fnd_message.set_name('FND','PO Number must be <= 3 characters');
     fnd_message.Error;
     RAISE FORM_TRIGGER_FAILURE;
   end if;
 end if;

      ·         How to prevent a particular user from entering an Odd quantity for a particular item?
 b := fnd_profile.VALUE ('user_id');
 if (b = '1008697') then
   if (event_name = 'WHEN-VALIDATE-RECORD') then
      if (form_name = 'OEXOEORD' AND block_name = 'LINE') then
         if (NAME_IN ('LINE.ORDERED_ITEM_DSP') = 'AS54888') then
           if (MOD (NAME_IN ('LINE.ORDERED_QUANTITY'), 2) = 0) then
             fnd_message.set_string ('Even quantities for ' ||NAME_IN(LINE.ORDERED_ITEM_DSP)|| ' not allowed');
             fnd_message.show ();
             RAISE form_trigger_failure;
            end if;
              fnd_message.set_string('Entered quantity is Odd -- so no problem');
              fnd_message.show();
         end if;
        end if;
     end if;
   end if;

      ·         How to enable Zoom for a particular form?
For example to open the Onhand Quantity from Item Description field in lines tab of Sales Order form.
To enable the Zoom function

FUNCTION zoom_available
RETURN BOOLEAN
IS
form_name VARCHAR2 (30) := NAME_IN ('system.current_form');
block_name VARCHAR2 (30) := NAME_IN ('system.cursor_block');
BEGIN
 if (form_name = 'OEXOEORD' AND block_name = 'LINE') then
   RETURN TRUE;
 else
   RETURN FALSE;
 end if;
END zoom_available;
Following code helps to Onhand Quantity Form and to pass the item name to Onhand Quantity from Sales Order Form and navigate to Item field while clicking the Zoom button.

 procedure event(event_name varchar2) is
  param_to_pass1 VARCHAR2 (255);
  b varchar2(20);
 begin
  if (event_name = 'ZOOM') then
    if (form_name = 'OEXOEORD' AND block_name = 'LINE') then
       param_to_pass1 := NAME_IN ('LINE.ORDERED_ITEM_DSP');
           fnd_function.EXECUTE (function_name => 'INV_INVMATWB',
                                                   open_flag => 'Y',
                                                   session_flag => 'Y',
                                                   other_params => 'ITEMS="' || param_to_pass1 || '"' );
    end if;
  end if;
  if (event_name = 'WHEN-NEW-RECORD-INSTANCE') then
   if (form_name = 'INVMATWB' AND block_name = 'MATERIAL_QF') then
       b := fnd_profile.VALUE ('user_name');
       fnd_message.set_string (NAME_IN ('parameter.ITEMS')||'is entered by user' ||b);
       fnd_message.show ();
       GO_ITEM ('MATERIAL_QF.ITEM');
       COPY (NAME_IN ('parameter.ITEMS'), ('MATERIAL_QF.ITEM'));
       VALIDATE (item_scope);
    END IF;
  end event;

        ·         How to enable a Special button?
Below is an example showing the menu button from sales order form
 a menuitem;
 Begin
  a := FIND_MENU_ITEM ('SPECIAL.SPECIAL15');
  if (event_name = 'WHEN-NEW-BLOCK-INSTANCE') then
    if (form_name = 'OEXOEORD' AND block_name = 'LINE') then
       app_special2.instantiate ('SPECIAL15', 'Query Form');
       SET_MENU_ITEM_PROPERTY (a, displayed, property_true);
       SET_MENU_ITEM_PROPERTY (a, enabled, property_true);
    end if;
  end if;
  if (event_name = 'SPECIAL15') then
    if (form_name = 'INVIDITM') then
     fnd_function.EXECUTE (function_name => 'INV_INVMATWB',
                           open_flag => 'Y',
                           session_flag => 'Y' );
    end if;
  end if;

       ·         How to switch off the custom code at the run time?
This is similar to switching off the custom code using
Help --> Diagnostics --> Custom --> Custom Off

Note: Switching off customization means that Codes written in custom library and for personalization are switched off. This does not switch off Custom triggers or Custom code written on the standard forms.

A sample code for switch off customization:
 IF event_name = 'WHEN-NEW-FORM-INSTANCE' THEN
   IF fnd_profile.value('USER_ID') =1318 THEN
    copy ( 'OFF' , 'GLOBAL.APP_CUSTOM_MODE' ) ;
   ELSE
     copy ( 'NORMAL' , 'GLOBAL.APP_CUSTOM_MODE' ) ;
   END IF ;
 END IF ;