总账清账(不包含客户/供应商清账)

*&---------------------------------------------------------------------*
*& Report ZFIR0038
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zfir0038.


TABLES : bkpf,bseg,rseg.
"定义内表
TYPE-POOLS:icon.
DATA: ok_code LIKE sy-ucomm.
CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA: event_receiver TYPE REF TO lcl_event_receiver.
DATA: gt_fieldcat          TYPE lvc_t_fcat,
      gs_layout            TYPE lvc_s_layo,
      gs_variant           TYPE disvariant,
      gt_t_f4              TYPE lvc_t_f4,
      gt_selcell           TYPE lvc_t_cell,
      it_toolbar_excluding TYPE ui_functions.
DATA: stbl TYPE lvc_s_stbl.
DATA  it_good_cells TYPE lvc_t_modi .
DATA: et_filtered TYPE lvc_t_fidx.
DATA: gv_code TYPE sy-tcode .

DATA alv_grid TYPE REF TO cl_gui_alv_grid. "
DATA gs_parent TYPE REF TO cl_gui_custom_container .
DATA gt_select TYPE lvc_t_cell .
DATA gt_selrow TYPE lvc_t_row  .
DATA:gv_wrbtr_h  TYPE dmbtr,
     gv_wrbtr_s  TYPE dmbtr,
     gv_wrbtr_ce TYPE dmbtr,
     gv_dmbtr_h  TYPE dmbtr,
     gv_dmbtr_s  TYPE dmbtr,
     gv_dmbtr_ce TYPE dmbtr.

*DATA: gr_table TYPE REF TO cl_salv_table.
*DATA: lr_functions TYPE REF TO cl_salv_functions.

TYPES : BEGIN OF ty_item ,
          bukrs   TYPE bseg-bukrs,
          gjahr   TYPE bseg-gjahr,
          belnr   TYPE bseg-belnr,
          buzei   TYPE bseg-buzei,
          monat   TYPE bseg-h_monat,
          budat   TYPE bseg-h_budat,
          hkont   TYPE bseg-hkont,
          h_bstat TYPE bseg-h_bstat,
          ebeln   TYPE bseg-ebeln,
          ebelp   TYPE bseg-ebelp,
          lifnr   TYPE bseg-lifnr,
          waers   TYPE bseg-h_waers,
          wrbtr   TYPE bseg-wrbtr,
          dmbtr   TYPE bseg-dmbtr,
          shkzg   TYPE bseg-shkzg,
          sel     TYPE c,
          message TYPE c LENGTH 255,
          box     TYPE c.
TYPES END OF ty_item .
DATA gt_item TYPE TABLE OF ty_item .
DATA gs_item TYPE ty_item .
FIELD-SYMBOLS <fs_data> TYPE ty_item .
TYPES : BEGIN OF ty_ebeln ,
          ebeln TYPE bseg-ebeln,
          ebelp TYPE bseg-ebelp,
          wrbtr TYPE bseg-wrbtr,
        END OF ty_ebeln .
DATA gt_ebeln TYPE TABLE OF ty_ebeln .
DATA gs_ebeln TYPE  ty_ebeln .
DATA: BEGIN OF ftpost OCCURS 100.
        INCLUDE STRUCTURE ftpost.
DATA: END OF ftpost.
DATA: BEGIN OF ftclear OCCURS 20.
        INCLUDE STRUCTURE ftclear.
DATA: END OF ftclear.
DATA: BEGIN OF xblntab OCCURS 2.
        INCLUDE STRUCTURE blntab.
DATA: END OF xblntab.
DATA: BEGIN OF fttax OCCURS 0.
        INCLUDE STRUCTURE fttax.
DATA: END OF fttax.
DATA: gv_hkont TYPE bseg-hkont.
DATA:   bdcdata LIKE bdcdata    OCCURS 0 WITH HEADER LINE.
DATA:   messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA:   p_budat TYPE budat .

*&---------------------------------------------------------------------*
*&       Class LCL_EVENT_RECEIVER
*&---------------------------------------------------------------------*
*        Text
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.

    METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
      IMPORTING e_row e_column es_row_no.
    "                                                 "
    METHODS handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid
      IMPORTING e_fieldname es_row_no er_event_data .
    "
    METHODS handle_toolbar      FOR EVENT toolbar OF cl_gui_alv_grid
      IMPORTING e_object e_interactive .
    "
    METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
      IMPORTING e_ucomm .
    "
    METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.   "
    METHODS  handle_data_changed_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified et_good_cells.
ENDCLASS. "LCL_EVENT_RECEIVER



SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
    s_bukrs FOR  bkpf-bukrs  OBLIGATORY NO INTERVALS NO-EXTENSION,
    s_gjahr FOR  bkpf-gjahr  ,
    s_belnr FOR  rseg-belnr,
*    s_ebeln FOR  bseg-ebeln  ,           "
*    s_ebelp FOR  bseg-ebelp  ,           "
*    s_lifnr FOR  bseg-lifnr  ,
    s_hkont FOR  bseg-hkont MODIF ID m1 OBLIGATORY NO INTERVALS NO-EXTENSION DEFAULT '2202010200'.

  PARAMETERS p_waers TYPE bkpf-waers OBLIGATORY.

SELECTION-SCREEN END OF BLOCK blk1.

"$. Endregion 选择屏幕-TODO

INITIALIZATION.
  stbl-row = 'X'.
  stbl-col = 'X'.

AT SELECTION-SCREEN OUTPUT .
  LOOP AT SCREEN.
    IF screen-group1 = 'M1'.
      screen-input = 0.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

START-OF-SELECTION.
  PERFORM frm_get_data.
  CALL SCREEN 9000.

*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  DATA:BEGIN OF lt_waers OCCURS 0,
         waers TYPE waers,
       END OF lt_waers.
  DATA:lw_waers LIKE LINE OF lt_waers.

  DEFINE def_append_waers.
    IF &1 IS NOT INITIAL.
      READ TABLE lt_waers INTO lw_waers WITH KEY waers = &1.
      IF sy-subrc NE 0.
        APPEND VALUE #( waers = &1 ) TO lt_waers.
      ENDIF.
    ENDIF.
  END-OF-DEFINITION.

  "应付暂估跨公司采购下单公司清账:用发票号+年度找到rseg找物料移动凭证号+项目,再用收货物料号+项目到ZFI0035_LOG找3000公司暂估对应凭证组号A001对应的会计凭证,
  "用上面找的凭证号和发票号+年度对应的查询公司代码的会计凭证双方借贷方金额一致进行清账;注意用凭证货币进行清账,清账币别;注意:只能自动记账这个标识;


  "下单公司跟供应商买货,收到供应商的货生成的凭证log表里面的凭证A001,下单公司做发票校验的应付供应商的货款就是3000公司对应的凭证,清这2个凭证的应付暂估。
  SELECT bkpf~belnr,
         bkpf~gjahr,
         bkpf~bukrs,
         "bseg~buzei,
         bkpf~awkey,
         bkpf~monat,
         bkpf~budat,
         bkpf~waers,
*         bseg~h_bstat,
*         bseg~ebeln,
*         bseg~ebelp,
*         bseg~hkont,
*         bseg~wrbtr,
*         bseg~dmbtr,
*         bseg~shkzg,
*         bseg~lifnr,
         rseg~lfbnr,
         rseg~lfgja,
         rseg~lfpos,
         rseg~belnr AS belnr_miro,
         rseg~gjahr AS gjahr_miro,
         rseg~buzei AS buzei_miro
    FROM rseg INNER JOIN bkpf ON concat( rseg~belnr, rseg~gjahr ) = bkpf~awkey
            "  INNER JOIN bseg ON bkpf~gjahr = bseg~gjahr AND bkpf~belnr = bseg~belnr AND bkpf~bukrs = bseg~bukrs
    WHERE rseg~belnr IN @s_belnr AND
          rseg~gjahr IN @s_gjahr AND
          bkpf~bukrs IN @s_bukrs
  INTO TABLE @DATA(lt_rseg).

  IF lt_rseg[] IS NOT INITIAL.
    SELECT * INTO TABLE @DATA(lt_rbkp)
      FROM rbkp
      FOR ALL ENTRIES IN @lt_rseg
      WHERE belnr = @lt_rseg-belnr_miro AND
            gjahr = @lt_rseg-gjahr_miro AND
            stblg <> '' AND
            stjah <> ''.

    SORT lt_rbkp BY belnr gjahr.

    LOOP AT lt_rseg INTO DATA(lw_rseg).
      READ TABLE lt_rbkp INTO DATA(lw_rbkp) WITH KEY belnr = lw_rseg-belnr_miro gjahr = lw_rseg-gjahr_miro BINARY SEARCH.
      IF sy-subrc EQ 0.
        DELETE lt_rseg.
      ENDIF.
    ENDLOOP.
  ENDIF.

  IF lt_rseg[] IS NOT INITIAL.
    SELECT bseg~belnr,
           bseg~gjahr,
           bseg~bukrs,
           bseg~buzei,
           bseg~h_bstat,
           bkpf~awkey,
           bkpf~monat,
           bkpf~budat,
           bkpf~waers,
           bseg~ebeln,
           bseg~ebelp,
           bseg~hkont,
           bseg~wrbtr,
           bseg~dmbtr,
           bseg~shkzg,
           bseg~lifnr
      INTO TABLE @DATA(lt_bseg)
      FROM bseg INNER JOIN bkpf ON bkpf~gjahr = bseg~gjahr AND bkpf~belnr = bseg~belnr AND bkpf~bukrs = bseg~bukrs
      FOR ALL ENTRIES IN @lt_rseg
      WHERE bseg~belnr = @lt_rseg-belnr AND
            bseg~gjahr = @lt_rseg-gjahr AND
            bseg~bukrs = @lt_rseg-bukrs AND
            bseg~hkont IN @s_hkont AND
            bseg~augbl = ''.

    LOOP AT lt_bseg INTO DATA(lw_bseg).

      def_append_waers lw_bseg-waers.

      gt_item[] = VALUE #( BASE gt_item ( bukrs = lw_bseg-bukrs
                                          gjahr = lw_bseg-gjahr
                                          belnr = lw_bseg-belnr
                                          buzei = lw_bseg-buzei
                                          monat = lw_bseg-monat
                                          budat = lw_bseg-budat
                                          hkont = lw_bseg-hkont
                                          ebeln = lw_bseg-ebeln
                                          ebelp = lw_bseg-ebelp
                                          lifnr = lw_bseg-lifnr
                                          waers = lw_bseg-waers
                                          h_bstat = lw_bseg-h_bstat
                                          wrbtr = lw_bseg-wrbtr
                                          dmbtr = lw_bseg-dmbtr
                                          shkzg = lw_bseg-shkzg
                            ) ).
    ENDLOOP.

    SELECT bseg~belnr,
           bseg~gjahr,
           bseg~bukrs,
           bseg~buzei,
           bkpf~awkey,
           bkpf~monat,
           bkpf~budat,
           bkpf~waers,
           bseg~h_bstat,
           bseg~hkont,
           bseg~wrbtr,
           bseg~dmbtr,
           bseg~shkzg,
           bseg~lifnr,
           ztfi0035_log~ebeln,
           ztfi0035_log~ebelp,
           ztfi0035_log~mblnr AS mblnr_log,
           ztfi0035_log~mjahr AS mjahr_log,
           ztfi0035_log~zeile AS zeile_log
      INTO TABLE @DATA(lt_ztfi0035_log)
      FROM ztfi0035_log INNER JOIN bkpf ON bkpf~belnr = ztfi0035_log~belnr AND bkpf~gjahr = ztfi0035_log~gjahr AND bkpf~bukrs = ztfi0035_log~bukr2
                        INNER JOIN bseg ON bseg~belnr = ztfi0035_log~belnr AND bseg~gjahr = ztfi0035_log~gjahr AND bseg~bukrs = ztfi0035_log~bukr2
      FOR ALL ENTRIES IN @lt_rseg
      WHERE ztfi0035_log~mblnr = @lt_rseg-lfbnr AND
            ztfi0035_log~mjahr = @lt_rseg-lfgja AND
            ztfi0035_log~zeile = @lt_rseg-lfpos AND
            ztfi0035_log~zpzzh = 'A001' AND
            bseg~augbl = '' AND
            bseg~hkont IN @s_hkont .

    LOOP AT lt_ztfi0035_log INTO DATA(lw_ztfi0035_log).

      def_append_waers lw_ztfi0035_log-waers.

      gt_item[] = VALUE #( BASE gt_item ( bukrs = lw_ztfi0035_log-bukrs
                                          gjahr = lw_ztfi0035_log-gjahr
                                          belnr = lw_ztfi0035_log-belnr
                                          buzei = lw_ztfi0035_log-buzei
                                          monat = lw_ztfi0035_log-monat
                                          budat = lw_ztfi0035_log-budat
                                          hkont = lw_ztfi0035_log-hkont
                                          ebeln = lw_ztfi0035_log-ebeln
                                          ebelp = lw_ztfi0035_log-ebelp
                                          lifnr = lw_ztfi0035_log-lifnr
                                          waers = lw_ztfi0035_log-waers
                                          h_bstat = lw_ztfi0035_log-h_bstat
                                          wrbtr = lw_ztfi0035_log-wrbtr
                                          dmbtr = lw_ztfi0035_log-dmbtr
                                          shkzg = lw_ztfi0035_log-shkzg

                            ) ).
    ENDLOOP.
  ENDIF.

  "先判断凭证货币跟外面输入的币别是否一致,如果不一致,则检查跟公司代码币别是否一致,如果都不一致,报错
  IF gt_item[] IS NOT INITIAL.
