ABAP创建销售订单BAPI


创建销售订单BAPI的区别:

创建销售订单有三个BAPI:

BAPI_SALESORDER_CREATEFROMDAT2
BAPI_CUSTOMERRETURN_CREATE
SD_SALESDOCUMENT_CREATE

BAPI_SALESORDER_CREATEFROMDAT2和BAPI_CUSTOMERRETURN_CREATE 都调用了SD_SALESDOCUMENT_CREATE这个FM,区别在于调用的时候业务类型是写死的,

BAPI_SALESORDER_CREATEFROMDAT2限制了业务对象为BUS2032,不能用来创建退货凭证;退货类型的业务对象是BUS2012,BAPI_CUSTOMERRETURN_CREATE用来创建退货凭证。

是否退货类型凭证可以在TVAK表中VBTYP字段判断,每种凭证类型对应的都有凭证类别,类别为H的就为退货凭证

以 SD_SALESDOCUMENT_CREATE 为示例 :
 DATA: lv_sales_header_in      LIKE bapisdhd1,
        lv_sales_header_inx     LIKE bapisdhd1x,
        lv_logic_switch         TYPE bapisdls,
        lv_salesdocument_ex     LIKE bapivbeln-vbeln,
        lt_sales_items_in       LIKE TABLE OF bapisditm  WITH HEADER LINE,
        lt_sales_items_inx      LIKE TABLE OF bapisditmx WITH HEADER LINE,
        lt_sales_schedules_in   LIKE TABLE OF bapischdl  WITH HEADER LINE,
        lt_sales_schedules_inx  LIKE TABLE OF bapischdlx WITH HEADER LINE,
        lt_sales_conditions_in  LIKE TABLE OF bapicond   WITH HEADER LINE,
        lt_sales_conditions_inx LIKE TABLE OF bapicondx  WITH HEADER LINE,
        lt_sales_text           LIKE TABLE OF bapisdtext WITH HEADER LINE,
        lt_sales_partners_in    LIKE TABLE OF bapiparnr  WITH HEADER LINE,
        lt_partner_add          LIKE TABLE OF bapiaddr1  WITH HEADER LINE,
        lt_return               LIKE TABLE OF bapiret2   WITH HEADER LINE.
  DATA: l_answer       TYPE c,
        lv_kwmeng      TYPE kwmeng,
        lv_cond_value  TYPE bapikbetr1,
        lv_cond_value1 TYPE bapikbetr1,
        lv_sched_line  TYPE etenr VALUE '0001',
        lv_itm_num     TYPE posnr_va VALUE '000010'.

  CLEAR: lt_sales_items_in,     lt_sales_items_inx,
         lt_sales_schedules_in, lt_sales_schedules_inx,
         lt_sales_conditions_in,lt_sales_conditions_inx,
         lt_sales_partners_in,
         lt_return ,lt_alv1,lt_alv1.

  DATA:xt_ztsd03 TYPE TABLE OF ztsd0003 .

  READ TABLE gt_alv1 ASSIGNING FIELD-SYMBOL(<xs_alv1>) WITH KEY box = 'X'.
  IF sy-subrc <> 0 .                                                                                        "Begin of document1
    MESSAGE e002(zsd01) .
  ELSE.

    LOOP AT gt_alv1 ASSIGNING FIELD-SYMBOL(<gs_alv1>) WHERE box = 'X'.

      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        EXPORTING
*         percentage = lv_percentage     "执行程序的百分比
          text = '订单正在确认中......'.                      "提示文本

      IF <gs_alv1>-vbeln IS INITIAL .

******** sales order header
        lv_sales_header_in-doc_type    = 'ZOR1'.    " 销售凭证类型   ”固定
        lv_sales_header_in-sales_org   = <gs_alv1>-vkorg.    " 销售机构
        lv_sales_header_in-distr_chan  = <gs_alv1>-vtweg.    " 分销渠道
        lv_sales_header_in-division    = <gs_alv1>-spart.    " 产品组

        lv_sales_header_inx-doc_type   = abap_true.
        lv_sales_header_inx-sales_org  = abap_true.
        lv_sales_header_inx-distr_chan = abap_true.
        lv_sales_header_inx-division   = abap_true.

******** Header texts
        CLEAR: lt_sales_text[].
        APPEND INITIAL LINE TO lt_sales_text ASSIGNING FIELD-SYMBOL(<ls_sales_text>).
        <ls_sales_text>-itm_number = space.
        <ls_sales_text>-text_id    = '0002'.
        <ls_sales_text>-langu      = sy-langu.
        <ls_sales_text>-format_col = '*'.
        <ls_sales_text>-text_line  = <gs_alv1>-remark.

        lv_itm_num = '0010'.

        LOOP AT gt_itab ASSIGNING FIELD-SYMBOL(<ls_itab2>) WHERE order_no = <gs_alv1>-order_no.

          <ls_itab2>-kunnr = |{ <ls_itab2>-kunnr ALPHA = IN }| .
******** PARTNER
          SELECT SINGLE name1,pstlz,adrnr,ort01
            FROM kna1 WHERE kunnr = @<ls_itab2>-kunnr
          INTO ( @DATA(lv_name) ,@DATA(lv_code),@DATA(lv_adrnr),@DATA(lv_city) ).
          lt_sales_partners_in-partn_role = 'WE'.
          lt_sales_partners_in-partn_numb = <ls_itab2>-kunnr."送达方
          lt_sales_partners_in-title = '公司'."称谓
          lt_sales_partners_in-name = lv_name."名称1
          lt_sales_partners_in-country = 'CN' ."国家代码
          lt_sales_partners_in-postl_code = lv_code ."邮政编码
          lt_sales_partners_in-city = lv_city ."城市
          lt_sales_partners_in-street = <ls_itab2>-con_address   ."地址
          lt_sales_partners_in-district = <ls_itab2>-consignee && ';' && <ls_itab2>-con_phone ."手机号
          APPEND lt_sales_partners_in.
          CLEAR lt_sales_partners_in.

          lt_sales_partners_in-partn_role = 'AG'.
          lt_sales_partners_in-partn_numb = <ls_itab2>-kunnr." 售达方
          APPEND lt_sales_partners_in.
          CLEAR lt_sales_partners_in.

******** PARTNERADDRESSES
*        lt_partner_add-addr_no = lv_adrnr .
*        lt_partner_add-street = <ls_itab2>-con_phone .
*        APPEND lt_partner_add.
*        CLEAR lt_partner_add.

******** sales order item
          lt_sales_items_in-purch_no_s   = <ls_itab2>-order_no.        
          "加前导零
          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input  = <ls_itab2>-matnr
            IMPORTING
              output = <ls_itab2>-matnr.
          lt_sales_items_in-material   = <ls_itab2>-matnr.        " 物料
          lt_sales_items_in-plant      = <ls_itab2>-vkorg.        " 工厂
          lt_sales_items_in-batch = <ls_itab2>-charg.        " 库存地点

          lt_sales_items_inx-purch_no_s   = abap_true.
          lt_sales_items_inx-material   = abap_true.
          lt_sales_items_inx-plant      = abap_true.
          lt_sales_items_inx-batch      = abap_true.        " 批次号

******** sales order item
          lt_sales_items_in-itm_number  = lv_itm_num.
          lt_sales_items_inx-itm_number = lv_itm_num.
*
          APPEND: lt_sales_items_in, lt_sales_items_inx.
          CLEAR:  lt_sales_items_in, lt_sales_items_inx.

******** sales Schedule Line
          lt_sales_schedules_in-itm_number = lv_itm_num.
          lt_sales_schedules_in-sched_line = lv_sched_line.       " L_TABIX.
          lt_sales_schedules_in-req_date   = <gs_alv1>-edatu.     " 计划行日期
          lt_sales_schedules_in-req_qty    = <ls_itab2>-menge.    " 以销售单位计的 订单数量

          lt_sales_schedules_inx-itm_number = lv_itm_num.
          lt_sales_schedules_inx-sched_line = lv_sched_line.
          lt_sales_schedules_inx-req_date   = abap_true.
          lt_sales_schedules_inx-req_qty    = abap_true.

          APPEND: lt_sales_schedules_in, lt_sales_schedules_inx.
          CLEAR:  lt_sales_schedules_in, lt_sales_schedules_inx.

******** 复制不变定价因素且重定税款
          lv_logic_switch-pricing = 'G'.
*
          lt_sales_conditions_in-itm_number  = lv_itm_num.
          lt_sales_conditions_in-cond_type   = 'Z002'.           " 条件类型 定价条件
          lt_sales_conditions_in-cond_value  = <ls_itab2>-reb_amount.    " 价格     定价比率
          lt_sales_conditions_in-currency    = 'CNY'.            " 货币码
*
          lt_sales_conditions_inx-itm_number = lv_itm_num.
          lt_sales_conditions_inx-cond_type  = 'Z002'.
          lt_sales_conditions_inx-currency   = abap_true.
          lt_sales_conditions_inx-cond_value = abap_true.

          APPEND: lt_sales_conditions_in,lt_sales_conditions_inx.
          CLEAR:  lt_sales_conditions_in,lt_sales_conditions_inx,lv_cond_value.

          lt_sales_conditions_in-itm_number  = lv_itm_num.
          lt_sales_conditions_in-cond_type   = 'Z003'.           " 条件类型 定价条件
          lt_sales_conditions_in-cond_value  = <ls_itab2>-exe_amount .    " 价格     定价比率
          lt_sales_conditions_in-currency    = 'CNY'.            " 货币码
*
          lt_sales_conditions_inx-itm_number = lv_itm_num.
          lt_sales_conditions_inx-cond_type  = 'Z003'.
          lt_sales_conditions_inx-currency   = abap_true.
          lt_sales_conditions_inx-cond_value = abap_true.
*
          APPEND: lt_sales_conditions_in,lt_sales_conditions_inx.
          CLEAR:  lt_sales_conditions_in,lt_sales_conditions_inx,lv_cond_value.

          lv_itm_num = lv_itm_num + 10 .

        ENDLOOP.

******** CALL BAPI 'SD_SALESDOCUMENT_CREATE'
        CLEAR:lv_salesdocument_ex,lt_return,lt_return[].
        CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
          EXPORTING
*           salesdocument        = <ls_itab2>-vbeln
            sales_header_in      = lv_sales_header_in
            sales_header_inx     = lv_sales_header_inx
            convert_parvw_auart  = abap_on
            logic_switch         = lv_logic_switch
          IMPORTING
            salesdocument_ex     = lv_salesdocument_ex
          TABLES
            return               = lt_return
            sales_items_in       = lt_sales_items_in
            sales_items_inx      = lt_sales_items_inx
            sales_schedules_in   = lt_sales_schedules_in
            sales_schedules_inx  = lt_sales_schedules_inx
            sales_conditions_in  = lt_sales_conditions_in
            sales_conditions_inx = lt_sales_conditions_inx
            sales_partners       = lt_sales_partners_in
            partneraddresses     = lt_partner_add
            sales_text           = lt_sales_text[].

        IF sy-subrc EQ 0 AND lv_salesdocument_ex IS NOT INITIAL.

          <gs_alv1>-zicon = icon_green_light.
          <gs_alv1>-mseg = lv_salesdocument_ex .
          <gs_alv1>-vbeln = lv_salesdocument_ex .

          PERFORM frm_return_dms  TABLES lt_alv1 lt_out
                                    USING 'Confirmed' .
          READ TABLE lt_out ASSIGNING FIELD-SYMBOL(<ls_out1>) INDEX 1.
          IF sy-subrc = 0.
            IF <ls_out1>-rtnval = '1'.
              COMMIT WORK.
              MOVE-CORRESPONDING gt_itab[] TO xt_ztsd03 .
              DELETE xt_ztsd03 WHERE order_no NE <gs_alv1>-order_no .
              MODIFY ztsd0003 FROM TABLE xt_ztsd03 .
              UPDATE ztsd0003 SET vbeln = lv_salesdocument_ex WHERE order_no = <gs_alv1>-order_no .
            ELSE.
              ROLLBACK WORK.
              <gs_alv1>-zicon = icon_red_light.
              <gs_alv1>-mseg = <ls_out1>-rtnmsg .
            ENDIF.
          ENDIF.
        ELSE.
          LOOP AT lt_return WHERE type = 'E'.
*          MESSAGE e000(zsd01) WITH lt_return-message.
            <gs_alv1>-zicon = icon_red_light.
            <gs_alv1>-mseg = lt_return-message .
            EXIT.
          ENDLOOP.

          ROLLBACK WORK.
        ENDIF.
        CLEAR:lv_sales_header_in,lv_sales_header_inx,lv_logic_switch,lt_sales_items_in[],
              lt_sales_items_inx[],lt_sales_schedules_in[],lt_sales_schedules_inx[],lt_sales_conditions_in[],
              lt_sales_conditions_inx,lt_sales_partners_in[],lt_sales_text[].

      ELSE.
        <gs_alv1>-zicon = icon_yellow_light.
        <gs_alv1>-mseg  = '无法重复确认!'.
      ENDIF.

    ENDLOOP.

  ENDIF.                                        

具体需要输入什么参数可以根据BAPI的表格结构去添加 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM