创建采购申请

  1. 创建采购申请
    1. 前台创建

事务代码:me51N

 

先选择凭证类型

 

科目分配类别为F时,创建所需字段。

 

 

科目分配类别为K时,创建所需字段。

其他与A类别一样,科目分配不同。

 

 

 

第三种情况,没有科目类别,没有项目类别,有物料号,创建所需字段。

数量,申请者

 

第四种情况,有物料和项目类别,没有科目类别,项目类别为K所需填写字段。

 

 

 

 

 

 

 

 

 

 

 

第五种情况,有物料和项目类别,没有科目类别,项目类别为L所需填写字段。

    1. BP实现

 

*&---------------------------------------------------------------------*
*& Report YTEST002
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ytest002.




*创建采购申请

***************************采购申请创建*****************************begin
DATA:lv_banfn TYPE eban-banfn .
DATA:lv_bnfpo TYPE eban-bnfpo .

DATA:gw_pritem TYPE bapimereqitemimp,
     gt_pritem TYPE TABLE OF bapimereqitemimp.


DATA:gw_pritemx TYPE bapimereqitemx,
     gt_pritemx TYPE TABLE OF bapimereqitemx.

DATA:gw_head TYPE bapimereqheader  .
DATA:gw_headx TYPE bapimereqheaderx.
DATA:gt_bapireturn TYPE TABLE OF bapiret2 .

DATA:gt_ghy TYPE TABLE OF bapimereqsource,  供货源
     gs_ghy TYPE bapimereqsource.

DATA:gt_kmfp TYPE TABLE OF bapimereqaccount科目分配
     gs_kmfp TYPE bapimereqaccount.

DATA:gt_kmfpx TYPE TABLE OF bapimereqaccountx,
     gs_kmfpx TYPE bapimereqaccountx.

gw_head-pr_type 'NB'."订单类型
gw_headx-pr_type 'X' .


第一种情况  科目分配类别为A时所需字段************************
gw_pritem-preq_item 10 .
gw_pritem-acctasscat 'A' 科目分配类别
gw_pritem-short_text '1234' 短文本
gw_pritem-preq_name sy-uname.  申请者
*gw_pritem-material =  'EWMS4-10'. " 物料
gw_pritem-plant    =  '1000'.      工厂
gw_pritem-quantity =   2.          数量
gw_pritem-unit =   'CS'.           单位
gw_pritem-deliv_date sy-datum.

gw_pritem-pur_group 'E01'.           采购组
gw_pritem-matl_group '02'.         物料组
gw_pritem-purch_org '8000'.          采购组织
gw_pritem-preq_price '90'.          价格
APPEND gw_pritem TO gt_pritem .

gw_pritemx-preq_item 10 .
gw_pritemx-acctasscat 'X' 科目分配类别
gw_pritemx-short_text 'X' 短文本
gw_pritemx-preq_name  'X'.  申请者
*gw_pritemx-material   = 'X'.  " 物料
gw_pritemx-plant      'X'.  工厂
gw_pritemx-quantity   'X'.  数量
gw_pritemx-unit        'X'.  单位
gw_pritemx-deliv_date 'X'.  日期
IF gw_pritem-pur_group <> '' .  采购组
  gw_pritemx-pur_group 'X'.
ENDIF .
gw_pritemx-matl_group 'X'.       物料组
gw_pritemx-purch_org 'X'.          采购组织
gw_pritemx-preq_price 'X'.          价格
APPEND gw_pritemx TO gt_pritemx .



供货源
gs_ghy-des_vendor 'L1900000'所需供应商
gs_ghy-purch_org '8000'.      采购组织
APPEND gs_ghy TO gt_ghy.


科目分配
gs_kmfp-preq_item '00010'.          行项目
gs_kmfp-serial_no 01.
gs_kmfp-orderid '001020190001'订单
APPEND gs_kmfp TO gt_kmfp.

gs_kmfpx-preq_item '00010'.          行项目
gs_kmfpx-serial_no 01.
gs_kmfpx-orderid 'X'.
APPEND gs_kmfpx TO gt_kmfpx.


CALL FUNCTION 'BAPI_PR_CREATE'
  EXPORTING
    prheader     gw_head
    prheaderx    
gw_headx
  
IMPORTING
    number       lv_banfn
  
TABLES
    return       gt_bapireturn
    pritem       
gt_pritem
    pritemx      
gt_pritemx
    pritemsource 
gt_ghy    供货源
    praccount    gt_kmfp  科目分配
    praccountx   gt_kmfpx.

IF lv_banfn IS NOT INITIAL.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait 'X'.
  WRITE:'采购申请创建成功:',lv_banfn.
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.

 

 

 

 

FUNCTION zfmm03.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(LT_SQ) TYPE  ZTTMM03
*"  EXPORTING
*"     VALUE(LS_SIGN) TYPE  ZESIGN
*"     VALUE(LS_MESSAGE) TYPE  ZEMESSAGE
*"     VALUE(O_BANFN) TYPE  BANFN
*"----------------------------------------------------------------------

  DATA:lv_banfn TYPE eban-banfn .
  DATA:lv_bnfpo TYPE eban-bnfpo .

  DATA:gs_pritem TYPE bapimereqitemimp,
       gt_pritem TYPE TABLE OF bapimereqitemimp.


  DATA:gs_pritemx TYPE bapimereqitemx,
       gt_pritemx TYPE TABLE OF bapimereqitemx.

  DATA:gs_head TYPE bapimereqheader  .
  DATA:gs_headx TYPE bapimereqheaderx.
  DATA:gt_bapireturn TYPE TABLE OF bapiret2 .

  DATA:gt_ghy TYPE TABLE OF bapimereqsource,  供货源
       gs_ghy TYPE bapimereqsource.

  DATA:gt_kmfp TYPE TABLE OF bapimereqaccount科目分配
       gs_kmfp TYPE bapimereqaccount.

  DATA:gt_kmfpx TYPE TABLE OF bapimereqaccountx,
       gs_kmfpx TYPE bapimereqaccountx.

  DATAgt_sq TYPE STANDARD TABLE OF zsmm03,
        gs_sq TYPE zsmm03.
  DATAindex TYPE bnfpo.

  DATA:ls_header TYPE thead,
       gt_lines  TYPE STANDARD TABLE OF tline,
       gs_lines  TYPE tline.

  gt_sq lt_sq.

  SORT gt_sq BY bbsrt banfn ekorg ekgrp.

  LOOP AT gt_sq INTO gs_sq.
    IF gs_sq-knttp 'F' OR gs_sq-knttp 'K' AND gs_sq-matnr IS INITIAL AND gs_sq-epstp IS INITIAL.  "科目分配类别为A或者为物料和项目类别为空
      CONTINUE.
    ELSEIF  gs_sq-matnr IS NOT INITIAL AND gs_sq-knttp IS INITIAL.
      CONTINUE.
    ELSE.
      ls_sign 'E'.
      ls_message '请检查业务类型以及采购申请类型'.
      EXIT.
    ENDIF.
  ENDLOOP.

  IF ls_sign 'E'.
    RETURN.
  ENDIF.

  index 10.
  LOOP AT gt_sq INTO gs_sq.
    gs_head-preq_no  gs_sq-banfn"采购申请编号
    gs_head-pr_type  gs_sq-bbsrt"订单类型
    IF gs_sq-banfn IS NOT INITIAL.
      gs_headx-preq_no 'X'.        "采购申请编号
    ENDIF.
    gs_headx-pr_type 'X'.        "订单类型

    IF gs_sq-knttp 'F' OR gs_sq-knttp 'K' AND gs_sq-matnr IS INITIAL AND gs_sq-epstp IS INITIAL.  "科目分配类别为A或者为物料和项目类别为空
      gs_pritem-preq_item index.
      gs_pritem-acctasscat gs_sq-knttp .   科目分配类别
*      gs_pritem-ITEM_CAT = gs_sq-EPSTP .    " 项目类别
      gs_pritem-short_text gs_sq-txz01 .   短文本
      gs_pritem-preq_name  gs_sq-afnam.    申请者
*      gs_pritem-material   =  'EWMS4-10'.   " 物料
      gs_pritem-plant      gs_sq-werks.    工厂
      gs_pritem-quantity   gs_sq-menge.    数量
*      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
*        EXPORTING
*          input          = gs_sq-meins
*          language       = sy-langu
*        IMPORTING
*          output         = gs_sq-meins
*        EXCEPTIONS
*          unit_not_found = 1
*          OTHERS         = 2.
      gs_pritem-unit       gs_sq-meins.     采购申请计量单位
      gs_pritem-po_unit    gs_sq-meins.     订单单位
      gs_pritem-des_vendor gs_sq-flief.     所需供应商           当为或为时,将固定供应商不填,将固定供应商的值填写再所需供应商中
*      gs_pritem-deliv_date = sy-datum.
      gs_pritem-pur_group  gs_sq-ekgrp.     采购组
      gs_pritem-matl_group gs_sq-wgbez.     物料组
      gs_pritem-purch_org  gs_sq-ekorg.     采购组织
      gs_pritem-preq_price gs_sq-preis.     价格
*      gs_pritem-fixed_vend = gs_sq-flief.     " 固定供应商
      APPEND gs_pritem TO gt_pritem .

      gs_pritemx-preq_item index .
      gs_pritemx-acctasscat 'X' .     科目分配类别
*      gs_pritem-ITEM_CAT = 'X' .        " 项目类别
      gs_pritemx-short_text 'X' .     短文本
      gs_pritemx-preq_name  'X'.      申请者
*      gs_pritemx-material   = 'X'.      " 物料
      gs_pritemx-plant      'X'.      工厂
      gs_pritemx-quantity   'X'.      数量
      gs_pritemx-unit       'X'.      计量单位
      gs_pritemx-po_unit    'X'.      订单单位
      gs_pritemx-des_vendor 'X'.      所需供应商

*      gs_pritemx-deliv_date = 'X'.      " 日期
      IF gs_pritem-pur_group <> '' .    采购组
        gs_pritemx-pur_group 'X'.
      ENDIF .
      gs_pritemx-matl_group 'X'.       物料组
      gs_pritemx-purch_org  'X'.       采购组织
      gs_pritemx-preq_price 'X'.       价格
*      gs_pritemx-fixed_vend = 'X'.       " 固定供应商
      APPEND gs_pritemx TO gt_pritemx .


      科目分配
      gs_kmfp-preq_item  index.          行项目
      gs_kmfp-serial_no  index 10.

      gs_kmfp-gl_account gs_sq-sakto.     总账科目
      IF gs_sq-knttp 'F'.
        gs_kmfp-orderid    gs_sq-aufnr.   订单内部订单号
      ELSEIF gs_sq-knttp 'K'.
        gs_kmfp-costcenter gs_sq-kostl.            成本中心
      ENDIF.

      APPEND gs_kmfp TO gt_kmfp.

      gs_kmfpx-preq_item index.          行项目
      gs_kmfpx-serial_no index 10.

      gs_kmfpx-gl_account 'X'.           总账科目
      IF gs_sq-knttp 'F'.
        gs_kmfpx-orderid 'X'.
      ELSEIF gs_sq-knttp 'K'.
        gs_kmfpx-costcenter 'X'.         成本中心
      ENDIF.
      APPEND gs_kmfpx TO gt_kmfpx.

    ELSEIF gs_sq-matnr IS NOT INITIAL AND gs_sq-knttp IS INITIAL 有物料无项目类别   有物料或者项目类别为K L
      gs_pritem-preq_item index.
*      gs_pritem-acctasscat = gs_sq-knttp .  " 科目分配类别

      IF gs_sq-epstp IS NOT INITIAL.
        gs_pritem-item_cat   gs_sq-epstp .    项目类别
      ENDIF.
      gs_pritem-short_text gs_sq-txz01 .   短文本
      gs_pritem-preq_name  gs_sq-afnam.    申请者
      gs_pritem-material   gs_sq-matnr.    物料
      gs_pritem-plant      gs_sq-werks.    工厂
      gs_pritem-quantity   gs_sq-menge.    数量
*      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
*        EXPORTING
*          input          = gs_sq-meins
*          language       = sy-langu
*        IMPORTING
*          output         = gs_sq-meins
*        EXCEPTIONS
*          unit_not_found = 1
*          OTHERS         = 2.
*      gs_pritem-unit       = gs_sq-meins.     " 采购申请计量单位
      gs_pritem-po_unit    gs_sq-meins.          订单单位
      gs_pritem-des_vendor gs_sq-lifnr.     所需供应商
*      gs_pritem-deliv_date = sy-datum.
      gs_pritem-pur_group  gs_sq-ekgrp.     采购组
      gs_pritem-matl_group gs_sq-wgbez.     物料组
      gs_pritem-purch_org  gs_sq-ekorg.     采购组织
      gs_pritem-preq_price gs_sq-preis.     价格
      gs_pritem-fixed_vend gs_sq-flief.     固定供应商
      APPEND gs_pritem TO gt_pritem .

      gs_pritemx-preq_item index .
*      gs_pritemx-acctasscat = 'X' .     " 科目分配类别
      IF gs_sq-epstp IS NOT INITIAL.
        gs_pritemx-item_cat 'X' .        项目类别
      ENDIF.
      gs_pritemx-short_text 'X' .     短文本
      gs_pritemx-preq_name  'X'.      申请者
      gs_pritemx-material   'X'.      物料
      gs_pritemx-plant      'X'.      工厂
      gs_pritemx-quantity   'X'.      数量
*      gs_pritemx-unit       = 'X'.      " 计量单位
      gs_pritemx-po_unit    'X'.      订单单位
      gs_pritemx-des_vendor 'X'.      所需供应商

*      gs_pritemx-deliv_date = 'X'.      " 日期
      IF gs_pritem-pur_group <> '' .    采购组
        gs_pritemx-pur_group 'X'.
      ENDIF .
      gs_pritemx-matl_group 'X'.       物料组
      gs_pritemx-purch_org  'X'.       采购组织
      gs_pritemx-preq_price 'X'.       价格
      gs_pritemx-fixed_vend 'X'.       固定供应商
      APPEND gs_pritemx TO gt_pritemx .


      科目分配
*      gs_kmfp-preq_item  = index.          " 行项目
*      gs_kmfp-serial_no  = index / 10.
*
*      gs_kmfp-gl_account = gs_sq-sakto.     " 总账科目
*      IF gs_sq-knttp = 'A'.
*        gs_kmfp-orderid    = gs_sq-aufnr.   " 订单内部订单号
*      ELSEIF gs_sq-knttp = 'K'.
*        gs_kmfp-costcenter = ''.            " 成本中心
*      ENDIF.
*      APPEND gs_kmfp TO gt_kmfp.

*      gs_kmfpx-preq_item = index.          " 行项目
*      gs_kmfpx-serial_no = index / 10.
*      gs_kmfpx-gl_account = 'X'.           " 总账科目
*      IF gs_sq-knttp = 'A'.
*        gs_kmfpx-orderid = 'X'.
*      ELSEIF gs_sq-knttp = 'K'.
*        gs_kmfpx-costcenter = 'X'.         " 成本中心
*      ENDIF.
*      APPEND gs_kmfpx TO gt_kmfpx.


    ENDIF.

    index index 10.
    AT END OF ekgrp.
      CALL FUNCTION 'BAPI_PR_CREATE'
        EXPORTING
          prheader   gs_head
          prheaderx  
gs_headx
        
IMPORTING
          number     lv_banfn
        
TABLES
          return     gt_bapireturn
          pritem     
gt_pritem
          pritemx    
gt_pritemx
*         pritemsource = gt_ghy    " 供货源
          praccount  gt_kmfp  科目分配
          praccountx gt_kmfpx.

      index 10.
    ENDAT.
    LOOP AT gt_bapireturn INTO DATA(gs_bapireturnWHERE type 'E' OR type 'A'.
      ls_sign 'E'.
    ENDLOOP.

    IF ls_sign <> 'E'.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait 'X'.

      CLEAR:ls_headergs_lines.
      ls_header-tdobject 'EBANH'."文本应用程序对象
      ls_header-tdname lv_banfn ."名称
      ls_header-tdid 'B01'."文本 ID
      ls_header-tdspras '1'."语言代码

      gs_lines-tdformat '1'."标记列
      gs_lines-tdline =  gs_sq-ztext."标记列
      APPEND gs_lines TO gt_lines.
      DELETE ADJACENT DUPLICATES FROM gt_lines COMPARING tdline.
      CALL FUNCTION 'SAVE_TEXT'
        EXPORTING
          client          sy-mandt
          
header          ls_header
*         INSERT          = ' '
          savemode_direct 'X'
*         OWNER_SPECIFIED = ' '
*         LOCAL_CAT       = ' '
*   IMPORTING
*         FUNCTION        =
*         NEWHEADER       =
        TABLES
          lines           gt_lines
        
EXCEPTIONS
          id              1
          language        2
          name            3
          object          4
          OTHERS          5.
      IF sy-subrc <> 0.
        ls_message '采购申请创建成功,邮箱地址创建失败'.
        o_banfn lv_banfn.
      ELSE.
        ls_sign 'S'.
        ls_message '采购申请创建成功'.
        o_banfn lv_banfn.
      ENDIF.
    ELSE.
      ls_sign 'E'.
      LOOP AT gt_bapireturn INTO gs_bapireturn WHERE type 'E' OR type 'A' .
        ls_message ls_message && gs_bapireturn-message.
      ENDLOOP.
    ENDIF.

    CLEAR gs_sq.
  ENDLOOP.

  CLEAR index.
  CLEAR ls_sign.

ENDFUNCTION.

猜你喜欢

转载自blog.csdn.net/z_x_xing_/article/details/90074400