Actualizar números asignados a los registros de una tabla.

Tengo un formulario dependiente de una tabla "T_Socios" donde se van introduciendo los datos personales de cada socio. Cada registro tiene un campo [Nº de Socio].- La idea es que cuando se da alta a un nuevo socio, el sistema le asigne el numero de orden que le corresponda como socio. Y que cuando se produzca la baja de algún socio, el sistema actualice el listado de socio, asignándole a cada registro el nuevo número que le corresponda.

Espero haber plasmado bien la idea.- Yo he probado con un campo de tipo autonumérico, pero no se puede.

¿Alguna sugerencia?

2 respuestas

Respuesta
2

No veo muy claro que "renumeres" a los socios cuando hay bajas, pero poder sí se puede hacer, con un código como este, que puedes poner en un botón, en el código donde eliminas socios, para que se ejecute cada vez que abres la BD...:

Dim rst As DAO.Recordset
Dim i as Long
Set rst=CurrentDb.OpenRecordset("T_Socios",dbOpenTable)
If rst.Recordcount>0 Then
  rst.MoveFirst
  i=1
  Do Until rst.EOF
    rst.Edit
    rst("Nº de Socio")=i
    rst.Update
    i=i+1
    rst.MoveNext
  Loop
End If
Rst. Close

Ten cuidado si tienes otras tablas que dependan de ese Nº de socio, no la vayas a "liar" al hacer la renumeración...

¡Gracias! Sveinbjorn El Rojo: El [Nº de Socio] es solo un dato que nos sirve para controlar la antigüedad de cada socio dentro de la organización, pero el valor de este campo no interactúa con otras partes de la Bd. por lo que no puede ser causa de conflicto. 

Para la asociación es importante mantener actualizado este dato porque, dependiendo del número de socio que se tenga, se pueden obtener ciertos beneficios dentro de la entidad. De ahí la necesidad de actualizar estos números cuando se producen bajas.

He puesto el código que  me indicas  y resulta que cuando hago clic en el botón para actualizar los [Nº de Socio],  me descoloca los demás. A ver si soy capaz de explicarme bien: lo que necesito es que si, por el ejemplo, el socio nº 25 causa baja, el que tenia el nº 26, pase a ser el 25, el que tenia el 27, pase al 26, y así sucesivamente. y los que estan por debajo, es decir, el 24, 23, 22.... mantengan el mismo que tienen.

Ahora, con este código,  me reordena los números de socio, pero se los asigna aleatoriamente a los registros ordenándolos por el DNI "campo llave" en orden ascendente.  

Pues no debería si en la tabla los nº de socio van secuenciales, pero cambia la línea del set rst... del código anterior por esta otra:

Ser rst=CurrentDb.Openrecordset ("SELECT * FROM T_Socios ORDER BY [Nº de SOCIO]")

Perfecto,  ahora va de lujo. Muchas gracias MAESTRO

Si me permites abusar un poco más de tus conocimientos, me gustaría que si no es mucha molestia, me orientes sobre otra cuestión de esta misma parte.

Como se muestra en el formulario en vista diseño, la parte de color amarillo la tengo oculta y se hace visible cuando se activa la casilla de verificación "Dar de Baja", entonces se hace visible y se introduce la información de la baja.

Que podría hacer para que cuando introduzca la fecha de faja, se me rellenen los campos de la antigüedad en años. meses y días. Yo lo he intentado y he conseguido que me ponga los años con esto Int(([Fecha_Alta]-[Fecha_Baja])/365.25), pero los meses y días, no consigo sacarlos. 

Por otro lado, como podría conseguir que cuando se elimine un registro, sus datos pasen a otra tabla "T_Historico" par que no se  pierdan.?

Muchisimas gracias

cuando elimine a un socio por causar baja, sus datos pasen a otra tabla

Muchas preguntas para tan "poca" valoración... jejeje

Te respondo brevemente:

1º/ En esta respuesta tienes una función que calcula la diferencia entre dos fechas en años, meses y días. O bien coges los cálculos que te interesan para los meses y días, o adaptas el código para que te los ponga en tus cuadros de texto.

2º/ Ejecuta una consulta de inserción de datos para pasar el registro (antes de eliminarlo) a la otra tabla: https://www.w3schools.com/sql/sql_insert_into_select.asp

Amigo Sveinbjorn El Rojo, Soy nuevo en esto y aun no le he pillado bien el rollo a eso de las votaciones. Ni que decir que tus consejos y opiniones y la del los demás expertos es valiosísima para nosotros los aprendices. Por supuesto que mi valoración es la máxima para todo el que dedique su tiempo a iluminar el camino de los demás. Es más si algún día vienes por Sevilla, pasate por Carmona, estas invitado en la Peña Cultural Bética. MUSCHISIMAS GRACIAS por tu ayuda.

No me lo digas dos veces, que aunque gallego, también soy bético..., jajajaja

Pues entonces con más motivo, mi peña es la tuya, y sirva esta frase para confirmar esa invitación. 

