diff --git a/src/zcl_excel_rows.clas.abap b/src/zcl_excel_rows.clas.abap index c1cf0f1..5ef7600 100644 --- a/src/zcl_excel_rows.clas.abap +++ b/src/zcl_excel_rows.clas.abap @@ -3,45 +3,51 @@ *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -class ZCL_EXCEL_ROWS definition - public - final - create public . +CLASS ZCL_EXCEL_ROWS DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + *"* public components of class ZCL_EXCEL_ROWS *"* do not include other source files here!!! *"* protected components of class ZABAP_EXCEL_WORKSHEETS *"* do not include other source files here!!! -public section. + PUBLIC SECTION. + TYPES: + BEGIN OF T_ROWS, " performance improvement #527 + ROW_INDEX TYPE INT4, + ROW TYPE REF TO ZCL_EXCEL_ROW, + END OF T_ROWS. - methods ADD - importing - !IO_ROW type ref to ZCL_EXCEL_ROW . - methods CLEAR . - methods CONSTRUCTOR . - methods GET - importing - !IP_INDEX type I - returning - value(EO_ROW) type ref to ZCL_EXCEL_ROW . - methods GET_ITERATOR - returning - value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . - methods IS_EMPTY - returning - value(IS_EMPTY) type FLAG . - methods REMOVE - importing - !IO_ROW type ref to ZCL_EXCEL_ROW . - methods SIZE - returning - value(EP_SIZE) type I . + DATA: + DT_ROWS TYPE HASHED TABLE OF T_ROWS WITH UNIQUE KEY ROW_INDEX READ-ONLY. + + METHODS ADD + IMPORTING + !IO_ROW TYPE REF TO ZCL_EXCEL_ROW . + METHODS CLEAR . + METHODS CONSTRUCTOR . + METHODS GET + IMPORTING + !IP_INDEX TYPE I + RETURNING + VALUE(EO_ROW) TYPE REF TO ZCL_EXCEL_ROW . + METHODS IS_EMPTY + RETURNING + VALUE(IS_EMPTY) TYPE FLAG . + METHODS REMOVE + IMPORTING + !IO_ROW TYPE REF TO ZCL_EXCEL_ROW . + METHODS SIZE + RETURNING + VALUE(EP_SIZE) TYPE I . PROTECTED SECTION. *"* private components of class ZABAP_EXCEL_RANGES *"* do not include other source files here!!! PRIVATE SECTION. - DATA rows TYPE REF TO cl_object_collection . + DATA ROWS TYPE REF TO CL_OBJECT_COLLECTION . ENDCLASS. @@ -49,44 +55,89 @@ ENDCLASS. CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. - METHOD add. - rows->add( io_row ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->ADD +* +-------------------------------------------------------------------------------------------------+ +* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW +* +-------------------------------------------------------------------------------------- + METHOD ADD. + + DATA: + LS_ROW TYPE T_ROWS. + LS_ROW-ROW_INDEX = IO_ROW->GET_ROW_INDEX( ). + LS_ROW-ROW = IO_ROW. + INSERT LS_ROW INTO TABLE DT_ROWS. + ENDMETHOD. "ADD - METHOD clear. - rows->clear( ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->CLEAR +* +-------------------------------------------------------------------------------------------------+ +* +-------------------------------------------------------------------------------------- + METHOD CLEAR. + CLEAR DT_ROWS[]. + ENDMETHOD. "CLEAR - METHOD constructor. +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->CONSTRUCTOR +* +-------------------------------------------------------------------------------------------------+ +* +-------------------------------------------------------------------------------------- + METHOD CONSTRUCTOR. - CREATE OBJECT rows. + CREATE OBJECT ROWS. ENDMETHOD. "CONSTRUCTOR - METHOD get. - eo_row ?= rows->if_object_collection~get( ip_index ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->GET +* +-------------------------------------------------------------------------------------------------+ +* | [--->] IP_INDEX TYPE I +* | [<-()] EO_ROW TYPE REF TO ZCL_EXCEL_ROW +* +-------------------------------------------------------------------------------------- + METHOD GET. + READ TABLE DT_ROWS ASSIGNING FIELD-SYMBOL() WITH TABLE KEY ROW_INDEX = IP_INDEX. + IF SY-SUBRC = 0. + EO_ROW ?= -ROW. + ENDIF. ENDMETHOD. "GET - METHOD get_iterator. - eo_iterator ?= rows->if_object_collection~get_iterator( ). - ENDMETHOD. "GET_ITERATOR +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->IS_EMPTY +* +-------------------------------------------------------------------------------------------------+ +* | [<-()] IS_EMPTY TYPE FLAG +* +-------------------------------------------------------------------------------------- + METHOD IS_EMPTY. + DATA(LV_LINES) = LINES( DT_ROWS ). - - METHOD is_empty. - is_empty = rows->if_object_collection~is_empty( ). + IF LV_LINES = 0. + IS_EMPTY = abap_true. + ELSE. + IS_EMPTY = abap_false. + ENDIF. ENDMETHOD. "IS_EMPTY - METHOD remove. - rows->remove( io_row ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->REMOVE +* +-------------------------------------------------------------------------------------------------+ +* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW +* +-------------------------------------------------------------------------------------- + METHOD REMOVE. + DELETE DT_ROWS WHERE ROW_INDEX = IO_ROW->GET_ROW_INDEX( ). ENDMETHOD. "REMOVE - METHOD size. - ep_size = rows->if_object_collection~size( ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->SIZE +* +-------------------------------------------------------------------------------------------------+ +* | [<-()] EP_SIZE TYPE I +* +-------------------------------------------------------------------------------------- + METHOD SIZE. + EP_SIZE = LINES( DT_ROWS ).. ENDMETHOD. "SIZE ENDCLASS. diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 8a57774..21b6173 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -4098,20 +4098,14 @@ method GET_RANGES_ITERATOR. METHOD get_row. - DATA: lo_row_iterator TYPE REF TO cl_object_collection_iterator, - lo_row TYPE REF TO zcl_excel_row. +* performance improvement for issue #527 + READ TABLE ROWS->DT_ROWS ASSIGNING FIELD-SYMBOL() WITH TABLE KEY ROW_INDEX = IP_ROW. + IF SY-SUBRC = 0. + EO_ROW = -ROW. + ENDIF. - lo_row_iterator = me->get_rows_iterator( ). - WHILE lo_row_iterator->has_next( ) = abap_true. - lo_row ?= lo_row_iterator->get_next( ). - IF lo_row->get_row_index( ) = ip_row. - eo_row = lo_row. - EXIT. - ENDIF. - ENDWHILE. - - IF eo_row IS NOT BOUND. - eo_row = me->add_new_row( ip_row ). + IF EO_ROW IS NOT BOUND. + EO_ROW = ME->ADD_NEW_ROW( IP_ROW ). ENDIF. ENDMETHOD.