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