Имя: Пароль:
1C
1C 7.7
v7: Преобразование объекта справочника в число
,
0 Тёплый фарфор
 
25.08.17
15:35
Коллеги, подскажите, пожалуйста: при таком запросе выводит ошибку "qryConsole : State 22018, native 245, message [Microsoft][ODBC SQL Server Driver][SQL Server]Ошибка преобразования значения varchar "    3V   " в тип данных int."
Я понимаю что это из-за проблемы преобразования в число, однако у меня в ЗначенияхСвойств везде прописаны строки, которые легко преобразуются в числа (значения 100, 200, 300 и т.д.). Так что ему не нравится? Пробовал ЗначениеСвойства оборачивать в CAST - всё тоже самое...

SELECT СвойстваНоменклатуры.PARENTEXT [Владелец $Справочник.Номенклатура]
    , $СвойстваНоменклатуры.ЗначениеСвойства [Значение $Справочник.ЗначенияСвойств]
FROM $Справочник.СвойстваНоменклатуры AS СвойстваНоменклатуры With (NOLOCK)
WHERE ($СвойстваНоменклатуры.ВидСвойства = :ТекСвойство)
    AND ($СвойстваНоменклатуры.ЗначениеСвойства = 275)
1 Ёпрст
 
25.08.17
15:37
(0)
//$СвойстваНоменклатуры.ЗначениеСвойства = 275

вот тут - жпо
2 Ёпрст
 
25.08.17
15:38
ибо нефик элемент справочника с числом сравнивать
3 patapum
 
25.08.17
15:38
(0) преобразовать таки надо. а что там не так с cast или convert - фиг знает. как с cast писал?
4 Ёпрст
 
25.08.17
15:38
те собственна, сам скуль и сообщил об этом
5 Тёплый фарфор
 
25.08.17
15:40
(2) так надо же! :) почему SQL не может объект в число конвертнуть?
6 Ёпрст
 
25.08.17
15:42
(5) че надо ?
Ты сравниваешь ссылку на элемент справочника с числом. Скажи спасибо, что sql не матом ошибку пишет.
7 lexasan
 
25.08.17
15:42
$СвойстваНоменклатуры.ЗначениеСвойства = элемент справочника Значения свойств. У него наверно есть наименование. Нужно, грубо говоря так: $СвойстваНоменклатуры.ЗначениеСвойства.Наименование = "275" (видимо нужно еще соединение с справочником "Значения свойств" по свойству, чтобы наименование получить)
8 Тёплый фарфор
 
25.08.17
15:43
(3) WHERE ($СвойстваНоменклатуры.ВидСвойства = :ТекСвойство)
    AND (CAST($СвойстваНоменклатуры.ЗначениеСвойства AS INT) = 275)
9 Тёплый фарфор
 
25.08.17
15:44
(6) см. (8)
Разве это не должно работать???
10 Тёплый фарфор
 
25.08.17
15:45
(7) хочется без лишних соединений
11 Ёпрст
 
25.08.17
15:45
(8) Попроси кого-нибудь, чтоб стальной линейкой тебе по пальчикам от меня стукнул.
12 Ёпрст
 
25.08.17
15:45
(9) ты сравниваешь тёплое с мягким.
13 Ёпрст
 
25.08.17
15:47
у тебя в $СвойстваНоменклатуры.ЗначениеСвойства лежит id из таблички справочника ЗначенияСвойств.
14 Ёпрст
 
25.08.17
15:47
С каким еще нахрен числом ты его сравнивать собираешься ?
15 Тёплый фарфор
 
25.08.17
15:47
(12) однако конструкция вида: (RTRIM($СвойстваНоменклатуры.ЗначениеСвойства) = '275')
ошибок же не выдает... правда и не возвращает того что надо ))
16 Тёплый фарфор
 
25.08.17
15:48
(14) ааа... тогда только через соединения получается....
17 Вафель
 
25.08.17
15:49
это же ппроизвольный тип, тут нужно вроде Значение = ~~:ПараметрЧисло
18 Ёпрст
 
25.08.17
15:49
(16) Допетрил ?
Но лучше, линейкой.. так быстрее до мозга сигнал доходит.
19 Тёплый фарфор
 
25.08.17
15:50
(18) я предполагал, но всё-таки не верилось до последнего....
Спасибо!
20 Масянька
 
25.08.17
15:51
(18) Ты чего такой злой сегодня?
21 Ёпрст
 
25.08.17
15:53
(20) пятница же
22 Тёплый фарфор
 
25.08.17
16:01
Однако так тоже не работает:
SELECT СвойстваНоменклатуры.PARENTEXT [Владелец $Справочник.Номенклатура]
FROM $Справочник.СвойстваНоменклатуры AS СвойстваНоменклатуры With (NOLOCK)
    INNER JOIN $Справочник.ЗначенияСвойств AS ЗначенияСвойств With (NOLOCK) ON $СвойстваНоменклатуры.ЗначениеСвойства = ЗначенияСвойств.ID
WHERE ($СвойстваНоменклатуры.ВидСвойства = :ТекСвойство)
    AND (CAST(ЗначенияСвойств.DESCR AS INT) >= 200)
GROUP BY СвойстваНоменклатуры.PARENTEXT

Текст ошибки: Ошибка преобразования значения varchar "0 гр." в тип данных int.

Теперь то что скулю не нравится? Ну не может преобразовать - пропускал бы и всё...

+ не понятно к комментарию (13) - пусть там и ID, то почему возвращается то не ID объекта, а ЗначениеСвойства.Наименование?
23 lexasan
 
25.08.17
16:06
(22) потому что у тебя среди свойств есть свойства с наименованиями, которые не преобразуются к числу, например "0 гр."
24 Тёплый фарфор
 
25.08.17
16:07
(23) вообще в ($СвойстваНоменклатуры.ВидСвойства = :ТекСвойство) я отбираю только те свойства, где такого нет... скулю пофигу на это похоже?
25 Вафель
 
25.08.17
16:09
сделай временную таблицу, там отбери
26 Вафель
 
25.08.17
16:09
можно еще
Выбор когда своство = .. и значение > ...
27 lexasan
 
25.08.17
16:12
(24) посмотри что в результате

SELECT СвойстваНоменклатуры.PARENTEXT [Владелец $Справочник.Номенклатура]
FROM $Справочник.СвойстваНоменклатуры AS СвойстваНоменклатуры With (NOLOCK)
    INNER JOIN $Справочник.ЗначенияСвойств AS ЗначенияСвойств With (NOLOCK) ON $СвойстваНоменклатуры.ЗначениеСвойства = ЗначенияСвойств.ID
WHERE ($СвойстваНоменклатуры.ВидСвойства = :ТекСвойство)
    
GROUP BY СвойстваНоменклатуры.PARENTEXT

получается. По идее Where работает после соединения, но оптимизатор может сначала отсеять по Where и только потом соединять. В любом случае выражения строки в целое число потенциально будет давать ошибку.
28 Ёпрст
 
25.08.17
16:16
(22) ё.

будь проще:

AND ЗначенияСвойств.DESCR = '200'
29 Ёпрст
 
25.08.17
16:16
нафига тебе тип "строка 100" к числу кастовать ? Когда в строке может быть забито че угодно ?
Ищи сразу строку в строке.
30 Вафель
 
25.08.17
16:18
так там же > а не =
31 Тёплый фарфор
 
25.08.17
16:19
(26) буду пробовать
(27) смотрел. Отдаёт всё что надо
(29) иногда нужно выбирать товары с условием >=
32 Тёплый фарфор
 
25.08.17
16:20
(30) я просто сначала "=" в (0) написал, но на самом деле действительно нужны ">" и т.д.
33 lexasan
 
25.08.17
16:20
(30) Тебе уже раз 5 написали, что CAST('Строка 200' AS INT) будет давать ошибку
34 Ёпрст
 
25.08.17
16:21
(32) строки тоже нормально на больше меньше сравниваются :), если че..
35 Ёпрст
 
25.08.17
16:22
и ..'100'<'200' = true
36 Тёплый фарфор
 
25.08.17
16:23
(34) точняк! :)
до этого пытался строки сравнивать, но чего-то не так получалось...
37 lexasan
 
25.08.17
16:24
(35) Ага, и '100' < '99'
38 Тёплый фарфор
 
25.08.17
16:25
(37) блиинн...
39 Ёпрст
 
25.08.17
16:25
(37) есть такое
40 Тёплый фарфор
 
25.08.17
16:25
ладно, добавлю в значения свойств доп поле числовое и буду текст запроса менять в зависимости от ситуации....
41 Ёпрст
 
25.08.17
16:33
тогда так
right(concat('0000000000', '100'),10) < right(concat('0000000000', '99'),10)
42 Ёпрст
 
25.08.17
16:33
короче, строки к одной длине приводи и сравнивай.
43 Тёплый фарфор
 
25.08.17
16:36
(42) нее, это уже костыли
44 Ёпрст
 
25.08.17
16:38
(43) ну, можешь во времянку сперва отобрать по виду свойства и ужо потом кастом к числу, тогда ошибки не будет в приоразовании
45 Ёпрст
 
25.08.17
16:38
как в (25)
46 Тёплый фарфор
 
25.08.17
16:42
Понял. Попробую.
Благодарю всех за помощь! :)