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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Сравнение с перечислением
18. Июня 2012 :: 07:31
Печать  
В запрос вида:

Код
Выбрать все
текстЗапроса = "
	|SELECT
	|	Класификаторы.CODE КодКласификатора,
	|	$СвязиКласификаторов.ТипЭлемента [ТипЭлемента $Перечисление.сфТипЭлементаСвязиКлассификатора],
	|	КодЭлемента =
	|	CASE
	|		WHEN $СвязиКласификаторов.ТипЭлемента = $Перечисление.сфТипЭлементаСвязиКлассификатора.Товар THEN CAST(Номенклатура.CODE as INT)
	|		WHEN $СвязиКласификаторов.ТипЭлемента = $Перечисление.сфТипЭлементаСвязиКлассификатора.Клиент THEN CAST(Контрагенты.CODE as INT)
	|		WHEN $СвязиКласификаторов.ТипЭлемента = $Перечисление.сфТипЭлементаСвязиКлассификатора.КартаКлиента THEN Карты.CODE
	|	END
	|FROM
	|	$Справочник.сфСвязиКласификаторов СвязиКласификаторов
	|LEFT JOIN
	|	$Справочник.сфКлассификаторы Класификаторы ON Класификаторы.ID = $СвязиКласификаторов.Классификатор
	|LEFT JOIN
	|	$Справочник.Номенклатура Номенклатура ON $ВидСправочника36.Номенклатура + Номенклатура.ID = $СвязиКласификаторов.Элемент
	|LEFT JOIN
	|	$Справочник.Контрагенты Контрагенты ON $ВидСправочника36.Контрагенты + Контрагенты.ID = $СвязиКласификаторов.Элемент
	|LEFT JOIN
	|	$Справочник.сфКарты Карты ON $ВидСправочника36.сфКарты + Карты.ID = $СвязиКласификаторов.Элемент
	|WHERE
	|	СвязиКласификаторов.ismark = 0
	|";
 



тот же запрос из отладки

Код
Выбрать все
{call sp_executesql(N'
SELECT
	Класификаторы.CODE КодКласификатора,
	СвязиКласификаторов.sp42635 [ТипЭлемента $Перечисление.сфТипЭлементаСвязиКлассификатора],
	КодЭлемента =
	CASE
		WHEN СвязиКласификаторов.sp42635 = @_CP_0 THEN CAST(Номенклатура.CODE as INT)
		WHEN СвязиКласификаторов.sp42635 = @_CP_1 THEN CAST(Контрагенты.CODE as INT)
		WHEN СвязиКласификаторов.sp42635 = @_CP_2 THEN Карты.CODE
	END
FROM
	sc42638 СвязиКласификаторов
LEFT JOIN
	sc42633 Класификаторы ON Класификаторы.ID = СвязиКласификаторов.sp42634
LEFT JOIN
	sc84 Номенклатура ON @_CP_3 + Номенклатура.ID = СвязиКласификаторов.sp42636
LEFT JOIN
	sc172 Контрагенты ON @_CP_4 + Контрагенты.ID = СвязиКласификаторов.sp42636
LEFT JOIN
	sc42570 Карты ON @_CP_5 + Карты.ID = СвязиКласификаторов.sp42636
WHERE
	СвязиКласификаторов.ismark = 0
', N'@_CP_0 char(23),@_CP_1 char(23),@_CP_2 char(23),@_CP_3 char(4),@_CP_4 char(4),@_CP_5 char(4)'
,'   WWN   ','   WWO   ','   WWP   ','  2C','  4S',' WUI')}
 



Сравниваю поле sp42635 справочника СвязиКласификаторов с идентификатором значения перечисления, но не одно условие не срабатывает. Должно сработать 1 условие. Что я не так делаю??
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Сравнение с перечислением
Ответ #1 - 18. Июня 2012 :: 07:35
Печать  
     
Код
Выбрать все
--КодЭлемента =
	CASE
		WHEN СвязиКласификаторов.sp42635 = @_CP_0 THEN CAST(Номенклатура.CODE as INT)
		WHEN СвязиКласификаторов.sp42635 = @_CP_1 THEN CAST(Контрагенты.CODE as INT)
		WHEN СвязиКласификаторов.sp42635 = @_CP_2 THEN Карты.CODE
	END as КодЭлемента  

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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Сравнение с перечислением
Ответ #2 - 18. Июня 2012 :: 07:40
Печать  
Eprst писал(а) 18. Июня 2012 :: 07:35:
     
Код
Выбрать все
--КодЭлемента =
	CASE
		WHEN СвязиКласификаторов.sp42635 = @_CP_0 THEN CAST(Номенклатура.CODE as INT)
		WHEN СвязиКласификаторов.sp42635 = @_CP_1 THEN CAST(Контрагенты.CODE as INT)
		WHEN СвязиКласификаторов.sp42635 = @_CP_2 THEN Карты.CODE
	END as КодЭлемента  


не срабатывает
Переменной не присваивается код!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Сравнение с перечислением
Ответ #3 - 18. Июня 2012 :: 07:51
Печать  
CASE
           WHEN СвязиКласификаторов.sp42635 = @_CP_0 THEN CAST(Номенклатура.CODE as INT)
           WHEN СвязиКласификаторов.sp42635 = @_CP_1 THEN CAST(Контрагенты.CODE as INT)
           WHEN СвязиКласификаторов.sp42635 = @_CP_2 THEN Карты.CODE
     else 'тест на вшивость'
     END as КодЭлемента
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Сравнение с перечислением
Ответ #4 - 18. Июня 2012 :: 07:58
Печать  
И еще, есть уверенность, что лефт джоин работает у тебя ?

воткни в селект хотя бы
Номенклатура.CODE,
Контрагенты.CODE,
Карты.CODE

сдается, что там null будет везде.
Улыбка
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Сравнение с перечислением
Ответ #5 - 18. Июня 2012 :: 07:58
Печать  
Eprst писал(а) 18. Июня 2012 :: 07:51:
CASE
           WHEN СвязиКласификаторов.sp42635 = @_CP_0 THEN CAST(Номенклатура.CODE as INT)
           WHEN СвязиКласификаторов.sp42635 = @_CP_1 THEN CAST(Контрагенты.CODE as INT)
           WHEN СвязиКласификаторов.sp42635 = @_CP_2 THEN Карты.CODE
     else 'тест на вшивость'
     END as КодЭлемента  

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Сравнение с перечислением
Ответ #6 - 18. Июня 2012 :: 08:06
Печать  
см. выше
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Сравнение с перечислением
Ответ #7 - 18. Июня 2012 :: 08:14
Печать  
Eprst писал(а) 18. Июня 2012 :: 08:06:
см. выше

вот косяк!
А как прибавить к $ВидСправочника36.Контрагенты + Контрагенты.ID
Еще и то что это справочник??
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Сравнение с перечислением
Ответ #8 - 18. Июня 2012 :: 08:38
Печать  
Eprst писал(а) 18. Июня 2012 :: 07:58:
И еще, есть уверенность, что лефт джоин работает у тебя ?

воткни в селект хотя бы
Номенклатура.CODE,
Контрагенты.CODE,
Карты.CODE

сдается, что там null будет везде.
Улыбка

Вышел из положения прибавив с лева 'B1', но это не вариант.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Сравнение с перечислением
Ответ #9 - 18. Июня 2012 :: 08:55
Печать  
а в СвязиКласификаторов.Элемент, Элемент какого типа ?
<Справочник> без вида
или
<Неопределенный> ?
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Сравнение с перечислением
Ответ #10 - 18. Июня 2012 :: 09:02
Печать  
Eprst писал(а) 18. Июня 2012 :: 08:55:
а в СвязиКласификаторов.Элемент, Элемент какого типа ?
<Справочник> без вида
или
<Неопределенный> ?

Неопределенный
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Сравнение с перечислением
Ответ #11 - 18. Июня 2012 :: 09:34
Печать  
тогда только добавлением слева "типа" до 23 символьной строки, или через right обрезать до 13.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Сравнение с перечислением
Ответ #12 - 19. Июня 2012 :: 02:39
Печать  
Eprst писал(а) 18. Июня 2012 :: 09:34:
тогда только добавлением слева "типа" до 23 символьной строки, или через right обрезать до 13.

С лева я добавил лишь 'B1' и все заработало, но это не вариант. Можно как то получить это же значение по другому.
Где хранится, что 'B1' это справочник.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Сравнение с перечислением
Ответ #13 - 19. Июня 2012 :: 04:33
Печать  
Что значит, где хранится ?

вот все типы данных в 1с-ине, можешь пользовать как данность:

N-числовой
S-строка
D-дата
B-справочник
E-перечисление
O-документ
T-счет
P-план счетов
K-вид субконто
C-календарь
A-вид расчета
U-неопределенный
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Сравнение с перечислением
Ответ #14 - 19. Июня 2012 :: 05:34
Печать  
@_CP_0 char(23), что говорит о типе Неопределено, но значение передается '   WWN   ' (char(9) - полная типизация).

Что, собственно, Епрст и сказал


Как вариант:

Код
Выбрать все
|	CASE
|		WHEN $СвязиКласификаторов.ТипЭлемента = :Товар* THEN CAST(Номенклатура.CODE as INT)
|		WHEN $СвязиКласификаторов.ТипЭлемента = :Клиент* THEN CAST(Контрагенты.CODE as INT)
|		WHEN $СвязиКласификаторов.ТипЭлемента = :КартаКлиента* THEN Карты.CODE
|	END 



ну и УстановитьТекстовыйПараметр() не забываем
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать