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/ |