
近期项目需求对EBS中WEBADI导入日记账时,在加载数据时需要对账户组合额外进行客户化的校验,需要能够做到将校验结果体现在WEBADI模板的数据上,并且对每条错误数据都单独报错。
项目上的方案是调整fnd_flex_keyval这个程序包,同时通过多种限制,将使用范围限制在WEBADI的情况下才会再走一步额外的客户化校验,将范围将至最低。
这边近期进行了初步研究,仍未实践,但通过观察代码估计,以下方法是可行的:
1. 通过查看webadi进行日记账导入的集成器的定义,可以找到,webadi进行账户组合校验时使用了类oracle.apps.gl.journalwizard.validators.AccountingFlexValidator。
2. 反编译AccountingFlexValidator可以看到其中的985行
BneFlexStructure localBneFlexStructure = BneFlex.validateSegs(paramBneWebAppsContext.getJDBCConnection(), str6, paramBneFlexStructure.AppShortName, paramBneFlexStructure.IDFlexCode, paramBneFlexStructure.IDFlexNum, paramString, null, str1, null, -1, str5, null, null, false, false, paramBneWebAppsContext.getRespApplicationID(), paramBneWebAppsContext.getResponsibilityID(), paramBneWebAppsContext.getUserId(), this.m_upsDffPackage != null);
3. 上述BneFlex.validateSegs,位于oracle.apps.bne.utilities.oa.BneFlex
4. 反编译BneFlex,
可以看到validateSegs函数中调用了fnd_flex_keyval.validate_segs
5. 综合上述信息,修改思路如下:
A. 首先创建客户化package:CUX_FND_FLEX_KEYVAL,其中的校验存储过程validate_segs的参数与fnd_flex_keyval.validate_segs完全一致,
并且CUX_FND_FLEX_KEYVAL.validate_segs中会先调用fnd_flex_keyval.validate_segs,当fnd_flex_keyval.validate_segs校验成功时,才会进行额外的客户化账户组合的校验
B. 创建类CuxBenFlex,在BenFlex基础上调整,将其中fnd_flex_keyval.validate_segs全部替换为CUX_FND_FLEX_KEYVAL.validate_segs
C. 修改AccountingFlexValidator,调整其中的BneFlex.validateSegs为CuxBneFlex.validateSegs
理论上重编译为class文件并重启oacore后,可以生效。
之后实践完成之后我会在此随笔中补充实践结果。