Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) проблемы с оперированием is null (число прочтений - 4234 )
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
проблемы с оперированием is null
24. Марта 2009 :: 11:29
Печать  
Код
Выбрать все
select
СпрК.id as [Контрагент $Справочник.Контрагенты],  
ДокСчет.iddoc as [ПоследнийСчет $Документ.Счет]
from $Справочник.Контрагенты СпрК
left join $Документ.Счет ДокСчет on СпрК.id=$ДокСчет.Контрагент
left join 1sjourn Жур on Жур.iddoc=ДокСчет.iddoc		  
where dtos(Жур.Date)+Жур.Time in
(	select
Max(dtos(Жур1.Date)+Жур1.Time) ДатаВремяСчета
from $Документ.Счет ДокСчет1
inner join 1sjourn Жур1 on Жур1.iddoc=ДокСчет1.iddoc
where $ДокСчет1.Контрагент=$ДокСчет.Контрагент )  
order by СпрК.descr
 



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


« Последняя редакция: 24. Марта 2009 :: 17:31 - ol »  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: хитрый запрос - зашел в тупик
Ответ #1 - 24. Марта 2009 :: 11:31
Печать  
да, если записать так:

Код
Выбрать все
select
СпрК.id as [Контрагент $Справочник.Контрагенты],
ДокСчет.iddoc as [ПоследнийСчет $Документ.Счет]
from $Справочник.Контрагенты СпрК
left join $Документ.Счет ДокСчет on СпрК.id=$ДокСчет.Контрагент
left join 1sjourn Жур on Жур.iddoc=ДокСчет.iddoc
and dtos(Жур.Date)+Жур.Time in
(	select
Max(dtos(Жур1.Date)+Жур1.Time) ДатаВремяСчета
from $Документ.Счет ДокСчет1
inner join 1sjourn Жур1 on Жур1.iddoc=ДокСчет1.iddoc
where $ДокСчет1.Контрагент=$ДокСчет.Контрагент )
order by СпрК.descr

 



ругается, что:

Цитата:
FAILED! ICommandText::Execute(): SQL: Queries of this type are not supported.
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: хитрый запрос - зашел в тупик
Ответ #2 - 24. Марта 2009 :: 11:32
Печать  
т.е. вместо where в (1) - and
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: хитрый запрос - зашел в тупик
Ответ #3 - 24. Марта 2009 :: 12:12
Печать  
сделать по два соединения
на одно условие not null, на другое is null
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: хитрый запрос - зашел в тупик
Ответ #4 - 24. Марта 2009 :: 12:27
Печать  
уря - заработало )
спасибо, натолкнул на мысль





Код
Выбрать все
select
СпрК.id as [Контрагент $Справочник.Контрагенты],
ДокСчет.iddoc as [ПоследнийСчет $Документ.Счет]
from $Справочник.Контрагенты СпрК
left join $Документ.Счет ДокСчет on СпрК.id=$ДокСчет.Контрагент
left join 1sjourn Жур on Жур.iddoc=ДокСчет.iddoc
where dtos(Жур.Date)+Жур.Time in
(	select
Max(dtos(Жур1.Date)+Жур1.Time) ДатаВремяСчета
from $Документ.Счет ДокСчет1
inner join 1sjourn Жур1 on Жур1.iddoc=ДокСчет1.iddoc
where $ДокСчет1.Контрагент=$ДокСчет.Контрагент )
or Жур.iddoc is null
order by СпрК.descr
 



проблема была в том, что вначале писал

or Жур.iddoc = null

начинающий, что сказать
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: хитрый запрос - зашел в тупик
Ответ #5 - 24. Марта 2009 :: 17:22
Печать  
гм - вот и не ура ((

если написать запрос

Код
Выбрать все
select
СпрК.id as [Контрагент $Справочник.Контрагенты],  
ДокСчет.iddoc as [ПоследнийСчет $Документ.Счет]
from $Справочник.Контрагенты СпрК
left join $Документ.Счет ДокСчет on СпрК.id=$ДокСчет.Контрагент
left join 1sjourn Жур on Жур.iddoc=ДокСчет.iddoc		  

where
dtos(Жур.Date)+Жур.Time in
(	select
Max(dtos(Жур1.Date)+Жур1.Time) ДатаВремяСчета
from $Документ.Счет ДокСчет1
inner join 1sjourn Жур1 on Жур1.iddoc=ДокСчет1.iddoc
and Жур1.IsMark=''
where $ДокСчет1.Контрагент=$ДокСчет.Контрагент )  
or Жур.iddoc is null

order by СпрК.descr

 




т.е. добавить
...
and Жур1.IsMark=''
...
то в результате будут отсутствовать контрагенты, у которых все счета помечены на удаление.
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: хитрый запрос - зашел в тупик
Ответ #6 - 24. Марта 2009 :: 17:28
Печать  
м. даже проще написать

Код
Выбрать все
select
СпрК.id as [Контрагент $Справочник.Контрагенты],
ДокСчет.iddoc as [ПоследнийСчет $Документ.Счет]
from $Справочник.Контрагенты СпрК
left join $Документ.Счет ДокСчет on СпрК.id=$ДокСчет.Контрагент
left join 1sjourn Жур on Жур.iddoc=ДокСчет.iddoc
where
Жур.IsMark=''
or Жур.iddoc is null
order by СпрК.descr

 



и в этом случае в выборке отсутствуют контрагенты, у которых все счета помечены на удаление, а те у которых вообще нет счетов - присутствуют
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: проблемы с оперированием is null
Ответ #7 - 25. Марта 2009 :: 07:58
Печать  
Да, а вот потом из-за таких запросов и говорят, что 1С - тормоз.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: проблемы с оперированием is null
Ответ #8 - 25. Марта 2009 :: 09:06
Печать  
Попробуй такой запрос:
Код
Выбрать все
select
ск.id [Контрагент $Справочник.Контрагенты],
right (т.Поз, 9) [ПоследнийСчет $Документ.Счет]
from $Справочник.Контрагенты ск left join
(
select $дс.Контрагент Клиент,
max(dtos(Ж.date) + Ж.time + Ж.iddoc) Поз
from $Документ.Счет дс left join 1sjourn Ж on дс.iddoc = Ж.iddoc
where Ж.ismark=' '
group by $дс.Контрагент
) т on т.Клиент = ск.id
 



так по крайней мере по таблице шапки счетов будет только один проход.
Правда писал я под 1sqlite, он right join не поддерживает.
Ща еще подумаю, как оптимизнуть.
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: проблемы с оперированием is null
Ответ #9 - 25. Марта 2009 :: 09:21
Печать  
ага, вечером попробую
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: проблемы с оперированием is null
Ответ #10 - 25. Марта 2009 :: 09:42
Печать  
Вот еще как можно, наверное лучший вариант
Код
Выбрать все
select
ск.id [Контрагент $Справочник.Контрагенты],
(
select top 1
childid
from 1scrdoc cr inner join 1sjourn Ж on cr.childid = Ж.iddoc
where Ж.iddocdef = $ВидДокумента36.Счет and Ж.ismark = ' '
and cr.mdid = $ГрафаОтбора36.Контрагент and
cr.parentval = 'B1' + $ВидСправочника36.Контрагенты + ск.id + '	  '
order by (mdid + parentval + CHILDDATE + CHILDTIME + CHILDID) desc
) [ПоследнийСчет $Документ.Счет]
from $Справочник.Контрагенты ск
order by ск.descr
 


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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: проблемы с оперированием is null
Ответ #11 - 25. Марта 2009 :: 17:41
Печать  
спасибо, шикарные запросы  Улыбка по скорости они примерно одинаково выполняются, и раза в 2 быстрее моего, но что главное - правильно выполняют то, что требуется и не требуют заморачиваться с is null

  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: проблемы с оперированием is null
Ответ #12 - 26. Марта 2009 :: 07:07
Печать  
а я продолжаю так сказать тупить
проблемы продолжаются. Задача усложнилась -
нужно получить не один счет, а все счета с максимальной выписанной датой (например, есть несколько счетов с датой 01.01.09, (все остальные счета раньше), и нужно их получить в запросе
и возвращаюсь обратно к своей процедуре и проблемой с is null  Улыбка

Код
Выбрать все
select
СпрК.id as [Контрагент $Справочник.Контрагенты],  
ДокСчет.iddoc as [ПоследнийСчет $Документ.Счет]
from $Справочник.Контрагенты СпрК
left join $Документ.Счет ДокСчет on СпрК.id=$ДокСчет.Контрагент
left join 1sjourn Жур on Жур.iddoc=ДокСчет.iddoc		  
where
Жур.Date in
(	select
Max(Жур1.Date)
from $Документ.Счет ДокСчет1
inner join 1sjourn Жур1 on Жур1.iddoc=ДокСчет1.iddoc
and Жур1.IsMark=''
where $ДокСчет1.Контрагент=$ДокСчет.Контрагент )  
or Жур.iddoc is null
order by СпрК.descr
 



и снова - в выборке отсутствуют контрагенты, у которых все счета помечены на удаление
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: проблемы с оперированием is null
Ответ #13 - 26. Марта 2009 :: 09:23
Печать  
ol писал(а) 26. Марта 2009 :: 07:07:
а я продолжаю так сказать тупить
проблемы продолжаются. Задача усложнилась -
нужно получить не один счет, а все счета с максимальной выписанной датой (например, есть несколько счетов с датой 01.01.09, (все остальные счета раньше), и нужно их получить в запросе
и возвращаюсь обратно к своей процедуре и проблемой с is null  Улыбка

Код
Выбрать все
select
СпрК.id as [Контрагент $Справочник.Контрагенты],  
ДокСчет.iddoc as [ПоследнийСчет $Документ.Счет]
from $Справочник.Контрагенты СпрК
left join $Документ.Счет ДокСчет on СпрК.id=$ДокСчет.Контрагент
left join 1sjourn Жур on Жур.iddoc=ДокСчет.iddoc		  
where
Жур.Date in
(	select
Max(Жур1.Date)
from $Документ.Счет ДокСчет1
inner join 1sjourn Жур1 on Жур1.iddoc=ДокСчет1.iddoc
and Жур1.IsMark=''
where $ДокСчет1.Контрагент=$ДокСчет.Контрагент )  
or Жур.iddoc is null
order by СпрК.descr
 



и снова - в выборке отсутствуют контрагенты, у которых все счета помечены на удаление

так убери проверку
Код
Выбрать все
and Жур1.IsMark='' 



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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: проблемы с оперированием is null
Ответ #14 - 26. Марта 2009 :: 10:02
Печать  
тогда в выборку попадут помеченные на удаление счета  Улыбка
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: проблемы с оперированием is null
Ответ #15 - 26. Марта 2009 :: 10:18
Печать  
ol писал(а) 26. Марта 2009 :: 10:02:
тогда в выборку попадут помеченные на удаление счета  Улыбка

(ИХМО) так как таких ( счетов помеченных на удаление) должно быть
мало то не показывай такие счета на этапе вывода запроса на печать
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: проблемы с оперированием is null
Ответ #16 - 26. Марта 2009 :: 11:04
Печать  
Z1 писал(а) 26. Марта 2009 :: 10:18:
ol писал(а) 26. Марта 2009 :: 10:02:
тогда в выборку попадут помеченные на удаление счета  Улыбка

(ИХМО) так как таких ( счетов помеченных на удаление) должно быть
мало то не показывай такие счета на этапе вывода запроса на печать


да это понятно; просто хочется максимум полезного получить от запроса
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: проблемы с оперированием is null
Ответ #17 - 26. Марта 2009 :: 14:34
Печать  
Z1 писал(а) 26. Марта 2009 :: 10:18:
ol писал(а) 26. Марта 2009 :: 10:02:
тогда в выборку попадут помеченные на удаление счета  Улыбка

(ИХМО) так как таких ( счетов помеченных на удаление) должно быть
мало то не показывай такие счета на этапе вывода запроса на печать

Не так все просто.
"Не выводить последний счет, если он помечен на удаление" <> "Вывести последний счет, не помеченный на удаление"
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: проблемы с оперированием is null
Ответ #18 - 26. Марта 2009 :: 16:00
Печать  
гм, а действительно, если последний счет помечен на удаление, и его не вывести на печать, то мы не увидим предпоследний счет, не помеченный на удаление
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: проблемы с оперированием is null
Ответ #19 - 26. Марта 2009 :: 16:13
Печать  
попытался подойти с другой стороны - результат получился аналогичный

Код
Выбрать все
select
СпрК.id as [Контрагент $Справочник.Контрагенты],
ДокСчет.iddoc as [ПоследнийСчет $Документ.Счет]
from $Документ.Счет ДокСчет

inner join 1sjourn Жур on Жур.iddoc=ДокСчет.iddoc
right join $Справочник.Контрагенты СпрК on СпрК.id=$ДокСчет.Контрагент

where
(Жур.Date in
(	select
Max(Жур1.Date)
from $Документ.Счет ДокСчет1
inner join 1sjourn Жур1 on Жур1.iddoc=ДокСчет1.iddoc
and Жур1.IsMark=''
where $ДокСчет1.Контрагент=$ДокСчет.Контрагент )  
and Жур.IsMark='')

or Жур.iddoc is null
order by СпрК.descr		    

 



еще пытался применить что то типа
count(ДокСчет.iddoc) - и тут ничего не вышло
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать