Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

ACCESS如何计算5个不同字段值的最大差?

fcy6571  发表于:2010-07-18 13:27:03  
复制

表"ABC"中分别有A、B、C、D、E 5个字段,每个字段对应1个ID号,在窗体或报表中如何计算出同一ID号中5个不同数值的最大差(绝对值),如图

 

Top
fcy6571 发表于:2010-07-18 13:31:44

用IIF函数只能实现4个字段的计算,如:

=Abs(IIf(Abs([A]-[B])>=Abs([B]-[C]) And Abs([A]-[B])>=Abs([A]-[C]) And Abs([A]-[B])>=Abs([A]-[D]) And Abs([A]-[B])>=Abs([B]-[D]) And Abs([A]-[B])>=Abs([C]-[D]),([A]-[B]),IIf(Abs([A]-[c])>=Abs([B]-[C]) And Abs([A]-[c])>=Abs([A]-[b]) And Abs([A]-[c])>=Abs([A]-[D]) And Abs([A]-[c])>=Abs([B]-[D]) And Abs([A]-[c])>=Abs([C]-[D]),([A]-[c]),IIf(Abs([A]-[d])>=Abs([B]-[C]) And Abs([A]-[d])>=Abs([A]-[b]) And Abs([A]-[d])>=Abs([A]-[c]) And Abs([A]-[d])>=Abs([B]-[D]) And Abs([A]-[d])>=Abs([C]-[D]),([A]-[d]),IIf(Abs([B]-[C])>=Abs([A]-[b]) And Abs([B]-[C])>=Abs([A]-[c]) And Abs([B]-[C])>=Abs([A]-[D]) And Abs([B]-[C])>=Abs([B]-[D]) And Abs([B]-[C])>=Abs([C]-[D]),([B]-[C]),IIf(Abs([B]-[D])>=Abs([A]-[b]) And Abs([B]-[D])>=Abs([A]-[c]) And Abs([B]-[D])>=Abs([A]-[D]) And Abs([B]-[D])>=Abs([B]-[C]) And Abs([B]-[D])>=Abs([C]-[D]),([B]-[D]),([C]-[D])))))))

按此方法不能实现5个字段值的计算,哪位高手指点一下,谢谢!



煮江品茶 发表于:2010-07-18 15:12:46
用循环应该可以吧

煮江品茶 发表于:2010-07-18 15:54:09

你用这个函数来计算吧。这个函数可以分别求出一组正数的最大值和最小值。你要的最大差值就是这两个数的差。

Function Extremum(B As Boolean, ParamArray intVal() As Variant) As Single
'参数:B=true 最大值,B=false 最小值
Dim i As Long
Dim v As Single
If B = True Then
    v = 0
Else
    v = 1
End If
For i = 0 To UBound(intVal())
If B = True Then
    If intVal(i) > v Then v = intVal(i)
Else
    If intVal(i) < v Then v = intVal(i)
End If
Next i
End Function



煮江品茶 发表于:2010-07-18 16:40:09

上面的代码有点小问题,修正如下:

 

Function Extremum(B As Boolean, ParamArray intVal() As Variant) As Single
'参数:B=true 最大值,B=false 最小值
Dim i As Long
Dim v As Single
If B = True Then
    v = 0
Else
    v = 10 ^ 10
End If
For i = 0 To UBound(intVal())
    If B = True Then
        If intVal(i) > v Then v = intVal(i)
    Else
        If intVal(i) < v Then v = intVal(i)
    End If
Next i
Extremum = v
End Function

调用时:
SELECT *, Extremum(True,Abs([A]),Abs([B]),Abs([C]),Abs([D]),Abs([E]))-Extremum(False,Abs([A]),Abs([B]),Abs([C]),Abs([D]),Abs([E])) AS 最大差
FROM 表1;



fcy6571 发表于:2010-07-18 20:02:20

敬请版主原谅,我是个菜鸟,不太明白您写的代码怎样用?能不能教我怎样用,不胜感激!



fcy6571 发表于:2010-07-18 20:04:14
我只会用表达式生成器,代码我真的一点都不懂。

fcy6571 发表于:2010-07-18 20:10:07
敬请版主原谅,我是个菜鸟,不太明白您写的代码怎样用?能不能教我怎样用,不胜感激!见附件点击下载此附件

煮江品茶 发表于:2010-07-18 20:12:43

点击下载此附件

 

函数写到模块中,然后在查询中就可以使用了。注意看模块1和最大差值查询。

 



煮江品茶 发表于:2010-07-18 20:22:22

这是用你的例子做的实例:

 

点击下载此附件

fcy6571 发表于:2010-07-18 20:48:37

谢谢!明白了!

最大差查询应该是:

最大差: Extremum(True,[A],[B],[C],[D],[E])-Extremum(False,[A],[B],[C],[D],[E])

我把ABS去掉就可以了,如最大数为0.23,最小数为-0.11,最大差应为:0.34而不是0.12



fcy6571 发表于:2010-07-21 10:39:49
再烦版主一个问题:如果[最大差]和[A]、[B]、[C]、[D]、[E]任何一字段值<=[F]字段则判断为“不合格”,<=[G]字段则判断为“合格”语句如何写?

总记录:11篇  页次:1/1 9 1 :