Access交流中心

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

用自定义函数计算余额出错

大肚秃秃  发表于:2019-09-03 16:07:04  
复制

点击下载此附件

查询中有一语句:余额: GetBalance([AutoID],[cDFMoney]-[cJFMoney])

'函数用途: 求结余金额
'输入参数: AutoID      对应查询中当前行AutoID字段的值
'                Balance     对应查询中的当前行结余金额的值
'使用注意: 必须以AutoID字段排升序,否则会出错

Public Function GetBalance(AutoID As Long, Balance As Currency) As Currency
    Static lngPreID As Long                 '前次AutoID
    Static curPreBalance As Currency    '前次余额
           If AutoID > lngPreID Then
               curPreBalance = curPreBalance + Balance
           Else
               curPreBalance = Balance
           End If
               lngPreID = AutoID
               GetBalance = curPreBalance
               Debug.Print AutoID & "     " & Balance & "     " & curPreBalance
End Function


计算出结果上部分正确,一部分与人工计算的结余不相符。请各位老师指正。

 

Top
西出阳关无故人 发表于:2019-09-03 17:14:51

首次打开查询,结果是正确的,只不过视图改变后会发现数据变化(成不正确的),包括排序、筛选、窗口的调整、垂直滚动,以及用函数计算出来的那个单元格获得焦点等行为,都可能导致重新计算并显示错误的结果。

如果使用下面的函数,就不会出现你的情况:

Public Function my余额(AutoID As Long) As Currency
    Dim a
    Dim b
    a = DSum("cDFMoney", "tblSOA", "AutoID<=" & AutoID)
    b = DSum("cJFMoney", "tblSOA", "AutoID<=" & AutoID)
    my余额 = a - b
End Function
你的问题应该与lngPreID、curPreBalance 这两个变量有关。特别是lngPreID,在函数快结束时,才赋值,之前的“If AutoID > lngPreID Then”时,lngPreID 到底是多少呢?也许是0.



大肚秃秃 发表于:2019-09-17 09:22:58

我直接采用了SQL 语句,经运行符合要求:

SELECT a.*, (select  Round(sum(cDFMoney-cJFMoney),2) from tblSOA as b where a.autoid>=b.autoid) AS 余额, tblDigestType.cDigestType, tblcBName.cBAccount
FROM tblDigestType INNER JOIN (tblSOA AS a INNER JOIN tblcBName ON a.ID=tblcBName.ID) ON tblDigestType.ID=a.cDigest
ORDER BY a.AutoID;




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