Fórum Problema no comando de busca (Ambiguous nas tabelas) #470121
15/02/2014
0
Primeiramente o que eu quero fazer é uma busca onde para fazer a busca é necessário:
-Selecionar o item no combo box ex: nome
-Escrever algo no edit o que for procurar
-E clicar no botão
-Após clicar no botão aparece tudo em um TDBGrid os dados.
Eu já tenho isso pronto para vários formulários porém esses formulários não tem chave estrangeira como no que eu estou tentando agora.
A questão é que noClientDataSet utilizando o comando
SELECT * FROM FUNCIONARIO
no TDBGrid os campos que são chaves estrangeiras aparecem como numeros(codigo) e não como nome, como por exemplo o funcionário tem uma chave estrangeira chamada cargo e no TDBGrid em vez de aparecer 'Vendedor' aparece '1'. Mas desse modo pelo menos a busca funciona perfeitamente.
Porém como eu quero o nome e não o código mostrando no TDBGrid eu criei um comando no caso este e coloquei no ClientDataSet:
SELECT A.id_funcionario, B.nombre AS CARGO, A.nombre, A.cedula, A.cnpj, A.cpf, A.sexo, A.cep, A.nascimiento, A.nacionalidad, A.estado_civil, A.email, A.celular_uno, A.celular_dos, A.telefono_fax, A.telefono_fixo, A.complemento, A.numero_propriedad, A.direccion, A.barrio, A.ciudad, A.estado, A.pais FROM FUNCIONARIO A, CARGO B WHERE A.id_cargo = B.id_cargo
Ele funcionou perfeitamente no TDBGrid ele aparece o nome em vez do código. Porém quando eu fazia a busca ele dava o seguinte erro:
ERRO:
Lembrando que o 'CARGO' na minha tabela é o ID_CARGO.
Como eu fiz minha busca foi da seguinte maneira:
with TClientDataSet(dtsConsultar.DataSet) do
begin
Close;
CommandText := 'SELECT * FROM FUNCIONARIO WHERE ' + Pesquisa;
Open;
end;A Pesquisa é uma váriavel do tipo String onde ela é composta pelo que é selecionado no combobox junto com o edit ou seja este código:
if cbCampo.ItemIndex = 0 then
begin
Pesquisa := 'NOMBRE' + ' Like' + QuotedStr(edtProcurar.Text + '%')
endEntão eu troquei meu commandText e fiz desta maneira:
Modo de como estou fazendo agora a busca:
with TClientDataSet(dtsConsultar.DataSet) do
begin
Close;
CommandText := 'SELECT A.id_funcionario, B.nombre AS CARGO, A.nombre, A.cedula, A.cnpj, A.cpf, A.sexo, A.cep, A.nascimiento, A.nacionalidad, A.estado_civil, A.email, A.celular_uno,'
+ ' A.celular_dos, A.telefono_fax, A.telefono_fixo, A.complemento, A.numero_propriedad, A.direccion, A.barrio, A.ciudad, A.estado, A.pais FROM FUNCIONARIO A, CARGO B WHERE A.id_cargo = B.id_cargo and ' + Pesquisa;
Open;
end;Lembrando que a Pesquisa é uma váriavel do tipo String onde ela é composta pelo que é selecionado no combobox junto com o edit ou seja este código:
if cbCampo.ItemIndex = 0 then
begin
Pesquisa := 'NOMBRE' + ' Like' + QuotedStr(edtProcurar.Text + '%')
endE agora ele da o seguinte erro:
ERRO:
Eu não sei mais o que fazer, não sei o que estou fazendo de errado e gostaria muito da ajuda de vocês se possivel! A sim os nomes das váriaveis estã em espanhol hehe so pra deixar como observação.
Desde já agradecido!!
Edson Vilhalba
Curtir tópico
+ 0Posts
17/02/2014
Luiz
SELECT A.id_funcionario, B.nombre AS NOME_CARGO, A.nombre, A.cedula, A.cnpj, A.cpf, A.sexo, A.cep, A.nascimiento, A.nacionalidad, A.estado_civil, A.email, A.celular_uno, A.celular_dos, A.telefono_fax, A.telefono_fixo, A.complemento, A.numero_propriedad, A.direccion, A.barrio, A.ciudad, A.estado, A.pais FROM FUNCIONARIO A left join CARGO B on (A.id_cargo = B.id_cargo)
//left join - não precisa ter necessariamente o relacionamento
//inner join - precisa ter relacionamento (não retorna senão tiver)
Gostei + 0
17/02/2014
Edson Vilhalba
SELECT A.id_funcionario, B.nombre AS NOME_CARGO, A.nombre, A.cedula, A.cnpj, A.cpf, A.sexo, A.cep, A.nascimiento, A.nacionalidad, A.estado_civil, A.email, A.celular_uno, A.celular_dos, A.telefono_fax, A.telefono_fixo, A.complemento, A.numero_propriedad, A.direccion, A.barrio, A.ciudad, A.estado, A.pais FROM FUNCIONARIO A left join CARGO B on (A.id_cargo = B.id_cargo)
//left join - não precisa ter necessariamente o relacionamento
//inner join - precisa ter relacionamento (não retorna senão tiver)
Olá Luiz Coelho!
Então eu tentei agora dessa forma como você me falou e coloquei desta maneira:
with TClientDataSet(dtsConsultar.DataSet) do
begin
Close;
CommandText := 'SELECT A.id_funcionario, B.nombre AS NOME_CARGO, A.nombre, A.cedula, A.cnpj, A.cpf, A.sexo, A.cep, A.nascimiento, A.nacionalidad, A.estado_civil, A.email, A.celular_uno,'
+ 'A.celular_dos, A.telefono_fax, A.telefono_fixo, A.complemento, A.numero_propriedad, A.direccion, A.barrio, A.ciudad, A.estado, A.pais FROM FUNCIONARIO A left join CARGO B on (A.id_cargo = B.id_cargo)' + Pesquisa;
Open;
end;Porém agora ele da um outro erro:
Substituo o que está no ClientDataSet por esse commandtext também? Ou só no comandtext do código?
Gostei + 0
17/02/2014
Edson Vilhalba
SELECT A.id_funcionario, B.nombre AS CARGO, A.nombre, A.cedula, A.cnpj, A.cpf, A.sexo, A.cep, A.nascimiento, A.nacionalidad, A.estado_civil, A.email, A.celular_uno, A.celular_dos, A.telefono_fax, A.telefono_fixo, A.complemento, A.numero_propriedad, A.direccion, A.barrio, A.ciudad, A.estado, A.pais FROM FUNCIONARIO A, CARGO B WHERE A.id_cargo = B.id_cargo
Quanto este:
SELECT A.id_funcionario, B.nombre AS CARGO, A.nombre, A.cedula, A.cnpj, A.cpf, A.sexo, A.cep, A.nascimiento, A.nacionalidad, A.estado_civil, A.email, A.celular_uno, A.celular_dos, A.telefono_fax, A.telefono_fixo, A.complemento, A.numero_propriedad, A.direccion, A.barrio, A.ciudad, A.estado, A.pais FROM FUNCIONARIO A left join CARGO B on (A.id_cargo = B.id_cargo)
Eles buscam todos os dados mais não especificos como por exemplo só o nome que é o que eu estou tentando fazer.
Ou seja, quando ele buscar pelo nome aparece todos os dados desse nome que ele buscou.
Eu tentei desta maneira com o Pesquisa que é o que possui 'NOMBRE like Edson' mais ele sempre da algum erro.
with TClientDataSet(dtsConsultar.DataSet) do
begin
Close;
CommandText := 'SELECT A.id_funcionario, B.nombre AS CARGO, A.nombre, A.cedula, A.cnpj, A.cpf, A.sexo, A.cep, A.nascimiento, A.nacionalidad, A.estado_civil, A.email, A.celular_uno,'
+ ' A.celular_dos, A.telefono_fax, A.telefono_fixo, A.complemento, A.numero_propriedad, A.direccion, A.barrio, A.ciudad, A.estado, A.pais FROM FUNCIONARIO A, CARGO B WHERE A.id_cargo = B.id_cargo and ' + Pesquisa;
Open;
end;Gostei + 0
17/02/2014
Luiz
tipo: A.NOMBRE ou B.NOMBRE_CARGO .. a pesquisa pelo que você quiser fazer ...
if cbCampo.ItemIndex = 0 then
begin
Pesquisa := 'A.NOMBRE' + ' Like' + QuotedStr(edtProcurar.Text + '%')
end
lembrando que se você utilizar o left join (ou inner join) do jeito que vc citou acima, você tem que colocar o WHERE na pesquisa ...
if cbCampo.ItemIndex = 0 then
begin
Pesquisa := 'where A.NOMBRE' + ' Like' + QuotedStr(edtProcurar.Text + '%')
end
mas acho que se utilizar seu sql antigo e colocar o apelido na pesquisa (A.NOMBRE' + ' Like' + QuotedStr(edtProcurar.Text + '%')) já vai funcionar ... ele dava Ambiguous pois existe pois o nombre existe nas 2 tabelas e você não definiu na sua pesquisa de qual era ... colocando o apelido ele já aponta para a tabela certa ...
Gostei + 0
17/02/2014
Edson Vilhalba
Funcionou! Era exatamente isso.
Faltava o where e definir o NOMBRE como A ou B no meu caso A. funcionou certinho.
Eu tinha percebido que o erro era esse que ele nao tava conseguindo diferenciar os nomes pq a variavel era igual mais nao sabia resolver isso.
Mais agora deu certo!
Desculpe qualquer coisa mais to aprendendo delphi e banco de dados dai as vezes complica um pouco pra mim.
Muito Obrigado novamente!
Gostei + 0
17/02/2014
Luiz
Todo começo é complicado.
Boa sorte com seus estudos e qualquer coisa estamos por ae!
Abraços.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)