Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Чем заменить УложитьСписокОбъектов ?? или как создать свою временную таблиц (число прочтений - 2674 )
NeoN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Марта 2012
Чем заменить УложитьСписокОбъектов ?? или как создать свою временную таблиц
23. Апреля 2012 :: 14:37
Печать  
Добрый день!
помогите пожалуйста с прямым запросом
Код
Выбрать все
//Ишем по полю ИндексированнойТаблицы Doc1Cid Документы 1с
Процедура НайтиДокументы1с(иТз,ТзРезультат="") Экспорт
	Перем СписИд;
	//перем итз//:ИндексированнаяТаблица
	СписИд=СоздатьОбъект("СписокЗначений");

	Если ТипЗначенияСтр(иТз)="ИндексированнаяТаблица" Тогда
		иТз.ВыбратьСтроки();
		Пока иТз.ПолучитьСтроку() = 1 Цикл
			СписИд.ДобавитьЗначение(иТз.Doc1Cid);
		КонецЦикла;
	Иначе
		СписИд.ДобавитьЗначение(Число(иТз));
	КонецЕсли;

	Запрос=СоздатьОбъект("ODBCRecordset");
	Запрос.УстБД1С();
	Запрос.Отладка(1);

	ТекстЗапроса="
	|Select
	|	iddoc
	|	,$Док.Id
	|From
	|	$Документ.РасходнаяНаклОсн as Док
	|Where
	|	$Док.id in (SELECT Val FROM #ИдДок)
//	|	$Док.id in (105261264)
	|";

	Запрос.УложитьСписокОбъектов(СписИд,"#ИдДок");
	Запрос.ВыполнитьИнструкцию(ТекстЗапроса,ТзРезультат);

КонецПроцедуры
 



ПРи попытке выполнить получаю ощибку Error converting data type varchar to numeric.

наверное по тому, что СписокЗначений содержит не Объекты а Текстовые строки Печаль

чем можно заменить?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Чем заменить УложитьСписокОбъектов ?? или как создать свою временную таблиц
Ответ #1 - 23. Апреля 2012 :: 19:15
Печать  
Так добавляется число
Можно так:

RecordSet.ВыполнитьИнструкцию("if object_id('tempdb..#temp') is not null drop table #temp");
     RecordSet.ВыполнитьИнструкцию("create table #temp (docid int)");

Далее вставляем значения:

RecordSet.ВыполнитьИнструкцию("Insert into #temp values (:НашеЧисло)");

В запросе:

(SELECT docid FROM #temp)
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Чем заменить УложитьСписокОбъектов ?? или как создать свою временную таблиц
Ответ #2 - 24. Апреля 2012 :: 05:00
Печать  
Вадимко писал(а) 23. Апреля 2012 :: 19:15:
Так добавляется число
Можно так:

RecordSet.ВыполнитьИнструкцию("if object_id('tempdb..#temp') is not null drop table #temp");
     RecordSet.ВыполнитьИнструкцию("create table #temp (docid int)");

Далее вставляем значения:

RecordSet.ВыполнитьИнструкцию("Insert into #temp values (:НашеЧисло)");

В запросе:

(SELECT docid FROM #temp)



только лучше пользовать не #temp, а генерить именя временных таблиц через ГУИД.
Ибо иногда требуется и 2, и 3, и много больше фильтров одновременно.

вот, например, кусок из используемого мною класса, генерящего запросы для отчетов:

Код
Выбрать все
ИмяВремТаблицы	= ИмяВременнойТаблицы();

ТекстЗапроса = "
|SELECT '" + РадугаСервис.ЗначениеВСтрокуБД(ЗначениеФильтра) + "' ID Into " + ИмяВремТаблицы + "
|
|While @@RowCount > 0
|INSERT INTO " + ИмяВремТаблицы + "
|SELECT
|	Спр.ID
|FROM
|	$Справочник." + ЗначениеФильтра.Вид() + " Спр (NoLock)
|WHERE
|	ParentID In (SELECT ID FROM " + ИмяВремТаблицы + " (NoLock))
|	And ID Not In (SELECT ID FROM " + ИмяВремТаблицы + " (NoLock))
|
|If (SELECT Count(*) From " + ИмяВремТаблицы + " (NoLock)) > 100
|	Create Clustered Index " + СтрЗаменить(ИмяВремТаблицы, "[#", "[#IX_") + " on " + ИмяВремТаблицы + " (ID)
|";

Если фЗаполняемВремТаблицыОтдельнымЗапросом = 1 Тогда
	ЗапросСКЛ.Выполнить("Set NoCount ON
	|" + ТекстЗапроса);
Иначе
	текст_Префикс = текст_Префикс + ТекстЗапроса;
КонецЕсли;

текст_Постфикс = текст_Постфикс + "
|Drop Table " + ИмяВремТаблицы;
 

  
Наверх
 
IP записан
 
NeoN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 28. Марта 2012
Re: Чем заменить УложитьСписокОбъектов ?? или как создать свою временную таблиц
Ответ #3 - 24. Апреля 2012 :: 06:36
Печать  
to Вадимко Спасибо все получилось!

to Satans Claws
Покажи пожалуйсто содержимое функции ИмяВременнойТаблицы();
как всетаки ето уникальное имя генерится?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Чем заменить УложитьСписокОбъектов ?? или как создать свою временную таблиц
Ответ #4 - 24. Апреля 2012 :: 09:47
Печать  
Код
Выбрать все
Функция GUID() Экспорт
	GUID = СоздатьОбъект("Guid");
	GUID.Новый();

	Возврат GUID.ВСтроку();
КонецФункции	// GUID

Функция ИмяВременнойТаблицы() Экспорт
	Возврат "[#" + GUID() + "]";
КонецФункции 



  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Чем заменить УложитьСписокОбъектов ?? или как создать свою временную таблиц
Ответ #5 - 24. Апреля 2012 :: 12:20
Печать  
Satans Claws писал(а) 24. Апреля 2012 :: 05:00:
только лучше пользовать не #temp, а генерить именя временных таблиц через ГУИД.
Ибо иногда требуется и 2, и 3, и много больше фильтров одновременно.


Я юзаю уже несколько лет заточенную систему из ТиС для множ. фильтров:

Код
Выбрать все
Процедура ПрисвоитьЗначениеУсловиюРС(Номер, СписокЭлементов, Поле, Вид)

	Если	Номер = 1 Тогда
	 	глУсловие1 = СписокЭлементов;
	 	Поле	 = глУсловие1;
	 	RecordSet.УложитьСписокОбъектов(глУсловие1, "#глУсловие1", Вид);
 



Ну и т.п.
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Чем заменить УложитьСписокОбъектов ?? или как создать свою временную таблиц
Ответ #6 - 28. Апреля 2012 :: 06:53
Печать  
Вадимко писал(а) 24. Апреля 2012 :: 12:20:
Я юзаю уже несколько лет заточенную систему из ТиС для множ. фильтров:


У меня система взаимодействующих классов (управление отчетом, настройки, постороение запроса по настройкам, вывод с итогами по группировкам).
Так что мне было проще написать пару своих функций, про которые я гарантированно понимаю, как они работают и которые, при необходимости, я могу изменить.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать