簡體   English   中英

面向對象 ALV 網格中 F4 搜索幫助的通用解決方案

[英]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 (在方法F4CL_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM