我正在尝试编写一个可以接受表名的类,为数据摄取目的添加几个额外的列,然后生成一个 CSV。我通过发送表名作为参数来为表工作:
" Get the data dictionary object for the table
table_type ?= cl_abap_typedescr=>describe_by_name( table ).
" Create a table description object with the line type
table_descr = cl_abap_tabledescr=>create( p_line_type = table_type ).
" Declare the internal table using the generic type
create data gt_data type handle table_descr.
这个通用代码让我回到家,然后通过 cl_sql_statement 创建一个 SQL 调用并填充 gt_data 对象。我的问题是:
我可以为泛型类型添加一列吗?我想在对象的前面添加一个时间戳列,说明我何时从系统中提取数据。
我可能还想使用 JOIN 运行查询,我可能需要来自另一个表的单个字段,而泛型类型无法处理,因此我可能需要添加一个额外的列。这怎么能做到?
你已经非常接近解决方案了。
使用 RTTS 类。
您的 ABAP 系统中有一个示例可以满足您的需求。
见 ABAP
demo_create_data_via_handle
Docu 也涵盖了这个过程。
这是程序的一个片段。
METHOD main.
DATA: struct_type TYPE REF TO cl_abap_structdescr,
dref TYPE REF TO data,
oref TYPE REF TO cx_sy_struct_creation.
DATA column1 TYPE c LENGTH 30.
DATA column2 TYPE c LENGTH 30.
FIELD-SYMBOLS: <struc> TYPE any,
<comp1> TYPE any,
<comp2> TYPE any.
cl_demo_input=>add_field( CHANGING field = column1 ).
cl_demo_input=>add_field( CHANGING field = column2 ).
cl_demo_input=>request( ).
column1 = to_upper( column1 ).
column2 = to_upper( column2 ).
TRY.
struct_type = cl_abap_structdescr=>get(
VALUE #(
( name = column1 type = cl_abap_elemdescr=>get_c( 40 ) )
( name = column2 type = cl_abap_elemdescr=>get_i( ) )
)
).
CREATE DATA dref TYPE HANDLE struct_type.
CATCH cx_sy_struct_creation INTO oref.
cl_demo_output=>display( oref->get_text( ) ).
RETURN.
ENDTRY.
ASSIGN dref->* TO <struc>.
ASSIGN COMPONENT column1 OF STRUCTURE <struc> TO <comp1>.
<comp1> = 'Amount'.
ASSIGN dref->* TO <struc>.
ASSIGN COMPONENT column2 OF STRUCTURE <struc> TO <comp2>.
<comp2> = 11.
cl_demo_output=>display( |{ column1 WIDTH = 32 } { <comp1> }\n| &
|{ column2 WIDTH = 32 } { <comp2> }| ).
ENDMETHOD.