Fazer Select MultiNivel - 4 Geracoes
04/11/2008
0
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
Posts
04/11/2008
Spynet
http://www.shopmedia.com.br/cliente/dnacosmeticos/revenda/rede_exemplo.asp
Se alguem puder me dar um help, agradeceria.
[]s,
Adilson
05/11/2008
Spynet
É 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
05/11/2008
Spynet
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
05/11/2008
Spynet
Preciso solucionar isso aqui pra ontem.
05/11/2008
Spynet
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 += " |_ " & 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
05/11/2008
Spynet
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 += ´ |_ ´ & 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
06/11/2008
Spynet
Me falaram de fazer um loop dentro do outro, e usando datatable, dataset.. mais nao to me acertando.....
06/11/2008
Signori
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
06/11/2008
Spynet
06/11/2008
Spynet
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,
09/11/2008
Spynet
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 é:
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 += ´ |_ ´ & 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 += ´ |_ ´ & 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 += ´ |_ ´ & 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 += ´ |_ ´ & ger4(´nome´) & ´<br>´ Next End Sub End Class
*** Lembrando que o banco é mdb e tenho somente uma Tabela chama Cliente e o relacionamento são as colunas: Documento e Pertence
[]s,
Adilson
11/11/2008
Signori
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.
11/11/2008
Upgradesource
[ ]´s
11/11/2008
Signori
Veja:
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...
Clique aqui para fazer login e interagir na Comunidade :)