ABAP 销售订单创建BAPI:BAPI_SALESORDER_CREATEFROMDAT2总结

1、运用过程的问题与原因

1.1报错:请输入买方或运达方

在这里插入图片描述
原因:其实就是订单抬头没有买方,主要是因为销售订单合作伙伴表ORDER_PARTNERS中字段ITM_NUMBER销售和分销凭证的项目号给赋值了,则这些数据就是项目数据的合作伙伴了,因此抬头合作伙伴信息就缺失了。
解决办法:在给销售订单合作伙伴表ORDER_PARTNERS赋值时,字段ITM_NUMBER不用赋值即可。

1.2销售订单虽然创建成功,但是订单数量却缺失了

在这里插入图片描述
在这里插入图片描述
原因:本人一开始以为BAPI:BAPI_SALESORDER_CREATEFROMDAT2中行项目表ORDER_ITEMS_IN中字段TARGET_QTY目标数量进行赋值就可以了。计划行的没有进行赋值,则会出现上面的情况。
解决办法:把订单数量对计划行表ORDER_SCHEDULES_IN中字段REQ_QTY进行赋值。

1.3创建退货订单时报错:不允许业务对象 BUS2032 和销售凭证类别 H 的组合

在这里插入图片描述
原因:这是因为BAPI_SALESORDER_CREATEFROMDAT2中调用了BAPI: SD_SALESDOCUMENT_CREATE,而SD_SALESDOCUMENT_CREATE中业务对象business_object定义为BUS2032,而且业务对象BUS2032不能创建退货订单。
在这里插入图片描述
解决办法:创建退货订单时,不用BAPI:BAPI_SALESORDER_CREATEFROMDAT2进行创建,改用BAPI: SD_SALESDOCUMENT_CREATE进

2、附赠用BAPI创建销售订单源码

form frm_va01_bapi.
  data:l_order_header_in      like bapisdhd1, "销售订单抬头
       l_order_header_inx     like bapisdhd1x, "销售订单抬头更新
       gt_return              like table of bapiret2 with header line, "返回参数
       gt_order_items_in      like table of bapisditm with header line, "销售订单项目
       gt_order_items_inx     like table of bapisditmx with header line, "销售订单项目更新
       gt_order_partners      like table of bapiparnr with header line, "销售订单合作伙伴
       l_sender               like bapi_sender, "发送人逻辑系统
       l_salesdocumentin      like bapivbeln-vbeln, "销售订单
       l_logic_switch         like bapisdls, "逻辑切换的 SD 复选框
       l_order_conditions_in  like table of bapicond with header line, "条件类型
       l_order_conditions_inx like table of bapicondx with header line, "条件类型更新
       l_salesdocument        like bapivbeln-vbeln, "BAPI 销售订单
       gt_order_schedules_in  like table of bapischdl with header line, "计划行
       gt_order_schedules_inx like table of bapischdlx with header line, "计划行更新。
       GT_ORDER_TEXT LIKE TABLE OF BAPISDTEXT WITH HEADER LINE."文本
  data:cp_eind type string,
       l_w     type string,
       i_mes   type char200.


  "记录销售订单抬头,用作循环使用
  data:begin of gt_head occurs 0,
         index type string, "销售订单
         auart type string, "销售凭证类型
         vkorg type string, "销售组织
         vtweg type string, "分销渠道
         spart type string, "产品组
         vkbur type string, "销售办事处
         bstnk type string, "客户参考
         augru type string, "订货原因
         kunnr type string, "售达方
         kunag type string, "送达方
          Remarks TYPE STRING,
       end of gt_head.

  "获取到选中的订单
  loop at gt_out where box = 'X'.
    gt_head-index = gt_out-index.
    gt_head-auart = gt_out-auart.
    gt_head-vkorg = gt_out-vkorg.
    gt_head-vtweg = gt_out-vtweg.
    gt_head-spart = gt_out-spart.
    gt_head-vkbur = gt_out-vkbur.
    gt_head-bstnk = gt_out-bstnk.
    gt_head-augru = gt_out-augru.
    gt_head-kunnr = gt_out-kunnr .
    gt_head-kunag = gt_out-kunag.
    GT_HEAD-Remarks = GT_OUT-Remarks.
    append gt_head.
  endloop.
  "删除重复项
  delete adjacent duplicates from gt_head comparing all fields.
  sort gt_head.
*  break k99997.

  "进行数据处理
  loop at gt_head.
    "销售订单
    clear l_salesdocumentin.
*  L_SALESDOCUMENTIN = GT_HEAD-INDEX.
    l_logic_switch-pricing = 'G'.
    "销售订单抬头
    clear l_order_header_in.
    l_order_header_in-doc_type = gt_head-auart."销售订单凭证类型
    l_order_header_in-sales_org = gt_head-vkorg."销售组织
    l_order_header_in-distr_chan = gt_head-vtweg."分销渠道
    l_order_header_in-division = gt_head-spart."产品组
    l_order_header_in-sales_off = gt_head-vkbur."销售办事处
    l_order_header_in-purch_no_c = gt_head-bstnk."客户参考
    l_order_header_in-req_date_h = sy-datum."要求的交货日期
    l_order_header_in-doc_date = sy-datum."凭证日期(接收/发送)

    if gt_head-auart = 'ZRE' or gt_head-auart = 'ZFR'.
      l_order_header_in-ord_reason = gt_head-augru."订单原因
    endif.

    "抬头更新
    clear l_order_header_inx.
    l_order_header_inx-doc_type = 'X'.
    l_order_header_inx-sales_org = 'X'.
    l_order_header_inx-distr_chan = 'X'.
    l_order_header_inx-division = 'X'.
    l_order_header_inx-sales_off = 'X'.
    l_order_header_inx-purch_no_c = 'X'.
    l_order_header_inx-req_date_h = 'X'.
    l_order_header_inx-doc_date = 'X'.
    if gt_out-auart = 'ZRE'.
      l_order_header_inx-ord_reason = 'X'.
    endif.
    "销售合作伙伴

    gt_order_partners-partn_role = 'AG'."售达方
    gt_order_partners-partn_numb = gt_head-kunnr."售达方编号
*    GT_ORDER_PARTNERS-ITM_NUMBER = GT_OUT-POSNR."销售订单项目
    append gt_order_partners.
    clear gt_order_partners.

    gt_order_partners-partn_role = 'WE'."送达方
    gt_order_partners-partn_numb = gt_head-kunag."送达方编号
*    GT_ORDER_PARTNERS-ITM_NUMBER = GT_OUT-POSNR."销售订单项目
    append gt_order_partners.
    clear gt_order_partners.

    "抬头备注
    GT_ORDER_TEXT-TEXT_ID = 'Z003'."文本ID
    GT_ORDER_TEXT-LANGU = '1'."语言
    GT_ORDER_TEXT-TEXT_LINE = gt_head-Remarks."文本
    APPEND GT_ORDER_TEXT.
    CLEAR GT_ORDER_TEXT.



    loop at gt_out where box = 'X' and index = gt_head-index.
      call function 'CONVERSION_EXIT_CUNIT_INPUT'
        exporting
          input  = gt_out-kmein
        importing
          output = gt_out-kmein.



      "销售订单项目
      gt_order_items_in-itm_number = gt_out-posnr."销售订单项目
      gt_order_items_in-material = gt_out-matnr."物料编码
      gt_order_items_in-plant = gt_out-werks."工厂
      gt_order_items_in-store_loc = gt_out-lgort."库存地点
      gt_order_items_in-target_qty = gt_out-kwmeng."目标数量
      gt_order_items_in-price_date = gt_out-prsdt."行项目定价日期
      append gt_order_items_in.
      clear gt_order_items_in.
      "销售订单项目更新

      gt_order_items_inx-itm_number = gt_out-posnr.
      gt_order_items_inx-material = 'X'.
      gt_order_items_inx-plant = 'X'.
      gt_order_items_inx-store_loc = 'X'.
      gt_order_items_inx-target_qty = 'X'.
      gt_order_items_inx-price_date = 'X'.
      append gt_order_items_inx.
      clear gt_order_items_inx.

      "计划行
      gt_order_schedules_in-itm_number = gt_out-posnr."销售凭证项目
      gt_order_schedules_in-req_qty = gt_out-kwmeng."各销售单位订单数量
      append gt_order_schedules_in.
      clear gt_order_schedules_in.
      gt_order_schedules_inx-itm_number = gt_out-posnr."销售凭证项目
      gt_order_schedules_inx-req_qty = 'X'."各销售单位订单数量
      append gt_order_schedules_inx.
      clear gt_order_schedules_inx.

      "条件类型
      l_order_conditions_in-itm_number = gt_out-posnr."销售订单项目
      l_order_conditions_in-cond_type = gt_out-kschl."条件类型
      l_order_conditions_in-cond_value = gt_out-kbetr."条件金额
      l_order_conditions_in-currency = gt_out-konwa."条件货币
      l_order_conditions_in-cond_unit = gt_out-kmein ."条件单位
      l_order_conditions_in-cond_p_unt = gt_out-kpein."条件定价单位
      l_order_conditions_in-curr_iso = gt_out-konwa."IOS代码货币
      append l_order_conditions_in.
      clear l_order_conditions_in.
      "条件类型更新
      l_order_conditions_inx-itm_number = gt_out-posnr."销售订单项目
      l_order_conditions_inx-cond_type = gt_out-kschl."条件类型
      l_order_conditions_inx-cond_value = 'X'."条件金额
      l_order_conditions_inx-currency = 'X'."条件货币
      l_order_conditions_inx-cond_unit = 'X' ."条件单位
      l_order_conditions_inx-cond_p_unt = 'X'."条件定价单位
      append l_order_conditions_inx.
      clear l_order_conditions_inx.

          "项目备注
    GT_ORDER_TEXT-TEXT_ID = 'Z005'."文本 ID
    GT_ORDER_TEXT-ITM_NUMBER = gt_out-posnr."销售订单项目
    GT_ORDER_TEXT-LANGU = '1'."语言代码
    GT_ORDER_TEXT-TEXT_LINE = gt_out-LIN."文本行
    APPEND GT_ORDER_TEXT.
    CLEAR GT_ORDER_TEXT.


    endloop.

    "调用销售订单创建BAPI
    if gt_head-auart = 'ZRE'.
      "由于BAPI:BAPI_SALESORDER_CREATEFROMDAT2把业务对象定义死了, 所以退货订单用此BAPI进行创建
      call function 'SD_SALESDOCUMENT_CREATE'
        exporting
*         salesdocument        = salesdocumentin
          sales_header_in      = l_order_header_in
          sales_header_inx     = l_order_header_inx
*         sender               = sender
*         binary_relationshiptype = binary_relationshiptype
*         int_number_assignment   = int_number_assignment
*         behave_when_error    = behave_when_error
          logic_switch         = l_logic_switch
*         business_object      = 'BUS2032'
*         testrun              = testrun
*         convert_parvw_auart  = convert
        importing
          salesdocument_ex     = l_salesdocument
        tables
          return               = gt_return[]
          sales_items_in       = gt_order_items_in[]
          sales_items_inx      = gt_order_items_inx[]
          sales_partners       = gt_order_partners[]
          sales_schedules_in   = gt_order_schedules_in[]
          sales_schedules_inx  = gt_order_schedules_inx[]
          sales_conditions_in  = l_order_conditions_in[]
          sales_conditions_inx = l_order_conditions_inx[]
*         sales_cfgs_ref       = order_cfgs_ref
*         sales_cfgs_inst      = order_cfgs_inst
*         sales_cfgs_part_of   = order_cfgs_part_of
*         sales_cfgs_value     = order_cfgs_value
*         sales_cfgs_blob      = order_cfgs_blob
*         sales_cfgs_vk        = order_cfgs_vk
*         sales_cfgs_refinst   = order_cfgs_refinst
*         sales_ccard          = order_ccard
         sales_text           = GT_ORDER_TEXT[]
*         sales_keys           = order_keys
*         extensionin          = extensionin
*         partneraddresses     = partneraddresses
*         extensionex          = extensionex
        .
    else.
      clear l_salesdocument.
      call function 'BAPI_SALESORDER_CREATEFROMDAT2'
        exporting
*         SALESDOCUMENTIN      = L_SALESDOCUMENTIN
          order_header_in      = l_order_header_in
          order_header_inx     = l_order_header_inx
*         SENDER               = L_SENDER
*         BINARY_RELATIONSHIPTYPE       =
*         INT_NUMBER_ASSIGNMENT         =
*         BEHAVE_WHEN_ERROR    =
          logic_switch         = l_logic_switch
*         TESTRUN              =
*         CONVERT              = ' '
        importing
          salesdocument        = l_salesdocument
        tables
          return               = gt_return[]
          order_items_in       = gt_order_items_in[]
          order_items_inx      = gt_order_items_inx[]
          order_partners       = gt_order_partners[]
          order_schedules_in   = gt_order_schedules_in[]
          order_schedules_inx  = gt_order_schedules_inx[]
          order_conditions_in  = l_order_conditions_in[]
          order_conditions_inx = l_order_conditions_inx[]
*         ORDER_CFGS_REF       =
*         ORDER_CFGS_INST      =
*         ORDER_CFGS_PART_OF   =
*         ORDER_CFGS_VALUE     =
*         ORDER_CFGS_BLOB      =
*         ORDER_CFGS_VK        =
*         ORDER_CFGS_REFINST   =
*         ORDER_CCARD          =
         ORDER_TEXT           = GT_ORDER_TEXT[]
*         ORDER_KEYS           =
*         EXTENSIONIN          =
*         PARTNERADDRESSES     =
*         EXTENSIONEX          =
*         NFMETALLITMS         =
        .
    endif.


* 处理错误消息:通过判断消息的类型,来判断BAPI是否成功
    clear i_mes.
    loop at gt_return.
      i_mes = i_mes && '*' &&  gt_return-type && gt_return-number && gt_return-message.
      if gt_return-type eq 'E' or
          gt_return-type = 'A' or
          gt_return = 'X'.
        cp_eind = 'X'.  "失败
      endif.

      if gt_return-type eq 'W'.
        l_w = 'X'.
      endif.
    endloop.

    if cp_eind ne 'X'.
      if l_w <>  'X'.
        "存在警告信息
        loop at gt_out where index = gt_head-index and box = 'X'.
          gt_out-tabix = i_mes.
          gt_out-text = icon_green_light .
          gt_out-index = l_salesdocument.
          modify gt_out.
        endloop.
      else.
        "成功生成订单
        loop at gt_out where index = gt_head-index and box = 'X'.
          gt_out-tabix = i_mes.
          gt_out-text = icon_yellow_light  .
          gt_out-index = l_salesdocument.
          modify gt_out.
        endloop.
      endif.

      "提交事务
      call function 'BAPI_TRANSACTION_COMMIT'
        exporting
          wait = 'X'.
      commit work and wait.
    else.
      "存在错误,创建失败
      loop at gt_out where index = gt_head-index and box = 'X'.
        gt_out-tabix = i_mes.
        gt_out-text = icon_red_light .
        modify gt_out.
      endloop.
      "回滚事务
      call function 'BAPI_TRANSACTION_ROLLBACK' .
    endif.

    clear l_order_header_in.
    clear l_order_header_inx.
    clear l_logic_switch.
    clear l_salesdocument.
    clear gt_return[].
    clear gt_order_items_in[].
    clear gt_order_items_inx[].
    clear gt_order_partners[].
    clear l_order_conditions_in[].
    clear l_order_conditions_inx[].
    clear gt_order_schedules_in[].
    clear gt_order_schedules_inx[].
    clear cp_eind.
    clear l_w.
  endloop.
  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值