-
Есть в БД поле Cena Numeric 15,2
Создаю поле в рантайм:
f:=TBCDField.Create(nil);
f.FieldName:='Cena';
f.FieldKind:=fkData;
f.dataset:=IBTable1;
при открытии таблицы выход ошибка: Size mismatch for field 'cena', expecting: 4 actual: 0
Уже голову сломал, ничего не понимаю...
-
.Size :=
?
-
Ты не поверишь!
f.Size := ...
-
пробовал size разных размеров... то же самое
-
Есть в БД поле Cena Numeric 15,2
Создаю поле в рантайм:
f:=TBCDField.Create(nil);
1. Зачем в ратнтайм?
2. А почему создаешь бсд, а не мемо например?
-
В рантайм, потому что надо. БСД - потому Numeric
-
А почему не мемо если нумерик?
Почему бсд?
Почему не Image?
-
Кроме того, поля так не создаются.
Поля создаются через TFieldDefs
-
мля.. ну все поля прекрасно создаются.. и все работает, кроме BCD
-
> БСД - потому Numeric
в дельфе все "базовое" БСД идет через каренси.
-
И что?
-
да ничего, просто что бы ты там не поставил, точность больше чем у каренси не будет (отсюда "а смысл?").
ну и +, если один тип может подменять другой (), то почему ты уверен, что подмена будет равнозначная?
BCD в принципе "безразмерный" тип (в mssql от 5 до 17, с дельфе, если настоящий хз. возможно и 0 как мемо/блоб). почему не поставить тот у которого размер точно 4? (у тебя база судя по ошибке бсд 4 байтным). или хотя бы тот в который возможна автоконвертация (см. [9]).
-
если создаю поле другого типа, датасет ругается и все равно требует BCD
-
а вообще, открой таблицу как есть, без своих ухищрений с созданием, и посмотри какой там тип, размерность и тд.
-
там и есть BCD ))) Делфи интерпретирует большие нумерик поля как бсд. Беда - не получается создать в рантайм.
-
Ошибка выходит даже когда копирую структуру полей уже заполненной таблицы, где есть BCD ((
-
> большие нумерик поля как бсд.
> Size mismatch for field 'cena', expecting: 4 actual: 0
у темя максимум single по delphi-вому.
> Беда - не получается создать в рантайм.
при назначении в дизайн-тайм оно также создается в рантайм... только код генерит дельфя.
> Ошибка выходит даже когда копирую структуру полей уже заполненной таблицы, где есть BCD ((
либо криво копируешь либо чудо.
-
> у темя максимум single по delphi-вому.
ошибся, 4 байта ставится и для BCD поля (проверил), хотя размерность у него зачастую больше... странно, мжет чисто под указатель раздмер, а не под значение?
ну да ладно, все клево создается, и открывается, ошибка у автора в 17й строке.
-
Может разгадка в справке кроется
TBCDField konvertiert die Daten eines BCD-Wertes beim Übertragen aus einer Datenbanktabelle in einen Currency-Wert und beim Zurückschreiben der Daten von einem Currency-Wert in einen binärcodierten Dezimalwert. Wenn die zugrunde liegende Tabelle Werte enthält, für die eine größere Genaugikeit erforderlich ist, löst TBCDField eine Exception aus. Wenn Sie BCD-Werte mit mehr als 4 Dezimalstellen oder 20 signifikanten Stellen benötigen, sollten Sie satt dessen TFMTBCDField verwenden. TFMTBCDField ist ein echtes BCD-Feld mit der Genaugikeit des binärcodierten Dezimaltyps (TBCD), aber etwas geringerer Ausführungsgeschwindigkeit.
-
Ура, заработало! ))) сделал так Size:=0; для любых других значений выходит ошибка. Если не инициализировать Size - тоже ошибка. Знал бы прикуп - жил бы в Сочи )) Всем спасибо за помощь.