Application Development 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: 

Item Level Total

Former Member
0 Kudos

Hi guys,

want the summation at the item level with out using the AT end of controls statements inside my internal table.

I have writen code for the same below. Could any one give inputs to modify my code to get the summation for each item of an SO.

Example:-

(VBELN) (POSNR) ZDMENGE

100 10 100

100 10 400

100 20 600

100 30 50

100 30 150

200 10 400

200 20 300

200 20 200

Result must be as below(summation per item):

VBELN POSNR ZDMENGE

100 10 500

100 20 600

100 30 200

200 10 400

200 20 500

My current code:-

TYPES : BEGIN OF wa1_zmmt0006 ,

vbeln TYPE zmmt0006-vbeln,

posnr TYPE zmmt0006-posnr ,

zdmenge TYPE zmmt0006-menge ,

END OF wa1_zmmt0006 .

DATA : wa2_zmmt0006 TYPE wa1_zmmt0006 ,

wa_zmmt0006 TYPE wa1_zmmt0006 ,

it2_zmmt0006 TYPE wa1_zmmt0006 ,

it_zmmt0006 TYPE wa1_zmmt0006 .

SELECT vbeln posnr menge

FROM zmmt0006

INTO TABLE it2_zmmt0006

FOR ALL ENTRIES IN it_c_t_data

WHERE vbeln = it_c_t_data-vbeln

AND posnr = it_c_t_data-posnr

AND status = u2018 u2018 .

LOOP AT it2_zmmt0006 INTO wa2_ zmmt0006 .

wa_zmmt0006-posnr = wa2_zmmt0006-posnr .

wa_zmmt0006-zdmenge = wa2_zmmt0006-zdmenge .

wa_zmmt0006-zstatus = wa2_zmmt0006-zstatus .

Collect wa_zmmt0006 into it_zmmt0006 .

Endloop .

SORT it_zvitr_item_im BY vbeln ASCENDING posnr ASCENDING menge DESCENDING .

Regards,

Sonam

Edited by: sonamrata on Apr 14, 2010 4:33 PM

1 ACCEPTED SOLUTION

Former Member
0 Kudos

Hi Sonam,

Here you can try this aswell.

TABLES: zmmt0006 .

DATA : it_c_t_data TYPE TABLE OF mc11va0itm .

TYPES : BEGIN OF wa1_zmmt0006 ,

vbeln TYPE zmmt0006-vbeln,

posnr TYPE zmmt0006-posnr ,

zdmenge TYPE zmmt0006-menge ,

END OF wa1_zmmt0006 .

FIELD-SYMBOLS : <wa_ zmmt0006> TYPE wa1_zmmt0006 .

DATA : it_zmmt0006 TYPE wa1_zmmt0006 ,

DATA : l_vbeln2 TYPE zmmt0006-vbeln ,

l_posnr2 TYPE zmmt0006-posnr ,

l_zdmenge TYPE zmmt0006-menge VALUE 0.

it_c_t_data[] = c_t_data[].

IF NOT it_c_t_data[] IS INITIAL.

SORT it_c_t_data BY vbeln posnr.

SELECT vbeln posnr menge

FROM zmmt0006

INTO TABLE it_zmmt0006

FOR ALL ENTRIES IN it_c_t_data

WHERE vbeln = it_c_t_data-vbeln

AND posnr = it_c_t_data-posnr

AND status = u2018 u2018 .

IF sy-subrc EQ 0.

SORT it_zmmt0006 BY vbeln posnr.

ENDIF.

ENDIF.

LOOP AT it_zmmt0006 ASSIGNING <wa_zmmt0006>.

IF l_vbeln2 NE <wa_zmmt0006>-vbeln OR l_posnr2 NE

<wa_zmmt0006>-posnr.

l_zdmenge = 0.

ENDIF.

l_vbeln2 = <wa_zmmt0006>-vbeln.

l_posnr2 = <wa_zmmt0006>-posnr.

l_zdmenge = l_zdmenge + <wa_zmmt0006>-zdmenge .

<wa_zmmt0006>-vbeln = l_vbeln2.

<wa_zmmt0006>-posnr = l_posnr2.

<wa_zmmt0006>-zdmenge = l_zdmenge.

ENDLOOP.

SORT it_zmmt0006 BY vbeln ASCENDING posnr ASCENDING zdmenge

