0

为了使更长的故事更短:

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

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

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

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

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

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

(这一切有意义吗?)

您对我有什么建议吗?如何让子表单读取主表单上的字段以运行其查询?或者,是否有更简单的方法来做到这一点,即在表单中放置 SQL 调用?

非常感谢您的帮助...

4

1 回答 1

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" 

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

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
于 2016-08-01T22:07:05.600 回答