1.1ALV屏幕

1.1.1定义无CONTAINER屏幕

1、屏幕中可以不使用定制控制控件画范围,直接定义一个屏幕即可。

  1. "-----------------------------------------@斌将军--------------------------------------------
    g_grid_9000 TYPE REF TO cl_gui_alv_grid, "容器的实例
  2. g_container_9000 TYPE REF TO cl_gui_docking_container, "容器 不用画屏幕容器
    "-----------------------------------------@斌将军--------------------------------------------

2、创建容器

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

3、创建容器实例

  1. "-----------------------------------------@斌将军--------------------------------------------
    * 创建容器实例
  2. CREATE OBJECT g_grid_9000
  3. EXPORTING
  4. i_parent = g_container_9000
  5. EXCEPTIONS
  6. error_cntl_create = 1
  7. error_cntl_init = 2
  8. error_cntl_link = 3
  9. error_dp_create = 4
  10. OTHERS = 5.
  11. IF sy-subrc <> 0.
  12. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  13. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  14. ENDIF.
    "-----------------------------------------@斌将军--------------------------------------------

4、排序汇总

在业务中,需要根据提货单号,将相同提货单号的行的提货单数量汇总。

首先设置排序

  1. "-----------------------------------------@斌将军--------------------------------------------
    FORM frm_alv_sort_9000.
  2. CLEAR:gs_sort.
  3. gs_sort-fieldname = 'THDXH'.
  4. gs_sort-UP = 'X'.
  5. gs_sort-subtot = 'X'.
  6. APPEND gs_sort TO gt_sort.
  7. ENDFORM.
    "-----------------------------------------@斌将军--------------------------------------------

设置汇总

  1. "-----------------------------------------@斌将军--------------------------------------------
    gs_fieldcat-do_sum = &3.
  2. init_fill_fcat 'ZBCJHSL' '提货单数量' 'X' '' '' '' '' '' ''.
    "-----------------------------------------@斌将军--------------------------------------------

5、事件注册

  1. "-----------------------------------------@斌将军--------------------------------------------
    FORM frm_alv_event_9001.
  2. DATA: lr_event_handler TYPE REF TO alv_event_9001.
  3. DATA: lt_f4 TYPE lvc_t_f4,
  4. ls_f4 TYPE lvc_s_f4.
  5.  
  6. CLEAR:ls_f4.
  7. ls_f4-fieldname = 'Z_ZFBZ'."作废标记
  8. ls_f4-register = 'X'.
  9. ls_f4-chngeafter = 'X'.
  10. INSERT ls_f4 INTO TABLE lt_f4.
  11.  
  12. CALL METHOD g_grid_9001->register_edit_event "注册回车事件
  13. EXPORTING
  14. i_event_id = cl_gui_alv_grid=>mc_evt_enter.
  15.  
  16. CALL METHOD g_grid_9001->register_edit_event "注册失去鼠标事件
  17. EXPORTING
  18. i_event_id = cl_gui_alv_grid=>mc_evt_modified.
  19.  
  20. CALL METHOD g_grid_9001->register_f4_for_fields "注册搜索帮助事件
  21. EXPORTING
  22. it_f4 = lt_f4.
  23.  
  24. IF lr_event_handler IS INITIAL.
  25. CREATE OBJECT lr_event_handler.
  26. ENDIF.
  27. SET HANDLER lr_event_handler->handle_data_changed FOR g_grid_9001. "数据改动事件
  28. SET HANDLER lr_event_handler->handle_double_click FOR g_grid_9001.
  29. SET HANDLER lr_event_handler->handle_on_f4 FOR g_grid_9001.
  30. SET HANDLER lr_event_handler->handle_hotspot_click FOR g_grid_9001 .
  31. SET HANDLER lr_event_handler->handle_toolbar FOR g_grid_9001. "工具栏事件
  32. SET HANDLER lr_event_handler->handle_user_command FOR g_grid_9001. "用户命令事件
  33.  
  34. ENDFORM.
    "-----------------------------------------@斌将军--------------------------------------------

6、展示ALV

  1. "-----------------------------------------@斌将军--------------------------------------------
    CALL METHOD g_grid_9000->set_table_for_first_display
  2. EXPORTING
  3. is_variant = gs_variant_9000
  4. * i_save = 'A'
  5. is_layout = gs_layout_9000
  6. it_toolbar_excluding = gt_exclude_9000
  7. CHANGING
  8. it_outtab = gt_selalv "输出数据的内表
  9. it_fieldcatalog = gt_fieldcat_9000 "
  10. it_sort = gt_sort"排序
  11. it_filter = gt_filt
  12. EXCEPTIONS
  13. invalid_parameter_combination = 1
  14. program_error = 2
  15. too_many_lines = 3
  16. OTHERS = 4.
  17. IF sy-subrc <> 0.
  18. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  19. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  20. ENDIF.
    "-----------------------------------------@斌将军--------------------------------------------

7、屏幕刷新

  1. "-----------------------------------------@斌将军--------------------------------------------
    FORM frm_refresh_alv_9000 .
  2. DATA: lt_celltab TYPE lvc_t_styl,
  3. ls_celltab TYPE lvc_s_styl,
  4. ls_stable TYPE lvc_s_stbl.
  5.  
  6. ls_stable-row = 'X'. "固定行
  7. ls_stable-col = 'X'. "固定列
  8.  
  9. CHECK g_grid_9000 IS NOT INITIAL.
  10.  
  11. CALL METHOD g_grid_9000->refresh_table_display
  12. EXPORTING
  13. is_stable = ls_stable
  14. * I_SOFT_REFRESH = 'X'
  15. EXCEPTIONS
  16. finished = 1
  17. OTHERS = 2.
  18.  
  19. IF sy-subrc <> 0.
  20. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  21. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  22. ENDIF.
  23. CALL METHOD cl_gui_cfw=>flush.
  24. ENDFORM.
    "-----------------------------------------@斌将军--------------------------------------------

1.1.2定义有CONTAINER屏幕

1、首先在屏幕中使用空间画一个框

2、如果使用定制控制在控件中画范围,则需要使用另一个类。

  1. "-----------------------------------------@斌将军--------------------------------------------
    g_container_9000 TYPE REF TO cl_gui_custom_container"ALV container容器 需要画屏幕容器
    "-----------------------------------------@斌将军--------------------------------------------

并且为屏幕中的控件定义名字,在程序中使用

  1. "-----------------------------------------@斌将军--------------------------------------------
    gv_9000 TYPE scrfname VALUE 'Z9000_ITEM', "GV_TABLE 是屏幕中定义的控件
    "-----------------------------------------@斌将军--------------------------------------------

3、创建容器

  1. "-----------------------------------------@斌将军--------------------------------------------
    * 创建 容器
  2. CREATE OBJECT g_container_9000
  3. EXPORTING
  4. container_name = gv_9000.
  5.  
  6. CREATE OBJECT g_grid_9000
  7. EXPORTING
  8. i_parent = g_container_9000.
    "-----------------------------------------@斌将军--------------------------------------------

4、创建容器实例

  1. "-----------------------------------------@斌将军--------------------------------------------
    * 创建容器实例
  2. CREATE OBJECT g_grid_9000
  3. EXPORTING
  4. i_parent = g_container_9000
  5. EXCEPTIONS
  6. error_cntl_create = 1
  7. error_cntl_init = 2
  8. error_cntl_link = 3
  9. error_dp_create = 4
  10. OTHERS = 5.
  11. IF sy-subrc <> 0.
  12. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  13. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  14. ENDIF.
    "-----------------------------------------@斌将军--------------------------------------------

其他的部分都与无CONTAINER的创建方法一致。

1.2事件处理

1.2.1定义事件类

1、初始化事件类

  1. "-----------------------------------------@斌将军--------------------------------------------
    INITIALIZATION.
  2. CLASS alv_event_9000 DEFINITION DEFERRED.
    "-----------------------------------------@斌将军--------------------------------------------

2、定义事件类的方法

  1. "-----------------------------------------@斌将军--------------------------------------------
    CLASS alv_event_9000 DEFINITION.
  2. PUBLIC SECTION.
  3. METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid"数据改动事件
  4. IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
  5. METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid"双击事件
  6. IMPORTING e_row e_column es_row_no.
  7. METHODS handle_on_f4 FOR EVENT onf4 OF cl_gui_alv_grid"F4
  8. IMPORTING e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells e_display.
  9. METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid"用户按钮事件
  10. IMPORTING e_ucomm.
  11. METHODS handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid"热区单击事件
  12. IMPORTING e_row_id e_column_id es_row_no.
  13. METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid"工具条事件
  14. IMPORTING e_object e_interactive.
  15. ENDCLASS.
    "-----------------------------------------@斌将军--------------------------------------------

3、实现类的方法

  1. "-----------------------------------------@斌将军--------------------------------------------
    CLASS alv_event_9000 IMPLEMENTATION.
  2. METHOD handle_data_changed. "数据改动事件
  3. PERFORM frm_handle_data_changed USING er_data_changed.
  4. ENDMETHOD.
  5. METHOD handle_double_click . "双击事件
  6. PERFORM frm_double_click USING e_row e_column es_row_no.
  7. ENDMETHOD. "HANDLE_USER_COMMAND
  8. METHOD handle_on_f4 . "F4
  9. PERFORM frm_alv_on_f4 USING e_fieldname e_fieldvalue es_row_no er_event_data e_display.
  10. er_event_data->m_event_handled = 'X' .
  11. ENDMETHOD.
  12. METHOD handle_user_command. "用户按钮事件
  13. PERFORM frm_handle_user_command9000 USING e_ucomm.
  14. ENDMETHOD.
  15. METHOD handle_hotspot_click. "热区单击事件
  16. PERFORM handle_hotspot_click USING e_row_id e_column_id es_row_no.
  17. ENDMETHOD. "handle_hotspot_click
  18. METHOD handle_toolbar. "工具条事件
  19. PERFORM frm_handle_toolbar9000 USING e_object e_interactive."设置工具条图标
  20. ENDMETHOD. "HANDLE_DOUBLE_CLICK
  21. ENDCLASS.
    "-----------------------------------------@斌将军--------------------------------------------

1.2.2搜索帮助事件

1、定义响应F4的字段

  1. "-----------------------------------------@斌将军--------------------------------------------
    DATA: lr_event_handler TYPE REF TO alv_event_9001.
  2. DATA: lt_f4 TYPE lvc_t_f4,
  3. ls_f4 TYPE lvc_s_f4.
  4.  
  5. CLEAR:ls_f4.
  6. ls_f4-fieldname = 'Z_ZFBZ'."作废标记
  7. ls_f4-register = 'X'.
  8. ls_f4-chngeafter = 'X'.
  9. INSERT ls_f4 INTO TABLE lt_f4.
    "-----------------------------------------@斌将军--------------------------------------------

2、将F4内表注册到搜索帮助

  1. "-----------------------------------------@斌将军--------------------------------------------
    CALL METHOD g_grid_9001->register_f4_for_fields "注册搜索帮助事件
  2. EXPORTING
  3. it_f4 = lt_f4.
    "-----------------------------------------@斌将军--------------------------------------------

3、将搜索帮助注册到屏幕

  1. "-----------------------------------------@斌将军--------------------------------------------
    IF lr_event_handler IS INITIAL.
  2. CREATE OBJECT lr_event_handler.
  3. ENDIF.
  4.  
  5. SET HANDLER lr_event_handler->handle_on_f4 FOR g_grid_9001.
    "-----------------------------------------@斌将军--------------------------------------------

4、定义字段为F4属性

  1. "-----------------------------------------@斌将军--------------------------------------------
    gs_fieldcat-f4availabl = &5.
  2.  
  3. init_fill_fcat 'Z_ZFBZ' '作废标记' '' '' 'X' '' 'X' '' ''.
    "-----------------------------------------@斌将军--------------------------------------------

5、定义F4响应逻辑

  1. "-----------------------------------------@斌将军--------------------------------------------
    FORM frm_alv_on_f4 USING pv_fieldname pv_fieldvalue pv_row_no TYPE lvc_s_roid
  2. pv_event_data TYPE REF TO cl_alv_event_data
  3. pv_display.
  4.  
  5. DATA:lv_fieldname1 TYPE dfies-fieldname,
  6. lv_fieldname2 TYPE help_info-dynprofld.
  7.  
  8. DATA:rs_selfield TYPE slis_selfield.
  9. DATA:ref_grid TYPE REF TO cl_gui_alv_grid.
  10.  
  11. DATA:lt_return TYPE STANDARD TABLE OF ddshretval,
  12. ls_return TYPE ddshretval.
  13.  
  14. DATA:BEGIN OF lt_zf OCCURS 0,
  15. z_zfbz TYPE ztthdvk-z_zfbz, "作废标志
  16. END OF lt_zf.
  17.  
  18. DATA:ls_zf LIKE lt_zf.
  19.  
  20. REFRESH:lt_zf.
  21. CLEAR:ls_zf.
  22. ls_zf-z_zfbz = 'X'.
  23. APPEND ls_zf TO lt_zf. "作废标记不可逆,一旦打上X,则不可能再更改过来
  24.  
  25. lv_fieldname1 = pv_fieldname ."搜索帮助的字段名
  26. lv_fieldname2 = pv_fieldname ."搜索帮助的字段名
  27. CONDENSE lv_fieldname1 NO-GAPS.
  28. CONDENSE lv_fieldname2 NO-GAPS.
  29. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
  30. IMPORTING
  31. e_grid = ref_grid. "获取全局变量
  32. * PERFORM frm_refresh_alv.
  33. REFRESH:lt_return.
  34.  
  35. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
  36. EXPORTING
  37. retfield = lv_fieldname1
  38. dynpprog = sy-repid
  39. dynpnr = sy-dynnr
  40. dynprofield = lv_fieldname2
  41. value_org = 'S'
  42. display = 'F'
  43. TABLES
  44. value_tab = lt_zf
  45. return_tab = lt_return
  46. EXCEPTIONS
  47. parameter_error = 1
  48. no_values_found = 2
  49. OTHERS = 3.
  50.  
  51. CLEAR:gs_head.
  52. READ TABLE gt_head INTO gs_head INDEX pv_row_no-row_id.
  53. IF sy-subrc = 0.
  54. READ TABLE lt_return INTO ls_return INDEX 1.
  55. IF sy-subrc = 0.
  56. gs_head-z_zfbz = ls_return-fieldval.
  57. ENDIF.
  58. MODIFY gt_head FROM gs_head INDEX pv_row_no-row_id."更新ALV内表
  59. ENDIF.
  60.  
  61. PERFORM frm_refresh_alv_9001.
  62. ENDFORM.
    "-----------------------------------------@斌将军--------------------------------------------

6、当出现多列的搜索帮助时,需要在点击某一行时,返回多列的值。例如点击承运商搜索帮助,点击承运商后,也需要返回承运商代码,则需要特殊处理。

搜索帮助内表需要定义为两列


  1. "-----------------------------------------@斌将军--------------------------------------------
    TYPES:BEGIN OF ty_cys,
  2. zcysdm TYPE ztthdvk-zcysdm, "承运商编码
  3. zcys TYPE ztthdvk-zcys, "承运商名称
  4. END OF ty_cys.
  5.  
  6. ls_cys-zcysdm = gs_zttlifnrc-lifnr.
  7. ls_cys-zcys = gs_zttlifnrc-ztext.
  8. APPEND ls_cys TO lt_cys.
  9. CLEAR:ls_cys.
  10.  
  11. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
  12. EXPORTING
  13. retfield = pv_fieldname1
  14. dynpprog = sy-repid
  15. dynpnr = sy-dynnr
  16. dynprofield = pv_fieldname2
  17. value_org = 'S'
  18. display = 'F'
  19. * 可以返回两个返回值-begin
  20. callback_program = sy-repid
  21. callback_form = 'USER_F4_FORM'
  22. * --end
  23. TABLES
  24. value_tab = lt_cys
  25. return_tab = pt_return
  26. EXCEPTIONS
  27. parameter_error = 1
  28. no_values_found = 2
  29. OTHERS = 3.
  30.  
  31. *---------------------------------------------------------------------*
  32. * F4搜索帮助的回调函数,除了F4IF_INT_TABLE_VALUE_REQUEST
  33. * 中定义的字段,还可以返回其他列的字段值
  34. *----------------------------------------------------------------------*
  35. FORM user_f4_form TABLES record_tab STRUCTURE seahlpres CHANGING shlp TYPE shlp_descr_t callcontrol LIKE ddshf4ctrl .
  36. DATA: interface LIKE LINE OF shlp-interface.
  37. READ TABLE shlp-interface INTO interface INDEX 1.
  38.  
  39. CLEAR interface.
  40. interface-shlpfield = 'F0001'. "调试可知,承运商代码列名为F0001
  41. interface-valfield = 'ZCYSDM'. "字段名称
  42. APPEND interface TO shlp-interface.
  43. ENDFORM.
    "-----------------------------------------@斌将军--------------------------------------------

1.2.3数据改变事件

1、回车事件和失去鼠标焦点事件都称为数据改变事件

  1. "-----------------------------------------@斌将军--------------------------------------------
    CALL METHOD g_grid_9000->register_edit_event "注册回车事件
  2. EXPORTING
  3. i_event_id = cl_gui_alv_grid=>mc_evt_enter.
  4.  
  5. CALL METHOD g_grid_9000->register_edit_event "注册失去鼠标事件
  6. EXPORTING
  7. i_event_id = cl_gui_alv_grid=>mc_evt_modified.
  8.  
  9. SET HANDLER lr_event_handler->handle_data_changed FOR g_grid_9000. "数据改动事件
    "-----------------------------------------@斌将军--------------------------------------------

2、数据改变事件处理

  1. "-----------------------------------------@斌将军--------------------------------------------
    FORM frm_handle_data_changed USING pv_data_changed TYPE REF TO cl_alv_changed_data_protocol.
  2. DATA:lt_data TYPE lvc_t_modi,
  3. ls_data LIKE LINE OF lt_data.
  4.  
  5. DATA:lv_zbcjhsl TYPE ztthdvb-zbcjhsl, "本次交货数量
  6. lv_jiansh TYPE ztthdvb-jiansh, "件数
  7. lv_value TYPE char100.
  8.  
  9. CLEAR:gv_stop."流程控制标识
  10.  
  11. lt_data = pv_data_changed->mt_mod_cells.
  12.  
  13. LOOP AT lt_data INTO ls_data.
  14. IF ls_data-fieldname = 'ZBCJHSL'.
  15. CLEAR:lv_zbcjhsl.
  16. CALL METHOD pv_data_changed->get_cell_value "获取单元格中的值
  17. EXPORTING
  18. i_row_id = ls_data-row_id "行号
  19. i_fieldname = 'ZBCJHSL' "要获取的列的列名
  20. IMPORTING
  21. e_value = lv_zbcjhsl. "获取到的单元格中的值
  22.  
  23. ...处理逻辑
  24.  
  25. ENDIF.
  26.  
  27. ENDLOOP.
  28. PERFORM frm_refresh_alv_9001.
  29.  
  30. ENDFORM.
    "-----------------------------------------@斌将军--------------------------------------------

3、关于数据改变的验证

业务中需要对数据改变之后的有效性做校验,判断改变后的数据是否符合业务要求,在合适位置加上校验逻辑即可,报响应的消息。

  1. "-----------------------------------------@斌将军--------------------------------------------
    IF lv_zbcjhsl <= 0.
  2. gv_stop = 'X'."当需要中断程序时打上标识
  3. REFRESH:pv_data_changed->mt_mod_cells."清掉编辑框中的数据,恢复至内表中的正确数据 此处如果不清理,展示的字段内容仍然是编辑后的错误数据
  4. MESSAGE s024(zsd) WITH ls_data-row_id DISPLAY LIKE 'E'.
  5. PERFORM frm_refresh_alv_9000.
  6. RETURN.
  7. ENDIF.
    "-----------------------------------------@斌将军--------------------------------------------

后来发现,因为消息并不是E类型,直接终止程序。所以,如果对于数据改变之后,一不敲回车,二直接点击创建等操作按钮后,虽然也会报消息,但是RETURN只是推出了数据改变事件这一流程块,但是仍然进入创建按钮的逻辑。因此,我们可以在报错时,加入流程控制标识:gv_stop = 'X'."当需要中断程序时打上标识,这样在执行创建逻辑时加入判断:CHECK gv_stop <> 'X'."流程控制,判断事件处理是否有误,并在执行完之后清除流程控制符。

1.2.4工具条事件

1、因OOALV定义的状态栏的标准按钮时无法使用的,所以应使用OOALV屏幕中自带的工具栏,定义的GUI状态栏只负责定义返回按钮即可。

2、自定义的工具栏按钮,可以添加到OOALV屏幕自带的工具栏

3、当自定义的GUI状态栏只有返回按钮没有应用程序工具栏按钮时,会在标准的屏幕工具栏上边出现一条空白,影响美观,我们可以在屏幕中做设置。

这样就可以只使用GUI状态栏的返回退出按钮,而不必出现空白。

4、定义屏幕工具栏的自定义按钮

  1. "-----------------------------------------@斌将军--------------------------------------------
    FORM frm_handle_toolbar9000 USING p_object p_interactive.
  2. PERFORM frm_handle_toolbar_pro USING p_object 'CREATE_THD' '@5Y@' '生成提货单'.
  3.  
  4. ENDFORM.
  5.  
  6. FORM frm_handle_toolbar_pro USING p_object TYPE REF TO cl_alv_event_toolbar_set
  7. p_function TYPE stb_button-FUNCTION
  8. p_icon TYPE stb_button-ICON
  9. p_text TYPE stb_button-TEXT.
  10. DATA: ls_toolbar TYPE stb_button,
  11. lv_quickinfo TYPE stb_button-quickinfo.
  12.  
  13. CLEAR ls_toolbar.
  14. MOVE 3 TO ls_toolbar-butn_type. " 分隔符
  15. APPEND ls_toolbar TO p_object->mt_toolbar.
  16.  
  17. CLEAR ls_toolbar.
  18. MOVE 0 TO ls_toolbar-butn_type. " 按钮(正常)
  19. MOVE p_function TO ls_toolbar-FUNCTION. "功能码
  20. MOVE p_icon TO ls_toolbar-ICON. "图标
  21. MOVE p_text TO ls_toolbar-TEXT. "显示文本
  22. lv_quickinfo = p_text.
  23. MOVE lv_quickinfo TO ls_toolbar-quickinfo.
  24. APPEND ls_toolbar TO p_object->mt_toolbar.
  25. ENDFORM.
    "-----------------------------------------@斌将军--------------------------------------------

5、自定义的屏幕工具栏按钮响应

6、GUI状态的按钮响应,需要在屏幕的PAI中定义

1.2.5单元格可编辑

在ALV内表中定义单元格样式

  1. types:begin of ty_alv,
  2. ...
  3. cellstyles TYPE lvc_t_styl,
  4. END OF ty_alv.

在LAYOUT中声明

  1. gs_layout_9000-stylefname = 'CELLSTYLES'.

在FIELDCAT中定义对应字段为编辑状态

  1. gs_fieldcat-edit = &9.
  2. APPEND gs_fieldcat TO gt_fieldcat_9000.

在ALV内表中传入可编辑和不可编辑

  1. CLEAR gs_stylerow.
  2. gs_stylerow-fieldname = 'ZETDAT_X' .
  3. gs_stylerow-style = cl_gui_alv_grid=>mc_style_disabled."不可编辑
  4. INSERT gs_stylerow INTO TABLE gs_alv-cellstyles.
  5.  
  6. APPEND gs_alv TO gt_alv.
  7.  
  8. CLEAR gs_stylerow.
  9. gs_stylerow-fieldname = 'ZETDAT_X' .
  10. gs_stylerow-style = cl_gui_alv_grid=>mc_style_enabled."可编辑
  11. INSERT gs_stylerow INTO TABLE gs_yqjd_alv-cellstyles.
  12. MODIFY gt_alv FROM gs_alv TRANSPORTING cellstyles WHERE checkbox = 'X'.

1.2.6行颜色

  1. TYPES:BEGIN OF TY_ALV,
  2. ......
  3. rowcolor TYPE char4, "行颜色
  4. END OF TY_ALV.
  1. gs_layout_9000-info_fname = 'ROWCOLOR'.
  2.  
  3. gs_alv-rowcolor = 'C710'.

色卡

1.2.7单元格按钮

  1. TYPES:BEGIN OF ty_alv,
  2. ......
  3. cellstyles TYPE lvc_t_styl,
  4. END OF ty_alv.
  5.  
  6. ...
  7.  
  8. *----------------------------------------------------------------------*
  9. * CLASS lcl_event_receiver DEFINITION 定义类
  10. *----------------------------------------------------------------------*
  11. CLASS alv_event_9000 DEFINITION.
  12. ......
  13. METHODS handle_button_click FOR EVENT button_click OF cl_gui_alv_grid
  14. IMPORTING es_col_id es_row_no.
  15. ENDCLASS. "alv_event_9000 DEFINITION
  16.  
  17. *----------------------------------------------------------------------*
  18. * CLASS BELOW_ALV_EVENT IMPLEMENTATION 定义的事件类对应的事件响应模块
  19. *----------------------------------------------------------------------*
  20. CLASS alv_event_9000 IMPLEMENTATION.
  21. ......
  22. METHOD handle_button_click.
  23. PERFORM frm_handle_button_click USING es_col_id es_row_no.
  24. ENDMETHOD.
  25.  
  26. ENDCLASS. "alv_event_9000 IMPLEMENTATION
  27.  
  28. ......
  29.  
  30. *&---------------------------------------------------------------------*
  31. *& Form FRM_DOUBLE_CLICK
  32. *&---------------------------------------------------------------------*
  33. FORM frm_handle_button_click USING p_e_column_id TYPE lvc_s_col
  34. p_es_row_no TYPE lvc_s_roid.
  35.  
  36. "当双击某字段则跳转到9001屏幕
  37. READ TABLE gt_alv INTO gs_alv INDEX p_es_row_no-row_id.
  38. IF sy-subrc EQ 0.
  39. CASE p_e_column_id-fieldname.
  40. WHEN 'EDATU'."计划收货日期明细
  41.  
  42. "定义要显示字段详情的变量
  43. gv_alv2 = 'EDATU'.
  44.  
  45. "展示的数据
  46. REFRESH:gt_vbep_item.
  47. gt_vbep_item = gt_vbep.
  48. DELETE gt_vbep_item WHERE vbeln <> gs_alv-vbeln_d OR matnr <> gs_alv-matnr.
  49. IF gt_vbep_item IS INITIAL.
  50. MESSAGE s001 DISPLAY LIKE 'E'.
  51. RETURN.
  52. ENDIF.
  53.  
  54. "展示的数据调用9001屏幕
  55. CALL SCREEN 9001.
  56.  
  57. ENDCASE.
  58. ENDIF.
  59.  
  60. ENDFORM.
  61.  
  62. ......
  63. DATA: ls_stylerow TYPE lvc_s_styl.
  64. ls_stylerow-fieldname = 'EDATU'."计划收货日期
  65. ls_stylerow-style = cl_gui_alv_grid=>mc_style_button.
  66. INSERT ls_stylerow INTO TABLE gs_alv-cellstyles.

1.3细节处理

1.3.1选择屏幕设置

当选择屏幕需要切换时,如果输入框有必输字段则需要输入值才能切换到另一个界面

一般的处理方法是,去掉必输标识,用程序控制是否必输,报消息提醒,但是这种方法毕竟没法给用户直观的必输体验,因此可以采用下面的方法:

销售组织不设置必输

此处只打上勾,但是却不自动校验是否输值,只是一个外观效果

  1. "-----------------------------------------@斌将军--------------------------------------------
    AT SELECTION-SCREEN OUTPUT.
  2.  
  3. LOOP AT SCREEN.
  4. IF screen-name = 'S_VKORG-LOW'.
  5. screen-required = '2'."外观上打钩必输,但不自动校验
  6. ENDIF.
  7. MODIFY SCREEN.
  8. ENDLOOP.
    "-----------------------------------------@斌将军--------------------------------------------

  1. "-----------------------------------------@斌将军--------------------------------------------
    FORM frm_check_srceen.
  2. IF s_vkorg-low IS INITIAL.
  3. MESSAGE e016(zsd).
  4. ENDIF.
  5. ENDFORM.
    "-----------------------------------------@斌将军--------------------------------------------

1.3.2选择框

在OOALV中,定义侧边栏BOX选择框是不起作用的,但是勾选的选择框对于大量的数据实在比较不方便,因此我们需要使用侧边栏BOX,并做特殊处理。

在调用创建等操作按钮之前,使用get_selected_rows获取选中的行,先将上一次选中的行的BOX标记去掉,之后将选中行的BOX字段打上标记。

  1. "-----------------------------------------@斌将军--------------------------------------------
    CALL METHOD g_grid_9000->get_selected_rows
  2. IMPORTING
  3. et_index_rows = lt_row
  4. et_row_no = lt_roid.
  5.  
  6. * 因为OOALV中侧边栏选择框不起作用,但是需要使用,就将选中的行的侧边栏的值修改一下
  7. gs_item-box = ''.
  8. MODIFY gt_item FROM gs_item TRANSPORTING box WHERE box = 'X'.
  9. LOOP AT lt_row INTO ls_row.
  10. READ TABLE gt_item INTO gs_item INDEX ls_row-INDEX.
  11. IF sy-subrc EQ 0.
  12. gs_item-box = 'X'.
  13. MODIFY gt_item FROM gs_item INDEX ls_row-INDEX TRANSPORTING box .
  14. ENDIF.
  15. CLEAR:ls_row,gs_item.
  16. ENDLOOP.
    "-----------------------------------------@斌将军--------------------------------------------

