是否可以通过组合框值列表进行排序?
Is it possible to order by a combo box value list?
我正在使用 Access,我正在编写一个 SQL 查询,我想在其中按组合框值列表顺序进行排序。例如,如果行来源类型的组合框列表:值列表和行来源:星期一、星期二、星期三等...
将根据组合框中找到的顺序而不是字母顺序进行排序。
您可以使用 IIF 来设置顺序。
ORDER BY IIf([FIELD]="Monday", 0, IIf([Status]="Tuesday", 1, 2))
因此您可以在 vba 中构建 SQL,从 ComboBox 获取值并将其构建到您的 ORDER BY 子句中。
假设您的组合称为 cboDays
您可以循环组合并获取值。
Dim strOrderBy As String
Dim intCounter As Integer
For intCounter = 0 To cboDays.ListCount - 1
Debug.Print cboDays.ItemData(intCounter)
strOrderBy = strOrderBy & "IIf([FIELD]="& Chr(34) & cboDays.ItemData(intCounter) & Chr(34) & ", " & i & ", "
Next
'Remove the last comma
Dim intOBLen As Integer
intOBLen = Len(strOrderBy)
strOrderBy = Left(strOrderBy, intSSLen - 1)
strOrderBy = "ORDER BY " & strOrderBy & ")"
然后将其添加到您的其余部分 SQL 并将表单的 RowSource 设置为此 SQL。
按照你写的方式,答案是"No"。不是动态的。
您应该做的是将组合框项目存储在 table 中。 绝不使用值列表是个好主意,这正是您不应该使用的明显原因之一。
将值存储在 table 中,并使用排名字段。像这样:
ComboName ComboValue ComboRank
cboDays Monday 1
cboDays Tuesday 2
cboDays Wednesday 3
cboDays Thursday 4
cboDays Friday 5
cboDays Saturday 6
cboDays Sunday 7
现在,对于组合框的行源,请使用:
SELECT ComboRank, ComboValue
FROM tblCombos
WHERE ComboName = "cboDays"
ORDER BY ComboRank;
然后,在您的组合框中设置以下属性:
Column Count: 2
Column Widths: 0, 1
Bound Column: 2
Limit To List: Yes
如果您有任何其他组合框,请将它们添加到您的 tblCombos 并将 ComboName 更改为您的组合框的名称,并相应地添加值和排名。
您的数据 table 应该存储 ComboValue(理想情况下,您实际使用 ID 字段以便存储尽可能少的信息)。所以,你要做的是在 tblCombo 上加入 left join 以获得你的排序顺序:
Select MyTable.*, tblCombo.ComboRank
from MyTable
Left Join tblCombo
on MyTable.DayValue = tblCombo.ComboValue
Order By tblCombo.ComboRank
这就是您要编写的查询,以显示所有数据,并按组合框的顺序排序。显然,您需要将 "MyTable.DayValue" 更改为 table 和字段的实际名称。
我正在使用 Access,我正在编写一个 SQL 查询,我想在其中按组合框值列表顺序进行排序。例如,如果行来源类型的组合框列表:值列表和行来源:星期一、星期二、星期三等...
将根据组合框中找到的顺序而不是字母顺序进行排序。
您可以使用 IIF 来设置顺序。
ORDER BY IIf([FIELD]="Monday", 0, IIf([Status]="Tuesday", 1, 2))
因此您可以在 vba 中构建 SQL,从 ComboBox 获取值并将其构建到您的 ORDER BY 子句中。
假设您的组合称为 cboDays
您可以循环组合并获取值。
Dim strOrderBy As String
Dim intCounter As Integer
For intCounter = 0 To cboDays.ListCount - 1
Debug.Print cboDays.ItemData(intCounter)
strOrderBy = strOrderBy & "IIf([FIELD]="& Chr(34) & cboDays.ItemData(intCounter) & Chr(34) & ", " & i & ", "
Next
'Remove the last comma
Dim intOBLen As Integer
intOBLen = Len(strOrderBy)
strOrderBy = Left(strOrderBy, intSSLen - 1)
strOrderBy = "ORDER BY " & strOrderBy & ")"
然后将其添加到您的其余部分 SQL 并将表单的 RowSource 设置为此 SQL。
按照你写的方式,答案是"No"。不是动态的。
您应该做的是将组合框项目存储在 table 中。 绝不使用值列表是个好主意,这正是您不应该使用的明显原因之一。
将值存储在 table 中,并使用排名字段。像这样:
ComboName ComboValue ComboRank
cboDays Monday 1
cboDays Tuesday 2
cboDays Wednesday 3
cboDays Thursday 4
cboDays Friday 5
cboDays Saturday 6
cboDays Sunday 7
现在,对于组合框的行源,请使用:
SELECT ComboRank, ComboValue
FROM tblCombos
WHERE ComboName = "cboDays"
ORDER BY ComboRank;
然后,在您的组合框中设置以下属性:
Column Count: 2
Column Widths: 0, 1
Bound Column: 2
Limit To List: Yes
如果您有任何其他组合框,请将它们添加到您的 tblCombos 并将 ComboName 更改为您的组合框的名称,并相应地添加值和排名。
您的数据 table 应该存储 ComboValue(理想情况下,您实际使用 ID 字段以便存储尽可能少的信息)。所以,你要做的是在 tblCombo 上加入 left join 以获得你的排序顺序:
Select MyTable.*, tblCombo.ComboRank
from MyTable
Left Join tblCombo
on MyTable.DayValue = tblCombo.ComboValue
Order By tblCombo.ComboRank
这就是您要编写的查询,以显示所有数据,并按组合框的顺序排序。显然,您需要将 "MyTable.DayValue" 更改为 table 和字段的实际名称。