ME_PROCESS_PO_CUST增强check

METHOD if_ex_me_process_po_cust~check.

DATA:redata TYPE mepoheader.

DATA:lt_zmm_oa TYPE STANDARD TABLE OF zmm_oa_001.

DATA:ls_zmm_oa TYPE zmm_oa_001."记录采购的数据ZSRM06

DATA:lt_items TYPE purchase_order_items.

DATA:ls_items TYPE purchase_order_item.

DATA:item_data TYPE mepoitem."明细数据

DATA:flag TYPE int2.

TYPES:BEGIN OF detailtype,"明细数据结构ZSRM06

ebelp TYPE ebelp,

menge TYPE menge_d,

END OF detailtype.

DATA:detailtab TYPE STANDARD TABLE OF detailtype,

detailstu TYPE detailtype.

DATA:ebeln TYPE ebeln.

ebeln = redata-ebeln.

redata = im_header->get_data( )."获取参数

*********************************************************************************

* *当年累计订单金额超1W、用印合同管控

*********************************************************************************

DATA:lt_zmm_oa4 TYPE STANDARD TABLE OF zmm_oa_04,

lt_zmm_oa44 TYPE STANDARD TABLE OF zmm_oa_04.

DATA:ls_zmm_oa4 TYPE zmm_oa_04,

ls_zmm_oa44 TYPE zmm_oa_04.

DATA:date1 TYPE budat,datec TYPE budat,dated TYPE budat.

DATA:p_year(4) TYPE c.

DATA:flag1 TYPE int2.

TYPES:BEGIN OF dy_mo,

ekorg TYPE ekorg, "采购组织

lifnr TYPE elifn, "订单供应商

shkzg TYPE shkzg, "H=采购退货,借贷方式S+H-

dmbtr TYPE wrbtr, "实际收货金额

END OF dy_mo.

DATA:it_ekbe TYPE STANDARD TABLE OF dy_mo ."WITH HEADER LINE. "找到符合条件的收货凭证

DATA:ls_ekbe TYPE dy_mo.

DATA:dmbtrsum TYPE wrbtr. "实际收货金额

DATA:txt1 TYPE char100.

date1 = sy-datum.

p_year = sy-datum+0(4).

CONCATENATE p_year '0101' INTO datec.

CONCATENATE p_year '1231' INTO dated.

dmbtrsum = 0.

IF redata-bsart <> 'UB' AND redata-bsart <> 'HZZ3'."排除固定资产 .

SELECT

ekko~ekorg "采购组织

ekko~lifnr "订单供应商

ekbe~shkzg "H=采购退货102冲销

SUM( ekbe~dmbtr ) AS dmbtr "收货金额

INTO CORRESPONDING FIELDS OF TABLE it_ekbe

FROM ekbe

JOIN ekpo ON ekpo~ebeln = ekbe~ebeln AND ekpo~ebelp = ekbe~ebelp AND ekpo~loekz = ''

JOIN ekko ON ekko~ebeln = ekpo~ebeln

WHERE

ekko~lifnr = redata-lifnr AND ekko~ekorg = redata-ekorg AND ( ekko~bedat BETWEEN datec AND dated ) AND vgabe = '1'

GROUP BY ekko~ekorg ekko~lifnr ekbe~shkzg.

IF it_ekbe[] IS NOT INITIAL.

LOOP AT it_ekbe INTO ls_ekbe.

IF ls_ekbe-shkzg = 'H'.

ls_ekbe-dmbtr = - ls_ekbe-dmbtr.

ENDIF.

dmbtrsum = dmbtrsum + ls_ekbe-dmbtr .

ENDLOOP.

ENDIF.

IF dmbtrsum > 10000.

DATA: yy TYPE c LENGTH 4,

mm TYPE c LENGTH 2,

dd TYPE c LENGTH 2,

lv_date_formatted TYPE c LENGTH 10.

yy = redata-bedat+0(4).

mm = redata-bedat+4(2).

dd = redata-bedat+6(2).

CONCATENATE yy '-' mm '-' dd INTO lv_date_formatted.

SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zmm_oa44

FROM zmm_oa_04 WHERE lifnr = redata-lifnr

AND ( htyxqz >= lv_date_formatted )

AND zactive = 'X'. "①

IF lt_zmm_oa44[] IS NOT INITIAL.

lt_items = im_header->get_items( ).

LOOP AT lt_items INTO ls_items.

CLEAR:item_data.

flag1 = 0.

item_data = ls_items-item->get_data( ).

LOOP AT lt_zmm_oa44 INTO ls_zmm_oa44.

IF item_data-matnr = ls_zmm_oa44-matnr .

IF redata-bukrs = ls_zmm_oa44-bukrs .

flag1 = 1.

ELSEIF redata-ekorg = ls_zmm_oa44-ekorg .

flag1 = 1.

ENDIF.

ELSEIF ls_zmm_oa44-matnr = '' AND item_data-matkl = ls_zmm_oa44-matkl.

IF redata-bukrs = ls_zmm_oa44-bukrs .

flag1 = 1.

ELSEIF redata-ekorg = ls_zmm_oa44-ekorg .

flag1 = 1.

ENDIF.

ELSEIF ls_zmm_oa44-matnr = '' AND ls_zmm_oa44-matkl = ''.

IF redata-bukrs = ls_zmm_oa44-bukrs .

flag1 = 1.

ELSEIF redata-ekorg = ls_zmm_oa44-ekorg .

flag1 = 1.

ENDIF.

ENDIF.

ENDLOOP.

IF flag1 = 0 .

CLEAR:txt1.

CONCATENATE item_data-ebelp '行没有有效的用印合同,无法下订单,请在SRM确认!' INTO txt1.

MESSAGE txt1 TYPE 'E'.

EXIT.

ENDIF.

ENDLOOP.

ELSE.

MESSAGE '该供应商本年已采购金额大于1万元,没有有效的用印合同,无法下订单,请在SRM确认!' TYPE 'E'.

EXIT.

ENDIF.

ENDIF.

ENDIF.

DATA:txt TYPE char100.

DATA:lt_conditions TYPE mmpur_tkomv.

DATA:ls_conditions TYPE komv.

lt_items = im_header->get_items( ).

LOOP AT lt_items INTO ls_items.

CALL METHOD ls_items-item->get_conditions

IMPORTING

ex_conditions = lt_conditions.

LOOP AT lt_conditions INTO ls_conditions WHERE kschl = 'ZYZ' OR kschl = 'ZOB1' OR kschl = 'RFC1'.

IF ls_conditions-lifnr IS INITIAL.

CONCATENATE ls_conditions-kposn '行的费用类供应商不能为空!' INTO txt.

MESSAGE txt TYPE 'E'.

EXIT.

ELSEIF ls_conditions-lifnr = redata-lifnr.

CONCATENATE ls_conditions-kposn '行的费用类供应商和订单供应商不能相同!' INTO txt.

MESSAGE txt TYPE 'E'.

EXIT.

ENDIF.

ENDLOOP.

LOOP AT lt_conditions INTO ls_conditions WHERE kschl = 'ZYZ' OR kschl = 'ZOB1'.

IF ls_conditions-waers NE 'RMB'.

CONCATENATE ls_conditions-kposn '费用币种不能为外币,请更正!' INTO txt.

MESSAGE txt TYPE 'E'.

EXIT.

ENDIF.

ENDLOOP.

ENDLOOP.

IF sy-tcode = 'ME21N' OR sy-tcode = 'ME22N'.

IF redata-bsart = 'HZZ9'."只有合同委外的需要填写客户号

LOOP AT lt_items INTO ls_items.

CLEAR item_data.

item_data = ls_items-item->get_data( ).

IF item_data-loekz = ''."wu删除标记

IF item_data-kunnr = ''.

IF item_data-zzkunag = ''.

MESSAGE 'HZZ9合同委外采购订单需要输入【客户数据-客户号】,请确认!' TYPE 'E'.

EXIT.

ENDIF.

ENDIF.

ENDIF.

ENDLOOP.

ENDIF.

ENDIF.

SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zmm_oa

FROM zmm_oa_001

WHERE ebeln = redata-ebeln

AND active = 'X'.

DATA:date TYPE budat,

time TYPE syuzeit,

guid TYPE guid_32.

LOOP AT lt_zmm_oa INTO ls_zmm_oa."查询最新的采购数据

IF date < ls_zmm_oa-crt_datum.

date = ls_zmm_oa-crt_datum.

guid = ls_zmm_oa-guid.

time = ls_zmm_oa-crt_time.

ELSEIF date = ls_zmm_oa-crt_datum.

IF time < ls_zmm_oa-crt_time.

date = ls_zmm_oa-crt_datum.

guid = ls_zmm_oa-guid.

time = ls_zmm_oa-crt_time.

ENDIF.

ENDIF.

ENDLOOP.

READ TABLE lt_zmm_oa INTO ls_zmm_oa WITH KEY guid = guid.

IF ls_zmm_oa-status = 1."在OA审核中,不可以更改!

MESSAGE '此采购订单已在OA审核中,不可以做更改!' TYPE 'E'.

ELSEIF ls_zmm_oa-status = 0 AND ls_zmm_oa-send = 'X'.

MESSAGE '此采购订单正在发送OA中,请稍后保存数据!' TYPE 'E'.

ENDIF.

IF sy-ucomm = 'MESAVE'."保存时候触发

SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zmm_oa

FROM zmm_oa_001

WHERE ebeln = redata-ebeln

AND status > 2

AND oartime NE space.

CLEAR:date,guid,time.

LOOP AT lt_zmm_oa INTO ls_zmm_oa WHERE oartime NE space AND status > 2."查询最新的发送OA的数据

IF date < ls_zmm_oa-crt_datum.

date = ls_zmm_oa-crt_datum.

guid = ls_zmm_oa-guid.

time = ls_zmm_oa-crt_time.

ELSEIF date = ls_zmm_oa-crt_datum.

IF time < ls_zmm_oa-crt_time.

date = ls_zmm_oa-crt_datum.

guid = ls_zmm_oa-guid.

time = ls_zmm_oa-crt_time.

ENDIF.

ENDIF.

ENDLOOP.

IF guid IS NOT INITIAL."上次OA发送的数据比对大小

READ TABLE lt_zmm_oa INTO ls_zmm_oa WITH KEY guid = guid.

IF ls_zmm_oa-detail IS NOT INITIAL.

*{ REPLACE PEFK900539 1

*\ CALL METHOD zui2_json=>deserialize "输入json转换内表

CALL METHOD /ui2/cl_json=>deserialize "输入json转换内表

*} REPLACE

EXPORTING

json = ls_zmm_oa-detail

CHANGING

data = detailtab[].

lt_items = im_header->get_items( ).

LOOP AT lt_items INTO ls_items.

item_data = ls_items-item->get_data( ).

READ TABLE detailtab INTO detailstu WITH KEY ebelp = item_data-ebelp.

IF sy-subrc = 0.

IF item_data-menge > detailstu-menge.

flag = 1.

EXIT.

ENDIF.

ELSE.

flag = 1.

EXIT.

ENDIF.

ENDLOOP.

IF flag NE 0.

DATA:a TYPE char10.

DATA:title TYPE char10 VALUE '问题请求:'.

DATA:question TYPE char100 VALUE '更改的数量已大于OA审核数量,需要重新发起OA,是否保存?'.

CALL FUNCTION 'POPUP_TO_CONFIRM'

EXPORTING

titlebar = title

text_question = question

IMPORTING

answer = a.

IF sy-subrc = 0.

IF a = '1'.

"DATA:ebeln TYPE ebeln.

"ebeln = redata-ebeln.

EXPORT ebeln FROM ebeln TO MEMORY ID ebeln.

ELSE.

MESSAGE '已取消保存!' TYPE 'E'.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

IF redata-bsart NE 'HZZ3'."排除固定资产

DATA:xmmpa TYPE STANDARD TABLE OF mmpa,

line_mmpa TYPE mmpa.

FIELD-SYMBOLS:<xmmpa> TYPE ANY TABLE .

ASSIGN ('(SAPLEKPA)XMMPA[]') TO <xmmpa>.

MOVE <xmmpa>[] TO xmmpa[].

DATA:wyt3tab TYPE STANDARD TABLE OF wyt3,

line_wyt3 TYPE wyt3.

READ TABLE xmmpa INTO line_mmpa WITH KEY parvw = 'BA'.

* if sy-subrc = 0.

* loop at xmmpa into line_mmpa where parvw = 'BA'.

* read table wyt3tab into line_wyt3 with key parvw = 'BA' lifn2 = line_mmpa-lifn2.

* if sy-subrc ne 0.

* txt = '基地不在供应商主数据范围内!'.

* message txt type 'E'.

* endif.

* endloop.

* if sy-subrc ne 0."没有填写订货地址

* txt = '请在采购订单中维护生产基地!'.

* message txt type 'E'.

* endif.

* endif.

ENDIF.

DATA:lifnrtab TYPE STANDARD TABLE OF zsrm_lifnr_001,lifnrtab2 TYPE STANDARD TABLE OF zsrm_lifnr_001,

line_lifnr TYPE zsrm_lifnr_001.

DATA:imtart TYPE mtart.

DATA:imatkl TYPE matkl.

DATA:iprdha TYPE mara-prdha.

DATA:rmatkl TYPE matkl.

DATA:ivbund TYPE lfa1-vbund.

LOOP AT lt_items INTO ls_items.

CLEAR item_data.

item_data = ls_items-item->get_data( ).

IF item_data-loekz = ''. "删除标记

CLEAR:imtart,imatkl,iprdha,rmatkl,ivbund.

SELECT SINGLE vbund INTO ivbund FROM lfa1 WHERE lifnr = redata-lifnr. "互委如果有值不管控

SELECT SINGLE mtart matkl prdha INTO (imtart,imatkl,iprdha) FROM mara WHERE matnr = item_data-matnr.

IF imtart = 'ROH' OR imtart = 'ROH3' OR imtart = 'VERP'. "暂时设定原物料,物料,包装

rmatkl = imatkl.

ELSEIF imtart = 'FERT' AND ivbund IS INITIAL.

IF imatkl = 'BX011' OR imatkl = 'BX029' OR imatkl = 'BX030' OR imatkl = 'BX031' OR imatkl = 'BX035'.

rmatkl = 'E0050001'.

ELSEIF imatkl = 'BX026' OR imatkl = 'BX034'.

rmatkl = 'E0050002'.

ELSEIF imatkl = 'BX025' OR imatkl = 'BX024'.

rmatkl = 'E0050003'.

ENDIF.

IF rmatkl IS INITIAL.

IF iprdha+0(6) = '500405'. "外单

IF iprdha+0(8) = '50040512' OR iprdha+0(8) = '50040513'.

rmatkl = 'E0020003'.

ELSEIF iprdha+0(8) = '50040514'.

rmatkl = 'E0020004'.

ELSEIF iprdha+0(8) = '50040510' OR iprdha+0(8) = '50040511' OR iprdha+0(8) = '50040521' OR iprdha+0(8) = '50040531'.

rmatkl = 'E0020002'.

ENDIF.

ELSEIF iprdha+0(6) = '500406'.

IF iprdha+0(8) = '50040601' OR iprdha+0(8) = '50040621' OR iprdha+0(8) = '50040631' .

rmatkl = 'E0040002'.

ELSEIF iprdha+0(8) = '50040602' OR iprdha+0(8) = '50040622' OR iprdha+0(8) = '50040632' .

rmatkl = 'E0040003'.

ELSEIF iprdha+0(8) = '50040603' OR iprdha+0(8) = '50040623' OR iprdha+0(8) = '50040633' .

rmatkl = 'E0040005'.

ELSEIF iprdha+0(10) = '5004060404' OR iprdha+0(10) = '5004060405' OR iprdha+0(10) = '5004062404'

OR iprdha+0(10) = '5004062405' OR iprdha+0(10) = '5004063404' OR iprdha+0(10) = '5004063405'.

rmatkl = 'E0040004'.

ELSE.

rmatkl = 'E0040006'.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

IF imtart = 'ROH' OR imtart = 'ROH3' OR imtart = 'VERP' OR ( imtart = 'FERT' AND ivbund IS INITIAL ).

IF redata-lifnr = line_mmpa-lifn2. "生产基地都为空,或者生产基地一样

SELECT * INTO CORRESPONDING FIELDS OF TABLE lifnrtab

FROM zsrm_lifnr_001

WHERE matkl = rmatkl "物料组 "用物料主数据里的物料组

AND lifnr = redata-lifnr "供应商

AND ekorg = redata-ekorg "采购组织

AND ( lifnr1 = '' OR lifnr1 = line_mmpa-lifn2 )

AND matklstatus = 'QUALIFIED' "品类状态----需要合格

AND zactive = 'X'.

ELSE.

SELECT * INTO CORRESPONDING FIELDS OF TABLE lifnrtab

FROM zsrm_lifnr_001

WHERE matkl = rmatkl "物料组 "用物料主数据里的物料组

AND lifnr = redata-lifnr "供应商

AND ekorg = redata-ekorg "采购组织

AND lifnr1 = line_mmpa-lifn2

AND matklstatus = 'QUALIFIED' "品类状态----需要合格

AND zactive = 'X'.

IF lifnrtab[] IS INITIAL.

SELECT * INTO CORRESPONDING FIELDS OF TABLE lifnrtab

FROM zsrm_lifnr_001

WHERE matkl = rmatkl "物料组 "用物料主数据里的物料组

AND lifnr = redata-lifnr "供应商

AND ekorg = redata-ekorg "采购组织

AND lifnr1status = 'INVALID'

AND matklstatus = 'QUALIFIED' "品类状态----需要合格

AND zactive = 'X'.

ENDIF.

ENDIF.

*========品名================

CLEAR lifnrtab2.

REFRESH lifnrtab2. " 清空内表

lifnrtab2 = lifnrtab. " 复制数据

*========品名================

SORT lifnrtab BY lifnr1 DESCENDING.

DELETE ADJACENT DUPLICATES FROM lifnrtab COMPARING ekorg matkl lifnr.

LOOP AT lifnrtab INTO line_lifnr.

IF ( ( line_lifnr-startdate <= redata-bedat AND line_lifnr-enddate > redata-bedat ) "在之间

OR ( line_lifnr-startdate = '00000000' AND line_lifnr-enddate = '00000000' ) "无生效日期和结束日期

OR ( line_lifnr-startdate <= redata-bedat AND line_lifnr-enddate = '00000000' AND line_lifnr-autoenddate = '00000000' ) "只有生效日期

OR ( line_lifnr-startdate <= redata-bedat AND line_lifnr-enddate = '00000000' AND line_lifnr-autoenddate > redata-bedat ) ) . "只有生效日期和自动截止日期

ELSE.

CONCATENATE item_data-ebelp '行的供应商品类已过期!' INTO txt.

MESSAGE txt TYPE 'E'.

EXIT.

ENDIF.

IF ( ( line_lifnr-lifnr1 = line_mmpa-lifn2

* AND line_lifnr-lifnr1status = 'EFFECTIVE'

) OR "生产基地状态----需要合格

( line_lifnr-lifnr1 = '' AND line_lifnr-lifnr1status = '' )

OR redata-lifnr = line_mmpa-lifn2

OR ( line_mmpa-lifn2 = '' AND line_lifnr-lifnr1status = 'INVALID') ) .

ELSEIF ( line_lifnr-lifnr1 = line_mmpa-lifn2 AND line_lifnr-lifnr1status = 'INTRODUCTI' ).

CONCATENATE item_data-ebelp '行的供应商品类对应基地正在引入中!' INTO txt.

MESSAGE txt TYPE 'E'.

EXIT.

ELSE.

CONCATENATE item_data-ebelp '行的供应商品类对应基地不合格!' INTO txt.

MESSAGE txt TYPE 'E'.

EXIT.

ENDIF.

ENDLOOP.

IF lifnrtab[] IS INITIAL.

CONCATENATE item_data-ebelp '行的供应商品类不合格!' INTO txt.

MESSAGE txt TYPE 'E'.

EXIT.

ENDIF.

*========品名================

DATA:iy TYPE i.

IF item_data-idnlf CS ','.

CONCATENATE item_data-ebelp '行的【供应商物料号】内的品名存在多个,请操作,保留一个!' INTO txt.

MESSAGE txt TYPE 'E'.

EXIT.

ELSE.

IF lifnrtab2[] IS NOT INITIAL.

iy = 0.

LOOP AT lifnrtab2 INTO line_lifnr.

IF item_data-idnlf = line_lifnr-zidnlf.

iy = iy + 1.

ENDIF.

ENDLOOP.

IF iy = 0.

CONCATENATE item_data-ebelp '行的【供应商物料号】内的品名不存在,请确认!' INTO txt.

MESSAGE txt TYPE 'E'.

EXIT.

ENDIF.

ENDIF.

ENDIF.

*=========品名=============

ENDIF.

ENDIF.

ENDLOOP.

ENDMETHOD.

相关推荐
Henry-SAP19 小时前
ERP(SAP) MRP 业务视角全局流程解析
人工智能·sap·软件需求·erp·sap pp
小羔羊的官方学习账号3 天前
SAP中工单控制关键配置点
sap·pp
SAP_奥维奥科技3 天前
奥维奥助力花园乳业数字化转型落地 以SAP B1破解全产业链管理难题
sap·sap管理系统·sap business one·sap管理系统软件·sap实施服务商
duangww3 天前
SAP ALV处理日元等转换因子问题
abap
Seele_10187 天前
RAP - 报表示例
sap·abap
SAP_奥维奥科技7 天前
破局传统制造,赋能智能转型——机加工企业智能工厂升级实施方案重磅出炉
sap·智能制造·sap管理系统·sap管理系统软件·sap实施服务商推荐
SAP_奥维奥科技8 天前
如何选择适合自己企业的SAP实施服务商?
sap
SAP_奥维奥科技9 天前
详解SAP Business One:信用额度管理
sap·sap管理系统·sap business one·sap管理系统软件·sap实施服务商
爱喝水的鱼丶9 天前
SAP-ABAP:高效开发指南:全局唯一标识符ICF_CREATE_GUID函数的全面解析与实践
运维·服务器·开发语言·数据库·sap·abap·开发交流