OOALV的框架和部分功能

下面为 主程序代码

REPORT zfxorg0008.

TABLES: zfztorg01,zfztorg02,zfztorg03.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS:s_bukrs FOR zfztorg01-bukrs  NO-EXTENSION NO INTERVALS. ."OBLIGATORY
SELECT-OPTIONS:s_khinr FOR zfztorg01-khinr.
SELECTION-SCREEN END OF BLOCK b1 .

INCLUDE zfxorg0008_top.      "定义部分
INCLUDE zfxorg0008_class.    "类部分
INCLUDE zfxorg0008_bpo.      "
INCLUDE zfxorg0008_frm.      "方法部分
INCLUDE zfxorg0008_pai.      "

AT SELECTION-SCREEN.
*选择屏幕检查
  PERFORM frm_check.

START-OF-SELECTION.
*调出主屏幕
  CALL SCREEN 100.

下面为 TOP内的定义

TYPE-POOLS: slis.
TYPES: BEGIN OF ty_tab2,
       zindex  TYPE c.                          "选中标识
        INCLUDE TYPE zfztorg01.
TYPES:
       butxt       TYPE t001-butxt,             "公司代码
       fieldstyle  TYPE lvc_t_styl.             "FIELDSTYLE控制
TYPES: END OF ty_tab2.
DATA:gt_tab2 TYPE TABLE OF ty_tab2,             "二级ALV显示内表-
     gw_tab2 TYPE ty_tab2.                      "二级ALV显示工作区

DATA:
  go_author_cc TYPE REF TO cl_gui_container, "ALV容器
  go_author_grid TYPE REF TO cl_gui_alv_grid.
DATA git_exclude  TYPE ui_functions.            "屏幕部分标准按钮(设置不需显示的标准按钮).
FIELD-SYMBOLS:
  <fs_s_tab2_list> TYPE ty_tab2.                "双击取值指针
DATA:g_double TYPE sy-index.                    "双击行号记录

DATA:ok_code TYPE sy-ucomm.
DATA:go_9000_split TYPE REF TO cl_gui_splitter_container.
DATA:
  gv_author_fill TYPE boolean,
  gv_author_refr TYPE boolean.
DATA:
  gs_author_layout TYPE lvc_s_layo,
  gs_author_disvariant TYPE disvariant,
  gs_author_scroll_row TYPE lvc_s_roid,
  gs_author_scroll_col TYPE lvc_s_col.
DATA:
  gt_author_selected_row TYPE lvc_t_row,
  gt_author_fcat TYPE lvc_t_fcat.
DATA:
  gv_kostl_fill TYPE boolean,
  gv_kostl_refr TYPE boolean.
DATA:
  gs_kostl_layout TYPE lvc_s_layo,
  gs_kostl_disvariant TYPE disvariant,
  gs_kostl_scroll_row TYPE lvc_s_roid,
  gs_kostl_scroll_col TYPE lvc_s_col.
DATA:
  gt_kostl_selected_row TYPE lvc_t_row,
  gt_kostl_fcat TYPE lvc_t_fcat.
DATA:
  go_kostl_cc TYPE REF TO cl_gui_container,
  go_kostl_grid TYPE REF TO cl_gui_alv_grid.
DATA:gv_col_pos TYPE i.
FIELD-SYMBOLS:
  <fs_s_fc> TYPE lvc_s_fcat,
  <fs_s_selected_row> TYPE lvc_s_row.

下面为 CLASS内的定义

*ALV AUTHOR的类
CLASS cl_author_event_handler DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      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,
      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_f4
        FOR EVENT onf4 OF cl_gui_alv_grid
        IMPORTING e_fieldname
                  e_fieldvalue
                  es_row_no
                  er_event_data
                  et_bad_cells
                  e_display,
      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_toolbar_button
         FOR EVENT button_click OF cl_gui_alv_grid
         IMPORTING es_col_id
                   es_row_no.

ENDCLASS.
CLASS cl_author_event_handler IMPLEMENTATION.
  METHOD handle_toolbar_button.
    IF sy-subrc = 0.

    ENDIF.
  ENDMETHOD.
  METHOD handle_data_changed.
    PERFORM frm_changed_date
             USING
                   e_onf4
                   e_onf4_before
                   e_onf4_after
                   e_ucomm
             CHANGING er_data_changed.
  ENDMETHOD.
  METHOD handle_data_changed_finished."
    PERFORM frm_changed_finished
             USING e_modified
                   et_good_cells.
  ENDMETHOD.
  METHOD handle_double_click."双击三级

  ENDMETHOD.

  METHOD handle_hotspot_click."单击三级热点字段

  ENDMETHOD.

  METHOD handle_toolbar.
    FIELD-SYMBOLS:
      <fs_s_tb> TYPE stb_button.
