Страница 1 из 1

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

Добавлено: 30 янв 2006, 10:52
zunder
столкнулся с такой проблемой: создаю вычисляемые поля в 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 ставится чтобы таким образом поля можно было добавлять? :?:

Добавлено: 30 янв 2006, 12:23
Merlin
TField.FieldKind

Добавлено: 30 янв 2006, 12:28
zunder
заменил

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

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

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

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

Добавлено: 30 янв 2006, 16:23
kdv
разработчики FIBPlus объяснят, может быть.

Добавлено: 30 янв 2006, 17:21
Merlin
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.

Добавлено: 01 фев 2006, 08:44
zunder
2 merlin
причем тут

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

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

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

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

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

TField.FieldKind
:wink:

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