Saturday, December 21, 2013

Workaround for Infamous Bug 13626875

There is such issue logged on Metalink - inputListOfValues Field Not Updated When Selecting A Value Violating A Unique Key. (Doc ID 1402074.1). This is related to LOV functionality and validation. As per Oracle statement - LOV list must include only valid values, list should not return invalid values, this is by LOV design. However, this doesn't sound logical in most of the cases - often LOV may contain complete list of values and for specific attribute we need to enforce validation to accept only a subset of all values available in the list. Despite Oracle answer as such functionality is not possible b design, there is workaround to make it work.

Sample application contains required fix - This sample app is created with JDEV 12c, however same workaround can be applied for earlier JDEV versions. Firstly I'm going to describe, how it works without workaround - by default. Let's assume, we have Departments LOV defined for Department Id attribute:

Department Id is assigned with validation rule - Department Id value must be greater than 100. This is to simulate issue related to LOV behaviour:

On runtime I'm going to pick Employee with currently set Department Id 140 and open LOV dialog. I'm going to select Department Id 30 from LOV dialog and try to set to the field:

What we would get, is not what we would expect. Selected value is not assigned, previous value still is displayed:

On the next click, moving focus or selecting other value - then suddenly change LOV value gets updated and validation error is displayed. This is fine, but this should happen one step earlier:

We need to speed up validation process by one step - immediately after value was selected. Workaround is to set ExceptionMode = Immediate for the Data Control Usage in DataBindings.cpx file:

With ExceptionMode = Immediate, somehow magically LOV value is changed instantly and validation error is displayed when it should. Repeating the same test as before - selecting value below 100 and returning it from LOV:

Value is changed and validation is displayed as expected:

So, if Oracle answer - 'not supported by design', didn't help, try to apply ExceptionMode = Immediate setting for Data Control Usage in DataBindings.cpx


Jang-Vijay Singh said...

One of the strategies I have used in the past is to also filter the LOV using some view criteria. This filters the LIV to show only the values that the base attribute can accept.
So, depending on the base attribute, different ViewCriteria (possibly with row level bind vars) can be used...
Just an alternative that can be used if the functional design accepts it.

Andrej Baranovskij said...

Yes of course - in basic cases, View Criteria works. This workaround is applied, when View Criteria is not an option. In more complex cases, as I have seen - there are simple no View Criteria and users want to see entire list. Value is validated later, when selected.