PAYATHON 2026

如何将含 STRING 字段的 SORTED TABLE 转为 SALV 可用的标准表?

数据小陈

结论

不要用 ABAP SQL 转换这个内部表。声明一个行类型相同的 STANDARD TABLE,再用 LOOP 和 APPEND 逐行复制。这样既能保留 STRING 字段的值,也能将静态类型为标准表的变量传给 cl_salv_table=>factory。

原问题中的 my_table 是 SORTED TABLE,行类型 my_table_tt 包含 material_number 和 STRING 类型的 material_text。将内表用作 ABAP SQL 数据源时,STRING 这类深类型可能不适用于相应的 SQL 操作,因此可以直接复制,无需经过 SQL。

转换并显示

保留原有的 my_table_tt 和 my_table 声明,增加一个标准表变量,再复制数据:

DATA output_table TYPE STANDARD TABLE OF my_table_tt WITH DEFAULT KEY.
FIELD-SYMBOLS <row> TYPE my_table_tt.

LOOP AT my_table ASSIGNING <row>.
  APPEND <row> TO output_table.
ENDLOOP.

cl_salv_table=>factory(
  EXPORTING
    list_display = abap_false
  IMPORTING
    r_salv_table = salv_table
  CHANGING
    t_table      = output_table
).

salv_table->get_functions( )->set_all( abap_true ).
salv_table->display( ).

APPEND 会将每一行复制到 output_table,包括其中的 STRING 值。循环按照 my_table 的读取顺序处理数据;由于源表是排序表,读取顺序通常就是排序后的顺序。

注意事项

  • output_table 的行类型必须与源表兼容。源表的行结构发生变化时,也要相应调整标准表类型。
  • 标准表的表键不会沿用源排序表的排序规则。后续代码依赖特定顺序时,应明确检查或维护该顺序。
  • 如果当前 ABAP 版本支持 WITH EMPTY KEY,也可以用它声明标准表。此示例使用 WITH DEFAULT KEY,以避免依赖该语法是否受支持。

备注:内容仅供参考。