Actualizar correlativos dentro de un subformulario

Dentro de un subformulario "Dasientos" tengo el campo "cn" que al recibir en enfoque se va incrementado en 1 cada vez que se ingresa un nuevo registro, pero al borrar uno de esos registros, la numeración deja de ser correlativa. Como puedo lograr que se actualice y todos los registros tenga "cn" correlativos

Este es el código ingresado en el campo con al recibir el enfoque:

If Me.NewRecord Then
Me.cn = Nz(DMax("cn", "Dasientos"), 0) + 1
End If

2

2 respuestas

Respuesta
1

Me gusta ir más seguro prefiero recorrer el recordset  borrar con DELETE y actulizar con UPDATE. En este ejemplo el campo cn es entero largo y valor predeterminado cero (0) no se puede colocar como clave principal SIN duplicados... no funcionaría.

TABLA

FORMULARIO 

El campo cn está bloqueado y sin punto de tabulación.

EVENTOS DEL FORMULARIO

El formulario tiene una función incorporada para obtener el siguiente número de cn:

Función para obtener el nuevo cn:

Function nuevo() As Long

nuevo = Nz(DMax("cn", "Dasientos"), 0) + 1
End Function

Procedimientos del formulario:

Tiene como fin habilitar y deshabilitar el botón de eliminación cuando se encuentra en un registro nuevo.

Al Activar Registro

Private Sub Form_Current()
   If Me.NewRecord Then
    Me.cmdElimina.Enabled = False
    Exit Sub
   Else
     Me.cmdElimina.Enabled = True
   End If
End Sub

Contiene tres (3) botones de comando: Agregar, Eliminar y Agregar.

Código botón Agregar:

Private Sub cmdAgregar_Click()

DoCmd.GoToRecord , , acNewRec
Me.cn = nuevo()
Me.algo.SetFocus

End Sub

El botón Eliminar tiene este código;

Private Sub cmdElimina_Click()

On Error GoTo hay_err

  Dim db As Database
  Dim rs As Recordset
  'Retiro el registro
  If MsgBox("¿Está seguro de retirar el cn " & Me.cn & "?", vbQuestion + vbYesNo + vbDefaultButton2, "Retirar cn") = vbYes Then
   DoCmd.SetWarnings (False)
   DoCmd.RunSQL "DELETE * FROM Dasientos WHERE cn=" & Val(Me.cn) & ";"
   DoCmd.RunSQL "UPDATE Dasientos SET cn=0 WHERE cn>0;"
    Me.Requery
    Me.Refresh
  Else
    Exit Sub
  End If
  'Edito el consecutivo cn
  Set db = CurrentDb
  Set rs = db.OpenRecordset("Dasientos")
    Do Until rs.EOF
       rs.Edit
       rs!cn = nuevo()
       rs.Update
       rs.MoveNext
    Loop
  rs.Close
  db.Close
  Set rs = Nothing
  Set db = Nothing
hay_err_exit:
   Exit Sub
hay_err:
   MsgBox Err.Number & " " & Err.Description, vbInformation, "Error.."
   Resume hay_err_exit
End Sub

El botón Guardar tiene una macro incrustada creada con el asistente, aunque no soy partidario de las macros lo hice en este ejemplo.

Ejemplo, vamos a retirar el cn=2, Verde de acuerdo con la figura de la tabla y vamos a adicionar un registro en el campo algo=Negro.

Este es el reultado no está el registro anterior que era cn=2 y algo=Verde, el algo=Rosado que estaba en cn=3 pasó a 2.  Y el negro quedó en el cn=5

Bueno no sé si esta era tu inquietud, si quieres el ejemplo escríbeme a [email protected]

Gracias por responder, pero me surge una duda, como lo aplico si la información esta dentro de un subformulario.

Saludos cordiales

Luis

El formulario debes estar definido como continuo y colocas los botones al lado, hay otra forma dejar los botones en formulario principal pero requiere de más código

Respuesta
1

De entrada, yo no usaría esa expresión. Pondría simplemente, en el evento, al recibir el enfoque de ese cuadro

If isnull([cn]) then

cn=me.currentrecord

end if

Me explico, si vas a un registro nuevo, y pones el cursor en el cuadro de texto CN le da el valor correspondiente al registro actual. Y si te desplazaras por los registro, como CN ya tiene valor no lo modifica.

Y para cuando borres algún registro pondría un botón y en el evento al hacer clic

docmd.setwarnings false

docmd.gotorecord,,acfirst

dim i as integer

for i=1 to form.recordset.recordcount

cn=me.currentrecord

docmd.gotorecord,,acnext

next

Es decir, que cuando pulses el botón se vaya al primer registro. Que le ponga a CN el valor del registro actual, que se vaya al siguiente registro.,... y así hasta el final del formulario

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas