Текущее время: Чт, авг 16 2018, 12:08

Часовой пояс: UTC + 4 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Вт, фев 27 2018, 21:20 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2007, 16:56
Сообщения: 1402
Привет, подскажите, можно ли в 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.                                     


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Ср, фев 28 2018, 12:10 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 19:21
Сообщения: 1121
А когда можно было case в where делать?

_________________
я твой сап эфай внедрял
BAdI-позитив


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Ср, фев 28 2018, 13:44 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2007, 16:56
Сообщения: 1402
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
ЕСЛИ ....


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Ср, фев 28 2018, 14:56 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, дек 06 2005, 14:24
Сообщения: 78
CASE нельзя использовать в условии, только для значений.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Ср, фев 28 2018, 15:28 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2007, 16:56
Сообщения: 1402
Daw написал(а):
CASE нельзя использовать в условии, только для значений.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Ср, фев 28 2018, 16:55 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 19:21
Сообщения: 1121
Наверно надо задать вопрос про то что ты конкретно хочешь решить (с примером из 2 наборов), а не пытаться выудить из нас костыли или велосипеды.

_________________
я твой сап эфай внедрял
BAdI-позитив


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Ср, фев 28 2018, 19:32 
Специалист
Специалист

Зарегистрирован:
Чт, мар 29 2007, 12:51
Сообщения: 140
Откуда: Yugorsk.RU
Пол: Мужской
а зачем такой изврат применять вообще? Ведь это будет в разрез с общей идеологией использования сервера AS как инструмента разгрузки СУБД - т.е. заставлять СУБД выполнять сложные поиски по переменному числу полей (наверняка с диким планом запроса), когда можно очевидным образом декомпозировать на отдельные простые for all-запросы, и дособирать из них нужное в памяти сервера приложений.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Ср, фев 28 2018, 19:47 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 19:21
Сообщения: 1121
концепция поменялась, кстати. теперь все надо пуш-даунить в хану (с)

_________________
я твой сап эфай внедрял
BAdI-позитив


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Ср, фев 28 2018, 20:15 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2007, 16:56
Сообщения: 1402
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.
Вопрос - можно ли сделать это в одном селекте, а не разделять на несколько.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Ср, фев 28 2018, 23:34 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 17:44
Сообщения: 2930
Откуда: Москва
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 с обработкой внутренней таблицы по условию? :?

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Чт, мар 01 2018, 11:01 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 19:21
Сообщения: 1121
на SQL есть несколько операций в которых это можно изложить например union и в каждом конкретном случае join с гомогенной таблицей ключей. а вот то что вы пытаетесь спустить на уровень бд динамическое вычисление этого самого ключа через запрос не работает. возможно это можно сделать через AMDP

_________________
я твой сап эфай внедрял
BAdI-позитив


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Чт, мар 01 2018, 13:18 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2007, 16:56
Сообщения: 1402
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).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Чт, мар 01 2018, 13:35 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 19:21
Сообщения: 1121
ну или можно поизвращаться с вложенными запросами в Native SQL

_________________
я твой сап эфай внедрял
BAdI-позитив


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FOR ALL ENTRIES IN 7.40
СообщениеДобавлено: Чт, мар 01 2018, 15:31 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 19:21
Сообщения: 1121
Или вот так в 751
https://help.sap.com/doc/abapdocu_751_i ... apwith.htm

_________________
я твой сап эфай внедрял
BAdI-позитив


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB