SAP ABAP报表程序SALV显示

SAP ABAP报表程序SALV显示

这里写目录标题

  • SAP ABAP报表程序SALV显示
  • 需求
  • 解决方案
  • 逻辑解析
    • 屏幕选择
  • 自定义表结构
    • tips: 先确定表与表之间的关系
    • tips: 查看表内容
    • tips 实用事务代“st05”码跟踪 表
  • 代码如下

需求

​ 有部分单元存在采购订单采购E件、X件的情况,导致入库时不是进入正常的原材料科目,导致财务科目数据异常。

解决方案

通过进行采购订单监控的方式,进行定期检查,杜绝采购E件、X件的情况。

逻辑解析

第一步,根据条件(工厂、采购订单创建日期),取出采购订单。

​ 查询EKKO、EKPO表,查询出符合条件的采购订单,采购订单创建日期在EKKO~ AEDAT字段,需要关联EKKO、EKPO表进行取数。

第二步,根据上步的采购订单,进行进一步筛选。

根据第一步得到的采购订单信息,在MARC表中进行采购类型(BESKZ)选择,选择E、X类型的物料;

然后到MBEW表中查询物料的价格控制(VPRSV)字段。

​ 当采购订单的物料为E,或者为X类型(价格控制字段为“S”),这两种情况下,为预警采购订单明细数据,显示给用户进行检查。

第三步,显示采购订单信息。

根据第二部得到的采购订单预警数据,进行进一步筛选。

显示采购订单明细信息时,需要显示采购订单的入库数量(EKET~WEMNG)数据,

如果选择已入库,则显示的采购订单为所有采购订单行均是入库数量 = 采购订单数量;

如果选择的是未清条件,则只要有一个采购订单行的入库数量 < 采购订单数量,认为是未清;

如果选择的是全部,则显示全部符合条件的采购订单明细

屏幕选择

工厂:

采购订单创建日期:

采购订单号:

全部 已入库 未清

自定义表结构

tips: 先确定表与表之间的关系

解决思路

ekko 为采购抬头表

ekpo 为采购采购明细表

marc 物料的工厂数据表

mbew 物料评估表

tips: 查看表内容

事务代码:se11
在这里插入图片描述

点击display——》实用程序——》表内容——》显示

点击执行全部

在这里插入图片描述

就可以看到表的内容。

tips 实用事务代“st05”码跟踪 表

一个输入框输入“st05”回车
在这里插入图片描述

点击
在这里插入图片描述

另一个窗口

事务代码 “me23n” 回车

在这里插入图片描述

点击

在这里插入图片描述

然后点击结算追踪-----》显示——》 执行

在这里插入图片描述

代码如下

REPORT  ztest_zjy007.TABLES:ekko,eket,ekpo,marc,mbew."定义结构体ty_ekko,
TYPES:BEGIN OF ty_ekko,ebeln TYPE ekko-ebeln, "采购凭证号ebelp TYPE ekpo-ebelp,"采购订单行号matnr TYPE ekpo-matnr,"物料号werks TYPE ekpo-werks,"工厂aedat TYPE ekko-aedat, "记录的创建日期menge TYPE ekpo-menge," 采购订单数量wemng TYPE eket-wemng, "入库数量 收货数量wamng TYPE eket-wamng, "采购订单数量 发货数量
END OF ty_ekko."定义结构体
TYPES:BEGIN OF ty_ekpo,ebeln TYPE ekpo-ebeln,"采购凭证号werks TYPE ekpo-werks,"工厂matnr TYPE ekpo-matnr,"物料号menge TYPE ekpo-menge," 采购订单数量ebelp TYPE ekpo-ebelp,"采购订单行号END OF ty_ekpo."定义结构体
TYPES:BEGIN OF ty_eket,ebeln TYPE eket-ebeln,ebelp TYPE ekpo-ebelp,etenr TYPE eket-etenr,"交货计划行计数器,wemng TYPE eket-wemng,"(入库数量 (收货数量)wamng TYPE eket-wamng,"(发货数量 (采购数量)END OF ty_eket.TYPES:BEGIN OF ty_marc,beskz TYPE marc-beskz, "采购类型werks TYPE marc-werks, "工厂matnr TYPE marc-matnr, "物料号END OF ty_marc.TYPES:BEGIN OF ty_mbew,matnr TYPE mbew-matnr, "物料号vprsv TYPE mbew-vprsv, "价格指示符bwkey TYPE mbew-bwkey,   "类似工厂号END OF ty_mbew.TYPES:BEGIN OF ty_warn,"预警表(ty_ekko ty_marc)ebeln TYPE ekpo-ebeln,ebelp TYPE ekpo-ebelp, "采购订单行号matnr TYPE ekpo-matnr,"物料号werks TYPE ekpo-werks,"工厂menge TYPE ekpo-menge," 采购订单数量aedat TYPE ekpo-aedat,"时间beskz TYPE marc-beskz, "采购类型etenr TYPE eket-etenr,"交货计划行计数器,wemng TYPE eket-wemng,"(发货数量 (采购数量)wamng  TYPE eket-wamng,"(入库数量 (收货数量)vprsv TYPE mbew-vprsv,END OF ty_warn.DATA: gt_ekko TYPE TABLE OF ty_ekko,"ty_ekko 结构体gw_ekko LIKE LINE OF gt_ekko."gw_ekko工作区DATA: gt_ekpo TYPE TABLE OF ty_ekpo,gw_ekpo LIKE LINE OF gt_ekpo."gw_ekpo工作区DATA: gt_marc TYPE TABLE OF ty_marc,gw_marc LIKE LINE OF gt_marc."gw_marc工作区DATA: gt_marc_2 TYPE TABLE OF ty_marc,gw_marc_2 LIKE LINE OF gt_marc_2."gw_marc2工作区DATA: gt_marc_3 TYPE TABLE OF ty_marc,gw_marc_3 LIKE LINE OF gt_marc_3."gw_marc3工作区DATA: gt_mbew TYPE TABLE OF ty_mbew,gw_mbew LIKE LINE OF gt_mbew.DATA: gt_eket TYPE TABLE OF ty_eket,gw_eket LIKE LINE OF gt_eket.DATA: gt_eket_2 TYPE TABLE  OF ty_eket,
gw_eket_2 LIKE LINE OF gt_eket_2.*预警表
DATA:gt_warn TYPE TABLE OF ty_warn,gw_warn LIKE LINE OF gt_warn.*选择屏幕
SELECT-OPTIONS:
*ebeln1 FOR ekko-ebeln,"采购凭证号werks1 FOR ekpo-werks,"工厂aedat1 FOR ekko-aedat."记录的创建日期PARAMETERS:r1 RADIOBUTTON GROUP radi,"未清r2 RADIOBUTTON GROUP radi,"已入库r3 RADIOBUTTON GROUP radi."全部**设置查询的数据
**SELECT * FROM (表1 INNER JOIN 表2 ON 表1~字段号=表2~字段号)
** INNER JOIN 表3 ON 表1~字段号=表3~字段号
SELECTekko~ebeln"采购凭证号ekko~aedatekpo~matnrekpo~ebelp "采购订单行号ekpo~werksekpo~mengeINTO CORRESPONDING FIELDS OF TABLE gt_ekko  "内表gt_ekkoFROMekko INNER JOIN ekpo   ON ekko~ebeln = ekpo~ebeln
*  [表1] inner join [表2]...on...[关联条件] 这是俩张表关联的固定语法WHERE   ekpo~werks IN werks1AND   ekko~aedat IN aedat1.
*where条件是在临时表(内表)生成好后,再对临时表进行过滤的条件IF gt_ekko IS NOT INITIAL.SELECTmatnr "物料号werks "工厂beskz "采购类型型INTO CORRESPONDING FIELDS OF TABLE gt_marc  "内表gt_marcFROM marc "物料的工厂数据FOR ALL ENTRIES IN gt_ekkoWHERE matnr = gt_ekko-matnr "物料号AND werks = gt_ekko-werks "工厂号AND beskz IN ('E' , 'X')."选择e x 类型的物料
ENDIF.gt_marc_2 = gt_marc.
gt_marc_3 = gt_marc.
*将gt_marc查到的值赋值给gt_marc_2
DELETE gt_marc_2 WHERE beskz = 'E'."删除内表中beskz为E的数据
DELETE  gt_marc_3 WHERE beskz = 'X'."删除内表中beskz为x的行数据 保留E*保留E将要在mbew 表取S 的数据段为表
IF gt_marc_2 IS NOT INITIAL.SELECTmatnr "物料号bwkey "相当于工厂vprsvFROM mbewINTO CORRESPONDING FIELDS OF TABLE gt_mbewFOR ALL ENTRIES IN gt_marc_2WHERE matnr = gt_marc_2-matnr "物料号AND bwkey = gt_marc_2-werks "工厂号AND vprsv = 'S'.ENDIF.*在预警表内添加eket-wemng字段
*内表gt_ekko和数据表eket查询得到内表gt_eket
IF gt_ekko IS NOT INITIAL .SELECTebeln "采购凭证号ebelp"采购订单行号etenr"交货计划行计数器wemng"(发货数量 (采购数量)wamng"(入库数量 (收货数量)INTO CORRESPONDING FIELDS OF TABLE gt_eket "内表gt_eketFROM eket "FOR ALL ENTRIES IN gt_ekkoWHERE ebeln = gt_ekko-ebelnAND ebelp = gt_ekko-ebelp.
ENDIF.*累加cllear相同的计划行
LOOP AT gt_eket INTO gw_eket.COLLECT gw_eket INTO gt_eket_2."关键一步。。。"CLEAR:gw_eket.
ENDLOOP.*内表循环取数SORT gt_marc_3 BY matnr werks.
SORT gt_mbew   BY matnr bwkey.
SORT gt_eket_2   BY ebeln ebelp.LOOP AT gt_ekko INTO gw_ekko.gw_warn-werks = gw_ekko-werks."工厂gw_warn-matnr = gw_ekko-matnr."物料号gw_warn-ebeln = gw_ekko-ebeln. "采购凭证号gw_warn-ebelp = gw_ekko-ebelp."采购订单行号gw_warn-aedat = gw_ekko-aedat. "记录的创建日期gw_warn-menge = gw_ekko-menge."" 采购订单数量READ TABLE gt_marc_3 INTO gw_marc_3WITH KEY matnr = gw_ekko-matnr werks = gw_ekko-werksBINARY SEARCH.IF sy-subrc = 0.gw_warn-beskz = gw_marc_3-beskz."采购类型READ TABLE gt_eket_2 INTO gw_eket_2WITH  KEY ebeln = gw_ekko-ebeln ebelp = gw_ekko-ebelpBINARY SEARCH.IF sy-subrc = 0.gw_warn-etenr = gw_eket_2-etenr."交货计划行计数器,gw_warn-wemng = gw_eket_2-wemng."(发货数量 (采购数量)gw_warn-wamng = gw_eket_2-wamng."(入库数量 (收货数量)ENDIF.IF r1 = 'X'AND gw_warn-wamng < gw_warn-menge."未清APPEND gw_warn TO gt_warn.ENDIF.IF r2 = 'X' AND  gw_warn-wamng = gw_warn-menge."已经入库APPEND gw_warn TO gt_warn.ENDIF.IF r3 = 'X'. "全部APPEND gw_warn TO gt_warn.ENDIF.ENDIF.READ TABLE gt_mbew INTO gw_mbewWITH KEY matnr = gw_ekko-matnr bwkey = gw_ekko-werksBINARY SEARCH.IF sy-subrc = 0.gw_warn-vprsv = gw_mbew-vprsv. "价格控制gw_warn-beskz = 'X'.READ TABLE gt_eket_2 INTO gw_eket_2WITH  KEY ebeln = gw_ekko-ebeln ebelp = gw_ekko-ebelpBINARY SEARCH.IF sy-subrc = 0.gw_warn-etenr = gw_eket_2-etenr."交货计划行计数器,gw_warn-wemng = gw_eket_2-wemng."(发货数量 (采购数量)gw_warn-wamng = gw_eket_2-wamng."(入库数量 (收货数量)=ENDIF.IF r1 = 'X'AND gw_warn-wamng < gw_warn-menge."未清APPEND gw_warn TO gt_warn.ENDIF.IF r2 = 'X' AND  gw_warn-wamng = gw_warn-menge."已经入库APPEND gw_warn TO gt_warn.ENDIF.IF r3 = 'X'."全部APPEND gw_warn TO gt_warn.ENDIF.ENDIF.CLEAR gw_warn.
ENDLOOP.BREAK-POINT.END-OF-SELECTION.


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部