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

Porque no puede saltar de registro dentro de un bucle?

Estas en el tema de Porque no puede saltar de registro dentro de un bucle? en el foro de ASP Clásico en Foros del Web. Pues ese es el problema que tengo, kiero mostrar 5 registros al azar de mi table lo hago generando un numero al aleatorio dentro de ...
  #1 (permalink)  
Antiguo 02/01/2003, 05:48
 
Fecha de Ingreso: enero-2002
Mensajes: 236
Antigüedad: 22 años, 5 meses
Puntos: 0
Porque no puede saltar de registro dentro de un bucle?

Pues ese es el problema que tengo, kiero mostrar 5 registros al azar de mi table lo hago generando un numero al aleatorio dentro de un bucle y cada vez que se ejecuta el bucle kiero que salte al numero de registro q da el numero aleatorio bueno el codigo es:

Código:
<%
rs.open "SELECT * FROM tbl_ofertas ORDER BY to_id_oferta DESC",conexion, 1, 2
rndMax= CInt(rs.RecordCount)
rs.move 2
c=0
do while not c=5
	Randomize Timer 
	rndNumber = Int(RND * rndMax)
	rs.move rndNumber%>
		AKI MUESTRO LA TABLE
<%		c=c+1
	loop
  rs.close
  set rs=nothing%>
Como veis hago una salto de registro antes del bucle, ese salto funciona sin problemas, pero en cambio el del bucle no lo hace... me da el error:

Tipo de error:
ADODB.Field (0x80020009)
El valor de BOF o EOF es True, o el actual registro se eliminó; la operación solicitada requiere un registro actual.
/index.asp

Y en cambio el registro si que existe, porque tambien he probado a poner un salto a un registro fijo que se que existe (el 1 de 20 registros q devuelve la consulta por ejemplo) y me da el mismo error..

Alguien me puede echar una mano?
  #2 (permalink)  
Antiguo 02/01/2003, 06:12
Avatar de nazkatuta  
Fecha de Ingreso: julio-2002
Ubicación: EH - BCN
Mensajes: 222
Antigüedad: 21 años, 10 meses
Puntos: 0
Hola

Yo diria que el problema lo tienes aqui

rs.move 2

Porque haces este movimiento?
si el numero aleaotrio obetenido es mayor que el tamaño del recordset -2 entonces es cuando te lanzará el error de que no puede encontrar tu elemento.

Yo lo cambiaria por un RS.MoveFirst

A ver que tal, suerte
  #3 (permalink)  
Antiguo 02/01/2003, 06:30
 
Fecha de Ingreso: enero-2002
Mensajes: 236
Antigüedad: 22 años, 5 meses
Puntos: 0
No eso no es, solo lo hago para comprobar que se puede navegar por el recordset, lo puedo kitar y me sigue dando el mismo error...

Nadie ve nada mas? Habra que seguir probando.
  #4 (permalink)  
Antiguo 02/01/2003, 06:37
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 9 meses
Puntos: 381
Hola

Podrías hacer lo siguiente:

Genera primero la lista de los 5 números aleatorios y guardalos en un array verificando que no salgan duplicados.

Cuando esté listo el array puedes entonces crear la sentencia sql llamando directamente a esos registros, o bien simplemente le pides al cursor que salte a la posición siguiente dada por la siguiente posición del array.

Así evitas correr el riesgo de que te salgan números duplicados.

saludos
  #5 (permalink)  
Antiguo 02/01/2003, 06:47
 
Fecha de Ingreso: enero-2002
Mensajes: 236
Antigüedad: 22 años, 5 meses
Puntos: 0
Pues nada que no hay manera, ni asi, y eso que si kito el salto de registro del bucle y muestro los valores del array todos son diferentes y dentro del intervalo del numero maximo de registros, ya no se q hacer... este codigo me volvera loco

pues eso a seguir probando cosas...
  #6 (permalink)  
Antiguo 02/01/2003, 07:09
Avatar de nazkatuta  
Fecha de Ingreso: julio-2002
Ubicación: EH - BCN
Mensajes: 222
Antigüedad: 21 años, 10 meses
Puntos: 0
Soy un poco cabezon y sigo pensando que el problema está en el move.

Move no nos lleva a esa posicion el el recordset, si no que avanza las posiciones que le indiquemos.

Para darle el uso que quieres deberias usar Absoluteposition en su lugar.

Aunque me quedo con la idea de tunait... crear el array antes asegurandote de que no se repiten y luego hacer la consulta usando esos ids... (yo lo tuve que hacer hace unos meses y lo hice de esa manera).

Suerte de nuevo!
  #7 (permalink)  
Antiguo 02/01/2003, 07:21
 
Fecha de Ingreso: enero-2002
Mensajes: 236
Antigüedad: 22 años, 5 meses
Puntos: 0
nazkatuta me parece que el cabezon soy yo...

Tienes razon con absolutepage y retocando la funcion pa generar los numeros aleatorios me ha funcionado. muchas gracias, os pongo el codigo para que lo podais utilizar, yo lo uso para mostrar x registros al azar:

Código:
<%
set rs=server.createobject("ADODB.Recordset")

rs.open "SELECT * FROM tbl_novedades",conexion, 1, 2

rndMax= CInt(rs.RecordCount)
for r=1 to 4
	Randomize
	rndNumber = Int((rndMax)*rnd+1)
	if rndNumber=0 then rndNumber=rndNumber+1
	rs.Absoluteposition=rndNumber%>
	
	MOSTRAR EL CONTENIDO
	
<%	next
  rs.close
  set rs=nothing%>
  #8 (permalink)  
Antiguo 02/01/2003, 07:26
Avatar de nazkatuta  
Fecha de Ingreso: julio-2002
Ubicación: EH - BCN
Mensajes: 222
Antigüedad: 21 años, 10 meses
Puntos: 0
Ole!

Me alegro de ke te funcione, pero podrias tener problemas con registros duplicados...

Por ciero, en el FAQ de Bases de Datos hay una consulta para MYSQL que devuleve directamente registros aleatorios, yo no lo he podido probar porque uso SQLServer y no me hacia nada, pero quizas a ti te sirva

era algo asi

SELECT campo FROM tabla order BY RAND() LIMIT 1
  #9 (permalink)  
Antiguo 02/01/2003, 07:35
 
Fecha de Ingreso: enero-2002
Mensajes: 236
Antigüedad: 22 años, 5 meses
Puntos: 0
el codigo para que no muestre un registro 2 veces:

Código:
<%
set rs=server.createobject("ADODB.Recordset")

rs.open "SELECT * FROM tbl_novedades",conexion, 1, 2

rndMax= CInt(rs.RecordCount)
dim lista(4)
for r=1 to 4
	Randomize
	rndNumber = Int((rndMax)*rnd+1)
	do while rndNumber=lista(1) or rndNumber=lista(2) or rndNumber=lista(3) or rndNumber=lista(4)
		rndNumber=Int((rndMax)*rnd+1)
	loop
	lista(r)=rndNumber
	rs.Absoluteposition=rndNumber%>
	
	MOSTRAR EL CONTENIDO
	
<%	next
  rs.close
  set rs=nothing%>
La funcion RAND() de SQL la utilizo cuando trabajo con Mysql y PHP, pero las bases de batos Access (esta es access) no la soportan

Bueno pues muchas gracias por pu ayuda.
  #10 (permalink)  
Antiguo 02/01/2003, 07:39
Avatar de nazkatuta  
Fecha de Ingreso: julio-2002
Ubicación: EH - BCN
Mensajes: 222
Antigüedad: 21 años, 10 meses
Puntos: 0
Hola de nuevo,

De esta forma tendras un bloqueo infinito siempre que la consulta te devuelva menos de 4 registros, ya que nunca podra encontrar 4 aleatorios diferentes entre 3 opciones. Asegurate antes de entrar en el bucle que el recordcount es mayor.
  #11 (permalink)  
Antiguo 02/01/2003, 07:50
 
Fecha de Ingreso: enero-2002
Mensajes: 236
Antigüedad: 22 años, 5 meses
Puntos: 0
La tabla de la base de datos del servidor tiene ahora 234 registros , ya contaba con eso.

Este script es para la portada de una tienda on-line, para que se muestren 4 productos de los que introducen como novedades. Antes se mostraban los 4 mas recientes pero de esta manera si se pasaban mucho tiempo sin actualizar la entrada era siempre la misma, asi queda con mucho mas vida.
  #12 (permalink)  
Antiguo 02/01/2003, 07:53
Avatar de nazkatuta  
Fecha de Ingreso: julio-2002
Ubicación: EH - BCN
Mensajes: 222
Antigüedad: 21 años, 10 meses
Puntos: 0
Perfesto,

es que yo tuve ese problema,

tenia que mostrar 6 banners cuando en la BD solo habia siete, y a veces los tiempos de carga eran altisimos por el problema este.... mas vale prevenir!!
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 20:31.