Есть ли более быстрая альтернатива DLookup для заполнения несвязанных текстовых полей в форме? - PullRequest
0 голосов
/ 28 января 2019

Я использую DLookup для поиска поля в таблице.Он работает правильно, но медленно.Могу ли я что-нибудь сделать, чтобы ускорить его?

Вот мой существующий код:

Me(k1) = Dlookup("[KLant]", "[Planning_tbl02]", "[Plek#]=" & p & " AND [datum]='" & Me(k4) & "'" & " AND [bezet_ochtend]='" & "bezet" & "'")

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Вы можете написать свой собственный код поиска, который открывает набор записей и находит нужное значение, например:

Dim strCriteria As String, strQuery As String

strCriteria = _
    BuildCriteria("[Plek#]", dbLong, p) & " And " & _
    BuildCriteria("[datum]", dbDate, Me(k4)) & " And " & _
    BuildCriteria("[bezet_ochtend]", dbText, """bezet""")

strQuery = "SELECT [KLant] FROM [Planning_tbl02] WHERE " & strCriteria

With CurrentDb.OpenRecordset(strQuery, dbOpenForwardOnly)
    If Not .EOF Then
        Me(k1) = ![KLant]
    Else
        Me(k1) = Null
    End If
    .Close
End With

Добавлено:

После просмотра вашего кодаЯ обнаружил, что операторы для нечетных и четных значений k2 не сильно отличаются, поэтому я смог немного упростить код.Кроме того, я обнаружил, что k4 изменяется только для нечетных значений k2, что вдвое уменьшает количество запросов к базе данных.Это означает, конечно, что во второй половине дня не будет никакой разницы.Наконец, как и было обещано в моем комментарии, я уменьшил количество наборов записей до 30 и реализовал поиск по датам с FindFirst.Вот мой результат:

Private Sub Form_Load()

    Dim p As Integer, k2 As Integer
    Dim k1 As String, k1_prev As String, k4 As String
    Dim r1 As Integer, g As Integer, b As Integer
    Dim strCriteria As String, strQuery As String

    For p = 1 To 30

        If r1 < 49 Then r1 = 255 Else r1 = r1 - 49
        If g > 203 Then g = 100 Else g = g + 52
        If b < 127 Then b = 160 Else b = b - 127

        strQuery = "SELECT [KLant], [datum] FROM [Planning_tbl02] WHERE " & _
            BuildCriteria("[Plek#]", dbLong, p) & " And " & _
            BuildCriteria("[bezet_ochtend]", dbText, """bezet""")

        With CurrentDb.OpenRecordset(strQuery, dbOpenDynaset)
            For k2 = 1 To 26

                k1_prev = k1
                k1 = "pl" & p & "_" & k2

                If k2 Mod 2 = 1 Then
                    k4 = "calday" & (k2 + 1) \ 2
                    .FindFirst BuildCriteria("[datum]", dbDate, Me(k4))
                    If .NoMatch Then Me(k1) = Null Else Me(k1) = ![klant]
                Else
                    Me(k1) = Me(k1_prev)
                End If

                If Not IsNull(Me(k1)) Then
                    If k2 = 1 Then
                        Me(k1).BackColor = RGB(r1, g, b)
                    Else
                        If Me(k1) <> Me(k1_prev) Then 'next color
                            If r1 < 49 Then r1 = 255 Else r1 = r1 - 49
                            If g > 203 Then g = 100 Else g = g + 52
                            If b < 127 Then b = 160 Else b = b - 127
                        End If
                        Me(k1).BackColor = RGB(r1, g, b)
                    End If
                End If

            Next
            .Close
        End With
    Next

End Sub
0 голосов
/ 29 января 2019

спасибо за ваши ответы.Это форма с +/- 780 несвязанными текстовыми полями, которые должны быть заполнены данными из таблицы.Я создаю программу для небольшого кемпинга, и эта форма является своего рода планированием доступных мест в день.Таким образом, у них есть 30 мест, и они хотят видеть 2 недели, так много полей, потому что они также хотят разделить день утром и днем.Я знаю, что, возможно, это не правильный путь к программе, но мои знания в данный момент невелики: - (

Так что, если у кого-то есть хорошее предложение, я буду очень признателен за это.

Полный код приведен ниже, это цикл в цикле.

Private Sub Form_Load()

For p = 1 To 30
k2 = 1
k3 = 1

r1 = r1 - 49
g = g + 52
b = b - 127

If r1 < 0 Then r1 = 255
If g < 0 Then g = 200
If b < 0 Then b = 160

If r1 > 255 Then r1 = 31
If g > 255 Then g = 100
If b > 255 Then b = 56

For k2 = 1 To 26

k1 = "pl" & p & "_" & k2
k4 = "calday" & k3

If r1 < 0 Then r1 = 255
If g < 0 Then g = 200
If b < 0 Then b = 160

If r1 > 255 Then r1 = 31
If g > 255 Then g = 100
If b > 255 Then b = 56

If k2 Mod 2 = 1 Then

Dim strCriteria As String, strQuery As String
strCriteria = _
BuildCriteria("[Plek#]", dbLong, p) & " And " & _
BuildCriteria("[datum]", dbDate, Me(k4)) & " And " & _
BuildCriteria("[bezet_ochtend]", dbText, """bezet""")

strQuery = "SELECT [KLant] FROM [Planning_tbl02] WHERE " & strCriteria

With CurrentDb.OpenRecordset(strQuery, dbOpenForwardOnly)
If Not .EOF Then
 Me(k1) = ![klant]
 Else
Me(k1) = Null
End If
 .Close
End With 

If k2 = 1 Then

If Me(k1).Value <> "" Then
Me(k1).BackColor = RGB(r1, g, b)
End If
End If

If k2 - 1 > 0 Then

If Me(k1).Value <> "" And IsNull(Me("pl" & p & "_" & (k2 - 1)).Value) Then
Me(k1).BackColor = RGB(r1, g, b)
End If
End If

If k2 - 1 > 0 Then

If Me(k1).Value <> "" And Me("pl" & p & "_" & k2) = Me("pl" & p & "_" & (k2 - 1))Then
Me(k1).BackColor = RGB(r1, g, b)
End If
End If

If k2 - 1 > 0 Then

If Me("pl" & p & "_" & k2) <> Me("pl" & p & "_" & (k2 - 1)) Then
r1 = r1 - 49
g = g + 52
b = b - 127

Me(k1).BackColor = RGB(r1, g, b)
End If
End If
End If

If k2 Mod 2 <> 1 Then
strCriteria = _
BuildCriteria("[Plek#]", dbLong, p) & " And " & _
BuildCriteria("[datum]", dbDate, Me(k4)) & " And " & _
BuildCriteria("[bezet_ochtend]", dbText, """bezet""")

strQuery = "SELECT [KLant] FROM [Planning_tbl02] WHERE " & strCriteria

With CurrentDb.OpenRecordset(strQuery, dbOpenForwardOnly)
If Not .EOF Then
 Me(k1) = ![klant]
 Else
Me(k1) = Null
End If
.Close
End With

If Me(k1).Value <> "" And IsNull(Me("pl" & p & "_" & (k2 - 1)).Value) Then
Me(k1).BackColor = RGB(r1, g, b)
End If

If Me(k1).Value <> "" And Me("pl" & p & "_" & k2) = Me("pl" & p & "_" & (k2 - 1))Then
Me(k1).BackColor = RGB(r1, g, b)
End If

If k2 - 1 > 0 Then
If Me(k1).Value <> "" And Me("pl" & p & "_" & k2) <> Me("pl" & p & "_" & (k2 - 1)) Then
Me(k1).BackColor = RGB(r1, g, b)
End If
End If

If k2 - 1 > 0 Then

If Me("pl" & p & "_" & k2) <> Me("pl" & p & "_" & (k2 - 1)) Then
r1 = r1 - 49
g = g + 52
b = b - 127

If r1 < 0 Then r1 = 255
If g < 0 Then g = 200
If b < 0 Then b = 160

Me(k1).BackColor = RGB(r1, g, b)
End If
End If
End If

If k2 Mod 2 <> 1 Then
k3 = k3 + 1
End If

Next

Next

End Sub
0 голосов
/ 28 января 2019

Добавьте indexes в таблицу полей, по которым вы фильтруете.

...