Oracle APEX报表多选checkbox仅单条记录入库问题求助
Oracle APEX交互式报表勾选多行批量更新仅生效1条的解决方案
问题原因
你当前代码的核心问题是使用了双层嵌套循环:
APEX_APPLICATION.G_F01数组仅存储所有勾选行的支票号,长度等于你勾选的行数APEX_APPLICATION.G_F02数组存储报表所有行的备注输入值,长度等于报表总显示行数
双层循环会导致每一条勾选的支票号,都会被所有行的备注循环覆盖更新,最终每条支票号的备注只会保留最后一次循环的备注值,甚至会出现多条勾选记录被更新成同一条备注的异常,也就是你看到的仅1条记录生效的问题。
修复步骤
1. 修改交互式报表SQL查询
调整APEX_ITEM.CHECKBOX的返回值,拼接行号和支票号,用于后续匹配同一行的备注输入:
select APEX_ITEM.CHECKBOX(1, ROWNUM||':'||pdcq.CHEQUE_NUMBER)"SELECT", pdc.CUST_NAME ,pdr.RECEIPT_NUMBER ,pdcq.INSTALLMENT, pdcq.CHEQUE_NUMBER,pdcq.CHEQUE_AMOUNT, APEX_ITEM.TEXT(2,null) Remarks from pdc_customer pdc,pdc_receipt pdr,pdc_cheques pdcq where pdc.CUST_ID=pdr.CUST_ID and pdc.CUST_ID=pdcq.CUST_ID and pdcq.status='Pending' AND pdcq.RECEIPT_NUMBER=pdr.receipt_number and pdcq.APPROVER=NVL(SYS_CONTEXT('APEX$SESSION','APP_USER'), USER)
2. 修改PL/SQL处理逻辑
去掉嵌套循环,拆分勾选值得到行号和支票号,直接匹配对应行的备注:
declare v_user varchar2(100); v_rn number; v_cheque_number varchar2(100); v_colon_pos number; begin v_user := NVL(SYS_CONTEXT('APEX$SESSION','APP_USER'), USER); FOR I in 1 ..APEX_APPLICATION.G_f01.COUNT LOOP -- 拆分获取当前勾选行的行号和支票号 v_colon_pos := INSTR(APEX_APPLICATION.G_F01(i), ':'); v_rn := TO_NUMBER(SUBSTR(APEX_APPLICATION.G_F01(i), 1, v_colon_pos-1)); v_cheque_number := SUBSTR(APEX_APPLICATION.G_F01(i), v_colon_pos+1); UPDATE PDC_STATUS_HISTORY SET STATUS='Approved', REMARKS=APEX_APPLICATION.G_F02(v_rn), APPROVED_DATE=sysdate , APPROVED_BY=v_user WHERE APPROVAL_LEVEL=1 and CHEQUE_NUMBER=v_cheque_number; END LOOP; COMMIT; end;
注意事项
- 如果你需要处理报表多页的勾选记录,需要将交互式报表的分页模式调整为「所有行」,或者开启报表的「提交所有行」属性
- 如果你的支票号本身包含冒号,可以替换为其他不会出现在支票号中的特殊字符作为分隔符,例如
| - 可根据业务需要添加异常捕获逻辑,避免更新出错导致数据异常
内容的提问来源于stack exchange,提问作者Abinnaya
相关产品推荐
相关产品推荐

