Programando un foro

Dani
30 de Mayo del 2002
Hola, estoy programando un foro y tengo varios problemillas. Esto es lo que he hecho. Primero he creado una base de datos en access con una tabla con los siguientes campos:

ID identificador del mensaje
IDF identificador del nmero de foro
Conv conversacin dentro del foro
Exp nmero de indentaciones de la respuesta del mensaje de respuesta en el foro
IDP contiene el nmero de ID del mensaje padre del menaje actual
Asunto asunto del mensaje
Autor autor del mensaje
Mensaje mensaje
Fecha fecha
Hora hora
Mail mail del autor

El funcionamiento es el siguiente. Dentro del foro puedo elegir varios foros que se identifican mediante IDF. Dentro de cada foro, existen diferentes conversaciones que giran en torno a un mensaje. Estas convesaciones se identifican mediante Conv. El mensaje origen de la conversacin tendr el valor Exp=0. Las respuestas tendrn un exp que variar desde 1 hasta n segn el nivel de indentacin que tengan, ya sean respuesta al mensaje original o respuesta a una respuesta de este mensaje, y as sucesivamente. Para saber a que mensaje est respondiendo cada una de las respuestas dentro de una misma convesacin, utilizo el campo IDP cuyo contenido es el ID del mensaje padre. Los dems campos son claros. Con estos campos el foro debera funcionar. Ahora me encuentro con el problema de como ir sacando los mensajes e ir imprimindolos en pantalla.
Lo primero sera sacar los mensajes que inician las conversaciones, para ello buscara aquellos que tengan exp=0. As, al hacer click sobre cada uno de ellos, debera pasarme en el querystring la convesacin a la que me refiero, y a partir de ellos componer el recordset con slo los mensajes de la convesacin. Para ello he programado el siguiente cdigo basado en bucles while.

' Imprimo primero el registro ndice, Exp=0
While (NOT RecordsetForo.EOF)
If RecordsetForo.Fields.Item("Exp") = 0 Then

%>
<tr align="center" bgcolor="#EBEBEB">
<td colspan="2" height="15" valign="top" align="left"><font face="Times New Roman, Times, serif" size="2" color="#000000"><b>&nbsp;<A HREF="ampliar.asp?<%= MM_keepURL & MM_joinChar(MM_keepURL) & "ID=" & RecordsetForo.Fields.Item("ID").Value %>"><%=(RecordsetForo.Fields.Item("Asunto").Value)%></A></b></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Fecha").Value)%></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Hora").Value)%></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Autor").Value)%></font></td>
</tr>
<%
End If
RecordsetForo.MoveNext()

Wend
RecordsetForo.MoveFirst() 'Vuelvo al principio del recordset

' Visualizo los registros con indent=1

Dim registro_actual, IDP_actual, registro_actual2, IDP_actual2
registro_actual = 1
While (NOT RecordsetForo.EOF)
If RecordsetForo.Fields.Item("Exp") = 1 Then
IDP_actual = RecordsetForo.Fields.Item("ID")
%>
<tr align="center" bgcolor="#EBEBEB">
<td colspan="2" height="15" valign="top" align="left"><font face="Times New Roman, Times, serif" size="2" color="#000000">&nbsp;&nbsp;&nbsp;<A HREF="ampliar.asp?<%= MM_keepURL & MM_joinChar(MM_keepURL) & "ID=" & RecordsetForo.Fields.Item("ID").Value %>"><%=(RecordsetForo.Fields.Item("Asunto").Value)%></A></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Fecha").Value)%></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Hora").Value)%></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Autor").Value)%></font></td>
</tr>
<%
'Visualizo los registros con indent=2
RecordsetForo.MoveNext()
registro_actual2=registro_actual + 1

While (NOT RecordsetForo.EOF)
If ((RecordsetForo.Fields.Item("Exp") = 2) AND (RecordsetForo.Fields.Item("IDP") = IDP_actual)) Then
IDP_actual2 = RecordsetForo.Fields.Item("ID")
%>
<tr align="center" bgcolor="#EBEBEB">
<td colspan="2" height="15" valign="top" align="left"><font face="Times New Roman, Times, serif" size="2" color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF="ampliar.asp?<%= MM_keepURL & MM_joinChar(MM_keepURL) & "ID=" & RecordsetForo.Fields.Item("ID").Value %>"><%=(RecordsetForo.Fields.Item("Asunto").Value)%></A></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Fecha").Value)%></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Hora").Value)%></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Autor").Value)%></font></td>
</tr>
<%
'Visualizo los registros con indent=3
RecordsetForo.MoveNext()

While (NOT RecordsetForo.EOF)
If ((RecordsetForo.Fields.Item("Exp") = 3) AND (RecordsetForo.Fields.Item("IDP") = IDP_actual2)) Then
%>
<tr align="center" bgcolor="#EBEBEB">
<td colspan="2" height="15" valign="top" align="left"><font face="Times New Roman, Times, serif" size="2" color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF="ampliar.asp?<%= MM_keepURL & MM_joinChar(MM_keepURL) & "ID=" & RecordsetForo.Fields.Item("ID").Value %>"><%=(RecordsetForo.Fields.Item("Asunto").Value)%></A></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Fecha").Value)%></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Hora").Value)%></font></td>
<td><font face="Times New Roman, Times, serif" size="2" color="#000000"><%=(RecordsetForo.Fields.Item("Autor").Value)%></font></td>
</tr>
<%


End If
RecordsetForo.MoveNext()
Wend
RecordsetForo.MoveFirst()

' Me muevo hasta el registro en el que estaba antes de entrar en Exp=3
For contador = 1 to (registro_actual2-1)
RecordsetForo.MoveNext()
Next
End If
RecordsetForo.MoveNext()
registro_actual2 = registro_actual2 + 1

Wend

RecordsetForo.MoveFirst()

' Me muevo hasta el registro en el que estaba antes de entrar en Exp=2.
For contador = 1 to registro_actual-1
RecordsetForo.MoveNext()
Next
End If
RecordsetForo.MoveNext()
registro_actual = registro_actual + 1

Wend

El algoritmo extrae primero el mensaje origen de la conversacin, exp=0 y a partir de l, todas las respuestas, mediante sucesivos while. El problema que encuentro es que es no es una forma recursiva por lo que tendra que hacer un bucle while para cada indentacin, no pudiendo escribir infinitos whiles para infinitas indentaciones. Estoy intentando hallar otro algoritmo con bucles for o de otro modo pero hasta el momento no he conseguido ms.
Otro problema que tengo es que los campos mensaje los saco tal cual, por lo que si algn usuario me introduce cdigo html con tags, me podra fastidiar el diseo de la pgina. Tb me gustara que al teclear una direccin http:// me saldra el hipervnculo al momento. He pensado en crear un botn que inserte el cdigo en html pero no me gusta que se pueda introducir html.
¿Podra alguien hecharnos una mano con estos problemas, o indicarme alguna manera mejor de programar el foro? Espero vuestra ayuda. Muchas gracias.