¿Cómo hago que se modifique aleatoriamente el orden de los registros cada vez que se ejecute la consulta? Microsoft Access.

Tengo una consulta sencilla en access basada en una tabla en particular. Mi pregunta especifica es como puedo hacer para que cada vez que se ejecute dicha consulta, el orden de sus registros sean diferentes. La tabla tiene su respectivo campo identificador y otros campos como es d esperarse. He encontrado algunos ejemplos pero son para problemas mas complejos y no logro discernir para mi aplicación especifica.
Un abrazo.

2 respuestas

Respuesta
1

Con los datos que se aportan, la respuesta es muy difícil, ni tan siquiera hay pistas sobre los ejemplos que fueron rechazados por ser ¿complejos? Pero (posiblemente) fueran en la línea correcta y 'simplificables'.

Una opción que seria valida en el caso de que el cambio de orden fuera simplemente el ordenar por uno de los campos:

Se parte de que se conocen los campos 'ordenables' (AAAAA, BBBB, CCCC)

Con la función RND se obtiene un numero 'aleatorio' que este entre uno y el máxímo de posibilidades (en este ejemplo: tres)

Se utiliza el numero obtenido para (con la función Swicht o la función Choose) seleccionar uno de los campos elegibles y se le pasa como valor (orden) a la consulta sobre esa tabla.

Pero 'el orden' solo consistirá en cambiar el campo, dentro de los valores de ese campo el orden seria siempre el mismo.

Si te es valida ya hay un punto de partida y necesitas ayuda o ampliar la información: solo pregunta

Respuesta
1

Jorge, no es posible ordenar pasando como el parámetro el valor, por ejemplo, si tengo este script

SELECT tblproductos.idproducto, tblproductos.sinocodigo, tblproductos.codigobarras, tblproductos.numserie, tblproductos.producto
FROM tblproductos ORDER BY 5

Obtengo en Access los registros ordenados por la 5 columna, en este caso producto, la idea fuera pasar lugar el 5 un número aleatorio entre 1 y 5, algo como Int((5 * Rnd) + 1), pero al ejecutar la consulta siempre retorna el mismo valor (al menos en mis pruebas).

Veo que la única forma es crear una tabla temporal con los campos a incluir aleatoriamente y posteriormente llenar una tabla temporal con estos, Le dejo el código vba,

Sub OrdenarRegistrosAleatoriamente()
    Dim db As DAO.Database
    Dim rsFields As DAO.Recordset
    Dim strSQL As String
    Dim strRandomField As String
    ' Crear tabla temporal
    strSQL = "CREATE TABLE TempOrden (FieldIndex INT, FieldName TEXT);"
    CurrentDb.Execute strSQL
    ' Agregar los campos deseados a la tabla temporal
    strSQL = "INSERT INTO TempOrden (FieldIndex, FieldName) VALUES (1, 'idproducto');"
    CurrentDb.Execute strSQL
    strSQL = "INSERT INTO TempOrden (FieldIndex, FieldName) VALUES (2, 'sinocodigo');"
    CurrentDb.Execute strSQL
    strSQL = "INSERT INTO TempOrden (FieldIndex, FieldName) VALUES (3, 'codigobarras');"
    CurrentDb.Execute strSQL
    strSQL = "INSERT INTO TempOrden (FieldIndex, FieldName) VALUES (4, 'numserie');"
    CurrentDb.Execute strSQL
    strSQL = "INSERT INTO TempOrden (FieldIndex, FieldName) VALUES (5, 'producto');"
    CurrentDb.Execute strSQL
    ' Obtener un campo aleatorio de la tabla temporal
    Set db = CurrentDb()
    Set rsFields = db.OpenRecordset("TempOrden")
    rsFields.MoveLast
    rsFields.MoveFirst
    rsFields.Move Int((rsFields.RecordCount - 1) * Rnd)
    strRandomField = rsFields.Fields("FieldName").Value
    rsFields.Close
    Set rsFields = Nothing
    Set db = Nothing
    ' Consulta para obtener los registros ordenados aleatoriamente
    strSQL = "SELECT idproducto, sinocodigo, codigobarras, numserie, producto FROM tblproductos ORDER BY " & strRandomField & ";"
    CurrentDb.Execute "DELETE FROM temconsulta"
    ' Ejecutar la consulta y procesar los resultados
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset(strSQL)
    Do Until rs.EOF()
       CurrentDb.Execute "INSERT INTO temconsulta(idproducto,sinocodigo,numserie,producto) VALUES(" & rs!idProducto & "," & rs!sinocodigo & ",'" & rs!numserie & "','" & rs!producto & "')"
      rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing
    ' Eliminar la tabla temporal
     strSQL = "DROP TABLE TempOrden;"
     CurrentDb.Execute strSQL
End Sub

El resultado de la consulta lo guardo en la tabla temconsulta.

Esto es una idea seguramente hay mas alternativas

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas