我有一个Access数据库,其中每个表/视图都链接回SQL Server对象。这些表已经过大量定制。许多字段都是具有简单行数的组合框:SELECT field1, field2, blahBlah FROM blahTable
我们想删除一堆表,并且我想确保这些字段子查询中没有引用任何表。看起来我应该能够编写一些代码来遍历每个表和每个表的每个字段,然后打印rowsource(如果存在的话)。
我可以编写代码来访问所有表字段。我可以编写代码来访问控件的行源。但我无法弄清楚如何获得与给定字段相关联的控件,或者这是否是正确的方法。我在网上看到的一切都是如何手动查找此信息,或者假设控件的父级是表单,而不是字段或表格。
答案 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