Доброе время суток!
Есть справочник Товары и подчиненный ему справочник Единицы. В единицах беспорядочно установлены коды элементов. Нужно установить для базовой единицы (определяется по перечислению в справочнике Товары) код 1. Для единиц с типами уп, кор, палето далее по последовательности (имеется ввиду если есть несколько одинаковых типов).
В общем придумал такую схему: для определенного товара выгрузить все его единицы в таблицу добавив колонку параметр (базовая-1, уп-2, кор-3, палето-4). Отсортировать "Колонка-параметр,ИДЭлемента". Затем по номерам строк данной таблицы задать коды в справочнике Единицы.
Можно канешн создать параметризированный запрос для выгрузки единиц в 1с-кую ТЗ, сортировать, добавить столбец с номерами строк и «заапдейтить» единицы по этой ТЗ. Но хотелось бы сделать подобное через SQL. Первый раз задался такой идеей. Раньше хватало обычной выборки с различными соединениями. Никода не использовал запросы с циклами и условиями, но очень хочетца разобраться.
![Улыбка Улыбка](https://www.1cpp.ru/forumfiles/Templates/Forum/default/smiley.gif)
Да и скорость удивительная по сравнению с 1С.
В общем получилось что-то вроде:
if Exists (select * from tempdb..sysobjects where id = object_id('tempdb..#temp_ed') and sysstat & 0xf = 3 ) drop table #temp_ed
Create Table #temp_ed ( [row_id] int IDENTITY(1, 1) not null, [id] char(9), [p] int, PRIMARY KEY CLUSTERED (row_id) )
DECLARE @code as int
SET @code = (select max(code) from $Справочник.Товары (nolock))
WHILE @code > 0
BEGIN
delete from #temp_ed
if not Exists (select * from $Справочник.Товары (nolock) where code = @code) begin set @code = @code - 1 continue end
insert into #temp_ed (id, p)
select
e.id id,
case
when $e.спрЕдиница = $t.спрБазоваяЕдиница then 1
when $e.спрЕдиница = :Упаковка then 2
when $e.спрЕдиница = :Коробка then 3
when $e.спрЕдиница = :Палето then 4
else 5
end p
from $Справочник.Товары t (nolock)
inner join $Справочник.Единицы e (nolock) on t.id = e.parentext and t.code = @code
order by p, id
if @@ROWCOUNT > 0 begin
update e
set e.code = t.row_id
from $Справочник.Единицы e (nolock)
inner join #temp_ed t on t.id = e.id
end
set @code = @code - 1
END
GO
select
t.row_id,
t.id,
t.p,
e.code,
tov.code
from #temp_ed t
inner join $Справочник.Единицы e (nolock) on e.id = t.id
inner join $Справочник.Товары tov (nolock) on tov.id = e.parentext
if Exists (select * from tempdb..sysobjects where id = object_id('tempdb..#temp_ed') and sysstat & 0xf = 3 ) drop table #temp_ed
Получаю максимальный код в справочнике Товары. Далее обратный цикл по кодам товаров для получения единиц с параметром…
Тока не работает она, чтоб ее... С конкретным указанием кода все отлично, но с циклом что-то не так. Если убрать delete from #temp_ed, то в таблице две строки на выходе. С единицами двух товаров с последними по величине кодов.
Еще смущает то, что если в «set @code = @code - 1» поставить «+ 100» то ничего странного не происходит. Время обработки прежнее. Результат тоже
Чет запутался .......