传递查询参数[Access 2016]

时间:2016-08-01 20:48:22

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

缩短篇幅:

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

我已经编写了一系列查询来提取数据,计算/求和等等,并且已经使用手动输入的参数(即输入框弹出的类型和要求你输入一个回复)。既然我已准备好将这些查询放到(子)表单中,我不知道如何自动将该参数从表单中的框传递到子表单到查询中

我编写的每个查询都使用手动输入的名为" MATCHNAME,"它拥有个人的名字。在手动测试中,如果我在一个查询中输入此参数,则所有查询 it 调用也会获得该值。所以,我想我只需要弄清楚如何告诉顶级查询MATCHNAME实际上是什么,并且将会处理它。

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

我还想在每次提取新记录时重新运行这些查询,但我也不确定如何做到这一点 - 也就是说,对于我记录的任何记录,数字应该是最新的#39;我看着。

而且,在我们去那里之前 - 我觉得关系是不可能的,因为数据本身是自动生成的,而且形状足够粗糙,我无法保证任何给定的密钥是完全独特的,足够大(20k +),除了写一个神奇的剧本,我不能指定一个数字键。但是,我对Access中的关系知之甚少,所以证明我错了。

(这一切都有意义吗?)

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

非常感谢你的帮助...

1 个答案:

答案 0 :(得分: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