BAPI_PO_CREATE1 批量创建采购订单

查看BAPI_PO_CREATE1里面需要导入什么参数,读取文件填充进去即可。注意导入的数据文件和程序里定义的结构里的字段顺序相对应,每个字段用tab分隔,如果该字段为空的话,文件里也要tab一下。源码有点修改(已备注),但是这样修改的话只能一个采购订单购买一个物料,不能一个采购订单购买多个物料。还是得改进。

*&---------------------------------------------------------------------*
*& Report  ZYHYBAPI_PO
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZYHYBAPI_PO.
DATA:BEGIN OF gt_data OCCURS 0,
          bsart TYPE string,"采购凭证类型
          lifnr  TYPE string,"供应商帐户号
          ekorg TYPE string,"采购组织
          ekgrp TYPE string,"采购组
          bukrs TYPE string,"公司代码
          ihrez  TYPE string,"您的参考   抬头->通信
          ebelp  TYPE string,"采购凭证的项目编号
          knttp TYPE string,"科目分配类别
          matnr TYPE string,"商品代码
*          txz01 TYPE string,"短文本
          menge TYPE string,"采购订单数量
          meins TYPE string,"采购订单的计量单位
          eeind TYPE string,"交货日期W
          netpr TYPE string,"净价
          waers TYPE string,"货币 W
          matkl TYPE string,"物料组
          werks TYPE string,"工厂
          bednr TYPE string,"需求跟踪号
          afnam TYPE string,"需求者/请求者姓名
          mwskz TYPE string,"销售税代码  税码
          sakto TYPE string,"总帐科目
          kostl TYPE string,"成本中心
          anln1 TYPE string,"资产
          aufnr TYPE string,"订单
          str1   TYPE string,"行项目文本-来自采购申请项目详细清单
          str2   TYPE string,"行项目文本-规格型号
          str3   TYPE string,"行项目文本-RFQ Reference
          bstae TYPE string,"确认控制
        END OF gt_data.

DATA: BEGIN OF gt_out OCCURS 0,
            text(255),
          END OF gt_out.

DATA:      poheader  LIKE TABLE OF bapimepoheader  WITH HEADER LINE ,   "采购订单抬头数据
           poheaderx LIKE TABLE OF bapimepoheaderx WITH HEADER LINE,
           return       LIKE TABLE OF bapiret2  WITH HEADER LINE,
           poitem    LIKE TABLE OF bapimepoitem WITH HEADER LINE,       "采购订单项目
           poitemx LIKE TABLE OF bapimepoitemx WITH HEADER LINE,
           poschedule LIKE TABLE OF bapimeposchedule WITH HEADER LINE,  "采购订单交货计划行的字段
           poschedulex LIKE TABLE OF bapimeposchedulx WITH HEADER LINE,
           poaccount LIKE TABLE OF bapimepoaccount WITH HEADER LINE,    "采购订单的帐户分配字段
           poaccountx LIKE TABLE OF bapimepoaccountx WITH HEADER LINE,
           pocond LIKE TABLE OF bapimepocond WITH HEADER LINE,          "采购订单中的条件
           pocondx LIKE TABLE OF bapimepocondx WITH HEADER LINE,

           potextitem LIKE TABLE OF bapimepotext WITH HEADER LINE.

DATA: epo LIKE bapimepoheader-po_number.

DATA: l_return LIKE return.
DATA: lv_message(255).

CONSTANTS: con VALUE 'X'.

DATA: pp_file TYPE string.

DATA: lifnr TYPE elifn.
DATA: netpr TYPE bprei.
DATA: bstae TYPE bstae.
DATA: matnr TYPE matnr.
DATA: waers TYPE waers.

PARAMETERS:p_file(128) .

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM get_file.

START-OF-SELECTION.
  PERFORM get_data.
  PERFORM create_po.
  PERFORM write_out.

*&---------------------------------------------------------------------*

FORM get_file .
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = p_file
      mask             = ',*.txt,*.TXT.'
      mode             = 'O'
      title            = 'File Name'
    IMPORTING
      filename         = p_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
  pp_file = p_file.
ENDFORM.                    " GET_FILE
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*

FORM get_data .
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                      = pp_file
     filetype                      = 'ASC'
     has_field_separator           = 'X'
*   HEADER_LENGTH                 = 0
     read_by_line                  = 'X'
*   DAT_MODE                      = ' '
*   CODEPAGE                      = ' '
*   IGNORE_CERR                   = ABAP_TRUE
*   REPLACEMENT                   = '#'
*   CHECK_BOM                     = ' '
*   VIRUS_SCAN_PROFILE            =
*   NO_AUTH_CHECK                 = ' '
* IMPORTING
*   FILELENGTH                    =
*   HEADER                        =
    TABLES
      data_tab                      = gt_data
   EXCEPTIONS
     file_open_error               = 1
     file_read_error               = 2
     no_batch                      = 3
     gui_refuse_filetransfer       = 4
     invalid_type                  = 5
     no_authority                  = 6
     unknown_error                 = 7
     bad_data_format               = 8
     header_not_allowed            = 9
     separator_not_allowed         = 10
     header_too_long               = 11
     unknown_dp_error              = 12
     access_denied                 = 13
     dp_out_of_memory              = 14
     disk_full                     = 15
     dp_timeout                    = 16
     OTHERS                        = 17
            .
  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN 1.MESSAGE 'FILE_OPEN_ERROR ' TYPE 'E'.
      WHEN 2.MESSAGE 'FILE_READ_ERROR ' TYPE 'E'.
      WHEN 3.MESSAGE 'NO_BATCH' TYPE 'E'.
      WHEN 4.MESSAGE 'GUI_REFUSE_FILETRANSFER  ' TYPE 'E'.
      WHEN 5.MESSAGE 'INVALID_TYPE ' TYPE 'E'.
      WHEN 6.MESSAGE ' NO_AUTHORITY' TYPE 'E'.
      WHEN 7.MESSAGE 'UNKNOWN_ERROR' TYPE 'E'.
      WHEN 8.MESSAGE 'BAD_DATA_FORMAT ' TYPE 'E'.
      WHEN 9.MESSAGE 'HEADER_NOT_ALLOWED' TYPE 'E'.
      WHEN 10.MESSAGE 'SEPARATOR_NOT_ALLOWED' TYPE 'E'.
      WHEN 11.MESSAGE 'HEADER_TOO_LONG ' TYPE 'E'.
      WHEN 12.MESSAGE 'UNKNOWN_DP_ERROR' TYPE 'E'.
      WHEN 13.MESSAGE ' ACCESS_DENIED ' TYPE 'E'.
      WHEN 14.MESSAGE 'DP_OUT_OF_MEMORY ' TYPE 'E'.
      WHEN 15.MESSAGE 'DISK_FULL  ' TYPE 'E'.
      WHEN 16.MESSAGE 'DP_TIMEOUT' TYPE 'E'.
      WHEN 17.MESSAGE ' OTHERS  ' TYPE 'E'.
      WHEN OTHERS.
    ENDCASE.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  CREATE_PO
*&---------------------------------------------------------------------*

FORM create_po .
  LOOP AT gt_data.
    CLEAR waers.
    waers = gt_data-waers.
*    AT NEW  ihrez.   "修改源码 注释掉(ihrez为空的话 留着并不能批量)  下面还有一个at end 也注释
      CLEAR lifnr.
      lifnr = gt_data-lifnr.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = lifnr
        IMPORTING
          output = lifnr.

      poheader-doc_type    = gt_data-bsart.
      poheader-vendor       = lifnr.
      poheader-purch_org  = gt_data-ekorg.
      poheader-pur_group  = gt_data-ekgrp.
      poheader-comp_code = gt_data-bukrs.
      poheader-ref_1          = gt_data-ihrez.
      poheader-doc_date   = sy-datum.
*      poheader-LANGU = 1.
      poheader-langu         =  sy-langu.
      poheader-currency = waers."货币


      poheaderx-doc_type    = con.
      poheaderx-vendor       = con.
      poheaderx-purch_org  = con.
      poheaderx-pur_group  = con.
      poheaderx-comp_code = con.
      poheaderx-ref_1          = con.
      poheaderx-doc_date   = con.
      poheaderx-langu         =  con.
      poheaderx-currency = con."货币

*    ENDAT."修改源码 注释掉

    CLEAR netpr.
    netpr = gt_data-netpr.

    CLEAR bstae.
    bstae = gt_data-bstae.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = bstae
      IMPORTING
        output = bstae.

    CLEAR matnr.
    matnr = gt_data-matnr.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = matnr
      IMPORTING
        output = matnr.

    poitem-po_item =  gt_data-ebelp. "采购凭证的项目编号
    poitem-acctasscat = gt_data-knttp."科目分配类别
    poitem-material = matnr."商品代码
*    poitem-short_text = gt_data-txz01."短文本
    poitem-quantity = gt_data-menge."采购订单数量
    poitem-po_unit = gt_data-meins ."采购订单的计量单位
    poitem-net_price = netpr."净价
    poitem-matl_group = gt_data-matkl."物料组
    poitem-plant = gt_data-werks. "工厂
    poitem-trackingno =  gt_data-bednr."需求跟踪号
    poitem-preq_name = gt_data-afnam."需求者/请求者姓名
    poitem-tax_code = gt_data-mwskz."销售税代码
    poitem-conf_ctrl = bstae."确认控制代码
    poitem-GR_BASEDIV = '' . "基于收货的发票校验 默认为选中 这样设置就是不选中
    APPEND poitem.
    CLEAR poitem.

    poitemx-po_item =  gt_data-ebelp. "采购凭证的项目编号
    poitemx-acctasscat = con ."科目分配类别
    poitemx-material = con."商品代码
*    poitemx-short_text = con."短文本
    poitemx-quantity = con."采购订单数量
    poitemx-po_unit = con ."采购订单的计量单位
    poitemx-net_price = con."净价
    poitemx-matl_group = con."物料组
    poitemx-plant = con."工厂
    poitemx-trackingno = con."需求跟踪号
    poitemx-preq_name = con."需求者/请求者姓名
    poitemx-tax_code = con."销售税代码
    poitemx-conf_ctrl = con."确认控制代码
    poitemx-ret_item = con."退货项目
    poitemx-GR_BASEDIV = con.
    APPEND poitemx.
    CLEAR poitemx.

    poschedule-po_item =   gt_data-ebelp. "采购凭证的项目编号
    poschedule-sched_line =  gt_data-ebelp. "采购凭证的项目编号
    poschedule-del_datcat_ext = 'D'."交货日期的类别
    poschedule-delivery_date = gt_data-eeind."交货日期
    poschedule-quantity  = gt_data-menge."采购订单数量
    APPEND poschedule.
    CLEAR poschedule.

    poschedulex-po_item =  gt_data-ebelp. "采购凭证的项目编号
    poschedulex-sched_line =  gt_data-ebelp. "采购凭证的项目编号
    poschedulex-del_datcat_ext = con."交货日期的类别
    poschedulex-delivery_date = con."交货日期
    poschedulex-quantity  = con."采购订单数量
    APPEND poschedulex.
    CLEAR poschedulex.

    poaccount-po_item =   gt_data-ebelp. "采购凭证的项目编号
    poaccount-gl_account = gt_data-sakto."总帐科目
    poaccount-costcenter = gt_data-kostl."成本中心
    poaccount-asset_no = gt_data-anln1."主资产号
    poaccount-orderid = gt_data-aufnr."订单号
    poaccount-co_area = 'BELL'."成本控制
    APPEND poaccount.
    CLEAR  poaccount.

    poaccountx-po_item =  gt_data-ebelp. "采购凭证的项目编号
    poaccountx-gl_account = con."总帐科目
    poaccountx-costcenter = con."成本中心
    poaccountx-asset_no = con."主资产号
    poaccountx-orderid = con."订单号
    poaccountx-co_area = con."成本控制
    APPEND poaccountx.
    CLEAR  poaccountx.

    potextitem-po_item =  gt_data-ebelp. "采购凭证的项目编号
    potextitem-text_id = 'F03'."来自采购申请项目详细清单
    potextitem-text_line = gt_data-str1."行项目文本-来自采购申请项目详细清单
    APPEND  potextitem.
    CLEAR  potextitem.

    potextitem-po_item =  gt_data-ebelp. "采购凭证的项目编号
    potextitem-text_id = 'F04'." 规格/型号
    potextitem-text_line = gt_data-str2."行项目文本-规格型号
    APPEND  potextitem.
    CLEAR  potextitem.

    potextitem-po_item =  gt_data-ebelp. "采购凭证的项目编号
    potextitem-text_id = 'F09'."  RFQ Reference
    potextitem-text_line = gt_data-str3."行项目文本- RFQ Reference
    APPEND  potextitem.
    CLEAR  potextitem.

*    AT END OF ihrez. "修改源码 注释掉
      CALL FUNCTION 'BAPI_PO_CREATE1'
       EXPORTING
         poheader                     =  poheader
         poheaderx                    =  poheaderx
*      POADDRVENDOR                 =
*      TESTRUN                      =
*      MEMORY_UNCOMPLETE            =
*      MEMORY_COMPLETE              =
*      POEXPIMPHEADER               =
*      POEXPIMPHEADERX              =
*      VERSIONS                     =
*      NO_MESSAGING                 =
*      NO_MESSAGE_REQ               =
*      NO_AUTHORITY                 =
*      NO_PRICE_FROM_PO             =
      IMPORTING
        exppurchaseorder             = epo
*      EXPHEADER                    =
*      EXPPOEXPIMPHEADER            =
      TABLES
        return                       =  return
        poitem                       =  poitem
        poitemx                     =  poitemx
*      POADDRDELIVERY               =
        poschedule                   = poschedule
        poschedulex                 = poschedulex
        poaccount                    =  poaccount
*      POACCOUNTPROFITSEGMENT       =
        poaccountx                   = poaccountx
*      POCONDHEADER                 =
*      POCONDHEADERX                =
*      POCOND                       =
*      POCONDX                      =
*      POLIMITS                     =
*      POCONTRACTLIMITS             =
*      POSERVICES                   =
*      POSRVACCESSVALUES            =
*      POSERVICESTEXT               =
*      EXTENSIONIN                  =
*      EXTENSIONOUT                 =
*      POEXPIMPITEM                 =
*      POEXPIMPITEMX                =
*      POTEXTHEADER                 =
        potextitem                   =  potextitem
*      ALLVERSIONS                  =
*      POPARTNER                    =
*      POCOMPONENTS                 =
*      POCOMPONENTSX                =
*      POSHIPPING                   =
*      POSHIPPINGX                  =
*      POSHIPPINGEXP                =
             .
      LOOP AT return WHERE type = 'E' OR type = 'A'.
      ENDLOOP.
      IF sy-subrc = 0.
        CLEAR: lv_message.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        LOOP AT return INTO l_return WHERE type = 'E' .
          CONCATENATE lv_message l_return-message ';'
            INTO lv_message.
        ENDLOOP.
        CONCATENATE gt_data-ihrez lv_message INTO gt_out-text.
        APPEND gt_out.
        CLEAR gt_out.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
        CONCATENATE epo '创建成功' INTO gt_out-text.
        APPEND gt_out.
        CLEAR gt_out.
      ENDIF.
      REFRESH: poitem,poitemx,poschedule,poschedulex,
                     poaccount,poaccountx,potextitem ,
                     poheader,poheaderx,return.
      CLEAR:   poitem,poitemx,poschedule,poschedulex,
                     poaccount,poaccountx,potextitem ,
                      poheader,poheaderx,return.

*    ENDAT. "修改源码 注释掉
  ENDLOOP.

ENDFORM.                    " CREATE_PO
*&---------------------------------------------------------------------*
*&      Form  WRITE_OUT
*&---------------------------------------------------------------------*
FORM write_out .
  LOOP AT gt_out.
    WRITE: / gt_out-text.
  ENDLOOP.
ENDFORM.                    "write_out


导入数据列中用tab分隔(如该字段不填则再tab一次),测试数据:(字段列请参照以上程序中内表 gt_data,每个系统环境不一样,像工厂 采购组织等,所以主要还是看内表ge_data)

NB 1013 9999 104 9999 1 20193011 129 EA 20151120 28 CNY 0001 9999 J1


  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SAP BAPI_PO_CREATE1是一个SAP系统中的功能模块,用于创建采购订单(Purchase Order)。通过该功能模块,我们可以使用SAP系统来快速创建和维护采购订单的相关数据。 使用BAPI_PO_CREATE1,我们可以通过调用该功能模块来向SAP系统中创建新的采购订单。在调用该功能模块时,我们需要提供一些必要的输入参数,如采购订单的相关信息、采购组织和公司代码等。 这个功能模块可以帮助我们在SAP系统中自动化采购订单创建流程。它可以根据输入的参数,自动生成采购订单,并将相关的物料、供应商和价格等信息添加到订单中。 通过使用BAPI_PO_CREATE1,我们可以实现以下功能: 1. 创建采购订单:我们可以通过调用该功能模块来创建新的采购订单。在调用时,我们需要提供订单的相关信息,如供应商、物料、数量、交货日期等。系统会根据提供的信息自动创建采购订单。 2. 修改采购订单:除了创建新的采购订单,我们还可以使用BAPI_PO_CREATE1来修改现有的采购订单。在调用时,我们需要提供订单的标识符和要修改的字段及对应的值。系统将根据提供的信息来更新采购订单的数据。 3. 检查采购订单:在调用BAPI_PO_CREATE1之前,我们可以先使用BAPI_PO_EXISTENCE_CHECK来检查采购订单是否存在。这可以帮助我们避免重复创建订单或更新不存在的订单。 总而言之,SAP BAPI_PO_CREATE1是一个用于创建和维护采购订单的功能模块。它可以帮助我们在SAP系统中实现自动化的采购订单处理,并提高采购过程的效率和准确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值