Access连续表单按组合框文本排序及记录集可更新问题
问题:Access连续表单实现按优先级文本排序且记录集可更新
现有数据表结构
Task-TrainingStatus表
Id Priority 1 Medium 2 Low 3 High 4 Lowest 5 N/A 6 Highest
Task-TrainingList表
Id PriorityLevel 1 3 2 3 3 6 4 2 5 1 6 2 7 4 8 5
表单与组合框配置
创建了名为TrainingList的连续表单,其中组合框cboxPriority配置如下:
Control Source : PriorityLevel Row Source : SELECT [Task-TrainingStatus].[ID], [Task-TrainingStatus].[Priority] FROM [Task-TrainingStatus] ORDER BY [Priority]; Bound Column: 1 Column Count: 2 Column Widths: 0";;1"
组合框可正常显示Low、Lowest、Medium等文本。
为标签lblPriority设置的点击事件代码:
Private Sub lblPriority_Click() Me.OrderBy = "PriorityLevel" Me.OrderByOn = True End Sub
当前问题
点击标签后,表单会基于PriorityLevel(对应Task-TrainingStatus的ID)数值排序,顺序不符合预期。期望按Priority文本排序,目标顺序为:
High Highest Low Lowest Medium N/A
尝试使用JOIN的SQL语句后,表单可正确排序,但记录集变为不可更新;移除JOIN后记录集可更新,但排序失效。当前使用的SQL语句:
SELECT [Task-TrainingList].IDtodo, [Task-TrainingList].Title, [Task-TrainingList].Description, [Task-TrainingList].DateEntered, [Task-TrainingList].PriorityLevel, [Task-TrainingList].WhoAmI, [Task-TrainingList].WhatAmI, [Task-TrainingList].Done, [Task-TrainingStatus].Priority FROM [Task-TrainingList] INNER JOIN [Task-TrainingStatus] ON [Task-TrainingList].prioritylevel = [Task-TrainingStatus].ID;
解决方案
方法1:添加排序权重字段(最直观)
在
Task-TrainingStatus表中新增数值型字段SortOrder,按期望顺序赋值:Id Priority SortOrder 3 High 1 6 Highest 2 2 Low 3 4 Lowest 4 1 Medium 5 5 N/A 6 修改表单点击事件代码,通过关联字段获取排序权重并排序:
Private Sub lblPriority_Click() Me.OrderBy = "DLookup('SortOrder', 'Task-TrainingStatus', 'ID = PriorityLevel')" Me.OrderByOn = True End Sub或者在表单记录源中添加计算字段:
SELECT *, DLookup('SortOrder', 'Task-TrainingStatus', 'ID = PriorityLevel') AS PrioritySort FROM [Task-TrainingList]再修改排序代码:
Private Sub lblPriority_Click() Me.OrderBy = "PrioritySort" Me.OrderByOn = True End Sub此方式不使用JOIN,记录集保持可更新。
方法2:使用自定义排序函数(无需修改表结构)
创建VBA函数返回优先级对应的排序权重:
Function GetPrioritySort(priorityText As String) As Integer Select Case priorityText Case "High": GetPrioritySort = 1 Case "Highest": GetPrioritySort = 2 Case "Low": GetPrioritySort = 3 Case "Lowest": GetPrioritySort = 4 Case "Medium": GetPrioritySort = 5 Case "N/A": GetPrioritySort = 6 Case Else: GetPrioritySort = 7 End Select End Function修改表单点击事件代码:
Private Sub lblPriority_Click() Me.OrderBy = "GetPrioritySort(DLookup('Priority', 'Task-TrainingStatus', 'ID = PriorityLevel'))" Me.OrderByOn = True End Sub同样可在记录源中添加计算字段,再按该字段排序,效果一致。
方法3:隐藏文本框辅助排序(表单层面处理)
在表单中添加两个隐藏文本框:
- 第一个控件来源设为:
DLookup("Priority", "Task-TrainingStatus", "ID = PriorityLevel") - 第二个控件来源设为自定义排序函数或
SortOrder字段(如方法1/2中的逻辑)
- 第一个控件来源设为:
修改点击事件代码按隐藏文本框排序:
Private Sub lblPriority_Click() Me.OrderBy = "txtPrioritySort" ' txtPrioritySort为第二个隐藏文本框名称 Me.OrderByOn = True End Sub此方式完全在表单层面实现,不影响记录集可更新性。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

