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: 

Issue on Displaying Column Header Text of Dynamic Internal Table SALV

ghoshsubu
Explorer
0 Kudos

Hello,

I am having difficulty in Getting Column Header Text for Dynamic Internal Table using SALV,

I could able to Display the Field Name as Column Header Text, but NOT the Description,

Appreciate your Help,

Report z_sg_01.

TYPE-POOLS : icon, vrm, abap.
TYPES : BEGIN OF gty_ztable,
         tabname TYPE tabname,
        END OF gty_ztable.

DATA : gt_list             TYPE vrm_values,
       gwa_list            TYPE vrm_value,
       gt_ztable           TYPE TABLE OF gty_ztable,
       gwa_ztable          LIKE LINE OF gt_ztable,
       gt_values           TYPE TABLE OF dynpread,
       gwa_values          TYPE dynpread.

DATA : t100                TYPE t100,
       gv_id               TYPE vrm_id.

FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
               <dyn_wa>,
               <dyn_field>.

DATA:          dy_table    TYPE REF TO data,
               dy_line     TYPE REF TO data,
               gwa_fc      TYPE lvc_s_fcat,
               gt_fc       TYPE lvc_t_fcat.

DATA : lo_data             TYPE REF TO data.

CONSTANTS : gc_x(1)        TYPE c VALUE 'X',
            gc_arbgb       TYPE arbgb   VALUE 'ZV_MSG_FILE_PROC'.

PARAMETERS :     pr_table    TYPE dd02l-tabname AS LISTBOX VISIBLE LENGTH 30. 

AT SELECTION-SCREEN ON pr_table.
  PERFORM get_table_name.

*&---------------------------------------------------------------------*
*& Initialization
*&---------------------------------------------------------------------*
INITIALIZATION.

  CLEAR : gwa_list, gwa_ztable, gwa_fc. " gwa_tab_field.
  FREE  : gt_list, gt_ztable, gt_fc. " git_tab_field.

  SELECT tabname FROM dd02l INTO TABLE gt_ztable WHERE tabname LIKE 'Z%'.

  gv_id = 'PR_TABLE'.

  LOOP AT gt_ztable INTO gwa_ztable.
    MOVE sy-tabix TO gwa_list-key.
    CONDENSE gwa_list-key.
    gwa_list-text = gwa_ztable-tabname.
    APPEND gwa_list TO gt_list.
    CLEAR : gwa_list, gwa_ztable.
  ENDLOOP.

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id              = 'PR_TABLE'
      values          = gt_list
    EXCEPTIONS
      id_illegal_name = 1
      OTHERS          = 2.

*----------------------------------------------------------------------*
*       CLASS lcl_report DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_report DEFINITION.
  PUBLIC SECTION.
    DATA: o_alv TYPE REF TO cl_salv_table.

    METHODS:
      get_data,
      generate_output.

  PRIVATE SECTION.
    METHODS:
      set_pf_status
        CHANGING
          co_alv TYPE REF TO cl_salv_table.

    METHODS:
     set_layout
      CHANGING
        co_alv TYPE REF TO cl_salv_table.

ENDCLASS.                    "lcl_report DEFINITION


START-OF-SELECTION.
  PERFORM get_structure.
  PERFORM create_dynamic_itab.

    DATA: lo_report TYPE REF TO lcl_report.

    CREATE OBJECT lo_report.
    lo_report->get_data( ).
    lo_report->generate_output( ).
END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Form  GET_TABLE_NAME
*&---------------------------------------------------------------------*
*       Select Table Name from Search Help
*----------------------------------------------------------------------*
FORM get_table_name .
  CLEAR   : gwa_values, gt_values.
  REFRESH : gt_values.
  gwa_values-fieldname = gv_id.  " 'PR_TABLE'.
  APPEND gwa_values TO gt_values.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      dyname             = sy-cprog    " sy-repid
      dynumb             = sy-dynnr
      translate_to_upper = space    " 'X'
    TABLES
      dynpfields         = gt_values.

  READ TABLE gt_values INDEX 1 INTO gwa_values.
  IF sy-subrc = 0 AND gwa_values-fieldvalue IS NOT INITIAL.
    READ TABLE gt_list INTO gwa_list
                      WITH KEY key = gwa_values-fieldvalue.
    IF sy-subrc = 0.
      pr_table = gwa_list-text.
    ENDIF.
  ENDIF.
ENDFORM.                    " GET_TABLE_NAME
*&---------------------------------------------------------------------*
*&      Form  get_structure
*&---------------------------------------------------------------------*
FORM get_structure.
  DATA : lt_details  TYPE abap_compdescr_tab,
         lwa_details TYPE abap_compdescr.
  DATA : ref_table_des TYPE REF TO cl_abap_structdescr.

  ref_table_des ?=
      cl_abap_typedescr=>describe_by_name( pr_table ).
  lt_details[] = ref_table_des->components[].

  LOOP AT lt_details INTO lwa_details.
    CLEAR gwa_fc.
    gwa_fc-fieldname = lwa_details-name.

    CASE lwa_details-type_kind.
      WHEN 'C'.
        gwa_fc-datatype = 'CHAR'.
      WHEN 'N'.
        gwa_fc-datatype = 'NUMC'.
      WHEN 'D'.
        gwa_fc-datatype = 'DATE'.
      WHEN 'P'.
        gwa_fc-datatype = 'PACK'.
      WHEN OTHERS.
        gwa_fc-datatype = lwa_details-type_kind.
    ENDCASE.

    gwa_fc-inttype  = lwa_details-type_kind.
    gwa_fc-intlen   = lwa_details-length.
    gwa_fc-decimals = lwa_details-decimals.
    APPEND gwa_fc TO gt_fc.
    CLEAR : lwa_details.
  ENDLOOP.
ENDFORM.                    "get_structure

*&---------------------------------------------------------------------*
*&      Form  create_dynamic_itab
*&---------------------------------------------------------------------*
FORM create_dynamic_itab.
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog  = gt_fc
      i_length_in_byte = 'X'
    IMPORTING
      ep_table         = dy_table.
  ASSIGN dy_table->* TO <dyn_table>.

  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
  ASSIGN dy_line->* TO <dyn_wa>.
ENDFORM.                    "create_dynamic_itab

*----------------------------------------------------------------------*
*       CLASS lcl_report IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_report IMPLEMENTATION.
  METHOD get_data.
    SELECT *
           INTO  TABLE <dyn_table>
           FROM  (pr_table).
  ENDMETHOD.                    "get_data


  METHOD generate_output.
    DATA: lx_msg TYPE REF TO cx_salv_msg.
    TRY.
        cl_salv_table=>factory(
          IMPORTING
            r_salv_table = o_alv
          CHANGING
            t_table      =  <dyn_table> ).
      CATCH cx_salv_msg INTO lx_msg.
    ENDTRY.

    DATA: lr_functions TYPE REF TO cl_salv_functions_list.

    o_alv->get_display_settings( )->set_striped_pattern( abap_true ).
    lr_functions = o_alv->get_functions( ).
    lr_functions->set_default( abap_true ).

    DATA: lr_columns   TYPE REF TO cl_salv_columns.
    lr_columns = o_alv->get_columns( ).
    lr_columns->set_optimize( abap_true ).

    PERFORM set_column_names USING lr_columns.

    CALL METHOD set_pf_status
      CHANGING
        co_alv = o_alv.

    CALL METHOD set_layout
      CHANGING
        co_alv = o_alv.

    o_alv->display( ).

  ENDMETHOD.                    "generate_output


  METHOD set_pf_status.
    DATA: lo_functions TYPE REF TO cl_salv_functions_list.
    lo_functions = co_alv->get_functions( ).
    lo_functions->set_default( abap_true ).
  ENDMETHOD.                    "set_pf_status



  METHOD set_layout.
    DATA: lo_layout  TYPE REF TO cl_salv_layout,
          lf_variant TYPE slis_vari,
          ls_key    TYPE salv_s_layout_key.

    lo_layout = co_alv->get_layout( ).
    ls_key-report = sy-repid.

    lo_layout->set_key( ls_key ).
    lo_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).

    lf_variant = 'DEFAULT'.
    lo_layout->set_initial_layout( lf_variant ).
  ENDMETHOD.                    "set_layout
ENDCLASS.                    "lcl_report IMPLEMENTATION

*&---------------------------------------------------------------------*
*&      Form  SET_COLUMN_NAMES
*&---------------------------------------------------------------------*
*       ALV Column Text
*----------------------------------------------------------------------*
FORM set_column_names
  USING ir_columns TYPE REF TO cl_salv_columns.

  DATA: lr_column   TYPE REF TO cl_salv_column,
        lt_column   TYPE salv_t_column_ref,
        ls_column   TYPE salv_s_column_ref,
        lv_coltxt   TYPE scrtext_m.

  lt_column  = ir_columns->get( ).

  LOOP AT lt_column INTO ls_column.
    lv_coltxt = ls_column-columnname.
    REPLACE ALL OCCURRENCES OF '_' IN lv_coltxt WITH ` `.
    ls_column-r_column->set_medium_text( lv_coltxt ).  
  ENDLOOP.
ENDFORM.                    " set_column_names

1 ACCEPTED SOLUTION

Sandra_Rossi
Active Contributor

Many parts of your code are made useless by this code (all components of the table will then inherit the DDIC definition and its labels):

TRY.
    CREATE DATA dy_line TYPE TABLE OF (pr_table).
  CATCH cx_sy_create_data_error.
    RETURN. " TO DO: invalid name
ENDTRY.
ASSIGN dy_line->* TO <dyn_wa>.

NB: you should consider

  • cl_alv_table_create=>create_dynamic_table as being definitely obsolete because it's slow, it may fail, and if you have no choice its replacement code is here: https://github.com/sandraros/ZCL_ALV_TABLE_CREATE_RTTC.
  • Mixing the old "merge catalog" function modules and SALV usually makes no sense.
6 REPLIES 6

ghoshsubu
Explorer
0 Kudos

Thank you Hasan for your Quick Response, However LT_FCAT Internal Table does NOT get Populated. Hence it does NOT Return any Value in this case.

When we create the Structure(Form GET_STRUCTURE), it Populated only the Table Fields, with its Attributes. We need to get the Related Text / Description of those Fields Later On and I am Stuck there.

I cannot Pass any Fixed Value to Column Description as the Table as well as its Column are All Dynamic in Nature,

tugay_birihan
Participant
0 Kudos

You can try to use LVC_FIELDCATALOG_MERGE instead of getting salv fieldcat. You are gonna know which table has been selected during run time, cause you will select your table or your structure from selection screen. I revised code please use "reptext"

FORM set_column_names
  USING ir_columns TYPE REF TO cl_salv_columns
        o_alv TYPE REF TO cl_salv_table.

*  DATA: lr_column TYPE REF TO cl_salv_column,
*        lt_column TYPE salv_t_column_ref,
*        ls_column TYPE salv_s_column_ref,
*        lv_coltxt TYPE scrtext_m.
*
*  lt_column  = ir_columns->get( ).
*
*  LOOP AT lt_column INTO ls_column.
*    lv_coltxt = ls_column-columnname.
*    REPLACE ALL OCCURRENCES OF '_' IN lv_coltxt WITH ` `.
*    ls_column-r_column->set_medium_text( lv_coltxt ).
*  ENDLOOP.

  DATA: lt_fcat TYPE lvc_t_fcat.
  DATA: lo_aggreg   TYPE REF TO cl_salv_aggregations.
  DATA: gr_columns TYPE REF TO cl_salv_columns_table.

  gr_columns  = o_alv->get_columns( ).
*  lo_aggreg   = o_alv->get_aggregations( ).
*  lt_fcat     = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
*                                r_columns      = gr_columns
*                                r_aggregations = lo_aggreg ).


  call function 'LVC_FIELDCATALOG_MERGE'
    exporting
      i_structure_name       = pr_table
      i_client_never_display = 'X'
      i_bypassing_buffer     = 'X'
    changing
      ct_fieldcat            = lt_fcat
    exceptions
      inconsistent_interface = 1
      program_error          = 2
      others                 = 3.

  DATA column  TYPE REF TO cl_salv_column.
  LOOP AT lt_fcat INTO DATA(ls_fcat).
    TRY .
        column = gr_columns->get_column( ls_fcat-fieldname ).
        column->set_short_text( 'D. Country' ).
        column->set_medium_text( 'Dep. Country' ).
        column->set_long_text( 'Departure Country' ).
      CATCH cx_salv_not_found INTO DATA(not_found).
    ENDTRY.
  ENDLOOP.


ENDFORM.                    " set_column_names

Sandra_Rossi
Active Contributor
0 Kudos

Subroutines are obsolete 😉

Sandra_Rossi
Active Contributor

Many parts of your code are made useless by this code (all components of the table will then inherit the DDIC definition and its labels):

TRY.
    CREATE DATA dy_line TYPE TABLE OF (pr_table).
  CATCH cx_sy_create_data_error.
    RETURN. " TO DO: invalid name
ENDTRY.
ASSIGN dy_line->* TO <dyn_wa>.

NB: you should consider

  • cl_alv_table_create=>create_dynamic_table as being definitely obsolete because it's slow, it may fail, and if you have no choice its replacement code is here: https://github.com/sandraros/ZCL_ALV_TABLE_CREATE_RTTC.
  • Mixing the old "merge catalog" function modules and SALV usually makes no sense.

0 Kudos

Thank you so much Sandra,

It is Working now,

Sandra_Rossi
Active Contributor
0 Kudos

SALV already has the same logic because in grid mode it's a wrapper of CL_GUI_ALV_GRID, so that will not solve the essential problem which is that the OP builds the internal table with components which don't refer to the DDIC at all.