Componentes.Terceros.RemObj.../internal/5.0.23.613/1/Data Abstract for Delphi/Source/IDE/uDADataTableWizards.pas
david 2824855ea7 - Modificación del paquete RemObjects_Core_D10 para que sea un paquete de runtime/designtime (antes era designtime sólo)
- Recompilación en Delphi10 de todos los paquetes de RO para generar las DCU's en Lib\D10
- Recompilación en Delphi10 de todos los paquetes de DA para generar las DCU's en Lib\D10

git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.RemObjects@9 b6239004-a887-0f4b-9937-50029ccdca16
2007-09-10 14:06:19 +00:00

195 lines
6.8 KiB
ObjectPascal

unit uDADataTableWizards;
{----------------------------------------------------------------------------}
{ Data Abstract Library - IDE Library
{
{ compiler: Delphi 6 and up, Kylix 3 and up
{ platform: Win32, Linux
{
{ (c)opyright RemObjects Software. all rights reserved.
{
{ Using this code requires a valid license of the Data Abstract
{ which can be obtained at http://www.remobjects.com.
{----------------------------------------------------------------------------}
interface
uses
Classes, Types, ToolsAPI, DesignIntf,
uDAClasses, uDARemoteDataAdapter;
type
TDataTableWizards = class
private
class procedure GetDataTables(const aName: string);
public
class function CreateDataTables(aDesigner: IDesigner; aAdapter: TDARemoteDataAdapter; aSchema: TDASchema; aCoordinates: TPoint): boolean; overload;
class function CreateDataTables(aForm: IOTAFormEditor; aAdapter: TDARemoteDataAdapter; aSchema: TDASchema; aCoordinates: TPoint): boolean; overload;
end;
implementation
uses
Forms, Windows, SysUtils, Dialogs, Registry, TypInfo,
uROClasses,
uDADataTable, uDAInterfaces, uDAPleaseWaitForm, uDASelectDataTablesForm, uDAMemDataTable, uDACDSDataTable;
function ComponentExists(aDesigner: IDesigner; aName: string): boolean;
var
i: integer;
begin
for i := 0 to aDesigner.Root.ComponentCount-1 do
if aDesigner.Root.Components[i].Name = aName then begin
result := true;
exit;
end;
result := false;
end;
procedure CreateDataTable(aDesigner: IDesigner; aClass:TDADataTableClass; aAdapter: TDARemoteDataAdapter; aSchema: TDASchema;
const aDataTableName: String; X,Y: integer; aCreateDataSource: boolean=true); overload;
var
lDataTable:TDADataTable;
lDataSource:TDADataSource;
lBaseName:string;
lDataTablePrefix,lDataSourcePrefix:string;
lDataset: TDADataSet;
lField: TDAField;
begin
with TRegistry.Create do try
RootKey := HKEY_CURRENT_USER;
OpenKey('Software\RemObjects\Data Abstract\IDE\ComponentPrefixes',false);
lDataTablePrefix := ReadString('TDADataTable');
lDataSourcePrefix := ReadString('TDADataSource');
finally
Free();
end;
if lDataTablePrefix = '' then lDataTablePrefix := 'tbl_';
if lDataSourcePrefix = '' then lDataSourcePrefix := 'ds_';
lDataTable := aDesigner.CreateComponent(aClass, nil, X, Y, 24, 24) as TDADataTable;
lDataset := aSchema.FindDataset(aDataTableName);
if Assigned(lDataset) then begin
lDataTable.LogicalName := lDataset.Name;
lDataTable.CustomAttributes.Assign(lDataset.CustomAttributes);
lDataTable.Fields.AssignFieldCollection(lDataset.Fields);
lDataTable.Params.AssignParamCollection(lDataset.Params);
lBaseName := lDataset.Name;
// ToDo: the code below is shared with RDA.FillSchema. Refactor.
if lDataset is TDAUnionDataTable then begin
if not Assigned(lDataset.Fields.FindField(def_SourceTableFieldName) as TDAField) then begin
lField := lDataTable.Fields.Add();
lField.Name := def_SourceTableFieldName;
lField.DataType := datInteger;
lField.InPrimaryKey := True;
lField.ServerAutoRefresh := True;
end;
end;
end;
lDataTable.RemoteDataAdapter := aAdapter;
RemoveExcept(lBaseName,['a'..'z','A'..'Z','0'..'9','_']);
if ComponentExists(aDesigner, lDataTablePrefix+lBaseName) then
lDataTable.Name := aDesigner.UniqueName(lDataTablePrefix+lBaseName)
else
lDataTable.Name := lDataTablePrefix+lBaseName;
if aCreateDataSource then begin
lDataSource := aDesigner.CreateComponent(TDADataSource, nil , X, Y+44, 24, 24) as TDADataSource;
lDataSource.DataTable := lDataTable;
if ComponentExists(aDesigner, lDataSourcePrefix+lBaseName) then
lDataSource.Name := aDesigner.UniqueName(lDataSourcePrefix+lBaseName)
else
lDataSource.Name := lDataSourcePrefix+lBaseName;
end;
end;
class function TDataTableWizards.CreateDataTables(aForm: IOTAFormEditor; aAdapter: TDARemoteDataAdapter; aSchema: TDASchema; aCoordinates: TPoint): boolean;
begin
result := CreateDataTables((aForm as INTAFormEditor).FormDesigner, aAdapter, aSchema, aCoordinates);
end;
var
gDataTables: TStringList;
gDesigner: IDesigner;
class procedure TDataTableWizards.GetDataTables(const aName: string);
var
lComponent: TComponent;
begin
lComponent := gDesigner.GetComponent(aName);
if assigned(lComponent) then
gDataTables.Add((lComponent as TDADataTable).LogicalName);
end;
class function TDataTableWizards.CreateDataTables(aDesigner: IDesigner; aAdapter: TDARemoteDataAdapter; aSchema: TDASchema; aCoordinates: TPoint): boolean;
var
lForm: TDASelectDataTablesForm;
lDataTables: TStringList;
i: integer;
Y: integer;
begin
lDataTables := TStringList.Create;
try
lDataTables.Sorted := true;
for i := 0 to aSchema.Datasets.Count-1 do
if aSchema.Datasets[i].IsPublic then
lDataTables.AddObject(aSchema.Datasets[i].Name, aSchema.Datasets[i]);
for i := 0 to aSchema.UnionDataTables.Count-1 do
if aSchema.UnionDataTables[i].IsPublic then
lDataTables.AddObject(aSchema.UnionDataTables[i].Name, aSchema.UnionDataTables[i]);
for i := 0 to aSchema.JoinDataTables.Count-1 do
if aSchema.JoinDataTables[i].IsPublic then
lDataTables.AddObject(aSchema.JoinDataTables[i].Name, aSchema.JoinDataTables[i]);
if lDataTables.Count > 0 then begin
gDesigner := aDesigner;
gDataTables := TStringList.Create();
try
aDesigner.GetComponentNames(GetTypeData(TypeInfo(TDADataTable)), GetDataTables);
lForm := TDASelectDataTablesForm.Create(nil);
try
for i := 0 to lDataTables.Count-1 do begin
lForm.lb_DataTables.Items.AddObject(lDataTables[i], lDataTables.Objects[i]);
lForm.lb_DataTables.Checked[lForm.lb_DataTables.Items.Count-1] := gDataTables.IndexOf(lDataTables[i]) = -1;
end;
lForm.UpdateCheckBoxState();
lForm.OkButtonCaption := '&Create';
result := (lForm.ShowModal() = idOk);
if result then begin
Y := aCoordinates.Y;
for i := 0 to lForm.lb_DataTables.Items.Count - 1 do
if lForm.lb_DataTables.Checked[i] then begin
CreateDataTable(aDesigner, TDAMemDataTable, aAdapter, aSchema, lForm.lb_DataTables.Items[i], aCoordinates.X, Y, true);
inc(y, 88); // doesn't seem to work :(
end;
end;
finally
FreeAndNil(lForm);
end;
finally
FreeAndNil(gDataTables);
gDesigner := nil;
end;
end
else begin
ShowMessage('No data tables were found in schema.');
result := false;
end;
finally
FreeAndNil(lDataTables);
end;
end;
end.