Resumen Cambiar el tipo de un campo de una bd por código

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



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com