Monday, August 18, 2014

Compile Oracle EBS forms and/or libraries

1. Use below steps as Applmgr to compile one R12 form in $CUSTOM_TOP/forms/US directory. Note frmcmp_batch.sh shall exist in $ORACLE_HOME/bin.

$ export FORMS_PATH=$FORMS_PATH:$AU_TOP/forms/US:$AU_TOP/resource:$CUSTOM_TOP/forms/US
$ cd $CUSTOM_TOP/forms/US
$ mv FORM_NAME.fmx FORM_NAME.fmx_BK (or delete it)
$ chmod 664 FORM_NAME.fmb (to make it -rw-rw-r--. This step seems optional).

$ frmcmp_batch.sh module=FORM_NAME.fmb userid=apps/XXXpwd output_file=FORM_NAME.fmx module_type=form compile_all=yes

If it works, it shall say "Created form file FORM_NAME.fmx". And new time stamp for two files FORM_NAME.fmb and FORM_NAME.fmx.

2. To compile only library (.pll) files, env variable $FORMS_PATH is not needed. Go to $AU_TOP/resources and run the command:

$ cd $AU_TOP/resource
$ frmcmp_batch.sh module=FORM_NAME.pll userid=apps/XXXpwd module_type=library compile_all=special batch=yes

After it completes, new timestamp will be on FORM_NAME.pll and FORM_NAME.plx without doing anything on .fmb and .fmx files (in $CUSTOM_TOP/forms/US if it is a custom form). The file size on FORM_NAME.pll may become bigger. Use command to check and compare contents:

$ adident Header $AU_TOP/resource/FORM_NAME.pll 

Notes:
(1). If option "batch=yes" is used, progress and error messages will not echo out on the screen when the commend runs. But they will be written to .err file in current directory.
(2). If it gets ORA-12154 error in R12, the workaround is to modify $TNS_ADMIN variable in frmcmp_batch.sh (Doc ID 431324.1).
export TNS_ADMIN=${TNS_ADMIN:-$ORACLE_HOME/network/admin}
(3). For a non-Applmgr user to compile a R12 form, it is necessary to change permission on a set of files (Doc ID 561334.1). Make sure ORACLE_HOME points to 10.1.2 location.
chmod +rx $ORACLE_HOME
chmod +rx $ORACLE_HOME/bin
chmod +rx $ORACLE_HOME/bin/frm*
chmod -R +rx $ORACLE_HOME/lib
chmod +rx $ORACLE_HOME/forms
chmod -R +rx $ORACLE_HOME/forms/mesg
chmod -R +rx $ORACLE_HOME/forms/admin
chmod -R +rx $ORACLE_HOME/oracore
chmod +rx $ORACLE_HOME/nls
chmod -R +rx $ORACLE_HOME/nls/data
chmod +rx $ORACLE_HOME/rdbms
chmod -R +rx $ORACLE_HOME/rdbms/mesg
chmod +rx $ORACLE_HOME/ldap
chmod -R +rx $ORACLE_HOME/ldap/mesg
chmod -R +rx $ORACLE_HOME/ldap/admin
chmod +rx $ORACLE_HOME/network
chmod -R +rx $ORACLE_HOME/network/admin
chmod -R +rx $ORACLE_HOME/jre
chmod -R +rx $ORACLE_HOME/procbuilder

(also go to $CUSTOM_TOP/forms/US, and give 666 to .fmx and .fmb files so that user can re-create the form files.) 
Note: after above grants, sqlplus is still not available to other users but form compile shall work.

3. Use ADADMIN to compile (or re-generate) multiple forms. The steps are documented in very good document: How To Regenerate Forms Library Files Using "adadmin" (11i & R12) (Doc ID 141118.1)
A) Select the "1. Generate Applications Files menu" option.
B) Then select the "2. Generate forms files" option.
C) Choose the number of workers (default is the # of CPUs in the server).
D) Enter "yes" to regenerate PL/SQL library files (.pll extension)
E) Enter "yes" to regenerate Forms Menu files (.mmb -> .mmx extension)
F) Enter "yes" to regenerate Forms Executable files (.fmb->.fmx extension)
G) Enter the list of products, by short name as they are listed in "$APPL_TOP/" (all OR ont, po, fnd, ar, gl)
H) Enter "No" to generate specific files for each product. If you like to generate specific files for each product, you may answer "Yes" here and a list of files will be displayed
I) Enter "all" to generate all the previously selected items for all languages, or only some of the installed languages.
J) Shows your default and/or selected languages
K) Enter "yes" if the languages selected are the desired languages

yes on F) will give new timestamp on .fmx files. After answered yes on D), some .plx files get new timestamp, but no .pll files get new timestamp.  I used adadmin to compile all forms in an instance and got one error:

The following Oracle Forms objects did not generate successfully:
ap      forms/US        APXWCARD.fmx

An error occurred while generating Oracle Forms objects.
Continue as if it were successful [No] :


adadmin log does not give much details on the error. So, I ran the command to compile this form individually:

$ cd $AP_TOP/forms/US
$ mv APXWCARD.fmx APXWCARD.fmx_BK_04292015
$ export FORMS_PATH=$FORMS_PATH:$AU_TOP/forms/US:$AU_TOP/resource:$AP_TOP/forms/US

$ frmcmp_batch.sh module=$AU_TOP/forms/US/APXWCARD.fmb userid=apps/APPS_PWD output_file=APXWCARD.fmx module_type=form compile_all=yes

FRM-30064: Unable to parse statement select distinct full_name, employee_number, date_of_birth, pa.person_id
from per_all_people_f pap,
financials_system_parameters fsp,
per_assignments_f pa
where (trunc(sysdate) between pap.effective_start_date and pap.effective_end_date)
and (trunc(sysdate) between pa.effective_start_date and pa.effective_end_date)
and pap.business_group_id = fsp.business_group_id
and pa.business_group_id = fsp.business_group_id
and pap.person_id = pa.person_id
and pa.assignment_type = 'E'
order by upper(full_name).
ORA-01791: not a SELECTed expression
Record Group FULL_NAME
Form: APXWCARD

FRM-30085: Unable to adjust form for output.
Form not created

To fix the problem, check the file version:
$ strings $AU_TOP/forms/US/APXWCARD.fmb | grep '$Header'
FDRCSID('$Header: APPSTAND.fmb 120.6.12010000.6 2010/03/10 12:58  dbowles ship     $');
FDRCSID('$Header: APXWCARD.fmb 120.16.12010000.14 2010/02/22 22:27  meesubra ship   $');

Doc ID 1314734.1 says it hits a database bug. So, there is always a risk of failures from compiling all forms.

4. Write a script to compile forms file

~~~~~~~~~~~~~~ Script to compile one custom form ~~~~~~~~~~~~~~
# Call:  $ ./script_name.sh forms_name
#
export CUSTOM_TOP=$APPL_TOP/custom     # where the custom form .fmb file is saved under
export FORMS_PATH=$FORMS_PATH:$AU_TOP/forms/US:$AU_TOP/resource:$CUSTOM_TOP/forms/US

Passwd='appsPWD'
custom_top=$CUSTOM_TOP/forms/US

cd $custom_top
custom_form=$1

frmcmp_batch module=$custom_form.fmb userid=apps/${Passwd} output_file=$custom_form.fmx module_type=form compile_all=yes batch=yes

exit 0

~~~~~~~~~~~~~~~~ Compile multiple forms ~~~~~~~~~~~~~~~~~
/path/to/script_name.sh forms_name1
/path/to/script_name.sh forms_name2
/path/to/script_name.sh forms_name3


UPDATES: If frmcmp_batch.sh in R12.1.3 gets ORA-12154 error (or error relates to listener), modify it with workaround described in Dec ID 431324.1 on $TNS_ADMIN:

TNS_ADMIN=${TNS_ADMIN:-$ORACLE_HOME/network/admin}
export TNS_ADMIN

No comments: