Dynamic 从任意表中动态选择

Dynamic 从任意表中动态选择,dynamic,abap,opensql,rtts,Dynamic,Abap,Opensql,Rtts,在我的程序中有一个下拉列表,我在其中输入了不同表的名称。所以我使用了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. 替换表名的语法是什么? 我知道replace语句只对字符串起作用,但有办法吗?您可以从表中动态选择:

在我的程序中有一个下拉列表,我在其中输入了不同表的名称。所以我使用了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.
替换表名的语法是什么?
我知道replace语句只对字符串起作用,但有办法吗?

您可以从表中动态选择:

DATA: lv_table TYPE tabname.

    SELECT * 
           INTO TABLE lt_table
           FROM (lv_table).

但是,您选择的lt_表必须具有与您从中选择的数据库表相同的结构,否则它将转储。要克服这一问题,您可以将
用于lt_表的响应字段中(而不是
用于表…
)。您还可以动态声明WHERE条件:
WHERE(lv\u-WHERE)
这完全取决于您的具体需要。

您可以从表中动态选择:

DATA: lv_table TYPE tabname.

    SELECT * 
           INTO TABLE lt_table
           FROM (lv_table).

但是,您选择的lt_表必须具有与您从中选择的数据库表相同的结构,否则它将转储。要克服这一问题,您可以将
用于lt_表的响应字段中(而不是
用于表…
)。您还可以动态声明WHERE条件:
WHERE(lv_-WHERE)
这完全取决于您的具体需求。

在JozsefSzikszai答案中,当结构和数据库表不同时,您将得到转储。所以,你可以试试这个-

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类型tabname。
数据:lo_tabtype REF至cl_abap_tabledescr,
lo_结构类型参考至cl_abap_结构描述,
lr_数据类型参考数据,
lt_comp_tab TYPE cl_abap_structdescr=>component_table,
ls_comp_fld TYPE cl_abap_structdescr=>组件。
字段符号:键入任何表格,
键入任何。
lv_tabname='ZTEST_DIV'。“从下拉列表中选择选项卡名称
lo_结构类型?=cl_abap_类型描述=>按名称(lv_选项卡名称)描述_。
lt\u comp\u tab=lo\u struct\u type->get\u components()。
lo_struct_type=cl_abap_structdescr=>create(lt_comp_选项卡)。
lo_tabtype=cl_abap_tabledescr=>create(lo_struct_type)。
创建数据lr_数据类型句柄lo_选项卡类型。
将lr_数据->*分配给。
*创建数据lr_数据类型HANDLE lo_struct_TYPE。“当您需要相同的表结构时,请使用此选项。”
*将lr_数据->*分配给。
*动态选择
挑选*
FROM(lv_tabname)
输入到表的相应字段中。

它将更加通用。它将使用
lv_tabname
创建动态内部表。所以,在Select语句中不会得到转储。

在JozsefSzikszai答案中,当结构和数据库表不同时,会得到转储。所以,你可以试试这个-

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类型tabname。
数据:lo_tabtype REF至cl_abap_tabledescr,
lo_结构类型参考至cl_abap_结构描述,
lr_数据类型参考数据,
lt_comp_tab TYPE cl_abap_structdescr=>component_table,
ls_comp_fld TYPE cl_abap_structdescr=>组件。
字段符号:键入任何表格,
键入任何。
lv_tabname='ZTEST_DIV'。“从下拉列表中选择选项卡名称
lo_结构类型?=cl_abap_类型描述=>按名称(lv_选项卡名称)描述_。
lt\u comp\u tab=lo\u struct\u type->get\u components()。
lo_struct_type=cl_abap_structdescr=>create(lt_comp_选项卡)。
lo_tabtype=cl_abap_tabledescr=>create(lo_struct_type)。
创建数据lr_数据类型句柄lo_选项卡类型。
将lr_数据->*分配给。
*创建数据lr_数据类型HANDLE lo_struct_TYPE。“当您需要相同的表结构时,请使用此选项。”
*将lr_数据->*分配给。
*动态选择
挑选*
FROM(lv_tabname)
输入到表的相应字段中。

它将更加通用。它将使用
lv_tabname
创建动态内部表。所以,在Select语句中,您不会得到转储。

我不明白-您想要实现什么?为什么要使用替换语句?在SE80中键入REPLACE,然后按F1…您想要什么?我希望我的下拉列表能够正常工作,这样我就可以从不同的表中进行选择。因为表类型不同,所以没有用……例如:KNA1和LFA1(以及相关结构)非常相似,可能对某些数据提取有相同的处理。然而,由于涉及大量额外工作,这种方法的实用性很少有用。通常更容易做出2个选择或使用
if,elseif..
来分支流程逻辑。话虽如此,一些关于你正在努力实现的目标的背景肯定会帮助我们给你一个答案。仅凭动态选择对您没有多大帮助,因为您还需要动态数据处理?为什么要使用替换语句?在SE80中键入REPLACE,然后按F1…您想要什么?我希望我的下拉列表能够正常工作,这样我就可以从不同的表中进行选择。因为表类型不同,所以没有用……例如:KNA1和LFA1(以及相关结构)非常相似,可能对某些数据提取有相同的处理。然而,由于涉及大量额外工作,这种方法的实用性很少有用。通常更容易做出2个选择或使用
if,elseif..
来分支流程逻辑。话虽如此,一些关于你正在努力实现的目标的背景肯定会帮助我们给你一个答案。仅动态选择对您没有多大帮助,因为您还需要动态数据处理。如果您需要更多的通用访问,请检查此项。如果您需要更多的通用访问,请检查此项。或者使用更短的代码创建对内部表的引用,而不使用任何RTTS类:
CREATE data lr_data TYPE table OF(lv_tabname)。
(而不是代码类型HANDLE lo_tabtype)…和结构,即:
创建数据lr_数据类型(lv_tabname)。
(而不是代码类型HANDLE lo_struct_TYPE)@SandraRossi感谢您提供的信息。但我更喜欢使用RTTS类,因为如果
lv_tabname
包含有效的表名,我认为在标准类中会处理该异常。如果lv_tabname无效,CREATE DATA返回CX_SY_CREATE_DATA_ERROR,KERNEL_ERRID属性等于co