SAP FICO发出商品报表分享
一、报表逻辑












二、报表界面



三、报表代码
*&---------------------------------------------------------------------*
*& 程序名: ZRPFI_021
*&
*&---------------------------------------------------------------------*
*& 创建者(公司)/日期:
*& 程序描述:
*& 1.发出商品报表
*& 2.
*&---------------------------------------------------------------------*
*& 版本/修改者(公司)/日期//修改描述
*&
*&
*&---------------------------------------------------------------------*
REPORT ZRPFI_021.
INCLUDE ZRPFI_021_TOP.
INCLUDE ZRPFI_021_LCL .
INCLUDE ZRPFI_021_F01 .
AT SELECTION-SCREEN OUTPUT.
PERFORM FRM_CHG_SCRN.
AT SELECTION-SCREEN.
"权限检查
* DATA: LV_MESSAGE TYPE STRING.
* AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
* ID 'BUKRS' FIELD PA_BUKRS.
* IF SY-SUBRC <> 0.
* LV_MESSAGE = '没有' && PA_BUKRS && '公司代码权限!'.
* MESSAGE LV_MESSAGE TYPE 'E'.
* ENDIF.
START-OF-SELECTION.
PERFORM FRM_CHECK_INPUT.
CASE 'X'.
WHEN PA_EXE.
PERFORM FRM_AUTHORITY USING '10'.
PERFORM FRM_GET_DATA_EXE.
WHEN OTHERS.
PERFORM FRM_AUTHORITY USING '03'.
PERFORM FRM_GET_DATA_REVNSRH.
ENDCASE.
PERFORM FRM_SHOW_ALV.
*&---------------------------------------------------------------------*
*& 包含 ZRPFI_021_TOP
*&---------------------------------------------------------------------*
TABLES:ACDOCA.
SELECTION-SCREEN:BEGIN OF BLOCK B01 WITH FRAME.
PARAMETERS:PA_BUKRS TYPE ACDOCA-RBUKRS OBLIGATORY .
SELECT-OPTIONS :SO_WERKS FOR ACDOCA-WERKS.
PARAMETERS:PA_GJAHR TYPE ACDOCA-GJAHR OBLIGATORY,
PA_POPER TYPE ACDOCA-POPER OBLIGATORY.
SELECTION-SCREEN:END OF BLOCK B01 .
SELECTION-SCREEN:BEGIN OF BLOCK B02 WITH FRAME.
PARAMETERS:PA_EXE TYPE C RADIOBUTTON GROUP G1 DEFAULT 'X' USER-COMMAND G1,
PA_REV TYPE C RADIOBUTTON GROUP G1,
PA_SRH TYPE C RADIOBUTTON GROUP G1.
SELECTION-SCREEN:END OF BLOCK B02 .
DATA:BEGIN OF GS_OUT,
STATUS TYPE C LENGTH 20, "红绿灯
MSG(100) TYPE C.
INCLUDE STRUCTURE ZTFI021 .
DATA: END OF GS_OUT.
DATA:GT_OUT LIKE TABLE OF GS_OUT,
GV_FIRSTDATE TYPE SY-DATUM,
GV_LASTDATE TYPE SY-DATUM, "输入期间最后一天
GV_NEXTDATE TYPE SY-DATUM. "输入期间最后一天+1
DATA: GR_TABLE TYPE REF TO CL_SALV_TABLE,
GR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE,
GR_COLUMN TYPE REF TO CL_SALV_COLUMN_TABLE,
GR_DISPLAY TYPE REF TO CL_SALV_DISPLAY_SETTINGS,
GR_LAYOUT TYPE REF TO CL_SALV_LAYOUT.
*&---------------------------------------------------------------------*
*& 包含 ZRPFI_021_LCL
*&---------------------------------------------------------------------*
CLASS L_CL_HANDLE_EVENTS DEFINITION.
PUBLIC SECTION.
METHODS: ON_USER_COMMAND FOR EVENT ADDED_FUNCTION OF CL_SALV_EVENTS_TABLE
IMPORTING E_SALV_FUNCTION.
METHODS: ON_CLICK FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE
IMPORTING ROW COLUMN.
ENDCLASS.
CLASS L_CL_HANDLE_EVENTS IMPLEMENTATION.
METHOD ON_USER_COMMAND.
PERFORM HANDLE_USER_COMMAND USING E_SALV_FUNCTION.
ENDMETHOD.
METHOD ON_CLICK.
PERFORM HANDLE_ON_CLICK USING ROW COLUMN.
ENDMETHOD.
ENDCLASS.
*&---------------------------------------------------------------------*
*& Form HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_SALV_FUNCTION
*&---------------------------------------------------------------------*
FORM HANDLE_USER_COMMAND USING E_SALV_FUNCTION.
CASE E_SALV_FUNCTION.
WHEN 'ZPOST'.
PERFORM FRM_CHECK_PERIOD.
CHECK SY-SUBRC EQ 0.
PERFORM FRM_ZPOST.
WHEN 'ZREV'.
PERFORM FRM_ZREVERSE.
ENDCASE.
GR_TABLE->REFRESH( ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form HANDLE_ON_CLICK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> ROW
*& --> COLUMN
*&---------------------------------------------------------------------*
FORM HANDLE_ON_CLICK USING P_ROW
P_COLUMN.
READ TABLE GT_OUT INTO GS_OUT INDEX P_ROW.
IF SY-SUBRC EQ 0.
IF P_COLUMN EQ 'VBELN' AND GS_OUT-VBELN IS NOT INITIAL.
SET PARAMETER ID 'VL' FIELD GS_OUT-VBELN.
CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.
ENDIF.
IF P_COLUMN EQ 'ZZXPZ' AND GS_OUT-ZZXPZ IS NOT INITIAL.
SET PARAMETER ID 'BLN' FIELD GS_OUT-ZZXPZ.
SET PARAMETER ID 'BUK' FIELD GS_OUT-BUKRS.
SET PARAMETER ID 'GJR' FIELD GS_OUT-ZZXPZND.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDIF.
IF P_COLUMN EQ 'ZFXPZ' AND GS_OUT-ZFXPZ IS NOT INITIAL.
SET PARAMETER ID 'BLN' FIELD GS_OUT-ZFXPZ.
SET PARAMETER ID 'BUK' FIELD GS_OUT-BUKRS.
SET PARAMETER ID 'GJR' FIELD GS_OUT-ZFXPZND.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& 包含 ZRPFI_021_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_INPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_check_input .
DATA:lv_last TYPE sy-datum, "上个月最后一天
lv_now TYPE sy-datum,
lv_date TYPE sy-datum. "本月第一天
DATA:lv_msg TYPE string.
IF pa_srh IS INITIAL .
lv_now+0(6) = sy-datum+0(6).
lv_now+6(2) = '01'.
lv_last = lv_now - 1.
IF NOT ( ( pa_poper EQ lv_last+4(2) AND pa_gjahr EQ lv_last+0(4) ) OR
( pa_poper EQ lv_now+4(2) AND pa_gjahr EQ lv_now+0(4) ) ).
MESSAGE '“执行”按钮只允许的年度期间为实际操作当月或上月,其他月份请勾选“查询”按钮查询'
TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
IF pa_rev IS NOT INITIAL."冲销只检查区间
REFRESH:so_werks.
RETURN.
ENDIF.
SELECT SINGLE * FROM ztfi021 INTO @DATA(lt_ztfi021)
WHERE zbukrs = @pa_bukrs
AND zgjahr = @pa_gjahr
AND zpoper = @pa_poper
AND zdelete = ''.
IF sy-subrc EQ 0.
CLEAR:lv_msg .
CONCATENATE '公司代码:' pa_bukrs ' 年度:' pa_gjahr ' 期间:'
pa_poper '数据已存在,请查询或者冲销后重新执行'
INTO lv_msg.
MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
lv_date = pa_gjahr && pa_poper+1(2) && '01'.
CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
EXPORTING
day_in = lv_date
IMPORTING
last_day_of_month = gv_lastdate
EXCEPTIONS
day_in_no_date = 1
OTHERS = 2.
gv_nextdate = gv_lastdate + 1.
gv_firstdate = gv_lastdate+0(6) && '01'.
ENDIF.
REFRESH:gt_out.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA_EXE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data_exe .
RANGES:ra_vstel FOR likp-vstel.
SELECT a~vstel AS low,
'EQ' AS option,
'I' AS sign
FROM tvswz AS a
INNER JOIN t001w AS b ON a~werks = b~werks
INNER JOIN t001k AS c ON b~bwkey = c~bwkey
WHERE bukrs = @pa_bukrs
INTO CORRESPONDING FIELDS OF TABLE @ra_vstel.
IF ra_vstel[] IS INITIAL.
MESSAGE '无符合条件数据'
TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
SELECT a~vbeln,a~posnr,
b~lfart,
b~wadat_ist FROM lips AS a
INNER JOIN likp AS b ON a~vbeln = b~vbeln
WHERE b~gbstk IN ( 'A','B' )
AND b~vstel IN @ra_vstel
AND wbstk = 'C'
AND wadat_ist LE @gv_lastdate
UNION
SELECT vgbel AS vbeln,
vgpos AS posnr,
b~lfart,
b~wadat_ist FROM vbrp AS a
INNER JOIN likp AS b ON a~vgbel = b~vbeln
WHERE gbstk_ana = 'A'
AND b~vstel IN @ra_vstel
AND wadat_ist LE @gv_lastdate