*    DATA(lv_lines) = lines( lt_waers ).
*
*    IF lv_lines >= 2.
*      MESSAGE '凭证货币存在多个币别' TYPE 'S' DISPLAY LIKE 'E'.
*      LEAVE LIST-PROCESSING.
*    ENDIF.

    "1:先看公司代码货币与清账货币是否一致,如果一致,过,如果不一致,检查凭证货币与清账货币是否唯一一致

    SELECT COUNT(*) FROM t001 WHERE bukrs IN @s_bukrs AND waers EQ @p_waers.
    IF sy-subrc NE 0.
      DATA(lv_lines) = lines( lt_waers ).
      IF lv_lines >= 2.
        MESSAGE '凭证货币与清账货币不一致' TYPE 'S' DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ELSE.
        READ TABLE lt_waers INTO lw_waers WITH KEY waers = p_waers.
        IF sy-subrc NE 0.
          MESSAGE '凭证货币与清账货币不一致' TYPE 'S' DISPLAY LIKE 'E'.
          LEAVE LIST-PROCESSING.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Module  status_9000 OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
  SET PF-STATUS '9000'.
  SET TITLEBAR '9000'.

  DATA(gv_frist) = 'X' . "判断是不是第一次运行,自添加按钮需要刷新才能显示
  PERFORM frm_display_alv.
  IF gv_frist = 'X'.
    CALL METHOD alv_grid->refresh_table_display  "增加按钮需要刷新才会显示出来,否则无法显示。
      EXPORTING
        is_stable = stbl.
    gv_frist = '0' ."判断是否为第一次,为第一次则刷新
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  frm_init OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE frm_init OUTPUT.
  p_budat = bkpf-budat.

  CLEAR:gv_wrbtr_h,gv_wrbtr_s,gv_dmbtr_s,gv_dmbtr_h,gv_dmbtr_ce,gv_wrbtr_ce.
  LOOP AT gt_item ASSIGNING FIELD-SYMBOL(<fs_item>) WHERE box = 'X'.
    IF <fs_item>-shkzg = 'H'.
      gv_wrbtr_h = gv_wrbtr_h + <fs_item>-wrbtr.
      gv_dmbtr_h = gv_dmbtr_h + <fs_item>-dmbtr.
    ELSE.
      gv_wrbtr_s = gv_wrbtr_s + <fs_item>-wrbtr.
      gv_dmbtr_s = gv_dmbtr_s + <fs_item>-dmbtr.
    ENDIF.
  ENDLOOP.

  gv_wrbtr_ce = abs( gv_wrbtr_s ) - abs( gv_wrbtr_h ).
  gv_dmbtr_ce = abs( gv_dmbtr_s ) - abs( gv_dmbtr_h ).
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  gv_code = ok_code .
  CASE ok_code.
    WHEN 'BACK'.
      CLEAR: gt_item.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
    WHEN 'CANCEL'.
      CLEAR: gt_item.
      LEAVE TO SCREEN 0.
    WHEN 'CHECK' .
      PERFORM frm_check_sh TABLES gt_item.
    WHEN 'SALL'.
      LOOP AT gt_item ASSIGNING <fs_item> WHERE box = ''.
        <fs_item>-box = 'X'.
      ENDLOOP.
    WHEN 'USAL'.
      LOOP AT gt_item ASSIGNING <fs_item> WHERE box = 'X'.
        <fs_item>-box = ''.
      ENDLOOP.
    WHEN 'QRQZ' .
      DATA:lv_textline TYPE text_512,
           lv_answer ,
           lv_dmbtr    TYPE dmbtr.

      IF gv_wrbtr_ce <> '0.00' OR gv_dmbtr_ce <> '0.00'.
        CLEAR:lv_textline,lv_dmbtr,lv_answer.
        READ TABLE gt_item INTO DATA(lw_item) WITH KEY waers = p_waers.
        IF sy-subrc EQ 0.
          lv_dmbtr = gv_wrbtr_ce .
        ELSE.
          lv_dmbtr = gv_dmbtr_ce .
        ENDIF.

        lv_textline = '请确认该差异金额' && lv_dmbtr && '是否进入主营业务成本差异科目 6401050000'.
      ELSE.
        lv_textline = '请确认是否清账'.
      ENDIF.

      CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
        EXPORTING
          textline1      = lv_textline
          titel          = '提示'
          cancel_display = ''
        IMPORTING
          answer         = lv_answer.
      IF lv_answer = 'J'.
        PERFORM frm_call_clearbapi .
      ENDIF.
  ENDCASE.
ENDMODULE.
*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_double_click.
    MESSAGE  '双击' TYPE 'S'. "  e_row  e_column  es_row_no
    CALL METHOD alv_grid->get_selected_cells
      IMPORTING
        et_cell = gt_selcell.
  ENDMETHOD.

  METHOD handle_onf4.

    DATA: ls_modi    TYPE lvc_s_modi,
          lt_ret_tab TYPE TABLE OF ddshretval.
    IF e_fieldname = 'REPTEXT'.
      READ TABLE gt_item INDEX es_row_no-row_id ASSIGNING FIELD-SYMBOL(<fs_item>).
*      CHECK sy-subrc = 0.
      IF sy-subrc = 0.
        .
        CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
          EXPORTING
            retfield   = 'DDTEXT'
            value_org  = 'S'
          TABLES
            value_tab  = gt_item
            return_tab = lt_ret_tab.
        IF sy-subrc = 0.
          READ TABLE lt_ret_tab INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_ret>).
          IF sy-subrc = 0.
          ENDIF.
        ENDIF.
        er_event_data->m_event_handled = 'X'.
        CALL METHOD alv_grid->refresh_table_display
          EXPORTING
            is_stable = stbl.
      ENDIF .
    ENDIF .
  ENDMETHOD.                    "需在ALV中调用触发一般与filedcat中的 f4availabl 参数同用
  METHOD handle_toolbar.    "在ALV状态栏增加按钮,一般是汇总按钮,新增后的按钮可触发HANDLE_USER_COMMAND方法

    "    DATA: ls_toolbar        TYPE stb_button.
    "    CLEAR ls_toolbar.
    "    MOVE 3                  TO ls_toolbar-butn_type.      "分隔符
    "    APPEND ls_toolbar       TO e_object->mt_toolbar.
    "    CLEAR ls_toolbar.
    "    MOVE 'ADD'            TO ls_toolbar-function.        "功能码
    "    MOVE icon_insert_row  TO ls_toolbar-icon.            "图标
    "    MOVE '插入行'         TO ls_toolbar-quickinfo.
    "    MOVE '插入行'         TO ls_toolbar-text.            "显示名称
    "    MOVE ' '                TO ls_toolbar-disabled.
    "    APPEND ls_toolbar       TO e_object->mt_toolbar.
    "    CLEAR ls_toolbar.
    "    MOVE 'DEL'            TO ls_toolbar-function.        "功能码
    "    MOVE icon_delete_row  TO ls_toolbar-icon.            "图标
    "    MOVE '刪除行'         TO ls_toolbar-quickinfo.
    "    MOVE '刪除行'         TO ls_toolbar-text.            "显示名称
    "    MOVE ' '                TO ls_toolbar-disabled.
    "    APPEND ls_toolbar       TO e_object->mt_toolbar.
  ENDMETHOD.                    "在ALV状态栏增加按钮,一般是汇总按钮

  METHOD handle_user_command.
    CASE e_ucomm.
      WHEN 'ADD'.
        APPEND INITIAL LINE TO gt_item .
      WHEN 'DEL'.
        CALL METHOD alv_grid->get_selected_rows
          IMPORTING
            et_index_rows = gt_selrow.
        LOOP AT gt_selrow INTO DATA(gs_selrow).
          DELETE gt_item[]  INDEX gs_selrow-index .
        ENDLOOP .
      WHEN OTHERS.
    ENDCASE.
    CALL METHOD alv_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDMETHOD.                    "一般与HANDLE_TOOLBAR同用
  METHOD handle_data_changed.   "er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
    "用途在于检查这行是否能修改,数据是否合法
    LOOP AT er_data_changed->mt_good_cells  ASSIGNING FIELD-SYMBOL(<ls_good>).
    ENDLOOP .
  ENDMETHOD.                    "数据修改后触发,一般用在数据联动修改如数量字段修改,同时联动修改金额字段


  METHOD handle_data_changed_finished.
    "用途在于修改后的数据联动,
    CLEAR:gv_wrbtr_h,gv_wrbtr_s,gv_dmbtr_h,gv_dmbtr_s,gv_wrbtr_ce,gv_dmbtr_ce.
    DATA: ls_et_good_cell  TYPE lvc_s_modi.
    LOOP AT et_good_cells INTO ls_et_good_cell.
      READ TABLE gt_item INTO DATA(gs_ebeln) INDEX ls_et_good_cell-row_id.
      IF sy-subrc = '0'.
        READ TABLE gt_item WITH KEY ebeln = gs_ebeln-ebeln  ebelp = gs_ebeln-ebelp TRANSPORTING NO FIELDS BINARY SEARCH.
        IF sy-subrc = 0.
          IF ls_et_good_cell-fieldname = 'BOX'.
            LOOP AT gt_item ASSIGNING FIELD-SYMBOL(<fs_item>) FROM sy-tabix.
              IF <fs_item>-ebeln <> gs_ebeln-ebeln OR  <fs_item>-ebelp <> gs_ebeln-ebelp.
                EXIT .
              ENDIF.
              <fs_item>-box = gs_ebeln-box .

              IF <fs_item>-shkzg = 'H'.
                gv_wrbtr_h = gv_wrbtr_h + <fs_item>-wrbtr.
                gv_dmbtr_h = gv_dmbtr_h + <fs_item>-dmbtr.
              ELSE.
                gv_wrbtr_s = gv_wrbtr_s + <fs_item>-wrbtr.
                gv_dmbtr_s = gv_dmbtr_s + <fs_item>-dmbtr.
              ENDIF.
            ENDLOOP.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDLOOP.

    gv_wrbtr_ce = abs( gv_wrbtr_s ) - abs( gv_wrbtr_h ).
    gv_dmbtr_ce = abs( gv_dmbtr_s ) - abs( gv_dmbtr_h ).
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'REFRESH'.

    CALL METHOD cl_gui_cfw=>flush.

    CALL METHOD alv_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDMETHOD.
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
  CLEAR: gt_fieldcat,gs_layout,it_toolbar_excluding.
  gs_variant-report = sy-repid.
  gs_variant-handle = '0001'.
  IF  alv_grid IS INITIAL .
******实例化 容器
    CREATE OBJECT gs_parent
      EXPORTING
        container_name = 'ALV'. "


******将alv植入到容器中
    CREATE OBJECT alv_grid
      EXPORTING
        i_parent = gs_parent.
    PERFORM prepare_field_catalog CHANGING gt_fieldcat.
    PERFORM prepare_layout        CHANGING gs_layout.
    PERFORM toolbar_excluding_item     CHANGING it_toolbar_excluding.  "ALV按钮排除
    CALL METHOD alv_grid->set_table_for_first_display
      EXPORTING
        is_layout            = gs_layout
        i_save               = 'A'
        i_default            = 'X'
        is_variant           = gs_variant
        it_toolbar_excluding = it_toolbar_excluding
      CHANGING
        it_outtab            = gt_item
        it_fieldcatalog      = gt_fieldcat.
    CREATE OBJECT event_receiver. "创建事件
    SET HANDLER event_receiver->handle_double_click          FOR alv_grid. "双击事件
    SET HANDLER event_receiver->handle_onf4                  FOR alv_grid. "F4帮助事件
    SET HANDLER event_receiver->handle_toolbar               FOR alv_grid. "ALV状态栏
    SET HANDLER event_receiver->handle_user_command          FOR alv_grid. "按钮事件
    SET HANDLER event_receiver->handle_data_changed          FOR alv_grid. "修改事件
    SET HANDLER event_receiver->handle_data_changed_finished FOR alv_grid. "数据修改后触发事件


    gt_t_f4 = VALUE #( BASE gt_t_f4 ( fieldname = 'REPTEXT'  register = 'X' getbefore = 'X' chngeafter = 'X' ) ) .
    CALL METHOD alv_grid->register_f4_for_fields "注册F4帮助事件
      EXPORTING
        it_f4 = gt_t_f4.
    CALL METHOD alv_grid->register_edit_event "注册编辑事件,否则不会触发更新事件
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified.

    CALL METHOD alv_grid->set_frontend_layout
      EXPORTING
        is_layout = gs_layout.

    CALL METHOD cl_gui_control=>set_focus
      EXPORTING
        control = alv_grid.
    CALL METHOD cl_gui_cfw=>flush.
  ELSE.
    CALL METHOD alv_grid->set_frontend_layout
      EXPORTING
        is_layout = gs_layout.
    CALL METHOD alv_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_FIELDCAT  text
*----------------------------------------------------------------------*
FORM prepare_field_catalog CHANGING p_gt_fieldcat TYPE lvc_t_fcat.
  DATA ls_fcat TYPE lvc_s_fcat.
  DEFINE set_fcat.
    CLEAR ls_fcat.
    ls_fcat-fieldname = &1.   "字段
    ls_fcat-outputlen = &2.   "列的字符宽度
    ls_fcat-key       = &3.   "主键
    ls_fcat-edit      = &4.   "可编辑
    ls_fcat-ref_table = &5.   "参考表
    ls_fcat-ref_field = &6.   "参考字段
    ls_fcat-icon      = &7.   "以圖標輸出
*    ls_fcat-NO_ZERO   = &8.   "前导0
    ls_fcat-f4availabl = &8.
    ls_fcat-coltext   = &9.   "描述
    IF ls_fcat-fieldname = 'WRBTR'.
      ls_fcat-cfieldname = 'WAERS' .
    ENDIF.

    IF ls_fcat-fieldname = 'BOX'.
      ls_fcat-checkbox = 'X' .
    ENDIF.
    APPEND ls_fcat TO p_gt_fieldcat.
  END-OF-DEFINITION.

* - 固定字段
  set_fcat 'BOX    ' ''  '' 'X'     '    '  '         '  ''  ''  '选中'.
  set_fcat 'BUKRS  ' ''  '' ''      'BSEG'  'BUKRS    '  ''  ''  '公司代码'.
  set_fcat 'GJAHR  ' ''  '' ''      'BSEG'  'GJAHR    '  ''  ''  '年度'.
  set_fcat 'BELNR  ' ''  '' ''      'BSEG'  'BELNR    '  ''  ''  '凭证编号'.
  set_fcat 'BUZEI  ' ''  '' ''      'BSEG'  'BUZEI    '  ''  ''  '行项目'.
  set_fcat 'MONAT  ' ''  '' ''      'BSEG'  'MONAT    '  ''  ''  '期间'.
  set_fcat 'BUDAT  ' ''  '' ''      'BSEG'  'BUDAT    '  ''  ''  '过账日期'.
  set_fcat 'HKONT  ' ''  '' ''      'BSEG'  'HKONT    '  ''  ''  '会计科目'.
  set_fcat 'H_BSTAT' ''  '' ''      'BSEG'  'H_BSTAT  '  ''  ''  '凭证类型'.
  set_fcat 'EBELN  ' ''  '' ''      'BSEG'  'EBELN    '  ''  ''  '采购订单'.
  set_fcat 'EBELP  ' ''  '' ''      'BSEG'  'EBELP    '  ''  ''  '采购订单行'.
  set_fcat 'LIFNR  ' ''  '' ''      'BSEG'  'LIFNR    '  ''  ''  '供应商'.
  set_fcat 'WAERS  ' ''  '' ''      'BSEG'  'WAERS    '  ''  ''  '凭证货币'.
  set_fcat 'WRBTR  ' ''  '' ''      'BSEG'  'WRBTR    '  ''  ''  '凭证金额'.
  set_fcat 'DMBTR  ' ''  '' ''      'BSEG'  'DMBTR    '  ''  ''  '本位币金额'.
  set_fcat 'SHKZG  ' ''  '' ''      'BSEG'  'SHKZG    '  ''  ''  '借记标识'.
  set_fcat 'MESSAGE  ' ''  '' ''      ''  '    '  ''  ''  '返回消息'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  PREPARE_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM prepare_layout CHANGING p_gs_layout TYPE lvc_s_layo.
  p_gs_layout-zebra      = 'X'.      "斑馬紋顯示
  p_gs_layout-sel_mode   = 'A'.      "選擇模式
  p_gs_layout-cwidth_opt = 'X'.      "最佳列寬
ENDFORM.
*&---------------------------------------------------------------------*
*& Form toolbar_excluding_item
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM toolbar_excluding_item CHANGING pt_exclude TYPE ui_functions.
  DATA ls_exclude TYPE ui_func.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
  APPEND ls_exclude TO pt_exclude.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_sh
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_sh TABLES pt_item LIKE gt_item  .
  ""按照采购订单+行汇总金额
  LOOP AT pt_item ASSIGNING FIELD-SYMBOL(<fs_item>).
    MOVE-CORRESPONDING <fs_item> TO gs_ebeln .
    IF <fs_item>-shkzg = 'H'. "贷方金额*-1再合计
      gs_ebeln-wrbtr = - gs_ebeln-wrbtr .
    ENDIF.
    COLLECT gs_ebeln INTO gt_ebeln .
    CLEAR : gs_ebeln ,<fs_item>-box.
  ENDLOOP.
  ""合计金额为0的数据勾选,后续执行清账程序
  gs_item-box = 'X' .
  LOOP AT gt_ebeln INTO gs_ebeln WHERE wrbtr = 0.
    READ TABLE pt_item WITH KEY ebeln = gs_ebeln-ebeln  ebelp = gs_ebeln-ebelp TRANSPORTING NO FIELDS BINARY SEARCH.
    IF sy-subrc = 0.
      LOOP AT pt_item ASSIGNING <fs_item> FROM sy-tabix.
        IF <fs_item>-ebeln <> gs_ebeln-ebeln OR  <fs_item>-ebelp <> gs_ebeln-ebelp.
          EXIT .
        ENDIF.
        <fs_item>-box = 'X' .
      ENDLOOP.
    ENDIF.
  ENDLOOP.
ENDFORM .
*&---------------------------------------------------------------------*
*& Form ftpost_p
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
DEFINE %ftpost_p.
* 行项目
  ftpost-stype = 'P'.
  ftpost-count = &1.
  ftpost-fnam  = &2.
  ftpost-fval  = &3.
  APPEND ftpost.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Form ftclear2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
DEFINE %ftclear2.
  "按凭证号清未清项
  ftclear-agkoa  = 'S'.    " K for vender,D for custmor, S for GL
  ftclear-agkon  = &5.
  ftclear-agbuk  = &4. "company code
  ftclear-selfd  = 'BELNR'.
  ftclear-selvon = &1 && &2 && &3." 凭证号+年度+行号
*   ftclear-agums = 'HSGABFCIW'."特殊总账标识
  ftclear-xnops = 'X'.   " 标准
  APPEND ftclear.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Form ftpost_k
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
DEFINE %ftpost_k.
  " 表头
  ftpost-stype = 'K'.
  ftpost-count = '1'.
  ftpost-fnam  = &1.
  ftpost-fval  = &2.
  APPEND ftpost.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Form frm_call_clearbapi
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_call_clearbapi .
  DATA:l_datum TYPE char10.
  DATA:l_datum2 TYPE char10.
  IF bkpf-budat = '00000000'.
    MESSAGE '请输入清账日期' TYPE 'S' DISPLAY LIKE 'E' .
    EXIT.
  ENDIF.
  CHECK bkpf-budat IS NOT INITIAL .
  DATA(lt_table) = gt_item[] .
  DELETE lt_table[] WHERE box <> 'X' .
  IF lt_table[] IS INITIAL.
    MESSAGE '没有借贷平衡的清账数据' TYPE 'S' DISPLAY LIKE 'E' .
  ENDIF.
  REFRESH:ftpost,ftclear,xblntab,fttax.

  CHECK lt_table[] IS NOT INITIAL.
  "调用BAPI前先检查借贷是否平衡
  PERFORM frm_check_sh TABLES lt_table .
  "构造BAPI   POSTING_INTERFACE_CLEARING 的参数

  "行项目赋值
  LOOP AT lt_table INTO DATA(ls_qzsj).
    %ftclear2 ls_qzsj-belnr ls_qzsj-budat(4) ls_qzsj-buzei ls_qzsj-bukrs ls_qzsj-hkont.
    CLEAR: ls_qzsj.
  ENDLOOP.
  "抬头数据赋值
* 凭证日期
  WRITE bkpf-budat TO l_datum.
  %ftpost_k 'BKPF-BLDAT' l_datum.
* 凭证类型
  %ftpost_k 'BKPF-BLART' 'AB'.
* 公司代码
  %ftpost_k 'BKPF-BUKRS' s_bukrs-low.
* 过帐日期
  WRITE bkpf-budat TO l_datum2.
  %ftpost_k 'BKPF-BUDAT' bkpf-budat.
* 货币
  %ftpost_k 'BKPF-WAERS' p_waers. "货币码

  IF gv_wrbtr_ce <> '0.00' OR gv_dmbtr_ce <> '0.00'.
    DATA(lv_sgtxt) = CONV bseg-sgtxt( '调整结算月' &&  bkpf-budat+0(6) && '跨公司采购差异' ).
    DATA(lv_bschl) = VALUE bschl( ).
    DATA(lv_hkont) = VALUE hkont( ).
    lv_hkont = '6401050000'.

    DEFINE populate_ftpost.
      ftpost-stype = &1.
      ftpost-count = &2.
      ftpost-fnam = &3.
      ftpost-fval = &4.
      APPEND ftpost.
    END-OF-DEFINITION.

    DATA lv_dmbtr TYPE char17.
    READ TABLE gt_item INTO DATA(lw_item) WITH KEY waers = p_waers.
    IF sy-subrc EQ 0.

      IF gv_wrbtr_ce > 0.
        lv_bschl = '40'.
      ELSE.
        lv_bschl = '50'.
      ENDIF.

      WRITE:abs( gv_wrbtr_ce )  TO lv_dmbtr.
      CONDENSE lv_dmbtr.

      populate_ftpost:
      'P' 1 'RF05A-NEWBS' lv_bschl, "记帐代码
      "'P' 1 'RF05A-AGKON' lv_hkont, "
      " 'P' 1 'RF05A-NEWUM' '', "特别总/分类帐指示符
      'P' 1 'BSEG-HKONT' lv_hkont, "总帐科目编号
      'P' 1 'BSEG-SGTXT'  lv_sgtxt, "项目文本
      " 'P' 1 'COBL-PRCTR'  LS_RESULT-PRCTR,
      "'P' 1 'BSEG-ZUONR'  '', "分配编号
      'P' 1 'BSEG-WRBTR'  lv_dmbtr, "
      'P' 1 'BSEG-ZFBDT'  bkpf-budat. "
    ELSE.

      IF gv_dmbtr_ce > 0.
        lv_bschl = '40'.
      ELSE.
        lv_bschl = '50'.
      ENDIF.

      WRITE:abs( gv_dmbtr_ce )  TO lv_dmbtr.
      CONDENSE lv_dmbtr.

      populate_ftpost:
      'P' 1 'RF05A-NEWBS' lv_bschl, "记帐代码
      "'P' 1 'RF05A-AGKON' lv_hkont, "
      " 'P' 1 'RF05A-NEWUM' '', "特别总/分类帐指示符
      'P' 1 'BSEG-HKONT' lv_hkont, "总帐科目编号
      'P' 1 'BSEG-SGTXT'  lv_sgtxt, "项目文本
      " 'P' 1 'COBL-PRCTR'  LS_RESULT-PRCTR,
      "'P' 1 'BSEG-ZUONR'  '', "分配编号
      'P' 1 'BSEG-WRBTR'  lv_dmbtr, "
      'P' 1 'BSEG-ZFBDT'  bkpf-budat. "
    ENDIF.
  ENDIF.
  PERFORM frm_call_fb05 .
ENDFORM .
*&---------------------------------------------------------------------*
*& Form frm_call_fb05
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_call_fb05 .
  DATA(l_mode) = 'N'.
  CALL FUNCTION 'POSTING_INTERFACE_START'
    EXPORTING
      i_client           = sy-mandt
      i_function         = 'C'
      i_mode             = l_mode
      i_user             = sy-uname
    EXCEPTIONS
      client_incorrect   = 1
      function_invalid   = 2
      group_name_missing = 3
      mode_invalid       = 4
      update_invalid     = 5
      error_message      = 98
      OTHERS             = 99.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO DATA(p_msg).
  ENDIF.
  DATA(auglv) = 'UMBUCHNG'.
  DATA:l_subrc TYPE sy-subrc.
  CALL FUNCTION 'POSTING_INTERFACE_CLEARING'
    EXPORTING
      i_auglv                    = auglv
      i_tcode                    = 'FB05'
      i_sgfunct                  = 'C'
    IMPORTING
      e_msgid                    = sy-msgid
      e_msgno                    = sy-msgno
      e_msgty                    = sy-msgty
      e_msgv1                    = sy-msgv1
      e_msgv2                    = sy-msgv2
      e_msgv3                    = sy-msgv3
      e_msgv4                    = sy-msgv4
      e_subrc                    = l_subrc
    TABLES
      t_blntab                   = xblntab
      t_ftclear                  = ftclear
      t_ftpost                   = ftpost
      t_fttax                    = fttax
    EXCEPTIONS
      clearing_procedure_invalid = 1
      clearing_procedure_missing = 2
      table_t041a_empty          = 3
      transaction_code_invalid   = 4
      amount_format_error        = 5
      too_many_line_items        = 6
      company_code_invalid       = 7
      screen_not_found           = 8
      no_authorization           = 9
      error_message              = 98
      OTHERS                     = 99.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO DATA(lv_message).
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
  CALL FUNCTION 'POSTING_INTERFACE_END'
    EXCEPTIONS
      session_not_processable = 1
      OTHERS                  = 2.
  LOOP AT gt_item ASSIGNING FIELD-SYMBOL(<fs_item>) WHERE box = 'X'.
    <fs_item>-message = lv_message.
  ENDLOOP.
ENDFORM.

屏幕9000

PROCESS BEFORE OUTPUT.
  MODULE frm_init.
  MODULE status_9000.

*
PROCESS AFTER INPUT.
  MODULE user_command_9000.
  CHAIN.
    FIELD bkpf-budat.
  ENDCHAIN.

相关推荐

  1. 总账清账(包含客户/供应商清账)

    2024-07-10 00:16:05       18 阅读
  2. 供应商管理软件:供应商绩效评估实用清单

    2024-07-10 00:16:05       35 阅读
  3. docker 清除用的容器数据

    2024-07-10 00:16:05       47 阅读
  4. 副显示器显示清晰问题

    2024-07-10 00:16:05       99 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 00:16:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 00:16:05       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 00:16:05       58 阅读
  4. Python语言-面向对象

    2024-07-10 00:16:05       69 阅读

热门阅读

  1. Vue3--Watch、Watcheffect、Computed的使用和区别

    2024-07-10 00:16:05       20 阅读
  2. react apollo hooks

    2024-07-10 00:16:05       21 阅读
  3. Python面试题:如何在 Python 中实现单例模式?

    2024-07-10 00:16:05       25 阅读
  4. react动态渲染列表与函数式组件

    2024-07-10 00:16:05       21 阅读
  5. 垃圾回收器详解

    2024-07-10 00:16:05       19 阅读
  6. homebrew常用命令

    2024-07-10 00:16:05       22 阅读
  7. JVM详解

    JVM详解

    2024-07-10 00:16:05      20 阅读
  8. 学习.NET 8 MiniApis入门

    2024-07-10 00:16:05       17 阅读
  9. Windows使用 Gitee+PicGo 搭建Markdown图床

    2024-07-10 00:16:05       21 阅读
  10. Codeforces Round 925 (Div. 3) D-F

    2024-07-10 00:16:05       25 阅读