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

Sort issue

Former Member
0 Likes
1,153

Hi ,

I need to retrieve the maximum date from the section of records .I will give the example.

SO No - item - Ord type - Date1- Date2- Date3- Date4

101 -10 - 1- 21.05.2010 -25.05.2010 - 28.05.2010 -20.05.2010

101 -20 - 1- 22.05.2010 -26.05.2010 - 21.05.2010 -29.05.2010

101 -30 - 2- 23.05.2010 -27.05.2010 - 25.05.2010 -23.05.2010

101 -40 - 2- 24.05.2010 -28.05.2010 - 22.05.2010 -21.05.2010

From the above example, i need to get the maximúm dates based on the SO no and Ord typ.

My result should be like this

SO No - Ord type - Date1- Date2- Date3- Date4

101- 1- 22.05.2010 -26.05.2010 - 28.05.2010 -29.05.2010

101 -2- 24.05.2010 -28.05.2010 - 25.05.2010 -23.05.2010

I have used the Sort functionality of ABAP and it is not giving the correct result

The code i used

sort internal_ table by SO_No Ord type Date1 descending date2 descending date3 descending date4 descending

delete adjacent duplicate based on the SO_No and Ord_ Type

What is the problem with the code ..##

how can i implement the logic in abap if sort is not useful in this case.

Pl guide me

Regards,

Raj

1 ACCEPTED SOLUTION
Read only

former_member214857
Contributor
0 Likes
1,086

Hi Raj

You can use as sample below:

DATA:
      xdate TYPE d.


   CLEAR xdate.
  
   IF table-data1 >= xdate
      xdate = table-data1.
   ENDIF.
  
   IF table-data2 >= xdate
      xdate = table-data2.
   ENDIF.
  
   IF table-data3 >= xdate
      xdate = table-data3.
   ENDIF.
  
   IF table-data4 >= xdate
      xdate = table-data4.
   ENDIF.

And you can proceed with this logical test for each line. At the end variable xdate will contain max data for each line.

Kind regards

9 REPLIES 9
Read only

former_member214857
Contributor
0 Likes
1,087

Hi Raj

You can use as sample below:

DATA:
      xdate TYPE d.


   CLEAR xdate.
  
   IF table-data1 >= xdate
      xdate = table-data1.
   ENDIF.
  
   IF table-data2 >= xdate
      xdate = table-data2.
   ENDIF.
  
   IF table-data3 >= xdate
      xdate = table-data3.
   ENDIF.
  
   IF table-data4 >= xdate
      xdate = table-data4.
   ENDIF.

And you can proceed with this logical test for each line. At the end variable xdate will contain max data for each line.

Kind regards

Read only

0 Likes
1,086

Hi Carlos,

Thanks..

But i need to compare the 25 date fields like this ..then coding will be big...

in your example i dindnt able to get the XDATE logic.

Can You please elaborate further to control the records also in the loop .

In my case i need to control based on the sale order no order type.

101 -10 - 1- 21.05.2010 -25.05.2010 - 28.05.2010 -20.05.2010

101 -20 - 1- 22.05.2010 -26.05.2010 - 21.05.2010 -29.05.2010

101 -30 - 2- 23.05.2010 -27.05.2010 - 25.05.2010 -23.05.2010

101 -40 - 2- 24.05.2010 -28.05.2010 - 22.05.2010 -21.05.2010

Loop at lt_item into ls_item

Pl explain me the controlling mechanism ,how to compare the sale order and Order type here.

endloop.

Regards,

Raj

Read only

0 Likes
1,086

Hi

This is for sure not the perfect solution, but it can give you an idea on how to proceed (sorry, did not have more time to try using ABAP OO).

Hope it helps.


types: begin of ty_data,
         vbeln like vbak-vbeln,
         posnr like vbap-posnr,
         vbtyp like vbak-vbtyp,
         date1 like sy-datum,
         date2 like sy-datum,
         date3 like sy-datum,
         date4 like sy-datum,
       end of ty_data.

types: begin of ty_date,
         date like sy-datum,
       end of ty_date.

data: git_data type STANDARD TABLE OF ty_data,
      git_data_out TYPE STANDARD TABLE OF TY_DATA,
      git_date1 TYPE STANDARD TABLE OF ty_date,
      git_date2 TYPE STANDARD TABLE OF ty_date,
      git_date3 TYPE STANDARD TABLE OF ty_date,
      git_date4 TYPE STANDARD TABLE OF ty_date,
      gv_data type ty_data,
      gv_data_out type ty_data,
      gv_date type ty_date.

start-of-selection.
clear: git_data[],
       git_date1[],
       git_date2[],
       git_date3[],
       git_date4[],
       gv_data.

gv_data-vbeln = '101'.
gv_data-posnr = '10'.
gv_data-vbtyp = '1'.
gv_data-date1 = '20100521'.
gv_data-date2 = '20100525'.
gv_data-date3 = '20100528'.
gv_data-date4 = '20100520'.
append gv_data to git_data.

