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
格式,就是设计这个普通屏幕 长什么样子
来源:CSDN
作者:CharlieMC
链接:https://blog.csdn.net/charliefromkansas/article/details/50535739