Ir para conteúdo

POWERED BY:

Arquivado

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

Korso

[Resolvido] Listar registros relacionados de dentro de um registr

Recommended Posts

Olá a todos,

 

Tentarei explicar esta minha dúvida da maneira mais compreensível possível...

Vamos lá!

 

Tenho 3 tabelas, com as seguintes configurações:

 

- Tabela: MULE

(lista com vários registros para consulta)

campos:

ID, DATA, TITULO, LINK, INFO

campo ID relacionado com o campo IDTRACK (1 para muitos)

 

- Tabela: USUARIOS

(usuários que acessam o sistema e que podem "opcionalmente" adicionar qualquer um dos registros como sendo seu, levando assim o seu nome, e tornando-se "dono" do registro)

campos:

IDUSER, NOME, SENHA

campo IDUSER relacionado com o campo IDDONO(1 para muitos)

 

- Tabela: DONOS

(tabela que relaciona os usuários com os registros da lista)

campos:

ID, IDDONO, IDTRACK

 

 

Código usado:

SQL = "Select mule.id, mule.data, mule.titulo, mule.link, usuarios.nome"

SQL = SQL & " FROM (mule"

SQL = SQL & " LEFT JOIN donos ON mule.id = donos.idtrack)"

SQL = SQL & " LEFT JOIN usuarios ON donos.iddono = usuarios.iduser"

SQL = SQL & " ORDER BY mule.data DESC"

 

 

Dúvida:

Usando o seguinte código, faço a relação sem nenhum problema, retornando assim todos os registros, até mesmo aqueles que não possuem nenhum usuário relacionado como "dono" (explicado acima).

 

Meu único problema é: um registro pode haver mais de 1 "dono" (usuário relacionado) e no momento que é exibida a listagem de registros, os registros que possuem mais de 1 dono, é duplicado em tela o mesmo registro, como se tivesse duplicado no banco de dados, mas este só é exibido 2 vezes em tela, e cada registro mostra diferentes "donos", e não todos os donos no mesmo registro.

 

O que eu precisaria neste caso seria isso, exibir todos os "donos" de cada registro, sem criar duplicação do mesmo registro.

 

 

Exemplo da tabela visualizada atualmente em tela:

 

ID - DATA - TITULO - LINK - INFO - DONO

 

01 - 02/01/08 - teste1 - www - obs - joao

01 - 02/01/08 - teste1 - www - obs - maria

01 - 02/01/08 - teste1 - www - obs - carlos

02 - 09/01/08 - teste2 - www - obs - fulano

03 - 11/01/08 - teste3 - www - obs - ciclano

04 - 11/01/08 - teste4 - www - obs - beltrano

 

 

 

Exemplo de como deve ser visualizada a tabela em tela:

 

ID - DATA - TITULO - LINK - INFO - DONO

 

01 - 01/01/08 - teste1 - www - obs - joao, maria, carlos

02 - 09/01/08 - teste2 - www - obs - fulano

03 - 11/01/08 - teste3 - www - obs - ciclano

04 - 11/01/08 - teste4 - www - obs - beltrano

 

 

Para apenas 1 "dono" tudo funciona correto, o problema surge quando existe mais de 1.

Preciso que seja exibido como no exemplo acima, todos na mesma linha, sem criar duplicações do mesmo registro em tela

 

Alguém poderia me ajudar ?

 

Muito obrigado desde já pela ajuda.

Abraços!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

mrs...

vou falar 2 formas de fazer isso, mas só a logica... os codigos a preguica me impede!!!!

 

- direto na query

mas da pra fazer direto na query e retornando os valores jah prontos... mas voce tera q provavelmente fazer uma procedure para que consiga fazer isso com os loops

 

> cria uma tabela temporaria na procedure

> alimenta essa tabela com os dados dos seus registros sem as informacoes de donos. Na teoria voce naum tera registros duplicados

> cria nessa tabela temporaria um campo que ficara armazenado o nome de 1 ou mais donos... um campo grande que comporte a quantidade de caracteres

> faz um cursor que vai percorrer todos os registros da sua tabela temporaria

> para cada registro do cursor, ele vai pegar todos os donos, concatenar em uma variavel e depois dar um update na tabela temporaria mostrando o valor

 

- direto na aplicacao

> voce roda o sql e ele vai retornar dessa forma mesmo que voce falou.. duplicado.

> mas agora, voce tera que ordenar os registros por ID

> agora voce printa os dados do 1 registro... manda ir para o proximo registro... verifica se o codigo eh o mesmo... se for, somente acrescenta + um dono, se naum for, printa os dados do 2 registro e porai vai...

 

dai da pra otimizar muito... fazendo o processo funcionar de forma mais performatica... mas se entender a logica, vai conseguir otimizar isso facil, ok?

 

abs,

ska!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda, Ska!

 

Entendi o que você disse, e irei fazer usando uma procedure para ver se melhora a performance.

 

Eu fiz, temporariamente, de outra forma mais trivial.

Eu criei uma Sub que faz uma busca por todos os donos do registro.

 

Ela ficou assim:

<%

Sub DropDown(field)

set rsDrop = Server.CreateObject("ADODB.Recordset")

strSQL = "Select mule.id, mule.data, mule.titulo, mule.link, usuarios.nome"

strSQL = strSQL & " FROM (mule"

strSQL = strSQL & " LEFT JOIN donos ON mule.id = donos.idtrack)"

strSQL = strSQL & " LEFT JOIN usuarios ON donos.iddono = usuarios.iduser"

strSQL = strSQL & " WHERE donos.idtrack=" & field

rsDrop.CursorLocation = 3

rsDrop.CursorType = 1

rsDrop.LockType = 3

rsDrop.Open strSQL, objCon

Set rsDrop.activeConnection = Nothing

do until rsDrop.EOF

Response.Write rsDrop("nome") & "  "

rsDrop.MoveNext

loop

rsDrop.Close

end sub

%>

 

 

E na listagem, apliquei a Sub, que traz todos os donos de cada registro:

<% do until rs.EOF %>

<tr><td><%=rs("id")%></td><td><%=rs("titulo")%></td><td><% DropDown rs("id") %></td></tr>

<%

rs.movenext

loop

%>

 

 

Não sei até que ponto isto pode gerar algum sobrecarregamento ou lentidão.

É exatamente dessa forma que eu preciso (os donos de cada registro na mesma linha)

Funcionando está, apenas queria fazer de um jeito mais limpo, para ter uma melhor performance.

 

Obrigado mais uma vez, e fico no aguardo de outras sugestões

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

assim deve funcionar, mas se sua tabela for grande, ele irá fazer centenas de consultas no banco de dados... isso pode gerar problemas de performance.

 

uma opção seria utilizando uma única query e tratando na própria aplicação, como falei anteriormente:

 

<table width="500" border="1" cellspacing="0" cellpadding="0">
<%
	sql = 	"Select mule.id, mule.data, mule.titulo, mule.link, usuarios.nome, usuarios.iduser " &_
			  "  FROM mule" &_
			"  inner " &_
			"	JOIN donos ON mule.id = donos.idtrack " &_
			"  inner " &_
			"  JOIN usuarios ON donos.iddono = usuarios.iduser " &_
			" ORDER BY mule.data asc, mule.id;" 
	' -- gera a consulta normal. repare que foi adicionado o ID no ORDER BY. Da forma que foi montado, garante que os ID serão sequenciais no retorno da query após a ordenação da data
	set tabTemp = Nothing
	set tabTemp = bdSite.execute(sql)


	Do while not tabTemp.EOF 
		atual = tabTemp("id")	
%>
  <tr>
	<td><%=tabTemp("id")%></td>
	<td><%=tabTemp("data")%></td>
	<td><%=tabTemp("titulo")%></td>
	<td><%=tabTemp("link")%></td>
	<td>
<%
		virgula = false
		Do while atual = tabTemp("id")
			atual = tabTemp("id")
			if virgula = true then response.write ", " end if
			response.write tabTemp("nome")
			tabTemp.MoveNext
			if  tabTemp.EOF then exit Do end if
			virgula = true
		loop
%>	
	</td>
  </tr>
<%

	Loop
%>  
</table>

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.