How to Create a Custom Form
A) Open up TEMPLATE.fmb, and save this as XXHELLOAPPS.fmb
B) Create a new window, by right clicking on Window/new Name this window as XXHELLOAPPS,and assign it SubClass Type “WINDOW” from picklist. C) Create a new canvas and name it XXHELLOAPPS , ensuring its Sublcass Type is “Content” D) Make the windows property reference canvas XXHELLOAPPS and vice versa make the canvas reference windows XXHELLOAPPS. E) Now create a block named XXHELLOAPPS . Lets keep this a control block for simplicity. F) go to form level property, and set first navigation block to XXHELLOAPPS. G) Add a label and a field named “Hello_World” to this block. H) Generate the form on PC using Control-T keystrokes. This will ensure that nothing critical has been missed out. I) FTP the form file to $XXPO_TOP/forms/US Surely, this XX will be replaced by the naming convention at your client/company. J) cd to $XXPO_TOP/forms/US And f60gen on XXHELLOAPPS.fmb This will create a file executable as XXHELLOAPPS.fmx K) Go to Application Developer responsibility Menu /applicaton/form Register the form L) Register the Forms Function Have you read he article form functions[http://getappstraining.blogspot.com/2006/10/oracle-formsfunctions-menus-and-their.html] yet? This forms function must be registered against application "XX Purchasing". M) Now add a menu item so that this forms function becomes available to specific responsibility. Thats it, you will be able to open up this form from the responsibility. Now some important notes:1. If you have a table based block, and if that block has some description type fields, then try not to fetch them from post query trigger. Instead, develop a view in apps schema and assign that view as base tale to this block. This has a benefit that users will be able to query on the description field if need be. Indeed you will need to do dml on the actual table yourself by overriding on-insert, on-update, on-delete and on-lock triggers. 2. For each block in the screen, create a form level package spec and package body. Your triggers in the block/block fields will make calls to that package. 3. Try not to do to much pl/sql within the form. Always do such database intensive operations in a database level package. 4. Try not using global variables, unless really needed. Give preference to the creation of form package variables. 5. In a multi record block, always add a field for Current Record Indicator.
Setting Error Message FND_MESSAGE.SET_NAME( P_APP_NAME, P_MSG_NAME); FND_MESSAGE.SET_TOKEN(TOKEN => p_token1, VALUE => p_token1_value); FND_MSG_PUB.add;
Getting Error Message from Stack PROCEDURE get_error_message (p_msg_count OUT NOCOPY NUMBER, p_msg_text OUT NOCOPY VARCHAR2) IS l_msg_text VARCHAR2(1000); BEGIN p_msg_count := fnd_msg_pub.count_msg; FOR i IN 1..p_msg_count LOOP fnd_msg_pub.get (p_data => l_msg_text, p_msg_index_out => p_msg_count, p_encoded => fnd_api.g_false, p_msg_index => fnd_msg_pub.g_next ); IF i = 1 THEN p_msg_text := l_msg_text; ELSE p_msg_text := p_msg_text || '--' || l_msg_text; END IF; END LOOP; END;