簡體   English   中英

從內表動態查詢

[英]Dynamic query from internal table

我有一個要求,我想動態地運行這個查詢。 有沒有人研究過這種查詢?

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

READ TABLE在指定輔助鍵( 此處)和關鍵組件( 此處)時具有動態語法,但方式有限。

我認為LOOP AT是您正在尋找的命令。 有關用法和示例的更多詳細信息,請參見此處 看第 4 部分:

動態 WHERE 條件 cond_syntax 可以指定為類字符數據對象或類字符行類型的標准表

虛擬代碼:

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

這是基於此答案的另一種可能的解決方案。 雖然,它有點丑陋,但它絕對有效。

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.

該示例建立在 USR02 表上。

  1. 首先,在動態選擇屏幕上,我們指定必要的選擇字段(READ TABLE 的鍵)及其值。
  2. 然后FREE_SELECTIONS_INIT FM 基於這些字段構建 WHERE 條件。
  3. 我們解析這個條件並獲取填充的字段名稱和值。
  4. READ TABLE語句模板中,空字段會被簡單地忽略,並且表只能通過填充的鍵讀取。

暫無
暫無

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

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