Dynamic SELECT FROM(lv_tablename)错误:输出表太小

Dynamic SELECT FROM(lv_tablename)错误:输出表太小,dynamic,abap,opensql,Dynamic,Abap,Opensql,我有一个ABAP类方法,比如说,选择一些东西。选择某个具有导出参数的对象,例如,et\u result。et_结果的类型为标准表,因为在运行时之前无法确定et_结果的类型 该方法有时会给出一个简短的转储,说明使用ABAP/4 Open SQL array select时,“select*into table et_result from(lv_tablename)”处的输出表太小,,其中…” 错误分析: …在这种情况下,数据库表的宽度为3806字节,但内部表的宽度仅为70字节。 我也试过“任意表

我有一个ABAP类方法,比如说,选择一些东西。选择某个具有导出参数的对象,例如,et\u result。et_结果的类型为标准表,因为在运行时之前无法确定et_结果的类型

该方法有时会给出一个简短的转储,说明使用ABAP/4 Open SQL array select时,“select*into table et_result from(lv_tablename)”处的输出表太小,,其中…”

错误分析:

…在这种情况下,数据库表的宽度为3806字节,但内部表的宽度仅为70字节。


我也试过“任意表格”,错误是一样的。

你试图做的事情在很多层面上看起来都大错特错。除非有人用枪指着你的头,门也锁紧了,否则千万不要使用“从中选择”。您将失去系统可能提供给您的各种静态错误检查。例如,编译器将不再能够告诉您“嘿,您正在读取的表有3806字节宽。”即使您使用常量,它也无法告诉您。您会发现这是一个困难的方法,它会产生短转储,特别是在unicode和NUC系统之间切换时,很可能是在生产系统中。没有乐趣

(事实上,SELECT语句中的动态表名有一些-非常-非常-非常好的用途。我大约每两到三年需要它们一次,而且我编写了很多奇怪的东西。只要尽可能避免它们,即使是以编写更多代码为代价。只是不值得以后费事修复损坏的东西。)


然后,更改泛型正式参数类型不会对实际参数的类型产生任何影响。如果将带有默认键的mandt标准表传递给方法,该表将有3个字符的行。它将是一个标准表,同样,它也将是一个任意表,仅此而已。你可以在任何你喜欢的地方扭曲泛型类型,没有办法用你使用泛型类型的方式来强制执行正确性。由调用方确保使用了所有正确的类型。那是一种糟糕的飞行方式

首先,我同意vwegert的回答,尽量避免动态sql选择

也就是说,检查短转储。如果错误是异常类,则可以将SELECT语句包装在try/catch块中,并至少停止其转储


您还可以尝试“
进入表et_result
的相应字段”。如果ET_结果是动态的,则可能必须使用rtt将其转换为适当的结构。可能会给您一些想法……

非常同意vwegert,但是如果除了使用动态select语句和动态类型参数之外,没有其他执行任务的方法(通常是这样),请在运行时检查表的类型和参数

使用CL_ABAP_TYPEDESCR及其子类执行此操作

这样,您可以在运行时处理错误,而无需卸载程序


但正如vwegert所说,这种动态的东西纯粹是邪恶的,并且在运行时的某个时刻肯定会崩溃。与将代码重新设计为非动态SQL和类型化参数相比,添加必要的错误处理很可能需要更多的工作和难度。查询将不再失败,之后可以将数据分配给正确键入的字段符号

" Definition
class-methods select_all
  importing
    !tabname type string
  returning
    value(results) type ref to data.


...
...


" Implementation
method select_all.
  data dref type ref to data.
  create data dref type standard table of (tabname).
  field-symbols <tab> type any table.
  assign dref->* to <tab>.
  select * from (tabname) into table <tab>.
  get reference of <tab> into results.
endmethod.
“定义
类方法选择所有
进口
!tabname类型字符串
返回
值(结果)类型引用到数据。
...
...
“执行
方法选择所有。
数据dref类型引用到数据。
创建数据dref类型标准表(tabname)。
字段符号可以键入任何表格。
将dref->*分配给。
在表中选择*from(tabname)。
在结果中获得参考。
endmethod。
此外,我同意@vwegert的观点,即应尽可能避免动态查询(以及为此进行的编程)。

从zxx表中选择*字段1='something',正确的方法是什么?