PVR писал(а) 27. Апреля 2009 :: 09:07:Inner Join (c) писал(а) 27. Апреля 2009 :: 05:53:Забил я на все это и сделал через AddIn.ValTable с параметризированным апдейтом. Если кому интересно могу код выложить.
А почему именно AddIn.ValTable ?
Выкладывай
Прошу прощения. Код писал за несколько дней до предыдущего поста, и забыл почуть как делал
Хотел же поначалу через таблицу сделать, но вспомнил что "ТабРез.Загрузить(Запрос.ВыполнитьИнструкцию(ТЗ))" работает довольно долго с большим объемом данных, поскольку из запроса на выходе получаем таблицу значений, а потом перегружаем в VT. А тут весь справочник товаров (~35000) + у каждого несколько единиц. В итоге сделал через 2 параметризированных запроса. Вот текст:
Запрос=СоздатьОбъект("ODBCRecordSet");
ЗапросОбн=СоздатьОбъект("ODBCRecordSet");
ТЗ="
|select
|t.id [Тов $Справочник.Товары]
|from $Справочник.Товары t (nolock)
|where t.ismark = 0 and t.isfolder = 2
|";
ТабТов=Запрос.ВыполнитьИнструкцию(ТЗ);
овка);
ка);
);
ТЗ="
|declare @Tov char(9)
|set @Tov = ?
|select
|e.id [Ед $Справочник.Единицы],
|case
|when $e.спрЕдиница = $t.спрБазоваяЕдиница then 1
|when $e.спрЕдиница = :Упаковка then 2
|when $e.спрЕдиница = :Коробка then 3
|when $e.спрЕдиница = :Палето then 4
|else 5
|end Парам
|from $Справочник.Товары t (nolock)
|inner join $Справочник.Единицы e (nolock) on t.id = e.parentext and t.ismark = 0 and t.id = @Tov
|order by Парам, $e.спрКоэффициент, e.id
|";
Если Запрос.Подготовить(ТЗ)=0 Тогда
Сообщить(Запрос.ПолучитьОписаниеОшибки(),"!");
Возврат;
Иначе
Запрос.ДобПараметр(1,14,9,0);
КонецЕсли;
ТЗ="
|declare @Ed char(9)
|declare @N char(5)
|set @Ed = ?
|set @N = ?
|update e
|set e.code = @N
|from $Справочник.Единицы e
|where e.id = @Ed
|";
Если ЗапросОбн.Подготовить(ТЗ)=0 Тогда
Сообщить(ЗапросОбн.ПолучитьОписаниеОшибки(),"!");
Возврат;
Иначе
ЗапросОбн.ДобПараметр(1,14,9,0);
ЗапросОбн.ДобПараметр(1,14,5,0);
КонецЕсли;
КолСтрок=ТабТов.КоличествоСтрок();
ТабТов.ВыбратьСтроки();
Пока ТабТов.ПолучитьСтроку()=1 Цикл
Состояние("Товар: "+ТабТов.НомерСтроки+" из "+КолСтрок);
Запрос.УстПараметр(1,ТабТов.Тов);
ТабЕд=Запрос.ВыполнитьИнструкцию();
КоличЕд=ТабЕд.КоличествоСтрок();
Если КоличЕд<1 Тогда
Продолжить;
КонецЕсли;
ТабЕд.НоваяКолонка("Ном","Строка",5,0);
Для Сч=1 По КоличЕд Цикл
пСч=Строка(Сч);
Пробелы="";
Для н=1 По 5-СтрДлина(пСч) Цикл
Пробелы=Пробелы+" ";
КонецЦикла;
ТабЕд.УстановитьЗначение(Сч,"Ном",Пробелы+пСч);
КонецЦикла;
ТабЕд.УдалитьКолонку("Парам");
ЗапросОбн.ВыполнитьSQL_ИзТЗ(ТабЕд);
КонецЦикла;
Работает немолниеносно, как хотелось, но оч. быстро
.
ЗЫ. Для тех кто не сталкивался.... Пришлось с кодами пошаманить немножко. Грабли там небольшие. Если заапдейтить коды элементов просто строкой из числа без пробелов, то при интерактивной записи элемента говорит "неверно задан код". И если один из кодов потом руками перезаписать и посмотреть что выдаст запрос по этим кодам, то видно отличие результата в пробелах. 1С при записи дописывает слева пробелы до длины кода.