`
jgtang82
  • 浏览: 397845 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

创建/修改 Sales Order 时的约束 - 单项最大数量和总条目数

阅读更多

需求:
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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics