![]() |
#1 |
Участник
|
![]()
Есть запрос :
Select payTrans where . . . . . && payTrans.Emplid == nameEmplList дело в том что nameEmplList - это список через запятую ( 123,543,678,812,453 ) причём длинна этого списка не известна. Перебор по списку сотрудников. Вопрос как правильно это сделать в Х++ запросе?! Делать вне запроса не хочется, будет долго. Необходимо реализовать подобие функции Charindex() в SQL. |
|
![]() |
#2 |
NavAx
|
![]()
Скорее это нужно делать через конструктор запросов в x++, а диапазон задать, добавив range по EmplId:
Код: QueryBuildRange qr; ; ... qr.value(sysQuery::value(nameEmplList)); |
|
![]() |
#3 |
Модератор
|
Сделать временную таблицу, заполнить её списком и заджойнить.
С Уважением, Георгий |
|
![]() |
#4 |
Участник
|
Вот более полный вариант примера, приведенного 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)); ... } |
|
![]() |
#5 |
Участник
|
Кстати, если вы формируете список сотрудников (т.е. значение переменной 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)); ... } |
|
![]() |
#6 |
Участник
|
Цитата:
Сообщение от George Nordic
Сделать временную таблицу, заполнить её списком и заджойнить.
Через query - лучше! Хотя в случае query есть ограничение на длину строки, подставляемой в range. Но это можно обойти при помощи нескольких range на одно и то же поле. В этом случае они будут объединяться по ИЛИ. Можно ещё конечно извратиться с макросом для обычного select (см. макрос InventDimJoin). В макрос передается динамически сгенерированное условие where на основе списка значений nameEmplList. Но макросы как-то обычно не рекомендуется использовать. |
|
![]() |
#7 |
Moderator
|
Цитата:
Сообщение от dn
С временной таблицей - спорный вариант, с подводными камнями.
|
|
![]() |
#8 |
Moderator
|
Цитата:
Сообщение от dn
Можно ещё конечно извратиться с макросом для обычного select (см. макрос InventDimJoin). В макрос передается динамически сгенерированное условие where на основе списка значений nameEmplList. Но макросы как-то обычно не рекомендуется использовать.
![]() Проверка на передачу пустого параметра в макрос Ну не передаются в макрос динамически (т.е. программно) сгенерированные вещи! Макросы используются только на этапе компиляции.
__________________
Андрей. |
|
![]() |
#9 |
Участник
|
Цитата:
Сообщение от dn
С временной таблицей - спорный вариант, с подводными камнями.
Через query - лучше! Хотя в случае query есть ограничение на длину строки, подставляемой в range. Но это можно обойти при помощи нескольких range на одно и то же поле. В этом случае они будут объединяться по ИЛИ. |
|
![]() |
#10 |
Moderator
|
Цитата:
Сообщение от dn
Хотя в случае query есть ограничение на длину строки, подставляемой в range.
|
|
![]() |
#11 |
Участник
|
Зависит от размера EDT Range.
|
|
|
За это сообщение автора поблагодарили: Gustav (1). |
![]() |
#12 |
Moderator
|
Цитата:
Сообщение от Hezl
Зависит от размера EDT Range.
![]() P.S. Кстати, влияет ли размер этого EDT Range еще на что-нибудь? Критично ли? Почему по дефолту стоит 250, а не сразу максимально 1000? Последний раз редактировалось Gustav; 16.03.2006 в 11:49. |
|
![]() |
#13 |
Участник
|
Цитата:
Сообщение от Dron AKA andy
Ну не передаются в макрос динамически (т.е. программно) сгенерированные вещи! Макросы используются только на этапе компиляции.
Тогда ещё остается только runbuf ![]() |
|
![]() |
#14 |
Участник
|
Цитата:
Сообщение от Gustav
Например?
join постоянной и временной таблиц утечка RecId производительность ... |
|
![]() |
#15 |
Moderator
|
Цитата:
Сообщение от dn
Подводные камни с временными таблицами не раз обсуждались:
join постоянной и временной таблиц утечка RecId производительность ... |
|
Теги |
query, временная таблица, ax3.0 |
|
![]() |
||||
Тема | Ответов | |||
Подскажите класс для подсчета сальдо | 7 | |||
Подскажите с чего начать | 12 | |||
Проблема с запросом | 7 | |||
Подскажите как реализовать такой запрос в Axapte | 12 | |||
Помогите с запросом.. | 2 |
|