You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从含重复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:24:07