欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

SAP ABAP HANA 通用写法|指定采购组织 + 工厂取物料采购信息记录最新有效期数据

业务场景

日常 SAP 物料采购价格报表开发中,经常需要指定采购组织、工厂,批量抓取所有物料对应供应商采购信息记录,同一物料 + 供应商仅保留有效期自 (DATAB) 最新一条有效数据,剔除重复数据、剔除删除状态信息记录,适配 ECC/S4 HANA 全版本 ABAP 环境,无 SQL 语法报错,性能稳定易维护。

实现思路

  1. 关联采购信息记录表EINA(抬头)+EINE(组织级别)+ 条件记录表A017,精准匹配业务维度
  2. 取出全量合规业务数据存入内表
  3. 按物料、供应商升序,有效期自降序排序,最新数据置顶
  4. 利用 ABAP 内置语法剔除相邻重复数据,高效完成分组取最新,摒弃复杂子查询,兼容所有版本

完整可直接上线代码

REPORT ZFIND_VENDOR_BEST.

TABLES: LFA1, LFB1, LFM1,ZTMM024.

TYPES: BEGIN OF TY_PIR,
         INFNR TYPE INFNR,     " 信息记录号
         ERDAT TYPE ERDAT,     " 创建时间
         EKORG TYPE EKORG,     " 采购组织
         WERKS TYPE WERKS_D,   " 工厂
         LIFNR TYPE LIFNR,     " 供应商
         MATNR TYPE MATNR,     " 物料
         NETPR TYPE NETPR,     " 净价

         PEINH TYPE PEINH,     " 价格单位
         WAERS TYPE WAERS,     " 币种
         KSCHL TYPE KSCHL,
         ESOKZ TYPE ESOKZ,
         DATAB TYPE DATAB,     " 有效期自
         DATBI TYPE DATBI,     " 有效期至
       END OF TY_PIR.

DATA: LT_ALL   TYPE TABLE OF TY_PIR,
      LT_FINAL TYPE TABLE OF TY_PIR,
      LS_PIR   TYPE TY_PIR.

*----------------------------------------------------------------------*
* 第一步:取出所有数据(无语法错误,所有SAP版本通用)
*----------------------------------------------------------------------*
SELECT
  A~INFNR,
  A~ERDAT,
  B~EKORG,
  B~WERKS,
  A~LIFNR,
  A~MATNR,
  B~NETPR,
  B~PEINH,
  B~WAERS,
  C~KSCHL,
  C~ESOKZ,
  C~DATAB,
  C~DATBI
  FROM EINA AS A
  INNER JOIN EINE AS B
    ON A~INFNR = B~INFNR
  INNER JOIN A017 AS C
    ON C~MATNR = A~MATNR
    AND C~LIFNR = A~LIFNR
    AND C~EKORG = B~EKORG
    AND C~WERKS = B~WERKS
  WHERE
    B~EKORG = '2030'       " 采购组织
    AND B~WERKS = '2031'   " 工厂
    AND A~LOEKZ <> 'X'     " 未删除
  INTO CORRESPONDING FIELDS OF TABLE @LT_ALL.

*----------------------------------------------------------------------*
* 第二步:排序(按 物料+供应商 升序 + 有效期自 降序 → 最新排第一)
*----------------------------------------------------------------------*
SORT LT_ALL BY MATNR LIFNR DATAB DESCENDING.

*----------------------------------------------------------------------*
* 第三步:删除重复(按 物料+供应商 唯一,只保留第一条=最新)
*----------------------------------------------------------------------*
DELETE ADJACENT DUPLICATES FROM LT_ALL
  COMPARING MATNR LIFNR.

*----------------------------------------------------------------------*
* 最终结果:lt_all 就是你要的报表(无重复 + 最新有效期)
*----------------------------------------------------------------------*
LT_FINAL = LT_ALL.


" 输出结果
TRY.
    CL_SALV_TABLE=>FACTORY(
    IMPORTING
      R_SALV_TABLE   = DATA(LO_SALV)
      CHANGING
        T_TABLE        = LT_ALL
    ).
    " 显示工具栏
    LO_SALV->GET_FUNCTIONS( )->SET_ALL(  ).

    " 自适应列宽
    LO_SALV->GET_COLUMNS(  )->SET_OPTIMIZE( 'X' ).

    LO_SALV->DISPLAY(  ).
  CATCH CX_SALV_MSG INTO DATA(LO_EXCEPTION).
    DATA(LV_MSG) = LO_EXCEPTION->GET_TEXT(  ).
    MESSAGE LV_MSG TYPE 'I'.
ENDTRY.

代码核心亮点

  1. 兼容性极强:纯标准 OPEN SQL 写法,不使用 HANA 专属函数、窗口函数,ECC6~S4HANA 1909/2021 全环境通用,传输无语法报错
  2. 去重逻辑简洁高效:舍弃复杂NOT EXISTS嵌套子查询,排序 + 去重语法简洁,代码可读性高,后期易维护
  3. 业务维度精准:三表精准关联物料、供应商、采购组织、工厂四大核心维度,杜绝跨维度脏数据
  4. 数据安全性高:内置删除标志过滤,只抓取正常启用采购信息记录,贴合实际业务报表需求
  5. 字段全覆盖:包含采购价格报表所有常用业务字段,可直接对接 ALV、自定义表单导出 Excel

自定义修改说明

  1. 更换查询范围:直接修改 WHERE 条件内ekorgwerks对应数值即可
  2. 新增输出字段:在类型ty_pir_data和 SELECT 取数语句中同步添加字段
  3. 保留删除数据:删除条件AND a~loekz <> 'X'即可
  4. 调整排序规则:修改 SORT 排序字段与升降序ASCENDING/DESCENDING

适用开发场景

  1. 物料采购价格台账报表开发
  2. 供应商最新报价批量统计
  3. 采购信息记录有效期管控报表
  4. 物料比价、成本核算底层数据源抽取

 

posted @ 2026-05-18 15:08  萧静默  阅读(48)  评论(0)    收藏  举报