Skip to Content
0
Former Member
Apr 12, 2007 at 07:59 AM

VAPMA, VBAP, VBUP

458 Views

Hi Everyone,

I'm developing a program where it get open sales order but it slowly running.

Here's my algorithm

1. use VAPMA for select S/O number by material code.

2. get S/O Items from VBAP into t_vbap

3. get open sales order from VBUP into t_vbup

4. Delete t_vbap intems that's not found in t_vbup

5. get D/O from VBFA into t_vbfa

6. LOOP AT t_vbap, each round LOOP AT t_vbfa for sum Qty. in D/O

Could you give me some advice or some FM that return me with open sales order?

Here's my code:

FORM get_open_sales_order.

DATA : back TYPE P VALUE 0 DECIMALS 3,

subtract TYPE P VALUE 0 DECIMALS 3,

do_qty LIKE vbfa-rfmng,

t_tmp_back_ord LIKE t_vbap_vbep OCCURS 0 WITH HEADER LINE.

*--> Index Table

CHECK NOT t_marc[] IS INITIAL.

SELECT * INTO TABLE t_vapma FROM vapma

FOR ALL ENTRIES IN t_marc

WHERE matnr = t_marc-matnr

AND werks = p_werks

AND ( vbeln LIKE '21%' OR " Sales Order

vbeln LIKE '25%' OR " Exchange

vbeln LIKE '26%' ).

CHECK NOT t_vapma[] IS INITIAL.

*--> Sales Document: Item Data

SELECT vbapvbeln vbapposnr vbap~matnr

vbapkwmeng vbapkbmeng vbapklmeng vbapspart

INTO TABLE t_vbap FROM vbap

FOR ALL ENTRIES IN t_vapma

WHERE

vbeln = t_vapma-vbeln AND

posnr = t_vapma-posnr AND

fixmg NE 'X'. " fixed date and qty isn't cal in v_ra

CHECK NOT t_vbap[] IS INITIAL.

  • Select Back Order only

CHECK NOT t_vbap[] IS INITIAL.

SELECT vbupvbeln vbupposnr

INTO TABLE t_vbup FROM vbup

FOR ALL ENTRIES IN t_vbap

WHERE

vbeln = t_vbap-vbeln AND

posnr = t_vbap-posnr AND

vbup~rfsta NE 'C' AND

vbup~rfgsa NE 'C' AND

vbup~lfsta NE 'C' AND

vbup~lfgsa NE 'C' AND

vbup~absta NE 'C'.

CHECK NOT t_vbup[] IS INITIAL.

  • S/O is not Back Order will be deleted

SORT t_vbap BY vbeln posnr.

SORT t_vbup BY vbeln posnr.

LOOP AT t_vbap.

READ TABLE t_vbup WITH KEY vbeln = t_vbap-vbeln

posnr = t_vbap-posnr

BINARY SEARCH.

IF sy-subrc <> 0.

DELETE t_vbap.

ENDIF.

ENDLOOP.

*-- summary qty in D/O

CHECK NOT t_vbap[] IS INITIAL.

SELECT vbfavbelv vbfaposnv vbfavbtyp_n vbfarfmng

vbfamatnr vbfavbeln vbfa~posnn

INTO TABLE t_vbfa FROM vbfa

FOR ALL ENTRIES IN t_vbap

WHERE vbfa~vbtyp_n EQ 'J' "D/O

AND vbfa~rfmng GT 0

AND vbfa~vbelv EQ t_vbap-vbeln

AND vbfa~posnv EQ t_vbap-posnr.

IF t_vbfa[] IS INITIAL.

CLEAR: t_vbap, t_vbap[].

EXIT.

ENDIF.

SORT: t_marc BY werks matnr.

LOOP AT t_vbap.

CLEAR: subtract.

READ TABLE t_marc WITH KEY matnr = t_vbap-matnr.

IF sy-subrc <> 0.

DELETE t_vbap.

CONTINUE.

ELSE.

CLEAR : t_vbfa, do_qty.

LOOP AT t_vbfa WHERE vbelv = t_vbap-vbeln

AND posnv = t_vbap-posnr.

IF t_vbfa-vbtyp_n EQ 'J'. " d/o

do_qty = do_qty + t_vbfa-rfmng.

ENDIF.

ENDLOOP.

t_oso1-spart = t_vbap-spart.

t_oso1-matnr = t_vbap-matnr.

t_oso1-back = t_oso-back.

COLLECT t_oso1.

ENDIF.

ENDLOOP.

DELETE t_oso WHERE back EQ 0.

ENDFORM.

Thanks in advance.

Regards,

Tiwa Noitawee