SAP_SD常用BAPI

本文介绍了一个SAP SD模块中的开票流程实现方法,包括如何从交货单准备开票数据、调用BAPI进行批量开票以及处理开票过程中可能出现的各种异常情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、创建销售订单:BAPI_SALESORDER_CREATEFROMDAT2
2、创建退货销售订单:BAPI_CUSTOMERRETURN_CREATE
3、根据销售订单生成交货单:BAPI_DELIVERYPROCESSING_EXEC
4、修改外向交货单:BAPI_OUTB_DELIVERY_CHANGE
5、修改内向交货单:BAPI_INB_DELIVERY_CHANGE
6、交货单发货过账:WS_DELIVERY_UPDATE
7、VF01/VF04开票:BAPI_BILLINGDOC_CREATEMULTIPLE
DATA: gt_vbak TYPE TABLE OF vbak WITH HEADER LINE,
      gt_vbap TYPE TABLE OF vbap WITH HEADER LINE,
      gt_billingdatain TYPE TABLE OF bapivbrk WITH HEADER LINE,
      gt_conditiondatain TYPE TABLE OF bapikomv WITH HEADER LINE,
      gt_errors TYPE TABLE OF bapivbrkerrors WITH HEADER LINE.


*-------------------------------------------------------------------------
*            BAPI 赋值
*-------------------------------------------------------------------------
FORM frm_ready_billing .

  DATA: lv_message TYPE bapi_msg.

  REFRESH: gt_vbfa[],gt_likp[].

* "找交货单号
  SELECT *
    FROM vbfa
    INTO CORRESPONDING FIELDS OF TABLE gt_vbfa
    FOR ALL ENTRIES IN gt_alv
    WHERE vbelv = gt_alv-vbeln
      AND vbtyp_n = 'J'.

  IF gt_vbfa[] IS NOT INITIAL.
    SELECT *
      FROM likp
      INTO CORRESPONDING FIELDS OF TABLE gt_likp
      FOR ALL ENTRIES IN gt_vbfa
      WHERE vbeln = gt_vbfa-vbeln.
  ENDIF.

  "---同一销售组织、开票类型、客户,统一开票
  SORT gt_alv BY fkara
                 vkorg
                 kunnr.

  SORT gt_vbfa BY vbelv.
  SORT gt_konv BY knumv.
  LOOP AT gt_alv INTO gw_alv.
    READ TABLE gt_vbfa WITH KEY vbelv = gw_alv-vbeln BINARY SEARCH.
    IF sy-subrc = 0.
      LOOP AT gt_vbfa FROM sy-tabix.
        IF gt_vbfa-vbelv <> gw_alv-vbeln.
          EXIT.
        ENDIF.
        gv_count = gv_count + 1.
        gt_billingdatain-ref_doc    = gt_vbfa-vbelv.  "凭证号
        gt_billingdatain-ref_item   = gt_vbfa-posnv.

        gt_billingdatain-doc_number = gt_vbfa-vbeln.  "交货单号
        gt_billingdatain-itm_number = gt_vbfa-posnn.  "


        gt_billingdatain-doc_type   = gw_alv-auart.   "销售凭证类型
        gt_billingdatain-ref_doc_ca = 'C'.            "SD 凭证类别

        gt_billingdatain-ordbilltyp = gw_alv-fkara.   "开票类型
        gt_billingdatain-salesorg   = gw_alv-vkorg.   "销售组织


        READ TABLE gt_vbak WITH KEY vbeln = gw_alv-vbeln BINARY SEARCH.
        IF sy-subrc = 0.
          gt_billingdatain-distr_chan = gt_vbak-vtweg. "分销渠道
          gt_billingdatain-division   = gt_vbak-spart. "产品组

          READ TABLE gt_konv WITH KEY knumv = gt_vbak-knumv BINARY SEARCH.
          IF sy-subrc EQ 0.
            LOOP AT gt_konv FROM sy-tabix.
              IF gt_konv-knumv NE gt_vbak-knumv.
                EXIT.
              ENDIF.
              gt_conditiondatain-data_index = gv_count.
              gt_conditiondatain-cond_curr  = gt_konv-waers.
              APPEND gt_conditiondatain.
            ENDLOOP.
          ENDIF.
        ENDIF.

        gt_billingdatain-ship_to = gw_alv-kunnr. "客户
        gt_billingdatain-sold_to = gt_billingdatain-ship_to.  "售达方
        gt_billingdatain-bill_to = gt_billingdatain-ship_to.  "开票方
        gt_billingdatain-payer   = gt_billingdatain-ship_to.  "付款方
        READ TABLE gt_vbkd WITH KEY vbeln = gw_alv-vbeln BINARY SEARCH.
        IF sy-subrc = 0.
          gt_billingdatain-payment_terms = gt_vbkd-zterm.     "付款方式
          gt_billingdatain-incoterms1 = gt_vbkd-inco1.        "国际贸易条款1
          gt_billingdatain-incoterms2 = gt_vbkd-inco2.        "国际贸易条款2
        ENDIF.
        READ TABLE gt_vbap WITH KEY vbeln = gw_alv-vbeln BINARY SEARCH.
        IF sy-subrc = 0.
          gt_billingdatain-plant = gt_vbap-werks.             "工厂
          gt_billingdatain-material = gt_vbap-matnr.          "物料
          gt_billingdatain-currency = gt_vbap-waerk.          "currency
        ENDIF.
        gt_billingdatain-req_qty       = abs( gt_vbfa-rfmng ). "数量
        gt_billingdatain-sales_unit    = gt_vbfa-meins.        "单位
        gt_billingdatain-bill_date     = pr_sdate.             "开票日期
        gt_billingdatain-price_date    = pr_sdate.             "开票日期

        APPEND gt_billingdatain.

      ENDLOOP.

    ELSE.
      CLEAR gt_vbap.
      " vbap
      READ TABLE gt_vbap WITH KEY vbeln = gw_alv-vbeln BINARY SEARCH.
      IF sy-subrc = 0.
        CLEAR gt_vbap.
        LOOP AT gt_vbap FROM sy-tabix.
          IF gt_vbap-vbeln NE gw_alv-vbeln.
            EXIT.
          ENDIF.
          gv_count = gv_count + 1.

          gt_billingdatain-ref_doc    = gt_vbap-vbeln.  "凭证号
          gt_billingdatain-ref_item   = gt_vbap-posnr.

          gt_billingdatain-doc_number = gt_vbap-vbeln.  "交货单号
          gt_billingdatain-itm_number = gt_vbap-posnr.

          gt_billingdatain-doc_type   = gw_alv-auart.   "销售凭证类型
          gt_billingdatain-ref_doc_ca = 'C'.            "SD 凭证类别

          gt_billingdatain-ordbilltyp = gw_alv-fkara.   "开票类型
          gt_billingdatain-salesorg   = gw_alv-vkorg.   "销售组织


          READ TABLE gt_vbak WITH KEY vbeln = gw_alv-vbeln BINARY SEARCH.
          IF sy-subrc = 0.
            gt_billingdatain-distr_chan = gt_vbak-vtweg. "分销渠道
            gt_billingdatain-division   = gt_vbak-spart. "产品组

            LOOP AT gt_konv FROM sy-tabix.
              IF gt_konv-knumv NE gt_vbak-knumv.
                EXIT.
              ENDIF.
              gt_conditiondatain-data_index = gv_count.
              gt_conditiondatain-cond_curr  = gt_konv-waers.
              APPEND gt_conditiondatain.
            ENDLOOP.
          ENDIF.

          gt_billingdatain-ship_to = gw_alv-kunnr. "客户
          gt_billingdatain-sold_to = gt_billingdatain-ship_to.  "售达方
          gt_billingdatain-bill_to = gt_billingdatain-ship_to.  "开票方
          gt_billingdatain-payer   = gt_billingdatain-ship_to.  "付款方
          READ TABLE gt_vbkd WITH KEY vbeln = gw_alv-vbeln BINARY SEARCH.
          IF sy-subrc = 0.
            gt_billingdatain-payment_terms = gt_vbkd-zterm.  "付款方式
            gt_billingdatain-incoterms1 = gt_vbkd-inco1.     "国际贸易条款1
            gt_billingdatain-incoterms2 = gt_vbkd-inco2.     "国际贸易条款2
          ENDIF.
          READ TABLE gt_vbap WITH KEY vbeln = gw_alv-vbeln BINARY SEARCH.
          IF sy-subrc = 0.
            gt_billingdatain-plant    = gt_vbap-werks.          "工厂
            gt_billingdatain-material = gt_vbap-matnr.       "物料

            gt_billingdatain-currency = gt_vbap-waerk.          "currency
          ENDIF.
          gt_billingdatain-req_qty       = abs( gt_vbap-zmeng ). "数量
          gt_billingdatain-sales_unit    = gt_vbap-zieme.        "单位
          gt_billingdatain-bill_date     = pr_sdate.            "开票日期
          gt_billingdatain-price_date    = pr_sdate.            "开票日期
          APPEND gt_billingdatain.
        ENDLOOP.
      ENDIF.
    ENDIF.

    "---同一销售组织、单据类型、客户,统一开票
    AT END OF kunnr.
      PERFORM frm_order_billing CHANGING lv_message.   "开票
      CLEAR gt_billingdatain[].
      CLEAR gv_count.
      gv_item = 10.
    ENDAT.
  ENDLOOP.

* 开票异常
  IF NOT gv_flagx IS INITIAL.
    CONCATENATE '错误:开票失败,' lv_message INTO lv_message.
    MESSAGE lv_message TYPE cn_fail.
* 开票成功
  ELSEIF gv_flagw = space AND gv_flagx = space.
    MESSAGE s284 DISPLAY LIKE cn_succ.
* 开票出现错误,但可开票,出警告
  ELSEIF NOT gv_flagw IS INITIAL AND gv_flagx = space.
    CONCATENATE '警告:开票成功,' lv_message INTO lv_message.
    MESSAGE lv_message TYPE cn_warn.
  ENDIF.
ENDFORM.                    " FRM_READY_BILLING


*-------------------------------------------------------------------------
*            CALL BAPI
*-------------------------------------------------------------------------
FORM frm_order_billing CHANGING pv_message.

  DATA: lt_success TYPE TABLE OF bapivbrksuccess WITH HEADER LINE,
        lt_return  TYPE TABLE OF bapiret1 WITH HEADER LINE.

  SORT gt_billingdatain BY ref_doc.
  REFRESH: lt_return[],lt_success[],gt_errors[].

* Test Run
  CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE'
    EXPORTING
*     CREATORDATAIN   =
      testrun         = 'X'
*     posting         = 'X'
    TABLES
      billingdatain   = gt_billingdatain
      conditiondatain = gt_conditiondatain
*     CCARDDATAIN     =
*     TEXTDATAIN      =
      errors          = gt_errors
      return          = lt_return
      success         = lt_success.

  IF NOT gt_errors[] IS INITIAL.
    gv_flagx = cn_flagx.
  ENDIF.

  IF NOT lt_return[] IS INITIAL.

    LOOP AT lt_return WHERE type = 'E'.
      CONCATENATE lt_return-message ' ' INTO pv_message.
    ENDLOOP.

    gv_flagw = cn_flagx.
  ENDIF.

  IF gv_flagx IS INITIAL.

* Post Run
    CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE'
      EXPORTING
*       CREATORDATAIN   =
        testrun         = ''
*       posting         = 'X'
      TABLES
        billingdatain   = gt_billingdatain
        conditiondatain = gt_conditiondatain
*       CCARDDATAIN     =
*       TEXTDATAIN      =
        errors          = gt_errors
        return          = lt_return
        success         = lt_success.

    IF NOT lt_success[] IS INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ENDIF.
  ENDIF.

ENDFORM.                    " FRM_ORDER_BILLING
<think>好的,我现在需要处理用户关于SAP BAPI函数的查询。用户希望了解常用BAPI函数列表以及相关的使用教程。首先,我应该先回顾用户提供的引用内容,确保回答准确。 根据引用[1]、[2]、[3],用户提到的BAPI主要涉及PP生产模块、物料主数据操作和MM物料管理模块。我需要将这些信息整理成清晰的分类,比如按模块划分,然后列出对应的BAPI函数及其功能。同时,用户可能还希望知道如何使用这些BAPI,所以需要简要说明使用步骤,比如初始化、参数填充、调用和结果处理。 另外,用户提到了“SAP BAPI使用教程”,这部分需要给出一般性的指导步骤,可能包括事务代码、参数检查、调用方式和错误处理。要注意使用中文,避免技术术语过于复杂,让新手也能理解。 需要检查是否有遗漏的模块或常用BAPI,比如SD或FI模块的常见函数,但根据提供的引用,主要涉及PP、MM和物料管理,所以暂时先集中在这些模块。如果有必要,可以建议用户参考官方文档或培训资料以获取更全面的列表。 最后,生成相关问题时要考虑用户可能的后续疑问,比如参数配置、错误处理、创建订单BAPI等。确保问题覆盖用户可能感兴趣的方面,帮助他们深入学习。 现在需要确保所有BAPI名称用$...$格式,独立步骤或代码块使用$$...$$,但用户提供的示例中没有代码块,所以可能不需要。但如果有示例代码,要用正确格式。同时,回答结构要清晰,分模块列出函数,使用教程部分分步骤说明,最后相关问题要相关且有帮助。</think>### 常用SAP BAPI函数列表及使用指南 #### 1. **物料主数据相关BAPI** - **创建/修改物料主数据** - $BAPI\_MATERIAL\_SAVEDATA$: 用于创建或更新物料主数据,支持多视图维护[^2][^3]。 - $BAPI\_MATERIAL\_SAVEREPLICA$: 扩展物料特定视图(如销售视图、采购视图)[^2]。 - **查询与检查** - $BAPI\_MATERIAL\_EXISTENCECHECK$: 检查物料是否存在。 - $BAPI\_MATERIAL\_GETLIST$: 获取物料主数据明细列表[^3]。 #### 2. **生产模块(PP)相关BAPI** - **参考操作集管理** - $BAPI\_REFSETOFOPERATIONS\_CREATE$: 创建参考操作集(工艺路线模板)[^1]。 - $BAPI\_REFSETOFOPR\_EXISTENCE\_CHK$: 检查参考操作集是否存在。 #### 3. **物料管理(MM)相关BAPI** - **物料组与分类** - $BAPI\_MATERIALGROUP\_GET\_LIST$: 读取物料组清单。 --- ### SAP BAPI使用教程(通用步骤) 1. **初始化调用环境** - 使用事务代码$SE37$测试BAPI函数模块。 2. **参数填充** - 输入参数:如物料编码、工厂、视图名称等,需符合数据字典规范。 - 表参数:如$EXTENSIONIN$用于扩展字段。 3. **调用BAPI并提交事务** ```abap CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA' EXPORTING HEADDATA = ls_headdata TABLES RETURNMESSAGES = lt_return. COMMIT WORK. "提交事务以确保数据保存 ``` 4. **错误处理** - 检查返回表(如$RETURNMESSAGES$)中的消息类型(E=错误,S=成功)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值