Foros del Web » Programando para Internet » ASP Clásico »

ASP+Acces: ¿cómo Recorrer una tabla?

Estas en el tema de ASP+Acces: ¿cómo Recorrer una tabla? en el foro de ASP Clásico en Foros del Web. Buenas, Necesito implementar en una página un formulario para recorrer una tabla mostrando los valores de sus campos. Así pues, al cargar la página hago ...
  #1 (permalink)  
Antiguo 23/05/2005, 10:16
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años, 2 meses
Puntos: 8
ASP+Acces: ¿cómo Recorrer una tabla?

Buenas,

Necesito implementar en una página un formulario para recorrer una tabla mostrando los valores de sus campos.

Así pues, al cargar la página hago un SELECT para mostrar el primer registro, y en un FORM tengo 4 botones SUBMIT (que pasan la acción a realizar y el ID del registro actual) para ir al primero, anterior, siguiente y último registros.

El problema lo tengo en cómo acceder al siguiente o anterior registro al actual, ya que cada vez que se hace submit se carga la página y se vacía el recordset.

Estoy bastante liado con esto... tamaña tontería que en una aplicación corriente se hace en decir "ya"

A ver si alguien puede echarme una mano. Gracias.
  #2 (permalink)  
Antiguo 23/05/2005, 10:38
Avatar de ludovico2000  
Fecha de Ingreso: noviembre-2003
Ubicación: Bizkaia
Mensajes: 1.315
Antigüedad: 20 años, 7 meses
Puntos: 2
¿y por qué no haces que el asp te responda con un html con varios divs (uno para cada registro) que vas mostrando/ocultando con unos botones mediante acciones javascript?

a lo mejor por ahí...
  #3 (permalink)  
Antiguo 23/05/2005, 12:34
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años, 2 meses
Puntos: 8
No entiendo a qué te refieres, ¿podrías poner un ejemplo?.
  #4 (permalink)  
Antiguo 23/05/2005, 13:20
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Cita:
Estoy bastante liado con esto... tamaña tontería que en una aplicación corriente se hace en decir "ya"
Tienes razón, pero en una aplicación "corriente" puedes manadar todo el cursor de datos al cliente y manipularlos ahí con un control como un DBNavigator. Aquí hay de dos sopas: Envías todo el cursor al cliente igual, pero lo tendrías que manipular con código de cliente (como te mencionó ludovico, aunque no creo que fuera la mejor opción), o lo trabajas en el servidor pero de forma paginada. Es decir, mandas al cliente unos 20, 50 o 100 registros y vuelves a llamar al servidor para recuperar los siguientes 20, 50 o 100 registros.
Hay muchos ejemplos de paginaciónh usando o no GetRows.

Espero que eso te haya orientado un poco más, investígale y si aún hay problemas pregunta con confianza.
  #5 (permalink)  
Antiguo 23/05/2005, 13:48
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años, 2 meses
Puntos: 8
Seguiré tu consejo y buscaré por paginación.

No sé qué estaré haciendo mal ya que lo que pretendía es mandar la primera vez sólo el primer registro (para evitar mandar un paquete de ellos) y mediante botones y con movePrevious, moveNext, etc. que el usuario se desplazara.

Intenté también mandar el recordset entero e ir mostrando los "movimientos" em los cuadros de texto usando javaScript y el evento ONCLICK de los botones... pero no funciona (lo que ello hace es asignar al cuadro de texto SÓLO el valor del siguiente registro cuando se presiona el botón, pero SÓLO el del siguiente al actual, no cambia por más que se pulse, lógicamente, por ejemplo).

Así que miraré a ver lo de la paginación, porque es un tanto frustante no ser capaz de mostrar una tabla :(

Muchas gracias.
  #6 (permalink)  
Antiguo 23/05/2005, 14:18
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Las instrucciones movePrevious, moveNext, etc, son útiles pero en el servidor, es decir, dentro del mismo ASP, ya en el browser no te sirven de mucho por que tendrías que volver a llamar al servidor y recargar la página para enviar solo un registro nuevamente, lo cual pues no es ni viable ni aconsejable ni nada. En Web lo común es trabajar con paginación, en las FAQ's (si ya se que están horribles pero ya estamos en eso) hay un par de ejemplos que te servirán mucho. En buscas sobre GetRows también encontraras ejemplos en la red.

Si quieres ayuda con ele ejemplo que encuentres, por favor, pregunta que por lo que veo ya le haz estado intentando bastante pero el problema ha sido quizá las diferencias entre el concepto de la programación convencional y la programación Web.
  #7 (permalink)  
Antiguo 24/05/2005, 05:04
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años, 2 meses
Puntos: 8
Muchas gracias por vuestro interés, al final lo he solucionado, aunque sin usar GetRows:

Código:
rs.Open "SELECT * FROM TBL_INCIDENCIA", miConexion, adOpenKeySet, adLockOptimistic					
rs.PageSize = 1
										
if (Request.QueryString() <> "") then															
    select case Request.QueryString("accion")
        case "Primero":						
	case "Anterior":									
	case "Siguiente":	
		Session("Pagina_Actual") = Session("Pagina_Actual") + 1
		rs.AbsolutePage = Session("Pagina_Actual")			
									
		if Session("Pagina_Actual") > rs.RecordCount then
		    Session("Pagina_Actual") = Session("Pagina_Actual") - 1	
		    rs.AbsolutePage = Session("Pagina_Actual")	
		end if
	case "Ultimo":
	end select						
	
else									
	rs.AbsolutePage = 1					
	Session("Pagina_Actual") = 1
	Response.Write("Registros = [" & rs.recordcount & "]")
		
end if
También lo he hecho usando AbsolutePosition.

¿Cuál de los dos métodos estos me recomendais?
¿Habrá algún tipo de problema usando AbsolutePosition en tablas indexadas?

He estado mirando código con GetRows, pero siempre se trata de cargar el recordset, y después usar GetRows, ¿no es mejor esta forma?

Gracias.

Última edición por MikiBroki; 24/05/2005 a las 05:10
  #8 (permalink)  
Antiguo 24/05/2005, 08:23
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Ok, veamos tu código y dejo que tu saques primero conclusiones.
Cita:
rs.Open "SELECT * FROM TBL_INCIDENCIA", miConexion, adOpenKeySet,
adLockOptimistic

Llenamos un objeto RecordSet con TODOS los campos y TODOS los registros de la tabla TBL_INCIDENCI, moviendonos hacia adelante o hacia atras pero sin observar los registros insertados y la bloquearemos cuando actualicemos registros. Desde antes de esta linea el objeto RS ya existía pero en esta lo llenas.

rs.PageSize = 1
De TODOS los registros obtenidos, a mi solo me interesa UNO, notese que no elimino los demás, solo indico que todo el RS esta paginado con igual número de registros y páginas.

if (Request.QueryString() <> "") then
En caso de que venga algún parámetro hagamos lo siguiente

select case Request.QueryString("accion")
case "Primero":
case "Anterior":
case "Siguiente":
Session("Pagina_Actual") = Session("Pagina_Actual") + 1
rs.AbsolutePage = Session("Pagina_Actual")

(Supongo omitiste el código de las otras constantes, pero también supongo que la idea es la misma) En caso de que hayan tomado la acción "Siguiente", incrementar la variable de sesión en uno y me ubico en la página seleccionada, como tengo tantas páginas como registros, es lo mismo que si hubiera colocado rs.AbsolutePosition = Session("Pagina_Actual") y sin haber paginado.

if Session("Pagina_Actual") > rs.RecordCount then
Session("Pagina_Actual") = Session("Pagina_Actual") - 1
rs.AbsolutePage = Session("Pagina_Actual")
end if
En caso que nos hayamos excedido del límite de registros, decremento la variable de sesión y "muevo" la página a dónde se supone ya estaba (por que de que otra forma se excede del útimo si no es presionando "Seguiente"), es decir, es una operación innecesaria.

case "Ultimo":
end select

else
rs.AbsolutePage = 1
Session("Pagina_Actual") = 1
Response.Write("Registros = [" & rs.recordcount & "]")

end if
Esta este momento el objeto sigue existiendo.
No tiene mucho sentido "paginar" un cursor de a un registro (el default creo son 10), aunque esa no era la pregunta, la diferencia de este método con GetRows es que el objeto RS esta "vivo" durante toda la operación, y con el otro trabajas con un Arreglo en momoria.
Si quieres continuar con tu método de recorrer el cursor de a uno en uno (con todo el problema que eso conlleva, llamadas al servidor para traer solo un registro al cliente, etc.) te recomiendo inténtes hacer el páginado en la tabla directamente y no me refiero en ASP, sino en el servidor de BD directamente y regreses al ASP solo ese registro o intentes obtener con un Where el registro exacto o no se.

Yo sigo en mi posición de que programar Web no es ni debe ser igual a la programación "convencional", no debes intentar recorrer de a uno en uno el cuursor.
En ASP.NET puedes recorrerlo de a uno en uno, pero por que se puede trabajar en un esquema xml y no hay llamadas al servidor de BD innecesarias, sino que en el esquema se hacen los corrimientos.

Mis 02/100 como diría U_G

Saludos
  #9 (permalink)  
Antiguo 24/05/2005, 09:11
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años, 2 meses
Puntos: 8
Muchísimas gracias por el tiempo dedicado.

Lo cierto es que después que haber hecho ese código me seguía picando la curiosidad y continué buscando info del GetRows.

En mis búsquedas vi una forma que me gustó en principio, y era que el rs se carga en una variable de sesión y así en las sucesivas llamadas a la página no era necesario ejecutar la consulta, ¿cómo lo ves?.

Creo que uno de mis fallos (aparte de alguna confusión de código entre cliente/servidor a causa del bloqueo mental), es que siempre he pensado que un RecordSet era en realidad una especie de "tabla virtual", y que los métodos MoveNext, MoveLast, rs("Campo")... actuaban sobre ella, y no sobre la tabla física.

Al final, hice el código de tres formas diferentes, y me he quedado con GetRows.

Y para finalizar sólo me restan dos preguntas, si me permites, y no te molesto más:

1º) ¿Cuántos registros puedo cargar en el vector?, he leído que miles y miles sin problema para el servidor.

2º) Tampoco le veo mucho sentido a realizar un paginado registro a registro. Se me ocurre que podría guardar en un campo oculto del formulario el valor de AbsolutePosition, ¿cómo lo ves?.

Y lo de "Mis 02/100" me lo traduzca por favor

Muchas gracias de nuevo.
  #10 (permalink)  
Antiguo 24/05/2005, 09:27
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Cita:
En mis búsquedas vi una forma que me gustó en principio, y era que el rs se carga en una variable de sesión y así en las sucesivas llamadas a la página no era necesario ejecutar la consulta, ¿cómo lo ves?.
Si vas a continuar con el First, Prior, Next, Last, solucionas las constantes llamadas al servidor, pero ahora tiene el problema de que tendrás tantas variables de sesión como usuarios hagan la petición y por todo el tiempo que dure su sesión (e incluso un poco más), ahí hay que valorar que es lo que conviene más.

Cita:
Creo que uno de mis fallos (aparte de alguna confusión de código entre cliente/servidor a causa del bloqueo mental), es que siempre he pensado que un RecordSet era en realidad una especie de "tabla virtual", y que los métodos MoveNext, MoveLast, rs("Campo")... actuaban sobre ella, y no sobre la tabla física.
En esto tienes razón en parte. En lenguajes como Delphi o VB, tu defines dónde quieres que este la tabla con la que trabajas, por default es en el cliente, es decir, se ejecuta la consulta (a si sea un simple TADOTable) y se pasa una copia de los registros seleccionados al cliente y ahí es dónde las instrucciones de movimiento funcionan, nunca en la tabla física. En ASP también hay tres lugares: El cliente (el navegador del usuario), el servidor (dónde tienes instalado el IIS y se ejecutan los ASP) y el servidor de BD's (donde esta tu BD fisicamente). Al trabajar con el recordset estas trabajando en el servidor web, que hace llamadas al servidor de BD y transfiere HTML resultante al cliente, es decir, es la principal diferencia entre ASP y otros lenguajes, aquí "la tabla virtual" se queda en el servidor Web y no se manda "hasta el cliente" como con Delphi por ejemplo (por que son aplicaciones distribuidas y no cliente-servidor donde las velocidades son mucho más rápidas)

Cita:
1º) ¿Cuántos registros puedo cargar en el vector?, he leído que miles y miles sin problema para el servidor.
Supongo que el tamaño que se te permita crecer una variable de memoria.

Cita:
2º) Tampoco le veo mucho sentido a realizar un paginado registro a registro. Se me ocurre que podría guardar en un campo oculto del formulario el valor de AbsolutePosition, ¿cómo lo ves?.
Pues yo lo veo bien, funcionaría, aunque claro.....el recorrer de uno en uno ...bla, bla, bla.

Cita:
Y lo de "Mis 02/100" me lo traduzca por favor
Tengo un amigo en el foro cuyo nick es U_GoldMan que acostumbra terminar sus aportaciones com "mis 2 centavos", esta es solo otra forma de decirlo

Saludos
  #11 (permalink)  
Antiguo 24/05/2005, 09:45
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años, 2 meses
Puntos: 8
Pues asunto zanjado y MUCHAS GRACIAS !
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:13.