Skip to Content
0
Jan 10, 2008 at 10:56 AM

clearing the variables or a better logic

37 Views

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.