Конференция "Базы" » Помогите плиз с TBCDField.Create
 
  • passman © (02.12.13 11:02) [0]
    Есть в БД поле 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

    Уже голову сломал, ничего не понимаю...
  • [ВладОшин] © (02.12.13 11:08) [1]
    .Size :=
    ?
  • Ega23 © (02.12.13 11:08) [2]
    Ты не поверишь!
    f.Size := ...
  • passman © (02.12.13 11:59) [3]
    пробовал size разных размеров... то же самое
  • Медвешоног Порожог (02.12.13 13:25) [4]
    Есть в БД поле Cena Numeric 15,2

    Создаю поле в рантайм:

      f:=TBCDField.Create(nil);


    1. Зачем в ратнтайм?
    2. А почему создаешь  бсд, а не мемо например?
  • passman © (02.12.13 13:41) [5]
    В рантайм, потому что надо. БСД - потому Numeric
  • Медвешоног Порожог (02.12.13 13:46) [6]
    А почему не мемо если нумерик?
    Почему бсд?
    Почему не Image?
  • Медвешоног Порожог (02.12.13 13:47) [7]
    Кроме того, поля так не создаются.
    Поля создаются через TFieldDefs
  • passman © (02.12.13 14:00) [8]
    мля.. ну все поля прекрасно создаются.. и все работает, кроме BCD
  • sniknik © (02.12.13 14:21) [9]
    > БСД - потому Numeric
    в дельфе все "базовое" БСД идет через каренси.
  • passman © (02.12.13 14:37) [10]
    И что?
  • sniknik © (02.12.13 14:56) [11]
    да ничего, просто что бы ты там не поставил, точность больше чем у каренси не будет (отсюда "а смысл?").
    ну и +, если один тип может подменять другой (), то почему ты уверен, что подмена будет равнозначная?
    BCD в принципе "безразмерный" тип (в mssql от 5 до 17, с дельфе, если настоящий хз. возможно и 0 как мемо/блоб). почему не поставить тот у которого размер точно 4? (у тебя база судя по ошибке бсд 4 байтным). или хотя бы тот в который возможна автоконвертация (см. [9]).
  • passman © (02.12.13 15:02) [12]
    если создаю поле другого типа, датасет ругается и все равно требует BCD
  • sniknik © (02.12.13 15:03) [13]
    а вообще, открой таблицу как есть, без своих ухищрений с созданием, и посмотри какой там тип, размерность и тд.
  • passman © (02.12.13 15:09) [14]
    там и есть BCD ))) Делфи интерпретирует большие нумерик поля как бсд. Беда - не получается создать в рантайм.
  • passman © (02.12.13 15:11) [15]
    Ошибка выходит даже когда копирую структуру полей уже заполненной таблицы, где есть BCD ((
  • sniknik © (02.12.13 15:25) [16]
    > большие нумерик поля как бсд.
    > Size mismatch for field 'cena', expecting: 4 actual: 0
    у темя максимум single по delphi-вому.

    > Беда - не получается создать в рантайм.
    при назначении в дизайн-тайм оно также создается в рантайм... только код генерит дельфя.

    > Ошибка выходит даже когда копирую структуру полей уже заполненной таблицы, где есть BCD ((
    либо криво копируешь либо чудо.
  • sniknik © (02.12.13 15:32) [17]
    > у темя максимум single по delphi-вому.
    ошибся, 4 байта ставится и для BCD поля (проверил), хотя размерность у него зачастую больше... странно, мжет чисто под указатель раздмер, а не под значение?

    ну да ладно, все клево создается, и открывается, ошибка у автора в 17й строке.
  • Плохиш © (02.12.13 16:04) [18]
    Может разгадка в справке кроется

    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.

  • passman © (02.12.13 17:33) [19]
    Ура, заработало! ))) сделал так Size:=0; для любых других значений выходит ошибка. Если не инициализировать Size - тоже ошибка. Знал бы прикуп - жил бы в Сочи )) Всем спасибо за помощь.
  • sniknik © (02.12.13 17:39) [20]
    > сделал так Size:=0;
    как то "стремновато" получается...  под данные, что совсем места не надо? или он реально как мемо/блоб поле? но почему в дизайне ставит 4-ре? (и тест с этим же делал. разница в базах?)
  • passman © (02.12.13 17:49) [21]
    Согласен - коряво разрабы сделали, и текст ошибки не информативен. Я на D5 работаю, может в других версиях по другому...
  • passman © (02.12.13 18:07) [22]
    Разобрался с 4, это значение Size по умолчанию. А нужен 0. Вот и выходит ошибка: Size mismatch for field 'cena', expecting: 4 actual: 0.
    Делфи для BCD поля не использует свойство Size. Но нахрена тогда генерит ошибку? Могли бы просто игнорировать это поле...
  • Cobalt © (02.12.13 23:31) [23]
    passman ©  , если разобрался, отчего же не протрассировал дальше - почему требует 0-го размера?
  • Ega23 © (03.12.13 00:49) [24]

    > если разобрался, отчего же не протрассировал дальше - почему
    > требует 0-го размера?


    Ну тут что угодно может быть. В первую очередь я бы посмотрел на компоненты доступа.
  • Inovet © (03.12.13 02:15) [25]
    > [24] Ega23 ©   (03.12.13 00:49)
    > на компоненты доступа

    Не проапдейтчены?
 
Конференция "Базы" » Помогите плиз с TBCDField.Create
Есть новые Нет новых   [118764   +87][b:0][p:0.001]