Mensaje enviado por "Raúl L. Cobos" <RLCOBOS@santandersupernet.com>
Yo lo hago desde codigo directamente tengo una funcioncilla que he hecho en unos minutos y puede que necesite depuracion pero te la mando para que la veas.
NOTA: No me molestan los comentarios, siempre y cuando sean constructivos, educativos. y me ayuden a mejorar el código.
Public Sub Cambiar_TipoDato(Nombre_Tabla As String, Nombre_Campo As String, NuevoTipo As Long)
'Funcion para cambiar el tipo de los campos de la base de datos
'le mando la tabla, el campo y el nuevo tipo
' Se le puede añadir la base de datos para hacerlo reutilizable.
' En esta creo una tabla auxiliar porque el tipo de dato no se puede actualizar
'para otros datos de los campos se puede hacer directamente
Dim DefTabla As TableDef
Dim Campo As Field
Dim nuevatabla As TableDef
Dim NuevoCampo As Field
Dim aux_Query
Dim indice As INDEX
Dim nuevoindice As INDEX
'***************************************************************************
'***************************************************************************
' Poner aqui el nombre de tu base de datos.
' ( se puede enviar como un parametro para hacer reutilizable el código )
'***************************************************************************
'***************************************************************************
Bdtint.Close
Set Bdtint = OpenDatabase(App.Path & "\bdtinto.mdb", 1)
Set DefTabla = Bdtint.TableDefs(Nombre_Tabla)
Set Campo = DefTabla.Fields(Nombre_Campo)
'aqui creo la nueva tabla en la base de datos con su mismo nombre
'seguido de un 2
Set nuevatabla = Bdtint.CreateTableDef(Nombre_Tabla & "2")
'este squery lo utilizo para almacenar los nombres de los campos
'y pasarselos al insert into
Squery = "("
'recorro todos los campos de la tabla original y los copio en la auxiliar
'con los datos identicos menos el que hay que cambiar el tipo que lo
'pongo al nuevo.
For Each Campo In DefTabla.Fields
If Campo.Name = Nombre_Campo Then
Set NuevoCampo = nuevatabla.CreateField(Campo.Name, NuevoTipo)
Else
Set NuevoCampo = nuevatabla.CreateField(Campo.Name, Campo.Type)
End If
NuevoCampo.Attributes = Campo.Attributes
NuevoCampo.Required = Campo.Required
'esta propiedad es solo para los textos
If Campo.Type = dbText Then
NuevoCampo.AllowZeroLength = Campo.AllowZeroLength
End If
NuevoCampo.Size = Campo.Size
nuevatabla.Fields.Append NuevoCampo
Squery = Squery & Campo.Name & ", "
Next
'recorro los indices y los copio
For Each indice In DefTabla.Indexes
Set nuevoindice = nuevatabla.CreateIndex(indice.Name)
With nuevoindice
' .Clustered = Indice.Clustered
' .DistinctCount = Indice.DistinctCount
' .Foreign = Indice.Foreign
.IgnoreNulls = indice.IgnoreNulls
.Name = indice.Name
.Primary = indice.Primary
.Required = indice.Required
.Unique = indice.Unique
'Añado los campos de cada indice
For Each Campo In indice.Fields
'.Fields.CreateField (Campo.Name)
.Fields.Append nuevoindice.CreateField(Campo.Name)
Next
End With
nuevatabla.Indexes.Append nuevoindice
nuevatabla.Indexes.Refresh
Next
'le quito la coma y el espacio en blanco al ultimo y lo cambio por un )
Squery = Left(Squery, Len(Squery) - 2)
Squery = Squery & ")"
'Actualizo la base de datos con la nueva tabla
Bdtint.TableDefs.Append nuevatabla
'esta variable la utilizo para el select del squery que no lleva parentesis, es la misma
'pero le quito los parentesis
aux_Query = Left(Squery, Len(Squery) - 1)
aux_Query = Right(aux_Query, Len(aux_Query) - 1)
'paso los datos de la antigua a la nueva
Squery = "Insert INTO " & Nombre_Tabla & "2 " & Squery & " select " & aux_Query & " from " & Nombre_Tabla
Bdtint.Execute Squery
'borro la antigua
Squery = "drop table " & Nombre_Tabla
Bdtint.Execute Squery
'renombro la nueva con el nombre de la antigua
nuevatabla.Name = Nombre_Tabla
Bdtint.TableDefs.Refresh
End Sub