可以结合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.