http发出代码

复制代码
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.
复制代码

 

posted @   ABAP-武汉  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示