2012 Jun 20 9:09 AM
Hi experts,
I have used LOOP multiple times to achieve the below functionality.
Data is read from a Table into an Internal table lt_hier which has HIERNAME, ROWINDEX and other columns. HIERNAME is 'PARENTH1' and ROWINDEX is sequential number. I need to populate same data in 'PARENTH1' to 'PARENTH2' and 'PARENTH3' in HIERNAME and ROWINDEX needs to be continuous sequential number. Data reference for all the above data needs to be assigned to ET_DATA.
Below ABAP code works successfully but it takes long time to complete. Can any one advice on ways to optimize performance in attached ABAP code used in a BADI.
method IF_UJD_ROUTINE~RUNROUTINE.
DATA: lo_dataref TYPE REF TO data.
FIELD-SYMBOLS: <lt_data_im> TYPE STANDARD TABLE.
FIELD-SYMBOLS: <lt_data_ex> TYPE STANDARD TABLE.
FIELD-SYMBOLS: <ls_data> TYPE ANY.
TYPES:
BEGIN OF st_hier,
ROWINDEX TYPE I,
NODENAME TYPE C LENGTH 60,
PARENT TYPE C LENGTH 30,
HIER_NAME TYPE C LENGTH 60,
ORDER TYPE I,
END OF st_hier.
DATA: lt_hier TYPE STANDARD TABLE OF st_hier,
li_hier like LINE OF lt_hier.
FIELD-SYMBOLS:
<lv_modran> TYPE ANY,
<lv_model> TYPE ANY.
DATA:
l_rowindex TYPE I,
lv_linecount(10) TYPE n,
lt_md_model TYPE TABLE OF /BIC/PZBPC_1,
ls_md_model TYPE /BIC/PZBPC_1,
lt_md_modran TYPE TABLE OF /BIC/PZBPC_2,
ls_md_modran TYPE /BIC/PZBPC_2.
SELECT * FROM /BIC/PZBPC_1 INTO TABLE lt_md_model
WHERE objvers = 'A' AND /BIC/ZBPC_2 <> ''.
CREATE DATA lo_dataref LIKE LINE OF lt_md_modran.
ASSIGN lo_dataref->* TO <ls_data>.
l_rowindex = 1.
LOOP AT lt_md_model ASSIGNING <ls_data>.
ASSIGN COMPONENT `/BIC/ZBPC_1` OF STRUCTURE <ls_data> TO <lv_model>.
ASSIGN COMPONENT `/BIC/ZBPC_2` OF STRUCTURE <ls_data> TO <lv_modran>.
IF <lv_model>+0(3) = 'PR_'.
li_hier-ROWINDEX = l_rowindex.
li_hier-NODENAME = <lv_model>.
li_hier-HIER_NAME = 'PARENTH1'.
li_hier-PARENT = <lv_modran>.
li_hier-ORDER = l_rowindex.
APPEND li_hier TO lt_hier.
l_rowindex = l_rowindex + 1.
ENDIF.
ENDLOOP.
CLEAR l_rowindex.
* Assign importing data reference to field symbol
ASSIGN ir_data->* TO <lt_data_im>.
* Create work area for importing data
CREATE DATA lo_dataref LIKE LINE OF <lt_data_im>.
ASSIGN lo_dataref->* TO <ls_data>.
REFRESH <lt_data_im>.
LOOP AT lt_hier INTO li_hier.
MOVE-CORRESPONDING li_hier TO <ls_data>.
* COLLECT <ls_data> INTO <lt_data_im>.
append <ls_data> to <lt_data_im>.
ENDLOOP.
DESCRIBE TABLE <lt_data_im> LINES lv_linecount.
LOOP AT lt_hier INTO li_hier.
lv_linecount = lv_linecount + 1.
li_hier-HIER_NAME = 'PARENTH2'.
li_hier-ROWINDEX = lv_linecount.
MOVE-CORRESPONDING li_hier TO <ls_data>.
* COLLECT <ls_data> INTO <lt_data_im>.
append <ls_data> to <lt_data_im>.
ENDLOOP.
LOOP AT lt_hier INTO li_hier.
lv_linecount = lv_linecount + 1.
li_hier-HIER_NAME = 'PARENTH3'.
li_hier-ROWINDEX = lv_linecount.
MOVE-CORRESPONDING li_hier TO <ls_data>.
* COLLECT <ls_data> INTO <lt_data_im>.
append <ls_data> to <lt_data_im>.
ENDLOOP.
DESCRIBE TABLE <lt_data_im> LINES lv_linecount.
* Create new internal table for exporting data
CREATE DATA lo_dataref LIKE TABLE OF <ls_data>.
ASSIGN lo_dataref->* TO <lt_data_ex>.
* Exporting data to exporting data references
GET REFERENCE OF <lt_data_im> INTO er_data.
ENDMETHOD.
2012 Jun 21 6:49 AM
Hi Subramani,
Well there are many ways to append the data. One of them is as follows :-
data : lv_count type i,
lv_index type sy-index.
l_rowindex = 1.
LOOP AT lt_md_model ASSIGNING <ls_data>.
ASSIGN COMPONENT `/BIC/ZBPC_1` OF STRUCTURE <ls_data> TO <lv_model>.
ASSIGN COMPONENT `/BIC/ZBPC_2` OF STRUCTURE <ls_data> TO <lv_modran>.
IF <lv_model>+0(3) = 'PR_'.
li_hier-NODENAME = <lv_model>.
li_hier-HIER_NAME = 'PARENTH1'.
li_hier-PARENT = <lv_modran>.
APPEND li_hier TO lt_hier.
li_hier-HIER_NAME = 'PARENTH2'.
APPEND li_hier TO lt_hier.
li_hier-HIER_NAME = 'PARENTH3'.
APPEND li_hier TO lt_hier.
ENDIF.
ENDLOOP.
* Assign importing data reference to field symbol
ASSIGN ir_data->* TO <lt_data_im>.
* Create work area for importing data
CREATE DATA lo_dataref LIKE LINE OF <lt_data_im>.
ASSIGN lo_dataref->* TO <ls_data>.
REFRESH <lt_data_im>.
sort lt_hier by hier_name.
clear : lv_count.
LOOP AT lt_hier INTO li_hier.
lv_index = sy-tabix.
li_hier-ROWINDEX = lv_count + 1.
li_hier-ORDER = li_hier-rowindex.
modify lt_hier from li_hier index lv_index transporting rowindex order.
MOVE-CORRESPONDING li_hier TO <ls_data>.
* COLLECT <ls_data> INTO <lt_data_im>.
append <ls_data> to <lt_data_im>.
ENDLOOP.
DESCRIBE TABLE <lt_data_im> LINES lv_linecount.
* Create new internal table for exporting data
CREATE DATA lo_dataref LIKE TABLE OF <ls_data>.
ASSIGN lo_dataref->* TO <lt_data_ex>.
* Exporting data to exporting data references
GET REFERENCE OF <lt_data_im> INTO er_data.
ENDMETHOD.
Thanks,
Best regards,
Prashant
2012 Jun 21 6:49 AM
Hi Subramani,
Well there are many ways to append the data. One of them is as follows :-
data : lv_count type i,
lv_index type sy-index.
l_rowindex = 1.
LOOP AT lt_md_model ASSIGNING <ls_data>.
ASSIGN COMPONENT `/BIC/ZBPC_1` OF STRUCTURE <ls_data> TO <lv_model>.
ASSIGN COMPONENT `/BIC/ZBPC_2` OF STRUCTURE <ls_data> TO <lv_modran>.
IF <lv_model>+0(3) = 'PR_'.
li_hier-NODENAME = <lv_model>.
li_hier-HIER_NAME = 'PARENTH1'.
li_hier-PARENT = <lv_modran>.
APPEND li_hier TO lt_hier.
li_hier-HIER_NAME = 'PARENTH2'.
APPEND li_hier TO lt_hier.
li_hier-HIER_NAME = 'PARENTH3'.
APPEND li_hier TO lt_hier.
ENDIF.
ENDLOOP.
* Assign importing data reference to field symbol
ASSIGN ir_data->* TO <lt_data_im>.
* Create work area for importing data
CREATE DATA lo_dataref LIKE LINE OF <lt_data_im>.
ASSIGN lo_dataref->* TO <ls_data>.
REFRESH <lt_data_im>.
sort lt_hier by hier_name.
clear : lv_count.
LOOP AT lt_hier INTO li_hier.
lv_index = sy-tabix.
li_hier-ROWINDEX = lv_count + 1.
li_hier-ORDER = li_hier-rowindex.
modify lt_hier from li_hier index lv_index transporting rowindex order.
MOVE-CORRESPONDING li_hier TO <ls_data>.
* COLLECT <ls_data> INTO <lt_data_im>.
append <ls_data> to <lt_data_im>.
ENDLOOP.
DESCRIBE TABLE <lt_data_im> LINES lv_linecount.
* Create new internal table for exporting data
CREATE DATA lo_dataref LIKE TABLE OF <ls_data>.
ASSIGN lo_dataref->* TO <lt_data_ex>.
* Exporting data to exporting data references
GET REFERENCE OF <lt_data_im> INTO er_data.
ENDMETHOD.
Thanks,
Best regards,
Prashant