Fórum Problema no comando de busca (Ambiguous nas tabelas) #470121

15/02/2014

0

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
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 + '%')
    end


Entã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 + '%')
    end


E 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

Edson Vilhalba

Responder

Posts

17/02/2014

Luiz

tenta mudar sua select:

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)

Responder

Gostei + 0

17/02/2014

Edson Vilhalba

tenta mudar sua select:

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?
Responder

Gostei + 0

17/02/2014

Edson Vilhalba

Tanto este código no CommandText do código:
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;
Responder

Gostei + 0

17/02/2014

Luiz

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 ...

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 ...
Responder

Gostei + 0

17/02/2014

Edson Vilhalba

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!
Responder

Gostei + 0

17/02/2014

Luiz

Magina parceiro, todos passamos por isso! rsrsrs

Todo começo é complicado.

Boa sorte com seus estudos e qualquer coisa estamos por ae!

Abraços.

Responder

Gostei + 0

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

Aceitar