Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 218

Зависания при поиске по распределенной базе

04.12.2017, 09:53. Показов 1440. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, Уважаемые форумчане!

Прошу совета. Суть такова: сделал форму поиска и случается такой, что во время поиска Access вешается. Можно ли что-то сделать с кодом, оптимизировать, отрефакторить дабы такого не случалось? Может код совсем кривой и вы бы так не написали?
Вобщем, вот что у меня напридумывалось:


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Option Compare Database
Option Explicit
Dim rst As QueryDef
Dim SearchOfStr, SearchOfControl, rstRepl, QueryType As String
Dim bar As ProgressBar
 
Private Sub Cancel_Click()
    DoCmd.Close
End Sub
 
Private Sub Search_Click()
    'Поиск заказной спецификации
    If Me.List.Value = "№ Заказной спецификации" Then
        Call SearchSub("tblCustomSpec.CustomSpec", "searchZSNumber", "frmCheckInZSNumber")
    ElseIf Me.List.Value = "Номенклатура SAP" Then
        Call SearchSub("tblMotion.NomenclatureSAP", "searchNomen", "frmCheckInNomen")
    ElseIf Me.List.Value = "Менеджер" Then
        Call SearchSub("tblCustomSpec.ManagerBuilding", "searchManager", "frmCheckInZSNumber")
    ElseIf Me.List.Value = "№ Договора СМР" Then
        Call SearchSub("tblMotion.TreatySMR", "searchTreaty", "frmCheckInTreaty")
    ElseIf Me.List.Value = "Количество" Then
        Call SearchSub("tblMotion.Quantity", "searchNomen", "frmCheckInNomen")
    End If
End Sub
 
'Поиск
'SearchOfControl - по какому полю будем искать
'QueryType - какой запрос использовать (зависит от стола)
'FormType - какую форму открыть
Private Sub SearchSub(SearchOfControl, QueryType, FormType)
    'Строка поиска
    SearchOfStr = Me.SearchString.Value
If IsTable.IsTable("tmpCheck") = True Then
    CurrentDb.Execute "DROP TABLE tmpCheck"
    Set rst = CurrentDb.QueryDefs(QueryType)
    rstRepl = rst.SQL
    rst.SQL = Replace(rstRepl, "SearchOfControl", SearchOfControl)
    'Передаем параметр для запроса
    rst.Parameters(0) = SearchOfStr
    rst.Execute
    rst.SQL = rstRepl 'Меняем SQL запрос на прежнее значение
    CurrentDb.Execute "ALTER TABLE tmpCheck ADD COLUMN Kod COUNTER"
    If DCount("*", "tmpCheck") > 0 Then
        DoCmd.Close
        DoCmd.OpenForm FormType, , , , acFormReadOnly, acWindowNormal
    Else
        DoCmd.Close
        MsgBox "Ничего не найдено", vbOKOnly
        CurrentDb.Execute "DROP TABLE tmpCheck"
    End If
Else
    Set rst = CurrentDb.QueryDefs(QueryType)
    rstRepl = rst.SQL
    rst.SQL = Replace(rstRepl, "SearchOfControl", SearchOfControl)
    'Передаем параметр для запроса
    rst.Parameters(0) = SearchOfStr
    rst.Execute
    rst.SQL = rstRepl 'Меняем SQL запрос на прежнее значение
    CurrentDb.Execute "ALTER TABLE tmpCheck ADD COLUMN Kod COUNTER"
    If DCount("*", "tmpCheck") > 0 Then
        DoCmd.Close
        DoCmd.OpenForm FormType, , , , acFormReadOnly, acWindowNormal
    Else
        DoCmd.Close
        MsgBox "Ничего не найдено", vbOKOnly
        CurrentDb.Execute "DROP TABLE tmpCheck"
    End If
End If
    rst.Close
    Set rst = Nothing
    
End Sub
Вешается через раз, иногда даже через день. Не постоянно. Пользуются базой одновременно всего 4 человека. Но поиск у них у всех постоянно.
tmpCheck создается локально у каждого пользователя и заполняется результатами поиска, затем открывается форма с этими результатами.
Функция IsTable из общего модуля (терминология 1С, как в VBA называется не знаю )) проверяет существование таблицы tmpCheck.

Буду очень признателен. Можно пинать.

Добавлено через 1 минуту
P.S.: вопрос со звездочкой - переписав ElseIf на Case получаем какие-то бонусы или суть одно?
P.S.S.: вопрос с двумя звездочками - где в VBA инструмент для замера производительности? Научите, пожалуйста.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.12.2017, 09:53
Ответы с готовыми решениями:

Ошибки при поиске в базе
Доброе утро всем! Прошу помочь с решением вопросов по базе: 1. В базе налажен поиск по номеру детали, однако при внесении в поле...

Кодировка при поиске в базе данных
Здравствуйте! У меня возникла такая проблема что при поиске в базу данных когда значение в кодировке utf программа не работает. В кодировке...

Создать выпадающий список при поиске в базе
мне нужно создать выпадающий список при поиске слов или фраз которые находятся в базе MySql

13
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 218
04.12.2017, 09:59  [ТС]
Вот такая форма
Миниатюры
Зависания при поиске по распределенной базе  
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
04.12.2017, 10:37
Цитата Сообщение от Chuvaschow Посмотреть сообщение
сделал форму поиска и случается такой, что во время поиска Access вешается
В таких случаях ставят контроль ошибок в код и анализируют ситуацию: On Error Goto Метка. Смотрите в хелпе и по форуму.
0
3357 / 1776 / 83
Регистрация: 05.08.2010
Сообщений: 4,471
05.12.2017, 10:48
Visual Basic
1
IsTable.IsTable("tmpCheck")
Что это у Вас?
0
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 218
05.12.2017, 10:54  [ТС]
Функция IsTable из общего модуля проверяет существование таблицы tmpCheck.

Visual Basic
1
2
3
4
5
6
7
8
'Проверка сущетвования таблицы
Public Function IsTable(NameTable As String) As Boolean
   Dim i As Integer
   IsTable = False
   For i = 0 To CurrentDb.TableDefs.Count - 1
      If CurrentDb.TableDefs(i).Name = NameTable Then IsTable = True
   Next i
End Function
0
Эксперт MS Access
 Аватар для Eugene-LS
12087 / 5864 / 1500
Регистрация: 05.10.2016
Сообщений: 16,472
05.12.2017, 11:17
Цитата Сообщение от Chuvaschow Посмотреть сообщение
проверяет существование таблицы tmpCheck
Вот вам вариант пошустрее (если хотите):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Public Function IsTablePresent(strTableName As String) As Boolean
' Проверка на наличие таблицы в текущей базе данных
' Если  таблица существует - вернет True (Истина = -1)
'--------------------------------------------------------------------
Dim i As Integer
On Error GoTo IsTablePresent_Err
 
' Пытаемся посчитать кол-во полей в заданной таблице
    i = CurrentDb.TableDefs(strTableName).Fields.Count
    
' Если поля есть - значит и таблица существует (что вполне логично)
    If i > 0 Then IsTablePresent = True
 
IsTablePresent_Bye:
    Exit Function
 
IsTablePresent_Err:
    Resume IsTablePresent_Bye
End Function
Лучше напрямки к таблице - чем "шерстить" всю коллекцию.
1
3357 / 1776 / 83
Регистрация: 05.08.2010
Сообщений: 4,471
05.12.2017, 11:29
Цитата Сообщение от Chuvaschow Посмотреть сообщение
Функция IsTable из общего модуля проверяет существование таблицы tmpCheck.
Не относится к вопросу, но все же. Не забывайте выходить из функции, после того как нашли таблицу, иначе поиск идет дальше.
Visual Basic
1
If CurrentDb.TableDefs(i).Name = NameTable Then IsTable = True: Exit Function
По сабжу, думаю, что да, ловить ошибку, как советовал mobile, и обрабатывать ее.
2
Эксперт MS Access
 Аватар для Eugene-LS
12087 / 5864 / 1500
Регистрация: 05.10.2016
Сообщений: 16,472
05.12.2017, 11:42
Цитата Сообщение от Agapov_stas Посмотреть сообщение
Не забывайте выходить из функции, после того как нашли таблицу, иначе поиск идет дальше.
Совершенно верно, так будет немного быстрее и главное правильнее.
1
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 218
05.12.2017, 11:55  [ТС]
Хорошо, попробуем, правда я не понимать - это же висяк, не ошибка, что он мне покажет?...

А по вопросам со звездочками что-нибудь скажите?
0
3357 / 1776 / 83
Регистрация: 05.08.2010
Сообщений: 4,471
05.12.2017, 12:30
Цитата Сообщение от Chuvaschow Посмотреть сообщение
Хорошо, попробуем, правда я не понимать - это же висяк, не ошибка, что он мне покажет?...
Давайте не "гадать", а делать как положено.

По поводу "звездочек".
Case или If - Вам решать. (Вот что пишут на stackoverflow)/
На другом сайте:
Кликните здесь для просмотра всего текста
Альтернативой оператору "If ... End" служит оператор "Select Case" (с английского "Select Case" можно перевести как "Выбор Ситуации"), который упрощает восприятие кода "на глаз". И если "If ... End" оператор в каждом своём "ElseIf" вынужден обращаться к проверяемым значениям снова и снова (допустим, выражение каждый раз одинаковое), то "Select Case" делает это только один раз, что позволяет последнему на больших массивах данных работать быстрее. Этот оператор позволяет удобно задать ветвление программы из одной точки в большое количество веток. То есть в основном применяется при множественных условиях проверки, когда проверяемых условий больше двух.


По поводу производительности, смотря что подразумеваете. Скорость выполнения кода?, - Ставьте таймер и замеряйте.
Вывод данных/ошибки в консоль? - Debug.Print.
1
Эксперт MS Access
 Аватар для Eugene-LS
12087 / 5864 / 1500
Регистрация: 05.10.2016
Сообщений: 16,472
05.12.2017, 12:30
Лучший ответ Сообщение было отмечено Chuvaschow как решение

Решение

Цитата Сообщение от Chuvaschow Посмотреть сообщение
P.S.: вопрос со звездочкой - переписав ElseIf на Case получаем какие-то бонусы или суть одно?
Select Case предпочтительнее и шустрее

Цитата Сообщение от Chuvaschow Посмотреть сообщение
P.S.S.: вопрос с двумя звездочками - где в VBA инструмент для замера производительности? Научите, пожалуйста.
Не видел такого (встроенного)
Но есть такое решение: Процедура сравнения скорости работы Процедур (Функций) VBA
1
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 218
14.12.2017, 12:48  [ТС]
Цитата Сообщение от Agapov_stas Посмотреть сообщение
Не относится к вопросу, но все же. Не забывайте выходить из функции, после того как нашли таблицу, иначе поиск идет дальше.
Visual BasicВыделить код
1
If CurrentDb.TableDefs(i).Name = NameTable Then IsTable = True: Exit Function
По-моему это помогло. Уже неделю как не зависает.
Будем смотреть дальше. Всем спасибо!
1
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 218
14.12.2017, 12:59  [ТС]
Можно еще вопрос? Он косвенно, но все же является частью этого топика: две таблицы, связанные по некоему полю ID. У обеих таблиц ключевое индексированное поле КОД. Если в связанной таблице поле idInvestProject (целое число) сделать индексированным (с возможностью повторения значений) - будет производительнее? Прирост в скорости будет?
Это все к тем же зависаниям и возможным причинам.
Миниатюры
Зависания при поиске по распределенной базе  
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
14.12.2017, 14:22
Цитата Сообщение от Chuvaschow Посмотреть сообщение
Если в связанной таблице поле idInvestProject (целое число) сделать индексированным (с возможностью повторения значений) - будет производительнее? Прирост в скорости будет?
Если поле idInvestProject используется в поиске, фильтрации или связи таблиц, то безусловно нужен индекс. Если же ничего такого нет, то наличие индекса только замедлит работу.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.12.2017, 14:22
Помогаю со студенческими работами здесь

Выбивает ошибку при поиске студента в базе sql
Нужна помощь.Выбивает ошибку Как быть?Нужно найти студента в бд sql string naimen = Convert.ToString(this.textBox1.Text); ...

Очень нужна помощь по распределенной базе
Всем здрасьте! Очень нужна ваша помощь. Имеется 1С:Бухгалтерия с установленной компонентой "Управление распределенными...

Ошибка при "Поиске по базе": Run-Time Check Failure #2
Всплывает ошибка при "Поиске по базе" Run-Time Check Failure #2 - Stack around the variable 'A' was corrupted.. В чём может быть проблема?...

Как сделать в поиске в базе данных чтоб не реагировала на заглавные и строчные буквы?
Дана база данных в этой базе данных есть слова со строчными буквами и с заглавными буквами как сделать поиск чтоб не реагировала на это а...

Зависания при нагрузке
Всем привет.Не знаю в какую тему написать так что напишу сюда. Недавно мой знакомый надоумил меня собрать пк частично с алиэкспресса....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru