Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Open close PO's

Former Member
0 Kudos

Hi All,

I want help in changing my code for getting open & close PO’s. I wrote the code in Start-of-Selection. This code is working fine with my PO’s whether close or open basing on the status of delivery or on the quantity delivered and invoiced. My problem is that when this PO is having line items & if the 1st two or any of the PO’s closed & last item yet to be delivered it is giving correct result that this PO’s is still open. If my last item in PO’s is closed & 1st two or three items are open it is giving closed. Basing on last item my program is working. It is not checking on each line item to decide whether it is closed or open. Kindly help to change the code to check each line item whether closed or open & give the final result. Your help is appreciated.

Regards,

Ram

<b><u>This is the code I have written</u>.</b>

DATA: SUBTOTAL LIKE EKPO-MENGE.

DATA: STATUS TYPE I VALUE 1.

SELECT EKKO~EBELN

EKKO~LIFNR

EKKO~BEDAT

EKKO~WAERS

EKKO~EKGRP

INTO CORRESPONDING FIELDS OF TABLE IEKKO

FROM EKKO

WHERE EKKO~EBELN IN S_EBELN

AND LIFNR IN S_LIFNR

AND EKGRP IN S_EKGRP

AND EKKO~BUKRS IN S_BUKRS

AND BEDAT IN S_BEDAT.

SELECT EKPO~EBELN

EKPO~EBELP

EKPO~NETWR

EKPO~ELIKZ

FROM EKPO

INTO CORRESPONDING FIELDS OF TABLE IEKPO

FOR ALL ENTRIES IN IEKKO

WHERE EKPO~EBELN EQ IEKKO-EBELN

AND EKPO~LOEKZ <> 'L'.

IEKPO1[] = IEKPO[].

LOOP AT IEKKO.

LOOP AT IEKPO WHERE EBELN EQ IEKKO-EBELN.

LOOP AT IEKPO1 WHERE EBELN EQ IEKPO-EBELN AND EBELP EQ IEKPO-EBELP.

STATUS = 1.

IF IEKPO-ELIKZ NE 'X'.

STATUS = '0'.

ELSE.

IEKPO1-CK = 'X'.

MODIFY IEKPO1.

ENDIF.

ENDLOOP.

ENDLOOP.

IF STATUS EQ '0'.

IEKKO-POSTA = 'Open'.

MODIFY IEKKO.

ELSE.

IEKKO-POSTA = 'Close'.

MODIFY IEKKO.

ENDIF.

ENDLOOP.

  • Status consideration based on Quantity delivered and invoiced

SELECT EKET~EBELN

EKET~EBELP

EKET~ETENR

EKET~WEMNG

EKET~MENGE

FROM EKET

INTO CORRESPONDING FIELDS OF TABLE IEKET

FOR ALL ENTRIES IN IEKPO

WHERE EKET~EBELN EQ IEKPO-EBELN

AND EKET~EBELP EQ IEKPO-EBELP.

LOOP AT IEKPO.

LOOP AT IEKET WHERE EBELN EQ IEKPO-EBELN AND EBELP EQ IEKPO-EBELP.

IEKPO-QTYRC = QTYRC + IEKET-WEMNG.

IEKPO-QTYOR = QTYOR + IEKET-MENGE.

ENDLOOP.

MODIFY IEKPO.

ENDLOOP.

LOOP AT IEKKO.

LOOP AT IEKPO WHERE EBELN EQ IEKKO-EBELN.

SUBTOTAL = IEKPO-QTYRC - IEKPO-QTYOR.

ENDLOOP.

IF SUBTOTAL <> '0'.

IEKKO-POSTA = 'Open'.

MODIFY IEKKO.

ELSE.

IEKKO-POSTA = 'Close'.

MODIFY IEKKO.

ENDIF.

ENDLOOP.

LOOP AT IEKKO.

LOOP AT IEKPO WHERE EBELN EQ IEKKO-EBELN.

IEKKO-TOTAL = IEKKO-TOTAL + IEKPO-NETWR.

ENDLOOP.

MODIFY IEKKO.

ENDLOOP.

*Finished Status consideration based on Quantity delivered and invoiced

  • Fetch Vendor Name

LOOP AT IEKKO.

SELECT LFA1~NAME1

INTO IEKKO-NAME1

FROM LFA1

WHERE LFA1~LIFNR EQ IEKKO-LIFNR.

MODIFY IEKKO.

ENDSELECT.

  • Fetch

SELECT T024~EKNAM

INTO IEKKO-EKNAM

FROM T024

WHERE T024~EKGRP EQ IEKKO-EKGRP.

MODIFY IEKKO.

ENDSELECT.

ENDLOOP.

<b></b><b></b>

2 REPLIES 2

Former Member
0 Kudos

Hi

You are using so many nested loops in the code which is not advised

see the sample code for the open PO's based on Vendor

and do accordingly

&----


*& Report ZMM_PO_REPORT

&----


REPORT ZMM_PO_REPORT message-Id yb

NO STANDARD PAGE HEADING

