基于角色的表单记录来源

时间:2018-01-25 22:24:05

标签: forms ms-access access-vba

是否有基于记录源打开表单的最佳做法,这些记录源的列受用户角色的限制?

我们有一些用户修改了数据,这些数据不希望看到包含在不同报告中的列标记条件(具有名为isOnRpt1isOnRpt2的布尔值的列等用于过滤目的)和仅运行需要排序和过滤数据但不会看到用于内部计算的列的报表的其他用户。假设我们总共有65列,每个人都希望看到相同的5个关键列和10个过滤列,但有些用户需要查看30个其他列,而其他用户则希望查看其他20个列。我现在拥有的是所有人的专栏中的上帝观点,并且它让他们感到害怕。

是否有最佳实践为不同角色的用户维护表单,其数据表视图包含不同的列子集?我并不担心表单视图中控件的可见性,记者角色中的用户根本不会使用该视图。

我不想为每个角色(frmDetailReporterfrmDetailWriter)创建不同的表单,其唯一的区别是recordsource属性中的qry。我有一个主要表单,任何角色的工作人员可以使用导航到此详细信息表单的特定于角色的实例(他们需要导航到具有聚合数据的其他表单)但我不确定我是否应该有一个入口点对于表单的VBA代码中的每个角色,或者在打开表单之前更改recordsource属性,或者是否有更好的方法来支持同一数据源的不同视图的用户。

TIA

让我们说我已经确定了两个角色,即Reporter和Writer。我可以为这些角色创建两个查询,qryDetailReporterqryDetailWriter具有不同的列。我在两个不同角色的主表单上有两个按钮,btnDetailReporterbtnDetailWriter用于打开共享详细信息表单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

1 个答案:

答案 0 :(得分:1)

我建议使用不同的字段集为每个角色创建不同的查询,并根据用户角色更改表单的RecordSource属性。表单应包含所有可用列的集合。选择所需的记录源后,简单的VBA代码应该将recordsource中的可用字段集与每个表单的控件的ControlSource属性集进行比较。如果记录源中缺少该字段,请使用ColumnHidden控件的属性隐藏该列。