Componente de Pesquisa SQL
22/08/2004
0
Olá a todos,
Estou implementando um componente de pesquisa SQL para o componente DBX (SQLConnetion, SQLQuery).
Até ae tudo OK, o problema é q quando eu abro a tabela (Open) não aparece na no DBGrid gostari q depois do Open mostrase os registros no DBGrid.
Já fiz uns teste a Query esta selecionando tudo OK, só não tá aparecendo no DBGrid.
Código Abaixo:
*************************************************************
type
TTipoDataSet = (tpTable, tpQuery);
TLookupSQL = class(TSpeedButton)
private
{ Private declarations }
FZCampo :TDBEdit;
FZChave :String;
FZFormAtual :TForm;
FZNomeTabela :String;
FZQryPesquisa: TSQLQuery;
FZTipoDataSet :TTipoDataSet;
{Sub Componentes}
FEditPesquisa :TEdit;
FDBGridPesquisa :TDBGrid;
FDSPesquisa :TDataSource;
{procedures Internas do Componente}
procedure PesquisaExit(Sender: TObject);
procedure PesquisaKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure GridDblClick(Sender:TObject);
protected
{ Protected declarations }
public
{ Public declarations }
{Query de pesquisa interna}
FQrPesquisa :TSQLQuery;
constructor Create(AOwner: TComponent); override;
procedure Click; override;
published
{ Published declarations }
property ZCampo: TDBEdit read FZCampo write FZCampo;
property ZChave: String read FZChave write FZChave;
property ZFormAtual: TForm read FZFormAtual write FZFormAtual;
property ZNomeTabela: String read FZNomeTabela write FZNomeTabela;
property ZQryPesquisa: TSQLQuery read FZQryPesquisa write FZQryPesquisa;
property ZTipoDataSet: TTipoDataSet read FZTipoDataSet write FZTipoDataSet;
end;
procedure Register;
implementation
constructor TLookupSQL.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
{Cria Query}
FQrPesquisa := TSQLQuery.Create(FQrPesquisa);
{Cria DataSource}
FDSPesquisa := TDataSource.Create(FDSPesquisa);
{Liga DataSource com a Query}
end;
{Quando Clica Uma vez no botão(abre a pesquisa), se clicar novamente(fecha a pesquisa)}
procedure TLookupSQL.Click;
begin
inherited;
if FEditPesquisa <> nil then
ZCampo.SetFocus//Fecha pesquisa
else
begin
{Cria DBGrid}
FDBGridPesquisa := TDBGrid.Create(ZFormAtual);
FDBGridPesquisa.DataSource := FDSPesquisa;
FDBGridPesquisa.Parent := ZFormAtual;
FDBGridPesquisa.Top := ZCampo.Top + 44;
FDBGridPesquisa.Width := ZCampo.Width;
FDBGridPesquisa.Left := ZCampo.Left;
FDBGridPesquisa.ReadOnly := True;
FDBGridPesquisa.Options := [dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgRowSelect,dgAlwaysShowSelection,dgConfirmDelete,dgCancelOnExit];
FDBGridPesquisa.OnExit := PesquisaExit; // Fecha Pesquisa
FDBGridPesquisa.OnDBlClick := GridDblClick; // Fecha Fecha Pesquisa
{Mostra EditPesquisa e DBGridPesquisa}
FQrPesquisa.SQLConnection := TSQLQuery(FZCampo.DataSource.DataSet).SQLConnection;
FDSPesquisa := TDataSource.Create(ZFormAtual);
FDSPesquisa.Dataset := FQrPesquisa;
FDSPesquisa.Dataset := FQrPesquisa;
{Cria EditPesquisa}
FEditPesquisa := TEdit.Create(ZFormAtual);
FEditPesquisa.Parent := ZFormAtual;
FEditPesquisa.Top := ZCampo.Top + 22;
FEditPesquisa.Width := ZCampo.Width;
FEditPesquisa.Left := ZCampo.Left;
FEditPesquisa.CharCase := ecUpperCase; // Caracteres Todos em Maiúsculos
FEditPesquisa.OnKeyDown := PesquisaKeyDown;
FEditPesquisa.OnExit := PesquisaExit;//Fecha Pesquisa
FEditPesquisa.SetFocus;
end;
end;
{Quando clica duas vezes no DBGrid, fecha pesquisa}
procedure TLookupSQL.GridDblClick(Sender:TObject);
begin
FZCampo.SetFocus;//Fecha Pesquisa
end;
{Procura registros na Query, quando digitar no campo EditPesquisa}
procedure TLookupSQL.PesquisaKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
{Precione ENTER para pesquisar}
if (key = VK_RETURN) then
begin
{Faz Pesquisa}
FQrPesquisa.Close;
[color=red:6f4eb501a1]// Só filta mostrar no DBGrid....[/color:6f4eb501a1]
if FZCampo.field.DataType = ftString then//Se for STRING, coloca ASPAS
FQrPesquisa.SQL.Text :=(´Select ´+FZCampo.field.FieldName+´,´+FZChave+´ from ´+FZNomeTabela+´ where ´+FZCampo.field.FieldName+´ like ´´´+FEditPesquisa.text+´¬´´´)
else
FQrPesquisa.SQL.Text :=(´Select ´+FZCampo.field.FieldName+´,´+FZChave+´ from ´+FZNomeTabela+´ where ´+FZCampo.field.FieldName+´ = ´+FEditPesquisa.text);
FQrPesquisa.Open;
FQrPesquisa.Fields[1].Visible := False; // Não mostra campo Chave(Código) no DBGridPesquisa
end
else
if (Key = VK_DOWN) then
begin
{Navega no DBGrid = Proximo Registro}
FQrPesquisa.Next;
FEditPesquisa.Text := FQrPesquisa.Fields[0].text;
end
else
if (Key = VK_UP) then
begin
{Navega no DBGrid = Proximo Registro}
FQrPesquisa.Prior;
FEditPesquisa.Text := FQrPesquisa.Fields[0].text;
end;
end;
{Quando tirar o Foco do EditPesquisa, ou DBGridPesquisa, então, Fecha a Pesquisa}
procedure TLookupSQL.PesquisaExit(Sender: TObject);
var
ValorChave : String;
iValorChave : Real;
begin
if (FDBGridPesquisa.Focused = False) and (FEditPesquisa.Focused = False) then
begin
{Se o DBEdit, estiver ligado a um TTable então}
if ZTipoDataSet = tpTable then
begin
{Procura registro da Pesquisado, na Tabela onde está ligada o Campo DBEdit}
TTable(FZCampo.DataSource.DataSet).Locate(FZChave, FQrPesquisa.Fields[1].Text, []);
end;
{Fecha Pesquisa = EditPesquisa e DBGrid}
FEditPesquisa.Free;
FDBGridPesquisa.Free;
FEditPesquisa := nil;
FDBGridPesquisa := Nil;
{Se encontrou algum registro na pesquisa}
if FZQryPesquisa.Active = True then
if FZQryPesquisa.FieldByName(FZChave).text <> ´´ then
begin
try
iValorChave := FZQryPesquisa.FieldByName(FZChave).AsInteger;
except
iValorChave := 0;
ValorChave := FZQryPesquisa.FieldByName(FZChave).text;
end;
FZQryPesquisa.Close;
if (iValorChave > 0) then begin
FZQryPesquisa.SQL.Text := ´Select * From ´+FZNomeTabela+´ Where ´+FZChave+´ = :iValorChave ´;
FZQryPesquisa.Params[0].AsFloat := iValorChave;
end else begin
FZQryPesquisa.SQL.Text := ´Select * From ´+FZNomeTabela+´ Where ´+FZChave+´ = :ValorChave ´;
FZQryPesquisa.Params[0].AsString := ValorChave;
end;
if (not FZQryPesquisa.Prepared) then
FZQryPesquisa.Prepared := true;
FZQryPesquisa.Open;
end;
end;
end;
*************************************************************
Estou implementando um componente de pesquisa SQL para o componente DBX (SQLConnetion, SQLQuery).
Até ae tudo OK, o problema é q quando eu abro a tabela (Open) não aparece na no DBGrid gostari q depois do Open mostrase os registros no DBGrid.
Já fiz uns teste a Query esta selecionando tudo OK, só não tá aparecendo no DBGrid.
Código Abaixo:
*************************************************************
type
TTipoDataSet = (tpTable, tpQuery);
TLookupSQL = class(TSpeedButton)
private
{ Private declarations }
FZCampo :TDBEdit;
FZChave :String;
FZFormAtual :TForm;
FZNomeTabela :String;
FZQryPesquisa: TSQLQuery;
FZTipoDataSet :TTipoDataSet;
{Sub Componentes}
FEditPesquisa :TEdit;
FDBGridPesquisa :TDBGrid;
FDSPesquisa :TDataSource;
{procedures Internas do Componente}
procedure PesquisaExit(Sender: TObject);
procedure PesquisaKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure GridDblClick(Sender:TObject);
protected
{ Protected declarations }
public
{ Public declarations }
{Query de pesquisa interna}
FQrPesquisa :TSQLQuery;
constructor Create(AOwner: TComponent); override;
procedure Click; override;
published
{ Published declarations }
property ZCampo: TDBEdit read FZCampo write FZCampo;
property ZChave: String read FZChave write FZChave;
property ZFormAtual: TForm read FZFormAtual write FZFormAtual;
property ZNomeTabela: String read FZNomeTabela write FZNomeTabela;
property ZQryPesquisa: TSQLQuery read FZQryPesquisa write FZQryPesquisa;
property ZTipoDataSet: TTipoDataSet read FZTipoDataSet write FZTipoDataSet;
end;
procedure Register;
implementation
constructor TLookupSQL.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
{Cria Query}
FQrPesquisa := TSQLQuery.Create(FQrPesquisa);
{Cria DataSource}
FDSPesquisa := TDataSource.Create(FDSPesquisa);
{Liga DataSource com a Query}
end;
{Quando Clica Uma vez no botão(abre a pesquisa), se clicar novamente(fecha a pesquisa)}
procedure TLookupSQL.Click;
begin
inherited;
if FEditPesquisa <> nil then
ZCampo.SetFocus//Fecha pesquisa
else
begin
{Cria DBGrid}
FDBGridPesquisa := TDBGrid.Create(ZFormAtual);
FDBGridPesquisa.DataSource := FDSPesquisa;
FDBGridPesquisa.Parent := ZFormAtual;
FDBGridPesquisa.Top := ZCampo.Top + 44;
FDBGridPesquisa.Width := ZCampo.Width;
FDBGridPesquisa.Left := ZCampo.Left;
FDBGridPesquisa.ReadOnly := True;
FDBGridPesquisa.Options := [dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgRowSelect,dgAlwaysShowSelection,dgConfirmDelete,dgCancelOnExit];
FDBGridPesquisa.OnExit := PesquisaExit; // Fecha Pesquisa
FDBGridPesquisa.OnDBlClick := GridDblClick; // Fecha Fecha Pesquisa
{Mostra EditPesquisa e DBGridPesquisa}
FQrPesquisa.SQLConnection := TSQLQuery(FZCampo.DataSource.DataSet).SQLConnection;
FDSPesquisa := TDataSource.Create(ZFormAtual);
FDSPesquisa.Dataset := FQrPesquisa;
FDSPesquisa.Dataset := FQrPesquisa;
{Cria EditPesquisa}
FEditPesquisa := TEdit.Create(ZFormAtual);
FEditPesquisa.Parent := ZFormAtual;
FEditPesquisa.Top := ZCampo.Top + 22;
FEditPesquisa.Width := ZCampo.Width;
FEditPesquisa.Left := ZCampo.Left;
FEditPesquisa.CharCase := ecUpperCase; // Caracteres Todos em Maiúsculos
FEditPesquisa.OnKeyDown := PesquisaKeyDown;
FEditPesquisa.OnExit := PesquisaExit;//Fecha Pesquisa
FEditPesquisa.SetFocus;
end;
end;
{Quando clica duas vezes no DBGrid, fecha pesquisa}
procedure TLookupSQL.GridDblClick(Sender:TObject);
begin
FZCampo.SetFocus;//Fecha Pesquisa
end;
{Procura registros na Query, quando digitar no campo EditPesquisa}
procedure TLookupSQL.PesquisaKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
{Precione ENTER para pesquisar}
if (key = VK_RETURN) then
begin
{Faz Pesquisa}
FQrPesquisa.Close;
[color=red:6f4eb501a1]// Só filta mostrar no DBGrid....[/color:6f4eb501a1]
if FZCampo.field.DataType = ftString then//Se for STRING, coloca ASPAS
FQrPesquisa.SQL.Text :=(´Select ´+FZCampo.field.FieldName+´,´+FZChave+´ from ´+FZNomeTabela+´ where ´+FZCampo.field.FieldName+´ like ´´´+FEditPesquisa.text+´¬´´´)
else
FQrPesquisa.SQL.Text :=(´Select ´+FZCampo.field.FieldName+´,´+FZChave+´ from ´+FZNomeTabela+´ where ´+FZCampo.field.FieldName+´ = ´+FEditPesquisa.text);
FQrPesquisa.Open;
FQrPesquisa.Fields[1].Visible := False; // Não mostra campo Chave(Código) no DBGridPesquisa
end
else
if (Key = VK_DOWN) then
begin
{Navega no DBGrid = Proximo Registro}
FQrPesquisa.Next;
FEditPesquisa.Text := FQrPesquisa.Fields[0].text;
end
else
if (Key = VK_UP) then
begin
{Navega no DBGrid = Proximo Registro}
FQrPesquisa.Prior;
FEditPesquisa.Text := FQrPesquisa.Fields[0].text;
end;
end;
{Quando tirar o Foco do EditPesquisa, ou DBGridPesquisa, então, Fecha a Pesquisa}
procedure TLookupSQL.PesquisaExit(Sender: TObject);
var
ValorChave : String;
iValorChave : Real;
begin
if (FDBGridPesquisa.Focused = False) and (FEditPesquisa.Focused = False) then
begin
{Se o DBEdit, estiver ligado a um TTable então}
if ZTipoDataSet = tpTable then
begin
{Procura registro da Pesquisado, na Tabela onde está ligada o Campo DBEdit}
TTable(FZCampo.DataSource.DataSet).Locate(FZChave, FQrPesquisa.Fields[1].Text, []);
end;
{Fecha Pesquisa = EditPesquisa e DBGrid}
FEditPesquisa.Free;
FDBGridPesquisa.Free;
FEditPesquisa := nil;
FDBGridPesquisa := Nil;
{Se encontrou algum registro na pesquisa}
if FZQryPesquisa.Active = True then
if FZQryPesquisa.FieldByName(FZChave).text <> ´´ then
begin
try
iValorChave := FZQryPesquisa.FieldByName(FZChave).AsInteger;
except
iValorChave := 0;
ValorChave := FZQryPesquisa.FieldByName(FZChave).text;
end;
FZQryPesquisa.Close;
if (iValorChave > 0) then begin
FZQryPesquisa.SQL.Text := ´Select * From ´+FZNomeTabela+´ Where ´+FZChave+´ = :iValorChave ´;
FZQryPesquisa.Params[0].AsFloat := iValorChave;
end else begin
FZQryPesquisa.SQL.Text := ´Select * From ´+FZNomeTabela+´ Where ´+FZChave+´ = :ValorChave ´;
FZQryPesquisa.Params[0].AsString := ValorChave;
end;
if (not FZQryPesquisa.Prepared) then
FZQryPesquisa.Prepared := true;
FZQryPesquisa.Open;
end;
end;
end;
*************************************************************
Christian_adriano
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)