我有一个ABAP类方法,比如select_something . select_something有一个导出参数,比如et_result . et_result属于标准表类型,因为直到运行时才能确定et_result的类型 .
该方法有时会在“ select * into table et_result from (lv_tablename) where... ”处提供一个简短的转储 With ABAP/4 Open SQL array select, the output table is too small
错误分析:
......in this particular case, the database table is 3806 bytes wide, but the internal table is only 70 bytes wide.
我也试过“任何表”,错误是一样的 .
4 回答
在许多层面上,你想要做的事情看起来非常糟糕 . 切勿使用SELECT FROM(无论如何),除非有人用枪指着你的头并且门被锁紧 . 您将丢失系统可能为您提供的各种静态错误检查 . 例如,编译器将无法再告诉您“嘿,您正在读取的表是3806字节宽 . ”它根本无法分辨,即使你使用常量 . 你会发现困难的方法,产生短暂的转储,特别是在unicode和NUC系统之间切换时,很可能是 生产环境 系统中的一些 . 没有什么好玩的 .
(实际上有一些 - 非常非常少 - 很好地用于SELECT语句中的动态表名 . 我每两到三年需要它们一次,而且我编写了很多奇怪的东西 . 只要你可以避免它们,即使以编写更多代码为代价 . 以后修复破碎的东西也不值得 . )
然后,更改通用 formal 参数类型不会对 actual 参数的类型执行任何操作 . 如果将带有DEFAULT KEY的STANRDARD TABLE OF mandt传递给您的方法,则该表将包含3个字符的行 . 它将是一个标准表,因此,它也将是一个任何表,并且's about it. You can twist the generic types anywhere you like, there'无法使用泛型类型以您使用它们的方式强制执行 . 它是一种糟糕的飞行方式 .
您可以返回数据引用 . 您的查询将不再失败,您可以在之后将数据分配给正确键入的字段符号 .
另外,我同意@vwegert应尽可能避免动态查询(以及编程) .
首先,我同意vwegert的回应,如果可以,尽量避免动态sql选择
也就是说,检查短暂的转储 . 如果错误是异常类,则可以将SELECT语句包装在try / catch块中,并至少阻止它进行转储 .
你也可以尝试“
INTO CORRESPONDING FIELDS OF TABLE et_result
” . 如果ET_RESULT是动态的,则可能必须使用RTTS将其强制转换为正确的结构 . This可能会给你一些想法......不能同意vwegert,但如果完全没有其他方式(通常有)执行任务而不是使用动态select语句和动态类型化参数,请在运行时对表的类型和参数进行一些检查 .
使用CL_ABAP_TYPEDESCR及其子类来执行此操作 .
这样,您可以在运行时处理错误而无需程序转储,
但正如vwegert所说,这种动态的东西是纯粹的邪恶,并且在运行期间肯定会在某些时候破坏 . 添加必要的错误处理很可能会比将代码重新设计为无动态SQL和类型化参数要困难得多 .