REINICIAR UN CAMPO AUTONUMÉRICO POR CÓDIGO SIN COMPACTAR LA BASE DE DATOS. Antes que nada, he de decir que no nos debería importar el valor que tiene un campo autonumérico, pues este tipo de campos se debería utilizar sólo para poder diferenciar registros en una tabla, y no como campos contadores. Para campos contadores deberíamos implementar nuestras propias rutinas. Normalmente, y si no queremos complicarnos la vida, el proceso más simple para reiniciar un autonumérico otra vez al número 1 es borrando todos los registros de la tabla y después compactando la base de datos. Si queremos complicarnos la vida y queremos hacerlo por código, sin tener que compactar la base de datos, conozco de momento 2 formas diferentes de hacerlo (para Access 97 hay una pequeña particularidad y sólo aceptará la primera que expondré). La primera función lo que hace es: (Access 97, 2000 y 2002) 1.Ejecutar una sentencia SQL para borrar los registros de la tabla escogida 2.Otra sentencia SQL que inserta el valor -1, primero y 0 después si es Access 97, y 0 solamente si es Access 2000 o superior 3.Por último una sentencia SQL que borra de nuevo los registros. De esta manera, el siguiente autonumérico será otra vez el número uno. La segunda función (Access 2000 y 2002 solamente) utiliza DDL para nuestros propósitos 1.Ejecuta una sentencia SQL para borrar los registros de la tabla escogida 2.Redefine, mediante DDL, el campo autonumérico, poniendo sus valores a 1 el primer valor y a 1 el intervalo entre registros (esto es opcional) Esta sentencia DDL vendría a ser: ALTER TABLE MiTabla ALTER COLUMN Autonumerico COUNTER(1,1) Los argumentos de ambas funciones son NomTabla: Nombre de la tabla donde está el autonumérico NomCampo: Nombre del campo autonumérico Db: (Opcional) Nombre de la base de datos donde se encuentra el autonumérico (hay que tener en cuenta que la sentencia DDL generará un error si se intenta ejecutar sobre una tabla vinculada, ya que no se puede modificar el diseño de una tabla vinculada). '---------------------------------------------- ' ' Función resetAutonum ' ' Propósito: resetear un campo autonumérico ' y que empiece a contar desde 1, sin tener ' que compactar la base de datos. ' ' Versiones: Access 97, 2000 y 2002 ' ' Autor: Juan M. Afán de Ribera y Francisco ' García Aguado (Búho) ' ' Enero 2003. ' '----------------- CÓDIGO ---------------------- Function resetAutonum(nomTabla As String, _ nomCampo As String, _ Optional db) As Boolean Dim cadSQLDel As String Dim cadSQLIns97 As String Dim cadSQLIns As String cadSQLDel = "Delete * From " & nomTabla cadSQLIns97 = "Insert Into " & nomTabla & _ "(" & nomCampo & ") Select -1 As tmp" cadSQLIns = "Insert Into " & nomTabla & _ "(" & nomCampo & ") Select 0 As tmp" If IsMissing(db) Then Set db = CurrentDb Else Set db = DBEngine.OpenDatabase(db) End If On Error GoTo err_Trans DBEngine.BeginTrans db.Execute cadSQLDel, 128 ' Para Access 97 solamente If SysCmd(acSysCmdAccessVer) = "8.0" Then db.Execute cadSQLIns97, 128 End If db.Execute cadSQLIns, 128 db.Execute cadSQLDel, 128 DBEngine.CommitTrans resetAutonum = True Exit Function err_Trans: MsgBox "Error: " & Err.Number & vbCrLf _ & Err.Description DBEngine.Rollback resetAutonum = False End Function '---------------------------------------------- ' ' Función resetAutonumDDL ' ' Propósito: resetear un campo autonumérico ' y que empiece a contar desde 1, sin tener ' que compactar la base de datos. ' ' Versiones: Access 2000 y 2002 ' ' Autor: Juan M. Afán de Ribera ' ' Febrero 2003. ' '----------------- CÓDIGO ---------------------- Function resetAutonumDDL(nomTabla As String, _ nomCampo As String, _ Optional db) As Boolean Dim cadSQL As String On Error GoTo err_Trans If IsMissing(db) Then Set db = CurrentDb Else Set db = DBEngine.OpenDatabase(db) End If DBEngine.BeginTrans cadSQL = "DELETE * FROM " & nomTabla db.Execute cadSQL cadSQL = "ALTER TABLE " & nomTabla _ & " ALTER COLUMN " & nomCampo & " COUNTER(1,1)" db.Execute cadSQL DBEngine.CommitTrans resetAutonumDDL = True Set db = Nothing Exit Function err_Trans: MsgBox "Error: " & Err.Number & vbCrLf _ & Err.Description DBEngine.Rollback resetAutonumDDL = False Set db = Nothing End Function '----------------- FIN CÓDIGO -----------------