创建采购订单

& 创建采购订单
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_creat_aufnr .

*   创建前检查
  IF line_exists( gt_data[ zmsg = ''   ] ).
    MESSAGE '请先检查数据' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  IF line_exists( gt_data[ icon = '@0A@'   ] ).
    MESSAGE '存在错误数据,请检查后重新导入' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  LOOP AT gt_data INTO gs_data WHERE icon = '@08@' AND ebeln <> ''.
    MESSAGE '采购订单创建成功,请勿重复创建' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDLOOP.

* 物料评估类取得
  IF gt_data IS NOT INITIAL.
    SELECT matnr
           bklas
    INTO TABLE lt_mbew
    FROM mbew
    FOR ALL ENTRIES IN gt_data
    WHERE matnr = gt_data-matnr
    AND bwkey = '1000'.
  ENDIF.

* 物料总账科目取得
  SELECT *
  INTO TABLE lt_t030
  FROM t030
  WHERE ktosl = 'BSX'
  AND   bwmod = '1000'.
  SORT lt_t030 BY bklas.

  LOOP AT lt_mbew INTO ls_mbew.
    CLEAR ls_t030.
    READ TABLE lt_t030 INTO ls_t030 WITH KEY bklas = ls_mbew-bklas
                                              BINARY SEARCH.
    IF sy-subrc = 0.
      ls_mbew-konts = ls_t030-konts.
      MODIFY lt_mbew FROM ls_mbew TRANSPORTING konts.
    ENDIF.
  ENDLOOP.
  SORT lt_mbew BY matnr.

  LOOP AT gt_head INTO gs_head."已按照供应商、订单类型去重,按照供应商、订单类型维度进行创建。
    CLEAR: gs_poheader,gt_item,gt_itemx,gt_poaccount,gt_poaccountx,gt_poschedule,gt_poschedulex,gt_pocond,gt_pocondx.
* 抬头数据
    "公司代码
    gs_poheader-comp_code  = '1000'.
    gs_poheaderx-comp_code = 'X'.

    "采购组织
    gs_poheader-purch_org  = '1000'.
    gs_poheaderx-purch_org = 'X'.

    "采购组
    gs_poheader-pur_group  = gs_head-ekgrp.
    gs_poheaderx-pur_group = 'X'.

    "采购凭证类别
    IF p_2 = 'X'.
      gs_poheader-doc_type  = 'Z12'.
      gs_poheaderx-doc_type = 'X'.
    ELSE.
      gs_poheader-doc_type  = gs_head-bsart.
      gs_poheaderx-doc_type = 'X'.
    ENDIF.


    "供应商
    gs_poheader-vendor  = gs_head-lifnr.
    gs_poheaderx-vendor = 'X'.


    LOOP AT gt_data INTO gs_data WHERE lifnr = gs_head-lifnr AND bsart = gs_head-bsart AND ekgrp = gs_head-ekgrp.

* 行项目数据
      "行项目
      gs_item-po_item  = gs_data-ebelp.
      gs_itemx-po_item = gs_data-ebelp.
      "物料编码
      gs_item-material_long  = gs_data-matnr.
      gs_itemx-material_long = 'X'.

      "采购订单数量
      gs_item-quantity  = gs_data-menge.
      gs_itemx-quantity = 'X'.

      "工厂
      gs_item-plant  = '1000'.
      gs_itemx-plant = 'X'.

      "税码
      IF p_2 = 'X'.
        gs_item-tax_code  = 'J0'.
        gs_itemx-tax_code = 'X'.
      ELSE.
        gs_item-tax_code  = gs_data-mwskz.
        gs_itemx-tax_code = 'X'.
      ENDIF.

      IF gs_data-meins IS NOT INITIAL .
        "订单单位
        CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
          EXPORTING
            input          = gs_data-meins
            language       = sy-langu
          IMPORTING
            output         = gs_item-po_unit
          EXCEPTIONS
            unit_not_found = 1
            OTHERS         = 2.

        gs_itemx-po_unit = 'X'.
      ENDIF.

      "净值
      gs_item-net_price  = gs_data-netpr.         " 货币金额
      gs_itemx-net_price = 'X'.

      "      gs_item-po_price   = '2'.
      "      gs_itemx-po_price  = 'X'.

      "价格单位
      gs_item-price_unit  = gs_data-peinh.
      gs_itemx-price_unit = 'X'.

      "   订单价格单位
      "    gs_item-orderpr_un = gs_item-po_unit."暂时设置等于订单单位
      "    gs_itemx-orderpr_un = gs_item-po_unit.

      "采购申请
      IF gs_data-banfn IS NOT INITIAL.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = gs_data-banfn
          IMPORTING
            output = gs_item-preq_no.
        gs_item-preq_item = gs_data-bnfpo.
        gs_itemx-preq_no = 'X'.
        gs_itemx-preq_item = 'X'.
      ENDIF.

      IF p_2 = 'X'.
        gs_item-acctasscat = 'Q'.          " 科目分配类别
        gs_itemx-acctasscat = 'X'.
      ELSE.
        IF gs_data-knttp IS NOT INITIAL.
          gs_item-acctasscat = gs_data-knttp.          " 科目分配类别
          gs_itemx-acctasscat = 'X'.
        ENDIF.
      ENDIF.

      IF p_2 NE 'X'. "创建免费采购订单,不设置基于发票收据标识
        gs_item-ir_ind        = 'X'.          "发票收据标识
        gs_item-gr_basediv    = 'X'.          "基于收货的发票校验
      ENDIF.

      IF p_2 EQ 'X'.        "免费订单标识
        gs_item-free_item = 'X'.
        gs_itemx-free_item = 'X'.
      ENDIF.

      APPEND gs_item TO gt_item.
      APPEND gs_itemx TO gt_itemx.
      CLEAR:gs_item,gs_itemx.

*   WBS元素
      IF gs_data-disub_pspnr IS NOT INITIAL.
        DATA:lv_posid  TYPE ps_pspid.
        CLEAR lv_posid.
        "CALL FUNCTION 'CONVERSION_EXIT_ABPSP_INPUT'
        "          EXPORTING
        "            input     = gs_data-disub_pspnr
        "          IMPORTING
        "            output    = lv_posid
        "          EXCEPTIONS
        "            not_found = 1.

        CLEAR:gs_poaccount,gs_poaccountx.
        gs_poaccount-po_item   = gs_data-ebelp.   " 采购凭证的项目编号
        gs_poaccount-quantity  = gs_data-menge.   "数量
        gs_poaccount-wbs_element  = gs_data-disub_pspnr.      "WBS 元素

*     总账科目取得
        CLEAR ls_mbew.
        READ TABLE lt_mbew INTO ls_mbew WITH KEY matnr = gs_data-matnr
                                                          BINARY SEARCH.
        IF sy-subrc = 0.
          gs_poaccount-gl_account  =  ls_mbew-konts.      "总账科目
        ENDIF.

        gs_poaccountx-po_item     = gs_data-ebelp." 采购凭证的项目编号
        gs_poaccountx-quantity    = 'X'.           "数量
        gs_poaccountx-wbs_element = 'X'.           "WBS 元素
        gs_poaccountx-gl_account  =  'X'.      "总账科目
        APPEND gs_poaccount TO gt_poaccount.
        APPEND gs_poaccountx TO gt_poaccountx.
        CLEAR:gs_poaccount,gs_poaccountx.
      ENDIF.

* 计划交货行
      "项目编号
      gs_poschedule-po_item = gs_data-ebelp.
      gs_poschedulex-po_item = gs_data-ebelp.

      "计划行编号
      gs_poschedule-sched_line = 0001.
      gs_poschedulex-sched_line = 0001.
      "交货日的类别
      gs_poschedule-del_datcat_ext = 'D'.
      gs_poschedulex-del_datcat_ext = 'X'.

      "交货日期
      IF gs_data-eindt IS NOT INITIAL.
        gs_poschedule-delivery_date = gs_data-eindt .
        gs_poschedulex-delivery_date = 'X'.
      ENDIF.

      "采购订单数量
      gs_poschedule-quantity = gs_data-menge.
      gs_poschedulex-quantity = 'X'.

      APPEND gs_poschedule TO gt_poschedule.
      APPEND gs_poschedulex TO gt_poschedulex.
      CLEAR: gs_poschedule,gs_poschedulex.

* 价格条件
      "行项目
      gs_pocond-itm_number = gs_data-ebelp.
      gs_pocondx-itm_number = gs_data-ebelp.

      "条件类型
      gs_pocond-cond_type = 'PBXX'.
      gs_pocondx-cond_type = 'X'.

      "价格
      gs_pocond-cond_value = gs_data-netpr .
      gs_pocondx-cond_value = 'X'.

*    价格单位poitem
      gs_pocond-cond_p_unt = gs_data-peinh.
      gs_pocondx-cond_p_unt = 'X'.

      gs_pocond-cond_updat = 'X'.

*    "货币码
      gs_pocond-currency = 'CNY'.
      gs_pocondx-currency = 'X'.

*    更改类型

      APPEND gs_pocond TO gt_pocond.
      APPEND gs_pocondx TO gt_pocondx.
      CLEAR:gs_pocondx,gs_pocond.

      CLEAR:gs_data.
    ENDLOOP.

    CLEAR: ls_mes_1,lv_num.
    CALL FUNCTION 'BAPI_PO_CREATE1'
      EXPORTING
        poheader         = gs_poheader
        poheaderx        = gs_poheaderx
        no_price_from_po = 'X'
        testrun          = p_testrun
      IMPORTING
        exppurchaseorder = lv_num
      TABLES
        return           = gt_return
        poitem           = gt_item
        poitemx          = gt_itemx
        poschedule       = gt_poschedule
        poschedulex      = gt_poschedulex
        pocond           = gt_pocond
        pocondx          = gt_pocondx
        pocomponents     = gt_pocomponents
        pocomponentsx    = gt_pocomponentsx
        poaccount        = gt_poaccount
        poaccountx       = gt_poaccountx.
*      FREE MEMORY ID 'PO_CREATE'.
    READ TABLE gt_return INTO gs_return WITH KEY type = 'E'.
    IF sy-subrc = 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      LOOP AT gt_return INTO gs_return WHERE type = 'E' .
        CLEAR ls_mes.
        MESSAGE ID gs_return-id
        TYPE gs_return-type
        NUMBER gs_return-number
        INTO ls_mes
        WITH gs_return-message_v1
        gs_return-message_v2
        gs_return-message_v3
        gs_return-message_v4.
        IF ls_mes_1 IS INITIAL.
          ls_mes_1 = ls_mes.
        ELSE.
          CONCATENATE ls_mes_1 ls_mes INTO ls_mes_1 SEPARATED BY '|'.
        ENDIF.
      ENDLOOP.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.

      ls_mes_1 = '采购订单创建成功'.

    ENDIF.

    LOOP AT gt_data INTO DATA(gs_data2) WHERE lifnr = gs_head-lifnr AND bsart = gs_head-bsart AND ekgrp = gs_head-ekgrp.
      IF ls_mes_1 = '采购订单创建成功'.
        gs_data2-icon = '@08@'.
        gs_data2-zmsg = ls_mes_1.
        gs_data2-ebeln = lv_num.
      ELSE.
        gs_data2-icon = '@0A@'.
        gs_data2-zmsg = ls_mes_1.
      ENDIF.

      MODIFY gt_data FROM gs_data2 TRANSPORTING icon zmsg ebeln.
      CLEAR gs_data2.
    ENDLOOP.
    CLEAR:gs_head,gs_data.
  ENDLOOP.

ENDFORM.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值