Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
102 / 87 / 17
Регистрация: 04.05.2011
Сообщений: 1,330
1

Преобразование типов данных в Access 2013

05.07.2015, 18:09. Показов 4749. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ошибка 13 (преобразование данных). Но только в Access 2013. Сам я работаю в 2010. Работает без проблем.

Visual Basic
1
2
3
 If rst(63) <> "" And rst(71) <> "" Then
            rst(72) = CSng(Round(CDbl(rst(63)) / CDbl(rst(71)), 2))
        End If
Функции перепробовал разные. У меня всё работает, в 2013 - нет.
Что делать?

Добавлено через 28 минут
Тип ячеек - текстовый.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2015, 18:09
Ответы с готовыми решениями:

Импорт данных в Access 2013 из Excel 2013
Есть accdb и xlsx. Файла Excel очень большой, несколько десятков тысяч строк. Надо ОТДЕЛЬНЫЕ...

Преобразование типов в MS Access 2003
Господа, подскажите плз: грубо говоря, имеются 2 таблицы, структура практически одинакова, но в...

Фильтр по выделенному Access 2013, поиск и подбор данных через шаблон поиска
Доброго времени суток форумчане. Впервые столкнулся с базами данных, а с Access так тем более. ...

Преобразование данных в SQL Access-а
Подскажите какие функции преобразования данных есть в SQL Access-а?

18
Модератор
Эксперт MS Access
11960 / 4828 / 779
Регистрация: 07.08.2010
Сообщений: 14,138
Записей в блоге: 4
05.07.2015, 18:12 2
выведите в отладку ваши rst(63) и rst(71)
и проверьте, что в них

---
а заодно и тип rst(72)
1
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
05.07.2015, 18:14 3
А если такую проверку испытать?
Visual Basic
1
If isnumeric(rst(63)) And isnumeric(rst(71)) Then
Хорошо бы видеть значения на которых спотыкается код...
1
шапоклякистка 8-го дня
3679 / 2239 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
05.07.2015, 18:22 4
Для начала - опубликовать не только оператор, вызывающий ошибку, но хотя бы и описание переменных и операторы присваивания. И рассказать, какого результата вы хотите в конечном итоге добиться этим оператором.

Потому что мне не очень ясно, зачем результат округления до 2 цифр после запятой преобразовывать к типу Simgle только для того, чтобы результат преобразования присвоить текстовой (?) переменной.
0
102 / 87 / 17
Регистрация: 04.05.2011
Сообщений: 1,330
05.07.2015, 19:10  [ТС] 5
1.
Цитата Сообщение от shanemac51 Посмотреть сообщение
выведите в отладку ваши rst(63) и rst(71)
и проверьте, что в них
---
а заодно и тип rst(72)
Тип везде текстовый. rst(63)="400000" и rst(71)="49506.43" - споткнулся же на первой строчке

Ещё раз повторяю, в Access 2010 работает. В Access 2013 - нет!
Может библиотеку какую-нибудь подключить?

Добавлено через 5 минут
2
Цитата Сообщение от texnik-san Посмотреть сообщение
Для начала - опубликовать не только оператор, вызывающий ошибку, но хотя бы и описание переменных и операторы присваивания. И рассказать, какого результата вы хотите в конечном итоге добиться этим оператором.
Потому что мне не очень ясно, зачем результат округления до 2 цифр после запятой преобразовывать к типу Simgle только для того, чтобы результат преобразования присвоить текстовой (?) переменной.
Да, да да... И за одно и проект... И выслушивать, почему я взялся за программирование вообще...

Visual Basic
1
2
3
4
5
6
7
Dim myString1 As String
Dim myString2 As String
Dim myString3 As String
 
Set myString1 = "400000" 
Set myString2 = "49506.43"
myString3 = CSng(Round(CDbl(myString1) / CDbl(myString2), 2))
- аналог моей "беды". Протестируйте в Access 2013
0
шапоклякистка 8-го дня
3679 / 2239 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
05.07.2015, 19:27 6
Смысла врать, спрашивая совета по работе кода, ровно столько же, сколько врать о симптомах на приеме у врача.

Приведенный вами код и в 2010 работать не может. Хотя бы потому, что текстовой переменной значения оператором Set не присваиваются. Set работает только с объектами. Также ошибку даст преобразование к типу Double переменной myString2, ибо точка - не десятичный разделитель.

Цитата Сообщение от Aleator Посмотреть сообщение
Протестируйте в Access 2013
С удовольствием. Давно жажду познакомиться с этим зверем. Давайте доступ.
0
102 / 87 / 17
Регистрация: 04.05.2011
Сообщений: 1,330
05.07.2015, 19:35  [ТС] 7
Цитата Сообщение от texnik-san Посмотреть сообщение
С удовольствием. Давно жажду познакомиться с этим зверем. Давайте доступ.
- это относилось к тем у кого этот Access установлен. (без обид)

Добавлено через 1 минуту
Цитата Сообщение от texnik-san Посмотреть сообщение
Приведенный вами код и в 2010 работать не может. Хотя бы потому, что текстовой переменной значения оператором Set не присваиваются. Set работает только с объектами. Также ошибку даст преобразование к типу Double переменной myString2, ибо точка - не десятичный разделитель.
Извините.
Visual Basic
1
2
3
4
5
6
7
    Dim myString1 As String
Dim myString2 As String
Dim myString3 As String
 
myString1 = "400000"
myString2 = "49506.43"
myString3 = CSng(Round(CDbl(myString1) / CDbl(myString2), 2))
0
шапоклякистка 8-го дня
3679 / 2239 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
05.07.2015, 20:04 8
Ладно, я готова поверить, что у вас в региональных стандартах действительно в качестве десятичного разделителя выставлена точка. Бывает экзотика.

А, другое дело. Вот теперь давайте пошагово вылавливать проблему. Сейчас напишу, как.

Добавлено через 4 минуты
Для начала, давайте попробуем заставить ваш оператор таки вернуть результат вычисления. Я предлагаю так:

myString3 = Round(Val(myString1) / Val(myString2), 2)

Добавлено через 13 минут
Aleator, попробуйте - работает или нет:

Visual Basic
1
2
3
4
5
6
7
8
9
10
Dim myString1 As String
Dim myString2 As String
Dim myString3 As String
 
myString1 = "400000"
myString2 = "49506.43"
Debug.Print CDbl(myString2)
myString3 = Round(Val(myString1) / Val(myString2), 2)
 
Debug.Print myString3 & "=" & Val(myString1) & "/" & Val(myString2)
В последнем операторе лично мне интересно значение после косой черты. Совпадет оно с исходным значением 49506,43 или останется только целя часть, а дробная будет отброшена.

Добавлено через 6 минут
А вообще, сейчас будем тренироваться на кошках. Качаю рантайм-версию 2013 ))) Чего не сделаешь для науки )))
0
102 / 87 / 17
Регистрация: 04.05.2011
Сообщений: 1,330
05.07.2015, 20:05  [ТС] 9
Я попробовал в своей БД:
Visual Basic
1
2
3
        If rst(63) <> "" And rst(71) <> "" Then
            rst(72) = CSng(Round(Val(rst(63)) / Val(rst(71)), 2))
        End If
Всё получилось.
Итого, имеем разную работу функции CDbl в Access 2010 и Access 2013.
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
05.07.2015, 20:08 10
texnik-san, в ВБА, в качестве десятичного разделителя может только точка. Никак иначе. Надо применять функцию STR, которая всегда дает точку.

Цитата Сообщение от texnik-san Посмотреть сообщение
Бывает экзотика.
У меня, например, так. И у большей половины моих заказчиков тоже точка.
0
шапоклякистка 8-го дня
3679 / 2239 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
05.07.2015, 20:23 11
Цитата Сообщение от Aleator Посмотреть сообщение
Всё получилось.
Просто сработало, или дало именно тот числовой результат, который нужен?

Потому что функция Val очень своеобразная. Она преобразует строку в число до того символа, до которого у нее получается это сделать, и игнорирует остальные. В частности, если точка ее не устраивает как разделитель дробной части - она может просто взять целую часть числа.

Цитата Сообщение от Aleator Посмотреть сообщение
Итого, имеем разную работу функции CDbl в Access 2010 и Access 2013.
Не факт. Попробуйте свой старый код с запятой вместо точки.

Добавлено через 1 минуту
Цитата Сообщение от mobile Посмотреть сообщение
texnik-san, в ВБА, в качестве десятичного разделителя может только точка.
Речь не о коде vba, а о функции CDbl - она десятичный разделитель берет из региональных настроек.

Добавлено через 50 секунд
Цитата Сообщение от mobile Посмотреть сообщение
Надо применять функцию STR, которая всегда дает точку.
Опять же, вопрос не в том, что она дает, а в том, что берет.

Добавлено через 11 минут
Цитата Сообщение от texnik-san Посмотреть сообщение
Речь не о коде vba, а о функции CDbl - она десятичный разделитель берет из региональных настроек.
Вот если бы код был CDbl (49506.43) - тут да, тут только точка возможна. А CDbl ("49506.43") уже не так.
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
05.07.2015, 20:30 12
Цитата Сообщение от texnik-san Посмотреть сообщение
Речь не о коде vba, а о функции CDbl - она десятичный разделитель берет из региональных настроек.
Но это же Ваше выражение:
Цитата Сообщение от texnik-san Посмотреть сообщение
myString3 = Round(Val(myString1) / Val(myString2), 2)
Функция Val не воспринимает запятую как десятичный разделитель. Только точку.
0
шапоклякистка 8-го дня
3679 / 2239 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
05.07.2015, 20:39 13
Цитата Сообщение от mobile Посмотреть сообщение
Функция Val не воспринимает запятую как десятичный разделитель. Только точку.
К аргументу, в явном виде прописанном в коде программы, требования одни, к текстовой строке, передаваемой в виде аргумента - совсем другие. В текстовой строке можно и запятую, и вообще любые символы, не имеющие отношения к числам. Даже Val("4356ы32") - можно. Но результат будет 4356.

Добавлено через 2 минуты
Кстати, в только что установленной рантайм версии 2013 оператор CDbl("49506,43") у меня сработал. Именно с запятой.
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
05.07.2015, 20:42 14
Цитата Сообщение от texnik-san Посмотреть сообщение
Но результат будет 4356.
Совершенно верно. И результат деления
Visual Basic
1
m="1": n="0,1": ?Val(m)/Val(n)
будет не 10, как предполагается, а деление на 0.
1
шапоклякистка 8-го дня
3679 / 2239 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
05.07.2015, 20:59 15
Цитата Сообщение от mobile Посмотреть сообщение
Совершенно верно. И результат деления
Код Visual BasicВыделить код
1
m="1": n="0,1": ?Val(m)/Val(n)
будет не 10, как предполагается, а деление на 0.
В том-то и дело, что может быть деление на ноль, а может быть и 10, и зависит это от региональных настроек. У меня это таки 10.

Поэтому ждем ответа от автора темы, получил ли он именно то числовое значение, которое ожидал, или нет. Если нет - нужно принять волевое решение о дальнейшем пути исправления ошибки.

Варианты
1) поменять настройки региональный стандартов (сделать, чтобы десятичным разделителем стала таки точка)
2) добиться замены точки на запятую еще при присваивании значения
3) заменять точку на запятую при передаче параметра
4) написать фукнцию преобразования строки в число, которой все равно, точка там или запятая.

Добавлено через 8 минут
Цитата Сообщение от texnik-san Посмотреть сообщение
В том-то и дело, что может быть деление на ноль, а может быть и 10, и зависит это от региональных настроек. У меня это таки 10
А нет, соврала. 10 именно с CDbl, Val таки деление на ноль. Сори.
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
05.07.2015, 20:59 16
Цитата Сообщение от texnik-san Посмотреть сообщение
зависит это от региональных настроек. У меня это таки 10.
Я сейчас специально поменял десятичный разделитель на запятую и устойчиво получаю деление на 0. А не 10.
0
шапоклякистка 8-го дня
3679 / 2239 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
05.07.2015, 21:02 17
Да, вы правы, я не права. Val только с точкой работает. Ну фух, тогда изначальная задача решена вроде бы )
0
102 / 87 / 17
Регистрация: 04.05.2011
Сообщений: 1,330
05.07.2015, 21:30  [ТС] 18
Да, действительно, начальная задача решена. Спасибо всем большое.
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
05.07.2015, 21:37 19
Кстати, texnik-san, может быть это Вас заинтересует в связи разным десятичным разделителем на разных ПК. Довольно легко узнать какой же именно десятичный разделитель на машине, нужно только вычислить выражение format(0,"."):
Visual Basic
1
2
?format(0,".")
,
2
05.07.2015, 21:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2015, 21:37
Помогаю со студенческими работами здесь

Access 2007. Преобразование текстового формата данных в числовой.
Уважаемые специалисты, помогите пожалуйста решить такую вот задачу:Имеется таблица с полями...

Фильтрация данных основной формы через данные подчиненной формы в MS Access 2013
Может кто подскажет, есть ли простое решение, когда есть стандартные 2 таблички (главная-1 и...

Переход от Access 2003 на Access 2013
Доброго времени суток всем, сталкивался ли кто-нибудь с переносом БД из Access 2003 в Access...

Преобразование типов
Не записывает переменную neisp в таблицу, поле в таблице текстовое, какое преобразование должно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru