Fórum PESQUISA #428544

10/11/2012

0

TENHO UM SISTEMA DE CADASTRO COM BD INTERBASE, COMPONENTES IBTRANSICTION, DATASOURCE, IBTABLE E IBQUERY(CONSULTA).

QUANDO EU PESQUISO PELO NOME OU RG O SISTEMA PESQUISA E ME MOSTRA O QUE EU ESTOU CONSULTANDO, MAIS TODOS OS OUTROS REGISTROS FICAM VISÍVEIS. EU QUERIA QUE FICASSE VISÍVEL SÓ O REGISTRO QUE EU ESTOU PESQUISANDO, ALGUEM AJUDE?

codigos da pesquisa

procedure TFrmRegistrosCadastrados.Button1Click(Sender: TObject);
Var
sSQL : String;
begin
sSQL := '';
if EdtNome.Text <> '' then
sSQL := ' AND (nome like '+QuotedStr(EdtNome.Text+'%')+')';
if EdtRG.Text <> '' then
sSQL := ' AND (RG like '+QuotedStr(EdtRG.Text+'%')+')';
with Dm.Qry do
begin
Close;
SQL.Text := 'SELECT * FROM PM WHERE (1=1) ' + sSQL + ' ORDER BY nome';
Open;
if not Dm.Qry.IsEmpty then
Dm.IBTable1.Locate('RG',Dm.Qry.FieldByName('RG').AsString,[]);
end;
end;
Paulo

Paulo

Responder

Posts

10/11/2012

William

Colega notei que vc filtra utilizando um instrução SQL e depois usa o locate para direcionar o cursor para determinado registro.
Esse Locate tem alguma finalidade especifica?

Quando quero filtrar os dados uso somente a instrução SQL que carrega somente os registros que atendem a condição WHERE.
Responder

Gostei + 0

10/11/2012

Paulo

Colega notei que vc filtra utilizando um instrução SQL e depois usa o locate para direcionar o cursor para determinado registro.
Esse Locate tem alguma finalidade especifica?

Quando quero filtrar os dados uso somente a instrução SQL que carrega somente os registros que atendem a condição WHERE.


TIVE MUITA DIFICULADADE DE USAR SÓ O IBQUERY, ENTÃO EU USO O IBTABLE(que é mais facil para mim para incluir registros, excluir, editar, etc....) PARA O CADASTRO E O IBQUERY SÓ PARA CONSULTA.
Responder

Gostei + 0

10/11/2012

William

Não sei como funciona o seu sistema, mas eu utilizo o mesmo TSQLQuery para inserir e pesquisar registros!

Os componentes Tables ajudam mas limitam muito as ações também !
Responder

Gostei + 0

10/11/2012

Paulo

Não sei como funciona o seu sistema, mas eu utilizo o mesmo TSQLQuery para inserir e pesquisar registros!

Os componentes Tables ajudam mas limitam muito as ações também !



e como seria inserir, excluir e editar registros no TSQLQuery? no IBTable é: INSERIR = IBTable.append; EXCLUIR = IBTable.delete, EDITAR = IBTable. edit; é muito facil. vc pode me dar uma dica de como faz isso como o TSQLQuery?
Responder

Gostei + 0

10/11/2012

William

No seu caso seria IBQuery, acredito q esse componente também disponibilize os métodos APPEND, EDIT E DELETE.

Geralmente essas operações executo via SQL no componente INSERT, UPDATE, DELETE.
Responder

Gostei + 0

10/11/2012

Deivison Melo

Porquê não utiliza os objetos ibquery ao invés de IBTable?

Se usar a query não vai ocorrer isso...
Responder

Gostei + 0

10/11/2012

Deivison Melo


O problema está nessa parte do código...

Dm.IBTable1.Locate('RG',Dm.Qry.FieldByName('RG').AsString,[]);


Só não entendi pq usou um component query e depois esse component ibtable...
Responder

Gostei + 0

11/11/2012

Claudia Nogueira

Você explicou no post passado o porquê de estar usando os dois IbQuery + IbTable, não é a forma que eu uso, mas pra você continuar assim e conseguir fazer o que você quer, você não usaria o locate, e sim o filter.

Exemplo:

Dm.IBTable1.Filtered := False;
if not Dm.Qry.IsEmpty then
begin
Dm.IBTable1.Filter := ' codigo = ' + IntToStr(Dm.Qry.FieldByName('codigo').AsInteger);
Dm.IBTable1.Filtered := True;
end;


Obs.: o "codigo" você tem que trocar pelo nome do campo chave da sua tabela.
Responder

Gostei + 0

13/11/2012

Paulo

Você explicou no post passado o porquê de estar usando os dois IbQuery + IbTable, não é a forma que eu uso, mas pra você continuar assim e conseguir fazer o que você quer, você não usaria o locate, e sim o filter.

Exemplo:

Dm.IBTable1.Filtered := False;
if not Dm.Qry.IsEmpty then
begin
Dm.IBTable1.Filter := ' codigo = ' + IntToStr(Dm.Qry.FieldByName('codigo').AsInteger);
Dm.IBTable1.Filtered := True;
end;


Obs.: o "codigo" você tem que trocar pelo nome do campo chave da sua tabela.


SÓ QUE O MEU CAMPO CHAVE (RG) JÁ NÃO É MAIS INTEGER. COMO SERIA O CODIGO SUBSTIUINDO O INTEGER?

LEMBRANDO QUE NO LUGAR DO AsInteger eu coloquei AsString, mais não deu certo.
Responder

Gostei + 0

13/11/2012

Claudia Nogueira

Paulo nesse código que eu te passei você não precisa buscar nem por nome e nem por rg, pois a consulta já foi feita anteriormente com a Query e você só quer localizar o registro na tabela pra mostrar, então é a chave da tabela que você vai usar.

procedure TFrmRegistrosCadastrados.Button1Click(Sender: TObject);
Var
sSQL : String;
begin
sSQL := '';
if EdtNome.Text <> '' then
sSQL := ' AND (nome like '+QuotedStr(EdtNome.Text+'%')+')';
if EdtRG.Text <> '' then
sSQL := ' AND (RG like '+QuotedStr(EdtRG.Text+'%')+')';
with Dm.Qry do
begin
Close;
SQL.Text := 'SELECT * FROM PM WHERE (1=1) ' + sSQL + ' ORDER BY nome';
Open;
Dm.IBTable1.Filtered := False;
if not Dm.Qry.IsEmpty then
begin
Dm.IBTable1.Filter := ' codigo = ' + IntToStr(Dm.Qry.FieldByName('codigo').AsInteger);
Dm.IBTable1.Filtered := True;
end;
end;
end;

Eu digitei codigo para o campo chave da tabela, na sua tabela esse campo tem outro nome, tem que trocar ali no código.
Responder

Gostei + 0

15/11/2012

Paulo

Paulo nesse código que eu te passei você não precisa buscar nem por nome e nem por rg, pois a consulta já foi feita anteriormente com a Query e você só quer localizar o registro na tabela pra mostrar, então é a chave da tabela que você vai usar.

procedure TFrmRegistrosCadastrados.Button1Click(Sender: TObject);
Var
sSQL : String;
begin
sSQL := '';
if EdtNome.Text <> '' then
sSQL := ' AND (nome like '+QuotedStr(EdtNome.Text+'%')+')';
if EdtRG.Text <> '' then
sSQL := ' AND (RG like '+QuotedStr(EdtRG.Text+'%')+')';
with Dm.Qry do
begin
Close;
SQL.Text := 'SELECT * FROM PM WHERE (1=1) ' + sSQL + ' ORDER BY nome';
Open;
Dm.IBTable1.Filtered := False;
if not Dm.Qry.IsEmpty then
begin
Dm.IBTable1.Filter := ' codigo = ' + IntToStr(Dm.Qry.FieldByName('codigo').AsInteger);
Dm.IBTable1.Filtered := True;
end;
end;
end;

Eu digitei codigo para o campo chave da tabela, na sua tabela esse campo tem outro nome, tem que trocar ali no código.


a pesquisa esta dando certo, mais por exemplo: no meu cadastro tem três registros com nome PAULO, eu gostaria que quando eu digitar PAULO, todos os registros que contenham PAULO apareça no DBGRID e com esses codigos aparece só um.

Responder

Gostei + 0

16/11/2012

Claudia Nogueira

Você tem que ter dois DataSources, 1 ligado na Query e o DBGrid ligado nele, e outro somente para os campos DB ligados na Table. Quando você usar a consulta vai mostrar todos no DBGrid, aí você pode colocar os comandos pra filtrar o selecionado quando clicar, ou navegar pelo teclado, usando os eventos onCellClick, onKeyDown e onKeyUp o código:

Dm.IBTable1.Filtered := False;
if not Dm.Qry.IsEmpty then
begin
Dm.IBTable1.Filter := ' codigo = ' + IntToStr(Dm.Qry.FieldByName('codigo').AsInteger);
Dm.IBTable1.Filtered := True;
end;


Então resumindo, você usa aquele código no botão pra consulta, e esses outros códigos nos eventos do DBGrid que mencionei.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar