AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.06.2008, 10:24   #1  
Elenka is offline
Elenka
Участник
Ex AND Project
 
16 / 11 (1) +
Регистрация: 19.03.2004
Адрес: Saint-Petersburg
Не удаляется 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);
    }
В результате вижу в запросе фильтр where (Поле1 = значение1 Or Поле1 = значение1), в том числе и в коде запроса, который был передан на испольнение в БД. Не могу понять, в чем может быть проблема.
Старый 05.06.2008, 10:29   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Elenka Посмотреть сообщение
Пытаюсь в существующем запросе через объект query удалить Range по полю таблицы методом ClearRange и выставить Range со значением на это же поле снова.
ClearRange не удаляет, а всего лишь очищает значение.

Не мучайтесь, а пользуйтесь стандартным SysQuery::findOrCreateRange(...)
__________________
полезное на axForum, github, vk, coub.
Старый 05.06.2008, 10:44   #3  
Elenka is offline
Elenka
Участник
Ex AND Project
 
16 / 11 (1) +
Регистрация: 19.03.2004
Адрес: Saint-Petersburg
Я правильно понимаю, что qbr в данном случае:
qbr = SysQuery::findOrCreateRange(queryRun.query().dataSourceTable(tablenum(VendTrans)),fieldnum(VendTrans,AccountNum));
должно вернуть значение AccountNum=Значение1, если оно до этого было наложено?
Возвращаемых значений у меня почему то нет.
Старый 05.06.2008, 10:52   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Elenka Посмотреть сообщение
Я правильно понимаю, что qbr в данном случае:
qbr = SysQuery::findOrCreateRange(queryRun.query().dataSourceTable(tablenum(VendTrans)),fieldnum(VendTrans,AccountNum));
должно вернуть значение AccountNum=Значение1, если оно до этого было наложено?
Возвращаемых значений у меня почему то нет.
qbr имеет тип QueryBuildRange и содержит ссылку на найденный или только что созданный range.
далее вы должны установить значение в этот range

X++:
qbr = SysQuery::findOrCreateRange(queryRun.query().dataSourceTable(tablenum(VendTrans)),fieldnum(VendTrans,AccountNum));
qbr.Value(SysQuery::value("Значение1"))
;
__________________
полезное на axForum, github, vk, coub.
Старый 05.06.2008, 11:07   #5  
Elenka is offline
Elenka
Участник
Ex AND Project
 
16 / 11 (1) +
Регистрация: 19.03.2004
Адрес: Saint-Petersburg
Все верно, данная функция возвравращает ссылку на ранее созданый 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  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Поробуйте запрос посмотреть
info(query.dataSourceNo(1).toString());
Мож интересующее вас значение присваивается дальше(в другом классе или методе).
Старый 05.06.2008, 11:17   #7  
Elenka is offline
Elenka
Участник
Ex AND Project
 
16 / 11 (1) +
Регистрация: 19.03.2004
Адрес: Saint-Petersburg
Нет. Думаю, что это всё таки какой то глюк, связанный с тем, что исходный Query передается с клиента на сервер и что теряется.
Старый 05.06.2008, 12:50   #8  
NeveB is offline
NeveB
Участник
 
60 / 16 (1) ++
Регистрация: 14.11.2003
Адрес: Mosсow
Возможно, в Query изначально 2 или более фильтров по полю AccountNum. попробуйте след. образом:
X++:
qbds = queryRun.query().dataSourceTable(tablenum(VendTrans)); 
while (qbds.findRange(fieldnum(VendTrans,AccountNum)))
{
   qbds.clearRange(fieldnum(VendTrans,AccountNum));
}
//тут наложить новый фильтр
П.С. clearRange именно удаляет фильтр, а не очищает имеющийся
Старый 05.06.2008, 15:33   #9  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Как выглядит инициализация переменной _query? Учитывается ли QueryRun?
Что выдает _query.xml()?

Последний раз редактировалось Hyper; 05.06.2008 в 15:36.
Старый 05.06.2008, 17:26   #10  
Elenka is offline
Elenka
Участник
Ex AND Project
 
16 / 11 (1) +
Регистрация: 19.03.2004
Адрес: Saint-Petersburg
Нет, не учитывается. Изначально создается 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:18   #11  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от Elenka Посмотреть сообщение
данная функция возвравращает ссылку на ранее созданый range, но в Value пусто, хотя там должно быть accountNum=Значение1, поскольку первоначально фильтр по этому полю был наложен. Далее как Вы и говорите пишу qbr.Value(SysQuery::value("Значение1")) либо просто qbr.Value("Значение1"). В результате получаю в where запроса (accountNum = значение1 Or accountNum= значение1)
Проблема в том, что первоначально у вас было два ranges: один пустой, а второй - "Значение1" (вы проверяли _query.xml()?). Когда вы делали clearRange, удалялся пустой range, а "Значение1" оставалось. После этого вы добавляли еще один range "Значение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, 18:44   #12  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Elenka
пропустите ваш запрос через
X++:
new DEV_QueryBrowser().run( query );
вы сможете увидеть и xml и sql выражения запроса
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
За это сообщение автора поблагодарили: mazzy (2).
Старый 05.06.2008, 23:43   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Russland Посмотреть сообщение
Elenka
пропустите ваш запрос через
X++:
new DEV_QueryBrowser().run( query );
вы сможете увидеть и xml и sql выражения запроса
Э-э-э... А можно задать вопрос в целях повышения самообразованности?
А DEV_QueryBrowser() - это где?
__________________
полезное на axForum, github, vk, coub.
Старый 05.06.2008, 23:50   #14  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Тут.
За это сообщение автора поблагодарили: mazzy (2).
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: Packing date range values in queries Blog bot DAX Blogs 1 09.11.2007 13:10
axaptafreak: Label for Query Range cannot be modified (still) Blog bot DAX Blogs 2 25.07.2007 10:09
Работа с Excel через COM и ошибка 0x800A03EC (Range.AutoFilter) gl00mie DAX: Программирование 15 30.03.2007 18:37
Два Dstasource с Range в init() PMS DAX: Программирование 7 28.10.2005 09:54

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:05.