Showing posts with label MM - ABAP Reports. Show all posts
Showing posts with label MM - ABAP Reports. Show all posts

Saturday, October 11, 2008

Report to display 12 weeks forecast, Yesterday Stocks, Onhand Stocks, MTD Pull, MTD GR

*
* Report list last 12 Week Forecast, Yesterday, MTD PULL, Onhand Stock,
* MTD PO, MTD GR or NEXT MONTH PO
*
REPORT ZAI_WEEKLY LINE-SIZE 255 NO STANDARD PAGE HEADING
LINE-COUNT 065(001).

TABLES: MDKP, "Header Data for MRP Document
MDTB, "MRP table
MKPF, "Header: Material Document
MSEG, "Document Segment: Material
MARD, "Storage Location Data for Material
EKKO, "Purchasing Document Header
EKPO, "Purchasing Document Item
EKET, "Scheduling Agreement Schedule Lines
MARC, "Plant Data for Material
EINA, "Purchasing Info Record: General Data
MARA, "General Material Data
PBIM, "Independent requirements for material
PBED. "Independent requirements data

DATA: BEGIN OF INT_MRP OCCURS 100,
MATNR(18) TYPE C,
MENGE TYPE P DECIMALS 0,
MTDPULL TYPE P DECIMALS 0,
ONHAND TYPE P DECIMALS 0,
MTDGR TYPE P DECIMALS 0,
MTDPOORD TYPE P DECIMALS 0,
MTDPODEL TYPE P DECIMALS 0,
NEXPOORD TYPE P DECIMALS 0,
NEXPODEL TYPE P DECIMALS 0,
PLNMG01 TYPE P DECIMALS 0,
PLNMG02 TYPE P DECIMALS 0,
PLNMG03 TYPE P DECIMALS 0,
PLNMG04 TYPE P DECIMALS 0,
PLNMG05 TYPE P DECIMALS 0,
PLNMG06 TYPE P DECIMALS 0,
PLNMG07 TYPE P DECIMALS 0,
PLNMG08 TYPE P DECIMALS 0,
PLNMG09 TYPE P DECIMALS 0,
PLNMG10 TYPE P DECIMALS 0,
PLNMG11 TYPE P DECIMALS 0,
PLNMG12 TYPE P DECIMALS 0,
END OF INT_MRP.

DATA: BEGIN OF INT_DATE,
DATE01(12) TYPE C,
DATE02(12) TYPE C,
DATE03(12) TYPE C,
DATE04(12) TYPE C,
DATE05(12) TYPE C,
DATE06(12) TYPE C,
DATE07(12) TYPE C,
DATE08(12) TYPE C,
DATE09(12) TYPE C,
DATE10(12) TYPE C,
DATE11(12) TYPE C,
DATE12(12) TYPE C,
END OF INT_DATE.

DATA: BEGIN OF MDTBX OCCURS 0.
INCLUDE STRUCTURE MDTB.
DATA: END OF MDTBX.

DATA: NO01(2) TYPE N,
FN01(20),
FN02(20),
X_MONTH01(20),
X_MONTH02(20),
X_MONTH03(20),
X_MONTH04(20),
X_MONTH05(20),
X_MONTH06(20),
X_MONTH07(20),
X_MONTH08(20),
X_MONTH09(20),
X_MONTH10(20),
X_MONTH11(20),
X_MONTH12(20).
FIELD-SYMBOLS: , .

DATA: FDATE LIKE SY-DATUM,
LDATE LIKE SY-DATUM,
XDATE LIKE SY-DATUM.

DATA: BEGIN OF INT_PBED,
BDZEI TYPE PBED-BDZEI,
PLNMG TYPE PBED-PLNMG,
PDATU TYPE PBED-PDATU,
END OF INT_PBED,
ITAB_PBED LIKE TABLE OF INT_PBED.

DATA: BEGIN OF INT_MKPF,
VGART TYPE MKPF-VGART,
BUDAT TYPE MKPF-BUDAT,
MBLNR TYPE MKPF-MBLNR,
MJAHR TYPE MKPF-MJAHR,
END OF INT_MKPF,
ITAB_MKPF LIKE TABLE OF INT_MKPF.

DATA: BEGIN OF INT_MSEG,
MBLNR TYPE MSEG-MBLNR,
MJAHR TYPE MSEG-MJAHR,
MATNR TYPE MSEG-MATNR,
MENGE TYPE MSEG-MENGE,
DMBTR TYPE MSEG-DMBTR,
SHKZG TYPE MSEG-SHKZG,
END OF INT_MSEG,
ITAB_MSEG LIKE TABLE OF INT_MSEG.

DATA: BEGIN OF INT_MARD,
MATNR TYPE MARD-MATNR,
DISKZ TYPE MARD-DISKZ,
LABST TYPE MARD-LABST,
END OF INT_MARD,
ITAB_MARD LIKE TABLE OF INT_MARD.

DATA: BEGIN OF INT_EKKO,
BUKRS TYPE EKKO-BUKRS,
EBELN TYPE EKKO-EBELN,
END OF INT_EKKO,
ITAB_EKKO LIKE TABLE OF INT_EKKO.

DATA: BEGIN OF INT_EKPO,
EBELN TYPE EKPO-EBELN,
EBELP TYPE EKPO-EBELP,
MATNR TYPE EKPO-MATNR,
END OF INT_EKPO,
ITAB_EKPO LIKE TABLE OF INT_EKPO.

SELECT-OPTIONS: X_MATNR FOR MDKP-MATNR, "Material number
X_WERKS FOR MDKP-PLWRK, "Plant
X_EKGRP FOR MARC-EKGRP, "Purchasing group
X_BESKZ FOR MARC-BESKZ, "Procurement Type
X_SPART FOR MARA-SPART, "Procurement Type
X_LIFNR FOR EINA-LIFNR, "Vendor's account number
X_BUDAT FOR MDTB-DAT00, "Posting Date
X_BUDAT2 FOR MDTB-DAT00.

START-OF-SELECTION.
PERFORM DATA_ONHAND.
PERFORM DATA_MRP.
PERFORM YESTERDAY_PULL.
PERFORM DATA_MTD_PULL.
PERFORM DATA_MTD_GR.
PERFORM DATA_MTD_PO.
* PERFORM DATA_NEX_PO.
PERFORM LOOP_INT_MRP.
END-OF-SELECTION.

FORM DATA_ONHAND.
CLEAR ITAB_MARD.
INT_MARD-DISKZ = ' '.
APPEND INT_MARD TO ITAB_MARD.

SELECT WERKS MATNR LGORT LABST
INTO CORRESPONDING FIELDS OF INT_MARD
FROM MARD FOR ALL ENTRIES IN ITAB_MARD
WHERE DISKZ = ITAB_MARD-DISKZ "Storage location MRP indicator
AND WERKS IN X_WERKS
AND MATNR IN X_MATNR.

* Check Purchase Group, Procurement Type
SELECT SINGLE * FROM MARC WHERE LVORM = ' '
AND WERKS IN X_WERKS
AND MATNR = INT_MARD-MATNR
AND EKGRP IN X_EKGRP
AND BESKZ IN X_BESKZ.
IF SY-SUBRC <> 0. CONTINUE. ENDIF.

* Check Purchasing Info
SELECT SINGLE * FROM EINA WHERE LOEKZ = ' '
AND MATNR = INT_MARD-MATNR
AND LIFNR IN X_LIFNR.
IF SY-SUBRC <> 0. CONTINUE. ENDIF.

* Check Division
SELECT SINGLE * FROM MARA WHERE LVORM = ''
AND MATNR = INT_MARD-MATNR
AND SPART IN X_SPART.
IF SY-SUBRC <> 0. CONTINUE. ENDIF.

* WRITE:/ INT_MARD-MATNR, INT_MARD-LABST.

INT_MRP-ONHAND = INT_MARD-LABST.
INT_MRP-MATNR = INT_MARD-MATNR.
COLLECT INT_MRP.
CLEAR INT_MRP.
ENDSELECT.
ENDFORM.

FORM DATA_MRP.
* MDTB-DELKZ :-
* PP - IndReq
* SB - DepReq
* AR - OrdRes
LOOP AT INT_MRP.
SELECT SINGLE * FROM PBIM WHERE WERKS IN X_WERKS
AND MATNR = INT_MRP-MATNR.
INT_PBED-BDZEI = PBIM-BDZEI.
APPEND INT_PBED TO ITAB_PBED.
CLEAR NO01.
SELECT BDZEI PLNMG PDATU
INTO CORRESPONDING FIELDS OF INT_PBED
FROM PBED FOR ALL ENTRIES IN ITAB_PBED
WHERE BDZEI = ITAB_PBED-BDZEI.
ADD 1 TO NO01.
CONCATENATE 'INT_MRP-PLNMG' NO01 INTO FN01.
CONCATENATE 'INT_DATE-DATE' NO01 INTO FN02.
ASSIGN (FN01) TO .
ASSIGN (FN02) TO .

ADD INT_PBED-PLNMG TO .
= INT_PBED-PDATU.

MODIFY INT_MRP.

IF NO01 => 12.
EXIT.
ENDIF.
ENDSELECT.
ENDLOOP.
ENDFORM.

FORM YESTERDAY_PULL.
INT_MKPF-BUDAT = SY-DATUM - 1.
APPEND INT_MKPF TO ITAB_MKPF.

SELECT BUDAT MBLNR MJAHR
INTO CORRESPONDING FIELDS OF INT_MKPF
FROM MKPF FOR ALL ENTRIES IN ITAB_MKPF
WHERE BUDAT = ITAB_MKPF-BUDAT.

* WRITE: / INT_MKPF-BUDAT, INT_MKPF-MBLNR, INT_MKPF-MJAHR.

CLEAR ITAB_MSEG.
INT_MSEG-MBLNR = INT_MKPF-MBLNR.
INT_MSEG-MJAHR = INT_MKPF-MJAHR.
APPEND INT_MSEG TO ITAB_MSEG.
SELECT MBLNR MJAHR MATNR MENGE DMBTR SHKZG
INTO CORRESPONDING FIELDS OF INT_MSEG
FROM MSEG FOR ALL ENTRIES IN ITAB_MSEG
WHERE MBLNR = ITAB_MSEG-MBLNR
AND MJAHR = ITAB_MSEG-MJAHR
AND MATNR IN X_MATNR
AND LGORT IN ('G1', 'G2', 'G3', 'G4')
AND BWART IN ('311', '312').

IF INT_MSEG-SHKZG = 'S'.
MULTIPLY INT_MSEG-MENGE BY -1.
MULTIPLY INT_MSEG-DMBTR BY -1.
ENDIF.

* WRITE: / INT_MSEG-MBLNR, INT_MSEG-MATNR, INT_MSEG-MENGE.
INT_MRP-MENGE = INT_MSEG-MENGE.
INT_MRP-MATNR = INT_MSEG-MATNR.
COLLECT INT_MRP.
CLEAR INT_MRP.
ENDSELECT.
ENDSELECT.

ENDFORM.

FORM DATA_MTD_PULL.
INT_MKPF-VGART = ' '.
APPEND INT_MKPF TO ITAB_MKPF.
SELECT BUDAT MBLNR MJAHR
INTO CORRESPONDING FIELDS OF INT_MKPF
FROM MKPF FOR ALL ENTRIES IN ITAB_MKPF
WHERE VGART <> ITAB_MKPF-VGART
AND BUDAT IN X_BUDAT.

* MTD Pull
SELECT * FROM MSEG WHERE WERKS IN X_WERKS
AND MBLNR = INT_MKPF-MBLNR
AND MJAHR = INT_MKPF-MJAHR
AND MATNR IN X_MATNR
AND LGORT IN ('G1', 'G2',
'G3', 'G4')
AND BWART IN ('311', '312').
IF MSEG-SHKZG = 'S'.
MULTIPLY MSEG-MENGE BY -1.
MULTIPLY MSEG-DMBTR BY -1.
ENDIF.

INT_MRP-MTDPULL = MSEG-MENGE.
INT_MRP-MATNR = MSEG-MATNR.

COLLECT INT_MRP.
CLEAR INT_MRP.

ENDSELECT.

ENDSELECT.
ENDFORM.

FORM DATA_MTD_GR.
INT_MKPF-VGART = ' '.
APPEND INT_MKPF TO ITAB_MKPF.
SELECT BUDAT MBLNR MJAHR
INTO CORRESPONDING FIELDS OF INT_MKPF
FROM MKPF FOR ALL ENTRIES IN ITAB_MKPF
WHERE VGART <> ITAB_MKPF-VGART
AND BUDAT IN X_BUDAT.

* MTD Goods Receipts
SELECT * FROM MSEG WHERE WERKS IN X_WERKS
AND MBLNR = INT_MKPF-MBLNR
AND MJAHR = INT_MKPF-MJAHR
AND MATNR IN X_MATNR
AND LGORT IN ('G1')
AND BWART IN ('101', '102').
IF MSEG-SHKZG = 'H'.
MULTIPLY MSEG-MENGE BY -1.
MULTIPLY MSEG-DMBTR BY -1.
ENDIF.

INT_MRP-MTDGR = MSEG-MENGE.
INT_MRP-MATNR = MSEG-MATNR.

COLLECT INT_MRP.
CLEAR INT_MRP.

ENDSELECT.

ENDSELECT.
ENDFORM.

FORM DATA_MTD_PO.
CLEAR ITAB_EKKO.
INT_EKKO-BUKRS = '0010'. "Company Code
APPEND INT_EKKO TO ITAB_EKKO.
SELECT BUKRS EBELN
INTO CORRESPONDING FIELDS OF INT_EKKO
FROM EKKO FOR ALL ENTRIES IN ITAB_EKKO
WHERE BUKRS = ITAB_EKKO-BUKRS
AND LOEKZ = ' '.

CLEAR ITAB_EKPO.
INT_EKPO-EBELN = INT_EKKO-EBELN.
APPEND INT_EKPO TO ITAB_EKPO.
SELECT EBELN EBELP MATNR
INTO CORRESPONDING FIELDS OF INT_EKPO
FROM EKPO FOR ALL ENTRIES IN ITAB_EKPO
WHERE EBELN = ITAB_EKPO-EBELN
AND MATNR IN X_MATNR
AND LOEKZ = ' '
* "Delivery completed" indicator
AND ELIKZ = ' '.

CLEAR EKET.
SELECT SINGLE * FROM EKET WHERE EBELN = INT_EKPO-EBELN
AND EBELP = INT_EKPO-EBELP
AND EINDT IN X_BUDAT.
IF SY-SUBRC = 0.
INT_MRP-MATNR = INT_EKPO-MATNR.
INT_MRP-MTDPOORD = EKET-MENGE.
INT_MRP-MTDPODEL = EKET-WEMNG.
COLLECT INT_MRP.
CLEAR INT_MRP.
ENDIF.
ENDSELECT.
ENDSELECT.
ENDFORM.

FORM DATA_NEX_PO.
CLEAR ITAB_EKKO.
INT_EKKO-BUKRS = '0010'. "Company Code
APPEND INT_EKKO TO ITAB_EKKO.
SELECT BUKRS EBELN
INTO CORRESPONDING FIELDS OF INT_EKKO
FROM EKKO FOR ALL ENTRIES IN ITAB_EKKO
WHERE BUKRS = ITAB_EKKO-BUKRS
AND LOEKZ = ' '.

CLEAR ITAB_EKPO.
INT_EKPO-EBELN = INT_EKKO-EBELN.
APPEND INT_EKPO TO ITAB_EKPO.
SELECT EBELN EBELP MATNR
INTO CORRESPONDING FIELDS OF INT_EKPO
FROM EKPO FOR ALL ENTRIES IN ITAB_EKPO
WHERE EBELN = ITAB_EKPO-EBELN
AND MATNR IN X_MATNR
AND LOEKZ = ' '
* "Delivery completed" indicator
AND ELIKZ = ' '.

CLEAR EKET.
SELECT SINGLE * FROM EKET WHERE EBELN = INT_EKPO-EBELN
AND EBELP = INT_EKPO-EBELP
AND EINDT IN X_BUDAT2.
IF SY-SUBRC = 0.
INT_MRP-MATNR = INT_EKPO-MATNR.
INT_MRP-NEXPOORD = EKET-MENGE.
INT_MRP-NEXPODEL = EKET-WEMNG.
COLLECT INT_MRP.
CLEAR INT_MRP.
ENDIF.
ENDSELECT.
ENDSELECT.
ENDFORM.

FORM LOOP_INT_MRP.
SORT INT_MRP.
LOOP AT INT_MRP.
* Check Purchase Group, Procurement Type
SELECT SINGLE * FROM MARC WHERE LVORM = ' '
AND WERKS IN X_WERKS
AND MATNR = INT_MRP-MATNR
AND EKGRP IN X_EKGRP
AND BESKZ IN X_BESKZ.
IF SY-SUBRC <> 0. CONTINUE. ENDIF.

* Check Purchasing Info
SELECT SINGLE * FROM EINA WHERE LOEKZ = ' '
AND MATNR = INT_MRP-MATNR
AND LIFNR IN X_LIFNR.
IF SY-SUBRC <> 0. CONTINUE. ENDIF.

* Check Division
SELECT SINGLE * FROM MARA WHERE LVORM = ''
AND MATNR = INT_MRP-MATNR
AND SPART IN X_SPART.
IF SY-SUBRC <> 0. CONTINUE. ENDIF.

WRITE: / INT_MRP-MATNR UNDER ' Material',
INT_MRP-PLNMG01 UNDER X_MONTH01,
INT_MRP-PLNMG02 UNDER X_MONTH02,
INT_MRP-PLNMG03 UNDER X_MONTH03,
INT_MRP-PLNMG04 UNDER X_MONTH04,
INT_MRP-PLNMG05 UNDER X_MONTH05,
INT_MRP-PLNMG06 UNDER X_MONTH06,
INT_MRP-PLNMG07 UNDER X_MONTH07,
INT_MRP-PLNMG08 UNDER X_MONTH08,
INT_MRP-PLNMG09 UNDER X_MONTH09,
INT_MRP-PLNMG10 UNDER X_MONTH10,
INT_MRP-PLNMG11 UNDER X_MONTH11,
INT_MRP-PLNMG12 UNDER X_MONTH12,
INT_MRP-MENGE UNDER 'Yesterday Pull',
INT_MRP-MTDPULL UNDER ' MTD Pull',
INT_MRP-ONHAND UNDER ' On Hand'.
INT_MRP-MTDPOORD = INT_MRP-MTDPOORD - INT_MRP-MTDPODEL.
* INT_MRP-NEXPOORD = INT_MRP-NEXPOORD - INT_MRP-NEXPODEL.
WRITE: / INT_MRP-MTDPOORD UNDER ' MTD PO',
INT_MRP-MTDGR UNDER ' MTD GR'.
ENDLOOP.
ENDFORM.

TOP-OF-PAGE.
FORMAT COLOR COL_TOTAL.
WRITE: / SY-DATUM, SY-UZEIT, SY-REPID,
110 'Material Consumption',
200 SY-UNAME, SY-PAGNO.

SKIP.
CLEAR NO01.
DO 12 TIMES.
ADD 1 TO NO01.
CONCATENATE 'INT_DATE-DATE' NO01 INTO FN01.
CONCATENATE 'X_MONTH' NO01 INTO FN02.
ASSIGN (FN01) TO .
ASSIGN (FN02) TO .
* Date conversion to 31 January 2003
* CALL FUNCTION 'CONVERSION_EXIT_LDATE_OUTPUT'
* EXPORTING
* INPUT =
* IMPORTING
* OUTPUT = .
* = .
CONCATENATE +6(2) +4(2) (4) INTO .
ENDDO.

WRITE: /1 ' Material',
20 X_MONTH01(8),
35 X_MONTH02(8),
50 X_MONTH03(8),
65 X_MONTH04(8),
80 X_MONTH05(8),
95 X_MONTH06(8),
110 X_MONTH07(8),
125 X_MONTH08(8),
140 X_MONTH09(8),
155 X_MONTH10(8),
170 X_MONTH11(8),
185 X_MONTH12(8),
200 'Yesterday Pull',
215 ' MTD Pull',
230 ' On Hand'.
WRITE: /215 ' MTD PO',
230 ' MTD GR'.

INITIALIZATION.
CASE SY-DATUM+4(2).
WHEN '01'.
ADD 31 TO SY-DATUM.
WHEN '02'.
ADD 28 TO SY-DATUM.
WHEN '03'.
ADD 31 TO SY-DATUM.
WHEN '04'.
ADD 30 TO SY-DATUM.
WHEN '05'.
ADD 31 TO SY-DATUM.
WHEN '06'.
ADD 30 TO SY-DATUM.
WHEN '07'.
ADD 31 TO SY-DATUM.
WHEN '08'.
ADD 31 TO SY-DATUM.
WHEN '09'.
ADD 30 TO SY-DATUM.
WHEN '10'.
ADD 31 TO SY-DATUM.
WHEN '11'.
ADD 30 TO SY-DATUM.
WHEN '12'.
ADD 31 TO SY-DATUM.
WHEN OTHERS.
ADD 28 TO SY-DATUM.
ENDCASE.
LDATE = FDATE = SY-DATUM.
LDATE+6(2) = '01'.
SUBTRACT 1 FROM LDATE.
FDATE = LDATE.
FDATE+6(2) = '01'.
MOVE: FDATE TO X_BUDAT-LOW,
LDATE TO X_BUDAT-HIGH.
APPEND X_BUDAT.

LDATE+6(2) = '28'.
ADD 60 TO LDATE.
LDATE+6(2) = '01'.
SUBTRACT 1 FROM LDATE.
FDATE = LDATE.
FDATE+6(2) = '01'.
MOVE: FDATE TO X_BUDAT2-LOW,
LDATE TO X_BUDAT2-HIGH.
APPEND X_BUDAT2.

Mass Select and Print Material Master Changed History

4.6x

REPORT ZMMCHGHISTORY NO STANDARD PAGE HEADING
LINE-SIZE 195 LINE-COUNT 60.

* Change doc listing
* Grouped into 3 chg types: 1. Part revision 2. Price change 3. Others

TABLES:
CDHDR, CDPOS, MARA, MAKT, MARD.

FIELD-GROUPS: HEADER.

DATA: BEGIN OF CHGDOC OCCURS 50.
INCLUDE STRUCTURE CDRED.
DATA: END OF CHGDOC.

DATA:
CHGTYPE(1),
PLANT(4),
MATNR1 LIKE CHGDOC-OBJECTID.

SELECT-OPTIONS:
XMATNR FOR CDHDR-OBJECTID, "Material
XUDATE FOR CDHDR-UDATE, "Change Date
XUNAME FOR CDHDR-USERNAME, "User Name
XTCODE FOR CDHDR-TCODE, "Transaction Code
XWERKS FOR MARD-WERKS. "Plants

SELECTION-SCREEN SKIP.

*Filter change type
SELECTION-SCREEN BEGIN OF BLOCK CHG0 WITH FRAME TITLE TEXT-001.
PARAMETERS : XCHG1 AS CHECKBOX DEFAULT 'X',
XCHG2 AS CHECKBOX DEFAULT 'X',
XCHG3 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK CHG0.

START-OF-SELECTION.

INSERT:
CHGDOC-OBJECTID "Material
CHGTYPE "Change type
PLANT
CHGDOC-CHANGENR
CHGDOC-USERNAME
CHGDOC-UDATE
CHGDOC-TCODE
CHGDOC-TABNAME
CHGDOC-TABKEY
CHGDOC-CHNGIND
CHGDOC-FNAME
CHGDOC-FTEXT
CHGDOC-TEXTART
CHGDOC-OUTLEN
CHGDOC-F_OLD
CHGDOC-F_NEW

INTO HEADER.

SELECT * FROM MARA WHERE MATNR IN XMATNR.

MATNR1 = MARA-MATNR.

CALL FUNCTION 'CHANGEDOCUMENT_READ'
EXPORTING
* ARCHIVE_HANDLE = 0
* CHANGENUMBER = ' '
* DATE_OF_CHANGE = '00000000'
OBJECTCLASS = 'MATERIAL'
OBJECTID = MATNR1
* TABLEKEY = ' '
* TABLENAME = ' '
* TIME_OF_CHANGE = '000000'
* USERNAME = ' '
* LOCAL_TIME = ' '
TABLES
EDITPOS = CHGDOC
EXCEPTIONS
NO_POSITION_FOUND = 1
WRONG_ACCESS_TO_ARCHIVE = 2
TIME_ZONE_CONVERSION_ERROR = 3
OTHERS = 4.

LOOP AT CHGDOC.

CHECK: CHGDOC-UDATE IN XUDATE,
CHGDOC-USERNAME IN XUNAME,
CHGDOC-TCODE IN XTCODE.

* Chg type: 1. Part revision, 2. Price change, 3. Others
CASE CHGDOC-TCODE.
WHEN 'MM01' OR 'MM02' OR 'MM03'. CHGTYPE = '1'.
WHEN 'MR21'. CHGTYPE = '2'.
WHEN OTHERS. CHGTYPE = '3'.
ENDCASE.

* Filter chg type
IF ( CHGTYPE = '1' AND XCHG1 <> 'X' ) OR
( CHGTYPE = '2' AND XCHG2 <> 'X' ) OR
( CHGTYPE = '3' AND XCHG3 <> 'X' ).
CONTINUE.
ENDIF.

* Plant is a substring of tabkey
PLANT = CHGDOC-TABKEY+21(4).

IF NOT ( XWERKS IS INITIAL ) AND NOT ( PLANT IS INITIAL ).
CHECK PLANT IN XWERKS.
ENDIF.

EXTRACT HEADER.

ENDLOOP.

ENDSELECT.

END-OF-SELECTION.

SORT.
LOOP.
* Material
AT NEW CHGDOC-OBJECTID.
SELECT SINGLE * FROM MAKT WHERE MATNR = CHGDOC-OBJECTID.
FORMAT INTENSIFIED ON.
SKIP. SKIP.
WRITE:/' *** Material:', (18) CHGDOC-OBJECTID, MAKT-MAKTX.
ENDAT.

* Change type
AT NEW CHGTYPE.
FORMAT INTENSIFIED ON.
SKIP.
CASE CHGTYPE.
WHEN '1'. WRITE:/ ' ** Change type: PARTS REVISION'.
WHEN '2'. WRITE:/ ' ** Change type: PRICE CHANGE'.
WHEN '3'. WRITE:/ ' ** Change type: OTHERS'.
ENDCASE.
SKIP.
ENDAT.

SHIFT CHGDOC-F_OLD LEFT DELETING LEADING SPACE.
SHIFT CHGDOC-F_NEW LEFT DELETING LEADING SPACE.

FORMAT INTENSIFIED OFF.
WRITE:
/ PLANT UNDER 'Plant',
(50) CHGDOC-FTEXT UNDER 'Field',
(45) CHGDOC-F_OLD UNDER 'Old value',
(45) CHGDOC-F_NEW UNDER 'New value'.

AT NEW CHGDOC-CHANGENR.
FORMAT INTENSIFIED OFF.
WRITE:
CHGDOC-CHANGENR UNDER 'Change doc',
CHGDOC-TCODE UNDER 'Tcod',
CHGDOC-USERNAME UNDER 'User name ',
CHGDOC-UDATE UNDER 'Date ' DD/MM/YY.
ENDAT.

AT END OF CHGDOC-OBJECTID.
SKIP.
ULINE.
SKIP.
ENDAT.
ENDLOOP.

TOP-OF-PAGE.
WRITE: / SY-DATUM, SY-UZEIT,
50 'ABC PTE LTD',
100 'page', SY-PAGNO,
/ SY-REPID,
48 'Change Documents Report',
100 SY-UNAME.

SKIP.
ULINE.

WRITE:/3
'Change doc',
'Tcod',
'User name ',
'Date ',
'Plant',
(50) 'Field',
(45) 'Old value',
(45) 'New value'.

ULINE.

*** End of Program

Functional Purchase Order History Mass Display

Instead of checking your Purchase Order History one at a time, you can now mass display or print them with this customized abap report.

*
* Mass display or print Purchase Order History
*
* You can request report by :
* 1. Change date
* 2. User Name
* 3. Purchase Order Number
* 4. Vendor Code
*
* Written by : SAP Basis, ABAP Programming and Other IMG Stuff
*
*
REPORT ZPOCHANGE LINE-SIZE 132 NO STANDARD PAGE HEADING
LINE-COUNT 065(001)
MESSAGE-ID VR.

TABLES: DD04T,
CDHDR,
CDPOS,
DD03L,
DD41V,
T685T,
VBPA,
TPART,
KONVC,
EKKO.

SELECT-OPTIONS: XUDATE FOR CDHDR-UDATE,
XNAME FOR CDHDR-USERNAME,
XEBELN FOR EKKO-EBELN,
XLIFNR FOR EKKO-LIFNR.

SELECTION-SCREEN SKIP.
* TEXT-001 - Sorting Sequence
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.
PARAMETERS: SUDATE RADIOBUTTON GROUP R1,
SNAME RADIOBUTTON GROUP R1,
SOBID RADIOBUTTON GROUP R1.
SELECTION-SCREEN END OF BLOCK BLK1.

DATA: WFLAG,
WCHANGENR LIKE CDHDR-CHANGENR.

DATA: INDTEXT(60) TYPE C.

DATA: BEGIN OF ICDHDR OCCURS 50.
INCLUDE STRUCTURE CDHDR.
DATA: END OF ICDHDR.

DATA: BEGIN OF ICDSHW OCCURS 50.
INCLUDE STRUCTURE CDSHW.
DATA: END OF ICDSHW.

DATA: BEGIN OF EKKEY,
EBELN LIKE EKET-EBELN,
EBELP LIKE EKET-EBELP,
ETENR LIKE EKET-ETENR,

END OF EKKEY.

DATA: BEGIN OF ITAB OCCURS 50,
BEGIN OF EKKEY,
EBELN LIKE EKET-EBELN,
EBELP LIKE EKET-EBELP,

ETENR LIKE EKET-ETENR,
END OF EKKEY,
CHANGENR LIKE CDHDR-CHANGENR,
UDATE LIKE CDHDR-UDATE,
UTIME LIKE CDHDR-UTIME,
USERNAME LIKE CDHDR-USERNAME,
CHNGIND LIKE CDSHW-CHNGIND,
FTEXT LIKE CDSHW-FTEXT,
OUTLEN LIKE CDSHW-OUTLEN,
F_OLD LIKE CDSHW-F_OLD,
F_NEW LIKE CDSHW-F_NEW,
END OF ITAB.

DATA: OLD_OBJECTID LIKE CDHDR-OBJECTID.

FIELD-SYMBOLS: , .

SELECT * FROM EKKO WHERE EBELN IN XEBELN AND
LIFNR IN XLIFNR.
CLEAR CDHDR.
CLEAR CDPOS.
CDHDR-OBJECTCLAS = 'EINKBELEG'.
CDHDR-OBJECTID = EKKO-EBELN.
PERFORM GETCHGDOCS.
ENDSELECT.

IF SUDATE = 'X'.
SORT ITAB BY UDATE EKKEY-EBELN CHANGENR EKKEY-EBELP
EKKEY-ETENR.
ELSEIF SNAME = 'X'.
SORT ITAB BY USERNAME EKKEY-EBELN CHANGENR EKKEY-EBELP
EKKEY-ETENR.
ELSE.
SORT ITAB BY EKKEY-EBELN CHANGENR EKKEY-EBELP EKKEY-ETENR.
ENDIF.

LOOP AT ITAB.
CLEAR: INDTEXT, EKKEY.
CASE ITAB-CHNGIND.
WHEN 'U'.
INDTEXT(50) = ITAB-FTEXT.
INDTEXT+51 = TEXT-020.
CONDENSE INDTEXT.
WHEN 'D'.
INDTEXT = TEXT-021.
WHEN 'E'.
INDTEXT(5) = ITAB-FTEXT.
INDTEXT+51 = TEXT-021.
CONDENSE INDTEXT.
WHEN 'I'.
INDTEXT = TEXT-022.
ENDCASE.
RESERVE 4 LINES.
IF WCHANGENR NE ITAB-CHANGENR.
WCHANGENR = ITAB-CHANGENR.
EKKEY = ITAB-EKKEY.
WRITE:/ ITAB-UDATE UNDER 'Change Date',
ITAB-UTIME UNDER 'Time',
ITAB-USERNAME UNDER 'User Name',
ITAB-EKKEY-EBELN UNDER 'PO No',
ITAB-EKKEY-EBELP UNDER 'Item',
ITAB-EKKEY-ETENR UNDER 'Sch No',
INDTEXT UNDER 'Changes'.
ELSEIF ITAB-EKKEY NE EKKEY.
WRITE:/ ITAB-EKKEY-EBELP UNDER 'Item',
ITAB-EKKEY-ETENR UNDER 'Sch No',
INDTEXT UNDER 'Changes'.

ENDIF.

CASE ITAB-CHNGIND.
WHEN 'U'.
ASSIGN ITAB-F_OLD(ITAB-OUTLEN) TO .
ASSIGN ITAB-F_NEW(ITAB-OUTLEN) TO .
WRITE: / TEXT-023 UNDER 'Changes',
.
WRITE: / TEXT-024 UNDER 'Changes',
.
WHEN 'E'.
ASSIGN ITAB-F_OLD(ITAB-OUTLEN) TO .
WRITE: TEXT-023 UNDER 'Changes',
.
ENDCASE.
SKIP.
ENDLOOP.


TOP-OF-PAGE.
WRITE:/ SY-DATUM,SY-UZEIT,
50 'P U R C H A S E O R D E R H I S T O R Y',
120 'Page', SY-PAGNO.
WRITE: / SY-REPID,
60 'Purchase Orders Changes'.
SKIP.
ULINE.
IF SUDATE = 'X'.
WRITE:/001 'Change Date',
014 'Time',
024 'User Name',
038 'PO No',
050 'Item',
057 'Sch No',
065 'Changes'.
ELSEIF SOBID = 'X'.
WRITE:/001 'PO No',
013 'Item',
020 'Sch No',
028 'Change Date',
041 'Time',
051 'User Name',
065 'Changes'.
ELSE.
WRITE:/001 'User Name',
015 'Change Date',
028 'Time',
038 'PO No',
050 'Item',
057 'Sch No',
065 'Changes'.
ENDIF.
ULINE.

FORM GETCHGDOCS.
CALL FUNCTION 'CHANGEDOCUMENT_READ_HEADERS'
EXPORTING
DATE_OF_CHANGE = CDHDR-UDATE
OBJECTCLASS = CDHDR-OBJECTCLAS
OBJECTID = CDHDR-OBJECTID
TIME_OF_CHANGE = CDHDR-UTIME
USERNAME = CDHDR-USERNAME
TABLES
I_CDHDR = ICDHDR
EXCEPTIONS
NO_POSITION_FOUND = 1
OTHERS = 2.

CHECK SY-SUBRC EQ 0.
DELETE ICDHDR WHERE CHANGE_IND EQ 'I'.
CHECK NOT ICDHDR[] IS INITIAL.
LOOP AT ICDHDR.
CHECK ICDHDR-UDATE IN XUDATE.
CHECK ICDHDR-USERNAME IN XNAME.
CALL FUNCTION 'CHANGEDOCUMENT_READ_POSITIONS'
EXPORTING CHANGENUMBER = ICDHDR-CHANGENR
IMPORTING HEADER = CDHDR
TABLES EDITPOS = ICDSHW
EXCEPTIONS NO_POSITION_FOUND = 1
OTHERS = 2.
CHECK SY-SUBRC EQ 0.
LOOP AT ICDSHW.
CHECK ICDSHW-TEXT_CASE EQ SPACE.
MOVE-CORRESPONDING ICDSHW TO ITAB.
MOVE-CORRESPONDING ICDHDR TO ITAB.
MOVE ICDSHW-TABKEY+3 TO ITAB-EKKEY.
APPEND ITAB.
ENDLOOP.
ENDLOOP.
ENDFORM.
*
* END OF PROGRAM

Total number of Purchasing Documents by Purchasing Group

If you need to list the total number of purchasing documents by purchasing group for each respective vendor used transaction code ME80.

Enter the Vendor code and the from date to date and your report is ready.

Auto Disallowed Back Posting to Previous Period

***********************************************************************
* AUTO DISALLOWED BACK POSTING TO PREVIOUS PERIOD
***********************************************************************

REPORT ZBDCMMRV.
TABLES: MARV.

* Batch Input Name
PARAMETERS P-BTCHSN(12) DEFAULT 'MMRVCHANGE'.
* Company Code
PARAMETERS P-BUKRS LIKE MARV-BUKRS.
* Auto / Manual run the Batch Input Program
PARAMETERS P-RUN AS CHECKBOX DEFAULT 'X'.

* INTERNAL TABLE FOR DATA
DATA: BEGIN OF ULTAB OCCURS 50,
BUKRS LIKE MARV-BUKRS, "Company Code
END OF ULTAB.

* INTERNAL TABLE FOR BATCH INPUT DATA
DATA: BEGIN OF IPUTTAB OCCURS 50.
INCLUDE STRUCTURE BDCDATA.
DATA: END OF IPUTTAB.

* INTERNAL TABLE FOR BATCH INPUT ERROR MESSAGE.
DATA: BEGIN OF MESSTAB OCCURS 50.
INCLUDE STRUCTURE BDCMSGCOLL.
DATA: END OF MESSTAB.

DATA: C_TAXKM LIKE MG03STEUER-TAXKM VALUE '1',
W-LINE-NO TYPE I.

REFRESH ULTAB.
SELECT * FROM MARV WHERE BUKRS = P-BUKRS.
ULTAB-BUKRS = MARV-BUKRS.
APPEND ULTAB.

ENDSELECT.

* CHECK WHETHER TABLE IS EMPTY
IF ULTAB[] is initial.
WRITE: / 'TABLE EMPTY'.
ENDIF.

* Create Batch session
PERFORM CRE-BATCH-SESS.

** LOOP TABLE TO CREATE SCREEN INPUT
SORT.
LOOP AT ULTAB.
REFRESH IPUTTAB.
PERFORM SCREEN1.
PERFORM SCREEN2.
PERFORM PRN_ULTAB.
PERFORM CLOSE-SESS.
ENDLOOP.

CALL FUNCTION 'BDC_CLOSE_GROUP'.

* END OF MAIN PROGRAM

FORM SCREEN1.
* SCREEN #1: INITAL SCREEN FOR MAINTAINING SOURCE LIST
CLEAR IPUTTAB.
IPUTTAB-PROGRAM = 'SAPMM03Y'.
IPUTTAB-DYNPRO = '100'.
IPUTTAB-DYNBEGIN = 'X'.
APPEND IPUTTAB.

* MMRV ENQUIRY BY COMPANY CODE
CLEAR IPUTTAB.
IPUTTAB-FNAM = 'MARV-BUKRS'.
IPUTTAB-FVAL = ULTAB-BUKRS.
APPEND IPUTTAB.

ENDFORM.
***********************************************************************
* FORM : SCREEN1 *
***********************************************************************
FORM SCREEN2.
* MODIFY SCREEN IN MMRV
CLEAR IPUTTAB.
IPUTTAB-PROGRAM = 'SAPMM03Y'.
IPUTTAB-DYNPRO = '110'.
IPUTTAB-DYNBEGIN = 'X'.
APPEND IPUTTAB.

* UNTICK ALLOWED POSTING TO PREVIOUS PERIOD
CLEAR IPUTTAB.
IPUTTAB-FNAM = 'MARV-XRUEM'.
IPUTTAB-FVAL = ' '.
APPEND IPUTTAB.

* DISALLOWED BACKPOSTING GENERALLY
CLEAR IPUTTAB.
IPUTTAB-FNAM = 'MARV-XRUEV'.
IPUTTAB-FVAL = 'X'.
APPEND IPUTTAB.

* Specify that we are now done with this screen (Save it with F11)
CLEAR IPUTTAB.
IPUTTAB-FNAM = 'BDC_OKCODE'.
IPUTTAB-FVAL = '/11'.
APPEND IPUTTAB.
ENDFORM.

***********************************************************************
* FORM : CLOSE-SESS *
* DESCRIPTION : CLOSE THE SESSION *
***********************************************************************
FORM CLOSE-SESS.
* closing the session.
IF P-RUN = 'X'.
* Auto run the Batch Input Program
CALL TRANSACTION 'MMRV'
USING IPUTTAB
MODE 'E'
UPDATE 'S'
MESSAGES INTO MESSTAB.
ELSE.
* Maual run the Batch Input Program
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'MMRV'
TABLES
DYNPROTAB = IPUTTAB.
ENDIF.

ENDFORM.

***********************************************************************
* FORM : PRN-ULTAB *
* DESCRIPTION : PRINT OK TABLE *
***********************************************************************
FORM PRN_ULTAB.
WRITE: / ULTAB-BUKRS.
W-LINE-NO = W-LINE-NO + 1.
WRITE: ' RECORD# ', W-LINE-NO.
ENDFORM.

***********************************************************************
* FORM : CRE-BATCH-SESS *
* DESCRIPTION : CREATE BATCH SESSION *
***********************************************************************
FORM CRE-BATCH-SESS.
** Create BTCI session **
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = P-BTCHSN
USER = SY-UNAME
KEEP = 'X'.
ENDFORM.

Archive