Как ускорить выполнения функционального запроса
antipod
Дата: 30.11.2015 13:20:41
В общем мне нужно что бы по набору данных в одно поле формы отфильтровывались записи в самой форме. С фильтром не работал не знаю как. Я сделал функцию в которую передаются все фильтруемые значения, а она уже решает - показывать запись или нет.
Но в результате на 25 тысяч записей она очень медленна. Не подскажет кто другой способ?
antipod
Дата: 30.11.2015 14:15:44
1121,
Function OtborFio(FF, II, OO, DD)
Dim FunStrok, F, I, O As String
Dim D As Date
Dim Rez As Boolean
Rez = True
F = ""
I = ""
O = ""
FunStrok = UCase(PazyentyOtbor_FioSokr())
If Len(FunStrok) >= 1 Then
F = Left(FunStrok, 1)
End If
If Len(FunStrok) >= 2 Then
I = Right(Left(FunStrok, 2), 1)
End If
If Len(FunStrok) >= 3 Then
O = Right(Left(FunStrok, 3), 1)
End If
If UCase(Left(FF, 1)) <> F Then Rez = False
If Rez And UCase(Left(II, 1)) <> I Then Rez = False
If Rez And UCase(Left(OO, 1)) <> O Then Rez = False
If Not IsNull(PazyentyOtbor_FDataRog()) Then
D = PazyentyOtbor_FDataRog()
If Rez And DD <> D Then Rez = False
End If
OtborFio = Rez
End Function
Rivkin Dmitry
Дата: 30.11.2015 14:24:27
Так у тебя не одна, а целых три функции.... Не приводи своего решения, лучше, на словах объясни ТЗ. А заодно покажи таблицы и запрос
antipod
Дата: 30.11.2015 14:34:14
Таблица Фамилия Имя Отчество и дата рождения и куча всего к ним. записей от 25-50 тысяч
ТЗ - нужно максимально упростить поиск людям не владеющим ПК
Как вариант в поле формы они Например вводят "КАВ" первая буква фамилия, вторая имя, третья отчество.
В форме должны отфильтроваться записи начинающиеся с этих букв. Как программно изменять фильтр формы я не знаю.
Сделал так как приведено выше, но оно медленно работает.
Как вариант подскажите как программно пользоваться фильтром формы, быстрее должно работать.
Rivkin Dmitry
Дата: 30.11.2015 14:38:01
В догонку. Функция написана очень небрежно, непродуманно. Возвращать будет неопределенные и неправильные значения. И все потому, что типы передаваемых параметров не прописаны. А значит, они вариант, а значит, они вполне могут получить null и все строковые функции будут сравнивать несравнимые велечины, возвращая черт знает что!
antipod
Дата: 30.11.2015 14:39:40
Rivkin Dmitry,
Это я хотел исправить уже в конце
ПЕНСИОНЕРКА
Дата: 30.11.2015 15:26:06
antipod,
автор |
---|
по набору данных в одно поле формы |
вы считаете, что это упростит выбор?
-----------уверена на 100 %, что усложнит
кто-то обязательно наберет только буквы фамилии
должно быть 3 поля по 1 символу или более
а далее
fam like p1 & "*" and imja like p2 & "*" and otch like p3 & "*"
и функции не надо (конечно строка будет немного сложнее --учитывать имя формы и имена полей)
antipod
Дата: 02.12.2015 14:32:24
Стал переделывать форму на работу с фильтром, столкнулся с другой проблемой.
Фильтр формируется в двух событиях формы, попытался прямо в модуле формы написать процедуру общую для обоих событий, чето не получилось. MsgBox проверочный не срабатывает изменений никаких нет
sdku
Дата: 02.12.2015 14:53:04
antipod,
кому-то объяснял-осталась:гляньте, может что навеет:
sdku
Дата: 02.12.2015 17:13:46
Ещё вариант:
Одиночная форма с источником таблица, с заданной в свойствах, сортировкой по фамилии
добавить кнопку "показатьВсе" и свободное поле "поиск"
после набора символов в "поиск" будет производится поиск в указанном поле и курсор возвращаться в конец набранного
(обычно поиска по одному полю "фамилия" достаточно-однофамильцев обычно не много и выбрать из 3-4 отобранных не сложно)
Private Sub показатьВсе_Click()
DoCmd.ShowAllRecords
Me.OrderByOn = True
Me.поиск = ""
End Sub
Private Sub поиск_GotFocus()
Me.поиск.SelStart = Len(Me.поиск.Text)
End Sub
Private Sub поиск_KeyUp(KeyCode As Integer, Shift As Integer)
DoCmd.ApplyFilter , "Фамилия like'" & Me.поиск.Text & "*'"
End Sub