如何以编程方式从链接的 table 的 属性 sheet 中检索值?
How do I programmatically retrieve the values from a linked table's property sheet?
我在 MS Access 中工作。所有 table 和视图都链接到 SQL 服务器数据库。我想编写一个程序来检索和存储有关这些对象的所有格式信息。 属性 sheet(我在设计视图中打开 table,然后点击 F4 以获得 属性 sheet)。例如:
- 过滤器
- 排序依据
- 加载时过滤
- 按负载排序
- 订购日期
如何以编程方式检索这些属性?我只看到它们在报告中列出。
请注意,我需要检索 值,而不仅仅是设置它们。我知道 SetFilter 方法,但这不是我需要的。
链接的 table 作为 DAO.TableDef
存在于数据库的 TableDefs
集合中。因此,您可以检查 TableDef.Properties
集合中的这 5 个属性。
但是请注意 Filter 和 OrderBy 都是用户创建的而不是默认属性,这意味着它们不包含在 Properties
集合,除非你给它们赋值。试图检索一个不存在的触发错误 3270,"Property not found"。您可以捕获该错误,根据需要对其作出响应,然后继续处理您感兴趣的其他属性。或者您可以先确定 属性 是否存在,并且只在它存在时才尝试检索它的值.
此代码示例使用第一种方法(捕获错误):
Const cstrTable As String = "YourLinkedTableNameHere"
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strMsg As String
Dim varProp As Variant
Dim varProperties As Variant
On Error GoTo ErrorHandler
varProperties = Array("Filter", "FilterOnLoad", "OrderBy", _
"OrderByOn", "OrderByOnLoad")
Set db = CurrentDb
Set tdf = db.TableDefs(cstrTable)
For Each varProp In varProperties
Debug.Print varProp, tdf.Properties(varProp).Value
Next
ExitHere:
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 3270 ' Property not found.
strMsg = "Property '" & varProp & "' not found."
'MsgBox strMsg
Debug.Print strMsg
Resume Next
Case Else
strMsg = "Error " & Err.Number & " (" & Err.Description & ")"
MsgBox strMsg
Resume ExitHere
End Select
这样的事情怎么样? (我定义 "table2" 有两个字段,"PropertyName" 和 "PropertyValue"..."table1" 是任何现有表的占位符)
Dim i As Integer
Dim j As Integer
Dim RS As DAO.Recordset
On Error Resume Next
Set RS = CurrentDb.OpenRecordset("select * from table2")
j = CurrentDb.TableDefs("table1").Properties.Count
For i = 0 To j - 1
RS.AddNew
RS!PropertyName = CurrentDb.TableDefs("table1").Properties(i).Name
RS!PropertyValue = Nz(CurrentDb.TableDefs("table1").Properties(i).Value, "-")
RS.Update
Next i
我在 MS Access 中工作。所有 table 和视图都链接到 SQL 服务器数据库。我想编写一个程序来检索和存储有关这些对象的所有格式信息。 属性 sheet(我在设计视图中打开 table,然后点击 F4 以获得 属性 sheet)。例如:
- 过滤器
- 排序依据
- 加载时过滤
- 按负载排序
- 订购日期
如何以编程方式检索这些属性?我只看到它们在报告中列出。
请注意,我需要检索 值,而不仅仅是设置它们。我知道 SetFilter 方法,但这不是我需要的。
链接的 table 作为 DAO.TableDef
存在于数据库的 TableDefs
集合中。因此,您可以检查 TableDef.Properties
集合中的这 5 个属性。
但是请注意 Filter 和 OrderBy 都是用户创建的而不是默认属性,这意味着它们不包含在 Properties
集合,除非你给它们赋值。试图检索一个不存在的触发错误 3270,"Property not found"。您可以捕获该错误,根据需要对其作出响应,然后继续处理您感兴趣的其他属性。或者您可以先确定 属性 是否存在,并且只在它存在时才尝试检索它的值.
此代码示例使用第一种方法(捕获错误):
Const cstrTable As String = "YourLinkedTableNameHere"
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strMsg As String
Dim varProp As Variant
Dim varProperties As Variant
On Error GoTo ErrorHandler
varProperties = Array("Filter", "FilterOnLoad", "OrderBy", _
"OrderByOn", "OrderByOnLoad")
Set db = CurrentDb
Set tdf = db.TableDefs(cstrTable)
For Each varProp In varProperties
Debug.Print varProp, tdf.Properties(varProp).Value
Next
ExitHere:
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 3270 ' Property not found.
strMsg = "Property '" & varProp & "' not found."
'MsgBox strMsg
Debug.Print strMsg
Resume Next
Case Else
strMsg = "Error " & Err.Number & " (" & Err.Description & ")"
MsgBox strMsg
Resume ExitHere
End Select
这样的事情怎么样? (我定义 "table2" 有两个字段,"PropertyName" 和 "PropertyValue"..."table1" 是任何现有表的占位符)
Dim i As Integer
Dim j As Integer
Dim RS As DAO.Recordset
On Error Resume Next
Set RS = CurrentDb.OpenRecordset("select * from table2")
j = CurrentDb.TableDefs("table1").Properties.Count
For i = 0 To j - 1
RS.AddNew
RS!PropertyName = CurrentDb.TableDefs("table1").Properties(i).Name
RS!PropertyValue = Nz(CurrentDb.TableDefs("table1").Properties(i).Value, "-")
RS.Update
Next i