gv_data-vbeln = '101'.
gv_data-posnr = '30'.
gv_data-vbtyp = '2'.
gv_data-date1 = '20100523'.
gv_data-date2 = '20100527'.
gv_data-date3 = '20100525'.
gv_data-date4 = '20100523'.
append gv_data to git_data.

gv_data-vbeln = '101'.
gv_data-posnr = '40'.
gv_data-vbtyp = '2'.
gv_data-date1 = '20100524'.
gv_data-date2 = '20100528'.
gv_data-date3 = '20100522'.
gv_data-date4 = '20100521'.
append gv_data to git_data.

gv_data-vbeln = '101'.
gv_data-posnr = '20'.
gv_data-vbtyp = '1'.
gv_data-date1 = '20100522'.
gv_data-date2 = '20100526'.
gv_data-date3 = '20100521'.
gv_data-date4 = '20100529'.
append gv_data to git_data.

sort git_data by vbeln posnr vbtyp.

end-OF-SELECTION.

loop at git_data into gv_data.

  on change of gv_data-vbtyp.
    if not git_date1[] is initial.
      sort git_date1 descending.
      sort git_date2 descending.
      sort git_date3 descending.
      sort git_date4 descending.

      read TABLE git_date1 index 1 into gv_date.
      gv_data_out-date1 = gv_date-date.
      read TABLE git_date2 index 1 into gv_date.
      gv_data_out-date2 = gv_date-date.
      read TABLE git_date3 index 1 into gv_date.
      gv_data_out-date3 = gv_date-date.
      read TABLE git_date4 index 1 into gv_date.
      gv_data_out-date4 = gv_date-date.
      clear gv_data_out-posnr.
      append gv_data_out to git_data_out.
    endif.
    clear: git_date1[],
           git_date2[],
           git_date3[],
           git_date4[].
  endon.

  gv_data_out = gv_data.
  clear: gv_date.
  gv_date-date = gv_data-date1.
  append gv_date to git_date1.

  clear: gv_date.
  gv_date-date = gv_data-date2.
  append gv_date to git_date2.

  clear: gv_date.
  gv_date-date = gv_data-date3.
  append gv_date to git_date3.

  clear: gv_date.
  gv_date-date = gv_data-date4.
  append gv_date to git_date4.

  at last.
    if not git_date1[] is initial.
      sort git_date1 descending.
      sort git_date2 descending.
      sort git_date3 descending.
      sort git_date4 descending.

      read TABLE git_date1 index 1 into gv_date.
      gv_data_out-date1 = gv_date-date.
      read TABLE git_date2 index 1 into gv_date.
      gv_data_out-date2 = gv_date-date.
      read TABLE git_date3 index 1 into gv_date.
      gv_data_out-date3 = gv_date-date.
      read TABLE git_date4 index 1 into gv_date.
      gv_data_out-date4 = gv_date-date.
      clear gv_data_out-posnr.
      append gv_data_out to git_data_out.
    endif.
    clear: git_date1[],
           git_date2[],
           git_date3[],
           git_date4[].
  endat.

endloop.

loop at git_data_out into gv_data_out.
  write: / gv_data_out-vbeln, gv_data_out-posnr, gv_data_out-vbtyp, gv_data_out-date1,
           gv_data_out-date2, gv_data_out-date3, gv_data_out-date4.
endloop.

Read only

0 Likes
1,086

I am sorry. I am using the tag to display it as code but it does not work. I also tried

 ... 

and it did not work either

Read only

0 Likes
1,086
sort git_data by vbeln posnr vbtyp.

loop at git_data into gv_data.

  on change of gv_data-vbtyp.
    if not git_date1[] is initial.
      sort git_date1 descending.
      sort git_date2 descending.
      sort git_date3 descending.
      sort git_date4 descending.

      read TABLE git_date1 index 1 into gv_date.
      gv_data_out-date1 = gv_date-date.
      read TABLE git_date2 index 1 into gv_date.
      gv_data_out-date2 = gv_date-date.
      read TABLE git_date3 index 1 into gv_date.
      gv_data_out-date3 = gv_date-date.
      read TABLE git_date4 index 1 into gv_date.
      gv_data_out-date4 = gv_date-date.
      clear gv_data_out-posnr.
      append gv_data_out to git_data_out.
    endif.
    clear: git_date1[],
           git_date2[],
           git_date3[],
           git_date4[].
  endon.

  gv_data_out = gv_data.
  clear: gv_date.
  gv_date-date = gv_data-date1.
  append gv_date to git_date1.

  clear: gv_date.
  gv_date-date = gv_data-date2.
  append gv_date to git_date2.

  clear: gv_date.
  gv_date-date = gv_data-date3.
  append gv_date to git_date3.

  clear: gv_date.
  gv_date-date = gv_data-date4.
  append gv_date to git_date4.

  at last.
    if not git_date1[] is initial.
      sort git_date1 descending.
      sort git_date2 descending.
      sort git_date3 descending.
      sort git_date4 descending.

      read TABLE git_date1 index 1 into gv_date.
      gv_data_out-date1 = gv_date-date.
      read TABLE git_date2 index 1 into gv_date.
      gv_data_out-date2 = gv_date-date.
      read TABLE git_date3 index 1 into gv_date.
      gv_data_out-date3 = gv_date-date.
      read TABLE git_date4 index 1 into gv_date.
      gv_data_out-date4 = gv_date-date.
      clear gv_data_out-posnr.
      append gv_data_out to git_data_out.
    endif.
    clear: git_date1[],
           git_date2[],
           git_date3[],
           git_date4[].
  endat.

endloop.

loop at git_data_out into gv_data_out.
  write: / gv_data_out-vbeln, gv_data_out-posnr, gv_data_out-vbtyp, gv_data_out-date1,
           gv_data_out-date2, gv_data_out-date3, gv

_data_out-date4.

endloop.

Read only

0 Likes
1,086
types: begin of ty_data,
         vbeln like vbak-vbeln,
         posnr like vbap-posnr,
         vbtyp like vbak-vbtyp,
         date1 like sy-datum,
         date2 like sy-datum,
         date3 like sy-datum,
         date4 like sy-datum,
       end of ty_data.

types: begin of ty_date,
         date like sy-datum,
       end of ty_date.

data: git_data type STANDARD TABLE OF ty_data,
      git_data_out TYPE STANDARD TABLE OF TY_DATA,
      git_date1 TYPE STANDARD TABLE OF ty_date,
      git_date2 TYPE STANDARD TABLE OF ty_date,
      git_date3 TYPE STANDARD TABLE OF ty_date,
      git_date4 TYPE STANDARD TABLE OF ty_date,
      gv_data type ty_data,
      gv_data_out type ty_data,
      gv_date type ty_date.

start-of-selection.
clear: git_data[],
       git_date1[],
       git_date2[],
       git_date3[],
       git_date4[],
       gv_data.

gv_data-vbeln = '101'.
gv_data-posnr = '10'.
gv_data-vbtyp = '1'.
gv_data-date1 = '20100521'.
gv_data-date2 = '20100525'.
gv_data-date3 = '20100528'.
gv_data-date4 = '20100520'.
append gv_data to git_data.

gv_data-vbeln = '101'.
gv_data-posnr = '30'.
gv_data-vbtyp = '2'.
gv_data-date1 = '20100523'.
gv_data-date2 = '20100527'.
gv_data-date3 = '20100525'.
gv_data-date4 = '20100523'.
append gv_data to git_data.

gv_data-vbeln = '101'.
gv_data-posnr = '40'.
gv_data-vbtyp = '2'.
gv_data-date1 = '20100524'.
gv_data-date2 = '20100528'.
gv_data-date3 = '20100522'.
gv_data-date4 = '20100521'.
append gv_data to git_data.

gv_data-vbeln = '101'.
gv_data-posnr = '20'.
gv_data-vbtyp = '1'.
gv_data-date1 = '20100522'.
gv_data-date2 = '20100526'.
gv_data-date3 = '20100521'.
gv_data-date4 = '20100529'.
append gv_data to git_data.
Read only

0 Likes
1,086

Hi Raj

Try code below:

LOOP AT table1.
    IF x_key NE table1-key.
      
      IF NOT x_date IS INITIAL.
         WRITE: x_key, x_date.
      ENDIF.
      
      x_key  = table1-key.
      x_date = table1-date1.
    ENDIF.
    
    IF table1-date2 > x_date. x_date = table1-date2.
    IF table1-date3 > x_date. x_date = table1-date3.
    IF table1-date4 > x_date. x_date = table1-date4.
  ENDLOOP.

Kind regards

Read only

Former Member
0 Likes
1,086

Hi Raj,

LOOP AT git_data INTO gv_data.

  CLEAR v_count.

  READ TABLE git_data_out
    ASSIGNING <fl_data_out>
    WITH TABLE KEY vbeln = gv_data-vbeln
                   vbtyp = gv_data-vbtyp.
  IF sy-subrc = 0.

    DO.
      ADD 1 TO v_count.

      CONCATENATE: 'gv_data-date'       v_count INTO v_field1,
                   '<fl_data_out>-date' v_count INTO v_field2.

      UNASSIGN <fl_date1>.
      ASSIGN (v_field1) TO <fl_date1>.
      IF <fl_date1> IS NOT ASSIGNED.
        EXIT.
      ENDIF.

      UNASSIGN <fl_date2>.
      ASSIGN (v_field2) TO <fl_date2>.
      CHECK <fl_date2> IS ASSIGNED.

      IF <fl_date2> LT <fl_date1>.
        <fl_date2> = <fl_date1>.
      ENDIF.
    ENDDO.

  ELSE.
    INSERT gv_data INTO TABLE git_data_out.
  ENDIF.
ENDLOOP.

Hope this helps,

Paulo Carvalho

Read only

0 Likes
1,086

Hi ,

Thanks for all of your input.

I did it in the report and it is working well.

I am saying Thanks through points to You all

Regards,

Raj