【问题标题】:Role-based Form recordsource基于角色的表单记录源
【发布时间】:2018-01-27 04:03:24
【问题描述】:

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

我们有一些用户修改了数据,他们不想看到标记标准以包含在不同报告中的列(具有名为 isOnRpt1isOnRpt2 的布尔值的列,用于过滤目的)和其他用户他们只运行需要对数据进行排序和过滤的报告,但看不到用于内部计算的列。假设我们总共有 65 列,每个人都希望看到相同的 5 个关键列和 10 个过滤列,但有些用户需要看到 30 个额外的列,而其他用户希望看到 20 个其他列。我现在拥有的是每个人的所有专栏的上帝视角,这让他们感到害怕。

对于数据表视图包含不同列子集的不同角色的用户,是否存在维护表单的最佳做法?我不担心表单视图上控件的可见性,记者角色的用户根本不会使用该视图。

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

TIA


假设我已经确定了两个角色,记者和作家。我可以为这些角色创建两个查询,qryDetailReporterqryDetailWriter 使用不同的列。我在两个不同角色的主表单上有两个按钮,btnDetailReporterbtnDetailWriter 用于打开共享详细信息表单 frmDetail,其中包含所有角色的所有 VBA 代码。 frmMain.btnDetail* 后面的 VBA 代码是否有加载 frmDetail 的最佳实践?我想在加载表单之前将 recordsource 属性设置为两个查询之一,但是 Access 表单不能那样工作,所以我想我可以有一个包含 roleID 引用的全局变量frmDetailload 事件设置了 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"

标签: forms ms-access vba


【解决方案1】:

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

【讨论】:

  • 感谢 columnHidden 属性的信息,visible 不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2013-12-24
  • 1970-01-01
  • 2021-10-01
  • 2023-03-26
  • 1970-01-01
  • 2015-10-18
相关资源
最近更新 更多