Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Можно ли прямым запросом найти свободный номер справочника? (число прочтений - 2640 )
Valera
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 01. Августа 2009
Можно ли прямым запросом найти свободный номер справочника?
15. Августа 2009 :: 11:49
Печать  
Реализовать следующее запросом:
Процедура НайтиСвободныйКод()
     Спр=СоздатьОбъект("Справочник.ТМЦ");
     Спр.ПорядокКодов();
     H=0;
     Спр.ВыбратьЭлементы();
     Пока Спр.ПолучитьЭлемент()=1 Цикл
           Если СтрДлина(Спр.Код)=6 Тогда
                 H=H+1;
           КонецЕсли;
           Если (Спр.Код<>Формат(H,"Ч(0)6")) И (H>0)  Тогда
                 Если СтрДлина(Спр.Код)<6 Тогда
                       H=H+1;
                 КонецЕсли;
                 Код=Формат(H,"Ч(0)6");
                 Возврат;
           КонецЕсли;
     КонецЦикла;
КонецПроцедуры


« Последняя редакция: 16. Августа 2009 :: 22:58 - Valera »  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Можно ли прямым запросом найти свободный номер справочника?
Ответ #1 - 15. Августа 2009 :: 14:00
Печать  
Можно, вот например, функция для получения нового кода(с учетом дырок)
Код
Выбрать все
Функция ПолучитьКодЭлемента()

	//код вида [01][01][01]([Группа][ПодГруппа][Элемент]), т.е. аналогично справочнику ТМЦ для групп. Элемент тут - контейнер
    //для первой группы н-р: 01, для первой подгруппы 0101, для первого элемента 010101

	КодРодителя = ?(ПустоеЗначение(Родитель) = 1,"",СокрЛП(Родитель.Код));
	текУровень  = Родитель.Уровень()+1;

	RS = СоздатьОбъект("ODBCRecordSet");
	RS.УстБД1С();

	ТекстЗапроса = "
	|set nocount on
	|
	|declare @i int
	|declare @tmp table(code char("+(текУровень*2)+") not null primary key)
	|
	|set @i = 1
	|
	|while @i<=99
	|begin
	| insert into @tmp values(right('"+КодРодителя+"'+'0'+ltrim(str(@i)),"+(текУровень*2)+"))
	|
	| set @i = @i + 1
	|end
	|
	|select top 1
	| tmp.code
	|from
	| @tmp tmp
	|where
	| not exists(select * from $Справочник.ТехнологииЭтапыСтроительства спр (nolock) where parentid = '"+Метадата.ЗначениеВСтрокуБД(Родитель)+"' and спр.code = tmp.code) and
	| not exists(select * from _1sdnlock lck (nolock) where dnprefix = '"+Прав(Формат("","С10") + ),10)+"' and docno = tmp.code)
	|";


	НовыйКод = "";
	Попытка
		НовыйКод = RS.ВыполнитьСкалярный(ТекстЗапроса);
	Исключение
		Сообщить(RS.ПолучитьОписаниеОшибки(),"!!!");
		Возврат 0;
	КонецПопытки;


	Если ПустоеЗначение(НовыйКод) = 1 Тогда
		Сообщить("Невозможно получить код для элемента: при существующем шаблоне кода количество элеметов в группе не может превышать 99!","!!!");
		//менять шаблон кода
		Возврат 0;
	КонецЕсли;

	//если этот код блокируется
	ТекстЗапроса = "
	|insert into _1sdnlock
	|select
	| '"+Прав(Формат("","С10") + ),10)+"' dnprefix,
	| '"+НовыйКод+"'														     docno
	|
	|select @@error
	|";

	рез = RS.ВыполнитьСкалярный(ТекстЗапроса);

	Если рез = 2627 Тогда  //Violation of PRIMARY KEY constraint

		НовыйКод = ПолучитьКодЭлемента();
	КонецЕсли;

	Возврат НовыйКод;
КонецФункции	// ПолучитьКодЭлемента	  

  
Наверх
 
IP записан
 
Valera
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 01. Августа 2009
Re: Можно ли прямым запросом найти свободный номер справочника?
Ответ #2 - 16. Августа 2009 :: 23:04
Печать  
Большее спасибо за отзыв! ... но у меня в спр. ТМЦ коды не в пределах подчинения, а во всем справочнике Печаль
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Можно ли прямым запросом найти свободный номер справочника?
Ответ #3 - 17. Августа 2009 :: 06:05
Печать  
код для получения следующего номера, с заполнением дырок:
Код
Выбрать все
select top 1
  cast(Nom1.code as int)+1 as СледующийКод
from $Справочник.Товары as Nom1
where cast((select top 1 Nom2.code from $Справочник.Товары as Nom2 where Nom2.Code > Nom1.code order by Nom2.code) as int) - cast(Nom1.code as int) > 1
  or (select top 1 Nom2.code from $Справочник.Товары as Nom2 where Nom2.Code > Nom1.code order by Nom2.code) is null
order by Nom1.code 


только аккуратно, про необходимость блокировки не забывайте.
  
Наверх
ICQ  
IP записан
 
Valera
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 01. Августа 2009
Re: Можно ли прямым запросом найти свободный номер справочника?
Ответ #4 - 17. Августа 2009 :: 11:09
Печать  
Спасибо, пашет!!! Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать