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
