Friday, November 23, 2007

ABAP/4 Program: Find GRs without IRs

The purpose of this program is to highlight goods receipts (GR) that have no corresponding invoice receipts (IR). Either the invoice has not been received, or it has not been keyed in, or it was keyed in incorrectly.

The program is written as an interface for an ABAP Query. The output should be like that of ME2L (Purchasing IS), except that the format is different, and only those items with different quantities for GR and IR are listed. The code is not very optimized. The only advantage of using it as an ABAP Query is being able to quickly change the online format, sorting, etc.

Outstanding IRs from PO


*&---------------------------------------------------------------------*
*& Report ZGR-IR *
*& *
*&---------------------------------------------------------------------*
*& Used for ABAP Query to list goods received that have not been *
*& fully invoiced *
*&---------------------------------------------------------------------*

REPORT ZGR-IR.

TABLES: EKBE. "Define Dictionary structure

* Conditions to limit search
SELECT-OPTIONS: PO_DOC FOR EKBE-EBELN, "Purchase order
PO_ITEM FOR EKBE-EBELP, "Purchase order item
POSTDATE FOR EKBE-BUDAT, "GR Posting Date
MAT_NR FOR EKBE-MATNR. "Material number

DATA: GOODSRCVD LIKE EKBE-MENGE, "goods received in units
GOODSINVOICED LIKE EKBE-MENGE, "goods invoiced in units
LAST_EBELN LIKE EKBE-EBELN, "to keep track of already processed POs
LAST_EBELP LIKE EKBE-EBELP, " and PO items

BEGIN OF SUMS OCCURS 4,
BEWTP LIKE EKBE-BEWTP,
MENGE LIKE EKBE-MENGE,
SHKZG LIKE EKBE-SHKZG, "Debt/Credit indicator
END OF SUMS.

* "This comment must always appear after data decl'ns

* check header GR documents for un-invoiced inventory
SELECT * FROM EKBE
WHERE BWART = '101' AND " GR document
EBELN IN PO_DOC AND
EBELP IN PO_ITEM AND
BUDAT IN POSTDATE AND
MATNR IN MAT_NR
ORDER BY EBELN EBELP BELNR.
CHECK " only get the header one
NOT ( EKBE-EBELN = LAST_EBELN AND EKBE-EBELP = LAST_EBELP ).
LAST_EBELN = EKBE-EBELN.
LAST_EBELP = EKBE-EBELP.

CLEAR SUMS. CLEAR SUMS[].
SELECT BEWTP MENGE SHKZG FROM EKBE INTO SUMS
WHERE EBELN = EKBE-EBELN AND EBELP = EKBE-EBELP.
COLLECT SUMS.
ENDSELECT.

GOODSRCVD = 0. GOODSINVOICED = 0.
LOOP AT SUMS. "sums table should now have 4 totals
IF SUMS-SHKZG = 'S'. "positive value
IF SUMS-BEWTP = 'E'. "goods received
GOODSRCVD = GOODSRCVD + SUMS-MENGE.
ELSE. "goods invoiced
GOODSINVOICED = GOODSINVOICED + SUMS-MENGE.
ENDIF.
ELSE. " negative value
IF SUMS-BEWTP = 'E'. "goods received
GOODSRCVD = GOODSRCVD - SUMS-MENGE.
ELSE. "goods invoiced
GOODSINVOICED = GOODSINVOICED - SUMS-MENGE.
ENDIF.
ENDIF.
ENDLOOP.

IF GOODSRCVD = GOODSINVOICED. "amount received = amount invoiced
CONTINUE.
ELSE.
EKBE-BPMNG = GOODSRCVD - GOODSINVOICED. "missing invoice amount
ENDIF.

* send data to query
ENDSELECT.
*&---------------------------------------------------------------------*
*& End of Report ZGR-IR *
*& *
*&---------------------------------------------------------------------*

No comments:

Blog Archive