【发布时间】:2018-01-27 04:03:24
【问题描述】:
是否有关于打开基于列受用户角色限制的记录源的表单的最佳做法?
我们有一些用户修改了数据,他们不想看到标记标准以包含在不同报告中的列(具有名为 isOnRpt1、isOnRpt2 的布尔值的列,用于过滤目的)和其他用户他们只运行需要对数据进行排序和过滤的报告,但看不到用于内部计算的列。假设我们总共有 65 列,每个人都希望看到相同的 5 个关键列和 10 个过滤列,但有些用户需要看到 30 个额外的列,而其他用户希望看到 20 个其他列。我现在拥有的是每个人的所有专栏的上帝视角,这让他们感到害怕。
对于数据表视图包含不同列子集的不同角色的用户,是否存在维护表单的最佳做法?我不担心表单视图上控件的可见性,记者角色的用户根本不会使用该视图。
我不想为每个角色(frmDetailReporter、frmDetailWriter)创建不同的表单,它们唯一的区别是 recordsource 属性中的 qry。我有一个任何角色的主要表单员工都可以用来导航到此详细表单的特定于角色的实例(他们需要导航到具有聚合数据的其他表单),但我不确定是否应该为每个表单设置一个入口点在表单的 VBA 代码中扮演角色或在打开表单之前更改 recordsource 属性,或者如果有更好的方法来支持同一数据源的不同视图的用户。
TIA
假设我已经确定了两个角色,记者和作家。我可以为这些角色创建两个查询,qryDetailReporter 和 qryDetailWriter 使用不同的列。我在两个不同角色的主表单上有两个按钮,btnDetailReporter 和 btnDetailWriter 用于打开共享详细信息表单 frmDetail,其中包含所有角色的所有 VBA 代码。 frmMain.btnDetail* 后面的 VBA 代码是否有加载 frmDetail 的最佳实践?我想在加载表单之前将 recordsource 属性设置为两个查询之一,但是 Access 表单不能那样工作,所以我想我可以有一个包含 roleID 引用的全局变量frmDetail 的 load 事件设置了 recordsource 属性,但我更愿意在没有全局变量的情况下执行此操作。
这是我现在拥有的:
' module
Public g_roleID As Integer
' frmMain
Private Sub btnDetailWriter_Click()
g_roleID = 1
DoCmd.OpenForm "frmDetail", acFormDS
End Sub
Private Sub btnDetailReporter_Click()
g_roleID = 0
DoCmd.OpenForm "frmDetail", acFormDS
End Sub
' frmDetail
Private Sub Form_Open(Cancel As Integer)
Dim objCtl As Control
Dim sTxt As String
Dim sFld As String
Select Case g_roleID
Case 0
RecordSource = "qryDetailReporter"
Case 1
RecordSource = "qryDetailWriter"
Case Else
RecordSource = "vw_detail"
End Select
On Error GoTo noFld
For Each objCtl In Controls
Select Case objCtl.ControlType
Case acTextBox, acComboBox
sTxt = objCtl.ControlSource
objCtl.ColumnHidden = False
sFld = RecordsetClone.Fields(sTxt) & ""
End Select
Next
Exit Sub
noFld:
objCtl.ColumnHidden = True
Resume Next
End Sub
【问题讨论】:
-
是数据表形式吗?我有一些代码可以将记录集中的所有列加载到数据表表单中以供查看。这样,您只需要担心创建正确的记录集,而不用担心表单部分
-
您可以在启动时将表单记录源设置为 sql 字符串或查询。走吧。RecordSource = "一些 sql"