Currently when DADE is used to create dataviews, the DatabaseName is stored as part of the query definition. (This is consistent with Delphi's approach to specifying a database connection for a Query object).
In some cases, you may decide that the DatabaseName needs to be modified at a later date.
We recommend that the DatabaseName refer to a TDatabase connection component or to an Alias to provide flexibility for changing the connection parameters.
A second way to handle this issue is to implement some code that specifies a DatabaseName whenever a template is loaded. This can be accomplished by using the Report.Template.OnLoadEnd event.
type
myForm = class(TForm)
private
procedure ReportTemplateLoadEndEvent(Sender: TObject);
public
end; procedure myForm.FormCreate(Sender: TObject) begin Report1.Template.OnLoadEnd := ReportTemplateLoadEndEvent; end;
procedure myForm.ReportTemplateLoadEndEvent(Sender: TObject)
var
lSQL: TdaSQL;
begin
if GetSQLObject(Report1, lSQL) then
begin
lSQL.DatabaseName := Designer.DataSettings.DatabaseName;
SetSQLObject(Report, lSQL);
lSQL.Free;
end;
end;
Below is a tech tip for extracting the SQL object from a report. TdaSQL is a class defined in daSQL.pas.
The example code extracts only DataViews[0]. If the report contains multiple dataviews, you will need to iterate thru all of the entries in the DataViews[] array.
uses
daDatMod;
function GetSQLObject(aReport: TppReport; var aSQL: TdaSQL): Boolean;
var
lDataModule: TdaDataModule;
lDataView: TdaDataView;
begin
aSQL := TdaSQL.Create(nil);
{get the datamodule}
lDataModule := daGetDataModule(aReport);
if (lDataModule <> nil) then
begin
lDataView := lDataModule.DataViews[0];
if (lDataView <> nil) and (lDataView is TdaQueryDataView) then
aSQL.Assign(TdaQueryDataView(lDataView).SQL);
end;
Result := (aSQL <> nil);
end;
procedure SetSQLObject(aReport: TppReport; aSQL: TdaSQL);
var
lDataModule: TdaDataModule;
lDataView: TdaDataView;
begin
{get the datamodule}
lDataModule := daGetDataModule(aReport);
if (lDataModule <> nil) then
begin
lDataView := lDataModule.DataViews[0];
if (lDataView <> nil) and (lDataView is TdaQueryDataView) then
TdaQueryDataView(lDataView).SQL := aSQL;
end;
end;