|
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
|
Понял. Попробую.
Благодарю всех за помощь! :) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |