访问-查询保留旧标准,子窗体不会刷新

问题描述 投票:0回答:1

我目前正在从头开始重新设计我公司的访问数据库,没有任何经验,因为对其结构的最后一次编辑是在2006年进行的,基本上它是一个包含200k记录的列表,它很慢。 (当前具有有效功能的测试已经显示出明显的改进,是的!)

我试图创建一个显示查询结果的子表单,但是查询本身取决于多选。该查询将根据客户ID进行操作,并根据所选客户返回结果。 (有效)

我一直在寻找解决方案,但是,我不知道该怎么办。我正在处理的问题是双重的,我怀疑是相关的,但首先是上下文。

首先,子表单只是拒绝视觉更新。虽然查询保留了所需的结果,但子窗体根本不会更新,我尝试过刷新docmd.requery,您将其命名,唯一起作用的基本上是“重新附加”源代码。无法从“表面”访问设法刷新显示结果的任何方式。

其次,查询似乎可以“保留”先前选择的任何客户端。即使它可以从所有客户(我将其写为“没有选择就意味着一切”)传播到特定客户,但在选择之间,它仍保留先前选择的标准,并将其提出来。

'Dashboard'是嵌套子表单TabGeneralSubform的表单,qryTetraGeneral是用作子表单源的查询。 MultiCustomer是多选表单。

Sub ListAll_Click() [access vba]


Set MyDB = CurrentDb
flgSelectAll = 0

Set qdef = MyDB.QueryDefs("qryTetraGeneral")

'strSQL is based on the SQL conversion of the SelectClientAll query
'the final AND clause will be appended by strWhere which is based on the MultiList Selection
'If there is no selection the query will default to All active Subs

 strSQL = "SELECT [EQ-TETRA_ISSI].ISSI,[EQ-TETRA_TEI].TEI, [EQ-TETRA_ISSI].Active," & _
    " [EQ-TETRA_TEI].Activation, Client_Table.[Customer Name], Client_Table.[Customer ID], [EQ-TETRA_REQFUL].ReqType, SERVICEREQUEST_TABLE.REQNUM," & _
    " SERVICEREQUEST_TABLE.REQDATE, SERVICEREQUEST_TABLE.RESPUSER" & _
    " FROM ((Client_Table INNER JOIN [EQ-TETRA_ISSI] ON Client_Table.[External Customer Index] = [EQ-TETRA_ISSI].[Customer Index])" & _
    " INNER JOIN SERVICEREQUEST_TABLE ON Client_Table.[External Customer Index] = SERVICEREQUEST_TABLE.Index) INNER JOIN ([EQ-TETRA_TEI]" & _
    " INNER JOIN [EQ-TETRA_REQFUL] ON [EQ-TETRA_TEI].TEI = [EQ-TETRA_REQFUL].TEI) ON (SERVICEREQUEST_TABLE.REQNUM = [EQ-TETRA_REQFUL].Reqnum)" & _
    " AND ([EQ-TETRA_ISSI].ISSI = [EQ-TETRA_REQFUL].ISSI)" & _
    " WHERE ((([EQ-TETRA_TEI].TEI)=[EQ-TETRA_REQFUL].[TEI]) AND (([EQ-TETRA_ISSI].Active)=True) AND (([EQ-TETRA_TEI].Activation)=True) AND ("

'extracts selection from list and creates SQL line to be added to strSQL

 For i = 0 To MultiCustomer.ListCount - 1
    If MultiCustomer.Selected(i) Then
        flgSelectAll = flgSelectAll + 1
        strIN = strIN & "([EQ-TETRA_ISSI].[Customer Index]=" & MultiCustomer.Column(0, i) & ")" & " OR "
    End If
 Next

 If flgSelectAll = 0 Then
    strSQL = "SELECT [EQ-TETRA_ISSI].ISSI,[EQ-TETRA_TEI].TEI, [EQ-TETRA_ISSI].Active," & _
    " [EQ-TETRA_TEI].Activation, Client_Table.[Customer Name], Client_Table.[Customer ID], [EQ-TETRA_REQFUL].ReqType, SERVICEREQUEST_TABLE.REQNUM," & _
    " SERVICEREQUEST_TABLE.REQDATE, SERVICEREQUEST_TABLE.RESPUSER" & _
    " FROM ((Client_Table INNER JOIN [EQ-TETRA_ISSI] ON Client_Table.[External Customer Index] = [EQ-TETRA_ISSI].[Customer Index])" & _
    " INNER JOIN SERVICEREQUEST_TABLE ON Client_Table.[External Customer Index] = SERVICEREQUEST_TABLE.Index) INNER JOIN ([EQ-TETRA_TEI]" & _
    " INNER JOIN [EQ-TETRA_REQFUL] ON [EQ-TETRA_TEI].TEI = [EQ-TETRA_REQFUL].TEI) ON (SERVICEREQUEST_TABLE.REQNUM = [EQ-TETRA_REQFUL].Reqnum)" & _
    " AND ([EQ-TETRA_ISSI].ISSI = [EQ-TETRA_REQFUL].ISSI)" & _
    " WHERE ((([EQ-TETRA_TEI].TEI)=[EQ-TETRA_REQFUL].[TEI]) AND (([EQ-TETRA_ISSI].Active)=True) AND (([EQ-TETRA_TEI].Activation)=True)) ORDER BY [EQ-TETRA_ISSI].ISSI;"
Else
    strWhere = Left(strIN, Len(strIN) - 3) & ")) ORDER BY [EQ-TETRA_ISSI].ISSI;"
    strSQL = strSQL + strWhere
End If

qdef.SQL = strSQL
Call CallRefreshForm([Forms]![Dashboard])

For Each ListObject In MultiCustomer.ItemsSelected
    MultiCustomer.Selected(ListObject) = False
Next ListObject

现在,坦率地说,代码与我的前任遗留下来的内容有点拼凑在一起,SQL语句看起来像一团糟,但是,它可以工作并根据标准显示所需的结果,目前,该结果足以满足要求我。当我知道所有需要的功能都在工作时,我可能会稍后尝试将其缩小。

sql ms-access access-vba
1个回答
0
投票
有几种方法可以简化。首先,当您基于列表框构建SQL而不是使用很多IN/OR时,只需使用IN一次(我在此处进行空中编码,因此请原谅任何轻微的错误)

For i = 0 To MultiCustomer.ListCount - 1 If MultiCustomer.Selected(i) Then strSQL = strSQL & MultiCustomer.Column(0, i) & "," End If Next i If Right(strSQL,1)="," Then strSQL=Left(strSQL,Len(strSQL)-1) If Len(strSQL)>0 Then strSQL="SELECT [EQ-TETRA_ISSI].ISSI,[EQ-TETRA_TEI].TEI, [EQ-TETRA_ISSI].Active," & _ " [EQ-TETRA_TEI].Activation, Client_Table.[Customer Name], Client_Table.[Customer ID], [EQ-TETRA_REQFUL].ReqType, SERVICEREQUEST_TABLE.REQNUM," & _ " SERVICEREQUEST_TABLE.REQDATE, SERVICEREQUEST_TABLE.RESPUSER" & _ " FROM ((Client_Table INNER JOIN [EQ-TETRA_ISSI] ON Client_Table.[External Customer Index] = [EQ-TETRA_ISSI].[Customer Index])" & _ " INNER JOIN SERVICEREQUEST_TABLE ON Client_Table.[External Customer Index] = SERVICEREQUEST_TABLE.Index) INNER JOIN ([EQ-TETRA_TEI]" & _ " INNER JOIN [EQ-TETRA_REQFUL] ON [EQ-TETRA_TEI].TEI = [EQ-TETRA_REQFUL].TEI) ON (SERVICEREQUEST_TABLE.REQNUM = [EQ-TETRA_REQFUL].Reqnum)" & _ " AND ([EQ-TETRA_ISSI].ISSI = [EQ-TETRA_REQFUL].ISSI)" & _ " WHERE [EQ-TETRA_TEI].TEI=[EQ-TETRA_REQFUL].[TEI] " _ & " AND [EQ-TETRA_ISSI].Active=True " _ & " AND [EQ-TETRA_TEI].Activation=True " _ & " AND [EQ-TETRA_ISSI].[Customer Index] IN (" & strSQL & ") Else strSQL="SELECT [EQ-TETRA_ISSI].ISSI,[EQ-TETRA_TEI].TEI, [EQ-TETRA_ISSI].Active," & _ " [EQ-TETRA_TEI].Activation, Client_Table.[Customer Name], Client_Table.[Customer ID], [EQ-TETRA_REQFUL].ReqType, SERVICEREQUEST_TABLE.REQNUM," & _ " SERVICEREQUEST_TABLE.REQDATE, SERVICEREQUEST_TABLE.RESPUSER" & _ " FROM ((Client_Table INNER JOIN [EQ-TETRA_ISSI] ON Client_Table.[External Customer Index] = [EQ-TETRA_ISSI].[Customer Index])" & _ " INNER JOIN SERVICEREQUEST_TABLE ON Client_Table.[External Customer Index] = SERVICEREQUEST_TABLE.Index) INNER JOIN ([EQ-TETRA_TEI]" & _ " INNER JOIN [EQ-TETRA_REQFUL] ON [EQ-TETRA_TEI].TEI = [EQ-TETRA_REQFUL].TEI) ON (SERVICEREQUEST_TABLE.REQNUM = [EQ-TETRA_REQFUL].Reqnum)" & _ " AND ([EQ-TETRA_ISSI].ISSI = [EQ-TETRA_REQFUL].ISSI)" & _ " WHERE [EQ-TETRA_TEI].TEI=[EQ-TETRA_REQFUL].[TEI] " _ & " AND [EQ-TETRA_ISSI].Active=True " _ & " AND [EQ-TETRA_TEI].Activation=True " End If strSQL=strSQL & " ORDER BY [EQ-TETRA_ISSI].ISSI;"

我也不相信您需要在[EQ-TETRA_TEI].TEI=[EQ-TETRA_REQFUL].[TEI]子句中使用WHERE,因为您已经在使用它来将两个表连接在一起。

问候,

© www.soinside.com 2019 - 2024. All rights reserved.