使用bapi对应付暂估外币清账程序bapi名称是POSTING_INTERFACE_CLE,用的是全部清账而非部分清账
*&---------------------------------------------------------------------*
*& Report ZFIR0038
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zfir0038.
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.