• OOALV总结


    1.1ALV屏幕

    1.1.1定义无CONTAINER屏幕

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

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

    2、创建容器

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

    3、创建容器实例

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

    4、排序汇总

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

    首先设置排序

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

    设置汇总

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

    5、事件注册

    1. "-----------------------------------------@斌将军--------------------------------------------
    2. FORM frm_alv_event_9001.
    3. DATA: lr_event_handler TYPE REF TO alv_event_9001.
    4. DATA: lt_f4 TYPE lvc_t_f4,
    5. ls_f4 TYPE lvc_s_f4.
    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. CALL METHOD g_grid_9001->register_edit_event "注册回车事件
    12. EXPORTING
    13. i_event_id = cl_gui_alv_grid=>mc_evt_enter.
    14. CALL METHOD g_grid_9001->register_edit_event "注册失去鼠标事件
    15. EXPORTING
    16. i_event_id = cl_gui_alv_grid=>mc_evt_modified.
    17. CALL METHOD g_grid_9001->register_f4_for_fields "注册搜索帮助事件
    18. EXPORTING
    19. it_f4 = lt_f4.
    20. IF lr_event_handler IS INITIAL.
    21. CREATE OBJECT lr_event_handler.
    22. ENDIF.
    23. SET HANDLER lr_event_handler->handle_data_changed FOR g_grid_9001. "数据改动事件
    24. SET HANDLER lr_event_handler->handle_double_click FOR g_grid_9001.
    25. SET HANDLER lr_event_handler->handle_on_f4 FOR g_grid_9001.
    26. SET HANDLER lr_event_handler->handle_hotspot_click FOR g_grid_9001 .
    27. SET HANDLER lr_event_handler->handle_toolbar FOR g_grid_9001. "工具栏事件
    28. SET HANDLER lr_event_handler->handle_user_command FOR g_grid_9001. "用户命令事件
    29. ENDFORM.
    30. "-----------------------------------------@斌将军--------------------------------------------

    6、展示ALV

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

    7、屏幕刷新

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

    1.1.2定义有CONTAINER屏幕

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

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

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

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

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

    3、创建容器

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

    4、创建容器实例

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

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

    1.2事件处理

    1.2.1定义事件类

    1、初始化事件类

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

    2、定义事件类的方法

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

    3、实现类的方法

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

    1.2.2搜索帮助事件

    1、定义响应F4的字段

    1. "-----------------------------------------@斌将军--------------------------------------------
    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. 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.
    10. "-----------------------------------------@斌将军--------------------------------------------

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

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

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

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

    4、定义字段为F4属性

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

    5、定义F4响应逻辑

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

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

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

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

    1.2.3数据改变事件

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

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

    2、数据改变事件处理

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

     3、关于数据改变的验证

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

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

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

    3.2.4工具条事件

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

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

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

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

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

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

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

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

    1.3细节处理

    1.3.1选择屏幕设置

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

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

    销售组织不设置必输

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

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

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

    1.3.2选择框

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

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

    1. "-----------------------------------------@斌将军--------------------------------------------
    2. CALL METHOD g_grid_9000->get_selected_rows
    3. IMPORTING
    4. et_index_rows = lt_row
    5. et_row_no = lt_roid.
    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.
    17. "-----------------------------------------@斌将军--------------------------------------------

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

    1.3.5没有保存布局按钮

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

     插入代码

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

    其中I_SAVE参数传值注解:

    I_SAVE = ''. 不能保存布局

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

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

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

     

    出现了保存布局按钮

  • 相关阅读:
    JSON Web Token
    翻译软件-好用的翻译软件-免费翻译软件大全
    threejs绘制多个多边形
    C++-封装unordered
    【Zookeeper专题】Zookeeper选举Leader源码解析
    Vue笔记
    This dependency was not found: vxe-table/lib/vxe-table in ./src/main.js
    Mybatis (2)
    pdf暴力解除密码,忘记pdf密码怎么找回?
    设置host
  • 原文地址:https://blog.csdn.net/BinGeneral/article/details/127069672