Доступ к базе данных с использованием do.cmd openform where clasue - возвращение всех значений - PullRequest
0 голосов
/ 10 апреля 2010

DoCmd.OpenForm "Поиск в базе данных", acFormDS,, srcLastName & "AND" & srcFirstName

Это лишь небольшой пример предложения where - есть еще много терминов.

Во-первых, есть набор типов If, Then, которые устанавливают переменные srcLastName и srcFirstName в какое-то значение. Это не проблема и работает просто отлично.

Проблема в том, что они возвращают все значения (например, если вы хотите выполнить поиск только по одному, ни по одному из них (возврат полного списка базы данных))

До сих пор я согласился (в разделе если тогда):

srcLastName = "[Lastname] =" & Chr (34) & cboLastName & Chr (34) - для поиска чего-либо и

srcLastName = "[Lastname] <>" & Chr (34) & "Nuthin" & Chr (34) - чтобы вернуть все (не равносильно абсурдному и неправильно введенному термину базы данных.)

Проблема в том, что нулевые данные также не возвращаются. Если у меня пустое имя, оно не будет отображаться ни в одном из периодов поиска.

есть ли термин, который я могу установить [lastname] и [firstname] равными, которые будут возвращать ВСЕ (ноль, открытый, данные, числа, странные вещи и т. Д.) В поиске

форма SQL "дай мне все, что она получила Скотти", если хотите.

реальная проблема здесь заключается в вводе данных - если бы я мог просто знать, что люди будут вводить все 100% времени, этот код работал бы. но не забудьте ввести возраст людей или что-то еще, и эта запись не будет возвращена.

Пока что единственное другое решение, которое я нашел, - это поставить счетчик в каждое утверждение if then. Количество будет увеличиваться на единицу для каждой вещи, которую ищет. Тогда, если счет = 1, тогда я могу искать что-то вроде

DoCmd.OpenForm "Поиск в базе данных", acFormDS,, srcLastName

или

DoCmd.OpenForm "Поиск в базе данных", acFormDS,, srcFirstName

затем вернитесь обратно к

DoCmd.OpenForm "Поиск в базе данных", acFormDS,, srcLastName & "AND" & srcFirstName

когда количество равно 2 или больше

неприятно то, что он работает только для одного (если только я не хотел создать список из двух комбинированных, 3 комбинированных, 4 комбинированных, но этого не происходит)

Ответы [ 3 ]

0 голосов
/ 16 апреля 2010

Хорошо, поэтому ответ для меня, по крайней мере, состоит в том, чтобы создать условие 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 с выражением where вроде ...

DoCmd.OpenForm "Database Search", acFormDS, , srcLastName & srcFirstName

Это не красиво, и я, вероятно, мог бы оптимизировать его, но Ima ленивый кодер, так что не исправляйте его, если он сломался.

0 голосов
/ 18 апреля 2010

Это не очень сложная проблема. Ключ, как вы обнаружили, состоит в том, чтобы не иметь критерия для конкретного поля, если вы не хотите фильтровать его. Но ваш код излишне запутан. Вот более простой код:

  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, выполнив это таким образом с минимумом кода.

0 голосов
/ 16 апреля 2010

Похоже, вы хотите:

  1. создание сложного запроса на лету
  2. используйте форму, чтобы позволить пользователю разработать запрос
  3. справиться с ненормальными данными

Для # 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

...