AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 16.03.2006, 08:41   #1  
3oppo is offline
3oppo
Участник
3oppo's Avatar
 
222 / 32 (2) +++
Join Date: 30.06.2005
! Подскажите с запросом в Х++
Есть запрос :

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

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

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

Code:
    QueryBuildRange             qr;
    ;
    ...
    
    qr.value(sysQuery::value(nameEmplList));
Old 16.03.2006, 09:21   #3  
George Nordic is offline
George Nordic
Модератор
George Nordic's Avatar
Злыдни
 
4,480 / 1255 (50) ++++++++
Join Date: 17.12.2003
Location: Moscow
Blog Entries: 9
Сделать временную таблицу, заполнить её списком и заджойнить.

С Уважением,
Георгий
Old 16.03.2006, 09:31   #4  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 124 (5) +++++
Join Date: 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)), поскольку во втором случае список значений возьмется в кавычки и будет неправильно интерпретирован.
Old 16.03.2006, 09:35   #5  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 124 (5) +++++
Join Date: 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));
    ...
}
Old 16.03.2006, 09:43   #6  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Join Date: 26.03.2003
Location: Москва
Quote:
Originally Posted by George Nordic
Сделать временную таблицу, заполнить её списком и заджойнить.
С временной таблицей - спорный вариант, с подводными камнями.
Через query - лучше!

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

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

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

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

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

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

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

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Подскажите класс для подсчета сальдо 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 04:34.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.