【问题标题】:Microsoft Access 2010 - Dynamic queryMicrosoft Access 2010 - 动态查询
【发布时间】:2014-12-17 10:06:58
【问题描述】:

我有一个访问网络数据库,需要几个用户登录。该数据库包含一个产品表。

挑战在于,每个用户只需要看到这些产品的一部分,而永远不会看到整个列表。

目前我有一些代码可以根据登录用户的详细信息修改现有查询。当他们登录时,会创建一些临时变量,这些临时变量用于修改查询条件。

这在第一个用户登录时效果很好,但是在下一个用户登录的那一刻,查询再次被修改并且产品列表刷新并且现在显示他的产品而不是第一个用户!我想我需要在登录时为每个用户动态创建一个永久查询?

或者是一种更好的方式来完成我正在尝试的事情?我很陌生访问和挣扎。有人可以帮忙吗?

到目前为止,这是我的代码:

登录表单上的按钮具有以下收集用户详细信息的代码

Private Sub cmdLoginMine_Click()
Dim ID as long, strEmpName as string,strZondsc as string,strgrpdsc as string

ID = DLookup("ID", "Employees", "Login='" & Me.txtUser.Value & "'")
strEmpName = DLookup("FullName", "Employees", "Login='" & Me.txtUser.Value & "'")
strgrpdsc = DLookup("MyGrpdscs", "Employees", "Login='" & Me.txtUser.Value & "'")
strzondsc = DLookup("MyZondscs", "Employees", "Login='" & Me.txtUser.Value & "'")

TempVars.Add "tmpEmployeeID", ID
TempVars.Add "tmpEmployeeName", txtUser.Value

然后我调用一个修改现有查询的函数,并使用此用户详细信息填充它以符合条件

qryEdit strgrpdsc, strzondsc, ID


Sub qryEdit(strgrpdsc As String, strzondsc As String, ID As Long)
Dim qdf As DAO.QueryDef
Dim qdfOLD As String

Set qdf = CurrentDb.QueryDefs("InventoryQryforDS")
    With qdf
        .SQL = "SELECT Products.ProductCode, Products.ProductName, Products.GRPDSC, Categories.Category, Inventory.Available " & _
               "FROM (Categories INNER JOIN Products ON Categories.ID = Products.CategoryID) INNER JOIN Inventory ON Products.ID = Inventory.ProductID " & _
               "WHERE Products.GRPDSC in (" & strgrpdsc & ") and Categories.Category in (" & strzondsc & ") and products.ownersid =" & ID & _
               " ORDER BY Products.ProductCode"


    End With
Set qdf = Nothing

End Sub

查询的结果显示在一个表单上,这是当前正在重新查询并显示错误数据的内容。

谢谢

EDIT - 数据显示在表单上,​​链接到如图所示的新样式导航按钮之一。表单的 recordsource 属性是填充的查询如上所述。

【问题讨论】:

    标签: sql ms-access macros view vba


    【解决方案1】:

    对于您解决此问题的方法,我有一些建议/更正。

    使用 DLookup 时,请确保将它们包含在 Nz() 函数中,如果找不到您要查找的值,您可能会遇到将 Null 值分配给以下数据类型的麻烦无法处理 Null。除了 Variant 类型之外的任何东西都会受到影响。

    您似乎在桌面上没有一个,而是 四个 DLookup。这可能非常昂贵。这可以通过使用一个简单的 RecordSet 对象来最小化。

    我不会使用 TempVars,因为它们可能难以理解和实施。

    您为什么要编辑查询?就内存而言,这可能又有点贵。您如何显示产品列表?在 DataSheet 或 ComboBox 或 LsitBox 中?您可以再次更改对象的 RecordSource 或 RowSource,而不是编辑 Query 本身。

    最后,您的用户都应该拥有前端文件的单独副本。没有一份被 20-30 人使用。如果文件被限制为一个人使用,那么无论修改代码都应该可以工作。因为用户将始终可以访问正确的数据。

    【讨论】:

    • 感谢您的回复。请问我将如何使用记录集对象代替 Dlookups?我试图做的是根据用户填写的登录表单中的输入从员工表中获取值,例如员工 ID 和姓名。如果我说实话,我也不赞成 tempvars 的想法,但我认为他们会在这种情况下工作。我正在编辑查询,(也许这是被误导的)试图根据用户的 ID 号为用户创建一个动态的“视图”。 products 表有一个 ID 号列,我试图根据此过滤用户将看到的产品列表。
    • 至于有一个单独的前端副本,我尝试拆分数据库,但由于这是一个访问网络数据库(基于我修改过的微软模板),一些数据宏拆分后没有工作。您以前是否使用过 Web 数据库,如果是,您是如何拆分它们的。欢呼
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多