viernes, 2 de agosto de 2013

ROWNUM en ACCESS (solución)

Al parecer muchos han buscado este tema y si bien ya había puesto una posible solución creo no fue la mejor solución para todos.

Pues bueno, creo que esta les funcionará mejor.

Primero, tengo esta tabla:


Así, sin más, solo 2 columnas con datos cualesquiera de tipo texto.


Ahora, en Access creamos 2 funciones públicas:


Declaran esta variable de tipo pública (ID)



Aquí el código para que lo copien y peguen:

Public Function RN(valor As Variant) As Double
    If valor = 1 Then
        ID = 0
        RN = ID
    End If
End Function

Public Function Rownum(valor As Variant) As Double
   ID = ID + 1
   Rownum = ID
End Function

Y solo queda usarlo.... desde código VB el ejemplo:



Bueno, dentro de la función test() hago un primer Select y tal cual me traigo todo de la tabla y lo pinto en la ventana del debug, excepto la primera columna, que el dato no nos sirve para nada pero es necesario para que la función Rownum funcione correctamente.

En el segundo Select hago un filtro por datos y el Rownum que me genera por cada renglón es correcto.

Bueno, este ejemplo es generándolo por código, pero también por consulta en Access


Y el resultado


Pues bueno, espero sea esto lo que realmente necesitan.

Comentarios, mejoras o sugerencias ... 





6 comentarios:

  1. Más fácil así ¿no?

    SELECT Top 10 * FROM TableName ORDER BY Field1 ASC

    ResponderBorrar
    Respuestas
    1. Si lo que se requiere es obtener los 10 primeros sería la solución indicada. Pero si requieres indexar (por llamarlo de alguna forma) tus resultados y utilizar ese índice para moverte entre ellos requieres entonces un rownum, y con base a ese requerimiento es que se sugiere esta solución.

      Borrar
  2. Hola, me encuentro trabajando en una BD para una colección de libros en ACCESS, en la que puede haber más de una copia de cada uno, y deseo que se realice automáticamente la cuenta de los ejemplares, ¿podrías indicarme alguna forma de abordar el problema?

    Gracias!

    NOL

    ResponderBorrar
    Respuestas
    1. No sé si me quedó del todo claro a que te refieres con que se realice automáticamente?

      Para hacer un conteo, podrías usar algo como esto:

      SELECT Titulo_libro, COUNT(*)
      FROM Catalogo_Libros
      GROUP BY Titulo_libro;

      Solo sustituye el nombre de tu tabla y columna del título del libro.

      Si entendí bien eso de que se realice automáticamente? te refieres a que se ejecute un reporteador cada X intervalo de tiempo, generando el reporte y se envíe por correo o algo así?

      En manejadores de base de datos más grandes y completos como Oracle, SQL Server, etc., puedes programar "tareas" que se ejecutan en el momento indicado y realizar acciones de ese tipo. En ACCESS, tendrías que desarrollar tu propio programa para hacer algo así, y que se ejecute el reporte según el intervalo de tiempo que le definas. O, en su defecto, que el programa sea lanzado por el servicio de tareas de windows (taskschd.msc /s).

      Espero sea eso a lo que te refieres.

      Borrar
  3. Hola, estoy trabajando en una bd en acess, tiene que calcular las existencias y su valor bajo el esquema PEPS, a manera de ejemplo registre dos entradas al almacen del mismo articulo en diferentes fechas y precios, al generar las existencias resta las unidades vendidas de los dos registros.

    Saben como puedo implementar correctamente esto?

    ResponderBorrar

Translate