Истинный тип поля для ConstColumn

Здравствуй, дорогой читатель.

В нашу редакцию часто приходят письма:
почему, если я создал FloatDataField (Поле с дробным значением) размером 15, сослал его на ConstColumn (Колонку-константу) с DataType (Типом данных) = Float (Дробное число) и заполнил это поле значением большим, чем 2147483647, я получаю ошибку

   TSObjectLibrary.DBDataset: Invalid value for field '...'

Спешим ответить: причина в том, что ваше поле, независимо от указанных вами типов, было распознано как Integer (создан внутренний объект TField с типом значения Integer). Фокус в том, что тип поля для константных колонок определяется по начальному значению в этом поле, например:

если начальное значение NULL, то тип поля Integer;
если начальное значение '', то тип поля String;
если начальное значение 3 , то тип Integer;
если начальное значение 3,3 , то тип поля Float.

То же самое касается SQLTextColumn, в которых мы указываем константные значения.
Если хотим редактируемое дробное поле, которое ссылается на колонку-константу с пустым (нулевым) начальным значением, то единственный выход, который я вижу - это создать SQLTextColumn с значением 0.0 (дробный ConstColumn со значением 0,0 не проходит, т.к. значение преобразуется в 0 и поле снова считается Integer).

Нравится

Поделиться

4 комментария

Интересный материал. Теперь, если столкнусь с такой проблемой, не буду писать письма в редакцию, а сразу все сделаю правильно:smile:

Вот это да! Спасибо за такое исследование и за пример для типа Float.
А как мне сделать так, чтоб поле распозналось как дата/время и при этом было пустое?

"Кривонос Максим" написал:
А как мне сделать так чтоб поле распозналось как дата/время и при этом было пустое?

Создать SQLTextColumn с текстом

CAST(NULL AS DATETIME)

Спасибо

Показать все комментарии