SAP-ABAP-清账函数BAPI使用POSTING_INTERFACE_CLEARING,应付暂估外币清账程序

本程序使用bapi对应付暂估外币清账程序bapi名称是POSTING_INTERFACE_CLE,用的是全部清账而非部分清账,

程序代码如下,使用的是OOALV格式

主程序代码

*&---------------------------------------------------------------------*
*& Report ZFIR262
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZFIR262.


TABLES : BKPF,BSEG.
"定义内表

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. "后面要用到CL_GUI_ALV_GRID类中的方法
"SET_TABLE_FIRST_DISPLAY,这个方法基于实例存在,必须
"为这个类创建一个对象。在此处声明。
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: gr_table TYPE REF TO cl_salv_table.
*DATA: lr_functions TYPE REF TO cl_salv_functions.


"$. Region 此处定义改为需要用到的定义-TODO
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 .
"$. Endregion 此处定义改为需要用到的定义-TODO

*&---------------------------------------------------------------------*
*&       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                    "定义类中的方法---F4帮助
      IMPORTING e_fieldname es_row_no er_event_data .                        "
    "
    METHODS handle_toolbar      FOR EVENT toolbar OF cl_gui_alv_grid         "定义类中的方法---ALV状态栏按钮
      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
"$. Endregion 定义

"$. Region 选择屏幕-TODO

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_EBELN FOR  BSEG-EBELN    ,           "
  S_EBELP FOR  BSEG-EBELP    ,           "
  S_LIFNR FOR  BSEG-LIFNR  ,                       "凭证类型
  S_HKONT FOR  BSEG-HKONT OBLIGATORY NO INTERVALS NO-EXTENSION.                        "科目

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.

  "$. Region 权限-TODO

* SELECT T001~BUKRS FROM T001 WHERE T001~BUKRS IN @S_BUKRS INTO TABLE @DATA(GT_BUKRS) .
*
* LOOP AT GT_BUKRS INTO DATA(GS_BUKRS).
*  AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
*              ID 'BUKRS' FIELD GS_BUKRS-BUKRS
*               ID 'ACTVT' FIELD '03'.
*  IF SY-SUBRC <> 0.
*      MESSAGE '您没有公司代码' && GS_BUKRS-BUKRS  && '的操作权限!'   TYPE 'E' .
*
*  ENDIF.
*
* ENDLOOP.

  "$. Endregion 权限-TODO


START-OF-SELECTION.
  PERFORM frm_get_data.
  IF SY-MANDT =  '200'."用于测试
    APPEND INITIAL LINE TO gt_item .
  ENDIF.

  CALL SCREEN 9000.

  "$. Region FORM
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 P_BUDAT OUTPUT.
  P_BUDAT =  BKPF-BUDAT.
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 'QRQZ' .
      PERFORM FRM_CALL_CLEARBAPI .
  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.                    "HANDLE_DOUBLE_CLICK双击后触发该段代码,可接T-CODE跳转等功能

  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.
    "用途在于修改后的数据联动,
    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 .
             ENDLOOP.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDLOOP.

      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'. " 界面中的一个CUNSTOMER CONTROL控件 用于存放类对象。
    "使用这个控件把名称赋值给CONTAINER_NAME

******将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.
    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 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_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  SELECT DISTINCT
         BSIS~BUKRS         ,
         BSIS~GJAHR         ,
         BSEG~BELNR         ,
         BSEG~BUZEI         ,
         BSIS~MONAT         ,
         BSIS~BUDAT         ,
         BSIS~HKONT         ,
         BSEG~H_BSTAT       ,
         BSEG~EBELN         ,
         BSEG~EBELP         ,
         CASE WHEN zmm_qcsh~LIFNR IS NOT NULL THEN zmm_qcsh~LIFNR
              WHEN zfi_qcsh~LIFNR IS NOT NULL THEN zfi_qcsh~LIFNR
              WHEN EKKO~LIFNR IS NOT NULL THEN EKKO~LIFNR
              END  AS LIFNR             ,
         BSIS~WAERS         ,
         BSEG~WRBTR         ,
         BSEG~DMBTR         ,
         BSIS~SHKZG
    FROM BSIS
    LEFT JOIN BSEG ON BSIS~BUKRS = BSEG~BUKRS AND BSIS~GJAHR = BSEG~GJAHR AND BSIS~BELNR = BSEG~BELNR AND BSIS~BUZEI = BSEG~BUZEI
    LEFT JOIN zmm_qcsh ON bseg~ebeln = zmm_qcsh~zponum
    LEFT JOIN zfi_qcsh ON bseg~ebeln = zfi_qcsh~zponum
    LEFT JOIN EKKO     ON bseg~ebeln = EKKO~ebeln
    WHERE BSIS~BUKRS IN @S_BUKRS
      AND BSIS~GJAHR IN @S_GJAHR
      AND BSEG~EBELN IN @S_EBELN
      AND BSEG~EBELP IN @S_EBELP
      AND ( zmm_qcsh~LIFNR IN @s_lifnr OR zfi_qcsh~LIFNR IN @s_lifnr OR EKKO~LIFNR  IN @s_lifnr )
      AND BSIS~HKONT IN @S_HKONT
      AND BSIS~WAERS =  @P_WAERS
      AND BSEG~EBELN <> ''
      INTO TABLE @gt_item .
    SORT gt_item BY EBELN EBELP  BUKRS GJAHR BELNR BUZEI.
ENDFORM.

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 .


* 行项目
  DEFINE %ftpost_p.
    ftpost-stype = 'P'.
    ftpost-count = &1.
    ftpost-fnam  = &2.
    ftpost-fval  = &3.
    APPEND ftpost.
  END-OF-DEFINITION.
  "按凭证号清未清项
  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.
  " 表头
  DEFINE %ftpost_k.
    ftpost-stype = 'K'.
    ftpost-count = '1'.
    ftpost-fnam  = &1.
    ftpost-fval  = &2.
    APPEND ftpost.
  END-OF-DEFINITION.

FORM FRM_CALL_CLEARBAPI .
  DATA:l_datum TYPE char10.
  DATA:l_datum2 TYPE char10.
  IF BKPF-BUDAT = '00000000'.
    MESSAGE '请输入清账日期' TYPE 'S' DISPLAY LIKE 'E' .
  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.
  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. "货币码
  PERFORM frm_call_fb05 .
ENDFORM .

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 P_BUDAT .
 MODULE STATUS_9000.

PROCESS AFTER INPUT.
 MODULE USER_COMMAND_9000.
   CHAIN .
      FIELD BKPF-BUDAT .
   ENDCHAIN .

 GUI状态

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
POSTING_INTERFACE_CLEARING是一个函数,用于进行标准清账操作。它封装了BDC录屏的功能。\[3\]在使用函数时,如果传入参数ITEM,则必须传入公司代码、记账码和科目。根据你提供的引用内容,你的问题是关于批量创建清账凭证时参照码3的问题。你希望每个参照码3对应一张凭证,但实际上清账凭证创建成功后,参照码3一直沿用了模板中的第一个值。你进行了排查并确认了传参数据的正确性,并清空了相应的内表。然后你尝试使用了free memory来清空ABAP内存变量,并成功解决了问题。然而,你想知道使用free memory会有什么影响。 #### 引用[.reference_title] - *1* [SAP-ABAP-清账函数BAPI使用POSTING_INTERFACE_CLEARING应付暂估外币清账程序](https://blog.csdn.net/Qunending/article/details/124666847)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [清账函数POSTING_INTERFACE_CLEARING的应用](https://blog.csdn.net/wangshaoqiang022/article/details/90234375)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值