2013-09-18 1 views
2

У меня есть имя таблицы DATA lv_tablename TYPE tabname VALUE 'xxxxx' и общий FIELD-SYMBOLS: <lt_table> TYPE ANY TABLE., который содержит записи, выбранные из соответствующей таблицы.Может ли инструкция READ TABLE динамически создаваться с произвольным количеством спецификаций полей ключа?

Я определил свою структуру строк FIELD-SYMBOLS: <ls_line> TYPE ANY., которую я буду использовать для чтения из таблицы.

Есть ли способ создать инструкцию READ на <lt_table>, полностью определяющую ключевые поля?

Мне известно о заявлении/добавлении READ TABLE xxxx WITH KEY (lv_field_name) = 'asdf'., но это, однако, не сработало (afaik) для динамического количества ключевых полей, и я бы не хотел создавать большое количество операторов READ TABLE с увеличением числа спецификаций ключевых полей.

Можно ли это сделать?

+0

Пожалуйста, добавьте тег «сырой» в дополнение к «падла ». :-) Есть ли какие-то реальные требования? – vwegert

+0

никаких реальных требований. Просто я пытаюсь понять, как далеко можно растянуть язык. –

+0

@ vwegert тег «гипотетический» довольно приятный. не знал об этом. я обязательно буду использовать его больше (в основном каждый раз: P) –

ответ

3

На самом деле я нашел эту работу

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, во время выполнения это не проблема.

И, наконец, можно указать поля в любом порядке (я не знаю, что выигрыш в производительности или штрафы можно получить, используя этот синтаксис)

+0

Если вы хотите получить все ключевые поля, вы можете использовать rtts before, gett тип внутренней таблицы, внешний вид, какой элемент он имеет (если есть) и проверить, какие поля являются ключами. если эти поля являются ключами, вы должны добавить их во внутреннюю таблицу, состоящую из двух столбцов, где одно - это имя столбца идентифицированного имени таблицы, а другое - соответствующее значение. Позже вы легко можете создать условия привязки ключа read_table. – icbytes

+0

или я мог бы 'SELECT fieldname FROM dd03l WHERE tablename = 'asdf' AND keyflag = 'x''. Если я это сделаю с RTTS, я, видимо, получаю ключ времени выполнения, который представляет собой набор всех нечисловых полей, но я не хочу использовать этот ключ. –

0

Возможно, существует возможность (например, динамический оператор выбора с привязкой и lt_dynwhere).

Пожалуйста, обратитесь на этот пост, есть кто-то, кто просил также требование:

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

+0

Я думаю, что приведенная ссылка иллюстрирует утверждение 'READ TABLE asdf WITH KEY ('asdf') = 'qwer''. Я уже знал об этом, но не хотел этого использовать. В конце концов я получил его для работы, используя поля полей, которые могут быть пустыми. –