Add Calculated Column containing the recno

Discussion of open issues, suggestions and bugs regarding ODAC (Oracle Data Access Components) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
jfudickar
Posts: 202
Joined: Fri 10 Mar 2006 13:03
Location: Oberursel / Germany

Add Calculated Column containing the recno

Post by jfudickar » Thu 15 Apr 2010 15:00

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

bork
Devart Team
Posts: 649
Joined: Fri 12 Mar 2010 07:55

Post by bork » Fri 16 Apr 2010 12:57

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;

jfudickar
Posts: 202
Joined: Fri 10 Mar 2006 13:03
Location: Oberursel / Germany

Post by jfudickar » Fri 16 Apr 2010 21:10

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

bork
Devart Team
Posts: 649
Joined: Fri 12 Mar 2010 07:55

Post by bork » Mon 19 Apr 2010 10:07

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;

jfudickar
Posts: 202
Joined: Fri 10 Mar 2006 13:03
Location: Oberursel / Germany

Post by jfudickar » Mon 19 Apr 2010 21:44

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

bork
Devart Team
Posts: 649
Joined: Fri 12 Mar 2010 07:55

Post by bork » Tue 20 Apr 2010 06:56

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;

jfudickar
Posts: 202
Joined: Fri 10 Mar 2006 13:03
Location: Oberursel / Germany

Post by jfudickar » Tue 20 Apr 2010 20:36

Hi,

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

Regards
Jens

bork
Devart Team
Posts: 649
Joined: Fri 12 Mar 2010 07:55

Post by bork » Wed 21 Apr 2010 12:08

Hello

I sent answer by E-mail.

jfudickar
Posts: 202
Joined: Fri 10 Mar 2006 13:03
Location: Oberursel / Germany

Post by jfudickar » Wed 21 Apr 2010 21:47

For all others:

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

Regards
Jens

bork
Devart Team
Posts: 649
Joined: Fri 12 Mar 2010 07:55

Post by bork » Thu 22 Apr 2010 07:01

It is good to see that this problem has been solved :D

Post Reply