2016-01-26 4 views
0

У меня есть следующая настройка:MS Access Текстовое поле Значение по умолчанию Максимальный размер Ограничение

У меня есть форма с несвязанными элементами управления текстовыми полями. У меня есть процедура, которая срабатывает после каждого события AfterUpdate.

Процедура отправляет входное значение в таблицу и возвращает значение, введенное в таблицу, как значение DefaultValue текстового поля. Таблица определяет уникальные строки по форме и имени управления, 2 первичных ключам.

После ввода данных появляется кнопка, которая отправляет данные из формы структурированным способом в другую таблицу, и отчет считывается из таблицы. Данные вводятся в таблицу структурированным способом с помощью SQL-запроса.

Проблема заключается в том, что пользователь вводит тексты более 2048 символов в двух из полей, код прерывается из-за ограничения. Два поля в форме, на каждой странице, вероятно, имеют более 2 тыс. Символов из-за характера форм.

Мой вопрос: могу ли я обходить, увеличивать или обходить ограничение персонажа?

Мой код размещен ниже для справки, если это необходимо (процедура называется Оптимизирует загружаются в каждом текстовом поле на форме):

Процедура, которая записывает значение входного сигнала в таблицу:

Private Sub OptimizeS() 
Dim cmd As ADODB.Command 
Dim strForm As String 
Dim strControl As String 
Dim strSQL As String 
Dim strCriteria As String 

Set cmd = New ADODB.Command 
cmd.ActiveConnection = CurrentProject.Connection 
cmd.CommandType = adCmdText 

strCriteria = "FormName = """ & Me.Name & """ " & _ 
"And ControlName = """ & Me.ActiveControl.Name & """" 
' is there an existing default for this control? 
If Not IsNull(DLookup("FormName", "Defaults", strCriteria)) Then 
' if so then update row in table 
strSQL = "UPDATE Defaults " & _ 
"SET DefaultVal = """ & Me.ActiveControl & """ " & _ 
"WHERE " & strCriteria 
Else 
' insert new row 
strSQL = "INSERT INTO Defaults(" & _ 
"FormName,ControlName,DefaultVal) " & _ 
"VALUES(""" & Me.Name & """,""" & _ 
Me.ActiveControl.Name & """,""" & _ 
Me.ActiveControl & """)" 
End If 

cmd.CommandText = strSQL 
cmd.Execute 
End Sub 

Поддержка процедуры на самой форме:

1)

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
Dim cmd As ADODB.Command 
Dim strOpened As String 
Dim strForm As String 
Dim strSQL As String 

Set cmd = New ADODB.Command 
cmd.ActiveConnection = CurrentProject.Connection 
cmd.CommandType = adCmdText 

strOpened = "Opened = """ & Me.Name & """ " 

If Not IsNull(DLookup("Opened", "AllOpened", strOpened)) Then 
strSQL = "UPDATE AllOpened " & _ 
"SET Opened = """ & Me.Name & """ " & _ 
"WHERE " & strOpened 
Else 
strSQL = "INSERT INTO AllOpened(Opened) " & _ 
"VALUES(""" & Me.Name & """)" 
End If 

cmd.CommandText = strSQL 
cmd.Execute 
End Sub 

2)

Private Sub Form_Open(Cancel As Integer) 
Dim cmd As ADODB.Command 
Dim strCriteria As String 
Dim strOpened As String 
Dim varDefault As Variant 
Dim varOpened As Variant 
Dim strForm As String 
Dim strSQL As String 
Dim ctrl As Control 

Set cmd = New ADODB.Command 
cmd.ActiveConnection = CurrentProject.Connection 
cmd.CommandType = adCmdText 

strOpened = "Opened = """ & Me.Name & """ " 

varOpened = DLookup("Opened", "AllOpened", strOpened) 
If IsNull(varOpened) Then 
strSQL = "INSERT INTO AllOpened(Opened) " & _ 
"VALUES(""" & Me.Name & """)" 
cmd.CommandText = strSQL 
cmd.Execute 
Else 
GoTo ErrMsg 
End If 

For Each ctrl In Me.Controls 
strCriteria = "FormName = """ & Me.Name & """ " & _ 
"And ControlName = """ & ctrl.Name & """" 

varDefault = DLookup("DefaultVal", "Defaults", strCriteria) 
If Not IsNull(varDefault) Then 
ctrl.DefaultValue = """" & varDefault & """" 
End If 
Next ctrl 
Exit Sub 
ErrMsg: 
MsgBox ("The form is already open by another user. Please double-check before editing."), , "Important!!!" 
End Sub 

3)

Private Sub Form_Unload(Cancel As Integer) 
Dim strSQL As String 
Dim strForm As String 
Dim cmd As ADODB.Command 

Set cmd = New ADODB.Command 
cmd.ActiveConnection = CurrentProject.Connection 
cmd.CommandType = adCmdText 

strSQL = "DELETE FROM AllOpened " & _ 
     "WHERE Opened = """ & Me.Name & """" 

cmd.CommandText = strSQL 
cmd.Execute 

End Sub 
+1

Вы действительно делаете жизнь трудной для себя. Почему бы вам просто не привязать форму к таблице? Для этого предназначен _Access_. Если вам это не нравится, используйте инструменты, такие как _Visual Studio_ с _WinForms_ и _VB.NET_ или _C# _. – Gustav

+0

На самом деле это невозможно сделать, я бы сделал это, если мог. Форма должна иметь возможность хранить данные и служить вставкой/редактированием/удалением-платформой. WinForms на самом деле не вариант. Есть ли способ передать длинный текст через какой-то элемент? Или создать другой тип объекта, который не имеет ограничения на символ? –

+0

Ну, если вы обнаружили, что строка 2K является максимальной, которую может хранить DefaultValue, вот и все. Там нет места, где настройка может изменить это. Поэтому вам придется создать какой-то обходной путь с помощью таблицы поиска или тому подобного. – Gustav

ответ

0

Это намек на ваш последний комментарий. Затем попробуйте этот подробный код, используя строковую переменную, которая, несомненно, не имеет ограничения 2K:

Dim DefaultString As String 

DefaultString = Nz(varDefault) 
ctrl.DefaultValue = DefaultString 
+1

Очень приятно! Я не использовал Nz, но вместо этого использовал следующий код: 'varDefault = DLookup (« DefaultVal »,« Defaults », strCriteria) LMeasure = Left (varDefault, 2000) MyLen = Len (varDefault) Если Mylen> 2000 Тогда ctrl.DefaultValue = "" "" & LMeasure & "" "" ctrl.Value = varDefault Else Если не IsNull (varDefault) Тогда ctrl.DefaultValue = "" "" & varDefault & " "" " End If End If' В основном он выполняет поиск по умолчанию, но отображает полный текст в свойстве value из таблицы при загрузке. .Value в формах является временным, но не если он загружается каждый раз :) Большое спасибо! –

+0

Отлично! Спасибо за ответ. – Gustav