IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题

来源:互联网 发布:cn域名需要备案吗 编辑:程序博客网 时间:2024/06/05 11:10

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



原创粉丝点击