*&---------------------------------------------------------------------*
*& Report ZSIT_VAT_XREF_UPDATE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zsit_vat_xref_update
.
TABLES bkpf
.
TABLES bseg
.
TYPE-POOLS slis
.
TYPE-POOLS icon.
DATA gt_alv
TYPE TABLE OF zssit_vat_xref_update
.
DATA gs_alv
TYPE zssit_vat_xref_update
.
DATA: bdcdata
LIKE bdcdata
OCCURS 0 WITH HEADER LINE.
FIELD-SYMBOLS TYPE zssit_vat_xref_update.
**********************************************************************
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-bl1.
PARAMETERS p_bukrs TYPE bkpf-bukrs OBLIGATORY MEMORY ID buk.
SELECT-OPTIONS s_gjahr FOR bseg-gjahr OBLIGATORY MEMORY ID gjr.
SELECT-OPTIONS s_hkont FOR bseg-hkont.
SELECT-OPTIONS s_belnr FOR bseg-belnr.
SELECTION-SCREEN END OF BLOCK bl1.
**********************************************************************
START-OF-SELECTION.
**********************************************************************
PERFORM select_data.
**********************************************************************
END-OF-SELECTION.
**********************************************************************
IF gt_alv[] IS INITIAL.
MESSAGE 'No data for selection conditions' TYPE 'S'.
EXIT.
ENDIF.
PERFORM display_data.
**********************************************************************
*&---------------------------------------------------------------------*
*& Form SELECT_DATA
*&---------------------------------------------------------------------*
* Select data
*----------------------------------------------------------------------*
FORM select_data .
DATA lv_datum TYPE bkpf-budat.
CLEAR gt_alv[].
* Select open items
SELECT *
INTO CORRESPONDING FIELDS OF TABLE gt_alv
FROM bsis
WHERE bukrs EQ p_bukrs
AND hkont IN s_hkont
AND gjahr IN s_gjahr
AND belnr IN s_belnr
AND mwskz NE ''
AND mwskz NE '**'.
* Get add data from BSEG
LOOP AT gt_alv 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_alv.
CONTINUE.
ENDIF.
* Current XREF1
SELECT SINGLE xref1
INTO -xref1
FROM bseg
WHERE bukrs EQ -bukrs
AND belnr EQ -belnr
AND gjahr EQ -gjahr
AND buzei EQ -buzei
AND koart EQ 'K'.
* Check XREF1
IF STRLEN( -xref1 ) NE 6 OR -xref1(6) CN '0123456789'.
DELETE gt_alv.
CONTINUE.
ELSE.
" Check date
CLEAR lv_datum.
CONCATENATE '20' -xref1(6)
INTO lv_datum.
ADD 1 TO lv_datum.
SUBTRACT 1 FROM lv_datum.
IF lv_datum IS INITIAL.
DELETE gt_alv.
CONTINUE.
ENDIF.
ENDIF.
* Correct new XREF1
PERFORM get_new_xref1 USING .
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-repid
i_callback_pf_status_set = 'CALLBACK_PF_STATUS_SET'
i_callback_user_command = 'CALLBACK_USER_COMMAND'
i_structure_name = 'ZSSIT_VAT_XREF_UPDATE'
is_layout_lvc = ls_layout
i_save = 'A'
TABLES
t_outtab = gt_alv
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_alv ASSIGNING INDEX selfield-tabindex.
CHECK sy-subrc EQ 0.
CASE selfield-fieldname.
WHEN 'BELNR'.
SET PARAMETER ID 'BLN' FIELD -belnr.
SET PARAMETER ID 'BUK' FIELD -bukrs.
SET PARAMETER ID 'GJR' FIELD -gjahr.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDCASE.
**********************************************************************
WHEN '&XREF'. " Change XREF1
PERFORM change_xref1.
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 change_xref1
*&---------------------------------------------------------------------*
* change_xref1
*----------------------------------------------------------------------*
FORM change_xref1 .
DATA ls_bseg TYPE bseg.
DATA lt_mess TYPE TABLE OF bdcmsgcoll.
DATA ls_mess TYPE bdcmsgcoll.
* Change
LOOP AT gt_alv ASSIGNING WHERE cbox IS NOT INITIAL.
CLEAR bdcdata. REFRESH bdcdata.
CLEAR lt_mess[].
PERFORM bdc_dynpro USING 'SAPMF05L' '100'.
PERFORM bdc_field USING 'RF05L-BELNR' -belnr.
PERFORM bdc_field USING 'RF05L-BUKRS' -bukrs.
PERFORM bdc_field USING 'RF05L-GJAHR' -gjahr.
PERFORM bdc_field USING 'BDC_OKCODE' '/00'.
PERFORM bdc_dynpro USING 'SAPMF05L' '700'.
PERFORM bdc_field USING 'BDC_OKCODE' 'ABZL'.
PERFORM bdc_dynpro USING 'SAPMF05L' '1130'.
PERFORM bdc_field USING 'RF05L-BUZEI' -buzei.
PERFORM bdc_dynpro USING 'SAPMF05L' '700'.
PERFORM bdc_field USING 'BDC_CURSOR' 'RF05L-ANZDT(01)'.
PERFORM bdc_field USING 'BDC_OKCODE' 'PK'.
PERFORM bdc_dynpro USING 'SAPMF05L' '302'.
PERFORM bdc_field USING 'BDC_OKCODE' '=ZK'.
PERFORM bdc_dynpro USING 'SAPMF05L' '1302'.
PERFORM bdc_field USING 'BSEG-XREF1' -xref1_new.
PERFORM bdc_field USING 'BDC_OKCODE' '=ENTR'.
PERFORM bdc_dynpro USING 'SAPMF05L' '302'.
PERFORM bdc_field USING 'BDC_OKCODE' 'AB'.
PERFORM bdc_dynpro USING 'SAPMF05L' '700'.
PERFORM bdc_field USING 'BDC_OKCODE' '/11'.
PERFORM bdc_transaction TABLES lt_mess
USING 'FB02' 'X' 'N' 'S'.
READ TABLE lt_mess INTO ls_mess WITH KEY msgid = 'F5' msgnr = '300'.
IF sy-subrc EQ 0.
-status = icon_led_green.
ELSE.
-status = icon_led_red.
ENDIF.
ENDLOOP.
IF sy-subrc NE 0.
MESSAGE 'Select positions' TYPE 'I'.
RETURN.
ENDIF.
**********************************************************************
ENDFORM. " change_xref1
*&---------------------------------------------------------------------*
*& Form GET_NEW_XREF1
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_new_xref1 USING ps_alv TYPE zssit_vat_xref_update.
ENDFORM. " GET_NEW_XREF1
*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM. "BDC_DYNPRO
*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDFORM. "BDC_FIELD
*----------------------------------------------------------------------*
* Start new transaction according to parameters *
*----------------------------------------------------------------------*
FORM bdc_transaction TABLES p_messtab
USING p_tcode
p_ctu
p_mode
p_update.
DATA: l_subrc LIKE sy-subrc.
IF p_ctu <> 'X'.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
tcode = p_tcode
TABLES
dynprotab = bdcdata
EXCEPTIONS
OTHERS = 1.
ELSE.
CALL TRANSACTION p_tcode USING bdcdata
MODE p_mode
UPDATE p_update
MESSAGES INTO p_messtab.
ENDIF.
l_subrc = sy-subrc.
REFRESH bdcdata.
sy-subrc = l_subrc.
ENDFORM. "BDC_TRANSACTION
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 TYPE zsrep_alv.
**********************************************************************
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