利用fnd_flex_keyval包轻松获取关键性弹性域组合描述字段

在Oracle Forms客户化开发中,如果遇到有在Form上提供关键性弹性域(以下简称“键弹性域”)功能支持的时候,我们可以利用FND_KEY_FLEX.DEFINE函数来轻松完成所有的初始化工作。其中也包括键弹性域的组合描述字段的显示的初始化:只要在FND_KEY_FLEX.DEFINE调用时指定了DESCRIPTION参数即可。然而有时我们仅是想要显示这个描述组合字段,仅此而已。并不需要提供完整的键弹性域功能。那么我们有什么快速而有效的方法来得到这个描述组合字段呢?试试下面的fnd_flex_keyval包里的方法吧~

 

实例:获取库存物料的物料类别集中的类别组合“描述”字段

 

需要用到的方法:

  • fnd_flex_keyval.validate_segs()

  • fnd_flex_keyval.concatenated_descriptions()

fnd_flex_keyval.validate_segs 的参数很多,对于获取物料类别组合字段我们仅需要其中的五个参数,如下:

[html] view plain copy print ?

  1. fnd_flex_keyval.validate_segs(  

  2.            operation         = >   < OPERATIONS >   

  3.         ,  appl_short_name   = >   < Application  Short Name >   

  4.         ,  key_flex_code     = >   < Key  Flex Code >   

  5.         ,  structure_number  = >   < ID_FLEX_NUM >   

  6.         ,  concat_segments   = >   < CONCATENATED_SEGMENTS >   

  7. );  

fnd_flex_keyval.validate_segs(
          operation        => 
        , appl_short_name  => 
        , key_flex_code    => 
        , structure_number => 
        , concat_segments  => );


参数说明:

- operation 可选值有:

  • FIND_COMBINATION - 所给定的组合字段必须在系统中已经被定义

  • CREATE_COMBINATION - 如果组合字段不存在,则在系统中创建该组合

  • CREATE_COMB_NO_AT - 功能和CREATE_COMBINATION相同,只是不像前者要使用相对独立的子事务autonomous transaction

  • CHECK_COMBINATION - 只是检查一下给定的组合字段是否合法,不管检查结果如何,都不创建新的组合

  • DEFAULT_COMBINATION - 返回默认的最小组合(这个参数值我也没太搞懂,呵呵)

  • CHECK_SEGMENTS - 分别验证字段(这个也很糊涂~)

- appl_short_name 应用程序简称,例如库存模块对应的应用简称为INV

- key_flex_code 键弹性域代码,可以在键弹性域定义界面找到,例如MCAT, GL#等等

- structure_number  指定键弹性域下的某个结构NUM,可以在键弹性域定义界面找到,对应字段为ID_FLEX_NUM

- concat_segments  要获取组合描述字段的对应的“值“组合字段,例如: A.000.MISC

一旦初始化验证字段成功,那么描述组合字段便可以通过调用fnd_flex_keyval.concatenated_descriptions()来得到了。

完整代码如下:

 

 

[html] view plain copy print ?

  1. < PRE > FUNCTION get_concat_descriptions(p_concat_segs IN VARCHAR2) RETURN VARCHAR2  

  2.     IS  

  3.     BEGIN  

  4.       IF fnd_flex_keyval.validate_segs(  

  5.            operation         = >  'FIND_COMBINATION' -- 请根据情况自行修改  

  6.         ,  appl_short_name   = >  'INV' -- 请根据情况自行修改  

  7.         ,  key_flex_code     = >  'MCAT' -- 请根据情况自行修改  

  8.         ,  structure_number  = >  101 -- 请根据情况自行修改  

  9.         ,  concat_segments   = >  p_concat_segs) THEN  

  10.           

  11.         RETURN (fnd_flex_keyval.concatenated_descriptions());  

  12.       ELSE  

  13.         RETURN '';  

  14.       END IF;  

  15.     END;  

  16. PRE >   

  17. < PRE > PRE >   

  18. < PRE > PRE >   


FUNCTION get_concat_descriptions(p_concat_segs IN VARCHAR2) RETURN VARCHAR2
    IS
    BEGIN
      IF fnd_flex_keyval.validate_segs(
          operation        => 'FIND_COMBINATION' -- 请根据情况自行修改
        , appl_short_name  => 'INV' -- 请根据情况自行修改
        , key_flex_code    => 'MCAT' -- 请根据情况自行修改
        , structure_number => 101 -- 请根据情况自行修改
        , concat_segments  => p_concat_segs) THEN
        
        RETURN (fnd_flex_keyval.concatenated_descriptions());
      ELSE
        RETURN '';
      END IF;
    END;



获取货位的描述:

[html] view plain copy print ?

  1. --Get Stock Locators(MTLL) 库存货位的组合与描述  

  2.  --SELECT cux_flex_pkg.get_mtll_flexfields( p_locator_id  = >  3950,  p_organization_id  = >  7890,  p_return  = >  'S') locator_name FROM dual;  

  3.  FUNCTION get_mtll_flexfields(p_locator_id      NUMBER,  

  4.                               p_organization_id NUMBER,  

  5.                               p_return          VARCHAR2 DEFAULT 'S') RETURN VARCHAR2 IS  

  6.    l_concatenated_descriptions VARCHAR2(2000);  

  7.    l_success                   BOOLEAN;  

  8.    l_concatenated_segments     VARCHAR2(2000);  

  9.    c_structure_number          NUMBER;  

  10.    c_key_flex_code             VARCHAR2(20);  

  11.    c_appl_short_name           VARCHAR2(20);  

  12.    l_application_id            NUMBER;  

  13.    -- Keeps track of the current delimiter  

  14.    l_delim         VARCHAR2(1)  : '' ;  

  15.    l_error_message VARCHAR2(1000);  

  16.  BEGIN  

  17.    --  

  18.    --Bug: Value &VALUE for the flexfield segment Subinventory does not exist in the value set @VALUE_SET.  

  19.    --如果在健弹性域定义的值集中使用了PROFILE,需要初始化赋值之后才行,否则会出现以上错误  

  20.    --SELECT FND_PROFILE.VALUE_WNPS('MFG_ORGANIZATION_ID') FROM DUAL;  

  21.    --fnd_global.apps_initialize( resp_appl_id  = >  401,  resp_id  = >  65780,  user_id  = >  1013436);  

  22.    IF FND_PROFILE.VALUE_WNPS('MFG_ORGANIZATION_ID') IS NULL THEN  

  23.      fnd_profile.put('MFG_ORGANIZATION_ID', p_organization_id);  

  24.    END IF;  

  25.    c_key_flex_code     : 'MTLL' ;  

  26.    c_appl_short_name   : 'INV' ;  

  27.    c_structure_number  : 101 ;  

  28.    

  29.    SELECT application_id  

  30.      INTO l_application_id  

  31.      FROM fnd_application_vl a  

  32.     WHERE  a.application_short_name  =  c_appl_short_name ;  

  33.    

  34.    -- Get the delimiter  

  35.    l_delim  : fnd_flex_apis .get_segment_delimiter( x_application_id  = >  l_application_id,  x_id_flex_code  = >  c_key_flex_code,  x_id_flex_num  = >  c_structure_number);  

  36.    --参数DATA_SET一定要设置,和物料的键弹性域定义的原理一样:因为INVENTORY_LOCATION_ID在数据库的基表中不是唯一的值  

  37.    --SELECT set_defining_column_name,unique_id_column_name,application_table_name FROM fnd_id_flexs WHERE id_flex_code IN ('MTLL', 'MSTK');  

  38.    l_success  : fnd_flex_keyval .validate_ccid( appl_short_name   = >  c_appl_short_name,  

  39.                                                key_flex_code     = >  c_key_flex_code,  

  40.                                                structure_number  = >  c_structure_number,  

  41.                                                data_set          = >  to_char(p_organization_id), -- Requied  

  42.                                                combination_id    = >  p_locator_id);  

  43.    dbms_output.put_line(' l_success  = ' || to_char(sys.diutil.bool_to_int(l_success)));  

  44.    l_error_message  : fnd_flex_keyval .error_message;  

  45.    IF l_success THEN  

  46.      l_concatenated_descriptions  : fnd_flex_keyval .concatenated_descriptions;  

  47.      --dbms_output.put_line('Concatenated Descriptions : ' || l_concatenated_descriptions);  

  48.      

  49.      l_concatenated_segments  : fnd_flex_keyval .concatenated_values;  

  50.      --dbms_output.put_line('Concatenated Segments : ' || l_concatenated_segments);  

  51.    ELSE  

  52.      l_concatenated_segments      : NULL ;  

  53.      l_concatenated_descriptions  : NULL ;  

  54.      fnd_message.set_name('FND', 'FLEX-SSV EXCEPTION');  

  55.      fnd_message.set_token('MSG', l_error_message);  

  56.      dbms_output.put_line(fnd_message.get);  

  57.      RAISE app_exceptions.application_exception;  

  58.    END IF;  

  59.    IF  p_return  =  'S'  THEN  

  60.      RETURN(l_concatenated_segments);  

  61.    ELSIF  p_return  =  'D'  THEN  

  62.      RETURN(l_concatenated_descriptions);  

  63.    ELSE  

  64.      RETURN(l_concatenated_segments);  

  65.    END IF;  

  66.    

  67.  EXCEPTION  

  68.    WHEN OTHERS THEN  

  69.      RETURN NULL;  

  70.      app_exception.raise_exception;  

  71.  END get_mtll_flexfields;  

 --Get Stock Locators(MTLL) 库存货位的组合与描述
  --SELECT cux_flex_pkg.get_mtll_flexfields(p_locator_id => 3950, p_organization_id => 7890, p_return => 'S') locator_name FROM dual;
  FUNCTION get_mtll_flexfields(p_locator_id      NUMBER,
                               p_organization_id NUMBER,
                               p_return          VARCHAR2 DEFAULT 'S') RETURN VARCHAR2 IS
    l_concatenated_descriptions VARCHAR2(2000);
    l_success                   BOOLEAN;
    l_concatenated_segments     VARCHAR2(2000);
    c_structure_number          NUMBER;
    c_key_flex_code             VARCHAR2(20);
    c_appl_short_name           VARCHAR2(20);
    l_application_id            NUMBER;
    -- Keeps track of the current delimiter
    l_delim         VARCHAR2(1) := '';
    l_error_message VARCHAR2(1000);
  BEGIN
    --
    --Bug: Value &VALUE for the flexfield segment Subinventory does not exist in the value set @VALUE_SET.
    --如果在健弹性域定义的值集中使用了PROFILE,需要初始化赋值之后才行,否则会出现以上错误
    --SELECT FND_PROFILE.VALUE_WNPS('MFG_ORGANIZATION_ID') FROM DUAL;
    --fnd_global.apps_initialize(resp_appl_id => 401, resp_id => 65780, user_id => 1013436);
    IF FND_PROFILE.VALUE_WNPS('MFG_ORGANIZATION_ID') IS NULL THEN
      fnd_profile.put('MFG_ORGANIZATION_ID', p_organization_id);
    END IF;
    c_key_flex_code    := 'MTLL';
    c_appl_short_name  := 'INV';
    c_structure_number := 101;
  
    SELECT application_id
      INTO l_application_id
      FROM fnd_application_vl a
     WHERE a.application_short_name = c_appl_short_name;
  
    -- Get the delimiter
    l_delim := fnd_flex_apis.get_segment_delimiter(x_application_id => l_application_id, x_id_flex_code => c_key_flex_code, x_id_flex_num => c_structure_number);
    --参数DATA_SET一定要设置,和物料的键弹性域定义的原理一样:因为INVENTORY_LOCATION_ID在数据库的基表中不是唯一的值
    --SELECT set_defining_column_name,unique_id_column_name,application_table_name FROM fnd_id_flexs WHERE id_flex_code IN ('MTLL', 'MSTK');
    l_success := fnd_flex_keyval.validate_ccid(appl_short_name  => c_appl_short_name,
                                               key_flex_code    => c_key_flex_code,
                                               structure_number => c_structure_number,
                                               data_set         => to_char(p_organization_id), -- Requied
                                               combination_id   => p_locator_id);
    dbms_output.put_line('l_success = ' || to_char(sys.diutil.bool_to_int(l_success)));
    l_error_message := fnd_flex_keyval.error_message;
    IF l_success THEN
      l_concatenated_descriptions := fnd_flex_keyval.concatenated_descriptions;
      --dbms_output.put_line('Concatenated Descriptions : ' || l_concatenated_descriptions);
    
      l_concatenated_segments := fnd_flex_keyval.concatenated_values;
      --dbms_output.put_line('Concatenated Segments : ' || l_concatenated_segments);
    ELSE
      l_concatenated_segments     := NULL;
      l_concatenated_descriptions := NULL;
      fnd_message.set_name('FND', 'FLEX-SSV EXCEPTION');
      fnd_message.set_token('MSG', l_error_message);
      dbms_output.put_line(fnd_message.get);
      RAISE app_exceptions.application_exception;
    END IF;
    IF p_return = 'S' THEN
      RETURN(l_concatenated_segments);
    ELSIF p_return = 'D' THEN
      RETURN(l_concatenated_descriptions);
    ELSE
      RETURN(l_concatenated_segments);
    END IF;
  
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
      app_exception.raise_exception;
  END get_mtll_flexfields;


库存物料的组合与描述库存物料的组合与描述:

[html] view plain copy print ?

  1. FUNCTION get_mstk_flexfields(p_item_id      NUMBER,  

  2.                              p_organization_id NUMBER,  

  3.                              p_return          VARCHAR2 DEFAULT 'S') RETURN VARCHAR2 IS  

  4.   l_concatenated_descriptions VARCHAR2(2000);  

  5.   l_success                   BOOLEAN;  

  6.   l_concatenated_segments     VARCHAR2(2000);  

  7.   c_structure_number          NUMBER;  

  8.   c_key_flex_code             VARCHAR2(20);  

  9.   c_appl_short_name           VARCHAR2(20);  

  10.   l_application_id            NUMBER;  

  11.   -- Keeps track of the current delimiter  

  12.   l_delim         VARCHAR2(1)  : '' ;  

  13.   l_error_message VARCHAR2(1000);  

  14. BEGIN  

  15.   --  

  16.   --如果在健弹性域定义的值集中使用了PROFILE,需要初始化赋值之后才行,否则会出现以上错误  

  17.   --SELECT FND_PROFILE.VALUE_WNPS('MFG_ORGANIZATION_ID') FROM DUAL;  

  18.   --fnd_global.apps_initialize( resp_appl_id  = >  401,  resp_id  = >  65780,  user_id  = >  1013436);  

  19.   IF FND_PROFILE.VALUE_WNPS('MFG_ORGANIZATION_ID') IS NULL THEN  

  20.     fnd_profile.put('MFG_ORGANIZATION_ID', p_organization_id);  

  21.   END IF;  

  22.   c_key_flex_code     : 'MSTK' ;  

  23.   c_appl_short_name   : 'INV' ;  

  24.   c_structure_number  : 101 ;  

  25.   

  26.   SELECT application_id  

  27.     INTO l_application_id  

  28.     FROM fnd_application_vl a  

  29.    WHERE  a.application_short_name  =  c_appl_short_name ;  

  30.   

  31.   -- Get the delimiter  

  32.   l_delim  : fnd_flex_apis .get_segment_delimiter( x_application_id  = >  l_application_id,  x_id_flex_code  = >  c_key_flex_code,  x_id_flex_num  = >  c_structure_number);  

  33.   --参数DATA_SET一定要设置,和物料的键弹性域定义的原理一样:因为INVENTORY_LOCATION_ID在数据库的基表中不是唯一的值  

  34.   --SELECT set_defining_column_name,unique_id_column_name,application_table_name FROM fnd_id_flexs WHERE id_flex_code IN ('MTLL', 'MSTK');  

  35.   l_success  : fnd_flex_keyval .validate_ccid( appl_short_name   = >  c_appl_short_name,  

  36.                                               key_flex_code     = >  c_key_flex_code,  

  37.                                               structure_number  = >  c_structure_number,  

  38.                                               data_set          = >  to_char(p_organization_id), -- Requied  

  39.                                               combination_id    = >  p_item_id);  

  40.   dbms_output.put_line(' l_success  = ' || to_char(sys.diutil.bool_to_int(l_success)));  

  41.   l_error_message  : fnd_flex_keyval .error_message;  

  42.   IF l_success THEN  

  43.     l_concatenated_descriptions  : fnd_flex_keyval .concatenated_descriptions;  

  44.     --dbms_output.put_line('Concatenated Descriptions : ' || l_concatenated_descriptions);  

  45.     

  46.     l_concatenated_segments  : fnd_flex_keyval .concatenated_values;  

  47.     --dbms_output.put_line('Concatenated Segments : ' || l_concatenated_segments);  

  48.   ELSE  

  49.     l_concatenated_segments      : NULL ;  

  50.     l_concatenated_descriptions  : NULL ;  

  51.     fnd_message.set_name('FND', 'FLEX-SSV EXCEPTION');  

  52.     fnd_message.set_token('MSG', l_error_message);  

  53.     dbms_output.put_line(fnd_message.get);  

  54.     RAISE app_exceptions.application_exception;  

  55.   END IF;  

  56.   IF  p_return  =  'S'  THEN  

  57.     RETURN(l_concatenated_segments);  

  58.   ELSIF  p_return  =  'D'  THEN  

  59.     RETURN(l_concatenated_descriptions);  

  60.   ELSE  

  61.     RETURN(l_concatenated_segments);  

  62.   END IF;  

  63.   

  64. EXCEPTION  

  65.   WHEN OTHERS THEN  

  66.     RETURN NULL;  

  67.     app_exception.raise_exception;  

  68. END get_mstk_flexfields;  

  FUNCTION get_mstk_flexfields(p_item_id      NUMBER,
                               p_organization_id NUMBER,
                               p_return          VARCHAR2 DEFAULT 'S') RETURN VARCHAR2 IS
    l_concatenated_descriptions VARCHAR2(2000);
    l_success                   BOOLEAN;
    l_concatenated_segments     VARCHAR2(2000);
    c_structure_number          NUMBER;
    c_key_flex_code             VARCHAR2(20);
    c_appl_short_name           VARCHAR2(20);
    l_application_id            NUMBER;
    -- Keeps track of the current delimiter
    l_delim         VARCHAR2(1) := '';
    l_error_message VARCHAR2(1000);
  BEGIN
    --
    --如果在健弹性域定义的值集中使用了PROFILE,需要初始化赋值之后才行,否则会出现以上错误
    --SELECT FND_PROFILE.VALUE_WNPS('MFG_ORGANIZATION_ID') FROM DUAL;
    --fnd_global.apps_initialize(resp_appl_id => 401, resp_id => 65780, user_id => 1013436);
    IF FND_PROFILE.VALUE_WNPS('MFG_ORGANIZATION_ID') IS NULL THEN
      fnd_profile.put('MFG_ORGANIZATION_ID', p_organization_id);
    END IF;
    c_key_flex_code    := 'MSTK';
    c_appl_short_name  := 'INV';
    c_structure_number := 101;
  
    SELECT application_id
      INTO l_application_id
      FROM fnd_application_vl a
     WHERE a.application_short_name = c_appl_short_name;
  
    -- Get the delimiter
    l_delim := fnd_flex_apis.get_segment_delimiter(x_application_id => l_application_id, x_id_flex_code => c_key_flex_code, x_id_flex_num => c_structure_number);
    --参数DATA_SET一定要设置,和物料的键弹性域定义的原理一样:因为INVENTORY_LOCATION_ID在数据库的基表中不是唯一的值
    --SELECT set_defining_column_name,unique_id_column_name,application_table_name FROM fnd_id_flexs WHERE id_flex_code IN ('MTLL', 'MSTK');
    l_success := fnd_flex_keyval.validate_ccid(appl_short_name  => c_appl_short_name,
                                               key_flex_code    => c_key_flex_code,
                                               structure_number => c_structure_number,
                                               data_set         => to_char(p_organization_id), -- Requied
                                               combination_id   => p_item_id);
    dbms_output.put_line('l_success = ' || to_char(sys.diutil.bool_to_int(l_success)));
    l_error_message := fnd_flex_keyval.error_message;
    IF l_success THEN
      l_concatenated_descriptions := fnd_flex_keyval.concatenated_descriptions;
      --dbms_output.put_line('Concatenated Descriptions : ' || l_concatenated_descriptions);
    
      l_concatenated_segments := fnd_flex_keyval.concatenated_values;
      --dbms_output.put_line('Concatenated Segments : ' || l_concatenated_segments);
    ELSE
      l_concatenated_segments     := NULL;
      l_concatenated_descriptions := NULL;
      fnd_message.set_name('FND', 'FLEX-SSV EXCEPTION');
      fnd_message.set_token('MSG', l_error_message);
      dbms_output.put_line(fnd_message.get);
      RAISE app_exceptions.application_exception;
    END IF;
    IF p_return = 'S' THEN
      RETURN(l_concatenated_segments);
    ELSIF p_return = 'D' THEN
      RETURN(l_concatenated_descriptions);
    ELSE
      RETURN(l_concatenated_segments);
    END IF;
  
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
      app_exception.raise_exception;
  END get_mstk_flexfields;


请使用浏览器的分享功能分享到微信等