动态 SELECT 来自任意 table
Dynamic SELECT from arbitrary table
我的程序中有一个下拉列表,我在其中输入了不同表格的名称。所以我使用了 IF 语句。基本上:
if wa_list-key = '1'.
(replace name of table with the one choosen from the dropdown list)
endif.
我有这样的选择:
select * from customer into table lt_customer.
替换表名的语法是什么?
我知道替换语句只适用于字符串,但有什么办法吗?
您可以动态 select 来自 table:
DATA: lv_table TYPE tabname.
SELECT *
INTO TABLE lt_table
FROM (lv_table).
但是,您 select 进入的 lt_table 必须具有与您 select 来自的数据库 table 相同的结构,否则它会转储。要克服这个问题,您可以使用 INTO COORESPONDING FIELDS OF lt_table
(而不是 INTO TABLE...
)。您还可以动态声明 WHERE 条件:WHERE (lv_where)
这完全取决于您的确切需求。
在 JozsefSzikszai 的回答中,当结构和数据库 table 不同时,您将得到转储。所以,你可以试试这个-
DATA: lv_tabname TYPE tabname.
DATA: lo_tabtype TYPE REF TO cl_abap_tabledescr,
lo_struct_type TYPE REF TO cl_abap_structdescr,
lr_data TYPE REF TO data,
lt_comp_tab TYPE cl_abap_structdescr=>component_table,
ls_comp_fld TYPE cl_abap_structdescr=>component.
FIELD-SYMBOLS: <fs_tab> TYPE ANY TABLE,
<fs_struct> TYPE ANY.
lv_tabname = 'ZTEST_DIV'. " Give tab name from your dropdown select
lo_struct_type ?= cl_abap_typedescr=>describe_by_name( lv_tabname ).
lt_comp_tab = lo_struct_type->get_components( ).
lo_struct_type = cl_abap_structdescr=>create( lt_comp_tab ).
lo_tabtype = cl_abap_tabledescr=>create( lo_struct_type ).
CREATE DATA lr_data TYPE HANDLE lo_tabtype.
ASSIGN lr_data->* TO <fs_tab>.
*CREATE DATA lr_data TYPE HANDLE lo_struct_type. " Use this when you want same table structure
*ASSIGN lr_data->* TO <fs_struct>.
* dynamic select
SELECT *
FROM (lv_tabname)
INTO CORRESPONDING FIELDS OF TABLE <fs_tab>.
它会更通用。它将使用 lv_tabname
创建动态内部 table。所以,在 Select 声明中你不会得到转储。
我的程序中有一个下拉列表,我在其中输入了不同表格的名称。所以我使用了 IF 语句。基本上:
if wa_list-key = '1'.
(replace name of table with the one choosen from the dropdown list)
endif.
我有这样的选择:
select * from customer into table lt_customer.
替换表名的语法是什么? 我知道替换语句只适用于字符串,但有什么办法吗?
您可以动态 select 来自 table:
DATA: lv_table TYPE tabname.
SELECT *
INTO TABLE lt_table
FROM (lv_table).
但是,您 select 进入的 lt_table 必须具有与您 select 来自的数据库 table 相同的结构,否则它会转储。要克服这个问题,您可以使用 INTO COORESPONDING FIELDS OF lt_table
(而不是 INTO TABLE...
)。您还可以动态声明 WHERE 条件:WHERE (lv_where)
这完全取决于您的确切需求。
在 JozsefSzikszai 的回答中,当结构和数据库 table 不同时,您将得到转储。所以,你可以试试这个-
DATA: lv_tabname TYPE tabname.
DATA: lo_tabtype TYPE REF TO cl_abap_tabledescr,
lo_struct_type TYPE REF TO cl_abap_structdescr,
lr_data TYPE REF TO data,
lt_comp_tab TYPE cl_abap_structdescr=>component_table,
ls_comp_fld TYPE cl_abap_structdescr=>component.
FIELD-SYMBOLS: <fs_tab> TYPE ANY TABLE,
<fs_struct> TYPE ANY.
lv_tabname = 'ZTEST_DIV'. " Give tab name from your dropdown select
lo_struct_type ?= cl_abap_typedescr=>describe_by_name( lv_tabname ).
lt_comp_tab = lo_struct_type->get_components( ).
lo_struct_type = cl_abap_structdescr=>create( lt_comp_tab ).
lo_tabtype = cl_abap_tabledescr=>create( lo_struct_type ).
CREATE DATA lr_data TYPE HANDLE lo_tabtype.
ASSIGN lr_data->* TO <fs_tab>.
*CREATE DATA lr_data TYPE HANDLE lo_struct_type. " Use this when you want same table structure
*ASSIGN lr_data->* TO <fs_struct>.
* dynamic select
SELECT *
FROM (lv_tabname)
INTO CORRESPONDING FIELDS OF TABLE <fs_tab>.
它会更通用。它将使用 lv_tabname
创建动态内部 table。所以,在 Select 声明中你不会得到转储。