Array
(
)

Fazer Select MultiNivel - 4 Geracoes

Spynet
   - 04 nov 2008

Olá pessoal, blz?
Preciso urgente fazer um select ou mais para montar 4 niveis ou seja como abaixo:

Principal

----Geracao1
------Geracao2
--------Geracao3
----------Geracao4

Só que o banco tah assim em uma Tabela chamada - TabClientes

Documento - chave primaria
Nome

Como que eu faço para montar o select?
Tenho que fazer um dentro do loop do outro?

Se alguem puder me dar uma ajuda, pois to fazendo em vb.net - visual studio 2005

[]s,
Adilson

Spynet
   - 04 nov 2008

Pessoal o exemplo seria isso mais só que tem 3 gerações e foi feito em .asp e eu preciso da solução em .aspx (VB.Net)

http://www.shopmedia.com.br/cliente/dnacosmeticos/revenda/rede_exemplo.asp

Se alguem puder me dar um help, agradeceria.

[]s,
Adilson

Spynet
   - 05 nov 2008

Nada pessoal????
É muito complicado?
Tô precisando entregar esse trabalho e nao to conseguindo acertar.
Por favor se tiver alguem para me ajudar.

O banco é .mdb e a programação em asp.net (vb.net)

[]s,
Adilson

Spynet
   - 05 nov 2008

A tabela tah assim:

Nome da Tabela: Cliente

Colunas:

Documento - Pertence

por ex:

doc 01 - pai

|_pertence ao docuento 01 = tem o documento 02 - geracao1

|_pertence ao docuento 02 = tem o documento 03 - geracao2

|_pertence ao docuento 03 = tem o documento 04 - geracao3

|_pertence ao docuento 04 = tem o documento 05 - geracao4

o exemplo seria essa pagina feita em .asp

http://www.shopmedia.com.br/cliente/dnacosmeticos/revenda/rede_exemplo.asp

acho que consegui explicar... ou seja, a chave principal é o documento (doc) e a chave pertence relaciona com o documento.

[]s,

Adilson

Spynet
   - 05 nov 2008

To vendo que é complicado mesmo e nao tem uma pessoa pra me ajudar no fórum.

Preciso solucionar isso aqui pra ontem.

Spynet
   - 05 nov 2008

#Código

 Dim strSQL As String = "Select * from Cliente Where Documento=´110.500.508-94´"
        Dim MyConn As New OleDbConnection(ConfigurationManager.ConnectionStrings("DBaseConnectionString").ConnectionString)
        Dim rs As OleDbDataReader
        Dim Cmd As New OleDbCommand(strSQL, MyConn)


        Try
            MyConn.Open()

            rs = Cmd.ExecuteReader(CommandBehavior.CloseConnection)
            If rs.Read() Then


                Me.gerprinc.Text = rs("documento") & " - " & rs("nome") & "<br>"

               
                Dim StringConn As String = ConfigurationManager.ConnectionStrings("DBaseConnectionString").ConnectionString
                Dim objConn As New OleDbConnection(StringConn)
                objConn.Open()
                Dim Sql As String = "Select cliente.documento, cliente.nome, cliente.pertence FROM cliente Where cliente.Pertence = ´" & rs("documento") & "´ GROUP BY cliente.Documento, cliente.Nome, cliente.Pertence"
                Dim objComd As New OleDbCommand(Sql, objConn)
                Dim objReader As OleDbDataReader
                objReader = objComd.ExecuteReader


                ´LOOP NAS TABELAS
                While objReader.Read

                    Dim StringConn2 As String = ConfigurationManager.ConnectionStrings("DBaseConnectionString").ConnectionString
                    Dim objConn2 As New OleDbConnection(StringConn2)
                    objConn2.Open()
                    Dim Sql2 As String = "Select cliente.documento, cliente.nome, cliente.pertence FROM cliente Where cliente.Pertence = ´" & objReader("documento") & "´ GROUP BY cliente.Documento, cliente.Nome, cliente.Pertence"
                    Dim objComd2 As New OleDbCommand(Sql2, objConn2)
                    Dim objReader2 As OleDbDataReader
                    objReader2 = objComd2.ExecuteReader

                    Me.geracao1.Text += "&nbsp;&nbsp; |_ " & objReader("documento") & " - " & objReader("nome") & "<br>"


                End While



                ´Fecha Conexao com o BD
                objConn.Close()


            Else
              

            End If
        Catch ex As Exception

            ´ escreve o erro no arquivo de log
            Dim sw As StreamWriter = File.AppendText(Server.MapPath("__LogErroGanhos.txt"))
            sw.WriteLine(DateTime.Now.ToString & " : " & ex.Message)
            sw.Close()

       
        Finally
            MyConn.Close()
        End Try




Tentei o codigo acima, mais fez o loop e nao ficou um abaixo do outro certinho.... primeiro listo tudo tipo do pai e depois os filhos.. mais nao ficou um abaixo do outro certinho tipo:

pai1
|_filho1
|_filho2
--- pai2
|_filho1
|_filho2
assim por diante

Pois nao manjo muito, e estou fazendo com o visual studio 2005

[]s,
Adilson

Spynet
   - 05 nov 2008

Dim strSQL As String = ´Select * from Cliente Where Documento=´110.500.508-94´´
Dim MyConn As New OleDbConnection(ConfigurationManager.ConnectionStrings(´DBaseConnectionString´).ConnectionString)
Dim rs As OleDbDataReader
Dim Cmd As New OleDbCommand(strSQL, MyConn)

Try
MyConn.Open()

rs = Cmd.ExecuteReader(CommandBehavior.CloseConnection)
If rs.Read() Then

Me.gerprinc.Text = rs(´documento´) & ´ - ´ & rs(´nome´) & ´<br>´

Dim StringConn As String = ConfigurationManager.ConnectionStrings(´DBaseConnectionString´).ConnectionString
Dim objConn As New OleDbConnection(StringConn)
objConn.Open()
Dim Sql As String = ´Select cliente.documento, cliente.nome, cliente.pertence FROM cliente Where cliente.Pertence = ´´ & rs(´documento´) & ´´ GROUP BY cliente.Documento, cliente.Nome, cliente.Pertence´
Dim objComd As New OleDbCommand(Sql, objConn)
Dim objReader As OleDbDataReader
objReader = objComd.ExecuteReader

´LOOP NAS TABELAS
While objReader.Read

Dim StringConn2 As String = ConfigurationManager.ConnectionStrings(´DBaseConnectionString´).ConnectionString
Dim objConn2 As New OleDbConnection(StringConn2)
objConn2.Open()
Dim Sql2 As String = ´Select cliente.documento, cliente.nome, cliente.pertence FROM cliente Where cliente.Pertence = ´´ & objReader(´documento´) & ´´ GROUP BY cliente.Documento, cliente.Nome, cliente.Pertence´
Dim objComd2 As New OleDbCommand(Sql2, objConn2)
Dim objReader2 As OleDbDataReader
objReader2 = objComd2.ExecuteReader

Me.geracao1.Text += ´&nbsp;&nbsp; |_ ´ & objReader(´documento´) & ´ - ´ & objReader(´nome´) & ´<br>´

End While

´Fecha Conexao com o BD
objConn.Close()

Else

End If
Catch ex As Exception

´ escreve o erro no arquivo de log
Dim sw As StreamWriter = File.AppendText(Server.MapPath(´__LogErroGanhos.txt´))
sw.WriteLine(DateTime.Now.ToString & ´ : ´ & ex.Message)
sw.Close()

Finally
MyConn.Close()
End Try

Poderia me dar um exemplo???
Tentei o codigo acima, mais fez o loop e nao ficou um abaixo do outro certinho.... primeiro listo tudo tipo do pai e depois os filhos.. mais nao ficou um abaixo do outro certinho tipo:

pai1
|_filho1
|_filho2
--- pai2
|_filho1
|_filho2
assim por diante

Pois nao manjo muito, e estou fazendo com o visual studio 2005

[]s,
Adilson

Spynet
   - 06 nov 2008

Putz.... ninguem vai me ajudar?
Me falaram de fazer um loop dentro do outro, e usando datatable, dataset.. mais nao to me acertando.....

Signori
   - 06 nov 2008

spynet,

bom, não trabalho com VS, mas acredito que vc pode resolver isso da seguinte forma:

Vc precisa para 4 níveis certo? bom apesar de não ser a forma totalmente correta, vc pode fazer uma SQL para Cada Nível... Tipo: Nivel 1 retornou 3 registros.. para cada um vc faz outra sql que busca o nível 2.. e assim por diante.

Creio que isso vai pesar a sua aplicação, mas na pressa...
:D
qualquer coisa use Ajax e mostre ´Carregando....´ :lol:

Espero ter ajudado.

flw

Spynet
   - 06 nov 2008

Me falaram de fazer loop um dentro do outro usando datatable e como nunca trabalhei com isso, peço ajuda a algum expert, que tah difícil.

Spynet
   - 06 nov 2008

To decepcionado com esse fórum..... poxa ninguem sabe me ajudar a resolver isso.... vou procurar outros fóruns e divulgar o que me ajudar.

Pq se depender daqui, posso nao encontrar uma pessoa q me ajude e acabar perdendo oportunidades.

Qdo eu participava ativamente em outros fóruns em .asp era show, pq ajudava muito as pessoas, e agora q to começando a programar em asp.net nao encontro soluções, aliás para certas coisas.

Mais blz..... valew pelas pessoas q leram e nao fizeram nada... quem sabe um dia precisem de algo e eu possa ajudar... em breve.

[]s,

Spynet
   - 09 nov 2008

Fiz o código abaixo da minha maneira e consegui exibir a estrutura de 4 gerações, mais só que não ficou certinho um abaixo do outro.
Vou resumir mostrando duas paginas uma em .asp e a outra .aspx (que nao tah de acordo):

- http://www.dnacosmeticos.com.br/revenda/rede_exemplo.asp - note que fica certinho a estrutura, tipo monta um abaixo do outro da mesma rede.

- http://www.dnacosmeticos.com.br/estrelaonline/rede_exemplo.aspx - veja que monta um abaixo do outro diretão e nao para para exibir debaixo do seu respectivo nivel.

O código do aspx é:

#Código

box]Imports System.Data
Imports System.Data.OleDb


Partial Class _Rede_Exemplo
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim StringConn As String = ConfigurationManager.ConnectionStrings(´dbaseConnectionString´).ConnectionString
        Dim objConn As New OleDbConnection(StringConn)
        Dim ds As New DataSet()

        ´PRINCIPAL
        Dim principal As New OleDbDataAdapter(´select * from cliente where documento = ´110.500.508-94´´, objConn)
        principal.Fill(ds, ´principal´)

        ´LOOP PARA PASSAR O NR DO DOCUMENTO PARA O SELECT DA GERACAO1
        For Each princ As DataRow In ds.Tables(´principal´).Rows
            ´Me.totalprinc.Text = ds.Tables(´principal´).Rows.Count.ToString()
            Me.txtprincipal.Text = ´ - ´ & princ(´nome´) & ´<br>´

            ´SELECT PARA A GERACAO1
            Dim geracao1 As New OleDbDataAdapter(´select * from cliente where pertence= ´´ & princ(´documento´) & ´´´, objConn)
            geracao1.Fill(ds, ´geracao1´)
        Next


        ´LOOP PARA PASSAR O NR DO DOCUMENTO PARA O SELECT DA GERACAO2
        For Each ger1 As DataRow In ds.Tables(´geracao1´).Rows
            Me.totalger1.Text = ds.Tables(´geracao1´).Rows.Count.ToString()
            Me.txtgeracao1.Text += ´&nbsp;&nbsp; |_ ´ & ger1(´nome´) & ´<br>´

            ´SELECT PARA A GERACAO2
            Dim geracao2 As New OleDbDataAdapter(´select * from cliente where pertence= ´´ & ger1(´documento´) & ´´´, objConn)
            geracao2.Fill(ds, ´geracao2´)
        Next


        ´LOOP PARA PASSAR O NR DO DOCUMENTO PARA O SELECT DA GERACAO3
        For Each ger2 As DataRow In ds.Tables(´geracao2´).Rows
            Me.totalger2.Text = ds.Tables(´geracao2´).Rows.Count.ToString()
            Me.txtgeracao2.Text += ´&nbsp;&nbsp;&nbsp;&nbsp; |_ ´ & ger2(´nome´) & ´<br>´

            ´SELECT PARA A GERACAO3
            Dim geracao3 As New OleDbDataAdapter(´select * from cliente where pertence= ´´ & ger2(´documento´) & ´´´, objConn)
            geracao3.Fill(ds, ´geracao3´)
        Next


        ´LOOP PARA PASSAR O NR DO DOCUMENTO PARA O SELECT DA GERACAO4
        For Each ger3 As DataRow In ds.Tables(´geracao3´).Rows
            Me.totalger3.Text = ds.Tables(´geracao3´).Rows.Count.ToString()
            Me.txtgeracao3.Text += ´&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |_ ´ & ger3(´nome´) & ´<br>´

            ´SELECT PARA A GERACAO4
            Dim geracao4 As New OleDbDataAdapter(´select * from cliente where pertence= ´´ & ger3(´documento´) & ´´´, objConn)
            geracao4.Fill(ds, ´geracao4´)
        Next


        ´LOOP PARA PASSAR O NR DO DOCUMENTO PARA O SELECT DA GERACAO5
        For Each ger4 As DataRow In ds.Tables(´geracao4´).Rows
            Me.totalger4.Text = ds.Tables(´geracao4´).Rows.Count.ToString()
            Me.txtgeracao4.Text += ´&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |_ ´ & ger4(´nome´) & ´<br>´
        Next



    End Sub
End Class
box]

*** Lembrando que o banco é mdb e tenho somente uma Tabela chama Cliente e o relacionamento são as colunas: Documento e Pertence

[]s,
Adilson

Spynet
   - 10 nov 2008

?????
alguem se habilita???

Signori
   - 11 nov 2008

Veja:

Passando pela primeira SQL, irá retornar 3 registros, certo... faça com que seu sql seja executado linha por linha: ´ExecuteReader´ ou algo parecido...

assim logo que esta SQL retornar o primeiro registro, antes de mostrar o proximo, vc ja deve chamar a SQL do segundo nível, levando em conta o código da linha do primeiro nível.. e para tal, cada linha da SQL do segundo nível vc chama a SQL do terceiro nível... Vai ser um loop dentro do outro, como ja falei, para cada linha que retorna vc faz a SQL do proximo nível...

Não vo te passar o código pois não trabalho com VS, mas com Delphi ja fiz algo parecido.

Upgradesource
   - 11 nov 2008

Signori, vc poderia passar o codigo que fez para o delphi, pois estou com o mesmo problema mas no delphi.

[ ]´s

Signori
   - 11 nov 2008


Citação:
Signori, vc poderia passar o codigo que fez para o delphi, pois estou com o mesmo problema mas no delphi.

[ ]´s


Veja:
#Código

var
htm:string; 
begin
try
  fbcommand.create(´QUERY...´)
  
  FBDataReader := fbcommand.executeReader;
  while fbdatareader.read do
    begin
  htm := Nivel2(fbdatareader[´CAMPORETORNADASQL´].ToString) //chama funcao que pesquisa nivel 2
end;
  
finally
  fbdataadapter.free;
  fbcommand.free;
  fbdataadapter.dispose;
end;
end;

function Nivel2(ID:string): string;
var
  htm: string;
begin
  try
  fbcommand1.create(´QUERY...´)
  
  FBDataReader1 := fbcommand1.executeReader;
  while fbdatareader1.read do
    begin
  htm := Nivel3(fbdatareader1[´CAMPORETORNADASQL´].ToString) //chama funcao que pesquisa nivel 3
end; 
  finally
    fbdataadapter.free;
    fbcommand.free;
    fbdataadapter.dispose; 
  end;
end;


Não encontrei o a função que que tinha feito, por estar em outro projeto, mas ela funcionava da mesma forma descrita acima...

aquela variável ´htm´, eu montava um html... claro que adicionava tags e fazia algumas combinações e tals.... mas fazia com que o retorno de tudo fosse um código html que jogava para o text de um label...

espero que ajude...

Spynet
   - 12 nov 2008

??????

nao consegui fazer ainda... rssss