销售订单创建BAPI实例(刘欣)

这是一个使用ABAP编程语言实现的程序,通过BAPI_SALESORDER_CREATEFROMDAT2来批量创建销售订单。程序从Excel文件中读取数据,处理每条记录,包括设置BAPI参数、调用BAPI、检查返回信息。成功则提交订单,记录凭证号和备注,失败则记录错误信息。整个流程涉及订单头信息、伙伴信息、行项目、配置引用和实例、值等细节处理。

好把,到新公司我的第一个程序,销售订单批量创建(带配置)

 

使用ABAP的BAPI: BAPI_SALESORDER_CREATEFROMDAT2 

 

每一条数据处理逻辑:

1、准备BAPI参数

2、调用BAPI

3、查询BAPI返回信息:

如果正确,提交保存;并得到销售订单凭证号,用凭证号,保存行项目的备注文本,写日志表。

如果错误,放弃其它操作,写日志表。

*&---------------------------------------------------------------------*
*& report zsde0006
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
report zsde0006.
tables ztsd0026.


data gs_ztsd0026 like ztsd0026.
data gt_ztsd0026 like table of ztsd0026.



"ecxel数据定义
types :
        begin of gs_t_excel,
            doc_type    like  ztsd0026-doc_type,
            sales_org   like  ztsd0026-sales_org,
            distr_chan  like  ztsd0026-distr_chan,
            division    like  ztsd0026-division,
            req_date_h  like  ztsd0026-req_date_h,
            partn_numb  like  ztsd0026-partn_numb,
            name        like  ztsd0026-name,
            material    like  ztsd0026-material,
            maktx       like  ztsd0026-maktx,
            xmlx        like  ztsd0026-xmlx,
            pmnttrms    like  ztsd0026-pmnttrms,
            plant       like  ztsd0026-plant,
            ship_point  like  ztsd0026-ship_point,
            req_qty     like  ztsd0026-req_qty,
            zmodel      like  ztsd0026-zmodel,
            zcolor      like  ztsd0026-zcolor,
            zinterior   like  ztsd0026-zinterior,
            zoptpack    like  ztsd0026-zoptpack,
            text        like  ztsd0026-text,
            excelid     like  ztsd0026-excelid,

        end of gs_t_excel.

  data gs_excel  type   gs_t_excel.
  data gs_excel_check  type   gs_t_excel.
  data gs_excel_temp  type   gs_t_excel.


  data gt_excel  type  table  of gs_t_excel.
  data gt_excel_check  type  table  of gs_t_excel.

  "备注文本text零时表定义
  types :
        begin of gs_t_bztxt,
            text      like  ztsd0026-text,
            posnr     TYPE posnr,

        end of gs_t_bztxt.

  data gs_bztxt  type   gs_t_bztxt.
  data gt_bztxt  type  table  of gs_t_bztxt.


"检查用

types :
        begin of gs_t_field6,
            doc_type    like  ztsd0026-doc_type,
            sales_org   like  ztsd0026-sales_org,
            distr_chan  like  ztsd0026-distr_chan,
            division    like  ztsd0026-division,
            req_date_h  like  ztsd0026-req_date_h,
        end of gs_t_field6.

data gs_field6  type   gs_t_field6.
data gt_field6  type  table  of gs_t_field6.

"BAPI  数据定义
  DATA gs_header TYPE bapisdhd1.
  DATA gt_partner TYPE TABLE OF bapiparnr.
  DATA gs_partner TYPE bapiparnr.

  DATA gv_posnr TYPE posnr. " 订单Item号
  DATA gv_charact_cfgid TYPE cux_cfg_id.
  DATA gv_charact_insid TYPE cu_inst_id.

  DATA gt_item TYPE TABLE OF bapisditm.
  DATA gs_item TYPE bapisditm.

  DATA gv_etenr TYPE etenr. " 订单Schedule Line号
  DATA gt_sl TYPE TABLE OF bapischdl.
  DATA gs_sl TYPE bapischdl.

  DATA gt_cfgins TYPE TABLE OF bapicuins.
  DATA gs_cfgins TYPE bapicuins.

  DATA gt_cfgref TYPE TABLE OF bapicucfg.
  DATA gs_cfgref TYPE bapicucfg.

  DATA gv_class TYPE cuib_objkey.

  DATA gt_cfgval TYPE TABLE OF bapicuval.
  DATA gs_cfgval TYPE bapicuval.


  DATA gs_cha TYPE char70.
  DATA gt_cha TYPE TABLE OF char70.

  DATA gv_char50 TYPE  char50.

  DATA gv_vbeln TYPE vbeln. " SO凭证号

  DATA gt_rc TYPE TABLE OF bapiret2.
  DATA gs_rc TYPE bapiret2.
  DATA gv_err_flag TYPE xfeld.

  DATA ls_header TYPE thead.
  data gt_line type table of tline.
  data wa_line like  tline.






selection-screen begin of block bk with frame title text-b02.
parameter:p_path like rlgrap-filename modif id md1.
selection-screen end of block bk.





DATA: functxt TYPE smp_dyntxt.
TABLES: sscrfields.
SELECTION-SCREEN: FUNCTION KEY 1,FUNCTION KEY 2."download template.


initialization.


  functxt-icon_id       = icon_xxl.
  functxt-icon_text     = text-002.
  sscrfields-functxt_01 = functxt.

  functxt-icon_id       = ICON_SPOOL_REQUEST.
  functxt-icon_text     = text-003.
  sscrfields-functxt_02 = functxt.


  AT SELECTION-SCREEN.

  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      PERFORM frm_template_down.
    WHEN 'FC02'.
      SUBMIT ZSDR0026 VIA SELECTION-SCREEN.


  ENDCASE.




at selection-screen on value-request for p_path.
  perform frm_sel_file changing p_path.


start-of-selection.
  perform frm_excel_import.





FORM frm_template_down .
  DATA: lv_filename    TYPE string,
         lv_path        TYPE string,
         lv_fullpath    TYPE string,
         lv_user_action TYPE i,
         lv_destination TYPE rlgrap-filename,
         ls_objdata     TYPE wwwdatatab,
         lv_objid       TYPE wwwdatatab-objid,
         lv_rc          TYPE sy-subrc.

  lv_filename = 'Template Download'.

  CONCATENATE sy-datum '-' sy-uzeit '-' lv_filename INTO lv_filename.

  IF lv_user_action <> 9.
    SELECT SINGLE relid objid
      FROM wwwdata
      INTO CORRESPONDING FIELDS OF  ls_objdata
      WHERE srtf2 = 0
      AND   objid = 'ZSDE0006'
      AND   relid = 'MI'.
    IF sy-subrc = 0.
      CLEAR lv_rc.
      CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
        EXPORTING
          key               = ls_objdata
          destination       = lv_destination
        IMPORTING
          rc                = lv_rc
*    CHANGING
*      TEMP              =
                .
      IF lv_rc EQ 0 .
        MESSAGE  'Template download sucessful.' TYPE 'S'.
      ELSE.
        MESSAGE  'The template is not exit.' TYPE 'S' DISPLAY LIKE 'E'.
      ENDIF.
    ELSE.
      MESSAGE  'The template is not exit.' TYPE 'S' DISPLAY LIKE 'E'.
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_TEMPLATE_DOWN.











*&---------------------------------------------------------------------*
*&      form  frm_sel_file
*&---------------------------------------------------------------------*
*       text 选择文件
*----------------------------------------------------------------------*
form frm_sel_file changing po_path.
  data:
    lt_filetable    type   filetable,
    ls_filetable    type   file_table,
    lv_rc           type   sy-subrc,
    lv_filename     type   string.
    "lv_initial_path type   string value 'c:\'.

  clear lv_filename.
  lv_filename = p_path.
  call method cl_gui_frontend_services=>file_open_dialog
    exporting
      default_filename        = lv_filename
      file_filter             =  cl_gui_frontend_services=>filetype_excel
"      initial_directory       = lv_initial_path
    changing
      file_table              = lt_filetable
      rc                      = lv_rc
    exceptions
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4.

  if sy-subrc ne 0 or lv_rc lt 0.
    message '上传文件选择失败' TYPE 'I'."上传文件选择失败
  else.
    if lv_rc = 1.
      read table lt_filetable into ls_filetable index 1.
      po_path = ls_filetable-filename.
    else.
      exit.
    endif.
  endif.
endform.




*&---------------------------------------------------------------------*
*&      form   frm_excel_import
*&---------------------------------------------------------------------*
*       text 读取excel文件
*----------------------------------------------------------------------*
form frm_excel_import.
  data cl_ex type ref to cx_root.
  check p_path is not initial.


