SAP ABAP报表程序SALV显示

SAP ABAP报表程序SALV显示

需求

​ 有部分单元存在采购订单采购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~字段号
SELECT
  ekko~ebeln"采购凭证号
  ekko~aedat
  ekpo~matnr
  ekpo~ebelp "采购订单行号
  ekpo~werks
  ekpo~menge
  INTO CORRESPONDING FIELDS OF TABLE gt_ekko  "内表gt_ekko
  FROM
  ekko INNER JOIN ekpo   ON ekko~ebeln = ekpo~ebeln
*  [表1] inner join [表2]...on...[关联条件] 这是俩张表关联的固定语法
  WHERE   ekpo~werks IN werks1
  AND   ekko~aedat IN aedat1.
*where条件是在临时表(内表)生成好后,再对临时表进行过滤的条件

IF gt_ekko IS NOT INITIAL.
  SELECT
  matnr "物料号
  werks "工厂
  beskz "采购类型型
    INTO CORRESPONDING FIELDS OF TABLE gt_marc  "内表gt_marc
     FROM marc "物料的工厂数据
    FOR ALL ENTRIES IN gt_ekko
    WHERE 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.
  SELECT
   matnr "物料号
   bwkey "相当于工厂
   vprsv
   FROM mbew
   INTO CORRESPONDING FIELDS OF TABLE gt_mbew
   FOR ALL ENTRIES IN gt_marc_2
   WHERE 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 .
  SELECT
    ebeln "采购凭证号
    ebelp"采购订单行号
    etenr"交货计划行计数器
    wemng"(发货数量 (采购数量)
    wamng"(入库数量 (收货数量)
    INTO CORRESPONDING FIELDS OF TABLE gt_eket "内表gt_eket
    FROM eket "
    FOR ALL ENTRIES IN gt_ekko
    WHERE ebeln = gt_ekko-ebeln
    AND 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_3
  WITH KEY matnr = gw_ekko-matnr werks = gw_ekko-werks
  BINARY SEARCH.
  IF sy-subrc = 0.
    gw_warn-beskz = gw_marc_3-beskz."采购类型
    READ TABLE gt_eket_2 INTO gw_eket_2
         WITH  KEY ebeln = gw_ekko-ebeln ebelp = gw_ekko-ebelp
         BINARY 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_mbew
  WITH KEY matnr = gw_ekko-matnr bwkey = gw_ekko-werks
  BINARY SEARCH.
  IF sy-subrc = 0.
    gw_warn-vprsv = gw_mbew-vprsv. "价格控制
    gw_warn-beskz = 'X'.
    READ TABLE gt_eket_2 INTO gw_eket_2
      WITH  KEY ebeln = gw_ekko-ebeln ebelp = gw_ekko-ebelp
      BINARY 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.

猜你喜欢

转载自blog.csdn.net/weixin_45662838/article/details/122299703
今日推荐