|
|
Tablas : fCounter (campo contador)
| Autor/es: Juan M Afán de Ribera Màrius Puig | Pregunta : Sé cómo generar un número correlativo en un campo numérico. Pero me gustaría saber cómo puedo generar un número correlativo en un campo numérico y que además tenga en cuenta los huecos dejados por anteriores eliminaciones de registros. Es decir, suponiendo que los valores de ese campo numéricos fueran, por ejemplo: 1, 2, 3, 5, 6, 8, 9, 11, querría un código que me diera como resultado el 4. Una vez añadido el 4, la siguiente vez debería devolverme el 7, la siguiente el 10 y la siguiente el 12.
¿Cómo puedo hacerlo? | Respuesta : Una manera de hacerlo sería abrir un recordset de esa tabla e ir recorriendo los registros comparando los valores de ese campo con los del registro anterior, hasta encontrar el primer hueco en donde el valor no fuera correlativo. Pero este método tal vez empiece a consumir demasiado tiempo, una vez la tabla tenga unos cuantos miles de registros.
Para ganar rapidez, siempre será mejor si lo podemos implementar con una instrucción SQL. Y eso es lo que hace la función fCounter, la cual consta de los siguientes | Argumentos | Argumento | Descripción | | FieldName | Requerido. Nombre del campo numérico | | TableName | Requerido. Nombre de la tabla donde reside el campo numérico | | DbPath | Opcional. Nombre y ruta completa de la base de datos donde resida el campo numérico. Si se omite este argumento o es una cadena vacía (""), la función buscará en la base de datos actual. |
| | Ejemplo de uso: | SiguienteNumero = fCounter("campo_numerico", "Tabla")
| '---------------------------------------------------------
'
' fCounter
'
' Código escrito originalmente por Màrius Puig y Juan M.
' Afán de Ribera.
' Estás autorizado a utilizarlo dentro de una aplicación
' siempre que esta nota de autor permanezca inalterada.
' En el caso de querer publicarlo en una página Web,
' por favor, contactar con los autores en
'
' accessvbafaq@ya.com
'
' Este código se brinda por cortesía de
' Màrius Puis
' Juan M. Afán de Ribera
'
Function fCounter( _
FieldName As String, _
TableName As String, _
Optional DbPath As String) As Long
Dim SQL As String
Dim db As Object 'DAO.Database
Dim rst As Object 'DAO.Recordset
On Error GoTo fCounter_Error
SQL = "SELECT " & FieldName _
& " FROM " & TableName _
& " WHERE " & FieldName & " = 1"
If DbPath = "" Then
Set db = CurrentDb
Else
Set db = DBEngine.OpenDatabase(DbPath)
End If
Set rst = db.OpenRecordset(SQL, DB_OPEN_SNAPSHOT)
If rst.EOF Or rst.BOF Then
fCounter = 1
Else
SQL = "SELECT " & TableName & "." & FieldName & " + 1" _
& " FROM " & TableName _
& " LEFT JOIN " & TableName & " AS TMP" _
& " ON " & TableName & "." & FieldName & " + 1" _
& " = TMP." & FieldName _
& " WHERE TMP." & FieldName & " IS NULL" _
& " ORDER BY " & TableName & "." & FieldName
Set rst = db.OpenRecordset(SQL)
fCounter = rst(0)
End If
exit_Function:
If Not rst Is Nothing Then rst.Close
Set rst = Nothing
If Not db Is Nothing Then db.Close
Set db = Nothing
On Error GoTo 0
Exit Function
fCounter_Error:
MsgBox "Error " & Err.Number & " (" & Err.Description & ")"
Resume exit_Function
End Function
'---------------------------------------------------------
| Ejemplos: | Temas relacionados: ResetNumber Campo contador |
|