¿Cómo puedo numerar registros de consulta con el programa Microsoft Access?
Necesito saber cuál es la función de las consultas (si es que existe) que permite asignar un número de orden al resultado ordenado de una consulta. Me explico con un ejemplo: creo un consulta sobre una tabla que tengo 10 nombres y sus edades y la ordeno en ascendente. Me gustaría añadir un campo a esa consulta que numerara del 1 al 10 los registros resultantes de la consulta, de tal forma que el más joven sería el uno y el más viejo el 10. ¿Cómo? Gracias por tu tiempo. Harry105.
1 respuesta
Respuesta de oscarlmv
1
1
A continuación te pongo la forma en la que puedes conseguir lo que quieres:
- Create un nuevo modulo, o coge uno que ya tengas, y define una variable Global que llamaremos Contador: Global Contador As Integer
- En ese mismo modulo create una función como este, o copia y pega esta:
Function Cuenta(Dato As String) As Integer
'Incrementamos el numero de registro
Contador = Contador + 1
'Devolvemos el valor incrementado
FuncionCuenta = Contador
'Comprobamos si ya estamos en el ultimo registro de la consulta a numerar
'Si es así, inicializamos el contador para que al volver a ejecutar la consulta
'comience a numerar desde 0 otra vez
If DCount("CampoCualquieraDeTuConsulta", "NombreDeTuConsulta") = Contador Then Contador = 0
End Function
- En la consulta en la que muestras los datos y quieres mostrar el numerador, crea el campo siguiente:
Numerador: Cuenta([UnCampoCualquieraDeLaConsulta])
- Grabala la consulta y/o pruébalas.
Lo único que veras "raro" es que en la llamada a la función Cuenta desde la consulta le estamos pasando el dato de un campo cualquiera que luego no utilizamos para nada en la función. Esto es para forzar que la función se ejecute por cada registro. Si no pusiéramos ningún parámetro que hiciera relación a algún campo, Access detecta que el resultado de la función no depende del resultado de cada registro por lo que solo ejecutaría la función una vez para todos los registros a mostrar, lo que producirira que todos aparecieran numerados como 1...
Espero que esto solucione tu problema. Si tienes algún problema o consulta no dudes en contactarme.
- Create un nuevo modulo, o coge uno que ya tengas, y define una variable Global que llamaremos Contador: Global Contador As Integer
- En ese mismo modulo create una función como este, o copia y pega esta:
Function Cuenta(Dato As String) As Integer
'Incrementamos el numero de registro
Contador = Contador + 1
'Devolvemos el valor incrementado
FuncionCuenta = Contador
'Comprobamos si ya estamos en el ultimo registro de la consulta a numerar
'Si es así, inicializamos el contador para que al volver a ejecutar la consulta
'comience a numerar desde 0 otra vez
If DCount("CampoCualquieraDeTuConsulta", "NombreDeTuConsulta") = Contador Then Contador = 0
End Function
- En la consulta en la que muestras los datos y quieres mostrar el numerador, crea el campo siguiente:
Numerador: Cuenta([UnCampoCualquieraDeLaConsulta])
- Grabala la consulta y/o pruébalas.
Lo único que veras "raro" es que en la llamada a la función Cuenta desde la consulta le estamos pasando el dato de un campo cualquiera que luego no utilizamos para nada en la función. Esto es para forzar que la función se ejecute por cada registro. Si no pusiéramos ningún parámetro que hiciera relación a algún campo, Access detecta que el resultado de la función no depende del resultado de cada registro por lo que solo ejecutaría la función una vez para todos los registros a mostrar, lo que producirira que todos aparecieran numerados como 1...
Espero que esto solucione tu problema. Si tienes algún problema o consulta no dudes en contactarme.
Hola Oscar, tengo problemillas. Si la función se llama "cuenta" en la consulta la considera un parámetro de consulta agrupada y no va bien. Le he cambiado el nombre a "cuentas" y he hecho un módulo como este:
Global Contador As Integer
Function Cuentas(Dato As String) As Integer
Contador = Contador + 1
FuncionCuentas = Contador
If DCount("TADM", "00Pruebas") = Contador Then
Contador = 0
End If
End Function
La consulta va muy lenta y devuelve ceros en todos los campos. Si quito la sentencia If DCount, también devuelve ceros pero va más rápida.
¿Qué me aconsejas?. Gracias.
Harry105
Global Contador As Integer
Function Cuentas(Dato As String) As Integer
Contador = Contador + 1
FuncionCuentas = Contador
If DCount("TADM", "00Pruebas") = Contador Then
Contador = 0
End If
End Function
La consulta va muy lenta y devuelve ceros en todos los campos. Si quito la sentencia If DCount, también devuelve ceros pero va más rápida.
¿Qué me aconsejas?. Gracias.
Harry105
Hola Oscar, ante todo gracias por tu tiempo y tu interés. He probado los dos tipos de módulos que me dices y la consultas funcionan bien las primeras veces. Cuando las ejecutas más de dos o tres veces empiezan a variar el orden y numerar con la siguiente secuencia 2,3,4,5,6,7,8,9,10,1 o se salta dos lugares y sigue con este orden 4,5,6,7,8,9,10,1,2,3. A veces se salta un lugar, a veces dos o más. ¿?. Gracias. Harry105.
Lo primero que comentas (lo de llamarse Cuenta), llevas toda la razón del mundo... Lo siento... Fue un error mío el ponerte ese nombre... Cuando estaba haciendo esa función para ti, la llamaba FuncionCuentas, pero al copiar el código para ponértelo en la respuesta sustituí ese nombre por uno que fuera más acorde a tu caso "CUENTA", pero no me di cuenta de que lógicamente se confundiría en Access con la función del mismo nombre. Bueno, como bien has hecho, solo es cuestión de ponerle otro nombre, tal y como has hecho ("CUENTAS").
Respecto a que te devuelva todo a ceros, es lógico según el código que te di y que me pones ahora en tu mensaje... Es debido al mismo error que antes te comentaba... Le cambi´ñe el nombre a la función cuando te la puse y se olvidó cambiar lo siguiente:
FuncionCuentas = Contador
En lugar de esto, debes poner:
Cuentas = Contador
Es decir, la función debe devolver el dato que tenga Contador. Si por ejemplo la función en lugar de Cuentas se llamará "PEPE", deberías poner: PEPE = Contador. En resumen, el código final sería el siguiente:
Global Contador As Integer
Function Cuentas(Dato As String) As Integer
Contador = Contador + 1
Cuentas = Contador
If DCount("TADM", "00Pruebas") = Contador Then
Contador = 0
End If
End Function
Respecto a lo de quitar el IF..., decirte que si lo quitas el contador no se inicializará, por lo que si ejecutas más de una vez la consulta ésta renumerará los registros a partir de dónde se quedó la ultima vez. Haz la prueba! Mete el código anterior, prueba a ejecutar 2 veces la consulta y verás que es correcto todo. Luego comenta el IF y ejecuta 2 veces la consulta... La primera te la hará bien, pero en la segunda, si el último registro lo numero antes como POR, ahora los nuevos resultados comenzarán a contar desde POR como numero inicial.
De todos modos, el problema de tu tardanza es que cada vez que numera un registro hace un DCount, lo que hace que se ralentice la consulta. Por ello, te propongo modificar la función anterior para que el DCount solo se ejecute la primera vez, ok ¿?. En lugar de utilizar el código de la función anterior, utiliza este:
Function Cuentas(Dato As String) As Integer
'Incrementamos el numero de registro
Contador = Contador + 1
'Devolvemos el valor incrementado
Cuentas = Contador
'Comprobamos si ya estamos en el ultimo registro de la consulta a numerar
'Si es así, inicializamos el contador para que al volver a ejecutar la consulta
'comience a numerar desde 0 otra vez
If TotalRegistros = 0 Then
TotalRegistros = DCount("NombreDeCampoCualquiera", "NombreDeTuTabla")
Else
If TotalRegistros = Contador Then
TotalRegistros = 0
Contador = 0
End If
End If
End Function
De esta forma ya solo se ejecuta el DCount una vez, al cargar y numerar el primer registro, pero sigue haciendo lo mismo que haci antes: inicializar las variables al finalizar de numerar. Eso si, ahora, ademas de definir la función Global Contador, tienes también que definir TotalRegistros. Quedaría así:
Global Contador As Integer
Global TotalRegistros As Integer
El campo en la consulta debe permanecer igual:
Cuentas: Cuentas([NombreDeUnCampoCualquiera])
Espero que esto solucione tu problema. Siento los errores de la respuesta anterior, pero es que no doy a basto para contestar a todos... je je je
Un saludo y ya sabes donde encontrarme si tienes dudas o problemas. Suerte en tu desarrollo!
Ósacr L.M.V.
Respecto a que te devuelva todo a ceros, es lógico según el código que te di y que me pones ahora en tu mensaje... Es debido al mismo error que antes te comentaba... Le cambi´ñe el nombre a la función cuando te la puse y se olvidó cambiar lo siguiente:
FuncionCuentas = Contador
En lugar de esto, debes poner:
Cuentas = Contador
Es decir, la función debe devolver el dato que tenga Contador. Si por ejemplo la función en lugar de Cuentas se llamará "PEPE", deberías poner: PEPE = Contador. En resumen, el código final sería el siguiente:
Global Contador As Integer
Function Cuentas(Dato As String) As Integer
Contador = Contador + 1
Cuentas = Contador
If DCount("TADM", "00Pruebas") = Contador Then
Contador = 0
End If
End Function
Respecto a lo de quitar el IF..., decirte que si lo quitas el contador no se inicializará, por lo que si ejecutas más de una vez la consulta ésta renumerará los registros a partir de dónde se quedó la ultima vez. Haz la prueba! Mete el código anterior, prueba a ejecutar 2 veces la consulta y verás que es correcto todo. Luego comenta el IF y ejecuta 2 veces la consulta... La primera te la hará bien, pero en la segunda, si el último registro lo numero antes como POR, ahora los nuevos resultados comenzarán a contar desde POR como numero inicial.
De todos modos, el problema de tu tardanza es que cada vez que numera un registro hace un DCount, lo que hace que se ralentice la consulta. Por ello, te propongo modificar la función anterior para que el DCount solo se ejecute la primera vez, ok ¿?. En lugar de utilizar el código de la función anterior, utiliza este:
Function Cuentas(Dato As String) As Integer
'Incrementamos el numero de registro
Contador = Contador + 1
'Devolvemos el valor incrementado
Cuentas = Contador
'Comprobamos si ya estamos en el ultimo registro de la consulta a numerar
'Si es así, inicializamos el contador para que al volver a ejecutar la consulta
'comience a numerar desde 0 otra vez
If TotalRegistros = 0 Then
TotalRegistros = DCount("NombreDeCampoCualquiera", "NombreDeTuTabla")
Else
If TotalRegistros = Contador Then
TotalRegistros = 0
Contador = 0
End If
End If
End Function
De esta forma ya solo se ejecuta el DCount una vez, al cargar y numerar el primer registro, pero sigue haciendo lo mismo que haci antes: inicializar las variables al finalizar de numerar. Eso si, ahora, ademas de definir la función Global Contador, tienes también que definir TotalRegistros. Quedaría así:
Global Contador As Integer
Global TotalRegistros As Integer
El campo en la consulta debe permanecer igual:
Cuentas: Cuentas([NombreDeUnCampoCualquiera])
Espero que esto solucione tu problema. Siento los errores de la respuesta anterior, pero es que no doy a basto para contestar a todos... je je je
Un saludo y ya sabes donde encontrarme si tienes dudas o problemas. Suerte en tu desarrollo!
Ósacr L.M.V.
Muy buenas Oscar, no hace caso del CEntero sigue haciendo lo mismo, es decir, remunera otra vez como le da la gana, al ejecutar la consulta otra vez.
Saludos. Harry105.
Saludos. Harry105.
Por lo que indicas, parce ser que esta tratando el campo que numera como cadena de texto en lugar de como numero... Por eso lo ordena así...
Haz una cosa, en la consulta sustituye el campo
Cuentas: Cuentas([NombreDeUnCampoCualquiera])
Por
Cuentas: CInt(Cuentas([NombreDeUnCampoCualquiera]))
Además, pon que el orden para este campo sea accedente y coloca este campo en el primer lugar de la consulta; es decir, la primera columna.
Esto debería corregirte cualquier tipo de problema. Si persiste no dudes en indicármelo, ya que estoy pensando que puede ser por otro motivo en el que estoy cayendo ahora... Pero antes de indicarte, prueba esto...
Haz una cosa, en la consulta sustituye el campo
Cuentas: Cuentas([NombreDeUnCampoCualquiera])
Por
Cuentas: CInt(Cuentas([NombreDeUnCampoCualquiera]))
Además, pon que el orden para este campo sea accedente y coloca este campo en el primer lugar de la consulta; es decir, la primera columna.
Esto debería corregirte cualquier tipo de problema. Si persiste no dudes en indicármelo, ya que estoy pensando que puede ser por otro motivo en el que estoy cayendo ahora... Pero antes de indicarte, prueba esto...
Se me acaban los recursos... je je je
Algo se me esta escapando de entender en tu consulta que esta haciendo que funcione así (ya que lo que yo he hecho para probar, creyendo simular tu caso, funciona perfectamente)...
¿Tienes inconveniente en hacerme llegar la BBDD? De esta forma podría ver cual esta siendo tu problema y concretarte la explicación...
Si no tienes inconveniente, puedes hacérmela llegar (compactada y comprimida con winzip, por favor) a [email protected]
Si tienes algún problema en enviármela por que contenga datos confidenciales, haz una copia de la BBDD y modifica los datos (ya que no necesito que sean los originales) y enviame esa copia, ok ¿?
Bueno, espero tu respuesta al respect, pero de verdad que se me están acabando las opciones...
Algo se me esta escapando de entender en tu consulta que esta haciendo que funcione así (ya que lo que yo he hecho para probar, creyendo simular tu caso, funciona perfectamente)...
¿Tienes inconveniente en hacerme llegar la BBDD? De esta forma podría ver cual esta siendo tu problema y concretarte la explicación...
Si no tienes inconveniente, puedes hacérmela llegar (compactada y comprimida con winzip, por favor) a [email protected]
Si tienes algún problema en enviármela por que contenga datos confidenciales, haz una copia de la BBDD y modifica los datos (ya que no necesito que sean los originales) y enviame esa copia, ok ¿?
Bueno, espero tu respuesta al respect, pero de verdad que se me están acabando las opciones...
- Compartir respuesta
- Anónimo
ahora mismo