1.3.3动态列

在OOALV中需要实现不同条件下,显示不同列。

1、DATA: G_GRID TYPE REF TO CL_GUI_ALV_GRID.

使用G_GRID->GET_FRONTEND_FIELDCATALOG ,获取当前的列信息,之后修改为需要显示的列,或者直接清空,用PERFORM INIT_FIELDCAT1.重新赋值。之后使用G_GRID->SET_FRONTEND_FIELDCATALOG,传入新赋值的列内表即可。

1.3.4获取双击单元格的值

  1. "-----------------------------------------@斌将军--------------------------------------------
    *&---------------------------------------------------------------------*
  2. *& Form FRM_DOUBLE_CLICK
  3. *&---------------------------------------------------------------------*
  4. FORM frm_double_click_9001 USING p_e_row_id TYPE lvc_s_row
  5. p_e_column_id TYPE lvc_s_col
  6. p_es_row_no TYPE lvc_s_roid.
  7.  
  8. "获取当前单元格的内容
  9. DATA:e_value TYPE char255.
  10. CALL METHOD g_grid_9001->get_current_cell
  11. IMPORTING
  12. e_value = e_value.
  13.  
  14. CASE p_e_column_id-fieldname.
  15. WHEN 'MATNR'.
  16. SET PARAMETER ID 'MAT' FIELD e_value.
  17. CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
  18. WHEN 'PLNUM'."计划订单
  19. SET PARAMETER ID 'PAF' FIELD e_value.
  20. CALL TRANSACTION 'MD13' AND SKIP FIRST SCREEN.
  21. ENDCASE.
  22.  
  23. ENDFORM.
    "-----------------------------------------@斌将军--------------------------------------------

1.3.5没有保存布局按钮

OOALV中只有更改布局按钮,没有保存布局按钮

插入代码

  1. "-----------------------------------------@斌将军--------------------------------------------
    gs_variant_9000-report = sy-repid && sy-dynnr.
    "-----------------------------------------@斌将军--------------------------------------------

其中I_SAVE参数传值注解:

I_SAVE = ''. 不能保存布局

I_SAVE = 'U'. 仅保存自定义的布局

I_SAVE = 'X'.  仅保存全局布局

I_SAVE = 'A'.   可保存自定义的布局和全局的布局

出现了保存布局按钮

定期更文,欢迎关注

 
 
 
 
 
 
 
 
此页面的语言为英语
 
翻译为中文(简体)
 
 
 
 
  • 中文(简体)
  • 中文(繁体)
  • 丹麦语
  • 乌克兰语
  • 乌尔都语
  • 亚美尼亚语
  • 俄语
  • 保加利亚语
  • 克罗地亚语
  • 冰岛语
  • 加泰罗尼亚语
  • 匈牙利语
  • 卡纳达语
  • 印地语
  • 印尼语
  • 古吉拉特语
  • 哈萨克语
  • 土耳其语
  • 威尔士语
  • 孟加拉语
  • 尼泊尔语
  • 布尔语(南非荷兰语)
  • 希伯来语
  • 希腊语
  • 库尔德语
  • 德语
  • 意大利语
  • 拉脱维亚语
  • 挪威语
  • 捷克语
  • 斯洛伐克语
  • 斯洛文尼亚语
  • 旁遮普语
  • 日语
  • 普什图语
  • 毛利语
  • 法语
  • 波兰语
  • 波斯语
  • 泰卢固语
  • 泰米尔语
  • 泰语
  • 海地克里奥尔语
  • 爱沙尼亚语
  • 瑞典语
  • 立陶宛语
  • 缅甸语
  • 罗马尼亚语
  • 老挝语
  • 芬兰语
  • 英语
  • 荷兰语
  • 萨摩亚语
  • 葡萄牙语
  • 西班牙语
  • 越南语
  • 阿塞拜疆语
  • 阿姆哈拉语
  • 阿尔巴尼亚语
  • 阿拉伯语
  • 韩语
  • 马尔加什语
  • 马拉地语
  • 马拉雅拉姆语
  • 马来语
  • 马耳他语
  • 高棉语
 
随时将英语翻译为中文(简体)PRO
一律不翻译英语
一律不翻译i.cnblogs.com

OOALV总结的更多相关文章

  1. 【ABAP系列】SAP ABAP OOALV 动态设置单元格可否编辑

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP OOALV 动 ...

  2. OOalv 实现带出栏位描述

    .类定义 CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS: handle_data_changed_finished FOR E ...

  3. 20170218 OO-ALV标准工具栏按钮

    原文地址:OO ALV 工具栏对于的功能码   图标与对应的 功能码 明细 &DETAIL 检查 &CHECK 刷新 &REFRESH 剪切 &LOCAL&CU ...

  4. 一百一十二、SAP的OO-ALV之六,复制一个工程的工具栏到另外一个工程的工具栏

    一.我们输入SE38,查看一个SAP的标准查询 二.可以看到这个程序拥有一个标准的工具栏 三.我们来到, 输入这个程序名,再点状态 四.把工具栏复制过来 五.弹出的窗口点对勾 六.系统提示已经复制 七 ...

  5. 一百一十一、SAP的OO-ALV之五,显示ALV表格

    一.在屏幕里面有2部分,(PROCESS BEFORE OUTPUT 用于显示, PROCESS AFTER INPUT用于数据处理).我们创建的display_alv函数, 二.display_al ...

  6. 一百一十、SAP的OO-ALV之四,定义屏幕相关变量和逻辑流

    一.代码如下,定义相关变量 二.来带屏幕页面,双击STATUS_9000和USER_COMMAND_9000,自动生成相应代码 三.点击是 四.会自动生产关联的Includ文件 五.我们自己创建一个M ...

  7. 一百零九、SAP的OO-ALV之三,屏幕绘制器的使用

    一.在Screen页面,点击格式,会打开屏幕绘制器 二.点击定制控制,和PS一样画出一个显示区域的画布容器 三.双击之后,在弹出的属性页面写入一个名字,保存 四.激活屏幕后关闭 五.关闭屏幕绘制器之后 ...

  8. 一百零八、SAP的OO-ALV之二,创建屏幕Screen

    一.在资源管理器,右键->创建屏幕 二.输入4位数字 三.输入屏幕的描述 四.在逻辑流里面PBO用于显示屏幕,PAI用于用户交互. 五.在元素清单里面,在屏幕中的所有元素都是在元素清单中的

  9. 一百零七、SAP的OO-ALV之一,新建程序

    一.来带SE38模块,新建一个Z_TIANPAN_20190807_OOALV的本地程序 二.设置一个标题,点击对勾 三.选择保存为本地对象 我们下一篇来写创建屏幕

  10. 一百零六、SAP的OOP面向对象编程,OO-ALV的简介

    面向对象编程,如图 基本概念: 1.对象(Object)是一个现实实体的抽象.一个对象可被认为是一个把数据(属性)和程序(方法)封装在一起的实体,这个程序产生该对象的动作或对它接受到的外界信号的反应. ...

随机推荐

  1. STL set容器

    set 使用 set 容器存储的各个键值对,要求键 key 和值 value 必须相等. 举个例子,如下有 2 组键值对数据: {<'a', 1>, <'b', 2>, < ...

  2. python列表删除元素之del,pop()和remove()

    del函数 如果知道要删除元素在列表中的位置,可以使用del语句: list_1 = ['one', 'two', 'three'] print(list_1) del list_1[0] print ...

  3. 【scipy 基础】--稀疏矩阵

    稀疏矩阵是一种特殊的矩阵,其非零元素数目远远少于零元素数目,并且非零元素分布没有规律.这种矩阵在实际应用中经常出现,例如在物理学.图形学和网络通信等领域. 稀疏矩阵其实也可以和一般的矩阵一样处理,之所 ...

  4. Node02-包管理工具

    前言:代码共享 模块化的编程思想,支持将代码划分成一个个小的.独立的结构. 我们可以通过模块化的方式来封装自己的代码,将之封装成一个个工具: 我们可以让同事通过导入的方式来使用这些工具,甚至也可以将这 ...

  5. java制作游戏,如何使用libgdx,入门级别教学

    第一步,进入libgdx的官网.点击get started 进入这个页面,点击setup a project 进入这个页面直接点击,Generate a project. 点击下载,下载创建工具 它会 ...

  6. windows 电脑 连接蓝牙耳机没有麦克风

    前言 windows 电脑 连接蓝牙耳机没有麦克风,明明已经显示麦克风图标,为什么录制不到声音 原因 电脑连蓝牙耳机有两个模式:hand free和stereo.handfree是可以语音通话的,但是 ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (159)-- 算法导论12.3 6题

    六.用go语言,当 TREE-DELETE 中的结点 z 有两个孩子时,应该选择结点 y 作为它的前驱,而不是作为它的后继.如果这样做,对 TREE-DELETE 应该做些什么必要的修改?一些人提出了 ...

  8. 有一个正整数N可以分解成若干个正整数之和,问如何分解能使这些数的乘积最大?

    这可真是个有意思的问题,之前好像在刷题的时候也碰到过类似的问题 问题的解决是:我们由均值不等式可以知道,当每个数相等的时候,有乘积最大. 那么所以实际上就是将这个数均分,假如正整数N为 k,假设分成n ...

  9. eclipse工具使用

    eclipse下载 官网下载:https://www.eclipse.org/downloads/packages/ 打开后,找到Eclipse IDE for Java Developers点击进入 ...

  10. GPT-4多模态大型语言模型发布

    GPT-4 模型是OpenAI开发的第四代大型语言模型(LLM),它将是一个多模态模型,会提供完全不同的可能性-例如文字转图像.音乐甚至视频.GPT 全称为 Generative Pre-traine ...