wimmeyvaert
asked on
Getting the FieldList from an SQL-Statement and add then to the Fields of a TADOQuery
Hi all,
I have a TADOQuery-Component that can hold any SQL-Statement (Select-Query).
So, from my IDE, the FieldsEditor contains no fields.
When I fill the SQL-property with e.g. 'SELECT * FROM MyTable' and I open the Query, the results are showed in a DBGrid with the FieldNames displayed as ColumnHeaders.
So far so good... BUT !!
Now I also want to include my own calculated field ('RowNumber') that holds the RecNo-Value of the current record.
So I have to add this field at runtime, just before I open mu Query.
This is my code to Add the Calulated Field to the DataSet:
procedure TfrmBaseQueryAnalyzerStand Alone.AddR owNumberFi eld( DataSet: TDataSet; ColNr: Integer );
var
fld: TIntegerField;
begin
{ First check if the Calculated Field already exists. If so, do nothing. If not, create it now. }
if DataSet.FindField( 'CalcRowNumber' ) = nil then
begin
showmessage( inttostr( DataSet.FieldCount ) );
DataSet.Close;
fld := TIntegerField.Create( DataSet );
with fld do
fld.Name := 'RowNumber';
fld.FieldName := 'RowNumber';
fld.FieldKind := fkCalculated;
fld.Index := ColNr-1;
fld.DisplayLabel := 'RijNr';
fld.DataSet := DataSet;
DataSet.FieldDefs.Add( fld.Name, ftInteger, 0, False );
showmessage( inttostr( DataSet.FieldCount ) );
DataSet.Open;
end;
end;
The code works fine, but the result is that my Dataset ONLY contains this calculated field.
So, I guess I should add all the fields which are in my SELECT-Clause of my query also to my DataSet by code.
Is there anyone who knows how to do this ?
Or maybe another way to accomplish what I want ?
Thanks in advance,
Wim.
I have a TADOQuery-Component that can hold any SQL-Statement (Select-Query).
So, from my IDE, the FieldsEditor contains no fields.
When I fill the SQL-property with e.g. 'SELECT * FROM MyTable' and I open the Query, the results are showed in a DBGrid with the FieldNames displayed as ColumnHeaders.
So far so good... BUT !!
Now I also want to include my own calculated field ('RowNumber') that holds the RecNo-Value of the current record.
So I have to add this field at runtime, just before I open mu Query.
This is my code to Add the Calulated Field to the DataSet:
procedure TfrmBaseQueryAnalyzerStand
var
fld: TIntegerField;
begin
{ First check if the Calculated Field already exists. If so, do nothing. If not, create it now. }
if DataSet.FindField( 'CalcRowNumber' ) = nil then
begin
showmessage( inttostr( DataSet.FieldCount ) );
DataSet.Close;
fld := TIntegerField.Create( DataSet );
with fld do
fld.Name := 'RowNumber';
fld.FieldName := 'RowNumber';
fld.FieldKind := fkCalculated;
fld.Index := ColNr-1;
fld.DisplayLabel := 'RijNr';
fld.DataSet := DataSet;
DataSet.FieldDefs.Add( fld.Name, ftInteger, 0, False );
showmessage( inttostr( DataSet.FieldCount ) );
DataSet.Open;
end;
end;
The code works fine, but the result is that my Dataset ONLY contains this calculated field.
So, I guess I should add all the fields which are in my SELECT-Clause of my query also to my DataSet by code.
Is there anyone who knows how to do this ?
Or maybe another way to accomplish what I want ?
Thanks in advance,
Wim.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Hi again,
I tested out your suggestion and it seems to work ....
BUT !!!!
When I scroll in the DBGrid, I see that the first and the last item of the grid is havinf value '-1' as a RowNumber. When I export the dataset to a csv-file(with a self-written procedure) I also see in the csv-file the -1-value.
Any idea what's causing this behavior ?
I should get this solved too before I can put this application live.
Thanks in advance.
Wim.
I tested out your suggestion and it seems to work ....
BUT !!!!
When I scroll in the DBGrid, I see that the first and the last item of the grid is havinf value '-1' as a RowNumber. When I export the dataset to a csv-file(with a self-written procedure) I also see in the csv-file the -1-value.
Any idea what's causing this behavior ?
I should get this solved too before I can put this application live.
Thanks in advance.
Wim.
Nope, I don't have the code that produces the "recno" for that column, do you?
ASKER
Hi EddieShipman,
I found a workaround for the -1 values in the first and last record of my dataset.
I put following code in my OnCalcFields-Event of my DataSet :
if DataSet.FindField( 'RowNumber' ) <> nil then
begin
DataSet.FieldByName('RowNu mber').AsI nteger := DataSet.RecNo;
if DataSet.FieldByName('RowNu mber').AsI nteger = -1 then
begin
if DataSet.Bof then
DataSet.FieldByName('RowNu mber').AsI nteger := 1
else if DataSet.Eof then
DataSet.FieldByName('RowNu mber').AsI nteger := DataSet.Recordcount
end;
end;
This seems to work perfectly now.
I will grant you the points anyway for helping me out with the tricky part.
But I just wanted to post my code too, to offer a complete working solution.
Thanks again for your help.
Best regards,
Wim.
I found a workaround for the -1 values in the first and last record of my dataset.
I put following code in my OnCalcFields-Event of my DataSet :
if DataSet.FindField( 'RowNumber' ) <> nil then
begin
DataSet.FieldByName('RowNu
if DataSet.FieldByName('RowNu
begin
if DataSet.Bof then
DataSet.FieldByName('RowNu
else if DataSet.Eof then
DataSet.FieldByName('RowNu
end;
end;
This seems to work perfectly now.
I will grant you the points anyway for helping me out with the tricky part.
But I just wanted to post my code too, to offer a complete working solution.
Thanks again for your help.
Best regards,
Wim.
ASKER
I will try out your suggestion and let you know the results.
Best regards,
Wim.