Ir para conteúdo
Fórum Script Brasil
  • 0

Consulta Sql Entre Duas Tabelas


Vivendo&Aprendendo

Pergunta

Olá galera preciso saber quais os alunos que estudaram em um determinado ano e trimestre, e para isso eu uso duas tabelas a de alunos e a de histórico onde fica qual o ano e trimestre que o aluno estudou.

Segue abaixo o meu código, mas na execução da um erro dizendo que o campo Código da tabela Alunos é not found.

      DmDados.Alunos.Close;
      DmDados.Alunos.SQL.Clear;  
      DmDados.Alunos.SQL.Add('Select * From Alunos, Historico');
      DmDados.Alunos.SQL.Add('Where Alunos.Codigo = Historico.CodAluno and Alunos.Nome Like :pNome');
      DmDados.Alunos.SQL.Add('Order By Alunos.Codigo');
      DmDados.Alunos.Parameters[0].Value := EdtBusca.Text + '%';
      DmDados.Alunos.Open;

Como posso fazer isso.

Alexandre

Link para o comentário
Compartilhar em outros sites

22 respostass a esta questão

Posts Recomendados

  • 0

Olá KIKO!

Olha se eu fizer dessa forma que você me passou ele tipo que me obriga a colocar todos os campos da tabela no Select, isso é realmente necessário?

E quando eu coloco todos os campos da tabela na consulta, na execução da erro dizendo que nenhum valor foi forneceido para os parametros.

Alexandre

Link para o comentário
Compartilhar em outros sites

  • 0
...

mas na execução da um erro dizendo que o campo Código da tabela Alunos é not found.

Se a mensagem é "Codigo not found", ela parece clara e sugere que você esteja utilizando um nome de campo que não existe na tabela.

Qual a mensagem original? Qual a estrutura das tabelas envolvidas?

Lembre-se também de comentar que banco você utiliza e componente de acesso.

Olha se eu fizer dessa forma que você me passou ele tipo que me obriga a colocar todos os campos da tabela no Select, isso é realmente necessário?
A sugestão do colega Kikonanet é correta. você deve buscar na cláusula SELECT apenas os campos que necessita. Isto evitará trafego de dados desnecessários entre o banco e sua aplicação.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Vivendo&Aprendendo, parece que não deveria haver qualquer problema mesmo.

Mas insisto para que você coloque a mensagem de erro exatamente como você a recebe.

Eu poderia dizer que você adicionou os campos (fields) ao seu componente (dataset - não sei qual) e ao definir a propriedade DisplayLabel como Código, pode ter digitado esta informação na propriedade FieldName (estamos todos sujeitos a fazer isso). Daí, quando você abre a query em tempo de execução (e mesmo em design-time) você vai obter a mensagem: "Alunos: Field 'Código' not found" e nem se dar conta da acentuação.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Vivendo&Aprendendo, você não estaria utilizando mais que um database e daí, no dataset em questão, poderia estar apontando para um onde a tabela alunos não exista?

Qual banco de dados você está utilizando?

Já estão se esgotando as opções. :D

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Vivendo&Aprendendo, vai ser difícil de dar mais palpites.

Por acaso você estaria utilizando uma base de teste (essa em access), porque daí se lhe interessar, você poderia enviar-me para que possa tentar obter a mesma cituação que você está tendo aí.

No campo do "virtual", já não consigo pensar em mais nenhuma opção.

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0

Vivendo&Aprendendo, Confirme o exemplo que lhe passei por e-mail e veja se com sua base quente vai funcionar. Não obtive qualquer erro utilizando aquela consulta em seu post inicial.

Como você não mensionou que componentes utiliza para fazer o acesso, eu utilizei TADOConnection e TADOQuery, com parâmetros padão. A propriedade ConnectionString do TADOConnection ficou Provider=Microsoft.Jet.OLEDB.4.0;Data Source=U:\Micheus\Delphi 7\Projetos\Teste Alexandre\dados.mdb;Persist Security Info=False.

Informe mais detalhes sobre componentes utilizados, modo de acesso, já que existem outros. Só assim, quem sabe, consigamos gerar seu problema.

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Micheus... me desculpa não ter informado os componentes e o banco da minha aplicação, usei essa sql abaixo que você me passou e continua dando erro.

SQL

      with DMDados.Alunos do
      begin
        Close;
        SQL.Clear;
        SQL.Add('Select * From Alunos, Historico');
        SQL.Add('Where Alunos.Codigo = Historico.CodAluno and Alunos.Nome Like :pNome');
        SQL.Add('Order By Alunos.Codigo');
        Parameters[0].Value := EdtBusca.Text + '%';
        Open;
      end;
Erro
Alunos: Field 'Codigo' Not Found.

O meu campo Codigo da tabela Alunos é Auto Incremento.

Alexandre

Link para o comentário
Compartilhar em outros sites

  • 0

Vivendo&Aprendendo, por acaso você testou o programa demo que eu fiz, utilizando a sua tabela quente?

Faça isso e diga se com ele, as consultas estão funcionando, por favor.

Compile-o e coloque seu database na pasta em que você o tiver colocado - há um botão para executar cada uma das duas dúvidas que você postou aqui no forum.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus me desculpa o incomodo cara, mas agora que eu não sei o que pode ser mesmo, porque quando eu executo a sql com meu banco na sua aplicação da certo, mas quando copio a sql da sua aplicação e coloco na meu sistema com o mesmo banco da erro dizendo: Alunos: Field 'Codigo' Not Found. Cara não sei o que é, já exclui o campo Codigo e busquei do banco novamente mas continua a mesma coisa.

Alexandre

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus me desculpa o incomodo cara, mas agora que eu não sei o que pode ser mesmo, porque quando eu executo a sql com meu banco na sua aplicação da certo, mas quando copio a sql da sua aplicação e coloco na meu sistema com o mesmo banco da erro dizendo: Alunos: Field 'Codigo' Not Found. Cara não sei o que é, já exclui o campo Codigo e busquei do banco novamente mas continua a mesma coisa.

Alexandre

Por isso que insisti para que você testasse com meu exemplo. Como estava imaginando, deve haver alguma particularidade nas suas telas.

Talvez seja a forma da conexão - já conferiu os parâmetros, não estaria apontando para outro database, que você possa ter utilizado anteriormente e que ainda não tenha o campo com este nome?

Outra situação em que este tipo de erro pode ocorrer é quando você tem um campo associado a um componente dataware (tipo TDBEdit) e por algum motivo troca o datasource de onde deveria estar vindo o field. Teria alguma situação como esta?

Se não conseguir achar o problema, e quizer, me envie apenas o datamodule que você está utilizando (tem que ter ao menos a cópia do componente de conexão dentro dele) e a tela da consulta que eu testo com aquela base de teste que você me enviou.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
SQL

   with DMDados.Alunos do
      begin
        Close;
        SQL.Clear;
        SQL.Add('Select * From Alunos, Historico');
        SQL.Add('Where Alunos.Codigo = Historico.CodAluno and Alunos.Nome Like :pNome');
        SQL.Add('Order By Alunos.Codigo');
        Parameters[0].Value := EdtBusca.Text + '%';
        Open;
      end;
Erro
Alunos: Field 'Codigo' Not Found.
O meu campo Codigo da tabela Alunos é Auto Incremento.
Vivendo&Aprendendo, vou seguir deste post para tentar exclarecer(também) aos colegas que acompanham, de onde vinha o problema com a referida mensagem de erro. Pode servir de alerta para quem utiliza método parecido. Primeiramente, convém salientar que seu datamodule tem um componente TADOQuery com o nome Alunos com a propriedade SQL(em design-time) definida como: Select * From Alunos Sendo que também foram adicionados os campos a este componente, resultando em 31 campos (existentes nesta tabela, resultado do select), dentre eles está o campo "Codigo". A propriedade FieldDefList nos dataset's mantém uma lista de campos (TField) adicionados em design-time ou em run-time, quando o dataset é aberto. Se campos foram adicionados em design-time, ao abrir o dataset, uma verificação é realizada. Justamente aqui está o problema. Nesta consulta que você faz em run-time (grifado acima), alterando a propriedade SQL, passando a relacionar as tabelas Alunos e Histórico, você busca todos os campos de ambas as tabelas, que tem como resultado 45 campos. Não haveria problema algum se não houvessem campos com o mesmo nome em ambas as tabelas. Ocorre que, ao abrir a consulta, uma nova lista de campos (propriedade FieldDefList) é gerada e uma chamada ao método BindFields(True) para realização uma "consistência" entre os campos obtidos com a consulta (lista FieldDefList) e os adidionados em design-time (lista Fields). Como há campos com o mesmo nome em ambas tabelas, a lista FieldDefList possui os campos com os nomes 'Alunos.Codigo' e 'Historico.Codigo', entretando a lista Fields possui um único campo com o nome 'Codigo', obtido pelo select simples (apenas tabela Alunos, lembram) e a não localização do mesmo na lista FieldDefList resulta na mensagem de erro citada. A melhor maneira de resolver este problema, então, seria adicionar na cláusula SELECT os campos um-a-um, utilizando um alias, para facilitar, e "renomeando" os campos duplicados. Por ex.:
SELECT H.CodAluno, A.Nome, A.DataNasc, H.Codigo as CodHistorico, H.Disciplina
FROM Alunos A, Historico H
WHERE A.Codigo = H.CodAluno

Note que utilizando CodAluno do histórico já estará obtendo o Codigo do Aluno, além de deixar claro de que "código" se trata. Do mesmo modo, "renomear" Codigo em Histórico para CodHistorico, gera o mesmo efeito e evita qualquer confusão.

* Sobre o uso do AS, ele é necessário no caso do MSAccess

Convém utilizar uma consulta TADOQuery para cada situação, ou seja, uma para a pesquisa dos alunos aniversariantes e outra para o histórico dos alunos. Deste modo você pode adicionar os select's nas respectivas propriedades SQL, configurar a propriedade parameters e adicionar os campos aos componentes em design-time. Dica conveniente para resolver problema com seu outro post também.

Espero ter sido claro. Infelizmente não consegui ser muito sussinto e se houver alguma "abobrinha" na minha explanação, queiram-me corrigir.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá

Mais um prblema solucionado, e mais uma vez quero dar os méritos ao nosso amigo MICHEUS, que com seu conhecimento e tempo para estudar minha dúvida solucionou ela com extrema categoria.

Galera a partir deste post aprendi uma coisa e acho interessante a todos, evitar usar campos com nomes iguais em tabela diferentes ou nas sql de consulta renomear os campos para não passar pelo que eu passei...

MICHEUS que Deus te abençoe sempre.

Alexandre

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...