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


1C++ rocks!

Сообщений: 3
Зарегистрирован: 02. Августа 2010
Помогите с запросом пожалуйста
09. Сентября 2012 :: 17:17
Печать  
Написал запрос:

     |select
     |            $Спр.Договор [Дог $Справочник.Договоры],
     |            sum(Проводки.sum_)    [Сум]
     |from 
     |   $Справочник.ДоговорыОПС as Спр (nolock)
     |      LEFT JOIN _1sentry as Проводки (nolock) ON Проводки.dtsc1 = $Спр.Договор
     |      LEFT JOIN _1SACCS as Deb (nolock) ON Deb.ID = Проводки.ACCDTID
    |where   
     |      $ПоследнееЗначение.ДоговорыОПС.СостояниеДоговора(Спр.ID,:Дат) = :Сост1
     |and
     |   Проводки.date_time_docid between :НачДата and :КонДата
     |and
     |      (Deb.SCHKOD  = 'Н01.02.01.  '    OR
     |      Deb.SCHKOD  = 'Н01.02.02.  ' OR
     |      Deb.SCHKOD  = 'Н01.02.03.  ' OR
     |      Deb.SCHKOD  = 'Н01.02.04.  ' )
     |AND
     |      (Проводки.dtsc1 IS NULL)
     |group by
     |      $Спр.Договор";
Задача - получить договоры, по которым нет проводок. Запрос пустой. Подскажите плиз, что не так делаю.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Помогите с запросом пожалуйста
Ответ #1 - 10. Сентября 2012 :: 02:17
Печать  
Начни с того, что сравни типы полей $Спр.Договор и Проводки.dtsc1. В обоих ли отсутствует типизация по виду?
Просто, если ты пытаешься id9 сравнивать с id13, то они никогда не будут равными...
Это раз, а два: конструкции OR следует ВСЕГДА обрамлять скобками!
Т.е. не (exp1 = exp2 OR exp3 = exp4), а ((exp1 = exp2) OR (exp3 = exp4)). С этим часто бывают проблемы...
Хотя, в твоем случае правильнее OR вообще заменить на IN.
И третье: проанализируй свои таблицы. Я на 99% уверен, что условие (Проводки.dtsc1 IS NULL) никогда не выполнится ... скорее всего тебе надо будет туда ПустойИД13 передать, а не NULL.
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Помогите с запросом пожалуйста
Ответ #2 - 10. Сентября 2012 :: 14:17
Печать  
Используй класс AccountsRecordset. Он очень удобен для работы с бух.проводками.
Получи все движения, где есть договора, а потом этот запрос загони в ограничение NOT EXISTS
То есть
SELECT спрДоговора.ID
FROM $Справочник.Договора AS спрДоговора
WHERE NOT EXISTS
(запрос на получение всех движений, где есть договора)
  
Наверх
 
IP записан
 
Yurich
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 02. Августа 2010
Re: Помогите с запросом пожалуйста
Ответ #3 - 18. Сентября 2012 :: 19:00
Печать  
Использовал вариант такого типа:
AND $Спр.Договор Not IN (
     SELECT
        Проводки.dtsc1
     FROM
       _1sentry as Проводки (nolock)
        ....
     WHERE
        ....
   )

Все получилось.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом пожалуйста
Ответ #4 - 20. Сентября 2012 :: 06:29
Печать  
лучше не нот ин, а exists делать
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать