Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) условие для двух журналов в запросе (число прочтений - 5221 )
Evga
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 35
Зарегистрирован: 05. Мая 2011
условие для двух журналов в запросе
15. Августа 2011 :: 10:52
Печать  
вот такой запрос выводит заявки и реализации по ним.
SELECT $ЗаявкаСтроки.Товар [Товар $Справочник.Номенклатура]
     , $ЗаявкаСтроки.Количество ЗаявкаСтрокиКоличество
     , Журнал.IDDOC [Документ $Документ]
     , Журнал.DOCNO Документ_ном
     , NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101') Документ_дата
     , Журнал.IDDOCDEF [Документ_вид $ВидДокументаПредставление]
     , $Заявка.Контрагент [ЗаявкаКонтрагент $Справочник.Контрагенты]
     , $РеализацияПродукцииСтроки.Количество РеализацияПродукцииСтрокиКоличество
FROM $ДокументСтроки.Заявка AS ЗаявкаСтроки With (NOLOCK)
     LEFT OUTER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ЗаявкаСтроки.IDDOC = Журнал.IDDOC
     LEFT OUTER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON $ЗаявкаСтроки.Товар = Номенклатура.ID
     LEFT OUTER JOIN $Документ.Заявка AS Заявка With (NOLOCK) ON ЗаявкаСтроки.IDDOC = Заявка.IDDOC
     LEFT OUTER JOIN $Документ.РеализацияПродукции AS РеализацияПродукции With (NOLOCK) ON $ВидДокумента36.Заявка + ЗаявкаСтроки.IDDOC = РеализацияПродукции.$ОбщийРеквизит.ДокументОснование
     LEFT OUTER JOIN $ДокументСтроки.РеализацияПродукции AS РеализацияПродукцииСтроки With (NOLOCK) ON
$ЗаявкаСтроки.Товар = $РеализацияПродукцииСтроки.Товар AND РеализацияПродукции.IDDOC = РеализацияПродукцииСтроки.IDDOC
     LEFT JOIN _1SJOURN AS Журнал1 With (NOLOCK) ON РеализацияПродукции.IDDOC = Журнал1.IDDOC
WHERE (Номенклатура.ID = :Выбтовар)
     AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) = :ДатаНач)
     AND ((Журнал.CLOSED & 1) = 1)

как правильно поставить условие на то, чтобы документ реализация отбирался только проведенный?
если я добавлю строчку
AND ((Журнал1.CLOSED & 1) = 1)
то теряются заявки у которых нет реализаций!
  
Наверх
 
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: условие для двух журналов в запросе
Ответ #1 - 15. Августа 2011 :: 11:13
Печать  
LEFT JOIN _1SJOURN AS Журнал1 With (NOLOCK) ON РеализацияПродукции.IDDOC = Журнал1.IDDOC AND ((Журнал1.CLOSED & 1) = 1)
  
Наверх
 
IP записан
 
Evga
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 35
Зарегистрирован: 05. Мая 2011
Re: условие для двух журналов в запросе
Ответ #2 - 15. Августа 2011 :: 11:27
Печать  
такое ощущение, что это условие в соединении игнорируется
  
Наверх
 
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: условие для двух журналов в запросе
Ответ #3 - 15. Августа 2011 :: 11:38
Печать  
Если это условие:
LEFT OUTER JOIN $Документ.РеализацияПродукции AS РеализацияПродукции With (NOLOCK) ON $ВидДокумента36.Заявка + ЗаявкаСтроки.IDDOC = РеализацияПродукции.$ОбщийРеквизит.ДокументОснование

у Вас срабатывает и Вы в этом уверены, то сработает условие и на Жур1
  
Наверх
 
IP записан
 
Evga
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 35
Зарегистрирован: 05. Мая 2011
Re: условие для двух журналов в запросе
Ответ #4 - 15. Августа 2011 :: 11:45
Печать  
да, срабатывает. я подобрал документы. есть документ заявка и на основании ее документ реализация. в отчете одна строка, РеализацияПродукцииСтрокиКоличество=1. все правильно.
Далее снимаю проведение с реализации.
в отчете так же 1 строка - это правильно, но РеализацияПродукцииСтрокиКоличество=1 все равно! а это уже неправильно
  
Наверх
 
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: условие для двух журналов в запросе
Ответ #5 - 15. Августа 2011 :: 11:56
Печать  
Замени
LEFT JOIN _1SJOURN AS Журнал1 With (NOLOCK) ON РеализацияПродукции.IDDOC = Журнал1.IDDOC AND ((Журнал1.CLOSED & 1) = 1)

на
INNER JOIN _1SJOURN AS Журнал1 With (NOLOCK) ON РеализацияПродукции.IDDOC = Журнал1.IDDOC AND ((Журнал1.CLOSED & 1) = 1)
  
Наверх
 
IP записан
 
Evga
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 35
Зарегистрирован: 05. Мая 2011
Re: условие для двух журналов в запросе
Ответ #6 - 15. Августа 2011 :: 11:59
Печать  
то же самое
  
Наверх
 
IP записан
 
Evga
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 35
Зарегистрирован: 05. Мая 2011
Re: условие для двух журналов в запросе
Ответ #7 - 15. Августа 2011 :: 12:01
Печать  
а, нет, простите. не то же самое. вообще строчек нет в результате
  
Наверх
 
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: условие для двух журналов в запросе
Ответ #8 - 15. Августа 2011 :: 12:12
Печать  
Что-то не то. Попробуйте:

FROM $ДокументСтроки.Заявка AS ЗаявкаСтроки With (NOLOCK)
     INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ЗаявкаСтроки.IDDOC = Журнал.IDDOC
     INNER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON $ЗаявкаСтроки.Товар = Номенклатура.ID
     INNER JOIN $Документ.Заявка AS Заявка With (NOLOCK) ON ЗаявкаСтроки.IDDOC = Заявка.IDDOC
     LEFT  JOIN $Документ.РеализацияПродукции AS РеализацияПродукции With (NOLOCK) ON $ВидДокумента36.Заявка + ЗаявкаСтроки.IDDOC = РеализацияПродукции.$ОбщийРеквизит.ДокументОснование
     LEFT  JOIN $ДокументСтроки.РеализацияПродукции AS РеализацияПродукцииСтроки With (NOLOCK) ON
$ЗаявкаСтроки.Товар = $РеализацияПродукцииСтроки.Товар AND РеализацияПродукции.IDDOC = РеализацияПродукцииСтроки.IDDOC
     INNER JOIN _1SJOURN AS Журнал1 With (NOLOCK) ON РеализацияПродукции.IDDOC = Журнал1.IDDOC
  
Наверх
 
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: условие для двух журналов в запросе
Ответ #9 - 15. Августа 2011 :: 12:13
Печать  
(7) А, другое дело. А что-то должно быть?
  
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: условие для двух журналов в запросе
Ответ #10 - 15. Августа 2011 :: 12:15
Печать  
CASE WHEN Журнал1.CLOSED & 1 = 1 THEN $РеализацияПродукцииСтроки.Количество ELSE 0 END as РеализацияПродукцииСтрокиКоличество
  
Наверх
IP записан
 
Evga
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 35
Зарегистрирован: 05. Мая 2011
Re: условие для двух журналов в запросе
Ответ #11 - 15. Августа 2011 :: 12:19
Печать  
так вышла одна строчка. добавляю and ((Журнал1.CLOSED & 1) = 1)
и уже ниодной строчки.
вывел поле Журнал1.DOCNO AS НомерРеализации
номер правильный показывает
  
Наверх
 
IP записан
 
Evga
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 35
Зарегистрирован: 05. Мая 2011
Re: условие для двух журналов в запросе
Ответ #12 - 15. Августа 2011 :: 12:25
Печать  
Спасибо за помощь, case помог
  
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: условие для двух журналов в запросе
Ответ #13 - 15. Августа 2011 :: 12:30
Печать  
и я бы прислушался к val и где возможно поменял бы left join на inner join
  
Наверх
IP записан
 
Evga
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 35
Зарегистрирован: 05. Мая 2011
Re: условие для двух журналов в запросе
Ответ #14 - 15. Августа 2011 :: 12:37
Печать  
val, Должны быть строки с заявками всегда, а реализация только если есть она, введеная на основании.

villy, что изменить в глобальном смысле Inner? результат насколько я вижу одинаковый. это увеличит скорость?
  
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: условие для двух журналов в запросе
Ответ #15 - 15. Августа 2011 :: 12:42
Печать  
Evga писал(а) 15. Августа 2011 :: 12:37:
это увеличит скорость?

угу
  
Наверх
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: условие для двух журналов в запросе
Ответ #16 - 15. Августа 2011 :: 13:10
Печать  
(14) Я так и написал.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: условие для двух журналов в запросе
Ответ #17 - 16. Августа 2011 :: 05:02
Печать  
Если хочешь видеть всё - то 2 запроса  и union all
иначе, коррелированный подзапрос делай.
А так, если вставишь условие в ветку where - превратишь автоматом left join в inner join, который автоматом все лефт джоины сделает inner - потеряешь часть документов.

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


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: условие для двух журналов в запросе
Ответ #18 - 17. Августа 2011 :: 02:37
Печать  
And IsNull(Журнал1.CLOSED&1, 1) = 1

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: условие для двух журналов в запросе
Ответ #19 - 17. Августа 2011 :: 04:38
Печать  
Конечно нет. При непроведенном документе ты автоматом вырезаешь из выборки 2-ой вид документа.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: условие для двух журналов в запросе
Ответ #20 - 17. Августа 2011 :: 05:11
Печать  
По моему Satans Claws в посте 18 прав
And IsNull(Журнал1.CLOSED&1, 1) = 1
Если Документ реализации не найден то
Журнал1.CLOSED "имеет значение" NULL и
IsNull(Журнал1.CLOSED&1, 1) возвращает 1 т.е в этом случае попадают в выборку все документы без реализации
a само условие как бы трансформируется в AND 1 = 1
если есть документ реализация то
Журнал1.CLOSED "имеет значение"  не NULL
и IsNull(Журнал1.CLOSED&1, 1) в этом случае эквивалентно Журнал1.CLOSED&1
а само условие как  бы трансформируется в AND Журнал1.CLOSED&1 = 1


Только если подходить еще чуть строже то надо убрать неявное преобразование типов и написать так
Код
Выбрать все
And IsNull(cast(Журнал1.CLOSED&1 as int), 1) = 1 


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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: условие для двух журналов в запросе
Ответ #21 - 17. Августа 2011 :: 05:13
Печать  
Ну-ну..
Цитата:
При непроведенном документе ты автоматом вырезаешь из выборки 2-ой вид документа.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: условие для двух журналов в запросе
Ответ #22 - 17. Августа 2011 :: 05:18
Печать  
Eprst писал(а) 17. Августа 2011 :: 05:13:
Ну-ну..
Цитата:
При непроведенном документе ты автоматом вырезаешь из выборки 2-ой вид документа.

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

PS  Eprst Я как бы понимаю твою логику но точно не знаю какая задача решаетсяизначально в твоей постановке ( добавляем
заявку Всегда и если есть проведенная реализация то и ее добавляем ) или как думаю я добавляем заявку без реализации
и заявку у которой есть проведенная реализация.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: условие для двух журналов в запросе
Ответ #23 - 17. Августа 2011 :: 05:35
Печать  
На сколько я понял, нужны все заявки (с реализацией и без)
+ все проведенные реализации.

Если наложишь фильтр на реализации (не важно какой) - потеряешь часть заявок.
Как-то так, отсюда делаем вывод - что проще union all слепить и не парится.

Если нужна связь - заявка-реализация в соседних колонках, то коррелированным подзапросом слепить..
Как-то так..
не ?
Улыбка
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: условие для двух журналов в запросе
Ответ #24 - 17. Августа 2011 :: 08:14
Печать  
Ну, с исходной задачей действительно вопрос.

Если нужно показать количество из заявки и (количество из проведенной реализации|0 если реализации нет или она не проведена), то лучше всего, наверено сделать так:

   изнулл(ПродажаТЧ.Количество, 0)
Фром
   _1СЖурн жЗаявки
   Лефт Джойн Документ.Заявка Заявка по идДок = идДок
   Лефт Джойн ДокументСтроки.Заявка ЗаявкаТЧ по идДок = идДок
   Лефт Джойн Документ.Реализация Продажа по ДокументОснование = жЗаявки.идДок
   Лефт Джойн _1СЖурн жПродажи по идДок = идДок И Клозед&1 = 1
   Лефт Джойн ДокументСтроки.Реализация ПродажаТЧ по идДок = жПродажи.идДок И Товар = Товар
Вэрэ
ЗаявкаТЧ.Товар = :ВыбТовар
И ДатаДок = НачДата


Т.е. если продажа есть, но не проведена - жПродажи присоединит Нулл. А к Нулл-у продажаТЧ не сможет ничего присоединить

Опять же, это будет работать только при условии уникальности товара в табличных частях заявки и реализации.

К топикстартеру:
рекомендую у реквизита ДокументОснование поставить галку "отбор".
Правда, придется переписывать все прямые запросы, где он используется - ибо реквизит будет жить в таблице _1СЖурн.
В идеале - к нему еще делается общий реквизит документов с отбором идДок13, заполнение которого вешается на скулевый триггер, например (тока надо не забывать обновлять триггер при появлении новых видов документов).
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать