Microsoft Access 2010 - 动态查询

时间:2014-12-17 10:06:58

标签: sql ms-access macros view access-vba

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

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

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

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

或者是一种更好的方式来实现我的尝试?我很难接触和挣扎。有人可以帮忙吗?

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

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

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

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

由于

编辑 - 数据显示在表单上,​​链接到其中一个新样式导航按钮,如下所示。表单的 recordsource 属性是&#的查询39;如上所述填充。

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

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

我不会使用 TempVars ,因为理解和实施它们可能很棘手。

为什么编辑查询?就内存而言,这可能再次有点昂贵。你是如何展示产品清单的?在DataSheet或ComboBox或LsitBox?您可以再次更改Objects的RecordSource或RowSource,而不是编辑Query本身。

最后,您的用户应该都拥有前端文件的单独副本。不是20-30人使用的副本。如果文件被限制为由一个人使用,则代码应该工作而不管是否被修改。因为用户可以随时访问正确的数据。