Подписка на RSS

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

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

(далее…)

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

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

Создание точек восстановления по расписанию в Windows 7

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

На помощь приходит скрипт на VBS, который, если его поместить в задание Планировщика задач, создает точку восстановления в фоновом режиме:

Set SysRestore = getobject("winmgmts:\\.\root\default:Systemrestore")
SysRestore.createrestorepoint "Автоматическая точка восстановления", 0, 100

Но есть нюанс. Нужно обязательно установить флажок Выполнять с наивысшими правами.

Задача для создания точек восстановления по расписанию в Windows 7

Создание меню в 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 игнорировать точки останова и режим отладки возможно.

(далее…)

Рекурсивный обход узлов TreeView или у попа была собака…

Чтобы понять рекурсию нужно сначала понять рекурсию. Так уж повелось что у многих людей понятие «рекурсия» ассоциируется с вычислением факториала. Не знаю почему, но авторы умных книг в 9 из 10 случаев в разделе о рекурсии помещают пример вычисления факториала. Меня очень забавляет эта ситуация: неужели циклы уже отменили ;). В итоге у читателя складывается впечатление о рекурсии как о интересной, но бесполезной штуковине.

Возьмем обычный TreeView из NET FRAMEWORK. Он устроен таким образом, что любой узел TreeNode может содержать коллекцию Nodes, в которой, в свою очередь, могут содержаться другие узлы, каждый из которых содержит коллекцию Nodes…

(далее…)

Автозавершение слов в NET FRAMEWORK

В своих приложениях я стараюсь как можно реже заставлять пользователя обращаться к клавиатуре (на ней так много разных кнопочек… лучше мышкой щелкать). Однако иногда без нее не обойтись и, поскольку искусством машинописи владеют далеко не все, приходится по возможности уменьшать количество нажатых пользователем клавиш, что не только увеличивает его производительность, но и уменьшает вероятность ошибок при вводе текста.

До выхода в свет Net Framework 2.0 автозавершение слов в textbox’ах приходилось реализовывать самостоятельно, теперь же это встроенная возможность. За автозавершение слов отвечают свойства AutoCompleteSource, AutoCompleteMode и AutoCompleteCustomSource редактора textbox.

Первое задает источник строк, которые будут предложены пользователю. Возможные значения задаются одноименным перечислением. Наиболее интересным является AutoCompleteSource.CustomSource, поскольку позволяет использовать собственный список слов, который должен быть задан в свойстве AutoCompleteCustomSource.

Свойство AutoCompleteMode задает режим автозавершения слов, возможные значения: Append, None, Suggest и SuggestAppend.
(далее…)

1 2