是否有基于记录源打开表单的最佳做法,这些记录源的列受用户角色的限制?
我们有一些用户修改了数据,这些数据不希望看到包含在不同报告中的列标记条件(具有名为isOnRpt1
,isOnRpt2
的布尔值的列等用于过滤目的)和仅运行需要排序和过滤数据但不会看到用于内部计算的列的报表的其他用户。假设我们总共有65列,每个人都希望看到相同的5个关键列和10个过滤列,但有些用户需要查看30个其他列,而其他用户则希望查看其他20个列。我现在拥有的是所有人的专栏中的上帝观点,并且它让他们感到害怕。
是否有最佳实践为不同角色的用户维护表单,其数据表视图包含不同的列子集?我并不担心表单视图中控件的可见性,记者角色中的用户根本不会使用该视图。
我不想为每个角色(frmDetailReporter
,frmDetailWriter
)创建不同的表单,其唯一的区别是recordsource属性中的qry。我有一个主要表单,任何角色的工作人员可以使用导航到此详细信息表单的特定于角色的实例(他们需要导航到具有聚合数据的其他表单)但我不确定我是否应该有一个入口点对于表单的VBA代码中的每个角色,或者在打开表单之前更改recordsource
属性,或者是否有更好的方法来支持同一数据源的不同视图的用户。
TIA
让我们说我已经确定了两个角色,即Reporter和Writer。我可以为这些角色创建两个查询,qryDetailReporter
和qryDetailWriter
具有不同的列。我在两个不同角色的主表单上有两个按钮,btnDetailReporter
和btnDetailWriter
用于打开共享详细信息表单frmDetail
,其中包含所有角色的所有VBA代码。加载frmMain.btnDetail*
后,frmDetail
后面的VBA代码是否有最佳做法?我想在加载表单之前将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
答案 0 :(得分:1)
我建议使用不同的字段集为每个角色创建不同的查询,并根据用户角色更改表单的RecordSource属性。表单应包含所有可用列的集合。选择所需的记录源后,简单的VBA代码应该将recordsource中的可用字段集与每个表单的控件的ControlSource属性集进行比较。如果记录源中缺少该字段,请使用ColumnHidden
控件的属性隐藏该列。