|
05.06.2008, 10:24 | #1 |
Участник
|
Не удаляется Range
Добрый день!
У нас стоит Axapta версии 3.0 SP5. Пытаюсь в существующем запросе через объект query удалить Range по полю таблицы методом ClearRange и выставить Range со значением на это же поле снова. Пользовалась поиском по форуму, ничего подобного не нашла. Использовала уже, наверно, все способы использования Range, которые рекомендуются на форуме. На данный момент код выглядит так: X++: queryRun = new QueryRun(_query); // _query передается в метод с клиента на сервер while (MapVTI.more()) { AccountVT = MapVTI.key(); qbds = queryRun.query().dataSourceTable(tablenum(VendTrans)); // запрос возвращается верный qbr = queryRun.query().dataSourceTable(tablenum(VendTrans)).findRange(fieldnum(VendTrans,AccountNum)); // qbr ничего не возвращает (Value равно пустому месту, а не фильтру), хотя ранее фильтр был наложен qbds.clearRange(fieldnum(VendTrans,AccountNum)); qbr = qbds.addRange(fieldnum(VendTrans,AccountNum)); qbr.value(AccountVT); } |
|
05.06.2008, 10:29 | #2 |
Участник
|
Цитата:
Не мучайтесь, а пользуйтесь стандартным SysQuery::findOrCreateRange(...) |
|
05.06.2008, 10:44 | #3 |
Участник
|
Я правильно понимаю, что qbr в данном случае:
qbr = SysQuery::findOrCreateRange(queryRun.query().dataSourceTable(tablenum(VendTrans)),fieldnum(VendTrans,AccountNum)); должно вернуть значение AccountNum=Значение1, если оно до этого было наложено? Возвращаемых значений у меня почему то нет. |
|
05.06.2008, 10:52 | #4 |
Участник
|
Цитата:
Сообщение от Elenka
Я правильно понимаю, что qbr в данном случае:
qbr = SysQuery::findOrCreateRange(queryRun.query().dataSourceTable(tablenum(VendTrans)),fieldnum(VendTrans,AccountNum)); должно вернуть значение AccountNum=Значение1, если оно до этого было наложено? Возвращаемых значений у меня почему то нет. далее вы должны установить значение в этот range X++: qbr = SysQuery::findOrCreateRange(queryRun.query().dataSourceTable(tablenum(VendTrans)),fieldnum(VendTrans,AccountNum)); qbr.Value(SysQuery::value("Значение1")) ; |
|
05.06.2008, 11:07 | #5 |
Участник
|
Все верно, данная функция возвравращает ссылку на ранее созданый range, но в Value пусто, хотя там должно быть accountNum=Значение1, поскольку первоначально фильтр по этому полю был наложен. Далее как Вы и говорите пишу qbr.Value(SysQuery::value("Значение1")) либо просто qbr.Value("Значение1"). В результате получаю в where запроса (accountNum = значение1 Or accountNum= значение1), поскольку изначально по неизвестной причине значение фильтра по этому полю система не увидела, и метод ClearRange не отработал. В результате имею запрос с избыточным фильтром, который мне сосвершенно не нужен.
|
|
05.06.2008, 11:11 | #6 |
Участник
|
Поробуйте запрос посмотреть
info(query.dataSourceNo(1).toString()); Мож интересующее вас значение присваивается дальше(в другом классе или методе). |
|
05.06.2008, 18:18 | #7 |
Участник
|
Цитата:
Сообщение от Elenka
данная функция возвравращает ссылку на ранее созданый range, но в Value пусто, хотя там должно быть accountNum=Значение1, поскольку первоначально фильтр по этому полю был наложен. Далее как Вы и говорите пишу qbr.Value(SysQuery::value("Значение1")) либо просто qbr.Value("Значение1"). В результате получаю в where запроса (accountNum = значение1 Or accountNum= значение1)
Следующий код это иллюстрирует: X++: static void JobTest(Args _args) { Query q = new Query(); QueryBuildDataSource qbds = q.addDataSource(tablenum(VendTrans)); ; qbds.addRange(fieldNum(VendTrans,AccountNum)); qbds.addRange(fieldNum(VendTrans,AccountNum)).value('Test1'); info(q.xml()); qbds.clearRange(fieldnum(VendTrans,AccountNum)); qbds.addRange(fieldNum(VendTrans,AccountNum)).value('Test2'); info(qbds.toString()); } "SELECT * FROM VendTrans WHERE ((AccountNum = N'Test1') OR (AccountNum = N'Test2'))" Последний раз редактировалось Hyper; 05.06.2008 в 18:21. |
|
05.06.2008, 11:17 | #8 |
Участник
|
Нет. Думаю, что это всё таки какой то глюк, связанный с тем, что исходный Query передается с клиента на сервер и что теряется.
|
|
05.06.2008, 12:50 | #9 |
Участник
|
Возможно, в Query изначально 2 или более фильтров по полю AccountNum. попробуйте след. образом:
X++: qbds = queryRun.query().dataSourceTable(tablenum(VendTrans)); while (qbds.findRange(fieldnum(VendTrans,AccountNum))) { qbds.clearRange(fieldnum(VendTrans,AccountNum)); } //тут наложить новый фильтр |
|
05.06.2008, 15:33 | #10 |
Участник
|
Как выглядит инициализация переменной _query? Учитывается ли QueryRun?
Что выдает _query.xml()? Последний раз редактировалось Hyper; 05.06.2008 в 15:36. |
|
05.06.2008, 17:26 | #11 |
Участник
|
Нет, не учитывается. Изначально создается Query, в источник которого просто входит таблица VendTrans, потом этот Query передается в метод, где на него накладываются фильтры пользователя, потом результирующий Query передается на AOS, где я пыталась фильтр на одно из полей таблицы отключить и наложить другой (запускать не по всем поставщикам запрос, а по каждому в отдельности). В результате решила вопрос по другому. Изначально создаю 2 запроса, один с фильтром и группировкой по поставщикам, второй без фильтра. Далее в обработке, просто создаю каждый раз новый query, на основе первоначального без фильтра по поставщикам:
Query = new Query(_query); Qbds = Query.dataSourceTable(tablenum(VendTrans)); qbr = Qbds.addRange(fieldNum(VendTrans,AccountNum)); qbr.value(AccountVT); |
|
05.06.2008, 18:44 | #12 |
MCTS
|
Elenka
пропустите ваш запрос через X++: new DEV_QueryBrowser().run( query );
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
05.06.2008, 23:43 | #13 |
Участник
|
Цитата:
А DEV_QueryBrowser() - это где? |
|
05.06.2008, 23:50 | #14 |
Axapta
|
|
|
|
За это сообщение автора поблагодарили: mazzy (2). |