Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Получение признака "Есть подчинёные документы" (число прочтений - 1868 )
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Получение признака "Есть подчинёные документы"
14. Ноября 2007 :: 10:47
Печать  
Задача следующая: необходимо при работе с классом "РасшЖурнал" добавить в ТП признак "Документ имеет подчинёные".
Для этого использую след. выражение:
Код
Выбрать все
МД = СоздатьОбъект("MetaDataWork");
ВремЗнач = Лев(МД.ЗначениеВСамуюДлиннуюСтрокуБД(СоздатьОбъект("Документ.МойДок")),6);
РасшЖурнал.ДобавитьПроизвольнуюГрафу("НПД", "Наличие ПД", , , "
|CASE
|	WHEN Exists(Select TOP 1 Ссылки.ROW_ID From  
|  			_1SCRDOC as Ссылки (NOLOCK INDEX=PARENT)
|  			WHERE Ссылки.MDID=0 AND Ссылки.ParentVal = '"+ВремЗнач+"'+Жур.IDDoc AND
|					Ссылки.Child_Date_Time_IDDoc >= Жур.Date_Time_IDDoc)
|	THEN 1 ELSE 0 END
|", "");
 


Сиквельный запрос джойнится с журналом документов в классе (Жур)
Так как имеется индекс, всё работает очень быстро, но, к сожалению, только для одного вида документов.
Переделав запрос в:
Код
Выбрать все
РасшЖурнал.ДобавитьПроизвольнуюГрафу("НПД", "Наличие ПД", , , "
|CASE
|	WHEN Exists(Select TOP 1 Ссылки.ROW_ID From  
|  			_1SCRDOC as Ссылки (NOLOCK INDEX=PARENT)
|  			WHERE Ссылки.MDID=0 AND SUBSTRING(Ссылки.ParentVal,7,9) = Жур.IDDoc AND
|					Ссылки.Child_Date_Time_IDDoc >= Жур.Date_Time_IDDoc)
|	THEN 1 ELSE 0 END
|", "");
 


Мы получаем рабочий запрос для любых документов НО! лишаемся индекса Печаль
И получаем неприемлимую скорость Печаль
Теперь вопрос: как получить полный идентификатор документа из БД имея только строку табл. журнала?
Или есть к-либо другие способы решения задачи?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получение признака "Есть подчинёные документы"
Ответ #1 - 14. Ноября 2007 :: 11:03
Печать  
slider26 писал(а) 14. Ноября 2007 :: 10:47:
Мы получаем рабочий запрос для любых документов НО! лишаемся индекса Печаль
И получаем неприемлимую скорость Печаль

SQL? Если приспичило, то добавь индекс и не парься.
  
Наверх
 
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Получение признака "Есть подчинёные документы"
Ответ #2 - 15. Ноября 2007 :: 04:05
Печать  
Arta писал(а) 14. Ноября 2007 :: 11:03:
SQL? Если приспичило, то добавь индекс и не парься.

Индекс??? По части поля "SUBSTRING(Ссылки.ParentVal,7,9)"???
Всегда считал, что индексировать можно только по полю, а не по подстроке.
Если такое возможно, плиз, синтаксис в студию...
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Получение признака "Есть подчинёные документы"
Ответ #3 - 15. Ноября 2007 :: 05:27
Печать  
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Получение признака "Есть подчинёные документы"
Ответ #4 - 15. Ноября 2007 :: 05:32
Печать  
kiruha писал(а) 15. Ноября 2007 :: 05:27:

Оченть интересно, а я уж думал что всё плохо Улыбка
  
Наверх
ICQ  
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Получение признака "Есть подчинёные документы"
Ответ #5 - 15. Ноября 2007 :: 09:17
Печать  
В итоге сделал так (может кому ещё пригодится Улыбка):
Код
Выбрать все
Функция ИнициализироватьТВД()

	Перем ЗапросИнициализацииТВД, ТекстЗапросаSQL, МД, н, ВремЗнач, Врем_СКЛ_ИД, Врем_ПИД_Префикс;

	ЗапросИнициализацииТВД = СоздатьОбъект("ODBCRecordset");

	ТекстЗапросаSQL = "
		|if exists(select * from tempdb..sysobjects where id = object_id('tempdb..#DocKindDefs')) DROP TABLE #DocKindDefs
		|
		|CREATE TABLE #DocKindDefs(Pref Char(6), Num Int)";

	Если (ЗапросИнициализацииТВД.Выполнить(ТекстЗапросаSQL) = 0) Тогда
		Сообщить("Ошибка при инициализации таблицы видов документов: """+ЗапросИнициализацииТВД.ПолучитьОписаниеОшибки()+""".","!");
		Возврат(0);
	КонецЕсли;

	ТекстЗапросаSQL = "INSERT INTO #DocKindDefs(Pref, Num) VALUES (?, ?)";
	ЗапросИнициализацииТВД.Подготовить(ТекстЗапросаSQL);
	ЗапросИнициализацииТВД.ПостроитьПараметры();

	МД = СоздатьОбъект("MetaDataWork");
	Для н=1 По Метаданные.Документ() Цикл
		ВремЗнач = СоздатьОбъект("Документ."+Метаданные.Документ(н).Идентификатор);
		Врем_ПИД_Префикс = Лев(МД.ЗначениеВСамуюДлиннуюСтрокуБД(ВремЗнач),6);
		Врем_СКЛ_ИД =

		ЗапросИнициализацииТВД.УстПараметр(1, Врем_ПИД_Префикс);
		ЗапросИнициализацииТВД.УстПараметр(2, Врем_СКЛ_ИД);

		Если (ЗапросИнициализацииТВД.Выполнить() = 0) Тогда
			Сообщить("Ошибка при инициализации таблицы видов документов: """+ЗапросИнициализацииТВД.ПолучитьОписаниеОшибки()+""".","!");
			Возврат(0);
		КонецЕсли;
	КонецЦикла;

	Возврат(1);

КонецФункции //ИнициализироватьТВД
 


А затем джойн с журналом:
Код
Выбрать все
LEFT JOIN #DocKindDefs as KindDoc ON Жур.IdDocDef = KindDoc.Num
 


И уже сам код:
Код
Выбрать все
CASE WHEN Exists(Select TOP 1 Ссылки.ROW_ID From  
_1SCRDOC as Ссылки (NOLOCK INDEX=PARENT)
WHERE Ссылки.MDID=0 AND Ссылки.ParentVal = KindDoc.Pref + Жур.IDDoc AND Ссылки.Child_Date_Time_IDDoc >= Жур.Date_Time_IDDoc)
THEN 1 ELSE 0 END
 


Вот и всё Улыбка Обшлось штатными индексами Улыбка

Прим.: Функция глРазделить(Стр1,Стр2) замещает в Стр1 каждый символ, содержащийся в Стр2 на разделитель строк, причём, стоящие подряд разделители объединяются в один.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать