You are on page 1of 6

METHOD call_bapi_vl.

DATA: lt_vbap TYPE SORTED TABLE OF mty_vbap WITH UNIQUE KEY vbe
ln posnr
, lt_vbep TYPE SORTED TABLE OF mty_vbep WITH UNIQUE KEY vbe
ln posnr etenr
, lt_lips TYPE SORTED TABLE OF mty_lips WITH UNIQUE KEY vbe
ln posnr
, lt_request TYPE TABLE OF bapideliciousrequest
, lt_created TYPE TABLE OF bapideliciouscreateditems
, lt_return TYPE TABLE OF bapiret2
, lt_vbpok TYPE TABLE OF vbpok
.
DATA: ls_request LIKE LINE OF lt_request
, ls_vbkok TYPE vbkok
, ls_header TYPE bapiobdlvhdrcon
, ls_header_control TYPE bapiobdlvhdrctrlcon
, ls_vbpok LIKE LINE OF lt_vbpok
.
DATA: ld_error TYPE c
, ld_vbeln TYPE vbeln_va
, ld_has_er TYPE abap_bool VALUE abap_false
.
DATA: lo_exc TYPE REF TO zcx_general_exceptions
.

FIELD-SYMBOLS: <ls_vbap> LIKE LINE OF lt_vbap


, <ls_created> LIKE LINE OF lt_created
, <ls_return> LIKE LINE OF lt_return
, <ls_vbep> LIKE LINE OF lt_vbep
, <ls_lips> LIKE LINE OF lt_lips
.

CREATE OBJECT lo_exc


EXPORTING
textid = zcx_general_exceptions=>general_erros.

IF id_vbeln_va IS INITIAL .
lo_exc->param = 'Ordem não informada'.
RAISE EXCEPTION lo_exc.
ENDIF.

IF id_post_goods_issue EQ 'X' AND id_volum IS INITIAL.


lo_exc->param = 'Volume não infomado'.
RAISE EXCEPTION lo_exc.
ENDIF.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'


EXPORTING
input = id_vbeln_va
IMPORTING
output = ld_vbeln.
IF cd_vbeln_vl IS INITIAL.
SELECT vbeln
posnr
kwmeng
matnr
werks
lgort
INTO TABLE lt_vbap
FROM vbap
WHERE vbeln = ld_vbeln
AND abgru = space.

IF sy-subrc NE 0.
lo_exc->param = 'Não há itens para esta ordem'.
RAISE EXCEPTION lo_exc.
ENDIF.

"Somente o que tem remessa


SELECT vbeln
posnr
etenr
edatu
bmeng
INTO TABLE lt_vbep
FROM vbep
FOR ALL ENTRIES IN lt_vbap
WHERE vbeln EQ lt_vbap-vbeln
AND posnr EQ lt_vbap-posnr.

IF sy-subrc NE 0.
lo_exc->param = 'Não há itens para esta ordem'.
RAISE EXCEPTION lo_exc.
ENDIF.

LOOP AT lt_vbap ASSIGNING <ls_vbap>.


CLEAR ls_request.
LOOP AT lt_vbep ASSIGNING <ls_vbep> WHERE vbeln EQ <ls_vbap>-
vbeln
AND posnr EQ <ls_vbap>-
posnr
AND edatu LE sy-datum.

ls_request-quantity_sales_uom = ls_request-
quantity_sales_uom + <ls_vbep>-bmeng.
ENDLOOP.

IF ls_request-quantity_sales_uom LE 0.
CONTINUE.
ENDIF.

ls_request-quantity_sales_uom = ls_request-quantity_sales_uom.
ls_request-document_numb = <ls_vbap>-vbeln.
ls_request-document_item = <ls_vbap>-posnr.
ls_request-quantity_base__uom = ls_request-quantity_sales_uom.
ls_request-id = 1.
ls_request-document_type = 'A'.
ls_request-delivery_date = sy-datum.
ls_request-material = <ls_vbap>-matnr.
ls_request-plant = <ls_vbap>-werks.
ls_request-stge_loc = <ls_vbap>-lgort.

* ls_request-sales_unit = <ls_vbap>-vrkme.

ls_request-date = sy-datum.
ls_request-goods_issue_date = sy-datum.
ls_request-goods_issue_time = sy-uzeit.
APPEND ls_request TO lt_request.

ENDLOOP.

CALL FUNCTION 'BAPI_DELIVERYPROCESSING_EXEC'


TABLES
request = lt_request
createditems = lt_created
return = lt_return.

ld_has_er = space.
LOOP AT lt_return ASSIGNING <ls_return> WHERE type CA 'AEX'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ld_has_er = 'X'.

lo_exc->param = 'Erro ao gerar Remessa:'.


MESSAGE
ID <ls_return>-id
TYPE <ls_return>-type
NUMBER <ls_return>-number
WITH <ls_return>-message_v1
<ls_return>-message_v2
<ls_return>-message_v3
<ls_return>-message_v4
INTO lo_exc->param2
.
lo_exc->param3 = '#Continue o processo de forma STANDARD'.

RAISE EXCEPTION lo_exc.


ENDLOOP.

IF ld_has_er EQ space.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
READ TABLE lt_created
ASSIGNING <ls_created>
INDEX 1.

IF <ls_created> IS NOT ASSIGNED.


lo_exc->param = 'Remessa não foi criada'.
lo_exc->param2 = 'Continue o processo de forma STANDARD'.
RAISE EXCEPTION lo_exc.
ENDIF.

cd_vbeln_vl = <ls_created>-document_numb.
cd_vbtyp_vl = <ls_created>-document_category_sd.
ENDIF.

**********************************************************************
**
* Picking
**********************************************************************
**
IF id_do_picking EQ abap_true.

SELECT vbeln
posnr
matnr
lfimg
umvkz
umvkn
INTO TABLE lt_lips
FROM lips
WHERE vbeln EQ cd_vbeln_vl.

IF sy-subrc NE 0.
lo_exc->param = 'Remessa'.
lo_exc->param2 = cd_vbeln_vl.
lo_exc->param3 = 'não existe!'.
lo_exc->param4 = 'Continue o processo de forma STANDARD'.
RAISE EXCEPTION lo_exc.
ENDIF.

LOOP AT lt_lips ASSIGNING <ls_lips>.


CLEAR ls_vbpok.
ls_vbpok-vbeln_vl = <ls_lips>-vbeln.
ls_vbpok-posnr_vl = <ls_lips>-posnr.
ls_vbpok-vbeln = <ls_lips>-vbeln.
ls_vbpok-posnn = <ls_lips>-posnr.
ls_vbpok-matnr = <ls_lips>-matnr.
ls_vbpok-pikmg = ( <ls_lips>-lfimg * <ls_lips>-
umvkz ) / <ls_lips>-umvkn.

APPEND ls_vbpok TO lt_vbpok.


ENDLOOP.

ENDIF.

*
************Post goods issue.
IF id_post_goods_issue EQ abap_true
OR id_do_picking EQ abap_true
OR id_volum IS NOT INITIAL.

CLEAR ls_vbkok.
ls_vbkok-vbeln_vl = cd_vbeln_vl.
ls_vbkok-vbtyp_vl = cd_vbtyp_vl.
ls_vbkok-anzpk = id_volum.

ls_vbkok-kzapk = 'X'.
ls_vbkok-wabuc = id_post_goods_issue.

CALL FUNCTION 'WS_DELIVERY_UPDATE_2'


EXPORTING
vbkok_wa = ls_vbkok
update_picking = id_do_picking
synchron = 'X'
if_error_messages_send = space
delivery = cd_vbeln_vl
IMPORTING
ef_error_any = ld_error
TABLES
vbpok_tab = lt_vbpok
EXCEPTIONS
error_message = 4.

IF sy-subrc EQ 0 AND ld_error IS INITIAL.


CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
lo_exc->param = 'Erro ao registrar SM/EM:'.
lo_exc->param2 = cd_vbeln_vl.

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.


MESSAGE
ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1
sy-msgv2
sy-msgv3
sy-msgv4
INTO lo_exc->param3.

lo_exc->param4 = 'Continue o processo de forma STANDARD'.


RAISE EXCEPTION lo_exc.

ENDIF.
ENDIF.

FREE lo_exc.

ENDMETHOD.

You might also like