Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Документы, не имеющие в подчинении... (число прочтений - 2990 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Документы, не имеющие в подчинении...
19. Декабря 2007 :: 13:32
Печать  
Что-то никак не соображу как решить такую задачку.
Необходимо выбрать все документы вида "ДоговораОСАГО", у которых не было в подчиненных документа вида "Аннулирование".
Т.е. есть:
Код
Выбрать все
	|SELECT  ДоговораОСАГО.IDDOC as [Док $Документ.ДоговораОСАГО]
	|
	|FROM $Документ.ДоговораОСАГО AS ДоговораОСАГО
	|WHERE ... 


Что ставить в секцию условия? Понимаю, что сведения о подчиненности хранятся в 1SCRDOC , но как это использовать в данной ситуации не пойму...
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Документы, не имеющие в подчинении...
Ответ #1 - 19. Декабря 2007 :: 13:35
Печать  
Может это поможет?
Код
Выбрать все
	|Select
	|j.iddoc as [Док $Документ.ПриходнаяНакладная],
	|$d.Склад as [Склад $Справочник.Склады],
	|$d.НомерДок8 as НомерДок8,
	|$d.Клиент as [Поставщик $Справочник],
	|$d.Кво as Количество,
	|$d.СуммаСНДС as Сумма,
	|Отбор.ChildID as [ПодчДок $Документ],
	|j2.iddocdef as ПодчДок_вид
	|from "+?(ЭтоSQL=1,"_","")+"1sjourn j "+?(ЭтоSQL=1,"(nolock)","")+"
	|left join $Документ.ПриходнаяНакладная d "+?(ЭтоSQL=1,"(nolock)","")+" on d.iddoc=j.iddoc
	|left join "+?(ЭтоSQL=1,"_","")+"1scrdoc Отбор "+?(ЭтоSQL=1,"(nolock)","")+" on Отбор.mdid = '   0' and Отбор.parentval='O1'+$ВидДокумента36.ПриходнаяНакладная+j.iddoc
	|left join "+?(ЭтоSQL=1,"_","")+"1sjourn j2 "+?(ЭтоSQL=1,"(nolock)","")+" on j2.iddoc = Отбор.ChildID
	|where j.iddocdef=$ВидДокумента.ПриходнаяНакладная
	|"+?(ПустоеЗначение(ВыбПоставщик)=1," "," and $d.Клиент = :Клиент ")+"
	|"+?(ПустоеЗначение(ВыбСклад)=1," "," and $d.Склад = :Склад ")+"
	|and j.Closed "+?(ЭтоSQL=1,"&1","")+"  = 1
	|and (Отбор.parentval  is null OR j2.Closed "+?(ЭтоSQL=1,"&1","")+" <> 1)
	|ORDER BY "+?(ЭтоSQL=1,"left (j.date_time_iddoc,8)","j.date")+"
 

  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Документы, не имеющие в подчинении...
Ответ #2 - 19. Декабря 2007 :: 14:53
Печать  
Спасибо конечно, но я всё равно что-то не пойму как вывести список тех документов, в подчинении у которых не было "Аннулирование", но могли быть и какие-тодругие доки.
  
Наверх
 
IP записан
 
mvgfirst
Full Member
***
Отсутствует


В борьбе бобра с ослом
всегда побеждает бобро!

Сообщений: 152
Местоположение: Украина г. Кривой Рог
Зарегистрирован: 17. Августа 2007
Пол: Мужской
Re: Документы, не имеющие в подчинении...
Ответ #3 - 19. Декабря 2007 :: 14:56
Печать  
Если я не ошибаюсь (нет времени лазить по собственным исходникам - я точно такое делал) нужно использовать конструкцию
Код
Выбрать все
NOT IN (SELECT ..... ) 


Если никто ничего быстрее не подскажет... пороюсь выложу. (ну или в асю  Подмигивание )
  
Наверх
ICQ  
IP записан
 
mvgfirst
Full Member
***
Отсутствует


В борьбе бобра с ослом
всегда побеждает бобро!

Сообщений: 152
Местоположение: Украина г. Кривой Рог
Зарегистрирован: 17. Августа 2007
Пол: Мужской
Re: Документы, не имеющие в подчинении...
Ответ #4 - 19. Декабря 2007 :: 15:00
Печать  
Ну если сможешь разобраться то вот запрос который делает именно то что тебе надо, но в моей базе Улыбка
Писал не на 1С++ на чистом старом и добром Rainbow поэтому все вот так как есть Улыбка
Код
Выбрать все
SET NOCOUNT ON
		|SELECT
		|	A.SP304 OTD_ID, A.IDDOC ZAK_ID, CASE WHEN CJ.IDDOCDEF = 1156 THEN DV.CHILDID ELSE '0' END DV_ID, RTRIM(SPR_OTD.DESCR) OTD_NAME
		|FROM
		|	_1SJOURN A WITH (NOLOCK)
		|	LEFT OUTER JOIN (SELECT SubString(PARENTVAL,7,9) PARENTID, CHILDID FROM _1SCRDOC WITH (NOLOCK) WHERE SubString(PARENTVAL,5,2) = 'VA') DV ON DV.PARENTID = A.IDDOC
		|	LEFT OUTER 	JOIN _1SJOURN CJ on DV.CHILDID = CJ.IDDOC AND CJ.CLOSED = 1
		|	LEFT OUTER JOIN SC95 SPR_OTD (NOLOCK) on SPR_OTD.ID = A.SP304
		|WHERE
		|	A.IDDOCDEF = 1126 AND A.CLOSED = 1 AND
		|	LEFT(A.DATE_TIME_IDDOC,8) >= '" + глПолучитьСтрокуИзДаты(НачДата) + "' AND
		|	LEFT(A.DATE_TIME_IDDOC,8) <= '" + глПолучитьСтрокуИзДаты(КонДата) + "' AND
		|	NOT EXISTS (SELECT * FROM _1SCRDOC DDD (NOLOCK) JOIN _1SJOURN JJJ (NOLOCK) ON DDD.CHILDID = JJJ.IDDOC AND JJJ.CLOSED = 1 WHERE SubString(PARENTVAL,7,9) = a.iddoc)" 

  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Документы, не имеющие в подчинении...
Ответ #5 - 19. Декабря 2007 :: 15:00
Печать  
mvgfirst писал(а) 19. Декабря 2007 :: 14:56:
Если я не ошибаюсь (нет времени лазить по собственным исходникам - я точно такое делал) нужно использовать конструкцию
Код
Выбрать все
NOT IN (SELECT ..... ) 


Если никто ничего быстрее не подскажет... пороюсь выложу. (ну или в асю  Подмигивание )

ну впринципе да, можно во внутреннем селекте вывести родителей всех документов вида "Аннулирование"...
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Документы, не имеющие в подчинении...
Ответ #6 - 19. Декабря 2007 :: 15:50
Печать  
Спасибо, вроде сделал. Получилось примерно такое:
Код
Выбрать все
SELECT
	|	 $ДоговораОСАГО.НомерПолиса as НомерПолиса
	|	, ДоговораОСАГО.IDDOC as [Док $Документ.ДоговораОСАГО]
	|FROM $Документ.ДоговораОСАГО AS ДоговораОСАГО
	|WHERE  ...
	|	AND ('O1'+$ВидДокумента36.ДоговораОСАГО+ДоговораОСАГО.iddoc) NOT IN (
	|			SELECT Отбор.parentval
	|			FROM
	|				1scrdoc Отбор
	|			LEFT JOIN 1sjourn ЖурПодч on ЖурПодч.IDDOC = Отбор.ChildID
	|			WHERE
	|				Отбор.mdid = '   0'
	|				AND ЖурПодч.IdDocDef = $ВидДокумента36.Аннулирование
	|			) 


Поправьте меня, если что-то не так.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Документы, не имеющие в подчинении...
Ответ #7 - 20. Декабря 2007 :: 05:36
Печать  
сделал найти все док счет у которых в подчинении нет документа расходнаяБН
Код
Выбрать все
	ПрямойЗапрос = СоздатьОбъект("ODBCRecordSet");
	ТекстЗапроса = "
	|SELECT
	|  ЖурДокСчет.IDDoc [Док $Документ.Счет]
	|  FROM
	|  _1Sjourn ЖурДокСчет (NOLOCK)
	|  WHERE ЖурДокСчет.IDDocDef = $ВидДокумента.Счет  
	|   and   ЖурДокСчет.IDDoc not in
	|     (
	|     select distinct substring(Отбор.ParentVal,7,9)  from _1SCRDOC Отбор  (NOLOCK)
	|     INNER JOIN _1Sjourn ЖурДокРасхНакладные (NOLOCK)
	|     ON  ЖурДокРасхНакладные.IDDOC = Отбор.ChildID
	|     and ЖурДокРасхНакладные.IDDocDef = $ВидДокумента.РасходнаяБН
	|     where left(Отбор.ParentVal,6) = (  'O1'+$ВидДокумента36.Счет ) AND
	|     Отбор.MDID = 0
	|     )
	|";
	ПрямойЗапрос.Отладка(1);
	ТЗ = ПрямойЗапрос.ВыполнитьИнструкцию(ТекстЗапроса);
    //ТЗ.ВыбратьСтроку();
    Сообщить("Колво строк = " + ТЗ.КоличествоСтрок() );
 

  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Документы, не имеющие в подчинении...
Ответ #8 - 20. Декабря 2007 :: 06:07
Печать  
Вопрос чисто из любопытства, в данных запросах не лучше ли использовать Exists?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Документы, не имеющие в подчинении...
Ответ #9 - 20. Декабря 2007 :: 07:44
Печать  
Цитата:
Вопрос чисто из любопытства, в данных запросах не лучше ли использовать Exists?

Как правило запросы с Exists являются  коррелированными - поэтому их по возможности
надо избегать или использовать на небольших выборках ( много других ограничений ).
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать