使用docmd openform where子句访问数据库 - 返回所有值

时间:2010-04-09 20:29:23

标签: sql ms-access access-vba

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合并的定制列表,但这没有发生)

3 个答案:

答案 0 :(得分:0)

看起来你想:

  1. 即时创建复杂查询
  2. 使用表单让用户设计查询
  3. 处理非正常数据
  4. 对于#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子句添加任意数量的条件。