DoCmd.OpenForm“数据库搜索”,acFormDS,srcLastName& “和”& srcFirstName
这只是where子句的一小部分 - 还有更多术语。
首先,有一组If,然后输入top,将变量srcLastName和srcFirstName设置为某个值。这些都不是问题,而且工作正常。
麻烦的是让他们返回所有值(例如,如果你只想搜索一个,两者都没有(返回完整的数据库列表))
到目前为止,我已经解决了(在if部分中):
srcLastName =“[姓氏] =”& Chr(34)& cboLastName& Chr(34) - 搜索某些内容和
srcLastName =“[姓氏]<>” &安培; Chr(34)& “Nuthin”& Chr(34) - 返回所有内容(不等于荒谬和错误的数据库术语。)
麻烦的是,也不会返回null的数据。如果我有一个空名字,它将不会出现在任何搜索周期中。
是否有一个术语我可以设置[lastname]和[firstname]等于它将在搜索中返回一切(null,open,data,numbers,wierd stuff等)
如果你愿意的话,那就是“把我所有的东西都弄得很糟糕”的SQL形式。这里真正的问题来自于数据输入 - 如果我能够知道人们会在100%的时间内输入所有内容,那么这段代码就可以了。但是忘记进入人的年龄或其他什么,它不会返回那个条目。
到目前为止,我提出的唯一其他解决方案是在每个if语句中放置一个计数器。对于每个被搜索的东西,计数将增加一个。然后,如果计数= 1,那么我可以通过像
这样的东西进行搜索DoCmd.OpenForm“数据库搜索”,acFormDS,srcLastName
或
DoCmd.OpenForm“数据库搜索”,acFormDS,srcFirstName
然后恢复到
DoCmd.OpenForm“数据库搜索”,acFormDS,srcLastName& “和”& srcFirstName
当计数为2或更多时
这里的truoble是它只适用于一个(除非我想创建一个2合并,3合并,4合并的定制列表,但这没有发生)
答案 0 :(得分:0)
看起来你想:
对于#1 ,您的SQL技能不够强大。要处理空值,可以添加
OR IsNull([Lastname])
但我不认为你有能力申请。
对于#2 ,请检查: - http://www.mvps.org/access/forms/frm0045.htm
对于#3 ,数据验证应在录入时进行(当然并非总是可行)。这可以在表 - 字段级别完成:
- http://allenbrowne.com/ValidationRule.html
- http://www.databasejournal.com/features/msaccess/article.php/3680831/Designing-Forms-for-Efficient-and-Accurate-Data-Entry.htm)
......或者可以使用表单自动化完成:
- http://www.blueclaw-db.com/access_event_programming/beforeupdate.htm
答案 1 :(得分:0)
好的,所以对我来说至少答案就是在运行中建立where where子句 - 使用上面的if than else语句来做类似的事情......
If chkLastName.Value = False Then
srcLastName = ""
End If
'------------------------------------------
If chkLastName.Value = True Then
If cboLastName = "" Then
srcLastName = ""
Else
If IsNull(cboLastName) = True Then
srcLastName = ""
Else
varCounterSelector = varCounterSelector + 1
srcLastName = "[Lastname] =" & Chr(34) & cboLastName & Chr(34)
End If
End If
End If
If chkFirstName.Value = False Then
srcFirstName = ""
End If
'------------------------------------------
If chkFirstName.Value = True Then
If cboFirstname = "" Then
srcFirstName = ""
Else
If IsNull(cboFirstname) = True Then
srcFirstName = ""
Else
varCounterSelector = varCounterSelector + 1
If varCounterSelector > 1 Then
rdyFirstName = "[First name] = " & Chr(34) & cboFirstname & Chr(34)
rdyJoinSyntax = "and"
srcFirstName = rdyJoinSyntax & rdyFirstName
End If
If varCounterSelector <= 1 Then
srcFirstName = "[FirstName] =" & Chr(34) & cboFirstname & Chr(34)
End If
End If
End If
End If
然后是do.cmd openform,其中caluse就像......
DoCmd.OpenForm "Database Search", acFormDS, , srcLastName & srcFirstName
它不漂亮,我可能会优化它,但是我懒惰的编码器,所以如果它没有破坏就不要修复它。
答案 2 :(得分:0)
这不是一个非常复杂的问题。正如您所发现的那样,关键是当您不想对特定字段进行过滤时,该字符没有标准。但是你的代码不必要地复杂化了。这是更简单的代码:
Dim strLastName As String
Dim strFirstName As String
Dim strWhere As String
strLastName = Me!cboLastName & vbNullString
strFirstName = Me!cboFirstName & vbNullString
If Len(strLastName) > 0 Then
strWhere = strWhere & " AND " & Application.BuildCriteria("LastName", dbText, strLastName)
End If
If Len(strFirstName) > 0 Then
strWhere = strWhere & " AND " & Application.BuildCriteria("FirstName", dbText, strFirstName)
End If
DoCmd.OpenForm "Database Search", acFormDS, , Mid(strWhere, 6)
这是这种事情的沼泽标准代码。您可以使用最少的代码以这种方式向WHERE子句添加任意数量的条件。