Duvida com criação de componente
Olá a todos.
Eu ainda estou aprendendo sobre a criação de componentes então espero que tenham um pouco de paciência, mas vamos a duvida.
Eu estou adaptando um componente de conexão com o banco de dados os SqlDataSet, DataSetProvider e o ClientDataSet.
Como aqui na empresa trabalhamos com um sistema multi-banco ele faz a paginação automática dependendo do tipo de banco de dados e monta o select automático.
No SqlDataSet eu coloquei a propriedade HasChild que quando é setada para True ele cria o DataSetProvider e o ClientDataSet já configurado com as informações do SqlDataSet e todos conectados, até ai sem problemas.
O que estou tendo dificuldade é em fazer os novos componentes pegarem o Left e Top do SqlDataSet para serem criados ao lado dele.
Eu dei uma lida e vi que terei que utilizar o DefineProperties, mas não entendi como pegar o Left e o top e como definilos novamente, e como usar e criar um TFiler.
E também quando fecho o projeto ele da um erro “Invalid Pointer Operation”.
Segue o Fonte:
unit DBRpZ;
interface
uses
SysUtils, Classes, DB, SqlExpr, StrUtils, Controls, Forms, Graphics, Windows,
Messages, Dialogs, Variants, DBClient, Provider, CommCtrl;
////////////////////////////////////////////////////////////////////////////////
/// Consulta
////////////////////////////////////////////////////////////////////////////////
type
TConsulta = class(TPersistent)
private
FTabelas,
FCampos,
FJoin,
FWhere,
FPrimaryKey,
FOrderBy : WideString;
FDivideDados : Boolean;
FQtdDados,
FPagina : Integer;
FCommandText : String;
Function MontaSelect( sender : TObject) : Boolean;
public
OldTabelas : WideString; //Crio estas variáveis para armazenar o antigo select
OldCampos : WideString;
OldRelacionamento : WideString;
OldWhere : WideString;
OldPrimaryKey : WideString;
OldOrderBy : WideString;
OldQtdDados : Integer;
OldPagina : Integer;
OldDivideDados : Boolean;
Function MontaSelectSqlServer : Boolean;
Function MontaSelectFirebird : Boolean;
Function MontaSelectOracle : Boolean;
procedure SalvaOld;
procedure CarregaOld;
procedure Assign(Source: TPersistent); override;
published
property Tabelas : WideString Read FTabelas Write FTabelas;
property Campos : WideString Read FCampos Write FCampos;
property Relacionamento : WideString Read FJoin Write FJoin;
property Where : WideString Read FWhere Write FWhere;
property PrimaryKey : WideString Read FPrimaryKey Write FPrimaryKey;
property OrderBy : WideString Read FOrderBy Write FOrderBY;
property QtdDados : Integer Read FQtdDados Write FQtdDados Default 50;
property Pagina : Integer Read FPagina Write FPagina Default 0;
Property DivideDados : Boolean Read FDivideDados write FDivideDados Default False;
end;
////////////////////////////////////////////////////////////////////////////////
/// SqlDataSet
////////////////////////////////////////////////////////////////////////////////
type
TSQLDataSetRpz = class(TSQLDataSet)
private
FConsulta : TConsulta;
FAtivaConsulta : Boolean;
FChild : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetChild(const Value: Boolean);
{ Private declarations }
protected
{ Protected declarations }
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
{ Public declarations }
published
{ Published declarations }
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
Property HasChild : Boolean Read FChild Write SetChild Default True;
end;
////////////////////////////////////////////////////////////////////////////////
/// Provider
////////////////////////////////////////////////////////////////////////////////
Type
TDataSetProviderRpz = class(TDataSetProvider)
private
Protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
end;
////////////////////////////////////////////////////////////////////////////////
/// ClientDataSet
////////////////////////////////////////////////////////////////////////////////
Type
TClientDataSetRpz = Class(TClientDataSet)
private
FConsulta : TConsulta;
FSQLConnection : TSQLConnection;
FAtivaConsulta : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetSQLConnection(const Value: TSQLConnection);
Protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
property SQLConnection : TSQLConnection read FSQLConnection write SetSQLConnection;
end;
procedure Register;
implementation
procedure TConsulta.Assign(Source: TPersistent);
begin
inherited;
if (Source is TConsulta) then
begin
Tabelas := TConsulta(Source).Tabelas;
Campos := TConsulta(Source).Campos;
Relacionamento := TConsulta(Source).Relacionamento;
Where := TConsulta(Source).Where;
PrimaryKey := TConsulta(Source).PrimaryKey;
OrderBy := TConsulta(Source).OrderBy;
QtdDados := TConsulta(Source).QtdDados;
Pagina := TConsulta(Source).Pagina;
DivideDados := TConsulta(Source).DivideDados;
Exit;
end;
inherited Assign(Source);
end;
constructor TSQLDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(AOwner);
FConsulta := TConsulta.Create;
Consulta.QtdDados := 50;
Consulta.OrderBy := 1;
end;
destructor TSQLDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
procedure TConsulta.CarregaOld;
begin
FTabelas := OldTabelas;
FCampos := OldCampos;
FJoin := OldRelacionamento;
FWhere := OldWhere;
FPrimaryKey := OldPrimaryKey;
FOrderBy := OldOrderBy;
FQtdDados := OldQtdDados;
FPagina := OldPagina;
FDivideDados := OldDivideDados;
end;
function TConsulta.MontaSelect(sender: TObject): Boolean;
var
Conexao : TSQLConnection;
begin
Result := False;
Try
if sender is TSQLDataSetRpz then
Begin
Conexao := TSQLDataSetRpz(sender).SQLConnection;
End
else if sender is TClientDataSetRpz then
Begin
Conexao := TClientDataSetRpz(sender).SQLConnection;
End;
if Assigned(Conexao) then
Begin
if ((Conexao.ConnectionName <> EmptyStr) and (Conexao.ConnectionName <> ) and (Conexao.DriverName <> ) and (Conexao.DriverName <> EmptyStr)) then
Begin
if ((Conexao.VendorLib <> ) and (Conexao.VendorLib <> EmptyStr)) then
Begin
if pos(OCI, UpperCase(Conexao.VendorLib))> 0 then
Begin
Result := MontaSelectOracle
End
Else if pos(GDS32, UpperCase(Conexao.VendorLib))> 0 then
Begin
Result := MontaSelectFirebird;
End
Else if pos(SQLOLEDB, UpperCase(Conexao.VendorLib)) > 0 then
Begin
Result := MontaSelectSqlServer;
End
Else
Result := False;
End;
End;
End
Else
begin
ShowMessage(Não existe conexão com o banco configurado.);
Exit;
end;
if Result then
Begin
if sender is TSQLDataSetRpz then
Begin
TSQLDataSetRpz(sender).SetCommandText(FCommandText);
End
else if sender is TClientDataSetRpz then
begin
TClientDataSetRpz(sender).SetCommandText(FCommandText);
End;
End
Else
ShowMessage(Erro ao gerar a consulta.);
Except
on e : exception do
begin
ShowMessage(e.Message);
Result := False;
end;
End;
end;
function TConsulta.MontaSelectFirebird: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
if DivideDados then
vlSelect := vlSelect +First +IntToStr(QtdDados)+ skip + IntToStr(Pagina * QtdDados)+ ;
vlSelect := vlSelect + Campos + From + Tabelas + ;
vlWhere := Where ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
vlWhere := vlWhere + Relacionamento+ ;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and + Where
else
vlWhere := vlWhere + Where;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
function TConsulta.MontaSelectOracle: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
vlSelect := vlSelect + Campos + From + Tabelas + ;
vlWhere := Where ;
if DivideDados then
vlWhere := vlWhere +RowNum between +IntToStr(Pagina)+ And + IntToStr(QtdDados)+ ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +Relacionamento+
else
vlWhere := vlWhere + Relacionamento + ;
End;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +where+
else
vlWhere := vlWhere + where + ;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
function TConsulta.MontaSelectSqlServer: Boolean;
var
vlSelect,
vlWhere,
vlSubSelect,
vlSubWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
vlSelect := EmptyStr;
vlWhere := EmptyStr;
vlSubSelect := EmptyStr;
vlSubWhere := EmptyStr;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
if DivideDados then
begin
if ((PrimaryKey <> ) and (PrimaryKey <> EmptyStr)) then
vlSelect := vlSelect + Top (+ IntToStr(QtdDados)+)
else
begin
ShowMessage(O campo PrimaryKey não pode estar vazio);
Exit;
end;
end;
vlSelect := vlSelect + Campos + From + Tabelas + ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
vlWhere := Where + Relacionamento+ ;
if DivideDados then
Begin
vlSubSelect := (+PrimaryKey+ not in ( select top(+ IntToStr(Pagina*QtdDados)+) + PrimaryKey + from + Tabelas+ ;
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere ;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere + and + Where
Else
vlSubWhere := Where + Where;
//vlSubwhere := vlSubWhere + and + Where +)) ;
End;
vlSubWhere := )) ;
if vlWhere <> EmptyStr then
vlWhere := vlWhere + and + vlSubSelect+ vlSubWhere
else
vlWhere := Where + vlSubSelect+ vlSubWhere;
End;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlWhere := vlWhere + and + Where +
Else
vlWhere := Where + Where;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if vlWhere <> EmptyStr then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
procedure TConsulta.SalvaOld;
begin
OldTabelas := FTabelas;
OldCampos := FCampos;
OldRelacionamento := FJoin;
OldWhere := FWhere;
OldPrimaryKey := FPrimaryKey;
OldOrderBy := FOrderBy;
OldQtdDados := FQtdDados;
OldPagina := FPagina;
OldDivideDados := FDivideDados;
end;
procedure TSQLDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Begin
Consulta.MontaSelect(Self)
End;
FAtivaConsulta := False;
//TWinControl(GetOwner).Invalidate;
end;
procedure TSQLDataSetRpz.SetChild(const Value: Boolean);var
vlCds : TClientDataSetRpz;
vlDsp : TDataSetProviderRpz;
begin
FChild := Value;
if Value then
begin
vlDsp := TDataSetProviderRpz.Create(OWNER); // Crio o Provider e vinculo com o SqlDataSet
with vlDsp do
Begin
DataSet := Self;
Name := dsp+Copy(Self.Name, 4, length(self.Name)); // Aqui não sei definir Left e top
End;
vlCds := TClientDataSetRpz.Create(OWNER); //Crio o Cds configuro e vinculo com o Provider.
with vlCds do
Begin
Consulta := self.Consulta;
ProviderName := vlDsp.Name;
SQLConnection := Self.SQLConnection;
Name := cds+Copy(Self.Name, 4, length(self.Name));
CommandText := Self.CommandText; // Aqui não sei definir Left e top
End;
end;
end;
procedure TClientDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Begin
Consulta.MontaSelect(Self) //Mando Criar a consulta
End;
FAtivaConsulta := False;
//TWinControl(GetOwner).Invalidate;
end;
procedure TClientDataSetRpz.SetSQLConnection(const Value: TSQLConnection);
begin
FSQLConnection := Value;
end;
procedure Register;
begin
RegisterComponents(RpZ, [TSQLDataSetRpz]);
RegisterComponents(RpZ, [TDataSetProviderRpz]);
RegisterComponents(RpZ, [TClientDataSetRpz]);
end;
{ TClientDataSetFre }
constructor TClientDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner);
FConsulta := TConsulta.Create;
Consulta.QtdDados := 50;
Consulta.OrderBy := 1;
end;
destructor TClientDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
constructor TDataSetProviderRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner); //Inicio oProvider já Pré definido
UpdateMode := upWhereChanged;
Options := [poFetchDetailsOnDemand,poIncFieldProps,poAutoRefresh,poPropogateChanges,poAllowCommandText,poUseQuoteChar];
end;
destructor TDataSetProviderRpz.Destroy;
begin
inherited Destroy;
end;
end.
Fiquem a vontade em dar sugestões para melhorar o desempenho do componente como eu disse sou iniciante em criação de componentes.
Obrigado pela colaboração.
Tiago Soares
Curtidas 0
Respostas
Tiago Soares
31/01/2012
Bugo o codigo em cima segue novamente
unit DBRpZ;
interface
uses
SysUtils, Classes, DB, SqlExpr, StrUtils, Controls, Forms, Graphics, Windows,
Messages, Dialogs, Variants, DBClient, Provider, CommCtrl;
////////////////////////////////////////////////////////////////////////////////
/// Consulta
////////////////////////////////////////////////////////////////////////////////
type
TConsulta = class(TPersistent)
private
FTabelas,
FCampos,
FJoin,
FWhere,
FPrimaryKey,
FOrderBy : WideString;
FDivideDados : Boolean;
FQtdDados,
FPagina : Integer;
FCommandText : String;
Function MontaSelect( sender : TObject) : Boolean;
public
OldTabelas : WideString; //Crio estas variáveis para armazenar o antigo select
OldCampos : WideString;
OldRelacionamento : WideString;
OldWhere : WideString;
OldPrimaryKey : WideString;
OldOrderBy : WideString;
OldQtdDados : Integer;
OldPagina : Integer;
OldDivideDados : Boolean;
Function MontaSelectSqlServer : Boolean;
Function MontaSelectFirebird : Boolean;
Function MontaSelectOracle : Boolean;
procedure SalvaOld;
procedure CarregaOld;
procedure Assign(Source: TPersistent); override;
published
property Tabelas : WideString Read FTabelas Write FTabelas;
property Campos : WideString Read FCampos Write FCampos;
property Relacionamento : WideString Read FJoin Write FJoin;
property Where : WideString Read FWhere Write FWhere;
property PrimaryKey : WideString Read FPrimaryKey Write FPrimaryKey;
property OrderBy : WideString Read FOrderBy Write FOrderBY;
property QtdDados : Integer Read FQtdDados Write FQtdDados Default 50;
property Pagina : Integer Read FPagina Write FPagina Default 0;
Property DivideDados : Boolean Read FDivideDados write FDivideDados Default False;
end;
////////////////////////////////////////////////////////////////////////////////
/// SqlDataSet
////////////////////////////////////////////////////////////////////////////////
type
TSQLDataSetRpz = class(TSQLDataSet)
private
FConsulta : TConsulta;
FAtivaConsulta : Boolean;
FChild : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetChild(const Value: Boolean);
{ Private declarations }
protected
{ Protected declarations }
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
{ Public declarations }
published
{ Published declarations }
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
Property HasChild : Boolean Read FChild Write SetChild Default True;
end;
////////////////////////////////////////////////////////////////////////////////
/// Provider
////////////////////////////////////////////////////////////////////////////////
Type
TDataSetProviderRpz = class(TDataSetProvider)
private
Protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
end;
////////////////////////////////////////////////////////////////////////////////
/// ClientDataSet
////////////////////////////////////////////////////////////////////////////////
Type
TClientDataSetRpz = Class(TClientDataSet)
private
FConsulta : TConsulta;
FSQLConnection : TSQLConnection;
FAtivaConsulta : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetSQLConnection(const Value: TSQLConnection);
Protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
property SQLConnection : TSQLConnection read FSQLConnection write SetSQLConnection;
end;
procedure Register;
implementation
procedure TConsulta.Assign(Source: TPersistent);
begin
inherited;
if (Source is TConsulta) then
begin
Tabelas := TConsulta(Source).Tabelas;
Campos := TConsulta(Source).Campos;
Relacionamento := TConsulta(Source).Relacionamento;
Where := TConsulta(Source).Where;
PrimaryKey := TConsulta(Source).PrimaryKey;
OrderBy := TConsulta(Source).OrderBy;
QtdDados := TConsulta(Source).QtdDados;
Pagina := TConsulta(Source).Pagina;
DivideDados := TConsulta(Source).DivideDados;
Exit;
end;
inherited Assign(Source);
end;
constructor TSQLDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(AOwner);
FConsulta := TConsulta.Create;
Consulta.QtdDados := 50;
Consulta.OrderBy := 1;
end;
destructor TSQLDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
procedure TConsulta.CarregaOld;
begin
FTabelas := OldTabelas;
FCampos := OldCampos;
FJoin := OldRelacionamento;
FWhere := OldWhere;
FPrimaryKey := OldPrimaryKey;
FOrderBy := OldOrderBy;
FQtdDados := OldQtdDados;
FPagina := OldPagina;
FDivideDados := OldDivideDados;
end;
function TConsulta.MontaSelect(sender: TObject): Boolean;
var
Conexao : TSQLConnection;
begin
Result := False;
Try
if sender is TSQLDataSetRpz then
Begin
Conexao := TSQLDataSetRpz(sender).SQLConnection;
End
else if sender is TClientDataSetRpz then
Begin
Conexao := TClientDataSetRpz(sender).SQLConnection;
End;
if Assigned(Conexao) then
Begin
if ((Conexao.ConnectionName <> EmptyStr) and (Conexao.ConnectionName <> ) and (Conexao.DriverName <> ) and (Conexao.DriverName <> EmptyStr)) then
Begin
if ((Conexao.VendorLib <> ) and (Conexao.VendorLib <> EmptyStr)) then
Begin
if pos(OCI, UpperCase(Conexao.VendorLib))> 0 then
Begin
Result := MontaSelectOracle
End
Else if pos(GDS32, UpperCase(Conexao.VendorLib))> 0 then
Begin
Result := MontaSelectFirebird;
End
Else if pos(SQLOLEDB, UpperCase(Conexao.VendorLib)) > 0 then
Begin
Result := MontaSelectSqlServer;
End
Else
Result := False;
End;
End;
End
Else
begin
ShowMessage(Não existe conexão com o banco configurado.);
Exit;
end;
if Result then
Begin
if sender is TSQLDataSetRpz then
Begin
TSQLDataSetRpz(sender).SetCommandText(FCommandText);
End
else if sender is TClientDataSetRpz then
begin
TClientDataSetRpz(sender).SetCommandText(FCommandText);
End;
End
Else
ShowMessage(Erro ao gerar a consulta.);
Except
on e : exception do
begin
ShowMessage(e.Message);
Result := False;
end;
End;
end;
function TConsulta.MontaSelectFirebird: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
if DivideDados then
vlSelect := vlSelect +First +IntToStr(QtdDados)+ skip + IntToStr(Pagina * QtdDados)+ ;
vlSelect := vlSelect + Campos + From + Tabelas + ;
vlWhere := Where ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
vlWhere := vlWhere + Relacionamento+ ;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and + Where
else
vlWhere := vlWhere + Where;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
function TConsulta.MontaSelectOracle: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
vlSelect := vlSelect + Campos + From + Tabelas + ;
vlWhere := Where ;
if DivideDados then
vlWhere := vlWhere +RowNum between +IntToStr(Pagina)+ And + IntToStr(QtdDados)+ ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +Relacionamento+
else
vlWhere := vlWhere + Relacionamento + ;
End;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +where+
else
vlWhere := vlWhere + where + ;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
function TConsulta.MontaSelectSqlServer: Boolean;
var
vlSelect,
vlWhere,
vlSubSelect,
vlSubWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
vlSelect := EmptyStr;
vlWhere := EmptyStr;
vlSubSelect := EmptyStr;
vlSubWhere := EmptyStr;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
if DivideDados then
begin
if ((PrimaryKey <> ) and (PrimaryKey <> EmptyStr)) then
vlSelect := vlSelect + Top (+ IntToStr(QtdDados)+)
else
begin
ShowMessage(O campo PrimaryKey não pode estar vazio);
Exit;
end;
end;
vlSelect := vlSelect + Campos + From + Tabelas + ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
vlWhere := Where + Relacionamento+ ;
if DivideDados then
Begin
vlSubSelect := (+PrimaryKey+ not in ( select top(+ IntToStr(Pagina*QtdDados)+) + PrimaryKey + from + Tabelas+ ;
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere ;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere + and + Where
Else
vlSubWhere := Where + Where;
//vlSubwhere := vlSubWhere + and + Where +)) ;
End;
vlSubWhere := )) ;
if vlWhere <> EmptyStr then
vlWhere := vlWhere + and + vlSubSelect+ vlSubWhere
else
vlWhere := Where + vlSubSelect+ vlSubWhere;
End;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlWhere := vlWhere + and + Where +
Else
vlWhere := Where + Where;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if vlWhere <> EmptyStr then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
procedure TConsulta.SalvaOld;
begin
OldTabelas := FTabelas;
OldCampos := FCampos;
OldRelacionamento := FJoin;
OldWhere := FWhere;
OldPrimaryKey := FPrimaryKey;
OldOrderBy := FOrderBy;
OldQtdDados := FQtdDados;
OldPagina := FPagina;
OldDivideDados := FDivideDados;
end;
procedure TSQLDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Begin
Consulta.MontaSelect(Self)
End;
FAtivaConsulta := False;
//TWinControl(GetOwner).Invalidate;
end;
procedure TSQLDataSetRpz.SetChild(const Value: Boolean);var
vlCds : TClientDataSetRpz;
vlDsp : TDataSetProviderRpz;
begin
FChild := Value;
if Value then
begin
vlDsp := TDataSetProviderRpz.Create(OWNER); // Crio o Provider e vinculo com o SqlDataSet
with vlDsp do
Begin
DataSet := Self;
Name := dsp+Copy(Self.Name, 4, length(self.Name)); // Aqui não sei definir Left e top
End;
vlCds := TClientDataSetRpz.Create(OWNER); //Crio o Cds configuro e vinculo com o Provider.
with vlCds do
Begin
Consulta := self.Consulta;
ProviderName := vlDsp.Name;
SQLConnection := Self.SQLConnection;
Name := cds+Copy(Self.Name, 4, length(self.Name));
CommandText := Self.CommandText; // Aqui não sei definir Left e top
End;
end;
end;
procedure TClientDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Begin
Consulta.MontaSelect(Self) //Mando Criar a consulta
End;
FAtivaConsulta := False;
//TWinControl(GetOwner).Invalidate;
end;
procedure TClientDataSetRpz.SetSQLConnection(const Value: TSQLConnection);
begin
FSQLConnection := Value;
end;
procedure Register;
begin
RegisterComponents(RpZ, [TSQLDataSetRpz]);
RegisterComponents(RpZ, [TDataSetProviderRpz]);
RegisterComponents(RpZ, [TClientDataSetRpz]);
end;
{ TClientDataSetFre }
constructor TClientDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner);
FConsulta := TConsulta.Create;
Consulta.QtdDados := 50;
Consulta.OrderBy := 1;
end;
destructor TClientDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
constructor TDataSetProviderRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner); //Inicio oProvider já Pré definido
UpdateMode := upWhereChanged;
Options := [poFetchDetailsOnDemand,poIncFieldProps,poAutoRefresh,poPropogateChanges,poAllowCommandText,poUseQuoteChar];
end;
destructor TDataSetProviderRpz.Destroy;
begin
inherited Destroy;
end;
end.GOSTEI 0
Tiago Soares
31/01/2012
unit DBRpZ;
interface
uses
SysUtils, Classes, DB, SqlExpr, StrUtils, Controls, Forms, Graphics, Windows,
Messages, Dialogs, Variants, DBClient, Provider, CommCtrl;
////////////////////////////////////////////////////////////////////////////////
/// Consulta
////////////////////////////////////////////////////////////////////////////////
type
TConsulta = class(TPersistent)
private
FTabelas,
FCampos,
FJoin,
FWhere,
FPrimaryKey,
FOrderBy : WideString;
FDivideDados : Boolean;
FQtdDados,
FPagina : Integer;
FCommandText : String;
Function MontaSelect( sender : TObject) : Boolean;
public
OldTabelas : WideString;
OldCampos : WideString;
OldRelacionamento : WideString;
OldWhere : WideString;
OldPrimaryKey : WideString;
OldOrderBy : WideString;
OldQtdDados : Integer;
OldPagina : Integer;
OldDivideDados : Boolean;
Function MontaSelectSqlServer : Boolean;
Function MontaSelectFirebird : Boolean;
Function MontaSelectOracle : Boolean;
procedure SalvaOld;
procedure CarregaOld;
procedure Assign(Source: TPersistent); override;
published
property Tabelas : WideString Read FTabelas Write FTabelas;
property Campos : WideString Read FCampos Write FCampos;
property Relacionamento : WideString Read FJoin Write FJoin;
property Where : WideString Read FWhere Write FWhere;
property PrimaryKey : WideString Read FPrimaryKey Write FPrimaryKey;
property OrderBy : WideString Read FOrderBy Write FOrderBY;
property QtdDados : Integer Read FQtdDados Write FQtdDados Default 50;
property Pagina : Integer Read FPagina Write FPagina Default 0;
Property DivideDados : Boolean Read FDivideDados write FDivideDados Default False;
end;
////////////////////////////////////////////////////////////////////////////////
/// SqlDataSet
////////////////////////////////////////////////////////////////////////////////
type
TSQLDataSetRpz = class(TSQLDataSet)
private
FConsulta : TConsulta;
FAtivaConsulta : Boolean;
FChild : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetChild(const Value: Boolean);
{ Private declarations }
protected
{ Protected declarations }
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
{ Public declarations }
published
{ Published declarations }
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
Property HasChild : Boolean Read FChild Write SetChild Default True;
end;
////////////////////////////////////////////////////////////////////////////////
/// Provider
////////////////////////////////////////////////////////////////////////////////
Type
TDataSetProviderRpz = class(TDataSetProvider)
private
Protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
end;
////////////////////////////////////////////////////////////////////////////////
/// ClientDataSet
////////////////////////////////////////////////////////////////////////////////
Type
TClientDataSetRpz = Class(TClientDataSet)
private
FConsulta : TConsulta;
FSQLConnection : TSQLConnection;
FAtivaConsulta : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetSQLConnection(const Value: TSQLConnection);
Protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
property SQLConnection : TSQLConnection read FSQLConnection write SetSQLConnection;
end;
procedure Register;
implementation
procedure TConsulta.Assign(Source: TPersistent);
begin
inherited;
if (Source is TConsulta) then
begin
Tabelas := TConsulta(Source).Tabelas;
Campos := TConsulta(Source).Campos;
Relacionamento := TConsulta(Source).Relacionamento;
Where := TConsulta(Source).Where;
PrimaryKey := TConsulta(Source).PrimaryKey;
OrderBy := TConsulta(Source).OrderBy;
QtdDados := TConsulta(Source).QtdDados;
Pagina := TConsulta(Source).Pagina;
DivideDados := TConsulta(Source).DivideDados;
Exit;
end;
inherited Assign(Source);
end;
constructor TSQLDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(AOwner);
FConsulta := TConsulta.Create;
Consulta.QtdDados := 50;
Consulta.OrderBy := 1;
end;
destructor TSQLDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
procedure TConsulta.CarregaOld;
begin
FTabelas := OldTabelas; // Volto o select antigo.
FCampos := OldCampos;
FJoin := OldRelacionamento;
FWhere := OldWhere;
FPrimaryKey := OldPrimaryKey;
FOrderBy := OldOrderBy;
FQtdDados := OldQtdDados;
FPagina := OldPagina;
FDivideDados := OldDivideDados;
end;
function TConsulta.MontaSelect(sender: TObject): Boolean;
var
Conexao : TSQLConnection;
begin
Result := False;
Try
if sender is TSQLDataSetRpz then
Begin
Conexao := TSQLDataSetRpz(sender).SQLConnection;
End
else if sender is TClientDataSetRpz then
Begin
Conexao := TClientDataSetRpz(sender).SQLConnection;
End;
if Assigned(Conexao) then
Begin
if ((Conexao.ConnectionName <> EmptyStr) and (Conexao.ConnectionName <> ) and (Conexao.DriverName <> ) and (Conexao.DriverName <> EmptyStr)) then
Begin
if ((Conexao.VendorLib <> ) and (Conexao.VendorLib <> EmptyStr)) then
Begin
if pos(OCI, UpperCase(Conexao.VendorLib))> 0 then
Begin
Result := MontaSelectOracle
End
Else if pos(GDS32, UpperCase(Conexao.VendorLib))> 0 then
Begin
Result := MontaSelectFirebird;
End
Else if pos(SQLOLEDB, UpperCase(Conexao.VendorLib)) > 0 then
Begin
Result := MontaSelectSqlServer;
End
Else
Result := False;
End;
End;
End
Else
begin
ShowMessage(Não existe conexão com o banco configurado.);
Exit;
end;
if Result then
Begin
if sender is TSQLDataSetRpz then
Begin
TSQLDataSetRpz(sender).SetCommandText(FCommandText);
End
else if sender is TClientDataSetRpz then
begin
TClientDataSetRpz(sender).SetCommandText(FCommandText);
End;
End
Else
ShowMessage(Erro ao gerar a consulta.);
Except
on e : exception do
begin
ShowMessage(e.Message);
Result := False;
end;
End;
end;
function TConsulta.MontaSelectFirebird: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
if DivideDados then
vlSelect := vlSelect +First +IntToStr(QtdDados)+ skip + IntToStr(Pagina * QtdDados)+ ;
vlSelect := vlSelect + Campos + From + Tabelas + ;
vlWhere := Where ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
vlWhere := vlWhere + Relacionamento+ ;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and + Where
else
vlWhere := vlWhere + Where;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
function TConsulta.MontaSelectOracle: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
vlSelect := vlSelect + Campos + From + Tabelas + ;
vlWhere := Where ;
if DivideDados then
vlWhere := vlWhere +RowNum between +IntToStr(Pagina)+ And + IntToStr(QtdDados)+ ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +Relacionamento+
else
vlWhere := vlWhere + Relacionamento + ;
End;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +where+
else
vlWhere := vlWhere + where + ;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
function TConsulta.MontaSelectSqlServer: Boolean;
var
vlSelect,
vlWhere,
vlSubSelect,
vlSubWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
vlSelect := EmptyStr;
vlWhere := EmptyStr;
vlSubSelect := EmptyStr;
vlSubWhere := EmptyStr;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
if DivideDados then
begin
if ((PrimaryKey <> ) and (PrimaryKey <> EmptyStr)) then
vlSelect := vlSelect + Top (+ IntToStr(QtdDados)+)
else
begin
ShowMessage(O campo PrimaryKey não pode estar vazio);
Exit;
end;
end;
vlSelect := vlSelect + Campos + From + Tabelas + ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
vlWhere := Where + Relacionamento+ ;
if DivideDados then
Begin
vlSubSelect := (+PrimaryKey+ not in ( select top(+ IntToStr(Pagina*QtdDados)+) + PrimaryKey + from + Tabelas+ ;
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere ;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere + and + Where
Else
vlSubWhere := Where + Where;
//vlSubwhere := vlSubWhere + and + Where +)) ;
End;
vlSubWhere := )) ;
if vlWhere <> EmptyStr then
vlWhere := vlWhere + and + vlSubSelect+ vlSubWhere
else
vlWhere := Where + vlSubSelect+ vlSubWhere;
End;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlWhere := vlWhere + and + Where +
Else
vlWhere := Where + Where;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if vlWhere <> EmptyStr then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
procedure TConsulta.SalvaOld;
begin
OldTabelas := FTabelas; // Pego o Select atual e quardo na variavel para poder fazer outro select
OldCampos := FCampos;
OldRelacionamento := FJoin;
OldWhere := FWhere;
OldPrimaryKey := FPrimaryKey;
OldOrderBy := FOrderBy;
OldQtdDados := FQtdDados;
OldPagina := FPagina;
OldDivideDados := FDivideDados;
end;
procedure TSQLDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Begin
Consulta.MontaSelect(Self)
End;
FAtivaConsulta := False;
//TWinControl(GetOwner).Invalidate;
end;
procedure TSQLDataSetRpz.SetChild(const Value: Boolean);var
vlCds : TClientDataSetRpz;
vlDsp : TDataSetProviderRpz;
begin
FChild := Value;
if Value then
begin
vlDsp := TDataSetProviderRpz.Create(OWNER);
with vlDsp do
Begin
DataSet := Self;
Name := dsp+Copy(Self.Name, 4, length(self.Name)); //Aqui que não seu pegar e definir o left e o Top
End;
vlCds := TClientDataSetRpz.Create(OWNER);
with vlCds do
Begin
Consulta := self.Consulta;
ProviderName := vlDsp.Name;
SQLConnection := Self.SQLConnection;
Name := cds+Copy(Self.Name, 4, length(self.Name));
CommandText := Self.CommandText; //Aqui que não seu pegar e definir o left e o Top
End;
end;
end;
procedure TClientDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Begin
Consulta.MontaSelect(Self)
End;
FAtivaConsulta := False;
//TWinControl(GetOwner).Invalidate;
end;
procedure TClientDataSetRpz.SetSQLConnection(const Value: TSQLConnection);
begin
FSQLConnection := Value;
end;
procedure Register;
begin
RegisterComponents(RpZ, [TSQLDataSetRpz]);
RegisterComponents(RpZ, [TDataSetProviderRpz]);
RegisterComponents(RpZ, [TClientDataSetRpz]);
end;
{ TClientDataSetFre }
constructor TClientDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner);
FConsulta := TConsulta.Create;
Consulta.QtdDados := 50;
Consulta.OrderBy := 1;
end;
destructor TClientDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
constructor TDataSetProviderRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner);
UpdateMode := upWhereChanged;
Options := [poFetchDetailsOnDemand,poIncFieldProps,poAutoRefresh,poPropogateChanges,poAllowCommandText,poUseQuoteChar];
end;
destructor TDataSetProviderRpz.Destroy;
begin
inherited Destroy;
end;
end.GOSTEI 0
Tiago Soares
31/01/2012
Adm desculpa mas esta bugando o código poderias deletar os posts anteriores.
unit DBRpZ;
interface
uses
SysUtils, Classes, DB, SqlExpr, StrUtils, Controls, Forms, Graphics, Windows,
Messages, Dialogs, Variants, DBClient, Provider, CommCtrl;
////////////////////////////////////////////////////////////////////////////////
/// Consulta
////////////////////////////////////////////////////////////////////////////////
type
TConsulta = class(TPersistent)
private
FTabelas,
FCampos,
FJoin,
FWhere,
FPrimaryKey,
FOrderBy : WideString;
FDivideDados : Boolean;
FQtdDados,
FPagina : Integer;
FCommandText : String;
Function MontaSelect( sender : TObject) : Boolean;
public
OldTabelas : WideString; //Crio estas variáveis para armazenar o antigo select
OldCampos : WideString;
OldRelacionamento : WideString;
OldWhere : WideString;
OldPrimaryKey : WideString;
OldOrderBy : WideString;
OldQtdDados : Integer;
OldPagina : Integer;
OldDivideDados : Boolean;
Function MontaSelectSqlServer : Boolean;
Function MontaSelectFirebird : Boolean;
Function MontaSelectOracle : Boolean;
procedure SalvaOld;
procedure CarregaOld;
procedure Assign(Source: TPersistent); override;
published
property Tabelas : WideString Read FTabelas Write FTabelas;
property Campos : WideString Read FCampos Write FCampos;
property Relacionamento : WideString Read FJoin Write FJoin;
property Where : WideString Read FWhere Write FWhere;
property PrimaryKey : WideString Read FPrimaryKey Write FPrimaryKey;
property OrderBy : WideString Read FOrderBy Write FOrderBY;
property QtdDados : Integer Read FQtdDados Write FQtdDados Default 50;
property Pagina : Integer Read FPagina Write FPagina Default 0;
Property DivideDados : Boolean Read FDivideDados write FDivideDados Default False;
end;
////////////////////////////////////////////////////////////////////////////////
/// SqlDataSet
////////////////////////////////////////////////////////////////////////////////
type
TSQLDataSetRpz = class(TSQLDataSet)
private
FConsulta : TConsulta;
FAtivaConsulta : Boolean;
FChild : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetChild(const Value: Boolean);
{ Private declarations }
protected
{ Protected declarations }
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
{ Public declarations }
published
{ Published declarations }
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
Property HasChild : Boolean Read FChild Write SetChild Default True;
end;
////////////////////////////////////////////////////////////////////////////////
/// Provider
////////////////////////////////////////////////////////////////////////////////
Type
TDataSetProviderRpz = class(TDataSetProvider)
private
Protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
end;
////////////////////////////////////////////////////////////////////////////////
/// ClientDataSet
////////////////////////////////////////////////////////////////////////////////
Type
TClientDataSetRpz = Class(TClientDataSet)
private
FConsulta : TConsulta;
FSQLConnection : TSQLConnection;
FAtivaConsulta : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetSQLConnection(const Value: TSQLConnection);
Protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
property SQLConnection : TSQLConnection read FSQLConnection write SetSQLConnection;
end;
procedure Register;
implementation
procedure TConsulta.Assign(Source: TPersistent);
begin
inherited;
if (Source is TConsulta) then
begin
Tabelas := TConsulta(Source).Tabelas;
Campos := TConsulta(Source).Campos;
Relacionamento := TConsulta(Source).Relacionamento;
Where := TConsulta(Source).Where;
PrimaryKey := TConsulta(Source).PrimaryKey;
OrderBy := TConsulta(Source).OrderBy;
QtdDados := TConsulta(Source).QtdDados;
Pagina := TConsulta(Source).Pagina;
DivideDados := TConsulta(Source).DivideDados;
Exit;
end;
inherited Assign(Source);
end;
constructor TSQLDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(AOwner);
FConsulta := TConsulta.Create;
Consulta.QtdDados := 50;
Consulta.OrderBy := 1;
end;
destructor TSQLDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
procedure TConsulta.CarregaOld;
begin
FTabelas := OldTabelas;
FCampos := OldCampos;
FJoin := OldRelacionamento;
FWhere := OldWhere;
FPrimaryKey := OldPrimaryKey;
FOrderBy := OldOrderBy;
FQtdDados := OldQtdDados;
FPagina := OldPagina;
FDivideDados := OldDivideDados;
end;
function TConsulta.MontaSelect(sender: TObject): Boolean;
var
Conexao : TSQLConnection;
begin
Result := False;
Try
if sender is TSQLDataSetRpz then
Begin
Conexao := TSQLDataSetRpz(sender).SQLConnection;
End
else if sender is TClientDataSetRpz then
Begin
Conexao := TClientDataSetRpz(sender).SQLConnection;
End;
if Assigned(Conexao) then
Begin
if ((Conexao.ConnectionName <> EmptyStr) and (Conexao.ConnectionName <> ) and (Conexao.DriverName <> ) and (Conexao.DriverName <> EmptyStr)) then
Begin
if ((Conexao.VendorLib <> ) and (Conexao.VendorLib <> EmptyStr)) then
Begin
if pos(OCI, UpperCase(Conexao.VendorLib))> 0 then
Begin
Result := MontaSelectOracle
End
Else if pos(GDS32, UpperCase(Conexao.VendorLib))> 0 then
Begin
Result := MontaSelectFirebird;
End
Else if pos(SQLOLEDB, UpperCase(Conexao.VendorLib)) > 0 then
Begin
Result := MontaSelectSqlServer;
End
Else
Result := False;
End;
End;
End
Else
begin
ShowMessage(Não existe conexão com o banco configurado.);
Exit;
end;
if Result then
Begin
if sender is TSQLDataSetRpz then
Begin
TSQLDataSetRpz(sender).SetCommandText(FCommandText);
End
else if sender is TClientDataSetRpz then
begin
TClientDataSetRpz(sender).SetCommandText(FCommandText);
End;
End
Else
ShowMessage(Erro ao gerar a consulta.);
Except
on e : exception do
begin
ShowMessage(e.Message);
Result := False;
end;
End;
end;
function TConsulta.MontaSelectFirebird: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
if DivideDados then
vlSelect := vlSelect +First +IntToStr(QtdDados)+ skip + IntToStr(Pagina * QtdDados)+ ;
vlSelect := vlSelect + Campos + From + Tabelas + ;
vlWhere := Where ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
vlWhere := vlWhere + Relacionamento+ ;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and + Where
else
vlWhere := vlWhere + Where;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
function TConsulta.MontaSelectOracle: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
vlSelect := vlSelect + Campos + From + Tabelas + ;
vlWhere := Where ;
if DivideDados then
vlWhere := vlWhere +RowNum between +IntToStr(Pagina)+ And + IntToStr(QtdDados)+ ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +Relacionamento+
else
vlWhere := vlWhere + Relacionamento + ;
End;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +where+
else
vlWhere := vlWhere + where + ;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
function TConsulta.MontaSelectSqlServer: Boolean;
var
vlSelect,
vlWhere,
vlSubSelect,
vlSubWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
vlSelect := EmptyStr;
vlWhere := EmptyStr;
vlSubSelect := EmptyStr;
vlSubWhere := EmptyStr;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
if DivideDados then
begin
if ((PrimaryKey <> ) and (PrimaryKey <> EmptyStr)) then
vlSelect := vlSelect + Top (+ IntToStr(QtdDados)+)
else
begin
ShowMessage(O campo PrimaryKey não pode estar vazio);
Exit;
end;
end;
vlSelect := vlSelect + Campos + From + Tabelas + ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
vlWhere := Where + Relacionamento+ ;
if DivideDados then
Begin
vlSubSelect := (+PrimaryKey+ not in ( select top(+ IntToStr(Pagina*QtdDados)+) + PrimaryKey + from + Tabelas+ ;
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere ;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere + and + Where
Else
vlSubWhere := Where + Where;
//vlSubwhere := vlSubWhere + and + Where +)) ;
End;
vlSubWhere := )) ;
if vlWhere <> EmptyStr then
vlWhere := vlWhere + and + vlSubSelect+ vlSubWhere
else
vlWhere := Where + vlSubSelect+ vlSubWhere;
End;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlWhere := vlWhere + and + Where +
Else
vlWhere := Where + Where;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if vlWhere <> EmptyStr then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
procedure TConsulta.SalvaOld;
begin
OldTabelas := FTabelas;
OldCampos := FCampos;
OldRelacionamento := FJoin;
OldWhere := FWhere;
OldPrimaryKey := FPrimaryKey;
OldOrderBy := FOrderBy;
OldQtdDados := FQtdDados;
OldPagina := FPagina;
OldDivideDados := FDivideDados;
end;
procedure TSQLDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Begin
Consulta.MontaSelect(Self)
End;
FAtivaConsulta := False;
//TWinControl(GetOwner).Invalidate;
end;
procedure TSQLDataSetRpz.SetChild(const Value: Boolean);var
vlCds : TClientDataSetRpz;
vlDsp : TDataSetProviderRpz;
begin
FChild := Value;
if Value then
begin
vlDsp := TDataSetProviderRpz.Create(OWNER); // Crio o Provider e vinculo com o SqlDataSet
with vlDsp do
Begin
DataSet := Self;
Name := dsp+Copy(Self.Name, 4, length(self.Name)); // Aqui não sei definir Left e top
End;
vlCds := TClientDataSetRpz.Create(OWNER); //Crio o Cds configuro e vinculo com o Provider.
with vlCds do
Begin
Consulta := self.Consulta;
ProviderName := vlDsp.Name;
SQLConnection := Self.SQLConnection;
Name := cds+Copy(Self.Name, 4, length(self.Name));
CommandText := Self.CommandText; // Aqui não sei definir Left e top
End;
end;
end;
procedure TClientDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Begin
Consulta.MontaSelect(Self) //Mando Criar a consulta
End;
FAtivaConsulta := False;
//TWinControl(GetOwner).Invalidate;
end;
procedure TClientDataSetRpz.SetSQLConnection(const Value: TSQLConnection);
begin
FSQLConnection := Value;
end;
procedure Register;
begin
RegisterComponents(RpZ, [TSQLDataSetRpz]);
RegisterComponents(RpZ, [TDataSetProviderRpz]);
RegisterComponents(RpZ, [TClientDataSetRpz]);
end;
{ TClientDataSetFre }
constructor TClientDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner);
FConsulta := TConsulta.Create;
Consulta.QtdDados := 50;
Consulta.OrderBy := 1;
end;
destructor TClientDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
constructor TDataSetProviderRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner); //Inicio oProvider já Pré definido
UpdateMode := upWhereChanged;
Options := [poFetchDetailsOnDemand,poIncFieldProps,poAutoRefresh,poPropogateChanges,poAllowCommandText,poUseQuoteChar];
end;
destructor TDataSetProviderRpz.Destroy;
begin
inherited Destroy;
end;
end.
unit DBRpZ;
interface
uses
SysUtils, Classes, DB, SqlExpr, StrUtils, Controls, Forms, Graphics, Windows,
Messages, Dialogs, Variants, DBClient, Provider, CommCtrl;
////////////////////////////////////////////////////////////////////////////////
/// Consulta
////////////////////////////////////////////////////////////////////////////////
type
TConsulta = class(TPersistent)
private
FTabelas,
FCampos,
FJoin,
FWhere,
FPrimaryKey,
FOrderBy : WideString;
FDivideDados : Boolean;
FQtdDados,
FPagina : Integer;
FCommandText : String;
Function MontaSelect( sender : TObject) : Boolean;
public
OldTabelas : WideString; //Crio estas variáveis para armazenar o antigo select
OldCampos : WideString;
OldRelacionamento : WideString;
OldWhere : WideString;
OldPrimaryKey : WideString;
OldOrderBy : WideString;
OldQtdDados : Integer;
OldPagina : Integer;
OldDivideDados : Boolean;
Function MontaSelectSqlServer : Boolean;
Function MontaSelectFirebird : Boolean;
Function MontaSelectOracle : Boolean;
procedure SalvaOld;
procedure CarregaOld;
procedure Assign(Source: TPersistent); override;
published
property Tabelas : WideString Read FTabelas Write FTabelas;
property Campos : WideString Read FCampos Write FCampos;
property Relacionamento : WideString Read FJoin Write FJoin;
property Where : WideString Read FWhere Write FWhere;
property PrimaryKey : WideString Read FPrimaryKey Write FPrimaryKey;
property OrderBy : WideString Read FOrderBy Write FOrderBY;
property QtdDados : Integer Read FQtdDados Write FQtdDados Default 50;
property Pagina : Integer Read FPagina Write FPagina Default 0;
Property DivideDados : Boolean Read FDivideDados write FDivideDados Default False;
end;
////////////////////////////////////////////////////////////////////////////////
/// SqlDataSet
////////////////////////////////////////////////////////////////////////////////
type
TSQLDataSetRpz = class(TSQLDataSet)
private
FConsulta : TConsulta;
FAtivaConsulta : Boolean;
FChild : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetChild(const Value: Boolean);
{ Private declarations }
protected
{ Protected declarations }
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
{ Public declarations }
published
{ Published declarations }
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
Property HasChild : Boolean Read FChild Write SetChild Default True;
end;
////////////////////////////////////////////////////////////////////////////////
/// Provider
////////////////////////////////////////////////////////////////////////////////
Type
TDataSetProviderRpz = class(TDataSetProvider)
private
Protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
end;
////////////////////////////////////////////////////////////////////////////////
/// ClientDataSet
////////////////////////////////////////////////////////////////////////////////
Type
TClientDataSetRpz = Class(TClientDataSet)
private
FConsulta : TConsulta;
FSQLConnection : TSQLConnection;
FAtivaConsulta : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetSQLConnection(const Value: TSQLConnection);
Protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
property SQLConnection : TSQLConnection read FSQLConnection write SetSQLConnection;
end;
procedure Register;
implementation
procedure TConsulta.Assign(Source: TPersistent);
begin
inherited;
if (Source is TConsulta) then
begin
Tabelas := TConsulta(Source).Tabelas;
Campos := TConsulta(Source).Campos;
Relacionamento := TConsulta(Source).Relacionamento;
Where := TConsulta(Source).Where;
PrimaryKey := TConsulta(Source).PrimaryKey;
OrderBy := TConsulta(Source).OrderBy;
QtdDados := TConsulta(Source).QtdDados;
Pagina := TConsulta(Source).Pagina;
DivideDados := TConsulta(Source).DivideDados;
Exit;
end;
inherited Assign(Source);
end;
constructor TSQLDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(AOwner);
FConsulta := TConsulta.Create;
Consulta.QtdDados := 50;
Consulta.OrderBy := 1;
end;
destructor TSQLDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
procedure TConsulta.CarregaOld;
begin
FTabelas := OldTabelas;
FCampos := OldCampos;
FJoin := OldRelacionamento;
FWhere := OldWhere;
FPrimaryKey := OldPrimaryKey;
FOrderBy := OldOrderBy;
FQtdDados := OldQtdDados;
FPagina := OldPagina;
FDivideDados := OldDivideDados;
end;
function TConsulta.MontaSelect(sender: TObject): Boolean;
var
Conexao : TSQLConnection;
begin
Result := False;
Try
if sender is TSQLDataSetRpz then
Begin
Conexao := TSQLDataSetRpz(sender).SQLConnection;
End
else if sender is TClientDataSetRpz then
Begin
Conexao := TClientDataSetRpz(sender).SQLConnection;
End;
if Assigned(Conexao) then
Begin
if ((Conexao.ConnectionName <> EmptyStr) and (Conexao.ConnectionName <> ) and (Conexao.DriverName <> ) and (Conexao.DriverName <> EmptyStr)) then
Begin
if ((Conexao.VendorLib <> ) and (Conexao.VendorLib <> EmptyStr)) then
Begin
if pos(OCI, UpperCase(Conexao.VendorLib))> 0 then
Begin
Result := MontaSelectOracle
End
Else if pos(GDS32, UpperCase(Conexao.VendorLib))> 0 then
Begin
Result := MontaSelectFirebird;
End
Else if pos(SQLOLEDB, UpperCase(Conexao.VendorLib)) > 0 then
Begin
Result := MontaSelectSqlServer;
End
Else
Result := False;
End;
End;
End
Else
begin
ShowMessage(Não existe conexão com o banco configurado.);
Exit;
end;
if Result then
Begin
if sender is TSQLDataSetRpz then
Begin
TSQLDataSetRpz(sender).SetCommandText(FCommandText);
End
else if sender is TClientDataSetRpz then
begin
TClientDataSetRpz(sender).SetCommandText(FCommandText);
End;
End
Else
ShowMessage(Erro ao gerar a consulta.);
Except
on e : exception do
begin
ShowMessage(e.Message);
Result := False;
end;
End;
end;
function TConsulta.MontaSelectFirebird: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
if DivideDados then
vlSelect := vlSelect +First +IntToStr(QtdDados)+ skip + IntToStr(Pagina * QtdDados)+ ;
vlSelect := vlSelect + Campos + From + Tabelas + ;
vlWhere := Where ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
vlWhere := vlWhere + Relacionamento+ ;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and + Where
else
vlWhere := vlWhere + Where;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
function TConsulta.MontaSelectOracle: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
vlSelect := vlSelect + Campos + From + Tabelas + ;
vlWhere := Where ;
if DivideDados then
vlWhere := vlWhere +RowNum between +IntToStr(Pagina)+ And + IntToStr(QtdDados)+ ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +Relacionamento+
else
vlWhere := vlWhere + Relacionamento + ;
End;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +where+
else
vlWhere := vlWhere + where + ;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
function TConsulta.MontaSelectSqlServer: Boolean;
var
vlSelect,
vlWhere,
vlSubSelect,
vlSubWhere,
vlOrderBY : AnsiString;
begin
Try
Result := False;
vlSelect := EmptyStr;
vlWhere := EmptyStr;
vlSubSelect := EmptyStr;
vlSubWhere := EmptyStr;
if ((Tabelas <> ) and (Tabelas <> EmptyStr) and (Campos <> ) and (Campos <> EmptyStr)) then
Begin
vlSelect := Select ;
if DivideDados then
begin
if ((PrimaryKey <> ) and (PrimaryKey <> EmptyStr)) then
vlSelect := vlSelect + Top (+ IntToStr(QtdDados)+)
else
begin
ShowMessage(O campo PrimaryKey não pode estar vazio);
Exit;
end;
end;
vlSelect := vlSelect + Campos + From + Tabelas + ;
if ((Relacionamento <> ) and (Relacionamento <> EmptyStr)) then
vlWhere := Where + Relacionamento+ ;
if DivideDados then
Begin
vlSubSelect := (+PrimaryKey+ not in ( select top(+ IntToStr(Pagina*QtdDados)+) + PrimaryKey + from + Tabelas+ ;
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere ;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere + and + Where
Else
vlSubWhere := Where + Where;
//vlSubwhere := vlSubWhere + and + Where +)) ;
End;
vlSubWhere := )) ;
if vlWhere <> EmptyStr then
vlWhere := vlWhere + and + vlSubSelect+ vlSubWhere
else
vlWhere := Where + vlSubSelect+ vlSubWhere;
End;
if ((Where <> ) and (Where <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlWhere := vlWhere + and + Where +
Else
vlWhere := Where + Where;
End;
if ((OrderBy <> ) and (OrderBy <> EmptyStr)) then
vlOrderBY := Order By + OrderBy;
FCommandText := vlSelect;
if vlWhere <> EmptyStr then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
begin
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Exit;
end;
Except
Result := False;
End;
end;
procedure TConsulta.SalvaOld;
begin
OldTabelas := FTabelas;
OldCampos := FCampos;
OldRelacionamento := FJoin;
OldWhere := FWhere;
OldPrimaryKey := FPrimaryKey;
OldOrderBy := FOrderBy;
OldQtdDados := FQtdDados;
OldPagina := FPagina;
OldDivideDados := FDivideDados;
end;
procedure TSQLDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Begin
Consulta.MontaSelect(Self)
End;
FAtivaConsulta := False;
//TWinControl(GetOwner).Invalidate;
end;
procedure TSQLDataSetRpz.SetChild(const Value: Boolean);var
vlCds : TClientDataSetRpz;
vlDsp : TDataSetProviderRpz;
begin
FChild := Value;
if Value then
begin
vlDsp := TDataSetProviderRpz.Create(OWNER); // Crio o Provider e vinculo com o SqlDataSet
with vlDsp do
Begin
DataSet := Self;
Name := dsp+Copy(Self.Name, 4, length(self.Name)); // Aqui não sei definir Left e top
End;
vlCds := TClientDataSetRpz.Create(OWNER); //Crio o Cds configuro e vinculo com o Provider.
with vlCds do
Begin
Consulta := self.Consulta;
ProviderName := vlDsp.Name;
SQLConnection := Self.SQLConnection;
Name := cds+Copy(Self.Name, 4, length(self.Name));
CommandText := Self.CommandText; // Aqui não sei definir Left e top
End;
end;
end;
procedure TClientDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Begin
Consulta.MontaSelect(Self) //Mando Criar a consulta
End;
FAtivaConsulta := False;
//TWinControl(GetOwner).Invalidate;
end;
procedure TClientDataSetRpz.SetSQLConnection(const Value: TSQLConnection);
begin
FSQLConnection := Value;
end;
procedure Register;
begin
RegisterComponents(RpZ, [TSQLDataSetRpz]);
RegisterComponents(RpZ, [TDataSetProviderRpz]);
RegisterComponents(RpZ, [TClientDataSetRpz]);
end;
{ TClientDataSetFre }
constructor TClientDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner);
FConsulta := TConsulta.Create;
Consulta.QtdDados := 50;
Consulta.OrderBy := 1;
end;
destructor TClientDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
constructor TDataSetProviderRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner); //Inicio oProvider já Pré definido
UpdateMode := upWhereChanged;
Options := [poFetchDetailsOnDemand,poIncFieldProps,poAutoRefresh,poPropogateChanges,poAllowCommandText,poUseQuoteChar];
end;
destructor TDataSetProviderRpz.Destroy;
begin
inherited Destroy;
end;
end.
GOSTEI 0
Emerson Nascimento
31/01/2012
fiz algumas mudanças (estou sem o Deplhi, fiz no bloco de notas, então pode dar algum erro de sintaxe):
unit DBRpZ;
interface
uses
SysUtils, Classes, DB, SqlExpr, StrUtils, Controls, Forms, Graphics, Windows,
Messages, Dialogs, Variants, DBClient, Provider, CommCtrl;
////////////////////////////////////////////////////////////////////////////////
/// Consulta
////////////////////////////////////////////////////////////////////////////////
type
TConsulta = class(TPersistent)
private
FTabelas,
FCampos,
FJoin,
FWhere,
FPrimaryKey,
FOrderBy : WideString;
FDivideDados : Boolean;
FQtdDados,
FPagina : Integer;
FCommandText : String;
Function MontaSelect( sender : TObject) : Boolean;
public
OldTabelas : WideString; //Crio estas variáveis para armazenar o antigo select
OldCampos : WideString;
OldRelacionamento : WideString;
OldWhere : WideString;
OldPrimaryKey : WideString;
OldOrderBy : WideString;
OldQtdDados : Integer;
OldPagina : Integer;
OldDivideDados : Boolean;
Function MontaSelectSqlServer : Boolean;
Function MontaSelectFirebird : Boolean;
Function MontaSelectOracle : Boolean;
procedure SalvaOld;
procedure CarregaOld;
procedure Assign(Source: TPersistent); override;
published
property Tabelas : WideString Read FTabelas Write FTabelas;
property Campos : WideString Read FCampos Write FCampos;
property Relacionamento : WideString Read FJoin Write FJoin;
property Where : WideString Read FWhere Write FWhere;
property PrimaryKey : WideString Read FPrimaryKey Write FPrimaryKey;
property OrderBy : WideString Read FOrderBy Write FOrderBY;
property QtdDados : Integer Read FQtdDados Write FQtdDados Default 50;
property Pagina : Integer Read FPagina Write FPagina Default 0;
Property DivideDados : Boolean Read FDivideDados write FDivideDados Default False;
end;
////////////////////////////////////////////////////////////////////////////////
/// Provider
////////////////////////////////////////////////////////////////////////////////
type
TDataSetProviderRpz = class(TDataSetProvider)
private
protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
end;
////////////////////////////////////////////////////////////////////////////////
/// ClientDataSet
////////////////////////////////////////////////////////////////////////////////
type
TClientDataSetRpz = Class(TClientDataSet)
private
FConsulta : TConsulta;
FSQLConnection : TSQLConnection;
FAtivaConsulta : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetSQLConnection(const Value: TSQLConnection);
protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
property SQLConnection : TSQLConnection read FSQLConnection write SetSQLConnection;
end;
////////////////////////////////////////////////////////////////////////////////
/// SqlDataSet
////////////////////////////////////////////////////////////////////////////////
type
TSQLDataSetRpz = class(TSQLDataSet)
private
{ Private declarations }
FConsulta : TConsulta;
FProviderRpz : TDatasetProviderRpz;
FClientRpz : TClientDatasetRpz;
FAtivaConsulta : Boolean;
FChild : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetChild(const Value: Boolean);
protected
{ Protected declarations }
public
{ Public declarations }
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
{ Published declarations }
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
Property HasChild : Boolean Read FChild Write SetChild Default True;
end;
procedure Register;
implementation
procedure TConsulta.Assign(Source: TPersistent);
begin
inherited;
if (Source is TConsulta) then
begin
Tabelas := TConsulta(Source).Tabelas;
Campos := TConsulta(Source).Campos;
Relacionamento := TConsulta(Source).Relacionamento;
Where := TConsulta(Source).Where;
PrimaryKey := TConsulta(Source).PrimaryKey;
OrderBy := TConsulta(Source).OrderBy;
QtdDados := TConsulta(Source).QtdDados;
Pagina := TConsulta(Source).Pagina;
DivideDados := TConsulta(Source).DivideDados;
end
else
inherited Assign(Source);
end;
procedure TConsulta.CarregaOld;
begin
FTabelas := OldTabelas;
FCampos := OldCampos;
FJoin := OldRelacionamento;
FWhere := OldWhere;
FPrimaryKey := OldPrimaryKey;
FOrderBy := OldOrderBy;
FQtdDados := OldQtdDados;
FPagina := OldPagina;
FDivideDados := OldDivideDados;
end;
function TConsulta.MontaSelect(sender: TObject): Boolean;
var
Conexao : TSQLConnection;
begin
Result := False;
try
if (sender is TSQLDataSetRpz) then
Conexao := TSQLDataSetRpz(sender).SQLConnection;
else
if (sender is TClientDataSetRpz) then
Conexao := TClientDataSetRpz(sender).SQLConnection;
if Assigned(Conexao) then
Begin
if ((Conexao.ConnectionName <> EmptyStr) and (Conexao.DriverName <> EmptyStr)) then
Begin
if (Conexao.VendorLib <> EmptyStr) then
Begin
if pos(OCI, UpperCase(Conexao.VendorLib))> 0 then
Result := MontaSelectOracle
Else
if (pos(GDS32, UpperCase(Conexao.VendorLib))> 0) or (pos(FBCLIENT, UpperCase(Conexao.VendorLib))> 0) then
Result := MontaSelectFirebird
Else
if pos(SQLOLEDB, UpperCase(Conexao.VendorLib)) > 0 then
Result := MontaSelectSqlServer
Else
Result := False;
End;
End;
End
Else
raise Exception.Create(Não foi indicada uma conexão com um banco de dados.);
if Result then
Begin
if (sender is TSQLDataSetRpz) then
TSQLDataSetRpz(sender).SetCommandText(FCommandText);
else
if (sender is TClientDataSetRpz) then
TClientDataSetRpz(sender).SetCommandText(FCommandText);
End
Else
ShowMessage(Erro ao gerar a consulta.);
Except
on e:Exception do
begin
ShowMessage(e.Message);
Result := False;
end;
End;
end;
function TConsulta.MontaSelectFirebird: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
try
Result := False;
if (FTabelas <> EmptyStr) and (FCampos <> EmptyStr)) then
Begin
vlSelect := Select ;
if FDivideDados then
vlSelect := vlSelect +First +IntToStr(FQtdDados)+ skip + IntToStr(FPagina * FQtdDados)+ ;
vlSelect := vlSelect + FCampos + From + FTabelas + ;
vlWhere := FWhere ;
if (FRelacionamento <> EmptyStr) then
vlWhere := vlWhere + Relacionamento+ ;
if (FWhere <> EmptyStr) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and + FWhere
else
vlWhere := vlWhere + FWhere;
End;
if (FOrderBy <> EmptyStr) then
vlOrderBY := Order By + FOrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Except
Result := False;
End;
end;
function TConsulta.MontaSelectOracle: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
try
Result := False;
if ((FTabelas <> EmptyStr) and (FCampos <> ) and (FCampos <> EmptyStr)) then
Begin
vlSelect := Select ;
vlSelect := vlSelect + FCampos + From + FTabelas + ;
vlWhere := Where ;
if FDivideDados then
vlWhere := vlWhere +RowNum between +IntToStr(FPagina)+ And + IntToStr(FQtdDados)+ ;
if (FRelacionamento <> EmptyStr) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +FRelacionamento+
else
vlWhere := vlWhere + FRelacionamento + ;
End;
if (FWhere <> EmptyStr) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +Fwhere+
else
vlWhere := vlWhere + Fwhere + ;
End;
if (FOrderBy <> EmptyStr) then
vlOrderBY := Order By + FOrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Except
Result := False;
End;
end;
function TConsulta.MontaSelectSqlServer: Boolean;
var
vlSelect,
vlWhere,
vlSubSelect,
vlSubWhere,
vlOrderBY : AnsiString;
begin
try
Result := False;
vlSelect := EmptyStr;
vlWhere := EmptyStr;
vlSubSelect := EmptyStr;
vlSubWhere := EmptyStr;
if (FTabelas <> EmptyStr) and (FCampos <> EmptyStr) then
Begin
vlSelect := Select ;
if FDivideDados then
begin
if (FPrimaryKey <> EmptyStr) then
vlSelect := vlSelect + Top (+ IntToStr(FQtdDados)+)
else
raise Exception.Create(A propriedade PrimaryKey não pode estar vazia);
end;
vlSelect := vlSelect + FCampos + From + FTabelas + ;
if (FRelacionamento <> EmptyStr) then
vlWhere := Where + FRelacionamento+ ;
if FDivideDados then
Begin
vlSubSelect := (+FPrimaryKey+ not in ( select top(+ IntToStr(FPagina*FQtdDados)+) + FPrimaryKey + from + FTabelas+ ;
if (vlWhere <> EmptyStr) then
vlSubWhere := vlWhere ;
if ((FWhere <> ) and (FWhere <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere + and + FWhere
Else
vlSubWhere := FWhere;
//vlSubwhere := vlSubWhere + and + FWhere +)) ;
End;
vlSubWhere := )) ;
if (vlWhere <> EmptyStr) then
vlWhere := vlWhere + and + vlSubSelect+ vlSubWhere
else
vlWhere := FWhere + vlSubSelect+ vlSubWhere;
End;
if (FWhere <> EmptyStr) then
Begin
if (vlWhere <> EmptyStr) then
vlWhere := vlWhere + and + FWhere +
Else
vlWhere := FWhere;
End;
if (FOrderBy <> EmptyStr) then
vlOrderBY := Order By + FOrderBy;
FCommandText := vlSelect;
if (vlWhere <> EmptyStr) then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Except
Result := False;
End;
end;
procedure TConsulta.SalvaOld;
begin
OldTabelas := FTabelas;
OldCampos := FCampos;
OldRelacionamento := FJoin;
OldWhere := FWhere;
OldPrimaryKey := FPrimaryKey;
OldOrderBy := FOrderBy;
OldQtdDados := FQtdDados;
OldPagina := FPagina;
OldDivideDados := FDivideDados;
end;
constructor TSQLDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(AOwner);
FConsulta := TConsulta.Create;
FConsulta.QtdDados := 50;
FConsulta.OrderBy := 1;
end;
destructor TSQLDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
procedure TSQLDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Consulta.MontaSelect(Self)
end;
procedure TSQLDataSetRpz.SetChild(const Value: Boolean);
begin
FChild := Value;
if FChild then
begin
if not Assigned(FProviderRpz) then
FProviderRpz := TDataSetProviderRpz.Create(OWNER); // Crio o Provider e vinculo com o SqlDataSet
with FProviderRpz do
Begin
DataSet := Self;
Name := dsp+Copy(Self.Name, 4, length(self.Name)); // Aqui não sei definir Left e top
End;
if not Assigned(FClientRpz) then
FClientRpz := TClientDataSetRpz.Create(OWNER); //Crio o Cds configuro e vinculo com o Provider.
with FClientRpz do
Begin
Consulta := self.Consulta;
ProviderName := FProviderRpz.Name;
SQLConnection := Self.SQLConnection;
Name := cds+Copy(Self.Name, 4, length(self.Name));
CommandText := Self.CommandText; // Aqui não sei definir Left e top
End;
end;
end;
{ TClientDataSetRpz }
constructor TClientDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner);
FConsulta := TConsulta.Create;
FConsulta.QtdDados := 50;
FConsulta.OrderBy := 1;
end;
destructor TClientDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
procedure TClientDataSetRpz.SetSQLConnection(const Value: TSQLConnection);
begin
FSQLConnection := Value;
end;
procedure TClientDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
FConsulta.MontaSelect(Self) //Mando Criar a consulta
end;
{ TDataSetProviderRpz }
constructor TDataSetProviderRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner); //Inicio oProvider já Pré definido
UpdateMode := upWhereChanged;
Options := [poFetchDetailsOnDemand,poIncFieldProps,poAutoRefresh,poPropogateChanges,poAllowCommandText,poUseQuoteChar];
end;
destructor TDataSetProviderRpz.Destroy;
begin
inherited Destroy;
end;
procedure Register;
begin
RegisterComponents(RpZ, [TSQLDataSetRpz]);
RegisterComponents(RpZ, [TDataSetProviderRpz]);
RegisterComponents(RpZ, [TClientDataSetRpz]);
end;
end.
unit DBRpZ;
interface
uses
SysUtils, Classes, DB, SqlExpr, StrUtils, Controls, Forms, Graphics, Windows,
Messages, Dialogs, Variants, DBClient, Provider, CommCtrl;
////////////////////////////////////////////////////////////////////////////////
/// Consulta
////////////////////////////////////////////////////////////////////////////////
type
TConsulta = class(TPersistent)
private
FTabelas,
FCampos,
FJoin,
FWhere,
FPrimaryKey,
FOrderBy : WideString;
FDivideDados : Boolean;
FQtdDados,
FPagina : Integer;
FCommandText : String;
Function MontaSelect( sender : TObject) : Boolean;
public
OldTabelas : WideString; //Crio estas variáveis para armazenar o antigo select
OldCampos : WideString;
OldRelacionamento : WideString;
OldWhere : WideString;
OldPrimaryKey : WideString;
OldOrderBy : WideString;
OldQtdDados : Integer;
OldPagina : Integer;
OldDivideDados : Boolean;
Function MontaSelectSqlServer : Boolean;
Function MontaSelectFirebird : Boolean;
Function MontaSelectOracle : Boolean;
procedure SalvaOld;
procedure CarregaOld;
procedure Assign(Source: TPersistent); override;
published
property Tabelas : WideString Read FTabelas Write FTabelas;
property Campos : WideString Read FCampos Write FCampos;
property Relacionamento : WideString Read FJoin Write FJoin;
property Where : WideString Read FWhere Write FWhere;
property PrimaryKey : WideString Read FPrimaryKey Write FPrimaryKey;
property OrderBy : WideString Read FOrderBy Write FOrderBY;
property QtdDados : Integer Read FQtdDados Write FQtdDados Default 50;
property Pagina : Integer Read FPagina Write FPagina Default 0;
Property DivideDados : Boolean Read FDivideDados write FDivideDados Default False;
end;
////////////////////////////////////////////////////////////////////////////////
/// Provider
////////////////////////////////////////////////////////////////////////////////
type
TDataSetProviderRpz = class(TDataSetProvider)
private
protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
end;
////////////////////////////////////////////////////////////////////////////////
/// ClientDataSet
////////////////////////////////////////////////////////////////////////////////
type
TClientDataSetRpz = Class(TClientDataSet)
private
FConsulta : TConsulta;
FSQLConnection : TSQLConnection;
FAtivaConsulta : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetSQLConnection(const Value: TSQLConnection);
protected
public
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
property SQLConnection : TSQLConnection read FSQLConnection write SetSQLConnection;
end;
////////////////////////////////////////////////////////////////////////////////
/// SqlDataSet
////////////////////////////////////////////////////////////////////////////////
type
TSQLDataSetRpz = class(TSQLDataSet)
private
{ Private declarations }
FConsulta : TConsulta;
FProviderRpz : TDatasetProviderRpz;
FClientRpz : TClientDatasetRpz;
FAtivaConsulta : Boolean;
FChild : Boolean;
procedure SetAtivo(const Value: Boolean);
procedure SetChild(const Value: Boolean);
protected
{ Protected declarations }
public
{ Public declarations }
Constructor Create(Aowner:TComponent); Override;
Destructor Destroy; Override;
published
{ Published declarations }
property Consulta : TConsulta Read FConsulta Write FConsulta;
Property AtivaConsulta : Boolean Read FAtivaConsulta Write SetAtivo Default False;
Property HasChild : Boolean Read FChild Write SetChild Default True;
end;
procedure Register;
implementation
procedure TConsulta.Assign(Source: TPersistent);
begin
inherited;
if (Source is TConsulta) then
begin
Tabelas := TConsulta(Source).Tabelas;
Campos := TConsulta(Source).Campos;
Relacionamento := TConsulta(Source).Relacionamento;
Where := TConsulta(Source).Where;
PrimaryKey := TConsulta(Source).PrimaryKey;
OrderBy := TConsulta(Source).OrderBy;
QtdDados := TConsulta(Source).QtdDados;
Pagina := TConsulta(Source).Pagina;
DivideDados := TConsulta(Source).DivideDados;
end
else
inherited Assign(Source);
end;
procedure TConsulta.CarregaOld;
begin
FTabelas := OldTabelas;
FCampos := OldCampos;
FJoin := OldRelacionamento;
FWhere := OldWhere;
FPrimaryKey := OldPrimaryKey;
FOrderBy := OldOrderBy;
FQtdDados := OldQtdDados;
FPagina := OldPagina;
FDivideDados := OldDivideDados;
end;
function TConsulta.MontaSelect(sender: TObject): Boolean;
var
Conexao : TSQLConnection;
begin
Result := False;
try
if (sender is TSQLDataSetRpz) then
Conexao := TSQLDataSetRpz(sender).SQLConnection;
else
if (sender is TClientDataSetRpz) then
Conexao := TClientDataSetRpz(sender).SQLConnection;
if Assigned(Conexao) then
Begin
if ((Conexao.ConnectionName <> EmptyStr) and (Conexao.DriverName <> EmptyStr)) then
Begin
if (Conexao.VendorLib <> EmptyStr) then
Begin
if pos(OCI, UpperCase(Conexao.VendorLib))> 0 then
Result := MontaSelectOracle
Else
if (pos(GDS32, UpperCase(Conexao.VendorLib))> 0) or (pos(FBCLIENT, UpperCase(Conexao.VendorLib))> 0) then
Result := MontaSelectFirebird
Else
if pos(SQLOLEDB, UpperCase(Conexao.VendorLib)) > 0 then
Result := MontaSelectSqlServer
Else
Result := False;
End;
End;
End
Else
raise Exception.Create(Não foi indicada uma conexão com um banco de dados.);
if Result then
Begin
if (sender is TSQLDataSetRpz) then
TSQLDataSetRpz(sender).SetCommandText(FCommandText);
else
if (sender is TClientDataSetRpz) then
TClientDataSetRpz(sender).SetCommandText(FCommandText);
End
Else
ShowMessage(Erro ao gerar a consulta.);
Except
on e:Exception do
begin
ShowMessage(e.Message);
Result := False;
end;
End;
end;
function TConsulta.MontaSelectFirebird: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
try
Result := False;
if (FTabelas <> EmptyStr) and (FCampos <> EmptyStr)) then
Begin
vlSelect := Select ;
if FDivideDados then
vlSelect := vlSelect +First +IntToStr(FQtdDados)+ skip + IntToStr(FPagina * FQtdDados)+ ;
vlSelect := vlSelect + FCampos + From + FTabelas + ;
vlWhere := FWhere ;
if (FRelacionamento <> EmptyStr) then
vlWhere := vlWhere + Relacionamento+ ;
if (FWhere <> EmptyStr) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and + FWhere
else
vlWhere := vlWhere + FWhere;
End;
if (FOrderBy <> EmptyStr) then
vlOrderBY := Order By + FOrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Except
Result := False;
End;
end;
function TConsulta.MontaSelectOracle: Boolean;
var
vlSelect,
vlWhere,
vlOrderBY : AnsiString;
begin
try
Result := False;
if ((FTabelas <> EmptyStr) and (FCampos <> ) and (FCampos <> EmptyStr)) then
Begin
vlSelect := Select ;
vlSelect := vlSelect + FCampos + From + FTabelas + ;
vlWhere := Where ;
if FDivideDados then
vlWhere := vlWhere +RowNum between +IntToStr(FPagina)+ And + IntToStr(FQtdDados)+ ;
if (FRelacionamento <> EmptyStr) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +FRelacionamento+
else
vlWhere := vlWhere + FRelacionamento + ;
End;
if (FWhere <> EmptyStr) then
Begin
if Length(vlWhere) > 7 then
vlWhere := vlWhere + and +Fwhere+
else
vlWhere := vlWhere + Fwhere + ;
End;
if (FOrderBy <> EmptyStr) then
vlOrderBY := Order By + FOrderBy;
FCommandText := vlSelect;
if Length(vlWhere) > 7 then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Except
Result := False;
End;
end;
function TConsulta.MontaSelectSqlServer: Boolean;
var
vlSelect,
vlWhere,
vlSubSelect,
vlSubWhere,
vlOrderBY : AnsiString;
begin
try
Result := False;
vlSelect := EmptyStr;
vlWhere := EmptyStr;
vlSubSelect := EmptyStr;
vlSubWhere := EmptyStr;
if (FTabelas <> EmptyStr) and (FCampos <> EmptyStr) then
Begin
vlSelect := Select ;
if FDivideDados then
begin
if (FPrimaryKey <> EmptyStr) then
vlSelect := vlSelect + Top (+ IntToStr(FQtdDados)+)
else
raise Exception.Create(A propriedade PrimaryKey não pode estar vazia);
end;
vlSelect := vlSelect + FCampos + From + FTabelas + ;
if (FRelacionamento <> EmptyStr) then
vlWhere := Where + FRelacionamento+ ;
if FDivideDados then
Begin
vlSubSelect := (+FPrimaryKey+ not in ( select top(+ IntToStr(FPagina*FQtdDados)+) + FPrimaryKey + from + FTabelas+ ;
if (vlWhere <> EmptyStr) then
vlSubWhere := vlWhere ;
if ((FWhere <> ) and (FWhere <> EmptyStr)) then
Begin
if vlWhere <> EmptyStr then
vlSubWhere := vlWhere + and + FWhere
Else
vlSubWhere := FWhere;
//vlSubwhere := vlSubWhere + and + FWhere +)) ;
End;
vlSubWhere := )) ;
if (vlWhere <> EmptyStr) then
vlWhere := vlWhere + and + vlSubSelect+ vlSubWhere
else
vlWhere := FWhere + vlSubSelect+ vlSubWhere;
End;
if (FWhere <> EmptyStr) then
Begin
if (vlWhere <> EmptyStr) then
vlWhere := vlWhere + and + FWhere +
Else
vlWhere := FWhere;
End;
if (FOrderBy <> EmptyStr) then
vlOrderBY := Order By + FOrderBy;
FCommandText := vlSelect;
if (vlWhere <> EmptyStr) then
FCommandText := FCommandText + vlWhere;
FCommandText := FCommandText+ vlOrderBy;
Result := True;
End
else
ShowMessage(Informe os campos e Tabelas a serem consultados.);
Except
Result := False;
End;
end;
procedure TConsulta.SalvaOld;
begin
OldTabelas := FTabelas;
OldCampos := FCampos;
OldRelacionamento := FJoin;
OldWhere := FWhere;
OldPrimaryKey := FPrimaryKey;
OldOrderBy := FOrderBy;
OldQtdDados := FQtdDados;
OldPagina := FPagina;
OldDivideDados := FDivideDados;
end;
constructor TSQLDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(AOwner);
FConsulta := TConsulta.Create;
FConsulta.QtdDados := 50;
FConsulta.OrderBy := 1;
end;
destructor TSQLDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
procedure TSQLDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
Consulta.MontaSelect(Self)
end;
procedure TSQLDataSetRpz.SetChild(const Value: Boolean);
begin
FChild := Value;
if FChild then
begin
if not Assigned(FProviderRpz) then
FProviderRpz := TDataSetProviderRpz.Create(OWNER); // Crio o Provider e vinculo com o SqlDataSet
with FProviderRpz do
Begin
DataSet := Self;
Name := dsp+Copy(Self.Name, 4, length(self.Name)); // Aqui não sei definir Left e top
End;
if not Assigned(FClientRpz) then
FClientRpz := TClientDataSetRpz.Create(OWNER); //Crio o Cds configuro e vinculo com o Provider.
with FClientRpz do
Begin
Consulta := self.Consulta;
ProviderName := FProviderRpz.Name;
SQLConnection := Self.SQLConnection;
Name := cds+Copy(Self.Name, 4, length(self.Name));
CommandText := Self.CommandText; // Aqui não sei definir Left e top
End;
end;
end;
{ TClientDataSetRpz }
constructor TClientDataSetRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner);
FConsulta := TConsulta.Create;
FConsulta.QtdDados := 50;
FConsulta.OrderBy := 1;
end;
destructor TClientDataSetRpz.Destroy;
begin
FreeAndNil(FConsulta);
inherited Destroy;
end;
procedure TClientDataSetRpz.SetSQLConnection(const Value: TSQLConnection);
begin
FSQLConnection := Value;
end;
procedure TClientDataSetRpz.SetAtivo(const Value: Boolean);
begin
FAtivaConsulta := Value;
if FAtivaConsulta then
FConsulta.MontaSelect(Self) //Mando Criar a consulta
end;
{ TDataSetProviderRpz }
constructor TDataSetProviderRpz.Create(Aowner: TComponent);
begin
inherited Create(Aowner); //Inicio oProvider já Pré definido
UpdateMode := upWhereChanged;
Options := [poFetchDetailsOnDemand,poIncFieldProps,poAutoRefresh,poPropogateChanges,poAllowCommandText,poUseQuoteChar];
end;
destructor TDataSetProviderRpz.Destroy;
begin
inherited Destroy;
end;
procedure Register;
begin
RegisterComponents(RpZ, [TSQLDataSetRpz]);
RegisterComponents(RpZ, [TDataSetProviderRpz]);
RegisterComponents(RpZ, [TClientDataSetRpz]);
end;
end.
GOSTEI 0
Tiago Soares
31/01/2012
Obrigado pela ajuda deu uma boa melhorada no código e tb ja dei uma ajeitada no codigo mas ainda tenho a duvida d como pegar o left e o Top para setar nos outros componentes.
aguardando
aguardando
GOSTEI 0
Tiago Soares
31/01/2012
Um problema tb que estou tendo é quando deleto o sqlconnection da access violation no delphi e some o vinculo do sqlconnection do clientdataset
GOSTEI 0