SAP-BADI-使用增强清单
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、使用BADI的增强清单 (1)
.ZMB_MIGO_BADI (1)
Method: PUBLISH_MATERIAL_ITEM (1)
.ZMB_RESERVATION_BADI (3)
Method: DATA_CHECK (3)
.ZME_HOLD_PO (6)
Method: IS_ALLOWED (6)
.ZME_PROCESS_PO_CUST (7)
Method: PROCESS_ITEM (7)
.ZME_PROCESS_REQ_CUST (10)
%
Method: OPEN (10)
Method: PROCESS_ITEM (10)
Method: PROCESS_ACCOUNT (22)
.ZME_REQ_POSTED (22)
Method: POSTED (22)
.ZMRM_HEADER_CHECK (23)
Method: HEADERDATA_CHECK (23)
2、使用USER_EXIT的增强清单 (27)
.Project:ZMM1 外部采购文件审批的增强处理项目 (27)
User Exit: M06E0004 (27)
.Project:ZMM2 采购申请审批的增强处理项目 (35)
^
User Exit: M06B0002 (35)
.Project:ZMM3 (36)
User Exit: LMEKO001 (36)
User Exit: LMEKO002 (36)
.Project: ZMM5 采购文件建立的增强 (36)
User Exit: MM06E005在采购凭证中的客户字段 (36)
.Project: ZMM6 (43)
User Exit: MBCF0002物料凭证项目中的段文本 (43)
{
1、使用BADI的增强清单
1.1.Z MB_MIGO_BADI
1.1.1.Method: PUBLISH_MATERIAL_ITEM
-
method IF_EX_MB_MIGO_BADI~PUBLISH_MATERIAL_ITEM .
data abc(40) value '(SAPLMIGO)GODYNPRO-DETAIL_TAKE'.
data: text type string,
ZGOITEM TYPE GOITEM.
DATA zME TYPE C.
data: ctr(70).
data: p_line type table of TLINE initial size 0.
DATA P_INLINES type table of TLINE initial size 0 .
field-symbols: <f01> type any.
assign (abc) to <f01>.
MOVE LS_GOITEM TO ZGOITEM.
<
*---------------------------------------------------------------* *检查物料的ABC状态
*----------------------------------------------------------------* IF ZGOITEM-EKORG = '2000' and ZGOITEM-MATNR is not initial
and ( ZGOITEM-BWART = '103' or ZGOITEM-BWART = '101' )
AND <f01> = 'X'.
CALL FUNCTION 'Z_MIGO_DIS_MAT'
EXPORTING
zmatnr = ZGOITEM-MATNR
zwerks = ZGOITEM-werks
* CHANGING
!
* DT =
EXCEPTIONS
CANCELLED = 1
NO_VALUES = 2
OTHERS = 3
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
!
endif.
*---------------------------------------------------------------* *对设备备件103收货后是否进行检验结果纪录进行检查
*---------------------------------------------------------------*
IF zgoitem-bwart = '105' AND zgoitem-ekorg = '2000'
AND zgoitem-xdetermination = ' '. "库存确定选择才进行判断
IF zgoitem-webre = ' '.
MESSAGE w000(zz) WITH '非基于收货的发票校验情况下,不确定是否已有检验结果'. ELSE.
* concatenate ZGOITEM-LFBNR ZGOITEM-LFBJA ZGOITEM-LFPOS into ctr.
#
* CALL FUNCTION 'ZTEXT_READ_CHECK'
* EXPORTING
* ID = 'F00'
* INLINE_COUNT = '1'
* LANGUAGE = '1'
* NAME = CTR
* OBJECT = 'MSEG'
** LOCAL_CAT = ' '
* IMPORTING
** HEADER =
* ME = zME
^
* TABLES
* INLINES = P_INLINES
* LINES = P_LINE
** EXCEPTIONS
** ID = 1
** LANGUAGE = 2
** NAME = 3
** NOT_FOUND = 4
** OBJECT = 5
** REFERENCE_CHECK = 6
** OTHERS = 7
{
* .
* IF SY-SUBRC <> 0.
** MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
** WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
* ENDIF.
* if zme = 1.
* message I024(zz) with zGOITEM-LFBNR ZGOITEM-LFBJA ZGOITEM-LFPOS.
* LEAVE TO TRANSACTION 'MIGO'.
* endif.
* clear ctr.
*&------------------------------------------------------------*
!
*&CHANGE THE LOGIC FOR THE RESULT OF QUALITY MAINTAINENCE
*&------------------------------------------------------------*
SELECT SINGLE * FROM zm01_s_103 INTO wa_zm01_s_103 WHERE
zmblnr = zgoitem-lfbnr AND
zmjahr = zgoitem-lfbja AND
zzeile = zgoitem-lfpos.
IF sy-subrc NE 0.
MESSAGE i024(zz) WITH zgoitem-lfbnr zgoitem-lfbja zgoitem-lfpos. LEAVE TO TRANSACTION 'MIGO'.
ENDIF.
ENDIF.
<
ENDIF.
*---------------------------------------------------------*
*&
*---------------------------------------------------------*
IF zgoitem-bwart = '101' AND zgoitem-ekorg = '2000'
AND zgoitem-pstyp = '0'
AND zgoitem-knttp = ''.
MESSAGE i000(zz) WITH '设备备件正常收货请使用移动类型103/105'.
* leave to screen 2000.
LEAVE TO TRANSACTION 'MIGO'.
}
ENDIF.
ENDMETHOD.
IF_EX_MB_MIGO_BADI~POST_DOCUMENT
METHOD if_ex_mb_migo_badi~post_document.
DATA: zit_mseg TYPE LINE OF ty_t_mseg,
zis_mkpf TYPE mkpf.
DATA: wa_mseg TYPE mseg.
DATA: WA_ZMM02 TYPE ZMM02.
DATA: MBLNR TYPE MSEG-MBLNR.
DATA: ZEILE TYPE MSEG-ZEILE.
DATA: MJAHR TYPE MSEG-MJAHR.
¥
DATA: EBELN TYPE EKPO-EBELN.
DATA: EBELP TYPE EKPO-EBELP.
BREAK WANGXIANBAO.
****************************************************************
*/对采购订单已经交货完成标志的不允许继续交货进行判断
****************************************************************
* DATA: zelikz TYPE ekpo-elikz.
* LOOP AT it_mseg INTO zit_mseg WHERE BWART EQ '101'
* AND WERKS EQ '6000'.
* CLEAR ZELIKZ.
* SELECT SINGLE elikz INTO zelikz FROM ekpo WHERE ebeln = ZIT_MSEG-EBELN `
* AND ebelp = ZIT_MSEG-EBELP. *
* IF zelikz = 'X'.
* MESSAGE E044(zz) WITH ZIT_MSEG-EBELN ZIT_MSEG-EBELP.
* LEAVE TO TRANSACTION 'MIGO'.
* ENDIF.
*
* ENDLOOP.
*
**************************************************
*/实现让步使用输入采购订单、收货凭证和让步减单价值
,
**************************************************
LOOP AT it_mseg INTO zit_mseg
WHERE bwart EQ '343'
AND grund EQ '0001'
AND werks EQ '6000'
AND xauto EQ ''.
CALL FUNCTION 'ZMM_CALL_ZMM02_MANTAIN'
EXPORTING
smbln = zit_mseg-mblnr
sjahr = zit_mseg-mjahr
smblp = zit_mseg-zeile
.
matnr = zit_mseg-matnr
bwart = zit_mseg-bwart
menge = zit_mseg-menge
meins = zit_mseg-meins
charg = zit_mseg-charg
IMPORTING
MBLNR = MBLNR
ZEILE = ZEILE
MJAHR = MJAHR
EBELN = EBELN
EBELP = EBELP.
$
* SELECT SINGLE * INTO WA_ZMM02 FROM ZMM02
* WHERE MBLNR = MBLNR
* AND MJAHR = MJAHR
* AND ZEILE = ZEILE
* AND EBELN = EBELN
* AND EBELP = EBELP
* AND smbln = zit_mseg-mblnr
* AND sjahr = zit_mseg-mjahr
* AND smblp = zit_mseg-zeile.
*
#
* IF SY-SUBRC NE 0.
* MESSAGE E016(ZZ) WITH ZIT_MSEG-MATNR.
* ENDIF.
ENDLOOP.
ENDMETHOD.
IF_EX_MB_MIGO_BADI~CHECK_ITEM
METHOD if_ex_mb_migo_badi~check_item.
DATA: zelikz TYPE ekpo-elikz.
DATA: l_po_number(40) TYPE c VALUE '(SAPLMIGO)GOITEM-EBELN'.
DATA: l_po_item(40) TYPE c VALUE '(SAPLMIGO)GOITEM-EBELP'.
DATA: l_bwart(40) TYPE c VALUE '(SAPLMIGO)GOITEM-BWART'.
、
FIELD-SYMBOLS: <fs1> TYPE ANY.
FIELD-SYMBOLS: <fs2> TYPE ANY.
FIELD-SYMBOLS: <fs3> TYPE ANY.
ASSIGN (l_po_number) TO <fs1>.
ASSIGN (l_po_item) TO <fs2>.
ASSIGN (l_bwart) TO <fs3>.
break wangxianbao.
****************************************************************
*/对采购订单已经交货完成标志的不允许继续交货进行判断
****************************************************************
IF <fs3> IS NOT INITIAL.
]
IF <fs3> EQ '101'.
IF <fs1> IS NOT INITIAL AND <fs2> IS NOT INITIAL.
SELECT SINGLE elikz INTO zelikz FROM ekpo WHERE ebeln = <fs1> AND ebelp = <fs2>. IF zelikz = 'X'.
MESSAGE i044(zz) WITH <fs1> <fs2>.
LEAVE TO TRANSACTION 'MIGO'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
?
ENDMETHOD.
1.2.Z MB_RESERVATION_BADI
1.2.1.Method: DATA_CHECK
METHOD if_ex_mb_reservation_badi~data_check.
DATA: zresb TYPE resb,
zmarc TYPE marc,
zrkpf TYPE rkpf,
zmara TYPE mara.
DATA: zit_changeable TYPE tdtab_c132.
—
DATA: zi_new_item TYPE c.
DATA: zflag TYPE c.
DATA: zbdter TYPE resb-bdter.
DATA: p_atinn TYPE cabn-atinn.
DATA: zkostl TYPE rkpf-kostl.
DATA: wa_zdepb TYPE zdepb.
DATA: zusnam TYPE zdepb-usnam.
zresb = is_resb.
zrkpf = is_rkpf.
**********************************************************************
*/对提报成本中心预留的要料计划,控制用户是否有权提报指定成本中心的预留
'
**********************************************************************
IF zrkpf-bwart EQ 'Z09' OR zrkpf-bwart EQ 'Z11' OR zrkpf-bwart EQ 'Z13'
OR zrkpf-bwart EQ 'Z15' OR zrkpf-bwart EQ 'Z17' OR zrkpf-bwart EQ 'Z19' OR zrkpf-bwart EQ 'Z10' OR zrkpf-bwart EQ 'Z12' OR zrkpf-bwart EQ 'Z14' OR zrkpf-bwart EQ 'Z16' OR zrkpf-bwart EQ 'Z18' OR zrkpf-bwart EQ 'Z20'. * break wangxianbao.
zkostl = zrkpf-kostl+2(4).
zusnam = sy-uname.
SELECT SINGLE * INTO wa_zdepb FROM zdepb WHERE usnam = zusnam
AND grpname = zkostl.
IF sy-subrc <> 0.
$
* MESSAGE e041(zz) WITH ZUSNAM ZRKPF-KOSTL.
ENDIF.
ENDIF.
**********************************************************************
*/对成本中心预留的移动类型进行控制
**********************************************************************
IF zrkpf-bwart EQ 'Z09'. "主体单位成本中心
break wangxianbao.
zkostl = zrkpf-kostl+2(4).
IF zkostl NE '6023' AND Zkostl NE '6024' AND zkostl NE '6025' AND zkostl NE '6026' AND zkostl NE '6027' AND zkostl NE '6028' AND zkostl NE '6029' AND zkostl NE '6030'
~
AND zkostl NE '6031' AND zkostl NE '6032' AND zkostl NE '6533'.
MESSAGE E000(zz) WITH '辅助单位生产以领代耗物资必须用Z11!'.
ENDIF.
ENDIF.
IF zrkpf-bwart EQ 'Z11'. "辅助单位成本中心
break wangxianbao.
zkostl = zrkpf-kostl+2(4).
IF zkostl EQ '6023' OR zkostl EQ '6024' OR zkostl EQ '6025' OR zkostl EQ '6026' OR zkostl EQ '6027' OR zkostl EQ '6028' OR zkostl EQ '6029' OR zkostl EQ '6030' OR zkostl EQ '6031' OR zkostl EQ '6032' OR zkostl EQ '6533'.
MESSAGE E000(zz) WITH '主线单位生产以领代耗物资必须用Z09!'.
:
ENDIF.
ENDIF.
***************************************************************
*/对设备备件的预留必须输入计划批次号进行控制
***************************************************************
SELECT SINGLE * INTO zmarc FROM marc WHERE matnr = zresb-matnr.
SELECT SINGLE * INTO zmara FROM mara WHERE matnr = zresb-matnr.
IF sy-subrc EQ 0.
IF zmarc-xchpf = 'X' AND
( zmara-mtart = 'B001' OR zmara-mtart = 'B002' ).
IF zresb-charg IS INITIAL AND zresb-xloek IS INITIAL .
—
MESSAGE e000(zz) WITH '针对设备备件的预留必须输入计划批次号'.
ENDIF.
IF zresb-lgort IS INITIAL.
MESSAGE w000(zz) WITH '没有指定库存地预留对该计划批次的所有库存地有效'.
ENDIF.
ENDIF.
ENDIF.
***************************************************************
*/对使用单位创建原燃材料的预留时不能输入库存地点进行控制
***************************************************************
IF sy-tcode = 'MB21'.
】
SELECT SINGLE * INTO zmara FROM mara WHERE matnr = zresb-matnr.
IF zmara-mtart = 'A001' OR zmara-mtart = 'A002' OR zmara-mtart = 'A003'.
IF zresb-lgort IS NOT INITIAL.
MESSAGE e000(zz) WITH '创建原燃材料预留时不能指定库存地点!'.
ENDIF.
ENDIF.
ENDIF.
***************************************************************
*/对需要计量的原燃料在SAP系统中提报预留警告提示
***************************************************************
* break wangxianbao.
(
IF zrkpf-umwrk EQ '6000'.
SELECT SINGLE * INTO zmara FROM mara WHERE matnr = zresb-matnr.
IF zmara-mtart = 'A003'.
MESSAGE e036(zz).
ENDIF.
ENDIF.
SELECT SINGLE atinn FROM cabn INTO p_atinn WHERE atnam = 'ZYL-012'.
IF sy-subrc = 0.
SELECT SINGLE atwrt INTO zflag FROM ausp
WHERE objek = zresb-matnr
AND atinn = p_atinn
【
AND klart = '001'.
IF zflag EQ 'A'.
MESSAGE w035(zz) WITH zresb-matnr.
ENDIF.
ENDIF.
***************************************************************
**/对原燃料控制不能在SAP系统中提报Z09和Z11的预留
***************************************************************
IF zrkpf-bwart EQ 'Z09' OR zrkpf-bwart EQ 'Z11'.
SELECT SINGLE * INTO zmara FROM mara WHERE matnr = zresb-matnr.
IF zmara-mtart EQ 'A001' OR zmara-mtart EQ 'A002'.
?
MESSAGE w039(zz) WITH zresb-matnr.
ENDIF.
ENDIF.
***************************************************************
*/对提报要料计划,需求日期不能超过当前日期+11天
***************************************************************
IF zrkpf-bwart EQ 'Z09' OR zrkpf-bwart EQ 'Z11' OR zrkpf-bwart EQ 'Z13'
OR zrkpf-bwart EQ 'Z15' OR zrkpf-bwart EQ 'Z17' OR zrkpf-bwart EQ 'Z19' OR zrkpf-bwart EQ 'Z61' OR zrkpf-bwart EQ '241' OR zrkpf-bwart EQ '301'. * break wangxianbao.
zbdter = sy-datum + 11.
~
IF zresb-bdter > zbdter.
MESSAGE e037(zz) WITH zbdter.
ENDIF.
ENDIF.
***************************************************************
*/对提报退货预留,需求日期不能超过当前日期+3天
***************************************************************
IF zrkpf-bwart EQ 'Z10' OR zrkpf-bwart EQ 'Z12' OR zrkpf-bwart EQ 'Z14'
OR zrkpf-bwart EQ 'Z16' OR zrkpf-bwart EQ 'Z18' OR zrkpf-bwart EQ 'Z20' OR zrkpf-bwart EQ 'Z62' OR zrkpf-bwart EQ '242' OR zrkpf-bwart EQ '302'. * break wangxianbao.
[
zbdter = sy-datum + 3.
IF zresb-bdter > zbdter.
MESSAGE e037(zz) WITH zbdter.
ENDIF.
ENDIF.
CLEAR:zresb,zrkpf,zmarc,zmara,zflag,p_atinn.
ENDMETHOD.
1.3.Z ME_HOLD_PO
1.3.1.Method: IS_ALLOWED
(
method IF_EX_ME_HOLD_PO~IS_ALLOWED.
*-----------------------------------------------------------*
* disable the hold function when any error exists in the document
*-----------------------------------------------------------*
break wangxianbao.
ch_allowed = space.
IF im_ekko-bsart IS NOT INITIAL.
IF im_bekpo[] IS INITIAL.
ch_allowed = space.
EXIT.
ELSE.
(
IF im_header_with_error NE space.
ch_allowed = space.
EXIT.
ENDIF.
READ TABLE im_bekpo WITH KEY item_with_error = 'X'
TRANSPORTING NO FIELDS.
IF sy-subrc IS INITIAL.
ch_allowed = space.
EXIT.
ENDIF.
READ TABLE im_beket WITH KEY item_with_error = 'X'
;
TRANSPORTING NO FIELDS.
IF sy-subrc IS INITIAL.
ch_allowed = space.
EXIT.
ENDIF.
READ TABLE im_ekknu WITH KEY item_with_error = 'X'
TRANSPORTING NO FIELDS.
IF sy-subrc IS INITIAL.
ch_allowed = space.
EXIT.
ENDIF.
—
ENDIF.
ENDIF.
IF ch_allowed NE 'X'.
break wangxianbao.
ch_allowed = space.
ENDIF.
endmethod.
1.4.Z ME_PROCESS_PO_CUST
1.4.1.Method: PROCESS_ITEM
******************************************************************** :
METHOD if_ex_me_process_po_cust~process_item.
TYPES: mm1 TYPE komv .
DATA: item TYPE mmpur_tkomv.
DATA: item1 TYPE mm1.
DATA: zwyt3 TYPE wyt3.
************************
DATA: item2 TYPE mepoitem,
header2 TYPE mepoheader,
m_header2 TYPE REF TO if_purchase_order_mm.
DATA: zkostl TYPE mepoitem-kostl.
DATA: zbednr TYPE mepoitem-bednr.
-
DATA: zbednr1 TYPE mepoitem-bednr.
DATA: wa_zdepb TYPE zdepb.
DATA: wa_ekko TYPE ekko,
wa_ekpo TYPE ekpo,
wa_mbew TYPE mbew,
wa_ekbe TYPE ekbe,
wa_t16fb type t16fb.
DATA wa_eban TYPE eban.
break wangxianbao.
m_header2 = im_item->get_header( ). " 获取采购订单抬头对象
header2 = m_header2->get_data( ). " 获取采购订单抬头
…
item2 = im_item->get_data( ). " 获取采购订单行项目
***********************************************************************
**/针对订单类型YB的各种检查程序段-----开始
IF header2-bsart EQ 'YB'.
IF NOT item2 IS INITIAL.
zbednr = item2-bednr.
zkostl = item2-kostl.
********************************************************************************* **/控制物料主数据中评估类为3080的只能创建科目分配类别为I的直接为成本中心采购的订单********************************************************************************* SELECT SINGLE * FROM mbew INTO wa_mbew WHERE matnr = item2-matnr
?
AND bwkey = item2-werks
AND bklas = '3080'.
IF sy-subrc = 0.
IF item2-knttp NE 'I'.
MESSAGE e003(zz) WITH item2-matnr.
ENDIF.
ENDIF.
IF item2-knttp EQ 'I'.
SELECT SINGLE * FROM mbew INTO wa_mbew WHERE matnr = item2-matnr
AND bwkey = item2-werks
AND bklas = '3080'.
|
IF sy-subrc NE 0.
MESSAGE e003(zz) WITH item2-matnr.
ENDIF.
ENDIF.
********************************************************************************** ***********
**/控制科目分配类别为H的直接为成本中心的采购订单,其输入的成本中心必须为主体上线单位的成本中心
********************************************************************************** ***********
IF item2-knttp EQ 'H'.
zbednr1 = zkostl+2(4).
IF zbednr1 IS NOT INITIAL.
CLEAR wa_zdepb.
]
SELECT SINGLE * FROM zdepb INTO wa_zdepb WHERE grpname = zbednr1
AND zflag = 'A'.
IF sy-subrc NE 0.
MESSAGE e005(zz) WITH item2-knttp.
ENDIF.
ENDIF.
ENDIF.
********************************************************************************** ***********
**/控制科目分配类别为J的直接为成本中心的采购订单,其输入的成本中心必须为辅助单位的成本中心
********************************************************************************** ***********
IF item2-knttp EQ 'J'.
`
zbednr1 = zkostl+2(4).
IF zbednr1 IS NOT INITIAL.
CLEAR wa_zdepb.
SELECT SINGLE * FROM zdepb INTO wa_zdepb WHERE grpname = zbednr1
AND zflag = 'B'.
IF sy-subrc NE 0.
MESSAGE e005(zz) WITH item2-knttp.
ENDIF.
ENDIF.
ENDIF.
~
******************************************************************
ENDIF.
ENDIF.
***********************************************************************
**/针对订单类型YB的各种检查程序段<-----结束
*************************************************************************
*&----------------------------------------------------------------------------------*
*建立采购订单时将采购申请的批次号(供应商物料字段)传递到采购订单中-设备备件用
*-----------------------------------------------------------------------------------*
IF item2-charg IS INITIAL AND ( header2-bsart = 'SP01'
OR header2-bsart = 'SP02'
—
OR header2-bsart = 'TB') .
* HEADER2-BSART = 'SP01' OR HEADER2-BSART = 'SP02'.
if item2-KONNR is initial.
SELECT SINGLE * INTO wa_eban FROM eban WHERE banfn = item2-banfn AND
bnfpo = item2-bnfpo.
item2-charg = wa_eban-idnlf .
CLEAR wa_eban.
else.
select single * into wa_ekpo from ekpo where ebeln = item2-KONNR and
ebelp = item2-KTPNR.
(
SELECT SINGLE * INTO wa_eban FROM eban WHERE banfn = wa_ekpo-banfn AND bnfpo = wa_ekpo-bnfpo.
if sy-subrc eq 0.
item2-charg = wa_eban-idnlf .
CLEAR:wa_eban,wa_ekpo.
endif.
endif.
CALL METHOD im_item->set_data
EXPORTING
im_data = item2.
ENDIF.
:
*********************************************************************** **/根据供应商合作伙伴,自动设定FRE对应的供应商
************************************************************************* CALL METHOD im_item->get_conditions
IMPORTING
ex_conditions = item.
LOOP AT item INTO item1 WHERE kvsl1 = 'FRE'.
* and KVSL2 = 'FR1'.
SELECT SINGLE * FROM wyt3 INTO zwyt3 WHERE lifnr = item1-lifnr
%
AND parvw = 'TF'.
IF sy-subrc = 0.
item1-lifnr = zwyt3-lifn2.
MODIFY item FROM item1.
ENDIF.
ENDLOOP.
CALL METHOD im_item->set_conditions
EXPORTING
im_conditions = item.
-
*******************************************************************
*&----------------------------------------------------------------------------------*
*建立采购订单时检查询价单是否经过审批
*-----------------------------------------------------------------------------------*
if item2-ANFNR is not initial.
select single * from ekko into wA_ekko where ebeln = item2-ANFNR.
if sy-subrc eq 0.
select single * from t16fb into wa_t16fb where FRGKE = wA_ekko-FRGKE.
if wa_t16fb-KZFRE NE 'X'.
MESSAGE E000(ZZ) WITH '询价单未审批,不能建立采购订单'.
ENDIF.
$
endif.
endif.
CLEAR:wA_ekko,wa_t16fb.
*&----------------------------------------------------------------------------------*
*检查总帐科目是否为空
*-----------------------------------------------------------------------------------*
if item2-KOSTL is not initial and item2-SAKTO is initial.
message e051(zz).
endif.
ENDMETHOD.
,
method IF_EX_ME_PROCESS_PO_CUST~CHECK.
BREAK WANGXIANBAO.
IF SY-TCODE = 'ME21N' AND SY-UCOMM = 'MESAVEPR'.
MESSAGE E000(zz) WITH '采购订单不允许暂存!'.
ENDIF.
endmethod.
1.5.Z ME_PROCESS_REQ_CUST
1.5.1.Method: OPEN
METHOD if_ex_me_process_req_cust~open.
|
DATA: tf_01 TYPE REF TO zif_ex_me_process_req_me.
DATA: zheader TYPE REF TO if_purchase_requisition.
DATA: zeban TYPE mereq_item. "结构-采购申请行项目
DATA: zmereq TYPE mereq_header."结构-采购申请抬头
DATA: zbednr TYPE eban-bednr. "需求跟踪号
DATA: wa_zdepb TYPE zdepb, "所在部门与用户对照表(YCL)
wa_mbew TYPE mbew. "物料评估
DATA:t_eban TYPE TABLE OF eban INITIAL SIZE 0 .
DATA: zex_strategy TYPE REF TO if_release_strategy_mm.
DATA: zex_state TYPE REF TO if_release_state_mm.
DATA: zre_codes TYPE merel_t_codes. "已经审批代码
|
DATA: zrel_code TYPE frgco. "当前用户授权的审批代码
DATA: zre_allowed1 TYPE mmpur_bool. "是否审批标志
DATA: zre_allowed2 TYPE mmpur_bool. "是否取消审批标志
DATA: zre_allowed3 TYPE mmpur_bool. "点击取消审批按钮
DATA: zex_frggr TYPE eban-frggr. "审批组
DATA: zex_frgst TYPE eban-frgst. "审批策略
DATA: zex_codes TYPE merel_t_codes. "审批代码
DATA: zre_codes1 TYPE merel_t_codes.
DATA: zex_prerequisites TYPE merel_t_prereq.
DATA: zex_final TYPE merel_t_final.
DATA: zex_group TYPE frggr.
\
DATA: wa_re_codes1 LIKE LINE OF zre_codes1.
DATA: zre_fgrco TYPE frgco. "已经审批的最后一级审批代码
DATA: tmp01 LIKE LINE OF zex_codes.
DATA: zbednr1 TYPE eban-bednr.
DATA: zint TYPE i.
DATA: zbadat TYPE eban-badat.
DATA: zunq1 TYPE zscalar-zunq.
DATA: zbnfpo TYPE eban-bnfpo.
DATA: zbanfn TYPE eban-banfn.
DATA: zeban1 TYPE eban.
DATA: ztemp1(2) TYPE c.。
DATA: zusnam TYPE zdepb-usnam.
DATA: l_feld(40) TYPE c VALUE '(SAPLMEGUI)MEREQ_TOPLINE-BANFN_EXT'.
DATA: fban(40) TYPE c VALUE '(SAPLMEGUI)MEREQ_TOPLINE-BANFN_EXT'.
FIELD-SYMBOLS: <fs> TYPE ANY.
zeban = im_item->get_data( ).
break wangxianbao.
********************************************************************************** *****
*/检查紧急采购计划次数是否超标和正常计划,必须在每月23-29日创建,其余时间只能报紧急计划
********************************************************************************** *****
IF zeban-bsart EQ 'Y00'.
IF sy-tcode EQ 'ME51N' OR sy-tcode EQ 'ME52N'.
/
IF sy-uname(3) NE 'YCL' .
MESSAGE e000(zz) WITH '非原材料处用户,不能创建Y00类型的采购申请!'.
ENDIF.
ENDIF.
ENDIF.
IF zeban-bsart EQ 'Y01' OR ZEBAN-BSART EQ 'Y02'.
IF sy-tcode EQ 'ME51N' OR sy-tcode EQ 'ME52N'.
IF sy-uname(5) NE 'SQDWY' .
if sy-uname(3) NE 'YCL'.
MESSAGE e000(zz) WITH '向原材料提报采购申请,用户必须为SQDWY***或YCL***!'. *
ENDIF.
ENDIF.
ENDIF.
ENDIF.
********************************************************************************** *****
*/检查紧急采购计划次数是否超标和正常计划,必须在每月23-29日创建,其余时间只能报紧急计划
********************************************************************************** *****
IF zeban-bsart EQ 'Y01'.
IF sy-tcode EQ 'ME51N' OR sy-tcode EQ 'ME52N'.
ztemp1 = sy-datum+6(2).
!
IF ztemp1 NOT BETWEEN '23' AND '29'.
MESSAGE e000(zz) WITH '正常计划在每月23-29日报,其余时间只能报紧急计划!'. ENDIF.
ENDIF.
IF zeban-bsart EQ 'Y02' OR zeban-bsart EQ 'Y32'.
IF zeban-bednr IS NOT INITIAL.
zint = 0.
zbadat = zeban-badat+0(6).
CONCATENATE zbadat '01' INTO zbadat.
SELECT SINGLE zunq INTO zunq1 FROM zscalar WHERE bednr = zeban-bednr.
IF sy-subrc = 0.
<
* break wangxianbao.
SELECT bednr INTO zbednr FROM eban WHERE bednr = zeban-bednr
AND bsart = 'Y02'
AND badat >= zbadat
AND loekz = ''.
zint = zint + 1.
ENDSELECT.
zbnfpo = zeban-bnfpo.
zbnfpo = zbnfpo / 10.
zint = zint + zbnfpo.
IF zint > zunq1 .
$
MESSAGE e034(zz) WITH zunq1.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
IF sy-tcode = 'ME52N'.
IF zeban-bsart EQ 'Y02' OR zeban-bsart EQ 'Y32'.
IF zeban-bednr IS NOT INITIAL.
ASSIGN (l_feld) TO <fs>.
* break wangxianbao.
.
IF <fs> IS NOT INITIAL.
zbanfn = <fs>.
SELECT SINGLE * INTO zeban1 FROM eban WHERE banfn = zbanfn
AND bnfpo = zeban-bnfpo.
IF sy-subrc <> 0.
zint = 0.
zbadat = zeban-badat+0(6).
CONCATENATE zbadat '01' INTO zbadat.
SELECT SINGLE zunq INTO zunq1 FROM zscalar WHERE bednr = zeban-bednr. IF sy-subrc = 0.
* break wangxianbao.
]
SELECT bednr INTO zbednr FROM eban WHERE bednr = zeban-bednr
AND bsart = 'Y02'
AND badat >= zbadat
AND loekz = ''.
zint = zint + 1.
ENDSELECT.
zbnfpo = zeban-bnfpo.
zbnfpo = zbnfpo / 10.
zint = zint + zbnfpo.
SELECT bednr INTO zbednr FROM eban WHERE banfn = zbanfn.
* AND bnfpo = zeban-bnfpo.
{
zint = zint - 1.
ENDSELECT.
IF zint > zunq1 .
MESSAGE e034(zz) WITH zunq1.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
`
*****************************************************
*/针对采购申请类型为Y01\Y02\Y31\Y32,检查需求跟踪号输入的正确性
*****************************************************
IF zeban-bsart EQ 'Y01' OR zeban-bsart EQ 'Y02' OR zeban-bsart EQ 'Y31' OR zeban-bsart EQ 'Y32'.
* BREAK WANGXIANBAO.
IF zeban-bednr IS INITIAL. "需求跟踪号不能为空
MESSAGE e004(zz).
ELSE. "对非空的需求跟踪号判断是否正确
CLEAR wa_zdepb.
SELECT SINGLE * FROM zdepb INTO wa_zdepb WHERE grpname = zeban-bednr.
* break wangxianbao.。
IF sy-subrc NE 0.
MESSAGE e004(zz).
ENDIF.
zusnam = sy-uname.
SELECT SINGLE * INTO wa_zdepb FROM zdepb WHERE usnam = zusnam
AND grpname = zeban-bednr.
IF sy-subrc NE 0.
* MESSAGE e042(zz) WITH ZUSNAM zeban-bednr.
ENDIF.
ENDIF.
ENDIF.
…
*****************************************************************
*/删除PR时,检查是否已经审批,如果已经审批,必须先取消审批才能删除
*****************************************************************
IF sy-tcode EQ 'ME52N' OR sy-tcode EQ 'ME53N'.
IF sy-ucomm EQ 'MEREQFLUSH'.
ASSIGN (l_feld) TO <fs>.
* break wangxianbao.
IF <fs> IS NOT INITIAL.
zbanfn = <fs>.
SELECT SINGLE * INTO zeban1 FROM eban WHERE banfn = zbanfn
AND bnfpo = zeban-bnfpo.
!
IF zeban1-frgzu IS NOT INITIAL.
* break wangxianbao.
MESSAGE e033(zz) .
ENDIF.
ENDIF.
ENDIF.
ENDIF.
********************************************************
*/创建和修改PR时,检查是否存在审批策略,如果不存在,则报错
********************************************************
IF zeban-bsart EQ 'Y01' OR zeban-bsart EQ 'Y02' OR zeban-bsart EQ 'Y31' OR zeban-bsart EQ 'Y32'.
^
CLEAR wa_re_codes1.
IF sy-tcode EQ 'ME51N' .
* break wangxianbao.
IF zeban-werks NE '6000'.
MESSAGE e023(zz) .
ENDIF.
CALL METHOD im_item->if_releasable_mm~get_data "读取是否存在审批策略
IMPORTING
ex_strategy = zex_strategy
ex_state = zex_state.
IF zex_strategy IS INITIAL.
\
MESSAGE e006(zz) WITH zeban-bsart.
ENDIF.
ENDIF.
ENDIF.
********************************************************
*/取消PR审批时,检查是否为逐级取消,系统控制必须逐级取消审批
********************************************************
IF sy-tcode = 'ME54N'.
zre_allowed1 = im_item->if_releasable_mm~is_release_allowed( ). "点击审批按钮 zre_allowed2 = im_item->if_releasable_mm~is_reset_rej_allowed( ).
zre_allowed3 = im_item->if_releasable_mm~is_reset_rel_allowed( ). "点击取消审批按钮
(
IF zre_allowed3 EQ 'X'. "AND COUNTER = 0.
CALL METHOD im_item->if_releasable_mm~get_data "读取是否存在审批策略
IMPORTING
ex_strategy = zex_strategy
ex_state = zex_state.
IF zex_strategy IS INITIAL.
MESSAGE e006(zz) WITH zeban-bsart.
ELSE.
CALL METHOD zex_strategy->get_info
IMPORTING
ex_codes = zex_codes
"
ex_strategy = zex_frgst
ex_group = zex_group
ex_prerequisites = zex_prerequisites
ex_final = zex_final.
CALL METHOD zex_strategy->get_codes_from_state
EXPORTING
im_frgzu = zeban-frgzu
RECEIVING
re_codes = zre_codes1.
LOOP AT zre_codes1 INTO wa_re_codes1.
zre_fgrco = wa_re_codes1-rel_code.
}
ENDLOOP.
CLEAR wa_re_codes1.
IF zre_fgrco IS NOT INITIAL.
READ TABLE zex_codes INTO tmp01 WITH KEY rel_code = zre_fgrco.
IF sy-subrc = 0.
IF tmp01-authority <> 0.
MESSAGE e007(zz).
ENDIF.
ENDIF.
ENDIF.
ENDIF.
"
ENDIF.
********************************************************************************* **/控制物料主数据中评估类为3080的只能创建科目分配类别为I的直接为成本中心采购的订单。