zoukankan      html  css  js  c++  java
  • BAPI:采购申请修改(撤批-->修改-…

    可以结合BAPI和ME54N查看效果

    其实修改采购申请,可以直接调用BAPI修改,没必要撤批审批
    而且调用审批的时候,经常发生一种现象:直接执行审批出错,debug进去发现没问题,都能成功,
    具体原因不是很清楚,猜测是系统太快,一级审批没走完就进行二级审批,然后就报错了,
    解决方案之一是每级审批后,等一秒……




    "1、撤批
        SELECT SINGLE frggr                                                 "审批组
                     frgst                                                  "批准策略
                     frgzu                                                  "审批状态
               INTO (l_frggr, l_frgst ,l_frgzu)
               FROM eban
              WHERE banfn = l_wa-banfn                                  "采购申请号
                AND bnfpo = l_wa_-bnfpo.                                 "行项目号

        "各级审批
        SELECT SINGLE
          frgc1
          frgc2
          frgc3
          frgc4
          frgc5
          FROM t16fs
          INTO (l_frgc1,l_frgc2,l_frgc3,l_frgc4,l_frgc5)
         WHERE frggr = l_frggr
           AND frgsx = l_frgst.

        l_rel_code = l_frgc1.
      
        "如果想指定到某一级的撤批,选择t16fs-frgc1  t16fs-frgc2  t16fs-frgc3  分别三级撤批
        l_rel_code = l_frgc1."这里是扯批到创建者,
        
        CALL FUNCTION 'BAPI_REQUISITION_RESET_RELEASE'
          EXPORTING
            number                   = l_wa_preq_data-banfn                       "采购申请号
            item                     = l_wa_preq_data-bnfpo                       "行项目号
            rel_code                 = l_rel_code
          EXCEPTIONS
            authority_check_fail     = 1
            requisition_not_found    = 2
            enqueue_fail             = 3
            prerequisite_fail        = 4
            release_already_posted   = 5
            responsibility_fail      = 6
            no_release_already       = 7
            no_new_release_indicator = 8
            OTHERS                   = 9.
        IF sy-subrc NE 0.
          异常处理
        ENDIF.

        "2、修改数量和交货日期
      DATA: lt_items_old    LIKE TABLE OF bapiebanv   WITH HEADER LINE.
      DATA: lt_items_new    LIKE TABLE OF bapiebanv   WITH HEADER LINE.
      DATA: lt_items        LIKE TABLE OF bapieban    WITH HEADER LINE.
      DATA: lt_account      LIKE TABLE OF bapiebkn    WITH HEADER LINE.
      DATA: lt_bapireturn   LIKE TABLE OF bapireturn  WITH HEADER LINE.
      DATA: number          TYPE bapieban-preq_no.

        number = l_wa-banfn.

        CALL FUNCTION 'BAPI_REQUISITION_GETDETAIL'
          EXPORTING
            number             = number
            account_assignment = 'X'
          TABLES
            requisition_items  = lt_items.


        READ TABLE lt_items WITH KEY preq_item = l_wa-bnfpo.
        IF sy-subrc = 0.
          MOVE-CORRESPONDING lt_items TO lt_items_old.
          APPEND lt_items_old.
          CLEAR lt_items_old.
          MOVE-CORRESPONDING lt_items TO lt_items_new.

          lt_items_new-quantity     = l_wa-menge_m.
          lt_items_new-deliv_date   = l_wa-lfdat_m.

          APPEND lt_items_new.
          CLEAR lt_items_new.
        ENDIF.

        CALL FUNCTION 'BAPI_REQUISITION_CHANGE'
          EXPORTING
            number                = l_wa-banfn
          TABLES
            requisition_items_old = lt_items_old
            requisition_items_new = lt_items_new
            return                = lt_return.

     *异常处理 lt_return……

        "3、审批
         "如果想指定到某一级的撤批, rel_code选择t16fs-frgc1  t16fs-frgc2  t16fs-frgc3  
         "分别三级审批,必须一级级审批,不能跨级
         "审批 必须分级审批
       
        "获取审批级别
        l_shenpi = strlen( l_frgzu ).

        DO l_shenpi TIMES.               "一级级审批

          CLEAR l_rel_code.
          CASE sy-index.
            WHEN 1.
              l_rel_code = l_frgc1.
            WHEN 2.
              l_rel_code = l_frgc2.
            WHEN 3.
              l_rel_code = l_frgc3.
            WHEN 4.
              l_rel_code = l_frgc4.
            WHEN 5.
              l_rel_code = l_frgc5.
          ENDCASE.

          CALL FUNCTION 'BAPI_REQUISITION_RELEASE'
            EXPORTING
              number                 = l_wa_057-banfn         "采购申请号
              item                   = l_wa_057-bnfpo         "行项目号
              rel_code               = l_rel_code
            TABLES
              return                 = lt_return
            EXCEPTIONS
              authority_check_fail   = 1
              requisition_not_found  = 2
              enqueue_fail           = 3
              prerequisite_fail      = 4
              release_already_posted = 5
              responsibility_fail    = 6
              OTHERS                 = 7.
          IF sy-subrc NE 0.
    *        MESSAGE  
          ENDIF.

        ENDDO.

        CLEAR l_wa_preq_data.




    "最开始使用的修改bapi是BAPI_PR_CHANGE,
    发现执行后,没有报错,但是采购申请并没有修改
    一直查原因,网上说跟服务采购申请有关,具体没深入研究
        lt_pritem-preq_item  =  l_wa_preq_data-bnfpo.                             "行项目号
        lt_pritem-quantity   =  l_wa_preq_data-menge_m.                           "数量
        lt_pritem-deliv_date =  l_wa_preq_data-lfdat_m.                           "交货日期
        APPEND lt_pritem.
        "影子字段,交货日期和数量打修改标示
        lt_pritemx-deliv_date = 'X'.                               
        lt_pritemx-quantity = 'X'.
        APPEND lt_pritemx.

        "修改采购申请BAPI
        CALL FUNCTION 'BAPI_PR_CHANGE'
          EXPORTING
            number  = l_wa_preq_data-banfn                                        "采购申请号
          TABLES
            return  = lt_return
            pritem  = lt_pritem
            pritemx = lt_pritemx.


    最后,提供一个比较完整的采购申请修改的例子:
    data: lt_items_old    like table of bapiebanv   with header line.
    data: lt_items_new    like table of bapiebanv   with header line.
    data: lt_account_old  like table of bapiebknv   with header line.
    data: lt_account_new  like table of bapiebknv   with header line.
    data: lt_items        like table of bapieban    with header line.
    data: lt_account      like table of bapiebkn    with header line.
    data: lt_bapireturn   like table of bapireturn  with header line.

    call function 'BAPI_REQUISITION_GETDETAIL'
      exporting
        number                         = i_banfn
        account_assignment             = 'X'
      tables
        requisition_items              = lt_items
        requisition_account_assignment = lt_account.

    loop at lt_items.
      move-corresponding lt_items to lt_items_old.
      append lt_items_old.
      clear lt_items_old.
      move-corresponding lt_items to lt_items_new.
      loop at t_eban where bnfpo = lt_items-preq_item.
        lt_items_new-short_text   = t_eban-txz01.
        lt_items_new-store_loc    = t_eban-lgort. "库存地点
        lt_items_new-quantity     = t_eban-menge.
        lt_items_new-unit         = t_eban-meins.
        lt_items_new-deliv_date   = t_eban-lfdat.
        lt_items_new-mat_grp      = t_eban-matkl.
        lt_items_new-store_loc    = t_eban-lgort.
        lt_items_new-pur_group    = t_eban-ekgrp.
        lt_items_new-c_amt_bapi   = t_eban-preis.
        lt_items_new-trackingno   = t_eban-bednr.
        lt_items_new-currency     = t_eban-waers.
        lt_items_new-price_unit   = t_eban-peinh.
      endloop.
      append lt_items_new.
      clear lt_items_new.
    endloop.

    loop at lt_account.
      move-corresponding lt_account to lt_account_old.
      append lt_account_old.
      clear lt_account_old.
      move-corresponding lt_account to lt_account_new.
      loop at t_ebkn where bnfpo  = lt_account-preq_item.
        lt_account_new-wbs_elem_e = t_ebkn-ps_psp_pnr.
        lt_account_new-g_l_acct   = t_ebkn-sakto.
        lt_account_new-cost_ctr   = t_ebkn-kostl.
        lt_account_new-asset_no   = t_ebkn-anln1.
        lt_account_new-order_no   = t_ebkn-aufnr.
        lt_account_new-co_area    = t_ebkn-kokrs.
      endloop.
      append lt_account_new.
      clear lt_account_new.
    endloop.

    loop at t_eban.
      read table lt_items with key preq_item = t_eban-bnfpo.
      if sy-subrc <> 0.
        lt_items_new-preq_item  = t_eban-bnfpo. "采购申请的项目编号
        lt_items_new-short_text = t_eban-txz01.
        lt_items_new-store_loc  = t_eban-lgort. "库存地点
        lt_items_new-quantity   = t_eban-menge.
        lt_items_new-unit       = t_eban-meins.
        lt_items_new-deliv_date = t_eban-lfdat.
        lt_items_new-mat_grp    = t_eban-matkl.
        lt_items_new-store_loc  = t_eban-lgort.
        lt_items_new-pur_group  = t_eban-ekgrp.
        lt_items_new-c_amt_bapi = t_eban-preis.
        lt_items_new-trackingno = t_eban-bednr.
        lt_items_new-currency   = t_eban-waers.
        lt_items_new-price_unit = t_eban-peinh.
        lt_items_new-des_vendor = t_eban-lifnr. "期望的供应商
        lt_items_new-fixed_vend = t_eban-flief. "固定的供应商
        lt_items_new-info_rec   = t_eban-infnr. "采购信息记录的编号
        lt_items_new-purch_org  = t_eban-ekorg. "采购组织
        append lt_items_new.
        clear lt_items_new.
      endif.

    endloop.

    loop at t_ebkn.
      read table lt_account with key preq_item = t_ebkn-bnfpo.
      if sy-subrc <> 0.
        lt_account_new-preq_item  = t_ebkn-bnfpo.
        lt_account_new-wbs_elem_e = t_ebkn-ps_psp_pnr.
        lt_account_new-g_l_acct   = t_ebkn-sakto.
        lt_account_new-cost_ctr   = t_ebkn-kostl.
        lt_account_new-asset_no   = t_ebkn-anln1.
        lt_account_new-order_no   = t_ebkn-aufnr.
        lt_account_new-co_area    = t_ebkn-kokrs.

        append lt_account_new.
        clear lt_account_new.
      endif.
    endloop.

    call function 'BAPI_REQUISITION_CHANGE'
      exporting
        number                  = i_banfn
      tables
        requisition_items_old   = lt_items_old
        requisition_items_new   = lt_items_new
        requisition_account_old = lt_account_old
        requisition_account_new = lt_account_new
        return                  = lt_bapireturn.
    http://blog.sina.com.cn/sapliumeng
  • 相关阅读:
    mysql 查询优化 ~ select count 知多少
    mongodb 案例 ~ 经典故障案例
    printk 驱动调试
    21天学通C++学习笔记(七):函数
    OPC UA
    MQTT
    分库分表
    水平、垂直权限问题(横向越权与纵向越权)
    数据库中的行转列和列转行
    面试知识点
  • 原文地址:https://www.cnblogs.com/senlinmu110/p/3802182.html
Copyright © 2011-2022 走看看