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 número de foro
Conv conversación dentro del foro
Exp número de indentaciones de la respuesta del mensaje de respuesta en el foro
IDP contiene el número 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 conversación tendrá el valor Exp=0. Las respuestas tendrán un exp que variará desde 1 hasta n según el nivel de indentación 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 convesación, utilizo el campo IDP cuyo contenido es el ID del mensaje padre. Los demás campos son claros. Con estos campos el foro debería funcionar. Ahora me encuentro con el problema de como ir sacando los mensajes e ir imprimiéndolos en pantalla.
Lo primero sería sacar los mensajes que inician las conversaciones, para ello buscaría aquellos que tengan exp=0. Así, al hacer click sobre cada uno de ellos, debería pasarme en el querystring la convesación a la que me refiero, y a partir de ellos componer el recordset con sólo los mensajes de la convesación. Para ello he programado el siguiente código 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 conversación, 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 tendría que hacer un bucle while para cada indentación, 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 más.
Otro problema que tengo es que los campos mensaje los saco tal cual, por lo que si algún usuario me introduce código html con tags, me podría fastidiar el diseño de la página. Tb me gustaría que al teclear una dirección http:// me saldría el hipervínculo al momento. He pensado en crear un botón que inserte el código en html pero no me gusta que se pueda introducir html.
¿Podría alguien hecharnos una mano con estos problemas, o indicarme alguna manera mejor de programar el foro? Espero vuestra ayuda. Muchas gracias.