09-18-2016 11:40 AM
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.
09-19-2016 8:30 AM
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
09-19-2016 9:26 AM
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.
03-15-2022 2:42 PM
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://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.