繁体   English   中英

阅读带有动态关键字段的表?

[英]READ TABLE with dynamic key fields?

我有一个表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种方式:

示例(此处使用 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' ).

暂无
暂无

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

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