ChangeFldProperty
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
Argumento | Descripción |
---|---|
TableName | Requerido. Nombre de la tabla donde reside el campo cuya propiedad se pretende cambiar o crear |
FieldName | Requerido. Nombre del campo cuya propiedad se pretende cambiar o crear |
PropertyName | Requerido. Nombre de la propiedad que se pretende cambiar o crear |
vValue | Requerido. Nuevo valor de la propiedad que se pretende cambiar o crear |
DBPath | Opcional. 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)
Pregunta Sé cómo imprimir un informe mediante código y sé cómo hacer para que aparezca el cuadro de diálogo imprimir,…
Cómo conseguir en un informe calcular sólo el total para cada página