【问题标题】:Passing a query a parameter [Access 2016]向查询传递参数 [Access 2016]
【发布时间】:2016-08-01 20:48:21
【问题描述】:

为了让故事更短:

我是一个 Access 菜鸟,正在快速将大量 Excel 电子表格转换为 Access 数据库。部分要求是模仿 Excel 的一些功能,特别是从某个表中提取数据并对其进行一些基本计算(总和、平均值等)。

我已经编写了一个查询链来提取数据、计数/求和等,并且一直在使用手动输入的参数(即输入框弹出并询问您的那种类型)来测试它们键入响应)。现在,我已准备好将这些查询放入(子)表单中,但是,我不知道如何自动将该参数从表单中的框传递到子表单到查询中。

我编写的每个查询都使用名为“MATCHNAME”的手动输入参数,其中包含个人姓名。在手动测试中,如果我在一个查询中输入此参数,则 it 调用的所有查询也会获得该值。所以,我想我只需要弄清楚如何告诉顶级查询 MATCHNAME 实际上是什么,然后就可以解决了。

问题是,我不知道如何在 Access 中执行此操作。如果它是任何其他编程语言,我会执行类似“queryXYZ(MATCHNAME);”的操作,但我认为我无法在 Access 中执行此操作。另外,由于 queryXYZ 返回的值都是计算出来的,我不确定如何添加额外的 MATCHNAME 字段,也不确定如何实际确保查询读取该字段,也不确定如何确保它沿链传递。我什至尝试在设计视图中创建一个参数,然后尝试设置链接主字段,但该参数没有出现在该窗口中。

我还想在提取新记录时重新运行这些查询,但我也不知道该怎么做——即,对于我正在查看的任何记录,这些数字都应该是最新的.

而且,在我们去那里之前——我觉得关系是不可能的,因为数据本身是自动生成的,而且形状很粗糙,我无法保证任何给定的键都是完整的独特的,足够大(20k+),除了写一个神奇的脚本之外,我不能分配一个数字键。但是,我对 Access 中的关系了解不多,所以证明我错了。

(这一切都有意义吗?)

您对我有什么建议吗?如何让子表单读取主表单上的字段以运行其查询?或者,是否有更简单的方法来执行此操作,即在表单中嵌入 SQL 调用?

非常感谢您的帮助...

【问题讨论】:

  • 嗯。将所有查询中的参数替换为 Forms!MyForm![MatchName] ?

标签: sql ms-access ms-access-2016


【解决方案1】:

您可以在属性选项卡中使用 SQL 作为子表单的记录源,并使用 matchname 字段的 afterupdate 事件来更改 yourform.recordsource = "Select * from table where filteredfieldname = & me.matchname & ";" 。也可以使用sql作为表单域的控制源。要传递条件以使用整个表作为记录源来过滤子表单,请在字段的更新后事件中添加一个事件过程,如下所示

`In the declarataions at the top
Global mtchnmfltr as string 

Private Sub MATCHNAME_AfterUpdate() 
'use the same procedure for Private Sub yourmainform_Current() 
mtchnmfltr  = "[yourfilterfield] = " & Chr(34) & me.matchname & Chr(34)  
'if matchname is not text then just = "[yourfilterfield] = " & me.matchname  
with me.subformname.form  
.filter = mtchnmfltr  
.filteron = true  
end with
'Build your sql as a string for your sum avg fields etc. using mtchnmfltr in the where clause  
 me.yoursumfield.controlsource = "Select...where " & mtchnmfltr & ";"
 'etc.
 end sub  

或者您可以将 Matchname 放入子表单的 sql 记录源中,并在当前事件和更新事件后将函数字段添加到子表单中

if me.newrecord = true then    
me.dirty = false  
end if  
me.subform.form.recordsource = "Select Table.Matchname, sum(yourfield) as sumalias, _  
(etc.) from yourtable where table.matchname = " & chr(34) & me.matchname & _  
chr(34) & Group By table.matchname" 

如果您将总和等存储在表格中,则需要做一些不同的事情,因为您的控件 controlsource 绑定到字段。

dim strsqlsumfld as string 
dim rs as dao.recordset 
strsqlsumfld= "Select SUM.....AS sumfldalias where " & mtchnmfltr & ";"  
set rs = currentdb.openrecordset(strsqlsumfld) 
me.yoursumfield = rs("sumfldalias")
rs.close

【讨论】:

    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多