SAP PP生产退料单功能分享
一、功能逻辑








二、功能界面


三、功能代码
*&---------------------------------------------------------------------*
*& 程序名: ZRPPP_0011
*& 创建者(公司)/日期:*
*& 程序描述:
*&
*&---------------------------------------------------------------------*
*& 版本/修改者(公司)/日期//修改描述
*&
*&---------------------------------------------------------------------*
REPORT zrppp_0011.
INCLUDE zrppp_0011_top.
INCLUDE zrppp_0011_scr.
INCLUDE zrppp_0011_frm.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_zid-low.
PERFORM show_values.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_zid-high.
PERFORM show_values1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_ztlnum-low.
PERFORM show_values2.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_ztlnum-high.
PERFORM show_values3.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_kostl-low.
PERFORM show_values4.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_kostl-high.
PERFORM show_values5.
INITIALIZATION.
DATA itab_list TYPE vrm_values.
itab_list = VALUE #(
( key = '0' text = '已创建' )
( key = '1' text = '已过账' )
).
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'ZZT'
values = itab_list.
REFRESH itab_list.
START-OF-SELECTION.
CLEAR:actvt_01,actvt_02,actvt_03,actvt_04.
AUTHORITY-CHECK OBJECT 'ZLLD'
ID 'ACTVT' FIELD '01'."创建退料单
IF sy-subrc EQ 0.
actvt_01 = 'X'.
ENDIF.
AUTHORITY-CHECK OBJECT 'ZLLD'
ID 'ACTVT' FIELD '04'."打印退料单
IF sy-subrc EQ 0.
actvt_02 = 'X'.
ENDIF.
AUTHORITY-CHECK OBJECT 'ZLLD'
ID 'ACTVT' FIELD '06'."删除退料单
IF sy-subrc EQ 0.
actvt_03 = 'X'.
ENDIF.
AUTHORITY-CHECK OBJECT 'ZLLD'
ID 'ACTVT' FIELD '10'."退料单过账及冲销
IF sy-subrc EQ 0.
actvt_04 = 'X'.
ENDIF.
PERFORM get_dat.
PERFORM alv.
*&---------------------------------------------------------------------*
*& 包含 ZRPPP_0011_TOP
*&---------------------------------------------------------------------*
TABLES:resb,ztpp010_head.
DATA:BEGIN OF gt_item OCCURS 0,
aufnr TYPE resb-aufnr,
rsnum TYPE resb-rsnum,
rspos TYPE resb-rspos,
matnr TYPE resb-matnr,
maktx TYPE maktx,
werks TYPE resb-werks,
lgort TYPE resb-lgort,
bdmng TYPE resb-bdmng,
meins TYPE resb-meins,
enmng TYPE resb-enmng,
enmng1 TYPE resb-enmng, "退料数量
zid TYPE ernam,
arbpl TYPE arbpl,
kostl TYPE kostl,
ltext TYPE kltxt,
ztlnum TYPE zbfnum,
zrspos TYPE zrspos,
erdat TYPE erdat,
uzeit TYPE uzeit,
loekz TYPE ztpp010-loekz,
ztxt1(40),"抬头物料文本
ztxt2(40),"备注
ztxt4 TYPE num,
mark ,"TYPE check_box,
matnr01 TYPE resb-matnr,
maktx01 TYPE maktx,
mblnr TYPE mblnr,
zmptp(3),"凭证类型
statu(1),
enmng2 TYPE resb-enmng, "已创建未过账退料数量
END OF gt_item.
"F4帮助
DATA:BEGIN OF gt_name OCCURS 0,"用户ID
ernam TYPE ekko-ernam,
name_last TYPE adrp-name_last,
END OF gt_name,
BEGIN OF gt_ztldh OCCURS 0,
ztlnum TYPE ztpp010_head-ztlnum,
erdat TYPE ztpp010_head-erdat,
zid TYPE ztpp010_head-zid,
werks TYPE ztpp010_head-werks,
END OF gt_ztldh,
BEGIN OF gt_cskt OCCURS 0,
kokrs TYPE cskt-kokrs,
kostl TYPE cskt-kostl,
ltext TYPE cskt-ltext,
datbi TYPE cskt-datbi,
END OF gt_cskt.
TYPE-POOLS:icon,slis.
"alv参数
DATA:it_fieldcat TYPE slis_t_fieldcat_alv,
wa_fieldcat LIKE LINE OF it_fieldcat,
is_layout TYPE lvc_s_layo,
is_fact TYPE lvc_s_fcat,
it_layout TYPE slis_layout_alv.
CONSTANTS cns_user_command TYPE slis_formname VALUE 'ALV_USER_COMMAND'.
"打印参数
DATA:g_fm_name TYPE rs38l_fnam,
gw_options TYPE ssfcompop,
gw_control TYPE ssfctrlop.
DATA i_grid_title TYPE lvc_title.
DATA:job_output_info TYPE ssfcrescl,
errtab TYPE tsferror.
"ALV 相关变量定义
DATA:lt_fcat TYPE lvc_t_fcat,
ls_layo TYPE lvc_s_layo.
DATA:is_grid_settings TYPE lvc_s_glay.
DATA :gs_ztpp010 TYPE ztpp010_head,
gt_ztpp010 TYPE TABLE OF ztpp010 WITH HEADER LINE.
DATA:gs_out TYPE zspp008,
gt_out TYPE TABLE OF zspp008.
"权限控制
DATA:actvt_01 TYPE c, "创建
actvt_02 TYPE c, "打印
actvt_03 TYPE c, "删除
actvt_04 TYPE c. "过账
"退料过账
DATA:goodsmvt_header TYPE TABLE OF bapi2017_gm_head_01 WITH HEADER LINE.
DATA:goodsmvt_code TYPE TABLE OF bapi2017_gm_code WITH HEADER LINE.
DATA:goodsmvt_item TYPE TABLE OF bapi2017_gm_item_create WITH HEADER LINE .
DATA:goodsmvt_headret TYPE TABLE OF bapi2017_gm_head_ret WITH HEADER LINE.
DATA:materialdocument TYPE bapi2017_gm_head_ret-mat_doc.
DATA:goodsmvt_serialnumber TYPE TABLE OF bapi2017_gm_serialnumber WITH HEADER LINE.
DATA:return TYPE TABLE OF bapiret2 WITH HEADER LINE.
DATA:l_mblnr TYPE mseg-mblnr.
DATA:l_labst TYPE mard-labst. "已领料数
DATA:l_lgort TYPE lgort_d."库存地
*&---------------------------------------------------------------------*
*& 包含 ZRPPP_0011_SCR
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK t1 WITH FRAME TITLE TEXT-001.
PARAMETERS:r1 RADIOBUTTON GROUP r1 USER-COMMAND cmd DEFAULT 'X',
r2 RADIOBUTTON GROUP r1,
r3 RADIOBUTTON GROUP r1..
SELECTION-SCREEN END OF BLOCK t1.
SELECTION-SCREEN BEGIN OF BLOCK t2 WITH FRAME TITLE TEXT-002.
SELECT-OPTIONS:p_werks FOR resb-werks MODIF ID g2.
PARAMETERS: p_ztlnum TYPE ztpp010_head-ztlnum MODIF ID g4,
p_aufnr TYPE resb-aufnr MODIF ID g3.
SELECT-OPTIONS:s_aufnr FOR resb-aufnr MODIF ID g2,
s_ztlnum FOR ztpp010_head-ztlnum MODIF ID g2,
s_erdat FOR ztpp010_head-erdat MODIF ID g2,
s_matnr FOR resb-matnr MODIF ID g2,
s_zid FOR ztpp010_head-zid MODIF ID g2,
s_kostl FOR ztpp010_head-kostl MODIF ID g2.
PARAMETERS:zzt TYPE char10 DEFAULT '0' AS LISTBOX VISIBLE LENGTH 15 MODIF ID g2 .
PARAMETERS:cx AS CHECKBOX MODIF ID g2.
PARAMETERS p_date TYPE sy-datum DEFAULT sy-datum MODIF ID g4.
SELECTION-SCREEN END OF BLOCK t2.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF r1 = 'X'.
IF screen-group1 = 'G2' OR screen-group1 = 'G4' .
screen-active = 0.
ENDIF.
ELSEIF r2 = 'X'.
IF screen-group1 = 'G3' OR screen-group1 = 'G4'.
screen-active = 0.
ENDIF.
ELSEIF r3 = 'X'.
IF screen-group1 = 'G3' OR screen-group1 = 'G2' .
screen-active = 0.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
*&---------------------------------------------------------------------*
*& 包含 ZRPPP_0011_FRM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form get_dat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_dat .
DATA:gt_resb TYPE TABLE OF resb WITH HEADER LINE,
gt_makt TYPE TABLE OF makt WITH HEADER LINE.
DATA:l_arbpl TYPE arbpl,
l_kostl TYPE kostl,
l_ltext TYPE kltxt.
DATA:BEGIN OF gt_afpo OCCURS 0,
aufnr TYPE afpo-aufnr,
matnr TYPE afpo-matnr,
maktx TYPE makt-maktx,
zzxmbm TYPE ztmm_marc-zzxmbm,
zzkwbm TYPE ztmm_mara-zzkwbm,
END OF gt_afpo.
DATA:BEGIN OF temp OCCURS 0,
ztlnum TYPE zbfnum,
zrspos TYPE zrspos,
rsnum TYPE rsnum,
rspos TYPE rspos,
enmng1 TYPE enmng,
END OF temp.
DATA:order_objects TYPE bapi_pp_order_objects,
return TYPE bapiret2,
operation TYPE TABLE OF bapi_order_operation1 WITH HEADER LINE.
IF r1 = 'X'.
i_grid_title = '退料单-创建'.
ELSEIF r2 = 'X'.
i_grid_title = '退料单-浏览'.
ELSEIF r3 = 'X'.
i_grid_title = '退料单-过账'.
ENDIF.
IF r1 = 'X'.
IF p_aufnr IS
