Oracle® Fusion Middleware Release Notes 11g Release 1 (11.1.1) for IBM AIX on POWER Systems (64-Bit) E14771-44 |
|
![]() Previous |
![]() Next |
This chapter describes issues associated with Oracle Forms. It includes the following topics:
This section describes general issues and workarounds. It includes the following topics:
Included per bug xxxxxxx.
For information about upgrading from Forms 6i, see the "Upgrading to Oracle Forms Services 11g" chapter in Oracle Fusion Middleware Forms Services Deployment Guide. For information about changed or obsolete features, see the Oracle Forms Upgrading Oracle Forms 6i to Oracle Forms 11g Guide.
For upgrading from Oracle Forms 10g and prior releases, you can use the Upgrade Assistant. For more information, see the Oracle Fusion Middleware Upgrade Planning Guide and Oracle Fusion Middleware Upgrade Guide for Oracle Portal, Forms, Reports, and Discoverer.
Additional information about backwards compatibility is included in My Oracle Support Note 113987.1 at: http://myoraclesupport.oracle.com
Regardless from which version of Oracle Forms you are upgrading, you will need to recompile your applications and restart Oracle Forms.
Included as per bug 8205313, relnote bug 8296697
When using Forms Builder with JAWS, the shortcut keys Ctrl+Insert to create items are not working. As a workaround, use the menu-mnemonics. Use Alt+e to open the Edit menu, then r to choose Create to create items.
Included as per bug 8362393
When Forms and Reports are configured in different instances, set the correct ORACLE_HOME
and ORACLE_INSTANCE
values at the shell and invoke the Forms Builder from the shell rather than from the Windows shortcut menu, otherwise invoking the Reports Builder from within the Forms Builder fails.
Included per bug 3219595
Included per bug 8453101
Before restarting the Oracle WebLogic managed server, all the JVM Controller processes (dejvm) started by that server must be stopped. Otherwise, WLS_FORMS will not restart after a shutdown.
Included per bug 8466820
When two Oracle instances with Forms Services are configured, using a single ORACLE_HOME
on a Windows machine, then the FORMS_ORACLE_INSTANCE
registry entry of the second ORACLE_INSTANCE
takes precedence. It is recommended that the Forms Builder component is configured in the second ORACLE_INSTANCE
.
Included as per bug 8978516
Oracle Forms from the first installation does not run by default on a Windows machine with more than one version of Forms. This is because when Fusion Middleware is installed on Windows, the new $ORACLE_HOME/bin
is added to the beginning of the system variable PATH. Subsequent installations result in addition of $ORACLE_HOME/bin
to the beginning of the system variable PATH. To run the prior installed versions, as a workaround, edit the system variable PATH. Move the $ORACLE_HOME/bin
that you want to use to the front of the variable PATH.
This section describes issues related to Oracle Forms and Linux/UNIX. It includes the following topics:
Section 31.1.2.1, "LD_PRELOAD Setting Required for Signal Chaining Facility"
Section 31.1.2.2, "Check the Reports Engine Logs for FRM-41214"
The LD_PRELOAD
setting in default.env
is required for the working of signal chaining facility in JVM version 1.5 and later. If you are creating or using other environment files, the setting in the environment file for LD_LIBRARY_PATH
and LD_PRELOAD
must be the same as in default.env
.
If you encounter the Forms error FRM-41214:Unable to run report when trying to run Reports from a Forms session, check the Reports engine logs for more details on the error.
The 11g installation sets the permissions of the files so that only the user who installed 11g can run the executables. For more information, refer to Installing as a Non-Default User on Unix Operating Systems in Oracle Fusion Middleware Forms and Reports System Requirements and Specifications guide.
This section describes configuration issues and their workarounds. It includes the following topics:
Section 31.2.1, "Non-Internet Explorer Browser Proxy Settings when Using One-Button-Run"
Section 31.2.2, "WebUtil Client Files Allow Configuration of Destination Directory"
Section 31.2.3, "webutil.properties Files Renamed for Different Libraries"
Section 31.2.4, "Forms does not Work with JDK 1.6.0_12 on Client with WinRunner"
Section 31.2.5, "JavaScript Communication Does not Work in IE for Framed HTML File"
Section 31.2.6, "JavaScript Events Calling Forms Applications in a Safari 5 Browser Do not Work"
If you encounter a FORBIDDEN error when using One-Button-Run with any of the supported browsers other than Internet Explorer, verify if 127.0.0.1 (localhost) is in the proxy settings for your browser. If 127.0.0.1 is not in the exceptions list, then add it. This ensures that the browser will bypass the proxy server.
WebUtil downloads install.syslib
libraries into the bin directory of the JRE or JVM on Windows and into the lib directory of JRE on Linux. This location can be specified in the parameter install.syslib.location.client.<OS> = <Path on client machine>
(where <Path on client machine>
represents the path to the location where libraries used on the client by WebUtil are stored and is either absolute or relative to client user home) in webutil.cfg
.
When install.syslib
libraries are downloaded, WebUtil creates the webutil.properties
file which is located in the client user home. Different webutil.properties files are maintained on client side to allow different servers to download and manage their libraries on client. The files are named webutil.<HOST>.<CONFIG>.properties
on the client, where HOST
is the server computer name and CONFIG
is the name of configuration section in formsweb.cfg
.
Forms does not run when using JDK 1.6.0_12 and later versions on a client that also has WinRunner installed.
As a workaround, rename the two environment variables _JAVA_OPTIONS
and JAVA_TOOLS_OPTIONS
. For example, rename them to test_JAVA_OPTIONS
and test_JAVA_TOOLS_OPTIONS
. This will disable WinRunner but allows Forms to run.
JavaScript communication does not work in framed HTML file that is opened in Internet Explorer 7, or in Internet Explorer 8 with file:// protocol.
As a workaround, use the IP address instead of the machine name in the URL for the frame. For example in testform.htm, change:
<frame noresize="noresize" src="http://testform.us.example.com:8888/forms/java/js2frm1.html" name="fr2" frameborder="0"> <frame noresize="noresize" src="http://testform.us.example.com:8888/forms/frmservlet?play=&record=forms& form=js2frm1&userid=scott/tiger@adt10220" name="fr1" frameborder="0">
to
<frame noresize="noresize" src="http://<IP address>:8888/forms/java/js2frm1.html" name="fr2" frameborder="0"> <frame noresize="noresize" src="http://<IP address>:8888/forms/frmservlet?play=&record=forms&form=js2fr m1&userid=scott/tiger@adt10220" name="fr1" frameborder="0">
When using JavaScript integration with a Forms application in a Safari 5 browser on Windows, the communication from Forms to JavaScript running in the browser works; however, the calls to the applet from JavaScript do not work.
As a workaround, perform the following:
Ensure you are using base.htm.
In base.htm, delete the <NOSCRIPT></NOSCRIPT> tags that are wrapping the <APPLET> tag.
This section describes documentation errata. It includes the following topics:
The following information on passing userid in secure mode must be added to Oracle Forms Builder online help.
Passing userid as an argument when using the Forms compiler (frmcmp or frmcmp_batch) may lead to security risks. In addition to the interactive dialog mode already available, the compiler can now accept the connect string via standard input. To pass the userid in a secure mode, perform the following:
Set the environment variable FORMS_STDIN_PASSWORD to 1.
Run the compiler without any connect string. Enter the connect string after the compiler has started.
Run the compiler using redirection to pass the password to the compiler. (This is especially useful in compiling several Forms in a script.) For example:
#!/bin/sh echo "Enter userid" read -s myuserid for i in 'ls *.fmb' do echo Compiling Form $i .... frmcmp_batch.sh batch=yes module=$i module_type=form compile_all=yes <<< "$myuserid" done
Note that this script is a sample that tries to protect the password, but on some platforms and configurations it may still lead to security risks.
The JDAPI Programming Example in the Forms Developer Online Help must be updated to the following code:
import java.io.File; import java.io.PrintWriter; import java.io.FileWriter; import java.text.MessageFormat; import oracle.forms.jdapi.*; /** * Dumps passed forms JdapiObjects to an output stream as text. * * Set command line options for more output, else only the * basic form tree structure will be dumped. * * See printUsage for command line options. */ public class FormDumper { /** * Need this to parse the command line options * * The string represents valid command options as detailed in the * Getopt class */ boolean m_dumpAllProps = false; boolean m_dumpBoolProps = false; boolean m_dumpNumProps = false; boolean m_dumpTextProps = false; boolean m_dumpPropNames = false; String m_dumpPath = null; /** * Output stream, default to STDOUT */ private PrintWriter m_out = new PrintWriter(System.out, true); /** * Use this to indent children */ private String m_indentation = ""; /** * Constructor */ public FormDumper() { } /** * Special constructor that does not take command line arguments. * * @param out The output writer where to send dump information. */ public FormDumper(PrintWriter out) { m_out = out; m_dumpAllProps = true; m_dumpBoolProps = true; m_dumpNumProps = true; m_dumpTextProps = true; m_dumpPropNames = true; } /** * Set the dump path. * * @param path The file where the dumper must send the information */ public void setDumpPath(String path) { m_dumpPath = path; } /** * Indirect output */ public void println(String s) { m_out.println(s); } /** * Dump a form to the output stream */ public void dumpForm(String filename) throws Exception { FormModule fmb = FormModule.open(filename); System.out.println("Dumping module " + fmb.getName()); if (m_dumpPath != null) { // use this form's FILE name to name the dump file String thisFormName = new File(filename).getName(); thisFormName = thisFormName.substring(0, (thisFormName.length()-4)); StringBuffer dmpFilename = new StringBuffer(); dmpFilename.append(m_dumpPath); if (!dmpFilename.toString().endsWith("/")) { dmpFilename.append("/"); } dmpFilename.append(thisFormName); m_out = new PrintWriter(new FileWriter(dmpFilename.toString()), true); } // Call the actual 'dump' method dump(fmb); // Dump the coordinate system used by the module m_indentation = " "; dump(new Coordinate(fmb)); m_indentation = ""; println("Dumped " + fmb.getName()); // Close the module fmb.destroy(); } /** * Recursively dump a forms JdapiObject and its children to the output stream */ protected void dump(JdapiObject jo) { String className = jo.getClassName(); // print out a context line for the JdapiObject // If it is a coordinate system, it does not have a name if(className.equals("Coordinate")) { println(m_indentation + "Coordinate System "); } else { println(m_indentation + className + " " + jo.getName()); } // Property classes need special treatment if(className.equals("PropertyClass")) { dumpPropertyClass((PropertyClass)jo); } else // Generically dump the required property types only { if (m_dumpTextProps) { dumpTextProps(jo); } if (m_dumpBoolProps) { dumpBoolProps(jo); } if (m_dumpNumProps) { dumpNumProps(jo); } // Additionally, dump any Item list elements if(className.equals("Item")) { dumpListElements((Item)jo); } } // use Form's metadata to get a list of all the child JdapiObjects this JdapiObject can have JdapiMetaObject meta = JdapiMetadata.getJdapiMetaObject(jo.getClass()); JdapiIterator props = meta.getChildObjectMetaProperties(); JdapiMetaProperty prop = null; JdapiIterator iter = null; JdapiObject child = null; // loop through every possible kind of child JdapiObject this JdapiObject //can have while(props.hasNext()) { prop = (JdapiMetaProperty)props.next(); // only bother if we can access these JdapiObjects if(!prop.allowGet()) { continue; } // get the actual values for the current child JdapiObject type, // e.g. get the Items on a Block iter = jo.getChildObjectProperty(prop.getPropertyId()); // null is returned if there are no property values if(iter != null) { // loop over every child value while(iter.hasNext()) { child = (JdapiObject)iter.next(); // recursively navigate to it m_indentation += " "; dump(child); if(m_indentation.length()>2) m_indentation = m_indentation.substring(0, m_indentation.length()-2) ; } } } } /** * Dump list elements * * The JdapiObject is an item; if it is a list item, * dump the list elements. * * @param item */ private void dumpListElements(Item item) { if( item.getItemType() == JdapiTypes.ITTY_LS_CTID) { if (m_dumpPropNames) { println(m_indentation + "dumping list elements"); } for(int i = 1; i <= item.getListElementCount(); i++) { String label = item.getElementLabel(i); String value = item.getElementValue(i); println( m_indentation + " " + i + ": '" + label + "' '" + value + "'"); } } } /** * Dump the property class properties */ private void dumpPropertyClass(PropertyClass pc) { String propertyVal = null; // test for every single possible property // this is a bit hacky :) for(int propertyId = 1; propertyId < JdapiTypes.MAXIMUM_PTID; ++propertyId) { if(!pc.hasProperty(propertyId)) { continue; // this property is not in the set } if(pc.hasDefaultedProperty(propertyId) && !m_dumpAllProps) { continue; } Class pt = JdapiMetaProperty.getPropertyType(propertyId); if(pt == Boolean.class) { if(m_dumpBoolProps) { propertyVal = String.valueOf(pc.getBooleanProperty(propertyId)); } } else if(pt == Integer.class) { if(m_dumpNumProps) { propertyVal = String.valueOf(pc.getIntegerProperty(propertyId)); } } else if(pt == String.class) { if(m_dumpTextProps) { propertyVal = pc.getStringProperty(propertyId); } } if(null != propertyVal) { if (m_dumpPropNames) { println(m_indentation + " " + JdapiMetaProperty.getPro pertyName(propertyId) + " " + propertyVal); } else { println(m_indentation + propertyVal); } propertyVal = null; } } // End loop over every property } /** * Dump the source JdapiObject text properties */ private void dumpTextProps(JdapiObject jo) { JdapiMetaObject meta = JdapiMetadata.getJdapiMetaObject(jo.getClass()); JdapiIterator props = meta.getStringMetaProperties(); // for each text property while(props.hasNext()) { JdapiMetaProperty prop = (JdapiMetaProperty) props.next(); int propertyId = prop.getPropertyId(); String propertyVal = null; try { propertyVal = jo.getStringProperty(propertyId); } catch(Exception e) { println(m_indentation + "Could_not_get_property " + JdapiMetaProperty.getPropertyName(propertyId)); continue; } if ( jo.hasProperty(propertyId) && (m_dumpAllProps || !(jo.hasDefaultedProperty(propertyId)) ) ) { if(m_dumpPropNames) { println( m_indentation + " " + JdapiMetaProperty. getPropertyName(propertyId) + " " + propertyVal); } else { println(m_indentation + propertyVal); } } } } /** * Dump the source JdapiObject boolean properties */ private void dumpBoolProps(JdapiObject jo) { JdapiMetaObject meta = JdapiMetadata.getJdapiMetaObject(jo.getClass()); JdapiIterator props = meta.getBooleanMetaProperties(); // for each boolean property while(props.hasNext()) { JdapiMetaProperty prop = (JdapiMetaProperty) props.next(); int propertyId = prop.getPropertyId(); boolean propertyVal = false; try { propertyVal = jo.getBooleanProperty(propertyId); } catch(Exception e) { println(m_indentation + "Could_not_get_property " + JdapiMetaProperty.getPropertyName(propertyId)); continue; } if ( jo.hasProperty(propertyId) && (m_dumpAllProps ) ) { if(m_dumpPropNames) { println(m_indentation + " " + JdapiMetaProperty. getPropertyName(propertyId) + " " + propertyVal); } else { println(m_indentation + propertyVal); } } } } /** * Dump the source JdapiObject numeric properties */ private void dumpNumProps(JdapiObject jo) { JdapiMetaObject meta = JdapiMetadata.getJdapiMetaObject(jo.getClass()); JdapiIterator props = meta.getIntegerMetaProperties(); // for each numeric property while(props.hasNext()) { JdapiMetaProperty prop = (JdapiMetaProperty) props.next(); int propertyId = prop.getPropertyId(); int propertyVal = 0; try { propertyVal = jo.getIntegerProperty(propertyId); } catch(Exception e) { println(m_indentation + "Could_not_get_property " + JdapiMetaProperty.getPropertyName(propertyId)); continue; } if ( jo.hasProperty(propertyId) && (m_dumpAllProps || !(jo.hasDefaultedProperty(propertyId)) ) ) { if (m_dumpPropNames) { println(m_indentation + " " + JdapiMetaProperty.getPropertyName(pr opertyId) + " " + propertyVal); } else { println(m_indentation + propertyVal); } } } } /** * Output usage info to STDOUT */ public void printUsage() { System.out.println(""); System.out.println("Jdapi Form Dumper Utility"); System.out.println("Valid arguments:"); System.out.println("-a : dump all properties, not just overridden ones"); System.out.println("-b : dump boolean properties"); System.out.println("-n : dump numeric properties"); System.out.println("-t : dump text properties"); System.out.println("-p : dump property names, not just values"); System.out.println("-o : file path to output to"); } /** * Main method */ public static void main(String[] args) throws Exception { FormDumper dmp = new FormDumper(); for (int i = 0; i < args.length; i++) { dmp.dumpForm(args[i]); } System.out.println(""); System.out.println("Dumps complete"); System.out.println(""); } }
The following information must be added to Oracle Forms Builder online help.
When a form is created using the Form builder (frmbld), the item property Query Length defaults to zero. When the form was compiled in releases prior to 11g, this value (zero) caused the Query Length to default to the value of the Maximum Length property. In Oracle Forms 11g, the Query Length defaults to two plus the value of the Maximum Length property. If the behavior of prior releases is desired, then you must set the environment variable FORMS_QUERY_LENGTH_DELTA
to '0' when the form is compiled.
The DATE format masks determine the number of characters that can be typed into a text item or combo box. In general, this number is the maximum of the number of characters required for the "output" format mask and for any allowable "input" format mask. Refer to "About Format Elements for Dates" for information about how "input" and "output" format masks are selected for a combo box, or for a text item whose format mask is not set. Note that the FORMS_USER_DATE_FORMAT
or FORMS_USER_DATETIME_FORMAT
environment variable may specify multiple input format masks. Also note that for any input format mask that does not contain FX
, alternate format masks are also allowable, as documented in "String-to-Date Conversion Rules" in section "Format Models" in the SQL Reference in the Oracle Forms Builder Online Help.
Note one exception to the rules spelled out above. The behavior described in "String-to-Date Conversion Rules" allow a fully spelled-out month to be entered in place of a numeric month (MM form mask element) or abbreviated month (MON form mask element). However, in this case, the number of characters that can be typed into a text item or combo box allows only enough room for an abbreviated month.
Prior to 11gR1, input DATE format masks were not taken into account. In 10gR2 (10.1.2), the number of characters the end user was allowed to type into a DATE item was determined solely from the output format mask. In Forms 6i (6.0.8), the Maximum Length property of the DATE item was also taken into account.
Workarounds
The changes in behavior documented above may affect users who have set the Auto-Skip property for a DATE item. The end user may now be allowed to type more characters into a specific DATE item, in which case auto-skip will not occur in cases where it did occur prior to 11gR1. To ensure that auto-skip occurs, add the FX
modifier to the format mask that will be used for the item, for example, FXYYYY/MM/DD. If there is no item-specific format mask (that is, no format mask is set either in the item's property palette or programmatically), then the item's format mask will be derived from environment variables. The FORMS_USER_DATE_FORMAT
and FORMS_USER_DATETIME_FORMAT
environment variables are recommended as they take precedence over any NLS environment variables that might affect DATE format masks.
Note that specifying the FX
modifier will disallow the alternate format masks that are documented in "String-to-Date Conversion Rules" in section "Format Models" of the SQL Reference. Also note that the FORMS_USER_DATE_FORMAT
and FORMS_USER_DATETIME_FORMAT
environment variables can explicitly specify alternate format masks, separated by vertical bars, for example, FXDD-MON-YYYY|FXMON-DD-YYYY. [If the FORMS_OUTPUT_DATE_FORMAT
and FORMS_OUTPUT_DATETIME_FORMAT
environment variables are not set, the output format masks are derived from the first format mask specified in each of the FORMS_USER_DATE_FORMAT
and FORMS_USER_DATETIME_FORMAT
environment variables.]