【发布时间】:2016-05-02 21:21:23
【问题描述】:
我有以下设置:
我有一个带有未绑定文本框控件的表单。我有一个在每个 AfterUpdate 事件之后触发的过程。
该过程将输入值发送到表格,并将表格中输入的值作为文本框的默认值返回。该表通过表单和控件名称、2 个主键定义唯一行。
输入数据后,有一个按钮可以将表单中的数据以结构化的方式发送到另一个表格,然后报告会从表格中读取。数据通过 SQL 查询以结构化方式输入到表中。
问题是当用户在两个字段中输入超过 2048 个字符的文本时,由于限制,代码会中断。由于表单的性质,表单上的两个字段在每页上可能有超过 2k 个字符。
我的问题是,我可以绕过、增加或绕过字符限制吗?
如果需要,我的代码将在下面发布以供参考(名为 OptimizeS 的程序会加载到表单上的每个文本框中):
将输入值写入表的过程:
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
【问题讨论】:
-
你真的让自己过得很艰难。为什么不直接将表单绑定到表格?这就是 Access 的设计目的。如果您不喜欢这样,请使用带有 WinForms 和 VB.NET 或 C# 的工具,例如 Visual Studio .
-
这真的做不到,如果可以的话,我会做到的。表单需要能够保存数据并用作插入/编辑/删除平台。 WinForms 并不是一个真正的选择。有没有办法可以通过某种元素传输长文本?或者创建另一种没有字符限制的对象?
-
好吧,如果您发现 2K 字符串是 DefaultValue 可以容纳的最大值,就是这样。没有任何地方可以通过设置来改变这一点。因此,您将不得不使用查找表等创建某种解决方法。
-
Dlookup 是问题所在,它无法在备注字段中搜索 2000 个字符。我使用 Left 将搜索限制为前 2000 个字符并修复它。不过,我现在面临另一个问题。在第二个过程中,在 ctrl.DefaultValue = """" & varDefault & """" -> 表示表达式的长度超过 2,048 个字符。有什么想法吗?
-
这不是你原来的问题吗?根据您的经验,我认为没有解决方案。
标签: vba forms ms-access stored-procedures