Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Как правильно использовать CASE? (число прочтений - 2638 )
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Как правильно использовать CASE?
03. Октября 2012 :: 05:59
Печать  
Есть документ, у которого реквизит шапки "Перемещение" равен 0 или 1. Если = 0, тогда нужно вернуть значение реквизита "Контрагент" с типом Спр.Контрагенты, иначе вернуть значение реквизита "СкладПолучатель" типа Спр.Склады

Должно быть что-то вроде:
CASE
WHEN $ДокРез.Перемещение = 0 THEN $ДокРез.Контрагент [Получатель $Справочник.Контрагенты]
ELSE $ДокРез.СкладПолучатель [Получатель $Справочник.Склады]
END

выдает ошибку:
Неправильный синтаксис около конструкции "Получатель $Справочник.Контрагенты

Как правильно?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Как правильно использовать CASE?
Ответ #1 - 03. Октября 2012 :: 06:18
Печать  
Foma писал(а) 03. Октября 2012 :: 05:59:
Должно быть что-то вроде:
CASE
WHEN $ДокРез.Перемещение = 0 THEN $ДокРез.Контрагент [Получатель $Справочник.Контрагенты]
ELSE $ДокРез.СкладПолучатель [Получатель $Справочник.Склады]
END

Как правильно?
Никак. Типизируется вся колонка одним типом и уж точно не внутри условия.

Но можно поступить иначе
Код
Выбрать все
CASE
WHEN $ДокРез.Перемещение = 0 THEN $ВидСправочника.Контрагенты
ELSE $ВидСправочника.Склады
END Вид,
WHEN $ДокРез.Перемещение = 0 THEN $ДокРез.Контрагент
ELSE $ДокРез.СкладПолучатель
END Значение 

это во внутреннем запросе, а во внешнем получать Вид + Значение [Нечто $Справочник]

Идея понятна?
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Как правильно использовать CASE?
Ответ #2 - 03. Октября 2012 :: 06:39
Печать  
Понятно, спасибо
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как правильно использовать CASE?
Ответ #3 - 03. Октября 2012 :: 06:50
Печать  
CASE WHEN $ДокРез.Перемещение = 0
  THEN $ВидСправочника36.Контрагенты + $ДокРез.Контрагент
  ELSE $ВидСправочника36.Склады + $ДокРез.СкладПолучатель
END [Получатель $Справочник]
  

1&&2&&3
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Как правильно использовать CASE?
Ответ #4 - 03. Октября 2012 :: 08:25
Печать  
Спасибо, а что указывать в GROUP BY ?
Это?
CASE WHEN $ДокРез.Перемещение = 0
THEN $ВидСправочника36.Контрагенты + $ДокРез.Контрагент
ELSE $ВидСправочника36.Склады + $ДокРез.СкладПолучатель
END
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Как правильно использовать CASE?
Ответ #5 - 03. Октября 2012 :: 16:20
Печать  
Можно и это, а можно и обернуть запрос в обертку и сгруппировать уже обертку.
  
Наверх
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Как правильно использовать CASE?
Ответ #6 - 04. Октября 2012 :: 02:46
Печать  
ааааааа ... trad оптимизировал мой запрос .... ааааааа ... позор мне  Плачущий
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать