事务代码:me51N
先选择凭证类型
科目分配类别为F时,创建所需字段。
科目分配类别为K时,创建所需字段。
其他与A类别一样,科目分配不同。
第三种情况,没有科目类别,没有项目类别,有物料号,创建所需字段。
数量,申请者
第四种情况,有物料和项目类别,没有科目类别,项目类别为K所需填写字段。
第五种情况,有物料和项目类别,没有科目类别,项目类别为L所需填写字段。
-
- 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.
DATA: gt_sq TYPE STANDARD TABLE OF zsmm03,
gs_sq TYPE zsmm03.
DATA: index 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或者为K 物料和项目类别为空
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或者为K 物料和项目类别为空
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. " 所需供应商 当为F 或为K 时,将固定供应商不填,将固定供应商的值填写再所需供应商中
* 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_bapireturn) WHERE type = 'E' OR type = 'A'.
ls_sign = 'E'.
ENDLOOP.
IF ls_sign <> 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
CLEAR:ls_header, gs_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.