Page 1 of 1

Add Calculated Column containing the recno

Posted: Thu 15 Apr 2010 15:00
by jfudickar
Hi,

did you have a code-sample how to create a calculated column which returns the record number of the result dataset.

It's not an option to change the sql-statement at runtime.

Kind regards
Jens

Posted: Fri 16 Apr 2010 12:57
by bork
Hello

You should add a calculated field and write the following OnCalcFields event handler for your dataset:

procedure TForm1.Query1CalcFields(DataSet: TDataSet);
begin
Query1CALC_FIELD.AsInteger := DataSet.RecNo; // fill calculated field
end;

Posted: Fri 16 Apr 2010 21:10
by jfudickar
Hi,

i want to create the field at runtime and not at designtime.

Do you have a sample how and when to create this field at runtime.

Regards
Jens

Posted: Mon 19 Apr 2010 10:07
by bork
There is an example of creating a field in the runtime:

procedure TForm1.Button1Click(Sender: TObject);
var
field_def: TFieldDef;
field: TField;
begin
OraQuery1.Close;

OraQuery1.FieldDefs.Add('MyCalcField', ftInteger, 0, false);
field_def := OraQuery1.FieldDefs.Items[OraQuery1.FieldDefs.Count - 1];
field := field_def.CreateField(OraQuery1);
field.FieldKind := fkCalculated;

OraQuery1.Open;
end;

procedure TForm1.OraQuery1CalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('MyCalcField').AsInteger := DataSet.RecNo;
end;

Posted: Mon 19 Apr 2010 21:44
by jfudickar
Hi,

this code is tricky. I would never had created such code.

So problem is, my problem is not not solved.

Code: Select all

procedure TForm1.Button1Click(Sender: TObject);
var
field_def: TFieldDef;
field: TField;
begin
OraQuery1.Close;

OraQuery1.Sql.Text := 'SELECT * FROM ALL_OBJECTS';

OraQuery1.FieldDefs.Add('MyCalcField', ftInteger, 0, false);
field_def := OraQuery1.FieldDefs.Items[OraQuery1.FieldDefs.Count - 1];
field := field_def.CreateField(OraQuery1);
field.FieldKind := fkCalculated;

OraQuery1.Open;
end;

procedure TForm1.OraQuery1CalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('MyCalcField').AsInteger := DataSet.RecNo;
end;
I've added only one line of code, and there are no design-time fields.

Sadly when the application runs, only the "MyCalcField" exists, no other fields from "ALL_OBJECTS".

Any further hints `?

Kind regards
Jens

Posted: Tue 20 Apr 2010 06:56
by bork
Hello

If you want to add a new column to the existing columns then you should modify your code:

Code: Select all

var
  i: integer;
  field_def: TFieldDef;
  field: TField;
begin
  OraQuery1.Close;

  OraQuery1.Sql.Text := 'SELECT * FROM ALL_OBJECTS';
  OraQuery1.Prepare; // Fill OraQuery1.FieldDefs

  OraQuery1.FieldDefs.Add('MyCalcField', ftInteger, 0, false);

  for i := 0 to OraQuery1.FieldDefs.Count - 1 do
  begin
    field_def := OraQuery1.FieldDefs.Items[i];
    field := field_def.CreateField(OraQuery1);
    if field.FieldName = 'MyCalcField' then
      field.FieldKind := fkCalculated;
  end;

  OraQuery1.Open;
end;

procedure TForm1.OraQuery1CalcFields(DataSet: TDataSet);
begin
  DataSet.FieldByName('MyCalcField').AsInteger := DataSet.RecNo;
end;

Posted: Tue 20 Apr 2010 20:36
by jfudickar
Hi,

sadly it doesn't work. So i've send a sample to the support.

Regards
Jens

Posted: Wed 21 Apr 2010 12:08
by bork
Hello

I sent answer by E-mail.

Posted: Wed 21 Apr 2010 21:47
by jfudickar
For all others:

My fault, I was not able to transfer the code completly :-(

Regards
Jens

Posted: Thu 22 Apr 2010 07:01
by bork
It is good to see that this problem has been solved :D