Como rellenar un campo respecto a otro

Quisiera que al abrir un formulario en una tabla llamada TSocios el campo Codigo Socio se rellenara solo incrementando en 1 al ultimo valor de dicho campo en esa tabla, es decir si el ultimo socio que hubiera fuese el 45 al abrir de nuevo ese formulario pusiese 46 de forma automatica.

2 respuestas

Respuesta
1

Lo más sencillo es convertir el campo 'Codigo Socio' en la clave principal de la tabla 'TSocios' y definir su tipo de datos como Autonumérico. En el formulario en ese campo no te permitirá escribir nada ya que se inscribirá el siguiente valor automáticamente en cuanto escribas algo en cualquier otro campo (por eso se suele cambiar la propiedad Habilitado o Enabled a No en ese campo del formulario para no intentar poner el nuevo valor y que se presente el mensaje de que no se puede editar el campo...).

También se podría calcular un autonumérico por código simulando esta funcionalidad, pero en tu caso lo lógico parece ser usar el tipo de datos Autonumérico directamente en la tabla.

Cordiales saludos.

Gracias por contestar ante todo.La tabla ya tiene un id autonumérico y que es clave principal, lo que quería es que ese campo hiciera lo mediante código ya que sí se borra algún registro o algo es código vaya correlativo.

Gracias

Te copio código para hacerlo de ese modo.

Private Sub Form_BeforeInsert(Cancel As Integer)
On Error GoTo Err_Form_BeforeInsert
    Dim miBD As Database, misRegistros As Recordset, miSQL As String, miValor As Integer
    Set miBD = CurrentDb
    miSQL = "SELECT Max(TSocios.[Codigo Socio]) AS MáxDeId FROM TSocios;"
    Set misRegistros = miBD.OpenRecordset(miSQL, dbOpenSnapshot)
    miValor = misRegistros!MáxDeId + 1
    misRegistros.Close
    Set miBD = Nothing
    Me.NombreDelCampoCodigoSocioEnElFormulario = miValor
Exit_Form_BeforeInsert:
    Exit Sub
Err_Form_BeforeInsert:
    MsgBox Err.Description
    Resume Exit_Form_BeforeInsert
End Sub

En este ejemplo sustituye NombreDelCampoCodigoSocioEnElFormulario  por el nombre en cuestión.

Si lo asocias al evento Antes de insertar del formulario verás que en cuanto escribes un carácter en cualquier campo del mismo te aparecerá el siguiente número en el campo Codigo SOcio.

Cordiales saludos.

Buenos días ese código que es para un subformulario o vale para el formulario en sí, y otra cosa más el formulario en cuestión lo quiero para dar altas nuevas es decir tiene permitida entrada de datos, ¿funcionaria igual? Y en evento tendría que ser ese o podría ser al cargar el formulario para que estuviera ya puesto antes de escribir nada y no se pudiera modificar,

Un saludo

Debe de valer para un formulario y para un subformulario.

Debe de funcionar en un formulario con Entrada de datos=Sí.

También debe de funcionar en el evento al cargar.

Cordiales saludos.

Buenas tardes, he colocado el siguiente código como me indicaste:


Private Sub Form_Load()
On Error GoTo Err_Form_BeforeInsert
Dim miBD As Database, misRegistros As Recordset, miSQL As String, miValor As Integer
Set miBD = CurrentDb
miSQL = "SELECT Max(TSocios.[Codigo Socio]) AS MáxDeId FROM TSocios;"
Set misRegistros = miBD.OpenRecordset(miSQL, dbOpenSnapshot)
miValor = misRegistros!MáxDeId + 1
misRegistros.Close
Set miBD = Nothing
Me.Codigo_Cliente = miValor
Exit_Form_BeforeInsert:
Exit Sub
Err_Form_BeforeInsert:
MsgBox Err.Description
Resume Exit_Form_BeforeInsert
End Sub

y cuando vas a poner tanto en este evento como al cargar formulario me dice que pocos parámetros se esperaba 1. y pone un 0 en esa casilla

en la tabla tSocios hay dos registros con codigo cliente 1 y el otro con codigo cliente 2.

y sino hubiera deberia poner al primero el 1 no?.

SI vas a usar el código en el evento Load tiene que quedarte algo así como:

Private Sub Form_Load()
On Error GoTo Err_Form_Load
    Dim miBD As Database, misRegistros As Recordset, miSQL As String, miValor As Integer
    Set miBD = CurrentDb
    miSQL = "SELECT Max(TSocios.[Codigo Socio]) AS MáxDeId FROM TSocios;"
    Set misRegistros = miBD.OpenRecordset(miSQL, dbOpenSnapshot)
    miValor = Nz(misRegistros!MáxDeId, 0) + 1
    misRegistros.Close
    Set miBD = Nothing
    Me.Id = miValor
Exit_Form_Load:
    Exit Sub
Err_Form_Load:
    MsgBox Err.Description
    Resume Exit_Form_Load
End Sub

Al añadir Nz(.... comenzará a numerar por el 1 si no existen registros en la tabla.

El error que indicas 'pocos parámetros se esperaba 1' se produce cuando la SQL falla por no encontrar la tabla o el campo... Mira como lo tienes escrito. Puedes usar el generador de consultas para hacerla y luego ver la consulta en vista SQL y copiar ese texto en el código en lugar del que te envío. De ese modo te evitas errores en nombrar por ejemplo el campo Codigo_cliente como [Codigo cliente] o de cualquier forma parecida pero no correcta.

Cordiales saludos.

¡Muchísimas Gracias! Ahora ya funciona perfectamente.

Y por ultimo que código puedo poner y donde para que si se cierra el formulario sin escribir nada no corra el registro es decir no se guarde?.

Un saludo

Puedes hacerlo de varias formas. Te explico una muy sencilla y te copio el código. Pon un botón en el formulario que se llame por ejemplo Cerrar. En el evento hacer click del botón copia el código que te adjunto. En el verás que se comprueba el valor que exista en un campo del formulario (vale cualquiera que no sea Codigo Socio ya que en este si hemos inscrito un valor al cargar el formulario). SI no hay nada en ese campo 'deshace' los cambios en el registro activo y sale del formulario sin guardar el registro.

Cordiales saludos.

Private Sub Cerrar_Click()
On Error GoTo Err_Cerrar_Click
    If IsNull(Me.Fecha1) Then
        DoCmd.RunCommand acCmdUndo
        DoCmd.Close acForm, Me.Name, acSaveNo
    End If
Exit_Cerrar_Click:
    Exit Sub
Err_Cerrar_Click:
    MsgBox Err.Description
    Resume Exit_Cerrar_Click
End Sub
Respuesta

Lo primero que quiero decir es cuánto aprecio tu respuesta. Aunque la clave principal de la tabla es un número generado automáticamente, necesitaba que este campo se actualizara cada vez que se modificaba o eliminaba un registro de la tabla para reflejar ese cambio mediante código. geometry dash

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas