SAP ABAP HANA 通用写法|指定采购组织 + 工厂取物料采购信息记录最新有效期数据
业务场景
日常 SAP 物料采购价格报表开发中,经常需要指定采购组织、工厂,批量抓取所有物料对应供应商采购信息记录,同一物料 + 供应商仅保留有效期自 (DATAB) 最新一条有效数据,剔除重复数据、剔除删除状态信息记录,适配 ECC/S4 HANA 全版本 ABAP 环境,无 SQL 语法报错,性能稳定易维护。
实现思路
- 关联采购信息记录表
EINA(抬头)+EINE(组织级别)+ 条件记录表A017,精准匹配业务维度 - 取出全量合规业务数据存入内表
- 按物料、供应商升序,有效期自降序排序,最新数据置顶
- 利用 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.
代码核心亮点
- 兼容性极强:纯标准 OPEN SQL 写法,不使用 HANA 专属函数、窗口函数,ECC6~S4HANA 1909/2021 全环境通用,传输无语法报错
- 去重逻辑简洁高效:舍弃复杂
NOT EXISTS嵌套子查询,排序 + 去重语法简洁,代码可读性高,后期易维护 - 业务维度精准:三表精准关联物料、供应商、采购组织、工厂四大核心维度,杜绝跨维度脏数据
- 数据安全性高:内置删除标志过滤,只抓取正常启用采购信息记录,贴合实际业务报表需求
- 字段全覆盖:包含采购价格报表所有常用业务字段,可直接对接 ALV、自定义表单导出 Excel
自定义修改说明
- 更换查询范围:直接修改 WHERE 条件内
ekorg、werks对应数值即可 - 新增输出字段:在类型
ty_pir_data和 SELECT 取数语句中同步添加字段 - 保留删除数据:删除条件
AND a~loekz <> 'X'即可 - 调整排序规则:修改 SORT 排序字段与升降序
ASCENDING/DESCENDING
适用开发场景
- 物料采购价格台账报表开发
- 供应商最新报价批量统计
- 采购信息记录有效期管控报表
- 物料比价、成本核算底层数据源抽取

浙公网安备 33010602011771号