Árvore

9 respostas
J

Dae galera… eu to com um problema pra resolver e queria ver se alguém tem alguma ideia ou ja passou por esse tipo de problema…
É o seguinte… tenho um sistema de controle de correspondencia…
a regra básica é essa… cadastro um documento e posso dizer que esse documento é em resposta à outro ou à outros… ou seja… um documento pode ter vários pais… ele vai seguindo o processo e virando uma arvore… mas não uma arvore em que cada ítem pode ter apenas um pai, ele nesse caso pode ter vários pais…

1
                              / \
                             2  3
                            /\    \
                           4 5    6
                            \/
                            7

No exemplo acima… o código 7 tem dois pais…
Agora partindo para a pergunta em sí…
Esses dados estão cadastradados em banco… e preciso montar um sql ou algoritmo… preciso mostrar em uma tabela cada hierarquia dessa… ressaltando que o 7 tem dois pais…

Primeira hierarquia
7 - 4 - 2 - 1
Segunda …
7 - 5 - 2 - 1
e assim por diante…

Se alguém tiver algum site… alguma coisa eu agradeço!!
Abraço![/code]

9 Respostas

J

Olha só galera… tive pesquisando e tive dois tipos de indicações…
Me indicaram usar grafos pra isso… e a outra alternativa seria usar no ResultSet um cursor e no banco que é MySQL 5.0 usar procedure…
Sinceramente estou bem perdido sobre isso…
A idéia que eu passei é bem parecida com uma árvore genealógica… ou seja, um pai tem irmãos que são tios dos filhos, sendo assim um filho tem um pai e pode ter vários tios… é tipo uma relação de NxN…
Se alguém puder me ajudar…
Abraço!!

L

Sim, isso ai é um grafo, cuja arestas são direcionadas

Posta ai suas tabelas do banco para eu ver como esta.

J

Tabelas:

Tabela: GrupoDocumento
Coluna : CodGrupoDocumento
Coluna : PaiGrupoDocumento

Tabela: Documento
Coluna: CodDocumento

Dae no caso quando eu cadastro um documento novo e não indico nenhum pai, ele ficaria assim…
Tabela Documento : CodDocumento = 1
Tabela GrupoDocuento: CodGrupoDocumento = 1 e PaiGrupoDocumento = 1


Se eu cadastrar um 2º documento e dizer que o pai dele é o 1, ficaria assim::
Tabela Documento : CodDocumento = 2
Tabela GrupoDocumento: CodGrupoDocumento = 2 e PaiGrupoDocumento = 1

Se eu cadastrar um 3º documento e dizer que o pai dele é o 1 e o 2, ficaria assim::
Tabela Documento : CodDocumento = 3
Tabela GrupoDocumento: CodGrupoDocumento = 3 e PaiGrupoDocumento = 1
Tabela GrupoDocumento: CodGrupoDocumento = 3 e PaiGrupoDocumento = 2

e assim sucessivamente…

As colunas GrupoDocumento e PaiGrupoDocumento formam a chave Composta dela…

Abraço!!

L

Beleza, eu só não concordo que o primeiro documento tenha como pai ele mesmo, mas tudo bem…

isso ai mapeado é um ManyToMany de documento com ele mesmo. Vc tah usando JPA?

J

É… esse é o problema… aqui na empresa estamos usando JDBC mesmo. dae usamos o padrão DAO para a parte de banco… só trabalheira… queremos ver se no próximo projeto adotamos alguns FrameWorks…
Como Struts 2 e ( Hibernate ou JPA )…
Abraço!!

L

Vc pode fazer um método em Documento que retorne os pais dele (conecte no banco, busque os pais e retorna uma lista deles), dessa forma vc iria usar algo do tipo:

Documento doc = findDocumento(1);
Set<Documento> pais = doc.getPais();
e ai para cada pai vc pode dar outro getPais e assim por diante

Se eu chegar hj em casa com saco (vou chegar la pelas 21h, então não anime ehehe) eu faço algo mais concreto

J

Cara… se você puder fazer isso que falou será de grande ajuda… mas se não der… eu agradeço da mesma forma… pois você deu uma idéia de como iniciar… Valeu!!
Abraço!!

L

bele
cheguei a 30 min, entao naum tive nem saco de abrir o eclipse :stuck_out_tongue:
mas aproveitando que eu estou em casa e aqui, diferente do meu trabalho, naum ha controle sobre o tamanho do post, posso escrever mais.

faz um metodo normal que retorne objetos pai de um determinado id, ou seja, uma consulta mais ou menos como:

select d.* from Documento d
inner join GrupoDocumento cg on d.CodDocumento = cg.PaiGrupoDocumento 
where cg.CodGrupoDocumento = ?

onde ? eh o documento que vc quer saber os pais

beleza, cria um metodo no seu objeto Documento do tipo

class Documento {
  long id;
  public List<Documento> getPais() {
    cria conexao.
    executa aquele sql passando o id do documento que o metodo esta sendo executado.
    pega o retorno, popula objetos do tipo documento joga numa lista e retorna.
    fecha conexao.
  }
}

tendo esse metodo, vc pode fazer algo como

Documento doc = dao.findDocumento(1);
List<Documento> pais = doc.getPais();
Documento primeiroPai = pais.get(0);
List<Documento> paisDoPai = primeiroPai.getPais();

se naum quizer colocar esse metodo na sua entidade, e sim no seu dai, entao cria esse metodo getPais no seu dao, e passa por parametro o documento que vc quer buscar os pais:

class DocumentoDao {
  public List<Documento> getPais(Documento doc) {
    mesma coisa que o outro soh que vai usar o id de doc passado por parametro
  }
}

acho que eh isso…

qq coisa posta ai…

J

Cara… valeu mesmo pela ajuda… agora ficou claro pra mim…
Eu estou implementado outro módulo do sistema e vou fazer essa parte no início da semana que vem ou até nessa sexta feira mesmo… Qualquer dúvida eu posto aqui… e quando terminar também eu posto a solução!!
Abraço!!

Criado 16 de outubro de 2007
Ultima resposta 18 de out. de 2007
Respostas 9
Participantes 2