powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Еще раз по региональным настройкам.
25 сообщений из 25, страница 1 из 1
Еще раз по региональным настройкам.
    #37794321
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Извиняюсь что опять поднимаю эту тему. Пока поиском не удалось найти ответ вот на какой вопрос: как сделать так чтобы приложению было все равно какой разделитель стоит у пользователя в региональных настройках". А то кому точка удобна кому запятая, у некоторых EXCEL только с запятой работает. А у меня как запрос на добавление записи с суммой, так так если не точка то не совпадение типов.
Как сделать чтобы приложение для себя всегда видело точку, а не запятую?
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794345
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не очень ясен вопрос.
1) То ли приложение должно выводить число на экран с точкой - тогда это функция Format

2) То ли приложение должно понимать введенные пользователем данные, тогда сопутствуюшщий вопрос - куда введенные? В тектовое поле? В ячейку экселя? пользователь должен вводить всегда с точкой, а если вводит с запятой - выдавать ошибку? В общем поподробней.
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794352
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menА у меня как запрос на добавление записи с суммой, так так если не точка то не совпадение типов.ЗАпрос - что за запрос? SQL-запрос? Туда всегда надо писать с точкой - функция Str.

А исходные данные - для функции - должна быть ЧИСЛОВАЯ переменная, а не текст, введенный пользователем. То есть вопрос формирования запроса отсекаем от ввода данных пользователем
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794380
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Приложение VB база либо MDB либо SQL. Пользователь вводит сумму в обычный TextBox. По нажатию кнопки "Сохранить" работает запрос на добавление

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
rst.Open "SELECT * FROM operations", Cn, adOpenStatic, adLockOptimistic
    
    rst.AddNew: rst("m_type") = 1
                rst("id_bk") = 1
                rst("doc_number") = Trim(Me.doc_number)
                rst("doc_data") = Me.doc_date.Text
                rst("20_reference") = Trim(Me.snd_ref)
                rst("21_reference_add") = ""
                rst("23_oper_code") = Me.kop.Text
                rst("32_cur_code") = Me.curr_code.Text
                rst("32_data_val") = Me.doc_dat_val.Text
                
                lcl_sum32 = Replace(CCur(Me.doc_sum.Text), ",", ".")
                rst("32_summ") = lcl_sum32 'CCur(Replace(Me.doc_sum.Text, ",", "."))

rst.Update

rst.Close
Set rst = Nothing                



При нажатии кнопки "Изменить соответственно

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 rst.Open "SELECT * FROM operations Where operations.id_oper=" & Me.oper_id & " ", _
Cn, adOpenStatic, adLockOptimistic
    
    rst("m_type") = 1
                rst("id_bk") = 1
                rst("doc_number") = Trim(Me.doc_number)
                rst("doc_data") = Me.doc_date.Text
                rst("20_reference") = Trim(Me.snd_ref)
                rst("21_reference_add") = ""
                rst("23_oper_code") = Me.kop.Text
                rst("32_cur_code") = Me.curr_code.Text
                rst("32_data_val") = Me.doc_dat_val.Text
                
                lcl_sum32 = Replace(CCur(Me.doc_sum.Text), ",", ".")
                rst("32_summ") = lcl_sum32 'CCur(Replace(Me.doc_sum.Text, ",", "."))

rst.Update

rst.Close
Set rst = Nothing



Так вот если в региональных параметрах точка то все хорошо, если запятая то несоответствие типов. Любое преобразование внутри кода в формат money бесполезно. Он при отработке запроса все равно берет рег. параметры.
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794387
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз повторю, по хорошему нельзя поступать так, как ты делаешь.
Нужно собрать все данные, введенные пользователем, в переменные НУЖНОГО ТИПА. То есть все данные должны стать валидными. Мало ли что пользователь понаписал - на него нельзя положиться. К датам это тоже относится!

Тут, как я вижу, ты не формируешь SQL запрос на INSERT, а пишешь в рекордсет. И вот тут данные по типам должны четко соответствовать. То есть в дату пишешь переменную типа Date, в money - Currency и т.п.
Таким образом ты избежишь ошибок с типами.

А ДО этого у тебя должно быть преобразование типа данных, введенных пользователем, в нужный тип. И вот в этом месте мы можем поговорить, как быть с точкой
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794403
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вышесказанное понятно, то тогда ты должен ответить на вопросы, как ты хочешь поступить, когда
1) Пользователь ввел запятую, региональная настройка - запятая
2) Пользователь ввел запятую, региональная настройка - точка
3) Пользователь ввел точку, региональная настройка - запятая
4) Пользователь ввел точку, региональная настройка - точка
а также варианты с пользователь ввел какую-то херь, в региональных натройках какая-то херь
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794428
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Значится по пунктам в поле по мере ввода у меня стоит замена запятой на точку, но соответственно результат я получаю текстовый.
Далее переменная lcl_sum32 имеет тип Currency.

соответственно пробовал следующие варианты присвоения суммы рекордсету:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
1) 
    rst("32_summ") = CCur(Me.doc_sum.Text)

2) 
                rst("32_summ") = CCur(Replace(Me.doc_sum.Text, ",", "."))

3)             lcl_sum32 = Replace(CCur(Me.doc_sum.Text), ",", ".")
                rst("32_summ") = lcl_sum32

4)             lcl_sum32 = Ссгк(Replace(Me.doc_sum.Text), ",", ".")
                rst("32_summ") = lcl_sum32



Так же пробовал менять тип поля в таблице с денежного на double. Ошибка не меняется. Если в рег параметрах запятая то "Type mismatch" сиреч несовпадение типов. Если точка то запрос отрабатывает. Очень бы хотелось чтобы запрос отрабатывал независимо от рег параметров.
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794435
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЕсли вышесказанное понятно, то тогда ты должен ответить на вопросы, как ты хочешь поступить, когда
1) Пользователь ввел запятую, региональная настройка - запятая

надо чтобы запрос выполнился невзирая на запятую и данные попали в таблицу

Shocker.Pro2) Пользователь ввел запятую, региональная настройка - точка

При выполнении запроса будет подставлена точка и запрос отработает

Shocker.Pro3) Пользователь ввел точку, региональная настройка - запятая

надо чтобы запрос выполнился невзирая на запятую и данные попали в таблицу

Shocker.Pro4) Пользователь ввел точку, региональная настройка - точка

При выполнении запроса будет подставлена точка и запрос отработает

Shocker.Proа также варианты с пользователь ввел какую-то херь, в региональных натройках какая-то херь

Херь я ввести не дам, при вводе идет проверка на допустимые символа.
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794474
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menПри выполнении запроса будет подставлена точка и запрос отработаетеще раз!!!!! Забудь про запрос!!!! Запрос отработает, если у тебя будет переменная типа Currency. Важно то, чтобы данные оказались нужные.

Так, собственно, если я правильно понял, тебе нужно, чтобы вне зависимости от того, какой разделитель ввел пользователь, данные преобразовались в Currency. Тогда что-то типа этого:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim lcl_sum32 As Currency, Delimiter As String
Delimiter = Format$(0.1, ".")
lcl_sum32 = CCur(Replace(Replace(Text1, ".", Delimiter), ",", Delimiter))
'тут мы получили в переменной число типа Currency, с любым разделитетем
'но неплохо бы отследить все-таки ошибки преобразования типа,
'к примеру, если пользователь введет несколько запятых или точек

rst("32_summ") = lcl_sum32
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794480
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menХерь я ввести не дам, при вводе идет проверка на допустимые символа.
можно взглянуть на код ради интереса? Тут много копий на эту тему сломано )))
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794508
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Хм спасибо, работает. вопрос такой среди прочего я строил еще и вот такую конструкцию:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
DIM lcl_sum32 as Currency
......
If InStr(Me.doc_sum.Text, ",") <> 0 Then
                        lcl_sum32 =CCur( Replace(Me.doc_sum.Text, ",", "."))

                    Else
                        lcl_sum32 = Ccur(Me.doc_sum.Text)
End If



Что в ней не так, почему она не отработала. По идее ведь должна отследить наличие запятой и преобразовать ее в точку а далее преобразовать текстовое значение в Currency. Где я ошибся? (если не затруднит, мне надо разобраться чтобы больше по таким граблям не ходить)
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794536
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала в ней не так то, что CCur работает с ТЕКУЩИМ десятичным разделителем, а ты ему точку подсовываешь.
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794539
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Ну собственно проверку на ввод чисел я взял тут на форуме:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Private Sub doc_sum_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
            Me.ComList_ValOut.SetFocus
        Else
            KeyAscii = VNUM(KeyAscii, fld_OpSum, Me.fld_OpSum.Text, True, True)
    End If
End Sub

Public Function VNUM(intAscii As Integer, ctrControl As Control, strText As String, _
        Optional bSign As Boolean = False, _
        Optional bPoint As Boolean = False) As Integer
On Error GoTo errlbl

    Dim i As Integer
    ' Ввод символа по умолчанию
    VNUM = intAscii
    Select Case intAscii
        Case 8: ' Клавиша Backspace
        Case 45:
            If (Not bSign) Or (ctrControl.SelStart > 0) Or (InStr(strText, "-")) Or _
                (InStr(strText, "+")) Then VNUM = 0
        Case 44, 46
            If (Not bPoint) Or (InStr(strText, ".")) Or (InStr(strText, ",")) Then VNUM = 0
        Case 48 To 57: ' Цифры от 0 до 9
        Case Else
            VNUM = "0" ' Все остальное
            For i = 1 To 5
                Beep
            Next
    End Select
    
    Exit Function

errlbl:
    Me.MousePointer = 0
    MsgBox "Форма < Main >, процедура < btn_CurReq_Click >" & Chr(13) & _
            Err.Description, vbCritical + vbOKOnly, "Ошибка: " & Err.Number

End Function



А так же доп проверка по Lost focus это делал я . Скорее всего можно проще но я пока не знаю как :( Эта проверка у меня для всех полей формы

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
Function check_symb(str, name As String) As Boolean
On Error GoTo errlbl
    Dim pole As String
    Dim symb As String
    Dim l As Integer
    Dim i As Integer
    
        l = 0
        i = 1
        pole = ""
        symb = ""
        pole = str
        
        check_symb = False
        
        l = Len(Trim(pole))
        
        If Left(pole, 1) = ":" Or Left(pole, 1) = "-" Then
                MsgBox "Использование символов : и - в начале строки ввода запрещено!", vbCritical, "Ошибка"
                check_symb = True
            Else
            
                While i <= l
                    symb = Mid(Trim(pole), i, 1)
                    Select Case UCase(symb)
                        Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "(", ")", ",", ".", "-", "'", "?", ":", "+", "/", _
                                "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", _
                                "U", "V", "W", "X", "Y", "Z", " "
                        Case Else
                            MsgBox "Введен недопустимый символ в поле " & name, vbCritical, ""
                            check_symb = True
                            Exit Function
                    End Select
                    symb = ""
                    i = i + 1
                Wend
        End If
    Exit Function

errlbl:

    MsgBox "Форма < Main >, процедура < btn_CurReq_Click >" & Chr(13) & _
            Err.Description, vbCritical + vbOKOnly, "Ошибка: " & Err.Number

End Function



вот как то так. Если будут замечания буду рад.
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794546
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProДля начала в ней не так то, что CCur работает с ТЕКУЩИМ десятичным разделителем, а ты ему точку подсовываешь.
А вот это устанавливает текущий разделитель ввиде точки? правильно я понимаю?
Код: vbnet
1.
Delimiter = Format$(0.1, ".")



если так то тогда конечно пока я его не установлю Тайп мисмач будет вечен
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794569
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_men,

Ты меня расстраиваешь очень сильно.
Данный код присваивает переменной Delimiter значение текущего системного разделителя
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794586
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

"Я не волшебник" я стараюсь научиться, просто раньше я этот вопрос обходил стороной. Банально заставляя менять региональные настройки. Сейчас хочу решить его. Я любитель и к моему сожалению не обучался программированию специально, поэтому осваиваю по мере решения конкретных задач и пока еще очень немного знаю. Надеюсь освою :) Во всяком случае вроде на форуме я свои же вопросы не повторяю :)
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794599
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_men"Я не волшебник" я стараюсь научиться, просто раньше я этот вопрос обходил стороной.да не, меня просто расстроило - тут же банальное присвоение значения переменной, которую я к тому же еще и объявил для наглядности.
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794603
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProAlex_men,

Ты меня расстраиваешь очень сильно.
Данный код присваивает переменной Delimiter значение текущего системного разделителя

Тогда я не понимаю как отрабатывает конструкция
Код: vbnet
1.
CCur(Replace(Replace(Text1, ".", Delimiter), ",", Delimiter))



Допустим в региональных настройках запятая тогда Delimiter получает значение запятая (из системы)

Replace(Text1, ".", Delimiter) - меняем точку на запятую
(Replace(Replace(Text1, ".", Delimiter), ",", Delimiter))- меняем запятую на запятую
CCur(Replace(Replace(Text1, ".", Delimiter), ",", Delimiter)) работает с текущим параметром т.е с запятой.

мне так кажется я тут вообще не понимаю. Уж извините за расстройство
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794615
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция CCur работает с текущим системным разделителем
Поэтому все точки и запятые нужно заменить на текущий системный разделитель, чтобы она корректно отработала. При этом системным разделителем может быть хоть "#"
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794622
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProAlex_men"Я не волшебник" я стараюсь научиться, просто раньше я этот вопрос обходил стороной.да не, меня просто расстроило - тут же банальное присвоение значения переменной, которую я к тому же еще и объявил для наглядности.

вот я и не понимаю чем

Delimiter = Format$(0.1, ".")
lcl_sum32 = CCur(Replace(Text1, ",", Delimiter))

отличается от lcl_sum32 = CCur(Replace(Text1, ",","."))

и тут и там идет замена командой Replace в строковой Text1 символа запятая на символ точки. вот я чего не понимаю
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794634
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

а стоп кажется понял если я меняю в строке просто на символ с клавиатуры, то код не воспринимает это как системнй разделитель и продолжает думать что это произвольный код., и соответственно ругается не на присвоение рекордсету а на выполнtние команды Ccur. Так?
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794637
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menна символ точки.где тут смайлик, бьющийся головой о стену? В первом случае не на символ точки, а на текущий системный разделитель.
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794642
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Забудь про клавиатуру - это проблема ввода в тектовое поле
2) Забудь про рекордсет - если ты присваиваешь денежному полю денежную переменную, то тебе абсолютно положить на то, какой в системе стоит разделитель - он в это операции вообще не участвует!

У тебя есть одна задача, коректно преобразовать откуда-то взявшийся текст в тип Currency!
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794644
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Я уже поправился :) а голову жаааааааааааааалко я ей думаю и иногда ем :)
...
Рейтинг: 0 / 0
Еще раз по региональным настройкам.
    #37794665
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro1) Забудь про клавиатуру - это проблема ввода в тектовое поле
2) Забудь про рекордсет - если ты присваиваешь денежному полю денежную переменную, то тебе абсолютно положить на то, какой в системе стоит разделитель - он в это операции вообще не участвует!

У тебя есть одна задача, коректно преобразовать откуда-то взявшийся текст в тип Currency!

Понял. Спасибо большое
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Еще раз по региональным настройкам.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]