SAP MM采购对账功能分享
一、功能逻辑
二、功能展示
三、功能代码
*&---------------------------------------------------------------------*
*& Report ZRPMM0032
*&---------------------------------------------------------------------*
*& 采购对账功能
*& 20241101
*& xiaoweihua
*&
*&---------------------------------------------------------------------*
REPORT zrpmm0034.
TABLES: sscrfields,ekko,ekpo,marc,mseg.
INCLUDE fbgenmac.
*&---------------------------------------------------------------------*
*& 数据类型
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_alv," 建一个内表保存数据 (需要展示的数据)
zbox TYPE c, "序号
bukrs TYPE bukrs, "公司代码
ekorg TYPE ekorg, "采购组织
ekgrp TYPE ekgrp, "采购组
eknam TYPE t024-eknam, "采购组名称 "
lifnr TYPE lifnr, "供应商
name1 TYPE name1, "供应商名称
ebeln TYPE ebeln, "采购凭证编号
ebelp TYPE ebelp, "采购凭证行项目编号
matnr TYPE matnr, "物料编码
txz01 TYPE ekpo-txz01, "物料名称
menge TYPE bstmg, "订单数量
netpr TYPE netpr, "订单净价
peinh TYPE peinh, "价格单位
meins TYPE meins, "订单单位
mwskz TYPE ekpo-mwskz, "税码
kbetr TYPE kbetr, "税率
text1 TYPE t007s-text1, "税码描述
waers TYPE waers, "订单货币
mblnr TYPE mblnr, "物料凭证号
zeile TYPE mblpo, "物料凭证行项目
bwart TYPE bwart, "移动类型
budat_mkpf TYPE sy-datum, "过账日期
wemng TYPE wemng, "收货数量
zwsdj(16) TYPE p DECIMALS 6, "未税单价
wewrt TYPE wewrt, "收货金额(未税)
zhsdj(16) TYPE p DECIMALS 6, "含税单价
zshjehs TYPE acgl_item-wrbtr, "收货金额(含税)
zzse TYPE acgl_item-wrbtr, "总税额
zzyzsl TYPE wemng, "总发票数量
zzyzje TYPE acgl_item-wrbtr, "总发票金额
zse TYPE acgl_item-wrbtr, "税额
zyzsl TYPE wemng, "发票数量
zyzje TYPE acgl_item-wrbtr, "发票金额
zykpsl TYPE wemng, "已开票数量
zwkpsl TYPE wemng, "未开票数量
gjahr TYPE rbkp-gjahr, "会计年度
bldat TYPE rbkp-bldat, "凭证中的凭证日期
budat TYPE rbkp-budat, "凭证中的过帐日期
xrech TYPE rbkp-xrech, "凭证状态
inv_tran TYPE rbkp-inv_tran , "事务
blart TYPE rbkp-blart, "凭证类型
kostl TYPE vfkn-kostl, "成本中心
xmwst TYPE rbkp-xmwst, "计算税额标识
wmwst TYPE fwstev, "税额
hkont TYPE acgl_item-hkont, "总账科目
shkzg TYPE acgl_item-shkzg, "借/贷标识
wrbtr TYPE acgl_item-wrbtr, "凭证货币金额
zterm TYPE ekko-zterm, "付款条件
zterm_t TYPE char60, "付款条件描述
anln1 TYPE ekkn-anln1, "资产编号
zthbs TYPE c, "退货标识
msgtx TYPE char255, "返回消息
field_style TYPE lvc_t_styl, "控制字段可编辑的参数
bprme TYPE ekpo-bprme,
infnr TYPE ekpo-infnr,
znum TYPE wemng,
END OF ty_alv.
TYPES:BEGIN OF ty_ftaxp,
mwskz TYPE mwskz.
INCLUDE STRUCTURE ftaxp.
TYPES END OF ty_ftaxp.
DATA: lt_ftaxp TYPE TABLE OF ftaxp,
ls_ftaxp TYPE ftaxp.
*&---------------------------------------------------------------------*
*& 结构 内表
*&---------------------------------------------------------------------*
DATA:gt_alv TYPE TABLE OF ty_alv,
gs_alv TYPE ty_alv.
*----------------------------------------------------------------------*
* ALV层级关系定义
*----------------------------------------------------------------------*
DATA: gs_layout TYPE lvc_s_layo, "ALV 控制: 布局结构
gt_fieldcat TYPE lvc_t_fcat, "字段目录
gs_fieldcat TYPE lvc_s_fcat,
gv_repid TYPE repid. "当前程序名
DATA: gr_grid TYPE REF TO cl_gui_alv_grid, "用于绑定ALV事件
gs_stbl TYPE lvc_s_stbl. "用于列稳定刷新
DATA: gt_event TYPE slis_t_event WITH HEADER LINE.
DATA: gt_ddval TYPE lvc_t_drop, "存下拉列表
gs_ddval TYPE lvc_s_drop.
DATA: gs_style TYPE lvc_s_styl.
*&---------------------------------------------------------------------*
*& 选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-t01.
SELECT-OPTIONS: s_werks FOR marc-werks. "NO-EXTENSION NO INTERVALS
SELECT-OPTIONS: s_lifnr FOR ekko-lifnr.
SELECT-OPTIONS: s_ekorg FOR ekko-ekorg.
SELECT-OPTIONS: s_ekgrp FOR ekko-ekgrp.
SELECT-OPTIONS: s_matnr FOR ekpo-matnr.
SELECT-OPTIONS: s_ebeln FOR ekpo-ebeln.
SELECT-OPTIONS: s_ebelp FOR ekpo-ebelp.
SELECT-OPTIONS: s_budat FOR mseg-budat_mkpf.
PARAMETERS: p_srm TYPE c AS CHECKBOX. "SRM供应商对账
PARAMETERS: p_dis TYPE c AS CHECKBOX. "查看
SELECTION-SCREEN: END OF BLOCK blk1.
AT SELECTION-SCREEN OUTPUT.
AT SELECTION-SCREEN.
START-OF-SELECTION.
PERFORM frm_get_data.
PERFORM frm_init_layout.
PERFORM frm_init_fieldcat.
PERFORM frm_display_alv.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data.
FIELD-SYMBOLS:<fs_alv_temp> TYPE ty_alv.
SELECT ekorg,ekgrp,ekko~lifnr,ekko~ebeln,
ebelp,matnr,menge,netpr,ekko~bukrs,
peinh,meins,ekpo~mwskz,waers,
txz01,name1,knttp,zterm,ekpo~infnr,ekpo~bprme
"mblnr,zeile,budat_mkpf,wemng,wewrt
FROM ekko
LEFT JOIN ekpo
ON ekko~ebeln = ekpo~ebeln
LEFT JOIN but000
ON ekko~lifnr = but000~partner
LEFT JOIN lfa1
ON ekko~lifnr = lfa1~lifnr
INTO TABLE @DATA(gt_ekko)
WHERE ekpo~werks IN @s_werks
AND ekko~lifnr IN @s_lifnr
AND ekorg IN @s_ekorg
AND ekgrp IN @s_ekgrp
AND matnr IN @s_matnr
AND ekko~ebeln IN @s_ebeln
AND ebelp IN @s_ebelp
AND pstyp <> '2' "排除寄售项目
AND zsrm_supplier = @p_srm "SRM供应商对账
.
IF gt_ekko IS NOT INITIAL.
SELECT ekbe~ebeln,ekbe~ebelp,ekbe~zekkn,
vgabe,ekbe~gjahr,ekbe~belnr,ekbe~menge,
ekbe~wrbtr AS wewrt,mseg~mblnr,mseg~zeile,mseg~mjahr,
mseg~erfmg AS wemng,mseg~dmbtr,budat_mkpf,mseg~bwart,
mseg~lfbnr,mseg~lfpos,mseg~lfbja,mseg~shkzg,mseg~erfme,
mseg~SJAHR,mseg~SMBLN,mseg~SMBLP
FROM ekbe
INNER JOIN mseg
ON ekbe~belnr = mseg~mblnr AND ekbe~buzei = mseg~zeile
INTO TABLE @DATA(lt_ekbe)
FOR ALL ENTRIES IN @gt_ekko
WHERE ekbe~ebeln = @gt_ekko-ebeln
AND ekbe~ebelp = @gt_ekko-ebelp
AND vgabe = '1' .
SELECT ebeln,ebelp,zekkn,anln1
FROM ekkn
INTO TABLE @DATA(lt_ekkn)
FOR ALL ENTRIES IN @gt_ekko
WHERE ekkn~ebeln = @gt_ekko-ebeln
AND ekkn~ebelp = @gt_ekko-ebelp
AND loekz <> 'X'.
"解决存在被冲销凭证不在用户前台界面选择的范围内过滤不掉被冲销的凭证 --hps20250925
IF lt_ekbe IS NOT INITIAL.
"被冲销单据
SELECT * FROM m_mbmps
INTO TABLE @DATA(lt_mbmps)
FOR ALL ENTRIES IN @lt_ekbe
WHERE m_mbmps~sjahr = @lt_ekbe-gjahr
AND m_mbmps~smbln = @lt_ekbe-mblnr
AND m_mbmps~smblp = @lt_ekbe-zeile.
ENDIF.
IF lt_ekbe[] IS NOT INITIAL.
SELECT rseg~belnr,rseg~gjahr,rseg~buzei,menge,
lfbnr,lfpos,lfgja,ivtyp,rbkp~bldat,rbkp~budat
FROM rseg
LEFT OUTER JOIN rbkp
ON rbkp~belnr = rseg~belnr AND rbkp~gjahr = rseg~gjahr
INTO TABLE @DATA(lt_rseg)
FOR ALL ENTRIES IN @lt_ekbe
WHERE lfbnr = @lt_ekbe-mblnr
AND lfpos = @lt_ekbe-zeile
AND lfgja = @lt_ekbe-gjahr
* AND ivtyp = ''.
.
ENDIF.
ENDIF.
"取描述
SELECT ekgrp,eknam FROM t024 INTO TABLE @DATA(lt_t024).
SELECT mwskz,text1 FROM t007s INTO TABLE @DATA(lt_t007s) WHERE spras = @sy-langu AND kalsm = 'TAXCN'.
SELECT *
FROM t052u
INTO TABLE @DATA(lt_t052u)
WHERE spras = @sy-langu.
SELECT *
FROM eina
INTO TABLE @DATA(LT_eina)
.
DATA:gs_alv TYPE ty_alv.
LOOP AT gt_ekko INTO DATA(gs_ekko).
CLEAR gs_alv.
* READ TABLE lt_eina
* INTO DATA(ls_eina)
* WITH KEY infnr = gs_ekko-infnr.
* IF sy-subrc = 0.
* IF ls_eina-lmein <> gs_ekko-bprme.
* gs_ekko-meins = gs_ekko-bprme .
* gs_ekko-menge = gs_ekko-menge / ls_eina-umrez.
* ENDIF.
* ENDIF.
MOVE-CORRESPONDING gs_ekko TO gs_alv.
AUTHORITY-CHECK OBJECT 'M_BEST_EKG'
ID 'ACTVT' FIELD '03'
ID 'EKGRP' FIELD gs_alv-ekgrp.
IF sy-subrc <> 0 .
CONTINUE.
ENDIF.
"采购组描述
READ TABLE lt_t024 INTO DATA(ls_t024) WITH KEY ekgrp = gs_alv-ekgrp.
IF sy-subrc = 0.
gs_alv-eknam = ls_t024-eknam.
ENDIF.
"税码
READ TABLE lt_t007s INTO DATA(ls_t007s) WITH KEY mwskz = gs_alv-mwskz.
IF sy-subrc = 0.
gs_alv-text1 = ls_t007s-text1.
ENDIF.
"赋值给默认值
gs_alv-gjahr = sy-datum+0(4).
gs_alv-bldat = sy-datum.
gs_alv-budat = sy-datum.
gs_alv-xrech = 'A'.
gs_alv-inv_tran = '1'.
gs_alv-blart = 'RE'.
gs_alv-xmwst = 'X'.
gs_alv-wmwst = gs_alv-zse.
gs_alv-hkont = '8000160000'.
gs_alv-shkzg = 'H'.
gs_alv-wrbtr = 0.
READ TABLE lt_t052u
INTO DATA(lwa_t052u)
WITH KEY zterm = gs_alv-zterm.
IF sy-subrc = 0.
gs_alv-zterm_t = lwa_t052u-text1 .
ENDIF.
"资产编号
READ TABLE lt_ekkn INTO DATA(ls_ekkn) WITH KEY ebeln = gs_alv-ebeln ebelp = gs_alv-ebelp.
IF sy-subrc = 0.
gs_alv-anln1 = ls_ekkn-anln1.
ENDIF.
CLEAR:lt_ftaxp.
"税率转换
CALL FUNCTION 'GET_TAX_PERCENTAGE'
EXPORTING
aland = 'CN'
datab = sy-datum
mwskz = gs_alv-mwskz
txjcd = '*'
* EXPORT = ' '
TABLES
t_ftaxp = lt_ftaxp.
READ TABLE lt_ftaxp INTO ls_ftaxp INDEX 1.
IF sy-subrc = 0.
gs_alv-kbetr = ( 1 + ls_ftaxp-kbetr / 1000 ).
ENDIF.
LOOP AT lt_ekbe INTO DATA(ls_ekbe) WHERE ebeln = gs_alv-ebeln