30 Oracle Forms

This chapter describes issues associated with Oracle Forms. It includes the following topics:

30.1 General Issues and Workarounds

This section describes general issues and workarounds. It includes the following topics:

30.1.1 Backwards Compatibility with Earlier Releases

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.

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.

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.

30.1.2 Linux/UNIX Issues and Workarounds

This section describes issues related to Oracle Forms and Linux/UNIX. It includes the following topics:

30.1.2.1 LD_PRELOAD Setting Required for Signal Chaining Facility

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.

30.1.2.2 Check the Reports Engine Logs for FRM-41214

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.

30.1.2.3 Changing User Permissions

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.

30.2 Configuration Issues and Workarounds

This section describes configuration issues and their workarounds. It includes the following topics:

30.2.1 Non-Internet Explorer Browser Proxy Settings when Using One-Button-Run

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.

30.2.2 WebUtil Client Files Allow Configuration of Destination Directory

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.

30.2.3 webutil.properties Files Renamed for Different Libraries

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.

30.2.4 Forms does not Work with JDK 1.6.0_12 on Client with WinRunner

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.

30.2.5 JavaScript Communication Does not Work in IE for Framed HTML File

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">

30.2.6 JavaScript Events Calling Forms Applications in a Safari 5 Browser Do not Work

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:

  1. Ensure you are using base.htm.

  2. In base.htm, delete the <NOSCRIPT></NOSCRIPT> tags that are wrapping the <APPLET> tag.

30.3 Documentation Errata

This section describes documentation errata. It includes the following topics:

30.3.1 Passing userid in Secure Mode

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:

  1. Set the environment variable FORMS_STDIN_PASSWORD to 1.

  2. Run the compiler without any connect string. Enter the connect string after the compiler has started.

  3. 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.

30.3.2 JDAPI Programming Example

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(""); 
} 
} 

30.3.3 Changes and workarounds affecting the number of characters that can be typed into an item

The following information must be added to Oracle Forms Builder online help.

  1. 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.

  2. 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.]