Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Replacement for Internal Table Loop multiple times

Former Member
0 Likes
1,196

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.

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
626

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

1 REPLY 1
Read only

Former Member
0 Likes
627

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