try .

      call function 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
        exporting
          filename                = p_path
          i_begin_col             = 1
          i_begin_row             = 3
          i_end_col               = 21
          i_end_row               = 5000
*         sheet_name              =
        tables
          intern                  = gt_excel
        exceptions
          inconsistent_parameters = 1
          upload_ole              = 2
          others                  = 3.


 catch cx_root into cl_ex.
      message  cl_ex->get_text( )  TYPE 'I'  .

 endtry.



*gs_excel-PARTN_NUMB. "客户编码
*gs_excel-MATERIAL.   "物料
*gs_excel-ZMODEL.     "基本车型
*gs_excel-ZCOLOR.     "外饰
*gs_excel-ZINTERIOR.  "内饰
*gs_excel-ZOPTPACK.   "选装包




sort gt_excel by PARTN_NUMB .

DATA n type i VALUE 0.

"按表头字段检查,分类
gt_excel_check = gt_excel .

 loop at gt_excel_check into gs_excel_check.


        gs_field6-doc_type    = gs_excel_check-doc_type.  " 订单类型
        gs_field6-sales_org   = gs_excel_check-sales_org.  " 销售组织
        gs_field6-distr_chan  = gs_excel_check-distr_chan.  " 分销渠道
        gs_field6-division    = gs_excel_check-division.    " 产品组
        gs_field6-REQ_DATE_H  = gs_excel_check-REQ_DATE_H. "请求交货日期
        APPEND gs_field6 TO gt_field6.

   AT END OF PARTN_NUMB.


      DELETE ADJACENT DUPLICATES FROM gt_field6.

      DESCRIBE TABLE gt_field6 LINES n.

      IF n <> 1.

        write :/ gs_excel_check-PARTN_NUMB && ' 多行表头数据必须相同!'.
        RETURN.

      ENDIF.

     ENDAT.


 endloop.








      "行项目号初始化
        gv_posnr = '000000'.
        gv_etenr = '0000'.
        gv_charact_cfgid = '000000'.
        gv_charact_insid = '00000001'.





  loop at gt_excel into gs_excel.



        "so header
        gs_header-doc_type    = gs_excel-doc_type.  " 订单类型
        gs_header-sales_org   = gs_excel-sales_org.  " 销售组织
        gs_header-distr_chan  = gs_excel-distr_chan.  " 分销渠道
        gs_header-division    = gs_excel-division.    " 产品组
        gs_header-REQ_DATE_H  = gs_excel-REQ_DATE_H. "请求交货日期


        "so partner
        gs_partner-partn_numb = gs_excel-PARTN_NUMB.

           CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
               EXPORTING
                 INPUT         = gs_partner-partn_numb
              IMPORTING
                 OUTPUT        = gs_partner-partn_numb.  "'0011000001'.

        gs_partner-partn_role = 'AG'.
        APPEND gs_partner TO gt_partner.


        "so item

        gv_posnr = gv_posnr + 10.


        gs_item-itm_number  = gv_posnr.
        gs_item-material    = gs_excel-material . "物料
        gs_item-plant       = gs_excel-plant.     "工厂
        gs_item-ship_point  = gs_excel-ship_point. "装运点、接收点
        gs_item-pmnttrms    = gs_excel-pmnttrms.
        gs_item-po_itm_no   = gv_posnr.       "注意这个参数,有增强需要这个参数
        append gs_item to gt_item.


        "so Schedule Lines

        gv_etenr = gv_etenr + 1.
        gs_sl-itm_number = gv_posnr.
        gs_sl-req_qty = gs_excel-REQ_QTY. "数量
        gs_sl-sched_line = gv_etenr.
        APPEND gs_sl TO gt_sl.


        "bztxt 先存起来
        gs_bztxt-text  = gs_excel-text.
        gs_bztxt-posnr = gv_posnr.
        APPEND gs_bztxt TO gt_bztxt.


        " Step2.2. Characteristic - Reference
*        IF ls_ibp_prod-zmodel IS NOT INITIAL. " 如果是VC物料
          gv_charact_cfgid = gv_charact_cfgid + 1.
          gs_cfgref-posex = gv_posnr.
          gs_cfgref-config_id = gv_charact_cfgid.
          gs_cfgref-root_id = gv_charact_insid.
          APPEND gs_cfgref TO gt_cfgref.

          " Step2.3. Characteristic - Instance
          gs_cfgins-config_id = gv_charact_cfgid.
          gs_cfgins-inst_id = gv_charact_insid.
          gs_cfgins-obj_type = 'MARA'.
          gs_cfgins-class_type = '300'.
          gs_cfgins-obj_key = gv_class.
          APPEND gs_cfgins TO gt_cfgins.



          gv_char50 = gs_excel-material.


          " Step2.4. Characteristic - Values

            PERFORM _frm_charact_values USING gs_excel-ZMODEL     gv_charact_cfgid
                                              gv_charact_insid      gv_char50
                                              'ZDP_0001_MODEL'
                                     CHANGING gs_cfgval.
            APPEND gs_cfgval TO gt_cfgval.




            PERFORM _frm_charact_values USING gs_excel-ZCOLOR     gv_charact_cfgid
                                              gv_charact_insid     gv_char50
                                              'ZDP_0001_COLOR'
                                     CHANGING gs_cfgval.
            APPEND gs_cfgval TO gt_cfgval.




            PERFORM _frm_charact_values USING gs_excel-ZINTERIOR  gv_charact_cfgid
                                              gv_charact_insid    gv_char50
                                              'ZDP_0001_INTERI'
                                     CHANGING gs_cfgval.
            APPEND gs_cfgval TO gt_cfgval.




            SPLIT gs_excel-ZOPTPACK AT '_' INTO TABLE gt_cha.

            LOOP AT gt_cha INTO gs_cha.
              PERFORM _frm_charact_values USING gs_cha                 gv_charact_cfgid
                                                gv_charact_insid       gv_char50
                                                'ZDP_0001_OPTPAC'
                                       CHANGING gs_cfgval.
              APPEND gs_cfgval TO gt_cfgval.
            ENDLOOP.



  gs_excel_temp = gs_excel. "后面AT END OF 会把工作区的字符变成*,这里要先缓存一下


  AT END OF PARTN_NUMB. "如果后面的数据有变化了,现在执行这些行项目产生SO


      CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
        EXPORTING

          order_header_in    = gs_header
        IMPORTING
          salesdocument      = gv_vbeln
        TABLES
          return             = gt_rc
          order_items_in     = gt_item
          order_partners     = gt_partner
          order_schedules_in = gt_sl
          order_cfgs_ref     = gt_cfgref
          order_cfgs_inst    = gt_cfgins
          order_cfgs_value   = gt_cfgval.




        LOOP AT gt_rc INTO gs_rc WHERE type CA 'EA'.

          gv_err_flag = abap_on.

        ENDLOOP.





    IF gv_err_flag IS INITIAL. " Success


        call function 'BAPI_TRANSACTION_COMMIT'
          exporting
            wait = 'X'.
        commit work and wait .


        loop at gt_bztxt into gs_bztxt.



            ls_header-tdobject = 'VBBP'.
            ls_header-tdid     = '0001'.
            ls_header-tdspras  = 'E'. "英语!
            ls_header-tdname   = gv_vbeln && gs_bztxt-posnr. "采购订单号加行项目号,应该是后台有配置



            wa_line-tdline = gs_bztxt-TEXT.
            wa_line-tdformat = '*'.

            append wa_line to gt_line.

                  "先删除!
                  CALL FUNCTION 'DELETE_TEXT'
                    EXPORTING
                      id                    = ls_header-tdid
                      language              = sy-langu
                      NAME                  = ls_header-tdname
                      OBJECT                = ls_header-tdobject
                    EXCEPTIONS
                      NOT_FOUND             = 1
                      OTHERS                = 2.

                  CALL FUNCTION 'DELETE_TEXT'
                    EXPORTING
                      id                    = ls_header-tdid
                      language              = 'E' "英语!
                      NAME                  = ls_header-tdname
                      OBJECT                = ls_header-tdobject
                    EXCEPTIONS
                      NOT_FOUND             = 1
                      OTHERS                = 2.

                  "再save
                  CALL FUNCTION 'SAVE_TEXT'
                    EXPORTING
                      header          = ls_header
                      savemode_direct = 'X'
                    TABLES
                      lines           = gt_line
                    EXCEPTIONS
                      id              = 1
                      language        = 2
                      name            = 3
                      object          = 4
                      OTHERS          = 5.


             clear gt_line[].

          endloop.





        data ss like bapiret2-message.
        data gv_long(200) type c.
        loop at gt_rc into gs_rc.

            call function 'MESSAGE_TEXT_BUILD'
             exporting
               msgid               = gs_rc-id
               msgnr               = gs_rc-number
               msgv1               = gs_rc-message_v1
               msgv2               = gs_rc-message_v2
               msgv3               = gs_rc-message_v3
               msgv4               = gs_rc-message_v4
             importing
               message_text_output = ss.

              gv_long = gv_long && '(' && sy-tabix && ')' &&  '[' && gs_rc-type && ']' && ss .

         endloop.

               write:/ gv_long.




     "得到一个uuid为主键,保证每一条数据主键不同,可以从内表写入到透明表
     gs_ztsd0026-uuid  = cl_uuid_factory=>create_system_uuid( )->create_uuid_c32( ).


      gs_ztsd0026-ADNAM = sy-uname. "用户名
      gs_ztsd0026-ADDAT = sy-datum. "日期
      gs_ztsd0026-ADTIM = sy-uzeit. "时间

      gs_ztsd0026-excelid     =	gs_excel_temp-excelid.
      gs_ztsd0026-DOC_TYPE    =	gs_excel_temp-DOC_TYPE.
      gs_ztsd0026-SALES_ORG	  = gs_excel_temp-SALES_ORG.
      gs_ztsd0026-DISTR_CHAN  = gs_excel_temp-DISTR_CHAN.
      gs_ztsd0026-DIVISION    = gs_excel_temp-DIVISION.
      gs_ztsd0026-REQ_DATE_H  = gs_excel_temp-REQ_DATE_H.
      gs_ztsd0026-PARTN_NUMB  = gs_excel_temp-PARTN_NUMB.
      gs_ztsd0026-NAME        = gs_excel_temp-NAME.
      gs_ztsd0026-MATERIAL    = gs_excel_temp-MATERIAL.
      gs_ztsd0026-MAKTX	      = gs_excel_temp-MAKTX.
      gs_ztsd0026-XMLX        = gs_excel_temp-XMLX.
      gs_ztsd0026-PMNTTRMS    = gs_excel_temp-PMNTTRMS.
      gs_ztsd0026-PLANT	      = gs_excel_temp-PLANT.
      gs_ztsd0026-SHIP_POINT  = gs_excel_temp-SHIP_POINT.
      gs_ztsd0026-REQ_QTY	    = gs_excel_temp-REQ_QTY.
      gs_ztsd0026-ZMODEL      = gs_excel_temp-ZMODEL.
      gs_ztsd0026-ZCOLOR      = gs_excel_temp-ZCOLOR.
      gs_ztsd0026-ZINTERIOR	  = gs_excel_temp-ZINTERIOR.
      gs_ztsd0026-ZOPTPACK    = gs_excel_temp-ZOPTPACK.
      gs_ztsd0026-TEXT        = gs_excel_temp-TEXT.
      gs_ztsd0026-VBELN        = gv_vbeln.

      gs_ztsd0026-STATUS = 'S'.


      gs_ztsd0026-message  = gv_long.


    modify ztsd0026 from gs_ztsd0026.
    commit work and wait .


    CLEAR: gv_err_flag,gs_rc.
    clear: gv_long,gs_excel,gs_ztsd0026, gs_header,gv_vbeln,gt_rc[],gt_item[],gt_partner[],gt_sl[],gt_cfgref[],gt_cfgins[],gt_cfgval[],gt_line[],
            gt_bztxt[],gs_bztxt.


          "行项目号初始化
        gv_posnr = '000000'.
        gv_etenr = '0000'.
        gv_charact_cfgid = '000000'.
        gv_charact_insid = '00000001'.







     ELSE. "Fail


        loop at gt_rc into gs_rc.

            call function 'MESSAGE_TEXT_BUILD'
             exporting
               msgid               = gs_rc-id
               msgnr               = gs_rc-number
               msgv1               = gs_rc-message_v1
               msgv2               = gs_rc-message_v2
               msgv3               = gs_rc-message_v3
               msgv4               = gs_rc-message_v4
             importing
               message_text_output = ss.

              gv_long = gv_long && '(' && sy-tabix && ')' &&  '[' && gs_rc-type && ']' && ss .

         endloop.

               write:/ gv_long.



     "得到一个uuid为主键,保证每一条数据主键不同,可以从内表写入到透明表
     gs_ztsd0026-uuid  = cl_uuid_factory=>create_system_uuid( )->create_uuid_c32( ).


      gs_ztsd0026-ADNAM = sy-uname. "用户名
      gs_ztsd0026-ADDAT = sy-datum. "日期
      gs_ztsd0026-ADTIM = sy-uzeit. "时间

      gs_ztsd0026-excelid     =	gs_excel_temp-excelid.
      gs_ztsd0026-DOC_TYPE    =	gs_excel_temp-DOC_TYPE.
      gs_ztsd0026-SALES_ORG	  = gs_excel_temp-SALES_ORG.
      gs_ztsd0026-DISTR_CHAN  = gs_excel_temp-DISTR_CHAN.
      gs_ztsd0026-DIVISION    = gs_excel_temp-DIVISION.
      gs_ztsd0026-REQ_DATE_H  = gs_excel_temp-REQ_DATE_H.
      gs_ztsd0026-PARTN_NUMB  = gs_excel_temp-PARTN_NUMB.
      gs_ztsd0026-NAME        = gs_excel_temp-NAME.
      gs_ztsd0026-MATERIAL    = gs_excel_temp-MATERIAL.
      gs_ztsd0026-MAKTX	      = gs_excel_temp-MAKTX.
      gs_ztsd0026-XMLX        = gs_excel_temp-XMLX.
      gs_ztsd0026-PMNTTRMS    = gs_excel_temp-PMNTTRMS.
      gs_ztsd0026-PLANT	      = gs_excel_temp-PLANT.
      gs_ztsd0026-SHIP_POINT  = gs_excel_temp-SHIP_POINT.
      gs_ztsd0026-REQ_QTY	    = gs_excel_temp-REQ_QTY.
      gs_ztsd0026-ZMODEL      = gs_excel_temp-ZMODEL.
      gs_ztsd0026-ZCOLOR      = gs_excel_temp-ZCOLOR.
      gs_ztsd0026-ZINTERIOR	  = gs_excel_temp-ZINTERIOR.
      gs_ztsd0026-ZOPTPACK    = gs_excel_temp-ZOPTPACK.
      gs_ztsd0026-TEXT        = gs_excel_temp-TEXT.
      gs_ztsd0026-VBELN        = gv_vbeln.

      gs_ztsd0026-STATUS = 'E'.


      gs_ztsd0026-message  = gv_long.


    modify ztsd0026 from gs_ztsd0026.
    commit work and wait .


    CLEAR: gv_err_flag,gs_rc.
    clear: gv_long,gs_excel,gs_ztsd0026, gs_header,gv_vbeln,gt_rc[],gt_item[],gt_partner[],gt_sl[],gt_cfgref[],gt_cfgins[],gt_cfgval[],gt_line[],
            gt_bztxt[],gs_bztxt.

      "行项目号初始化
    gv_posnr = '000000'.
    gv_etenr = '0000'.
    gv_charact_cfgid = '000000'.
    gv_charact_insid = '00000001'.

    ENDIF.




  ENDAT.


  endloop.




 SUBMIT ZSDR0026 .


  ENDFORM.








FORM _frm_charact_values USING iv_charact_value TYPE char70
                               iv_charact_cfgid TYPE cux_cfg_id
                               iv_charact_insid TYPE cu_inst_id
                               iv_prodcut TYPE cuib_objkey
                               iv_zdp_00001 TYPE zz_config_key
                      CHANGING is_cfgval TYPE bapicuval.
  CLEAR is_cfgval.
  DATA iv_data TYPE char32.
  CALL METHOD zcl_ca_tools=>get_hc_single
    EXPORTING
      iv_config_key = iv_zdp_00001
    IMPORTING
      ev_single     = iv_data
    EXCEPTIONS
      dynamic_error = 1
      OTHERS        = 2.
  IF sy-subrc <> 0.
    " .......
  ENDIF.
  is_cfgval-config_id = iv_charact_cfgid.
  is_cfgval-inst_id = iv_charact_insid.
  is_cfgval-value = iv_charact_value.
  CONCATENATE iv_prodcut '_' iv_data INTO is_cfgval-charc.

ENDFORM.

<think>嗯,用户正在寻找一个能够基于参考销售订单创建销售订单的SAP BAPI。这个问题非常具体,显然是SAP ABAP开发或功能顾问在实际业务场景中遇到的真实需求。 用户可能正在处理销售订单复制或变更的场景,比如合同续签、订单修改或批量处理。这类需求在SAP SD模块中很常见,特别是当企业需要保持原始订单数据一致性时。从用户提供的引用来看,ta已经做过一些研究,但需要更精准的BAPI指引。 让我梳理下关键点: 首先想到的是BAPI_SALESORDER_CREATEFROMDAT2这个函数,它支持从现有文档创建销售订单的功能。引用[4]明确提到了这个BAPI的使用方法,虽然示例中没有特别强调参考订单功能,但它的参数结构确实支持。核心在于ORDER_HEADER_IN参数的REF_DOC字段,这里需要填入原始订单号。 值得注意的是,用户可能需要处理复杂场景: - 如果参考订单包含特殊业务逻辑(如第三方处理、现金销售),可能需要额外参数 - 合作伙伴信息和条件类型的复制可能需要显式控制 - 数量或日期变更时需要特别注意ATP检查 考虑到用户可能是开发人员,在回复中应该强调技术细节: 1. 必须使用REF_DOC参数指向原订单 2. ORDER_CCARD字段对信用卡订单很重要 3. 错误处理需要检查RETURN表 4. 提交事务是必须步骤,否则订单不会真正创建 另外要提醒性能风险:在循环中调用时务必控制COMMIT WORK的频率,避免锁表。对于大批量操作,建议使用BAPI_TRANSACTION_COMMIT的MODE参数控制提交方式。 用户可能没说出来但实际需要的是:如何只复制部分数据?这可以通过清空不需要的ITEM结构来实现,比如把不需要复制的行项目数量改为0。不过更规范的做法是用ITEM_INX结构控制字段级别的复制开关。</think>在SAP中,基于参考销售订单创建销售订单的**核心BAPI**是: `BAPI_SALESORDER_CREATEFROMDAT2` (或旧版本 `BAPI_SALESORDER_CREATEFROMDAT1`) ### 关键实现步骤: 1. **设置参考标识** 在订单抬头结构 `ORDER_HEADER_IN` 中指定: ```abap ORDER_HEADER_IN-REF_DOC = '参考订单号' " 如原订单号 ORDER_HEADER_IN-DOC_TYPE = 'TA' " 订单类型(TA=参考订单创建) ``` 2. **控制复制行为** 通过 `ORDER_CCARD` 结构控制复制逻辑: ```abap ORDER_CCARD-REFOBJTYPE = 'BUS2032' " 固定值:参考对象类型=销售订单 ORDER_CCARD-REFDOCOBJ = '参考订单号' " 再次确认原订单号 ORDER_CCARD-REFDOCLOG = 'X' " 复制所有项目(X=复制) ``` 3. **可选参数调整** - **`ITEM_IN` 表**:显式指定需修改的行项目(如数量、交货日期) - **`PARTNER` 表**:覆盖或新增合作伙伴 - **`SCHEDULE_IN` 表**:修改计划行日期/数量 4. **执行与提交** ```abap CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2' EXPORTING ORDER_HEADER_IN = ORDER_HEADER_IN ORDER_CCARD = ORDER_CCARD TABLES RETURN = RETURN_TAB. " 错误消息表 IF return_tab IS INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'. " 提交事务 WRITE: '新订单号:', ORDER_HEADER_IN-SALESDOCUMENT. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. " 回滚 ENDIF. ``` ### 注意事项: 1. **必填字段** 即使参考原订单,仍需提供: ```abap ORDER_HEADER_IN-SALES_ORG = '1000' " 销售组织 ORDER_HEADER_IN-DISTR_CHAN = '10' " 分销渠道 ORDER_HEADER_IN-DIVISION = '00' " 产品组 ``` 2. **复制范围控制** - 若需**部分复制**,在 `ITEM_IN` 中仅传入需复制的行项目,并设置 `ITEM_IN-REF_DOC` = 原订单行号 - 在 `ITEM_INX` 中标记修改字段(如 `ITEM_INX-UPDATEFLAG = 'U'`) 3. **特殊场景** - **跨公司复制**:需重新指定销售组织/工厂 - **信贷检查**:自动触发新订单的信贷检查 - **定价**:默认复制原订单条件,可通过 `CONDITION` 表覆盖 > ⚠️ **重要提示**:测试时务必在测试系统执行,避免直接修改生产数据。建议使用 `BAPI_TRANSACTION_COMMIT` 的 `MODE` 参数控制批处理提交[^3][^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值