读取具有动态键字段的表



我有一个表DATA lv_tablename TYPE tabname VALUE 'xxxxx'的名称,以及一个包含从相应表中选择的条目的泛型FIELD-SYMBOLS: <lt_table> TYPE ANY TABLE.

我已经定义了我的行结构FIELD-SYMBOLS: <ls_line> TYPE ANY.,我将使用它从表中读取。

有没有办法在完全指定关键字段<lt_table>创建 READ 语句?

我知道语句/加法READ TABLE xxxx WITH KEY (lv_field_name) = 'asdf'.,但这不适用于动态数量的关键字段(afaik),并且我不想创建大量具有越来越多的关键字段规范的READ TABLE语句。

这能做到吗?

实际上我发现这有效

DATA lt_bseg TYPE TABLE OF bseg.
DATA ls_bseg TYPE bseg.
DATA lv_string1 TYPE string.
DATA lv_string2 TYPE string.
lv_string1 = `    `.
lv_string2 = lv_string1.
SELECT whatever FROM wherever INTO TABLE lt_bseg.
READ TABLE lt_bseg INTO ls_bseg
    WITH  KEY ('MANDT') = 800
              ('  ')    = ''
              ('BUKRS') = '0005'
              ('BELNR') = '0100000000'
              ('GJAHR') = 2005
              ('BUZEI') = '002'
              ('')      = ''
              ('     ') = ''
              ('    ') = '         '
              (lv_string1) = '1'
              (lv_string2) = ''.

通过使用此语法,可以根据需要指定任意数量的关键字段。如果某些字段为空,则即使为这些空字段指定了值,这些字段也会被忽略。

必须注意的是,使用此确切的语法(静态定义),将不允许使用具有完全相同名称(甚至是空白名称)的 2 个字段。

如变量 lv_string1lv_string2 所示,在运行时这没有问题。

最后,可以按任何顺序指定字段(我不知道使用此语法时可能会获得哪些性能优势或惩罚)

似乎有可能(就像一个动态选择语句,带有绑定和lt_dynwhere)。

请参考这篇文章,有人,他也问了要求:

http://scn.sap.com/thread/1789520

3 种方法:

  • 使用 [表] 键读取表 ITAB (comp1) = 值 1 (comp2) = 值 2 ...
    • 您可以通过静态指示代码中键字段的最大数量来定义键字段的动态数,如果要使用的键字段较少,则可以在运行时指示一些空键字段名称。
  • 在 itab WHERE (where) 处循环(参见补充 4 "WHERE (cond_syntax)")
    • 自 ABAP 7.02 起可用。
  • 选择。。。从@itab哪里(哪里)...
    • 自 ABAP 7.52 起可用。如果条件复杂且无法由 ABAP 内核处理,即需要由数据库执行,则可能会很慢。在这种情况下,仅支持少数数据库(我认为目前仅支持 HANA)。

示例(此处使用 ASSERT 语句来证明条件为真,否则程序将失败):

TYPES: BEGIN OF ty_table_line,
         key_name_1 TYPE i,
         key_name_2 TYPE i,
         attr       TYPE c LENGTH 1,
       END OF ty_table_line,
       ty_internal_table TYPE SORTED TABLE OF ty_table_line WITH UNIQUE KEY key_name_1 key_name_2.
DATA(itab) = VALUE ty_internal_table( ( key_name_1 = 1 key_name_2 = 1 attr = 'A' )
                                      ( key_name_1 = 1 key_name_2 = 2 attr = 'B' ) ).
"------------------ READ TABLE
DATA(key_name_1) = 'KEY_NAME_1'.
DATA(key_name_2) = 'KEY_NAME_2'.
READ TABLE itab WITH TABLE KEY
        (key_name_1) = 1
        (key_name_2) = 2
        ASSIGNING FIELD-SYMBOL(<line>).
ASSERT <line> = VALUE ty_table_line( key_name_1 = 1 key_name_2 = 2 attr = 'B' ).
key_name_2 = ''. " ignore this key field
READ TABLE itab WITH TABLE KEY
        (key_name_1) = 1
        (key_name_2) = 2                    "<===  will be ignored
        ASSIGNING FIELD-SYMBOL(<line_2>).
ASSERT <line_2> = VALUE ty_table_line( key_name_1 = 1 key_name_2 = 1 attr = 'A' ).
"------------------ LOOP AT
DATA(where) = 'key_name_1 = 1 and key_name_2 = 1'.
LOOP AT itab ASSIGNING FIELD-SYMBOL(<line_3>)
    WHERE (where).
  EXIT.
ENDLOOP.
ASSERT <line_3> = VALUE ty_table_line( key_name_1 = 1 key_name_2 = 1 attr = 'A' ).
"---------------- SELECT ... FROM @itab
SELECT SINGLE * FROM @itab WHERE (where) INTO @DATA(line_3).
ASSERT line_3 = VALUE ty_table_line( key_name_1 = 1 key_name_2 = 1 attr = 'A' ).

相关内容

  • 没有找到相关文章