mov68 писал(а) 30. Января 2008 :: 07:29:Все описанные методы используют следующее: поиск документа верхнего уровня, сефинг вниз по подчиненным документам, при этом число запросов в общем случае 2*ЧислоУровнейИерархии. А если дерево подчиненности не нужно, нужен только список связанных документов, можно ли уменьшить общее число запросов (применяю это в модуле проведения, хочется ускорить)?
Можно сложить все инструкции в один запрос. Скажем, так:
рс = СоздатьОбъект("ODBCRecordSet");
рс.УложитьСписокОбъектов(спВыбДоки, "#docs");
рс.ВыполнитьИнструкцию("
|set nocount on
|while 1=1 begin
| insert #docs (val)
| select substring(parentval, 7, 9)
| from _1scrdoc (nolock)
| inner join #docs on childid = val
| where mdid = 0
| and substring(parentval, 7, 9) not in (select val from #docs)
| if @@rowcount = 0 break
|end
|while 1=1 begin
| insert #docs (val)
| select right(child_date_time_iddoc, 9)
| from _1scrdoc (nolock)
| inner join #docs on parentval like 'O1____' + val
| where mdid = 0
| and right(child_date_time_iddoc, 9) not in (select val from #docs)
| if @@rowcount = 0 break
|end
|set nocount off
|");
спДоки = рс.ВыполнитьИнструкцию("
|select val [Док $Документ]
| , iddocdef Док_вид
|from #docs
| inner join _1sjourn (nolock) on val = iddoc
|", СоздатьОбъект("СписокЗначений"));
Или так:
рс.ВыполнитьИнструкцию("
|set nocount on
|declare @doccount integer
|set @doccount = 1
|while @doccount > 0 begin
| insert #docs (val)
| select right(child_date_time_iddoc, 9)
| from _1scrdoc (nolock)
| inner join #docs on parentval like 'O1____' + val
| where mdid = 0
| and right(child_date_time_iddoc, 9) not in (select val from #docs)
| set @doccount = @@rowcount
| insert #docs (val)
| select substring(parentval, 7, 9)
| from _1scrdoc (nolock)
| inner join #docs on childid = val
| where mdid = 0
| and substring(parentval, 7, 9) not in (select val from #docs)
| set @doccount = @doccount + @@rowcount
|end
|set nocount off
|");
Во втором варианте, в общем случае, количество найденных документов будет больше, чем в первом.