[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题

ProblemDescription                                                                                                      


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第1张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第2张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第3张图片


Problem resolution                                                                                                       


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

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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第4张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第5张图片


3. 在这一步还是按F5

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第6张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第7张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第8张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第9张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第10张图片


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


1

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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第11张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第12张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第13张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第14张图片


2

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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第15张图片


2. 在类Z_ZERO_TEST里报一条MESSAGE

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第16张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第17张图片

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第18张图片


P.S

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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第19张图片



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


方法1

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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第20张图片



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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第21张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第22张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第23张图片


5. 最后message在这里报出来

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第24张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第25张图片


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

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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第26张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第27张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第28张图片


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

[置顶] IW22 BADI:NOTIF_EVENT_SAVE 报Message的问题_第29张图片


你可能感兴趣的:(error,message,warning,badi,IW22)