查找列中的最低值 Access 2010
Find Lowest Value in Columns Access 2010
我在 Access 2010 中有一个 table,它有 3 个独立的优先级字段。我有一个 sub 可以查看列,找到最小的数字,并将其放在 Overall Priority
字段中。
例如。
SubProjNo | GOPri | StrPri | SOPri
--------+-----------+----------+------------------
1234-12-01 | 100 | 7 | 61
1234-12-02 | | 18 | 2
1234-12-03 | 51 | |
ProjNo: 1234-12-00 Overall_Priority:2
我最初在 Private Sub Form_Current()
下有代码,但它使程序速度变慢太多,所以我将它移到 AfterUpdate
用于 table 所在的子表单。
Private Sub MFWorkProjectssubform_AfterUpdate()
Dim MinGOPri As Variant
Dim MinStrPri As Variant
Dim MinSOPri As Variant
MinGOPri = DMin("[GOPri]", "[WorkProjects]", "WorkProjects.PROJNO = Activity.PROJNO")
MinStrPri = DMin("[StrPri]", "[WorkProjects]", "WorkProjects.PROJNO = Activity.PROJNO")
MinSOPri = DMin("[SOPri]", "[WorkProjects]", "WorkProjects.PROJNO = Activity.PROJNO")
Overall_Priority = IIf(((IIf([MinGOPri] < [MinStrPri], [MinGOPri], [MinStrPri])))
< [MinSOPri], ((IIf([MinGOPri] < [MinStrPri], [MinGOPri], [MinStrPri]))), [MinSOPri])
End Sub
问题是,现在所有的列都清空了,只剩下最大值。如果我把它放回 Form_Current
中,如果有任何关于如何让它工作或如何加速它的建议,我们将不胜感激。
你不需要这一切。对于 Overall_Priority 文本框,使用此表达式作为 ControlSource:
=IIf(((IIf([GOPri]<[StrPri],[GOPri],[StrPri])))<[SOPri],((IIf([GOPri]<[StrPri],[GOPri],[StrPri]))),[SOPri])
为 Null 编辑并减少:
=IIf(IIf(Nz([GOPri],9999)<Nz([StrPri],9999),Nz([GOPri],9999),Nz([StrPri],9999))<Nz([SOPri],9999),IIf(Nz([GOPri],9999)<Nz([StrPri],9999),Nz([GOPri],9999),Nz([StrPri],9999)),Nz([SOPri],9999))
将其用作第四列;将其命名为 RowMin。
然后,在页脚中,使用 =Min([RowMin]) 作为总计框的控件源。
使用记录集怎么样,这是一个选项吗?
Dim rst As Object
Dim minValue As Integer
Dim fieldCounter As Long
Dim minPriority as Long
minPriority = 9999
Set rst = Me.recordsetclone
With rst
.MoveFirst
While Not .EOF
For fieldCounter = 0 To .Fields.Count-1
if(.Fields(fieldcounter).name = "GOPri" or .Fields(fieldcounter).name = "StrPri" or .Fields(fieldcounter).name = "SOPri" ) then
Debug.print "Now you are checking : " &.Fields(fieldcounter).Name & " with value : " & .Fields(fieldcounter) & " Current minPriority = " & minPriority
If len(Nz(.Fields(fieldCounter),"")) > 0 Then
If .Fields(fieldCounter) < minPriority Then minPriority = .Fields(fieldCounter)
End If
End if
Next
.MoveNext
Wend
End With
Set rst = Nothing
Overall_Priority = minPriority
也许您需要调整 fieldCounter 以匹配您的 Table 结构
根据您的问题,这些字段从 0 -->.... 开始计数。
Fields(0) = SubProjNo
Field(1) = GoPRi
如果您希望此列始终是其他三个字段的函数,那么您可以为 table 创建一个计算字段。帮助文档可以告诉你如何做;这篇文章也给出了方向:
通常,您会在 table 上定义一个新字段,并将其公式设置为其他三个字段中的最大值。然后,每当引用计算字段时,它总是会为您提供其中的最大值。
另一种选择是根本不用担心在数据输入时保存字段,只需创建一个视图,添加一个定义为三个值中最大值的字段。
我在 Access 2010 中有一个 table,它有 3 个独立的优先级字段。我有一个 sub 可以查看列,找到最小的数字,并将其放在 Overall Priority
字段中。
例如。
SubProjNo | GOPri | StrPri | SOPri
--------+-----------+----------+------------------
1234-12-01 | 100 | 7 | 61
1234-12-02 | | 18 | 2
1234-12-03 | 51 | |
ProjNo: 1234-12-00 Overall_Priority:2
我最初在 Private Sub Form_Current()
下有代码,但它使程序速度变慢太多,所以我将它移到 AfterUpdate
用于 table 所在的子表单。
Private Sub MFWorkProjectssubform_AfterUpdate()
Dim MinGOPri As Variant
Dim MinStrPri As Variant
Dim MinSOPri As Variant
MinGOPri = DMin("[GOPri]", "[WorkProjects]", "WorkProjects.PROJNO = Activity.PROJNO")
MinStrPri = DMin("[StrPri]", "[WorkProjects]", "WorkProjects.PROJNO = Activity.PROJNO")
MinSOPri = DMin("[SOPri]", "[WorkProjects]", "WorkProjects.PROJNO = Activity.PROJNO")
Overall_Priority = IIf(((IIf([MinGOPri] < [MinStrPri], [MinGOPri], [MinStrPri])))
< [MinSOPri], ((IIf([MinGOPri] < [MinStrPri], [MinGOPri], [MinStrPri]))), [MinSOPri])
End Sub
问题是,现在所有的列都清空了,只剩下最大值。如果我把它放回 Form_Current
中,如果有任何关于如何让它工作或如何加速它的建议,我们将不胜感激。
你不需要这一切。对于 Overall_Priority 文本框,使用此表达式作为 ControlSource:
=IIf(((IIf([GOPri]<[StrPri],[GOPri],[StrPri])))<[SOPri],((IIf([GOPri]<[StrPri],[GOPri],[StrPri]))),[SOPri])
为 Null 编辑并减少:
=IIf(IIf(Nz([GOPri],9999)<Nz([StrPri],9999),Nz([GOPri],9999),Nz([StrPri],9999))<Nz([SOPri],9999),IIf(Nz([GOPri],9999)<Nz([StrPri],9999),Nz([GOPri],9999),Nz([StrPri],9999)),Nz([SOPri],9999))
将其用作第四列;将其命名为 RowMin。
然后,在页脚中,使用 =Min([RowMin]) 作为总计框的控件源。
使用记录集怎么样,这是一个选项吗?
Dim rst As Object
Dim minValue As Integer
Dim fieldCounter As Long
Dim minPriority as Long
minPriority = 9999
Set rst = Me.recordsetclone
With rst
.MoveFirst
While Not .EOF
For fieldCounter = 0 To .Fields.Count-1
if(.Fields(fieldcounter).name = "GOPri" or .Fields(fieldcounter).name = "StrPri" or .Fields(fieldcounter).name = "SOPri" ) then
Debug.print "Now you are checking : " &.Fields(fieldcounter).Name & " with value : " & .Fields(fieldcounter) & " Current minPriority = " & minPriority
If len(Nz(.Fields(fieldCounter),"")) > 0 Then
If .Fields(fieldCounter) < minPriority Then minPriority = .Fields(fieldCounter)
End If
End if
Next
.MoveNext
Wend
End With
Set rst = Nothing
Overall_Priority = minPriority
也许您需要调整 fieldCounter 以匹配您的 Table 结构
根据您的问题,这些字段从 0 -->.... 开始计数。
Fields(0) = SubProjNo
Field(1) = GoPRi
如果您希望此列始终是其他三个字段的函数,那么您可以为 table 创建一个计算字段。帮助文档可以告诉你如何做;这篇文章也给出了方向:
通常,您会在 table 上定义一个新字段,并将其公式设置为其他三个字段中的最大值。然后,每当引用计算字段时,它总是会为您提供其中的最大值。
另一种选择是根本不用担心在数据输入时保存字段,只需创建一个视图,添加一个定义为三个值中最大值的字段。