【MM】模块中abap编程,统计入库金额和订单金额

守給你的承諾、 提交于 2019-11-28 08:59:20

1.要求

做一个报表,用屏幕显示,统计所有采购组--DISPO中,按照DISPO来统计,统计每一个DISPO下,选定时间范围内,入库了多少钱,订单有多少钱

然后双击统计出来的结果的表中的总额,可以弹出一个窗体,列出该总额对应的明细。

2.知识点

在MM中,此要求涉及三方面内容,入库,订单,MD04  。入库指的是已经确定发生的,货物不但已经订购,签了合同,而且已经送到了公司,发生了入库,相关人员已经维护了数据的。

入库 

MSEG  凭证段:物料      物料号   BWART   移动类型   SOBKZ 特殊库存标识    EBELN采购凭证号  MBLNR物料凭证号  MENGE入库的数量  MENGE入库金额

MKPF 抬头:物料凭证  BUDAT 凭证中的过账日期

MARC  物料的工厂数据  DISPO  MRP控制者

在上述表中,对本问题有影响的主要是  BWART移动类型


订单

EKET  计划协议 计划行    此表用于记录  某物料的每一个 交货计划行

EKPO 采购凭证项目  一个物料MATNR对应多个采购凭证EBELN,一个采购凭证EBELN对应多个计划行EKET

订单部分,我们需要获取,交货日期在指定时间范围内,的所有交货计划,得到数目,然后用物料号 获取 商业价格1 计算出 预计订单金额的总额。


预测金额

相当于运行MD04 查看某一个物料的  需求与订货情况

比如 在这一个月中

PO项目(已经变成订单的) 中 有100个

需求200个

那么你虽然没有下订单,但是你必须要买的就有200 - 100个  这部分钱是必须要花的,所以,虽然你还没有花,也视作你已经花了

计算这部分数量和金额  需要使用方法  CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'

上述内容,就是本次计算的描述

本质就是  商业价格1 *  数量 = 标准价格金额   ,在入库中可以计算出  实际入库金额  ,用 入库实际金额 -  入库标准价金额 = 节约的金额

我们称之为 合理化金额

下面上代码看看 

 CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
        EXPORTING
          PLSCN                    = '000'
          MATNR                    =  ITAB_FENGX-MATNR
          WERKS                    = '1000'
        TABLES
*          MDPSX                   = ITAB_MDPSX   "MRP凭证中的项目
          MDEZX                    = ITAB_MDEZX   "MRP要素的个别行
*          MDSUX                   = ITAB_MDSUX   "MRP元素全部的行
        EXCEPTIONS
          MRP_LIST_NOT_FOUND       = 1
          MATERIAL_PLANT_NOT_FOUND = 2
          ERROR                    = 3
          OTHERS                   = 4.

上述代码用来开MD04  ,开某一个物料的MD04还好,如果LOOP循坏开所有物料,一个一个开MD04,真的会很慢,估计5分钟左右

下述代码用来获取订单的信息

       SELECT  EKET~EBELN       
               EKET~MENGE       
               EKET~EINDT       
               EKET~EBELP      
               EKET~ETENR       
               EKPO~MATNR       
               MARC~DISPO       
*               
*              
               MBEW~PEINH      
               MBEW~BWPRH       
*              
          FROM EKET
          INNER JOIN EKPO
          ON EKPO~EBELN EQ EKET~EBELN AND EKPO~EBELP EQ EKET~EBELP
          INNER JOIN MARC
          ON EKPO~MATNR EQ MARC~MATNR
          INNER JOIN MBEW
          ON MBEW~MATNR EQ MARC~MATNR
          INTO CORRESPONDING FIELDS OF TABLE ITAB_MARC
          WHERE ************
          AND MARC~DISPO IN P_DISPO.

下述代码用于获取入库的信息

SELECT   MSEG~MATNR       
         MSEG~BWART       
         MSEG~SOBKZ      
         MSEG~EBELN       
         MSEG~DMBTR      
         MSEG~MENGE       
         MARC~DISPO       
         MKPF~BUDAT       
         MSEG~LGORT       
         MKPF~MBLNR
    FROM MSEG
   INNER JOIN MKPF ON
         MKPF~MBLNR = MSEG~MBLNR    
   INNER JOIN MARC ON
         MARC~MATNR = MSEG~MATNR
    INTO CORRESPONDING FIELDS OF TABLE ITAB_MSEG
   WHERE MKPF~BUDAT GE YMSTR2
         ORDER BY MSEG~MATNR.

   下面代码用于获取商业价格1

SELECT  MBEW~MATNR       
             MBEW~BWPRH      
             MBEW~PEINH      
        FROM MBEW
        INTO CORRESPONDING FIELDS OF TABLE ITAB_MBEW
       WHERE *******************

4.代码的结构

这是一个report,用SE80创建代码部分,用SE38创建其中的文本(中文内容与字符串名的对应)

report 

运行过程是这样的,report的入口是 START-OF-SELECTION 程序一运行,马上运行这个部分

START-OF-SELECTION.
  PERFORM FRM_GETDATA.

END-OF-SELECTION.
  PERFORM FRM_PRINT.

上述代码中就是 一个代码块 名为 FRM_GETDATA

这个代码块 主要的工作有两个

1是使用SELECT语句从透明表(硬盘)获取数据 整理到预先定义好的内表(内存)中

2是CALL SCREEN ****    也就是呼唤之前定义的“普通屏幕” 

在abap代码中,屏幕被呼唤CALL  意味着三件事:1执行该屏幕的PBO 2.显示该屏幕  3.执行该屏幕的PAI

先看一下如何定义一个屏幕

在SE80中 在你的程序中,在程序名上右键  create  屏幕 

每一个屏幕的维护窗口上,都可以通过一个按钮LAYOUT进入该屏幕的 视觉直观设计器   我们这个程序  使用且只使用一个控件   “定制控制”

下图就是一个屏幕的主要内容  逻辑流  和 格式   

逻辑流 就是PBO和PAI

格式,就是设计这个普通屏幕 长什么样子











标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!