Special and Pair validation types

I am working on an article about flexfields and flexfield validation.

Even though the article is not yet finished, I thought the part about ‘SPECIAL’ and ‘PAIR’ validation types might be interesting enough. Many people seem to think they can only use the seeded validation sets. However, you can also create your own validation sets. And their options are very powerful. So I wanted to publish this part of the article as a prelude to the full story.

 

Special Validation

Special validation is used to provide flexfield functionality for a single value. What that means is that you can have for example a concurrent program parameter that will be filled with a Key flexfield value, or a range of flexfield values.

Let’s go back to the Key Flexfield. We know that they are combinations of different segment values that are stored in a separate combination table.

When you want to submit a key-flexfield combination as a parameter to a concurrent program, you can code your own validation for the separate values. But you’ll be missing the nice functionality that gives you pop-ups, a validation over the resulting combination and if needed the ID-value for the flexfield combination.

That is possible with a ‘Special’ validation type.

The special validation uses a number of user exits to enter, validate and query keyflex segments. With special validation, you will be able to enter one or more segment values for a key flexfield. To enter these segment values, 3 user exits can be used. They are: ‘POPID’, ‘VALID’ and ‘LOADID’.

POPID is used to enable the user to enter the flexfield segment value. It is called when the users cursor enters the segment value field. With this user exit, you decide which segment values should be shown, and how they should be shown.

 VALID is called when the user exits the segment value, or confirms the chosen flexfield combination. It validates the entered value against the values existing in the key flexfield table.

LOADID is optional, and it can be used to choose which information will be returned as flexfield value. This can be the concatenated segments, or the id-value for the flexfield combination or segment values.

These 3 user exits can be assigned to 3 ‘events’. There are more events possible, but they are either not yet in use, or their use is not yet supported. So we will only use ‘Validate’, ‘Edit’ and ‘Load’.

Sounds complicated, so far? Don’t worry; this is not an easy validation. But we’ll build some examples to give you an idea. First we start with building a very easy special validation. This will be built on our Code Combination key flexfield. We’ll be using a concurrent program ‘Test Flex Validation’ program to see our different options.

This program is based on the following procedure:

CREATE OR REPLACE PROCEDURE XXX_TEST_FLEXFIELD_PARAMS

( errbuf   out varchar2

, retcode  out varchar2

, p_flex   in  varchar2

, p_flex2  in  varchar2 := ‘XXX’

, p_flex3  in  varchar2 := ‘XXX’

, p_flex4  in  varchar2 := ‘XXX’

, p_flex5  in  varchar2 := ‘XXX’

) IS

BEGIN

   FND_FILE.PUT_LINE(FND_FILE.OUTPUT,p_flex);

   FND_FILE.PUT_LINE(FND_FILE.OUTPUT,p_flex2);

   FND_FILE.PUT_LINE(FND_FILE.OUTPUT,p_flex3);

   FND_FILE.PUT_LINE(FND_FILE.OUTPUT,p_flex4);

   FND_FILE.PUT_LINE(FND_FILE.OUTPUT,p_flex5);

END;

 

This will only write the parameter value to the output of the request. To use flexfields as parameters for concurrent programs, we need to define a value set based on them.

We will start with the barest setup to enter a key-flexfield combination. For this article, we use the accounting flexfield, with code ‘GL#’  and id-num ‘101’.

In this case, we have the following definition:

 

So what does this mean?

The first box is for the edit event. This will be triggered when the user enters the cursor into the field with this value set.

FND POPID         This is the user exit to pop up a flexfield screen, and let the user enter the flexfield values.

CODE="GL#"     This is the flexfield code for the key flexfield that we will be using.

APPL_SHORT_NAME="SQLGL" The short name for the application the flexfield belongs too. Together with ‘Code’, this will identify the flexfield itself.

NUM="101"       The id-number for the flexfield structure. If you have only a single structure flexfield, it is optional. For flexfields enabled for multiple structures, you need to enter the id-number.

VALIDATE="PARTIAL"   Validate can be ‘None’, ‘Partial’ or ‘Full’. None means the combination is not validated. Partial means that the separate segments are validated, there is no validation if the combination exists. Full means that segments and combination will be checked, and if a new value is entered, this will be inserted into the key flexfield table.

SEG=":!VALUE"                This is the forms field that will be used to store the value of the segments.

The second box is for the ‘Validation’ event. This code will be called when the user navigates out of the field, or submits the entire combination.

Now when we set this value set as a parameter for our concurrent program, we can see how the validation works:

 

Now when we run the program, we get this pop-up:

 

We have all the functionality of the key flexfield. We can use the ‘Combinations’ button to search for existing combinations, and all separate segments will be validated, as will be the final combination.

When we submit a value to our program, it will show the concatenated segments as the value of our parameter:

 

Now let’s see some more features of this validation. For example, we’d like to have the value of the combination id. (CODE_COMBINATION_ID in our case, since we use the Accounting Flexfield).

To get that, we need to add the LOADID user exit:

 

The ‘Load’ event will get the combination-id from the flexfield table. This is only possible for the ‘VALIDATE=”FULL”, since it will validate the whole combination. Also we need to set the ID=”:!ID”. This will populate the :!ID column with the ID value of the combination.

Finally, I added the ‘DINSERT=”NO” ‘, because we don’t want to allow insertion of new code combinations from this value set. (And Validation=”FULL” by default inserts new combinations into the flexfield column).

Now when we run the concurrent request, we see that the parameter value is the code_combination_id instead of the concatenated segments:


With these user exits it is also possible to select just a number of segments, instead of the whole combination. For this we remove the ‘Load’ / ‘LOADID’ part again.

Then we add a ‘DISPLAY=”x” ‘ to the ‘Edit’ and ‘Validate’ user exits. The “display” parameter is defaulting to ‘ALL’. But you can also specify separate segments by their sequence number or names. In our case, we display the first 2 segments:

 

Now when we run the concurrent program, we get a pop-up for only the first 2 values:

 

A very nice feature (at least as far as I’m concerned) is the use of a where clause on the combination values. Consider the following ‘Enter’ code:

FND POPID

CODE="GL#"

NUM="101"

APPL_SHORT_NAME="SQLGL"

VALIDATE="FULL"

TITLE="Special Validation Key"

ID=":!ID"

SEG=":!VALUE"

DESC=":!MEANING"

WHERE="segment2 not like '1%' "

 

The “WHERE” clause prevents us from choosing combinations that have a segment2 starting with ‘1’. When we run our concurrent program with this, and choose the combinations:

 

 

There is no Dpt starting with 1.

 

When we add the “WHERE”-clause to the validation event too, it will prevent us from entering the values manually:

 

 

 

The last feature that we’ll look into is the use of a pl/sql validation through the special validation routines. By using the user-exit PLSQL, we can call an anonymous PL/SQL block in our ‘Validation’ event. I created a value set with the following function for the ‘Validation’ event:

 

FND PLSQL " declare

  v_value varchar2( 10 ) := :!value ;

  v_sum number;

  v_valid boolean;

begin

   v_sum:=0;

   for i in 1..length(v_value) loop

    v_sum :=v_sum+(length(v_value)+1-i)*substr(v_value,i,1);

  end loop;

  if mod(v_sum,11)=0 then

     v_valid := TRUE;

  else

     v_valid:=FALSE;

  end if;

  if not v_valid then

      fnd_message.set_name('FND','FND_GENERIC_MESSAGE' );

      fnd_message.set_token('MESSAGE','This is not a valid bank account');

      fnd_message.raise_error;

  end if;

END; "

 

 

This PL/SQL procedure validates a (Dutch) bank account number. If it does need pass the test, a message will be displayed. This gives you almost unlimited possibilities for validating entered data.

As you can see, it is only a ‘Validate’ event. Because we don’t need any special functionality for entering the data. We can limit the entry to numbers only on the ‘Validation Set’ main page.

 

Now when we use this value set for our concurrent program, we can only enter valid dutch bank accounts:

 

 

And

 


The list of parameters for the user exits is longer than this. So we won’t be going through all the possibilities. You can check the Developers Guide and the Flexfield guide for a complete listing of options. (Did you notice the flexfield title that I sneaked into the pop-up? Try and find the option for that!)

Please try the different options for yourself, and realize the possibilities of the special validation.

 

Pair Validation

Meanwhile, we’ll continue to the ‘Pair’ validation. The pair validation is very much like the ‘special’ validation. It uses the same kind of user exits, but this time, a range of segment values or combinations is selected.

Let’s first create a range of the account segment. Instead of using POPID and VALID, we use POPIDR and VALIDR. The R-version of the user-exits automatically create a range.

Of course we need 2 parameters to set the range. However, we need only one validation set.

I created the validation set ‘XXX_PAIR_VAL’. I entered only the edit and validate events:

 

The next step is to set the parameters for both the low and high value. Both parameters have the validation set ‘XXX_PAIR_VAL’.

 

Now when we run the program, we can enter a range. This includes validation that the high value is indeed higher or equal to the low value.

 

Of course the concurrent program will receive the values for 2 parameters.

 

When we use the full validation we can enter a range of the whole account combination. Note that we cannot use the FULL validation for pair-validation. Because that would mean the use of the combination-id from the flexfield table and based on the combination-id’s you cannot build a range.

 

So we can only use PARTIAL and NONE for the validation. For that same reason, I have not yet had a reason to use a LOAD event for PAIR validation. It is however allowed to use one.

 

I created a PAIR validation for the whole accounting range as follows:

 

 

When used in the concurrent program, it will indeed allow us to enter a range of all segments:

 

 

That completes the chapter on PAIR validation too.

 

