简体   繁体   English

从内表动态查询

[英]Dynamic query from internal table

I had a requirement in which I wanted to dynamically run this query.我有一个要求,我想动态地运行这个查询。 Has anyone have worked on this kind of query?有没有人研究过这种查询?

READ TABLE table_name TRANSPORTING feild_name INTO table_name
              WITH KEY key_feild1 = value1,
                       key_feild2 = value2,
                       key_feild3 = value3.

READ TABLE has dynamic syntax when specifying secondary keys ( here ) and key components ( here ), but in a limited fashion. READ TABLE在指定辅助键( 此处)和关键组件( 此处)时具有动态语法,但方式有限。

I think LOOP AT is the command you are looking for.我认为LOOP AT是您正在寻找的命令。 More details about the usage and example here .有关用法和示例的更多详细信息,请参见此处 Look at Part 4:看第 4 部分:

Dynamic WHERE Condition cond_syntax can be specified as a character-like data object or standard table with character-like row type动态 WHERE 条件 cond_syntax 可以指定为类字符数据对象或类字符行类型的标准表

Dummy code:虚拟代码:

LOOP AT table INTO line WHERE (condition).
  EXIT. --> Exit at first found line.
ENDLOOP.
IF sy-subrc = 0.
...
ENDIF.

Here is one more possible solution, based on this answer .这是基于此答案的另一种可能的解决方案。 Though, it is a bit ugly, but it definitely works.虽然,它有点丑陋,但它绝对有效。

DATA: table_tab TYPE TABLE OF rsdstabs,
      selid     TYPE  rsdynsel-selid,
      cond_tab  TYPE rsds_twhere,
      field_tab TYPE TABLE OF rsdsfields,
      string    TYPE string.
FIELD-SYMBOLS <cond>  LIKE LINE OF cond_tab.

table_tab = VALUE #( ( prim_tab = 'USR02') ).

CALL FUNCTION 'FREE_SELECTIONS_INIT'
  EXPORTING
    kind         = 'T'
  IMPORTING
    selection_id = selid
  TABLES
    tables_tab   = table_tab
  EXCEPTIONS
    OTHERS       = 4.
IF sy-subrc <> 0.
  MESSAGE 'Error in initialization' TYPE 'I' DISPLAY LIKE 'E'.
  LEAVE PROGRAM.
ENDIF.

CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
  EXPORTING
    selection_id  = selid
    title         = 'Free Selection'
    as_window     = ' '
  IMPORTING
    where_clauses = cond_tab
  TABLES
    fields_tab    = field_tab
  EXCEPTIONS
    OTHERS        = 4.
IF sy-subrc <> 0.
  MESSAGE 'No free selection created' TYPE 'I'.
  LEAVE PROGRAM.
ENDIF.

FIELD-SYMBOLS: <fld> TYPE any.
DATA: field1  TYPE c LENGTH 10, value1 TYPE string,
      field2  TYPE c LENGTH 10, value2 TYPE string,
      field3  TYPE c LENGTH 10, value3 TYPE string,
      field4  TYPE c LENGTH 10, value4 TYPE string,
      field5  TYPE c LENGTH 10, value5 TYPE string,
      field6  TYPE c LENGTH 10, value6 TYPE string,
      field7  TYPE c LENGTH 10, value7 TYPE string,
      field8  TYPE c LENGTH 10, value8 TYPE string,
      field9  TYPE c LENGTH 10, value9 TYPE string,
      num1(1) TYPE n,
      fldname TYPE fieldname,
      valname TYPE fieldname.

ASSIGN cond_tab[ tablename = 'USR02' ] TO <cond>.

IF sy-subrc = 0.
  LOOP AT <cond>-where_tab ASSIGNING FIELD-SYMBOL(<fs_cond>).
    num1 = sy-tabix.
    CONCATENATE 'field' num1 INTO fldname.
    CONCATENATE 'value' num1 INTO valname.
    ASSIGN (fldname) TO <fld>. "assigning field name
    string = <fs_cond>.
    REPLACE REGEX `(^.*\(\s)(.*)(EQ.*)` IN string WITH '$2'.
    <fld> = string.
    ASSIGN (valname) TO <fld>. "assigning value
    string = <fs_cond>.
    REPLACE REGEX `(.*EQ\s)'(.*)('\s*\))` IN string WITH '$2'.
    <fld> = string.
  ENDLOOP.
ENDIF.

SELECT * 
  FROM usr02
INTO TABLE @DATA(lt_usr).

READ TABLE lt_usr ASSIGNING FIELD-SYMBOL(<fs_usr>)
WITH  KEY  (field1) = value1
           (field2) = value2
           (field3) = value3
           (field4) = value4
           (field5) = value5
           (field6) = value6
           (field7) = value7
           (field8) = value8
           (field9) = value9.

The sample is built on USR02 table.该示例建立在 USR02 表上。

  1. At first, on the dynamic selection screen we specify necessary selections fields (keys for READ TABLE) and their values.首先,在动态选择屏幕上,我们指定必要的选择字段(READ TABLE 的键)及其值。
  2. Then FREE_SELECTIONS_INIT FM builds WHERE condition based on these fields.然后FREE_SELECTIONS_INIT FM 基于这些字段构建 WHERE 条件。
  3. We parse this condition and fetch populated field names and values.我们解析这个条件并获取填充的字段名称和值。
  4. In a READ TABLE statement template, empty fields are simply ignored and table is read only by populated keys.READ TABLE语句模板中,空字段会被简单地忽略,并且表只能通过填充的键读取。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM