LEADERSOFT.ru Разработка на заказ программ и сайтов
ЕСЛИ БАЗА ВАМ НУЖНА В ЛИДЕРСОФТ ЗАЙДИ СПЕРВА!
Список всех статей ... Подписка на новости (рассылка через subscribe.ru)




































Выпуск 33. Преобразование баз данных

Подписка: "Access 2000 - программирование и готовые решения"
Дата:         28.12.2001
Сайт:         http://www.leadersoft.ru

С Новым Годом!
    Поздравляю всех с Новым Годом. Желаю успехов в учебе, в работе, в бизнесе и прекрасного настроения!

 Полезные ссылки

www.tae.ru  - Описания, иллюстрации и характеристики высококлассных профессиональных аппаратных средств от всемирно известных производителей. 


 Примеры баз данных
   22.11.2001. Добавился отличный пример по работе с формулами, т.е. используя объекты RichTextBox и DHTMLEdit Вы теперь можете написать не только любую формулу, но и сделать улучшенный дизайн  форм в Access. Автор программы Малютин Николай
   12.11.2001. В бесплатных кодах добавился интересный пример по работе с графикой. График или текст в форме или отчете сохраняется во внешнем рисунке (мета-файле). Автор программы Малютин Николай.

 Новости для специалистов
28.12.2001. Вышли новые изменения к программе "Склад и Реализация". Налог с продаж и НДС для частных и юридических лиц учитывается в соответствии с новым законодательством. Стоимость программы - 50$, обновление 25$. Возможна поставка в полностью открытых кодах.
28.12.2001. Вышла новая рассылка для специалистов.   Примеры указаны ниже
 profi_interface.mdb Описание
  Создание триггера в таблице   Триггер-это хранимая процедура, которая автоматически выполняется при вставке, обновлении или удалении записи из таблицы. У таблицы Access нет событий, поэтому назначить событие ей не удастся. Предлагаемый метод позволяет обойти это ограничение. Решение можно использовать для создания более компактных и быстрых баз данных путем отказа от использования некоторых ленточных форм.
  Получение параметров окон   Этот пример показывает как получить параметры всех приложений Windows и окон Microsoft Access, а именно название окна и дескриптор, класс и текст. Используется для работы с api интерфейсом
Ссылки базы данных   Пример показывает как управлять ссылками текущей базы данных, а именно созданием, просмотром и удалением. Необходим для автоматического подключения нескольких внешних баз данных к центральному проекту.

  Преобразование баз данных
    Один из часто встречающихся вопросов в конференциях по Access проблемы работы с локальными версиями Access. Например, Вы работаете с русской версией Access 2000, а потом вдруг возникает необходимость запустить базу данных в английской версии AccessXP, вот тут и могут возникнуть "подводные камни". Хотя на первый взгляд база данных хорошо открывается и проблем с объектами нет.
       Известный "народный" способ лечения, что сначала лучше базу данных разработать в английской версии, а потом уже использовать его в локализованной, не так уж и хорош. С моей точки зрения лучше действовать наоборот. Рассмотрим это на примере небольшой ошибки. 
     Сущность ее. После преобразовании базы данных может возникнуть проблема при открытии таблицы с полями в виде списков (Combobox). Программа предупреждает Вас сообщением: "Слишком большое число" (или "The number is too large"). Сообщение появляется столько раз сколько у Вас определено полей-списков.
    Исследуя параметры списков, Вы приходите к удивительному выводу, что после преобразования у списков полей таблиц изменился размер. Он стал очень большим 57, 79 см (ListWidth=57,79см), о чем Access  и предупреждал Вас при открытии таблицы. Возникает предположение, что программа преобразования просто изменила размер элемента. Но с другой стороны Вы начинаете соображать, что все размеры элементов определяются твипами и следовательно при конвертации к локальной версии таких изменений быть не должно.  Используя отладчик (debag), можно придти к выводу, что размер списка поля ColumnWidths действительно не изменился, а отличие заключается лишь в правильном написании свойства поля базы данных. Например, в свойстве ColumnWidths хранится "2450twip" или = "2450твип". И так, если Вы работаете в английской версии и в свойстве поля хранится twip, то размер отображается правильно. Исходя из вышеизложенного можно сделать вывод. 
    Базу данных надо разрабатывать в локальной версии (поиск русских символов в свойствах объектов осуществить проще, чем английских), но при этом надо использовать при разработке названия объектов на английском языке. После того, когда база данных разработана, надо проверить свойства всех элементов базы данных (таблиц, форм, отчетов и т.п.) на наличие русских символов (Ascii код их размещается в диапазоне от 128 до 255). После этого выводите список этих элементов и принимаете решение об их изменении. Например, "твип" заменяете на" twip", "таблица" на "table" и т.п. Задача вывода информации об этих элементах не очень сложная, можно сказать даже тривиальная. Для полного решения ее используйте пример работы со списками. Он указан ниже. Дополнительно в этом примере список еще и корректируется, т.е. его ширина равняется сумме размеров колонок списка. Для преобразования базы данных в английский вариант запустите программу из макроса: fSetTableCombobox("twip"), если необходим русский вариант: fSetTableCombobox("твип")

Public Function fSetTableCombobox(strTwip As String, Optional strProgram As String)
Dim tdf As DAO.TableDef, i As Long
Dim dbs As DAO.Database, fld As DAO.Field, strWidth As String

On Error GoTo 999
' Определим параметр strProgram, если будем работать в текущей базе данных. В других случаях необходимо закомментировать строку.
strProgram = CurrentDb.Name

On Error Resume Next
Set dbs = DAO.OpenDatabase(strProgram)
For i = 0 To dbs.TableDefs.Count - 1
Set tdf = dbs.TableDefs(i)
If tdf.Connect = "" Then
For Each fld In tdf.Fields
If fVerifyFieldProperty(fld, "ColumnWidths") = 0 Then
strWidth = fld.Properties("ColumnWidths")
strWidth = fChangeSubString(strWidth, ";", "+") ' Подготовливаем строку к расчету
fld.Properties("ListWidth") = Eval(strWidth) & strTwip
End If
Next
End If
Next
Err.Clear
dbs.Close
Set dbs = Nothing

Exit Function
999:
MsgBox Err.Description, vbExclamation, "Error: " & Err.Number
Err.Clear
End Function

' Функция проверяет наличие свойства
Function fVerifyFieldProperty(fld As Field, strName As String) As Long
Dim prt As DAO.Property
On Error GoTo 999
Set prt = fld.Properties(strName)
fVerifyFieldProperty = 0
Exit Function
999:
fVerifyFieldProperty = Err.Number
Err.Clear
End Function

' Замена подстроки
Public Function fChangeSubString(sFull As String, sOld As String, sNew As String) As String
Dim l As Integer, p As Integer, m As Integer
fChangeSubString = sSQL
If sOld = sNew Then Exit Function
m = Len(sOld)
l = Len(sSQL) + m
Do
p = InStr(1, sSQL, sOld)
If p > 0 Then sSQL = Mid(sSQL, 1, p - 1) + sNew + Mid(sSQL, p + m, l)
Loop While p > 0
fChangeSubString = sSQL
End Function