ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ABAP-OOALV实现

2022-08-04 11:03:54  阅读:178  来源: 互联网

标签:SY 实现 EDIT ALV ABAP 9001 OOALV TYPE toolbar


相关类

  • CL_GUI_ALV_GRID

  • CL_GUI_CUSTOM_CONTAINER

  • CL_GUI_DOCKING_CONTAINER

  • CL_GUI_SPLITTER_CONTAINER


控制区域、容器、Grid 关系

先在屏幕上绘制一个用户自定义控件区域,然后该用户以自定义控件区域为基础来创建 CL_GUI_CUSTOM_CONTAINER 容器实例,最后以此容器实例来创建 CL_GUI_ALV_GRID 实例


CL_GUI_ALV_GRID 重要方法

SET_TABLE_FOR_FIRST_DISPLAY

  • ALV 展示方法

  • 参数:

    • IS_VARIANT

      • 确定用于显示输出表的布局。如果使用此参数,则必须至少填充类型结构的“REPORT”字段。
    • I_SAVE
      • 决定用户是否可以保存变式:

        'X' 只能保存全局变式; 

        'U' 只能保存特定变式; 

        'A' 都可以保存; 

        SPACE 不可以将布局保存为变式

    • I_DEFAULT
      • 此参数确定是否允许用户定义默认布局:

        "X":允许默认布局(默认设置)

        空格:不允许默认布局

      • 如果允许默认布局,并且存在这样的布局,并且 IS_VARIANT 中未指定其他布局,则在调用此方法时会自动加载默认布局。
    • IS_LAYOUT

      • 确定网格控件的属性。布局结构与用于保存筛选器、排序和列属性的布局无关。

      • 字段:

        • CWIDTH_OPT:最优化宽度 SPACE, 'X'

        • GRID_TITLE:标题,在网格和工具条之间 最长 70 个字符

        • NO_TOOLBAR:隐藏工具条 SPACE, 'X'

        • NO_VGRIDLN:隐藏垂直线 SPACE, 'X'

        • SEL_MODE:选择模式 SPACE, 'A', 'B', 'C', 'D'

        • CTAB_FNAME:带有复杂单元格颜色编码的字段名称 最长 30 个字符

        • INFO_FNAME:带有简单行彩色代码的字段名称 最长 30 个字符

        • ZEBRA:可选行颜色,如果设置了,出现了间隔色带 SPACE, 'X'

        • STYLEFNAME:字段格式

    • IT_OUTTAB

      • 要显示的数据的输出表
    • IT_FIELDCATALOG
      • 确定输出表的结构和要显示的数据的格式

      • 字段:

        • COL_POS:输出列 列的位置,第几列,例如 1,2,…

        • FIELDNAME:字段名称

        • CURRENCY/CFIELDNAME:货币单位/参考的当前单位的字段名称

        • QUANTITY/QFIELDNAME:计量单位/参考计量单位的字段名称

        • DO_SUM:总计列值 'X',合计

        • FIX_COLUMN:固定列

        • EMPHASIZE:列的颜色

        • NO_OUT:列没有输出'X' ,隐藏此列

        • OUTPUTLEN:列的字符宽度

        • DATATYPE:ABAP 字典中的数据类型

        • INTTYPE:ABAP 数据类型(C,D,N,...)

        • HOTSPOT:单击敏感'X',下面出现下划线,响应单击

        • SCRTEXT_L/M/S:字段标签长/中/短

        • REF_TABLE/REF_FIELD:参考表/参考字段

        • EDIT:是否可编辑

    • IT_SORT

      • 具有最初要排序的列的排序属性的表

    • IT_FILTER

      • 具有最初要为其设置筛选器的列的筛选器属性的表

REFRESH_TABLE_DISPLAY

 

  • IS_STABLE:刷新的稳定性,就是滚动条保持不动
  • I_SOFT_REFRESH:软刷新,如果设置了这个参数,临时给 ALV 创建的合计、排序、数据过滤都将保持不变。这个是非常有意义的,例如:当你没有修改数据内表里的数据,但因布局修改了想刷新 ALV 时可使用

 

  • SET_FRONTED_FIELDCATALOG:如果 fieldcat 格式有修改,需要刷新格式设置,则调用这个方法

EVENTS

TOOLBAR 事件

  • 定义事件类

    • CLASS lcl_event_receiver DEFINITION.
        PUBLIC SECTION.
          CLASS-METHODS:
            handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid "自定义工具栏
                           IMPORTING e_object e_interactive.
      ENDCLASS.
  • 实现 handle_toolbar 方法

    • CLASS lcl_event_receiver IMPLEMENTATION.
        METHOD handle_toolbar.
          DATA: ls_toolbar  TYPE stb_button.
          MOVE '' TO ls_toolbar-function.
          MOVE '' TO ls_toolbar-icon.
          MOVE '3' TO ls_toolbar-butn_type.
          APPEND ls_toolbar TO e_object->mt_toolbar.
      
          CLEAR ls_toolbar.
          MOVE 'SELA' TO ls_toolbar-function.
          MOVE icon_select_all TO ls_toolbar-icon.
          MOVE '全选' TO ls_toolbar-quickinfo.
          MOVE ''(112) TO ls_toolbar-text.
          APPEND ls_toolbar TO e_object->mt_toolbar.
      
          CLEAR ls_toolbar.
          MOVE 'DSEL' TO ls_toolbar-function.
          MOVE icon_deselect_all TO ls_toolbar-icon.
          MOVE '取消全选' TO ls_toolbar-quickinfo.
          MOVE ''(112) TO ls_toolbar-text.
          APPEND ls_toolbar TO e_object->mt_toolbar.
          CLEAR ls_toolbar.
      
          MOVE 'B_LIST' TO ls_toolbar-function.
          MOVE 1 TO ls_toolbar-butn_type.
          MOVE icon_calculation TO ls_toolbar-icon.
          MOVE '自定义下拉菜单按钮'(202) TO ls_toolbar-quickinfo.
          MOVE '下拉菜单按钮' TO ls_toolbar-text.
          "MOVE '' TO ls_toolbar-disabled.
          APPEND ls_toolbar TO e_object->mt_toolbar.
        ENDMETHOD.                    "handle_toolbar
      ENDCLASS.

MENU_BUTTON 事件

  • 定义事件类

    • CLASS lcl_event_receiver DEFINITION.
        PUBLIC SECTION.
          CLASS-METHODS:
            handle_menu_button        "自定义菜单
              FOR EVENT menu_button OF cl_gui_alv_grid
              IMPORTING e_object e_ucomm.
      ENDCLASS.
  • 实现 handle_menu_button 方法

    • CLASS lcl_event_receiver IMPLEMENTATION.
        METHOD handle_menu_button .  "自定义菜单实现方法
          IF e_ucomm = 'B_LIST'."给下拉菜单按钮增加选项,可以多次调用该方法以增加多行
            CALL METHOD e_object->add_function
              EXPORTING
                icon  = ICON_OKAY
                fcode = 'B_SUM' "字菜单按钮的FunCode
                text  = '显示ALV总行数'.
            CALL METHOD e_object->add_function
              EXPORTING
                icon  = ICON_CANCEL
                fcode = 'C_SUM' "字菜单按钮的FunCode
                text  = '测试'.
          ENDIF.
        ENDMETHOD.                    "handle_menu_button
      ENDCLASS.

USER_COMMAND 事件

  • 定义方法

    • CLASS lcl_event_receiver DEFINITION.
        PUBLIC SECTION.
          CLASS-METHODS:
            handle_user_command       "自定义按钮事件
              FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm.
      ENDCLASS.
  • 实现 handle_user_command 方法

    • CLASS lcl_event_receiver IMPLEMENTATION.
        METHOD handle_user_command.  "自定义按钮实现方法
          DATA: sum TYPE i .
          CASE e_ucomm.
            WHEN 'SELA'.
              LOOP AT it_9001 INTO wa_9001.
                wa_9001-check = 'X'.
                MODIFY it_9001 INDEX sy-tabix FROM wa_9001 TRANSPORTING check.
              ENDLOOP.
              CALL METHOD oo_grid->refresh_table_display"这句话一定要写,否则界面没刷新,不生效
                EXPORTING
                  is_stable = wa_stbl.
            WHEN 'DSEL'.
              LOOP AT it_9001 INTO wa_9001.
                wa_9001-check = ''.
                MODIFY it_9001 INDEX sy-tabix FROM wa_9001 TRANSPORTING check.
              ENDLOOP.
              CALL METHOD oo_grid->refresh_table_display
                EXPORTING
                  is_stable = wa_stbl.
            WHEN 'B_SUM'.
              DESCRIBE TABLE it_9001[] LINES sum.
              MESSAGE i001(00) WITH '当前ALV表格中的数据总行数为:' sum.
             WHEN 'C_SUM'.
              MESSAGE i001(00) WITH '测试为:' sum.
          ENDCASE.
        ENDMETHOD.
      ENDCLASS.

HOTSPOT(单点)事件

  • 定义方法

    • CLASS lcl_event_receiver DEFINITION.
        PUBLIC SECTION.
          CLASS-METHODS:
            handle_hotspot_click1     "单击事件
                          FOR EVENT hotspot_click OF cl_gui_alv_grid 
                          IMPORTING e_row_id e_column_id.
      ENDCLASS.
  • 实现 handle_hotspot_click1 方法

    • CLASS lcl_event_receiver IMPLEMENTATION.
        METHOD handle_data_changed.  "数据变化实现方法
          PERFORM handle_data_changed USING er_data_changed.
        ENDMETHOD.
      
        METHOD handle_hotspot_click1. "单击事件实现方法
          READ TABLE it_9001 INTO wa_9001 INDEX e_row_id-index.
          CASE e_column_id-fieldname.
            WHEN 'VBELN_VF'.
              SET PARAMETER ID 'VF' FIELD wa_9001-vbeln_vf.
              CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
            WHEN 'VBELN_SO'.
              SET PARAMETER ID 'AUN' FIELD wa_9001-vbeln_so.
              CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
          ENDCASE.
        ENDMETHOD.                  "HANDLE_HOTSPOT_CLICK1
      ENDCLASS.

DATA_CHANGE 事件

  • 定义方法

    • CLASS lcl_event_receiver DEFINITION.
        PUBLIC SECTION.
          CLASS-METHODS:
            handle_data_changed       "数据改变触发
                          FOR EVENT data_changed OF cl_gui_alv_grid
                          IMPORTING er_data_changed.
      ENDCLASS.
  • 实现方法

    • CLASS lcl_event_receiver IMPLEMENTATION.
        METHOD handle_data_changed.  "数据变化实现方法
            "PERFORM handle_data_changed USING er_data_changed.
          DATA: x_change TYPE lvc_s_modi.
          LOOP AT data_changed->mt_good_cells INTO x_change.
          "结算数量发生变化
            IF x_change-fieldname  = 'FKLMG_JS'.
              READ TABLE it_9001 INTO wa_9001 INDEX x_change-row_id.
              wa_9001-fklmg_js = x_change-value.
              wa_9001-kbetr_tmp = wa_9001-kbetr_js * wa_9001-fklmg_js / wa_9001-kpein / '1.13'.
              MODIFY it_9001 FROM wa_9001 INDEX x_change-row_id.
            ENDIF.
            "行备注内容发生变化
            IF x_change-fieldname  = 'ZREMARK'.
              READ TABLE it_9001 INTO wa_9001 INDEX x_change-row_id.
              wa_9001-zremark = x_change-value.
              MODIFY it_9001 FROM wa_9001 INDEX x_change-row_id.
            ENDIF.
            CALL METHOD oo_grid->refresh_table_display
              EXCEPTIONS
                finished = 1
                OTHERS   = 2.
          ENDLOOP.
        ENDMETHOD.
      ENDCLASS.

F4 搜索帮助事件

  • 如果希望 ALV 中某字段具有搜索帮助,第一种办法当然是对表中某字段的引用,设置 ref_table、ref_field,将自动触发该字段所带的搜索帮助。

  • 第二种办法就是利用自定义代码来实现 ALV 的搜索帮助,显然它的功能更强大、更灵活。针对在 OO ALV 中实现搜索帮助,其主要步骤有:

    • 定义方法

      • CLASS lcl_event_receiver DEFINITION.
          PUBLIC SECTION.
            CLASS-METHODS:
              handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid
                                      IMPORTING e_fieldname es_row_no er_event_data.
        ENDCLASS.
        CLASS lcl_event_receiver IMPLEMENTATION.
          METHOD handle_onf4.
            DATA:ls_modi TYPE lvc_s_modi,
                 lt_ret_tab TYPE TABLE OF ddshretval WITH HEADER LINE.
         
            FIELD-SYMBOLS <modtab> TYPE lvc_t_modi.
            IF e_fieldname = 'FIELD_NAME'. "我们自定义搜索的字段名
              READ TABLE gt_alv_data INDEX es_row_no-row_id.
              CHECK sy-subrc = 0.
        **  这里可以添加代码以对lt_hitlist内表进行填充
              CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
                EXPORTING
                  retfield        = 'HIT_FIELD'
                  value_org       = 'S'
                TABLES
                  value_tab       = lt_hitlist
                  return_tab      = lt_ret_tab
                EXCEPTIONS
                  parameter_error = 1
                  no_values_found = 2
                  OTHERS          = 3.
              IF sy-subrc = 0.
        **  Update the value in ALV cell
                READ TABLE lt_ret_tab INDEX 1.
                IF sy-subrc = 0. " User didn't cancel
                  ls_modi-row_id = es_row_no-row_id.
                  ls_modi-fieldname = e_fieldname.
                  ls_modi-value = lt_ret_tab-fieldval.
                  ASSIGN er_event_data->m_data->* TO <modtab>.
                  APPEND ls_modi TO <modtab>.
                ENDIF.
              ENDIF.
        **  Inform ALV Grid that event 'onf4' has been processed
              er_event_data->m_event_handled = 'X'.
            ENDIF.
          ENDMETHOD.
        ENDCLASS.
    • 在 Method 的最后,记得加上 er_event_data->m_event_handled = 'X'. 通知系统搜索事件处理完毕,这样就不会调用系统标准的 Search Help。

    • 需要自定义搜索帮助的字段,设置其 field catalog 时:

      • ls_fieldcat-f4availabl = 'X'.
    • 在创建 ALV 对象之后,要对需要自定义搜索帮助的字段进行注册。lvc_s_f4 中的字段 getbefore 和 changeafter 应该代表是否触发 data_changed 事件。

      • DATA: lt_f4 TYPE lvc_t_f4 WITH HEADER LINE.
        CLEAR lt_f4.
        lt_f4-fieldname = 'FIELD_NAME'.
        lt_f4-register = 'X'.
        lt_f4-chngeafter = 'X'. 
        APPEND lt_f4.
        CALL METHOD mygrid->register_f4_for_fields
          EXPORTING
            it_f4 = lt_f4[].
        CREATE OBJECT go_evt_receiver.
        SET HANDLER go_evt_receiver->handle_onf4 FOR go_alv_grid.

EVENTS 注册

"屏幕输出前
MODULE status_9001 OUTPUT.

  "设置GUI状态
  SET PF-STATUS '9001_PF'.
  "设置界面标题
  SET TITLEBAR '9001_BAR'.

  IF oo_container IS INITIAL.
*   建立一个容器控件作为ALV的容器
    CREATE OBJECT oo_container
      EXPORTING
        container_name = oo_cont_on_9001.
*   建立一个ALV的实例
    CREATE OBJECT oo_grid
      EXPORTING
        i_parent = oo_container.

*   显示表格
    CALL METHOD oo_grid->set_table_for_first_display
      EXPORTING
        is_layout       = oo_layout
      CHANGING
        it_outtab       = it_9001[]
        it_fieldcatalog = oo_field.

*   注册ALV的事件
    DATA: lt_f4 TYPE lvc_t_f4 WITH HEADER LINE.
    CLEAR lt_f4.
    lt_f4-fieldname = 'FIELD_NAME'.
    lt_f4-register = 'X'.
    lt_f4-chngeafter = 'X'. 
    APPEND lt_f4.
    CALL METHOD oo_grid->register_f4_for_fields
      EXPORTING
        it_f4 = lt_f4[].
    
    CREATE OBJECT event_receiver.

    SET HANDLER event_receiver->handle_toolbar FOR oo_grid.       "注册工具栏
    SET HANDLER event_receiver->handle_menu_button FOR oo_grid.   "注册工具栏菜单
    SET HANDLER event_receiver->handle_user_command FOR oo_grid.  "注册用户自定义命令
    SET HANDLER event_receiver->handle_data_changed FOR oo_grid.  "单元格数据更改时触发
    SET HANDLER event_receiver->handle_hotspot_click1 FOR oo_grid."单击事件
    SET HANDLER event_receiver->handle_onf4 FOR go_alv_grid.      "搜索帮助事件


    "调用此方法才能激活工具栏上增加的自定义按钮
    CALL METHOD oo_grid->set_toolbar_interactive.

    CALL METHOD oo_grid->register_edit_event "单元格数据更改时触发条件
      EXPORTING
*       I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER. "回车时触发
        i_event_id = cl_gui_alv_grid=>mc_evt_modified. "单元格失去焦点触发
  ENDIF.
  CALL METHOD oo_grid->refresh_table_display.
ENDMODULE.

实现可编辑

实现列可编辑

  • 只要将 catalog 中的字段 edit 设置成‘X',整列就变成能输入的了,LVC_S_FCAT-EDIT

    • REPORT ztest_alv_lvc_edit.
      
      TYPES:BEGIN OF gty_ekko,
              ebeln TYPE ekko-ebeln,
              verkf TYPE ekko-verkf,
            END OF gty_ekko.
      DATA:git_ekko TYPE STANDARD TABLE OF gty_ekko.
      DATA:git_fcat   TYPE lvc_t_fcat,
           gwa_fcat   LIKE LINE OF git_fcat,
           gwa_layout TYPE lvc_s_layo.
      DATA:l_pos TYPE i VALUE 1.
      
      START-OF-SELECTION.
      
        SELECT ebeln
               verkf
          INTO TABLE git_ekko
          FROM ekko
         UP TO 10 ROWS.
      
        CLEAR: l_pos.
        l_pos = l_pos + 1.
        gwa_fcat-coltext   = 'PO'.
        gwa_fcat-scrtext_l = 'PO'.
        gwa_fcat-scrtext_m = 'PO'.
        gwa_fcat-scrtext_s = 'PO'.
        gwa_fcat-fieldname = 'EBELN'.
        gwa_fcat-col_pos = l_pos.
        gwa_fcat-outputlen = '10'.
        APPEND gwa_fcat TO git_fcat.
        l_pos = l_pos + 1.
        gwa_fcat-coltext   = 'PO item'.
        gwa_fcat-scrtext_l = 'PO item'.
        gwa_fcat-scrtext_m = 'PO item'.
        gwa_fcat-scrtext_s = 'PO item'.
        gwa_fcat-fieldname = 'VERKF'.
        gwa_fcat-col_pos = l_pos.
        gwa_fcat-edit = 'X'.  "设置列为可编辑状态
        gwa_fcat-outputlen = '20'.
        APPEND gwa_fcat TO git_fcat.
      
        gwa_layout-zebra = 'X'.
        gwa_layout-sel_mode = 'A'.
        gwa_layout-cwidth_opt = 'X'.
      
        CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
          EXPORTING
            i_callback_program = sy-repid
            is_layout_lvc      = gwa_layout
            it_fieldcat_lvc    = git_fcat
          TABLES
            t_outtab           = git_ekko[]
          EXCEPTIONS
            program_error      = 1
            OTHERS             = 2.
        IF sy-subrc = 0.
      *    BREAK-POINT.
        ENDIF.

实现单元格可编辑

  • 单元格可编辑状态设置的主要思想:首先通过 EIDT 参数设置列为可编辑状态;其次对输出内表进行循环将不需要编辑的行设置为不可编辑状态,如此单元格的可编辑属性设置完毕。下面粘贴简要代码。

    • TYPE-POOLS: SLIS.
      *- Fieldcatalog
      DATA: IT_FIELDCAT TYPE LVC_T_FCAT.
      DATA: X_FIELDCAT TYPE LVC_S_FCAT.
      DATA: X_LAYOUT TYPE LVC_S_LAYO.
      
      "第1步:用操作具体单元的是否可编辑的内表和工作区
      
      DATA: LS_EDIT TYPE LVC_S_STYL,
            LT_EDIT TYPE LVC_T_STYL.
      "第2步:在内表定义添加字段,用于控制具体行的具体单元是否可编辑
      DATA: BEGIN OF IT_VBAP OCCURS 0,
        VBELN LIKE VBAP-VBELN,
        POSNR LIKE VBAP-POSNR,
        STYLE TYPE LVC_T_STYL, "FOR DISABLE
      END OF IT_VBAP.
      DATA: LS_OUTTAB LIKE LINE OF IT_VBAP.
      SELECT VBELN  POSNR
        UP TO 100 ROWS
        INTO CORRESPONDING FIELDS OF TABLE IT_VBAP
      FROM VBAP.
      
      DATA:L_POS TYPE I VALUE 1.
      CLEAR: L_POS.
      L_POS = L_POS + 1.
      X_FIELDCAT-SELTEXT = 'VBELN'.
      X_FIELDCAT-FIELDNAME = 'VBELN'.
      X_FIELDCAT-TABNAME = 'ITAB'.
      X_FIELDCAT-COL_POS = L_POS.
      X_FIELDCAT-EDIT = 'X'.
      X_FIELDCAT-OUTPUTLEN = '10'.
      x_fieldcat-ref_field = 'VBELN'.
      x_fieldcat-ref_table = 'VBAK'.
      APPEND X_FIELDCAT TO IT_FIELDCAT.
      
      CLEAR X_FIELDCAT.
      L_POS = L_POS + 1.
      X_FIELDCAT-SELTEXT = 'POSNR'.
      X_FIELDCAT-FIELDNAME = 'POSNR'.
      X_FIELDCAT-TABNAME = 'ITAB'.
      X_FIELDCAT-COL_POS = L_POS.
      X_FIELDCAT-EDIT = 'X'.
      X_FIELDCAT-OUTPUTLEN = '5'.
      APPEND X_FIELDCAT TO IT_FIELDCAT.
      CLEAR X_FIELDCAT.
      L_POS = L_POS + 1.
      
      "第3步:设置第六行两个单元都不能输入
      SY-TABIX = 6.
      LS_EDIT-FIELDNAME = 'VBELN'.
      LS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
      LS_EDIT-STYLE2 = SPACE.
      LS_EDIT-STYLE3 = SPACE.
      LS_EDIT-STYLE4 = SPACE.
      LS_EDIT-MAXLEN = 10.
      INSERT LS_EDIT INTO TABLE LT_EDIT.
      
      LS_EDIT-FIELDNAME = 'POSNR'.
      LS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
      LS_EDIT-STYLE2 = SPACE.
      LS_EDIT-STYLE3 = SPACE.
      LS_EDIT-STYLE4 = SPACE.
      LS_EDIT-MAXLEN = 6.
      INSERT LS_EDIT INTO TABLE LT_EDIT.
      
      INSERT LINES OF LT_EDIT INTO TABLE LS_OUTTAB-STYLE.
      
      "第4步:将控制数据写到内表
      MODIFY IT_VBAP INDEX SY-TABIX FROM LS_OUTTAB TRANSPORTING STYLE .
      "设置第10行只有项目不能输入
      clear LS_OUTTAB.
      refresh LT_EDIT.
      LS_EDIT-FIELDNAME = 'POSNR'.
      LS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
      LS_EDIT-STYLE2 = SPACE.
      LS_EDIT-STYLE3 = SPACE.
      LS_EDIT-STYLE4 = SPACE.
      LS_EDIT-MAXLEN = 6.
      INSERT LS_EDIT INTO TABLE LT_EDIT.
      INSERT LINES OF LT_EDIT INTO TABLE LS_OUTTAB-STYLE.
      SY-TABIX = 10.
      
      "将控制数据写到内表
      MODIFY IT_VBAP INDEX SY-TABIX FROM LS_OUTTAB TRANSPORTING STYLE .
      
      "第5步:设置控制字段
      X_LAYOUT-STYLEFNAME = 'STYLE'.
      
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
        EXPORTING
          I_CALLBACK_PROGRAM = SY-REPID
          IS_LAYOUT_LVC      = X_LAYOUT
          IT_FIELDCAT_LVC    = IT_FIELDCAT
        TABLES
          T_OUTTAB           = IT_VBAP[]
        EXCEPTIONS
          PROGRAM_ERROR      = 1
          OTHERS             = 2.
      IF SY-SUBRC NE 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
        WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.

ALV 的颜色设定(单元格,行,列的颜色设定)

在 ABAP 开发过程中,有的时候,我们需要在 ALV 网格上绘上一些颜色.可以给特定的行,某个特定的列,某个特定的单元格绘制颜色.

如果某列被设置为关键列,这列的颜色将被自动绘制,而不需要我们额外的指定.,ALV 的颜色是四位的如 C710,第一位是固定死的 C,第二位是颜色代码,可能值为 1-7,代表颜色如下:

1:Gray-blue —>headers

2:Light gray —>List bodies

3:yellow —>totals

4:Blue-green—>Key columns

5:green —>Positive threshold value

6:red —>Negative threshold value

7:orange —>Control levels

后两位是 1 和 0 的组合,10 则代表颜色用在背景,01 代表颜色用在前景。

列颜色设定

  • 列的颜色很简单,在构成 ALV 字段的 FIELDCAT 内表中有一个字段是 EMPHASIZE,将一个 char 型 4 位的颜色代码分配到 FIELDCAT 内表这个字段即可。

    • LW_FCAT-EMPHASIZE = 'C710'. "设置字段的颜色 

行颜色设定

  • 为某行设置颜色,是有点复杂的,我们需要在要显示的数据内表中增加一个字段,这个字段不需要在字段目录中存在.同样,这个字段也是 4 位的 CHAR 型,符合颜色编码的定义.,然后在布局设定中指定该列为颜色列,gs_layout-info_fname = ‘COLOR’.或(info_fieldname)

    • FORM p_data .
        LOOP AT gt_mara.
          IF gt_mara-matnr = '100-100'.
            gt_mara-color = 'C310'.
          ENDIF.
          MODIFY gt_mara.
        ENDLOOP.
      ENDFORM.
        
      gs_layout-info_fname = 'COLOR'

单元格颜色设定

  • 设置单元格和设置行的颜色,本质上没有什么大的区别,但是定位单元格需要 2 个参数.我们需要在数据内表中插入一个表类型的字段,这样我们的数据内表就变成了 DEEP 结构了,不过 ALV 是可以处理的.不需要担心.

  • 插入的这个表类型的类型为”LVC_T_SCOL”.里面有 3 个参数:

  • FNAME 告诉我们你需要设置的是哪个字段,如果为空,然后直接在 COLOR 中设置颜色,就是整行设置为这个颜色.如果具体到某个单元格,必须指定是哪个字段.

  • COLOR 字段是用来设置颜色的.

  • NOKEYCOL 字段比较关键了.设置为关键列的一些字段,我们的颜色设置可能被覆盖.通过这个字段的设置,可以避免被关键列的颜色被覆盖.

  • 同样,ALV 在布局中有个字段”CTAB_FNAME”告诉我们,数据内表中,哪个字段是用来设置单元格的颜色的,类似于设置行颜色的 INTO_FNAME.

    • FORM p_data .
        LOOP AT gt_mara.
          IF gt_mara-matnr = '100-100'.
            gt_mara-color = 'C310'."设置行的颜色
          ENDIF.
          IF gt_mara-matnr = '100-401'.
            CLEAR gs_cellcolor.
            gs_cellcolor-fname = 'MTART'.
            gs_cellcolor-color-col = '6'.
            APPEND gs_cellcolor TO gt_mara-cellclor."设置单元格的颜色
            gs_cellcolor-fname = 'ERSDA'.
            gs_cellcolor-color-col = '7'.
            APPEND gs_cellcolor TO gt_mara-cellclor.
          ENDIF.
          MODIFY gt_mara.
        ENDLOOP.
      ENDFORM.
      gs_layout-ctab_fname = 'COLOR'.

下拉框设置

  • 设置下拉框数据

    • DATA: gs_dropdowm TYPE lvc_s_drop,
            gt_dropdowm TYPE lvc_t_drop.
      gs_dropdowm-handle = '2'.
      gs_dropdowm-value  = 'drop-value1'.
      APPEND gs_dropdowm TO gt_dropdowm.
      
      CLEAR: gs_dropdowm.
      gs_dropdowm-handle = '2'.
      gs_dropdowm-value  = 'drop-value2'.
      APPEND gs_dropdowm TO gt_dropdowm.
  • 设置 FieldCatelog 属性

    • gs_fieldcat-drdn_hndl = 2.
  • 调用 ALV 显示方法之前设置下拉框

    • CALL METHOD g_grid01->set_drop_down_table
        EXPORTING
          it_drop_down = gt_dropdowm. "添加下拉框方法到ALV中顯示
      
      " 调用ALV 显示方法
      CALL METHOD g_grid01->set_table_for_first_display
        EXPORTING
      *   i_structure_name              = 'SPFLI' " 参照表结构字段显示
          is_layout                     = ls_layout " 布局
        CHANGING
          it_fieldcatalog               = gt_fieldcat " 显示字段
          it_outtab                     = gt_data[]
        EXCEPTIONS
          invalid_parameter_combination = 1
          program_error                 = 2
          too_many_lines                = 3
          others                        = 4.

CL_GUI_DOCKING_CONTAINER

  • 使用 CL_GUI_DOCKING_CONTAINER 不需要提前在屏幕中绘制自定义控制区域

    • DATA: GS_DOCK TYPE REF TO CL_GUI_DOCKING_CONTAINER. "屏幕容器对象
      FORM FRM_SET_GRID .
      
        "实例化屏幕容器
        CREATE OBJECT GS_DOCK
          EXPORTING
      *     PARENT                      =
            REPID                       = SY-REPID      "当前程序
            DYNNR                       = '0100'        "屏幕编号
            SIDE                        = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_LEFT  "容器吸附左侧
            EXTENSION                   = 1300           "ALV的宽度
      *     STYLE                       =
      *     LIFETIME                    = lifetime_default
      *     CAPTION                     =
            METRIC                      = 0
      *     RATIO                       = 100           "ALV的比率,优先级高于上面的EXTENSION
      *     NO_AUTODEF_PROGID_DYNNR     =
      *     NAME                        =
          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 ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
      *              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.
      
      
      *
      *  CREATE OBJECT GS_CON
      *    EXPORTING
      **     PARENT                      =
      *      CONTAINER_NAME              = 'GC_CON'
      **     STYLE                       =
      **     LIFETIME                    = lifetime_default
      **      REPID                       = SY-REPID
      **      DYNNR                       = '0100'
      **     NO_AUTODEF_PROGID_DYNNR     =
      *    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 ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
      **            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      *  ENDIF.
      
      
        "实例化alv展示对象
        CREATE OBJECT GS_ALV
          EXPORTING
      *     I_SHELLSTYLE      = 0
      *     I_LIFETIME        =
            I_PARENT          = GS_DOCK
      *     I_APPL_EVENTS     = space
      *     I_PARENTDBG       =
      *     I_APPLOGPARENT    =
      *     I_GRAPHICSPARENT  =
      *     I_NAME            =
      *     I_FCAT_COMPLETE   = SPACE
          EXCEPTIONS
            ERROR_CNTL_CREATE = 1
            ERROR_CNTL_INIT   = 2
            ERROR_CNTL_LINK   = 3
            ERROR_DP_CREATE   = 4
            OTHERS            = 5.
        IF SY-SUBRC <> 0.
      * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
      *            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.
      ENDFORM.

CL_GUI_SPLITTER_CONTAINER

  • 拆分 CL_GUI_CONTAINER 可以通过使用 CL_GUI_SPLITTER_CONTAINER 对象的 GET_CONTAINER 方法获取多个容器对象来实现。 

    • DATA: G_SPLITTER_CONTAINER_1 TYPE REF TO CL_GUI_SPLITTER_CONTAINER.
      DATA: MYCONTAINER_1 TYPE REF TO CL_GUI_CONTAINER.
      DATA: MYCONTAINER_2 TYPE REF TO CL_GUI_CONTAINER.
        CREATE OBJECT G_SPLITTER_CONTAINER_1
          EXPORTING
            PARENT  = CL_GUI_CONTAINER=>SCREEN0
            ROWS    = 2         "该方法中传入实参ROWS和COLUMNS的值决定你每行跟每列的容器数目
            COLUMNS = 1.
        
        CALL METHOD G_SPLITTER_CONTAINER_1->GET_CONTAINER
          EXPORTING
            ROW       = 1       "该方法中传入实参ROW和COLUMNS决定容器在屏幕中所处的相对位置
            COLUMN    = 1
          RECEIVING
            CONTAINER = MYCONTAINER_1.
        
        CALL METHOD G_SPLITTER_CONTAINER_1->GET_CONTAINER
          EXPORTING
            ROW      = 2
            COLUMN   = 1
          RECEIVING
            CONTAINER = MYCONTAINER_2.
  • 在容器中放 ALV 控件就实现了分屏显示多个 ALV 控件

    • DATA: G_GUI_ALV_1 TYPE REF TO CL_GUI_ALV_GRID.
      DATA: G_GUI_ALV_2 TYPE REF TO CL_GUI_ALV_GRID.
      CREATE OBJECT G_GUI_ALV_1
        EXPORTING
          I_PARENT = MYCONTAINER_1.
        
      CREATE OBJECT G_GUI_ALV_2
        EXPORTING
          I_PARENT = MYCONTAINER_2.
      *—–省略给ALV展示所需参数赋值……
      
      CALL METHOD G_GUI_ALV_1->SET_TABLE_FOR_FIRST_DISPLAY
        EXPORTING
          IS_LAYOUT            = GTH_LAYOUT_UP
        CHANGING
          IT_OUTTAB            = GT_MAT
          IT_FIELDCATALOG      = GTD_FIELDCAT_UP.

       

标签:SY,实现,EDIT,ALV,ABAP,9001,OOALV,TYPE,toolbar
来源: https://www.cnblogs.com/ap-ad-java-abap/p/16549890.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有