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

Access + ASP Aleatorio

Estas en el tema de Access + ASP Aleatorio en el foro de ASP Clásico en Foros del Web. Hola a todos estoy intentado mostar los resultados de una sql de forma aleatoria pero no lo consigo. La consulta es: Código PHP: sql = ...
  #1 (permalink)  
Antiguo 29/06/2006, 06:17
 
Fecha de Ingreso: junio-2002
Mensajes: 93
Antigüedad: 22 años
Puntos: 0
Access + ASP Aleatorio

Hola a todos estoy intentado mostar los resultados de una sql de forma aleatoria pero no lo consigo.
La consulta es:
Código PHP:
sql="Select * from mitabla order by rnd(id_mitabla)" 
Si ejecuto la consulta en el access si obtengo los resultados de forma aleatoria, pero al hacerlo en la página ASP no consigo que la consulta sea aleatoria, (siempre me devuelve lo mismo).

Tambien he tenido la precaución de no guardar la pagina en la caché del navegador.

Que puedo se hacer?

Un saludo
Iñaki
  #2 (permalink)  
Antiguo 29/06/2006, 06:49
 
Fecha de Ingreso: diciembre-2003
Mensajes: 141
Antigüedad: 20 años, 6 meses
Puntos: 0
Pues creo que para asp y BBDD Access, no hay manera (por más que he leido, tampoco lo he encontrado) de hacerlo directamente desde la consulta SQL (ojo!, si desde la misma aplicación)

Para Access siempre lo he realizado directamente desde el cursor. Por ejemplo

Código:
adoConn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=dondeestelaBBDD"

strSQL = "SELECT * FROM latablaquequieras"

Set RSrandom = Server.CreateObject("ADODB.Recordset")
RSrandom.Open strSQL, adoConn, 1, 2

rndMax = CInt(RSrandom.RecordCount) 'Pasmos el numero de registros totales a la variable rndMax

Randomize Timer 'Realizamos un Randomize para que siempre nos de un valor diferente. Creo que sin el Timer, también funciona ok.
rndNumber = Int(RND * rndMax) 'Con RND escojemos un número con la referencia máxima del número de registros (variable rndMax)
RSrandom.Move rndNumber 'Finalmente nos movemos al registro y hacemos lo que queramos con el

RSrandom.Close
Set RSrandom = Nothing
Set adoConn = Nothing
Este ejemplo funcionará tanto si haces la conexión para Access, MSSQL, MySQL, etc...

Inicialmente el ejemplo lo saqué de aquí

Saludos!

Última edición por NeoZ; 29/06/2006 a las 06:54
  #3 (permalink)  
Antiguo 29/06/2006, 07:55
 
Fecha de Ingreso: junio-2002
Mensajes: 93
Antigüedad: 22 años
Puntos: 0
Gracias por el interés:

Esta opción no me vale porque se muestran todos los registros del recordset, y yo los voy a paginar así que no me vale.

Muchisimas gracias de todas formas y seguiré buscando.

Un saludo
Iñaki
  #4 (permalink)  
Antiguo 29/06/2006, 09:09
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Trata esto:

http://www.mvps.org/access/queries/qry0011.htm

Solo convierte la funcion de VB a VBScript.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #5 (permalink)  
Antiguo 29/06/2006, 10:22
 
Fecha de Ingreso: junio-2002
Mensajes: 93
Antigüedad: 22 años
Puntos: 0
Sigo con mis problemas.

He creado el modulo en access con la función que me indicó u_goldman
luego creo la consulta con la sentencia que me indicó u_goldman
La ejecuto desde access y funciona perfectamente

Pero cuando ejecuto la página ASP me da un error "La función 'randomizer' no está definida en la expresión"

Así que creo la función randomizer en mi codigo ASP (es que estoy desesperado ) y por su puesto persiste el error.

Ya no se que hacer, pero bueno.

Un saludo kaki
  #6 (permalink)  
Antiguo 29/06/2006, 10:33
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Bueno, no se nunca la utilicé y además no tengo Access así que no puedo abundar mucho, la otra que se me ocurre aunque no se que tan eficiente sea, es generar una tabla temporal donde volcarás los ids de tu tabla y en el otro campo un número de vamos a decir 10 dígitos generado aleatoriamente, después puedes hacer un select de esa tabla order by campo_aleatorio e incluso unir la otra tabla, obvio, después tendrás que destruir la tabla temporal.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #7 (permalink)  
Antiguo 29/06/2006, 10:36
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Disculpame... pero si lo vas a paginar... ¿por qué los querés aleatorios?
Digo, me parece que no tendría sentido.. porque en la página 1 estarían los 10 primeros (por decir un número) aleatorios. Cuando pasás a la página dos, al ser aleatorio, tal vez te encuentres con algunos de los 10 primeros... y si tenés 3 páginas (también por decir un número) es probable que al navegar las 3 hayan registros que nunca aparezcan pòr el echo de ser aleatorio.
__________________
...___...
  #8 (permalink)  
Antiguo 29/06/2006, 10:36
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Ahi tienes un ejemplo:

http://www.4guysfromrolla.com/webtech/102999-1.shtml
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #9 (permalink)  
Antiguo 29/06/2006, 10:40
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Cita:
Iniciado por Al Zuwaga
Disculpame... pero si lo vas a paginar... ¿por qué los querés aleatorios?
Bueno, a mi particularmente me sucedió que lo tenía que hacer así, paginado, aleatorio y además por niveles, o sea que mostraríamos X registros ordenados aleatoriamente de entre 4 niveles diferentes, pero además la página contenía N registros totales. Ahora, para controlarlo, como son 10, puedes enviar los links de página o los famosos botones de siguiente por post, y en un hidden envías los ids que ya fueron seleccionados para excluirlos, solo tendrías que aumentar un NOT IN(1,7,90,59, N)

Esa fué la solución a la que llegué, cabe mencionar que no eran muchos registros tampoco, de lo contrario no se que tan eficiente sea.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #10 (permalink)  
Antiguo 29/06/2006, 10:55
 
Fecha de Ingreso: junio-2002
Mensajes: 93
Antigüedad: 22 años
Puntos: 0
Los necesito aleatorios para que no aparezcan siempre los mismos en los primeros puestos.

El tema de que puedan aparecer siempre los mismos lo habia pensado resolver de la siguiente forma:

Leyendo vi que para generar consultas con resultados aleatorios se usa el rnd(valor) , valor se genera con un ramdom por que sino los resultados son siempre iguales y así que había pensado en varias cosas:

1º pasar ese valor por medio de una querystring
2º si la query esta vacía creo un valor aleatorio y hago la consulta a la base de datos
3º si la query no está vacia hago la consulta con ese valor( que debe ser el de la consulta anterior y así los resultados "aleatorios" serían lo mismos y así los puedo paginar ).

Bueno si me he explicado, esa era la idea , pero veo que mi gozo en un pozo pues no consigo resultados aleatorios desde asp , aunque si con access.

Un saludo
Iñaki
  #11 (permalink)  
Antiguo 29/06/2006, 10:59
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Cita:
y en un hidden envías los ids que ya fueron seleccionados para excluirlos, solo tendrías que aumentar un NOT IN(1,7,90,59, N)
buena solución, no se me ubiese ocurrido eso ;)
__________________
...___...
  #12 (permalink)  
Antiguo 29/06/2006, 11:23
 
Fecha de Ingreso: diciembre-2003
Mensajes: 141
Antigüedad: 20 años, 6 meses
Puntos: 0
Cita:
y en un hidden envías los ids que ya fueron seleccionados para excluirlos, solo tendrías que aumentar un NOT IN(1,7,90,59, N)
buff... inventiva al poder !

x kaki.
Veo que tienes por ahí algún post mas sobre este tema (me imagino que todos van por el mismo).

Cuando trabajas con una aplicación configurable con diversas conexiones de diferentes BBDD, es realizar un código "standard". En este caso Access se queda bastante "justito" en cuanto a funciones de SQL y sobretodo en velocidad.

Yo creo que una buena solución (y que además funcionaria con otros servidores de BBDD, eso si, mucho más lento) sería la que has iniciado en los otros post.

1. Recuperas registro
2. Lo pasas a un array
3. Aleatoriamente vas extrayendo varios registros, a medida que también para no repetirlos los vas eliminando del array

Bueno, si se me ocurre algo luego te lo comento. Ahora estoy liado con el peque

Saludos!!!
  #13 (permalink)  
Antiguo 29/06/2006, 11:30
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Yo desarrollé algo parecido hace un tiempo, un tremendo script que al final nunca lo usé porque decidí que no utilizaría access nunca más je je je, así que al final todo se resolvió con un NEWID() en SQL, pero bueno, creo yo que la solución ya ha sido planteada, cualquiera de esos links deberían funcionar, si no es así bueno, aquí está este, pero repito, no es lo más eficiente, es un tremendo script:

http://www.forosdelweb.com/showthrea...ght=aleatorios

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #14 (permalink)  
Antiguo 30/06/2006, 01:59
 
Fecha de Ingreso: junio-2002
Mensajes: 93
Antigüedad: 22 años
Puntos: 0
Bueno finalmente he decidido agregar un order by multiple a la consulta sql es decir haré un order by campo1 , campo2 , campo3 , campo4 .

Para seleccionar los campo1 ,campo2, campo3 y campo4 creo un array con los nombres de los campos, despues genero los numeros aleatorios y los añado a la consulta.

Así genero registros aleatorios pero con un patrón, con lo que puedo paginarlos sin repetir ninguno pero cada vez que se inicia una busqueda los resultados son distintos.

Bueno pongo el código para que se entienda
Código PHP:
sql "Select * from mitabla order by "
campos = Array ("campo1","campo2","campo3"...........)
manipulado false 'Asi detecto si manipulan la querystring o si biene vacia'
If request.QueryString("criterio") <>"" then
    criterio 
request.QueryString("criterio")
    
indice split(criterio,",")
    for 
i=0 to uBound(indice)
        if (
isNumeric(indice(i)) and (indice(i) > 22 or indice(i)<0)) then
            manipulado 
true
            
exit for
        
end if
        
sql2 sql2 " " campos(indice(i)) & ","
    
next
else
    
manipulado true
end 
if

if 
manipulado then
    randomize
    
for i=0 to 3
        indice 
round(rnd()*22)
        
criterio criterio indice ","
        
sql2 sql2 " " campos(indice) & ","
    
next
    criterio 
MID(criterio,1,LEN(criterio)-1)' quito la ultima coma'
end if

sql2 MID(sql2,1,LEN(sql2)-1'quito la ultima coma'
sql sql sql2 
Bueno pues basicamente es esto cada vez que alguien hace una busqueda tiene resultados distintos pero si se pone a navegar por ellos con los botones de anterior y sigiente no obtendrá resultados repetidos

Bueno ahora lo testearé un poco y listo

Gracias por su colaboración.

Un saludo
Iñaki

Última edición por kaki; 30/06/2006 a las 07:34
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 21:56.