gpt4 book ai didi

abap - 面向对象 ALV 网格中 F4 搜索帮助的通用解决方案

转载 作者:行者123 更新时间:2023-12-04 16:02:24 25 4
gpt4 key购买 nike

我有一个易于使用的功能模块,可以为几乎任何类型的表创建 ALV 网格,尤其是没有 DDIC 类型的表。也支持编辑。

基本上它通过 RTTI 创建一个字段目录并在固定的内部 Dynpro 中实例化标准 CL_GUI_ALV_GRID 类。

问题:当列是 DDIC 结构的一部分或透明表时,F4 搜索帮助不起作用。原因是标准 ALV 会覆盖字段目录中的字段 REF_FIELD,如果它是空的。

* Excerpt from LVC_FCAT_COMPLETE_NEW in LSLVCF02
if not <ls_fcat>-ref_table is initial
and <ls_fcat>-ref_field is initial
and r_fcat_complete eq abap_false.
<ls_fcat>-ref_field = <ls_fcat>-fieldname.
endif.

但要使用函数模块 DD_SHLP_GET_HELPMETHOD 获取数据元素的搜索帮助(内部由 CL_GUI_ALV_GRID 在方法 F4 中使用) TABNAME 必须包含数据元素名称并且 FIELDNAME 必须是初始的

如果我在调试器中清除 REF_FIELD 后,一切都按预期工作。

我知道字段目录的文档包含省略 REF_FIELD 名称(如果它与 FIELDNAME 相同)的功能。但是自动化对于 DDIC 结构没有意义。

知道如何在不进行修改的情况下摆脱这种行为吗?最好不要在(未记录的)ONF4 事件处理程序中为每种类型的搜索帮助编写我自己的 F4 调用例程。

不幸的是,由于需要 Dynpro 的东西,几乎不可能提供一个有效的测试用例。但是我可以提供ABAP部分。它假定 Dynpro 500 的存在以及名为 CC_ALV 的容器控件。

" test table
TYPES: BEGIN OF t_test,
date TYPE dats,
time TYPE time,
werks TYPE werks_d,
END OF t_test.
DATA it_data TYPE STANDARD TABLE OF t_test.
APPEND VALUE #( date = '20180102' time = '123059' werks = '2020' ) TO it_data.

" field catalog
DATA it_fc TYPE lvc_t_fcat.
APPEND VALUE #( fieldname = 'DATE' f4availabl = abap_true ref_table = 'DATS' ) TO it_fc.
APPEND VALUE #( fieldname = 'TIME' f4availabl = abap_true ref_table = 'TIMS' ) TO it_fc.
APPEND VALUE #( fieldname = 'WERKS' f4availabl = abap_true ref_table = 'WERKS_D' ) TO it_fc.

" show ALV
DATA: r_alv TYPE REF TO cl_gui_alv_grid.
CREATE OBJECT r_parent
EXPORTING
container_name = 'CC_ALV'.
CREATE OBJECT r_alv
EXPORTING
i_parent = r_parent.
r_alv->set_table_for_first_display(
EXPORTING is_layout = VALUE #( edit = abap_true )
CHANGING it_fieldcatalog = it_fc
it_outtab = it_data ).
CALL SCREEN 500.

最佳答案

我找到了一个解决方案,虽然它有点难看。仍然欢迎更好的解决方案。

CLASS lcl_alv_util DEFINITION FINAL CREATE PRIVATE.
PUBLIC SECTION.
INTERFACES if_alv_rm_grid_friend.
CLASS-METHODS enable_f4_in_fcat
IMPORTING r_alv TYPE REF TO cl_gui_alv_grid.
ENDCLASS.
CLASS lcl_alv_util IMPLEMENTATION.
METHOD enable_f4_in_fcat.
DATA wa_fc TYPE lvc_s_fcat.
MODIFY r_alv->m_cl_variant->mt_fieldcatalog FROM wa_fc TRANSPORTING ref_field
WHERE tabname IS INITIAL AND ref_field IS NOT INITIAL AND ref_table IS NOT INITIAL.
ENDMETHOD.
ENDCLASS.

lcl_alv_util=>enable_f4_in_fcat 方法必须在 Dynpro 之后 set_table_for_first_display之前 被调用由 CALL SCREEN 调用。此外,您需要确保为 DDIC 结构的所有成员填充字段 TABNAME,因为这用于区分基于 DDIC 和不基于 DDIC 的结构字段。

或者,只有当您有本地线路类型时,您才可以调用 enable_f4_in_fcat。但这不会涵盖某些列是标准实现实际工作的 DDIC 结构的一部分的情况,即当本地类型通过 INCLUDE TYPE 或嵌套引用 DDIC 结构时。

事实上,如果没有提供TABNAME,我只是清除REF_FIELD。因为 REF_FIELD 仅在实际按下 F4 时才被读取,所以在 set_table_for_first_display 之后执行此操作就足够了。但是使用 if_alv_rm_grid_friend 访问私有(private)字段 m_cl_variant 的 hack 有一些不好的回味。

关于abap - 面向对象 ALV 网格中 F4 搜索帮助的通用解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50153118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com