今天,想设计一个窗体,窗体中有个文本框,然后按文本框的条件实时更新查询清单。
在上图输入时间
查询结果就实时刷新,这个不是在窗体中刷新,而是直接刷新Access默认的查询。
方法一:
代码部分:
1,删除旧的查询(我不知道这个是不是很好,但是只有删除旧的,才能使用CreateQueryDef
Dim qryname, sql As String
Dim Qry1 As QueryDef
For Each Qry1 In CurrentDb.QueryDefs
If Qry1.Name = "按日期查询" Then
CurrentDb.QueryDefs.Delete Qry1.Name
Exit For
End If
Next
2,刷新项目清单中的Query,因为新建Query很快会被执行,所有基本感觉不到被删除了。
CurrentDb.QueryDefs.Refresh
3,新建一个和之前名字一样的Query:
sql = "select * from 日记账表 where 日期= #" & Text0.Value & "#"
qryname = "按日期查询"
CurrentDb.CreateQueryDef qryname, sql
4,判断指定的Query是否被打开,如果打开状态,我们就关闭它。
为什么呢?
查询的清单我不知道怎么实时刷新?但是我知道关闭查询,再打开查询,查询结果就会被刷新了。因为速度很快,基本感觉不到关闭>重新打开的这个过程。
On Error Resume Next
If SysCmd(acSysCmdGetObjectState, acQuery, Qry1.Name) <> 0 Then
DoCmd.Close acQuery, Qry1.Name
End If
5,重新执行查询,并重新打开:
DoCmd.OpenQuery Qry1.Name
第二种方法:
1,直接在QBE中设计(直接以某个控件的值为条件)
SQL代码等于:
SELECT 日记账表.*
FROM 账户列表 INNER JOIN 日记账表 ON 账户列表.账户编号 = 日记账表.账户编号
WHERE (((日记账表.日期)=[Forms]![Form1]![Text0]));
2,在VBE中输入代码:
Tips:ADODB那几句连接数据库不需要写的!放在这个仅做强化记忆用!
Private Sub Command2_Click()
'Dim str
'Dim rs As New ADODB.Recordset
'Set rs = New ADODB.Recordset
'str = "select * from 日记账表"
'rs.Open str, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
On Error Resume Next
If SysCmd(acSysCmdGetObjectState, acQuery, "Q1") <> 0 Then
DoCmd.Close acQuery, "Q1"
End If
DoCmd.OpenQuery "Q1"
End Sub
小结:
1,方法一是使用VBA和SQL新建一个查询
2,方法二是直接使用Access的查询设计已有的查询。
个人偏好,还是喜欢方法一,可以代码一路撸到底。