Refactor headings logic in BIND_TABLE (#960)

* Refactor headings logic in BIND_TABLE

to help proposing a change for #764

Co-authored-by: sandraros <sandra.rossi@gmail.com>
Co-authored-by: Lars Hvam <larshp@hotmail.com>
Co-authored-by: Abo <andrea@borgia.bo.it>
This commit is contained in:
sandraros 2022-02-07 16:37:06 +01:00 committed by GitHub
parent c80da26920
commit 2973d66594
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 334 additions and 58 deletions

View File

@ -762,6 +762,12 @@ CLASS zcl_excel_worksheet DEFINITION
CHANGING CHANGING
cs_complete_style_border TYPE zexcel_s_cstyle_border cs_complete_style_border TYPE zexcel_s_cstyle_border
cs_complete_stylex_border TYPE zexcel_s_cstylex_border. cs_complete_stylex_border TYPE zexcel_s_cstylex_border.
METHODS normalize_column_heading_texts
IMPORTING
iv_default_descr TYPE c
it_field_catalog TYPE zexcel_t_fieldcatalog
RETURNING
VALUE(result) TYPE zexcel_t_fieldcatalog.
METHODS normalize_columnrow_parameter METHODS normalize_columnrow_parameter
IMPORTING IMPORTING
ip_columnrow TYPE csequence OPTIONAL ip_columnrow TYPE csequence OPTIONAL
@ -952,8 +958,6 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
lv_formula TYPE string, lv_formula TYPE string,
ls_settings TYPE zexcel_s_table_settings, ls_settings TYPE zexcel_s_table_settings,
lo_table TYPE REF TO zcl_excel_table, lo_table TYPE REF TO zcl_excel_table,
lt_column_name_buffer TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line,
lv_value TYPE string,
lv_value_lowercase TYPE string, lv_value_lowercase TYPE string,
lv_syindex TYPE c LENGTH 3, lv_syindex TYPE c LENGTH 3,
lo_iterator TYPE REF TO zcl_excel_collection_iterator, lo_iterator TYPE REF TO zcl_excel_collection_iterator,
@ -1022,75 +1026,26 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ). lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ).
lv_row_int = ls_settings-top_left_row. lv_row_int = ls_settings-top_left_row.
lt_field_catalog = normalize_column_heading_texts(
iv_default_descr = iv_default_descr
it_field_catalog = lt_field_catalog ).
* It is better to loop column by column (only visible column) * It is better to loop column by column (only visible column)
LOOP AT lt_field_catalog ASSIGNING <ls_field_catalog> WHERE dynpfld EQ abap_true. LOOP AT lt_field_catalog ASSIGNING <ls_field_catalog> WHERE dynpfld EQ abap_true.
lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ).
" Due restrinction of new table object we cannot have two column with the same name
" Check if a column with the same name exists, if exists add a counter
" If no medium description is provided we try to use small or long
FIELD-SYMBOLS: <scrtxt1> TYPE any,
<scrtxt2> TYPE any,
<scrtxt3> TYPE any.
CASE iv_default_descr.
WHEN 'M'.
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
WHEN 'S'.
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt1>.
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
WHEN 'L'.
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt1>.
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt3>.
WHEN OTHERS.
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
ENDCASE.
IF <scrtxt1> IS NOT INITIAL.
lv_value = <scrtxt1>.
<ls_field_catalog>-scrtext_l = lv_value.
ELSEIF <scrtxt2> IS NOT INITIAL.
lv_value = <scrtxt2>.
<ls_field_catalog>-scrtext_l = lv_value.
ELSEIF <scrtxt3> IS NOT INITIAL.
lv_value = <scrtxt3>.
<ls_field_catalog>-scrtext_l = lv_value.
ELSE.
lv_value = 'Column'. " default value as Excel does
<ls_field_catalog>-scrtext_l = lv_value.
ENDIF.
WHILE 1 = 1.
lv_value_lowercase = lv_value.
TRANSLATE lv_value_lowercase TO LOWER CASE.
READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value_lowercase BINARY SEARCH.
IF sy-subrc <> 0.
<ls_field_catalog>-scrtext_l = lv_value.
INSERT lv_value_lowercase INTO TABLE lt_column_name_buffer.
EXIT.
ELSE.
lv_syindex = sy-index.
CONCATENATE <ls_field_catalog>-scrtext_l lv_syindex INTO lv_value.
ENDIF.
ENDWHILE.
" First of all write column header " First of all write column header
IF <ls_field_catalog>-style_header IS NOT INITIAL. IF <ls_field_catalog>-style_header IS NOT INITIAL.
me->set_cell( ip_column = lv_column_alpha me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int ip_row = lv_row_int
ip_value = lv_value ip_value = <ls_field_catalog>-scrtext_l
ip_style = <ls_field_catalog>-style_header ). ip_style = <ls_field_catalog>-style_header ).
ELSE. ELSE.
me->set_cell( ip_column = lv_column_alpha me->set_cell( ip_column = lv_column_alpha
ip_row = lv_row_int ip_row = lv_row_int
ip_value = lv_value ). ip_value = <ls_field_catalog>-scrtext_l ).
ENDIF. ENDIF.
IF <ls_field_catalog>-column_formula IS NOT INITIAL. IF <ls_field_catalog>-column_formula IS NOT INITIAL.
@ -2973,6 +2928,74 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD normalize_column_heading_texts.
DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog,
lv_value_lowercase TYPE string,
lv_syindex TYPE c LENGTH 3,
lt_column_name_buffer TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line.
FIELD-SYMBOLS: <ls_field_catalog> TYPE zexcel_s_fieldcatalog,
<scrtxt1> TYPE any,
<scrtxt2> TYPE any,
<scrtxt3> TYPE any.
" Due restrinction of new table object we cannot have two column with the same name
" Check if a column with the same name exists, if exists add a counter
" If no medium description is provided we try to use small or long
lt_field_catalog = it_field_catalog.
LOOP AT lt_field_catalog ASSIGNING <ls_field_catalog> WHERE dynpfld EQ abap_true.
CASE iv_default_descr.
WHEN 'M'.
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
WHEN 'S'.
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt1>.
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
WHEN 'L'.
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt1>.
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt3>.
WHEN OTHERS.
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
ENDCASE.
IF <scrtxt1> IS NOT INITIAL.
<ls_field_catalog>-scrtext_l = <scrtxt1>.
ELSEIF <scrtxt2> IS NOT INITIAL.
<ls_field_catalog>-scrtext_l = <scrtxt2>.
ELSEIF <scrtxt3> IS NOT INITIAL.
<ls_field_catalog>-scrtext_l = <scrtxt3>.
ELSE.
<ls_field_catalog>-scrtext_l = 'Column'. " default value as Excel does
ENDIF.
DO.
lv_value_lowercase = <ls_field_catalog>-scrtext_l.
TRANSLATE lv_value_lowercase TO LOWER CASE.
READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value_lowercase BINARY SEARCH.
IF sy-subrc <> 0.
INSERT lv_value_lowercase INTO TABLE lt_column_name_buffer.
EXIT.
ELSE.
lv_syindex = sy-index.
CONCATENATE <ls_field_catalog>-scrtext_l lv_syindex INTO <ls_field_catalog>-scrtext_l.
ENDIF.
ENDDO.
ENDLOOP.
result = lt_field_catalog.
ENDMETHOD.
METHOD normalize_columnrow_parameter. METHOD normalize_columnrow_parameter.
IF ( ( ip_column IS NOT INITIAL OR ip_row IS NOT INITIAL ) AND ip_columnrow IS NOT INITIAL ) IF ( ( ip_column IS NOT INITIAL OR ip_row IS NOT INITIAL ) AND ip_columnrow IS NOT INITIAL )

View File

@ -1,3 +1,4 @@
CLASS ltc_normalize_column_heading DEFINITION DEFERRED.
CLASS ltc_normalize_columnrow_param DEFINITION DEFERRED. CLASS ltc_normalize_columnrow_param DEFINITION DEFERRED.
CLASS ltc_normalize_range_param DEFINITION DEFERRED. CLASS ltc_normalize_range_param DEFINITION DEFERRED.
CLASS ltc_calculate_table_bottom_rig DEFINITION DEFERRED. CLASS ltc_calculate_table_bottom_rig DEFINITION DEFERRED.
@ -6,6 +7,7 @@ CLASS ltc_check_cell_column_formula DEFINITION DEFERRED.
CLASS ltc_check_overlapping DEFINITION DEFERRED. CLASS ltc_check_overlapping DEFINITION DEFERRED.
CLASS ltc_set_cell_value_types DEFINITION DEFERRED. CLASS ltc_set_cell_value_types DEFINITION DEFERRED.
CLASS zcl_excel_worksheet DEFINITION LOCAL FRIENDS CLASS zcl_excel_worksheet DEFINITION LOCAL FRIENDS
ltc_normalize_column_heading
ltc_normalize_columnrow_param ltc_normalize_columnrow_param
ltc_normalize_range_param ltc_normalize_range_param
ltc_calculate_table_bottom_rig ltc_calculate_table_bottom_rig
@ -122,6 +124,41 @@ CLASS ltc_check_overlapping DEFINITION FOR TESTING
ENDCLASS. ENDCLASS.
CLASS ltc_normalize_column_heading DEFINITION FOR TESTING
RISK LEVEL HARMLESS
DURATION SHORT.
PRIVATE SECTION.
TYPES : BEGIN OF ty_parameters,
BEGIN OF input,
default_descr TYPE c LENGTH 1,
field_catalog TYPE zexcel_t_fieldcatalog,
END OF input,
BEGIN OF output,
field_catalog TYPE zexcel_t_fieldcatalog,
END OF output,
END OF ty_parameters.
DATA:
cut TYPE REF TO zcl_excel_worksheet. "class under test
METHODS setup.
METHODS:
prefer_small_text FOR TESTING RAISING cx_static_check,
prefer_medium_text FOR TESTING RAISING cx_static_check,
prefer_long_text FOR TESTING RAISING cx_static_check,
default_text_if_none FOR TESTING RAISING cx_static_check,
invalid_default_descr FOR TESTING RAISING cx_static_check.
METHODS assert
IMPORTING
input TYPE ty_parameters-input
exp TYPE ty_parameters-output
RAISING
cx_static_check.
ENDCLASS.
CLASS ltc_normalize_columnrow_param DEFINITION FOR TESTING CLASS ltc_normalize_columnrow_param DEFINITION FOR TESTING
RISK LEVEL HARMLESS RISK LEVEL HARMLESS
DURATION SHORT. DURATION SHORT.
@ -973,6 +1010,222 @@ CLASS ltc_check_overlapping IMPLEMENTATION.
ENDCLASS. ENDCLASS.
CLASS ltc_normalize_column_heading IMPLEMENTATION.
METHOD setup.
DATA: lo_excel TYPE REF TO zcl_excel.
CREATE OBJECT lo_excel.
TRY.
CREATE OBJECT cut
EXPORTING
ip_excel = lo_excel.
CATCH zcx_excel.
cl_abap_unit_assert=>fail( 'Could not create instance' ).
ENDTRY.
ENDMETHOD.
METHOD prefer_small_text.
DATA: input TYPE ty_parameters-input,
exp TYPE ty_parameters-output,
field TYPE zexcel_s_fieldcatalog.
input-default_descr = 'S'.
field-dynpfld = abap_true.
field-scrtext_s = 'Column1_S'.
field-scrtext_m = 'Column1_M'.
field-scrtext_l = 'Column1_L'.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column1_S'.
APPEND field TO exp-field_catalog.
field-scrtext_s = ''.
field-scrtext_m = 'Column2_M'.
field-scrtext_l = 'Column2_L'.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column2_M'.
APPEND field TO exp-field_catalog.
field-scrtext_s = ''.
field-scrtext_m = 'Column3_M'.
field-scrtext_l = ''.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column3_M'.
APPEND field TO exp-field_catalog.
field-scrtext_s = ''.
field-scrtext_m = ''.
field-scrtext_l = 'Column4_L'.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column4_L'.
APPEND field TO exp-field_catalog.
assert( input = input exp = exp ).
ENDMETHOD.
METHOD prefer_medium_text.
DATA: input TYPE ty_parameters-input,
exp TYPE ty_parameters-output,
field TYPE zexcel_s_fieldcatalog.
input-default_descr = 'M'.
field-dynpfld = abap_true.
field-scrtext_s = 'Column1_S'.
field-scrtext_m = 'Column1_M'.
field-scrtext_l = 'Column1_L'.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column1_M'.
APPEND field TO exp-field_catalog.
field-scrtext_s = 'Column2_S'.
field-scrtext_m = ''.
field-scrtext_l = 'Column2_L'.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column2_S'.
APPEND field TO exp-field_catalog.
field-scrtext_s = 'Column3_S'.
field-scrtext_m = ''.
field-scrtext_l = ''.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column3_S'.
APPEND field TO exp-field_catalog.
field-scrtext_s = ''.
field-scrtext_m = ''.
field-scrtext_l = 'Column4_L'.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column4_L'.
APPEND field TO exp-field_catalog.
assert( input = input exp = exp ).
ENDMETHOD.
METHOD prefer_long_text.
DATA: input TYPE ty_parameters-input,
exp TYPE ty_parameters-output,
field TYPE zexcel_s_fieldcatalog.
input-default_descr = 'L'.
field-dynpfld = abap_true.
field-scrtext_s = 'Column1_S'.
field-scrtext_m = 'Column1_M'.
field-scrtext_l = 'Column1_L'.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column1_L'.
APPEND field TO exp-field_catalog.
field-scrtext_s = 'Column2_S'.
field-scrtext_m = 'Column2_M'.
field-scrtext_l = ''.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column2_M'.
APPEND field TO exp-field_catalog.
field-scrtext_s = 'Column3_S'.
field-scrtext_m = ''.
field-scrtext_l = ''.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column3_S'.
APPEND field TO exp-field_catalog.
assert( input = input exp = exp ).
ENDMETHOD.
METHOD default_text_if_none.
DATA: input TYPE ty_parameters-input,
exp TYPE ty_parameters-output,
field TYPE zexcel_s_fieldcatalog.
input-default_descr = 'S'.
field-dynpfld = abap_true.
field-scrtext_s = ''.
field-scrtext_m = ''.
field-scrtext_l = ''.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column'.
APPEND field TO exp-field_catalog.
field-scrtext_s = ''.
field-scrtext_m = ''.
field-scrtext_l = ''.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column 1'.
APPEND field TO exp-field_catalog.
assert( input = input exp = exp ).
ENDMETHOD.
METHOD invalid_default_descr.
DATA: input TYPE ty_parameters-input,
exp TYPE ty_parameters-output,
field TYPE zexcel_s_fieldcatalog.
input-default_descr = '?'.
field-dynpfld = abap_true.
field-scrtext_s = 'Column1_S'.
field-scrtext_m = 'Column1_M'.
field-scrtext_l = 'Column1_L'.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column1_M'.
APPEND field TO exp-field_catalog.
field-scrtext_s = 'Column2_S'.
field-scrtext_m = ''.
field-scrtext_l = 'Column2_L'.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column2_S'.
APPEND field TO exp-field_catalog.
field-scrtext_s = 'Column3_S'.
field-scrtext_m = ''.
field-scrtext_l = ''.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column3_S'.
APPEND field TO exp-field_catalog.
field-scrtext_s = ''.
field-scrtext_m = ''.
field-scrtext_l = 'Column4_L'.
APPEND field TO input-field_catalog.
field-scrtext_l = 'Column4_L'.
APPEND field TO exp-field_catalog.
assert( input = input exp = exp ).
ENDMETHOD.
METHOD assert.
DATA: act TYPE ty_parameters-output.
act-field_catalog = cut->normalize_column_heading_texts(
iv_default_descr = input-default_descr
it_field_catalog = input-field_catalog ).
cl_abap_unit_assert=>assert_equals( exp = exp-field_catalog act = act-field_catalog ).
ENDMETHOD.
ENDCLASS.
CLASS ltc_normalize_columnrow_param IMPLEMENTATION. CLASS ltc_normalize_columnrow_param IMPLEMENTATION.
METHOD setup. METHOD setup.