ABAP求助:如何将HR旧INCLUDE导入本地类?
针对你遇到的两个核心问题——本地类中使用rpcblo00/rpcbdt00时的语法错误,以及获取信息类型行变更操作的替代方案,我整理了实用的解决方案:
一、解决INCLUDE导致的语法错误
你遇到的错误根源是:ABAP类的方法内部不允许使用含连字符(-)的标识符,而rpcblo00里定义的lo-key正好违反了这个规则。这里有个比直接复制INCLUDE内容更优雅的方案:
手动声明所需结构,替代INCLUDE
rpcblo00的核心作用是定义PCL4数据库的键结构PCL4_LA_KEY,你完全可以直接在类的私有部分声明这个标准结构,代替INCLUDE的功能:
CLASS lcl_infotypaenderungen DEFINITION. PUBLIC SECTION. TYPES: tty_aenderungs_operationen TYPE STANDARD TABLE OF pc403. METHODS: constructor IMPORTING is_aenderungs_kopf TYPE pldoc_key, get_aenderungs_operationen RETURNING value(rt_aenderungs_operationen) TYPE tty_aenderungs_operationen. PRIVATE SECTION. DATA: s_aenderungs_kopf TYPE pldoc_key, t_aenderungs_operationen TYPE tty_aenderungs_operationen, " 直接声明PCL4的键结构,替代lo-key lo_key TYPE pcl4_la_key. ENDCLASS.
然后在方法里使用下划线命名的lo_key(完全符合类的语法规则):
METHOD select_aenderungs_operationen. lo_key-tclas = me->s_aenderungs_kopf-tclas. lo_key-pernr = me->s_aenderungs_kopf-pernr. lo_key-infty = me->s_aenderungs_kopf-infty. lo_key-bdate = me->s_aenderungs_kopf-bdate. lo_key-btime = me->s_aenderungs_kopf-btime. lo_key-seqnr = me->s_aenderungs_kopf-seqnr. IMPORT header TO me->t_aenderungs_operationen FROM DATABASE pcl4(la) ID lo_key. ENDMETHOD.
这种方式既保留了原逻辑,又避免了语法错误,代码也更清晰。
二、获取信息类型行变更操作的其他方法
除了直接从PCL4读取pc403数据,还有几种更标准、易维护的方式:
1. 解析HR_INFOTYPE_LOG_GET_DETAIL的返回表
你已经在调用这个函数了,其实它返回的fields表(类型hrinf tylog_fields)里就包含了字段级的变更操作信息:
- 字段
OPERA标识操作类型:I=创建,U=更新,D=删除 - 结合
infty_tab_before和infty_tab_after可以对比出行级的变更
2. 使用通用变更文档函数HR_CHANGE_DOCUMENT_READ
这个函数专门用于读取HR模块的变更文档,能直接返回行级和字段级的变更详情:
DATA: lt_change_docs TYPE PCCE_CHANGE_DOCUMENT_TAB. CALL FUNCTION 'HR_CHANGE_DOCUMENT_READ' EXPORTING pernr = <log_kopfzeile>-pernr infty = <log_kopfzeile>-infty tclas = <log_kopfzeile>-tclas begda = <log_kopfzeile>-bdate endda = <log_kopfzeile>-bdate TABLES change_documents = lt_change_docs.
返回的lt_change_docs里包含了每个变更的操作类型、字段旧值/新值等信息,不需要直接操作数据库。
3. 读取PCL4的data条目
如果还是想直接操作PCL4,可以导入data部分获取完整的信息类型行变更:
DATA: lt_infotype_changes TYPE prelp_tab. IMPORT data TO lt_infotype_changes FROM DATABASE pcl4(la) ID lo_key.
对比lt_infotype_changes和前后的信息类型表,就能判断出行的操作类型。
总结下来,手动声明结构是解决INCLUDE问题的最优方案,而使用SAP标准函数获取变更操作会让代码更健壮、易维护。
内容的提问来源于stack exchange,提问作者Legxis
相关产品推荐
相关产品推荐

