понедельник, 2 июля 2012 г.

Easy report for update position in FI document

*&---------------------------------------------------------------------*
*& 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 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 OR -xref1(6CN '0123456789'.
      DELETE gt_alv.
      CONTINUE.
    ELSE.
      " Check date
      CLEAR lv_datum.
      CONCATENATE '20' -xref1(6)
             INTO lv_datum.
      ADD TO lv_datum.
      SUBTRACT 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 bdcdataREFRESH 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.
  DATAl_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

Комментариев нет: