如何将含 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,以避免依赖该语法是否受支持。
备注:内容仅供参考。
