【问题标题】:MS Access Textbox Default Value Max Size LimitMS Access 文本框默认值最大大小限制
【发布时间】: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 的设计目的。如果您不喜欢这样,请使用带有 WinFormsVB.NETC# 的工具,例如 Visual Studio .
  • 这真的做不到,如果可以的话,我会做到的。表单需要能够保存数据并用作插入/编辑/删除平台。 WinForms 并不是一个真正的选择。有没有办法可以通过某种元素传输长文本?或者创建另一种没有字符限制的对象?
  • 好吧,如果您发现 2K 字符串是 DefaultValue 可以容纳的最大值,就是这样。没有任何地方可以通过设置来改变这一点。因此,您将不得不使用查找表等创建某种解决方法。
  • Dlookup 是问题所在,它无法在备注字段中搜索 2000 个字符。我使用 Left 将搜索限制为前 2000 个字符并修复它。不过,我现在面临另一个问题。在第二个过程中,在 ctrl.DefaultValue = """" & varDefault & """" -> 表示表达式的长度超过 2,048 个字符。有什么想法吗?
  • 这不是你原来的问题吗?根据您的经验,我认为没有解决方案。

标签: vba forms ms-access stored-procedures


【解决方案1】:

这是您上一条评论中的提示。然后使用肯定没有 2K 限制的字符串变量尝试这个​​冗长的代码:

Dim DefaultString As String

DefaultString = Nz(varDefault)
ctrl.DefaultValue = DefaultString

【讨论】:

  • 非常好!我没有使用 Nz,而是使用了以下代码:varDefault = DLookup("DefaultVal", "Defaults", strCriteria) LMeasure = Left(varDefault, 2000) MyLen = Len(varDefault) If MyLen > 2000 Then ctrl.DefaultValue = """" & LMeasure & """" ctrl.Value = varDefault Else If Not IsNull(varDefault) Then ctrl.DefaultValue = """" & varDefault & """" End If End If 基本上它按默认值搜索,但在加载时显示表中的 value 属性中的全文。 .表单中的值是临时的,但如果每次都加载则不是:) 非常感谢!
  • 太棒了!感谢您的反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 2020-10-17
相关资源
最近更新 更多