现在的位置: 首页 > 综合 > 正文

IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题

2013年10月04日 ⁄ 综合 ⁄ 共 1742字 ⁄ 字号 评论关闭

ProblemDescription                                                                                                      


1. 我对BADI: NOTIF_EVENT_SAVE建了一个implementation Z_SAM_TEST.

2. 且看我的代码, 这里清楚看到, message 的类型是’E’.

3. 当我运行TCODE IW22时,  把Description填成 ’222222’ , 然后按save, 居然出了个information message.

Problem resolution                                                                                                       


问题1:为什么会报成Information message?
                                                                                                                     

1. 我们debug一下这个method, 在图中所示那行按F5.

2. Message 命令会跑SET_MSG_VARS_FOR_CLIKE这个method,在图中所示那行打个断点,按F8跑到该行, 然后按F5.

3. 在这一步还是按F5

4.  现在在screen 7200, 再按F5.

5. 程序走到了图中的那行, 图中的EXCEPTIONS是FM: IQS1_BADI_AT_SAVE, 当调用FM时列出EXCEPTIONS ERROR_MESSAGE(默认exception, 不定义也可以使用),
它里面的message就不会直接报出来, 而是当成EXCEPTIONS抛出来, 这时SY-SUBRC = 3.

6.在图中这一行, 程序把message 的类型改成 ’I’ 了

7. 最后message在这里报出, 且看abap stack的调用关系.

问题2: 关于EXCEPTIONS ERROR_MESSAGE的测试.                                                                                                  


1

1. 建了FM: Z_ZERO_CHAR, EXCEPTION里加一条ERROR_MESSAGE(后来发现不定义exception ERROR_MESSAGE也是可以使用的)



2. 在FM里报一条MESSAGE, 它不会把message 报出来, 而是RAISING EXCEPTION  ERROR_MESSAGE.



3. 写个Report来Call 这个FM: Z_ZERO_CHAR.



4. 这样Message会报成’I’ 型


2

1. 把例1的FM里面的代码改下


2. 在类Z_ZERO_TEST里报一条MESSAGE


3. 运行REPORT  Z_ZERO_TEST_CLASS, ERROR MESSAGE还是没报出来,这里的message不是直接在FM里报的, 而是在更底层的一个类的方法里报的,类似IW22的BADI NOTIF_EVENT_SAVE的情况.

P.S

我尝试在类的method里定义EXCEPTION ERROR_MESSAGE, 报错了…



问题3: 怎么让BADI:NOTIF_EVENT_SAVE ERROR
MESSAGE?                                                                                


方法1

1. 我们可以看到, 这个method 有个exception WRONG_INPUT, 根据description,估计只要抛出这个exception就会报错



2. 把message修改下, 加上raising WRONG_INPUT.


3.我们测试下效果, 最终exception WRONG _INPUT 在FM IQS1_BADI_AT_SAVE被捕获, SY-SUBRC = 1.

4. 我们看看error handling的代码 ,  这里直接把message类型保存起来, 所以message的类型是’E’.


5. 最后message在这里报出来


6. 我们看看报出message的效果


方法2(麻烦方法, 没必要用)

1. 在BADI里定义一个flag, 把flag传到memory id里.


2. 在program LIQS1F10 里的form MSG_STORE_WITH_4P里做个隐式增强, 当然还有其他增强点也可以实现.


3.看看效果, 先设个断点


4. 这里把message类型强制改成’E’.



抱歉!评论已关闭.