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

Process Internal table -Logic

Former Member
0 Likes
686

Hi,

My internal table has following data

A 10 30

A 20 50

A 00 100

B 20 40

B 10 90

I need output as

(Lowest) (Highest)

A 10 100

B 10 90

How do we do?

rgds

Praveen

1 ACCEPTED SOLUTION
Read only

naimesh_patel
Active Contributor
0 Likes
663

Try Like this:


DATA: BEGIN OF ITAB OCCURS 0,
      FLD1  TYPE CHAR20,
      NUM1  TYPE I,
      NUM2  TYPE I,
      END   OF ITAB.

*A 10 30
*A 20 50
*A 00 100
*B 20 40
*B 10 90

ITAB-FLD1 = 'A'.
ITAB-NUM1 = '10'.
ITAB-NUM2 = '30'.
APPEND ITAB.

ITAB-FLD1 = 'A'.
ITAB-NUM1 = '20'.
ITAB-NUM2 = '50'.
APPEND ITAB.

ITAB-FLD1 = 'A'.
ITAB-NUM1 = '00'.
ITAB-NUM2 = '100'.
APPEND ITAB.

ITAB-FLD1 = 'B'.
ITAB-NUM1 = '20'.
ITAB-NUM2 = '40'.
APPEND ITAB.

ITAB-FLD1 = 'B'.
ITAB-NUM1 = '10'.
ITAB-NUM2 = '90'.
APPEND ITAB.

DATA: ITAB2    LIKE ITAB OCCURS 0 WITH HEADER LINE,
      ITAB_TMP LIKE ITAB OCCURS 0 WITH HEADER LINE.

DATA: NEW_FLD TYPE C.


LOOP AT ITAB.
  AT NEW FLD1.
    NEW_FLD = 'X'.
  ENDAT.
  IF NEW_FLD = 'X'.

    ITAB_TMP[] = ITAB[].
    DELETE ITAB_TMP WHERE FLD1 <> ITAB-FLD1.
    CLEAR NEW_FLD.
    SORT ITAB_TMP BY FLD1 ASCENDING
                     NUM1 ASCENDING.
    READ TABLE ITAB_TMP INDEX 1.
    ITAB2-FLD1 = ITAB_TMP-FLD1.
    ITAB2-NUM1 = ITAB_TMP-NUM1.

    SORT ITAB_TMP BY FLD1 ASCENDING
                     NUM2 DESCENDING.
    READ TABLE ITAB_TMP INDEX 1.
    ITAB2-NUM2 = ITAB_TMP-NUM2.
    APPEND ITAB2.

  ENDIF.

ENDLOOP.

LOOP AT ITAB2.
  WRITE: / ITAB2-FLD1,
           ITAB2-NUM1,
           ITAB2-NUM2.
ENDLOOP.

Regards,

Naimesh Patel

5 REPLIES 5
Read only

naimesh_patel
Active Contributor
0 Likes
664

Try Like this:


DATA: BEGIN OF ITAB OCCURS 0,
      FLD1  TYPE CHAR20,
      NUM1  TYPE I,
      NUM2  TYPE I,
      END   OF ITAB.

*A 10 30
*A 20 50
*A 00 100
*B 20 40
*B 10 90

ITAB-FLD1 = 'A'.
ITAB-NUM1 = '10'.
ITAB-NUM2 = '30'.
APPEND ITAB.

ITAB-FLD1 = 'A'.
ITAB-NUM1 = '20'.
ITAB-NUM2 = '50'.
APPEND ITAB.

ITAB-FLD1 = 'A'.
ITAB-NUM1 = '00'.
ITAB-NUM2 = '100'.
APPEND ITAB.

ITAB-FLD1 = 'B'.
ITAB-NUM1 = '20'.
ITAB-NUM2 = '40'.
APPEND ITAB.

ITAB-FLD1 = 'B'.
ITAB-NUM1 = '10'.
ITAB-NUM2 = '90'.
APPEND ITAB.

DATA: ITAB2    LIKE ITAB OCCURS 0 WITH HEADER LINE,
      ITAB_TMP LIKE ITAB OCCURS 0 WITH HEADER LINE.

DATA: NEW_FLD TYPE C.


LOOP AT ITAB.
  AT NEW FLD1.
    NEW_FLD = 'X'.
  ENDAT.
  IF NEW_FLD = 'X'.

    ITAB_TMP[] = ITAB[].
    DELETE ITAB_TMP WHERE FLD1 <> ITAB-FLD1.
    CLEAR NEW_FLD.
    SORT ITAB_TMP BY FLD1 ASCENDING
                     NUM1 ASCENDING.
    READ TABLE ITAB_TMP INDEX 1.
    ITAB2-FLD1 = ITAB_TMP-FLD1.
    ITAB2-NUM1 = ITAB_TMP-NUM1.

    SORT ITAB_TMP BY FLD1 ASCENDING
                     NUM2 DESCENDING.
    READ TABLE ITAB_TMP INDEX 1.
    ITAB2-NUM2 = ITAB_TMP-NUM2.
    APPEND ITAB2.

  ENDIF.

ENDLOOP.

LOOP AT ITAB2.
  WRITE: / ITAB2-FLD1,
           ITAB2-NUM1,
           ITAB2-NUM2.
ENDLOOP.

Regards,

Naimesh Patel

Read only

Former Member
0 Likes
663

Check out this simple code:


*&---------------------------------------------------------------------*
*& Report  ZTEST_SDN
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ztest_sdn.
TYPES:
BEGIN OF x_tab,
  f1 TYPE c LENGTH 1,
  f2 TYPE i,
  f3 TYPE i,
END OF x_tab.
DATA:
i_tab TYPE STANDARD TABLE OF x_tab INITIAL SIZE 0,
wa_tab TYPE x_tab.

DEFINE append_data.
  wa_tab-f1 = &1.
  wa_tab-f2 = &2.
  wa_tab-f3 = &3.
  append wa_tab to i_tab.
END-OF-DEFINITION.


append_data: 'A' '10' '30',
'A' '20' '50',
'A' '00' '100',
'B' '20' '40',
'B' '10' '90'.

IF i_tab[] IS NOT INITIAL.
  SORT i_tab BY f1 ASCENDING f2 ASCENDING f3 DESCENDING.

  LOOP AT i_tab INTO wa_tab.
    WRITE:/1 'WA_TAB-F1:',wa_tab-f1,
           20 'WA_TAB-F2:',wa_tab-f2 LEFT-JUSTIFIED,
           40 'WA_TAB-F1:',wa_tab-f3 LEFT-JUSTIFIED.
  ENDLOOP.
  WRITE:/ sy-uline.

  DELETE ADJACENT DUPLICATES FROM i_tab COMPARING f1.

  LOOP AT i_tab INTO wa_tab.
    WRITE:/1 'WA_TAB-F1:',wa_tab-f1,
           20 'WA_TAB-F2:',wa_tab-f2 LEFT-JUSTIFIED,
           40 'WA_TAB-F1:',wa_tab-f3 LEFT-JUSTIFIED.
  ENDLOOP.
ENDIF.

http://abap-explorer.blogspot.com/

Read only

0 Likes
663

Gaurav,

Your code looks nice.

Could you send me without Work areas..due to my req I have already defined my tables without work areas.

rgds

Praveen

Read only

0 Likes
663

Namesh,

Program does'nt work for 3 or more records. any ideas?

<

report x.

DATA: BEGIN OF ITAB OCCURS 0,

FLD1 TYPE CHAR20,

NUM1 TYPE I,

NUM2 TYPE I,

END OF ITAB.

*A 10 30

*A 20 50

*A 00 100

*B 20 40

*B 10 90

*C 0 40

*C 10 120

ITAB-FLD1 = 'A'.

ITAB-NUM1 = '10'.

ITAB-NUM2 = '30'.

APPEND ITAB.

ITAB-FLD1 = 'A'.

ITAB-NUM1 = '20'.

ITAB-NUM2 = '50'.

APPEND ITAB.

ITAB-FLD1 = 'A'.

ITAB-NUM1 = '00'.

ITAB-NUM2 = '100'.

APPEND ITAB.

ITAB-FLD1 = 'B'.

ITAB-NUM1 = '20'.

ITAB-NUM2 = '40'.

APPEND ITAB.

ITAB-FLD1 = 'B'.

ITAB-NUM1 = '10'.

ITAB-NUM2 = '90'.

APPEND ITAB.

itab-fld1 = 'C'.

itab-num1 = '0'.

itab-num2 = '40'.

append itab.

itab-fld1 = 'C'.

itab-num1 = '10'.

itab-num2 = '120'.

append itab.

DATA: ITAB2 LIKE ITAB OCCURS 0 WITH HEADER LINE,

ITAB_TMP LIKE ITAB OCCURS 0 WITH HEADER LINE.

DATA: NEW_FLD TYPE C.

LOOP AT ITAB.

AT NEW FLD1.

NEW_FLD = 'X'.

ENDAT.

IF NEW_FLD = 'X'.

ITAB_TMP[] = ITAB[].

DELETE ITAB_TMP WHERE FLD1 = ITAB-FLD1.

CLEAR NEW_FLD.

SORT ITAB_TMP BY FLD1 ASCENDING

NUM1 ASCENDING.

READ TABLE ITAB_TMP INDEX 1.

ITAB2-FLD1 = ITAB_TMP-FLD1.

ITAB2-NUM1 = ITAB_TMP-NUM1.

SORT ITAB_TMP BY FLD1 ASCENDING

NUM2 DESCENDING.

READ TABLE ITAB_TMP INDEX 1.

ITAB2-NUM2 = ITAB_TMP-NUM2.

APPEND ITAB2.

ENDIF.

ENDLOOP.

LOOP AT ITAB2.

WRITE: / ITAB2-FLD1,

ITAB2-NUM1,

ITAB2-NUM2.

ENDLOOP. >

Read only

0 Likes
663

Gaurav,

Your code also doesn't work for 3 or more records.

<

&----


*& Report ZTEST_SDN

*&

&----


*&

*&

&----


REPORT ztest_sdn.

TYPES:

BEGIN OF x_tab,

f1 TYPE c LENGTH 1,

f2 TYPE i,

f3 TYPE i,

END OF x_tab.

DATA:

i_tab TYPE STANDARD TABLE OF x_tab INITIAL SIZE 0,

wa_tab TYPE x_tab.

DEFINE append_data.

wa_tab-f1 = &1.

wa_tab-f2 = &2.

wa_tab-f3 = &3.

append wa_tab to i_tab.

END-OF-DEFINITION.

append_data: 'A' '10' '30',

'A' '20' '50',

'A' '00' '100',

'B' '20' '40',

'B' '10' '90',

'C' '0' '40',

'C' '20' '90'.

IF i_tab[] IS NOT INITIAL.

SORT i_tab BY f1 ASCENDING f2 ASCENDING f3 DESCENDING.

LOOP AT i_tab INTO wa_tab.

WRITE:/1 'WA_TAB-F1:',wa_tab-f1,

20 'WA_TAB-F2:',wa_tab-f2 LEFT-JUSTIFIED,

40 'WA_TAB-F3:',wa_tab-f3 LEFT-JUSTIFIED.

ENDLOOP.

WRITE:/ sy-uline.

DELETE ADJACENT DUPLICATES FROM i_tab COMPARING f1.

LOOP AT i_tab INTO wa_tab.

WRITE:/1 'WA_TAB-F1:',wa_tab-f1,

20 'WA_TAB-F2:',wa_tab-f2 LEFT-JUSTIFIED,

40 'WA_TAB-F3:',wa_tab-f3 LEFT-JUSTIFIED.

ENDLOOP.

ENDIF.

>