Firebird numeric(14, 4) - проблемы с IBX

s62
Дата: 04.07.2019 16:01:12
Приветствую.
Есть учетная программа, написаная на Дельфи и использующая Firebird 2.5 через IBX. В IBX пара модулей отредактированные, уже не помню, откуда их взял в свое время или что в них правил по каким-то рекомендациям. В Delphi 2010 с одним моментом проблем не было, в Delphi XE3 возникла.
В БД есть домен PRICES
CREATE DOMAIN PRICES AS
NUMERIC(14,4);

В Delphi, если создаю persistent поля, то получается TIBBCDField, про который в исходниках IBX написано в комментарии
  {  Actually, there is no BCD involved in this type,
     instead it deals with currency types.
     In IB, this is an encapsulation of Numeric (x, y)
     where x < 18 and y <= 4.
     Note: y > 4 will default to Floats
  }

Свойство Size по умолчанию для компонента TIBBCDField равно 8, но в моем случае 4 (в Delphi 2010) и работает нормально. В Delphi XE3 компилируется нормально, но во время работы программы возникает исключение в TDataSet.CheckFieldCompatibility в строчках
if (Field.DataType in CheckTypeSizes) and (Field.Size <> FieldDef.Size) then
    DatabaseErrorFmt(SFieldSizeMismatch, [Field.DisplayName, Field.Size,
      FieldDef.Size], Self);

Исправляю в свойствах поля свойство Size на 4, компилируется, работает без ошибок, но потом, то ли при сохранении, то ли в какой-то еще момент размер снова становится 8 и появляется эта ошибка.
Project LesDb.exe raised exception class EDatabaseError with message 'ibqDevices: Size mismatch for field 'Цена, у.е.', expecting: 8 actual: 4'.

Никто не сталкивался?
s62
Дата: 04.07.2019 16:03:52
s62
Исправляю в свойствах поля свойство Size на 4, компилируется, работает без ошибок, но потом, то ли при сохранении, то ли в какой-то еще момент размер снова становится 8 и появляется эта ошибка.
То есть появляется при следующей (одной из следующих) компиляций.
s62
Дата: 04.07.2019 16:05:27
s62,
точнее в процессе работы программы после компиляции, как описано в первом сообщении - когда открывается датасет (например при открытии окна), в котором есть такое поле.
_Vasilisk_
Дата: 04.07.2019 16:19:43
s62,

Устанавливай значение в TDataSet.AfterOpen
s62
Дата: 04.07.2019 16:29:59
_Vasilisk_
s62,

Устанавливай значение в TDataSet.AfterOpen
Спасибо за наводку, AfterOpen не помогло, а BeforeOpen помогло. Сейчас попробую со всеми датасетами.
Вот не понял пока причину, откуда это берется.
Gator
Дата: 04.07.2019 16:50:35
s62, FB не знаю толком и не знаю, что такое CREATE DOMAIN PRICES AS NUMERIC(14,4);
Похоже на ТИП ДАННЫХ с фиксированной точкой

Попробуй в FB представить его в удобоваримый дельфийский тип.
Напр., Extended, String, BCD, парой целых(до и после запятой)

Вьюшкой, функцией, что там у FB есть?
s62
Дата: 04.07.2019 17:00:51
Gator,

да, это тип данных с фиксированной точкой, у меня в программе его значения присваиваются переменным типа Currency. Использую для цен.
Док
Дата: 05.07.2019 11:14:04
s62
В IBX пара модулей отредактированные, уже не помню, откуда их взял в свое время или что в них правил по каким-то рекомендациям

А взять оригинальные исходники и диффом пройтись по своим, не вариант?
s62
Дата: 05.07.2019 13:15:03
Док
s62
В IBX пара модулей отредактированные, уже не помню, откуда их взял в свое время или что в них правил по каким-то рекомендациям

А взять оригинальные исходники и диффом пройтись по своим, не вариант?
Проходил когда-то, но это не так важно в данной теме, эти немногочисленные изменения касаются других вещей (глянул сейчас, там на самом деле одно место, касающееся строкового поля, и имя клиентской библиотеки заменено на fbclient). Просто написал об этом для полноты описания ситуации. :)