我有155K记录表。我只能在带有query或sql记录源的表单的组合框中滚动65K记录,从该表中选择三个字段。为什么它不列出所有155K记录,即使是我用作记录源的查询,也会显示表单之外的所有记录。
答案 0 :(得分:18)
项目索引可能是16位整数
一个更好的问题是,你真的希望用户在组合框中滚动155,000个项目吗?
答案 1 :(得分:6)
最简单的方法是只在您输入组合框中的某些字符后才分配组合框的Rowsource。你可以在组合框的OnChange事件中这样做:
Dim strRowSource As String
strRowSource = "SELECT MyID, MyField FROM MyTable"
If Len(Me!cmbMyCombo.Text)=3 Then
strRowSource = strRowSource & " WHERE MyField Like '"
strRowSource = strRowSource & Me!cmbMyCombo.Text
strRowSource = strRowSource & "*'"
Me!cmbMyCombo.RowSource = strRowSource
Me!cmbMyCombo.DropDown
End If
当你输入组合框时,在输入3个字符(或2或4或任何适合将你的下拉列表过滤到人类可用的记录数)之前没有任何反应,此时行源已分配(如果您愿意,可以在此时下拉列表,以使其更加用户友好)。从那时起,它将像任何普通的组合框一样工作。
如果您需要使用相同的组合框来显示未输入的记录中的数据,那么您可以将组合框的默认Rowsource设为:
PARAMETERS [Forms]![MyForm]![MyField] Text ( 255 );
SELECT MyID, MyField FROM MyTable WHERE MyField = [Forms]![MyForm]![MyField];"
然后在你的OnChange事件中,你会这样做:
Dim strRowSource As String
strRowSource = "PARAMETERS [Forms]![MyForm]![MyField] Long; "
strRowSource = strRowSource & "SELECT MyID, MyField FROM MyTable "
strRowSource = strRowSource & "WHERE MyField = [Forms]![MyForm]![MyID]"
strRowSource = strRowSource & "UNION SELECT MyID, MyField FROM MyTable"
If Len(Me!cmbMyCombo.Text)=3 Then
strRowSource = strRowSource & " WHERE MyField Like '"
strRowSource = strRowSource & Me!cmbMyCombo.Text
strRowSource = strRowSource & "*'"
Me!cmbMyCombo.RowSource = strRowSource
Me!cmbMyCombo.DropDown
End If
然后在表单的OnCurrent事件中,你会这样做:
Dim strRowSource As String
strRowSource = "PARAMETERS [Forms]![MyForm]![MyField] Text ( 255 ); "
strRowSource = strRowSource & "SELECT MyID, MyField FROM MyTable "
strRowSource = strRowSource & "WHERE MyField = [Forms]![MyForm]![MyField]"
Me!cmbMyCombo.RowSource = strRowSource
这样做的目的是确保仍然显示已经分配给组合框所绑定字段的任何值。如果你有一个空白的RowSource,那将无法工作,所以对该表单的当前值的引用和对带有已过滤列表的UNION它的引用。
答案 2 :(得分:4)
另一个人同意这将是一种让用户访问这些数据的疯狂方式。没有人会想要一次解析100k +记录。我会提供一种方法来预先过滤记录,以便它们只显示当时感兴趣的记录。
答案 3 :(得分:2)
那么你真正想要的是更多的“自动完成”功能,就像在互联网浏览器中看到的那样?当你说组合框时,每个人都会在用户选择项目的地方拍下一个下拉菜单 - 你可能想澄清一下你的问题。
答案 4 :(得分:2)
尝试增量填充的组合框。例如标签搜索在Stack Overflow中的工作方式,或Google Suggest的工作方式。 65k足以满足组合框的限制。普通用户会发现从甚至65件事情中进行选择有困难
答案 5 :(得分:1)
作为一般规则,当您对一般且广泛使用的组件(如组合框)遇到硬编码限制时,是时候重新考虑您的方法了。组合框不是为您的用例而设计的,也不足以满足您的需求。从项目中退一步,重新评估您的UI。也许ListView或过滤后的数据网格更合适。
答案 6 :(得分:0)
65536确实是组合框项目数量的限制。
我建议使用带有搜索按钮的文本框从列表中查找某人,而不是在这种情况下使用组合框。
作为替代方案,您可以根据插入的文本动态加载项目。
您还可以尝试通过先前在表单上输入的值来“预过滤”您的组合框,以使返回的记录数量低于允许的最大值。例如,如果您的表具有100,000个名称和地址,您将让用户输入(在使用组合框之前)一个zipcode或状态,用于过滤组合框查询RecordSource返回的记录数。
@ Steven A. Lowe和amdfan:你知道combobox是什么以及它被称为组合框的原因是什么?这是一个与列表框相结合的文本框。您键入文本,列表框显示与您的文本匹配的第一个条目。
所以,我猜这是一个合理的问题。
答案 7 :(得分:0)
创建文本框和列表框组合并不太困难,在文本框的更改事件中重新获取列表框,逐步缩小所选项目。这意味着您的用户仍然可以看到名称列表,而不是猜测,但更短,更相关的列表。
以下是此类列表框的RowSource的示例SQL:
SELECT tp.PersonKey,
tp.Surname & ", " & tp.Forename AS PersonName
FROM tblPersons tp
WHERE tp.Surname
LIKE Forms!MyForm!txtSurname.Text
ORDER BY tp.Surname, tp.Forename
注意使用文本框的Text属性,这可以确保使用文本框的当前内容,但这也意味着除非txtSurname具有焦点,否则无法重新获取文本框,这很好,因为重新查询应该只能在txtSurname的更改事件中完成。
答案 8 :(得分:0)
难以在现实世界中使用,组合框存储155k记录我认为如果将其更改为[...]浏览按钮或其他控件我更容易使用这种方式
答案 9 :(得分:0)
如果你有一个庞大的列表框,那么我会用子表单对象中的表(或表单)替换它。组合框和列表框具有65,536个对象的限制,与子表单中的表,查询或表单相比,它们的加载速度很慢。我在一张桌子上有100,000条记录,它在闪存中加载。它也很容易滚动,比列表框快得多,这意味着你不需要缩小选择范围。我的子表单下面通常还有一个简单的搜索框。
这有点棘手,因为您必须从父表单引用子表单,反之亦然,但将所有组合/列表框代码转换为子表单代码非常容易。例如如果要在子窗体中单击条目时在主窗体中找到匹配的记录: -
Private Sub POLICY_NO_Click()
Set Me.Parent.Recordset = CurrentDb.OpenRecordset("qryHPolicy")
Me.Parent.Recordset.FindFirst "[POLICY_NO]=" & Me.POLICY_NO & ""
End Sub
或将子表单设置为与主表单相同的记录源: -
Forms(Me_FormTo).Form.RecordSource = Me_RecSource
Forms(Me_FormTo).Combo6.Form.RecordSource = Me_RecSource
您可以使新的子表单外观和工作方式与列表框完全相同,因此当您有超过64,000条记录时,它绝对值得一试。