如何编码一个sql字符串在vba中使用大于或小于符号在我的MS Access表单,在一个文本框中搜索日期时



我有一个记录列表,我可以通过输入各种日期或在日期之间进行选择来搜索,并使用sql脚本返回结果。但是我想知道如何在日期文本框中使用大于符号,并让sql脚本识别它并返回大于例如">7/1/2021">

的日期谢谢你的帮助。

我的方法是使用一个组合框,其中包含存储为值列表的各种操作符(<=,<,=,>,>=),以及包含日期的文本框。这是一个好主意,因为您限制了用户可以进行比较的选择,并且您仍然可以使用组合框中日期字段的输入掩码。

然后可以将比较和日期连接到提供搜索的SQL字符串中。比如:


Private Sub cmdSearch_Click()
On Error GoTo E_Handle
Dim strSQL As String
Const JetDateFmt = "#mm/dd/yyyy#;;;Null"
strSQL = "SELECT * " _
& " FROM TB_Edditions " _
& " WHERE ED_Start_Date " & Me!cboOperator & Format(Me!txtDate, JetDateFmt) _
& " ORDER BY ID ASC;"
Me!lstResult.RowSource = strSQL
sExit:
On Error Resume Next
Exit Sub
E_Handle:
MsgBox Err.Description & vbCrLf & vbCrLf & "frmDateSearch!cmdSearch_Click", vbOKOnly + vbCritical, "Error: " & Err.Number
Resume sExit
End Sub

在本例中,我使用创建的SQL填充列表框。您将注意到,我正在强制输入特定格式的日期,以便正确地解释它。

不清楚如何调用sql查询,这很重要,但一种方法是您可以访问访问中的任何地方的公共函数。因此,如果你有公共函数GetOperator和GetDate,你可以将它们作为参数传递给sql查询,直接绑定到sql查询,或者在设计器中使用它们:对于像

Private Sub txtFilter_BeforeUpdate(Cancel As Integer)
'text box name is txtFilter
If isValidOperator(Me.txtFilter) And isValidDate(Me.txtFilter) Then
Cancel = False
setmysearchcriteria = Me.txtFilter
Else
MsgBox "Search criteria must be in the form of operatordate such as <4/12/21", vbOKOnly
Cancel = True
Exit Sub
End If
End Sub
Public Function isValidOperator(strText As String) As Boolean
Dim operator As String
operator = Left(strText, 1)
If operator = ">" Or operator = "<" Then
SetOperator (operator)
isValidOperator = True
Else
isValidOperator = False
End If
End Function
Private Function isValidDate(strDate As String) As Boolean
strDate = Mid(strDate, 2)
If IsDate(strDate) Then
SetDate (strDate)
isValidDate = True
Else
isValidDate = False
End If
End Function

下面是作为合成属性的公共函数的代码。只需将Get函数作为参数传递,或者直接在sql.

中作为函数调用它们。
Private strMyDate As String
Private myoperator As String
Public Function SetDate(strDate As String) As Boolean
strMyDate = "#" & strDate & "#"
SetDate = True
End Function
Public Function GetDate() As String
GetDate = strMyDate
End Function
Public Function SetOperator(operator As String) As Boolean
myoperator = operator
SetOperator = True
End Function
Public Function GetOperator() As String
GetOperator = myoperator
End Function

在大多数情况下,您将希望在文本框AfterUpdate事件中触发sql。例如,如果在BeforeUpdate事件中触发sql,则不会显示对文本框所在表单的更改。

Private Sub txtFilter_AfterUpdate()
'trigger your sql here instead of setting the filter
Me.Filter = "ADate " & GetOperator & " " & GetDate
Debug.Print Me.Filter
Me.FilterOn = True
Me.Requery
End Sub

就像@braX说的,把你的日期用两个#字符括起来。

最新更新