Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Missing metadata when using cl_salv_controller_metadata=>get_lvc_fieldcatalog

rosenberg_eitan
Active Contributor
0 Kudos

Hi,

Recently I found ( at a site belong to ) a nice method cl_salv_controller_metadata=>get_lvc_fieldcatalog .

So I have done some testing.

*----------------------------------------------------------------------*

CLASS cl_test_01 DEFINITION . " Test_01 class

  PUBLIC SECTION .

    CLASS-METHODS: lvc_fcat_from_internal_table

      IMPORTING

                it_table       TYPE ANY TABLE

      RETURNING VALUE(rt_fcat) TYPE lvc_t_fcat.

    CLASS-METHODS: test_01 .

    CLASS-METHODS: test_02 .

ENDCLASS . "  class

*----------------------------------------------------------------------*

*----------------------------------------------------------------------*

CLASS cl_test_01 IMPLEMENTATION . " Test_01 class

  METHOD: lvc_fcat_from_internal_table.

    DATA: table TYPE REF TO data. "  class

    CREATE DATA table LIKE it_table.

    ASSIGN table->* TO FIELD-SYMBOL(<table>).

    TRY.

        cl_salv_table=>factory( IMPORTING

                                  r_salv_table   = DATA(salv_table)

                                CHANGING

                                  t_table        = <table>  ).

        rt_fcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(

            r_columns      = salv_table->get_columns( )      " ALV Filter

            r_aggregations = salv_table->get_aggregations( ) " ALV Aggregations

    ).

      CATCH cx_root.

    ENDTRY.

  ENDMETHOD.

*----------------------------------------------------------------------*

  METHOD: test_01 .

    TYPES: BEGIN OF tp_data .

    TYPES: matnr TYPE makt-matnr, " Material Number

           maktx TYPE makt-maktx. " Material Description (Short Text)

    TYPES: END OF tp_data .

    TYPES: tp_data_tab TYPE TABLE OF tp_data . " General Material Data

    DATA: it_data TYPE tp_data_tab .

    DATA(rt_fcat) =  cl_test_01=>lvc_fcat_from_internal_table( it_table = it_data ).

    BREAK-POINT .

  ENDMETHOD .

*----------------------------------------------------------------------*

  METHOD: test_02 .

    TYPES: tp_data_tab TYPE TABLE OF makt . " General Material Data

    DATA: it_data TYPE tp_data_tab .

    DATA(rt_fcat) =  cl_test_01=>lvc_fcat_from_internal_table( it_table = it_data ).

    BREAK-POINT .

  ENDMETHOD .

*----------------------------------------------------------------------*

ENDCLASS . "  class

*----------------------------------------------------------------------*

Comparing the results show that fields REF_FIELD and REF_TABLE are not filled when using METHOD: test_01 .

Am I missing something (I did mention the table when declaring tp_data ) ??

Regards.

Eitan.

3 REPLIES 3

ŁukaszPęgiel
Contributor
0 Kudos

Hi Eitan,

seems like standard behaviour of SALV, when you use dictionary table as type then everything seems to be fine. Let's check if we can make it work with checking the type woth RTTS and then filling proper data in ref_field, ref_table.

Cheers

Łukasz

0 Kudos

Hi Łukasz,

Looks more like another standard bug

IMHO The system must go to the table definition to get the meta data. ( we do all the rest of the data)

Regards.

Sergiu
Contributor
0 Kudos

In report from below link I replaced FORM f_fcat with cl_salv_controller_metadata=>get_lvc_fieldcatalog, added Search Help for 'CARRID' and added Save Layout variant.

Useful links:

https://sapcodes.com/2019/12/11/custom-button-select-all-deselect-all-and-filter-option-in-oops-alv-...

https://abapblog.com/articles/how-to/76-create-fieldcatalog-from-internal-table

http://www.kerum.pl/infodepot/00034

https://abapinho.com/en/2017/09/alv-grid-built-in-error-protocol/

https://blogs.sap.com/2020/03/06/set-alv-column-name-from-data-element-or-internal-table-component/

REPORT ZMANTEST.
*&———————————————————————*
*& Report ZMANTEST
*&———————————————————————*

* Useful links:
* https://sapcodes.com/2019/12/11/custom-button-select-all-deselect-all-and-filter-option-in-oops-alv-...
* https://abapblog.com/articles/how-to/76-create-fieldcatalog-from-internal-table
* http://www.kerum.pl/infodepot/00034
* https://abapinho.com/en/2017/09/alv-grid-built-in-error-protocol/
* https://blogs.sap.com/2020/03/06/set-alv-column-name-from-data-element-or-internal-table-component/

TABLES : sflight.
SELECT-OPTIONS : s_fldate FOR sflight-FLDATE.

* For ALV output
TYPES : BEGIN OF ty_sflight,
          carrid    TYPE s_carr_id,
          connid    TYPE s_conn_id,
          fldate    TYPE s_date,
          price     TYPE s_price,
          currency  TYPE s_currcode,
          planetype TYPE s_planetye,
          checkbox  TYPE char1,
        END OF ty_sflight.

DATA : gt_sflight TYPE STANDARD TABLE OF ty_sflight,
       gt_fcat    TYPE        lvc_t_fcat,
       gw_layout  TYPE        lvc_s_layo,
       gr_alv     TYPE REF TO cl_gui_alv_grid,
       gt_exclude TYPE        ui_functions.

FIELD-SYMBOLS : <fs_sflight> TYPE ty_sflight.

DATA  gv_variant          LIKE disvariant.
DATA  gv_repname          LIKE sy-repid.

INITIALIZATION.
  gv_repname = sy-repid.
  gv_variant-report = gv_repname.

START-OF-SELECTION.
* Extracting to populate ALV table
  SELECT carrid
         connid
         fldate
         price
         currency
         planetype
    FROM sflight INTO TABLE gt_sflight
  WHERE fldate IN s_fldate.
  IF sy-subrc IS INITIAL.

*   Populate Fieldcatalog and Exclude alv buttons which are not required
    PERFORM f_field_cat.

*   Calling screen 9000 to display ALV
    CALL SCREEN 9000.

  ENDIF.

*&———————————————————————*
*&      Form  F_FCAT
*&———————————————————————*
FORM f_field_cat.
  DATA lv_pos TYPE i.
  REFRESH :gt_fcat[],gt_exclude[].

  APPEND cl_gui_alv_grid=>mc_fc_loc_delete_row TO gt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_views TO gt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_loc_insert_row TO gt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_loc_append_row TO gt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_loc_paste_new_row TO gt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_loc_copy_row TO gt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_loc_copy TO gt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_loc_cut TO gt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_refresh TO gt_exclude.
  APPEND cl_gui_alv_grid=>mc_mb_paste TO gt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_loc_undo TO gt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_check TO gt_exclude.
  APPEND cl_gui_alv_grid=>MC_FC_INFO TO gt_exclude.

* get_lvc_fieldcatalog and update
data: it_table TYPE STANDARD TABLE OF ty_sflight.
data: table type ref to data.
DATA :GR_TABLE TYPE REF TO CL_SALV_TABLE.

create data table like it_table.
assign table->* to field-symbol(<table>).

try.
    cl_salv_table=>factory( importing
                              r_salv_table   = data(salv_table)
                            changing
                              t_table        = <table>  ).

        gt_fcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
        r_columns      = salv_table->get_columns( ) " ALV Filter
        r_aggregations = salv_table->get_aggregations( ) " ALV Aggregations
                                                                    ).
  catch cx_root.
endtry.

READ TABLE gt_fcat WITH KEY FIELDNAME = 'CARRID' ASSIGNING FIELD-SYMBOL(<fr>).
if sy-subrc eq 0.
   <fr>-edit     = abap_true.
   <fr>-ref_table = 'SCARR'.
   <fr>-ref_field = 'CARRID'.
endif.

READ TABLE gt_fcat WITH KEY FIELDNAME = 'CHECKBOX' ASSIGNING <fr>.
if sy-subrc eq 0.
  <fr>-coltext    = 'Select'.
  <fr>-key      = abap_true.
  <fr>-edit     = abap_true.
  <fr>-checkbox = abap_true.
endif.

ENDFORM.

*&———————————————————————*
*&      Module  STATUS_9000  OUTPUT
*&———————————————————————*
*       text
*———————————————————————-*
MODULE status_9000 OUTPUT.
  SET PF-STATUS 'MAIN9000'.
  PERFORM f_display.
ENDMODULE.

FORM f_display .

  IF gr_alv IS INITIAL.
    CREATE OBJECT gr_alv
      EXPORTING
        i_parent          = cl_gui_container=>screen0
      EXCEPTIONS
        error_cntl_create = 1
        error_cntl_init   = 2
        error_cntl_link   = 3
        error_dp_create   = 4
        OTHERS            = 5.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

    IF gr_alv IS NOT INITIAL.

* https://answers.sap.com/questions/824016/clguialvgridmcevtmodified.html
      CALL METHOD gr_alv->register_edit_event
        EXPORTING
          i_event_id = cl_gui_alv_grid=>mc_evt_modified.

      gw_layout-cwidth_opt    = abap_true.
      gw_layout-sel_mode = 'A'.

      CALL METHOD gr_alv->set_table_for_first_display
        EXPORTING
          is_variant                     = gv_variant
          i_save                        = 'A'
          is_layout                     = gw_layout
          it_toolbar_excluding          = gt_exclude
        CHANGING
          it_outtab                     = gt_sflight
          it_fieldcatalog               = gt_fcat
        EXCEPTIONS
          invalid_parameter_combination = 1
          program_error                 = 2
          too_many_lines                = 3
          OTHERS                        = 4.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

    ENDIF.
  ELSE.
    CALL METHOD gr_alv->refresh_table_display.
  ENDIF.

ENDFORM.                    "f_display

*&———————————————————————*
*&      Form  F_REFRESH_ALV
*&———————————————————————*
FORM f_refresh_alv.

  DATA : lw_stable TYPE lvc_s_stbl.

  CLEAR : lw_stable.
  lw_stable-row = abap_true.
  lw_stable-col = abap_true.

  gr_alv->refresh_table_display(
   EXPORTING
    is_stable      = lw_stable
  EXCEPTIONS
    finished       = 1
    OTHERS         = 2 ).
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    "f_refresh_alv

*&———————————————————————*
*&      Module  USER_COMMAND_9000  INPUT
*&———————————————————————*
MODULE user_command_9000 INPUT.

*   to react on oi_custom_events:
    call method cl_gui_cfw=>dispatch.

  CASE SY-UCOMM.
    WHEN 'BACK' OR 'CANCEL' OR 'EXIT' OR '&F03'.
      LEAVE TO SCREEN 0.
      PERFORM EXIT_PROGRAM.
  ENDCASE.
ENDMODULE.

*---------------------------------------------------------------------*
*       FORM EXIT_PROGRAM                                             *
*---------------------------------------------------------------------*
FORM EXIT_PROGRAM.
  CALL METHOD CL_GUI_CFW=>FLUSH.
  LEAVE PROGRAM.
ENDFORM.