*----------------------------------------------------------------------*
* 三级组织ALV部分的按钮
*----------------------------------------------------------------------*
* 分隔符
    APPEND INITIAL LINE TO e_object->mt_toolbar ASSIGNING <fs_s_tb>.
    <fs_s_tb>-butn_type = 3.
* 执行
    APPEND INITIAL LINE TO e_object->mt_toolbar ASSIGNING <fs_s_tb>.
    <fs_s_tb>-butn_type = 0."0 button;2 button list.
    <fs_s_tb>-function = 'CHANGE'.
    <fs_s_tb>-icon = icon_change.
    <fs_s_tb>-text = '修改'(b01).
  ENDMETHOD.
  METHOD handle_user_command."三级组织界面按钮
    DATA:lw_row TYPE lvc_s_row.
    DATA ls_tab TYPE lvc_s_stbl.
    ls_tab-row = 'X'.
    ls_tab-col = 'X'.
    CASE e_ucomm.
 
    ENDCASE.
    IF go_author_grid IS NOT INITIAL.
      CALL METHOD go_author_grid->refresh_table_display
        EXPORTING
          is_stable = ls_tab.
    ENDIF.
  ENDMETHOD.
  METHOD handle_f4.

  ENDMETHOD.
ENDCLASS. 
*ALV KOSTL的类
CLASS cl_kostl_event_handler DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      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,
      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_f4
        FOR EVENT onf4 OF cl_gui_alv_grid
        IMPORTING e_fieldname
                  e_fieldvalue
                  es_row_no
                  er_event_data
                  et_bad_cells
                  e_display,
      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.
ENDCLASS.
CLASS cl_kostl_event_handler IMPLEMENTATION.
  METHOD handle_data_changed.

  ENDMETHOD.
  METHOD handle_data_changed_finished.

  ENDMETHOD.
  METHOD handle_double_click.  "双击二级
    DATA:
      lv_answer,
      lv_dummy TYPE string,
      lv_flg TYPE boolean.
    DATA:lt_01 TYPE TABLE OF ztfxorg01,
         lw_01 TYPE ztfxorg01.
    DATA:l_x TYPE c.
    DATA:lt_edit TYPE STANDARD TABLE OF lvc_s_styl,
         ls_edit TYPE lvc_s_styl.
* 读取选中行数据
    READ TABLE gt_tab2 ASSIGNING <fs_s_tab2_list> INDEX e_row-index.
    IF sy-subrc <> 0.
      RETURN.
    ELSE.
      g_double = e_row-index."记录双击的行号
    ENDIF.
  ENDMETHOD.

  METHOD handle_hotspot_click.
    DATA:
      ls_selected_row TYPE lvc_s_row.
*----------------------------------------------------------------------*
* 得到选中行
*----------------------------------------------------------------------*
    CLEAR: gt_kostl_selected_row.
* 得到当前选中行
    ls_selected_row-index = e_row_id-index.
    APPEND ls_selected_row TO gt_kostl_selected_row.
* 得到当前位置
    go_kostl_grid->get_scroll_info_via_id(
       IMPORTING
         es_row_no      = gs_kostl_scroll_row
         es_col_info    = gs_kostl_scroll_col ).
  ENDMETHOD.                    "handle_hotspot_click

  METHOD handle_toolbar.
    FIELD-SYMBOLS:
      <fs_s_tb> TYPE stb_button.
*----------------------------------------------------------------------*
* 二级组织ALV部分的按钮
*----------------------------------------------------------------------*
* 分隔符
    APPEND INITIAL LINE TO e_object->mt_toolbar ASSIGNING <fs_s_tb>.
    <fs_s_tb>-butn_type = 3.
* 执行
    APPEND INITIAL LINE TO e_object->mt_toolbar ASSIGNING <fs_s_tb>.
    <fs_s_tb>-butn_type = 0.
    <fs_s_tb>-function = 'BUT_CHANGE'.
    <fs_s_tb>-icon = icon_change.
    <fs_s_tb>-text = '修改'(b01).

    APPEND INITIAL LINE TO e_object->mt_toolbar ASSIGNING <fs_s_tb>.
    <fs_s_tb>-butn_type = 0.
    <fs_s_tb>-function = 'BUT_SUBMIT'.
    <fs_s_tb>-icon = icon_execute_object.
    <fs_s_tb>-text = '提交'(b01).
  ENDMETHOD. 
  METHOD handle_user_command."二级组织界面按钮
    DATA:l_i TYPE i."选中行判断

    DATA:lw_row TYPE lvc_s_row,
         ls_tab TYPE lvc_s_stbl.
    ls_tab-row = 'X'.
    ls_tab-col = 'X'.
    CASE e_ucomm.
      WHEN 'BUT_CHANGE'.
        go_kostl_grid->get_selected_rows(
                            IMPORTING
                            et_index_rows = gt_kostl_selected_row ).
        DESCRIBE TABLE gt_kostl_selected_row LINES l_i.
        IF l_i <> 1.
          MESSAGE '请选择一条数据' TYPE 'S'.
        ENDIF.
        CHECK l_i <> 0.
        "获取选中行
        LOOP AT gt_kostl_selected_row INTO lw_row.
          READ TABLE gt_tab2 INTO gw_tab2 INDEX lw_row-index.
          IF sy-subrc <> 0 OR gw_tab2 IS INITIAL.
            RETURN.
          ELSE.
            IF gw_tab2-zedit = '04' OR gw_tab2-zedit = '06' OR gw_tab2-zzt = '02' OR gw_tab2-zzt = '04'.

            ELSE.
              "更新可编辑状态
              CLEAR gw_tab2-fieldstyle.
              INSERT LINES OF lt_edit INTO TABLE gw_tab2-fieldstyle.
              gw_tab2-bjsign = 'X'.
              gw_tab2-zalter = 'X'.
              gw_tab2-zedit = '04'.
              gw_tab2-zlevel = '2'.
              gw_tab2-name2  = gw_tab2-oname2.
              gw_tab2-namel2 = gw_tab2-fname2.

              MODIFY gt_tab2 FROM gw_tab2 INDEX lw_row-index.
            ENDIF.
          ENDIF.
        ENDLOOP.
        go_kostl_grid->refresh_table_display( ).
      WHEN 'TEST'. "分屏功能通过按钮自动调整屏幕占比
        IF g_hight = 50.
          g_hight = 100.
        ELSEIF g_hight = 100.
          g_hight = 50.
        ENDIF.
        CALL METHOD go_9000_split->set_row_height
          EXPORTING
            id     = 1
            height = g_hight.
      WHEN 'BUT_SUBMIT'.
        go_kostl_grid->get_selected_rows(
                            IMPORTING
                            et_index_rows = gt_kostl_selected_row ).
        DESCRIBE TABLE gt_kostl_selected_row LINES l_i. "存入选中行的index
        IF l_i = 0.
          LOOP AT gt_tab2 INTO gw_tab2 WHERE bjsign = 'X'."循环可修改标识的数据
          ENDLOOP.
        ELSE.
          "获取选中行
          CLEAR lt_tab2[].
          LOOP AT gt_kostl_selected_row INTO lw_row.
            READ TABLE gt_tab2 INTO lw_tab2 INDEX lw_row-index.
            APPEND lw_tab2 TO lt_tab2.
          ENDLOOP.

          LOOP AT lt_tab2 INTO lw_tab2."循环选中的多行
            LOOP AT gt_tab2 INTO gw_tab2 WHERE bjsign = 'X' AND zreq = lw_tab2-zreq AND nr = lw_tab2-nr.

            ENDLOOP.
          ENDLOOP.
        ENDIF.
        "提交操作后,由于表变动重新取数
        CLEAR:gt_tab2,gt_tab3.
        PERFORM frm_get_data_2.
        PERFORM frm_nocan_change USING '2'.
        PERFORM frm_get_data_3.
        PERFORM frm_nocan_change USING '3'.
        SORT gt_tab2 BY zreq DESCENDING.
        SORT gt_tab3 BY zreq DESCENDING.
        go_kostl_grid->refresh_table_display( ).
        go_author_grid->refresh_table_display( ).
    ENDCASE.
  ENDMETHOD.
  METHOD handle_f4.

  ENDMETHOD.
ENDCLASS.

下面为 100屏幕的逻辑流代码
元素清单和格式无任何添加要素

PROCESS BEFORE OUTPUT.
  MODULE STATUS_0100.
  MODULE INIT_CON.

PROCESS AFTER INPUT.
  MODULE USER_COMMAND_0100.

下面为 BPO代码

MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS100'.
  SET TITLEBAR 'SJ'.
  IF go_9000_split IS INITIAL.
* 自动创建屏幕
    CREATE OBJECT go_9000_split
      EXPORTING
        link_dynnr = sy-dynnr
        link_repid = sy-repid
        parent     = cl_gui_container=>screen0
        rows       = 1                          "几行
        columns    = 2                          "几列
        name       = 'GO_SPLIT_CONTAINER'.
    CALL METHOD go_9000_split->get_container"
      EXPORTING
        row       = 1
        column    = 1
      RECEIVING
        container = go_kostl_cc.
    CALL METHOD go_9000_split->get_container"
      EXPORTING
        row       = 1
        column    = 2
      RECEIVING
        container = go_author_cc.
  ENDIF.

  PERFORM frm_kostl_alv.
  PERFORM frm_author_alv.
