Enumerar campo según campo fecha en tabla

Espero que puedan darme una solución a la siguiente cuestión.

Tengo una tabla TAsociados, donde se encuentran los socios activos, que entre otros campos tiene un campo NSocio y un campo FechaInscripción, lo que desearía es que dependiendo de la fecha el socio tenga un número.

Para aclarar un poco: si hay diez socios que están numerados del 1 al 10 desde el más antiguo al más nuevo. Si se da de baja el socio nªº4, el socio que era el 5, pasaría a ser el 4. Y entonces los socios estrían enumerados del 1 al 9. Con la idea de que cada vez que se de alta o baja a los socios, estos estén enumerados.

1 respuesta

Respuesta
3

Si bien lo que pides ni es complicado de hacer, antes de darte la solución me gustaría comentarte que si esa tabla está relacionada con alguna otra de tu BD por el NSocio (que no lo sé), puedes tener un problema muy gordo si los cambias, según como tengas montadas las relaciones...

Dicho eso, el código que puedes utilizar para renumerar sería éste:

Public Sub reNumera()
Dim num As Integer
Dim rst As DAO.Recordset
'Inicializamos el contador
num = 1
'Abrimos el recordset
Set rst = CurrentDb.OpenRecordset("SELECT NSocio FROM TAsociados ORDER BY [FechaInscripción]" , dbOpenDynaset)
'Si no hay registros salimos del proceso
If rst.RecordCount = 0 Then GoTo Salida
'Nos movemos al primer registro
With rst
  .MoveFirst
  'Comenzamos el proceso de recorrido de registros
  Do Until .EOF
  'Cambiamos la numeración del registro actual
     .Edit
     .Fields("NSocio ")= num
     .Update
     'Añadimos una unidad al contador
     num = num + 1
     'Nos movemos al siguiente registro
     .MoveNext
   Loop
End With
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Sub

Este código lo pones en un módulo nuevo de tu BD, y llamarías al procedimiento cada vez que borres un registro o crees uno nuevo, simplemente poniendo el nombre del procedimiento.

Un saludo.


Muchas gracias  Sveinbjorn por tu interés.

He creado el módulo con el código que me has indicado, llamándolo reNumera, y lo llamo dentro de un código que también me pasaste hace tiempo por otra consulta, te pongo el código:

Private Sub Form_Close()

If DCount("*", "TAsociados", "Baja=-1") > 0 Then
If MsgBox("Se han marcado uno o varios Socios para su baja, ¿Quieres darles de baja y que pasen a Socios de Baja?", vbYesNo) = vbYes Then
CurrentDb.Execute "SocioBajaAnexar"
CurrentDb.Execute "SocioBajaEliminar"
MsgBox "Traspaso realizado", vbOKOnly
End If

End If

reNumera

End Sub

Pero me sale el error: 

"Error de compilación"

"Se esperaba una variable o un procedimiento, no un módulo"

Solo indicarte que el nombre del campo NSocio es en realidad Nº Socio, pero creo que no tiene nada que ver, ya que lo he puesto entre corchetes en el código de reNumera.

Que puede estar mal?

Y de nuevo gracias por tu interés.

un saludo

No puedes llamar igual a un módulo que un procedimiento o función, pues si lo haces no sabrá a que te estás refiriendo, si al módulo o al procedimiento /función

Gracias por contestar tan rápido. He cambiado el nombre del módulo quedando el código así:

Private Sub Form_Close()

If DCount("*", "TAsociados", "Baja=-1") > 0 Then
If MsgBox("Se han marcado uno o varios Socios para su baja, ¿Quieres darles de baja y que pasen a Socios de Baja?", vbYesNo) = vbYes Then
CurrentDb.Execute "SocioBajaAnexar"
CurrentDb.Execute "SocioBajaEliminar"
MsgBox "Traspaso realizado", vbOKOnly

Call EnumeraSocios

End If

End If

End Sub

Y sigue saliendo el mismo mensaje de error.

un saludo

¿Qué es enumera socias? ¿El módulo?

Lo que tienes que poner es el nombre del procedimiento, no del módulo...

Si el código de mi primera respuesta lo dejaste tal cual, la linea que has de poner es:

Call reNumera

Y aunque no creo que venga por ahí el error, revisa si los nombres que puse en la SQL son los correctos

Gracias el código estaba perfecto, he sido yo que me he liado un poco con los nombres, además de no tener algunas cosas de Access muy claras.

He realizado varias comprobaciones y me he dado cuenta de que hace algunas cosas raras al eliminar algún socio, en concreto con los socios que tienen la misma fecha de inscripción, si se elimina uno de esos socios, a los socios que quedan con la misma fecha les vuelve a cambiar el numero, habría alguna manera de realizar un segundo ordenamiento dentro del primero.

Ordena el recordset por fecha y NSocio, a ver si así te vale:

Set rst = CurrentDb.OpenRecordset("SELECT NSocio FROM TAsociados ORDER BY [FechaInscripción], NSocio" , dbOpenDynaset)

¡Gracias!  con tu última sugerencia queda perfecto.  Por mí el hilo queda cerrado.

Sveinbjorn Sólo puedo darte las gracias por tu ayuda e interés.

un saludo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas