有部分单元存在采购订单采购E件、X件的情况,导致入库时不是进入正常的原材料科目,导致财务科目数据异常。
通过进行采购订单监控的方式,进行定期检查,杜绝采购E件、X件的情况。
第一步,根据条件(工厂、采购订单创建日期),取出采购订单。
查询EKKO、EKPO表,查询出符合条件的采购订单,采购订单创建日期在EKKO~ AEDAT字段,需要关联EKKO、EKPO表进行取数。
第二步,根据上步的采购订单,进行进一步筛选。
根据第一步得到的采购订单信息,在MARC表中进行采购类型(BESKZ)选择,选择E、X类型的物料;
然后到MBEW表中查询物料的价格控制(VPRSV)字段。
当采购订单的物料为E,或者为X类型(价格控制字段为“S”),这两种情况下,为预警采购订单明细数据,显示给用户进行检查。
第三步,显示采购订单信息。
根据第二部得到的采购订单预警数据,进行进一步筛选。
显示采购订单明细信息时,需要显示采购订单的入库数量(EKET~WEMNG)数据,
如果选择已入库,则显示的采购订单为所有采购订单行均是入库数量 = 采购订单数量;
如果选择的是未清条件,则只要有一个采购订单行的入库数量 < 采购订单数量,认为是未清;
如果选择的是全部,则显示全部符合条件的采购订单明细
工厂:
采购订单创建日期:
采购订单号:
全部 已入库 未清
略
解决思路
ekko 为采购抬头表
ekpo 为采购采购明细表
marc 物料的工厂数据表
mbew 物料评估表
点击display——》实用程序——》表内容——》显示
点击执行全部
就可以看到表的内容。
另一个窗口
事务代码 “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.