[英]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_string1
和lv_string2
,在运行时这没有问题。
最后,可以按任何顺序指定字段(我不知道使用此语法可能会获得哪些性能优势或惩罚)
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.