![]() |
|
|
![]()
|
|
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Блин. Опять проблема с национальными настройками
Есть программа:
Так вот. Если в системе установлен разделитель дробной части '.' (точка) то все ок. Оба locate будут успешными. Но, если в системе установлен разделитель дробной части ',' (запятая) то беда. Первый locate не в состоянии найти существующую запись! Т.е. если в таком случае (разделитель ','), нет возможности найти запись по значению вещественного поля! Передавать значение в виде строки возможно не всегда. -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Grig |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 809 Регистрация: 29.4.2005 Где: Иркутск Репутация: 4 Всего: 16 |
В файле SysUtils.pas есть переменная DecimalSeparator.
Попробуй использовать ее. Например:
Добавлено @ 11:29 Или во! Еще круче:
Это сообщение отредактировал(а) Grig - 18.7.2005, 11:25 -------------------- |
||||
|
|||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 17 Всего: 162 |
В свое время писал:
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Ребята, вы меня не поняли.
ds.Locate('fld','2.123',[]) всегда сработает правильно не зависимо от текущего значения DecimalSeparator. А вот ds.Locate('fld',2.123,[]), опять же вне зависимости от от текущего значения DecimalSeparator, может сработать, а может и не сработать. Все зависит от состояния настройки в системе! Причем, обратите внимание что второй параметр это значение типа Double (Currency, и т.п.). Специально включил в пост полноценно работающий пример. Можете проверить. -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Разборки показали что это похоже косяк Microsoft!
У Borland'а, при обработке Locate, происходит преобразование всех числовых параметров в строку, в соответствии с текущими настройками системы (не DecimalSeparator!). Для этого используется функция VarToStr. А полученные значения передаются в COM-объекту Recordset в параметр Criteria метода Find. Так вот при выполнении этого метода, запись и не находится. Более того, когда таких параметров много (поиск по нескольким полям), я иногда наблюдал Exception ADO! Ему видете-ли похоже всегда надо '.' давать. Проверял и на MSACCESS, и на MS-SQL. В MSDN об этом естествеенно ничего не сказано. В принципе, если бы быть уверенным что Recordset.Find всегда требует '.' в качестве разделителя, то можно было бы подправить ADODB.pas, и выполнять преобразование не зависимо от текущих настроек системы. -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Вот. Alex нашел сообщение об аналогичной проблемме http://coding.derkeiler.com/Archive/Delphi...04-03/0290.html
-------------------- Все знать невозможно, но хочется |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
тогда нужно на время работы программы или определённого куска кода (или формы) в системе (глобально) менять разделитель. Вернее Проверять, если не точка, то менять на точку. Пока другого выхода я не вижу.
|
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Уж лучше тогда подправить ADODB.pas -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
продолжай
|
|||
|
||||
| kobra |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 730 Регистрация: 15.6.2005 Где: Грузия, Тбилиси Репутация: 1 Всего: 9 |
Петрович мне кажется все так и должно быть.
попробуи в начало скрипта вставить
|
|||
|
||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 17 Всего: 162 |
kobra, сам попробуй и увидишь, что это ни как не повлияет.
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| kobra |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 730 Регистрация: 15.6.2005 Где: Грузия, Тбилиси Репутация: 1 Всего: 9 |
извеняюс, не дописал
|
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Блин. Ты сам-то пробовал -------------------- Все знать невозможно, но хочется |
|||
|
||||
| kobra |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 730 Регистрация: 15.6.2005 Где: Грузия, Тбилиси Репутация: 1 Всего: 9 |
да, все работает (по краинеи мере у меня). |
|||
|
||||
| Петрович |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Да вариантов много. Вот например решение "в лоб". В модуле ADODB.pas, надо подправить процедуру GetFilterStr. Там есть case:
А вообще, все дело в том, что при выполнении преобразования Variant -> String, в некоторых случаях, в частности когда в Variant значение типа Currency, используется процедура преобразования из OS (в данном случае CurrToWStrViaOS). Мне в принципе не понятно почему в одних случаях используется преобразование реализуемое Delphi, а в других, реализуемое OS. Но, это уже отдельная тема. -------------------- Все знать невозможно, но хочется |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |