04-14-2010 3:20 PM
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
04-19-2010 8:17 PM
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
04-14-2010 3:58 PM
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.
04-14-2010 9:54 PM
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
04-14-2010 4:05 PM
Hi Sonam,
Change The Following to table types.
it2_zmmt0006 TYPE wa1_zmmt0006 ,
it_zmmt0006 TYPE wa1_zmmt0006 .
04-14-2010 10:24 PM
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.
04-15-2010 8:10 AM
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
04-15-2010 12:44 AM
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
04-15-2010 5:41 AM
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
04-19-2010 8:17 PM
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