Page 1 of 1

cannot use calculated fields

Posted: Mon 28 Nov 2016 16:38
by albourgz
unidac 6.4.16, c++ builder XE10 pro, win32 vcl
TUniQuery QDict: select id from table, no fields at design time.
A TUniDataSource and TCRDBGrid are linked to this query.
Code:

Code: Select all

TField *QDictBTSConf, *QDictGacConf, *QDictID;
...
void __fastcall TFJobDetail::QDictBeforeOpen(TDataSet *DataSet)
{
    int i;
    if (DataSet->FieldDefs->Count==0)
        DataSet->FieldDefs->Update();
    if (DataSet->FieldCount==0) {
        for (i=0; i<DataSet->FieldDefs->Count; i++)
            DataSet->FieldDefs->Items[i]->CreateField(DataSet);
        }
//    {now create the calculated fields}
    AddField(DataSet,"BTSCONF");
    AddField(DataSet,"GACCONF");
}

void AddField(TDataSet *ds, AnsiString sField)
{
    TField *f;
    f= new TField  ( ds );
    f->FieldName= sField;
    f->Calculated = true;
    f->Visible = true;
    ds->Fields->Add ( f );
}

void __fastcall TFJobDetail::QDictCalcFields(TDataSet *DataSet)
{
    if (QDictID==NULL) {
        QDictID=QDict->FieldByName("ID");
        QDictBTSConf=QDict->FieldByName("BTSCONF");
        QDictGacConf=QDict->FieldByName("GACCONF");
        }
    QDictBTSConf->AsInteger=1;
    QDictGacConf->AsInteger=2;
}

void __fastcall TFJobDetail::SBSearchClick(TObject *Sender)
{
    QDict->Open();
}
...
I get:
QDict: Field 'BTSCONF' cannot be a calculated or lookup field.
on open (against oracle and against postgres).

Debugger shows I do not enter QDictCalcFields.
Why why why? What's missing? I think this was OK with 6.4.15.

Re: cannot use calculated fields

Posted: Fri 02 Dec 2016 09:53
by AlexP
It is a correct error which does not depend on our components. When creating a field you need to create a specific type instance, in your case it is TIntegerField.

P.S. You will get the same error if you even use the standard ClientDataSet