REPORT zmmr026.
TABLES:vfclmshlpacntid,csks,cosp,coep,lfa1.
INCLUDE <icon>.
TYPE-POOLS: slis.
DATA: gv_container TYPE REF TO cl_gui_docking_container,
gv_alv TYPE REF TO cl_gui_alv_grid , "ALV网格
gv_row_alv TYPE REF TO cl_gui_alv_grid_base,
gt_exclude TYPE ui_functions, "用于去掉不要的菜单栏
gv_index_columns TYPE lvc_t_col, "选择列
gt_fieldcat TYPE lvc_t_fcat, "FCAT
gs_fieldcat TYPE LINE OF lvc_t_fcat, "FCAT
gt_f4 TYPE lvc_t_f4 WITH HEADER LINE, "搜索帮助
gs_layout TYPE lvc_s_layo , "布局结构
gs_variant TYPE disvariant, "字段格式保存
gt_sort TYPE TABLE OF lvc_s_sort, "用于排序
gs_sort TYPE lvc_s_sort, "用于排序
gt_index TYPE lvc_t_col, "选择列
gt_filt TYPE lvc_t_filt. "用于过滤
DATA:gs_stable TYPE lvc_s_stbl. "刷新稳定
DATA:filt_table TYPE lvc_t_fidx."过滤内表
DATA: gt_nu3_rows TYPE lvc_t_row, "获取行
gt_nu3_no TYPE lvc_t_roid,
gs_nu3_no TYPE lvc_s_roid.
*&---------------------------------------------------------------------*
* DEFINE VARIABLE 变量
*&---------------------------------------------------------------------*
DATA:gv_ok_code LIKE sy-ucomm.
*&---------------------------------------------------------------------*
* DEFIEN INNER TABLE 内表
*&---------------------------------------------------------------------*
DATA:BEGIN OF gs_alv,
opertype TYPE char1,
bukrs TYPE ztmm030-bukrs, "公司代码
lifnr TYPE ztmm030-lifnr, "供应商科目编号
unw_reason TYPE bp001-unw_reason, "供应商等级
unw_text TYPE tp18t-unw_text, "供应商等级描述
minbw TYPE ztmm030-minbw, "预付款总额度
zhsla TYPE ztmm030-zhsla, "已预付金额
zhslb TYPE ztmm030-zhslb, "应付暂估金额
yfkye TYPE ztmm030-yfkye, "预付款余额
name TYPE lfa1-name1, "//客商名称
zsel TYPE char1, "选择
zcheck TYPE char30, "红绿灯
message TYPE char220, "消息
END OF gs_alv.
DATA:gt_alv LIKE TABLE OF gs_alv.
FIELD-SYMBOLS:<fs_alv> LIKE gs_alv.
*--------------------------------------------------------------------*
* 定义 类
*---------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
handle_toolbar "自定义工具栏
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
handle_user_command "自定义按钮
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
*--基于单元格的效验
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,
*--在数据修改完成之后
handle_data_changed_finished
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells ,
*--搜索帮助
handle_onf4
FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname es_row_no er_event_data,
handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no,
handle_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid "屏幕中的单击事件,可以具体到某行某列,需要设置热点
IMPORTING e_row_id e_column_id es_row_no.
ENDCLASS.
*&---------------------------------------------------------------------*
* CLASS实例化
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
*--HANDLE DATA CHANGED FINISHED
METHOD handle_data_changed_finished.
PERFORM frm_data_changed_finished USING e_modified et_good_cells .
ENDMETHOD. "HANDLE_DATA_CHANGED_FINISHED
METHOD handle_data_changed. "单元格事件触发相关
* PERFORM FRM_HANDLE_DATA_CHANGED USING ER_DATA_CHANGED.
ENDMETHOD. "HANDLE_DATA_CHANGED
METHOD handle_toolbar.
DATA: ls_toolbar TYPE stb_button.
MOVE 'REFRESH' TO ls_toolbar-function.
MOVE icon_refresh TO ls_toolbar-icon.
MOVE '刷新' TO ls_toolbar-quickinfo.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar.
MOVE 'SELALL' TO ls_toolbar-function.
MOVE icon_select_all TO ls_toolbar-icon.
MOVE '全选' TO ls_toolbar-quickinfo.
MOVE '全选' TO ls_toolbar-text.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar.
MOVE 'DELALL' TO ls_toolbar-function.
MOVE icon_deselect_all TO ls_toolbar-icon.
MOVE '取消全选' TO ls_toolbar-quickinfo.
MOVE '取消全选' TO ls_toolbar-text.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar.
MOVE 'ZPOST' TO ls_toolbar-function.
MOVE icon_okay TO ls_toolbar-icon.
MOVE '上传' TO ls_toolbar-quickinfo.
MOVE '上传' TO ls_toolbar-text.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar.
ENDMETHOD.
METHOD handle_user_command.
PERFORM frm_handle_user_command USING e_ucomm.
ENDMETHOD.
METHOD handle_double_click.
PERFORM handle_double_click USING e_row e_column es_row_no.
ENDMETHOD.
*--搜索帮助
METHOD handle_onf4.
* PERFORM FRM_HANDLE_ONF4 USING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA.
ENDMETHOD .
METHOD handle_hotspot_click.
PERFORM handle_hotspot_click USING e_row_id e_column_id es_row_no.
ENDMETHOD.
ENDCLASS. "LCL_EVENT_HANDLER IMPLEMENTATION
*&---------------------------------------------------------------------*
* DEFINE SCREEN 选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001 .
SELECT-OPTIONS:s_bukrs FOR csks-bukrs MODIF ID m1,
s_lifnr FOR lfa1-lifnr MODIF ID m1.
SELECTION-SCREEN END OF BLOCK b1 .
*&---------------------------------------------------------------------*
* INITIALIZATION 初始化
INITIALIZATION.
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_hbkid-low.
* PERFORM f4_s_hbkid.
*
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_hbkid-high.
* PERFORM f4_s_hbkid.
*
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_hktid-low.
* PERFORM f4_s_hktid.
*
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_hktid-high.
* PERFORM f4_s_hktid.
AT SELECTION-SCREEN OUTPUT.
*&---------------------------------------------------------------------*
* AT SELECTION-SCREEN
*&------------------------------- --------------------------------------*
AT SELECTION-SCREEN.
"权限校验
PERFORM frm_authority_check.
*&---------------------------------------------------------------------*
* START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
"读取数据
PERFORM frm_get_data.
"调用屏幕
IF sy-batch EQ 'X'.
PERFORM frm_zpost_data."上传
ELSE.
CALL SCREEN 9000.
ENDIF.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form f4_s_hbkid
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f4_s_hbkid .
SELECT vfclmshlpacntid~hbkid, bnka~banka FROM vfclmshlpacntid
LEFT JOIN bnka ON vfclmshlpacntid~bankl = bnka~bankl AND vfclmshlpacntid~banks = bnka~banks
INTO TABLE @DATA(lt_hbkid).
SORT lt_hbkid BY hbkid banka.
DELETE ADJACENT DUPLICATES FROM lt_hbkid COMPARING hbkid banka.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'HBKID'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'S_HBKID'
value_org = 'S'
callback_program = sy-repid
TABLES
value_tab = lt_hbkid
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f4_s_hktid
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f4_s_hktid .
SELECT vfclmshlpacntid~hktid FROM vfclmshlpacntid INTO TABLE @DATA(lt_hktid).
SORT lt_hktid BY hktid.
DELETE ADJACENT DUPLICATES FROM lt_hktid COMPARING hktid.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'HKTID'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'S_HKTID'
value_org = 'S'
callback_program = sy-repid
TABLES
value_tab = lt_hktid
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
* IMPLEMENT SUITABLE ERROR HANDLING HERE
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_authority_check
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_authority_check .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
IF gv_alv IS INITIAL . "ALV对象如果为空,则生成对象,把ALV放入容器中
CREATE OBJECT gv_container
EXPORTING
repid = sy-repid
dynnr = '9000'
extension = 2050
side = cl_gui_docking_container=>property_floating.
CREATE OBJECT gv_alv
EXPORTING
i_parent = gv_container.
PERFORM frm_build_fieldcat.
* PERFORM FRM_BUILD_SORT. "排序
PERFORM frm_exclude_tb_functions CHANGING gt_exclude. "去掉不用的菜单按钮
PERFORM frm_prepare_layout CHANGING gs_layout . "获取样式
PERFORM frm_eventload. "读取事件(总)
*-----显示ALV-------------------------------------------
CLEAR gs_variant.
gs_variant = sy-repid.
* CALL METHOD gv_alv->set_drop_down_table
* EXPORTING
* it_drop_down = gt_dropdowm. "添加下拉框方法到ALV中顯示
CALL METHOD gv_alv->set_table_for_first_display
EXPORTING
is_layout = gs_layout
it_toolbar_excluding = gt_exclude
is_variant = gs_variant
i_save = 'A'
CHANGING
it_outtab = gt_alv
it_fieldcatalog = gt_fieldcat
it_sort = gt_sort
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CALL METHOD gv_alv->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
ELSE .
*----------------------------刷新ALV----------------------
PERFORM frm_refurbish_alv. "刷新ALV
ENDIF .
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM FRM_REFURBISH_ALV
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& --> P1 TEXT
*& <-- P2 TEXT
*&---------------------------------------------------------------------*
FORM frm_refurbish_alv. " 调整可更改的单元格
*----------------------------刷新ALV----------------------
gs_stable-row = 'X'.
gs_stable-col = 'X'.
CALL METHOD gv_alv->refresh_table_display
EXPORTING
is_stable = gs_stable
EXCEPTIONS
finished = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CLEAR gs_stable.
ENDFORM.
FORM frm_build_fieldcat .
DATA:lv_fieldname TYPE char20,
lv_fieldvalue TYPE char20,
lv_colindex TYPE char2.
REFRESH: gt_fieldcat .
PERFORM frm_get_fieldcat USING: 'ZSEL' '选择' '' '' '' '' 'X' 'X' '' .
PERFORM frm_get_fieldcat USING: 'ZCHECK' '红绿灯' '' '' '' '' '' '' '' .
PERFORM frm_get_fieldcat USING: 'MESSAGE' '消息' '' '' '' '' '' '' '' .
PERFORM frm_get_fieldcat USING: 'BUKRS' '公司代码' 'ZTMM030' 'BUKRS' '' '' '' '' '' .
PERFORM frm_get_fieldcat USING: 'LIFNR' '供应商科目编号' 'ZTMM030' 'LIFNR' '' '' '' '' '' .
PERFORM frm_get_fieldcat USING: 'NAME' '供应商名称' 'LFA1' 'NAME1' '' '' '' '' '' .
PERFORM frm_get_fieldcat USING: 'UNW_REASON' '供应商等级' 'BP001' 'UNW_REASON' '' '' '' '' '' .
PERFORM frm_get_fieldcat USING: 'UNW_TEXT' '供应商等级描述' 'TP18T' 'UNW_TEXT' '' '' '' '' '' .
PERFORM frm_get_fieldcat USING: 'MINBW' '预付款总额度' 'ZTMM030' 'MINBW' '' '' '' '' '' .
PERFORM frm_get_fieldcat USING: 'ZHSLA' '已预付金额' 'ZTMM030' 'ZHSLA' '' '' '' '' '' .
PERFORM frm_get_fieldcat USING: 'ZHSLB' '应付暂估金额' 'ZTMM030' 'ZHSLB' '' '' '' '' '' .
PERFORM frm_get_fieldcat USING: 'YFKYE' '预付款余额' 'ZTMM030' 'YFKYE' '' '' '' '' '' .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- GT_EXCLUDE
*&---------------------------------------------------------------------*
FORM frm_exclude_tb_functions CHANGING p_gt_exclude TYPE ui_functions.
CLEAR:gt_exclude.
DATA ls_exclude TYPE ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row .
APPEND ls_exclude TO gt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy .
APPEND ls_exclude TO gt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row .
APPEND ls_exclude TO gt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut .
APPEND ls_exclude TO gt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row .
APPEND ls_exclude TO gt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row .
APPEND ls_exclude TO gt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row .
APPEND ls_exclude TO gt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste .
APPEND ls_exclude TO gt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row .
APPEND ls_exclude TO gt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo .
APPEND ls_exclude TO gt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_print .
APPEND ls_exclude TO gt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_refresh.
APPEND ls_exclude TO gt_exclude.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM PREPARE_LAYOUT_9001
*&---------------------------------------------------------------------*
* 获取显示状态
*----------------------------------------------------------------------*
* -->P_GDS_LAYOUT TEXT
*----------------------------------------------------------------------*
FORM frm_prepare_layout CHANGING p_gds_layout TYPE lvc_s_layo.
CLEAR:gs_layout.
p_gds_layout-cwidth_opt = 'X'. "最优化宽度
p_gds_layout-zebra = 'X'. "间隔颜色
p_gds_layout-sel_mode = 'A'. "选择模式
p_gds_layout-no_rowmark = 'X'.
* P_GDS_LAYOUT-STYLEFNAME = 'CELTAB'.
ENDFORM. " PREPARE_LAYOUT
*&---------------------------------------------------------------------*
*& Form FRM_EVENTLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_eventload .
DATA lv_event_handler TYPE REF TO lcl_event_handler . "事件响应
CREATE OBJECT lv_event_handler.
DATA:lt_f4 TYPE lvc_t_f4,
ls_f4 TYPE lvc_s_f4.
IF gv_alv IS NOT INITIAL.
CALL METHOD gv_alv->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
SET HANDLER lv_event_handler->handle_data_changed FOR gv_alv.
SET HANDLER lv_event_handler->handle_data_changed_finished FOR gv_alv.
SET HANDLER lv_event_handler->handle_double_click FOR gv_alv.
SET HANDLER lv_event_handler->handle_toolbar FOR gv_alv. "注册工具栏
SET HANDLER lv_event_handler->handle_user_command FOR gv_alv. "注册用户自定义命令
SET HANDLER lv_event_handler->handle_onf4 FOR gv_alv. "F4
SET HANDLER lv_event_handler->handle_hotspot_click FOR gv_alv. "单击
DATA lv_event_handler1 TYPE REF TO lcl_event_handler . "事件响应
CREATE OBJECT lv_event_handler1.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_data_changed_finished
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_MODIFIED
*& --> ET_GOOD_CELLS
*&---------------------------------------------------------------------*
FORM frm_data_changed_finished USING e_modified et_good_cells TYPE lvc_t_modi.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_UCOMM
*&---------------------------------------------------------------------*
FORM frm_handle_user_command USING p_e_ucomm.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid,
rs_selfield TYPE slis_selfield.
CASE p_e_ucomm.
WHEN 'SELALL'.
CLEAR:filt_table.
CALL METHOD gv_alv->get_filtered_entries
IMPORTING
et_filtered_entries = filt_table. "被过滤的内表数据行
LOOP AT gt_alv ASSIGNING <fs_alv>.
READ TABLE filt_table TRANSPORTING NO FIELDS WITH KEY table_line = sy-tabix.
IF sy-subrc <> 0.
<fs_alv>-zsel = 'X'.
ENDIF.
ENDLOOP.
WHEN 'DELALL'.
CLEAR:filt_table.
CALL METHOD gv_alv->get_filtered_entries
IMPORTING
et_filtered_entries = filt_table. "被过滤的内表数据行
LOOP AT gt_alv ASSIGNING <fs_alv>.
READ TABLE filt_table TRANSPORTING NO FIELDS WITH KEY table_line = sy-tabix.
IF sy-subrc <> 0.
<fs_alv>-zsel = ''.
ENDIF.
ENDLOOP.
WHEN 'REFRESH'."刷新
PERFORM frm_get_data.
WHEN 'ZPOST'.
PERFORM frm_zpost_data."上传
WHEN OTHERS.
ENDCASE.
PERFORM frm_refurbish_alv.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form handle_double_click
*&---------------------------------------------------------------------*
*& text双击
*&---------------------------------------------------------------------*
*& --> E_ROW
*& --> E_COLUMN
*&---------------------------------------------------------------------*
FORM handle_double_click USING e_rowtype TYPE lvc_s_row
e_column TYPE lvc_s_col
e_row_no TYPE lvc_s_roid.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form handle_hotspot_click
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_ROW_ID
*& --> E_COLUMN_ID
*& --> ES_ROW_NO
*&---------------------------------------------------------------------*
FORM handle_hotspot_click USING e_row_id TYPE lvc_s_row
e_column_id TYPE lvc_s_col
es_row_no TYPE lvc_s_roid.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'S001'.
SET TITLEBAR 'T001'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module DISPLAY_ALV OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE display_alv OUTPUT.
PERFORM frm_display_alv.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
CLEAR gv_ok_code.
gv_ok_code = sy-ucomm.
CASE gv_ok_code.
WHEN '&F03' OR '&F15' OR '&F12'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
CLEAR:gv_ok_code.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data .
SELECT DISTINCT
a~bukrs,
a~lifnr,
d~name1 AS name,
a~zgrup AS unw_reason,
c~unw_text ,
a~webtr AS minbw
FROM lfb1 AS a
INNER JOIN lfa1 AS d ON a~lifnr = d~lifnr
INNER JOIN bp001 AS b ON a~lifnr = b~partner
LEFT JOIN tp18t AS c ON A~zgrup = c~unw_reason AND c~langu EQ 1
WHERE a~bukrs IN @s_bukrs AND a~lifnr IN @s_lifnr
INTO CORRESPONDING FIELDS OF TABLE @gt_alv.
*已预付金额
WITH +data AS ( SELECT DISTINCT bukrs,lifnr FROM @gt_alv AS zdata )
SELECT
a~bukrs,
a~lifnr,
SUM( b~hsl ) AS hsl
FROM +data AS a
INNER JOIN acdoca AS b ON b~rbukrs = a~bukrs AND b~lifnr = a~lifnr
WHERE b~drcrk EQ 'S' AND b~racct EQ '1123020101'
GROUP BY a~bukrs, a~lifnr
INTO TABLE @DATA(lt_acdoca_a) .
*应付暂估金额
IF sy-mandt EQ '110'.
WITH +data AS ( SELECT DISTINCT bukrs,lifnr FROM @gt_alv AS zdata )
SELECT
a~bukrs,
a~lifnr,
SUM( b~hsl ) AS hsl
FROM +data AS a
INNER JOIN acdoca AS b ON b~rbukrs = a~bukrs AND b~lifnr = a~lifnr
WHERE b~blart EQ 'WE' AND b~racct EQ '2202030101'
GROUP BY a~bukrs, a~lifnr
INTO TABLE @DATA(lt_acdoca_b) .
ELSE.
WITH +data AS ( SELECT DISTINCT bukrs,lifnr FROM @gt_alv AS zdata )
SELECT
a~bukrs,
a~lifnr,
SUM( b~hsl ) AS hsl
FROM +data AS a
INNER JOIN acdoca AS b ON b~rbukrs = a~bukrs AND b~lifnr = a~lifnr
WHERE b~blart EQ 'WE' AND b~racct EQ '1123020101'
GROUP BY a~bukrs, a~lifnr
INTO TABLE @lt_acdoca_b.
ENDIF.
* zhsla TYPE ztmm030-zhsla, "已预付金额
* zhslb TYPE ztmm030-zhslb, "应付暂估金额
* yfkye TYPE ztmm030-yfkye, "预付款余额
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs>).
READ TABLE lt_acdoca_a INTO DATA(ls_acdoca_a) WITH KEY bukrs = <fs>-bukrs lifnr = <fs>-lifnr.
IF sy-subrc EQ 0.
<fs>-zhsla = ls_acdoca_a-hsl.
ENDIF.
READ TABLE lt_acdoca_b INTO DATA(ls_acdoca_b) WITH KEY bukrs = <fs>-bukrs lifnr = <fs>-lifnr.
IF sy-subrc EQ 0.
<fs>-zhslb = ls_acdoca_b-hsl * ( 113 / 100 ).
ENDIF.
<fs>-yfkye = <fs>-minbw - <fs>-zhsla - <fs>-zhslb.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ZPOST_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_zpost_data .
IF sy-batch = 'X'."后台 全量
LOOP AT gt_alv ASSIGNING <fs_alv>.
<fs_alv>-zsel = 'X'.
ENDLOOP.
ENDIF.
*
READ TABLE gt_alv ASSIGNING <fs_alv> WITH KEY zsel = 'X'.
IF sy-subrc <> 0.
MESSAGE '请选择数据' TYPE 'S' DISPLAY LIKE 'E'. RETURN.
ENDIF.
"判断是I , U , D
"查询底表
SELECT * FROM ztmm030 INTO TABLE @DATA(lt_log).
LOOP AT gt_alv ASSIGNING <fs_alv> WHERE zsel = 'X'.
READ TABLE lt_log INTO DATA(ls_log) WITH KEY lifnr = <fs_alv>-lifnr bukrs = <fs_alv>-bukrs .
IF sy-subrc = 0.
<fs_alv>-opertype = 'U'.
ELSE.
<fs_alv>-opertype = 'I'.
ENDIF.
ENDLOOP.
* 日志表
DATA:lt_ztmm030 TYPE TABLE OF ztmm030,
ls_ztmm030 TYPE ztmm030.
DATA:BEGIN OF ls_name ,
abap TYPE abap_compname,
json TYPE string,
END OF ls_name ,
lt_name LIKE HASHED TABLE OF ls_name WITH UNIQUE KEY abap.
lt_name[] = VALUE #(
( abap = 'OPERTYPE' json = 'opertype' )
( abap = 'NAME' json = 'name' )
( abap = 'BUKRS' json = 'BUKRS' )
( abap = 'LIFNR' json = 'LIFNR' )
( abap = 'ZGRUP' json = 'ZGRUP' )
( abap = 'WEBTR' json = 'WEBTR' )
( abap = 'HSL' json = 'HSL' )
( abap = 'YFKYE' json = 'YFKYE' )
).
DATA:BEGIN OF ls_data,
opertype TYPE char1,
bukrs TYPE ztmm030-bukrs, "公司代码
name TYPE lfa1-name1, "//客商名称
lifnr TYPE ztmm030-lifnr, "供应商科目编号
zgrup TYPE tp18t-unw_text, " 供应商等级 unw_text
webtr TYPE lfa1-name1, " //预付款总额度 minbw
hsl TYPE lfa1-name1, " //已预付金额 zhsla
yfkye TYPE lfa1-name1, " //预付款余额 yfkye
END OF ls_data.
DATA:BEGIN OF ls_out,
data LIKE TABLE OF ls_data,
END OF ls_out.
TYPES:BEGIN OF ty_code,
code TYPE string,
message TYPE string,
END OF ty_code.
DATA:BEGIN OF ls_ret,
code TYPE char1,
data TYPE ty_code,
message TYPE bapi_msg,
END OF ls_ret.
DATA: lv_url TYPE string,
lt_fields TYPE tihttpnvp,
lv_send TYPE string,
lv_type TYPE bapi_mtype,
lv_message TYPE string,
lv_response TYPE string.
CONSTANTS service_name TYPE string VALUE 'syncCreditResource/syncCredit'.
SELECT SINGLE *
FROM ztif_url
WHERE system_id = 'OA'
AND active_flg IS NOT INITIAL
INTO @DATA(ls_url).
IF sy-subrc <> 0.
MESSAGE '请维护外围系统URL配置表' TYPE 'S' DISPLAY LIKE 'E'. RETURN.
ENDIF.
CHECK ls_url-url IS NOT INITIAL.
"创建客户端请求
lv_url = |{ ls_url-url }{ service_name }|.
lt_fields = VALUE #( ( name = 'Content-Type' value = 'application/json' ) ).
CLEAR:gs_alv,lv_send,lv_type,lv_message,lv_response,ls_ret,ls_out.
LOOP AT gt_alv INTO gs_alv WHERE zsel = 'X'.
CLEAR:ls_data.
MOVE-CORRESPONDING gs_alv TO ls_data.
ls_data-lifnr = |{ ls_data-lifnr ALPHA = OUT }|.
ls_data-zgrup = gs_alv-unw_reason."供应商等级 unw_text
ls_data-webtr = gs_alv-minbw." //预付款总额度 minbw
CONDENSE ls_data-webtr.
ls_data-hsl = gs_alv-zhsla. " //已预付金额 zhsla
CONDENSE ls_data-hsl.
ls_data-yfkye = gs_alv-yfkye. " //预付款余额 yfkye
CONDENSE ls_data-yfkye.
APPEND ls_data TO ls_out-data.
ENDLOOP.
/ui2/cl_json=>serialize( EXPORTING data = ls_out
pretty_name = 'X'
numc_as_string = 'X'
name_mappings = lt_name
RECEIVING r_json = lv_send ). "传入数据
BREAK itl_abap04.
CALL FUNCTION 'ZFM_RESTFUL_SEND'
EXPORTING
iv_url = lv_url
it_fields = lt_fields
iv_send_data = lv_send
IMPORTING
ev_type = lv_type
ev_message = lv_message
ev_response_data = lv_response.
"反序列json解析
/ui2/cl_json=>deserialize( EXPORTING json = lv_response
CHANGING data = ls_ret ).
IF ls_ret-data-code EQ '1'.
gs_alv-message = '推送失败' && ls_ret-data-message.
MODIFY gt_alv FROM VALUE #( zcheck = icon_led_red message = gs_alv-message )
TRANSPORTING zcheck message WHERE zsel EQ 'X'.
ELSE.
MODIFY gt_alv FROM VALUE #( zcheck = icon_led_green message = '推送成功' )
TRANSPORTING zcheck message WHERE zsel EQ 'X'.
LOOP AT gt_alv INTO gs_alv WHERE zsel = 'X'.
CLEAR ls_ztmm030.
MOVE-CORRESPONDING gs_alv TO ls_ztmm030.
APPEND ls_ztmm030 TO lt_ztmm030.
ENDLOOP.
IF lt_ztmm030[] IS NOT INITIAL.
MODIFY ztmm030 FROM TABLE lt_ztmm030[].
COMMIT WORK AND WAIT.
ENDIF.
ENDIF.
ENDFORM.
FORM frm_get_fieldcat USING p1 p2 p3 p4 p5 p6 p7 p8 p9.
CLEAR: gs_fieldcat.
gs_fieldcat-fieldname = p1.
gs_fieldcat-coltext = p2.
gs_fieldcat-scrtext_l = p2.
gs_fieldcat-scrtext_m = p2.
gs_fieldcat-scrtext_s = p2.
gs_fieldcat-ref_table = p3.
gs_fieldcat-ref_field = p4.
gs_fieldcat-emphasize = p5.
gs_fieldcat-fix_column = p6.
gs_fieldcat-edit = p7.
gs_fieldcat-checkbox = p8.
gs_fieldcat-hotspot = p9.
APPEND gs_fieldcat TO gt_fieldcat.
ENDFORM.
FUNCTION zfm_restful_send.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(IV_URL) TYPE STRING
*" VALUE(IV_METHOD) TYPE STRING DEFAULT 'POST'
*" VALUE(IV_USERNAME) TYPE STRING OPTIONAL
*" VALUE(IV_PASSWORD) TYPE STRING OPTIONAL
*" VALUE(IT_FIELDS) TYPE TIHTTPNVP OPTIONAL
*" VALUE(IV_SEND_DATA) TYPE STRING OPTIONAL
*" EXPORTING
*" VALUE(EV_TYPE) TYPE BAPI_MTYPE
*" VALUE(EV_MESSAGE) TYPE STRING
*" VALUE(EV_RESPONSE_DATA) TYPE STRING
*"----------------------------------------------------------------------
" 接口日志写入
/afl/log_init.
TYPES: BEGIN OF ty_response,
code TYPE char1,
message TYPE string,
END OF ty_response.
DATA: ls_response TYPE ty_response.
DATA:lo_http_client TYPE REF TO if_http_client,
lv_code TYPE i.
DATA:lv_proxy_host TYPE string.
DATA:lv_proxy_service TYPE string.
DATA: lv_ssl_id TYPE ssfapplssl .
IF sy-host = 'vhhsgps4ci'.
lv_proxy_host = 'proxy'.
lv_proxy_service = '3128'.
ENDIF.
*创建客户端请求
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = iv_url
proxy_host = lv_proxy_host
proxy_service = lv_proxy_service
ssl_id = lv_ssl_id
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
pse_not_found = 4
pse_not_distrib = 5
pse_errors = 6
oa2c_set_token_error = 7
oa2c_missing_authorization = 8
oa2c_invalid_config = 9
oa2c_invalid_parameters = 10
oa2c_invalid_scope = 11
oa2c_invalid_grant = 12
OTHERS = 13.
IF sy-subrc <> 0.
ev_type = 'E'.
lo_http_client->get_last_error( IMPORTING message = ev_message ).
ev_message = '创建代理失败!' && ev_message.
RETURN.
ENDIF.
*不显示登录界面
lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.
*设置账号+密码
IF iv_username IS NOT INITIAL AND iv_password IS NOT INITIAL.
lo_http_client->authenticate( EXPORTING username = iv_username password = iv_password ).
ENDIF.
*设定调用服务
lo_http_client->request->set_method( EXPORTING method = iv_method ).
*设置Headers
lo_http_client->request->set_header_fields( EXPORTING fields = it_fields[] ).
*设置报文数据
IF iv_send_data IS NOT INITIAL.
CALL METHOD lo_http_client->request->set_cdata
EXPORTING
data = iv_send_data
offset = 0
length = strlen( iv_send_data ).
ENDIF.
*发送请求
CALL METHOD lo_http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2.
IF sy-subrc <> 0.
ev_type = 'E'.
lo_http_client->get_last_error( IMPORTING message = ev_message ).
ev_message = '发送请求失败!' && ev_message.
RETURN.
ENDIF.
*读取远程服务返回的处理过结果
CALL METHOD lo_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
IF sy-subrc <> 0 .
ev_type = 'E'.
lo_http_client->get_last_error( IMPORTING message = ev_message ).
ev_message = '获取返回消息失败!' && ev_message.
RETURN.
ELSE.
CALL METHOD lo_http_client->response->get_status
IMPORTING
code = lv_code
reason = ev_message.
IF lv_code BETWEEN '200' AND '299'.
ev_type = 'S'.
ev_message = '调用接口成功!'.
ELSE.
ev_type = 'E'.
ev_message = '返回码提示失败!' && ev_message.
ENDIF.
*读取返回内容
ev_response_data = lo_http_client->response->get_cdata( ).
IF ev_response_data IS NOT INITIAL.
* REPLACE ALL OCCURRENCES OF '#' IN ev_response_data WITH space.
* CONDENSE ev_response_data NO-GAPS.
/ui2/cl_json=>deserialize( EXPORTING json = ev_response_data
CHANGING data = ls_response ).
IF ls_response-code = 1 AND ls_response-message IS NOT INITIAL.
ev_type = 'E'.
ev_message = ls_response-message && ev_message.
ENDIF.
ENDIF.
ENDIF.
" 保存日志
/afl/save.
ENDFUNCTION.