mirror of
https://github.com/abap2xlsx/abap2xlsx.git
synced 2025-05-05 11:06:15 +08:00
Merge 5238d9a9fe
into 08c794f3ca
This commit is contained in:
commit
2903a60710
|
@ -387,59 +387,77 @@ CLASS zcl_excel_converter_alv IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
METHOD get_filter.
|
METHOD get_filter.
|
||||||
DATA: ls_filt TYPE lvc_s_filt,
|
TYPES: BEGIN OF ts_field_range,
|
||||||
l_line TYPE i,
|
fieldname TYPE fieldname,
|
||||||
ls_filter TYPE zexcel_s_converter_fil.
|
range_tab TYPE REF TO data,
|
||||||
DATA: lo_addit TYPE REF TO cl_abap_elemdescr,
|
END OF ts_field_range.
|
||||||
|
|
||||||
|
DATA: ls_filt LIKE LINE OF wt_filt,
|
||||||
|
ls_filter TYPE zexcel_s_converter_fil,
|
||||||
|
lo_addit TYPE REF TO cl_abap_elemdescr,
|
||||||
lt_components_tab TYPE cl_abap_structdescr=>component_table,
|
lt_components_tab TYPE cl_abap_structdescr=>component_table,
|
||||||
ls_components TYPE abap_componentdescr,
|
ls_components TYPE abap_componentdescr,
|
||||||
lo_table TYPE REF TO cl_abap_tabledescr,
|
lo_table TYPE REF TO cl_abap_tabledescr,
|
||||||
lo_struc TYPE REF TO cl_abap_structdescr,
|
lo_struc TYPE REF TO cl_abap_structdescr,
|
||||||
lo_trange TYPE REF TO data,
|
lt_field_range TYPE TABLE OF ts_field_range,
|
||||||
lo_srange TYPE REF TO data,
|
ls_field_range LIKE LINE OF lt_field_range,
|
||||||
lo_ltabdata TYPE REF TO data.
|
lv_fieldname TYPE fieldname.
|
||||||
|
|
||||||
FIELD-SYMBOLS: <fs_tab> TYPE STANDARD TABLE,
|
FIELD-SYMBOLS: <fs_tab> TYPE STANDARD TABLE,
|
||||||
<fs_ltab> TYPE STANDARD TABLE,
|
|
||||||
<fs_stab> TYPE any,
|
<fs_stab> TYPE any,
|
||||||
<fs> TYPE any,
|
<fs> TYPE any,
|
||||||
<fs1> TYPE any,
|
|
||||||
<fs_srange> TYPE any,
|
<fs_srange> TYPE any,
|
||||||
<fs_trange> TYPE STANDARD TABLE.
|
<fs_trange> TYPE STANDARD TABLE,
|
||||||
|
<fs_field_range> LIKE LINE OF lt_field_range.
|
||||||
|
|
||||||
IF ws_option-filter = abap_false.
|
|
||||||
CLEAR et_filter.
|
CLEAR et_filter.
|
||||||
|
IF wt_filt IS INITIAL OR
|
||||||
|
ws_option-filter = abap_false.
|
||||||
RETURN.
|
RETURN.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
ASSIGN xo_table->* TO <fs_tab>.
|
ASSIGN xo_table->* TO <fs_tab>.
|
||||||
|
READ TABLE <fs_tab> ASSIGNING <fs_stab> INDEX 1.
|
||||||
|
IF sy-subrc <> 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
CREATE DATA lo_ltabdata LIKE <fs_tab>.
|
SORT wt_filt BY fieldname.
|
||||||
ASSIGN lo_ltabdata->* TO <fs_ltab>.
|
|
||||||
|
|
||||||
|
* Range creation and range comparison must be done in two steps:
|
||||||
|
* This is due to the fact, that range values might be applied
|
||||||
|
* all together at once not value after value for a specific fieldname
|
||||||
|
* --> Having multiple excluding values is a problem that would otherwise
|
||||||
|
* occur...
|
||||||
|
|
||||||
|
* 1. Step: Create the combined ranges for each fieldname...
|
||||||
LOOP AT wt_filt INTO ls_filt.
|
LOOP AT wt_filt INTO ls_filt.
|
||||||
LOOP AT <fs_tab> ASSIGNING <fs_stab>.
|
IF ls_filt-fieldname <> lv_fieldname.
|
||||||
l_line = sy-tabix.
|
lv_fieldname = ls_filt-fieldname.
|
||||||
|
UNASSIGN <fs_trange>.
|
||||||
ASSIGN COMPONENT ls_filt-fieldname OF STRUCTURE <fs_stab> TO <fs>.
|
ASSIGN COMPONENT ls_filt-fieldname OF STRUCTURE <fs_stab> TO <fs>.
|
||||||
IF sy-subrc = 0.
|
CHECK sy-subrc = 0.
|
||||||
IF l_line = 1.
|
|
||||||
CLEAR lt_components_tab.
|
IF lt_components_tab IS INITIAL.
|
||||||
ls_components-name = 'SIGN'.
|
ls_components-name = 'SIGN'.
|
||||||
lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-sign ).
|
lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-sign ).
|
||||||
ls_components-type = lo_addit .
|
ls_components-type = lo_addit.
|
||||||
INSERT ls_components INTO TABLE lt_components_tab.
|
APPEND ls_components TO lt_components_tab.
|
||||||
ls_components-name = 'OPTION'.
|
ls_components-name = 'OPTION'.
|
||||||
lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-option ).
|
lo_addit ?= cl_abap_typedescr=>describe_by_data( ls_filt-option ).
|
||||||
ls_components-type = lo_addit .
|
ls_components-type = lo_addit.
|
||||||
INSERT ls_components INTO TABLE lt_components_tab.
|
APPEND ls_components TO lt_components_tab.
|
||||||
|
ELSE.
|
||||||
|
DELETE lt_components_tab FROM 3.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
lo_addit ?= cl_abap_typedescr=>describe_by_data( <fs> ).
|
||||||
|
ls_components-type = lo_addit.
|
||||||
|
|
||||||
ls_components-name = 'LOW'.
|
ls_components-name = 'LOW'.
|
||||||
lo_addit ?= cl_abap_typedescr=>describe_by_data( <fs> ).
|
APPEND ls_components TO lt_components_tab.
|
||||||
ls_components-type = lo_addit .
|
|
||||||
INSERT ls_components INTO TABLE lt_components_tab.
|
|
||||||
ls_components-name = 'HIGH'.
|
ls_components-name = 'HIGH'.
|
||||||
lo_addit ?= cl_abap_typedescr=>describe_by_data( <fs> ).
|
APPEND ls_components TO lt_components_tab.
|
||||||
ls_components-type = lo_addit .
|
|
||||||
INSERT ls_components INTO TABLE lt_components_tab.
|
|
||||||
"create new line type
|
"create new line type
|
||||||
TRY.
|
TRY.
|
||||||
lo_struc = cl_abap_structdescr=>create( p_components = lt_components_tab
|
lo_struc = cl_abap_structdescr=>create( p_components = lt_components_tab
|
||||||
|
@ -449,37 +467,46 @@ CLASS zcl_excel_converter_alv IMPLEMENTATION.
|
||||||
ENDTRY.
|
ENDTRY.
|
||||||
lo_table = cl_abap_tabledescr=>create( lo_struc ).
|
lo_table = cl_abap_tabledescr=>create( lo_struc ).
|
||||||
|
|
||||||
CREATE DATA lo_trange TYPE HANDLE lo_table.
|
ls_field_range-fieldname = ls_filt-fieldname.
|
||||||
CREATE DATA lo_srange TYPE HANDLE lo_struc.
|
CREATE DATA ls_field_range-range_tab TYPE HANDLE lo_table.
|
||||||
|
APPEND ls_field_range TO lt_field_range.
|
||||||
|
|
||||||
ASSIGN lo_trange->* TO <fs_trange>.
|
ASSIGN ls_field_range-range_tab->* TO <fs_trange>.
|
||||||
ASSIGN lo_srange->* TO <fs_srange>.
|
ELSE.
|
||||||
|
CHECK <fs_trange> IS ASSIGNED.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
CLEAR <fs_trange>.
|
|
||||||
ASSIGN COMPONENT 'SIGN' OF STRUCTURE <fs_srange> TO <fs1>.
|
APPEND INITIAL LINE TO <fs_trange> ASSIGNING <fs_srange>.
|
||||||
<fs1> = ls_filt-sign.
|
ASSIGN COMPONENT 'SIGN' OF STRUCTURE <fs_srange> TO <fs>.
|
||||||
ASSIGN COMPONENT 'OPTION' OF STRUCTURE <fs_srange> TO <fs1>.
|
<fs> = ls_filt-sign.
|
||||||
<fs1> = ls_filt-option.
|
ASSIGN COMPONENT 'OPTION' OF STRUCTURE <fs_srange> TO <fs>.
|
||||||
ASSIGN COMPONENT 'LOW' OF STRUCTURE <fs_srange> TO <fs1>.
|
<fs> = ls_filt-option.
|
||||||
<fs1> = ls_filt-low.
|
ASSIGN COMPONENT 'LOW' OF STRUCTURE <fs_srange> TO <fs>.
|
||||||
ASSIGN COMPONENT 'HIGH' OF STRUCTURE <fs_srange> TO <fs1>.
|
<fs> = ls_filt-low.
|
||||||
<fs1> = ls_filt-high.
|
ASSIGN COMPONENT 'HIGH' OF STRUCTURE <fs_srange> TO <fs>.
|
||||||
INSERT <fs_srange> INTO TABLE <fs_trange>.
|
<fs> = ls_filt-high.
|
||||||
|
ENDLOOP.
|
||||||
|
|
||||||
|
IF lt_field_range IS INITIAL.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
* 2. Step: Now apply the fieldname ranges afterwards...
|
||||||
|
LOOP AT <fs_tab> ASSIGNING <fs_stab>.
|
||||||
|
ls_filter-rownumber = sy-tabix.
|
||||||
|
LOOP AT lt_field_range ASSIGNING <fs_field_range>.
|
||||||
|
ASSIGN COMPONENT <fs_field_range>-fieldname OF STRUCTURE <fs_stab> TO <fs>.
|
||||||
|
ASSIGN <fs_field_range>-range_tab->* TO <fs_trange>.
|
||||||
IF <fs> IN <fs_trange>.
|
IF <fs> IN <fs_trange>.
|
||||||
IF ws_option-filter = abap_true.
|
IF ws_option-filter = abap_true.
|
||||||
ls_filter-rownumber = l_line.
|
ls_filter-columnname = <fs_field_range>-fieldname.
|
||||||
ls_filter-columnname = ls_filt-fieldname.
|
|
||||||
INSERT ls_filter INTO TABLE et_filter.
|
INSERT ls_filter INTO TABLE et_filter.
|
||||||
ELSE.
|
|
||||||
INSERT <fs_stab> INTO TABLE <fs_ltab>.
|
|
||||||
ENDIF.
|
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
ELSEIF ws_option-filter = abap_undefined.
|
||||||
|
DELETE <fs_tab>.
|
||||||
|
EXIT. "--> next xo_table line
|
||||||
ENDIF.
|
ENDIF.
|
||||||
ENDLOOP.
|
ENDLOOP.
|
||||||
IF ws_option-filter = abap_undefined.
|
|
||||||
<fs_tab> = <fs_ltab>.
|
|
||||||
CLEAR <fs_ltab>.
|
|
||||||
ENDIF.
|
|
||||||
ENDLOOP.
|
ENDLOOP.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user