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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.09.2013, 16:00   #1  
Aquarius is offline
Aquarius
Участник
 
139 / 29 (1) +++
Регистрация: 08.02.2007
Адрес: Одесса
Всегда ли правильно работает queryrun().query().dataSourceCount() при присоединении пользователем таблиц в настройках стандартного запроса?
Добрый день, Уважаемые господа,

Подскажите, пожалуйста,

Акс 2009. Sp 5.

Я обнаружила ,что в некоторых случаях у меня в коде неправильно работает queryrun().query().dataSourceCount() , а именно при присоединении пользователем таблиц в стандартный запрос,- возвращает правильное количество датосорсов- учитывает присоединенные,
но затем при последующем отсоединении этих таблиц, создается впечатление, что Аксапта не учитывает то что таблицы были отсоединены, и возвращает все тоже самое количество датосорсов в queryrun().query().dataSourceCount() как и в первом случае.
При этом, если в дебагере посмотреть содержимое запроса , то в запросе нет этих отсоединенных таблиц. Т.е. запрос правильный.
Искала на форуме ответ на свой вопрос, но не нашла.

Подскажите пожалуйста, что я сделала неправильно?
Метод Choose::Clicked формы формы InventAdjTransaction
.............................................

QueryBuildDatasource CurrentDS;
QueryBuildRange rangeCurrencyCode;
integer ds_Count,i;
tableid tableid;
…………………………………
if (inventAdjTransactSelect.prompt())
{
inventAdjTransactSelect.run();
tmpformlookup_ds.executeQuery();
//XXXXXXXXXXXXXXXXXXX 17.09.2013 - >
ds_Count=inventAdjTransactSelect.queryrun().query().dataSourceCount();
//ds_Count=tmpFormLookUp_q.dataSourceCount();
//ds_Count=tmpFormLookUp_ds.query().dataSourceCount();
for (i=1; i<= ds_Count ; i++)
{
CurrentDS=inventAdjTransactSelect.queryrun().query().dataSourceNo(i);
// CurrentDS=tmpFormLookUp_ds.query().dataSourceNo(i);
tableId= CurrentDS.table();
switch (tableid)
{
case tablenum(PurchTable):
{
rangeCurrencyCode = CurrentDS.findRange(fieldNum(PurchTable, currencyCode));
if (rangeCurrencyCode)
if (rangeCurrencyCode.value()!="")
purchcurrency=rangeCurrencyCode.value();
// значение из переменной purchcurrency будет записано в примечание при разноске
break;
}
case tablenum(InventTable):
{
rangeCurrencyCode = CurrentDS.findRange(fieldNum(InventTable,ContractCurrency_LPP));
if (rangeCurrencyCode)
if (rangeCurrencyCode.value()!="")
inventtablecurrency=rangeCurrencyCode.value();
// значение из переменной inventtablecurrency будет записано в примечание при разноске

break;
}
}
//<-XXXXXXXXXXXXXXXXXXX 17.09.2013
}
…………………………………………………………….

Исходно стояла следующая задача:
В форме корректировать проводок (вызваемой из формы закрытие и коррекция ) пользователь выбирает проводки через запрос, вызываемый кнопкой выбрать.
В запросе пользователь может присоединить к таблице складские проводки таблицу справочник номенклатуры и таблицу заголовки закупки, и в настройках запроса указать дополнительно в условиях отбора значения полей этих таблиц (валюта закупки, валюта номенклатуры ) .
Необходимо при разноске корректировки проводок ( кнопка разноска в форме корректировать проводки) в примечании к операции записывать автоматически значения полей присоединенных таблиц, указанных пользователем в фильтре. Т.е. в примечании будет выводится сообщение типа: « у скорректированных проводок валюта прихода «евро», валюта справочника «евро, длр» . Если пользователь не присоединял таблицы, или присоединил , но не указал значения условий по ним, то выводить сообщение: у скорректированных проводок валюта прихода «все», валюта справочника «все».
Для реализации этой задачи в методе Choose::Clicked кнопки Choose формы InventAdjTransaction я пыталась получить значение условия range для присоединенных пользователем таблиц. Я получала количество источников данных - inventAdjTransactSelect.queryrun().query().dataSourceCount().Затем просматривала какие таблицы связаны с данным источником, получала и range, и range.value
Сначала показалось, что все работает.
Случай 1. Запустив форму Корректировать проводки, я нажала кнопку выбор в появившемся запросе, присоединила таблицы InventTable , PurchTable, задала условия отбора по полям этих таблиц. Выбранные проводки скорректировала и разнесла. Все отработало корректно. В переменные purchcurrency, inventtablecurrency в методе Choose записались верные значения.
Случай 2. Но затем я повторила тестирование- в появившемся запросе удалила ранее присоединенные таблицы InventTable , PurchTable, но функционал отработал некорректно, он как будто бы не увидел новых настроек. Результат отработки был точно такой же как и при настройках запроса в случае 1.
Я проверила, что inventAdjTransactSelect.queryrun().query().dataSourceCount() вернул 4 (как и в случае 1.). И были найдены таблицы InventTable , PurchTable, и range, и range.value были такие же, как в случае 1. Т.е. новые настройки запроса не вступили в силу. И сколько бы раз я не запускала тест описанный в случае 2, он всегда отрабатывал неправильно, выдавал данные как в случае 1 .
Если в дебагере посмотреть cодержимое запрос для случая 2, то в запросе нет ограничений по InventTable , PurchTable

Последний раз редактировалось Aquarius; 25.09.2013 в 16:04.
Старый 25.09.2013, 16:14   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,436 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Вы не путаете _ds.query() и _ds.queryrun().query()?
За это сообщение автора поблагодарили: Aquarius (1).
Старый 25.09.2013, 16:31   #3  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
372 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Всегда работает верно, dataSourceCount() - возвращает число присоединенных источников данных, и не важно активны они или нет. Перед работой с ds по индексу(если нет уверенности, что их количество статично), всегда выполняйте проверку
X++:
if (dataSource(i).enabled())
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: Aquarius (1).
Старый 25.09.2013, 16:36   #4  
Aquarius is offline
Aquarius
Участник
 
139 / 29 (1) +++
Регистрация: 08.02.2007
Адрес: Одесса
Извините, я пока не очень хорошо разбираюсь этом функционале.
Поэтому возможно мои вопросы покажутся глупыми.
А что правильно использовать?
изначально я написала так.

ds_Count=inventAdjTransactSelect.queryrun().query().dataSourceCount()
обнаружила ,что этот код всегда возращает 4 датасорса.
( при этом в стандартном запросе 2. и иногда еще 2 могут присоединить, затем отсоединить . но все равно возвращается 4 датасорса).

затем я попробовала вот так:
вот этот код:
ds_Count=tmpFormLookUp_ds.query().dataSourceCount();
обнаружила,что здесь всегда возвращаетч 2 датасора, т.е. те которые есть в стандартном запросе.(присоединенные не учитываются).
Старый 25.09.2013, 17:11   #5  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
372 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Используемые вами объекты запросов совершенно разные tmpFormLookUp_ds.query() - это запрос данных из формы коррекции проводок и в ней 2 таблицы - временная + inventDim.

Объект запроса открывающийся по кнопке выбрать содержит первоначально тоже 2 таблицы, но там таблицы другие - InventTrans и InventDim.

Судя по той реализации, которую вы делаете, вам необходимо работать с запросом по кнопке выбрать, т.е. с объектом inventAdjTransactSelect.queryrun().query().

Так вот как я уже писал выше, нужно проверять активен ds или нет.

В вашем случае должно быть примерно так
X++:
CurrentDS=inventAdjTransactSelect.queryrun().query().dataSourceNo(i);
if (CurrentDS.enabled())
{
      .
}
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: Logger (2), Aquarius (1).
Старый 26.09.2013, 09:52   #6  
Aquarius is offline
Aquarius
Участник
 
139 / 29 (1) +++
Регистрация: 08.02.2007
Адрес: Одесса
Спасибо,Сергей.
все заработало правильно благодаря этой проверке
if (CurrentDS.enabled())...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблема с составлением Query axaLearner DAX: Программирование 10 01.12.2005 15:00
как работает QueryRun.reset() ??? 6apcyk DAX: Программирование 1 08.10.2005 22:10
QueryRun, Query ald DAX: Программирование 3 10.02.2004 21:59
Не работает Query Dimitry DAX: Программирование 3 17.07.2003 16:36
Как же все-таки организованиы Query и QueryRun? VIS DAX: Программирование 4 03.07.2003 15:22

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

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

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