首页 文章

传递查询参数[Access 2016]

提问于
浏览
0

缩短故事时间:

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

我已经准备好将这些查询放到(子)表单中,但是,我不知道如何自动将表单中的框中的参数传递到子表单中 .

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

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

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

而且,在我们去那里之前 - 我觉得关系是不可能的,因为数据本身是自动生成的,并且形状足够粗糙到我可以分配数字键的位置 . 但是,我对Access中的关系知之甚少,所以请证明我错了 .

(这一切都有意义吗?)

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

非常感谢您的帮助...

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"
    

    如果要将总和等存储在表中,则需要执行一些不同的操作,因为控件controlource绑定到字段 .

    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
    

相关问题