ALV单击移动

*&---------------------------------------------------------------------*
*& Report YYRV005TEST37
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT yyrv005test37.
*----------------------------------------------------------------------*
* 数据库表声明/Database table declaration
*----------------------------------------------------------------------*
TABLES:mara.
DATA:ls_row_id    TYPE lvc_s_row,
     ls_column_id TYPE lvc_s_col,
     ls_row_no    TYPE lvc_s_roid.
*--------------------------------------------------------------------*
*内表定义
*--------------------------------------------------------------------*
TYPES: BEGIN OF ty_alv,
         matnr  TYPE mara-matnr,    "物料号
         mtart  TYPE mara-mtart,    "物料类型
         matkl  TYPE mara-matkl,    "物料组
         meins  TYPE mara-meins,    "基本计量单位
         zcheck TYPE c,
         icon   TYPE char4,
         msg    TYPE char50,
       END OF ty_alv.

TYPES:BEGIN OF ty_marc,
        matnr  TYPE marc-matnr,    "物料号
        werks  TYPE marc-werks,    "工厂
        bwtty  TYPE marc-bwtty,    "评估类别
        zcheck TYPE c,
      END OF ty_marc.

TYPES:BEGIN OF ty_makt,
        matnr  TYPE makt-matnr,    "物料号
        spras  TYPE makt-spras,    "语言代码
        maktx  TYPE makt-maktx,    "物料描述
        zcheck TYPE c,
      END OF ty_makt.
*----------------------------------------------------------------------*
* 全局变量定义/Global variable definition
*----------------------------------------------------------------------*
DATA:gt_alv1 TYPE STANDARD TABLE OF ty_alv,
     gs_alv1 TYPE ty_alv,
     gt_makt TYPE STANDARD TABLE OF ty_makt,
     gs_makt TYPE ty_makt,
     gt_marc TYPE STANDARD TABLE OF ty_marc,
     gs_marc TYPE ty_marc,
     lt_alv2 TYPE STANDARD TABLE OF ty_marc,
     ls_alv2 TYPE ty_marc,
     lt_alv3 TYPE STANDARD TABLE OF ty_makt,
     ls_alv3 TYPE ty_makt.

"创建ALV屏幕
DATA: g_grid_t         TYPE REF TO cl_gui_alv_grid, "顶部
      g_grid_l         TYPE REF TO cl_gui_alv_grid, "底部——左部
      g_grid_r         TYPE REF TO cl_gui_alv_grid, "底部——右部
      g_container_9000 TYPE REF TO cl_gui_docking_container, "ALV容器 不用画屏幕容器 cl_gui_custom_container, "ALV container容器 需要画屏幕容器
      g_splitter       TYPE REF TO cl_gui_splitter_container,
      g_splitter1      TYPE REF TO cl_gui_splitter_container,
      g_container_t    TYPE REF TO cl_gui_container, "顶部
      g_container_b    TYPE REF TO cl_gui_container, "底部
      g_container_l    TYPE REF TO cl_gui_container, "底部——左部
      g_container_r    TYPE REF TO cl_gui_container, "底部——右部
      gt_exclude_9000  TYPE ui_functions, "     用于去掉不要的菜单栏
      gt_fieldcat_t    TYPE lvc_t_fcat, "顶部字段
      gt_fieldcat_l    TYPE lvc_t_fcat, "底部——左部字段
      gt_fieldcat_r    TYPE lvc_t_fcat, "底部——右部字段
      gs_layout_l      TYPE lvc_s_layo, "底部——左部布局
      gs_layout_r      TYPE lvc_s_layo, "底部——右部布局
      gs_variant_t     TYPE disvariant,
      gs_variant_l     TYPE disvariant,
      gs_variant_r     TYPE disvariant,
      gt_sort          TYPE lvc_t_sort, "用于排序
      gs_sort          TYPE lvc_s_sort, "用于排序
      gt_filt          TYPE lvc_t_filt.

DATA:gv_9000   TYPE scrfname VALUE 'Z9000', "GV_TABLE 是屏幕中定义的控件
     r_ucomm   LIKE sy-ucomm,
     ok_code   TYPE sy-ucomm,
     save_code TYPE sy-ucomm.

*&---------------------------------------------------------------------*
*& 字段串定义/Field-symbols                                            *
*&---------------------------------------------------------------------*
FIELD-SYMBOLS:<fs_alv1> TYPE ty_alv.

*--------------------------------------------------------------------*
*ALV参数声明
*--------------------------------------------------------------------*
DATA: gt_fieldcat TYPE lvc_t_fcat, "字段目录内表
      gs_fieldcat TYPE lvc_s_fcat, "字段目录工作区
      gs_layout   TYPE lvc_s_layo. "用于定义ALV表单的相关格式、属性

*--------------------------------------------------------------------*
*定义选择屏幕参数
*--------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk0 WITH FRAME.
SELECT-OPTIONS: s_matnr FOR mara-matnr.  "物料
SELECT-OPTIONS: s_ersda FOR mara-ersda DEFAULT '20190801' TO sy-datum.  "创建日期
SELECTION-SCREEN END OF BLOCK blk0.
*&---------------------------------------------------------------------*
*& INITIALIZATION/选择屏幕前初始化                                     *
*&---------------------------------------------------------------------*
INITIALIZATION.

  CLASS alv_event_9000 DEFINITION DEFERRED."

CLASS alv_event_9000 DEFINITION INHERITING FROM cl_gui_alv_grid.

  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_user_command FOR EVENT user_command OF cl_gui_alv_grid"用户按钮事件
      IMPORTING e_ucomm.

    METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid"工具条事件
      IMPORTING e_object e_interactive.

    METHODS handle_delayed_sel_callback FOR EVENT delayed_changed_sel_callback OF cl_gui_alv_grid.
    METHODS handle_delayed_callback FOR EVENT delayed_callback OF cl_gui_alv_grid.
    METHODS constructor.
    METHODS set_delay_time.
ENDCLASS. "alv_event_9000 DEFINITION

*----------------------------------------------------------------------*
*   CLASS BELOW_ALV_EVENT IMPLEMENTATION 定义的事件类对应的事件响应模块
*----------------------------------------------------------------------*
CLASS alv_event_9000 IMPLEMENTATION.

  METHOD handle_double_click .      "双击事件
    PERFORM frm_double_click USING e_row e_column es_row_no.
  ENDMETHOD.                    "HANDLE_USER_COMMAND

  METHOD handle_user_command.       "用户按钮事件
    PERFORM frm_handle_user_command9000 USING e_ucomm.
  ENDMETHOD.                    "handle_hotspot_click

  METHOD  handle_toolbar.            "工具条事件
    PERFORM frm_handle_toolbar9000 USING e_object e_interactive."设置工具条图标
  ENDMETHOD.                    "HANDLE_DOUBLE_CLICK

  METHOD handle_delayed_sel_callback.
    "  IF  g_container_t IS NOT INITIAL.

    CALL METHOD g_grid_t->check_changed_data.

    CALL METHOD g_grid_t->get_current_cell
      IMPORTING
        es_row_id = ls_row_id
        es_col_id = ls_column_id
        es_row_no = ls_row_no.

    READ TABLE gt_alv1 INTO gs_alv1 INDEX ls_row_no-row_id.

    IF sy-subrc EQ 0.
      REFRESH:lt_alv2,lt_alv3.
      LOOP AT gt_marc INTO gs_marc WHERE matnr = gs_alv1-matnr.
        CLEAR:ls_alv2.
        MOVE-CORRESPONDING gs_marc TO ls_alv2.

        APPEND ls_alv2 TO lt_alv2.
        CLEAR:gs_marc.
      ENDLOOP.

      LOOP AT gt_makt INTO gs_makt WHERE matnr = gs_alv1-matnr.
        CLEAR:ls_alv3.
        MOVE-CORRESPONDING gs_makt TO ls_alv3.
        APPEND ls_alv3 TO lt_alv3.
        CLEAR:gs_makt.
      ENDLOOP.
    ENDIF.

    PERFORM frm_refresh_alv_9000 USING g_grid_t.
    PERFORM frm_refresh_alv_9000 USING g_grid_l.
    PERFORM frm_refresh_alv_9000 USING g_grid_r.
    "   ENDIF.
    CALL METHOD cl_gui_cfw=>flush.

  ENDMETHOD.

  METHOD handle_delayed_callback.
    CALL METHOD g_grid_t->check_changed_data.

    CALL METHOD g_grid_t->get_current_cell
      IMPORTING
        es_row_id = ls_row_id
        es_col_id = ls_column_id
        es_row_no = ls_row_no.

    READ TABLE gt_alv1 INTO gs_alv1 INDEX ls_row_no-row_id.

    IF sy-subrc EQ 0.
      REFRESH:lt_alv2,lt_alv3.
      LOOP AT gt_marc INTO gs_marc WHERE matnr = gs_alv1-matnr.
        CLEAR:ls_alv2.
        MOVE-CORRESPONDING gs_marc TO ls_alv2.

        APPEND ls_alv2 TO lt_alv2.
        CLEAR:gs_marc.
      ENDLOOP.

      LOOP AT gt_makt INTO gs_makt WHERE matnr = gs_alv1-matnr.
        CLEAR:ls_alv3.
        MOVE-CORRESPONDING gs_makt TO ls_alv3.
        APPEND ls_alv3 TO lt_alv3.
        CLEAR:gs_makt.
      ENDLOOP.
    ENDIF.

    PERFORM frm_refresh_alv_9000 USING g_grid_t.
    PERFORM frm_refresh_alv_9000 USING g_grid_l.
    PERFORM frm_refresh_alv_9000 USING g_grid_r.
    "   ENDIF.
    CALL METHOD cl_gui_cfw=>flush.

  ENDMETHOD.

  METHOD constructor.
    super->constructor( i_parent = g_container_t ). "cl_gui_container=>default_screen ).
  ENDMETHOD.

  METHOD set_delay_time.
    g_grid_t->set_delay_change_selection( 1 ).
    g_grid_t->set_delay_move_current_cell( 1 ).
  ENDMETHOD.

ENDCLASS. "alv_event_9000 IMPLEMENTATION

AT SELECTION-SCREEN.
*&---------------------------------------------------------------------*
*& Start-of-selection/开始选择屏幕                                     *
*&---------------------------------------------------------------------*
START-OF-SELECTION.

  "获取数据
  PERFORM frm_get_data.

*&---------------------------------------------------------------------*
*&      Form  FRM_LAYOUT
*&---------------------------------------------------------------------*
FORM frm_layout.
  CLEAR:gs_layout,gs_layout_l,gs_layout_r.
  gs_layout-grid_title = '第1个界面'.   "标题
  gs_layout-cwidth_opt = 'A'.   "优化列宽
  gs_layout-zebra = 'X'.        "斑马线
  gs_layout-sel_mode = 'A'.     "设置行模式"
  gs_layout-box_fname = 'ZCHECK'."选择行控制

  gs_layout_l = gs_layout_r = gs_layout.

  gs_layout_l-grid_title = '第2个界面'.   "标题
  gs_layout_r-grid_title = '第3个界面'.   "标题
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA3
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data.

  SELECT
    matnr"物料号
    mtart"物料类型
    matkl"物料组
    meins"基本计量单位
  FROM mara
  INTO TABLE gt_alv1
  WHERE matnr IN s_matnr
    AND ersda IN s_ersda.

  IF gt_alv1 IS NOT INITIAL.
    SELECT
      matnr"物料号
      werks"工厂
      bwtty"评估类别
    FROM marc
    INTO TABLE gt_marc
    FOR ALL ENTRIES IN gt_alv1
    WHERE matnr = gt_alv1-matnr.

    SELECT
      matnr"物料号
      spras"语言代码
      maktx"物料描述
    FROM makt
    INTO TABLE gt_makt
    FOR ALL ENTRIES IN gt_alv1
    WHERE matnr = gt_alv1-matnr.
  ENDIF.

  IF gt_alv1 IS INITIAL.
    MESSAGE '系统中无相关数据' TYPE 'S' DISPLAY LIKE 'E'.
    STOP.
  ELSE.
    CALL SCREEN 9000.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_FIELDCAT3
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_fieldcat4.
*&---alv 表头宏
  DEFINE init_fieldcat.
    CLEAR gs_fieldcat.
    gs_fieldcat-fieldname  = &1.    " 字段技术名称
    gs_fieldcat-coltext    = &2.    " 显示名称
    gs_fieldcat-ref_table  = &3.    " 参照表,标准功能实现例如搜索帮助
    gs_fieldcat-ref_field  = &4.    " 参照表字段,标准功能实现例如搜索帮助
    gs_fieldcat-no_init_ch = &5.
    gs_fieldcat-edit       = &6.    " 是否可以编辑
    gs_fieldcat-key        = &7.    "
    gs_fieldcat-hotspot    = &8.    "
    gs_fieldcat-outputlen  = &9.    "
    APPEND gs_fieldcat TO gt_fieldcat.
  END-OF-DEFINITION.

  REFRESH:gt_fieldcat.
  init_fieldcat 'MATNR' '物料号' '' '' '' '' '' '' '' .
  init_fieldcat 'MTART' '物料类型' '' '' '' '' '' '' '' .
  init_fieldcat 'MATKL' '物料组' '' '' '' '' '' '' '' .
  init_fieldcat 'MEINS' '基本计量单位' '' '' '' '' '' '' '' .
  gt_fieldcat_t = gt_fieldcat.

  REFRESH:gt_fieldcat.
  init_fieldcat 'MATNR' '物料号' '' '' '' '' '' '' '' .
  init_fieldcat 'WERKS' '工厂' '' '' '' '' '' '' '' .
  init_fieldcat 'BWTTY' '评估类别' '' '' '' '' '' '' '' .
  gt_fieldcat_l = gt_fieldcat.

  REFRESH:gt_fieldcat.
  init_fieldcat 'MATNR' '物料号' '' '' '' '' '' '' '' .
  init_fieldcat 'SPRAS' '语言代码' '' '' '' '' '' '' '' .
  init_fieldcat 'MAKTX' '物料描述' '' '' '' '' '' '' '' .
  gt_fieldcat_r = gt_fieldcat.


ENDFORM.

FORM frm_enter_data.
  MESSAGE '调用方法成功' TYPE 'S'.
ENDFORM.


MODULE status_9000 OUTPUT.
  SET PF-STATUS 'STANDARD'.
ENDMODULE.

MODULE display_alv_9000 OUTPUT.
  IF g_container_9000 IS NOT BOUND.
    PERFORM frm_create_container_9000.
*    PERFORM FRM_ALV_SORT_9000.
    PERFORM frm_fieldcat4.
    PERFORM frm_layout.
    PERFORM frm_alv_btn_exclude_9000.
    PERFORM frm_alv_event_9000.
    PERFORM frm_alv_display_9000.
  ELSE.
    PERFORM frm_refresh_alv_9000 USING g_grid_t.
    PERFORM frm_refresh_alv_9000 USING g_grid_l.
    PERFORM frm_refresh_alv_9000 USING g_grid_r.
  ENDIF.
ENDMODULE.


MODULE user_command_9000 INPUT.
  DATA: lt_row  TYPE lvc_t_row,
        lt_roid TYPE lvc_t_roid,
        ls_row  TYPE lvc_s_row.

  save_code = ok_code.
  CLEAR ok_code.
  CASE save_code.
    WHEN 'BACK'."设置功能键返回按钮单击事件
      LEAVE TO SCREEN 0.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.

*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_CONTAINER_9000
*&      创建容器
*&---------------------------------------------------------------------*
FORM frm_create_container_9000.
*  创建 容器

  CREATE OBJECT g_container_9000
    EXPORTING
      repid                       = sy-repid
      dynnr                       = '9000'
*     side                        = cl_gui_docking_container=>dock_at_right      ”ALV贴屏幕右边,从屏幕右边开始算宽度
      side                        = cl_gui_docking_container=>dock_at_top       "ALV贴屏幕左边,从左边算屏幕宽度,
      extension                   = 1000                                          "屏幕宽度
*     ratio                       = 95  "屏幕比例 小于5大于95会报cntl_error异常
      style                       = cl_gui_control=>ws_child                     "可选参数,设置ALV是否可用手动拖动大小
    EXCEPTIONS
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5
      OTHERS                      = 6.

  IF sy-subrc <> 0.
    MESSAGE s001(00) WITH '屏幕初始化失败'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  "拆分成2行1列部分
  CREATE OBJECT g_splitter
    EXPORTING
      parent  = g_container_9000
      rows    = 2
      columns = 1.

  "一行一列
  CALL METHOD g_splitter->get_container
    EXPORTING
      row       = 1
      column    = 1
    RECEIVING
      container = g_container_t.

  CALL METHOD g_splitter->set_column_width
    EXPORTING
      id    = 1
      width = 100.

  "二行一列*
  CALL METHOD g_splitter->get_container
    EXPORTING
      row       = 2
      column    = 1
    RECEIVING
      container = g_container_b.

  "拆分成一行二列部分*
  CREATE OBJECT g_splitter1
    EXPORTING
      parent  = g_container_b
      rows    = 1
      columns = 2.

  "一行一列*
  CALL METHOD g_splitter1->get_container
    EXPORTING
      row       = 1
      column    = 1
    RECEIVING
      container = g_container_l.

  CALL METHOD g_splitter1->set_column_width
    EXPORTING
      id    = 2
      width = 50.

  "*一行二列*
  CALL METHOD g_splitter1->get_container
    EXPORTING
      row       = 1
      column    = 2
    RECEIVING
      container = g_container_r.

  CALL METHOD g_splitter1->set_column_width
    EXPORTING
      id    = 3
      width = 50.

  CREATE OBJECT g_grid_t "上半部分
    EXPORTING
      i_parent = g_container_t.

  CREATE OBJECT g_grid_l "左半部分
    EXPORTING
      i_parent = g_container_l.

  CREATE OBJECT g_grid_r "右半部分
    EXPORTING
      i_parent = g_container_r.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_BTN_EXCLUDE_9000
*&      排除不用的按钮
*&---------------------------------------------------------------------*
FORM frm_alv_btn_exclude_9000.

  DATA: ls_exclude TYPE ui_func.
  REFRESH gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_detail.
  APPEND ls_exclude TO gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
  APPEND ls_exclude TO gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut.
  APPEND ls_exclude TO gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste.
  APPEND ls_exclude TO gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
  APPEND ls_exclude TO gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row.
  APPEND ls_exclude TO gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
  APPEND ls_exclude TO gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_check.
  APPEND ls_exclude TO gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
  APPEND ls_exclude TO gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
  APPEND ls_exclude TO gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
  APPEND ls_exclude TO gt_exclude_9000.

  CLEAR ls_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_refresh.
  APPEND ls_exclude TO gt_exclude_9000.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_EVENT_9000
*&---------------------------------------------------------------------*
FORM frm_alv_event_9000.
  DATA: lr_event_handler TYPE REF TO alv_event_9000.

*  CALL METHOD G_GRID_T->register_edit_event  "注册回车事件
*    EXPORTING
*      i_event_id = cl_gui_alv_grid=>mc_evt_enter.
*
*  CALL METHOD g_grid_9000->register_edit_event  "注册失去鼠标事件
*    EXPORTING
*      i_event_id = cl_gui_alv_grid=>mc_evt_modified.

  IF lr_event_handler IS INITIAL.
    CREATE OBJECT lr_event_handler.
  ENDIF.

*  SET HANDLER LR_EVENT_HANDLER->HANDLE_DATA_CHANGED FOR G_GRID_9000. "数据改动事件
  SET HANDLER lr_event_handler->handle_double_click FOR g_grid_t.
*  SET HANDLER LR_EVENT_HANDLER->HANDLE_ON_F4 FOR G_GRID_9000.
*  SET HANDLER LR_EVENT_HANDLER->HANDLE_HOTSPOT_CLICK FOR G_GRID_9000 .
  SET HANDLER lr_event_handler->handle_delayed_sel_callback FOR g_grid_t.
  SET HANDLER lr_event_handler->handle_delayed_callback FOR g_grid_t.
  SET HANDLER lr_event_handler->handle_toolbar FOR g_grid_t.      "工具栏事件
  SET HANDLER lr_event_handler->handle_user_command FOR g_grid_t. "用户命令事件

  CALL METHOD g_grid_t->register_delayed_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_delayed_change_select.


  CALL METHOD g_grid_t->register_delayed_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_delayed_move_curr_cell.

  CALL METHOD g_grid_t->set_table_for_first_display
    EXPORTING
*     I_CONSISTENCY_CHECK           = 'X'
      is_variant                    = gs_variant_t
      it_toolbar_excluding          = gt_exclude_9000
      i_save                        = 'A'
      i_default                     = 'X' "允许定义默认布局
      is_layout                     = gs_layout
    CHANGING
      it_outtab                     = gt_alv1
      it_fieldcatalog               = gt_fieldcat_t
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.
  IF sy-subrc <> 0.
  ENDIF.

  CALL METHOD lr_event_handler->set_delay_time( ).

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_DISPLAY_9000
*&---------------------------------------------------------------------*
FORM frm_alv_display_9000.

  CALL METHOD g_grid_l->set_table_for_first_display
    EXPORTING
*     I_CONSISTENCY_CHECK           = 'X'
      is_variant                    = gs_variant_l
      it_toolbar_excluding          = gt_exclude_9000
      i_save                        = 'A'
      i_default                     = 'X' "允许定义默认布局
      is_layout                     = gs_layout_l
*     IS_PRINT                      = GS_PRINT_H
    CHANGING
      it_outtab                     = lt_alv2
      it_fieldcatalog               = gt_fieldcat_l
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.
  IF sy-subrc <> 0.
  ENDIF.

  CALL METHOD g_grid_r->set_table_for_first_display
    EXPORTING
*     I_CONSISTENCY_CHECK           = 'X'
      is_variant                    = gs_variant_r
      it_toolbar_excluding          = gt_exclude_9000
      i_save                        = 'A'
      i_default                     = 'X' "允许定义默认布局
      is_layout                     = gs_layout_r
*     IS_PRINT                      = GS_PRINT_H
    CHANGING
      it_outtab                     = lt_alv3
      it_fieldcatalog               = gt_fieldcat_r
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.
  IF sy-subrc <> 0.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_DOUBLE_CLICK
*&---------------------------------------------------------------------*
FORM frm_double_click USING p_e_row_id TYPE lvc_s_row
      p_e_column_id TYPE lvc_s_col
      p_es_row_no TYPE lvc_s_roid.
  READ TABLE gt_alv1 INTO gs_alv1 INDEX p_es_row_no-row_id."得到点击的行
  IF sy-subrc EQ 0.
    REFRESH:lt_alv2,lt_alv3.
    LOOP AT gt_marc INTO gs_marc WHERE matnr = gs_alv1-matnr.
      CLEAR:ls_alv2.
      MOVE-CORRESPONDING gs_marc TO ls_alv2.

      APPEND ls_alv2 TO lt_alv2.
      CLEAR:gs_marc.
    ENDLOOP.

    LOOP AT gt_makt INTO gs_makt WHERE matnr = gs_alv1-matnr.
      CLEAR:ls_alv3.
      MOVE-CORRESPONDING gs_makt TO ls_alv3.
      APPEND ls_alv3 TO lt_alv3.
      CLEAR:gs_makt.
    ENDLOOP.

    PERFORM frm_refresh_alv_9000 USING g_grid_t.
    PERFORM frm_refresh_alv_9000 USING g_grid_l.
    PERFORM frm_refresh_alv_9000 USING g_grid_r.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
FORM frm_handle_user_command9000 USING pv_ucomm.

  CALL METHOD g_grid_t->get_selected_rows
    IMPORTING
      et_index_rows = lt_row
      et_row_no     = lt_roid.

  FIELD-SYMBOLS:<fs_zcheck>.
*  因为OOALV中侧边栏选择框不起作用,但是需要使用,就将选中的行的侧边栏的值修改一下
  LOOP AT gt_alv1 ASSIGNING <fs_alv1>.
    <fs_alv1>-zcheck = ''.
  ENDLOOP.

  IF lt_row IS NOT INITIAL.
    LOOP AT lt_row INTO ls_row.
      LOOP AT gt_alv1 ASSIGNING <fs_alv1>.
        IF sy-tabix = ls_row-index.
          <fs_alv1>-zcheck = 'X'.
        ENDIF.
      ENDLOOP.
      CLEAR:ls_row.
    ENDLOOP.
  ELSE.
    MESSAGE '请选择数据' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  CASE pv_ucomm.
    WHEN '&ENTER'."审批通过
      PERFORM frm_enter_data.
    WHEN OTHERS.
  ENDCASE.

  PERFORM frm_refresh_alv_9000 USING g_grid_t.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
FORM frm_handle_toolbar9000 USING p_object p_interactive.

  PERFORM frm_handle_toolbar_pro USING p_object '&ENTER' '@0V@' '确认'.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_HANDLE_TOOLBAR_PRO
*&---------------------------------------------------------------------*
FORM frm_handle_toolbar_pro USING p_object TYPE REF TO cl_alv_event_toolbar_set
      p_function TYPE stb_button-function
      p_icon TYPE stb_button-icon
      p_text TYPE stb_button-text.
  DATA: ls_toolbar   TYPE stb_button,
        lv_quickinfo TYPE stb_button-quickinfo.

  CLEAR ls_toolbar.
  MOVE 3 TO ls_toolbar-butn_type. " 分隔符
  APPEND ls_toolbar TO p_object->mt_toolbar.

  CLEAR ls_toolbar.
  MOVE 0 TO ls_toolbar-butn_type.   " 按钮(正常)
  MOVE p_function TO ls_toolbar-function. "功能码
  MOVE p_icon TO ls_toolbar-icon.   "图标
  MOVE p_text TO ls_toolbar-text.   "显示文本
  lv_quickinfo = p_text.
  MOVE lv_quickinfo  TO ls_toolbar-quickinfo.
  APPEND ls_toolbar TO p_object->mt_toolbar.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_REFRESH_ALV_9000
*&---------------------------------------------------------------------*
FORM frm_refresh_alv_9000 USING pv_grid TYPE REF TO cl_gui_alv_grid.
  DATA: lt_celltab TYPE lvc_t_styl,
        ls_celltab TYPE lvc_s_styl,
        ls_stable  TYPE lvc_s_stbl.

  ls_stable-row = 'X'.  "固定行
  ls_stable-col = 'X'.  "固定列

  CHECK pv_grid IS NOT INITIAL.

  CALL METHOD pv_grid->refresh_table_display
    EXPORTING
      is_stable = ls_stable
*     I_SOFT_REFRESH = 'X'
    EXCEPTIONS
      finished  = 1
      OTHERS    = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  CALL METHOD cl_gui_cfw=>flush.
ENDFORM.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值