需求背景:当行上的金额、数量、单价变化时,头上的汇总数量、金额字段随之实时变化
即:头信息的【调整数量】 = 行信息的【调整数量】汇总
头信息的【调整金额】 = 行信息的【调整金额】汇总
行信息的【调整金额】 = 行信息的【调整数量】*行信息的【调整单价】
处理方式:
步骤1:头数据块ADJ_HEADERS_V上新增2组数量、金额汇总的各3个的非数据库字段(合计字段、<合计字段>_RTOT_DB、<合计字段>_RTOT_OLD),Subclass Information属性为TEXT_ITEM_DISPLAY_ONLY;Database item属性为No;Data Type属性为Number;
如:合计字段为:ADJ_QTY_TOTAL(需界面画布展示);则需同步新增两个用于计算的字段ADJ_QTY_TOTAL_RTOT_DB、ADJ_QTY_TOTAL_RTOT_OLD(界面画布无需展示)
步骤2:行数据块ADJ_LINES_V上新增2组数量、金额的各3个字段(行字段、<行字段>_RTOT_DB、<行字段>_RTOT_OLD),行字段的Subclass Information属性为TEXT_ITEM,Database item属性为No,属于界面录入字段;<行字段>_RTOT_DB、<行字段>_RTOT_OLD的Subclass Information属性为TEXT_ITEM_DISPLAY_ONLY,Database item属性为No,属于只展示字段;以上字段的Data Type属性为Number;
如:行字段为:ADJ_QTY(需界面画布展示);则需同步新增两个用于计算的字段ADJ_QTY_RTOT_DB、ADJ_QTY_RTOT_OLD(界面画布无需展示)
步骤3:Program Units新增CUX_ADJ_PUB包,增加过程l_adj_amount对行上的金额进行计算
PROCEDURE l_adj_amount(event in VARCHAR2) IS
BEGIN
IF event = 'INIT' THEN
copy(name_in('ADJ_LINES_V.adj_price') *
name_in('ADJ_LINES_V.adj_qty'),
'ADJ_LINES_V.adj_amt');
END IF;
END;
步骤4:程序包CUX_ADJ_PUB新增过程running_total,包装EBS form自带的app_calculate.running_total方法,用于将行上的字段汇总到头字段上
PROCEDURE running_total(event in VARCHAR2) IS
BEGIN
app_calculate.running_total(event,
'ADJ_LINES_V.ADJ_AMT',
'ADJ_HEADERS_V.ADJ_AMT_TOTAL');
app_calculate.running_total(event,
'ADJ_LINES_V.ADJ_QTY',
'ADJ_HEADERS_V.ADJ_QTY_TOTAL');
END;
步骤5:程序包CUX_ADJ_PUB新增过程h_query,用于获取头上汇总金额的初始值,并进行汇总值赋值处理,如下:
PROCEDURE h_query(event IN VARCHAR2) IS
l_amt_sum NUMBER;
l_qty_sum NUMBER;
BEGIN
SELECT nvl(SUM(adj_amt), 0),nvl(sum(adj_qty),0)
INTO l_amt_sum,l_qty_sum
FROM cux_0_ar_acc_adj_lines_v
WHERE adj_header_id = :adj_headers_v.adj_header_id;
:adj_headers_v.adj_amt_total := l_amt_sum;
:adj_headers_v.adj_amt_total_rtot_db := l_amt_sum;
:adj_headers_v.adj_qty_total := l_qty_sum;
:adj_headers_v.adj_qty_total_rtot_db := l_qty_sum;
END;
步骤6:程序包CUX_ADJ_PUB新增过程cal_amt_total,用于行上的数量、单价字段变化时触发,在触发器WHEN-VALIDATE-ITEM下调用:
PROCEDURE cal_amt_total(event in VARCHAR2) IS
BEGIN
IF event = 'WHEN-VALIDATE-ITEM' THEN
cux_adj_pub.l_adj_amount('INIT'); --先计算行上面的LINES.AMOUNT
cux_adj_pub.running_total('WHEN-VALIDATE-ITEM'); --然后在计算HEADERS.AMOUNT_TOTAL里面的数值
END IF;
END;
步骤7:修改数据块行上ADJ_LINES_V.ADJ_PRICE的触发器WHEN-VALIDATE-ITEM
cux_adj_pub.cal_amt_total('WHEN-VALIDATE-ITEM');
步骤8:修改数据块行上ADJ_LINES_V.ADJ_QTY的触发器WHEN-VALIDATE-ITEM
cux_adj_pub.cal_amt_total('WHEN-VALIDATE-ITEM');
步骤9:修改数据块头上ADJ_HEADERS_V的POST_QUERY触发器
用于打开界面时,头上的金额、数量汇总字段有初始值
app_folder.event('POST-QUERY');
fnd_flex.event('POST-QUERY');
cux_adj_pub.h_query('POST-QUERY');
步骤10:修改数据块行上ADJ_LINES_V的KEY-DELREC触发器
cux_adj_pub.running_total('KEY-DELREC');
Delete_Record;
步骤11:修改数据块行上ADJ_LINES_V的KEY-DUPREC触发器
cux_adj_pub.running_total('KEY-DUPREC');
duplicate_record;
步骤12:修改数据块行上ADJ_LINES_V的KEY-CLRREC触发器
cux_adj_pub.running_total('KEY-CLRREC');
app_folder.event('KEY-CLRREC');
步骤13:修改数据块行上ADJ_LINES_V的WHEN-CLEAR-BLOCK 触发器
cux_adj_pub.running_total('WHEN-CLEAR-BLOCK');
步骤14:修改数据块行上ADJ_LINES_V的POST-QUERY 触发器
cux_adj_pub.running_total('POST-QUERY');
app_folder.event('POST-QUERY');
app_globe.event('POST-QUERY');