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’.