[COPYRIGHT]
http://www.leadersoft.ru/subscribe/sub/sub33.htm
Выпуск 33. Преобразование баз данных
Подписка: "Access 2000 - программирование и готовые решения"
Автор: Виктор Конюков, Leader Access, LTD
Дата: 28.12.2001
Сайт: http://www.leadersoft.ru
Почта: support@leadersoft.ru
[/COPYRIGHT]
Преобразование баз данных
Один из часто встречающихся вопросов в конференциях по 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("твип")
http://www.leadersoft.ru/subscribe/sub/sub33.htm
Выпуск 33. Преобразование баз данных
Подписка: "Access 2000 - программирование и готовые решения"
Автор: Виктор Конюков, Leader Access, LTD
Дата: 28.12.2001
Сайт: http://www.leadersoft.ru
Почта: support@leadersoft.ru
[/COPYRIGHT]
Преобразование баз данных
Один из часто встречающихся вопросов в конференциях по 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(sSQL 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