与响应)
118、事件(Event)与响应那天半夜被电话叫醒,说是某个工厂的过账程序突然把库存给扣重了。我远程连上去,翻到一段自定义的BAdI增强,里面有个方法在SAVE之前偷偷改了个数量——监控日志里能看到它确实执行了,可调用它的地方压根没有直接调用的痕迹,就像自己跑起来一样。当时我就盯着屏幕想,这玩意儿到底是被谁点着火的?后来才意识到,是事件。你写的那段代码不是被调用的,是被“通知”的。ABAP里的事件机制,说白了就是“你干你的,我干我的,但你干完的时候得吆喝一嗓子,我听吆喝再决定要不要动手”。很多刚学ABAP的人会把事件跟方法调用搞混。方法调用是主动的:A叫B,B必须执行,执行完返回给A。事件是被动的:A发出一个信号,说“我这边发生了点什么”,至于谁在听、听了之后干什么,A不关心,也管不着。这叫松耦合。你写了一个类,里面定义了一个事件,然后这个类在某个业务节点上触发它,剩下的事情就跟这个类没关系了。谁对这件事感兴趣,谁自己去注册一个“响应”的处理器,等信号来了再执行。就像你家里装了烟雾报警器,报警器只管响,至于你是爬起来灭火还是先拔电池,那是你的事。我当年第一次写事件是用在ALV的工具栏按钮上。ALV有很多内置功能按钮,比如导出、过滤、排序,但业务上总得加点自定义按钮。你没法改ALV的标准代码,但ALV提供了一个事件叫USER_COMMAND,当你点了自定义功能码,它就触发。你需要在类里写一个方法,然后在ALV控件上注册:“我关心这个事件,它一响,你就调我的这个方法。”这样你把“按钮被点”和“响应动作”解耦了。代码大致长这样:CLASS lcl_alv_h