有时候物料分类会使用代码,具体意义用摘要存储。
已知分类组合或者Category ID,如何取得物料分类组合的描述?
利用fnd_flex_keyval包轻松获取关键性弹性域组合描述字段
在Oracle Forms客户化开发中,如果遇到有在Form上提供关键性弹性域(以下简称“键弹性域”)功能支持的时候,我们可以利用FND_KEY_FLEX.DEFINE函数来轻松完成所有的初始化工作,其中也包括键弹性域的组合描述字段的显示的初始化:只要在FND_KEY_FLEX.DEFINE调用时指定了DESCRIPTION参数即可。然而有时我们仅是想要显示这个描述组合字段,仅此而已,并不需要提供完整的键弹性域功能。那么我们有什么快速而有效的方法来得到这个描述组合字段呢?
情形1:已知分类组合,获取组合描述字段
create or replace function get_concat_descriptions(
p_operation IN VARCHAR2
,p_appl_shoart_name IN VARCHAR2
,p_key_flex_code IN VARCHAR2
,p_structure_number IN NUMBER
,p_concat_segs IN VARCHAR2)
RETURN VARCHAR2 IS
BEGIN
IF fnd_flex_keyval.validate_segs(
operation => p_operation,
appl_short_name => p_appl_shoart_name,
key_flex_code => p_key_flex_code, --键弹性域代码
structure_number => p_structure_number, --即structure_id,ID_FLEX_NUM
concat_segments => p_concat_segs) THEN
RETURN (fnd_flex_keyval.concatenated_descriptions());
ELSE
RETURN '';
END IF;
END;
operation 可选值有:
FIND_COMBINATION - 所给定的组合字段必须在系统中已经被定义
CREATE_COMBINATION - 如果组合字段不存在,则在系统中创建该组合
CREATE_COMB_NO_AT - 功能和CREATE_COMBINATION相同,只是不像前者要使用相对独立的子事务
CHECK_COMBINATION - 只是检查一下给定的组合字段是否合法,不管检查结果如何,都不创建新的组合
DEFAULT_COMBINATION - 返回默认的最小组合
CHECK_SEGMENTS - 分别验证字段
--测试
declare
v_des varchar2(100);
begin
v_des := get_concat_descriptions('FIND_COMBINATION','INV','MCAT',50329,'PM.BOX');
dbms_output.put_line(v_des);
end;
情形2:已知分类ID,获取组合描述字段
create or replace function get_concate_descriptions2
(p_appl_shoart_name IN VARCHAR2
,p_key_flex_code IN VARCHAR2
,p_structure_number IN NUMBER
,p_combination_id IN NUMBER) RETURN VARCHAR2 IS
l_boolean BOOLEAN;
BEGIN
l_boolean := fnd_flex_keyval.validate_ccid
(appl_short_name => p_appl_shoart_name,
key_flex_code => p_key_flex_code,
structure_number => p_structure_number,
combination_id => p_combination_id);
-- if not fnd_flex_keyval.is_valid then
IF l_boolean THEN
RETURN fnd_flex_keyval.concatenated_descriptions;
ELSE
RETURN NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END get_concate_descriptions2;
--测试我们用分类组合取得Category ID, 再获取组合描述
--实际情况中,像物料分类表MTL_ITEM_CATEGORIES,采购行表po_lines_all等,都是已知Category ID
declare
v_des varchar2(100);
l_category_id number;
begin
select category_id
into l_category_id
from MTL_CATEGORIES_V
where CATEGORY_CONCAT_SEGS = 'PM.BOX';
v_des := get_concate_descriptions2('INV', 'MCAT', 50329, l_category_id);
dbms_output.put_line(v_des);
end;