Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Фильтр в запросе по РЕКВИЗИТУ (число прочтений - 2147 )
BorisHighLander
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 10. Декабря 2007
Пол: Мужской
Фильтр в запросе по РЕКВИЗИТУ
20. Июня 2008 :: 11:51
Печать  
"Популярный" вопрос - фильтр по реквизиту в прямом запросе.
Есть регистр "ПартииТоваров", отчет может строиться по всем проданным товарам, по товарам проданным на распродаже и все без товаров на распродаже.
Товары на распродаже в движениях регистра отличаются Реквизитом КодОперации - "Р" или "Б".
Почитав форум сделал таким образом:
Структура регистра:
      Измерения:
                Товар
                Диск
                Ячейка
                Поставщик
      Ресурсы:
                ОстатокТовара
                Стоимость
      Реквизиты:
                 КодОперации

Запрос:

SELECT
     Рег.Товар [Товар $Справочник.Номенклатура]
     , Sum(Рег.ОстатокТовараРасход) Расход
     , Sum(Рег.ОстатокТовараКонечныйОстаток) Остаток
     , Sum(Рег.СтоимостьРасход) СуммаРасход
     , ВсеДоки.IDDoc as [Док $Документ]
     , ВсеДоки.IDDocDef as Док_вид
     , $Номенклатура.Поставщик [Поставщик $Справочник.Контрагенты]
FROM $РегистрОстаткиОбороты.ПартииТоваров(:НачДата
           ,      :КонДата~
           ,      Document
           ,  
           ,      
           INNER JOIN $Регистр.ПартииТоваров AS ПартииТоваров ON Товар = $ПартииТоваров.Товар
           AND (($ПартииТоваров.КодОперации = :КодОперации_Р)
                        OR($ПартииТоваров.КодОперации = :КодОперации_Б))

           ,      
           ,      (Товар, Поставщик)
           ,      (ОстатокТовара, Стоимость)) AS Рег
LEFT JOIN _1SJourn as ВсеДоки ON right(Рег.ПозицияДокумента,9) =  ВсеДоки.IDDoc
INNER JOIN $Справочник.Номенклатура AS Номенклатура ON Рег.Товар = Номенклатура.ID
WHERE
     ОстатокТовараРасход > 0 AND ВсеДоки.IDDocDef = $ВидДокумента.Заказ
GROUP BY Рег.Товар, IDDoc, IDDocDef , $Номенклатура.Поставщик
ORDER BY Рег.Товар, IDDoc DESC  

Отдельно повторю блок с фильтром:
КодОперации = "Р" или "Б"
INNER JOIN $Регистр.ПартииТоваров AS ПартииТоваров ON Товар = $ПартииТоваров.Товар
     AND (($ПартииТоваров.КодОперации = :КодОперации_Р)
               OR($ПартииТоваров.КодОперации = :КодОперации_Б))


Второй вариант фильтра:
КодОперации <> "Р" и "Б"
INNER JOIN $Регистр.ПартииТоваров AS ПартииТоваров ON Товар = $ПартииТоваров.Товар
     AND (($ПартииТоваров.КодОперации <> :КодОперации_Р)
               AND ($ПартииТоваров.КодОперации <>  :КодОперации_Б))


Проблема в следующем: при отсутствии фильтра или при первом варианте - работает правильно и быстро (25-30 сек. за месяц), если использовать второй вариант фильтра то отчет строится ооочень долго(30-40 минут) и неправильно. Различие между фильтрами <> вместо = (подчеркнуто в куске кода выше) .

Помогите разобраться и исправить запрос.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Фильтр в запросе по РЕКВИЗИТУ
Ответ #1 - 20. Июня 2008 :: 12:28
Печать  
я решал проблемму след. образом:
два запроса -
ВТ Остатков и Оборотов - для получения начальных и конечных остатков;
UNION ALL
ВТ Оборотов с наложением фильтров
  
Наверх
IP записан
 
BorisHighLander
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 10. Декабря 2007
Пол: Мужской
Re: Фильтр в запросе по РЕКВИЗИТУ
Ответ #2 - 20. Июня 2008 :: 12:35
Печать  
Попробую сделать так, хотя меня очень интересует такое странное поведение запроса.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Фильтр в запросе по РЕКВИЗИТУ
Ответ #3 - 20. Июня 2008 :: 12:41
Печать  
а что тебе не понятно?
ты накладываешь фильтр соединением на таблицу остатков...
то есть у тебя будут только те остатки, по которым были обороты Улыбка
  
Наверх
IP записан
 
BorisHighLander
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 10. Декабря 2007
Пол: Мужской
Re: Фильтр в запросе по РЕКВИЗИТУ
Ответ #4 - 20. Июня 2008 :: 12:45
Печать  
Хм..., моя твоя непонимай   Печаль
Меня интересуют именно обороты, есть простые продажи и распродажи уцененных. Отчет по всем - работает, отчет только по распродажным - работает, отчет без распродажных - не работает.  Смущённый Что я делаю не так?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Фильтр в запросе по РЕКВИЗИТУ
Ответ #5 - 20. Июня 2008 :: 12:48
Печать  
Код
Выбрать все
$РегистрОстаткиОбороты 


замени на
Код
Выбрать все
$РегистрОбороты 


и переделай параметры. все заработает.
да и наложи фильтр по реквизиту в поле Условие
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Фильтр в запросе по РЕКВИЗИТУ
Ответ #6 - 20. Июня 2008 :: 12:50
Печать  
и убери соединение.
Наложи условие и убери соединение.
  
Наверх
IP записан
 
BorisHighLander
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 10. Декабря 2007
Пол: Мужской
Re: Фильтр в запросе по РЕКВИЗИТУ
Ответ #7 - 20. Июня 2008 :: 13:11
Печать  
Вечером мне думается плохо, займусь этим завтра, на свежую голову  Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать