1. 从“纯补全”到“会预判”:这个功能到底多了点什么
以前改一个批量导入报表,需求是用户在ALV可编辑单元格里改了数量之后,自动触发价差重算。我先从 CL_GUI_ALV_GRID 的事件注册往下找,翻了大半天老代码,最后写了一个几乎和旧项目一模一样的 HANDLE_DATA_CHANGED 方法。那会儿我最大的感受是:ABAP 想清楚不简单,但真正耗时间的,是那些重复出现、长得差不多的框架代码,我居然已经手抄了第二十遍。
后来切到 Eclipse ADT 写代码,发现一个很有意思的变化:字母还没全部敲完,光标后面已经出现了一段推荐的代码,而且推荐的不是一个孤立单词,而是一整句、甚至连着下一行的结构。这就是标题里那个 Predictive Code Completion,ABAP 开发环境里的预测式代码补全。它不是传统的关键词匹配,而是根据你当前已经写出的代码、作用域里可用的变量、常见的调用模式,去“猜”你接下来大概要写什么。对 ABAP 开发来说,尤其是常常面对长字段名、长方法名和强类型语法的场景,这个能力是可以直接转换成效率的。
这篇内容我会从功能差异、启用配置、背后原理,再到实际项目中 ALV、CDS、数据库更新等高频场景,把它带来的变化和坑都聊一遍。如果你也在用 ADT,或者正准备从 SAP GUI 迁移过来,这里面的内容应该能帮你更快上手。
1.1 普通补全与预测补全的差别
普通的关键词补全,大家都很熟了。你输入 READ TABLE 的前几个字符,编辑器弹出以这些字符开头的候选列表,你从里面挑一个,本质上是一个“前缀过滤工具”。它对减少拼写错误有帮助,但不会主动告诉你这段代码之后应该接什么。
Predictive Code Completion 的做法不太一样。它通常不要求你先把前缀输入得特别完整,而是在你已经输入了一段上下文之后,直接推荐可能出现的一组完整代码。举个例子,如果你定义了一个内表,紧接着开始写 LOOP AT,传统的补全会只帮你把 LOOP AT 这个关键词补完,后面的 INTO、ASSIGNING、REFERENCE INTO 仍然需要自己敲。预测补全会结合这个内表是什么类型、前面是否存在结构体变量、当前代码是在方法里还是表单里,把一整条 LOOP AT ... INTO ... 的骨架带出来。
这两种方式的体验差异,可以理解成“查字典”和“有人帮你接话”的区别。普通补全需要你脑子里已经有完整的句子,只是懒得敲每个字母;预测补全会尝试帮你把下一步也排好队,你只需要判断它对不对、要不要接受。对于已经习惯 ADT 的人,这会大幅度降低“思路断掉去翻旧代码”的频率。
1.2 一个例子讲清楚“补全语句块”带来的区别
我随手写一个报表里经常出现的代码片段:
abap复制DATA lt_vbrp TYPE TABLE OF vbrp.
SELECT vbeln, posnr, fkimg, netwr
FROM vbrp
INTO TABLE @lt_vbrp
WHERE vbeln = @lv_vbeln.
SORT lt_vbrp BY posnr.
在没有预测补全的时候,我写 SELECT 语句通常是一个字段一个字段往里面敲,或者借助数据字典字段列表维护来选字段。有了预测补全之后,当我输入 SELECT,编辑器会先推荐我最近使用过的表、已经声明过的内表结构、以及可选的 WHERE 条件变量。整个句子是“想好一段推荐一段”,而不是“敲一个词再等一个词”。
更典型的是 LOOP 配对。代码如下:
abap复制LOOP AT lt_vbrp INTO DATA(ls_vbrp).
ls_vbrp-netwr = ls_vbrp-netwr * 1.1.
" 在这里,补全光标之后,预测建议自动补出 ENDLOOP
ENDLOOP.
很多新手写 ABAP 时最容易漏的就是 ENDLOOP、ENDIF、ENDMET
