输入数据时为了及时反应子窗体的合计,虽然可以用简单的方法,但速度不太让人满意,为此我采用了ADO的方式,写了一个自定义函数,只要有数量、单价,就会即时计算出金额与合计金额,速度非常满意。而且在删除时自动修改行号。正式表不是不需要存储金额字段的,但临时表中必须要设一个金额字段。有了这个函数只需在数量、单价的更新后事件中 =批量填充金额(),和子窗体的确认删除后事件 =批量填充金额() 即可。删除某一行后,行号自动重新填充编号,合计金额也自动重新计算。
我根本不懂英语,所以写的代码基本都是用中文,有时也在中文前加一个字母,管他的,只要能得到结果,只要能看懂,又不是必须英文,将就吧。
在修改时的加载事件中同样 =批量填充金额()
更新后事件已经在相应的文本框中有了,不需要在窗体的更新后事件中再重复。
Public Function dm批量填充金额()
'--------------------------------------------定义记录集
Dim rst As Object
Dim strSQL As String
'----------------------------------------定义序号与合计金额的变量
Dim i序号 As Currency
Dim Sum金额 As Currency
'----------------------------------------如果临时表中没有数据时,退出
If DCount("*", "入库单销售单明细临时表") = 0 Then Exit Function
'----------------------------------------打开记录集
strSQL = "select * from 入库单销售单明细临时表 "
Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
'----------------------------------------'如果当前处理未保存状态,先进行保存
If Me.Dirty Then Me.Dirty = False
'-----------------------------------------给变量设定初始值
i序号 = 0 And Sum金额 = 0
'-----------------------------------------从第一条记录开始
rst.MoveFirst
'-----------------------------------------循环进行
Do Until rst.EOF
'-------------------------------------允许修改
rst.Edit
'-------------------------------------修改各字段的值,这里是序号与金额
rst!序号 = Format(i序号 + 1, "00")
rst!金额 = my45(Nz(rst!数量, 0) * Nz(rst!单价, 0), 2) '四舍五入,否则会出错,这里调用了自定义四舍五入函数
'-------------------------------------修改后,就要更新,否则不会被修改
rst.Update
'-------------------------------------重新设定序号与合计金额的变量
i序号 = rst!序号
Sum金额 = Sum金额 + rst!金额
'-------------------------------------下一条记录
rst.MoveNext
Loop
'-------------------------------------将合计金额斌给主窗体
Me.Parent!金额 = Sum金额
rst.Close
Set rst = Nothing
Me.Parent!状态 = "未保存"
End Function
另附UMVSoft老师的四舍五入函数,这里就用到了。
Public Function my45(a As Double, n As Integer) As Double
my45 = Int(a * 10 ^ n + 0.51 ) / 10 ^ n
End Function
Access软件网交流QQ群(群号:198465573) |