Oracle EBS Forms Personalization Tables and Trigger Events Reference
This reference lists the tables that store Oracle Forms Personalization rules in EBS 12.1 and 12.2, the trigger events and action types you can choose, and the builtins most teams use. The notes include a query that lists every rule on a form and the FNDLOAD commands for migration.
| Item | Group | Meaning | Key columns or example | Notes |
|---|---|---|---|---|
FND_FORM_CUSTOM_RULES | Table | One row per personalization rule (header) | ID, FUNCTION_NAME, FORM_NAME, SEQUENCE, DESCRIPTION, TRIGGER_EVENT, TRIGGER_OBJECT, CONDITION, ENABLED, FIRE_IN_ENTER_QUERY | Filter by FORM_NAME and FUNCTION_NAME together: function-level rules carry the function code, form-level rules apply under every function of the form. |
FND_FORM_CUSTOM_SCOPES | Table | Context (where the rule applies) | RULE_ID, LEVEL_ID, LEVEL_VALUE, LEVEL_VALUE_APPLICATION_ID | One row per context line: Site, Responsibility, User or Industry. RULE_ID = FND_FORM_CUSTOM_RULES.ID. |
FND_FORM_CUSTOM_ACTIONS | Table | Actions of a rule | ACTION_ID, RULE_ID, SEQUENCE, ACTION_TYPE, TARGET_OBJECT, PROPERTY_NAME, PROPERTY_VALUE, MESSAGE_TYPE, MESSAGE_TEXT, BUILTIN_TYPE, BUILTIN_ARGUMENTS, MENU_ENTRY, MENU_LABEL, ENABLED | RULE_ID = FND_FORM_CUSTOM_RULES.ID. Actions fire in SEQUENCE order. |
FND_FORM_CUSTOM_PARAMS | Table | Parameters passed by Launch a Function and similar builtins | ACTION_ID, NAME, VALUE, SEQUENCE | ACTION_ID = FND_FORM_CUSTOM_ACTIONS.ACTION_ID. |
WHEN-NEW-FORM-INSTANCE | Trigger event | Fires once when the form opens | Set default values, hide fields, set block WHERE clauses | Most common event for property changes that should apply all the time. |
WHEN-NEW-BLOCK-INSTANCE | Trigger event | Fires when the cursor enters a block | Trigger Object = block name, e.g. ORDER | Use for block level properties such as INSERT_ALLOWED. |
WHEN-NEW-RECORD-INSTANCE | Trigger event | Fires when the cursor moves to a record | Trigger Object = block name | Use when a property depends on the values of the current record. |
WHEN-NEW-ITEM-INSTANCE | Trigger event | Fires when the cursor enters an item | Trigger Object = BLOCK.ITEM | Good for hints and context messages on one field. |
WHEN-VALIDATE-RECORD | Trigger event | Fires when the record is validated (leaving it or saving) | Trigger Object = block name | The usual place for a validation that raises an error and stops the save. |
SPECIAL1 to SPECIAL45 | Trigger event | Custom menu entries activated with a Menu action | Menu action activates SPECIAL7 with label 'Open Supplier'; a second rule on event SPECIAL7 runs the builtin | Some forms already use certain SPECIAL entries. Pick one that is free in that form. |
Property | Action type | Change a property of an item, block, window, canvas, tab page or the form | Target BLOCK.ITEM, property REQUIRED = TRUE; property VALUE = default | Property values can be literals or SQL expressions starting with '='. |
Message | Action type | Show a message | Message Type: Show, Hint, Error, Debug, Warn | Error and Warn behave like FND_MESSAGE.ERROR and WARN. Error stops processing in validation events. |
Builtin | Action type | Call a builtin or launch something | Builtin Type chosen from a list (rows below) | Arguments depend on the builtin type. |
Menu | Action type | Activate a SPECIAL menu entry and set its label and icon | Menu Entry SPECIAL7, Menu Label 'Supplier Details' | Usually on WHEN-NEW-FORM-INSTANCE, then a separate rule handles the event. |
Launch SRS Form | Builtin | Opens Submit Request for a given concurrent program | Program name argument | Saves users searching for a report. |
Launch a Function | Builtin | Opens another form function with parameters | Function code plus parameters (FND_FORM_CUSTOM_PARAMS) | Combine with a SPECIAL menu entry for zoom-like navigation. |
Launch a URL | Builtin | Opens a URL in a browser window | Argument such as ='http://intranet/item?id='||:ITEM.INVENTORY_ITEM_ID | Target can be a new or the same window. |
DO_KEY | Builtin | Runs a key trigger as if the user pressed it | Argument COMMIT_FORM, NEXT_BLOCK, EXECUTE_QUERY | Key names follow Oracle Forms built-in names. |
EXECUTE_TRIGGER | Builtin | Runs a named trigger in the form | Argument trigger name | Only triggers the form actually defines. |
GO_BLOCK / GO_ITEM | Builtin | Navigate to a block or item | Argument block name or BLOCK.ITEM | Navigation builtins are restricted in some trigger events by Forms rules. |
FORMS_DDL | Builtin | Runs an anonymous PL/SQL block or DDL from the form | Argument such as ='begin xx_pkg.log(' || :HEADER.ID || '); end;' | Runs in the form session. Keep logic in a database package and call it. |
RAISE FORM_TRIGGER_FAILURE | Builtin | Stops the current trigger and the event that fired it | Usually after an Error message in WHEN-VALIDATE-RECORD | This is how a personalization blocks a save. |
Execute a Procedure | Builtin | Calls a database procedure | Argument such as ='xx_pkg.do_something('||:BLOCK.FIELD||')' | The procedure runs as APPS. Do not use it for commits outside the form transaction without care. |
SYNCHRONIZE | Builtin | Refreshes the screen with the current internal state | No argument | Useful after a FORMS_DDL that changed values shown on screen. |
Call Custom Library | Builtin | Calls the CUSTOM library (CUSTOM.pll) event handler | Argument event name | Lets a personalization hand off to CUSTOM.pll code for logic too complex for rules. |
Create Record Group from Query | Builtin | Builds a record group, typically to replace an LOV | Argument SELECT statement and group name | Pair with a Property action setting the LOV RECORD_GROUP. |
affrmcus.lct download | Migration | FNDLOAD download of personalizations | FNDLOAD apps/<pwd> 0 Y DOWNLOAD $FND_TOP/patch/115/import/affrmcus.lct XX_POXPOEPO.ldt FND_FORM_CUSTOM_RULES FUNCTION_NAME="PO_POXPOEPO" | Use FORM_NAME="POXPOEPO" to download rules saved at form level. |
affrmcus.lct upload | Migration | FNDLOAD upload into the target instance | FNDLOAD apps/<pwd> 0 Y UPLOAD $FND_TOP/patch/115/import/affrmcus.lct XX_POXPOEPO.ldt | Upload replaces all rules for that function or form in the target. Download target first as a backup. |
Covers EBS 12.1 and 12.2 Forms (not OA Framework personalization, which is stored in the MDS repository). List personalizations by form: SELECT r.form_name, r.function_name, r.sequence, r.description, r.trigger_event, r.trigger_object, r.condition, r.enabled, a.sequence action_seq, a.action_type, a.target_object, a.property_value, a.message_text, a.builtin_type FROM fnd_form_custom_rules r, fnd_form_custom_actions a WHERE a.rule_id(+) = r.id AND r.form_name = 'POXPOEPO' ORDER BY r.sequence, a.sequence;
Personalization inventory review
Send us the output of the personalization query for your key forms and we will flag rules that are likely to break on the next patch or upgrade.
Optional. The tool and every export work without this. No spam.
Where the screen is and who can open it
Open the form, then Help > Diagnostics > Custom Code > Personalize. The menu entry depends on two profile options: Hide Diagnostics menu entry must be No and Utilities:Diagnostics must be Yes for the user, or the user is asked for the APPS password. In production, set these only for named support users. The Personalization screen has a header (Seq, Description, Level of Function or Form, Enabled), a Condition tab (Trigger Event, Trigger Object, Condition, Processing Mode), the Context lines (Site, Responsibility, User, Industry), and the Actions tab. Every save writes to FND_FORM_CUSTOM_RULES, FND_FORM_CUSTOM_SCOPES and FND_FORM_CUSTOM_ACTIONS immediately, and the rule takes effect the next time the form opens.
- Function level: rule applies only when the form opens through that function
- Form level: rule applies to the form under every function
- Processing Mode: Not in Enter-Query Mode, Only in Enter-Query Mode, or Both
Condition syntax
The Condition is a SQL expression evaluated as if in SELECT ... FROM dual WHERE <condition>. Reference form values with bind syntax :BLOCK.FIELD, global variables with :GLOBAL.NAME, and you can call database functions and FND_PROFILE.VALUE. Use the Validate button to test it against the current record. Keep conditions short and push complex logic into a database function that returns 'Y' or 'N'.
- :ORDER.ORDER_TYPE_ID = 1430
- :LINE.ORDERED_QUANTITY > 1000
- FND_PROFILE.VALUE('USER_ID') <> 0
- xx_pers_util.is_restricted(:HEADER.VENDOR_ID) = 'Y'
Worked example: make a field required
Requirement: on the Sales Orders form, the Customer PO field must be entered for one responsibility. Find the item name with Help > Diagnostics > Examine (for example ORDER.CUST_PO_NUMBER). Create rule Seq 10, Description 'Customer PO required', Level Function. Condition tab: Trigger Event WHEN-NEW-FORM-INSTANCE, no condition. Context: Responsibility = your responsibility. Actions: Seq 10, Type Property, Object Type Item, Target Object that item, Property Name REQUIRED, Value TRUE. Save, close and reopen the form. For a rule that depends on data, use WHEN-VALIDATE-RECORD with a condition, an Error message action, then a Builtin action RAISE FORM_TRIGGER_FAILURE. Test in Enter-Query mode too, because REQUIRED can block querying if the Processing Mode is wrong.
Migration and gotchas
Move rules with FNDLOAD and affrmcus.lct, keyed by FUNCTION_NAME for function-level rules or FORM_NAME for form-level rules. An upload replaces the target set for that function or form, so a rule created directly in the target is lost. Rules reference items by name, so a patch that renames an item silently breaks a property action: re-validate personalizations after patching, and keep them disabled rather than deleted when troubleshooting. To rule personalizations out quickly, Help > Diagnostics > Custom Code > Off disables custom code for the session.
Frequently Asked Questions
Which tables store form personalizations in Oracle Apps R12?
FND_FORM_CUSTOM_RULES holds the rule header (form or function, sequence, trigger event, condition), FND_FORM_CUSTOM_SCOPES holds the context levels, FND_FORM_CUSTOM_ACTIONS holds the actions, and FND_FORM_CUSTOM_PARAMS holds parameters for builtins such as Launch a Function. Join actions to rules with ACTION.RULE_ID = RULE.ID.
How do I query all personalizations on a form?
Select from FND_FORM_CUSTOM_RULES filtered by FORM_NAME (for example 'OEXOEORD' or 'POXPOEPO') and outer join FND_FORM_CUSTOM_ACTIONS on RULE_ID = ID, ordered by rule SEQUENCE then action SEQUENCE. Also check FUNCTION_NAME, because function-level rules for that form are stored with the function code.
How do I write a condition that checks a field value?
Use bind syntax with block and item names, for example :LINE.ORDERED_QUANTITY > 1000 or :HEADER.ORG_ID = 204. Find the names with Help > Diagnostics > Examine. The condition is evaluated as SQL, so you can call database functions and use NVL, but form-only builtins are not available.
How do I move form personalizations from test to production?
Download with FNDLOAD using affrmcus.lct and the FND_FORM_CUSTOM_RULES entity, filtered by FUNCTION_NAME or FORM_NAME, then upload the .ldt file in the target. The upload replaces all rules for that function or form, so download the target first as a backup.
If you want support teams to ask which forms carry personalizations, and why, in plain English against your own EBS instance, we can set that up on your servers.
Related Tools
Oracle EBS Forms FRM Error Codes Reference (FRM-92101, FRM-40735)
Searchable list of the FRM errors EBS users actually hit, with the message text, the usual cause in EBS, what to check first and where to find the underlying ORA- error or log.
OracleOracle EBS Lookups, Value Sets and Flexfield Tables Reference
Every FND table and view you need to decode lookup codes, value set values, table-validated value sets, key flexfield segments and DFF ATTRIBUTE columns in EBS 12.1 and 12.2.
OracleOracle EBS Profile Options Reference
A searchable lookup of the profile options EBS administrators change most: sign-on security, concurrent processing, multi-org, logging and session settings.
OracleOracle EBS Custom Code Inventory Worksheet
Catalog reports, interfaces, conversions, extensions and forms with a disposition and effort estimate so you can size an EBS upgrade or retirement.
More Developer Tools tools
See all- Oracle EBS Onhand Quantity SQL Generator
- Oracle EBS BOM Explosion SQL Generator
- Oracle EBS Pending Transactions SQL Generator for Period Close
- Oracle EBS Public PL/SQL API Reference (OM, INV, PO, AP, AR, TCA, FND)
- Oracle EBS XML Publisher RTF Template Syntax Reference
- Oracle EBS OE_ORDER_PUB.PROCESS_ORDER Script Generator
- Oracle EBS FND_REQUEST.SUBMIT_REQUEST Code Generator
- Oracle EBS PL/SQL Concurrent Program Generator (Package plus FND_PROGRAM Registration)
- Oracle EBS Concurrent Program Parameters and Responsibility SQL Generator
Keep exploring
Free tools
- Oracle EBS Cost Management Tables ReferenceA lookup of the Oracle EBS tables behind item cost, WIP jobs, BOM, routing and inventory transactions used in manufacturing costing.
- Oracle EBS Inventory Tables ReferenceSearchable lookup of the core Oracle EBS Inventory and Cost Management tables with purpose and key columns, for report writers and technical consultants.
- Oracle EBS WIP Tables ReferenceLookup of Oracle EBS Work in Process tables with purpose and key columns, covering discrete jobs, operations, requirements, resources and interfaces.
ERP fixes and how-tos
- How to Use Forms Personalization in Oracle EBS (No CUSTOM.pll Needed)How to use Oracle E-Business Suite Forms Personalization to hide fields, set defaults and raise messages without touching CUSTOM.pll or custom forms code.
- How to use FNDLOAD to migrate lookups, profiles and menus between Oracle EBS instancesFNDLOAD syntax and working examples to move lookups, profile options, menus, responsibilities and flexfields between Oracle EBS instances, with LCT files and pitfalls.
- Fix FRM-40735: WHEN-VALIDATE-RECORD Trigger Raised Unhandled Exception ORA-06508FRM-40735 ORA-06508 in EBS Forms means stale PL/SQL state after a recompile, or an unhandled trigger exception. Exit, recompile invalid objects, and fix it.
Runs with your ERP
- Esker Order Management and Oracle E-Business SuiteHow Esker captures customer POs from email, fax and PDF and creates sales orders in Oracle EBS: integration, data flows, setup, pitfalls and a private AI layer.
- Cloud Inventory (DSI) with Oracle E-Business Suite: Mobile Barcode InventoryCloud Inventory, formerly DSI, adds offline mobile barcode inventory to Oracle E-Business Suite and JD Edwards. Data flows, setup steps, pitfalls and AI notes.
- BarTender and Oracle E-Business Suite: Label Printing from OracleHow BarTender prints labels from Oracle EBS using Oracle XML print requests and Integration Builder: methods, data flows, setup steps, pitfalls and AI help.
AI on your ERP
- AI for Oracle E-Business Suite, Without Leaving On-PremHosting Oracle EBS 12.2 on-prem or in a private cloud? Add a private LLM over concurrent programs, interface tables and AP/PO data without moving to Fusion.
- AI for Oracle EBS in Industrial Manufacturing: WIP, MRP, and BOM Questions Answered DirectlyAI for Oracle E-Business Suite in industrial manufacturing: WIP jobs, BOMs, MRP, inventory and purchasing answered in plain English, private and read-only.
Integrations
- How to add WhatsApp to Oracle E-Business SuiteHow to connect WhatsApp Business to Oracle E-Business Suite 12.1 and 12.2: ISG REST, Workflow business events, template messages and two-way replies into EBS.
- How to add Slack alerts and approvals to Oracle E-Business SuiteConnect Slack to Oracle E-Business Suite for alerts, slash commands and interactive approvals using Workflow events, Oracle Alert and ISG, without exposing EBS.