2012-08-13 33 views
0

我正在研究一个应允许用户从列表框中选择代码的应用程序,并且此值应作为参数传递给子表单(连续)它绑定到SQL查询以使用从查询返回的值填充表单。MS Access通过参数化查询动态填充连续表单子表

如何将父窗体上的列表框连接到连续窗体(子窗体),使列表框中的更改在子窗体中注册并且它(子窗体)会相应地重新填充?

下面的代码是我目前在我的父窗体中触发子窗体中的更改。但是我仍然错过了触发子表单中信息重新加载的位。

storedproc

SELECT tblACCOUNT.ACCOUNT_LABEL, tblACCOUNTValue.[ACCOUNTVALUE_VALUE] 
FROM ((tblUPS INNER JOIN tblProductUPS ON tblProductUPS.[PRODUCTUPS_UPS] = tblUPS.[UPS_CODE]) INNER JOIN tblACCOUNT ON tblUPS.UPS_ID = tblACCOUNT.ACCOUNT_UPSID) INNER JOIN tblACCOUNTValue ON tblACCOUNTVALUE.[ACCOUNTVALUE_ACCOUNTID]= tblACCOUNT.[ACCOUNT_ID] 
WHERE TBLPRODUCTUPS.[PRODUCTUPS_PRODUCTID] = (SELECT tblProductLevel.[PRODUCTLEVEL_ID] 

FROM tblProductLevel WHERE tblProductLevel.[PRODUCTLEVEL_Code] IN ([UPSIDS]) 

    ); 

这是我的子窗体字段,我想绑在我的查询作为查询参数的来源。

Public Property Let qString(unstring As String) 
    If Not IsNull(unstring) And Len(unstring) > 0 Then 
      Currentstring = unstring 
    End If 
End Property 

下面的代码是在我的母体形式我测试代码直接连接到我创建和直接传递参数到查询查询。但是,由于我的子表单本身与查询绑定,我需要一种方法来获取子表单查询并传递我需要传递的信息,然后在表单上调用更新。

Private Sub LoadSubform(unspscstring As String) 
On Error GoTo Err_LoadSubform_Change 

      Dim dbs As Database 
      Dim strSQL As String 
      Dim strSelect As String 
      Dim strQueryName As String 
      Dim qryDef As QueryDef 
      Dim rst As Recordset 
      Dim prmOne As DAO.Parameter 

      Set dbs = CurrentDb 
      'then we'll open up the query: 
      Set qryDef = dbs.QueryDefs("spgetAttributeByUNSPSC") 
      'Now we'll assign values to the query using the parameters option: 
       'link your DAP.Parameters to the query 
       'Set prmOne = qryDef.Parameters!param_one 
       'prmOne = unspscstring 
      qryDef.Parameters(0) = unspscstring 
      'Now need to somehow trigger an update on the subform 

      'Close all objects 
      rst.Close 
      qryDef.Close 
      Set rst = Nothing 
      Set qryDef = Nothing 
Bye_LoadSubform_Change: 
        Exit Sub 

Err_LoadSubform_Change: 
Beep:      MsgBox Error$, 16, "Select Failed" 
        Resume Bye_LoadSubform_Change 

End Sub 
+0

为什么你觉得有必要这样做,对付所有设置子表单的常用方法? – Fionnuala 2012-08-13 16:25:13

+0

你真的在使用DAP吗?他们前段时间过时了。 – Fionnuala 2012-08-13 16:28:27

+0

我对ACCESS相对来说比较陌生,所以我可能不会意识到处理这种情况的常见方法 – Kobojunkie 2012-08-13 16:39:57

回答

0

只要列表框中只允许一个项目,你可以使用子窗体的链接子和主域做到这一点。

Link Child Fields: ID; ListFieldMatch 
Link Master Fields : ID; MyListBox 

或者,也可以设置在VBA窗体控制的形式对象的记录源:

sSQL = "SELECT ID,Stuff FROM Table WHERE ID=" & Me.MyNumericListBox 
Me.MySubformControlName.Form.RecordSource = sSQL 
+0

有关的产品的子表单,我认为要做的就是从我的父表单传递参数,然后让子表单获取并重新 - 运行查询。这不是应该如何做? – Kobojunkie 2012-08-13 15:37:44

+0

恐怕您发布的代码无法在MS Access中运行。 – Fionnuala 2012-08-13 15:50:14

+0

我刚才调试了那段代码。最后请看新的代码和评论。 – Kobojunkie 2012-08-13 16:34:37

0

sSQL = “SELECT ID,东西FROM表WHERE ID =” & Me.MyNumericListBox Me.MySubformControlName.Form.RecordSource = sSQL

给出了一个错误2467运行时错误

“您输入的表达式指的是一个关闭或不存在的对象。

+0

请改善内容格式。它不清楚你的解决方案是什么 – 2014-02-14 11:06:02