Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Использование цикла по перебору справочника в запросе (число прочтений - 6191 )
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Использование цикла по перебору справочника в запросе
Ответ #15 - 21. Апреля 2009 :: 17:35
Печать  
А классификатор единиц измерения - это справочник? Или перечисление? Если спрвочник - то добавить туда (временно) реквизит - требуемый номер для подчиненного справочинка Единицы. Если перечисление - создать требуемую внешнюю таблицу.
И далее как-то так:

update Справочник.Единицы
set Код = КЕ.НовыйКод
from
Справочник.Единицы Единицы
inner join Справочник.КлассификаторЕдиниц КЕ
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Использование цикла по перебору справочника в запросе
Ответ #16 - 22. Апреля 2009 :: 21:52
Печать  
Нихрена не понял наверное, но тут можно обойтись апдейтом для базовой единицы (соединение по владельцу и реквизиту БазоваяЕдиница) + апдейт для всех остальных единиц с кейсом на ОКЕИ или его аналог (ссылок же нет в номенклатуре для них?)
Карочи 2 простых куска кода по 4 строки Улыбка
  

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


I Love BaBB 2!

Сообщений: 23
Зарегистрирован: 15. Октября 2008
Пол: Мужской
Re: Использование цикла по перебору справочника в запросе
Ответ #17 - 27. Апреля 2009 :: 05:37
Печать  
Вадимко писал(а) 22. Апреля 2009 :: 21:52:
Нихрена не понял наверное, но тут можно обойтись апдейтом для базовой единицы (соединение по владельцу и реквизиту БазоваяЕдиница) + апдейт для всех остальных единиц с кейсом на ОКЕИ или его аналог (ссылок же нет в номенклатуре для них?)
Карочи 2 простых куска кода по 4 строки Улыбка


к сожалению не так все просто. одинаковых единиц может быть несколько (причем в реальной базе даже базовых), а коды должны быть уникальными и идти по порядку от 1 до количества единиц
  
Наверх
 
IP записан
 
Inner Join (c)
Junior Member
**
Отсутствует


I Love BaBB 2!

Сообщений: 23
Зарегистрирован: 15. Октября 2008
Пол: Мужской
Re: Использование цикла по перебору справочника в запросе
Ответ #18 - 27. Апреля 2009 :: 05:53
Печать  
В общем пришлось отказаться от всего этого Печаль все уперлось в то что я не нашел каким образом в селекте счетчик сделать. а IDENTITY работает тока в инсерте. можно было б одним апдейтом с правильной расстановкой джойнов все оформить.
Забил я на все это и сделал через AddIn.ValTable с параметризированным апдейтом. Если кому интересно могу код выложить.
  
Наверх
 
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Использование цикла по перебору справочника в запросе
Ответ #19 - 27. Апреля 2009 :: 09:07
Печать  
Inner Join (c) писал(а) 27. Апреля 2009 :: 05:53:
Забил я на все это и сделал через AddIn.ValTable с параметризированным апдейтом. Если кому интересно могу код выложить.

А почему именно AddIn.ValTable ?
Выкладывай  Улыбка
  
Наверх
 
IP записан
 
Inner Join (c)
Junior Member
**
Отсутствует


I Love BaBB 2!

Сообщений: 23
Зарегистрирован: 15. Октября 2008
Пол: Мужской
Re: Использование цикла по перебору справочника в запросе
Ответ #20 - 28. Апреля 2009 :: 06:00
Печать  
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С при записи дописывает слева пробелы до длины кода.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Использование цикла по перебору справочника в запросе
Ответ #21 - 29. Апреля 2009 :: 06:56
Печать  
Код
Код
Выбрать все
			Для н=1 По 5-СтрДлина(пСч) Цикл
				Пробелы=Пробелы+" ";
			КонецЦикла;
			ТабЕд.УстановитьЗначение(Сч,"Ном",Пробелы+пСч);
 


Можно заменить кодом:
Код
Выбрать все
ТабЕд.УстановитьЗначение(Сч,"Ном",Прав("		  "+пСч,5)); 

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


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Использование цикла по перебору справочника в запросе
Ответ #22 - 29. Апреля 2009 :: 14:04
Печать  
Inner Join (c) писал(а) 27. Апреля 2009 :: 05:53:
а IDENTITY работает тока в инсерте.


Попробуй поискать "нумерация строк в запросе" или нечто подобное на sql.ru, думаешь ты первый?
Самое простое - во временную таблицу сбросить
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать