AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 16.03.2006, 08:41   #1  
3oppo ist offline
3oppo
Участник
Benutzerbild von 3oppo
 
222 / 32 (2) +++
Registriert seit: 30.06.2005
! Подскажите с запросом в Х++
Есть запрос :

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

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

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

Code:
    QueryBuildRange             qr;
    ;
    ...
    
    qr.value(sysQuery::value(nameEmplList));
Alt 16.03.2006, 09:21   #3  
George Nordic ist offline
George Nordic
Модератор
Benutzerbild von George Nordic
Злыдни
 
4.480 / 1255 (50) ++++++++
Registriert seit: 17.12.2003
Ort: Moscow
Blog-Einträge: 9
Сделать временную таблицу, заполнить её списком и заджойнить.

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

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

Можно ещё конечно извратиться с макросом для обычного select (см. макрос InventDimJoin). В макрос передается динамически сгенерированное условие where на основе списка значений nameEmplList. Но макросы как-то обычно не рекомендуется использовать.
Alt 16.03.2006, 10:17   #7  
Gustav ist offline
Gustav
Moderator
Benutzerbild von Gustav
SAP
Лучший по профессии 2009
 
1.858 / 1152 (42) ++++++++
Registriert seit: 24.01.2006
Ort: Санкт-Петербург
Blog-Einträge: 19
Zitat:
Zitat von dn
С временной таблицей - спорный вариант, с подводными камнями.
Например?
Alt 16.03.2006, 10:26   #8  
Dron AKA andy ist offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Registriert seit: 27.03.2002
Ort: Москва
Zitat:
Zitat von dn
Можно ещё конечно извратиться с макросом для обычного select (см. макрос InventDimJoin). В макрос передается динамически сгенерированное условие where на основе списка значений nameEmplList. Но макросы как-то обычно не рекомендуется использовать.
Ну вот, опять!
Проверка на передачу пустого параметра в макрос

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

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

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

Geändert von Gustav (16.03.2006 um 11:49 Uhr)
Alt 16.03.2006, 13:54   #13  
dn ist offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Registriert seit: 26.03.2003
Ort: Москва
Zitat:
Zitat von Dron AKA andy
Ну не передаются в макрос динамически (т.е. программно) сгенерированные вещи! Макросы используются только на этапе компиляции.
Действительно погорячился, давно уже макросами не баловался :-)

Тогда ещё остается только runbuf
Alt 16.03.2006, 13:56   #14  
dn ist offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Registriert seit: 26.03.2003
Ort: Москва
Zitat:
Zitat von Gustav
Например?
Подводные камни с временными таблицами не раз обсуждались:
join постоянной и временной таблиц
утечка RecId
производительность ...
Alt 16.03.2006, 14:10   #15  
Gustav ist offline
Gustav
Moderator
Benutzerbild von Gustav
SAP
Лучший по профессии 2009
 
1.858 / 1152 (42) ++++++++
Registriert seit: 24.01.2006
Ort: Санкт-Петербург
Blog-Einträge: 19
Zitat:
Zitat von dn
Подводные камни с временными таблицами не раз обсуждались:
join постоянной и временной таблиц
утечка RecId
производительность ...
Спасибо.
Stichworte
query, временная таблица, ax3.0

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Подскажите класс для подсчета сальдо 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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 18:53 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.