Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Не работает метод "УложитьСписокОбъектов13()" (число прочтений - 5798 )
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Не работает метод "УложитьСписокОбъектов13()"
07. Мая 2007 :: 01:08
Печать  
ТекстЗапроса = "
           |SELECT
           |      Спр.ID as [ТМЦ $Справочник.Номенклатура],
           |      Спр.Code as Код
           |FROM
           |      $Справочник.Номенклатура as Спр
           |WHERE
           |      Спр.Code IN (SELECT Val FROM #Группа)
           |";
           ЗапросSQL.УложитьСписокОбъектов13(СписокКодовТМЦ, "#Группа");
           тзРезультатЗапросаSQL=ЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

Идея такова: отобрать из справочника номенклатура нужные элементы по их кодам для последующих действий. Просто "НайтиПоКоду()" работает долго, т.к. в справочнике больше 500000 элементов.
СписокКодовТМЦ - список значений с кодами ТМЦ.
Также пробовал вариант с методом
ЗапросSQL.УложитьСписокОбъектов(СписокКодовТМЦ, "#Группа","Номенклатура");

В результате запроса получаем 0 записей. Почему?
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #1 - 07. Мая 2007 :: 03:39
Печать  
метод укладывает агрегатные объекты: справочники, документы и пр.
  
Наверх
ICQ  
IP записан
 
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #2 - 07. Мая 2007 :: 07:14
Печать  
А как же мне в таком случае решить мою задачку?
  
Наверх
 
IP записан
 
desty
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Апреля 2007
Пол: Мужской
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #3 - 07. Мая 2007 :: 07:20
Печать  
alex_gol писал(а) 07. Мая 2007 :: 07:14:
А как же мне в таком случае решить мою задачку?


Условие = "WHERE ";
Для счСписка = 1 по СписокКодовТМЦ.РазмерСписка() Цикл
     Условие = Условие + " (<что-то>.code = "+СписоКодовТМЦ.ПолучитьЗначение(счСписка)+") or ";
.....

Если конечно кодов мало...

Или все -таки пытаться создать временную таблицу.... где то тут недавно
http://www.1cpp.ru/forum/YaBB.pl?num=1170322440/7#7

Кстати а как у тебя заполняется СписокКодовТЦ ?
  
Наверх
 
IP записан
 
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #4 - 07. Мая 2007 :: 08:18
Печать  
Список кодов заполняется из внешнего файла. Идет процедура загрузки, где мне надо найти элемент по коду и, если не найден, то создать новый. При замере производительности 45% времени уходит на выполнение метода "НайтиПоКоду()". А кодов много - до 10000 доходит.
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #5 - 07. Мая 2007 :: 08:27
Печать  
Думаю надо использовать параметризованный запрос.
  
Наверх
IP записан
 
desty
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Апреля 2007
Пол: Мужской
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #6 - 07. Мая 2007 :: 08:36
Печать  
могу предложить в качестве идеи следующее...

1. для DBF базы я сразу формировал файл кодов уже в формате dbf, чтобы можно было обратиться к файлу через in (SELECT from <МойФайлКодов>.dbf). Работает вроде быстрее чем НайтиПоКоду().

2. Для SQL, вариант создания ВременнойТаблицы как писал trdm (ссылка выше) возможно поможет.
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #7 - 07. Мая 2007 :: 08:50
Печать  
Попробуй:

Код
Выбрать все
Перем гЗапрос1П;

// ПодготовитьЗапросы()
Процедура ПодготовитьЗапросы()
	гЗапрос1П = СоздатьОбъект("ODBCRecordset");
	гЗапрос1П.УстБД1С();
	вТекстЗапроса = "
	|--- Поиск номенклатуры по коду
	|SELECT
	|	Спр.ID as [ТМЦ $Справочник.Номенклатура]
	|	, Спр.Code as Код
	|FROM
	|	$Справочник.Номенклатура as Спр(NOLOCK)
	|WHERE
	|	Спр.Code = ?
	|";
	Попытка
		гЗапрос1П.ДобПараметр(1,14, Метаданные.Справочник("Номенклатура").ДлинаКода ,0);
		гЗапрос1П.Подготовить(вТекстЗапроса);
	Исключение
		Сообщить(гЗапрос1П.ПолучитьОписаниеОшибки());
	КонецПопытки;

КонецПроцедуры // ПодготовитьЗапросы()
//*******************************************
Процедура Сформировать()
	вЗапрос = СоздатьОбъект("Запрос");
	вТекстЗапроса = "
	|ТекЭлем = Справочник.Номенклатура.ТекущийЭлемент;
	|Код = Справочник.Номенклатура.Код;
	|Группировка ТекЭлем Без Групп Без Упорядочивания;
	|";
	Если вЗапрос.Выполнить(вТекстЗапроса ) = 0 Тогда
		Возврат;
	КонецЕсли;
	вВсегоЭлем = 0;
	вВсегоЭлемОК = 0;
	ПодготовитьЗапросы();
	Пока вЗапрос.Группировка(1) = 1 Цикл
		вВсегоЭлем = вВсегоЭлем + 1;
	    вКод = вЗапрос.Код;
		гЗапрос1П.УстПараметр(1,вКод);
		вТЗ = гЗапрос1П.ВыполнитьИнструкцию();
		Если вТЗ.КоличествоСтрок()>0 Тогда
		    вТЗ.ПолучитьСтрокуПоНомеру(1);
			Если СокрЛП(вТЗ.Код) = СокрЛП(вКод) Тогда
			    вВсегоЭлемОК = вВсегоЭлемОК + 1;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	Сообщить("Всего: " + вВсегоЭлем+" нашли: " + вВсегоЭлемОК);
КонецПроцедуры
 


Это как-бы шаблон, что заменить помешь...
  
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #8 - 07. Мая 2007 :: 21:39
Печать  
Напиши вложенный запрос вместо (SELECT Val FROM #Группа) результатом которого будет таблица с кодами - делов-то  Круглые глаза
  

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


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #9 - 07. Мая 2007 :: 22:50
Печать  
Цитата:
Напиши вложенный запрос вместо (SELECT Val FROM #Группа) результатом которого будет таблица с кодами - делов-то  Круглые глаза

Если не трудно, напишите, пожалуйста, код.
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #10 - 08. Мая 2007 :: 08:22
Печать  
А чем параметризованный запрос неустраивает?  Улыбка
  
Наверх
IP записан
 
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #11 - 08. Мая 2007 :: 09:20
Печать  
Попробовал сделать параметризированный запрос.
После выполнения кода:
вТЗ = ЗапросSQL.ВыполнитьИнструкцию();
Таблица вТЗ содержит 0 строк.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #12 - 08. Мая 2007 :: 09:27
Печать  
Сразу скажу, для данной задачи скорее всего лучше использовать параметризованный запрос, как и предложил trdm.

Непосредственно по теме.  Почему так все упираются в УложитьСписокОбъектов()? Неужели CREATE TABLE и INSERT уже отменили? Делаем типа того

CREATE TABLE #Codes (Code char(10))

INSERT INTO #Codes (Code) Values ('100')
INSERT INTO #Codes (Code) Values ('200')
...

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

Спр.Code IN (SELECT Code FROM #Codes)
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #13 - 08. Мая 2007 :: 09:39
Печать  
alex_gol писал(а) 08. Мая 2007 :: 09:20:
Попробовал сделать параметризированный запрос.
После выполнения кода:
вТЗ = ЗапросSQL.ВыполнитьИнструкцию();
Таблица вТЗ содержит 0 строк.

Ты бы код выложил.
+ к параметризованному запросу нужно изменить его так, чтобы он выдавал не таблицу значений, а код, если элемент с таким кодом найден, т.е. использовать: "ВыполнитьСкалярный" для экономии ресурсов... Тут поиск рулит..
  
Наверх
IP записан
 
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Не работает метод "УложитьСписокОбъектов13()"
Ответ #14 - 08. Мая 2007 :: 09:48
Печать  
Заработало после того как в строке
ЗапросSQL.ДобПараметр(1,14,Метаданные.Справочник("Номенклатура").ДлинаКода,0);
заменил 14 на 4, т.к. у меня тип кода числовой.
Спасибо за идею.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать