[英]Generic solution for F4 search help in OO ALV grid
我有一个易于使用的功能模块,可以为几乎任何类型的表创建 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
(在方法F4
由CL_GUI_ALV_GRID
在内部使用)获取数据元素的搜索帮助, 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
必须在set_table_for_first_display
之后和 Dynpro 被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
访问私有字段m_cl_variant
有一些不好的回味。
关于您提供的代码示例,引用字段指定不正确,因此它不起作用。 这样它就像一个魅力:
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 代码,我不能说更明确的东西。 否则给我们更多说明性的用例。
您可以使用命令 DESCRIBE FIELD HELP-ID 来获取 ref_table 和 ref_field。 这里有一个例子。
TYPES: BEGIN OF tp_alv,
rueck TYPE afru-rueck,
rmzhl TYPE afru-rmzhl,
vornr TYPE afru-vornr,
budat TYPE afru-budat,
werks TYPE afru-werks,
ltxa1 TYPE afru-ltxa1,
END OF tp_alv.
DATA: tg_alv TYPE TABLE OF tp_alv,
tg_fcat TYPE lvc_t_fcat.
START-OF-SELECTION.
PERFORM zf_fieldcat.
*&---------------------------------------------------------------------*
*& Form ZF_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM zf_fieldcat .
DATA: ol_elemdesc TYPE REF TO cl_abap_elemdescr,
ol_stdesc TYPE REF TO cl_abap_structdescr,
tl_fields TYPE cl_abap_structdescr=>included_view,
wl_fields TYPE LINE OF cl_abap_structdescr=>included_view,
wl_alv LIKE LINE OF tg_alv,
wl_fcat LIKE LINE OF tg_fcat,
vl_hlpid TYPE string.
FIELD-SYMBOLS: <fl_field>.
*--------------------------------------------------------------------*
ol_stdesc ?= cl_abap_structdescr=>describe_by_data( wl_alv ).
tl_fields = ol_stdesc->get_included_view( ).
LOOP AT tl_fields INTO wl_fields.
CLEAR: wl_fcat.
wl_fcat-col_pos = lines( tg_fcat ) + 1.
wl_fcat-fieldname = wl_fields-name.
IF wl_fields-type->kind EQ cl_abap_typedescr=>kind_elem.
ol_elemdesc ?= wl_fields-type.
IF ol_elemdesc->is_ddic_type( ) IS NOT INITIAL.
wl_fcat-rollname = ol_elemdesc->help_id.
wl_fcat-edit_mask = ol_elemdesc->edit_mask.
ASSIGN COMPONENT wl_fcat-fieldname OF STRUCTURE wl_alv TO <fl_field>.
IF sy-subrc EQ 0.
DESCRIBE FIELD <fl_field> HELP-ID vl_hlpid.
SPLIT vl_hlpid AT '-' INTO wl_fcat-ref_table wl_fcat-ref_field.
ENDIF.
ELSE.
wl_fcat-inttype = wl_fields-type->type_kind.
wl_fcat-intlen = wl_fields-type->length.
wl_fcat-decimals = wl_fields-type->decimals.
ENDIF.
ENDIF.
APPEND wl_fcat TO tg_fcat.
ENDLOOP.
ENDFORM. " ZF_FIELDCAT
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.