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