Difference between revisions of "SAP SD BAPI"
From SapWiki
| Line 165: | Line 165: | ||
ENDFORM.</nowiki> | ENDFORM.</nowiki> | ||
| + | |||
| + | ==Cambiar Lote de Entrega== | ||
| + | <nowiki> FUNCTION z_sd_cambia_lote. | ||
| + | *"---------------------------------------------------------------------- | ||
| + | *"*"Interfase local | ||
| + | *" IMPORTING | ||
| + | *" REFERENCE(I_VBELN) TYPE LIKP-VBELN | ||
| + | *" REFERENCE(I_VBELN_FACTURA) TYPE VBRK-VBELN | ||
| + | *" EXPORTING | ||
| + | *" REFERENCE(E_RETURN) TYPE BAPIRET2_T | ||
| + | *"---------------------------------------------------------------------- | ||
| + | |||
| + | PERFORM clear_entrega USING i_vbeln i_vbeln_factura CHANGING e_return[]. | ||
| + | |||
| + | LOOP AT e_return ASSIGNING FIELD-SYMBOL(<return>) where type = 'E' OR type = 'A'. | ||
| + | MESSAGE ID <return>-ID TYPE <return>-TYPE NUMBER <return>-NUMBER | ||
| + | WITH <return>-message_v1 <return>-message_v2 <return>-message_v3 <return>-message_v4 | ||
| + | INTO <return>-MESSAGE. | ||
| + | ENDLOOP. | ||
| + | IF sy-subrc = 0. | ||
| + | ROLLBACK WORK. | ||
| + | ELSE. | ||
| + | IF NOT line_exists( e_return[ type = 'S' id = 'Z' number = '999' ] ). | ||
| + | CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' | ||
| + | EXPORTING | ||
| + | wait = 'X' | ||
| + | . | ||
| + | ENDIF. | ||
| + | ENDIF. | ||
| + | |||
| + | ENDFUNCTION. | ||
| + | |||
| + | types: BEGIN OF ty_lote, | ||
| + | vbeln type vbfa-vbeln, | ||
| + | posnn type vbfa-posnn, | ||
| + | charg type lips-charg, | ||
| + | UECHA type lips-UECHA, | ||
| + | umvkz TYPE lips-umvkz, | ||
| + | umvkn TYPE lips-umvkn, | ||
| + | umrev TYPE lips-umrev, | ||
| + | lfimg TYPE lips-lfimg, | ||
| + | lgmng TYPE lips-lgmng, | ||
| + | END OF ty_lote. | ||
| + | types ty_lote_t type TABLE OF ty_lote. | ||
| + | |||
| + | data gt_lote type ty_lote_t. | ||
| + | |||
| + | FORM buscar_lote USING p_vbeln_factura p_lips TYPE lips CHANGING p_lote TYPE ty_lote_t . | ||
| + | * buscar pedido | ||
| + | |||
| + | CLEAR p_lote[]. | ||
| + | |||
| + | SELECT SINGLE vbelv INTO @DATA(l_vbelv) FROM vbfa WHERE vbeln = @p_vbeln_factura AND | ||
| + | vbtyp_v = 'C' AND | ||
| + | vbtyp_n = 'M'. | ||
| + | * buscar entregas | ||
| + | SELECT * INTO CORRESPONDING FIELDS OF TABLE p_lote FROM vbfa WHERE vbelv = l_vbelv AND vbtyp_n = 'J'. | ||
| + | |||
| + | LOOP AT p_lote ASSIGNING FIELD-SYMBOL(<ls_lote>). | ||
| + | SELECT SINGLE charg | ||
| + | uecha | ||
| + | umvkz | ||
| + | umvkn | ||
| + | umrev | ||
| + | lfimg | ||
| + | lgmng | ||
| + | INTO CORRESPONDING FIELDS OF <ls_lote> FROM lips WHERE vbeln = <ls_lote>-vbeln | ||
| + | AND posnr = <ls_lote>-posnn. | ||
| + | ENDLOOP. | ||
| + | |||
| + | ENDFORM. | ||
| + | |||
| + | FORM clear_entrega USING p_delivery p_vbeln_factura CHANGING p_return TYPE bapiret2_t. | ||
| + | DATA delivery LIKE bapiobdlvhdrchg-deliv_numb. | ||
| + | DATA header_data LIKE bapiobdlvhdrchg. | ||
| + | DATA header_control LIKE bapiobdlvhdrctrlchg. | ||
| + | DATA item_data TYPE bapiobdlvitemchg OCCURS 1 WITH HEADER LINE. | ||
| + | DATA item_control TYPE bapiobdlvitemctrlchg OCCURS 1 WITH HEADER LINE. | ||
| + | DATA return TYPE bapiret2 OCCURS 1 WITH HEADER LINE. | ||
| + | DATA ti_lips LIKE lips OCCURS 1 WITH HEADER LINE. | ||
| + | |||
| + | delivery = p_delivery. | ||
| + | |||
| + | *header_control | ||
| + | header_control-deliv_numb = p_delivery. | ||
| + | header_data-deliv_numb = p_delivery. | ||
| + | |||
| + | REFRESH ti_lips. | ||
| + | |||
| + | PERFORM buscar_lote USING p_vbeln_factura ti_lips CHANGING gt_lote[]. | ||
| + | LOOP AT gt_lote TRANSPORTING NO FIELDS WHERE charg IS NOT INITIAL. | ||
| + | ENDLOOP. | ||
| + | IF sy-subrc <> 0. | ||
| + | * sin lotes, nada que hacer | ||
| + | return-type = 'S'. | ||
| + | return-id = 'Z'. | ||
| + | return-number = '999'. | ||
| + | APPEND return TO p_return. | ||
| + | RETURN. | ||
| + | ENDIF. | ||
| + | |||
| + | SELECT * FROM lips INTO TABLE ti_lips WHERE vbeln EQ p_delivery. | ||
| + | |||
| + | CHECK ti_lips[] IS NOT INITIAL. | ||
| + | |||
| + | DATA f_lote(1). | ||
| + | |||
| + | CLEAR f_lote. | ||
| + | |||
| + | * verificar si entrega generada debería tener lotes en base a entrega de salida | ||
| + | * original | ||
| + | LOOP AT ti_lips WHERE charg IS INITIAL AND posnr < 900000. | ||
| + | * verificar posicion tiene Part.lotes en entrega de salida original | ||
| + | IF line_exists( gt_lote[ uecha = ti_lips-posnr ] ). | ||
| + | f_lote = 'X'. | ||
| + | ELSE. | ||
| + | * verificar posicion tiene lotes en entrega de salida original | ||
| + | LOOP AT gt_lote TRANSPORTING NO FIELDS WHERE posnn = ti_lips-posnr | ||
| + | AND charg <> ''. | ||
| + | ENDLOOP. | ||
| + | IF sy-subrc = 0. | ||
| + | f_lote = 'X'. | ||
| + | ENDIF. | ||
| + | ENDIF. | ||
| + | ENDLOOP. | ||
| + | |||
| + | IF f_lote <> 'X'. | ||
| + | * entrega generada ya tiene lotes, nada que hacer | ||
| + | return-type = 'S'. | ||
| + | return-id = 'Z'. | ||
| + | return-number = '999'. | ||
| + | APPEND return TO p_return. | ||
| + | RETURN. | ||
| + | ENDIF. | ||
| + | |||
| + | LOOP AT ti_lips WHERE charg IS INITIAL AND posnr < 900000. | ||
| + | *item_data | ||
| + | |||
| + | *** buscar si tiene particion de lotes | ||
| + | LOOP AT gt_lote INTO DATA(ls_lote) WHERE uecha = ti_lips-posnr. | ||
| + | item_data-deliv_numb = ti_lips-vbeln. | ||
| + | item_data-deliv_item = ls_lote-posnn. | ||
| + | item_data-fact_unit_nom = ls_lote-umvkz . | ||
| + | item_data-fact_unit_denom = ls_lote-umvkn. | ||
| + | item_data-conv_fact = ls_lote-umrev. | ||
| + | item_data-dlv_qty = ls_lote-lfimg. | ||
| + | item_data-dlv_qty_imunit = ls_lote-lgmng . | ||
| + | item_data-batch = ls_lote-charg. | ||
| + | item_data-hieraritem = ti_lips-posnr. "The batch split record below delivery item hierary | ||
| + | item_data-usehieritm = '1'. | ||
| + | |||
| + | APPEND item_data. | ||
| + | CLEAR item_data. | ||
| + | |||
| + | item_control-deliv_numb = ti_lips-vbeln. | ||
| + | item_control-deliv_item = ls_lote-posnn. | ||
| + | item_control-chg_delqty = 'X'. | ||
| + | APPEND item_control. | ||
| + | CLEAR item_control. | ||
| + | ENDLOOP. | ||
| + | IF sy-subrc <> 0. | ||
| + | item_data-dlv_qty = ti_lips-lfimg. | ||
| + | item_data-dlv_qty_imunit = ti_lips-lgmng . | ||
| + | ENDIF. | ||
| + | |||
| + | item_data-deliv_numb = ti_lips-vbeln. | ||
| + | item_data-deliv_item = ti_lips-posnr. | ||
| + | item_data-fact_unit_nom = ti_lips-umvkz . | ||
| + | item_data-fact_unit_denom = ti_lips-umvkn. | ||
| + | item_data-conv_fact = ti_lips-umrev. | ||
| + | |||
| + | READ TABLE gt_lote INTO ls_lote WITH KEY posnn = ti_lips-posnr. | ||
| + | item_data-batch = ls_lote-charg. | ||
| + | * PERFORM buscar_lote USING p_vbeln_factura ti_lips CHANGING ITEM_DATA-batch. | ||
| + | |||
| + | APPEND item_data. | ||
| + | CLEAR item_data. | ||
| + | |||
| + | *item_control | ||
| + | item_control-deliv_numb = ti_lips-vbeln. | ||
| + | item_control-deliv_item = ti_lips-posnr. | ||
| + | item_control-chg_delqty = 'X'. | ||
| + | APPEND item_control. | ||
| + | CLEAR item_control. | ||
| + | |||
| + | ENDLOOP. | ||
| + | |||
| + | CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE' | ||
| + | EXPORTING | ||
| + | header_data = header_data | ||
| + | header_control = header_control | ||
| + | delivery = delivery | ||
| + | TABLES | ||
| + | item_data = item_data | ||
| + | item_control = item_control | ||
| + | return = p_return | ||
| + | EXCEPTIONS | ||
| + | OTHERS = 1. | ||
| + | |||
| + | ENDFORM. " CLEAR_ENTREGA</nowiki> | ||
Revision as of 16:16, 4 April 2020
Crear Factura VF01
FUNCTION z_sd_crea_factura.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(I_VBELN) TYPE LIKP-VBELN
*" REFERENCE(I_FKART) TYPE RV60A-FKART
*" REFERENCE(I_REF_DOC_CA) TYPE VBTYP_V
*" REFERENCE(I_DOC_TYPE) TYPE AUART
*" EXPORTING
*" REFERENCE(E_VBELN) TYPE VBRK-VBELN
*" REFERENCE(E_RETURN) TYPE BAPIRET2_T
*"----------------------------------------------------------------------
data lt_return1 type bapiret1_tab.
DATA ld_mode(1) VALUE 'A'. " 'N'.
DATA lt_mtxt LIKE TABLE OF bdcmsgcoll WITH HEADER LINE.
DATA ls_return TYPE bapiret2.
DATA ls_return1 TYPE bapiret1.
CLEAR: e_return[],
bdcdata[],
lt_mtxt[],
e_vbeln.
PERFORM crea_factura USING i_fkart
i_vbeln
i_ref_doc_ca
i_doc_type
CHANGING e_vbeln
lt_return1[].
loop at lt_return1 into ls_return1.
MOVE-CORRESPONDING ls_return1 TO ls_return.
APPEND ls_return TO e_return.
ENDLOOP.
ENDFUNCTION.
FORM crea_factura USING p_fkart
p_vbeln
p_ref_doc_ca
p_doc_type
CHANGING p_vbeln_factuta
p_return TYPE bapiret1_tab.
DATA lt_datain TYPE STANDARD TABLE OF bapivbrk WITH HEADER LINE.
DATA lt_return TYPE STANDARD TABLE OF bapiret1 WITH HEADER LINE.
DATA lt_success TYPE STANDARD TABLE OF bapivbrksuccess WITH HEADER LINE.
CLEAR: lt_datain, lt_datain[],
lt_return, lt_return[],
lt_success, lt_success[].
lt_datain-ref_doc = p_vbeln.
lt_datain-ref_doc_ca = p_ref_doc_ca. " ls_likp-vbtyp.
lt_datain-doc_type = p_doc_type. "ls_likp-lfart.
lt_datain-ordbilltyp = p_fkart.
APPEND lt_datain.
CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE'
TABLES
billingdatain = lt_datain
return = lt_return
success = lt_success.
READ TABLE lt_success INDEX 1.
IF sy-subrc = 0.
p_vbeln_factuta = lt_success-bill_doc.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'
.
endif.
p_return[] = lt_return[].
ENDFORM.
Contabilizar SM - VL02N->Contabilizar SM
FUNCTION Z_SD_CONT_SAL_MERC.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(I_VBELN) TYPE LIKP-VBELN
*" EXPORTING
*" REFERENCE(E_VBELN) TYPE LIKP-VBELN
*" REFERENCE(E_RETURN) TYPE BAPIRET2_T
*"----------------------------------------------------------------------
CLEAR: e_RETURN[],
bdcdata[],
lt_mtxt[],
e_vbeln.
perFORM cont_sm USING i_vbeln CHANGING e_return.
ENDFUNCTION.
FORM cont_sm USING p_vbeln CHANGING p_return type bapiret2_t.
DATA: ls_likp TYPE likp,
ls_vbkok TYPE vbkok,
lv_fail,
lt_prott TYPE STANDARD TABLE OF prott
WITH HEADER LINE.
data ls_return type bapiret2.
SELECT SINGLE * INTO ls_likp FROM likp
WHERE vbeln = p_vbeln.
CHECK NOT ls_likp IS INITIAL.
ls_vbkok-vbeln_vl = ls_likp-vbeln.
ls_vbkok-wabuc = 'X'.
SET UPDATE TASK LOCAL.
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
vbkok_wa = ls_vbkok
synchron = 'X'
no_messages_update = ' '
update_picking = 'X'
COMMIT = ' '
delivery = ls_likp-vbeln
nicht_sperren = 'X'
if_error_messages_send_0 = 'X'
TABLES
prot = lt_prott
EXCEPTIONS
error_message = 1
OTHERS = 2.
IF sy-subrc <> 0.
ROLLBACK WORK.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO ls_return-message.
append ls_return to p_return.
EXIT.
ELSE.
LOOP AT lt_prott.
CHECK lt_prott-msgty = 'E' OR
lt_prott-msgty = 'A'.
lv_fail = 'X'.
ENDLOOP.
IF lv_fail IS INITIAL.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
MOVE lt_prott-msgid TO ls_return-ID.
MOVE lt_prott-msgty TO ls_return-TYPE.
MOVE lt_prott-msgno TO ls_return-NUMBER.
MOVE lt_prott-msgv1 TO ls_return-MESSAGE_v1.
MOVE lt_prott-msgv2 TO ls_return-MESSAGE_v2.
MOVE lt_prott-msgv3 TO ls_return-MESSAGE_v3.
MOVE lt_prott-msgv4 TO ls_return-MESSAGE_v4.
MESSAGE ID lt_prott-MSGID TYPE lt_prott-MSGTY NUMBER lt_prott-MSGNo
WITH lt_prott-MSGV1 lt_prott-MSGV2 lt_prott-MSGV3 lt_prott-MSGV4
INTO ls_return-MESSAGE.
APPEND ls_return TO p_return.
EXIT.
ENDIF.
ENDIF.
ENDFORM.
Cambiar Lote de Entrega
FUNCTION z_sd_cambia_lote.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(I_VBELN) TYPE LIKP-VBELN
*" REFERENCE(I_VBELN_FACTURA) TYPE VBRK-VBELN
*" EXPORTING
*" REFERENCE(E_RETURN) TYPE BAPIRET2_T
*"----------------------------------------------------------------------
PERFORM clear_entrega USING i_vbeln i_vbeln_factura CHANGING e_return[].
LOOP AT e_return ASSIGNING FIELD-SYMBOL(<return>) where type = 'E' OR type = 'A'.
MESSAGE ID <return>-ID TYPE <return>-TYPE NUMBER <return>-NUMBER
WITH <return>-message_v1 <return>-message_v2 <return>-message_v3 <return>-message_v4
INTO <return>-MESSAGE.
ENDLOOP.
IF sy-subrc = 0.
ROLLBACK WORK.
ELSE.
IF NOT line_exists( e_return[ type = 'S' id = 'Z' number = '999' ] ).
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
.
ENDIF.
ENDIF.
ENDFUNCTION.
types: BEGIN OF ty_lote,
vbeln type vbfa-vbeln,
posnn type vbfa-posnn,
charg type lips-charg,
UECHA type lips-UECHA,
umvkz TYPE lips-umvkz,
umvkn TYPE lips-umvkn,
umrev TYPE lips-umrev,
lfimg TYPE lips-lfimg,
lgmng TYPE lips-lgmng,
END OF ty_lote.
types ty_lote_t type TABLE OF ty_lote.
data gt_lote type ty_lote_t.
FORM buscar_lote USING p_vbeln_factura p_lips TYPE lips CHANGING p_lote TYPE ty_lote_t .
* buscar pedido
CLEAR p_lote[].
SELECT SINGLE vbelv INTO @DATA(l_vbelv) FROM vbfa WHERE vbeln = @p_vbeln_factura AND
vbtyp_v = 'C' AND
vbtyp_n = 'M'.
* buscar entregas
SELECT * INTO CORRESPONDING FIELDS OF TABLE p_lote FROM vbfa WHERE vbelv = l_vbelv AND vbtyp_n = 'J'.
LOOP AT p_lote ASSIGNING FIELD-SYMBOL(<ls_lote>).
SELECT SINGLE charg
uecha
umvkz
umvkn
umrev
lfimg
lgmng
INTO CORRESPONDING FIELDS OF <ls_lote> FROM lips WHERE vbeln = <ls_lote>-vbeln
AND posnr = <ls_lote>-posnn.
ENDLOOP.
ENDFORM.
FORM clear_entrega USING p_delivery p_vbeln_factura CHANGING p_return TYPE bapiret2_t.
DATA delivery LIKE bapiobdlvhdrchg-deliv_numb.
DATA header_data LIKE bapiobdlvhdrchg.
DATA header_control LIKE bapiobdlvhdrctrlchg.
DATA item_data TYPE bapiobdlvitemchg OCCURS 1 WITH HEADER LINE.
DATA item_control TYPE bapiobdlvitemctrlchg OCCURS 1 WITH HEADER LINE.
DATA return TYPE bapiret2 OCCURS 1 WITH HEADER LINE.
DATA ti_lips LIKE lips OCCURS 1 WITH HEADER LINE.
delivery = p_delivery.
*header_control
header_control-deliv_numb = p_delivery.
header_data-deliv_numb = p_delivery.
REFRESH ti_lips.
PERFORM buscar_lote USING p_vbeln_factura ti_lips CHANGING gt_lote[].
LOOP AT gt_lote TRANSPORTING NO FIELDS WHERE charg IS NOT INITIAL.
ENDLOOP.
IF sy-subrc <> 0.
* sin lotes, nada que hacer
return-type = 'S'.
return-id = 'Z'.
return-number = '999'.
APPEND return TO p_return.
RETURN.
ENDIF.
SELECT * FROM lips INTO TABLE ti_lips WHERE vbeln EQ p_delivery.
CHECK ti_lips[] IS NOT INITIAL.
DATA f_lote(1).
CLEAR f_lote.
* verificar si entrega generada debería tener lotes en base a entrega de salida
* original
LOOP AT ti_lips WHERE charg IS INITIAL AND posnr < 900000.
* verificar posicion tiene Part.lotes en entrega de salida original
IF line_exists( gt_lote[ uecha = ti_lips-posnr ] ).
f_lote = 'X'.
ELSE.
* verificar posicion tiene lotes en entrega de salida original
LOOP AT gt_lote TRANSPORTING NO FIELDS WHERE posnn = ti_lips-posnr
AND charg <> ''.
ENDLOOP.
IF sy-subrc = 0.
f_lote = 'X'.
ENDIF.
ENDIF.
ENDLOOP.
IF f_lote <> 'X'.
* entrega generada ya tiene lotes, nada que hacer
return-type = 'S'.
return-id = 'Z'.
return-number = '999'.
APPEND return TO p_return.
RETURN.
ENDIF.
LOOP AT ti_lips WHERE charg IS INITIAL AND posnr < 900000.
*item_data
*** buscar si tiene particion de lotes
LOOP AT gt_lote INTO DATA(ls_lote) WHERE uecha = ti_lips-posnr.
item_data-deliv_numb = ti_lips-vbeln.
item_data-deliv_item = ls_lote-posnn.
item_data-fact_unit_nom = ls_lote-umvkz .
item_data-fact_unit_denom = ls_lote-umvkn.
item_data-conv_fact = ls_lote-umrev.
item_data-dlv_qty = ls_lote-lfimg.
item_data-dlv_qty_imunit = ls_lote-lgmng .
item_data-batch = ls_lote-charg.
item_data-hieraritem = ti_lips-posnr. "The batch split record below delivery item hierary
item_data-usehieritm = '1'.
APPEND item_data.
CLEAR item_data.
item_control-deliv_numb = ti_lips-vbeln.
item_control-deliv_item = ls_lote-posnn.
item_control-chg_delqty = 'X'.
APPEND item_control.
CLEAR item_control.
ENDLOOP.
IF sy-subrc <> 0.
item_data-dlv_qty = ti_lips-lfimg.
item_data-dlv_qty_imunit = ti_lips-lgmng .
ENDIF.
item_data-deliv_numb = ti_lips-vbeln.
item_data-deliv_item = ti_lips-posnr.
item_data-fact_unit_nom = ti_lips-umvkz .
item_data-fact_unit_denom = ti_lips-umvkn.
item_data-conv_fact = ti_lips-umrev.
READ TABLE gt_lote INTO ls_lote WITH KEY posnn = ti_lips-posnr.
item_data-batch = ls_lote-charg.
* PERFORM buscar_lote USING p_vbeln_factura ti_lips CHANGING ITEM_DATA-batch.
APPEND item_data.
CLEAR item_data.
*item_control
item_control-deliv_numb = ti_lips-vbeln.
item_control-deliv_item = ti_lips-posnr.
item_control-chg_delqty = 'X'.
APPEND item_control.
CLEAR item_control.
ENDLOOP.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
header_data = header_data
header_control = header_control
delivery = delivery
TABLES
item_data = item_data
item_control = item_control
return = p_return
EXCEPTIONS
OTHERS = 1.
ENDFORM. " CLEAR_ENTREGA