LINE-COUNT 60(1)

LINE-SIZE 230.

************************************************************************

  • D A T A B A S E T A B L E S D E C L A R A T I O N

************************************************************************

TABLES: lfa1, " Vendor Master

t161, " PO Doc Types

t024, " Purchase Groups

ekko. " PO Header

************************************************************************

  • T Y P E S D E C L A R A T I O N S

************************************************************************

  • Purchase Orders Main Structure

TYPES: BEGIN OF s_po,

ebeln TYPE ebeln, " PO No.

ebelp TYPE ebelp, " PO Item

bstyp TYPE bstyp, " PO Category

bukrs TYPE bukrs, " Company Code

bsart TYPE bbsrt, " PO Type

lifnr TYPE lifnr, " Vendor No

ekgrp TYPE bkgrp, " Purchase Group

waers TYPE waers, " Currency

bedat TYPE etbdt, " PO Date

txz01 TYPE txz01, " Material Text

werks TYPE ewerk, " Plant

lgort TYPE lgort_d, " Storage Location

matkl TYPE matkl, " Material Group

menge TYPE bamng, " PR Quantity

meins TYPE bamei, " UOM

bprme TYPE bbprm, " Price Unit

netpr TYPE netpr, " Net price

peinh TYPE peinh, " Price Unit UOM

pstyp TYPE pstyp, " Item Category

knttp TYPE knttp, " Account Assignment Category

END OF s_po.

  • Purchase Orders History Structure

TYPES: BEGIN OF s_account,

ebeln TYPE ebeln, " PO No.

ebelp TYPE ebelp, " PO Item

gjahr TYPE mjahr, " Fiscal Year

belnr TYPE mblnr, " PO Invoice No

menge TYPE menge_d, " PR Quantity

wrbtr TYPE wrbtr, " Price in Local Currency

dmbtr TYPE dmbtr, " Price in Foreign Currency

waers TYPE waers, " Currency

shkzg TYPE shkzg, " Dr/Cr Indicator

END OF s_account.

  • Purchase Orders History Structure(Item Sum)

TYPES: BEGIN OF s_inv_sum,

ebeln TYPE ebeln, " PO No.

ebelp TYPE ebelp, " PO Item

menge TYPE menge_d, " PR Quantity

wrbtr TYPE wrbtr, " Price in Foreign Currency

waers TYPE waers, " Currency

END OF s_inv_sum.

  • Purchase Orders Main Structure

TYPES: BEGIN OF s_rep,

lifnr TYPE lifnr, " Vendor No

ebeln TYPE ebeln, " PO No.

ebelp TYPE ebelp, " PO Item

bstyp TYPE bstyp, " PO Category

bsart TYPE bbsrt, " PO Type

ekgrp TYPE bkgrp, " Purchase Group

waers TYPE waers, " Currency

bedat TYPE etbdt, " PO Date

txz01 TYPE txz01, " Material Text

werks TYPE ewerk, " Plant

lgort TYPE lgort_d, " Storage Location

matkl TYPE matkl, " Material Group

menge TYPE bamng, " PR Quantity

meins TYPE bamei, " UOM

bprme TYPE bbprm, " Price Unit

netpr TYPE netpr, " Net price

peinh TYPE peinh, " Price Unit UOM

pstyp TYPE pstyp, " Item Category

knttp TYPE knttp, " Account Assignment Category

name1 TYPE name1, " Plant

orewr TYPE netpr, " To be Invoiced Price

curr TYPE waers, " Inv Doc Currency

END OF s_rep.

************************************************************************

  • D A T A D E C L A R A T I O N S

************************************************************************

DATA: gv_title1 TYPE sylisel, " Report title

gv_dial. " Color flag

************************************************************************

  • C O N S T A N T S D E C L A R A T I O N S

************************************************************************

CONSTANTS: c_x VALUE 'X', " Flag X

c_h VALUE 'H', " Debit

c_vgabe TYPE vgabe VALUE '2'. " Transaction Type

************************************************************************

  • I N T E R N A L T A B L E S D E C L A R A T I O N S

************************************************************************

DATA: i_po TYPE STANDARD TABLE OF s_po WITH HEADER LINE,

" Purchase Order

i_inv TYPE STANDARD TABLE OF s_inv_sum WITH HEADER LINE,

" PO Invoice Values

i_rep TYPE STANDARD TABLE OF s_rep WITH HEADER LINE,

" PO Invoice Values

i_ekbe TYPE STANDARD TABLE OF s_account WITH HEADER LINE.

" PO Invoice Values

************************************************************************

  • S E L E C T I O N S C R E E N *

************************************************************************

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

SELECT-OPTIONS: s_lifnr FOR lfa1-lifnr MATCHCODE OBJECT kred,

s_ebeln FOR ekko-ebeln MATCHCODE OBJECT mekk,

s_bsart FOR t161-bsart,

s_ekgrp FOR t024-ekgrp,

s_bedat FOR ekko-bedat.

SELECTION-SCREEN END OF BLOCK b1.

************************************************************************

  • I N I T I A L I Z A T I O N *

************************************************************************

INITIALIZATION.

************************************************************************

  • A T S E L E C T I O N - S C R E E N *

************************************************************************

AT SELECTION-SCREEN.

  • Validate the screen fields

PERFORM validate_screen.

************************************************************************

  • S T A R T - O F - S E L E C T I O N *

************************************************************************

START-OF-SELECTION.

  • Fetch main data

PERFORM fetch_data.

************************************************************************

  • T O P - O F - P A G E *

************************************************************************

TOP-OF-PAGE.

  • Header of the List

PERFORM header.

************************************************************************

  • E N D - O F - P A G E *

************************************************************************

  • Footer

END-OF-PAGE.

ULINE.

************************************************************************

  • E N D - O F - S E L E C T I O N *

************************************************************************

END-OF-SELECTION.

  • Display the Report Output data

PERFORM display_data.

***********************************************************************

  • At Line-Selection

***********************************************************************

AT LINE-SELECTION.

  • When double clicked on EBELN display the details of Purchase Doc

PERFORM line_sel.

&----


*& Form validate_screen

&----


  • Validation of Selection Screen fields

----


FORM validate_screen .

  • Validation of Vendor Number

CLEAR lfa1-lifnr.

IF NOT s_lifnr[] IS INITIAL.

SELECT lifnr UP TO 1 ROWS

INTO lfa1-lifnr

FROM lfa1

WHERE lifnr IN s_lifnr.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e000 WITH 'Invalid Vendor'(002).

ENDIF.

ENDIF.

  • Validation of PO Number

CLEAR ekko-ebeln.

IF NOT s_ebeln[] IS INITIAL.

SELECT ebeln UP TO 1 ROWS

INTO ekko-ebeln

FROM ekko

WHERE ebeln IN s_ebeln.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e000 WITH 'Invalid Document Number'(003).

ENDIF.

ENDIF.

  • Validation of PO Document Type

CLEAR t161-bsart.

IF NOT s_bsart[] IS INITIAL.

SELECT bsart UP TO 1 ROWS

INTO t161-bsart

FROM t161

WHERE bsart IN s_bsart.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e000 WITH 'Invalid Purchase Document Type'(004).

ENDIF.

ENDIF.

  • Validation of Purchasing Group

CLEAR t024-ekgrp.

IF NOT s_ekgrp[] IS INITIAL.

SELECT ekgrp UP TO 1 ROWS

INTO t024-ekgrp

FROM t024

WHERE ekgrp IN s_ekgrp.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e000 WITH 'Invalid Purchasing Group'(005).

ENDIF.

ENDIF.

ENDFORM. " validate_screen

&----


*& Form fetch_data

&----


  • Fetching the PO related data from Database Tables

----


FORM fetch_data .

CLEAR i_po.

REFRESH i_po.

SELECT a~ebeln " PO No.

b~ebelp " PO Item

a~bstyp " PO Category

a~bukrs " Company Code

a~bsart " PO Type

a~lifnr " Vendor No

a~ekgrp " Purchase Group

a~waers " Currency

a~bedat " PO Date

b~txz01 " Material Text

b~werks " Plant

b~lgort " Storage Location

b~matkl " Material Group

b~menge " PR Quantity

b~meins " UOM

b~bprme " Price Unit

b~netpr " Net price

b~peinh " Price Unit UOM

b~pstyp " Item Category

b~knttp " Account Assignment Category

INTO TABLE i_po

FROM ekko AS a JOIN ekpo AS b

ON a~ebeln = b~ebeln

WHERE a~ebeln IN s_ebeln AND

a~lifnr IN s_lifnr AND

a~ekgrp IN s_ekgrp AND

a~bsart IN s_bsart AND

a~bedat IN s_bedat.

SORT i_po BY ebeln ebelp.

break-point.

IF NOT i_po[] IS INITIAL.

  • Fetch the PO History/Invoice Details from EKBE Table

CLEAR i_ekbe.

REFRESH i_ekbe.

SELECT ebeln " PO No.

ebelp " PO Item

gjahr " Fiscal Year

belnr " PO Invoice No

menge " PR Quantity

wrbtr " Price in Local Currency

dmbtr " Price in Foreign Currency

waers " Currency

shkzg " Dr/Cr Indicator

INTO TABLE i_ekbe

FROM ekbe

FOR ALL ENTRIES IN i_po

WHERE ebeln = i_po-ebeln AND

ebelp = i_po-ebelp AND

vgabe = c_vgabe.

IF sy-subrc = 0.

SORT i_ekbe BY ebeln ebelp.

LOOP AT i_ekbe.

IF i_ekbe-shkzg = c_h.

i_ekbe-wrbtr = i_ekbe-wrbtr * -1.

ENDIF.

MODIFY i_ekbe.

ENDLOOP.

break-point.

  • Sum up the Item wise Invoice totals

LOOP AT i_ekbe.

AT END OF ebelp.

READ TABLE i_ekbe INDEX sy-tabix.

SUM.

MOVE-CORRESPONDING i_ekbe TO i_inv.

APPEND i_inv.

ENDAT.

CLEAR i_inv.

ENDLOOP.

SORT i_inv BY ebeln ebelp.

break-point.

ENDIF.

ENDIF.

  • Move the Vendor Name and Invoice Values to I_rep Internal Table

LOOP AT i_po.

MOVE-CORRESPONDING i_po TO i_rep.

CLEAR i_inv.

READ TABLE i_inv WITH KEY ebeln = i_po-ebeln

ebelp = i_po-ebelp.

IF sy-subrc = 0.

i_rep-orewr = ( i_po-menge - i_inv-menge ) * i_po-netpr.

i_rep-curr = i_inv-waers.

ELSE.

i_rep-orewr = i_po-menge * i_po-netpr.

i_rep-curr = i_po-waers.

ENDIF.

break-point.

  • Get the Vendor Name

CLEAR lfa1-name1.

SELECT SINGLE name1 FROM lfa1 INTO lfa1-name1

WHERE lifnr = i_po-lifnr.

IF sy-subrc = 0.

i_rep-name1 = lfa1-name1.

ENDIF.

APPEND i_rep.

CLEAR i_rep.

break-point.

ENDLOOP.

SORT i_rep BY lifnr ebeln ebelp.

DELETE i_rep WHERE orewr LE 0.

break-point.

ENDFORM. " fetch_data

&----


*& Form display_data

&----


  • Display the Report Output data

----


FORM display_data .

DATA: lv_flag, " New Flag

lv_rec TYPE i. " No of Records

CLEAR lv_rec.

IF i_rep[] IS INITIAL.

MESSAGE e000 WITH 'No Data found'(022).

ELSE.

LOOP AT i_rep.

  • Toggle Color

PERFORM toggle_color.

IF lv_flag <> space.

NEW-LINE.

ENDIF.

  • At New Purchase Document

AT NEW ebeln.

WRITE:/1 sy-vline, 2(10) i_rep-ebeln INTENSIFIED OFF.

lv_flag = c_x.

lv_rec = lv_rec + 1.

ENDAT.

WRITE: 1 sy-vline,

12 sy-vline,13(4) i_rep-bsart,

17 sy-vline,18(10) i_rep-lifnr,

28 sy-vline,29(35) i_rep-name1,

64 sy-vline,65(4) i_rep-ekgrp,

69 sy-vline,70(10) i_rep-bedat,

80 sy-vline,81(5) i_rep-ebelp,

86 sy-vline,87(40) i_rep-txz01,

127 sy-vline,128(9) i_rep-matkl,

137 sy-vline,138(1) i_rep-pstyp,

139 sy-vline,140(1) i_rep-knttp,

141 sy-vline,142(4) i_rep-werks,

146 sy-vline,147(4) i_rep-lgort,

151 sy-vline,152(13) i_rep-menge UNIT i_rep-meins,

165 sy-vline,166(3) i_rep-meins,

169 sy-vline,170(15) i_rep-netpr CURRENCY i_rep-waers,

185 sy-vline,186(4) i_rep-waers,

190 sy-vline,191(5) i_rep-peinh,

196 sy-vline,197(4) i_rep-bprme,

201 sy-vline,202(15) i_rep-orewr CURRENCY i_rep-curr,

217 sy-vline,218(4) i_rep-curr,

222 sy-vline,223(7) i_rep-bstyp centered,

230 sy-vline.

NEW-LINE.

hide: i_rep-ebeln.

ENDLOOP.

ULINE.

FORMAT COLOR OFF.

WRITE : /2 'Total Number of Purchasing Documents:'(025) COLOR 3,

lv_rec COLOR 3.

ENDIF.

ENDFORM. " display_data

&----


*& Form header

&----


  • Write the Report Header

----


FORM header .

FORMAT RESET.

  • header

WRITE:/1(230) 'LIST OF PURCHASE DOCUMENTS PER VENDOR'(006) CENTERED.

SKIP.

FORMAT COLOR COL_HEADING.

ULINE.

WRITE:/1 sy-vline,2(10) 'Pur.Doc.No'(006) CENTERED,

12 sy-vline,13(4) 'Type'(007),

17 sy-vline,18(10) 'Vendor'(008) CENTERED,

28 sy-vline,29(35) 'Name'(009) CENTERED,

64 sy-vline,65(4) 'PGrp'(010) CENTERED,

69 sy-vline,70(10) 'Doc.Date'(012) CENTERED,

80 sy-vline,81(5) 'Item'(011),

86 sy-vline,87(40) 'Material Short Text'(024) CENTERED,

127 sy-vline,128(9) 'Mat.Group'(013),

137 sy-vline,138(1) 'I',

139 sy-vline,140(1) 'A',

141 sy-vline,142(4) 'Plnt'(014),

146 sy-vline,147(4) 'SLoc'(015),

151 sy-vline,152(13) 'Quantity'(016) CENTERED,

165 sy-vline,166(3) 'UoM'(017),

169 sy-vline,170(15) 'Net Value'(018) CENTERED,

185 sy-vline,186(4) 'Curr'(019),

190 sy-vline,191(5) 'Per'(020),

196 sy-vline,197(4) 'Unit'(021),

201 sy-vline,202(15) 'To be Invoiced'(023) CENTERED,

217 sy-vline,218(4) 'Curr'(019),

222 sy-vline,223(7) 'Doc.Cat'(026),

230 sy-vline.

ULINE.

ENDFORM. " header

&----


*& Form toggle_color

&----


  • This routine alters the color of the records in the list

----


FORM toggle_color.

IF gv_dial = space.

FORMAT COLOR COL_NORMAL INTENSIFIED OFF.

gv_dial = c_x.

ELSE.

FORMAT COLOR 1 INTENSIFIED OFF.

CLEAR gv_dial.

ENDIF.

ENDFORM. " toggle_color

&----


*& Form LINE_SEL

&----


*When double clicked on EBELN field display the details of Purchase Doc

----


FORM line_sel.

CASE sy-lsind.

WHEN '1'.

DATA: lv_field(20),

lv_value(10),

lv_bstyp like i_rep-bstyp.

clear: lv_bstyp,lv_value, lv_field.

GET CURSOR FIELD lv_field VALUE lv_value.

IF lv_field = 'I_REP-EBELN'.

IF NOT lv_value IS INITIAL.

READ LINE sy-index FIELD VALUE i_rep-bstyp

INTO lv_bstyp.

  • READ CURRENT LINE FIELD VALUE i_rep-bstyp INTO lv_bstyp.

if lv_bstyp = 'F'.

SET PARAMETER ID 'BES' FIELD lv_value.

CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.

elseif ( lv_bstyp = 'K' or lv_bstyp = 'L' ).

SET PARAMETER ID 'VRT' FIELD lv_value.

CALL TRANSACTION 'ME33' AND SKIP FIRST SCREEN.

elseif lv_bstyp = 'A'.

SET PARAMETER ID 'ANF' FIELD lv_value.

CALL TRANSACTION 'ME43' AND SKIP FIRST SCREEN.

endif.

ENDIF.

ENDIF.

ENDCASE.

ENDFORM. " line_sel

Regards

Anji

Former Member
0 Kudos

Hi

You are using so many nested loops in the code which is not advised

see the sample code for the open PO's based on Vendor

and do accordingly

&----


*& Report ZMM_PO_REPORT

&----


REPORT ZMM_PO_REPORT message-Id yb

NO STANDARD PAGE HEADING

LINE-COUNT 60(1)

LINE-SIZE 230.

************************************************************************

  • D A T A B A S E T A B L E S D E C L A R A T I O N

************************************************************************

TABLES: lfa1, " Vendor Master

t161, " PO Doc Types

t024, " Purchase Groups

ekko. " PO Header

************************************************************************

  • T Y P E S D E C L A R A T I O N S

************************************************************************

  • Purchase Orders Main Structure

TYPES: BEGIN OF s_po,

ebeln TYPE ebeln, " PO No.

ebelp TYPE ebelp, " PO Item

bstyp TYPE bstyp, " PO Category

bukrs TYPE bukrs, " Company Code

bsart TYPE bbsrt, " PO Type

lifnr TYPE lifnr, " Vendor No

ekgrp TYPE bkgrp, " Purchase Group

waers TYPE waers, " Currency

bedat TYPE etbdt, " PO Date

txz01 TYPE txz01, " Material Text

werks TYPE ewerk, " Plant

lgort TYPE lgort_d, " Storage Location

matkl TYPE matkl, " Material Group

menge TYPE bamng, " PR Quantity

meins TYPE bamei, " UOM

bprme TYPE bbprm, " Price Unit

netpr TYPE netpr, " Net price

peinh TYPE peinh, " Price Unit UOM

pstyp TYPE pstyp, " Item Category

knttp TYPE knttp, " Account Assignment Category

END OF s_po.

  • Purchase Orders History Structure

TYPES: BEGIN OF s_account,

ebeln TYPE ebeln, " PO No.

ebelp TYPE ebelp, " PO Item

gjahr TYPE mjahr, " Fiscal Year

belnr TYPE mblnr, " PO Invoice No

menge TYPE menge_d, " PR Quantity

wrbtr TYPE wrbtr, " Price in Local Currency

dmbtr TYPE dmbtr, " Price in Foreign Currency

waers TYPE waers, " Currency

shkzg TYPE shkzg, " Dr/Cr Indicator

END OF s_account.

  • Purchase Orders History Structure(Item Sum)

TYPES: BEGIN OF s_inv_sum,

ebeln TYPE ebeln, " PO No.

ebelp TYPE ebelp, " PO Item

menge TYPE menge_d, " PR Quantity

wrbtr TYPE wrbtr, " Price in Foreign Currency

waers TYPE waers, " Currency

END OF s_inv_sum.

  • Purchase Orders Main Structure

TYPES: BEGIN OF s_rep,

lifnr TYPE lifnr, " Vendor No

ebeln TYPE ebeln, " PO No.

ebelp TYPE ebelp, " PO Item

bstyp TYPE bstyp, " PO Category

bsart TYPE bbsrt, " PO Type

ekgrp TYPE bkgrp, " Purchase Group

waers TYPE waers, " Currency

bedat TYPE etbdt, " PO Date

txz01 TYPE txz01, " Material Text

werks TYPE ewerk, " Plant

lgort TYPE lgort_d, " Storage Location

matkl TYPE matkl, " Material Group

menge TYPE bamng, " PR Quantity

meins TYPE bamei, " UOM

bprme TYPE bbprm, " Price Unit

netpr TYPE netpr, " Net price

peinh TYPE peinh, " Price Unit UOM

pstyp TYPE pstyp, " Item Category

knttp TYPE knttp, " Account Assignment Category

name1 TYPE name1, " Plant

orewr TYPE netpr, " To be Invoiced Price

curr TYPE waers, " Inv Doc Currency

END OF s_rep.

************************************************************************

  • D A T A D E C L A R A T I O N S

************************************************************************

DATA: gv_title1 TYPE sylisel, " Report title

gv_dial. " Color flag

************************************************************************

  • C O N S T A N T S D E C L A R A T I O N S

************************************************************************

CONSTANTS: c_x VALUE 'X', " Flag X

c_h VALUE 'H', " Debit

c_vgabe TYPE vgabe VALUE '2'. " Transaction Type

************************************************************************

  • I N T E R N A L T A B L E S D E C L A R A T I O N S

************************************************************************

DATA: i_po TYPE STANDARD TABLE OF s_po WITH HEADER LINE,

" Purchase Order

i_inv TYPE STANDARD TABLE OF s_inv_sum WITH HEADER LINE,

" PO Invoice Values

i_rep TYPE STANDARD TABLE OF s_rep WITH HEADER LINE,

" PO Invoice Values

i_ekbe TYPE STANDARD TABLE OF s_account WITH HEADER LINE.

" PO Invoice Values

************************************************************************

  • S E L E C T I O N S C R E E N *

************************************************************************

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

SELECT-OPTIONS: s_lifnr FOR lfa1-lifnr MATCHCODE OBJECT kred,

s_ebeln FOR ekko-ebeln MATCHCODE OBJECT mekk,

s_bsart FOR t161-bsart,

s_ekgrp FOR t024-ekgrp,

s_bedat FOR ekko-bedat.

SELECTION-SCREEN END OF BLOCK b1.

************************************************************************

  • I N I T I A L I Z A T I O N *

************************************************************************

INITIALIZATION.

************************************************************************

  • A T S E L E C T I O N - S C R E E N *

************************************************************************

AT SELECTION-SCREEN.

  • Validate the screen fields

PERFORM validate_screen.

************************************************************************

  • S T A R T - O F - S E L E C T I O N *

************************************************************************

START-OF-SELECTION.

  • Fetch main data

PERFORM fetch_data.

************************************************************************

  • T O P - O F - P A G E *

************************************************************************

TOP-OF-PAGE.

  • Header of the List

PERFORM header.

************************************************************************

  • E N D - O F - P A G E *

************************************************************************

  • Footer

END-OF-PAGE.

ULINE.

************************************************************************

  • E N D - O F - S E L E C T I O N *

************************************************************************

END-OF-SELECTION.

  • Display the Report Output data

PERFORM display_data.

***********************************************************************

  • At Line-Selection

***********************************************************************

AT LINE-SELECTION.

  • When double clicked on EBELN display the details of Purchase Doc

PERFORM line_sel.

&----


*& Form validate_screen

&----


  • Validation of Selection Screen fields

----


FORM validate_screen .

  • Validation of Vendor Number

CLEAR lfa1-lifnr.

IF NOT s_lifnr[] IS INITIAL.

SELECT lifnr UP TO 1 ROWS

INTO lfa1-lifnr

FROM lfa1

WHERE lifnr IN s_lifnr.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e000 WITH 'Invalid Vendor'(002).

ENDIF.

ENDIF.

  • Validation of PO Number

CLEAR ekko-ebeln.

IF NOT s_ebeln[] IS INITIAL.

SELECT ebeln UP TO 1 ROWS

INTO ekko-ebeln

FROM ekko

WHERE ebeln IN s_ebeln.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e000 WITH 'Invalid Document Number'(003).

ENDIF.

ENDIF.

  • Validation of PO Document Type

CLEAR t161-bsart.

IF NOT s_bsart[] IS INITIAL.

SELECT bsart UP TO 1 ROWS

INTO t161-bsart

FROM t161

WHERE bsart IN s_bsart.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e000 WITH 'Invalid Purchase Document Type'(004).

ENDIF.

ENDIF.

  • Validation of Purchasing Group

CLEAR t024-ekgrp.

IF NOT s_ekgrp[] IS INITIAL.

SELECT ekgrp UP TO 1 ROWS

INTO t024-ekgrp

FROM t024

WHERE ekgrp IN s_ekgrp.

ENDSELECT.

IF sy-subrc <> 0.

MESSAGE e000 WITH 'Invalid Purchasing Group'(005).

ENDIF.

ENDIF.

ENDFORM. " validate_screen

&----


*& Form fetch_data

&----


  • Fetching the PO related data from Database Tables

----


FORM fetch_data .

CLEAR i_po.

REFRESH i_po.

SELECT a~ebeln " PO No.

b~ebelp " PO Item

a~bstyp " PO Category

a~bukrs " Company Code

a~bsart " PO Type

a~lifnr " Vendor No

a~ekgrp " Purchase Group

a~waers " Currency

a~bedat " PO Date

b~txz01 " Material Text

b~werks " Plant

b~lgort " Storage Location

b~matkl " Material Group

b~menge " PR Quantity

b~meins " UOM

b~bprme " Price Unit

b~netpr " Net price

b~peinh " Price Unit UOM

b~pstyp " Item Category

b~knttp " Account Assignment Category

INTO TABLE i_po

FROM ekko AS a JOIN ekpo AS b

ON a~ebeln = b~ebeln

WHERE a~ebeln IN s_ebeln AND

a~lifnr IN s_lifnr AND

a~ekgrp IN s_ekgrp AND

a~bsart IN s_bsart AND

a~bedat IN s_bedat.

SORT i_po BY ebeln ebelp.

break-point.

IF NOT i_po[] IS INITIAL.

  • Fetch the PO History/Invoice Details from EKBE Table

CLEAR i_ekbe.

REFRESH i_ekbe.

SELECT ebeln " PO No.

ebelp " PO Item

gjahr " Fiscal Year

belnr " PO Invoice No

menge " PR Quantity

wrbtr " Price in Local Currency

dmbtr " Price in Foreign Currency

waers " Currency

shkzg " Dr/Cr Indicator

INTO TABLE i_ekbe

FROM ekbe

FOR ALL ENTRIES IN i_po

WHERE ebeln = i_po-ebeln AND

ebelp = i_po-ebelp AND

vgabe = c_vgabe.

IF sy-subrc = 0.

SORT i_ekbe BY ebeln ebelp.

LOOP AT i_ekbe.

IF i_ekbe-shkzg = c_h.

i_ekbe-wrbtr = i_ekbe-wrbtr * -1.

ENDIF.

MODIFY i_ekbe.

ENDLOOP.

break-point.

  • Sum up the Item wise Invoice totals

LOOP AT i_ekbe.

AT END OF ebelp.

READ TABLE i_ekbe INDEX sy-tabix.

SUM.

MOVE-CORRESPONDING i_ekbe TO i_inv.

APPEND i_inv.

ENDAT.

CLEAR i_inv.

ENDLOOP.

SORT i_inv BY ebeln ebelp.

break-point.

ENDIF.

ENDIF.

  • Move the Vendor Name and Invoice Values to I_rep Internal Table

LOOP AT i_po.

MOVE-CORRESPONDING i_po TO i_rep.

CLEAR i_inv.

READ TABLE i_inv WITH KEY ebeln = i_po-ebeln

ebelp = i_po-ebelp.

IF sy-subrc = 0.

i_rep-orewr = ( i_po-menge - i_inv-menge ) * i_po-netpr.

i_rep-curr = i_inv-waers.

ELSE.

i_rep-orewr = i_po-menge * i_po-netpr.

i_rep-curr = i_po-waers.

ENDIF.

break-point.

  • Get the Vendor Name

CLEAR lfa1-name1.

SELECT SINGLE name1 FROM lfa1 INTO lfa1-name1

WHERE lifnr = i_po-lifnr.

IF sy-subrc = 0.

i_rep-name1 = lfa1-name1.

ENDIF.

APPEND i_rep.

CLEAR i_rep.

break-point.

ENDLOOP.

SORT i_rep BY lifnr ebeln ebelp.

DELETE i_rep WHERE orewr LE 0.

break-point.

ENDFORM. " fetch_data

&----


*& Form display_data

&----


  • Display the Report Output data

----


FORM display_data .

DATA: lv_flag, " New Flag

lv_rec TYPE i. " No of Records

CLEAR lv_rec.

IF i_rep[] IS INITIAL.

MESSAGE e000 WITH 'No Data found'(022).

ELSE.

LOOP AT i_rep.

  • Toggle Color

PERFORM toggle_color.

IF lv_flag <> space.

NEW-LINE.

ENDIF.

  • At New Purchase Document

AT NEW ebeln.

WRITE:/1 sy-vline, 2(10) i_rep-ebeln INTENSIFIED OFF.

lv_flag = c_x.

lv_rec = lv_rec + 1.

ENDAT.

WRITE: 1 sy-vline,

12 sy-vline,13(4) i_rep-bsart,

17 sy-vline,18(10) i_rep-lifnr,

28 sy-vline,29(35) i_rep-name1,

64 sy-vline,65(4) i_rep-ekgrp,

69 sy-vline,70(10) i_rep-bedat,

80 sy-vline,81(5) i_rep-ebelp,

86 sy-vline,87(40) i_rep-txz01,

127 sy-vline,128(9) i_rep-matkl,

137 sy-vline,138(1) i_rep-pstyp,

139 sy-vline,140(1) i_rep-knttp,

141 sy-vline,142(4) i_rep-werks,

146 sy-vline,147(4) i_rep-lgort,

151 sy-vline,152(13) i_rep-menge UNIT i_rep-meins,

165 sy-vline,166(3) i_rep-meins,

169 sy-vline,170(15) i_rep-netpr CURRENCY i_rep-waers,

185 sy-vline,186(4) i_rep-waers,

190 sy-vline,191(5) i_rep-peinh,

196 sy-vline,197(4) i_rep-bprme,

201 sy-vline,202(15) i_rep-orewr CURRENCY i_rep-curr,

217 sy-vline,218(4) i_rep-curr,

222 sy-vline,223(7) i_rep-bstyp centered,

230 sy-vline.

NEW-LINE.

hide: i_rep-ebeln.

ENDLOOP.

ULINE.

FORMAT COLOR OFF.

WRITE : /2 'Total Number of Purchasing Documents:'(025) COLOR 3,

lv_rec COLOR 3.

ENDIF.

ENDFORM. " display_data

&----


*& Form header

&----


  • Write the Report Header

----


FORM header .

FORMAT RESET.

  • header

WRITE:/1(230) 'LIST OF PURCHASE DOCUMENTS PER VENDOR'(006) CENTERED.

SKIP.

FORMAT COLOR COL_HEADING.

ULINE.

WRITE:/1 sy-vline,2(10) 'Pur.Doc.No'(006) CENTERED,

12 sy-vline,13(4) 'Type'(007),

17 sy-vline,18(10) 'Vendor'(008) CENTERED,

28 sy-vline,29(35) 'Name'(009) CENTERED,

64 sy-vline,65(4) 'PGrp'(010) CENTERED,

69 sy-vline,70(10) 'Doc.Date'(012) CENTERED,

80 sy-vline,81(5) 'Item'(011),

86 sy-vline,87(40) 'Material Short Text'(024) CENTERED,

127 sy-vline,128(9) 'Mat.Group'(013),

137 sy-vline,138(1) 'I',

139 sy-vline,140(1) 'A',

141 sy-vline,142(4) 'Plnt'(014),

146 sy-vline,147(4) 'SLoc'(015),

151 sy-vline,152(13) 'Quantity'(016) CENTERED,

165 sy-vline,166(3) 'UoM'(017),

169 sy-vline,170(15) 'Net Value'(018) CENTERED,

185 sy-vline,186(4) 'Curr'(019),

190 sy-vline,191(5) 'Per'(020),

196 sy-vline,197(4) 'Unit'(021),

201 sy-vline,202(15) 'To be Invoiced'(023) CENTERED,

217 sy-vline,218(4) 'Curr'(019),

222 sy-vline,223(7) 'Doc.Cat'(026),

230 sy-vline.

ULINE.

ENDFORM. " header

&----


*& Form toggle_color

&----


  • This routine alters the color of the records in the list

----


FORM toggle_color.

IF gv_dial = space.

FORMAT COLOR COL_NORMAL INTENSIFIED OFF.

gv_dial = c_x.

ELSE.

FORMAT COLOR 1 INTENSIFIED OFF.

CLEAR gv_dial.

ENDIF.

ENDFORM. " toggle_color

&----


*& Form LINE_SEL

&----


*When double clicked on EBELN field display the details of Purchase Doc

----


FORM line_sel.

CASE sy-lsind.

WHEN '1'.

DATA: lv_field(20),

lv_value(10),

lv_bstyp like i_rep-bstyp.

clear: lv_bstyp,lv_value, lv_field.

GET CURSOR FIELD lv_field VALUE lv_value.

IF lv_field = 'I_REP-EBELN'.

IF NOT lv_value IS INITIAL.

READ LINE sy-index FIELD VALUE i_rep-bstyp

INTO lv_bstyp.

  • READ CURRENT LINE FIELD VALUE i_rep-bstyp INTO lv_bstyp.

if lv_bstyp = 'F'.

SET PARAMETER ID 'BES' FIELD lv_value.

CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.

elseif ( lv_bstyp = 'K' or lv_bstyp = 'L' ).

SET PARAMETER ID 'VRT' FIELD lv_value.

CALL TRANSACTION 'ME33' AND SKIP FIRST SCREEN.

elseif lv_bstyp = 'A'.

SET PARAMETER ID 'ANF' FIELD lv_value.

CALL TRANSACTION 'ME43' AND SKIP FIRST SCREEN.

endif.

ENDIF.

ENDIF.

ENDCASE.

ENDFORM. " line_sel

Regards

Anji