通过键入单个字母对 Access 表单进行排序

Posted

技术标签:

【中文标题】通过键入单个字母对 Access 表单进行排序【英文标题】:Sorting Access form by typing a single letter 【发布时间】:2015-08-10 12:31:58 【问题描述】:

我正在寻求通过接受用户键入的单个字母来对 Access (2013) 表单的数据源进行排序的建议。这个问题更多的是关于设计策略而不是实际代码,尽管代码示例也可能会有所帮助。

我为客户开发的系统有一个带有数据集的表单,该数据集按我定义的一组参数进行排序。所有的作品,我已经为用户提供了一些实时的排序方法,可以根据需要动态地重新排序绑定的数据集。同样,一切正常。

然而,他们在此之前使用的系统(不管你信不信是一个绿屏终端应用程序)有一个他们仍然非常怀念的功能,而且应该很容易实现。例如,该功能是查看客户屏幕上的数据(这是一个非常长的列表),并且能够(1)键入姓氏的第一个字母以自动“向下滚动”到该部分列表或 (2) 过滤第一个字母的数据集 ALL BY TYPING JUST THE LETTER。我建议创建一个未绑定的字段,他们可以用鼠标点击、输入字母并按 Enter,但反馈是鼠标点击、输入并按 Enter 需要时间。我建议为他们可以点击的每个字母制作按钮,以实现相同的目标,但再次获得相同的反馈。

这个功能确实有意义。例如,如果您有一个包含 8,000 名客户的列表,并且您想快速找到姓氏以字母“R”开头的人,那么将鼠标悬停在滚动条上并拖动对于整天这样做的用户来说可能会变得乏味。相反,如果他们可以简单地按 R 键并直接前往那里,那将是一个好主意。

我怀疑答案很简单,但我还没有找到。是否在某处设置了 keydown 事件?

【问题讨论】:

【参考方案1】:

将表单的KeyPreview 属性设置为True 以在任何击键时对其进行第一击,然后将KeyDown 事件处理程序添加到表单中,如下所示(未经测试):

Private Sub Form_KeyDown(ByVal KeyCode As Integer, ByVal Shift As Integer)
    Dim NoTextBoxFocused As Boolean
    ' Make sure we're not stealing text from focused control
    NoTextBoxFocused = TypeName(ActiveControl) <> "TextBox" And _
                       TypeName(ActiveControl) <> "ComboBox"
    If KeyCode >= vbKeyA And KeyCode <= vbKeyZ And NoTextBoxFocused Then    
        ' PSEUDOCODE: Sort here, presumably case-insensitive;
        '   otherwise, check for capitals with this:
        '   If (Shift And acShiftMask) <> 0 Then

        KeyCode = 0     ' Turns off further handling
    End If
    ' Otherwise, fall through without doing anything else
End Sub

您可能还希望将其扩展为完整的增量搜索,仅在搜索时显示一个标签或文本框,当用户键入他们想要的任何内容的前几个字母时逐步过滤。如果您显示一个文本框,请确保很容易开始新的增量搜索(使用 Esc 或者只是超时)。这应该有助于他们摆脱错过旧计划。

【讨论】:

【参考方案2】:

只需使用任何控件(组合框、列表框、文本框、按钮)并在 AfterUpdate 或 OnClick 事件中运行 ApplyFilter 嵌入式宏或使用 SQL LIKE 子句的 vba RunCommand:

ComboBox: Letter Filter
Row Source: "A";"B";"C"; ... "Z"
Row Source Type: Value List

ApplyFilter
   Filter Name: <blank>
   Where Condition: ="[LastName] LIKE '" & [Forms]![Customers]![LetterFilter] & "*'"
   Control Name: <blank>

或者,使用相同的控件和触发事件,更新表单的记录源:

 Recordsource: SELECT * FROM [Customers] 
              WHERE [LastName] LIKE [Forms]![Customers]![LetterFilter] & '*'

使用Left()进行同义查询

 Recordsource: SELECT * FROM [Customers] 
                  WHERE Left([LastName], 1) = [Forms]![Customers]![LetterFilter] 

VBA 中的 OR SQL 查询:

 Forms!Customers.Form.RecordSource = "SELECT * FROM [Customers] 
                  WHERE [LastName] LIKE '" & [Forms]![Customers]![LetterFilter] & "*'"

记住设置 RecordSource 不是在 VBA 中而是在查询窗口中

【讨论】:

我怀疑两次鼠标移动 + 单击以获得组合框来执行此操作,或者单击 + 击键,仍然比用户真正想要的要多,特别是如果他们习惯于硬核具有可笑的手动优化键盘快捷键路径的 DOS 应用程序。 OP 可以在表单打开时将焦点设置在控件上。所以用户可以快速输入字母+回车,因为可以写入组合框。加上将控件移到 tab 顺序的第一个,keyboard shortcut,Ctrl+Home,可以让用户返回到 combobx 过滤以选择新字母。

以上是关于通过键入单个字母对 Access 表单进行排序的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何仅使用Java中的util.Scanner包按字母顺序对单个字符串进行排序?

首先按字符对字符串进行排序

如何使用 VBA 在 Access 中关闭单个表单实例?

将用户表单提交到 Access 数据库时自动增加字母数字字符串

在 SQL 中对星期几进行排序

通过表单从 Access 联结表中删除行