Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Определить наличие определеного подч. документа (число прочтений - 2715 )
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Определить наличие определеного подч. документа
15. Февраля 2007 :: 08:46
Печать  
Допоможить ламеру...

Не получается следующий фрагмент кода 1С (код для примера, реальный посложнее будет) перевести в фрагмент прямого запроса
Код
Выбрать все
Функция ЕстьЛиПодчиненныйОтменаСчета(ТД)
Док=СоздатьОбъект("Документ");
Док.ВыбратьПодчиненныеДокументы(,,ТД);
Пока Док.ПолучитьДокумент()=1 Цикл
	Если (Док.Вид()="ОтменаСчета") и (Док.Проведен()=1) Тогда
		Возврат 1;
	КонецЕсли;
КонецЦикла;
Возврат 0;
КонецФункции
 


Единственная мысль: использовать EXISTS, однако религия не позволяет: старый завет разрешает с exists только конструкцию "селект *", а новый завет для типизации документа по полю IDDoc требует, чтобы в выборке присутствовало поле содержащее IDDocDef с именем <ИмяПоляIDDoc>_вид.
Т.е. такая конструкция не работает:
Код
Выбрать все
|(
|	select count(*) as nt
|	from _1scrdoc pod(nolock)
|		inner join _1sjourn j2(nolock) on pod.childid = j2.iddoc
|	where exists 	(select *
|			from _1scrdoc pod3(nolock) inner join _1sjourn j3(nolock) on pod3.childid = j3.iddoc
|			where
|				j3.iddocdef = $ВидДокумента.ОтменаСчета and
|				j3.closed&1 = 1 and
|				pod3.mdid = 0 and
|				pod3.parentval = @docum5
|			)
|) 


В общем, чепуха какая-то у меня получается, запутался в двух соснах  Улыбка
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Определить наличие определеного подч. документ
Ответ #1 - 15. Февраля 2007 :: 09:04
Печать  
Код
Выбрать все
SELECT case when count(*) = 0 then 0 else 1 end
FROM _1scrdoc cr (nolock)
	inner join _1sjourn jr (nolock) on cr.child_date_time_iddoc = jr.date_time_iddoc
WHERE parentval = :ВыбДок *
	and mdid = 0
	and jr.iddocdef = $ВидДокумента.ОтменаСчета
	and jr.closed & 1 = 1 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Определить наличие определеного подч. документ
Ответ #2 - 15. Февраля 2007 :: 10:10
Печать  
Спасибо, очень красиво...

Осталась маленькая проблемка.
Запрос параметризированный, документ ТД передается как char(9),
поэтому простая замена на WHERE parentval = @docum5 ессно не работает.
Заработало, если передать один документ двумя параметрами в запрос:  char(9) и char(23), но это, ИМХО, лажа
Как быть?
Весь текст запроса:
ТекстЗапроса="
Код
Выбрать все
|set nocount on
|declare @docum5 char(9)
|declare @docum6 char(23)
|set @docum5 = ?
|set @docum6 = ?
|select case	  when ga.cld = 0 and ga.mrk = 0 then '"""+ШрифтОбычный+"""'
|				when ga.mrk = 1 then '"""+ШрифтПометкаУдаления+"""'
|				when ga.cld = 1 then case when pa.nt > 0 then '"""+ШрифтАннулирован+"""' else '"""+ШрифтСписанВДоход+"""' end
|		else '"""+ШрифтОбычный+"""'
|		end
|from
|	(
|	select 	j1.iddoc doc1, j1.iddocdef doc1_вид, j1.closed&1 cld, j1.ismark mrk
|	from 	_1sjourn as j1(nolock)
|	where 	j1.iddocdef = $ВидДокумента.Счет
|			and j1.iddoc = @docum5
|	) as ga
|	,
|	(
|	select count(*) as nt
|	from _1scrdoc cr(nolock)
|		inner join _1sjourn jr(nolock) on cr.child_date_time_iddoc = jr.date_time_iddoc
|	where parentval = @docum6
|		and mdid = 0
|		and jr.iddocdef = $ВидДокумента.ОтменаСчета
|		and jr.closed & 1 = 1
|	) as pa 


|";
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Определить наличие определеного подч. документ
Ответ #3 - 15. Февраля 2007 :: 10:46
Печать  
Kapet писал(а) 15. Февраля 2007 :: 10:10:
Осталась маленькая проблемка.
Запрос параметризированный, документ ТД передается как char(9),
поэтому простая замена на WHERE parentval = @docum5 ессно не работает.
Заработало, если передать один документ двумя параметрами в запрос:  char(9) и char(23), но это, ИМХО, лажа
Как быть?

Код
Выбрать все
WHERE parentval = 'O1' + $ВидДокумента36.НазваниеРодДокумента + @docum5  

или
Код
Выбрать все
WHERE substring(parentval, 7, 9) = @docum5 

Во втором случае снижается эффективность использования индекса, а при низкой избирательности по mdid=0 вообще вместо index seek будет clustered index scan.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Определить наличие определеного подч. документ
Ответ #4 - 15. Февраля 2007 :: 11:03
Печать  
А не шустрее ли будет в вышеприведенный полный запрос передавать все-таки char(23), но как-то подрихтовать from в ga "and j1.iddoc = @docum5", т.е. извлечь из char(23)  iddoc ?
Если да, то как?
Если declare @docum5 char(23) то "and j1.iddoc = right(@docum5,9)" не проходит...
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Определить наличие определеного подч. документ
Ответ #5 - 15. Февраля 2007 :: 11:23
Печать  
Kapet писал(а) 15. Февраля 2007 :: 11:03:
А не шустрее ли будет в вышеприведенный полный запрос передавать все-таки char(23), но как-то подрихтовать from в ga "and j1.iddoc = @docum5", т.е. извлечь из char(23)  iddoc ?
Если да, то как?
Если declare @docum5 char(23) то "and j1.iddoc = right(@docum5,9)" не проходит...

Без условия по parentval ты не попадёшь в индекс, поэтому шустрее не будет. Так что или формируй значение, как показано в моём предыдущем сообщении (первый вариант), или передавай char(23).
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Определить наличие определеного подч. документ
Ответ #6 - 15. Февраля 2007 :: 11:27
Печать  
Спасибо за помощь! Работает. Буду пробовать переводить в хранимую процедуру...
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать