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