需求:
Restrict line item quantity and amount of a SO in spectial sales area, sales district and data&time period.
解决过程备案
1. 自定义表结构和创建Maintain Screen
2. 修改 USEREXIT_SAVE_DOCUMENT_PREPARE
DATA: LV_UNIT_LIMIT LIKE ZSDLIMIT-UNIT_LIMIT,
LV_LINE_LIMIT LIKE ZSDLIMIT-LINE_LIMIT,
LV_LINE_AMT TYPE I VALUE 0.
* Get line item unit limit and line limit.
SELECT SINGLE UNIT_LIMIT LINE_LIMIT
INTO (LV_UNIT_LIMIT, LV_LINE_LIMIT)
FROM ZSDLIMIT
WHERE VKORG = XVBAK-VKORG
AND VTWEG = XVBAK-VTWEG
AND SPART = XVBAK-SPART
AND BZIRK = XVBKD-BZIRK
AND ( DATAB <= SY-DATUM )
AND ( TIMAB <= SY-UZEIT )
AND ( DATBI >= SY-DATUM OR DATBI = 0 )
AND ( TIMBI >= SY-UZEIT OR TIMBI <= 0 ).
* Unit limit check
IF LV_UNIT_LIMIT NE SPACE.
LOOP AT XVBAP
WHERE UPDKZ NE 'D'
AND ABGRU = SPACE.
AND KWMENG > LV_UNIT_LIMIT.
FCODE = FCODE_GLEICHE_SEITE. "=ENT1: continue
* PERFORM FCODE_BEARBEITEN.
MESSAGE E013(ZEDI) WITH LV_UNIT_LIMIT.
ENDLOOP.
ENDIF.
* Line limit check
IF LV_LINE_LIMIT NE SPACE.
LOOP AT XVBAP TRANSPORTING NO FIELDS
WHERE UPDKZ NE 'D'
AND ABGRU = SPACE.
ADD 1 TO LV_LINE_AMT.
ENDLOOP.
IF LV_LINE_AMT > LV_LINE_LIMIT.
FCODE = FCODE_GLEICHE_SEITE. "=ENT1: continue
MESSAGE E014(ZEDI) WITH LV_LINE_LIMIT.
ENDIF.
ENDIF.
这里要感谢下SAP砍刀的帮忙, 没想到要用 TIMBI <= 0 的形式来判断一个时间类型的字段是否为initial。我试了TIMBI = SPACE / '' / '000000' / IS NULL / 0 均未得到正确结果,原因是Open SQL => Native SQL时参数值解析出的值 ( ' ' 会被解析成'00000', 0 / SPACE=>'000000') 和数据库中的值不一致,ABAP Dictionary TIMS类型的字段在DB (Oracle / SQL Server)中默认值为空字符串。
3. 在 USEREXIT_SAVE_DOCUMENT_PREPARED 中如果用MESSAGE EXXX报错时,需要加这样写:
FCODE = FCODE_GLEICHE_SEITE. "=ENT1: continue
MESSAGE E013(ZEDI) WITH LV_UNIT_LIMIT.
要不然在出现Error Message后,回车,SO line item中值不可修改,具体原因我也没深究,只是在Debug的时候发现FCODE_GLEICHE_SEITE的值为ENT1, 通过 t-code VFBS 可以知道它是Continue的意思,在报完Message后,系统会根据这个FCODE做一些操作。
4. 修改 USEREXIT_CHECK_XVBAP
在VA01 / VA02中系统每接受一个ITEM, 都会调用这个User Exit来check其中的数据,这里要注意的是要用这样的语句来获得当前的有效行数:
LOOP AT XVBAP TRANSPORTING NO FIELDS
WHERE UPDKZ NE 'D'
AND ABGRU = SPACE.
ADD 1 TO LV_LINE_AMT.
ENDLOOP.
这里报Message时Message Type要用 "I", 要不对于Bundle/BOM物料就会因得不到后续处理而产生问题 另这里不需要修改FCODE.
参考
http://help.sap.com/saphelp_46c/helpdata/en/1c/f62c7dd435d1118b3f0060b03ca329/content.htm