2.5 KiB
2.5 KiB
title, created, updated, type, tags, adt_endpoint, nw_version, confidence, contradictions
| title | created | updated | type | tags | adt_endpoint | nw_version | confidence | contradictions | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| NW 7.40 Open SQL @ 转义一致性错误 | 2026-08-05 | 2026-08-05 | error |
|
syntax-check | 7.40 | high |
NW 7.40 Open SQL @ 转义一致性错误
症状
✗ 语法检查未通过! 2 个错误, 0 个警告
[错误] 行 1: If the new Open SQL syntax is used, it must be used throughout.
This includes using @ to escape host variables.
[错误] 行 2: When escaped, all host variables must be escaped using @.
根因
NW 7.40 要求 Open SQL 中的 @ 转义全局一致:
- 如果在任何一个 SELECT 语句中使用了
@(如WHERE field = @lv_var),则所有 SELECT 语句的 INTO 子句也必须使用@(INTO TABLE @lt_data) - 反之,如果不用
@,全都不用 - 混用会导致语法检查失败
典型触发场景:将 @DATA(...) inline 声明改为传统 DATA 声明时,误把 @ 一起删了。
" ❌ 错误 — 混用
SELECT * FROM ztable WHERE field = @lv_var INTO TABLE lt_data.
" ✅ 正确 — 全部用@
SELECT * FROM ztable WHERE field = @lv_var INTO TABLE @lt_data.
" ✅ 同样正确 — 全部不用@ (NW 7.40 传统风格)
SELECT * FROM ztable WHERE field = lv_var INTO TABLE lt_data.
解决方案
步骤 1:检查源码中所有 @ 使用情况
grep -n "@" program.abap | grep -v "^\*"
步骤 2:确保一致性
- 如果大部分语句已用
@:给少数未用的补上@sed -i 's/INTO TABLE lt_/INTO TABLE @lt_/g' program.abap - 如果决定不用
@(纯 7.40 传统风格):删掉所有@sed -i 's/@\(lv_\|ls_\|lt_\|p_\|s_\|abap_\)/\1/g' program.abap
步骤 3:重新语法检查
python main.py syntax-check --name ZXXX --type report
注意事项
CONCATENATE ... INTO(字符串操作)不需要@LOOP AT ... INTO(内表循环)不需要@CATCH ... INTO(异常处理)不需要@- 只有 SELECT 语句的 INTO/WITH 子句受此规则约束
代码示例
" 修复前(混用→语法错误)
DATA lt_data TYPE STANDARD TABLE OF ztable.
SELECT * FROM ztable WHERE field = @lv_var INTO TABLE lt_data. " WHERE有@, INTO没有
" 修复后(一致)
SELECT * FROM ztable WHERE field = @lv_var INTO TABLE @lt_data. " 全部用@
相关错误
- adt-set-source-500 — 传输请求无对象导致写入失败