Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
25.04.2024, 15:24:05

Войти
На форуме добавлена возможность подписки на RSS-ленты любого раздела форума. Подписаться можно, нажав на иконку RSS , расположенную левее наименования раздела.
33 243 Сообщений в 5 458 Тем от 6 763 Пользователей
Последний пользователь: tetrapack
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Access и VBA
| | |-+  Несоответствие типов Access с фиксированной точкой и VBA
Страниц: [1]   Вниз
Печать
Автор Тема: Несоответствие типов Access с фиксированной точкой и VBA  (Прочитано 6911 раз)
0 Пользователей и 1 Гость смотрят эту тему.
McConst
Постоялец
***

Репутация: +1/-0
Офлайн Офлайн

Сообщений: 238


Просмотр профиля E-mail
« : 16.05.2018, 14:44:58 »

Здравствуйте
Пытаюсь передать параметр @Size на VBA в запрос Access. Параметр в Access соответсвует типу: "Действительное, фиксированное, точность 2, шкала 1, число десятичных знаков 1".

Код: (vb)

Dim Size as Double
Dim TempParam as Variant

'Дальше идет кусок кода где в частности присваивается Size=1,9

    If Size = 0 Then
        TempParam = Null
    Else
        TempParam = Size
    End If
    Command2.Parameters.Append Command2.CreateParameter("@Size", 131, 1, 2) 'Создаем параметр  c фиксир. точностью, 2 байта
    With Command2.Parameters("@Size")
        .NumericScale = 1 '1 знак после запятой
        .Precision = 2 'Точность - два знака (1 до точки и 1 после точки)
        .Value = TempParam
    End With
    
    Command2.Execute 'Выполняем запрос, который должен занести Size в поле таблицы Access c фиксир. точкой



Команда Execute выдает ошибку "Несоответствие типов данных в выражении условии отбора"
Долго перебирал типы, искал  в Гугле, наконец сдался. Может кто поможет, как задать правильно параметр на VBA
Прикрепил файлы Access и Excel в архиве.
В модуле Excel DBWork процедура Main - создает соединение с базой данных и пытается сделать запись в таблицу через запрос Access. Проблема именно в типе переменной @Size, так как запрос без этой переменной работает корректно.
« Последнее редактирование: 16.05.2018, 15:22:19 от McConst » Записан
McConst
Постоялец
***

Репутация: +1/-0
Офлайн Офлайн

Сообщений: 238


Просмотр профиля E-mail
« Ответ #1 : 16.05.2018, 17:10:39 »

Ещё заметил. Если Size целое число, то ошибок никаких нет, всё передается в таблицу отлично, команда выполняется нормально. Если Size дробное - тогда вылезает ошибка несоответствия типов.
Записан
McConst
Постоялец
***

Репутация: +1/-0
Офлайн Офлайн

Сообщений: 238


Просмотр профиля E-mail
« Ответ #2 : 16.05.2018, 19:06:28 »

Так как никто не ответил, упростил себе жизнь, вместо adNumeric=131 (числовой с фиксированной точкой), поставил adSingle=4 (одинарное с плавающей точкой) и в таблице Access поставил на прием плавающую точку.
Убрал .NumericScale и .Precision
Всё заработало. Правда, подозреваю,  объем базы данных вырастет.
В Access похоже, adNumeric нет, используется только adDecimal=14. Если задавать в конструкторе запроса Тип параметра принудительно, то на "Действительное" в SQL-режиме подставляется Decimal
Но вариант с .CreateParameter("@Size", 14, 1) точно так же дает ошибку типа.


Только что проверил. Если передавать параметр как с плавающей точкой
Код: (vb)

.CreateParameter("@Size", 4, 1)

А в Access для поля задано "Действительное, фиксированное, точность 2..." - как мне и нужно было, то Access сам преобразует Single в нужный фиксированный формат без возвращения ошибки.
Т.е. вопрос можно сказать, решен.
« Последнее редактирование: 16.05.2018, 19:11:56 от McConst » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #3 : 17.05.2018, 08:55:53 »

Правильнее заносить, наверное, так:
Код: (vb)
.Value = Str(TempParam)

потому что тип Double в VBA всегда содержит число с разделителем разрядов, установленным в системе, а для передачи в Access требоваться может иной разделитель. Функции Str приводит число в нужный для передачи формат.
« Последнее редактирование: 17.05.2018, 09:01:42 от Дмитрий Щербаков(The_Prist) » Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
McConst
Постоялец
***

Репутация: +1/-0
Офлайн Офлайн

Сообщений: 238


Просмотр профиля E-mail
« Ответ #4 : 17.05.2018, 10:20:24 »

Не получается.
Если вместо TempParam поставить явным образом "1,9" в кавычках, ошибка та же самая возвращается от Access, если поставить "1.9", то тут уже ADODB глючит и не хочит конвертить, пишет, ошибка преобразования типов. Что-то такое. Не получилось.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #5 : 17.05.2018, 10:28:55 »

Тут сложно что-то советовать было изначально, т.к. Вы не пишите ни откуда обращаетесь, ни как создаете объекты, ни какой провайдер используется.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #6 : 17.05.2018, 10:36:10 »

кстати, почему только 2 байта? Не маловато для Double? Даже Integer требует минимум 4
И почему именно adNumeric, а не конкретно adDouble?
131 = adNumeric
5 = adDouble

И неплохо бы понимать, откуда берется значения для Size. Объявлено как Double - значит уже может не подходить под тип adNumeric, т.к. "с плавающей запятой". Возможно, надо сначала округлить до нужного числа знаков.
« Последнее редактирование: 17.05.2018, 11:01:59 от Дмитрий Щербаков(The_Prist) » Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
McConst
Постоялец
***

Репутация: +1/-0
Офлайн Офлайн

Сообщений: 238


Просмотр профиля E-mail
« Ответ #7 : 17.05.2018, 11:30:32 »

Size - это объем автомобильных двигателей. Типа 2,0; 4,5. Там точность double не нужна, и этим экономится память в базе данных. Предполагается, что объем таблицы будет более 10 тыс записей. Я сайз передаю в метод пользовательского класса, который будет сохранять данные в Access. В метод класса величины попадают из ячеек Excel. С округлением пробовал, не помогало.

К топику темы прикреплены файл Excel и таблица Access - там можно поюзать. Все способы перепробовал, ничего не помогало, пока не заменил в параметрах на тип Single - константа 4. При такой передаче Access сам сконвертил в adDecimal. Меня это устроило. Просто пишу класс с перспективой переделать под SQL-сервер. С SQL-сервером я подобные задачи уже решал, там таких проблем не было.Это особенность Access
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru