簡體   English   中英

從任意表動態選擇

[英]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.

替換表名的語法是什么? 我知道替換語句只適用於字符串,但有沒有辦法解決?

您可以從表中動態選擇:

DATA: lv_table TYPE tabname.

    SELECT * 
           INTO TABLE lt_table
           FROM (lv_table).

但是,您選擇的 lt_table 必須與您從中選擇的數據庫表具有相同的結構,否則它將轉儲。 為了克服這個問題,您可以使用INTO COORESPONDING FIELDS OF lt_table (而不是INTO TABLE... )。 您還可以動態聲明 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創建動態內部表。 因此,在 Select 語句中,您不會得到轉儲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM