Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Выбрать Заявки без Реализаций (число прочтений - 7629 )
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Выбрать Заявки без Реализаций
11. Сентября 2013 :: 09:43
Печать  
Есть документы ЗаявкаПокупателя и документы Реализация. У Реализации есть реквизит ДокОснование (тип Документ).
Нужно в определенном периоды выбрать Заявки по которым не Реализаций с сумма ниже определенной.
Пробовал разными путями, никак не получается
Пример:
ТекстЗапроса = "
     |SELECT
     |      $ДокЗай.Контрагент                              [Контрагент $Справочник.Контрагенты]
     |      ,SUM($ДокЗай.СуммаВзаиморасчетов)      Сумма
     |FROM
     |      $Документ.ЗаявкаПокупателя ДокЗай With (NOLOCK)
     |INNER JOIN
     |      _1SJourn Жур With (NOLOCK) ON Жур.IDDoc = ДокЗай.IDDoc
     |                                                AND Жур.Date_Time_IDDoc BETWEEN :НачДатаЗ AND :КонДатаЗ~
     |                                                AND Жур.IsMark = 0
     |LEFT JOIN
     |      $Документ.Реализация ДокРеал With (NOLOCK) ON RIGHT($ДокРеал.ДокОснование,9) = ДокЗай.IDDoc
     |                                                                        AND RIGHT($ДокРеал.ДокОснование,9) = $ПустойИД
     |LEFT JOIN
     |      _1SJourn ЖурР With (NOLOCK) ON ЖурР.IDDoc = ДокРеал.IDDoc
     |                                                AND ЖурР.Date_Time_IDDoc BETWEEN :НачДатаР AND :КонДатаР~
     |                                                AND ЖурР.IsMark = 0
     |WHERE
     |      $ДокЗай.ДатаОтгрузки < :ДатаОтгрузки
     |GROUP BY
     |      $ДокЗай.Контрагент
     |HAVING
     |      SUM($ДокЗай.СуммаВзаиморасчетов) < :МинСумма
     |";
     
           
     RS.УстановитьТекстовыйПараметр("НачДатаЗ",            ВыбКонПериода-10);
     RS.УстановитьТекстовыйПараметр("КонДатаЗ",            ВыбКонПериода);
     RS.УстановитьТекстовыйПараметр("НачДатаР",            ВыбКонПериода-15);
     RS.УстановитьТекстовыйПараметр("КонДатаР",            ВыбКонПериода+2);
     RS.УстановитьТекстовыйПараметр("ДатаОтгрузки",      ВыбКонПериода+1);
     RS.УстановитьТекстовыйПараметр("МинСумма",            ВыбМинСумма);
     RS.Подготовить(ТекстЗапроса);
     RS.ПостроитьПараметры();
     
     ТЗ = СоздатьОбъект("ТаблицаЗначений");
     ТЗ = RS.ВыполнитьИнструкцию(,ТЗ,1);

но так выбирает все заявки, по которым по которым и есть и нет реализации

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



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать Заявки без Реализаций
Ответ #1 - 11. Сентября 2013 :: 12:12
Печать  
если закрыть глаза на оптимальность запроса вообще, то
where $ДокРеал.ДокОснование is null
  

1&&2&&3
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Выбрать Заявки без Реализаций
Ответ #2 - 11. Сентября 2013 :: 12:45
Печать  
А неоптимальность в чем?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать Заявки без Реализаций
Ответ #3 - 12. Сентября 2013 :: 05:01
Печать  
Foma писал(а) 11. Сентября 2013 :: 12:45:
А неоптимальность в чем?

Для обращения к _1SJourn Жур существует более селективный индекс. Нужно указать iddocdef.
Для выборки подчиненных нужно использовать _1scrdoc вместо связки ДокРеал+ЖурР . В _1scrdoc есть хороший индекс PARENT.
  

1&&2&&3
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Выбрать Заявки без Реализаций
Ответ #4 - 12. Сентября 2013 :: 05:58
Печать  
LEFT JOIN
     |      $Документ.Реализация ДокРеал With (NOLOCK) ON RIGHT($ДокРеал.ДокОснование,9) = ДокЗай.IDDoc
     |                                                                        AND RIGHT($ДокРеал.ДокОснование,9) = $ПустойИД

этот лейт джойн гарантированно вырожден же будет?

Ибо чтоб с него что-то присоединилось должно выполниться ДокЗай.IDDoc = $ПустойИД
И если это выполнится - то у тебя в БД куда бОльшие проблемы, чем пустая выборка запроса.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Выбрать Заявки без Реализаций
Ответ #5 - 12. Сентября 2013 :: 06:00
Печать  
trad писал(а) 12. Сентября 2013 :: 05:01:
Для выборки подчиненных нужно использовать _1scrdoc вместо связки ДокРеал+ЖурР . В _1scrdoc есть хороший индекс PARENT.


Спорный вопрос. Если позволяют условия - мне куда больше нравится решение о включении индекса у общего реквизита ДокументОснования и использования фильтров/джойнов по Журнал.ДокументОснование.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать Заявки без Реализаций
Ответ #6 - 12. Сентября 2013 :: 06:26
Печать  
Satans Claws писал(а) 12. Сентября 2013 :: 06:00:
trad писал(а) 12. Сентября 2013 :: 05:01:
Для выборки подчиненных нужно использовать _1scrdoc вместо связки ДокРеал+ЖурР . В _1scrdoc есть хороший индекс PARENT.


Спорный вопрос. Если позволяют условия - мне куда больше нравится решения об включения индекса у общего реквизита ДокументОснования и фильтры/связи по Журнал.ДокументОснование.

А чем больше нравится индекс по общему реквизиту? Ведь все тоже самое УЖЕ есть в crdoc.
  

1&&2&&3
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Выбрать Заявки без Реализаций
Ответ #7 - 12. Сентября 2013 :: 06:51
Печать  
trad писал(а) 12. Сентября 2013 :: 06:26:
А чем больше нравится индекс по общему реквизиту? Ведь все тоже самое УЖЕ есть в crdoc.


Ибо Кроссдок - МАСТ ДАЙ.
Ужастнейшая таблица с не менее отвратнейшим содержимым.

Ну и в запросах через кроссдок ты практически всегда будешь вынужден джойнить таблицу журнала, что не добавляет читабельности запроса.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать Заявки без Реализаций
Ответ #8 - 12. Сентября 2013 :: 07:31
Печать  
Satans Claws писал(а) 12. Сентября 2013 :: 06:51:
Ибо Кроссдок - МАСТ ДАЙ.
Ужастнейшая таблица с не менее отвратнейшим содержимым.

Так это содержимое уже есть и выпилить его невозможно.
Лучше этими данными воспользоваться чем дублировать такие же в журне.
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выбрать Заявки без Реализаций
Ответ #9 - 12. Сентября 2013 :: 09:07
Печать  
(0) вот твой запрос ( точнее только сами документы заявка без доп условий )

Код
Выбрать все
ТекстЗапроса = "
|SELECT
|  ДокЗай.IDDoc [Док $Документ.ЗаявкаПокупателя]
|FROM
|  _1SJourn Жур (nolock)
|INNER JOIN  
|  $Документ.ЗаявкаПокупателя as ДокЗай (nolock) ON ДокЗай.IDDoc = Жур.IDDoc
|  AND Жур.IDDocDef = $ВидДокумента.ЗаявкаПокупателя
|WHERE
|  Жур.Date_Time_IDDoc >= :НачДатаЗ
|  AND Жур.Date_Time_IDDoc <= :КонДатаЗ~
|  AND Жур.ISMARK = 0
|  AND  not exists ( SELECT * FROM  _1SCRDOC Отбор (nolock)
|			 INNER JOIN _1SJourn Жур1 (nolock) on Жур1.IDDoc = Отбор.CHILDID
|			 WHERE Отбор. MDID = 0
|			 AND Отбор.ParentVal = 'O1'+$ВидДокумента36.ЗаявкаПокупателя + Жур.IDDoc + '	  '
|			 AND Жур1.iddocdef = $ВидДокумента.Реализация
|			 AND Жур1.ISMARK = 0
|		     )
|";  
 




опечатался  должно быть             AND Жур1.ISMARK = 0
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать Заявки без Реализаций
Ответ #10 - 12. Сентября 2013 :: 09:22
Печать  
если убрать * и сделать связь по позиции - Жур1.date_time_iddoc = Отбор.CHILD_date_time_iddoc,
то можно избавиться от не нужного bookmark lookup к 1scrdoc
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выбрать Заявки без Реализаций
Ответ #11 - 12. Сентября 2013 :: 09:35
Печать  
trad писал(а) 12. Сентября 2013 :: 09:22:
если убрать * и сделать связь по позиции - Жур1.date_time_iddoc = Отбор.CHILD_date_time_iddoc,
то можно избавиться от не нужного bookmark lookup к 1scrdoc


по
Жур1.date_time_iddoc = Отбор.CHILD_date_time_iddoc
согласен надо добавлять обязательно

про * не очень понял
* же в подзапросе антисоеденения ( вроде как единственное место где можно ставить * без всяких последсвий ) - Если ошибаюсь то поясни ( обычно я ставлю  iddoc но здесь поленился * короче )
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выбрать Заявки без Реализаций
Ответ #12 - 12. Сентября 2013 :: 09:39
Печать  
(0) с учетом (10) улучшенный вариант

Код
Выбрать все
ТекстЗапроса = "
|SELECT
|  ДокЗай.IDDoc [Док $Документ.ЗаявкаПокупателя]
|FROM
|  _1SJourn Жур (nolock)
|INNER JOIN  
|  $Документ.ЗаявкаПокупателя as ДокЗай (nolock) ON ДокЗай.IDDoc = Жур.IDDoc
|  AND Жур.IDDocDef = $ВидДокумента.ЗаявкаПокупателя
|WHERE
|  Жур.Date_Time_IDDoc >= :НачДатаЗ
|  AND Жур.Date_Time_IDDoc <= :КонДатаЗ~
|  AND Жур.ISMARK = 0
|  AND  not exists ( SELECT Жур1.IDDOC FROM  _1SCRDOC Отбор (nolock)
|			 INNER JOIN _1SJourn Жур1 (nolock) on Жур1.IDDoc = Отбор.CHILDID
|			 AND Отбор. MDID = 0
|			 AND Отбор.ParentVal = 'O1'+$ВидДокумента36.ЗаявкаПокупателя + Жур.IDDoc + '	  '
|			 WHERE Отбор.CHILD_date_time_iddoc = Жур1.date_time_iddoc
|			 AND Жур1.iddocdef = $ВидДокумента.Реализация
|			 AND Жур1.ISMARK = 0
|		     )
|";  
 

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Выбрать Заявки без Реализаций
Ответ #13 - 12. Сентября 2013 :: 10:10
Печать  
trad писал(а) 12. Сентября 2013 :: 07:31:
Так это содержимое уже есть и выпилить его невозможно.
Лучше этими данными воспользоваться чем дублировать такие же в журне.


Ну, на моем счету 2 достаточно крупных проекта, где на кроссдоки был откровенно положен болт и использовалась схема с индексированными реквизитами Журнал.ДокументОснование и Журнал.идДок13 (этот реквизит заполняется триггером).
В первом из них я был одним из участников, второй - уже 3 года как мое детище.
Нареканий к выбранной методе нет.
Документооборот большой. В Первом проекте - я б даже сказал зашкаливающий.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать Заявки без Реализаций
Ответ #14 - 12. Сентября 2013 :: 10:24
Печать  
Satans Claws писал(а) 12. Сентября 2013 :: 10:10:
trad писал(а) 12. Сентября 2013 :: 07:31:
Так это содержимое уже есть и выпилить его невозможно.
Лучше этими данными воспользоваться чем дублировать такие же в журне.


Ну, на моем счету 2 достаточно крупных проекта, где на кроссдоки был откровенно положен болт и использовалась схема с индексированными реквизитами Журнал.ДокументОснование и Журнал.идДок13 (этот реквизит заполняется триггером).
В первом из них я был одним из участников, второй - уже 3 года как мое детище.
Нареканий к выбранной методе нет.
Документооборот большой. В Первом проекте - я б даже сказал зашкаливающий.

Участие даже в трех крупных проектах не отменяет регистрацию ссылок в кроссдоке.
Кроссдок - конечно не сахар, но почему, при возможности, не пользоваться его данными мне не понятно.
  

1&&2&&3
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать