INTERBASE BD
tenho um projeto no delphi com TIBTable, IBDatabase1 e IBTransaction1.
o cadastro vai bem, agora estou não estou conseguindo fazer pesquisa por nome ou RG neste cadastro. alguem pode me ajudar?
o cadastro vai bem, agora estou não estou conseguindo fazer pesquisa por nome ou RG neste cadastro. alguem pode me ajudar?
Paulo
Curtidas 0
Respostas
Claudia Nogueira
06/11/2012
Com o IBQuery você pode fazer as pesquisas.
Se você tiver dois campos na tela chamados por exemplo EdtNome e EdtRG, você pode colocar pra pesquisar o seguinte:
Se você tiver dois campos na tela chamados por exemplo EdtNome e EdtRG, você pode colocar pra pesquisar o seguinte:
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 Qry do begin Close; SQL.Text := 'SELECT * FROM TABELA WHERE (1=1) ' + sSQL + ' ORDER BY nome'; Open; end; end;
GOSTEI 0
Paulo
06/11/2012
Com o IBQuery você pode fazer as pesquisas.
Se você tiver dois campos na tela chamados por exemplo EdtNome e EdtRG, você pode colocar pra pesquisar o seguinte:
Se você tiver dois campos na tela chamados por exemplo EdtNome e EdtRG, você pode colocar pra pesquisar o seguinte:
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 Qry do begin Close; SQL.Text := 'SELECT * FROM TABELA WHERE (1=1) ' + sSQL + ' ORDER BY nome'; Open; end; end;
Esses códigos vão no onchange do EdtNome, EdtRg ou BtnConsulta. Porque eu digito nome para pesquisa mais não não filtra nada?
GOSTEI 0
Claudia Nogueira
06/11/2012
Se você usar onChange vai no onChange se usar botão, vai no botão.
O DataSource que está ligado ao DBGrid tem que estar ligado ao IBQuery pra mostrar as informações.
Esses códigos vão no onchange do EdtNome, EdtRg ou BtnConsulta. Porque eu digito nome para pesquisa mais não não filtra nada?
O DataSource que está ligado ao DBGrid tem que estar ligado ao IBQuery pra mostrar as informações.
Com o IBQuery você pode fazer as pesquisas.
Se você tiver dois campos na tela chamados por exemplo EdtNome e EdtRG, você pode colocar pra pesquisar o seguinte:
Se você tiver dois campos na tela chamados por exemplo EdtNome e EdtRG, você pode colocar pra pesquisar o seguinte:
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 Qry do begin Close; SQL.Text := 'SELECT * FROM TABELA WHERE (1=1) ' + sSQL + ' ORDER BY nome'; Open; end; end;
Esses códigos vão no onchange do EdtNome, EdtRg ou BtnConsulta. Porque eu digito nome para pesquisa mais não não filtra nada?
GOSTEI 0
Paulo
06/11/2012
Se você usar onChange vai no onChange se usar botão, vai no botão.
O DataSource que está ligado ao DBGrid tem que estar ligado ao IBQuery pra mostrar as informações.
Esses códigos vão no onchange do EdtNome, EdtRg ou BtnConsulta. Porque eu digito nome para pesquisa mais não não filtra nada?
O DataSource que está ligado ao DBGrid tem que estar ligado ao IBQuery pra mostrar as informações.
Com o IBQuery você pode fazer as pesquisas.
Se você tiver dois campos na tela chamados por exemplo EdtNome e EdtRG, você pode colocar pra pesquisar o seguinte:
Se você tiver dois campos na tela chamados por exemplo EdtNome e EdtRG, você pode colocar pra pesquisar o seguinte:
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 Qry do begin Close; SQL.Text := 'SELECT * FROM TABELA WHERE (1=1) ' + sSQL + ' ORDER BY nome'; Open; end; end;
Esses códigos vão no onchange do EdtNome, EdtRg ou BtnConsulta. Porque eu digito nome para pesquisa mais não não filtra nada?
Fiz as ligações como vc mandou mais não deu certo.
GOSTEI 0
Claudia Nogueira
06/11/2012
Qual o nome da sua tabela e campos?
Quais componentes tem nessa tela que quer fazer uma pesquisa?
Dá algum erro na hora que executa o código?
Quais componentes tem nessa tela que quer fazer uma pesquisa?
Dá algum erro na hora que executa o código?
GOSTEI 0
Paulo
06/11/2012
Qual o nome da sua tabela e campos?
Quais componentes tem nessa tela que quer fazer uma pesquisa?
Dá algum erro na hora que executa o código?
Quais componentes tem nessa tela que quer fazer uma pesquisa?
Dá algum erro na hora que executa o código?
o nome da minha tabela criada no IBConsole é;
GAB_IDENT
os campos da tabela são os seguintes;
CREATE TABLE GAB_IDENT
(
RG NUMERIC(4, 0) NOT NULL,
NOME VARCHAR(30),
POSTOGRAD VARCHAR(30),
SITUACAO VARCHAR(30),
PAI VARCHAR(30),
MAE VARCHAR(30),
CPF VARCHAR(30),
D_NASC VARCHAR(30),
NATURALIDADE VARCHAR(30),
INCLUSAO VARCHAR(30),
EXCLUSAO VARCHAR(30),
CERTIDAO VARCHAR(30),
CERTIDAO2 VARCHAR(30),
CERT_MILITAR VARCHAR(30),
CUTIS VARCHAR(30),
CABELOS VARCHAR(30),
OLHOS VARCHAR(30),
ALTURA VARCHAR(30),
T_SANG VARCHAR(30),
S_PARTIC VARCHAR(30),
PORTE VARCHAR(30),
EXPEDICAO VARCHAR(30),
ALTERACOES VARCHAR(30),
ALTERACOES2 VARCHAR(30),
ALTERACOES3 VARCHAR(30),
ALTERACOES4 VARCHAR(30),
ALTERACOES5 VARCHAR(30),
ALTERACOES6 VARCHAR(30),
ALTERACOES7 VARCHAR(30),
ALTERACOES8 VARCHAR(30),
ALTERACOES9 VARCHAR(30),
ALTERACOES10 VARCHAR(30),
ALTERACOES11 VARCHAR(30),
ALTERACOES12 VARCHAR(30),
ALTERACOES13 VARCHAR(30),
ALTERACOES14 VARCHAR(30),
ALTERACOES15 VARCHAR(30),
ALTERACOES16 VARCHAR(30),
ALTERACOES17 VARCHAR(30),
ALTERACOES18 VARCHAR(30),
ALTERACOES19 VARCHAR(30),
ALTERACOES20 VARCHAR(30),
FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
DIGITAL BLOB SUB_TYPE 0 SEGMENT SIZE 80,
CONSTRAINT PK_GAG_IDENT PRIMARY KEY ("RG")
);
GOSTEI 0
Deivison Melo
06/11/2012
Veja se esses artigos o ajuda...
http://www.dotbr.com.br/fernando/banco_dadosII/SQL-ParteI.pdf
http://www.dotbr.com.br/fernando/banco_dadosII/SQL-ParteII.pdf
http://www.dotbr.com.br/fernando/banco_dadosII/SQL-ParteIII.pdf
http://www.dotbr.com.br/fernando/banco_dadosII/SQL-ParteI.pdf
http://www.dotbr.com.br/fernando/banco_dadosII/SQL-ParteII.pdf
http://www.dotbr.com.br/fernando/banco_dadosII/SQL-ParteIII.pdf
GOSTEI 0
Claudia Nogueira
06/11/2012
Como o campo RG é numérico, o que mudaria na sentença SQL é que não poderia usar o LIKE. E também teria que converter a string pra integer antes de passar o parâmetro.
Tenta colocar na tela só o IBQuery, um DataSource, um DBGrid, um Botão, o Campo Nome e o o Campo RG.
Liga o IBQuery no DataSource e o DataSource no DBGrid.
Coloca o código no botão e compila.
Umas das formas é exatamente assim.
Tem que pegar o jeito de trabalhar com IBQuery, pegando o jeito o resto é moleza.
Dá uma olhada nos links que o Deivison passou pra ver se dá uma luz.
Var sSQL : String; iRG : Integer; begin try iRG := StrToInt(EdtRG.Text); except iRG := 0; end; sSQL := ''; if EdtNome.Text <> '' then sSQL := ' AND (nome like '+QuotedStr(EdtNome.Text+'%')+')'; if iRG <> 0 then sSQL := ' AND (rg = '+IntToStr(iRG)+')'; with Qry do begin Close; SQL.Text := 'SELECT * FROM GAB_IDENT WHERE (1=1) ' + sSQL + ' ORDER BY nome'; Open; end; end;
Tenta colocar na tela só o IBQuery, um DataSource, um DBGrid, um Botão, o Campo Nome e o o Campo RG.
Liga o IBQuery no DataSource e o DataSource no DBGrid.
Coloca o código no botão e compila.
Umas das formas é exatamente assim.
Tem que pegar o jeito de trabalhar com IBQuery, pegando o jeito o resto é moleza.
Dá uma olhada nos links que o Deivison passou pra ver se dá uma luz.
GOSTEI 0
Paulo
06/11/2012
Como o campo RG é numérico, o que mudaria na sentença SQL é que não poderia usar o LIKE. E também teria que converter a string pra integer antes de passar o parâmetro.
Tenta colocar na tela só o IBQuery, um DataSource, um DBGrid, um Botão, o Campo Nome e o o Campo RG.
Liga o IBQuery no DataSource e o DataSource no DBGrid.
Coloca o código no botão e compila.
Umas das formas é exatamente assim.
Tem que pegar o jeito de trabalhar com IBQuery, pegando o jeito o resto é moleza.
Dá uma olhada nos links que o Deivison passou pra ver se dá uma luz.
Var sSQL : String; iRG : Integer; begin try iRG := StrToInt(EdtRG.Text); except iRG := 0; end; sSQL := ''; if EdtNome.Text <> '' then sSQL := ' AND (nome like '+QuotedStr(EdtNome.Text+'%')+')'; if iRG <> 0 then sSQL := ' AND (rg = '+IntToStr(iRG)+')'; with Qry do begin Close; SQL.Text := 'SELECT * FROM GAB_IDENT WHERE (1=1) ' + sSQL + ' ORDER BY nome'; Open; end; end;
Tenta colocar na tela só o IBQuery, um DataSource, um DBGrid, um Botão, o Campo Nome e o o Campo RG.
Liga o IBQuery no DataSource e o DataSource no DBGrid.
Coloca o código no botão e compila.
Umas das formas é exatamente assim.
Tem que pegar o jeito de trabalhar com IBQuery, pegando o jeito o resto é moleza.
Dá uma olhada nos links que o Deivison passou pra ver se dá uma luz.
não tá dando certo não! eu acho que por causa do IBTable.
tem como eu tirar o IBTable e deixar só o Qry?
só que eu meus campos são todos DBEdits que no IBTable, para inserir dados é só Dm.IBTable.append,delete,edit etc..
já no IBQuery eu não sei como configurar os campos para edits, vc pode me dar mais esta explicação?
seria então os componentes: IBTransition, IBDatabase, IBQuery ao invés de IBTable E DataSource
GOSTEI 0
Claudia Nogueira
06/11/2012
Hum entendi agora, não é uma tela só de consulta, é uma tela de cadastro com campos pra consulta.
Ficaria mais ou menos assim, pra logo depois da pesquisa localizar o registro no IBTable e mostrar nos dbs:
Aí se você tem um DBGrid retornando tudo que retorna na consulta, teria dois DataSource, um ligado ao IBQuery e outro ao IbTable.
Pra mostrar nos DB o registro selecionado no DBGrid você pode colocar o código nos eventos onCellClick, onKeyDown e onKeyUp:
Obs.: Você tem que trocar onde está "codigo" par ao campo chave da sua tabela.
Ficaria mais ou menos assim, pra logo depois da pesquisa localizar o registro no IBTable e mostrar nos dbs:
Var
sSQL : String;
iRG : Integer;
begin
try
iRG := StrToInt(EdtRG.Text);
except
iRG := 0;
end;
sSQL := '';
if EdtNome.Text <> '' then
sSQL := ' AND (nome like '+QuotedStr(EdtNome.Text+'%')+')';
if iRG <> 0 then
sSQL := ' AND (rg = '+IntToStr(iRG)+')';
with Qry do
begin
Close;
SQL.Text := 'SELECT * FROM GAB_IDENT WHERE (1=1) ' + sSQL + ' ORDER BY nome';
Open;
if not isEmpty then
Tabela.Locate('codigo',Qry.FieldByName('codigo').AsInteger,[]);
end;
end;
Aí se você tem um DBGrid retornando tudo que retorna na consulta, teria dois DataSource, um ligado ao IBQuery e outro ao IbTable.
Pra mostrar nos DB o registro selecionado no DBGrid você pode colocar o código nos eventos onCellClick, onKeyDown e onKeyUp:
if not isEmpty then
Tabela.Locate('codigo',Qry.FieldByName('codigo').AsInteger,[]);
Obs.: Você tem que trocar onde está "codigo" par ao campo chave da sua tabela.
GOSTEI 0
Paulo
06/11/2012
Hum entendi agora, não é uma tela só de consulta, é uma tela de cadastro com campos pra consulta.
Ficaria mais ou menos assim, pra logo depois da pesquisa localizar o registro no IBTable e mostrar nos dbs:
Aí se você tem um DBGrid retornando tudo que retorna na consulta, teria dois DataSource, um ligado ao IBQuery e outro ao IbTable.
Pra mostrar nos DB o registro selecionado no DBGrid você pode colocar o código nos eventos onCellClick, onKeyDown e onKeyUp:
Obs.: Você tem que trocar onde está "codigo" par ao campo chave da sua tabela.
Ficaria mais ou menos assim, pra logo depois da pesquisa localizar o registro no IBTable e mostrar nos dbs:
Var
sSQL : String;
iRG : Integer;
begin
try
iRG := StrToInt(EdtRG.Text);
except
iRG := 0;
end;
sSQL := '';
if EdtNome.Text <> '' then
sSQL := ' AND (nome like '+QuotedStr(EdtNome.Text+'%')+')';
if iRG <> 0 then
sSQL := ' AND (rg = '+IntToStr(iRG)+')';
with Qry do
begin
Close;
SQL.Text := 'SELECT * FROM GAB_IDENT WHERE (1=1) ' + sSQL + ' ORDER BY nome';
Open;
if not isEmpty then
Tabela.Locate('codigo',Qry.FieldByName('codigo').AsInteger,[]);
end;
end;
Aí se você tem um DBGrid retornando tudo que retorna na consulta, teria dois DataSource, um ligado ao IBQuery e outro ao IbTable.
Pra mostrar nos DB o registro selecionado no DBGrid você pode colocar o código nos eventos onCellClick, onKeyDown e onKeyUp:
if not isEmpty then
Tabela.Locate('codigo',Qry.FieldByName('codigo').AsInteger,[]);
Obs.: Você tem que trocar onde está "codigo" par ao campo chave da sua tabela.
tá dando o seguinte erro;
undeclared identifier isEmpty.
GOSTEI 0
Claudia Nogueira
06/11/2012
o isEmpty tem que colocar o nome do componente antes, fica assim: Qry.IsEmpty
GOSTEI 0
Paulo
06/11/2012
o isEmpty tem que colocar o nome do componente antes, fica assim: Qry.IsEmpty
eu coloquei os codigos no EdtRG deu certo. no EdtNome não. Dá o seguinte erro: is not a valid integer value
GOSTEI 0
Claudia Nogueira
06/11/2012
Esse erro tá mais pro RG, pois tem uma conversão de string pra integer, e o campo provavelmente está vazio, sendo assim, sempre em tempo de projeto vai mostrar essa mensagem, porém em tempo de execução não, pois tem o try except.
O código do nome é assim:
Pra evitar de mostrar o erro de conversão do string pra integer por causa do campo vazio, se você usar um componente do tipo edit mas que é pra valor, tipo algum da DevExpress ou da RxLib, você não usaria variável pra converter, e o código ficaria direto if CeRg.valu <> 0 then sem a variável.
Você pode colocar um código no início do botão:
eu coloquei os codigos no EdtRG deu certo. no EdtNome não. Dá o seguinte erro: is not a valid integer value
O código do nome é assim:
if EdtNome.Text <> '' then sSQL := ' AND (nome like '+QuotedStr(EdtNome.Text+'%')+')';
Pra evitar de mostrar o erro de conversão do string pra integer por causa do campo vazio, se você usar um componente do tipo edit mas que é pra valor, tipo algum da DevExpress ou da RxLib, você não usaria variável pra converter, e o código ficaria direto if CeRg.valu <> 0 then sem a variável.
Você pode colocar um código no início do botão:
if EdtRG.Text = '' then EdtRg.Text := '0';
o isEmpty tem que colocar o nome do componente antes, fica assim: Qry.IsEmpty
eu coloquei os codigos no EdtRG deu certo. no EdtNome não. Dá o seguinte erro: is not a valid integer value
GOSTEI 0
Paulo
06/11/2012
Esse erro tá mais pro RG, pois tem uma conversão de string pra integer, e o campo provavelmente está vazio, sendo assim, sempre em tempo de projeto vai mostrar essa mensagem, porém em tempo de execução não, pois tem o try except.
O código do nome é assim:
Pra evitar de mostrar o erro de conversão do string pra integer por causa do campo vazio, se você usar um componente do tipo edit mas que é pra valor, tipo algum da DevExpress ou da RxLib, você não usaria variável pra converter, e o código ficaria direto if CeRg.valu <> 0 then sem a variável.
Você pode colocar um código no início do botão:
eu coloquei os codigos no EdtRG deu certo. no EdtNome não. Dá o seguinte erro: is not a valid integer value
O código do nome é assim:
if EdtNome.Text <> '' then sSQL := ' AND (nome like '+QuotedStr(EdtNome.Text+'%')+')';
Pra evitar de mostrar o erro de conversão do string pra integer por causa do campo vazio, se você usar um componente do tipo edit mas que é pra valor, tipo algum da DevExpress ou da RxLib, você não usaria variável pra converter, e o código ficaria direto if CeRg.valu <> 0 then sem a variável.
Você pode colocar um código no início do botão:
if EdtRG.Text = '' then EdtRg.Text := '0';
o isEmpty tem que colocar o nome do componente antes, fica assim: Qry.IsEmpty
eu coloquei os codigos no EdtRG deu certo. no EdtNome não. Dá o seguinte erro: is not a valid integer value
O campo RG numeric estava dando muito problema eu mudei de numeric para VARCHAR.
como seria a adaptação dos codigos com a mudança do campo RG numeric para RG VARCHAR?
GOSTEI 0
Claudia Nogueira
06/11/2012
Paulo pro tipo varchar fica igual a consulta pelo nome:
Sem a variável iRG.
if EdtRG.Text <> '' then sSQL := ' AND (rg like '+QuotedStr(EdtRG.Text)+')';
Sem a variável iRG.
GOSTEI 0
Alisson Santos
06/11/2012
amigo gostaria de saber se conseguiu resolver o seu problema.?
GOSTEI 0