如何从含重复pernr的ztable中筛选最新记录输出至cl_salv_table?
解决方案
我给你提供两种可落地的实现思路,你可以根据自己的系统版本和业务场景选择:
方案1:SQL层面直接筛选(优先推荐)
这种方案直接在数据库查询阶段就过滤掉无用数据,性能比内表处理更高,分两种场景适配:
场景A:确认有效记录固定为enddate = '99991231'
你需求里明确说日期间隔最大的就是enddate为9999年的记录,直接加WHERE条件即可,代码修改如下:
FORM process_data. DATA: lt_ztable TYPE TABLE OF ztable, ls_ztable LIKE LINE OF lt_ztable, ls_salv_table LIKE LINE OF gt_salv_table. SELECT pernr, sname, begindate, enddate FROM ztable INTO CORRESPONDING FIELDS OF TABLE lt_ztable WHERE enddate = '99991231'. " 直接过滤最新有效记录 LOOP AT lt_ztable INTO ls_ztable MOVE-CORRESPONDING ls_ztable to ls_salv_table. APPEND ls_salv_table TO gt_salv_table. ENDLOOP. ENDFORM.
场景B:存在离职员工enddate不为9999,需要通用取每个员工最大enddate的记录
如果你的业务里有员工离职后enddate不会更新为9999的情况,用ABAP窗口函数实现分组取最值,支持ABAP 7.40及以上版本:
FORM process_data. DATA: lt_ztable TYPE TABLE OF ztable, ls_ztable LIKE LINE OF lt_ztable, ls_salv_table LIKE LINE OF gt_salv_table. SELECT pernr, sname, begindate, enddate FROM ( SELECT pernr, sname, begindate, enddate, ROW_NUMBER( ) OVER ( PARTITION BY pernr ORDER BY enddate DESC ) AS rn FROM ztable ) INTO CORRESPONDING FIELDS OF TABLE lt_ztable WHERE rn = 1. " 每个pernr分组下enddate最大的第一条记录 LOOP AT lt_ztable INTO ls_ztable MOVE-CORRESPONDING ls_ztable to ls_salv_table. APPEND ls_salv_table TO gt_salv_table. ENDLOOP. ENDFORM.
方案2:内表循环阶段筛选(适配低版本系统)
如果你的系统版本较低不支持窗口函数,可以先对内表排序后再循环去重,实现逻辑如下:
FORM process_data. DATA: lt_ztable TYPE TABLE OF ztable, ls_ztable LIKE LINE OF lt_ztable, ls_salv_table LIKE LINE OF gt_salv_table, lv_last_pernr TYPE pernr. " 存储上一个处理的员工ID SELECT pernr, sname, begindate, enddate FROM ztable INTO CORRESPONDING FIELDS OF TABLE lt_ztable. " 按员工ID升序、结束日期降序排序,保证每个员工的第一条记录就是enddate最大的 SORT lt_ztable BY pernr ASCENDING enddate DESCENDING. LOOP AT lt_ztable INTO ls_ztable. " 同一个员工只处理第一条(enddate最大的)记录 IF ls_ztable-pernr = lv_last_pernr. CONTINUE. ENDIF. MOVE-CORRESPONDING ls_ztable to ls_salv_table. APPEND ls_salv_table TO gt_salv_table. lv_last_pernr = ls_ztable-pernr. ENDLOOP. ENDFORM.
注意:如果你的
ztable的sname等字段在不同历史记录里存在变更,以上方案取到的都是最新enddate对应的字段值,符合你要的最新员工记录的需求。
内容的提问来源于stack exchange,提问作者smoothlikebutter
相关产品推荐
相关产品推荐

