Текущее время: Чт, мар 28 2024, 16:39

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


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


ВНИМАНИЕ!

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



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

Зарегистрирован:
Вт, апр 24 2007, 15: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, 11:10 
Почетный гуру
Почетный гуру
Аватара пользователя

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

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


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

Зарегистрирован:
Вт, апр 24 2007, 15: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, 13:56 
Специалист
Специалист

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


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

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

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


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

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

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


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

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


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

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

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


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

Зарегистрирован:
Вт, апр 24 2007, 15: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, 22:34 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3074
Откуда: Москва
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, 10:01 
Почетный гуру
Почетный гуру
Аватара пользователя

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

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


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

Зарегистрирован:
Вт, апр 24 2007, 15: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, 12:35 
Почетный гуру
Почетный гуру
Аватара пользователя

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

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


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

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

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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