Подписка на RSS

Отключаем предупреждение об ошибке редактора VBA

Пример сообщения о ошибке Кому незнакома ситуация, когда нужно скопировать название функции или переменной с другой строки, но как только мы покидаем строку, в которой набираем код, бдительный VBA редактор тут же выбрасывает окно-предупреждение об ошибке? Меня это раздражает настолько, что я отложил разработку программного модуля и отправился в сеть для поиска решения по отключения назойливых предупреждений об ошибке редактора VBA.

(далее…)

Использование индексов в MS Access

Индексы AccessРано или поздно количество записей в таблицах базы данных переходит некий уровень и пользоваться этой базой становится не комфортно: запросы выполняются медленно, формы “подвисают” и не реагируют на действия пользователя. Встает вопрос увеличения производительности. Можно пойти по пути меньшего сопротивления: добавить оперативной, поставить центральный процессор по-мощней или заменить сервер (компьютер) на более производительный. Однако такое решение не является лучшим выбором, во-первых с материальной точки зрения, а во-вторых оно не решает проблему, а лишь отодвигает сроки ее решения на некоторое время. Правильный путь — оптимизация базы данных. Первое что стоит попробовать это использование индексов. (далее…)

Создание меню в Microsoft Access

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

На мой взгляд программисты корпорации Microsoft организовали создание меню не слишком удачно. Первое что бросается в глаза это то, что для создания главное меню необходимо создавать панель инструментов. Для тех, кто знаком с другими средствами разработки, это может оказаться неожиданным. Я бы никогда не назвал меню и панель инструментов синонимами.

Создание главного меню в Microsoft Access

Для создания главного меню выбираем пункт СервисНастройка… (или кликаем правой кнопкой по панели инструментов и выбираем пункт Настройка в контекстном меню). Появляется диалоговое окно Настройка (рис. 1.)

Рис. 1. Диалоговое окно Настройка

Рис. 1. Диалоговое окно Настройка

В диалоговом окне Настройка следует нажать кнопку Создать для создания новой панели инструментов для главного меню, изменить имя создаваемой панели (например на MainMenu). После проделанных операций должна появиться панель инструментов, не содержащая ни одного элемента (рис. 2).

(далее…)

План выполнения запроса в MS Access

Если база данных MS Access начинает «тормозить», медленно открываются формы, отчеты, виной тому чаще всего являются тяжелые запросы. Первым делом необходимо определить над каким именно запросом задумывается Access, а затем приступить к его оптимизации. Во «взрослых» базах данных, таких как Oracle, MS SQL Server, PostgreSQL, MySql есть документированные средства, позволяющие взглянуть на выполнение запроса глазами SQL-сервера. Я говорю о плане выполнения запроса.

А как же в Access? Неужели разработчики не предусмотрели возможность просмотра плана выполнения запроса?

Оказалось такая возможность есть, просто она недокументированная. Если в разделе реестра
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Debug] создать строковый параметр JETSHOWPLAN и присвоить ему значение ON, то это заставит Access (после перезапуска) создавать текстовый файл showplan.out в папке Мои документы, в котором будет содержаться план выполнения запросов.

Пример создание JETSHOWPLAN

Построение плана выполнения запросов происходит в момент компиляции последних. Существующие запросы уже, как правило, скомпилированные. Чтобы заставить Access перекомпилировать запрос, нужно его изменить (как вариант открыть запрос, перейти в режим SQL и добавить пробел в конце), сохранить и выполнить. (далее…)

Самый быстрый способ получить количество записей в таблице MS Access

В MS Access получить количество записей в таблице можно множеством способов. Вопрос в том, какой способ самый быстрый.

На время получения результата могут влиять многие факторы:

  • находится файл базы данных на локальном или сетевом диске;
  • используются обычные или связанные таблицы;
  • используются ли в таблицах индексы;
  • количество записей в таблицах.

Существуют и другие факторы, такие как частота процессора и производительность системы ввода/вывода, но их не будем брать в расчет, поскольку тестирование всех способов будет производиться в одинаковых условиях.

Я выбрал таблицу, содержащую порядка 10 млн. записей (индексы используются). Создал вторую базу данных, к которой прилинковал выбранную таблицу – необходимо для тестирования подключаемых таблиц. Вторую базу данных разместил на другом компьютере 100-мегобитной локальной сети.

Тестировались следующие методы получения количества строк в таблице:

  1. Агрегатная функция VBA DCount.
  2. Агрегатная функция SQL Count.
  3. Свойство Recordcount объекта DAO, возвращаемое функцией OpenRecordset.

Будут использованы разные варианты. Результаты тестирования привожу в таблице:

Метод Обычная таблица Связанная таблица
lntCount = DCount("*", "MyTable")
12,2 с. 12,3 с.
lntCount = DCount("ID", "MyTable")
11,7 с. 13,1 с.
lntCount = CurrentDb.OpenRecordset _
("SELECT Count(*) AS [CountOfID] FROM MyTable;") _
![CountOfID]
12,5 с. 12,5 с.
lntCount = CurrentDb.OpenRecordset _
("SELECT Count([ID]) AS [CountALL] FROM MyTable;") _
![CountALL])
12,3 с. 12,4 с.
lntCount = CurrentDb.OpenRecordset("Count_Query") _
![CountOfID]
12 с. 11,9 с.
lntCount = CurrentDb. _
OpenRecordset("Mytable").RecordCount
0,1 с. невозможен
lntCount = OpenDatabase _
("c:\My Documents\LinkedDatabase.mdb"). _
OpenRecordset("Mytable").RecordCount
невозможен 0,1 с.

Как выяснилось, использование «*» или название поля в агрегатных функциях DCount и Count на времени получения количества строк сказывается незначительно. Также не намного отличаются результаты для «родных» и связанных таблиц. Ну а свойство RecordCount объекта Recordset приятно удивило. Беру на замету!

Изменение размеров элементов управления при изменении размеров формы (MS Access 2003)

Профессионально разработанный пользовательский интерфейс должен одинаково хорошо смотреться и быть удобным для пользователя независимо от того, на каком дисплее он отображается. Давайте взглянем на изображенную ниже форму MS Access:

Пример формы MS Access

Первое желание пользователя, открывшего такую форму, попытаться растянуть диалоговое окно таким образом, чтобы весь текст помещался в текстовом поле.  Однако волшебства не происходит: форма хоть и имеет изменяемые границы, но результат далек от ожидаемого.

При изменении размера формы нужно изменять положение и размеры контролов

Попытаемся исправить ситуацию. (далее…)

MS Access 2003. Не срабатывают точки останова (breakpoints)

Достался в наследство  проект MS Access 2003, который я должен дорабатывать и сопровождать. В процессе работы обнаружился один досадный глюк: в VBA редакторе отладчик не останавливается на точке останова (breakpoint).  Первое что пришло в голову: а нет ли ошибки в коде до точки останова. Проверил, функция отрабатывает нормально, результат возвращает корректный. Далее замечаю, что не работают не только точки останова, но отладка в целом. Пройтись отладчиком по F8 шаг за шагом по каждой строке функции не получается, вместо этого вся функция выполняется целиком.

В редакторе  Microsoft Visual Basic  лезу в Tools -> Options. На закладке General в группе переключателей Error  Trapping выбираю Break on All Errors. Устанавливаю точку останова, запускаю отладку — не срабатывает.

Оказалось, что отучить MS Access 2003 игнорировать точки останова и режим отладки возможно.

(далее…)