SAPфорум.RU
https://sapboard.ru/forum/

FOR ALL ENTRIES IN 7.40
https://sapboard.ru/forum/viewtopic.php?f=13&t=96123
Страница 1 из 1

Автор:  troy [ Вт, фев 27 2018, 20:20 ]
Заголовок сообщения:  FOR ALL ENTRIES IN 7.40

Привет, подскажите, можно ли в ABAP 7.40 для FOR ALL ENTRIES IN указывать различные условия выборки в зависимости от конкретных значений в [ENTRIES]. Т.е. делать примерно следующее:

Code:
SELECT * FROM table
  INTO lt_result
  FOR ALL ENTRIES IN @lt_data
  WHERE key EQ
    CASE WHEN @lt_data-type EQ '1' THEN lt_data-key1
         WHEN @lt_data-type EQ 'A' THEN lt_data-key2
         WHEN ....         
         ELSE @lt_data-keyN
    END.                                     

Т.е. для некоторых записей в таблице lt_data должны быть спец. условия выборки.

Если да, то какой правильный синтаксис должен быть для более сложного условия, типа:
Code:
SELECT * FROM table
  INTO lt_result
  FOR ALL ENTRIES IN @lt_data
  WHERE CASE WHEN @lt_data-type EQ '1' THEN type IN ('A','B')
             WHEN @lt_data-type EQ 'A' THEN type EQ 'C'
             WHEN ...
             ELSE type EQ @lt_data-type
         END.                                     

Автор:  Kengur [ Ср, фев 28 2018, 11:10 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

А когда можно было case в where делать?

Автор:  troy [ Ср, фев 28 2018, 12:44 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

Kengur написал(а):
А когда можно было case в where делать?

А как это относится к моему вопросу?
Или этим вы хотите сказать, что в WHERE никаким образом нельзя (в т.ч. в ABAP 7.40+) модифицировать условия в зависимости от содержимого исходной таблицы? Приведенный мной "пример" кода можно рассматривать проще:
Цитата:
WHERE key EQ
ЕСЛИ @lt_data-type EQ '1' ТО lt_data-key1
ЕСЛИ @lt_data-type ТО 'A' ТО lt_data-key2
ЕСЛИ ....

Автор:  Daw [ Ср, фев 28 2018, 13:56 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

CASE нельзя использовать в условии, только для значений.

Автор:  troy [ Ср, фев 28 2018, 14:28 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

Daw написал(а):
CASE нельзя использовать в условии, только для значений.

Повторю, вопрос был не про CASE.
Можно ли каким-то образом модифицировать условия WHERE в зависимости от содержимого исходной таблицы в FOR ALL ENTRIES?
И если нет, то есть ли вообще альтернативные варианты, кроме дробления исходной таблицы на подтаблицы?

Автор:  Kengur [ Ср, фев 28 2018, 15:55 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

Наверно надо задать вопрос про то что ты конкретно хочешь решить (с примером из 2 наборов), а не пытаться выудить из нас костыли или велосипеды.

Автор:  pberezin [ Ср, фев 28 2018, 18:32 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

а зачем такой изврат применять вообще? Ведь это будет в разрез с общей идеологией использования сервера AS как инструмента разгрузки СУБД - т.е. заставлять СУБД выполнять сложные поиски по переменному числу полей (наверняка с диким планом запроса), когда можно очевидным образом декомпозировать на отдельные простые for all-запросы, и дособирать из них нужное в памяти сервера приложений.

Автор:  Kengur [ Ср, фев 28 2018, 18:47 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

концепция поменялась, кстати. теперь все надо пуш-даунить в хану (с)

Автор:  troy [ Ср, фев 28 2018, 19:15 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

pberezin написал:
а зачем такой изврат применять вообще [...] когда можно очевидным образом декомпозировать на отдельные простые for all-запросы, и дособирать из них нужное в памяти сервера приложений.

Сейчас так и есть, но не факт что это лучше в плане быстродействия. К тому же в данном конкретном случае код был бы более простым и понятным. Поэтому и интересно, есть ли альтернативные варианты.

Kengur написал(а):
Наверно надо задать вопрос про то что ты конкретно хочешь решить (с примером из 2 наборов), а не пытаться выудить из нас костыли или велосипеды.

Если описать задачу словами: есть внутренняя таблица, в которой содержатся данные документов, скажем, поля KEY1 KEY2 TYPE.
Надо считать данные из БД по следующему алгоритму:
- если TAB-KEY2 пустой, то использовать ключ KEY1;
- иначе использовать ключ KEY1+KEY2;
- если TAB-TYPE IN "набор1", то нужен доп.ключ TYPE IN "набор1";
- иначе если TAB-TYPE IN "набор2", то нужен доп.ключ TYPE IN "набор2";
- иначе нужен доп.ключ TYPE EQ TAB-TYPE.
Вопрос - можно ли сделать это в одном селекте, а не разделять на несколько.

Автор:  Удав [ Ср, фев 28 2018, 22:34 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

troy написал(а):
Если описать задачу словами: есть внутренняя таблица, в которой содержатся данные документов, скажем, поля KEY1 KEY2 TYPE.
Надо считать данные из БД по следующему алгоритму:
- если TAB-KEY2 пустой, то использовать ключ KEY1;
- иначе использовать ключ KEY1+KEY2;
- если TAB-TYPE IN "набор1", то нужен доп.ключ TYPE IN "набор1";
- иначе если TAB-TYPE IN "набор2", то нужен доп.ключ TYPE IN "набор2";
- иначе нужен доп.ключ TYPE EQ TAB-TYPE.
Вопрос - можно ли сделать это в одном селекте, а не разделять на несколько.

Да в чем проблема то?
Цикл по внутренней таблице, в которой заполняется другая внутренняя таблица с полем KEY.
Затем один вызов SELECT .. FOR ALL ENTRIES.
Зачем вы пытаетесь в одном выражении скрестить SQL с обработкой внутренней таблицы по условию? :?

Автор:  Kengur [ Чт, мар 01 2018, 10:01 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

на SQL есть несколько операций в которых это можно изложить например union и в каждом конкретном случае join с гомогенной таблицей ключей. а вот то что вы пытаетесь спустить на уровень бд динамическое вычисление этого самого ключа через запрос не работает. возможно это можно сделать через AMDP

Автор:  troy [ Чт, мар 01 2018, 12:18 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

Kengur написал(а):
спустить на уровень бд динамическое вычисление этого самого ключа через запрос не работает

Ясно, спасибо.
Удав написал(а):
Да в чем проблема то?

"Проблемы" никакой нет, так и сделано. Вопрос был про новые возможности в ABAP.
Добили же всякие примочки, которые я лично вживую не пробовал. Например:
Code:
    SELECT carrid, connid, fldate, seatsmax, seatsocc,
           seatsmax - seatsocc AS seatsfree
           FROM sflight
           WHERE seatsmax - seatsocc > @( input( ) )
           INTO TABLE @DATA(result).

или
Code:
DATA prog_range TYPE RANGE OF trdir-name.
SELECT 'I' AS sign, 'EQ' AS option, obj_name AS low, ' ' AS high
       FROM tadir
       WHERE pgmid = 'R3TR' AND object = 'PROG' AND devclass = @devclass
UNION
SELECT 'I' AS sign, 'CP' AS option, 'L' && obj_name && '+++' AS low, ' ' AS high
       FROM tadir
       WHERE pgmid = 'R3TR' AND object = 'FUGR' AND devclass = @devclass
       INTO TABLE @prog_range.

или
Code:
    SELECT carrid, connid, cityfrom, cityto
           FROM spfli
           WHERE carrid =
             @( VALUE spfli-carrid( carriers[ KEY name
                                              carrname = name ]-carrid
                                              OPTIONAL ) )
           INTO TABLE @DATA(result).

Автор:  Kengur [ Чт, мар 01 2018, 12:35 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

ну или можно поизвращаться с вложенными запросами в Native SQL

Автор:  Kengur [ Чт, мар 01 2018, 14:31 ]
Заголовок сообщения:  Re: FOR ALL ENTRIES IN 7.40

Или вот так в 751
https://help.sap.com/doc/abapdocu_751_i ... apwith.htm

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/