ENDMODULE.
MODULE status_0200 OUTPUT.
  DATA num TYPE i.
  SET TITLEBAR '222'.
  num = num + 1.
  IF num = 1.
    fpernr = sy-uname.
  ENDIF.
ENDMODULE.

下面为 FRM代码

FORM frm_check .

ENDFORM.
FORM frm_author_alv .
  IF gv_author_fill <> 'X'.
    CREATE OBJECT go_author_grid
      EXPORTING
        i_parent = go_author_cc.
*获取三级组织显示部分数据
    PERFORM frm_get_data_3.
    PERFORM frm_nocan_change USING '3'.
*隐藏标准按钮
    PERFORM frm_author_set_exclude USING git_exclude.  " 屏幕部分标准按钮(设置不需显示的标准按钮).
* 创建Field Catalog
    PERFORM frm_author_build_fcat_list.
    gs_author_layout-sel_mode       = 'A'. "允许行选择
    gs_author_layout-box_fname      = 'ZINDEX'.
    gs_author_layout-grid_title     = '三级组织'.
    gs_author_layout-stylefname     = 'FIELDSTYLE'.
* 保存格式
    CLEAR gs_author_disvariant.
    gs_author_disvariant-report = sy-repid.
    gs_author_disvariant-handle = '9001'.
    gs_author_disvariant-username = sy-uname.
    CALL METHOD go_author_grid->set_user_command  "注册新增时间
      EXPORTING
        i_ucomm = cl_gui_alv_grid=>mc_fc_loc_insert_row.
    CALL METHOD go_author_grid->set_user_command  "注册新增时间
      EXPORTING
        i_ucomm = cl_gui_alv_grid=>mc_fc_loc_append_row.
* 注册事件
    SET HANDLER cl_author_event_handler=>handle_double_click FOR go_author_grid.
    SET HANDLER cl_author_event_handler=>handle_toolbar FOR go_author_grid.
    SET HANDLER cl_author_event_handler=>handle_user_command FOR go_author_grid.
    SET HANDLER cl_author_event_handler=>handle_hotspot_click FOR go_author_grid.
    SET HANDLER cl_author_event_handler=>handle_data_changed FOR go_author_grid.
    SET HANDLER cl_author_event_handler=>handle_data_changed_finished FOR go_author_grid.
    SET HANDLER cl_author_event_handler=>handle_toolbar_button FOR go_author_grid.
    CALL METHOD go_author_grid->register_edit_event  "注册更新事件 移动光标就 触发 changed 事件
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified .
    SORT gt_tab3 BY zreq DESCENDING.
*   第一次显示ALV
    SORT gt_tab3 BY zreq DESCENDING.
    go_author_grid->set_table_for_first_display(
      EXPORTING
        is_variant           = gs_author_disvariant
        i_save               = 'U'
        is_layout            = gs_author_layout
        it_toolbar_excluding = git_exclude
      CHANGING
        it_fieldcatalog      = gt_author_fcat
        it_outtab            = gt_tab3 ).

    gv_author_refr = gv_author_fill = abap_true.
  ELSE.
    go_author_grid->refresh_table_display( ).
    gv_author_refr = abap_true.
* 设置选中行
    IF gt_author_selected_row IS NOT INITIAL.
      go_author_grid->set_selected_rows(
        EXPORTING
          it_index_rows = gt_author_selected_row ).
    ENDIF.
* 设置位置
    IF gs_author_scroll_row IS NOT INITIAL
      OR gs_author_scroll_col IS NOT INITIAL.
      go_author_grid->set_scroll_info_via_id(
         EXPORTING
           is_row_no      = gs_author_scroll_row
           is_col_info    = gs_author_scroll_col ).
    ENDIF.
  ENDIF.
ENDFORM.
FORM frm_author_build_toolbar_ex .

ENDFORM.
FORM frm_author_build_fcat_list .
  DATA:l_tab TYPE dd02l-tabname.
  CLEAR gt_author_fcat[].
  gv_col_pos = 0.
  PERFORM frm_fcat_field USING   'ZREQ'    '申请单号'    'ZREQ'   'ZFZTORG01'    10  ''  '' CHANGING gt_author_fcat.
  PERFORM frm_fcat_field USING   'VERAK'   '需求人姓名'  'PERNR'  'ZFZTORG01'    10  ''  '' CHANGING gt_author_fcat.

ENDFORM.
FORM frm_fcat_field
  USING p_fieldname  TYPE lvc_fname
        p_coltext    TYPE lvc_txtcol
        p_rfname     TYPE lvc_s_fcat-ref_field
        p_rftab      TYPE lvc_s_fcat-ref_table
        p_outputlen  TYPE lvc_s_fcat-outputlen
        p_edit       TYPE lvc_s_fcat-edit
        p_out        TYPE  lvc_s_fcat-no_out
  CHANGING p_it_fcat TYPE lvc_t_fcat.
  gv_col_pos = gv_col_pos + 1.
  APPEND INITIAL LINE TO p_it_fcat ASSIGNING <fs_s_fc>.
  <fs_s_fc>-col_pos   = gv_col_pos.
  <fs_s_fc>-fieldname = p_fieldname.
  <fs_s_fc>-coltext   = p_coltext.
  <fs_s_fc>-outputlen = p_outputlen.
  <fs_s_fc>-edit      = p_edit.
  <fs_s_fc>-no_out    = p_out."默认隐藏
  IF p_rfname IS NOT INITIAL.
    <fs_s_fc>-ref_field = p_rfname.
  ENDIF.
  IF p_rftab IS NOT INITIAL.
    <fs_s_fc>-ref_table = p_rftab.
  ENDIF.
  IF  p_fieldname = 'ORGST'.
    <fs_s_fc>-checkbox = 'X'."选择框
  ENDIF.
ENDFORM.
FORM frm_changed_date USING  p_e_onf4 TYPE char01
                              p_e_onf4_before TYPE char01
                              p_e_onf4_after TYPE char01
                              p_e_ucomm TYPE sy-ucomm
                       CHANGING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol.

ENDFORM.
FORM frm_changed_finished  USING    p_e_modified TYPE char01
                                    p_et_good_cells TYPE lvc_t_modi.

ENDFORM.
FORM frm_set_exclude  USING p_tables TYPE ui_functions."隐藏标准工具栏按钮
  DATA ls_exclude TYPE ui_func.
  REFRESH p_tables.
  DEFINE set_exclude.
    ls_exclude   = &1.
    append ls_exclude to p_tables.
  END-OF-DEFINITION.
  set_exclude:
  cl_gui_alv_grid=>mc_mb_sum,
  cl_gui_alv_grid=>mc_fc_view_grid,
  cl_gui_alv_grid=>mc_mb_view,
  cl_gui_alv_grid=>mc_mb_subtot,
  cl_gui_alv_grid=>mc_fc_print_back,
  cl_gui_alv_grid=>mc_fc_graph,
  cl_gui_alv_grid=>mc_fc_count,
  cl_gui_alv_grid=>mc_fc_detail,
  cl_gui_alv_grid=>mc_fc_info,
  cl_gui_alv_grid=>mc_fc_loc_append_row,
  cl_gui_alv_grid=>mc_fc_loc_copy,
  cl_gui_alv_grid=>mc_fc_loc_copy_row,
  cl_gui_alv_grid=>mc_fc_loc_cut,
  cl_gui_alv_grid=>mc_fc_loc_insert_row,
  cl_gui_alv_grid=>mc_fc_loc_delete_row,
  cl_gui_alv_grid=>mc_fc_loc_move_row,
  cl_gui_alv_grid=>mc_fc_loc_paste,
  cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
ENDFORM.
FORM frm_author_set_exclude  USING p_tables TYPE ui_functions.
  DATA ls_exclude TYPE ui_func.
  REFRESH p_tables.
  DEFINE set_exclude.
    ls_exclude   = &1.
    append ls_exclude to p_tables.
  END-OF-DEFINITION.
  set_exclude:
  cl_gui_alv_grid=>mc_fc_view_grid,
  cl_gui_alv_grid=>mc_mb_view,
  cl_gui_alv_grid=>mc_fc_count,
  cl_gui_alv_grid=>mc_fc_maximum,
  cl_gui_alv_grid=>mc_fc_minimum,
  cl_gui_alv_grid=>mc_fc_sum,
  cl_gui_alv_grid=>mc_mb_sum,
  cl_gui_alv_grid=>mc_fc_average,
  cl_gui_alv_grid=>mc_mb_subtot,
  cl_gui_alv_grid=>mc_fc_print_back,
  cl_gui_alv_grid=>mc_fc_graph,
  cl_gui_alv_grid=>mc_fc_count,
  cl_gui_alv_grid=>mc_fc_detail,
  cl_gui_alv_grid=>mc_fc_info,
  cl_gui_alv_grid=>mc_fc_loc_append_row,
  cl_gui_alv_grid=>mc_fc_loc_copy,
  cl_gui_alv_grid=>mc_fc_loc_copy_row,
  cl_gui_alv_grid=>mc_fc_loc_cut,
  cl_gui_alv_grid=>mc_fc_loc_insert_row,
  cl_gui_alv_grid=>mc_fc_loc_delete_row,
  cl_gui_alv_grid=>mc_fc_loc_move_row,
  cl_gui_alv_grid=>mc_fc_loc_paste,
  cl_gui_alv_grid=>mc_fc_loc_paste_new_row.

ENDFORM.
* 三级组织ALV显示部分取数逻辑
FORM frm_get_data_3.
 
ENDFORM.
FORM frm_bname.

ENDFORM.
* 二级组织ALV主体
FORM frm_kostl_alv .
  DATA:   l_field TYPE lvc_fname,
          lt_f4   TYPE lvc_t_f4,
          ls_f4   TYPE lvc_s_f4.
  DATA:it_exclude  TYPE ui_functions.
  IF gv_kostl_fill <> 'X'.
    CREATE OBJECT go_kostl_grid
      EXPORTING
        i_parent = go_kostl_cc.
* 获取二级组织ALV显示部分数据
    PERFORM frm_get_data_2.
    PERFORM frm_nocan_change USING '2'.
* 隐藏标准按钮
    PERFORM frm_set_exclude USING it_exclude.  " 屏幕部分标准按钮(设置不需显示的标准按钮).
* 创建Field Catalog
    PERFORM frm_kostl_build_fcat_list.
    gs_kostl_layout-sel_mode       = 'A'. "允许行选择
    gs_kostl_layout-box_fname      = 'ZINDEX'.
    gs_kostl_layout-grid_title     = '二级组织'.
    gs_kostl_layout-stylefname     = 'FIELDSTYLE'.
* 保存格式
    CLEAR gs_kostl_disvariant.
    gs_kostl_disvariant-report = sy-repid.
    gs_kostl_disvariant-handle = '9000'.
    gs_kostl_disvariant-username = sy-uname.
* 注册事件
    SET HANDLER cl_kostl_event_handler=>handle_double_click FOR go_kostl_grid.
    SET HANDLER cl_kostl_event_handler=>handle_toolbar FOR go_kostl_grid.
    SET HANDLER cl_kostl_event_handler=>handle_user_command FOR go_kostl_grid.
    SET HANDLER cl_kostl_event_handler=>handle_hotspot_click FOR go_kostl_grid.
    SET HANDLER cl_kostl_event_handler=>handle_data_changed FOR go_kostl_grid.
    SET HANDLER cl_kostl_event_handler=>handle_data_changed_finished FOR go_kostl_grid.
    CALL METHOD go_kostl_grid->register_edit_event  "注册更新事件 移动光标就 触发 changed 事件
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified .
    SORT gt_tab2 BY zreq DESCENDING.
*   第一次显示ALV
    go_kostl_grid->set_table_for_first_display(
      EXPORTING
        is_variant           = gs_kostl_disvariant
        i_save               = 'U'
        is_layout            = gs_kostl_layout
        it_toolbar_excluding = it_exclude
      CHANGING
        it_fieldcatalog      = gt_kostl_fcat
        it_outtab            = gt_tab2 ).

    gv_kostl_refr = gv_kostl_fill = abap_true.
  ELSE.
    go_kostl_grid->refresh_table_display( ).
    gv_kostl_refr = abap_true.
* 设置选中行
    IF gt_kostl_selected_row IS NOT INITIAL.
      go_kostl_grid->set_selected_rows(
        EXPORTING
          it_index_rows = gt_kostl_selected_row ).
    ENDIF.
* 设置位置
    IF gs_kostl_scroll_row IS NOT INITIAL
      OR gs_kostl_scroll_col IS NOT INITIAL.
      go_kostl_grid->set_scroll_info_via_id(
         EXPORTING
           is_row_no      = gs_kostl_scroll_row
           is_col_info    = gs_kostl_scroll_col ).
    ENDIF.
  ENDIF.
ENDFORM.
FORM frm_kostl_build_toolbar_ex .

ENDFORM.
* 二级组织显示界面字段设置
FORM frm_kostl_build_fcat_list .
  DATA:l_tab TYPE dd02l-tabname.
  CLEAR gt_kostl_fcat[].
  gv_col_pos = 0.
  PERFORM frm_fcat_field USING   'ZREQ'    '申请单号'    'ZREQ'   'ZFZTORG01'  10  '' '' CHANGING gt_kostl_fcat.
  PERFORM frm_fcat_field USING   'VERAK'   '需求人姓名'  'PERNR'  'ZFZTORG01'  10  '' 'X' CHANGING gt_kostl_fcat.

ENDFORM.
* 二级组织ALV界面显示数据取值逻辑
FORM frm_get_data_2.

ENDFORM.
FORM frm_nocan_change USING p_sign TYPE i.
  DATA:lt_edit TYPE STANDARD TABLE OF lvc_s_styl,
       ls_edit TYPE lvc_s_styl.
  IF p_sign = '2'.
    LOOP AT gt_tab2 INTO gw_tab2 WHERE bjsign = 'X'.
      CLEAR gw_tab2-fieldstyle.
      CLEAR: ls_edit,lt_edit.
      ls_edit-fieldname = 'BNAME'.
      ls_edit-style = cl_gui_alv_grid=>mc_style_disabled.
      APPEND ls_edit TO lt_edit.
      CLEAR: ls_edit.
      ls_edit-fieldname = 'VKORG'.
      ls_edit-style = cl_gui_alv_grid=>mc_style_disabled.
      APPEND ls_edit TO lt_edit.
      INSERT LINES OF lt_edit INTO TABLE gw_tab2-fieldstyle.

      CLEAR gw_tab2-bjsign.
      MODIFY gt_tab2 FROM gw_tab2.
    ENDLOOP.
  ENDIF.
  IF p_sign = '3'.
  ENDIF.
ENDFORM.

下面为 PAI代码

MODULE user_command_0100 INPUT.
  CASE sy-ucomm.
    WHEN 'EXIT'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.
MODULE user_command_0200 INPUT.
  CASE sy-ucomm.
    WHEN 'EXIT' OR 'FANHUI'.
      LEAVE TO SCREEN 0.
    WHEN 'TIJIAO'.
      PERFORM frm_bname.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.

标准程序界面屏幕增强显示OOALV

TOP程序内关于类定义

*有关放货盖章部分定义
DATA: gt_ztfxsd45 TYPE TABLE OF ztfxsd45.
DATA: gv_col_pos TYPE i.
DATA: gs_toolbar TYPE stb_button.   "自定义工具栏按钮

*----------------------------------------------------------------------*
*       CLASS cl_event_handle DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_event_handle DEFINITION. "定义事件处理类
  PUBLIC SECTION.
    "初始化ALV工具栏对象事件,如增加按钮并设定属性
    METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
            IMPORTING e_object e_interactive.
    "ALV工具栏按钮的点击事件
    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.
ENDCLASS.                    "cl_event_handle DEFINITION
*----------------------------------------------------------------------*
*       CLASS cl_event_handle IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_event_handle IMPLEMENTATION."事件处理类实现部分
  METHOD handle_toolbar.
*    gs_toolbar-function = 'BUT_ADD'."按钮的FunctionCode
*    gs_toolbar-icon = icon_change."按钮图标
*    gs_toolbar-text = '新增数据'."按钮标签
*    gs_toolbar-butn_type = '0'."定义按钮类型,0为标准按钮,具体取值可参考这里
*    APPEND gs_toolbar TO e_object->mt_toolbar."添加按钮到工具栏中
*
    gs_toolbar-function = 'BUT_SAVE'.
    gs_toolbar-icon = icon_system_save.
    gs_toolbar-text = '保存数据'.
    gs_toolbar-butn_type = '0'.
    APPEND gs_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar
  METHOD handle_user_command.
    DATA: ls_ztfxsd45 TYPE ztfxsd45.
    DATA: l_sign TYPE c.
    IF e_ucomm = 'BUT_SAVE'.
      CLEAR l_sign.
      LOOP AT gt_ztfxsd45 INTO ls_ztfxsd45.
        IF ls_ztfxsd45-zvbeln_fs IS NOT INITIAL.
          SELECT SUM( kwmeng ) FROM vbap
            INTO ls_ztfxsd45-kwmeng
            WHERE vbeln = ls_ztfxsd45-zvbeln_fs.
          IF sy-subrc <> 0.
            l_sign = 'X'.
          ENDIF.
          SELECT SINGLE gzdat FROM ztfzdzqz03
            INTO ls_ztfxsd45-erdat
            WHERE gz_status = 'C'
              AND zvbeln = ls_ztfxsd45-zvbeln_fs.
          IF sy-subrc <> 0.
            l_sign = 'X'.
          ENDIF.
          MODIFY gt_ztfxsd45 FROM ls_ztfxsd45.
        ENDIF.
      ENDLOOP.
      EXPORT itab = gt_ztfxsd45 TO MEMORY ID sy-uname.
      IF sy-subrc = 0 AND l_sign <> 'X'.
        MESSAGE '放货盖章记录保存成功' TYPE 'S'.
      ELSE.
        MESSAGE '放货盖章记录数据错误' TYPE 'I'.
      ENDIF.
    ENDIF.
  ENDMETHOD.                    "handle_user_command
  METHOD handle_data_changed.
    FIELD-SYMBOLS: <lfs_sd> TYPE STANDARD TABLE,
                   <lfs_line> LIKE LINE OF gt_ztfxsd45.
    DATA: l_modcell TYPE lvc_s_modi,
          l_cell    TYPE lvc_s_modi,
          t_modcell TYPE lvc_t_modi.
    IF  er_data_changed->mp_mod_rows IS NOT INITIAL .
      ASSIGN er_data_changed->mp_mod_rows->* TO <lfs_sd>.
      t_modcell = er_data_changed->mt_mod_cells.
      SORT t_modcell BY row_id fieldname.
      READ TABLE t_modcell INTO l_cell INDEX 1.

      LOOP AT <lfs_sd> ASSIGNING <lfs_line>.
        IF <lfs_line>-zvbeln_fs IS NOT INITIAL.
          SELECT SUM( kwmeng ) FROM vbap
            INTO <lfs_line>-kwmeng
            WHERE vbeln = <lfs_line>-zvbeln_fs.
          IF sy-subrc = 0.
            CALL METHOD er_data_changed->modify_cell
              EXPORTING
                i_row_id    = l_cell-row_id
                i_fieldname = 'KWMENG'
                i_value     = <lfs_line>-kwmeng.
          ENDIF.
          SELECT SINGLE gzdat FROM ztfzdzqz03
            INTO <lfs_line>-erdat
            WHERE gz_status = 'C'
              AND zvbeln = <lfs_line>-zvbeln_fs.
          IF sy-subrc = 0.
            CALL METHOD er_data_changed->modify_cell
              EXPORTING
                i_row_id    = l_cell-row_id
                i_fieldname = 'ERDAT'
                i_value     = <lfs_line>-erdat.
          ENDIF.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDMETHOD.                    "handle_data_changed
ENDCLASS.                    "cl_event_handle IMPLEMENTATION
DATA: event_handle TYPE REF TO cl_event_handle."定义类对象的引用

PBO程序

MODULE ztfxsd45_pbo OUTPUT.
  DATA: ls_xlips TYPE lipsvb,
        ls_ekko  TYPE ekko,
        ls_ztgtm38 TYPE ztgtm38.

  DATA: l_sign TYPE c.

  CLEAR l_sign.
  READ TABLE gt_xlips INTO ls_xlips INDEX 1.
  IF sy-subrc = 0.

  ENDIF.
  SELECT SINGLE * FROM ekko
    INTO CORRESPONDING FIELDS OF ls_ekko
    WHERE ebeln = ls_xlips-vgbel.
  IF sy-subrc = 0.
    SELECT SINGLE * FROM ztgtm38
      INTO CORRESPONDING FIELDS OF ls_ztgtm38
      WHERE bukrs = ls_ekko-bukrs
      AND   ekorg = ls_ekko-ekorg.
    IF sy-subrc = 0.
      l_sign = 'X'.
    ENDIF.
  ENDIF.
  "动态显示
  LOOP AT SCREEN.
    IF screen-group1 EQ 'FGZ' AND l_sign <> 'X'.
      screen-active = 0. " 0 隐藏,1 显示
    ELSE.
      screen-active = 1.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.
  "ALV显示
  IF l_sign = 'X'.
    DATA: l_grid_r TYPE REF TO cl_gui_alv_grid ,
          l_con_r  TYPE REF TO cl_gui_custom_container.
    DATA: l_fieldcat TYPE lvc_t_fcat.
    DATA: l_layout   TYPE lvc_s_layo.
    IF l_con_r IS INITIAL.
      "创建ALV容器对象
      CREATE OBJECT l_con_r
        EXPORTING
          container_name = 'ZTFXSD45_ALV'.
      "创建ALV控件
      CREATE OBJECT l_grid_r
        EXPORTING
          i_parent = l_con_r.
      "配置l_fieldcat
      PERFORM frm_build_fcat_list.
      "数据初始化
      IF gt_ztfxsd45 IS INITIAL.
        SELECT * FROM ztfxsd45
          INTO CORRESPONDING FIELDS OF TABLE gt_ztfxsd45.
      ENDIF.
      "ALV显示
      CALL METHOD l_grid_r->set_table_for_first_display
        EXPORTING
          i_structure_name = 'ZTFXSD45'
          is_layout        = l_layout
          i_save           = 'X'"可以保存变式
        CHANGING
          it_outtab        = gt_ztfxsd45[]
          it_fieldcatalog  = l_fieldcat[]."如果fieldcat内表为空,则相当于没有配置,采用默认方式显示

* 设置enter事件
      CALL METHOD l_grid_r->register_edit_event
        EXPORTING
          i_event_id = cl_gui_alv_grid=>mc_evt_enter
        EXCEPTIONS
          error      = 1
          OTHERS     = 2.
      CREATE OBJECT :event_handle.
*    "为ALV按钮注册监听事件
      SET HANDLER :event_handle->handle_toolbar FOR l_grid_r,
                   event_handle->handle_user_command FOR l_grid_r,
                   event_handle->handle_data_changed FOR l_grid_r.
      "调用此方法才能激活工具栏上增加的自定义按钮
      CALL METHOD l_grid_r->set_toolbar_interactive.
    ELSE.
      CALL METHOD l_grid_r->refresh_table_display.
    ENDIF.
  ENDIF.
ENDMODULE.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值