Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pensa

Como fazer uma pesquisa em registros infinitos?

Recommended Posts

Já postei essa pergunta há algum tempo atrás mas ninguém soube me responder exatamente e como recentemente estou precisando fazer um sistema que utiliza isso novamente então pergunto agora para todos os programadores:

 

Tenho um sistema de Network de pessoas (aquelas pirâmides de pessoas) onde o Fulano A tem abaixo dele os Fulanos B e C, o B por sua vez tem abaixo dele o D que não tem ninguém abaixo dele, já o C tem abaixo dele o E que tem o F e o G abaixo dele.

 

Vou tentar mostrar algo mais visual:

 

               Fulano A                  /  \                 /    \          Fulano B    Fulano C            /            \           /              \     Fulano D          Fulano E                        /     \                       /       \                  Fulano F    Fulano G

E assim vai, sendo que os relacionamentos podem ser infinitos.

 

Se eu quero fazer um sistema que me identifique todos os Fulanos que estão abaixo de um certo Fulano qual a lógica que devo seguir?

 

Só consigo pensar em Loops mas fazendo com loops o sistema só consegue pesquisar um número finito de Fulanos que é definido pela quantidade de loops que eu colocar no código. Exemplo:

 

 

sql="select * from fulanos where abaixo=fulano_A"set rs1=con.execute(sql)do while not rs1.EOF   todos_abaixos=todos_abaixo+rs3("nome_fulano")   sql="select * from fulanos where abaixo="&rs1("nome_fulano")   set rs2=con.execute(sql)   do while not rs2.EOF      todos_abaixos=todos_abaixo+rs3("nome_fulano")      sql="select * from fulanos where abaixo="&rs2("nome_fulano")      set rs3=con.execute(sql)      do while not rs3.EOF         todos_abaixos=todos_abaixo+rs3("nome_fulano")      rs3.movenext:loop   rs2.movenext:looprs1.movenext:loopNo caso acima o sistema irá procurar apenas 2 níveis de Fulanos abaixo do Fulano A e não funciona para um sistema infinito.

Outro exemplo é um sistema de pastas e subpastas no servidor. Vamos supor que o usuário possa criar várias pastas uma dentro da outra no servidor e ao deletar a primeira pasta (a que tem todas as outras dentro) o sistema deve ir deletando primeiro as pastas de níveis mais baixos até chegar na primeira pasta e finalmente deleta-la... como poderia ser feito algo desse tipo?

 

Da outra vez que postei alguém falou sobre um método Drill Down, mas não explicou exatamente o que é isso e eu não achei na Internet uma explicação.

 

Espero que alguém possa ajudar.

 

[]s

Renan

Compartilhar este post


Link para o post
Compartilhar em outros sites

fale cara!

 

tenta com funcao recursiva...

 

ex:

 

ASP [/tr][tr]Sub mostraFilhos(pai)

dim rs

    strSQL = "SELECT * FROM fulanos WHERE pai=" & pai

    Set rs = con.Execute(strSQL)

    While not rs.eof

        Response.Write rs("nome") & "<br>"

        mostraFilhos(rs("id"))

        rs.movenext

    Wend

End Sub

[/tr]

 

neste caso, você monta seu banco da seguinte maneira:

 

tabela:

  fulanos

campos:

  id

  nome

  pai

 

para o exemplo q você disse por exemplo, fulano B e C, sao filhos de A...

 

da uma testada ae...

qq coisa eh soh postar!!

 

 

flws!!

É exatamente o que eu iria dizer...

 

Em c++ seria uma função recursiva, um pouco diferente, mas com o mesmo principio, chamada pra propria chamada...

 

Pensa vai fundo que você pode da uma programada ai e faze uma arvore geneologica completa... :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, use a clausula INNER JOIN , será a solução dos seus problemas..Se forem tabelas diferentes fica mais fácil ainda, se for na mesma você fazer um INNER JOIN nela mesma.Por exemplo:SELECT * FROM tabela1INNER JOIN tabela2 ON tabela1.campo1 = tabela2.campo2INNER JOIN tabela3 ON tabela3.campo3 = tabela2.campo2E por aí vai, você pode fazer vários inner joins...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, use a clausula INNER JOIN , será a solução dos seus problemas..Se forem tabelas diferentes fica mais fácil ainda, se for na mesma você fazer um INNER JOIN nela mesma.Por exemplo:SELECT * FROM tabela1INNER JOIN tabela2 ON tabela1.campo1 = tabela2.campo2INNER JOIN tabela3 ON tabela3.campo3 = tabela2.campo2E por aí vai, você pode fazer vários inner joins...

mas se for usar recursividade num vai precisar usar INNER JOIN, senão ele teria q criar 'INFINITAS' tabelas!! hahahahafalows

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal... funcionou... só uma coisa.... vou precisar também fazer esse negócio de Inner Join na mesma tabela (coisa que nunca fiz) pois preciso mostrar na tela o nome dos pai de cada filho mostrado... tentei desse jeito mas acontece um erro no Inner Join:

 

strSQL = "SELECT * FROM fulanos inner join fulanos on fulanos.pai=fulanos.id WHERE pai=" & pai

Acho que eu precisaria dar "apelidos" para as tabelas assim o sistema consegueria fazer Inner Join na mesma tabela... mas como fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

creio q assim q você fez já funfa!! mas caso queira dar alias as tabelas coloque asismSELECT TABELA.CAMPO AS NOME_CAMPO_NOVO FROM TABELA

Compartilhar este post


Link para o post
Compartilhar em outros sites

você nao precisa executar outro SQL pra obter o nome do pai... pois qdo você deseja saber seus filhos, você ja tem o nome do pai selecionado...repara a alteração q fiz na rotina e ve se da certo...

Sub mostraFilhos(pai, nome_pai)   dim rs   strSQL = "SELECT * FROM fulanos WHERE pai=" & pai   Set rs = con.Execute(strSQL)      While not rs.eof      Response.Write rs("nome") & "(filho de "& nome_pai &")<br>"      mostraFilhos(rs("id"), rs("nome"))      rs.movenext   WendEnd Sub
da uma verificada nele ae, pois eu nao rodei aqui...[]'s
com certeza está errado!! huahuahuahuahuahuahuhauzueira jow

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao zoneia rapah!! <_< daqui a pouco vao achar q estamos brigando aqui... auhhuacom relação ao codigo, o primeiro eu tb nao testei e o cara disse q rodou heheto sem IIS aqui no trabalho...oq eu posso, eu adapto pro pro VB e testo, o resto eu testo de cabeça :D flw!!

de cabeça????huahuahuahuahuhauhua ferrou... huahuahuahuahufalows

Compartilhar este post


Link para o post
Compartilhar em outros sites

:huh: vou entender como elogio!! uhauhaprocessamento aqui eh frenetico rapah, 2GHz B) flws!!chega de papo q fugiu do topico...

Cara, você num sabe nem digitar, num são 2Ghz e sim 2 Bits q você possui!!Tico e Teco!! huahuahuahuahuahufalowsss

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.