Juanjo Luna

MVP Microsoft 365 Apps & Services 2023

LinkedIn Learning Instructor

Presidente de Access User Groups España

CEO Luna-Soft

Desarrollador

Consultor Informático

Juanjo Luna

MVP Microsoft 365 Apps & Services 2023

LinkedIn Learning Instructor

Presidente de Access User Groups España

CEO Luna-Soft

Desarrollador

Consultor Informático

Blog Post

ChangeFldProperty

6 de febrero de 2024 ACCESS, El rincón de Happy, Tablas

Pregunta

¿Cómo puedo cambiar por código una propiedad del campo de una tabla? A veces utilizo un código y me funciona bien, pero otras veces, cuando quiero cambiar exactamente la misma propiedad, ese mismo código me lanza un mensaje de error diciendo que “La propiedad no existe”

Respuesta

Un campo de una tabla lleva incorporadas una serie de propiedades en el momento de su creación. Por ejemplo, las propiedades Attributes, Type, Name, OrdinalPosition, etc, son propiedades que vienen incluidas con el campo. En cambio tenemos otro tipo de propiedades que necesitan de la interacción del usuario para ser creadas, como por ejemplo Caption (Titulo), Format (Formato), etc, y son este tipo de propiedades las que provocan ese error que comentas, cuando se intenta acceder a ellas desde código y no han sido creadas.

Con la función ChangeFldProperty podemos cambiar el valor de la propiedad de un campo sin preocuparnos de este hecho, ya que, en el caso de encontrarse con una propiedad que no exista la creará y le asignará el valor que se le pase a la función en el argumento correspondiente. La función ChangeFldProperty puede cambiar o crear la propiedad de un campo en la base de datos actual o una base de datos externa.

Consta de los siguientes

Argumentos

ArgumentoDescripción
TableNameRequerido. Nombre de la tabla donde reside el campo cuya propiedad se pretende cambiar o crear
FieldNameRequerido. Nombre del campo cuya propiedad se pretende cambiar o crear
PropertyNameRequerido. Nombre de la propiedad que se pretende cambiar o crear
vValueRequerido. Nuevo valor de la propiedad que se pretende cambiar o crear
DBPathOpcional. Ruta completa de la base de datos donde se encuentra el campo de la tabla cuya propiedad se pretende cambiar o crear. Si este argumento se omite o es una cadena vacía (“”) se buscará en la base de datos actual

Ejemplo de uso

' cambiamos o creamos la descripción de un campo
Call ChangeFldProperty("MiTabla", "CampoTexto", "Description", _
                                   "Este es un campo de texto de pruebas")

' cambiamo el número de decimales de un campo numérico
Call ChangeFldProperty("MiTabla", "CampoNumerico", "DecimalPlaces", 2)

' cambiamos o creamos un formato para un campo tipo Fecha/Hora
Call ChangeFldProperty("MiTabla", "CampoFecha", "Format", "Long time")

Código

'---------------------------------------------------------
' ChangeFldProperty
'
' Código escrito originalmente por 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 el autor en
'
'     accessvba@ya.com
'
' Este código se brinda por cortesía de
' Juan M. Afán de Ribera
'
Function ChangeFldProperty( _
               TableName As String, _
               FieldName As String, _
               PropertyName As String, _
               vValue As Variant, _
               Optional DBPath As String) As Long
                    
Dim db As Object 'DAO.Database
Dim tdf As Object 'DAO.Tabledef
Dim fld As Object 'DAO.Field
Dim prp As Object 'DAO.Property
Dim PropertyType As Integer

    On Error GoTo err_ChangeFldProperty
    
    If DBPath = "" Then
        Set db = CurrentDb
    Else
        Set db = DBEngine.OpenDatabase(DBPath)
    End If
    
    Set tdf = db.TableDefs(TableName)
    Set fld = tdf.Fields(FieldName)
    Set prp = fld.Properties(PropertyName)
    prp.Value = vValue
    fld.Properties.Refresh
    
    ChangeFldProperty = -1
    
exit_Function:
  
    Set prp = Nothing
    Set fld = Nothing
    Set tdf = Nothing
    If Not db Is Nothing Then db.Close
    Set db = Nothing
    
    Exit Function
    
err_ChangeFldProperty:

    ' propiedad no existe
    If Err.Number = 3270 Then
        Select Case PropertyName
            Case "ColumnWidth", _
                 "ColumnOrder", _
                 "DisplayControl", _
                 "BoundColumn", _
                 "ColumnCount", _
                 "ListRows"
                 PropertyType = DB_INTEGER 'DAO.dbInteger
                 
            Case "ColumnHidden", _
                 "UnicodeCompression", _
                 "ColumnHeads", _
                 "LimitToList"
                 PropertyType = DB_BOOLEAN 'DAO.dbBoolean
                 
            Case "Description", _
                 "Format", _
                 "InputMask", _
                 "RowSourceType", _
                 "ColumnWidths", _
                 "ListWidth"
                 PropertyType = DB_TEXT 'DAO.dbText
                 
            Case "Caption", _
                 "RowSource"
                 PropertyType = DB_MEMO 'DAO.dbMemo
                 
            Case "DecimalPlaces"
                 PropertyType = DB_BYTE 'DAO.dbByte
            Case Else
                 PropertyType = DB_TEXT 'DAO.dbText
        End Select
            
        Set prp = fld.CreateProperty( _
                                    PropertyName, _
                                    PropertyType, _
                                    vValue)
        fld.Properties.Append prp
        fld.Properties.Refresh
        ChangeFldProperty = -1
    Else
        ChangeFldProperty = Err.Number
    End If
    
    Resume exit_Function

End Function
'---------------------------------------------------------

Créditos

con el fin de dar a conocer el trabajo de uno de los más grandes en el mundo de Access en español, y tras solicitar su permiso, replico este artículo de Juan M Afán de Ribera. Todos los derechos y autoría corresponden a él. Access & VBA FAQ – ChangeFldProperty (archive.org)

Taggs:
Related Posts
Opciones de impresión a través de código

Pregunta Sé cómo imprimir un informe mediante código y sé cómo hacer para que aparezca el cuadro de diálogo imprimir,…

Totales por página

Cómo conseguir en un informe calcular sólo el total para cada página

Write a comment