5 строк кода

Как писать комерческие приложения на MS Access

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.

Также я думаю будут полезны пара сайтов, на которых можно найти примеры строк полключения к разным серверам:

  1. http://www.connectionstrings.com — лучший на мой взгляд.
  2. ADO Connection Strings
  3. 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

Written by Сергей Скоков

Август 31st, 2010 at 9:17 пп

Posted in mc_dns

Как отключить скролинг записей формы

Комментариев нет

Mouse Для некоторых пользователей колесико мышки является проблемой. Так как они как правило не смотрят на экран, когда меняют что-либо. Нечаянно крутанулось колесико и поменяли не ту запись.

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 рассылку или добавить в ЖЖ друзья.

Written by Сергей Скоков

Август 23rd, 2010 at 10:45 пп

Posted in решения