|
25.09.2013, 16:00 | #1 |
Участник
|
Всегда ли правильно работает 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 |
Участник
|
Вы не путаете _ds.query() и _ds.queryrun().query()?
|
|
|
За это сообщение автора поблагодарили: Aquarius (1). |
25.09.2013, 16:31 | #3 |
Участник
|
Всегда работает верно, dataSourceCount() - возвращает число присоединенных источников данных, и не важно активны они или нет. Перед работой с ds по индексу(если нет уверенности, что их количество статично), всегда выполняйте проверку
X++: if (dataSource(i).enabled())
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: Aquarius (1). |
25.09.2013, 16:36 | #4 |
Участник
|
Извините, я пока не очень хорошо разбираюсь этом функционале.
Поэтому возможно мои вопросы покажутся глупыми. А что правильно использовать? изначально я написала так. ds_Count=inventAdjTransactSelect.queryrun().query().dataSourceCount() обнаружила ,что этот код всегда возращает 4 датасорса. ( при этом в стандартном запросе 2. и иногда еще 2 могут присоединить, затем отсоединить . но все равно возвращается 4 датасорса). затем я попробовала вот так: вот этот код: ds_Count=tmpFormLookUp_ds.query().dataSourceCount(); обнаружила,что здесь всегда возвращаетч 2 датасора, т.е. те которые есть в стандартном запросе.(присоединенные не учитываются). |
|
25.09.2013, 17:11 | #5 |
Участник
|
Используемые вами объекты запросов совершенно разные 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 |
Участник
|
Спасибо,Сергей.
все заработало правильно благодаря этой проверке if (CurrentDS.enabled())... |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Проблема с составлением Query | 10 | |||
как работает QueryRun.reset() ??? | 1 | |||
QueryRun, Query | 3 | |||
Не работает Query | 3 | |||
Как же все-таки организованиы Query и QueryRun? | 4 |
|