Создание вычисляемых полей в Run-Time (FIBPlus 4.8.1)

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
zunder
Сообщения: 5
Зарегистрирован: 30 дек 2005, 09:43

Создание вычисляемых полей в Run-Time (FIBPlus 4.8.1)

Сообщение zunder » 30 янв 2006, 10:52

столкнулся с такой проблемой: создаю вычисляемые поля в TpFIBDataSet только почему то при открытиии онного эксепшины лезут, ноги растут из модуля FIBDataSet

Код: Выделить всё

function TFIBCustomDataSet.GetXSQLVAR(Fld:TField):TXSQLVAR;
сначало при обработке последнего поля вылазит

Код: Выделить всё

feXSQLDAIndexOutOfRange
далее появляются след ексепшны "DataSet.Field Размер поля слишком мал".
вот код который у меня выполняется перед открытием DataSet

Код: Выделить всё

  //1) получаем описание полей запроса
  dstMain.FieldDefs.Update;
  //2) добавляем описание нового вычисляемого поля
  with dstMain.FieldDefs.Insert(0) as TFieldDef do begin
    Name := 'zzz';
    DataType := ftFloat;
  end;
  //3) создаем все описанные поля 
  for i := 0 to dstMain.FieldDefs.Count-1 do begin
    if dstMain.FindField(dstMain.FieldDefs[i].Name) = nil then
      dstMain.FieldDefs[i].CreateField(dstMain);
  end;
  //4) настраиваем вычисляем поле
  if dstMain.FindField('zzz') <> nil then begin
    dstMain.FindField('zzz').FieldKind := fkCalculated;
    dstMain.FindField('zzz').DisplayLabel := 'calc';
    dstMain.FindField('zzz').Visible := True;
  end;
  //5) открываем DataSet
  dstMain.Open;
подскажите что в коде не так или может какие настройки особые должны в TpFIBDataSet ставится чтобы таким образом поля можно было добавлять? :?:

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 30 янв 2006, 12:23

TField.FieldKind

zunder
Сообщения: 5
Зарегистрирован: 30 дек 2005, 09:43

Сообщение zunder » 30 янв 2006, 12:28

заменил

Код: Выделить всё

with dstMain.FieldDefs.Insert(0) as TFieldDef do begin 
    Name := 'zzz'; 
    DataType := ftFloat; 
  end; 
на

Код: Выделить всё

dstMain.FieldDefs.Add(FCalcFieldDefs[i].FieldName,FCalcFieldDefs[i].DataType);
и ошибки перестали вылазить и все заработало, только я не понял - почему :?
может кто объяснит

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 30 янв 2006, 16:23

разработчики FIBPlus объяснят, может быть.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 30 янв 2006, 17:21

zunder писал(а):заменил

Код: Выделить всё

with dstMain.FieldDefs.Insert(0) as TFieldDef do begin 
    Name := 'zzz'; 
    DataType := ftFloat; 
  end; 
на

Код: Выделить всё

dstMain.FieldDefs.Add(FCalcFieldDefs[i].FieldName,FCalcFieldDefs[i].DataType);
и ошибки перестали вылазить и все заработало, только я не понял - почему :?
может кто объяснит
Повторяю - TField.FieldKind.

zunder
Сообщения: 5
Зарегистрирован: 30 дек 2005, 09:43

Сообщение zunder » 01 фев 2006, 08:44

2 merlin
причем тут

Код: Выделить всё

TField.FieldKind
чем тебя не устраивает в п.4 следующая строчка

Код: Выделить всё

dstMain.FindField('zzz').FieldKind := fkCalculated;
я не понимаю что ты хочешь мне объяснить написав

Код: Выделить всё

TField.FieldKind
:wink:

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 01 фев 2006, 12:47

Чё тут понимать, очки мне надо менять, проглядел эту строчку :) Но, судя по эксепшену, датасет таки не воспринял что поле калькулируемое и лезет за ним в возвращаемый набор. Это надо действительно у них на саппорте выяснять.

Ответить