REPORT z_rep.
TABLES bkpf.
TABLES bseg.
TYPE-POOLS slis.
DATA gt_out TYPE TABLE OF zsrep_alv.
DATA gs_alv TYPE zs_alv.
DATA gv_budat TYPE zsrep_alv-budat.
FIELD-SYMBOLS
**********************************************************************
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-bl1.
PARAMETERS p_bukrs TYPE bkpf-bukrs OBLIGATORY MEMORY ID buk.
PARAMETERS p_spmon TYPE spmon OBLIGATORY MEMORY ID spm.
PARAMETERS p_gl_k TYPE bseg-hkont OBLIGATORY MEMORY ID glk.
PARAMETERS p_gl_d TYPE bseg-hkont OBLIGATORY MEMORY ID gld.
PARAMETERS p_blart TYPE bkpf-blart OBLIGATORY MEMORY ID blr.
SELECT-OPTIONS s_matnr FOR bseg-matnr.
SELECT-OPTIONS s_werks FOR bseg-werks.
SELECTION-SCREEN END OF BLOCK bl1.
**********************************************************************
START-OF-SELECTION.
**********************************************************************
PERFORM select_data.
**********************************************************************
END-OF-SELECTION.
**********************************************************************
IF gt_out[] IS INITIAL.
MESSAGE 'No data for selection conditions' TYPE 'S'.
EXIT.
ENDIF.
PERFORM display_data.
**********************************************************************
*&---------------------------------------------------------------------*
*& Form SELECT_DATA
*&---------------------------------------------------------------------*
* Select data
*----------------------------------------------------------------------*
FORM select_data .
RANGES lr_budat FOR bkpf-budat.
lr_budat-sign = 'I'.
lr_budat-option = 'BT'.
CALL FUNCTION 'OIUREP_MONTH_FIRST_LAST'
EXPORTING
i_month = p_spmon+4(2)
i_year = p_spmon(4)
IMPORTING
e_first_day = lr_budat-low
e_last_day = lr_budat-high
EXCEPTIONS
OTHERS = 1.
APPEND lr_budat.
gv_budat = lr_budat-high.
CLEAR gt_out[].
* Select open items
SELECT *
INTO CORRESPONDING FIELDS OF TABLE gt_out
FROM bsis
WHERE bukrs EQ p_bukrs
AND hkont EQ p_gl_k
AND gjahr EQ p_spmon(4)
AND budat IN lr_budat
AND werks IN s_werks.
* Get add data from BSEG
LOOP AT gt_out ASSIGNING .
* Check Cancel docs
SELECT SINGLE belnr
INTO -belnr
FROM bkpf
WHERE bukrs EQ -bukrs
AND belnr EQ -belnr
AND gjahr EQ -gjahr
AND stblg NE ''.
IF sy-subrc EQ 0.
DELETE gt_out.
CONTINUE.
ENDIF.
* Check material
SELECT SINGLE matnr
INTO -matnr
FROM bseg
WHERE bukrs EQ -bukrs
AND belnr EQ -belnr
AND gjahr EQ -gjahr
AND buzei EQ -buzei.
IF NOT -matnr IN s_matnr.
DELETE gt_out.
CONTINUE.
ENDIF.
* Change sign by SHKZG
IF -shkzg EQ 'H'.
-dmbtr = - -dmbtr.
-wrbtr = - -wrbtr.
ENDIF.
ENDLOOP.
*
ENDFORM. " SELECT_DATA
*&---------------------------------------------------------------------*
*& Form DISPLAY_DATA
*&---------------------------------------------------------------------*
* Output
*----------------------------------------------------------------------*
FORM display_data .
DATA ls_layout TYPE lvc_s_layo.
ls_layout-cwidth_opt = 'X'.
ls_layout-box_fname = 'CBOX'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-cprog
i_callback_pf_status_set = 'CALLBACK_PF_STATUS_SET'
i_callback_user_command = 'CALLBACK_USER_COMMAND'
i_structure_name = 'ZSREP_ALV'
is_layout_lvc = ls_layout
i_save = 'A'
TABLES
t_outtab = gt_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " DISPLAY_DATA
*&---------------------------------------------------------------------*
*& Form CALLBACK_USER_COMMAND
*&---------------------------------------------------------------------*
* User command
*----------------------------------------------------------------------*
FORM callback_user_command USING command LIKE sy-ucomm
selfield TYPE slis_selfield.
CASE command.
**********************************************************************
WHEN '&IC1'. " Double click
**********************************************************************
READ TABLE gt_out ASSIGNING INDEX selfield-tabindex.
CHECK sy-subrc EQ 0.
CASE selfield-fieldname.
WHEN 'BELNR' OR 'BELNR_CLR'.
IF selfield-fieldname EQ 'BELNR'.
SET PARAMETER ID 'BLN' FIELD -belnr.
ELSE.
SET PARAMETER ID 'BLN' FIELD -belnr_clr.
ENDIF.
SET PARAMETER ID 'BUK' FIELD -bukrs.
SET PARAMETER ID 'GJR' FIELD -gjahr.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDCASE.
**********************************************************************
WHEN '&POST'. " Post doc
PERFORM post.
selfield-refresh = 'X'.
ENDCASE.
ENDFORM. "CALLBACK_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form CALLBACK_PF_STATUS_SET
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM callback_pf_status_set USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM. "CALLBACK_PF_STATUS_SET
*&---------------------------------------------------------------------*
*& Form POST
*&---------------------------------------------------------------------*
* Post
*----------------------------------------------------------------------*
FORM post .
DATA ls_hdr TYPE bapiache09.
DATA lt_acc TYPE TABLE OF bapiacgl09.
DATA ls_acc TYPE bapiacgl09.
DATA lt_amt TYPE TABLE OF bapiaccr09.
DATA ls_amt TYPE bapiaccr09.
DATA lt_ext TYPE TABLE OF bapiparex.
DATA ls_ext TYPE bapiparex.
DATA lt_ret TYPE TABLE OF bapiret2.
DATA lt_ret_all TYPE TABLE OF bapiret2.
DATA lv_obj_type TYPE bapiache09-obj_type.
DATA lv_obj_key TYPE bapiache09-obj_key.
DATA lv_test TYPE xfeld.
DATA lv_error TYPE xfeld.
DATA lt_coll TYPE TABLE OF zsrep_alv.
DATA ls_t001 TYPE t001.
FIELD-SYMBOLS TYPE zsrep_alv.
* Collect by MATNR/WERKS
LOOP AT gt_out ASSIGNING WHERE cbox IS NOT INITIAL.
CLEAR gs_alv.
gs_alv-bukrs = -bukrs.
gs_alv-hkont = -hkont.
gs_alv-waers = -waers.
gs_alv-dmbtr = -dmbtr.
gs_alv-wrbtr = -wrbtr.
gs_alv-matnr = -matnr.
gs_alv-werks = -werks.
COLLECT gs_alv INTO lt_coll.
ENDLOOP.
* Delete zero lines
DELETE lt_coll WHERE dmbtr EQ 0 OR wrbtr EQ 0.
* No lines was select
IF lt_coll[] IS INITIAL.
MESSAGE 'Select positions' TYPE 'I'.
RETURN.
ENDIF.
**********************************************************************
DO 2 TIMES.
IF sy-index EQ 1.
lv_test = 'X'.
ELSE.
CHECK lv_error IS INITIAL.
CLEAR lt_ret_all[].
lv_test = ''.
ENDIF.
LOOP AT lt_coll ASSIGNING .
*
IF ls_t001-bukrs NE -bukrs.
SELECT SINGLE *
INTO ls_t001
FROM t001
WHERE bukrs EQ -bukrs.
ENDIF.
CLEAR ls_hdr.
CLEAR lt_acc[].
CLEAR lt_amt[].
CLEAR lt_ret[].
CLEAR lt_ext[].
ls_hdr-username = sy-uname.
ls_hdr-comp_code = -bukrs.
ls_hdr-doc_date = gv_budat.
ls_hdr-pstng_date = gv_budat.
ls_hdr-doc_type = p_blart.
ls_hdr-header_txt = '16* to 90*'.
CLEAR ls_acc.
ls_acc-itemno_acc = 1.
ls_acc-acct_type = 'S'.
ls_acc-gl_account = p_gl_k.
ls_acc-material = -matnr.
ls_acc-plant = -werks.
INSERT ls_acc INTO TABLE lt_acc.
CLEAR ls_amt.
ls_amt-itemno_acc = ls_acc-itemno_acc.
ls_amt-curr_type = '00'.
ls_amt-currency = -waers.
ls_amt-amt_doccur = - -wrbtr.
INSERT ls_amt INTO TABLE lt_amt.
ls_amt-curr_type = '10'.
ls_amt-currency = ls_t001-waers.
ls_amt-amt_doccur = - -dmbtr.
INSERT ls_amt INTO TABLE lt_amt.
ADD 1 TO ls_acc-itemno_acc.
ls_acc-gl_account = p_gl_d.
INSERT ls_acc INTO TABLE lt_acc.
ls_amt-itemno_acc = ls_acc-itemno_acc.
ls_amt-curr_type = '00'.
ls_amt-currency = -waers.
ls_amt-amt_doccur = -wrbtr.
INSERT ls_amt INTO TABLE lt_amt.
ls_amt-curr_type = '10'.
ls_amt-currency = ls_t001-waers.
ls_amt-amt_doccur = -dmbtr.
INSERT ls_amt INTO TABLE lt_amt.
*
IF lv_test IS NOT INITIAL.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
EXPORTING
documentheader = ls_hdr
TABLES
accountgl = lt_acc
currencyamount = lt_amt
extension2 = lt_ext
return = lt_ret.
ELSE.
CLEAR lv_obj_key.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_hdr
IMPORTING
obj_type = lv_obj_type
obj_key = lv_obj_key
TABLES
accountgl = lt_acc
currencyamount = lt_amt
extension2 = lt_ext
return = lt_ret.
ENDIF.
INSERT LINES OF lt_ret INTO TABLE lt_ret_all.
LOOP AT lt_ret TRANSPORTING NO FIELDS WHERE type EQ 'E' OR type EQ 'A'.
lv_error = 'X'.
EXIT.
ENDLOOP.
IF lv_error IS INITIAL AND lv_test IS INITIAL.
LOOP AT gt_out ASSIGNING WHERE cbox EQ 'X'
AND waers EQ -waers
AND matnr EQ -matnr
AND werks EQ -werks.
-belnr_clr = lv_obj_key+0(10).
-gjahr_clr = lv_obj_key+14(4).
ENDLOOP.
ENDIF.
ENDLOOP.
ENDDO.
*
IF lv_error IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
* Display log
IF lv_error IS NOT INITIAL.
CALL FUNCTION 'FINB_BAPIRET2_DISPLAY'
EXPORTING
it_message = lt_ret_all.
ELSE.
PERFORM select_data. " reselect data
ENDIF.
**********************************************************************
ENDFORM. " POST
*& Form SELECT_DATA
*&---------------------------------------------------------------------*
* Select data
*----------------------------------------------------------------------*
FORM select_data .
RANGES lr_budat FOR bkpf-budat.
lr_budat-sign = 'I'.
lr_budat-option = 'BT'.
CALL FUNCTION 'OIUREP_MONTH_FIRST_LAST'
EXPORTING
i_month = p_spmon+4(2)
i_year = p_spmon(4)
IMPORTING
e_first_day = lr_budat-low
e_last_day = lr_budat-high
EXCEPTIONS
OTHERS = 1.
APPEND lr_budat.
gv_budat = lr_budat-high.
CLEAR gt_out[].
* Select open items
SELECT *
INTO CORRESPONDING FIELDS OF TABLE gt_out
FROM bsis
WHERE bukrs EQ p_bukrs
AND hkont EQ p_gl_k
AND gjahr EQ p_spmon(4)
AND budat IN lr_budat
AND werks IN s_werks.
* Get add data from BSEG
LOOP AT gt_out ASSIGNING
* Check Cancel docs
SELECT SINGLE belnr
INTO
FROM bkpf
WHERE bukrs EQ
AND belnr EQ
AND gjahr EQ
AND stblg NE ''.
IF sy-subrc EQ 0.
DELETE gt_out.
CONTINUE.
ENDIF.
* Check material
SELECT SINGLE matnr
INTO
FROM bseg
WHERE bukrs EQ
AND belnr EQ
AND gjahr EQ
AND buzei EQ
IF NOT
DELETE gt_out.
CONTINUE.
ENDIF.
* Change sign by SHKZG
IF
ENDIF.
ENDLOOP.
*
ENDFORM. " SELECT_DATA
*&---------------------------------------------------------------------*
*& Form DISPLAY_DATA
*&---------------------------------------------------------------------*
* Output
*----------------------------------------------------------------------*
FORM display_data .
DATA ls_layout TYPE lvc_s_layo.
ls_layout-cwidth_opt = 'X'.
ls_layout-box_fname = 'CBOX'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-cprog
i_callback_pf_status_set = 'CALLBACK_PF_STATUS_SET'
i_callback_user_command = 'CALLBACK_USER_COMMAND'
i_structure_name = 'ZSREP_ALV'
is_layout_lvc = ls_layout
i_save = 'A'
TABLES
t_outtab = gt_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " DISPLAY_DATA
*&---------------------------------------------------------------------*
*& Form CALLBACK_USER_COMMAND
*&---------------------------------------------------------------------*
* User command
*----------------------------------------------------------------------*
FORM callback_user_command USING command LIKE sy-ucomm
selfield TYPE slis_selfield.
CASE command.
**********************************************************************
WHEN '&IC1'. " Double click
**********************************************************************
READ TABLE gt_out ASSIGNING
CHECK sy-subrc EQ 0.
CASE selfield-fieldname.
WHEN 'BELNR' OR 'BELNR_CLR'.
IF selfield-fieldname EQ 'BELNR'.
SET PARAMETER ID 'BLN' FIELD
ELSE.
SET PARAMETER ID 'BLN' FIELD
ENDIF.
SET PARAMETER ID 'BUK' FIELD
SET PARAMETER ID 'GJR' FIELD
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDCASE.
**********************************************************************
WHEN '&POST'. " Post doc
PERFORM post.
selfield-refresh = 'X'.
ENDCASE.
ENDFORM. "CALLBACK_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form CALLBACK_PF_STATUS_SET
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM callback_pf_status_set USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM. "CALLBACK_PF_STATUS_SET
*&---------------------------------------------------------------------*
*& Form POST
*&---------------------------------------------------------------------*
* Post
*----------------------------------------------------------------------*
FORM post .
DATA ls_hdr TYPE bapiache09.
DATA lt_acc TYPE TABLE OF bapiacgl09.
DATA ls_acc TYPE bapiacgl09.
DATA lt_amt TYPE TABLE OF bapiaccr09.
DATA ls_amt TYPE bapiaccr09.
DATA lt_ext TYPE TABLE OF bapiparex.
DATA ls_ext TYPE bapiparex.
DATA lt_ret TYPE TABLE OF bapiret2.
DATA lt_ret_all TYPE TABLE OF bapiret2.
DATA lv_obj_type TYPE bapiache09-obj_type.
DATA lv_obj_key TYPE bapiache09-obj_key.
DATA lv_test TYPE xfeld.
DATA lv_error TYPE xfeld.
DATA lt_coll TYPE TABLE OF zsrep_alv.
DATA ls_t001 TYPE t001.
FIELD-SYMBOLS
* Collect by MATNR/WERKS
LOOP AT gt_out ASSIGNING
CLEAR gs_alv.
gs_alv-bukrs =
gs_alv-hkont =
gs_alv-waers =
gs_alv-dmbtr =
gs_alv-wrbtr =
gs_alv-matnr =
gs_alv-werks =
COLLECT gs_alv INTO lt_coll.
ENDLOOP.
* Delete zero lines
DELETE lt_coll WHERE dmbtr EQ 0 OR wrbtr EQ 0.
* No lines was select
IF lt_coll[] IS INITIAL.
MESSAGE 'Select positions' TYPE 'I'.
RETURN.
ENDIF.
**********************************************************************
DO 2 TIMES.
IF sy-index EQ 1.
lv_test = 'X'.
ELSE.
CHECK lv_error IS INITIAL.
CLEAR lt_ret_all[].
lv_test = ''.
ENDIF.
LOOP AT lt_coll ASSIGNING
*
IF ls_t001-bukrs NE
SELECT SINGLE *
INTO ls_t001
FROM t001
WHERE bukrs EQ
ENDIF.
CLEAR ls_hdr.
CLEAR lt_acc[].
CLEAR lt_amt[].
CLEAR lt_ret[].
CLEAR lt_ext[].
ls_hdr-username = sy-uname.
ls_hdr-comp_code =
ls_hdr-doc_date = gv_budat.
ls_hdr-pstng_date = gv_budat.
ls_hdr-doc_type = p_blart.
ls_hdr-header_txt = '16* to 90*'.
CLEAR ls_acc.
ls_acc-itemno_acc = 1.
ls_acc-acct_type = 'S'.
ls_acc-gl_account = p_gl_k.
ls_acc-material =
ls_acc-plant =
INSERT ls_acc INTO TABLE lt_acc.
CLEAR ls_amt.
ls_amt-itemno_acc = ls_acc-itemno_acc.
ls_amt-curr_type = '00'.
ls_amt-currency =
ls_amt-amt_doccur = -
INSERT ls_amt INTO TABLE lt_amt.
ls_amt-curr_type = '10'.
ls_amt-currency = ls_t001-waers.
ls_amt-amt_doccur = -
INSERT ls_amt INTO TABLE lt_amt.
ADD 1 TO ls_acc-itemno_acc.
ls_acc-gl_account = p_gl_d.
INSERT ls_acc INTO TABLE lt_acc.
ls_amt-itemno_acc = ls_acc-itemno_acc.
ls_amt-curr_type = '00'.
ls_amt-currency =
ls_amt-amt_doccur =
INSERT ls_amt INTO TABLE lt_amt.
ls_amt-curr_type = '10'.
ls_amt-currency = ls_t001-waers.
ls_amt-amt_doccur =
INSERT ls_amt INTO TABLE lt_amt.
*
IF lv_test IS NOT INITIAL.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
EXPORTING
documentheader = ls_hdr
TABLES
accountgl = lt_acc
currencyamount = lt_amt
extension2 = lt_ext
return = lt_ret.
ELSE.
CLEAR lv_obj_key.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_hdr
IMPORTING
obj_type = lv_obj_type
obj_key = lv_obj_key
TABLES
accountgl = lt_acc
currencyamount = lt_amt
extension2 = lt_ext
return = lt_ret.
ENDIF.
INSERT LINES OF lt_ret INTO TABLE lt_ret_all.
LOOP AT lt_ret TRANSPORTING NO FIELDS WHERE type EQ 'E' OR type EQ 'A'.
lv_error = 'X'.
EXIT.
ENDLOOP.
IF lv_error IS INITIAL AND lv_test IS INITIAL.
LOOP AT gt_out ASSIGNING
AND waers EQ
AND matnr EQ
AND werks EQ
ENDLOOP.
ENDIF.
ENDLOOP.
ENDDO.
*
IF lv_error IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
* Display log
IF lv_error IS NOT INITIAL.
CALL FUNCTION 'FINB_BAPIRET2_DISPLAY'
EXPORTING
it_message = lt_ret_all.
ELSE.
PERFORM select_data. " reselect data
ENDIF.
**********************************************************************
ENDFORM. " POST