Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Выборка документов с подчиненными (число прочтений - 2619 )
VanoZZZ
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 30. Ноября 2010
Выборка документов с подчиненными
26. Июля 2011 :: 09:32
Печать  
Помогите написать запрос.
Мне надо получить отгрузочные ведомости за период и получить подчиненные им реализации (без фильтра по дате, т.е. все какие в базе есть). Реализация может быть напрямую подчинена ведомости, а может быть подчинена заявке покупателя, которая указана в ведомости в реквизите ЗаявкаПокупателя.
Вот этот бред который я написал вешает базу:

     ТекстЗапроса = "
           |SELECT
           |      Жур.IDDOC as [Док $Документ],
           |      Жур.IDDocDef as Док_вид,
           |      Ведомость.IDDOC as [Ведомость $Документ.ОтгрузочнаяВедомость],
           |      Подчиненные.ChildID as [Реализация $Документ.Реализация]
           |FROM
           |      $Документ.ОтгрузочнаяВедомость as Ведомость (NOLOCK)
           |INNER JOIN
           |      _1SJOURN as Жур (NOLOCK) ON
           |      Жур.IDDOC = Ведомость.IDDOC            
           |LEFT JOIN
           |      _1SCRDOC as Подчиненные (NOLOCK) ON
           |      (SubString(Подчиненные.ParentVal,7,9) = Ведомость.IDDOC OR
           |      SubString(Подчиненные.ParentVal,7,9) = RIGHT($Ведомость.ЗаявкаНаДоставку,9)) AND
           |      Подчиненные.MDID = 0
           |INNER JOIN
           |      _1SJOURN as Жур1 (NOLOCK) ON
           |      Жур1.IDDOC = Подчиненные.ChildID AND            
           |      Жур1.IDDocDef = $ВидДокумента.Реализация
           |WHERE
           |   (Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~) AND
           |      Жур.Closed & 1 = 1 AND
           |      Жур1.Closed & 1 = 1
           |";
  
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Выборка документов с подчиненными
Ответ #1 - 26. Июля 2011 :: 10:16
Печать  
Не стоит использовать OR в соединениях, лучше разбить этот запрос на две части с Union, одна часть выбирает непосредственно подчиненные, вторая - подчиненные через заявку.
  
Наверх
 
IP записан
 
Berck
Junior Member
**
Отсутствует



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Выборка документов с подчиненными
Ответ #2 - 26. Июля 2011 :: 10:18
Печать  
Разбей запрос на 2:
1) Реализация напрямую подчинена ведомости.
2) Через ЗаявкуПокупателя

и
Код
Выбрать все
Жур.IDDOC as [Док $Документ],
      Жур.IDDocDef as Док_вид,   


Это убери.

  
Наверх
 
IP записан
 
Berck
Junior Member
**
Отсутствует



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Выборка документов с подчиненными
Ответ #3 - 26. Июля 2011 :: 10:20
Печать  
И точно реализации могут быть намного раньше ведомости?
Может можно какое то ограничение наложить?
  
Наверх
 
IP записан
 
VanoZZZ
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 30. Ноября 2010
Re: Выборка документов с подчиненными
Ответ #4 - 26. Июля 2011 :: 10:32
Печать  
Спасибо за советы. Попробую. Я просто подумал что вообще в неправильном направлении иду. Может есть варианты оптимальнее реализовать
Berck писал(а) 26. Июля 2011 :: 10:20:
И точно реализации могут быть намного раньше ведомости?
Может можно какое то ограничение наложить?

Поздно уже ограничения накладывать. Поназаводили документов напрямую с заявок(((
  
Наверх
 
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Выборка документов с подчиненными
Ответ #5 - 26. Июля 2011 :: 10:44
Печать  
попробуй вот так

Код
Выбрать все
select
....

from _1SJOURN AS journ (nolock)
LEFT JOIN
	$Документ.ОтгрузочнаяВедомость AS ОтгрузочнаяВедомость (nolock)
ON
	journ.IDDOC = ОтгрузочнаяВедомость.IDDOC

LEFT LOOP JOIN
	_1SCRDOC as Отбор (NOLOCK)
ON
	Отбор.MDID=0 AND (Отбор.Parentval='O1'+$ВидДокумента36.ОтгрузочнаяВедомость+journ.IDDOC)
LEFT LOOP JOIN
	_1SJOURN as Жур2 (NOLOCK)
ON
	Жур2.Date_Time_IDDoc = Отбор.CHILD_DATE_TIME_IDDOC and Жур2.IDDocDef = $ВидДокумента.Реализация

where (
	journ.IDDOCDEF = $ВидДокумента.ОтгрузочнаяВедомость
)
AND journ.Date_Time_IDDoc BETWEEN :ДатаНачала AND :ДатаКонца~
AND journ.Closed & 1 = 1
AND Жур2.Closed & 1 = 1 



LOOP применительно к конкретной базе
  
Наверх
wwwICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка документов с подчиненными
Ответ #6 - 26. Июля 2011 :: 10:48
Печать  
как-то так, примерно


Код
Выбрать все
|SELECT
|  Таб.Владелец as [Док $Документ.ОтгрузочнаяВедомость],
|   Таб.Потомок as [Реализация $Документ.Реализация]

|  From(
|SELECT
|  Жур.IDDOC as Владелец,
|	Подчиненные.ChildID as Потомок
|  From   _1SJOURN as Жур (NOLOCK)
|  LEFT JOIN   _1SCRDOC as Подчиненные (NOLOCK) ON
|	SubString(Подчиненные.ParentVal,7,9) = Right(Жур.DATE_TIME_IDDOC,9)
|	  and Подчиненные.MDID = 0  
|  WHERE Жур.IDDocDef = $ВидДокумента.ОтгрузочнаяВедомость
|     and Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~
|     and Жур.Closed & 1 = 1
|Union all
|SELECT
|	Док.IDDOC,
|	Подчиненные.ChildID
| FROM $Документ.ОтгрузочнаяВедомость as Док (NOLOCK)
||INNER JOIN
|     _1SJOURN as Жур1 (NOLOCK) ON
|	Жур1.IDDOC = Док.IDDOC
|     and  Жур1.IDDocDef = $ВидДокумента.ОтгрузочнаяВедомость
|     and Жур1.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~
|     and Жур1.Closed & 1 = 1
|  LEFT JOIN   _1SCRDOC as Подчиненные1 (NOLOCK) ON
|	SubString(Подчиненные1.ParentVal,7,9) = Righ($Док.ЗаявкаНаДоставку,9)
|	  and Подчиненные1.MDID = 0  
|)as Таб 

  
Наверх
 
IP записан
 
Nice
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Зарегистрирован: 09. Июля 2007
Re: Выборка документов с подчиненными
Ответ #7 - 26. Июля 2011 :: 10:59
Печать  
Цитата:
(SubString(Подчиненные.ParentVal,7,9) = Ведомость.IDDOC OR

наверное лучше написать: "Подчиненные.ParentVal = 'O1' + $ВидДокумента36.ОтгрузочнаяВедомость + Ведомость.IdDoc"
и INNER JOIN мне кажется тоже не нужен
вот такая конструкция у меня почему то быстрей работает:
|   SELECT Ведомость.IdDoc AS [Ведомость $Документ.ОтгрузочнаяВедомость]
|
|      FROM _1sJourn AS Жур (NOLCK)
|LEFT JOIN  $Документ.ОтгрузочнаяВедомость AS Ведомость (NOLOCK) ON Ведомость.IdDoc = Жур.IdDoc
|
|    WHERE Жур.IdDocDef = $ВидДокумента.ОтгрузочнаяВедомость
|        AND Жур.Date_Time_IdDoc BETWEEN :НачДата AND :КонДата~
|
  
Наверх
 
IP записан
 
VanoZZZ
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 30. Ноября 2010
Re: Выборка документов с подчиненными
Ответ #8 - 27. Июля 2011 :: 05:33
Печать  
Всем спасибо. Очень помогли. Сделал двумя запросами через юнион
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать