Понятия таблицы: получить подмножество из внутренней таблицы в другую

Как указано в теме, я хочу иметь условное подмножество внутренней таблицы внутри другой внутренней таблицы.

Давайте сначала посмотрим, как это может выглядеть по старинке.

DATA: lt_hugeresult TYPE tty_mytype,
      lt_reducedresult TYPE tty_mytype.  

SELECT "whatever" FROM "wherever" 
        INTO CORRESPONDING FIELDS OF TABLE lt_hugeresult 
          WHERE "any_wherecondition".
IF sy-subrc = 0.
  lt_reducedresult[] = lt_hugeresult[].
  DELETE lt_reducedresult WHERE col1 EQ 'a value'
                            AND col2 NE 'another value'
                            AND col3 EQ 'third value'.
 .
 .
 .


ENDIF.

Мы все можем это знать.

Теперь я читал о материалах, сокращающих таблицы, которые представлены в abap 7.40, по-видимому, SP8.

Составление таблиц - функциональное построение таблиц

На основе таблиц:

Тип таблицы VALUE (FOR line IN вкладка WHERE (…)

(… Линия-…… линия-……))

Для каждой выбранной строки в исходной таблице (ах) построить строку в таблице результатов. Обобщение конструктора значений от статического к динамическому количеству строк.

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

Итак, как бы это выглядело, если бы я хотел написать приведенное выше утверждение с помощью техники понимания таблиц?

До сих пор у меня есть это, доставляет не то, что мне нужно, и я видел, что вроде бы «не равно» невозможно ...

DATA(reduced) =  VALUE tty_mytype( FOR checkline IN lt_hugeresult
                                   WHERE ( col1 = 'a value' )
                                         ( col2 = 'another value' )
                                         ( col3 = space )
                                 ).

У кого-нибудь есть подсказки?

РЕДАКТИРОВАТЬ: Кажется, все еще не работает. Вот как я это делаю:

Исполняемая строка:

введите здесь описание изображения

Результаты отладчика:

введите здесь описание изображения

Неправильно уменьшено:

введите здесь описание изображения

И че теперь ???


person icbytes    schedule 12.02.2016    source источник
comment
Как заполнить таблицу tbapi2045d4? Мне его содержание кажется неудобным. Приведите более общий пример (с MARA или BSEG), поскольку структура BAPI2045D4 используется только в паре QM BAPI (в отдельных параметрах), а поведение этих параметров плохо документировано.   -  person Suncatcher    schedule 10.03.2016
comment
Вы абсолютно правы, документации хуже, чем в qm, нет. Таблица заполняется BAPI с именем BAPI_INSPOPER_GETRESULTS. Но, как вы видите в отладчике, эти 5 записей собраны правильно. Только редуцирование кажется неудачным, и это не всегда. Этот черный элемент является просто нашим пространством имен, потому что я создал tabletype с этой структурой как line-type. Может ли это вызвать проблемы?   -  person icbytes    schedule 10.03.2016
comment
Приведенный выше синтаксис идеально подходит для MARA.   -  person Suncatcher    schedule 10.03.2016


Ответы (3)


Итерации таблиц могут сбивать с толку при использовании WHERE из-за групп скобок.

Условие «НЕ РАВНО» очень хорошо поддерживается, как я покажу ниже в решении вашего первого примера. Проблема, которую вы наблюдаете, связана с неправильным использованием групп скобок.

Вы должны обязательно определить все логическое выражение после группы круглых скобок WHERE Inside ONE (одно или несколько элементарных условий, разделенных логическими операторами AND, OR и т. Д.)

После группы скобок для WHERE вы обычно определяете только одну группу скобок, которая соответствует строке, добавляемой в целевую внутреннюю таблицу. Вы можете определить последующие группы скобок, если для каждой строки исходной внутренней таблицы вы хотите добавить несколько строк в целевой внутренней таблице.

В вашем примере к WHERE применяется только первая группа скобок (либо col1 = 'a value' в вашем первом примере, либо insplot = _ilnum во втором примере).

Последующие группы скобок соответствуют добавляемым строкам, т.е. для каждой исходной строки в первом примере добавляются 2 строки (одна строка с col2 = 'другое значение' и одна строка с col3 = space), и добавляются 3 строки. для каждой исходной строки во втором примере (одна строка с inspoper = i_evaluation-inspoper, одна строка с inspchar = i_evaluation-inspchar, одна строка, соответствующая строке _single_results).

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

Первый пример:

DATA(reduced) =  VALUE tty_mytype( FOR checkline IN lt_hugeresult
                                   WHERE (     col1 =  'a value' 
                                           AND col2 <> 'another value'
                                           AND col3 =  'third value'
                                         )
                                   ( checkline )
                                 ).

Второй пример:

DATA(singres) = VALUE tbapi2045d4( FOR checkline IN _single_results
                                   WHERE (     insplot = _ilnum
                                           AND inspoper = i_evaluation-inspoper
                                           AND inspchar = i_evaluation-inspchar 
                                         )
                                   ( checkline )
                                 ).
person Sandra Rossi    schedule 04.02.2018

Вы можете использовать оператор FILTER с добавлением EXCEPT WHERE, чтобы отфильтровать любые строки, соответствующие предложению where:

lt_reducedresult = FILTER # ( lt_hugeresult EXCEPT WHERE col1 = 'a value' 
                                                     AND col2 <> 'another value' 
                                                     AND col3 = 'a third value' ).

Обратите внимание, что lt_hugeresult должна быть отсортированной таблицей, а _5 _ / _ 6 _ / _ 7_ должны быть ключевыми компонентами (вы можете указать вторичный ключ с помощью добавления USING KEY).

В документации для FILTER прямо указано, что:

Фильтрация таблиц также может выполняться с использованием понимания таблицы или сокращения таблицы с помощью выражения итерации для итераций таблицы с помощью FOR. Оператор FILTER обеспечивает сокращенный формат для этого особого случая и более эффективен для выполнения.

Фильтр таблицы строит результат построчно. Если результат содержит почти все строки в исходной таблице, этот метод может быть медленнее, чем копирование исходной таблицы и удаление лишних строк из целевой таблицы.

Таким образом, ваш подход к использованию DELETE может быть подходящим в зависимости от размера таблицы.

person Smigs    schedule 15.02.2016
comment
Похоже на это. В данном случае я имею дело с оценками контрольных партий контрольных характеристик. Я использую значение или фильтр, давайте посмотрим - person icbytes; 15.02.2016
comment
Я обновил свой вопрос с помощью новейшей проблемы прямо сейчас. - person icbytes; 08.03.2016

Я сравнил старомодный синтаксис вашего примера выше с техникой понимания таблицы и получил точно такой же результат.
На самом деле ваш образец не работает, потому что в нем отсутствует спецификация строки для построенной таблицы reduced. Попробуйте этот, который у меня сработал.

DATA(reduced) =  VALUE tty_mytype( FOR checkline IN lt_hugeresult
                                WHERE ( col1 = 'a value' AND 
                                        col2 = 'another value' AND
                                        col3 = space )
                                   ( checkline )
                                 ).

В приведенном выше примере у нас есть базовый тип спецификации строки результата, где он полностью аналогичен исходной таблице. Более сложные примеры, в которых новые строки таблицы оцениваются с помощью итераций таблицы, можно найти здесь.

person Suncatcher    schedule 12.02.2016
comment
@icbytes, конечно. ( checkline ) представляет собой спецификацию строки здесь - person Suncatcher; 15.02.2016
comment
Снова обновил свой вопрос, убрал флажки ответа, скоро добавлю их, если новая ситуация прояснится. THX заранее. - person icbytes; 08.03.2016
comment
Никогда не поздно, но когда я опубликовал свой ответ после вашего, я забыл сказать, что ваш ответ неверен, потому что WHERE принимает только первую круглую скобку в качестве условия для оценки, а следующие круглые скобки - это строки, которые нужно добавить в построенную таблицу, т.е. для каждой строки lt_hugeresult, 3 строки добавляются к reduced (3 строки: "( col2 = ... )", "( col3 = ... )", "( checkline )". - person Sandra Rossi; 18.10.2019