Гость
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Отобаражение NUMERIC полей / 25 сообщений из 30, страница 1 из 2
16.04.2020, 19:39
    #39948203
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
Я так понимаю, что сейчас NUMERIC поля отображаются как Double. В результате для поля типа NUMERIC(3,1) я вижу значение типа 12.300000000002. Нельзя ли при выводе обрезать строку до стольки знаков, сколько указано в типе?


С уважением, Vasilisk
...
Рейтинг: 0 / 0
17.04.2020, 04:49
    #39948246
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
_Vasilisk_
Я так понимаю, что сейчас NUMERIC поля отображаются как Double. В результате для поля типа NUMERIC(3,1) я вижу значение типа 12.300000000002. Нельзя ли при выводе обрезать строку до стольки знаков, сколько указано в типе?


Где видишь-то? В настройках форматирования данных указано "использовать масштаб поля"?
...
Рейтинг: 0 / 0
17.04.2020, 10:43
    #39948297
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
IBExpert
Где видишь-то?
Хороший вопрос. Вижу при переводе грида в режим редактирования (поле объявлено как NUMERIC(18,6))
IBExpert
В настройках форматирования данных указано "использовать масштаб поля"?
Да

И параллельный вопрос: нельзя ли в настройку вынести DecimalSeparator или хотя бы всегда использовать точку? Очень не удобно копировать значение поля в параметр запроса
...
Рейтинг: 0 / 0
19.04.2020, 15:51
    #39948769
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
_Vasilisk_
Вижу при переводе грида в режим редактирования (поле объявлено как NUMERIC(18,6))


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


_Vasilisk_

И параллельный вопрос: нельзя ли в настройку вынести DecimalSeparator или хотя бы всегда использовать точку? Очень не удобно копировать значение поля в параметр запроса


В свежей версии выполни
Код: pascal
1.
ibec_SetGlobalVar('IBE$DECIMAL_SEPARATOR', '.');


в event block'е, например, который после старта эксперта выполняется.
...
Рейтинг: 0 / 0
21.04.2020, 13:03
    #39949306
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
IBExpert
В свежей версии выполни
Спасибо
...
Рейтинг: 0 / 0
21.04.2020, 13:23
    #39949314
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
IBExpert
При редактировании формат с максимальной точностью используется. В данный момент я не уверен, что будет правильно это менять.
Как вариант, при начале редактирования отображать все же содержимое поля, но давать пользователю ввести значение любой точности. Ну нет в поле значения 12.300000000002, которое отображается изначально
...
Рейтинг: 0 / 0
21.04.2020, 16:26
    #39949442
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
IBExpert
В свежей версии выполни
Код: pascal
1.
ibec_SetGlobalVar('IBE$DECIMAL_SEPARATOR', '.');

После запуска все замечательно. Но в какой-то момент настройка слетает и опять начинает отображаться системный разделитель
...
Рейтинг: 0 / 0
21.04.2020, 16:41
    #39949449
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
_Vasilisk_
После запуска все замечательно. Но в какой-то момент настройка слетает и опять начинает отображаться системный разделитель


Нужно попытаться определить, что это за момент, или хотя бы после чего. Иначе я до второго пришествия могу искать.
...
Рейтинг: 0 / 0
21.04.2020, 17:53
    #39949514
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
IBExpert
Иначе я до второго пришествия могу искать
Да понятно. Но я же тоже специально не отслеживаю. В какой-то момент открыл таблицу, а там зяпятые
...
Рейтинг: 0 / 0
21.04.2020, 19:24
    #39949591
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
_Vasilisk_
Но в какой-то момент настройка слетает
Опять проявилось. При этом
Код: sql
1.
ibec_GetGlobalVar('IBE$DECIMAL_SEPARATOR', '-')

по прежнему возвращает точку.

Может ты мне какую-нибудь Debug версию сделаешь с логами?
...
Рейтинг: 0 / 0
22.04.2020, 04:49
    #39949838
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
Оставь сейчас эту переменную в покое. При ее установке просто изменяется SysUtils.DecimalSeparator.
И если потом кто-то где-то (включая сторонние компоненты) зачем-то меняет SysUtils.DecimalSeparator опять - на значении IBE$DECIMAL_SEPARATOR это никак не отразится.

Ну и, соответственно, протоколирование тут не поможет.

Вспоминай, что ты делал перед тем, как разделитель обратно к системному вернулся. Может, данные экспортировал. Может, еще что-то. Короче, нужен способ воспроизвести ситуацию.
Поиском по коду я уже проверил и ничего не нашел.
...
Рейтинг: 0 / 0
22.04.2020, 17:16
    #39950089
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
IBExpert
Вспоминай, что ты делал перед тем, как разделитель обратно к системному вернулся
Сейчас все что делаю, так это активно модифицирую процедуры в базе
...
Рейтинг: 0 / 0
22.04.2020, 21:28
    #39950201
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
Ага, я недавно точно такой же глюк в приложении из-за TJvAppEvents отловил. Ну, мало ли... :)
...
Рейтинг: 0 / 0
18.05.2020, 17:41
    #39959046
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
IBExpert
И если потом кто-то где-то (включая сторонние компоненты) зачем-то меняет SysUtils.DecimalSeparator опять - на значении IBE$DECIMAL_SEPARATOR это никак не отразится.
А если добавить
Код: pascal
1.
Application.UpdateFormatSettings := False;

?

Такое ощущение, что разделитель меняется просто со временем
...
Рейтинг: 0 / 0
19.05.2020, 05:47
    #39959226
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
_Vasilisk_

Application.UpdateFormatSettings := False;
[/src]?

Такое ощущение, что разделитель меняется просто со временем


