Problema no comando de busca (Ambiguous nas tabelas)
Olá Pessoal,
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
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:
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:
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:
Então eu troquei meu commandText e fiz desta maneira:
Modo de como estou fazendo agora a busca:
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:
E 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!!
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:
Project CMS.exe raised exception class EDatabaseError with message 'cds_PesqFuncionario:Field 'CARGO' not found
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:
Project CMS.exe raised exception class TDBXError with message 'Ambiguous field name between table FUNCIONARIO and table CARGO NOMBRE'.
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
Curtidas 0
Respostas
Luiz
15/02/2014
tenta mudar sua select:
//left join - não precisa ter necessariamente o relacionamento
//inner join - precisa ter relacionamento (não retorna senão tiver)
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
Edson Vilhalba
15/02/2014
tenta mudar sua select:
//left join - não precisa ter necessariamente o relacionamento
//inner join - precisa ter relacionamento (não retorna senão tiver)
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:
Project CMS.exe raised exception class TDBXError with message 'Token unknown - line 1, column 370 NOMBRE'.
Substituo o que está no ClientDataSet por esse commandtext também? Ou só no comandtext do código?
GOSTEI 0
Edson Vilhalba
15/02/2014
Tanto este código no CommandText do código:
Quanto este:
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.
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
Luiz
15/02/2014
Cara, você precisa verificar seu código, na sua pesquisa por exemplo, você precisa colocar o apelido da tabela no campo.
tipo: A.NOMBRE ou B.NOMBRE_CARGO .. a pesquisa pelo que você quiser fazer ...
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 ...
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 ...
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
Edson Vilhalba
15/02/2014
Luis Coelho você é um gênio cara haha
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!
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
Luiz
15/02/2014
Magina parceiro, todos passamos por isso! rsrsrs
Todo começo é complicado.
Boa sorte com seus estudos e qualquer coisa estamos por ae!
Abraços.
Todo começo é complicado.
Boa sorte com seus estudos e qualquer coisa estamos por ae!
Abraços.
GOSTEI 0