Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

maquinavirtual

filtrar dblookup com ibquery

Recommended Posts

filtrar dblookup com ibquery

 

Quero filtrar dois dblookups, um deles e o estado, o outro e o cidade, mas estou com dificuldade.

Estou utilizando delphi 7 - Banco de dados Firebird - Componentes paleta Interbase.

No DataModule criei uma Query (componente ibquery) na propriedade Sql inseri o codigo:

 

 

select *
from TABCIDADE
where CODIGOCIDADE = :PRMcodigocidade

 

PRMcodigocidade = parametro escolhido.

 

 

Fui ate o formulario cadastro, aonde estao os dois dblookups (estado, cidade) no dblookup_estado na propriedade OnCloseUp inseri o seguinte codigo:

 

procedure TFormCadastro.DBLKselecESTADOCloseUp(Sender: TObject);
begin
  DTM.IBQRYbuscaCidade.Close;
  DTM.IBQRYbuscaCidade.Params.ParamByName('PRMcodigocidade').AsString:=DBLKselecCIDADE.Text;
  DTM.IBQRYbuscaCidade.Open;
end;

 

Quando seleciono o estado, no dblookup_cidade nao acontece o filtro, ele continua me mostrando todas as cidades cadastradas na tabela. Lembrando que ele nao gera erro tambem.

Mais ou menos o codigo acima significa, ao menos e o que eu acho, me corrijam se estiver errado, que ao fechar o dblookup_estado a query vai buscar as cidades relacionadas ao estado selecionado e no dblookup_cidade mostrar os registros de cidades relacionados ao estado selecionado.

Se possivel aguardo ajuda, obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Maquinavirtual,

 

Será que ai não cabe um master detail, para facilitar? Dai por natureza ele só mostraria as cidades do estado selecionado.

 

Na sua tabela de cidades (detail), configure o MasterSource como a tabela de estados (master). Em master fields, clique nos [...] que aparecem quando você clica no espaço em branco. Relacione a chave estrangeira com a primária e dê um Ok.

 

Se não me engano o processo vai linkar a tabela de cidades com a de estados.

 

Qualquer coisa, fala ai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Maquinavirtual,

 

Será que ai não cabe um master detail, para facilitar? Dai por natureza ele só mostraria as cidades do estado selecionado.

 

Na sua tabela de cidades (detail), configure o MasterSource como a tabela de estados (master). Em master fields, clique nos [...] que aparecem quando você clica no espaço em branco. Relacione a chave estrangeira com a primária e dê um Ok.

 

Se não me engano o processo vai linkar a tabela de cidades com a de estados.

 

Qualquer coisa, fala ai.

 

beleza Donah,

 

Nao encontrei a propriedade MASTERSOURCE na tabela. Estou usando firebird 2.0 e componentes da paleta interbase,

ibdataset, ibtransaction, e ibquey. Voce tem mais alguma sugestao.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, tô com o Delphi 2009 aqui e não consigo rodar o Interbase. Vamos pro plano B.

 

Ok, eu tentei o plano B aqui montando algo no Delphi, mas também não deu certo. Vamos pro C.

 

DTM.IBQRYbuscaCidade.Params.ParamByName('PRMcodigocidade').AsString:=DBLKselecCIDADE.Text;

Troque para

 

DTM.IBQRYbuscaCidade.Params.ParamByName('PRMcodigocidade').AsString:=1;

Ou qualquer outro número inteiro que te agrade. Veja se a filtragem ocorre.

 

Se ocorrer, o problema está com o texto DBLKselecCIDADE.Text.

Ele é um forte candidato, pois acabei de perceber que é Texto indo pra um campo de código, que provavelmente é de valor inteiro, correto?

 

O seu parâmetro não deveria ser um número inteiro?

 

DTM.IBQRYbuscaCidade.Params.ParamByName('PRMcodigocidade').asInteger:= strtoint(DBLKselecCIDADE.Text);

Caso não resolva, poste a estrutura da tabela que você está fazendo a Query e como configurou o DBLOOKUP.

 

Abraços e boa sorte!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, tô com o Delphi 2009 aqui e não consigo rodar o Interbase. Vamos pro plano B.

 

Ok, eu tentei o plano B aqui montando algo no Delphi, mas também não deu certo. Vamos pro C.

 

DTM.IBQRYbuscaCidade.Params.ParamByName('PRMcodigocidade').AsString:=DBLKselecCIDADE.Text;

Troque para

 

DTM.IBQRYbuscaCidade.Params.ParamByName('PRMcodigocidade').AsString:=1;

Ou qualquer outro número inteiro que te agrade. Veja se a filtragem ocorre.

 

Se ocorrer, o problema está com o texto DBLKselecCIDADE.Text.

Ele é um forte candidato, pois acabei de perceber que é Texto indo pra um campo de código, que provavelmente é de valor inteiro, correto?

 

O seu parâmetro não deveria ser um número inteiro?

 

DTM.IBQRYbuscaCidade.Params.ParamByName('PRMcodigocidade').asInteger:= strtoint(DBLKselecCIDADE.Text);

Caso não resolva, poste a estrutura da tabela que você está fazendo a Query e como configurou o DBLOOKUP.

 

Abraços e boa sorte!

 

beleza Donah, desculpa a demora para responder.

 

Bem mudei a linha que voce sugeriu.

A linha de comando era:

DTM.IBQRYbuscaCidade.Params.ParamByName('PRMcodigocidade').AsString:=DBLKselecCIDADE.Text;

Troquei por:

DTM.IBQRYbuscaCidade.ParamByName('PRMcodigocidade').AsInteger:=StrToInt(DBLKselecCIDADE.Text);

Quando escolhi o estado surgiu o erro abaixo, e ainda no dblookup_cidade continuou a me mostrar todos

os registros da tabela:

Is not a valid integer value

As minhas tabelas sao:

 

TABCADASTRO

CREATE TABLE TABCADASTRO (
    CODIGOCADASTRO   INTEGER NOT NULL,
    CLASSE           VARCHAR(50),
    NOMECOMPLETO     VARCHAR(50),
    ENDERECO         VARCHAR(50),
    NUMERO           VARCHAR(10),
    COMPLEMENTO      VARCHAR(50),
    PONTOREFERENCIA  VARCHAR(50),
    CODIGOESTADO     INTEGER NOT NULL,
    CODIGOCIDADE     INTEGER NOT NULL,
    CODIGOBAIRRO     INTEGER NOT NULL,
    CEP              VARCHAR(20),
    TELRES           VARCHAR(20),
    TELCEL           VARCHAR(20),
    TELCOM           VARCHAR(20),
    EMAIL            VARCHAR(50),
    HOMEPAGE         VARCHAR(50)
);

CODIGOCADASTRO (pk) primary key
CODIGOESTADO (fk) foregein key
CODIGOCIDADE (fk)
CODIGOBAIRRO (fk)

TABESTADO

CREATE TABLE TABESTADO (
    CODIGOESTADO  INTEGER NOT NULL,
    NOMEESTADO    VARCHAR(50),
    SIGLA         VARCHAR(2)
);

CODIGOESTADO (pk)

TABCIDADE

CREATE TABLE TABCIDADE (
    CODIGOCIDADE  INTEGER NOT NULL,
    CODIGOESTADO  INTEGER NOT NULL,
    NOMECIDADE    VARCHAR(50)
);

CODIGOCIDADE (pk)
CODIGOESTADO (fk)

TABBAIRRO

CREATE TABLE TABBAIRRO (
    CODIGOBAIRRO  INTEGER NOT NULL,
    CODIGOCIDADE  INTEGER NOT NULL,
    CODIGOESTADO  INTEGER NOT NULL,
    NOMEBAIRRO    VARCHAR(50)
);

CODIGOBAIRRO (pk)
CODIGOCIDADE (fk)
CODIGOBAIRRO (fk)

O codigo da query esta assim:

No evento oncloseup (ao fechar o dblookup_estado)

procedure TFormCadastro.DBLKselecESTADOCloseUp(Sender: TObject);
begin
  DTM.IBQRYbuscaCidade.Close;
  DTM.IBQRYbuscaCidade.ParamByName('PRMcodigocidade').AsString:=DBLKselecCIDADE.Text;
  DTM.IBQRYbuscaCidade.Open;
end;

Aguardo uma resposta, obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que matei o problema. Pelo menos funcionou aqui em casa.

 

O seu problema é o dblookup_estado. Você está pegando o texto dele e enviando pra um campo que é integer.

 

Primeiro de tudo: Corrija o parâmetro para que seja um integer.

Imagem Postada

 

Se você não precisa fazer isso, apenas mantenha o asInteger que usou por último.

Agora configure o dblookup_estado da seguinte forma:

 

Em KEYFIELD, escolha CODIGOESTADO

Em ListField, escolha SIGLA (ou nome estado).

 

No evento de CLOSEUP, faça a seguinte modificação:

procedure TFormCadastro.DBLKselecESTADOCloseUp(Sender: TObject);
begin
  DTM.IBQRYbuscaCidade.Close;
  DTM.IBQRYbuscaCidade.ParamByName('PRMcodigocidade').AsInteger:=DBLKselecCIDADE.KeyValue;
  DTM.IBQRYbuscaCidade.Open;
end;

Você estava pegando o Text, que provavelmente era "SP" ou "São Paulo". Usando o KeyValue, você vai pegar o Código desse estado.

 

Digamos que o ListField você usa para mostrar o "texto" ao usuário. No keyfield, mostra o "código" ou qualquer valor secundário que você precise usar (em alguns casos talvez você precise mostrar o número no list e o número no key novamente, vai de caso pra caso).

 

No seu DBLOOKUP de cidades, configure com cuidado o list field e o key field (texto/código), geralmente salvamos apenas os códigos e pegamos "textos"(nomes, descrições..) com inner join.

 

Só acho estranho uma coisa: Seu lookup de cidades não deveria mostrar nada, afinal, o parâmetro nunca foi preenchido com sucesso. Tente fazer essas modificações, se continuar a mostrar todas as cidades, dê uma olhada se a query está configurada corretamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que matei o problema. Pelo menos funcionou aqui em casa.

 

O seu problema é o dblookup_estado. Você está pegando o texto dele e enviando pra um campo que é integer.

 

Primeiro de tudo: Corrija o parâmetro para que seja um integer.

Imagem Postada

 

Se você não precisa fazer isso, apenas mantenha o asInteger que usou por último.

Agora configure o dblookup_estado da seguinte forma:

 

Em KEYFIELD, escolha CODIGOESTADO

Em ListField, escolha SIGLA (ou nome estado).

 

No evento de CLOSEUP, faça a seguinte modificação:

procedure TFormCadastro.DBLKselecESTADOCloseUp(Sender: TObject);
begin
  DTM.IBQRYbuscaCidade.Close;
  DTM.IBQRYbuscaCidade.ParamByName('PRMcodigocidade').AsInteger:=DBLKselecCIDADE.KeyValue;
  DTM.IBQRYbuscaCidade.Open;
end;

Você estava pegando o Text, que provavelmente era "SP" ou "São Paulo". Usando o KeyValue, você vai pegar o Código desse estado.

 

Digamos que o ListField você usa para mostrar o "texto" ao usuário. No keyfield, mostra o "código" ou qualquer valor secundário que você precise usar (em alguns casos talvez você precise mostrar o número no list e o número no key novamente, vai de caso pra caso).

 

No seu DBLOOKUP de cidades, configure com cuidado o list field e o key field (texto/código), geralmente salvamos apenas os códigos e pegamos "textos"(nomes, descrições..) com inner join.

 

Só acho estranho uma coisa: Seu lookup de cidades não deveria mostrar nada, afinal, o parâmetro nunca foi preenchido com sucesso. Tente fazer essas modificações, se continuar a mostrar todas as cidades, dê uma olhada se a query está configurada corretamente.

 

beleza,

Tentei realizar as configuracoes no dblookup_estado

mas as propriedades Listfield e keyfield elas nao me mostram opcoes

desta maneira fico sem saber o que fazer.

Se voce tiver mais alguma alternativa ou caso queira me enviar

o codigo que fez meu email e:

 

maquinavirtual@razaoinfo.com.br

 

Agradeco a ajuda ate agora. Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você configurou o LISTSOURCE do dblookup_estado no DataSet que está ligado a Query de estados? Caso não, fica sem opções mesmo.

 

Veja como está a estrutura nesta screen shot:

Imagem Postada

 

Código fonte aqui.

 

DBGO do Delphi 2009. Se quiser ver em ação, vai ter que modificar a conexão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.