Hi Folks,
Here is a report which has to caluculate the balance quantity for every Material of a Vendor based on the transaction quantity.I am having a problem in clearing the variables SUM1 and SUM2 for every new Material of a Vendor.As these are not getting cleared it is getting carried forward to next material.
REPORT ZMMSM
TYPE-POOLS:SLIS.
TABLES:MSEG,
MKPF,
MAKT,
MBEW.
TYPES:BEGIN OF TY_ITFINAL,
SLNO LIKE SY-INDEX,
MATNR TYPE MSEG-MATNR,
MAKTX TYPE MAKT-MAKTX,
BLDAT TYPE MKPF-BLDAT,
BUDAT TYPE MKPF-BUDAT,
LIFNR TYPE MSEG-LIFNR,
SHKZG TYPE MSEG-SHKZG,
MBLNR TYPE MSEG-MBLNR,
MJAHR TYPE MSEG-MJAHR,
BWART TYPE MSEG-BWART,
MENGE TYPE MSEG-MENGE,
BLQTY1 TYPE MSEG-MENGE,
BLQTY2 TYPE MSEG-MENGE,
MEINS TYPE MSEG-MEINS,
NOD(03) TYPE C,
DMBTR TYPE MSEG-DMBTR,
EXCD TYPE MSEG-DMBTR,
END OF TY_ITFINAL.
DATA:ITFINAL TYPE TY_ITFINAL OCCURS 0 WITH HEADER LINE.
DATA:IDDIF TYPE TY_ITFINAL OCCURS 0 WITH HEADER LINE.
TYPES:BEGIN OF TY_IMSEG,
MBLNR TYPE MSEG-MBLNR,
MJAHR TYPE MSEG-MJAHR,
BWART TYPE MSEG-BWART,
MATNR TYPE MSEG-MATNR,
WERKS TYPE MSEG-WERKS,
LGORT TYPE MSEG-LGORT,
SOBKZ TYPE MSEG-SOBKZ,
LIFNR TYPE MSEG-LIFNR,
SHKZG TYPE MSEG-SHKZG,
WAERS TYPE MSEG-WAERS,
DMBTR TYPE MSEG-DMBTR,
MENGE TYPE MSEG-MENGE,
MEINS TYPE MSEG-MEINS,
BUKRS TYPE MSEG-BUKRS,
END OF TY_IMSEG.
DATA:IMSEG TYPE TY_IMSEG OCCURS 0 WITH HEADER LINE.
DATA:ITTEMP1 TYPE TY_IMSEG OCCURS 0 WITH HEADER LINE.
TYPES:BEGIN OF TY_IMKPF,
MBLNR TYPE MKPF-MBLNR,
MJAHR TYPE MKPF-MJAHR,
BLDAT TYPE MKPF-BLDAT,
BUDAT TYPE MKPF-BUDAT,
NOD(03) TYPE C,
END OF TY_IMKPF.
DATA:IMKPF TYPE TY_IMKPF OCCURS 0 WITH HEADER LINE.
TYPES:BEGIN OF TY_IMAKT,
MATNR TYPE MAKT-MATNR,
MAKTX TYPE MAKT-MAKTX,
END OF TY_IMAKT.
DATA:IMAKT TYPE TY_IMAKT OCCURS 0 WITH HEADER LINE.
*Declarations for ALV
DATA:itfieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA:itrepid TYPE sy-repid.
itrepid = sy-repid.
DATA:itevent TYPE slis_t_event.
DATA:itlistheader TYPE slis_t_listheader.
DATA:walistheader LIKE LINE OF itlistheader.
DATA:itlayout TYPE slis_layout_alv.
DATA:top TYPE slis_formname.
DATA:itsort TYPE slis_t_sortinfo_alv WITH HEADER LINE.
DATA :itsort1 TYPE slis_sortinfo_alv.
DATA:itprintparams TYPE slis_print_alv.
DATA:itvariant TYPE disvariant.
DATA:STRING1(65) TYPE C,
TITLE(65) TYPE C,
SUM1 TYPE MSEG-MENGE,
SUM2 TYPE MSEG-MENGE,
SUM3 TYPE MSEG-MENGE,
PREVIOUS1 TYPE MSEG-LIFNR,
PREVIOUS2 TYPE MSEG-LIFNR,
NOD LIKE VTBBEWE-ATAGE,
NOM LIKE VTBBEWE-ATAGE,
NOY LIKE VTBBEWE-ATAGE,
DATE1 LIKE VTBBEWE-DBERBIS,
DATE2 LIKE VTBBEWE-DBERBIS.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: S_LIFNR FOR MSEG-LIFNR OBLIGATORY,
S_MATNR FOR MSEG-MATNR.
PARAMETERS:P_WERKS LIKE MSEG-WERKS,
P_BUKRS LIKE MSEG-BUKRS.
SELECTION-SCREEN END OF BLOCK B1.
PERFORM GETDATA.
PERFORM ALV.
&----
*& Form GETDATA
&----
text
----
--> p1 text
<-- p2 text
----
form GETDATA .
SELECT MBLNR
MJAHR
BWART
MATNR
WERKS
LGORT
SOBKZ
LIFNR
SHKZG
WAERS
DMBTR
MENGE
MEINS
BUKRS
FROM MSEG
INTO TABLE IMSEG
WHERE MATNR IN S_MATNR AND
WERKS = P_WERKS AND
SOBKZ = 'O' AND
LIFNR IN S_LIFNR AND
BUKRS = P_BUKRS.
IF NOT IMSEG[] IS INITIAL.
ITTEMP1[] = IMSEG[].
SORT ITTEMP1 ASCENDING BY MATNR.
DELETE ADJACENT DUPLICATES FROM ITTEMP1 COMPARING MATNR.
*Posting Date and Document Date.
SELECT MBLNR
MJAHR
BLDAT
BUDAT
FROM MKPF
INTO TABLE IMKPF
FOR ALL ENTRIES IN IMSEG
WHERE MBLNR = IMSEG-MBLNR AND
MJAHR = IMSEG-MJAHR.
ENDIF.
*To caluculate the No.of Days.
*PERFORM DDIFF.
*Material Description.
IF NOT ITTEMP1[] IS INITIAL.
SELECT MATNR
MAKTX
FROM MAKT
INTO TABLE IMAKT
FOR ALL ENTRIES IN ITTEMP1
WHERE MATNR = ITTEMP1-MATNR AND
SPRAS = SY-LANGU.
ENDIF.
LOOP AT IMSEG.
MOVE-CORRESPONDING IMSEG TO ITFINAL.
READ TABLE IMKPF WITH KEY MBLNR = IMSEG-MBLNR
MJAHR = IMSEG-MJAHR.
IF SY-SUBRC = 0.
MOVE: IMKPF-BLDAT TO ITFINAL-BLDAT,
IMKPF-BUDAT TO ITFINAL-BUDAT,
IMKPF-MJAHR TO ITFINAL-MJAHR.
ENDIF.
READ TABLE IMAKT WITH KEY MATNR = IMSEG-MATNR.
IF SY-SUBRC = 0.
MOVE IMAKT-MAKTX TO ITFINAL-MAKTX.
ENDIF.
APPEND ITFINAL.
CLEAR: ITFINAL,IMSEG,IMAKT.
ENDLOOP.
SORT ITFINAL ASCENDING BY BUDAT.
SORT ITFINAL BY MATNR.
*Balance Quantity.
**here at every new matnr the variables sum1 and sum2 should be cleared,kindly let me know.
LOOP AT ITFINAL.
PREVIOUS1 = ITFINAL-LIFNR.
PREVIOUS2 = ITFINAL-MATNR.
*PERFORM DDIFF.
IF ITFINAL-LIFNR EQ PREVIOUS1 AND
ITFINAL-MATNR EQ PREVIOUS2.
IF ITFINAL-SHKZG = 'S'.
ITFINAL-BLQTY1 = SUM1 + ITFINAL-MENGE.
MOVE: ITFINAL-BLQTY1 TO SUM1,
ITFINAL-BLQTY1 TO SUM2.
ELSE.
CLEAR: SUM1.
ITFINAL-BLQTY1 = SUM2 - ITFINAL-MENGE.
MOVE ITFINAL-BLQTY1 TO SUM2.
MOVE SUM2 TO SUM1.
ENDIF.
ENDIF.
MODIFY ITFINAL.
*CLEAR: ITFINAL,PREVIOUS1,PREVIOUS2,sum1,sum2.
ENDLOOP.endform. " GETDATA
&----
*& Form ALV
&----
text
----
--> p1 text
<-- p2 text
----
form ALV .
IF itfinal[] IS INITIAL.
MESSAGE 'No Values exist for the Selection.' TYPE 'S'.
STOP.
ENDIF.
LOOP AT ITFINAL.
ITFINAL-SLNO = SY-TABIX.
MODIFY ITFINAL.
ENDLOOP.
DEFINE m_fieldcat.
itfieldcat-fieldname = &1.
itfieldcat-col_pos = &2.
itfieldcat-seltext_l = &3.
itfieldcat-do_sum = &4.
itfieldcat-outputlen = &5.
append itfieldcat to itfieldcat.
clear itfieldcat.
END-OF-DEFINITION.
m_fieldcat 'SLNO' '' 'SL. NO' '' 03 .
m_fieldcat 'MATNR' '' 'Material' '' 18 .
m_fieldcat 'MAKTX' '' 'Material Description' '' 40 .
m_fieldcat 'BLDAT' '' 'Document Date' '' 08 .
m_fieldcat 'BUDAT' '' 'Posting Date' '' 08 .
m_fieldcat 'LIFNR' '' 'Vendor' '' 10 .
m_fieldcat 'MBLNR' '' 'Mat.Doc.No' '' 10.
m_fieldcat 'BWART' '' 'Movement Type' '' 03 .
m_fieldcat 'SHKZG' '' 'Debit/Credit' '' 13 .
m_fieldcat 'MENGE' '' 'Transaction Qty' '' 13 .
m_fieldcat 'BLQTY1' '' 'Bal.Qty' '' 13.
m_fieldcat 'MEINS' '' 'Unit of Measure' '' 03.
m_fieldcat 'NOD' '' 'No.of Days' '' 03.
m_fieldcat 'DMBTR' '' 'Amount' 'X' 13.
m_fieldcat 'EXCD' '' 'Excise Duty' '' 13.
itlayout-zebra = 'X'.
itlayout-colwidth_optimize = 'X'.
itlayout-no_subtotals = ' '.
CLEAR itsort.
itsort1-spos = 06."column position
itsort1-fieldname = 'LIFNR'."field name
itsort1-tabname = 'ITFINAL'."internal table
itsort1-up = 'X'.
itsort1-group = '*'.
itsort1-subtot = 'X'.
APPEND itsort1 TO itsort.
CLEAR itsort.
itsort1-spos = 01."column position
itsort1-fieldname = 'MATNR'."field name
itsort1-tabname = 'ITFINAL'."internal table
itsort1-up = 'X'.
itsort1-group = '*'.
itsort1-subtot = 'X'.
APPEND itsort1 TO itsort.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
is_layout = itlayout
i_callback_user_command = 'LIST1'
i_callback_top_of_page = 'TOP'
it_fieldcat = itfieldcat[]
i_save = 'A'
is_variant = ITVARIANT
it_events = itevent[]
is_print = ITPRINTPARAMS
it_sort = itsort[]
TABLES
t_outtab = itfinal
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "alv
&----
*& Form list1
&----
ALV Interactive-
----
-->R_UCOMM text
-->RS_SELFIELDtext
----
FORM list1 USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&IC1'.
IF rs_selfield-fieldname = 'MBLNR'.
READ TABLE itfinal INDEX rs_selfield-tabindex.
SET PARAMETER ID 'MBN' FIELD ITFINAL-MBLNR.
SET PARAMETER ID 'MJA' FIELD ITFINAL-MJAHR.
CALL TRANSACTION 'MIGO' AND SKIP FIRST SCREEN.
ENDIF.
ENDCASE.
ENDFORM. "list1
&----
*& Form TOP
&----
Top of page for ALV Report
----
FORM top.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = itevent
EXCEPTIONS
list_type_wrong = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
string1 = 'Subcontracted Material Movement for'.
CONCATENATE string1 s_lifnr-low s_lifnr-high INTO title SEPARATED BY
space.
walistheader-typ = 'H'.
walistheader-info = title.
APPEND walistheader TO itlistheader.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = itlistheader.
I_LOGO = ''.
I_END_OF_LIST_GRID = .
CLEAR itlistheader.
ENDFORM. " TOP
&----
*& Form DDIFF
&----
text
----
--> p1 text
<-- p2 text
----
form DDIFF .
IF ITFINAL-LIFNR EQ PREVIOUS1 AND
ITFINAL-MATNR EQ PREVIOUS2 AND
ITFINAL-BUDAT NE DATE1.
CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
EXPORTING
i_date_from = DATE1
i_date_to = ITFINAL-BUDAT
I_FLG_SEPARATE = ' '
IMPORTING
E_DAYS = NOD
E_MONTHS =
E_YEARS =
.
ENDIF.
MOVE NOD TO ITFINAL-NOD.
CLEAR NOD.
DATE1 = ITFINAL-BUDAT.
*MODIFY IDDIF.
*ENDLOOP.
endform. " DDIFF
If you have better logic that what I am using,kindly let me know or help me with clearing the variables.
Thanks,
K.Kiran.