Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) проблемы с оперированием is null (число прочтений - 4159 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать