如何以编程方式检索与给定表字段关联的控件?

时间:2015-05-07 18:57:34

标签: ms-access access-vba ms-access-2010 ms-access-2013

我有一个Access数据库,其中每个表/视图都链接回SQL Server对象。这些表已经过大量定制。许多字段都是具有简单行数的组合框:SELECT field1, field2, blahBlah FROM blahTable

我们想删除一堆表,并且我想确保这些字段子查询中没有引用任何表。看起来我应该能够编写一些代码来遍历每个表和每个表的每个字段,然后打印rowsource(如果存在的话)。

我可以编写代码来访问所有表字段。我可以编写代码来访问控件的行源。但我无法弄清楚如何获得与给定字段相关联的控件,或者这是否是正确的方法。我在网上看到的一切都是如何手动查找此信息,或者假设控件的父级是表单,而不是字段或表格。

2 个答案:

答案 0 :(得分:1)

我没有使用这些功能,但我确信您要找的是该字段的DAO.Properties集合。示例代码:

@Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Paint paint = new Paint();
    paint.setColor(Color.parseColor("#868F98"));
    Bitmap bg = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bg); 
    canvas.drawRect(0, 0, 200, 200, paint); 
    LinearLayout ll = (LinearLayout) findViewById(R.id.rect);
    ll.setBackgroundDrawable(new BitmapDrawable(bg));   
 }

对于某个字段,请使用以下方式致电:

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

您应该能够从生成的列表中选择您感兴趣的属性。

答案 1 :(得分:0)

Access查询字段的Properties集合包括 RowSourceType RowSource

RowSourceType 将告诉您源是查询还是值列表。然后,对于查询, RowSource 将显示SQL。

这里的一个复杂因素是这两个属性仅存在于查找字段中。尝试为不同的字段类型访问它们将触发错误#3270,"找不到属性。" 您可以通过添加忽略错误#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