18 thoughts on “Special and Pair validation types

  1. Dd

    Thanks Arian,
     
    Your article was very useful to understand the concepts of Special validation set. I have implemented the special validation set  functionality. In the Invoice lines I have included a field in the DFF which calls the accounting flexfields DFF(special validation set). When I save the transaction it stores the code combination id in the lines attribute column which is okay. But somehow it updates/overwrites the distribution line account also. I don't want this to happen.
    Have you come across such a situation or show me some direction towards the solution
    Appreciate your help
     
     

  2. Vinoth

    Your article was very helpful to me in creating the special value set.It will be better if you also include what occurs internally in oracle tables to fetch the KFF jus by giving NUM and Appl Short Name
     

  3. Aiyaz

    Hi,
    First of all thanks for this wounderful post.
    I have a requirement like this….For a concurrent program with 12 parameters ….If user doesn't entered any of the parameter then i need to populate a message " Please enter atleast one value " . Can any one have idea about this . Please share with me
    Thanks
    Aiyaz

  4. Arian Stijf Post author

    Hi Aiyaz,

    unfortunately your post was misplaced by the spamfilter. So the reply is a bit delayed.
    I have to test if it is possible. The best option would be to add a (hidden) 13th parameter. This could use a special validation calling a pl/sql block. Or it could be defaulted with the concatenation of the first 12 parameters.

    I will get back to you shortly.

    Regards,

    Arian

  5. Naeem Khan

     
    Hi, Thanks for the wonderful insight into the special and pair validation.
    I'm trying to use a DFF at the Order Line in which I would need to enter a valid GL account. To allow the user to enter and validate the account I tried using the XLA_SRS_ACCOUNTING_FLEXFIELD which has the below
    FND POPIDR APPL_SHORT_NAME="SQLGL" CODE="GL#"
      NUM=:$FLEX$.XLA_SRS_CHART_OF_ACCOUNTS REQUIRED="Y"
      VALIDATE="NONE" SEG=":!VALUE" DESC=":!MEANING"
      NAVIGATE="!DIR" VDATE=""

    FND VALIDR APPL_SHORT_NAME="SQLGL" CODE="GL#"
      NUM=:$FLEX$.XLA_SRS_CHART_OF_ACCOUNTS VALIDATE="NONE"
      REQUIRED="Y" DESC=":!MEANING" SEG=":!VALUE" VDATE=""

    But when I compile the flexfield I get the following error.
    APP-FND-00798: Invalid reference XLA_SRS_CHART_OF_ACCOUNTS in value set attached to segment DEPARTMENT NUMBER
    Please check the WHERE clauses of your table validated value sets. 
    Can you let me know what is the error due to or where am I going wrong. Any other suggestion to accomplish it.

  6. Suresh

    Hi, Thank you very much for the information. It's really useful.
    I've a requirement below described. Is it possible to use special validation functionality.
    check number2
    schedule number2
    if check number 2 parameter is not null then the schedule number2 parameter must required to enter user.
    Thanks for your help.
    Suresh

  7. khaled

    Hi,
    Iam looking out for a simlar type of validation where From_date paramater should not be greater than to_date paramater , if from_date is greater than to_date then it should give error message, from_date should be less than or equal to to_date
    Appriciate you help in the above validation
    Regards

  8. Arian Stijf Post author

    Hi,

    for that you do not need special or pair validation. You can use the regular Standard Date or Standard Datetime value set. Then on the parameter form, enter the ‘Range’ field. For the from_date choose ‘Low’. For the to_date choose ‘High’. Oracle requires you to have 2 segments with the same value set that make ‘Low’ and ‘High’.

    Regards,

    Arian

  9. khaled

    Hi Arian,
    Yes i agree but the error message displayed is Oracle defined, but i want to use user defind error messaage..if we pass from_date less than to_date..
     
    Regards

  10. DavidF

    I don't really want to write a graphical user-exit on my own, but other than that, do you know how I could use Special value set to allow a Multi-Value chooser capability?  Think about the way Discoverer allows users to use a shuttle control to pick multiple values for a parameter at once, and it builds a string of parameters in quotes, that will be needed in a SQL "…IN ('','','')…" clause.  We have a bunch of discoverer reports but we want to go away from them to BI Publisher reports in EBS.  But our users really like (and use) this multi-choice capability for their reporting.
    Any ideas?

  11. Nagesh Tiwari

    Hi Dear,
    Thanks for the valuable suggestions. Can anybody please provide example of Special value set using Date parameter. suppse I have two parameter. From Date and to_date. Bothe the parameter is having FND_STANDARD_DATE as value set. I want to incorporate one more parameter which will capture the TO_DATE as input and Add +1 to it like :TO_DATE +1, and it will paas to the report as new to_date parameter.
    Thanks in advance.

  12. Gangadhar

    Hi All,

    I am using a PAIR type of value set for my program and it is working. But, I have one more requirement here. Out of the flex fields it displays, I want the first one to be mandatory (required) and the remaining as optional.

    Kindly let me know how can I achieve this.

    Thank you in advance.

    C S Gangadhar.

  13. Gangadhar

    Hi Sir,

    In the last screen shot of the above article, all the 5 segments i.e., Company, Department, Account, Sub-Account and Product as mandatory. But, is there any way that I can make only the ‘Company’ segment (The First segment) as mandatory and remaining 4 as optional. This is the user wanted from us.

    Kindly let us know if there is any way to accomplish this.

    Thank you,
    C S Gangadhar

Leave a Reply

Your email address will not be published. Required fields are marked *