doc: SAP ADT 错误知识库(LLM WIKI格式) - set_source 500 + NW740 @转义一致性
This commit is contained in:
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
title: "Log Schema — SAP ADT 错误知识库"
|
||||||
|
created: 2026-08-05
|
||||||
|
type: concept
|
||||||
|
tags: [schema, sap, adt, error-log]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Log Schema
|
||||||
|
|
||||||
|
## Domain
|
||||||
|
SAP ADT (ABAP Development Tools) 开发中遇到的错误、根因、解决方案。积累为可查询的知识库。
|
||||||
|
|
||||||
|
## Conventions
|
||||||
|
- 文件名:`adt-<错误类型>.md`(小写、hyphen)
|
||||||
|
- 每个页面 YAML frontmatter:title, created, type(error), tags, adt_endpoint, adt_method
|
||||||
|
- 每篇必含:症状 → 根因 → 解决方案 → 代码示例
|
||||||
|
- 标签:adt, sap, error, nw740, transport, open-sql, syntax
|
||||||
|
- 至少 1 个 [[cross-reference]] 到相关错误
|
||||||
|
|
||||||
|
## Page Thresholds
|
||||||
|
- 每个独立错误类型一页
|
||||||
|
- 同类问题补充到已有页面
|
||||||
|
- 页面超过 200 行 → 拆分
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
---
|
||||||
|
title: "NW 7.40 Open SQL @ 转义一致性错误"
|
||||||
|
created: 2026-08-05
|
||||||
|
updated: 2026-08-05
|
||||||
|
type: error
|
||||||
|
tags: [adt, sap, error, nw740, open-sql, syntax]
|
||||||
|
adt_endpoint: syntax-check
|
||||||
|
nw_version: 7.40
|
||||||
|
confidence: high
|
||||||
|
contradictions: []
|
||||||
|
---
|
||||||
|
|
||||||
|
# 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` 声明时,误把 `@` 一起删了。
|
||||||
|
|
||||||
|
```abap
|
||||||
|
" ❌ 错误 — 混用
|
||||||
|
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**:检查源码中所有 `@` 使用情况
|
||||||
|
|
||||||
|
```bash
|
||||||
|
grep -n "@" program.abap | grep -v "^\*"
|
||||||
|
```
|
||||||
|
|
||||||
|
**步骤 2**:确保一致性
|
||||||
|
|
||||||
|
- 如果大部分语句已用 `@`:给少数未用的补上 `@`
|
||||||
|
```bash
|
||||||
|
sed -i 's/INTO TABLE lt_/INTO TABLE @lt_/g' program.abap
|
||||||
|
```
|
||||||
|
- 如果决定不用 `@`(纯 7.40 传统风格):删掉所有 `@`
|
||||||
|
```bash
|
||||||
|
sed -i 's/@\(lv_\|ls_\|lt_\|p_\|s_\|abap_\)/\1/g' program.abap
|
||||||
|
```
|
||||||
|
|
||||||
|
**步骤 3**:重新语法检查
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python main.py syntax-check --name ZXXX --type report
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
- `CONCATENATE ... INTO`(字符串操作)不需要 `@`
|
||||||
|
- `LOOP AT ... INTO`(内表循环)不需要 `@`
|
||||||
|
- `CATCH ... INTO`(异常处理)不需要 `@`
|
||||||
|
- **只有 SELECT 语句的 INTO/WITH 子句受此规则约束**
|
||||||
|
|
||||||
|
## 代码示例
|
||||||
|
|
||||||
|
```abap
|
||||||
|
" 修复前(混用→语法错误)
|
||||||
|
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]] — 传输请求无对象导致写入失败
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
---
|
||||||
|
title: "ADT set_source 500 — 传输请求无对象导致写入失败"
|
||||||
|
created: 2026-08-05
|
||||||
|
updated: 2026-08-05
|
||||||
|
type: error
|
||||||
|
tags: [adt, sap, error, transport, nw740]
|
||||||
|
adt_endpoint: /sap/bc/adt/programs/programs/<name>/source/main
|
||||||
|
adt_method: PUT
|
||||||
|
---
|
||||||
|
|
||||||
|
# ADT set_source 500: 传输请求无对象导致写入失败
|
||||||
|
|
||||||
|
## 症状
|
||||||
|
|
||||||
|
```
|
||||||
|
✓ 锁定成功(传输请求: DEVK901326)
|
||||||
|
✓ 解锁成功
|
||||||
|
✗ set_source → HTTP 500 Server Error
|
||||||
|
```
|
||||||
|
|
||||||
|
- Lock 返回成功
|
||||||
|
- 写入源码时 500
|
||||||
|
- `transport objects --corr_nr DEVK901326` 返回「传输请求中无对象」
|
||||||
|
|
||||||
|
## 根因
|
||||||
|
|
||||||
|
ADT 的 lock API 会创建锁句柄(返回 lockHandle),但**不一定将对象真正绑定到传输请求**。
|
||||||
|
NW 7.40 系统上,对象写入前必须先通过 SE09/SE10 手动将对象(如 `R3TR PROG ZIDTR_AI_ASSISTANT`)加入传输请求任务列表。
|
||||||
|
|
||||||
|
Lock 成功 ≠ 传输绑定成功。
|
||||||
|
|
||||||
|
## 解决方案
|
||||||
|
|
||||||
|
1. **SE09 手动操作**:打开传输请求 DEVK901326 → 添加对象 `R3TR PROG <program_name>`
|
||||||
|
2. 重新执行 `sync` 或 `upload + activate`
|
||||||
|
|
||||||
|
## 验证
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python main.py transport objects --corr_nr DEVK901326
|
||||||
|
# 应显示包含目标对象
|
||||||
|
```
|
||||||
|
|
||||||
|
## 代码示例
|
||||||
|
|
||||||
|
```
|
||||||
|
# 错误流程(会 500)
|
||||||
|
python main.py sync --name ZXXX --type report --path ./xxx.abap --corr_nr DEVK901326
|
||||||
|
# → lock OK, write 500
|
||||||
|
|
||||||
|
# 正确流程
|
||||||
|
# 1. SE09 → 手动添加 R3TR PROG ZXXX 到 DEVK901326
|
||||||
|
# 2. 重新 sync
|
||||||
|
python main.py sync --name ZXXX --type report --path ./xxx.abap --corr_nr DEVK901326
|
||||||
|
# → lock OK, write OK, syntax-check OK, activate OK
|
||||||
|
```
|
||||||
|
|
||||||
|
## 相关错误
|
||||||
|
|
||||||
|
- [[adt-nw740-open-sql-consistency]] — NW 7.40 @ 转义一致性错误
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# SAP ADT 错误知识库索引
|
||||||
|
|
||||||
|
> 内容目录。每个错误页面一行摘要。
|
||||||
|
> Last updated: 2026-08-05 | Total pages: 2
|
||||||
|
|
||||||
|
## 错误
|
||||||
|
|
||||||
|
- [[adt-set-source-500]] — set_source 500: 传输请求中无对象导致写入失败
|
||||||
|
- [[adt-nw740-open-sql-consistency]] — NW 7.40 Open SQL @ 转义一致性错误
|
||||||
Reference in New Issue
Block a user