*&---------------------------------------------------------------------*
*& 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.