Renumeración Automática
Publicado por eduard (16 intervenciones) el 01/09/2014 12:54:36
Hola, tengo un formulario "Filiació" unido a un subformulario "Visor" por el campo de texto "ID" y quisiera realizar en el subformulario:
- Numerar registros con Formato Numérico consecutivamente al crearlos.
- Al eliminar registros concretos, renumerar los registros de forma que vuelvan a quedar consecutivos.
Tengo un código que me proporcionó Neckitto, que yo adapté a mis necesidades y que funciona bien cuando el campo ID es numérico, pero si es texto no funciona, me podríais ayudar?
Os mando 2 ejemplos:
1 AutonumericoSubformUnicNum funciona ya que "ID" es numérico
2 AutonumericoSubformUnicText NO funciona ya que "ID" es texto (?¿)
Gracias!!!
Option Compare Database
Option Explicit
'Declaramos las variables a nivel de módulo
Dim vID As String
Dim idExaminat As Long
Dim I As Long
Dim miSql As String
Dim assignat As Boolean
Dim rst As DAO.Recordset
Private Sub New_Click()
DoCmd.GoToRecord , , acNewRec
'Variables declaradas a nivel de módulo
'Cogemos el valor que une formulario y subformulario
vID = Me.Id.Value
'Si no hay valor salimos
If vID = Null Then Exit Sub
'Creamos la SQL
miSql = "SELECT Visor.Identitat FROM Visor" _
& " WHERE Visor.ID=" & vID _
& " ORDER BY Visor.Identitat"
'Creamos el recordset sobre la consulta
Set rst = CurrentDb.OpenRecordset(miSql)
'Si no hay registros asignamos el valor 1
If rst.RecordCount = 0 Then
Me.Identitat.Value = 1
GoTo Salida
End If
'Inicializamos assignat
assignat = False
'Inicializamos i
I = 1
'Recorremos los registros de la SQL
With rst
.MoveFirst
Do Until .EOF
'Si no hay coincidencia en la numeración asignamos el número
'correlativo que corresponda, cambiamos assignat y salimos del DO
If .Fields("Identitat").Value <> I Then
Me.Identitat.Value = I
assignat = True
Exit Do
End If
I = I + 1
.MoveNext
Loop
End With
'Comprobamos si ya se ha assignat número. Si no se hubiera assignat le
'correspondería el siguiente al i analizado
If assignat = False Then
Me.Identitat.Value = I
End If
'---FASE 2: RENUMERACIÓN DE LOS IDENTIFICADORES
'Nos aseguramos de que la información esté guardada en la tabla
DoCmd.RunCommand acCmdSaveRecord
'Creamos la SQL de nuevo para capturar la nueva información
miSql = "SELECT Visor.Identitat FROM Visor" _
& " WHERE Visor.ID=" & vID _
& " ORDER BY Visor.Identitat"
'Creamos el recordset sobre la consulta
Set rst = CurrentDb.OpenRecordset(miSql)
'Contamos los registros existentes. Si no hubiera registros salimos del proceso
If rst.RecordCount = 0 Then GoTo Salida
'Inicializamos i
I = 1
'Realizamos un recorrido de los registros para asignar la numeración correlativa,
'si procede
With rst
.MoveFirst
Do Until .EOF
'Cogemos el valor del identificador
idExaminat = .Fields("Identitat").Value
'Miramos si no está bien ordenado
If idExaminat <> I Then
'Le asignamos la numaración que corresponda
.Edit
.Fields("Identitat").Value = I
.Update
End If
'Añadimos una unidad de i
I = I + 1
'Nos movemos al siguiente registro
.MoveNext
Loop
End With
'Refrescamos los datos en el formulario
Me.Refresh
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Sub
Private Sub Delete_Click()
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdDeleteRecord
'Variables declaradas a nivel de módulo
'Cogemos el valor que une formulario y subformulario
vID = Me.Id.Value
'Si no hay valor salimos
'If vID = 0 Then Exit Sub
If vID = Null Then Exit Sub
'Creamos la SQL
miSql = "SELECT Visor.Identitat FROM Visor" _
& " WHERE Visor.ID=" & vID _
& " ORDER BY Visor.Identitat"
'Nos aseguramos de que la información esté guardada en la tabla
DoCmd.RunCommand acCmdSaveRecord
'Creamos la SQL de nuevo para capturar la nueva información
miSql = "SELECT Visor.Identitat FROM Visor" _
& " WHERE Visor.ID=" & vID _
& " ORDER BY Visor.Identitat"
'Creamos el recordset sobre la consulta
Set rst = CurrentDb.OpenRecordset(miSql)
'Contamos los registros existentes. Si no hubiera registros salimos del proceso
If rst.RecordCount = 0 Then GoTo Salida
'Inicializamos i
I = 1
'Realizamos un recorrido de los registros para asignar la numeración correlativa, si procede
With rst
.MoveFirst
Do Until .EOF
'Cogemos el valor del identificador
idExaminat = .Fields("Identitat").Value
'Miramos si no está bien ordenado
If idExaminat <> I Then
'Le asignamos la numaración que corresponda
.Edit
.Fields("Identitat").Value = I
.Update
End If
'Añadimos una unidad de i
I = I + 1
'Nos movemos al siguiente registro
.MoveNext
Loop
End With
'Refrescamos los datos en el formulario
Me.Refresh
Forms.Filiació.Visor.Form.Recordset.MoveFirst
Forms.Filiació.Visor.Form.Recordset.MoveLast
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
DoCmd.SetWarnings True
End Sub
- Numerar registros con Formato Numérico consecutivamente al crearlos.
- Al eliminar registros concretos, renumerar los registros de forma que vuelvan a quedar consecutivos.
Tengo un código que me proporcionó Neckitto, que yo adapté a mis necesidades y que funciona bien cuando el campo ID es numérico, pero si es texto no funciona, me podríais ayudar?
Os mando 2 ejemplos:
1 AutonumericoSubformUnicNum funciona ya que "ID" es numérico
2 AutonumericoSubformUnicText NO funciona ya que "ID" es texto (?¿)
Gracias!!!
Option Compare Database
Option Explicit
'Declaramos las variables a nivel de módulo
Dim vID As String
Dim idExaminat As Long
Dim I As Long
Dim miSql As String
Dim assignat As Boolean
Dim rst As DAO.Recordset
Private Sub New_Click()
DoCmd.GoToRecord , , acNewRec
'Variables declaradas a nivel de módulo
'Cogemos el valor que une formulario y subformulario
vID = Me.Id.Value
'Si no hay valor salimos
If vID = Null Then Exit Sub
'Creamos la SQL
miSql = "SELECT Visor.Identitat FROM Visor" _
& " WHERE Visor.ID=" & vID _
& " ORDER BY Visor.Identitat"
'Creamos el recordset sobre la consulta
Set rst = CurrentDb.OpenRecordset(miSql)
'Si no hay registros asignamos el valor 1
If rst.RecordCount = 0 Then
Me.Identitat.Value = 1
GoTo Salida
End If
'Inicializamos assignat
assignat = False
'Inicializamos i
I = 1
'Recorremos los registros de la SQL
With rst
.MoveFirst
Do Until .EOF
'Si no hay coincidencia en la numeración asignamos el número
'correlativo que corresponda, cambiamos assignat y salimos del DO
If .Fields("Identitat").Value <> I Then
Me.Identitat.Value = I
assignat = True
Exit Do
End If
I = I + 1
.MoveNext
Loop
End With
'Comprobamos si ya se ha assignat número. Si no se hubiera assignat le
'correspondería el siguiente al i analizado
If assignat = False Then
Me.Identitat.Value = I
End If
'---FASE 2: RENUMERACIÓN DE LOS IDENTIFICADORES
'Nos aseguramos de que la información esté guardada en la tabla
DoCmd.RunCommand acCmdSaveRecord
'Creamos la SQL de nuevo para capturar la nueva información
miSql = "SELECT Visor.Identitat FROM Visor" _
& " WHERE Visor.ID=" & vID _
& " ORDER BY Visor.Identitat"
'Creamos el recordset sobre la consulta
Set rst = CurrentDb.OpenRecordset(miSql)
'Contamos los registros existentes. Si no hubiera registros salimos del proceso
If rst.RecordCount = 0 Then GoTo Salida
'Inicializamos i
I = 1
'Realizamos un recorrido de los registros para asignar la numeración correlativa,
'si procede
With rst
.MoveFirst
Do Until .EOF
'Cogemos el valor del identificador
idExaminat = .Fields("Identitat").Value
'Miramos si no está bien ordenado
If idExaminat <> I Then
'Le asignamos la numaración que corresponda
.Edit
.Fields("Identitat").Value = I
.Update
End If
'Añadimos una unidad de i
I = I + 1
'Nos movemos al siguiente registro
.MoveNext
Loop
End With
'Refrescamos los datos en el formulario
Me.Refresh
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Sub
Private Sub Delete_Click()
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdDeleteRecord
'Variables declaradas a nivel de módulo
'Cogemos el valor que une formulario y subformulario
vID = Me.Id.Value
'Si no hay valor salimos
'If vID = 0 Then Exit Sub
If vID = Null Then Exit Sub
'Creamos la SQL
miSql = "SELECT Visor.Identitat FROM Visor" _
& " WHERE Visor.ID=" & vID _
& " ORDER BY Visor.Identitat"
'Nos aseguramos de que la información esté guardada en la tabla
DoCmd.RunCommand acCmdSaveRecord
'Creamos la SQL de nuevo para capturar la nueva información
miSql = "SELECT Visor.Identitat FROM Visor" _
& " WHERE Visor.ID=" & vID _
& " ORDER BY Visor.Identitat"
'Creamos el recordset sobre la consulta
Set rst = CurrentDb.OpenRecordset(miSql)
'Contamos los registros existentes. Si no hubiera registros salimos del proceso
If rst.RecordCount = 0 Then GoTo Salida
'Inicializamos i
I = 1
'Realizamos un recorrido de los registros para asignar la numeración correlativa, si procede
With rst
.MoveFirst
Do Until .EOF
'Cogemos el valor del identificador
idExaminat = .Fields("Identitat").Value
'Miramos si no está bien ordenado
If idExaminat <> I Then
'Le asignamos la numaración que corresponda
.Edit
.Fields("Identitat").Value = I
.Update
End If
'Añadimos una unidad de i
I = I + 1
'Nos movemos al siguiente registro
.MoveNext
Loop
End With
'Refrescamos los datos en el formulario
Me.Refresh
Forms.Filiació.Visor.Form.Recordset.MoveFirst
Forms.Filiació.Visor.Form.Recordset.MoveLast
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
DoCmd.SetWarnings True
End Sub
- AutonumericoSubformUnicNum.zip(35,0 KB)
- AutonumericoSubformUnicText.zip(34,7 KB)
Valora esta pregunta


0