如何以编程方式检索与给定 table 字段关联的控件?
How do I programmatically retrieve the control associated with a given table field?
我有一个 Access 数据库,其中每个 table/view 都链接回 SQL 服务器对象。 table 已经过大量定制。许多字段都是带有简单行源的组合框:SELECT field1, field2, blahBlah FROM blahTable
我们要删除一堆 table,我想确保 table 中的 none 在这些字段子查询中被引用。看来我应该能够编写一些代码来遍历每个 table 以及每个 table 的每个字段,然后打印行源(如果存在)。
我可以编写代码来访问所有 table 字段。我可以编写代码来访问控件的行源。但我无法弄清楚如何获得与给定字段关联的控件,或者这是否是正确的方法。我在网上看到的一切都是如何手动查找此信息,或者假设控件的父级是表单,而不是字段或 table.
我不使用这些功能,但我确信您要查找的内容在该字段的 DAO.Properties 集合中。示例代码:
Public Sub ShowDAOProperties(ByVal rProperties As DAO.Properties)
Dim rPrp As DAO.Property
Dim vName As Variant
Dim vValue As Variant
Dim vType As Variant
On Error Resume Next
For Each rPrp In rProperties
With rPrp
vName = .Name
vType = .Type
vValue = .Value
If Err.Number = 0 Then
Debug.Print vName, vValue, vType
Else
Debug.Print "====>"; Err.Number & ": " & Err.Description, vName
Err.Clear
End If
End With
Next
End Sub
对于字段,调用使用:
ShowDAOProperties CurrentDb.TableDefs("table").Fields("field").Properties
您应该能够从生成的列表中挑选出您感兴趣的属性。
Access 查找字段的 Properties
集合包括 RowSourceType 和 RowSource。
RowSourceType 会告诉您来源是查询还是值列表。然后对于查询,RowSource 将显示 SQL。
这里的一个复杂问题是这两个属性仅存在于查找字段中。尝试为不同的字段类型访问它们将触发错误 #3270,"Property not found." 您可以通过添加一个忽略错误 #3270 的错误处理程序来处理这个问题。或者您可以检查属性 是否存在,只有当它存在时才询问它的值。
检查表格的每个字段并打印查找字段的 RowSource 应该很容易:
Dim db As DAO.Database
Dim fld As DAO.Field
Dim tdf As DAO.TableDef
Set db = CurrentDb
For Each tdf In db.TableDefs
If Not (tdf.Name Like "MSys*" Or tdf.Name Like "~*") Then
For Each fld In tdf.Fields
If HasProperty(fld, "RowSource") Then
Debug.Print tdf.Name; "."; fld.Name; " Rowsource: " & vbCrLf, _
fld.Properties("RowSource").Value
End If
Next
End If
Next
以上代码依赖于 Allen Browne 的 HasProperty 函数:
Public Function HasProperty(obj As Object, strPropName As String) As Boolean
'Purpose: Return true if the object has the property.
Dim varDummy As Variant
On Error Resume Next
varDummy = obj.Properties(strPropName)
HasProperty = (Err.Number = 0)
End Function
我有一个 Access 数据库,其中每个 table/view 都链接回 SQL 服务器对象。 table 已经过大量定制。许多字段都是带有简单行源的组合框:SELECT field1, field2, blahBlah FROM blahTable
我们要删除一堆 table,我想确保 table 中的 none 在这些字段子查询中被引用。看来我应该能够编写一些代码来遍历每个 table 以及每个 table 的每个字段,然后打印行源(如果存在)。
我可以编写代码来访问所有 table 字段。我可以编写代码来访问控件的行源。但我无法弄清楚如何获得与给定字段关联的控件,或者这是否是正确的方法。我在网上看到的一切都是如何手动查找此信息,或者假设控件的父级是表单,而不是字段或 table.
我不使用这些功能,但我确信您要查找的内容在该字段的 DAO.Properties 集合中。示例代码:
Public Sub ShowDAOProperties(ByVal rProperties As DAO.Properties)
Dim rPrp As DAO.Property
Dim vName As Variant
Dim vValue As Variant
Dim vType As Variant
On Error Resume Next
For Each rPrp In rProperties
With rPrp
vName = .Name
vType = .Type
vValue = .Value
If Err.Number = 0 Then
Debug.Print vName, vValue, vType
Else
Debug.Print "====>"; Err.Number & ": " & Err.Description, vName
Err.Clear
End If
End With
Next
End Sub
对于字段,调用使用:
ShowDAOProperties CurrentDb.TableDefs("table").Fields("field").Properties
您应该能够从生成的列表中挑选出您感兴趣的属性。
Access 查找字段的 Properties
集合包括 RowSourceType 和 RowSource。
RowSourceType 会告诉您来源是查询还是值列表。然后对于查询,RowSource 将显示 SQL。
这里的一个复杂问题是这两个属性仅存在于查找字段中。尝试为不同的字段类型访问它们将触发错误 #3270,"Property not found." 您可以通过添加一个忽略错误 #3270 的错误处理程序来处理这个问题。或者您可以检查属性 是否存在,只有当它存在时才询问它的值。
检查表格的每个字段并打印查找字段的 RowSource 应该很容易:
Dim db As DAO.Database
Dim fld As DAO.Field
Dim tdf As DAO.TableDef
Set db = CurrentDb
For Each tdf In db.TableDefs
If Not (tdf.Name Like "MSys*" Or tdf.Name Like "~*") Then
For Each fld In tdf.Fields
If HasProperty(fld, "RowSource") Then
Debug.Print tdf.Name; "."; fld.Name; " Rowsource: " & vbCrLf, _
fld.Properties("RowSource").Value
End If
Next
End If
Next
以上代码依赖于 Allen Browne 的 HasProperty 函数:
Public Function HasProperty(obj As Object, strPropName As String) As Boolean
'Purpose: Return true if the object has the property.
Dim varDummy As Variant
On Error Resume Next
varDummy = obj.Properties(strPropName)
HasProperty = (Err.Number = 0)
End Function