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


1C++ rocks!

Сообщений: 10
Зарегистрирован: 15. Декабря 2010
Подскажите что не так!
15. Декабря 2010 :: 07:49
Печать  
Здравствуйте,хочу выполнить запрос по двум видам документа(Поступление и Возврат),при этом на один вид документа наложить фильтр по фирме,на другой по контрагенту,текст запроса такой:
ТекстЗапроса = "
           |
           |SELECT
           |$Рег.Фирма as [Фирма $Справочник.Фирмы],
           |$Рег.КодОперации as [Код $Перечисление.КодыОпераций],
           |Журнальчик.IDDocDef as [Видон ],
           |Sum($Рег.СуммаУпр) as [СуммаПоступ $Число]
           |FROM
           |$Регистр.ПартииНаличие as Рег WITH (NOLOCK)
           |      INNER JOIN
           |            _1Sjourn as Журнальчик
           |               ON ((Журнальчик.IDDoc = Рег.IDDoc) AND (Журнальчик.Closed & 1=1)
           |           AND (Журнальчик.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
           |                  AND Журнальчик.IDDocDef in ($ВидДокумента.ПоступлениеТМЦ, $ВидДокумента.ВозвратОтПокупателя))
           |      Left JOIN
           |            $Документ.ПоступлениеТМЦ as ДокЖ With (NoLock)
           |                  ON ДокЖ.IDDoc = Журнальчик.IDDoc
           |      Left JOIN
           |            $Документ.ВозвратОтПокупателя as ДокВ With (NoLock)
           |WHERE
           |($Рег.Номенклатура "+Вх+" IN (Select val from #Номенклатура))
           |                              and (($ОбщийРеквизит.Фирма IN (CASE
           |                                    WHEN (Журнальчик.IDDocDef=$ВидДокумента.ПоступлениеТМЦ)
           |                                  THEN :ВыбФирма
           |                               END))
           |                              or      ($ДокВ.Контрагент IN (CASE
           |                                    WHEN (Журнальчик.IDDocDef=$ВидДокумента.ВозвратОтПокупателя)
           |                                  THEN :КакКонтрагент
           |                                 END)))
     
           |GROUP BY
           |$Рег.КодОперации,
           |$Рег.Фирма,
           |Журнальчик.IDDocDef
           |"
           ;
Не пойму что не так делаю,помогите если не сложно!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подскажите что не так!
Ответ #1 - 15. Декабря 2010 :: 07:54
Печать  
--Журнальчик.Closed & 1=1  это не нужно.
А ошибка в том, что условие накладываешь на всю выборку целиком.

ЗЫ: ну и условия соединения не хватает в последнем left join
+проверяй на вид или непустое поле Док.Клиентос в условии
  
Наверх
 
IP записан
 
IoWa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 15. Декабря 2010
Re: Подскажите что не так!
Ответ #2 - 15. Декабря 2010 :: 08:35
Печать  
Исправил:
ТекстЗапроса = "
           |SELECT
           |$Рег.Фирма as [Фирма $Справочник.Фирмы],
           |$Рег.КодОперации as [Код $Перечисление.КодыОпераций],
           |Журнальчик.IDDocDef as [Видон ],
           |Sum($Рег.СуммаУпр) as [СуммаПоступ $Число]
           |FROM
           |$Регистр.ПартииНаличие as Рег WITH (NOLOCK)
           |      INNER JOIN
           |            _1Sjourn as Журнальчик
           |               ON ((Журнальчик.IDDoc = Рег.IDDoc)
           |           AND (Журнальчик.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
           |                  AND (Журнальчик.IDDocDef in ($ВидДокумента.ПоступлениеТМЦ, $ВидДокумента.ВозвратОтПокупателя)))
           |      Left JOIN
           |            $Документ.ПоступлениеТМЦ as ДокЖ With (NoLock)
           |                  ON ((ДокЖ.IDDoc = Журнальчик.IDDoc)
           |                        and ($ОбщийРеквизит.Фирма=:ВыбФирма))
           |      Left JOIN
           |            $Документ.ВозвратОтПокупателя as ДокВ With (NoLock)
           |                  ON ((ДокВ.IDDoc = Журнальчик.IDDoc)
           |                        and ($ДокВ.Контрагент=:КакКонтрагент))
           |WHERE
           |$Рег.Номенклатура "+Вх+" IN (Select val from #Номенклатура)
           |GROUP BY
           |$Рег.КодОперации,
           |$Рег.Фирма
           |"
           ;
Всё равно лезут не нужные доки в выборку Печаль
  
Наверх
 
IP записан
 
IoWa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 15. Декабря 2010
Re: Подскажите что не так!
Ответ #3 - 15. Декабря 2010 :: 08:37
Печать  
удобней было бы наложить условия вообще в Inner соединении,но Контрагент не является общим реквизитом журнала.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подскажите что не так!
Ответ #4 - 15. Декабря 2010 :: 08:55
Печать  
вот так спробуй:
Код
Выбрать все
	     |SELECT
	     |$Рег.Фирма as [Фирма $Справочник.Фирмы],
	     |$Рег.КодОперации as [Код $Перечисление.КодыОпераций],
	     |Рег.IDDoc as [Док $Документ],
		   |Журнальчик.IDDocDef as Док_вид,

	     |Sum($Рег.СуммаУпр) as [СуммаПоступ $Число]
	     |FROM
	     |   $Регистр.ПартииНаличие as Рег (NOLOCK)
	     |INNER JOIN
	     |  _1Sjourn as Журнальчик  ON Журнальчик.IDDoc = Рег.IDDoc
	     |	  AND Журнальчик.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~
	     |	  AND Журнальчик.IDDocDef in ($ВидДокумента.ПоступлениеТМЦ, $ВидДокумента.ВозвратОтПокупателя)
	     |   Left JOIN
		   |	 $Документ.ПоступлениеТМЦ as ДокЖ (NoLock) ON ДокЖ.IDDoc = Журнальчик.IDDoc
	     |   Left JOIN
	     |	  $Документ.ВозвратОтПокупателя as ДокВ  (NoLock) ON ДокВ.IDDoc = Журнальчик.IDDoc
		   |WHERE
	     |    $Рег.Номенклатура "+Вх+" IN (Select val from #Номенклатура)
		   |    AND
		   |	 CASE
		   |	    WHEN Журнальчик.IDDocDef=$ВидДокумента.ПоступлениеТМЦ THEN
		   |		  CASE WHEN $ОбщийРеквизит.Фирма IN (:ВыбФирма) THEN 1
		   |		  ELSE 0 END
		   |	    ELSE
		   |		  CASE WHEN $ДокВ.Контрагент IN (:КакКонтрагент) THEN  1
		   |		  ELSE 0 END
		   |	  END = 1
	     |GROUP BY
	     |$Рег.КодОперации,$Рег.Фирма,Рег.IDDoc,Журнальчик.IDDocDef 

  
Наверх
 
IP записан
 
IoWa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 15. Декабря 2010
Re: Подскажите что не так!
Ответ #5 - 15. Декабря 2010 :: 09:12
Печать  
Спасибо большое работает,только не понятно
(CASE
           |          WHEN Журнальчик.IDDocDef=$ВидДокумента.ПоступлениеТМЦ THEN
           |              CASE WHEN $ОбщийРеквизит.Фирма IN (:ВыбФирма) THEN 1
           |              ELSE 0 END
           |          ELSE
           |              CASE WHEN $ДокВ.Контрагент IN (:КакКонтрагент) THEN  1
           |              ELSE 0 END
           |        END = 1)
Объясните если не трудно по поводу 1 и 0!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подскажите что не так!
Ответ #6 - 15. Декабря 2010 :: 09:22
Печать  
IoWa писал(а) 15. Декабря 2010 :: 09:12:
Спасибо большое работает,только не понятно
(CASE
           |          WHEN Журнальчик.IDDocDef=$ВидДокумента.ПоступлениеТМЦ THEN
           |              CASE WHEN $ОбщийРеквизит.Фирма IN (:ВыбФирма) THEN 1
           |              ELSE 0 END
           |          ELSE
           |              CASE WHEN $ДокВ.Контрагент IN (:КакКонтрагент) THEN  1
           |              ELSE 0 END
           |        END = 1)
Объясните если не трудно по поводу 1 и 0!


Да обычное условие, если вид документа = поступление, тогда если общий реквизит фирма в списке фирм - возврат 1, иначе 0..
иначе, если вид документа не поступление (возврат), тогда если клиентос = нужному возврат 1 иначе 0..

далеее обычное условие 1= (наше выражение с case, которое возвращает 1 или 0)..

Ты просто в зависимости от вида документа либо сравниваешь фирму, либо клиентоса.

А в (0) у тебя была проверка для всех строк.. т.е там где клиентоса вообще нет - ты сравниваешь в in - это всегда ложь..
  
Наверх
 
IP записан
 
IoWa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 15. Декабря 2010
Re: Подскажите что не так!
Ответ #7 - 15. Декабря 2010 :: 09:23
Печать  
Ясно,спасибо ещё раз!
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать