创建销售订单的BAPI

创建销售订单的函数有3个:

BAPI_SALESORDER_CREATEFROMDAT2
BAPI_CUSTOMERRETURN_CREATE
SD_SALESDOCUMENT_CREATE

前面2个BAPI都是调用的第三个函数SD_SALESDOCUMENT_CREATE,区别在于里面的业务类型是固定的,BAPI_SALESORDER_CREATEFROMDAT2限制了业务对象为BUS2032,创建退货类型的销售订单时会提示BUS2032与H类型不匹配,需要使用函数SD_SALESDOCUMENT_CREATE来创建。


  DATA: lv_msg(100) TYPE c,
        ls_kna1     TYPE kna1,
        lv_kunnr    TYPE kna1-kunnr,
        ls_zsdt005  TYPE zsdt005,
        lv_vbeln    TYPE bapivbeln-vbeln,
        lv_posnr    TYPE vbap-posnr,
        ls_edit     TYPE lvc_s_styl,
        lt_edit     TYPE lvc_t_styl.

  DATA: ls_head_in        TYPE bapisdhd1,
        ls_head_inx       TYPE bapisdhd1x,
        lt_items_in       TYPE TABLE OF bapisditm,
        ls_items_in       TYPE bapisditm,
        lt_items_inx      TYPE TABLE OF bapisditmx,
        ls_items_inx      TYPE bapisditmx,
        lt_partners       TYPE TABLE OF bapiparnr,
        ls_partners       TYPE bapiparnr,
        lt_schedules_in   TYPE TABLE OF bapischdl,
        ls_schedules_in   TYPE bapischdl,
        lt_schedules_inx  TYPE TABLE OF bapischdlx,
        ls_schedules_inx  TYPE bapischdlx,
        lt_conditions_in  TYPE TABLE OF bapicond,
        ls_conditions_in  TYPE bapicond,
        lt_conditions_inx TYPE TABLE OF bapicondx,
        ls_conditions_inx TYPE bapicondx,
        lt_extensionin    TYPE TABLE OF bapiparex,
        ls_extensionin    TYPE bapiparex,
        lt_text           TYPE TABLE OF bapisdtext,
        ls_text           TYPE bapisdtext,
        lt_return         TYPE TABLE OF bapiret2,
        ls_return         TYPE bapiret2,
        lt_kortab         TYPE TABLE OF mdvu,
        ls_kortab         TYPE mdvu.

  DATA: ls_bape_vbak  TYPE bape_vbak, "屏幕增强字段
        ls_bape_vbakx TYPE bape_vbakx.
  DATA: ls_bape_vbap  TYPE bape_vbap, "屏幕增强字段
        ls_bape_vbapx TYPE bape_vbapx.

*"----------------------------------------------------------------------
* 销售订单抬头数据
*"----------------------------------------------------------------------
  CLEAR gs_data.
  READ TABLE gt_data INTO gs_data WITH KEY zsel = 'X' kunnr = pv_kunnr.
  "客户编号
  lv_kunnr = gs_data-kunnr.

  ls_head_in-purch_no_c = gs_data-remark.        "客户采购订单编号
  ls_head_in-purch_no_s = gs_data-bookingid.       "运达方采购订单编号    PO号
  ls_head_in-doc_type = 'ZJR'.          "销售凭证类型

  ls_head_in-sales_org = '2016'.         "销售组织
  ls_head_in-distr_chan = '10'.        "分销渠道

  ls_head_in-division = '20'.          "产品组
  ls_head_in-doc_date = sy-datum.              "凭证日期,创建日期
  ls_head_in-created_by = sy-uname.            "订单创建人
  ls_head_in-req_date_h = sy-datum.           "交货日期
  ls_head_in-price_date = sy-datum.     "定价日期和汇率
  ls_head_in-currency = 'CNY'.  "SD 凭证货币
  TRANSLATE ls_head_in-currency TO UPPER CASE.

  "销售订单抬头字段确认
  ls_head_inx-purch_no_c = 'X'.                "采购订单编号
  ls_head_inx-purch_no_s = 'X'.                "采购订单编号
  ls_head_inx-doc_type = 'X'.                  "销售凭证类型
  ls_head_inx-sales_org = 'X'.                 "销售组织
  ls_head_inx-distr_chan = 'X'.                "分销渠道
  ls_head_inx-division = 'X'.                  "产品组
  ls_head_inx-doc_date = 'X'.                  "凭证日期
  ls_head_inx-req_date_h = 'X'.                "交货日期
  ls_head_inx-price_date = 'X'.      "定价日期和汇率
  ls_head_inx-currency = 'X'.

***合作伙伴
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = lv_kunnr
    IMPORTING
      output = lv_kunnr.

  ls_partners-partn_role = 'AG'.     "售达方
  ls_partners-partn_numb = lv_kunnr.
  APPEND ls_partners TO lt_partners.
  CLEAR ls_partners.
  ls_partners-partn_role = 'WE'.      "送达方
  ls_partners-partn_numb = lv_kunnr.
  ls_partners-country = 'CN'.

  CLEAR ls_kna1.
  SELECT SINGLE * INTO ls_kna1 FROM kna1 WHERE kunnr =  lv_kunnr.
  ls_partners-name = ls_kna1-name1.
  ls_partners-postl_code = ls_kna1-pstlz.
  ls_partners-city = ls_kna1-ort01.
  ls_partners-langu = ls_kna1-spras.

  "取地址信息
  CLEAR ls_zsdt005.
  SELECT SINGLE *
    FROM zsdt005
    INTO ls_zsdt005
   WHERE lgortno = gs_data-lgortno.

  IF sy-subrc = 0.

    CONCATENATE ls_zsdt005-street
                ls_zsdt005-str_suppl1
                ls_zsdt005-str_suppl2
                ls_zsdt005-str_suppl3
           INTO ls_partners-street.       "送达地址
  ENDIF.

  ls_partners-region = ls_zsdt005-region. "地区
  ls_partners-transpzone = ls_zsdt005-transpzone."运输区域
  TRANSLATE ls_partners-transpzone TO UPPER CASE.

  APPEND ls_partners TO lt_partners.
  CLEAR ls_partners.

  ls_partners-partn_role = 'RE'.     "收票方
  ls_partners-partn_numb = lv_kunnr.
  APPEND ls_partners TO lt_partners.
  CLEAR ls_partners.

  ls_partners-partn_role = 'RG'.       "付款方
  ls_partners-partn_numb = lv_kunnr.
  APPEND ls_partners TO lt_partners.
  CLEAR ls_partners.

** 抬头增强
  CLEAR: ls_extensionin,ls_bape_vbak.
  ls_extensionin-structure = 'BAPE_VBAK'.
  ls_bape_vbak-zppdy = 'CD01'.      "品牌单元
  ls_extensionin+30(960) = ls_bape_vbak.
  APPEND ls_extensionin TO lt_extensionin.


  CLEAR: ls_extensionin,ls_bape_vbakx.
  ls_extensionin-structure = 'BAPE_VBAKX'.
  ls_bape_vbakx-zppdy = 'X'.
  ls_extensionin+30(960) = ls_bape_vbakx.
  APPEND ls_extensionin TO lt_extensionin.


*"----------------------------------------------------------------------
* 销售订单行项目数据
*"----------------------------------------------------------------------
  "可用性检查
  DATA:lv_meins   TYPE mara-meins,
       lv_flag    TYPE bapicm61v-diafl,
       lt_wmdvsx  TYPE TABLE OF bapiwmdvs,
       ls_wmdvsx  TYPE bapiwmdvs,
       lt_zsdt007 TYPE TABLE OF zsdt007,
       ls_zsdt007 TYPE zsdt007,
       lt_wmdvex  TYPE TABLE OF bapiwmdve.

  CLEAR :lv_msg.
  LOOP AT gt_data INTO gs_data WHERE cfmmg > 0.
    lv_posnr = lv_posnr + 10.

    "记录日志
    ls_zsdt007-posnr    = lv_posnr.
    ls_zsdt007-thitemid = gs_data-thitemid.
    ls_zsdt007-thmno    = gs_data-thmno.
    ls_zsdt007-bookingid    = gs_data-bookingid.

    APPEND ls_zsdt007 TO lt_zsdt007.
    CLEAR ls_zsdt007.

    CLEAR :ls_items_in,lv_meins.

    SELECT SINGLE meins INTO lv_meins FROM mara WHERE matnr = gs_data-matnr.

    ls_items_in-itm_number = lv_posnr.                    "销售订单行项目编号
    ls_items_in-material   = gs_data-matnr.             "物料

    ls_items_in-item_categ = 'ZJR'.           "销售凭证项目类别
    ls_items_in-store_loc = gs_data-lgort_i.           "库存地点

    ls_items_in-target_qty = gs_data-cfmmg.                "订单数量

    ls_items_in-sales_unit = lv_meins.                "销售单位

    ls_items_in-plant      = gs_data-werks.             "工厂
    APPEND ls_items_in TO lt_items_in.

    CLEAR ls_items_inx.
    ls_items_inx-itm_number = lv_posnr.                     "销售订单行项目编号
    ls_items_inx-material   = 'X'.             "物料
    ls_items_inx-item_categ = 'X'.                "销售凭证项目类别
    ls_items_inx-target_qty = 'X'.                "订单数量
    ls_items_inx-sales_unit = 'X'.
    ls_items_inx-plant      = 'X'.                  "工厂

    ls_items_inx-store_loc = 'X'.           "库存地点


    APPEND ls_items_inx TO lt_items_inx.

***计划行
    CLEAR  ls_schedules_in.
    ls_schedules_in-itm_number   = lv_posnr.           "销售订单行项目编号
    ls_schedules_in-req_date      =  sy-datum.   "计划交货日期
    ls_schedules_in-req_qty      = gs_data-cfmmg.         "订单数量
    APPEND ls_schedules_in TO lt_schedules_in.

    CLEAR  ls_schedules_inx.
    ls_schedules_inx-itm_number   = lv_posnr.      "销售订单行项目编号
    ls_schedules_inx-req_date      = 'X'.                "计划交货日期
    ls_schedules_inx-req_qty      = 'X'.                "订单数量
    APPEND ls_schedules_inx TO lt_schedules_inx.

    "计划行中数量设置为0
    CLEAR ls_kortab.
    ls_kortab-posnr = lv_posnr.
    ls_kortab-mbdat = sy-datum.
    ls_kortab-vmeng = 0.
    APPEND ls_kortab TO lt_kortab.

  ENDLOOP.

  CHECK lt_items_in IS NOT INITIAL.


*"----------------------------------------------------------------------
* 调用BAPI创建销售订单
*"----------------------------------------------------------------------
  DATA: lv_testrun TYPE bapiflag-bapiflag VALUE 'X'.    "测试运行
**  一般销售订单
  CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
    EXPORTING
      sales_header_in     = ls_head_in
      sales_header_inx    = ls_head_inx
      testrun             = lv_testrun
    TABLES
      return              = lt_return
      sales_items_in      = lt_items_in
      sales_items_inx     = lt_items_inx
      sales_partners      = lt_partners
      sales_schedules_in  = lt_schedules_in
      sales_schedules_inx = lt_schedules_inx
      extensionin         = lt_extensionin.

*  CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
*    EXPORTING
*      order_header_in     = ls_head_in
*      order_header_inx    = ls_head_inx
*      testrun             = lv_testrun
*    TABLES
*      return              = lt_return
*      order_items_in      = lt_items_in
*      order_items_inx     = lt_items_inx
*      order_partners      = lt_partners
*      order_schedules_in  = lt_schedules_in
*      order_schedules_inx = lt_schedules_inx
*      extensionin         = lt_extensionin.

*"----------------------------------------------------------------------
* 消息处理
*"----------------------------------------------------------------------
  CLEAR :lv_msg.
  LOOP AT lt_return INTO ls_return WHERE type CA 'AEX'.
    IF lv_msg IS INITIAL.
      lv_msg = ls_return-message.
    ELSE.
      lv_msg = lv_msg && ls_return-message.
    ENDIF.

    gs_data-status = icon_red_light.    "红色错误
  ENDLOOP.

  IF gs_data-status = icon_red_light.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    IF gs_data-msgtx IS INITIAL.
      gs_data-msgtx = lv_msg  .
    ELSE.
      gs_data-msgtx = gs_data-msgtx && ';' && lv_msg  .
    ENDIF.
  ELSE.
    lv_testrun = ''.

    CLEAR lv_vbeln.

    CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
      EXPORTING
        sales_header_in     = ls_head_in
        sales_header_inx    = ls_head_inx
        testrun             = lv_testrun
      IMPORTING
        salesdocument_ex    = lv_vbeln
      TABLES
        return              = lt_return
        sales_items_in      = lt_items_in
        sales_items_inx     = lt_items_inx
        sales_partners      = lt_partners
        sales_schedules_in  = lt_schedules_in
        sales_schedules_inx = lt_schedules_inx
        extensionin         = lt_extensionin.

*    CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
*      EXPORTING
*        order_header_in     = ls_head_in
*        order_header_inx    = ls_head_inx
*        testrun             = lv_testrun
*      IMPORTING
*        salesdocument       = lv_vbeln
*      TABLES
*        return              = lt_return
*        order_items_in      = lt_items_in
*        order_items_inx     = lt_items_inx
*        order_partners      = lt_partners
*        order_schedules_in  = lt_schedules_in
*        order_schedules_inx = lt_schedules_inx
*        extensionin         = lt_extensionin.

    gs_data-vbeln_i = lv_vbeln.

    CLEAR :lv_msg.
    LOOP AT lt_return INTO ls_return WHERE type CA 'AEX'.
      IF lv_msg IS INITIAL.
        lv_msg = ls_return-message.
      ELSE.
        lv_msg = lv_msg && ls_return-message.
      ENDIF.
      gs_data-status = icon_red_light.    "红色错误
    ENDLOOP.

    IF gs_data-status = icon_red_light.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      IF gs_data-msgtx IS INITIAL.
        gs_data-msgtx = lv_msg  .
      ELSE.
        gs_data-msgtx = gs_data-msgtx && ';' && lv_msg  .
      ENDIF.

    ELSE.
      lv_msg = '换入单' && gs_data-vbeln_i && '创建成功!'.
      gs_data-msgtx = lv_msg  .
      gs_data-status = icon_green_light.

      "记录日志
      LOOP AT lt_zsdt007 INTO ls_zsdt007.
        ls_zsdt007-vbeln = lv_vbeln.
        ls_zsdt007-zzernam = sy-uname.
        ls_zsdt007-zzerdat = sy-datum.
        ls_zsdt007-zzertim = sy-uzeit.
        MODIFY lt_zsdt007 FROM ls_zsdt007.
      ENDLOOP.

      MODIFY zsdt007 FROM TABLE lt_zsdt007.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.

      "途虎接口确认单数为0
      ls_kortab-vbeln = gs_data-vbeln_i.
      MODIFY lt_kortab FROM ls_kortab TRANSPORTING vbeln WHERE vbeln IS INITIAL.

      CLEAR lt_return.

*          CALL FUNCTION 'SD_BACKORDER_UPDATE'
*            TABLES
*              kortab    = lt_kortab
*              et_return = lt_return.

    ENDIF.

  ENDIF.

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值