DESCENDING.

DELETE ADJACENT DUPLICATES FROM it_zmmt0006 COMPARING vbeln posnr.

LOOP AT it_zmmt0006 ASSIGNING <wa_zmmt0006>.

WRITE 😕 <wa_zmmt0006>-vbeln , <wa_zmmt0006>-posnr , <wa_zmmt0006>-zdmenge.

ENDLOOP.

Best regards,

Selina

8 REPLIES 8

Former Member
0 Kudos

Hi Sonam,

why dont you use on change of ?


data:w_sum type i,
zmmt0006_1 like zmmt0006.
 LOOP AT it2_zmmt0006 INTO wa2_ zmmt0006 .
   on change of zmmt0006-vbeln.
      if sy-tabix ne 1.
        zmmt0006_1-zdmenge = w-sum.
        append zmmt0006_1 to it1_zmmt0006.
        clear w_sum.
      endif.
   endon.
   zmmt0006_1-vbeln =  wa2_zmmt0006-vbeln.
   zmmt0006_1-posnr =  wa2_zmmt0006-posnr.
   w_sum = w_sum + wa2_zmmt0006-zdmenge.
 endloop.
wa2_zmmt0006-zdmenge = w_sum.
append wa2_zmmt0006 to it1_zmmt0006.

because if there are any other fields rather than character type it is not desirable to use collect statement because it will also adds all other than character variables and as per performance issue append is prefered than COLLECT.

if you dont want to use on change of

replace this code,


read table it2_zmmt0006index 1  INTO zmmt0006_1.
loop at it2_zmmt0006 INTO wa2_ zmmt0006 .
if  zmmt0006_1-ebeln = wa2_ zmmt0006-ebeln.
w_sum = w_sum + wa2_zmmt0006-zdmenge. 
else.
 zmmt0006_1-zdmenge = w_sum.
 append zmmt0006_1 to it1_zmmt0006.
clear w_sum.
endif.
endloop.

I think this is helpful for you.

Regards,

Raghava Channooru.

0 Kudos

Hi Ragav,

Can we do with out on change of command? could you modify with out using this.

I want the total of menge per item , not per sales order. For one sales order there might be

multiple entries for item 10, or 20 or 30.... with menge.we have to sumup the menge for all this multiple 10 items or 20items ...,,,and display as salesorder1, tiem10 and menge(total of menges for all 10 items of the salesorder1). salesorder 1 ,item20, menge(total of menges for all 20 items of the salesorder1).for the next sales order2 the same way...salesorder2, tiem10 and menge(total of menges for all 10 items of the salesorder2). salesorder 2 ,item20, menge(total of menges for all 20 items of the salesorder2).

Hope I am not confusing.any inputs are helpfull.

Thank you,

Selina

Former Member
0 Kudos

Hi Sonam,

Change The Following to table types.

 
it2_zmmt0006 TYPE wa1_zmmt0006 ,
it_zmmt0006 TYPE wa1_zmmt0006 .  

Former Member
0 Kudos

You can also try using the SUM and GROUP BY statement

SELECT vbeln posnr SUM ( menge )

FROM zmmt0006

INTO TABLE it2_zmmt0006

FOR ALL ENTRIES IN it_c_t_data

WHERE vbeln = it_c_t_data-vbeln

AND posnr = it_c_t_data-posnr

AND status = u2018 u2018

GROUP BY vbeln posnr

This would give you totals by document and line number.

0 Kudos

Hi New comer ,

I tried as per ur idea...I got the error as ...The addition "FOR ALL ENTRIES" excludes all aggregate functions with the exception of "COUNT( * )" as the single element of the SELECT clause. any information regarding this to fix?

SELECT vbeln posnr SUM ( menge )

FROM zmmt0006

INTO TABLE it2_zmmt0006

FOR ALL ENTRIES IN it_c_t_data

WHERE vbeln = it_c_t_data-vbeln

AND posnr = it_c_t_data-posnr

AND status = u2018 u2018

GROUP BY vbeln posnr

I am also trying others logic replied here.

Thank you all for your quick replies.

Regards,

Selina

Former Member
0 Kudos

Hi,

Why you don't want to use SUM and ' AT End Of ' statements , any particular reasons ?

I have you used above statements to sum at line items without any major issues all my 'life', if you can explain the issue when using those , may be I can help you there...

Cheers,

VB

Former Member
0 Kudos

Try this method.

data : m_vbeln type vbeln value ' '
data : m_posnr type posnr value ' ',
data : m_menge type vbap-menge value 0.

TYPES : BEGIN OF wa1_zmmt0006 ,
vbeln TYPE zmmt0006-vbeln,
posnr TYPE zmmt0006-posnr , 
zdmenge TYPE zmmt0006-menge ,
END OF wa1_zmmt0006 .

DATA : wa2_zmmt0006 TYPE wa1_zmmt0006 ,
wa_zmmt0006 TYPE wa1_zmmt0006 ,
it2_zmmt0006 TYPE wa1_zmmt0006 ,
it_zmmt0006 TYPE wa1_zmmt0006 .

SELECT vbeln posnr menge 
FROM zmmt0006
INTO TABLE it2_zmmt0006
FOR ALL ENTRIES IN it_c_t_data
WHERE vbeln = it_c_t_data-vbeln
AND posnr = it_c_t_data-posnr
AND status = u2018 u2018 .

LOOP AT it2_zmmt0006 INTO wa2_zmmt0006 .
if m_vbeln ne wa2_zmmt0006-vbeln or m_posnr ne wa2_zmmt0006-posnr.
 write 😕  m_vbeln, m_posnr, m_menge.
 move 0 to m_menge.
endif.
move wa2_zmmt0006-vbeln to m_vbeln.
move wa2_zmmt0006-posnr to m_posnr.
m_menge = m_menge + wa2_zmmt0006-zdmenge.
Endloop .
write 😕  m_vbeln, m_posnr, m_menge.

Regards

Vinod

Former Member
0 Kudos

Hi Sonam,

Here you can try this aswell.

TABLES: zmmt0006 .

DATA : it_c_t_data TYPE TABLE OF mc11va0itm .

TYPES : BEGIN OF wa1_zmmt0006 ,

vbeln TYPE zmmt0006-vbeln,

posnr TYPE zmmt0006-posnr ,

zdmenge TYPE zmmt0006-menge ,

END OF wa1_zmmt0006 .

FIELD-SYMBOLS : <wa_ zmmt0006> TYPE wa1_zmmt0006 .

DATA : it_zmmt0006 TYPE wa1_zmmt0006 ,

DATA : l_vbeln2 TYPE zmmt0006-vbeln ,

l_posnr2 TYPE zmmt0006-posnr ,

l_zdmenge TYPE zmmt0006-menge VALUE 0.

it_c_t_data[] = c_t_data[].

IF NOT it_c_t_data[] IS INITIAL.

SORT it_c_t_data BY vbeln posnr.

SELECT vbeln posnr menge

FROM zmmt0006

INTO TABLE it_zmmt0006

FOR ALL ENTRIES IN it_c_t_data

WHERE vbeln = it_c_t_data-vbeln

AND posnr = it_c_t_data-posnr

AND status = u2018 u2018 .

IF sy-subrc EQ 0.

SORT it_zmmt0006 BY vbeln posnr.

ENDIF.

ENDIF.

LOOP AT it_zmmt0006 ASSIGNING <wa_zmmt0006>.

IF l_vbeln2 NE <wa_zmmt0006>-vbeln OR l_posnr2 NE

<wa_zmmt0006>-posnr.

l_zdmenge = 0.

ENDIF.

l_vbeln2 = <wa_zmmt0006>-vbeln.

l_posnr2 = <wa_zmmt0006>-posnr.

l_zdmenge = l_zdmenge + <wa_zmmt0006>-zdmenge .

<wa_zmmt0006>-vbeln = l_vbeln2.

<wa_zmmt0006>-posnr = l_posnr2.

<wa_zmmt0006>-zdmenge = l_zdmenge.

ENDLOOP.

SORT it_zmmt0006 BY vbeln ASCENDING posnr ASCENDING zdmenge

DESCENDING.

DELETE ADJACENT DUPLICATES FROM it_zmmt0006 COMPARING vbeln posnr.

LOOP AT it_zmmt0006 ASSIGNING <wa_zmmt0006>.

WRITE 😕 <wa_zmmt0006>-vbeln , <wa_zmmt0006>-posnr , <wa_zmmt0006>-zdmenge.

ENDLOOP.

Best regards,

Selina