DUMP:
发生场景: 调用function HR_INFOTYPE_OPERATION操作信息类型
类别 ABAP 编程错误
运行时错误 UNCAUGHT_EXCEPTION
异常 CX_HRPA_INVALID_PARAMETER
ABAP 程序 SAPFP50P
应用组件 PA-PA
代码解析:
原因及解决:参考note 493984,属于HR模块早期缓存设计的问题。无法通过打note的方式解决。官方建议在应用程序开始前使用PERFORM do_nothing(sapfp50p) 来完成对LOAD-OF-PROGRAM的触发,防止主程序中CL_HRPA_MASTERDATA_FACTORY的其它方法执行后触发LOAD-OF-PROGRAM,此时将调用方法SET_FRAMEWORK导致DUMP.
DUMP:
发生场景:使用function HRXSS_IN_INSERT_P0015写入信息类型0015数据
类别 ABAP 编程错误
运行时错误 OBJECTS_OBJREF_NOT_ASSIGNED
异常 CX_SY_REF_IS_INITIAL
ABAP 程序 CL_HRPA_INFTY_NNNN============CP
应用组件 PA-PA-XX
原因及解决:与上述类似,由于方法CL_HRPA_MASTERDATA_FACTORY=>SET_FRAMEWORK的调用,使得类CL_HRPA_MASTERDATA_FACTORY的静态属性对象关联到第一次执行时的数据缓存,而在函数HRXSS_IN_INSERT_P0015中调用如下方法获取infotype对象时无法获取当前函数中待更改数据对应的read_infotype对象,导致后续逻辑出现空对象报错。此处暂无法找到清空静态标记方法(指针访问清除不考虑),因此使用同步RFC(DESTINATION 'NONE')进行处理,防止全局缓存干扰。
知识点:LOAD-OF-PROGRAM
事件关键字定义了可执行程序、模块池、函数组或子程序池的程序构造函数。程序构造函数是一个事件块,其事件由ABAP 运行时环境,当上面提到的可执行程序之一被加载到内部会议。
当一个程序被调用时提交或使用交易代码,然后(在每次调用时)打开一个新的内部会话,并且在每次调用时执行一次事件块。您可以在此处初始化程序的全局数据对象。事件块必须完全执行,否则会发生运行时错误。这意味着可以指定退出事件块而不返回它的语句。
第一次外部程序(子程序或功能模块)或子屏幕 被称为,被调用过程的主程序加载到调用者的内部会话中,从而触发事件加载程序。事件块在被调用过程之前执行。每次同一个主程序的一个过程被同一个内部会话的调用者再次调用时,事件不会触发 LOAD-OF-PROGRAM 。
Notes:事件LOAD-OF-PROGRAM应该主要用于在调用外部程序时初始化全局数据或交易。如果您使用调用可执行程序提交,我们建议您使用事件 初始化,因为参数和选择标准的起始值在之后设置加载程序 (见之后的程序流程提交 )。如果一个程序只是因为需要声明而被加载,例如在使用时绝对类型 名称不会触发LOAD-OF-PROGRAM事件。只有在之后调用程序的可执行单元时,才会执行程序构造函数。
简单总结:
1. 可执行程序、模块池、函数组或子例程池的程序构造函数,类比类构造方法,在程序中对象加载时自动触发该事件(不包括加载声明)。
2. 同一个会话同一个进程下,只有在第一次调用程序内功能模块等时触发,异步RFC/SUBMIT/CALL DIALOG 等形式会刷新,但是主程序部分仅触发一次。
题外话:ABAP程序加载
Understanding Program Load (ABAP Load) - ABAP Development - Community Wiki
abap程序完成后需要加载编译才能被执行,一般为程序执行时自动加载.可以使用SGEN加载生成器.