Текущее время: Пн, июл 07 2025, 23:59

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Динамическое WHERE
СообщениеДобавлено: Чт, мар 17 2005, 14:26 
Менеджер
Менеджер

Зарегистрирован:
Чт, янв 20 2005, 08:34
Сообщения: 573
Пол: Мужской
Господа, добрый день!!!

Хочу сделать динамическое Where к примеру такой:

Code:

types: str(72) type c.
types: begin of tir,
          line type str,
        end of tir.
data: tabname(30) type c value 'VBAP'.
data: itwhere type table of tir,
         irwhere type tir,
         str1 type str,
         str2 type str.

clear: str1, str2.
clear: irwhere, itwhere.

irwhere-line = 'EXISTS'.
append irwhere to itwhere.
irwhere-line = '('.
append irwhere to itwhere.
irwhere-line = 'SELECT *'.
append irwhere to itwhere.
concatenate '  FROM' 'VBAK'
  into irwhere-line separated by space.
append irwhere to itwhere.
irwhere-line = 'WHERE'.
append irwhere to itwhere.
concatenate 'VBAK' '~' 'MANDT' into str1.
concatenate 'VBAK~MANDT' '=' '''050'''
  into irwhere-line separated by space.
append irwhere to itwhere.
concatenate 'VBAP' '~' 'VBELN' into str1.
concatenate 'AND' 'VBAK~VBELN' '=' str1
  into irwhere-line separated by space.
append irwhere to itwhere.
irwhere-line = ')'.
append irwhere to itwhere.

break-point.

select *
  from (tabname)
  into table <fs>
  where (itwhere).




Говорит следующую ошибку:
Code:

The SELECT clause was specified in an internal table at runtime.       
It contains the field name "EXISTS", but this does not occur in any of
the database tables listed in the FROM clause.                         



Что не так то???


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 17 2005, 15:29 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Чт, окт 21 2004, 11:26
Сообщения: 216
Попробуй пробелов в строках поставить. Например перед Exist


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 17 2005, 15:30 
Гость
Пробовал
Тоже самое
НА EXISTS почему то ругается


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 17 2005, 16:31 
Гость
В САПовском хелпе есть примерчик:
Цитата:
&ABAP_HINT
If you use a subquery with the EXISTS operator, the expression is true if the subquery selects at least one line. You can useuse * in the SELECT clause of subqueries that use EXISTS.


Example
Selecting all flights from Frankfurt to New York between 1.1.1999 and 31.3.1999 that are not yet full:



DATA: WA_SFLIGHT TYPE SFLIGHT.

SELECT * FROM SFLIGHT AS F INTO WA_SFLIGHT
WHERE SEATSOCC < F~SEATSMAX
AND EXISTS ( SELECT * FROM SPFLI
WHERE CARRID = F~CARRID
AND CONNID = F~CONNID
AND CITYFROM = 'FRANKFURT'
AND CITYTO = 'NEW YORK' )
AND FLDATE BETWEEN '19990101' AND '19990331'.
WRITE: / WA_SFLIGHT-CARRID, WA_SFLIGHT-CONNID,
WA_SFLIGHT-FLDATE.
ENDSELECT.

Subqueries such as the one in this example, in which the WHERE clause uses fields from the main query, are known as correlated subqueries. Subqueries can be nested, and a given subquery may contain any fields from other, hierarchically-superior subqueries.

In a correlated subquery, the subquery is executed for each line r returned by the main query. In the above example, the main query finds all flights in table SFLIGHT that are not full and that have a date that meets the selection criterion. The statement then performs the subquery for each of the records returned by the main query, using the corresponding values of CARRID and CONNID, to check whether the relevant flight operates between Frankfurt and New York.


Да, еще не забудь, что нельзя использовать MANDT в конструкции Where.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 17 2005, 16:48 
Гость
НУ и че дальше. Я че то ВООБЩЕ не врубился к чему ты это.
У меня ДИНАМИКА. А к чему ты тот пример кинул???


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 17 2005, 17:09 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
Anonymous написал(а):
НУ и че дальше. Я че то ВООБЩЕ не врубился к чему ты это.
У меня ДИНАМИКА. А к чему ты тот пример кинул???


А какая разница? Да хоть супердинамика - но синтаксис WHERE clause должен правильным. На то и ругается, что не понимает она тебя. Попробуй для начала написать это статически и выполнить.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 17 2005, 18:23 
Гость
Да, и еще, у меня такое чувство, что это не реально, поскольку динамическое формирование условия выбора для селекта это одно, а вот динамическое формирование самого select'а (что в принципе ты и делаешь) это немного другое.
Вероятнее проще будет динамически генерить программку и вызывать ее для выполнения твоего селекта.

Да, еще, если строками:
Цитата:
concatenate 'VBAP' '~' 'VBELN' into str1.
concatenate 'AND' 'VBAK~VBELN' '=' str1


ты хотел получить строку типа: AND VBAK~VBELN = '00000001'
то это врядли выйдет, твоя строка (с точки зрения селекта) будет выглядеть так: AND VBAK~VBELN = 'VBAP~VBELN'

Хотя, если у тебя уже есть опыт создания подобных (с использованием EXISTS) динамических селектов, то все сказанное мною можно считать глупостью :cry:


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 17 2005, 19:14 
Гость
Ребята, вы вникните в вопрос ПОЖАЛУЙСТА прежде чем давать СОВЕТЫ.

Я хотел получить в условии WHERE следующее:

Code:
EXISTS
(                                                                         
SELECT *                                                                 
  FROM VBAK                                                           
WHERE                                                                     
VBAK~MANDT = '050'                                                       
AND VBAK~VBELN = VBAP~VBELN                                               
)                   



Я его в itwhere и ПОЛУЧИЛ!!!

СТАТИЧЕСКИ ОН РАБОТАЕТ!!!
Или НЕТ???

И вот ЭТО ЭТО высказывание не понятно:

Code:

А какая разница? Да хоть супердинамика - но синтаксис WHERE clause должен правильным. На то и ругается, что не понимает она тебя. Попробуй для начала написать это статически и выполнить.



Не идет EXISTS в динамике.
Что ж не понятног ото.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 17 2005, 19:55 
Гость
Имелось в виду, что прежде чем задавать в динамике, надо <я не знать русский языка> один из вариантов в статике.
Дело в том, что мандант НЕЛЬЗЯ вставлять в селект вообще (система тебя сразу выкинет и скажет об этом), а при динамическом формировании это может отразиться совсем другой ошибкой и ты долго будешь голову ломать.
А по поводу не возможности динамически создать селект с еще одним селектом в условии, это я сказал исходя из того, что почти час пытался реализовать твой динамический селект в жизнь.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 17 2005, 20:50 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
Anonymous написал(а):
Ребята, вы вникните в вопрос ПОЖАЛУЙСТА прежде чем давать СОВЕТЫ.

Не идет EXISTS в динамике.
Что ж не понятног ото.


Хорошо, хорошо - не идет. ОК, понятно, бум знать.
Зачем же так нервничать? :-)

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 17 2005, 22:06 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вс, окт 17 2004, 14:20
Сообщения: 326
Откуда: Москва
Anonymous написал(а):
Не идет EXISTS в динамике.

А должен:
http://help.sap.com/saphelp_47x200/help ... ameset.htm
По поводу Dynamic Conditions здесь говорится:
To specify a condition dynamically, use:

SELECT ... WHERE (<itab>) ...

where <itab> is an internal table with line type C and maximum length 72 characters. All of the conditions listed above except for selection tables, can be written into the lines of <itab>...

При этом раздел Checking Subqueries "listed above"...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое WHERE
СообщениеДобавлено: Пн, мар 21 2005, 11:18 
Гость
Sergo написал:
Хочу сделать динамическое Where к примеру такой:

Созданная irwhere:
EXISTS
(
SELECT *
FROM VBAK
WHERE
VBAK~MANDT = '050'
AND VBAK~VBELN = VBAP~VBELN
)
1. А кто, используя'~', VBAP в SELECT будет объявлять?
EXISTS (
SELECT *
FROM VBAK
INNER JOIN VBAP
ON VBAK~VBELN = VBAP~VBELN
WHERE VBAK~MANDT = '050'
)
2. Связав 'VBAK INNER JOIN VBAP', зачем тогда EXISTS :?: Для усечения дублей существует LEFT JOIN или DISTINCT, смотря что нужно получить...
3. Забавно, что используя VBAK~MANDT = '050' компилятор не ругается на отсутствие CLIENT SPECIFIED


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, мар 21 2005, 15:17 
Специалист
Специалист

Зарегистрирован:
Чт, авг 19 2004, 07:31
Сообщения: 234
Откуда: Нижнекамск
Цитата:
1. ...
2. ...
3. ...


:D :D :D
всё это конечно очень интересно, только суть вопроса от этого всё равно не заработает


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 24 2005, 12:18 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
bmonk написал:
Дело в том, что мандант НЕЛЬЗЯ вставлять в селект вообще (система тебя сразу выкинет и скажет об этом).


почему нельзя ?
надо указать client specified ...


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

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


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

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


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

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