首页 > 解决方案 > OO ALV 网格中 F4 搜索帮助的通用解决方案

问题描述

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

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

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

* 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.

但是要使用功能模块(由in 方法内部使用)获取数据元素的搜索帮助,必须包含数据元素名称并且必须是初始的。DD_SHLP_GET_HELPMETHODCL_GUI_ALV_GRIDF4TABNAMEFIELDNAME

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.

标签: abapalv

解决方案


您提供的代码示例与您提供的代码示例有关,ref 字段指定不正确,因此它不起作用。这样它就像一个魅力:

APPEND VALUE #( fieldname = 'DATE' f4availabl = abap_true ref_table = 'BKPF' ref_field = 'BUDAT' ) TO it_fc.
APPEND VALUE #( fieldname = 'TIME' f4availabl = abap_true ref_table = 'BKPF' ref_field = 'CPUTM' ) TO it_fc.
APPEND VALUE #( fieldname = 'WERKS' f4availabl = abap_true ref_table = 'BSEG' ref_field = 'WERKS') TO it_fc.

关于非 DDIC 字段的问题,当您基于任意非 DDIC 数据元素和/或任意域 ALV 声明非 DDIC 字段时,根本无法确定调用什么输入帮助。请参阅输入帮助调用层次结构

因为我没有看到你的 FM 代码,所以我不能说更明确的话。否则,请给我们更多说明性的用例。


推荐阅读