Archive for Август, 2010
Как программно создать ODBC DSN
Настал такой момент, когда нужно обратиться к кому-нибудь серверу БД. MS Access предоставляет возможность создавать связанные ODBC таблицы (настоятельно рекомендую отказаться от их исопльзования) и запросы к серверу.
При использования запросов к серверу в качестве строки подключения предлогается указать имя DSN. Помимо имени DSN мастер вставляет дополнительные параметры, например, имя пользователя и пароль. Это очень плохо. И даже при этом ODBC подклчюение должно быть создано.
Я при использовании запросов к серверу в строку подключения писал только имя DSN, т.е. строка подключения выглядит следующим образом:
DSN=DEV_SERVER;
Что-бы избавить себя от необходимости помнить о необходимости создавать ODBC DSN написана библиотечная функция CM_CreateDSN(). Эта фукнция живет у меня в библиотечном модуле mc_dns. Параметры для подклчюения выбираются из настроек приложения при помощи функции CM_Param_Get().
Как правило функция CM_CreateDSN() выполняется каждый раз при старте. Это гарантирует, что дальше при работе приложения мы сможем получить доступ к данным.
Стоит отдельно обратить внимание на параметр настроек CnnOptionsOther. Именно тут задаются специфические параметры для подключения к серверу. В качестве параметра функции я его не выносил, т.к. необходимости не было. Как оказалось наиболее используемыми параметрыми оказались imUser и stPWD.
Также я думаю будут полезны пара сайтов, на которых можно найти примеры строк полключения к разным серверам:
- http://www.connectionstrings.com — лучший на мой взгляд.
- ADO Connection Strings
- ADO Connection String Samples
А вот собственно сама функция CM_CreateDSN():
Public Function CM_CreateDSN(Optional imDSN As String = "" _
, Optional imDriver As String = "" _
, Optional imDB As String = "" _
, Optional imServer As String = "" _
, Optional imUser As String = "" _
, Optional stPWD As String = "") As Boolean
' Скоков С.А. 2006-05-15
' изменена 2006-09-07 Скоков С.А.
' Создание DSN для подключения к базе данных
On Error GoTo Err_
Dim stCnnOptionsOther As String
Dim stAttributes As String
'-- читаем из настройки, если параметр не передан
If imDSN = "" Then imDSN = CM_Param_Get("DSN")
If imDriver = "" Then imDriver = CM_Param_Get("Driver")
If imDB = "" Then imDB = CM_Param_Get("DB")
If imServer = "" Then imServer = CM_Param_Get("Server")
If imUser = "" Then imUser = CM_Param_Get("User")
If stPWD = "" Then stPWD = CM_Param_Get("PWD")
stCnnOptionsOther = CM_Param_Get("CnnOptionsOther")
'-- формирование дополнительных атрибутов
If imDB <> "" Then stAttributes = stAttributes & "Database=" & imDB & ";"
If imServer <> "" Then stAttributes = stAttributes & "Server=" & imServer & ";"
If imUser <> "" Then stAttributes = stAttributes & "User=" & imUser & ";"
If stPWD <> "" Then stAttributes = stAttributes & "Password=" & stPWD & ";"
If stCnnOptionsOther <> "" Then stAttributes = stAttributes & stCnnOptionsOther
RegisterDatabase imDSN, imDriver, True, stAttributes
CM_CreateDSN = True
Exit_:
Exit Function
Err_:
Err.Raise Err.Number, "CM_CreateDSN()->" & Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Function
Как отключить скролинг записей формы
Для некоторых пользователей колесико мышки является проблемой. Так как они как правило не смотрят на экран, когда меняют что-либо. Нечаянно крутанулось колесико и поменяли не ту запись.
MS Access 2003 поддерживает событие MouseWheel, но, увы, не позволяет отменить это. Даже DoCmd.CancelEvent не помогает.
Private Sub Form_MouseWheel(ByVal Page As Boolean, ByVal Count As Long)
DoCmd.CancelEvent '-- не работает
End Sub
Одно из решений это хук событий формы описанный на сайте microsoft (How to Detect and Prevent the Mouse Wheel from Scrolling Through Records in a Form). И тут не обошлось без недостатков. Если не использовать внешней dll, то периодически форма тормозит, т.к. все события проваливаются через медленный VBA. Возможно, если вынести данный код в dll, то будет работать на порядок быстрее. Мне не захотелось возится с отдельной dll, т.к. я нашел метод попроще (об этом ниже). Пока я исследовал пример, немного расширил его. Результат трудов можно скачать тут, вдруг кому понадобится.
Более простым решением на мой взгляд является фильтр по ключевому полю. При этом нужно отключить добавление записей. У этой идеи тоже есть недостатки:
- для ленточных форм, естественно, это не работает.
- нужно реализовывать добавление записи, а потом уже открывать ее на редактирование.
Какой вариант выбрать зависит от ситуации. Я же стараюсь свести дизайн программы ко второму варианту. Уж больно он мне по душе.
До встречи!
(с) Скоков Сергей
Подписаться на: RSS или e-mail рассылку или добавить в ЖЖ друзья.