CONSULTA ACCESS
Olá, estou tentando gerar um relatório do DataReport (vb6/access formato 2003) através da criação de uma consulta entre várias tabelas. O que ocorre é o seguinte: o sistema faz insert, update, delete, recuperação de dados, para listview por exemplo, normalmente, mas, quando tento criar a Consulta para exibir dados no relatório, ao executa-la não retorna nada. As tabelas estão relacionadas.
Qual o cuidado que devo ter ao criar consultas?
Deve ser feito algum tipo de relacionamento especÃfico entre tabelas?
Alan
Qual o cuidado que devo ter ao criar consultas?
Deve ser feito algum tipo de relacionamento especÃfico entre tabelas?
Alan
Muito raro usar relacionamentos, muita mão de obra a manutenção
Faço tudo dentro do Select com wheres, Joins, Groups, etc.
tente fazer sem usar os relacionamentos para testar
Faço tudo dentro do Select com wheres, Joins, Groups, etc.
tente fazer sem usar os relacionamentos para testar
Citação::
Muito raro usar relacionamentos, muita mão de obra a manutenção
Faço tudo dentro do Select com wheres, Joins, Groups, etc.
tente fazer sem usar os relacionamentos para testar
Bom, cada um faz do jeito que achar melhor, no meu ponto de vista não tem jeito errado de se desenvolver um produto individualmente. Quer use OOP ou POG, se o resultado final alcançou as expectativas solicitadas quem sou eu pra julgar né!
Mas pra mim os relacionamentos servem pra dar mais consistência a informação. Imagine você desenvolvendo uma agenda telefonica com duas tabelas, uma pessoa e outra número. E que a relação seja de um para muitos, ou seja uma pessoa para muitos números. O que aconteceria se você tentasse apagar uma pessoa cuja mesma tenha dez números cadastrados? Erro ou simplesmente [Ô]dar pau[Ô] na gÃria popular! rsrsrsrs. E a pessoa não seria excluida da tabela. Agora se esse relacionamento não existisse a pessoa seria apagada normalmente deixando dez registros na tabela números [Ô]órfãos[Ô]. Nesse caso você teria um banco completamente inconsistente.
Portanto a mão de obra no meu ponto de vista seria muito menor se eu criasse um banco bem relacionado na terceira forma normal, e na codificação trabalhar de forma correta com [Ô]Exceptions[Ô].
ALANTB, quando trabalhamos com bancos de dados relacionais, para evitarmos muita codificação no desenvolvimento da aplicação, criamos Views no access chamamos isso de consulta. Tente criar uma consulta com os dados que deseja recuperar no próprio access, depois crie seu relatório com essa consulta apenas e não com todas as tabelas.
Fica a Dica.
Té Mais
ACCIOLLY, a consulta que estou tentando criar é dentro do Access. Antes de fazer o SQL no vb para carregar os dados, estou montando a consulta e executando para ver se vai dar certo. Veja bem: se faço a consulta com a tabela principal de cadastro (tbCrianca) ela executa e exibe dados; se adiciono mais algumas tabelas: tbEndereco, tbCidade, tbBairro, também funciona. O problema ocorre quando tento inserir dados de uma tabela chamada tbEscola, onde puxa o nome da escola. Quando executo com essa ultima tabela a consulta não carrega registro nenhum, mas se eu refazer sem essa tabela funciona....Estranho é que a estrutura dessa tabela não é tão diferente das outras. Tem apenas código, descrição, codendereco, telefone e só. Vou me virando por aqui!!!!
ALAN
ALAN
veja se no seu inner join está comparando a PK e a FK corretamente, ou ainda, verifique se as tabelas contém o mesmo dado que quer verificar
O SQL Nº1 (copiei da Consulta do Access) é sem a tbEscola e carrega dados ao executar dentro do ACCESS. Já o SQL Nº2 botei pra exibir a tabela tbEscola em modo DESIGN da consulta; adicionei o campo [Ô]desCola[Ô], que exibe o nome da Escola e ao executar não carrega nada...
SQL Nº1:
SELECT tbCrianca.*, tbUF.siglaUF, tbCidade.desCidade, tbBairro.descBairro, tbEndereco.descEnd, tbPai.NomePai, tbMae.NomeMae
FROM tbUF INNER JOIN (tbEndereco INNER JOIN (tbCidade INNER JOIN (((tbBairro INNER JOIN tbCrianca ON tbBairro.codBairro = tbCrianca.codBairro) INNER JOIN tbMae ON (tbMae.codMae = tbCrianca.codMae) AND (tbBairro.codBairro = tbMae.codBairro)) INNER JOIN tbPai ON (tbPai.codPai = tbCrianca.codPai) AND (tbBairro.codBairro = tbPai.codBairro)) ON (tbCidade.codCidade = tbPai.codCidade) AND (tbCidade.codCidade = tbMae.codCidade) AND (tbCidade.codCidade = tbCrianca.codCidade) AND (tbCidade.codCidade = tbBairro.codCidade)) ON (tbEndereco.codEnd = tbPai.codEnd) AND (tbEndereco.codEnd = tbMae.codEnd) AND (tbEndereco.codEnd = tbCrianca.codEnd)) ON (tbUF.codUF = tbCrianca.codUF) AND (tbUF.codUF = tbCidade.codUF);
SQL Nº2
SELECT tbCrianca.*, tbUF.siglaUF, tbCidade.desCidade, tbBairro.descBairro, tbEndereco.descEnd, tbPai.NomePai, tbMae.NomeMae, tbEscola.desCola
FROM (tbUF INNER JOIN (tbEndereco INNER JOIN (tbCidade INNER JOIN (((tbBairro INNER JOIN tbCrianca ON tbBairro.codBairro = tbCrianca.codBairro) INNER JOIN tbMae ON (tbMae.codMae = tbCrianca.codMae) AND (tbBairro.codBairro = tbMae.codBairro)) INNER JOIN tbPai ON (tbPai.codPai = tbCrianca.codPai) AND (tbBairro.codBairro = tbPai.codBairro)) ON (tbCidade.codCidade = tbPai.codCidade) AND (tbCidade.codCidade = tbMae.codCidade) AND (tbCidade.codCidade = tbCrianca.codCidade) AND (tbCidade.codCidade = tbBairro.codCidade)) ON (tbEndereco.codEnd = tbPai.codEnd) AND (tbEndereco.codEnd = tbMae.codEnd) AND (tbEndereco.codEnd = tbCrianca.codEnd)) ON (tbUF.codUF = tbCrianca.codUF) AND (tbUF.codUF = tbCidade.codUF)) INNER JOIN tbEscola ON (tbEscola.codEscola = tbCrianca.codEscola) AND (tbEndereco.codEnd = tbEscola.codEnd) AND (tbCidade.codCidade = tbEscola.codCidade) AND (tbBairro.codBairro = tbEscola.codBairro);
SQL Nº1:
SELECT tbCrianca.*, tbUF.siglaUF, tbCidade.desCidade, tbBairro.descBairro, tbEndereco.descEnd, tbPai.NomePai, tbMae.NomeMae
FROM tbUF INNER JOIN (tbEndereco INNER JOIN (tbCidade INNER JOIN (((tbBairro INNER JOIN tbCrianca ON tbBairro.codBairro = tbCrianca.codBairro) INNER JOIN tbMae ON (tbMae.codMae = tbCrianca.codMae) AND (tbBairro.codBairro = tbMae.codBairro)) INNER JOIN tbPai ON (tbPai.codPai = tbCrianca.codPai) AND (tbBairro.codBairro = tbPai.codBairro)) ON (tbCidade.codCidade = tbPai.codCidade) AND (tbCidade.codCidade = tbMae.codCidade) AND (tbCidade.codCidade = tbCrianca.codCidade) AND (tbCidade.codCidade = tbBairro.codCidade)) ON (tbEndereco.codEnd = tbPai.codEnd) AND (tbEndereco.codEnd = tbMae.codEnd) AND (tbEndereco.codEnd = tbCrianca.codEnd)) ON (tbUF.codUF = tbCrianca.codUF) AND (tbUF.codUF = tbCidade.codUF);
SQL Nº2
SELECT tbCrianca.*, tbUF.siglaUF, tbCidade.desCidade, tbBairro.descBairro, tbEndereco.descEnd, tbPai.NomePai, tbMae.NomeMae, tbEscola.desCola
FROM (tbUF INNER JOIN (tbEndereco INNER JOIN (tbCidade INNER JOIN (((tbBairro INNER JOIN tbCrianca ON tbBairro.codBairro = tbCrianca.codBairro) INNER JOIN tbMae ON (tbMae.codMae = tbCrianca.codMae) AND (tbBairro.codBairro = tbMae.codBairro)) INNER JOIN tbPai ON (tbPai.codPai = tbCrianca.codPai) AND (tbBairro.codBairro = tbPai.codBairro)) ON (tbCidade.codCidade = tbPai.codCidade) AND (tbCidade.codCidade = tbMae.codCidade) AND (tbCidade.codCidade = tbCrianca.codCidade) AND (tbCidade.codCidade = tbBairro.codCidade)) ON (tbEndereco.codEnd = tbPai.codEnd) AND (tbEndereco.codEnd = tbMae.codEnd) AND (tbEndereco.codEnd = tbCrianca.codEnd)) ON (tbUF.codUF = tbCrianca.codUF) AND (tbUF.codUF = tbCidade.codUF)) INNER JOIN tbEscola ON (tbEscola.codEscola = tbCrianca.codEscola) AND (tbEndereco.codEnd = tbEscola.codEnd) AND (tbCidade.codCidade = tbEscola.codCidade) AND (tbBairro.codBairro = tbEscola.codBairro);
Coloca seu banco em anexo pra gente dar uma olhada
Segue copia zip do bd..
Pessoal, tive pesquisando sobre bancos de dados e vi que existe algo chamado [Ô]redundância[Ô] e que pode ocasionar inconscistência nos dados. Olhando o layout de relacionamento das tabelas do banco que coloquei em anexo na mensagem anterior, pude perceber que o relacionamento feito a partir das tabelas tbCrianca, tbEndereco e tbEscola, tbBairro podem formar uma espécie de circulo. Sinceramente não sei como resolver. Já fiz este tipo de relacionamento em outros banco e funcionou. Mas neste algo passou despercebido. Portanto, gostaria que os colegas me auxilem nessa...Valeu!!!
ALAN
ALAN
Problema na modelagem cara. Vc pode simplificar isso criando uma tabela com os atributos em comum para mãe, pai e criança.
Muito bem. Você precisa localizar em qual tabela está a chave estrangeira. Não consigo abrir o arquivo porque uso lÃnux. Mas supondo que na tabela criança tem a chave estrangeira da escola, você pode criar um sql mais fácil de manipular. Ex
Esse SQL acima é só pra você ter uma idéia de como seria pra selecionar apenas o nome da escola, o endereco e o bairro. Dependendo da sua consulta pode digitar meio livro! srsrsrs. Mas funciona.
Citação:SELECT tbEscola.nomeEscola, (SELECT endereco FROM tbEndereco WHERE tbEndereco = tbEscola.id_Endereco) AS endereco, (SELECT (SELECT tbBairro.nomeBairro FROM tbBairro WHERE tbBairro = tbEndereco.idBairro) FROM tbEscola WHERE tbEscola.idEndereco = tbEndereco.idEndereco) AS bairro FROM tbEscola
Esse SQL acima é só pra você ter uma idéia de como seria pra selecionar apenas o nome da escola, o endereco e o bairro. Dependendo da sua consulta pode digitar meio livro! srsrsrs. Mas funciona.
Tópico encerrado , respostas não são mais permitidas