一 背景说明
SAP BAPI(Business Application Programming Interface)是SAP系统中的一组规范和标准,用于从SAP系统中获取数据、输入数据和更新数据。这些API允许开发者以编程方式与SAP系统交互,而无需编写大量的自定义代码。
1.1 BAPI清单
销售订单创建 | BAPI_BILLINGDOC_CREATEMULTIPLE |
交货单创建 | BAPI_OUTB_DELIVERY_CREATE_SLS |
交货单过帐 | WS_DELIVERY_UPDATE |
销售订单开票 | BAPI_BILLINGDOC_CREATEMULTIPLE |
二 实施步骤
2.1 Copy代码 直接可使用
FORM create_invoice .
* 作为抬头
gt_head = gt_itab.
DELETE gt_head WHERE sel IS INITIAL.
DELETE ADJACENT DUPLICATES FROM gt_head COMPARING code.
DATA i_index TYPE sy-index.
LOOP AT gt_head ASSIGNING FIELD-SYMBOL(<gt_head>).
CLEAR: gt_billingdatain,gt_conditiondatain,gt_return,gt_success,i_index,lv_message.
LOOP AT gt_itab ASSIGNING FIELD-SYMBOL(<gt_itab>) WHERE sel = 'X' AND code = <gt_head>-code.
i_index = i_index + 1.
CLEAR: gw_billingdatain.
gw_billingdatain-ref_doc = <gt_itab>-vgbel."参考单据的单据编号 - 交货单号
gw_billingdatain-ref_item = <gt_itab>-vgpos."参考项目的项目号 - 交货单行号
gw_billingdatain-req_qty = <gt_itab>-fkimg."交货单位
IF <gt_itab>-auart = 'YV01'.
gw_billingdatain-ordbilltyp = 'YBF8'."以销售单位表示的累计订购数量
ENDIF.
*根据DN查出对应的SO销售订单号
SELECT SINGLE vgbel,vgpos INTO ( @gw_billingdatain-doc_number,@gw_billingdatain-itm_number ) FROM lips WHERE vbeln = @<gt_itab>-vgbel AND posnr = @<gt_itab>-vgpos.
gw_billingdatain-ref_doc_ca = 'J'. " ?
APPEND gw_billingdatain TO gt_billingdatain.
CLEAR: gw_conditiondatain.
gw_conditiondatain-data_index = i_index. "行号
gw_conditiondatain-cond_type = 'ZPR3'. "条件类型
gw_conditiondatain-cond_value = <gt_itab>-kbetr."开票金额
gw_conditiondatain-cond_curr = <gt_itab>-waerk."货币
gw_conditiondatain-cond_p_unt = <gt_itab>-umvkn."价格因子
APPEND gw_conditiondatain TO gt_conditiondatain.
ENDLOOP.
CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE'
* EXPORTING
* testrun = 'X'
TABLES
billingdatain = gt_billingdatain
conditiondatain = gt_conditiondatain
return = gt_return
success = gt_success.
LOOP AT gt_return ASSIGNING FIELD-SYMBOL(<gt_return>) WHERE type = 'A'.
<gt_return>-type = 'E'.
ENDLOOP.
READ TABLE gt_return ASSIGNING FIELD-SYMBOL(<rt3>) WITH KEY type = 'E'.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
WAIT UP TO ( 1 / 4 ) SECONDS.
* 将行项目备注写进行项目表
LOOP AT gt_success ASSIGNING FIELD-SYMBOL(<gt_success>).
UPDATE vbrp SET zitem_remark = @<wa_itab>-zitem_remak WHERE vbeln = @<gt_success>-bill_doc AND posnr = @<gt_success>-bill_doc_item.
COMMIT WORK AND WAIT.
ENDLOOP.
* 将地址编码的数据,抬头备注写进抬头表
LOOP AT gt_h_suc INTO DATA(ls_h_suc).
UPDATE vbrk SET zhead_remark = @<wa_itab>-zhead_remark WHERE vbeln = @ls_h_suc-bill_doc.
COMMIT WORK AND WAIT.
ENDLOOP.
ENDLOOP.
ENDFORM.
2.2 VF01开票