AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.03.2006, 08:41   #1  
3oppo is offline
3oppo
Участник
Аватар для 3oppo
 
222 / 32 (2) +++
Регистрация: 30.06.2005
! Подскажите с запросом в Х++
Есть запрос :

Select payTrans where
. . . . .
&& payTrans.Emplid == nameEmplList

дело в том что
nameEmplList - это список через запятую ( 123,543,678,812,453 ) причём длинна этого списка не известна. Перебор по списку сотрудников. Вопрос как правильно это сделать в Х++ запросе?!

Делать вне запроса не хочется, будет долго.
Необходимо реализовать подобие функции Charindex() в SQL.
Старый 16.03.2006, 09:02   #2  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Lightbulb
Скорее это нужно делать через конструктор запросов в x++, а диапазон задать, добавив range по EmplId:

Код:
    QueryBuildRange             qr;
    ;
    ...
    
    qr.value(sysQuery::value(nameEmplList));
Старый 16.03.2006, 09:21   #3  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Сделать временную таблицу, заполнить её списком и заджойнить.

С Уважением,
Георгий
Старый 16.03.2006, 09:31   #4  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Вот более полный вариант примера, приведенного Roman777
X++:
Query q;
QueryBuildDataSource qbds;
QueryBuildRange qbr;
QueryRun qr;
RPayTrans payTrans;

q = new Query();
qbds = q.addDataSource(tablenum(RPayTrans));
qbr = qbds.addRange(fieldnum(RPayTrans, EmplId));
qbr.value(nameEmplList);

qr = new QueryRun(q);
while (qr.next())
{
    payTrans = qr.get(tablenum(RPayTrans));
    ...
}
Обратите внимание, что в вашем случае надо использовать именно qbr.value(nameEmplList), а не qbr.value(SysQuery::value(nameEmplList)), поскольку во втором случае список значений возьмется в кавычки и будет неправильно интерпретирован.
Старый 16.03.2006, 09:35   #5  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Кстати, если вы формируете список сотрудников (т.е. значение переменной nameEmplList) в цикле, то предыдущий пример можно сделать несколько иначе:

X++:
Query q;
QueryBuildDataSource qbds;
QueryBuildRange qbr;
QueryRun qr;
RPayTrans payTrans;
EmplTable emplTable;

q = new Query();
qbds = q.addDataSource(tablenum(RPayTrans));

while select emplTable
    where ...
{
    qbr = qbds.addRange(fieldnum(RPayTrans, EmplId));
    qbr.value(SysQuery::value(emplTable.EmplId));
}

qr = new QueryRun(q);
while (qr.next())
{
    payTrans = qr.get(tablenum(RPayTrans));
    ...
}
Старый 16.03.2006, 09:43   #6  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Цитата:
Сообщение от George Nordic
Сделать временную таблицу, заполнить её списком и заджойнить.
С временной таблицей - спорный вариант, с подводными камнями.
Через query - лучше!

Хотя в случае query есть ограничение на длину строки, подставляемой в range.
Но это можно обойти при помощи нескольких range на одно и то же поле. В этом случае они будут объединяться по ИЛИ.

Можно ещё конечно извратиться с макросом для обычного select (см. макрос InventDimJoin). В макрос передается динамически сгенерированное условие where на основе списка значений nameEmplList. Но макросы как-то обычно не рекомендуется использовать.
Старый 16.03.2006, 10:17   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от dn
С временной таблицей - спорный вариант, с подводными камнями.
Например?
Старый 16.03.2006, 10:26   #8  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
Сообщение от dn
Можно ещё конечно извратиться с макросом для обычного select (см. макрос InventDimJoin). В макрос передается динамически сгенерированное условие where на основе списка значений nameEmplList. Но макросы как-то обычно не рекомендуется использовать.
Ну вот, опять!
Проверка на передачу пустого параметра в макрос

Ну не передаются в макрос динамически (т.е. программно) сгенерированные вещи! Макросы используются только на этапе компиляции.
__________________
Андрей.
Старый 16.03.2006, 11:20   #9  
Hezl is offline
Hezl
Участник
Аватар для Hezl
 
138 / 16 (1) ++
Регистрация: 21.04.2004
Адрес: Moscow, Russia
Цитата:
Сообщение от dn
С временной таблицей - спорный вариант, с подводными камнями.
Через query - лучше!

Хотя в случае query есть ограничение на длину строки, подставляемой в range.
Но это можно обойти при помощи нескольких range на одно и то же поле. В этом случае они будут объединяться по ИЛИ.
Через query лучше, если условий немного. А если будет порядка 2000 ограничений, то queryRun.next() будет падать, причем громко. Так что решение от задачи зависит.
Старый 16.03.2006, 11:22   #10  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от dn
Хотя в случае query есть ограничение на длину строки, подставляемой в range.
Коллеги, а, кстати, какое? 250 символов? (255?) Или по каким-то другим параметрам ограничено, например, количеством... "элементов" (условий) в этой строке? Что-то нигде в явном виде не нашёл такой цифры, хотя действительно строка далеко не безгранична и крутится вокруг 250...
Старый 16.03.2006, 11:23   #11  
Hezl is offline
Hezl
Участник
Аватар для Hezl
 
138 / 16 (1) ++
Регистрация: 21.04.2004
Адрес: Moscow, Russia
Зависит от размера EDT Range.
За это сообщение автора поблагодарили: Gustav (1).
Старый 16.03.2006, 11:39   #12  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Hezl
Зависит от размера EDT Range.
Ух ты, здорово! Спасибо! Действительно стоит StringSize = 250. Попробовал ввести размер StringSize = 10 000 - AOT ругнулся сообщением "Значение вне диапазона. Приемлемые значения в диапазоне 1 & 1000"... Может быть, где-то можно и верхнюю границу диапазона подкрутить?

P.S. Кстати, влияет ли размер этого EDT Range еще на что-нибудь? Критично ли? Почему по дефолту стоит 250, а не сразу максимально 1000?

Последний раз редактировалось Gustav; 16.03.2006 в 11:49.
Старый 16.03.2006, 13:54   #13  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Цитата:
Сообщение от Dron AKA andy
Ну не передаются в макрос динамически (т.е. программно) сгенерированные вещи! Макросы используются только на этапе компиляции.
Действительно погорячился, давно уже макросами не баловался :-)

Тогда ещё остается только runbuf
Старый 16.03.2006, 13:56   #14  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Цитата:
Сообщение от Gustav
Например?
Подводные камни с временными таблицами не раз обсуждались:
join постоянной и временной таблиц
утечка RecId
производительность ...
Старый 16.03.2006, 14:10   #15  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от dn
Подводные камни с временными таблицами не раз обсуждались:
join постоянной и временной таблиц
утечка RecId
производительность ...
Спасибо.
Теги
query, временная таблица, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Подскажите класс для подсчета сальдо Just_smile DAX: Программирование 7 01.04.2009 10:20
Подскажите с чего начать moid DAX: Программирование 12 09.02.2007 10:20
Проблема с запросом Protey DAX: Программирование 7 10.07.2006 09:32
Подскажите как реализовать такой запрос в Axapte velk DAX: Программирование 12 04.04.2006 21:55
Помогите с запросом.. DarkBear DAX: Программирование 2 15.08.2005 13:38

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:11.