Banco de dados - Cadastrar cidade para Pai, mãe, conjuge na mesma tabela

Delphi

11/07/2014

Olá pessoal

Boa noite,

Gostaria da ajuda dos colegas aqui no fórum para uma seguinte situação, eu tenho um banco de dados para cadastro de Pessoas, eu modelei ele para receber a tabela de cidades, onde na tabela de pessoas apareceu a seguinte necessidade cadastrar Cidades para pai, mãe, cônjuge e para a pessoa cadastrada também, eu gostaria de cadastrar o código desta cidade relacionando ela com a tabela usando a chave estrangeira, e a imagem de como é o cadastro.

[img:descricao=ImagemDevMedia]http://arquivo.devmedia.com.br/forum/imagem/251195-20140711-014650.png[/img]

Até aí tudo bem, o problema é quando vou utilizar um Join para mostrar esses dados, eles não me retornam corretamente, vou postar o código SQL, do select

SELECT 
  PESSOA.PES_ID,
  PESSOA.COMUNIDADE_COM_ID,
  COMUNIDADE.COM_NME_OFFICIAL,
  PESSOA.PES_APELIDO,
  PESSOA.PES_CPF,
  PESSOA.PES_DTA_CADASTRO,
  PESSOA.PES_DTA_NASC,
  PESSOA.PES_ESTADOCIVIL,
  PESSOA.PES_ESCOLARIDADE,
  PESSOA.PES_ENDERECO,
  PESSOA.PES_INICIAL,
  PESSOA.PES_RG,
  PESSOA.PES_SEXO,
  PESSOA.PES_IDADE,
  PESSOA.PES_MOTIVO_AFASTAMENTO,
  PESSOA.PES_NATURALIDADE_OPCAO,
  PESSOA.PES_NATUR_OPCAO_PAI,
  PESSOA.PES_NATUR_OPCAO_MAE,
  PESSOA.PES_NATUR_OPCAO_CONJ,
  PESSOA.PES_NOME,
  PESSOA.PES_PROFISSAO,
  PESSOA.PES_PROFISSAOMAE,
  PESSOA.PES_PROFISSAOPAI,
  PESSOA.PES_PROFISSAOCONJUGUE,
  PESSOA.PES_RELIGIAO,
  PESSOA.PES_TIPORENDA,
  PESSOA.PES_FAIXA_ETARIA,
  PESSOA.PES_CRIA_PAIS,
  PESSOA.PES_CRIA_NEGA_MAE_ADO,
  PESSOA.PES_CRIA_NEGA_PAI_ADO,
  PESSOA.PES_TPO_PESSOA,
  PESSOA.PES_OBSGERAL,
  PESSOA.PES_PAI,
  PESSOA.PES_MAE,
  CIDADE.MUNICIPIO
FROM
 COMUNIDADE
 INNER JOIN PESSOA ON (COMUNIDADE.COM_ID=PESSOA.COMUNIDADE_COM_ID)
 INNER JOIN CIDADE ON (PESSOA.PES_NATURALIDADE_OPCAO=CIDADE.CID_ID)
  AND (PESSOA.PES_NATUR_OPCAO_PAI=CIDADE.CID_ID)
  AND (PESSOA.PES_NATUR_OPCAO_MAE=CIDADE.CID_ID)
  AND (PESSOA.PES_NATUR_OPCAO_CONJ=CIDADE.CID_ID)



Estou Utilizando Delphi 2010 e Firebird 2.5
Cleber Santos

Cleber Santos

Curtidas 0

Respostas

Guilherme

Guilherme

11/07/2014

Meu querido, a forma que está usando parece incorreta, pois se caso um dos itens não estiver sido preenchido, não irá retornar registros, pois está usando uma relação um para um (INNER JOIN). Vou colocar aqui a provável solução. Faça o ajuste no seu sistema e depois informe o resultado.

Use INNER JOIN sempre que tiver certeza que na tabela de destino tem registro, pois se não tiver no campo o registro não irá retornar nada, principalmente na situação que a naturalidade de pai, mãe e conjugue não estiverem sido preenchido por isso AND na clausula de relacionamento.

FROM
COMUNIDADE
INNER JOIN PESSOA ON (COMUNIDADE.COM_ID=PESSOA.COMUNIDADE_COM_ID)
INNER JOIN CIDADE ON (PESSOA.PES_NATURALIDADE_OPCAO=CIDADE.CID_ID)
AND (PESSOA.PES_NATUR_OPCAO_PAI=CIDADE.CID_ID)
AND (PESSOA.PES_NATUR_OPCAO_MAE=CIDADE.CID_ID)
AND (PESSOA.PES_NATUR_OPCAO_CONJ=CIDADE.CID_ID)

Alterando seu SQL:

SELECT
...
...,
CIDADE_NATURALIDADE.CID_ID,
CIDADE_MAE.CID_ID,
CIDADE_PAI.CID_ID,
CIDADE_CONJ.CID_ID,
...
...
FROM
COMUNIDADE
INNER JOIN
PESSOA
ON (COMUNIDADE.COM_ID=PESSOA.COMUNIDADE_COM_ID)
LEFT JOIN
CIDADE AS CIDADE_NATURALIDADE
ON (PESSOA.PES_NATURALIDADE_OPCAO=CIDADE_NATURALIDADE.CID_ID)
LEFT JOIN
CIDADE AS CIDADE_MAE
ON (PESSOA.PES_NATUR_OPCAO_MAE=CIDADE_MAE.CID_ID)
LEFT JOIN
CIDADE AS CIDADE_PAI
ON (PESSOA.PES_NATUR_OPCAO_PAI=CIDADE_PAI.CID_ID)
LEFT JOIN
CIDADE AS CIDADE_CONJ
ON (PESSOA.PES_NATUR_OPCAO_CONJ=CIDADE_CONJ.CID_ID)


Abraços
GOSTEI 0
Cleber Santos

Cleber Santos

11/07/2014

Olá boa tarde,

Pelo que você postou eu preciso fazer a alteração na tabela de cidade alterando estes campos,
que tem na tabela de pessoa?

Lembrando esta relação quem recebe os dados da tabela é a de cliente, que recebe o código da cidade, o problema é a fazer o join e mostrar o código e o nome da cidade para aqueles campos...
GOSTEI 0
Cleber Santos

Cleber Santos

11/07/2014

Olá meus amigos

fiz uns ajustes e consegui o resultado alterando no

Select

  CIDADE_NATURALIDADE.MUNICIPIO,
  CIDADE_PAI.MUNICIPIO,
  CIDADE_MAE.MUNICIPIO,
  CIDADE_CONJ.MUNICIPIO


e Nos Joins

FROM
 COMUNIDADE
 INNER JOIN PESSOA ON (COMUNIDADE.COM_ID=PESSOA.COMUNIDADE_COM_ID)
 LEFT OUTER JOIN CIDADE CIDADE_NATURALIDADE ON (PESSOA.PES_NATURALIDADE_OPCAO=CIDADE_NATURALIDADE.CID_ID)
 LEFT OUTER JOIN CIDADE CIDADE_MAE ON (PESSOA.PES_NATUR_OPCAO_MAE=CIDADE_MAE.CID_ID)
 LEFT OUTER JOIN CIDADE CIDADE_PAI ON (PESSOA.PES_NATUR_OPCAO_PAI=CIDADE_PAI.CID_ID)
 LEFT OUTER JOIN CIDADE CIDADE_CONJ ON (PESSOA.PES_NATUR_OPCAO_CONJ=CIDADE_CONJ.CID_ID)


Assim conseguir um resultado que dá para prosseguir com o sistema, havendo alguma duvida mais eu volto a postar neste topico
GOSTEI 0
POSTAR