以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  取各非空列计算后最大值,如何书写代码?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=101919)

--  作者:chh2321
--  发布时间:2017/6/9 17:58:00
--  取各非空列计算后最大值,如何书写代码?
您好,老师!

请教一个问题:
DataColChanged事件中,我书写下段代码:
    Case "第一列"
        If e.DataRow("第一列") IsNot Nothing Then
            If e.DataRow("第一列") < 1 Then
                e.DataRow("第四列") = 4
            ElseIf e.DataRow("第一列") < 2 Then
                e.DataRow("第四列") = 3
            ElseIf e.DataRow("第一列") < 3 Then
                e.DataRow("第四列") = 2
            ElseIf e.DataRow("第一列") < 4 Then
                e.DataRow("第四列") = 1
            Else
                e.DataRow("第四列") = 0
            End If
        End If

    Case "第二列"
        If e.DataRow("第二列") IsNot Nothing Then
            If e.DataRow("第二列") < 50 Then
                e.DataRow("第四列") = 4
            ElseIf e.DataRow("第二列") < 80 Then
                e.DataRow("第四列") = 3
            ElseIf e.DataRow("第二列") < 100 Then
                e.DataRow("第四列") = 2
            ElseIf e.DataRow("第二列") < 120 Then
                e.DataRow("第四列") = 1
            Else
                e.DataRow("第四列") = 0
            End If
        End If

    Case "第三列"
        If e.DataRow("第三列") IsNot Nothing Then
            If e.DataRow("第三列") < 25 Then
                e.DataRow("第四列") = 4
            ElseIf e.DataRow("第三列") < 50 Then
                e.DataRow("第四列") = 3
            ElseIf e.DataRow("第三列") < 75 Then
                e.DataRow("第四列") = 2
            ElseIf e.DataRow("第三列") < 100 Then
                e.DataRow("第四列") = 1
            Else
                e.DataRow("第四列") = 0
            End If
        End If

上段代码的问题是第四列总是以最后变化列计算后为准。
但我实际上是想要让第四列取前三列(非空列)计算后的最大值,请问如何书写代码?
[此贴子已经被作者于2017/6/9 17:58:28编辑过]

--  作者:有点蓝
--  发布时间:2017/6/9 20:08:00
--  
前3列计算逻辑是什么?如何比较大小?举例说明一下
--  作者:chh2321
--  发布时间:2017/6/9 22:06:00
--  
第一列 第二列 第三列 第四列 计算规则
>=4 0 第一列>=4,则第四列=0
3-4 1 第一列3-4之间,则第四列=1
2-3 2 第一列2-3之间,则第四列=2
1-2 3 第一列1-2之间,则第四列=3
<1 4 第一列<1,则第四列=4
>=120 0 第二列≥120,则第四列=0
100-120 1 第二列100-120,则第四列=1
80-120 2 第二列80-120,则第四列=2
50-80 3 第二列50-80,则第四列=3
<50 4 第二列<50,则第四列=4
>=100 0 第三列>=100,则第四列=0
75-100 1 第三列75-100,则第四列=1
50-75 2 第三列50-75,则第四列=2
25-50 3 第三列25-50,则第四列=3
<25 4 第三列<25,则第四列=4
第一列 第二列 第三列 第四列
例1 3.4 null null 1 第一列非空,根据上面计算公式,第四列等于1
例2 null 56 null 3 忽略空值,第二列非空,根据上面计算公式,第四列等于3
例3 null null 120 0 第一、二列空值,忽略;第三列等于120,第四列应该等于0
例4 3.4 56 null 3 第一列等于3.4,则第四列应该等于1;第二列等于56,第四列应该等于3;第三列空值,可以忽略,因此第四列取二者最大值3
例5 3.4 56 120 3 第一列等于3.4,则第四列应该等于1;第二列等于56,第四列应该等于3;第三列等于120,第四列应该等于0,故第四列取三者中最大值3
例6 null 90 24 4 忽略空值,第二列等于90,根据上面计算公式,第四列应该等于2,但第三列等于24,根据上面计算公式,第四列应该等于4,所以第四列取其中最大值,等于4
例7 5 121 110 0 三列均非空,根据上面公式,第四列等于0
总结规则:
1、一列非空,两列为空值时,忽略空值列,以一列计算为准
2、两列非空,一列为空值时,忽略空值列,两列分别计算第四列取值,取二者中最大值
3、三列均为非空,则三列分别计算第四列取值,取三者中最大值

--  作者:chh2321
--  发布时间:2017/6/9 22:15:00
--  
    Case "第一列","第二列","第三列"
        If e.DataRow("第一列") IsNot Nothing OrElse e.DataRow("第二列") IsNot Nothing OrElse e.DataRow("第三列") IsNot Nothing Then
            If e.DataRow("第一列") < 1  OrElse e.DataRow("第二列") < 50 OrElse e.DataRow("第三列") < 25 Then
                e.DataRow("第四列") = 4
            ElseIf e.DataRow("第一列") < 2 OrElse e.DataRow("第二列") < 80 OrElse e.DataRow("第三列") < 50 Then
                e.DataRow("第四列") = 3
            ElseIf e.DataRow("第一列") < 3 OrElse e.DataRow("第二列") < 100 OrElse e.DataRow("第三列") < 75 Then
                e.DataRow("第四列") = 2
            ElseIf e.DataRow("第一列") < 4 OrElse e.DataRow("第二列") < 120 OrElse e.DataRow("第三列") < 100 Then
                e.DataRow("第四列") = 1
            Else
                e.DataRow("第四列") = 0
            End If
        End If

这段代码,只有当第1-3列均非空时是正确的;但只要有一列空值,第四列就会等于4.  所以不符合要求

--  作者:有点蓝
--  发布时间:2017/6/9 22:19:00
--  

Case "第一列","第二列","第三列"
    Dim v As Integer = 0
    If e.DataRow.Isnull("第一列")  = False Then
        If e.DataRow("第一列") < 1 Then
            v = 4
        ElseIf e.DataRow("第一列") < 2 Then
            v = 3
        ElseIf e.DataRow("第一列") < 3 Then
            v = 2
        ElseIf e.DataRow("第一列") < 4 Then
            v = 1
        Else
            v = 0
        End If
    End If
    Dim v2 As Integer = 0
    If e.DataRow.Isnull("第二列") = False  Then
        If e.DataRow("第二列") < 50 Then
            v2 = 4
        ElseIf e.DataRow("第二列") < 80 Then
            v2 = 3
        ElseIf e.DataRow("第二列") < 100 Then
            v2 = 2
        ElseIf e.DataRow("第二列") < 120 Then
            v2 = 1
        Else
            v2 = 0
        End If
    End If
    v = Math.Max(v,v2)
    Dim v3 As Integer = 0
    If e.DataRow.Isnull("第三列") = False  Then
        If e.DataRow("第三列") < 25 Then
            v3 = 4
        ElseIf e.DataRow("第三列") < 50 Then
            v3 = 3
        ElseIf e.DataRow("第三列") < 75 Then
            v3 = 2
        ElseIf e.DataRow("第三列") < 100 Then
            v3 = 1
        Else
            v3 = 0
        End If
    End If
    e.DataRow("第四列")  = Math.Max(v,v3)

[此贴子已经被作者于2017/6/9 22:19:34编辑过]

--  作者:chh2321
--  发布时间:2017/6/9 23:20:00
--  

  谢谢老师! 

  祝周末愉快!