Ms Access2002 - The Number Is Too Large.
#1
[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("твип")
Код:
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  
Ответ
#2
Вот такое решение проблемы нашел в интернете. Wink
Ответ
#3
Хороший метод, а если в списке 20 полей, и нужно бы сделать горизонтальный скроллинг раскрывающегося списка?
В этой процедуре не хватает максимального значения ширины списка. Вообще, лучше не работать с таблицами напрямую, а работать через запросы, или еще лучше разделить базу данных на две. В одной данные, в другой формы и отчеты. Тогда можно будет восстановить ширину поля.
Может в мелкософт подергать?
Smile
Ответ
#4
Эта процедура не изменят размеры полей, она просматривает все таблицы и если в свойтвах поля есть ListWidth (Ширина списка), то к его значению прибавляется текст "twip" или "твип"
Код:
fld.Properties("ListWidth") = Eval(strWidth) & strTwip
тогда английский Access будет открывать русские тблицы без ошибок, и наоборот.

Цитата:Может в мелкософт подергать?
К сожалению, проблема известная, но они не шевелятся.Sad
Видимо заняты подготовокой к релизу Acess 2004. :lol:
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 3 Гость(ей)