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