Como agregar columnas a una tabla con código

Comunidad nuevamente... Tengo una nueva inquietud. Resulta que tengo una tabla llamada ZonaSur y esta contiene registros de ciudades y kilómetros. Pues bien mi problema se genera donde la ciudad de origen lo existe porque se quedo fuera del registro inicial y para no estar siempre cerrando la base de datos y agregar manualmente en la tabla la columna nueva, más un registro nuevo con el mismo nombre de columna nueva y registrar los kilómetros que se recorre desde ese punto de origen a otra ciudad de destino. Busque en la web y encontré esto;

Public Sub AgregarColumna()
    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "ALTER TABLE ZonaSur ADD COLUMN NombreColumna Número;"
    Set db = Nothing
'NombreColumna, es el textbox en mi formulario independiente donde escribo el nombre
que quiero que tenga la columna
me.Destino= NombreColumna.Text 'Aqui agrego un registro nuevo con el mismo nombre
End Sub

No me resulta me envía mensaje Error de Sintaxis en la definición del campo.

3 Respuestas

Respuesta
1

Hector, convendría que fueras más concreto. ¿Quieres añadir un campo a una tabla y que el nombre de ese campo sea el que aparece en un cuadro de texto? O lo que quieres es añadir un registro nuevo con el nombre que aparece en un cuadro de texto y los kilómetros que hay en otro, etc.

Por ejemplo, para añadir un campo a una tabla, y que el nombre de ese campo que añades sea el que aparece en un cuadro de texto de un formulario, basta conque pongas la instrucción

DoCmd. RunSQL "ALTER TABLE ZonaSur ADD COLUMN " & Me. Texto38.Value & " TEXT(25)"

Texto38 es el cuadro de texto donde escribo el nombre que quiero que tenga el campo

Text(25)" es el tamaño que le doy a dicho campo

Ahora bien, si lo que quieres es insertar en la tabla Zona sur, en los campos, por ejemplo, NombreCiudad, Habitantes lo que haya escrito en ese momento en los cuadros de texto Texto38 y Texto39, basta con poner

Docmd.runsql"insert into ZonaSur(Nombreciudad,Habitantes) values(texto38,texto39)"

Por eso sería necesario que concretaras

Respuesta
1

Existen 2 formas

1. Con SQL

Public Sub AgregarColumna()
    Dim db As DAO.Database
    Dim strSQL As String
    Dim NombreColumna As String
    ' Obtener el nombre de la columna desde el formulario
    NombreColumna = Me.NombreColumna.Text ' Asegurar que este control tiene el nombre deseado
    ' Validar que el nombre de la columna no esté vacío
    If Trim(NombreColumna) = "" Then
        MsgBox "Debe ingresar un nombre para la nueva columna.", vbExclamation, "Error"
        Exit Sub
    End If
    ' Asegurar que el nombre de la columna es válido (sin espacios ni caracteres especiales)
    NombreColumna = Replace(NombreColumna, " ", "_") ' Reemplazar espacios con guiones bajos
    ' Abrir la base de datos actual
    Set db = CurrentDb
    ' Crear la instrucción SQL para agregar la columna
    strSQL = "ALTER TABLE ZonaSur ADD COLUMN [" & NombreColumna & "] DOUBLE;"
    ' Ejecutar la consulta
    On Error Resume Next
    db.Execute strSQL, dbFailOnError
    If Err.Number <> 0 Then
        MsgBox "Error al agregar la columna: " & Err.Description, vbCritical, "Error"
        Err.Clear
        Set db = Nothing
        Exit Sub
    End If
    On Error GoTo 0
    ' Insertar un nuevo registro con el mismo nombre de la columna como ciudad de origen
    strSQL = "INSERT INTO ZonaSur (Ciudad) VALUES ('" & NombreColumna & "');"
    db.Execute strSQL, dbFailOnError
    ' Liberar recursos
    Set db = Nothing
    ' Confirmar que se completó el proceso
    MsgBox "Columna y registro agregados exitosamente.", vbInformation, "Éxito"
End Sub

Explicación del código:

Validaciones: Se verifica que el campo de texto del formulario no esté vacío y que el nombre de la columna sea válido.

Corrección en el nombre de la columna: Se reemplazan espacios con guiones bajos para evitar errores.

Manejo de errores: Se captura cualquier error al ejecutar ALTER TABLE.

Inserción de un registro: Se agrega un nuevo registro con el mismo nombre de la columna en el campo Ciudad.

Nota :

Access no permite agregar columnas con ALTER TABLE si la tabla tiene registros bloqueados. Asegúesee de cerrar cualquier formulario que esté usando ZonaSur antes de ejecutar el código.

2. Con DAO

Public Sub AgregarColumnaDAO()
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim fld As DAO.Field
    Dim rst As DAO.Recordset
    Dim NombreColumna As String
    ' Obtener el nombre de la nueva columna desde el formulario
    NombreColumna = Trim(Me.NombreColumna.Text)
    ' Validar que el nombre de la columna no esté vacío
    If NombreColumna = "" Then
        MsgBox "Debe ingresar un nombre para la nueva columna.", vbExclamation, "Error"
        Exit Sub
    End If
    ' Asegurar que el nombre de la columna no tenga espacios ni caracteres especiales
    NombreColumna = Replace(NombreColumna, " ", "_")
    ' Abrir la base de datos actual
    Set db = CurrentDb
    ' Obtener la estructura de la tabla ZonaSur
    Set tdf = db.TableDefs("ZonaSur")
    ' Verificar si la columna ya existe para evitar duplicados
    On Error Resume Next
    Set fld = tdf.Fields(NombreColumna)
    If Not fld Is Nothing Then
        MsgBox "La columna '" & NombreColumna & "' ya existe.", vbExclamation, "Aviso"
        Set db = Nothing
        Exit Sub
    End If
    On Error GoTo 0
    ' Agregar la nueva columna como tipo DOUBLE (para almacenar kilómetros)
    Set fld = tdf.CreateField(NombreColumna, dbDouble)
    tdf.Fields.Append fld
    db.TableDefs.Refresh
    ' Insertar un nuevo registro con el mismo nombre de la columna en el campo 'Ciudad'
    Set rst = db.OpenRecordset("ZonaSur", dbOpenDynaset)
    rst.AddNew
    rst!Ciudad = NombreColumna  ' Suponiendo que la tabla tiene un campo llamado 'Ciudad'
    rst.Update
    rst.Close
    ' Liberar memoria
    Set rst = Nothing
    Set fld = Nothing
    Set tdf = Nothing
    Set db = Nothing
    ' Mensaje de éxito
    MsgBox "Columna y registro agregados correctamente.", vbInformation, "Éxito"
End Sub

Explicación del código

Obtiene el nombre de la nueva columna desde un TextBox en el formulario.

Valida el nombre:

Elimina espacios en blanco al inicio y al final.

Reemplaza espacios en el medio con guiones bajos (_) para evitar errores.

Accede a la estructura de la tabla (TableDefs):

Verifica si la columna ya existe antes de agregarla.

Usa CreateField para crear una nueva columna de tipo DOUBLE (puedes cambiarlo a dbText si es necesario).

Inserta un nuevo registro en la tabla con el mismo nombre de la columna como ciudad de origen.

Libera los objetos DAO (Recordset, TableDef, Database) para evitar problemas de memoria.

Muestra mensajes de éxito o error según el resultado.

¡Gracias! Don Eduardo, como siempres un excelente profesor, me sirvió mucho y funciona a la perfección, le agregue unos registros más para mejorar los registros que necesito.

Lo que ahora me surgió es poder rellenar más datos, veré como resolverlo. Ya que debo agregar los km en otras ciudades, utilizo un buscador en donde me busca el campo donde se cruza la consulta, le agrego el registro pero no me lo guarda.

'El evento que uso para buscar los registros
Private Sub CC_Destino_AfterUpdate()
If Nz(Me.CC_Origen) = "" Then
MsgBox "Tienes que seleccionar un Origen"
Me.CC_Origen.SetFocus
Exit Sub
End If
If Nz(Me.CC_Destino) = "" Then
MsgBox "Tienes que seleccionar un Destino"
Me.CC_Destino.SetFocus
Exit Sub
End If
Me.KM_Destino = DLookup("[" & Me.CC_Origen.Column(1) & "]", "ZonaSur", "Destino='" & Me.CC_Destino.Column(1) & "'")
End Sub

Ocupo el formulario con la tabla directa ZonaSur, y agrego el boton con la macro guardar, pero no lo hace.

Respuesta
1

Es correcto, el tipo de campo que has especificado no esta entre los admitidos por Access, asumo que es un problema del traductor (verifícalo en el mensaje e idioma original)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas