销售订单已经创建,客户只改了其中一个交货行的请求日期。我们的系统此时需要重新判断这行能否按期交付。处理范围听起来很小,实施时却很容易失控。程序若重新读取整张订单、重算所有行、再次调用一遍后续接口,一次看似轻巧的点击就可能牵动许多无关处理。订单行数多、调用链长时,等待时间和重复处理的风险都会冒出来。
这个场景让我想到黄药师的弹指神通。厉害之处不只是弹出去的东西很快,而是出手幅度小,目标却准,距离、时机和力道都拿捏得住。放到 ABAP 开发里,最贴切的对应物不是某一条语句,而是一套组合能力,精准定位业务对象,判断当前状态,只触发必要的动作,再把动作的影响限制在可预期的范围内。
我们可以给这套做法起一个便于讨论的名字,精准业务触发。这个名字是本文的类比,并非 SAP 产品中的正式术语。它在经典 SAP ABAP On-Premise 开发中,可以由精确的表访问、封装良好的方法、授权检查和事务控制构成。在 SAP BTP 的 ABAP 环境中,RAP 业务对象的动作、特性控制、权限控制与 EML,则提供了更成体系的表达方式。两边的技术形态不同,判断准则却相通,出手前要认准对象,出手时要守住规则,出手后要知道究竟改变了什么。
弹指神通的第一层功夫,是认准落点。写 ABAP 时,这个落点往往是业务键。销售订单号能定位一张订单,却不足以定位订单中的某一行。只有把订单号与行项目号放在一起,我们才真正找到了要处理的对象。批次、公司代码、会计年度或客户端是否也参与定位,要由具体数据模型决定。少了键,程序可能命中一片数据。多用模糊条件,数据库虽返回了一条记录,那条记录也未必是业务人员眼中的那一条。
这正是SELECT SINGLE最容易引起误解的地方。它约束返回行数,却不会替业务程序补齐业务含义。