Por cierto,  la bd de datos que estoy intentando construir, es para dotar a mi peña, que es la segunda mas antigua de España, de una herramienta que facilite, a nivel de usuario, la llevanza administrativa del día a dia de la entidad, de la que soy el actual presidente, y que se encuentra muy atrasada en el uso de estas tecnologías. Ni que decir tiene que se trata de un proyecto altruista al que dedico todo el tiempo que mi condición de jubilado me permite.

Gracias de nuevo, amigo.

¿Conseguiste solucionar los otros dos puntos pendientes?

En lo que respecta al establecimiento de la antigüedad en años, meses y días, le he puesto un botón y en el evento al hacer clic, he puesto el puesto el código adaptado para que me ponga los valores por separado en los cuadros de texto, y funciona bien con este código.

Private Sub Comando160_Click()

'Calcula la diferencia en años
If Month(Fecha_alta) > Month(Fecha_baja) Then
Me.Años = DateDiff("yyyy", Fecha_alta, Fecha_baja) - 1
Else
Me.Años = DateDiff("yyyy", Fecha_alta, Fecha_baja)
End If

'Calcula la diferencia en meses
If Day(Fecha_alta) > Day(Fecha_baja) Then
Me.Meses = DateDiff("m", DateAdd("yyyy", Me.Años, Fecha_alta), Fecha_baja) - 1
If Me.Meses < 0 Then
Me.Meses = 12 + Me.Meses
Me.Años = Me.Años - 1
End If
Else
Me.Meses = DateDiff("m", DateAdd("yyyy", Me.Años, Fecha_alta), Fecha_baja)
End If

'Calculas la diferencia en días
Me.Dias = DateDiff("d", DateAdd("m", Me.Años * 12 + Me.Meses, Fecha_alta), Fecha_baja) ' Mod 7


Exit Sub

End Sub

Me faltaría poner ponerle algo al código para vaciar los campos en caso de que el valor del campo [fecha_baja] estuviera vacío. Lo he intentando poniendo valor Null pero no funciona.

En lo que respecta al otro punto, aun no lo he hecho, esta tarde me pondré con ello y ya te contaré

Podrías poner:

Private Sub Comando160_Click()
If IsNull(Me.Fecha_Baja) Or Not IsDate(Me.Fecha_Baja) Then
Me.Años=Null: Me.Meses=Null: Me.Dias=Null
Exit Sub
End If
'Y aquí todo el código que ya tienes
...
End Sub

Te digo cómo lo hubiera hecho yo:

En vez de poner un botón para calcular la antigüedad, lo hubiera programado (con el mismo código que has puesto en el botón y lo nuevo que te comento arriba) en el evento "Después de actualizar" del cuadro de texto Fecha _Baja.

Otra posibilidad a tener en cuenta es que si no hay fecha de baja, calcule (y muestre) la antigüedad hasta el día actual, para lo cual solo tendrías que cambiar en tu código inicial todos los Fecha_Baja por Nz(Fecha_Baja, Date).

Lo he puesto como dices, sin el botón queda mejor, lo he puesto así


If IsNull(Me.Fecha_baja) Or Not IsDate(Nz(Fecha_baja, Date)) Then
Me.Años = Null: Me.Meses = Null: Me.Dias = Null
Exit Sub
End If
'Calcula la diferencia en años
If Month(Fecha_alta) > Month(Nz(Fecha_baja, Date)) Then
Me.Años = DateDiff("yyyy", Fecha_alta, Nz(Fecha_baja, Date)) - 1
Else
Me.Años = DateDiff("yyyy", Fecha_alta, Nz(Fecha_baja, Date))
End If

'Calcula la diferencia en meses
If Day(Fecha_alta) > Day(Fecha_baja, Date)) Then
Me.Meses = DateDiff("m", DateAdd("yyyy", Me.Años, Fecha_alta), Nz(Fecha_baja, Date)) - 1
If Me.Meses < 0 Then
Me.Meses = 12 + Me.Meses
Me.Años = Me.Años - 1
End If
Else
Me.Meses = DateDiff("m", DateAdd("yyyy", Me.Años, Fecha_alta), Nz(Fecha_baja, Date))
End If

'Calculas la diferencia en días
Me.Dias = DateDiff("d", DateAdd("m", Me.Años * 12 + Me.Meses, Fecha_alta), Nz(Fecha_baja, Date)) ' Mod 7


Exit Sub

End Sub

Como se puede ver, también he sustituido los "Fecha_Baja" * Nz(Fecha_Baja, Date) creí haberte entendido que esto era para que sacara los valores al día de hoy aunque el campo fecha_Baja estuviera vacío, pero algo abre hecho mal por que no me los saca.

Si vas usar la propuesta del Nz(Fecha_baja, Date), no tienes que poner el If IsNull().. del principio.

O una cosa o la otra, pero las dos, no... XDD

Respuesta
1

Usa DMax con sus argumentos +1 pero sólo para añadir registros, no renumeres a los socios anteriores jamás. La base datos se volvería loca.

¡Gracias! por el consejo Amigo Kumbus, verás, te comento: el número de socio es solo un dato, no interactúa con otras partes de la Bd. Solo Sirve para controlar la antigüedad de cada socio dentro de la entidad, es decir que en función del numero de socio que se tenga, se pueden obtener ciertos beneficios dentro de la organización.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas