BAPI_SALESORDER_CREATEFROMDAT2创建销售订单(并修改价格)_SAP刘梦_新浪博客

本文提供了一个SAP销售订单创建的ABAP代码示例,包括数据结构定义及调用BAPI_SALESORDER_CREATEFROMDAT2的过程。讨论了定价条件、伙伴角色设置等问题,并附带介绍了订单状态变更的方法。
只是做个简单记录,用的时候方便copy修改

大致的代码如下:
FORM frm_create_so .

  DATA:lw_show LIKE LINE OF gt_show.
  FIELD-SYMBOLS LIKE LINE OF gt_show.

  DATA: l_header_in           TYPE bapisdhd1,
        l_header_inx          TYPE bapisdhd1x,
        lt_item_in            TYPE TABLE OF bapisditm  WITH HEADER LINE,
        lt_item_inx           TYPE TABLE OF bapisditmx WITH HEADER LINE,
        lt_partners           TYPE TABLE OF bapiparnr  WITH HEADER LINE,
        lt_return             TYPE TABLE OF bapiret2   WITH HEADER LINE,
        lt_business_ex        TYPE TABLE OF bapisdbusi WITH HEADER LINE,
        lt_conditions         TYPE TABLE OF bapicond   WITH HEADER LINE,
        lt_conditions_inx     TYPE          bapicondx  OCCURS 0 WITH HEADER LINE,
        lt_schedules_in       TYPE TABLE OF bapischdl  WITH HEADER LINE,
        lt_schedules_inx      TYPE TABLE OF bapischdlx  WITH HEADER LINE.

  DATA: l_swith TYPE bapisdls .
  DATA: l_vbeln LIKE vbak-vbeln.
  DATA: l_po    LIKE bapisdhd1-purch_no_c.
  DATA: l_vrkme LIKE t006a-mseh3.
  DATA: l_msg   TYPE string.
  DATA: l_vbeln1  TYPE bapivbeln-vbeln.

  LOOP AT gt_show ASSIGNING WHERE err IS INITIAL.


*    L_SWITH-PRICING  = 'G'.                                "定价类型 :G:复制不变定价因素且重定税款
*    L_SWITH-COND_HANDL  = 'X'.                                "定价类型 :G:复制不变定价因素且重定税款

*    L_HEADER_IN-SD_DOC_CAT         = 'C'.                  "SD 凭证类别 C 订单  
    l_header_in-doc_type           = -auart.        "销售凭证类型
    l_header_in-sales_org          = -vkorg.        "销售组织
    l_header_in-distr_chan         = -vtweg.        "分销渠道
    l_header_in-division           = -spart.        "产品组
*    L_HEADER_IN-SALES_GRP          = -VKGRP.        "销售组
    l_header_in-sales_off          = -vkbur.        "销售部门
    l_header_in-doc_date           = -audat.        "凭证日期 (接收/发送日期)
*    L_HEADER_IN-WAR_DATE           = SY-DATUM.             "担保日期

    PERFORM frm_matnr_input CHANGING -matnr.

    lt_item_in-itm_number  = 10.                            "行项目
    lt_item_in-material    = -matnr.                "物料号
    lt_item_in-plant       = -werks.                "工厂
    lt_item_in-store_loc   = -lgort.                "库存地点
    lt_item_in-sales_unit  = -vrkme.                "销售单位
    lt_item_in-ship_point  = -vstel.                "装运点/接收点
    lt_item_in-val_type    = -bwtar.                "评估类型
    lt_item_in-target_qty  = -wmeng.                "目标数量
    APPEND lt_item_in.
*
    IF -netpr IS NOT INITIAL.
      lt_conditions-itm_number = 10.
      lt_conditions-cond_type  = 'ZR06'.               "条件类型   
      lt_conditions-currency   = 'RMB'.
*      lt_conditions-cond_unit  = -kmein.      "条件单位   
      lt_conditions-cond_value = -netpr.       "定价比率 单价

      IF -kpein IS INITIAL.
        -kpein = 1.
      ENDIF.
      lt_conditions-cond_p_unt =  -kpein.      "条件定价单位  "定价基数
      lt_conditions-cond_updat = 'X'.
      lt_conditions-cond_st_no = 10.
      lt_conditions-cond_count = 1.
      lt_conditions-condchaman = 'X'.

      APPEND lt_conditions.
      CLEAR lt_conditions.

      CLEAR lt_conditions_inx[].
      lt_conditions_inx-itm_number = 10.
      lt_conditions_inx-cond_st_no = 10.
      lt_conditions_inx-cond_count = 1.
      lt_conditions_inx-cond_type  = 'ZR06'.
      lt_conditions_inx-cond_value = 'X'.
      lt_conditions_inx-currency   = 'X'.
*      lt_conditions_inx-cond_unit  = 'X'. "条件单位  delete at 20141014
      lt_conditions_inx-cond_p_unt = 'X'.
      lt_conditions_inx-updateflag = 'U'.
      APPEND lt_conditions_inx.

    ENDIF.


    CLEAR  lt_schedules_in.
    lt_schedules_in-itm_number   = 10.
    lt_schedules_in-sched_line   = 10.
    lt_schedules_in-req_qty      =  -wmeng.    "以销售单位计的订单数量
    lt_schedules_in-req_date      = sy-datum.          "以销售单位计的订单数量
    lt_schedules_in-date_type     = 1.                 "以销售单位计的订单数量
    APPEND lt_schedules_in.

    CLEAR lt_schedules_inx.
    lt_schedules_inx-itm_number   = 10.
    lt_schedules_inx-sched_line   = 10.
    lt_schedules_inx-req_qty   = 'X'.
    lt_schedules_inx-updateflag   = 'X'.           "以销售单位计的订单数量
    APPEND lt_schedules_inx.



    lt_item_inx-itm_number  = 10.
    lt_item_inx-material    = 'X'.
    lt_item_inx-plant       = 'X'.
    lt_item_inx-store_loc   = 'X'.
    lt_item_inx-target_qty  = 'X'.
    lt_item_inx-target_qu   = 'X'.
    lt_item_inx-val_type    = 'X'.
    lt_item_inx-updateflag  = 'I'..
    lt_item_inx-sales_unit  = 'X'.
    lt_item_inx-ship_point  = 'X'.
    APPEND lt_item_inx.
*

    PERFORM frm_kunnr_input CHANGING -kunnr.

    lt_partners-partn_role = 'WE'.                         "合作伙伴功能 RE 收票方 WE 送达方
    lt_partners-partn_numb = -kunnr.
    APPEND lt_partners.

    lt_partners-partn_role = 'RE'.                       "合作伙伴功能 RE 收票方 WE 送达方
    lt_partners-partn_numb = -kunnr.
    APPEND lt_partners.

    lt_partners-partn_role = 'AG'.                       "合作伙伴功能 RE 收票方 WE 送达方
    lt_partners-partn_numb = -kunnr.
    APPEND lt_partners.

    lt_partners-partn_role = 'RG'.                       "合作伙伴功能 RE 收票方 WE 送达方
    lt_partners-partn_numb = -kunnr.
    APPEND lt_partners.

*    LT_BUSINESS_EX-ITM_NUMBER = 10.
*    LT_BUSINESS_EX-TRANS_CAT = 'Z005'.                    "运输方式类型  Z005 公路运输
*    APPEND LT_BUSINESS_EX.

    CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
      EXPORTING
        order_header_in      = l_header_in
        logic_switch         = l_swith
      IMPORTING
        salesdocument        = l_vbeln1
      TABLES
        return               = lt_return
        order_items_in       = lt_item_in
        order_items_inx      = lt_item_inx
        order_partners       = lt_partners
        order_schedules_in   = lt_schedules_in
        order_schedules_inx  = lt_schedules_inx
        order_conditions_in  = lt_conditions
        order_conditions_inx = lt_conditions_inx.
 
    -vbeln_va       = l_vbeln1.
    l_vbeln = l_vbeln1.

    READ TABLE lt_return WITH KEY type = 'E'.
     
    "异常处理 

    CLEAR l_vbeln.
    CLEAR lt_return[].
    CLEAR lt_item_in[].
    CLEAR lt_item_inx[].
    CLEAR lt_partners[].
    CLEAR lt_schedules_in[].
    CLEAR lt_conditions[].
    CLEAR lt_conditions_inx[].
    CLEAR lt_schedules_inx[].

  ENDLOOP.


ENDFORM.                    " FRM_CREATE_SO

然后说几点问题:
一、首先是两个单位:
BAPI_SALESORDER_CREATEFROMDAT2创建销售订单(并修改价格)
修改价格的时候,别把定价条件的单位给变了,
当然,具体根据需求来看
BAPI_SALESORDER_CREATEFROMDAT2创建销售订单(并修改价格)

二、:
*    L_SWITH-PRICING  = 'G'.                                "定价类型 :G:复制不变定价因素且重定税款
这个B C G具体取哪个值或者使用默认值可以参考:
双击行项目,点更新 
BAPI_SALESORDER_CREATEFROMDAT2创建销售订单(并修改价格)

三、      lt_conditions_inx -updateflag  =  'U' .
这里更新标志是用U还是用I,
一般而言,U是修改原来数据,I是插入一条新数据

当然,有时候是修改不了价格的,
比如后台配置不允许手动修改价格等

当然,可以在创建的时候直接修改审批状态:
FORM frm_change_status   USING pv_vbeln . .
   DATA : l_objnr  TYPE vbak -objnr .

   DO  20  TIMES .
     SELECT  SINGLE objnr
       INTO l_objnr
       FROM vbak
       WHERE vbeln  = pv_vbeln .
     IF sy -subrc  =  0 .
       EXIT .
     ELSE .
       WAIT  UP  TO  1 SECONDS .
     ENDIF .
   ENDDO .


   CHECK l_objnr  IS  NOT  INITIAL .
*  USER_STATUS = 'E0004'.
   CALL  FUNCTION  'STATUS_CHANGE_EXTERN'
     EXPORTING
      objnr                = l_objnr
      user_status          =  'E0004' “审批通过
     EXCEPTIONS
      object_not_found     =  1
      status_inconsistent  =  2
      status_not_allowed   =  3
       OTHERS               =  4 .

ENDFORM .                     " FRM_CHAN


有时候,计划行数量没更新过来
到时候再自己调试下哪儿的原因,或者最笨的方法,录个bdc确认计划行就行了


欢迎关注订阅号:SAP学习记录 (SAPlearning )

PO <wbr><wbr>text <wbr><wbr>copy <wbr><wbr>rules <wbr><wbr>:copy <wbr><wbr>PR <wbr><wbr>item <wbr><wbr>text <wbr><wbr>to <wbr><wbr>PO

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值