使用SELECT命令向内表写入数据时遇‘内表不可用作工作区’错误求助
错误原因分析
错误提示An internal table is not allowed as a workarea的核心原因:
SELECT SINGLE用于读取单条记录,INTO CORRESPONDING FIELDS OF后必须指定结构体类型的工作区(用来存储单条数据)。- 你直接传入了内表
lt_itab,内表是多条记录的集合,无法作为单条记录的存储载体,因此触发语法错误。
修复方案
步骤1:定义工作区
在现有内表定义后,添加同类型的结构体工作区:
Data: lt_itab TYPE STANDARD TABLE OF ty_itab, ls_itab TYPE ty_itab. " 新增工作区,用于存储单条查询结果
步骤2:修改SELECT语句
将原错误的SELECT语句,把目标从内表改为工作区:
SELECT SINGLE * FROM (lv_infotype-infotype) INTO CORRESPONDING FIELDS OF ls_itab " 改为工作区ls_itab WHERE sprps = 'X' AND pernr = pernr-pernr.
步骤3:(可选)将数据存入内表
如果需要把查询到的记录保存到内表中,在sy-subrc = 0的判断里追加工作区到内表:
IF sy-subrc = 0. ls_itab-infotype = lv_infotype-infotype. " 补充填充自定义的infotype字段(数据库表无此字段) APPEND ls_itab TO lt_itab. " 将工作区数据追加到内表 WRITE: / pernr-pernr, lv_infotype-infotype. ENDIF.
修复后的关键代码片段
types: BEGIN OF ty_itab, pernr type pernr-mstbr, "Personalnummer infotype(6) type c, begda type p0008-begda, endda type p0008-endda, UNAME type p0008-uname, END OF ty_itab. Data: lt_itab TYPE STANDARD TABLE OF ty_itab, ls_itab TYPE ty_itab. " 新增工作区 ... GET pernr. LOOP AT c_infotypes INTO lv_infotype. CLEAR ls_itab. " 每次循环清空工作区,避免残留数据 SELECT SINGLE * FROM (lv_infotype-infotype) INTO CORRESPONDING FIELDS OF ls_itab WHERE sprps = 'X' AND pernr = pernr-pernr. IF sy-subrc = 0. ls_itab-infotype = lv_infotype-infotype. APPEND ls_itab TO lt_itab. WRITE: / pernr-pernr, lv_infotype-infotype. ENDIF. ENDLOOP.
额外优化提示
- 避免变量命名冲突:代码中
TABLES: PERNR定义的全局结构体与数据库表的PERNR字段重名,建议在WHERE条件中保持pernr = pernr-pernr的写法(当前语法正确),或改用更清晰的变量名减少混淆。 - 循环前清空工作区:每次循环执行
CLEAR ls_itab,防止上一次循环的数据残留到当前记录中。
内容的提问来源于stack exchange,提问作者Poseidon
相关产品推荐
相关产品推荐

