首页 文章

使用ABAP / 4 Open SQL数组选择时,输出表太小

提问于
浏览
1

我有一个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 回答

  • 0

    在许多层面上,你想要做的事情看起来非常糟糕 . 切勿使用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'无法使用泛型类型以您使用它们的方式强制执行 . 它是一种糟糕的飞行方式 .

  • 2

    您可以返回数据引用 . 您的查询将不再失败,您可以在之后将数据分配给正确键入的字段符号 .

    " 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.
    

    另外,我同意@vwegert应尽可能避免动态查询(以及编程) .

  • 0

    首先,我同意vwegert的回应,如果可以,尽量避免动态sql选择

    也就是说,检查短暂的转储 . 如果错误是异常类,则可以将SELECT语句包装在try / catch块中,并至少阻止它进行转储 .

    你也可以尝试“ INTO CORRESPONDING FIELDS OF TABLE et_result ” . 如果ET_RESULT是动态的,则可能必须使用RTTS将其强制转换为正确的结构 . This可能会给你一些想法......

  • 2

    不能同意vwegert,但如果完全没有其他方式(通常有)执行任务而不是使用动态select语句和动态类型化参数,请在运行时对表的类型和参数进行一些检查 .

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

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

    但正如vwegert所说,这种动态的东西是纯粹的邪恶,并且在运行期间肯定会在某些时候破坏 . 添加必要的错误处理很可能会比将代码重新设计为无动态SQL和类型化参数要困难得多 .

相关问题