- Один из часто встречающихся вопросов в конференциях по 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
|