Не понял, при чем тут Application.UpdateFormatSettings? Разделитель - это просто переменная в SysUtils.
...
Рейтинг: 0 / 0
19.05.2020, 11:49
    #39959342
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
IBExpert
Не понял, при чем тут Application.UpdateFormatSettings? Разделитель - это просто переменная в SysUtils.
При том, что система может рассылать броадкастом WM_WININICHANGE, который приводит к переинициализации системных разделителей. А UpdateFormatSettings блокирует это обновление
Код: pascal
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.
procedure TApplication.WndProc(var Message: TMessage);
............
begin
    ..............
    CheckIniChange(Message);
    ..........
end;
..................
function TApplication.CheckIniChange(var Message: TMessage): Boolean;
begin
  Result := False;
  if (Cardinal(Message.Msg) = RM_TaskbarCreated) or
     (Cardinal(Message.Msg) = WM_WININICHANGE) then
  begin
    if UpdateFormatSettings then
    begin
      SetThreadLocale(LOCALE_USER_DEFAULT);
      GetFormatSettings;
    end;
    if UpdateMetricSettings then
      Screen.GetMetricSettings;
    ................
  end;
end;

procedure GetFormatSettings;
begin
  InitSysLocale;
  if SysLocale.FarEast then
    GetEraNamesAndYearOffsets;
  FormatSettings := TFormatSettings.Create('');
end;
...
Рейтинг: 0 / 0
19.05.2020, 11:57
    #39959355
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
_Vasilisk_,
Добавить, а если вдруг и после этого будут сбиваться, то проверять его значение. У меня как раз сторонняя компонента его обратно выставляла в True, после чего и слетали эти переменные на дефолтные.
...
Рейтинг: 0 / 0
24.05.2020, 13:06
    #39961315
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
_Vasilisk_
При том, что система может рассылать броадкастом WM_WININICHANGE, который приводит к переинициализации системных разделителей.


Ну, ОК. Посмотрел я всю эту требуху. Запрещать UpdateFormatSettings я не буду - это неправильно. Тем более, что саму GetFormatSettings может дернуть кто угодно и когда угодно. Правильным решением было бы восстанавливать пользовательские разделители после каждого вызова GetFormatSettings, но я пока не придумал, как это сделать.
...
Рейтинг: 0 / 0
25.05.2020, 13:49
    #39961682
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
IBExpert
Правильным решением
Ну, если честно, то правильным решением было бы использование TField.OnGetData/TField.OnSetData с вызовом внутри FormatFloat/ParseFloat с собственными разделителями. А глобальные переменные не трогать вообще
...
Рейтинг: 0 / 0
26.05.2020, 14:04
    #39962233
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
Правильным-то решением как раз было бы не использовать собственный разделитель от слова "вообще".
...
Рейтинг: 0 / 0
28.05.2020, 07:10
    #39963156
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
_Vasilisk_
Ну, если честно, то правильным решением было бы использование TField.OnGetData/TField.OnSetData с вызовом внутри FormatFloat/ParseFloat с собственными разделителями.


В твоем случае, когда запятую надо заменить на точку только для того, чтобы в текст запроса вставить без лишних правок, правильного решения, похоже, вообще нет.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
06.12.2021, 16:02
    #40117826
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
Подниму тему. В isql пишу
Код: sql
1.
SELECT CAST(999999999999 AS NUMERIC(18, 6)) FROM RDB$DATABASE;


Получаю
Код: plaintext
1.
2.
                 CAST
=====================
  999999999999.000000
Пишу этот же запрос в SQL Editor. Получаю999 999 999 999.000122.

А основная проблема в том, что я не могу отредактировать из-за этого запись в обновляемом представлении. У меня в исходной таблице число записано в строковом поле, в представлении я его преобразовываю в NUMERIC
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR ALTER VIEW VW_VEW1(
    VAL)
AS
SELECT
  CAST(cfg.IDENT AS NUMERIC(18, 6))
FROM
  mytable cgf
;


а потом BEFORE UPDATE триггер не может найти эту запись
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR ALTER TRIGGER TR_VW_VIEW1_BU0 FOR VW_VIEW1
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
  UPDATE mytable cfg SET
    cfg.IDENT = NEW.VAL
  WHERE
    cfg.IDENT = OLD.VAL
END



Ну и чтобы два раза не вставать. При отображении в гриде разряды разделяются пробелами. Это хорошо. А вот при редактировании ячейки раньше эти пробелы удалялись, а теперь остаются. В итоге запись невозможно отредактировать, пока не уберешь эти пробелы
...
Рейтинг: 0 / 0
14.12.2021, 09:44
    #40119833
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
_Vasilisk_
Подниму тему.


У меня есть альтернативная версия датасета, где подобные нумерики хранятся как int64, а не переводятся в double. Там таких проблем нет, но я не уверен, что не сломал в процессе переделки что-то еще. Починят сервер - выложу отдельно, наверное. Или обычный билд с ней соберу.
...
Рейтинг: 0 / 0
16.12.2021, 07:52
    #40120475
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
_Vasilisk_,

Попробуй свежую версию.
...
Рейтинг: 0 / 0
30.12.2021, 22:40
    #40124286
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отобаражение NUMERIC полей
IBExpert
Попробуй свежую версию.
2021.12.22.1
_Vasilisk_
Пишу этот же запрос в SQL Editor. Получаю999 999 999 999.000122
Осталось
_Vasilisk_
а потом BEFORE UPDATE триггер не может найти эту запись
Поправилось.
_Vasilisk_
При отображении в гриде разряды разделяются пробелами. Это хорошо. А вот при редактировании ячейки раньше эти пробелы удалялись, а теперь остаются
Поправилось

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


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