Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Разделители в дробных числах  [new]
Orlic
Member

Откуда: г. Ижевск
Сообщений: 564
Читал FAQ по формированию VBA-запросов, но не нашел ответа.

Проблема вот в чем. В коде вычисляются некоторые числовые значения, скажем
x1 = 0,40 + 0,40.
Затем формирую строку

strUpdate = "Update tbo_raschet SET x1 = 0,8, x2 = 0,6  WHERE id_raschet = 24"

Как видите, разделитель тут - запятая, поэтому запрос
CirrentDb.Execute (strupdate)
не выполняется

Когда вручную заменяешь запятые разделители на точку, запрос проходит....

А как это сделать в коде, не меняя региональных настроек? Вставлять значения как строки вместо числовых значений не подходит....

Спасибо.
28 июн 05, 09:57    [1654498]     Ответить | Цитировать Сообщить модератору
 Re: Разделители в дробных числах  [new]
MLeon
Member

Откуда:
Сообщений: 174
Попробуйте
strUpdate = "Update tbo_raschet SET x1 = " & x1 & ", x2 = " & x2 & " WHERE id_raschet = 24"
Если не поможет используйте ф-ю
'Change a comma for point
Public Function Zahl(z As Double) As String
    Dim s As String, n As Long, i As Long
    Zahl = CStr(z)
    n = Len(Zahl)
    For i = 1 To n
        If Mid(Zahl, i, 1) = "," Then Mid(Zahl, i, 1) = "."
    Next i
End Function
28 июн 05, 10:05    [1654537]     Ответить | Цитировать Сообщить модератору
 Re: Разделители в дробных числах  [new]
ANTIVIR
Member

Откуда: МосквА
Сообщений: 1219
strUpdate = "Update tbo_raschet SET x1 = " & REPLACE("0,8",",",".") & ", x2 = " & REPLACE ("0,6",",".") & "  WHERE id_raschet = 24
Вместо "0,8" и "0,6" можете поставить переменную свою где производите подсчет
28 июн 05, 10:12    [1654558]     Ответить | Цитировать Сообщить модератору
 Re: Разделители в дробных числах  [new]
Orlic
Member

Откуда: г. Ижевск
Сообщений: 564
MLeon
Попробуйте
strUpdate = "Update tbo_raschet SET x1 = " & x1 & ", x2 = " & x2 & " WHERE id_raschet = 24"

в общем то так и делаю:
strUpdate = "Update tbo_raschety " & _
            "SET x1 = " & x1 & _
            " ,  x2 = " & x2 & _
            " ,  xsr = " & xsr & _
            " ,  dx = " & x & _
            " , r = " & r & _
            " , delta = " & delta & _
            " WHERE id_raschet = " & Me.id_raschet

dbs.Execute (strUpdate)
где переменные берутся из контролов или рассчитываются так:
' проверка введенных оператором значений. Все данные должны быть числовыми и не могут быть пустыми или строками
If (IsNull(Me.Кг) Or IsNull(Me.Vpr) Or IsNull(Me.Ppr1) Or IsNull(Me.Ppr2)) Then
    
    ' если некоторые или все поля пустые
    MsgBox "Введены не все данные!!!", vbCritical, "Ошибка ввода данных"
    GoTo error_handler

Else
    If (Not IsNumeric(Me.Кг) Or Not IsNumeric(Me.Vpr) Or Not IsNumeric(Me.Ppr1) Or Not IsNumeric(Me.Ppr2)) Then
    
    ' если некоторые или все поля - не числовые значения
    MsgBox "Неправильно введены данные!!!", vbCritical, "Ошибка ввода данных"
    GoTo error_handler
    
Else
    ' если же все поля - числовые значения
    Kg = Me.Кг
    Vpr = Me.Vpr
    Ppr1 = Me.Ppr1
    Ppr2 = Me.Ppr2
End If
End If

' расчеты 

     x1 = Ppr1
     x2 = Ppr2
     xsr = (x1 + x2) / 2
     x = Abs(x1 - x2)
     r = xsr * 0.02
     delta = xsr * 0.057

А то что я привел SQL-строку запроса - так это уже сформированная акцесаом строка....
MLeon

Если не поможет используйте ф-ю
'Change a comma for point
Public Function Zahl(z As Double) As String
    Dim s As String, n As Long, i As Long
    Zahl = CStr(z)
    n = Len(Zahl)
    For i = 1 To n
        If Mid(Zahl, i, 1) = "," Then Mid(Zahl, i, 1) = "."
    Next i
End Function

хитро...
А разве нет стандартных инструментов Акцесса для этих задач?
28 июн 05, 10:12    [1654559]     Ответить | Цитировать Сообщить модератору
 Re: Разделители в дробных числах  [new]
Orlic
Member

Откуда: г. Ижевск
Сообщений: 564
ANTIVIR
strUpdate = "Update tbo_raschet SET x1 = " & REPLACE("0,8",",",".") & ", x2 = " & REPLACE ("0,6",",".") & "  WHERE id_raschet = 24
Вместо "0,8" и "0,6" можете поставить переменную свою где производите подсчет


Огромное спасибо, метод работает, как ни странно:-)
28 июн 05, 10:18    [1654582]     Ответить | Цитировать Сообщить модератору
 Re: Разделители в дробных числах  [new]
AlTis
Member

Откуда: Penza - Moscow
Сообщений: 1099
Orlic
ANTIVIR
strUpdate = "Update tbo_raschet SET x1 = " & REPLACE("0,8",",",".") & ", x2 = " & REPLACE ("0,6",",".") & "  WHERE id_raschet = 24
Вместо "0,8" и "0,6" можете поставить переменную свою где производите подсчет


Огромное спасибо, метод работает, как ни странно:-)


а при другом разделителе работать не будет :)

Используйте функцию Val
Ноги растут отсюда:
https://www.sql.ru/forum/actualthread.aspx?bid=4&tid=144471&hl=
28 июн 05, 11:45    [1655012]     Ответить | Цитировать Сообщить модератору
 Re: Разделители в дробных числах  [new]
ANTIVITR
Guest
AlTis

а при другом разделителе работать не будет :)

Используйте функцию Val
Ноги растут отсюда:
https://www.sql.ru/forum/actualthread.aspx?bid=4&tid=144471&hl=

Вот оттуда взял
при этом десятичный разделитель в исходной строке 
тоже не должен зависеть от настроек у пользователя, допускается только
точка.
Т.е. вернулись в точку Х

Понятное дело что не будет, и разделить может оказаться любым, мне кажется ед.решение это задать для всех полей ввода маску ввода с точкой например (все остальное будет чувствительно к рег.настрйокам)
28 июн 05, 13:49    [1655741]     Ответить | Цитировать Сообщить модератору
 Re: Разделители в дробных числах  [new]
Latuk
Member

Откуда: N 54°38', E 037°35'
Сообщений: 7310
'По простому
? str("0,8")

с извращением
mid вырезает символ разделитель из строки формата от константы
Replace заменяет полученный разделитель на "."
? Replace("0,8", Mid(Format(1.1, "0.0"), 2, 1), ".")
28 июн 05, 21:28    [1657237]     Ответить | Цитировать Сообщить модератору
 Re: Разделители в дробных числах  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Ну елы-моталы, опять никто не читает факи!
https://www.sql.ru/faq/faq_topic.aspx?fid=157

фак
VBA v1

Dim q As Single
q = 12.197
strSQL = "SELECT * " _
& "FROM Table " _
& "WHERE (((Table.Quanty)=" & q & "));"

VBA v2

Dim q As String
q = "12,197"
strSQL = "SELECT * " _
& "FROM Table " _
& "WHERE (((Table.Quanty)=" & Str(q) & "));"

Примечание:

VBA v1 - для целых чисел. Для дробных чисел это частный случай, только когда системным разделителем является точка.

VBA v2 - более правильный вариант, т.к. в классическом программировании допускается соединять только строки со строками, тогда как VBA v1 использует неявное преобразование типов, хотя нареканий на этот способ для целых чисел не было. (Пример приведён для случая, когда системным разделителем является запятая.)

Иногда также используют для преобразования функцию CStr(), но она не всегда применима, т.к. возвращает число в виде строки, где оно записывается через системный разделитель, тогда как SQL в качестве разделителя воспринимает только точку.
28 июн 05, 21:31    [1657239]     Ответить | Цитировать Сообщить модератору
 Re: Разделители в дробных числах  [new]
Victosha
Member

Откуда: Москва
Сообщений: 2620
Не знаю, сколько раз мне приходилось видеть этот фрагмент фака
(или что-то подобное), но то, что в нем написано нечто не вполне (для меня)обыкновенное - увидел только сейчас.

v1 в общем случае просто неверен и работать будет именно так, как
написано в примечании -
автор
VBA v1 - для целых чисел. Для дробных чисел это частный случай, только когда системным разделителем является точка.
(непонятно, зачем такого в книжку... )

Удивлением для меня является то, что v2, так как он написан, будет работать независимо от установки текущего системного десятичного разделителя. (Проверил установкой разделителя в знак "=" ).
Раньше я никогда не обращал внимания на специальную "заточенность"
Str под запятую.

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

Если уж x - числовой, то надежнее и "идеологически" правильнее Str(x) непосредственно.

Если по каким-то причинам нужно именно
Dim q as String, и далее Str(q)
то либо
q=x либо q=Cstr(x) (что одно и то же)
и далее
strSQL = "..." & Str(q) & ...
28 июн 05, 23:54    [1657355]     Ответить | Цитировать Сообщить модератору
 Re: Разделители в дробных числах  [new]
TyroUser
Member

Откуда:
Сообщений: 30
Важным является и тот факт, какая раскладка клавиатуры включена. Я пользуюсь STR(число), при формировании строки запроса
29 июн 05, 06:50    [1657465]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить