|
本帖最后由 todaynew 于 2009-4-23 15:48 编辑
存货计价方式,大体可以分为两大类。一类是计划成本计价法,一类是实际成本计价法。存货计价方式的不同对于本期发出存货的成本和存货期末结余的资产价值有很大影响。因此无论是会计准则还是企业所得税法,均对存货的计价方式做出了明确规定。本文想讨论的问题是,能否根据企业不同类别的存货采用不同类型的计价方式,混合多种计价方式如何在编程中实现。在经过两天时间的研究后,对该问题得到了肯定的答案。
在本例中,采用了五种不同的计价方式,其中有个别计价法、先进先出法、后进先出法、移动平均法、加权平均法。这五种计价方式均归属于实际成本计价法,是企业常用的存货计价类型。在本例的操作中,个别计价法采用的是发料单价或发料金额双击方式进行运算。其余四种计价方式,在选项卡中对应选择后,点击计算发料即可。
需要提示说明的是,存货发料计价通常是在月末进行,也就是说月度中间发料时只计数量不计金额。月末再根据不同的计价方式,计算本月发料金额以及期末结存金额。也正是因为这样一种会计核算流程,才使得后进先出法和加权平均法成为可能。
实例:
图示:
VB代码:
Private Sub 计算_Click()
If IsNull(Me.物资ID.Value) Then Exit Sub
Select Case Me.选项
Case 1 '先进先出法
先后法
Case 2 '后进先出法
先后法
Case 3 '移动平均法
移动法
Case 4 '加权平均法
加权法
End Select
Me.收发存子窗体.Form.Requery
End Sub
Private Sub 先后法()
Dim rs1 As New ADODB.Recordset
Dim sql1 As String
Dim rs2 As New ADODB.Recordset
Dim sql2 As String
Dim 收料数量 As Single
Dim 发料数量 As Single
Dim 累计金额 As Single
Dim 收发余额 As Single
sql1 = "select * from 发料查询 where format(日期,'yymm')='" & Me.月度.Value & "'and 物资ID=" & Me.物资ID.Value
rs1.Open sql1, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
If Me.选项.Value <> 2 Then
sql2 = "select * from 库存及收料查询 where format(日期,'yymm')='" & Me.月度.Value & "'and 物资ID=" & Me.物资ID.Value
Else
sql2 = "select * from 库存及收料查询 where format(日期,'yymm')='" & Me.月度.Value & "'and 物资ID=" & Me.物资ID.Value & " ORDER BY 编号 DESC"
End If
rs2.Open sql2, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
收发余额 = 0
Do While Not (rs1.EOF)
If 收发余额 > 0 Then
收料数量 = 收发余额
收发余额 = 0
Else
收料数量 = rs2("数量")
End If
If rs1("数量") < 收料数量 Then
rs1("单价") = rs2("单价")
rs1("金额") = rs1("数量") * rs1("单价")
rs1.Update
收发余额 = 收料数量 - rs1("数量")
Else
累计金额 = 0
发料数量 = rs1("数量")
Do While Not (rs2.EOF)
累计金额 = 累计金额 + 收料数量 * rs2("单价")
发料数量 = 发料数量 - 收料数量
rs2.MoveNext
收料数量 = rs2("数量")
If 发料数量 < 收料数量 Then
累计金额 = 累计金额 + 发料数量 * rs2("单价")
rs1("金额") = 累计金额
rs1("单价") = Round(rs1("金额") / rs1("数量"), 2)
rs1.Update
收发余额 = rs2("数量") - 发料数量
Exit Do
End If
Loop
End If
rs1.MoveNext
Loop
Me.收发子窗体.Form.Requery
rs1.Close
rs2.Close
End Sub
Private Sub 移动法()
Dim rs1 As New ADODB.Recordset
Dim sql1 As String
Dim rs2 As New ADODB.Recordset
Dim sql2 As String
Dim 累计数量 As Single
Dim 累计金额 As Single
Dim 库存数量 As Single
Dim 库存金额 As Single
Dim i As Long
sql1 = "select * from 发料查询 where format(日期,'yymm')='" & Me.月度.Value & "'and 物资ID=" & Me.物资ID.Value
rs1.Open sql1, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
sql2 = "select * from 库存及收料查询 where format(日期,'yymm')='" & Me.月度.Value & "'and 物资ID=" & Me.物资ID.Value
rs2.Open sql2, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
库存数量 = 0
库存金额 = 0
For i = 1 To rs1.RecordCount
累计数量 = 库存数量
累计金额 = 库存金额
Do While Not (rs2.EOF)
If rs2("编号").Value < rs1("编号").Value Then
累计数量 = 累计数量 + rs2("数量")
累计金额 = 累计金额 + rs2("金额")
rs2.MoveNext
Else
rs2.MovePrevious
Exit Do
End If
Loop
rs1("单价") = Round(累计金额 / 累计数量, 2)
rs1("金额") = rs1("数量") * rs1("单价")
rs1.Update
库存数量 = 累计数量 - rs1("数量")
库存金额 = 累计金额 - rs1("金额")
If rs2.EOF = False Then rs2.MoveNext
rs1.MoveNext
Next
Me.收发子窗体.Form.Requery
rs1.Close
rs2.Close
End Sub
Private Sub 加权法()
Dim rs1 As New ADODB.Recordset
Dim sql1 As String
Dim rs2 As New ADODB.Recordset
Dim sql2 As String
Dim 累计数量 As Single
Dim 累计金额 As Single
Dim 单价 As Single
sql1 = "select * from 发料查询 where format(日期,'yymm')='" & Me.月度.Value & "'and 物资ID=" & Me.物资ID.Value
rs1.Open sql1, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
sql2 = "select * from 库存及收料查询 where format(日期,'yymm')='" & Me.月度.Value & "'and 物资ID=" & Me.物资ID.Value
rs2.Open sql2, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
累计数量 = 0
累计金额 = 0
For i = 1 To rs2.RecordCount
累计数量 = 累计数量 + rs2("数量")
累计金额 = 累计金额 + rs2("金额")
rs2.MoveNext
Next
单价 = Round(累计金额 / 累计数量, 2)
For i = 1 To rs1.RecordCount
rs1("单价") = 单价
rs1("金额") = rs1("数量") * rs1("单价")
rs1.Update
rs1.MoveNext
Next
Me.收发子窗体.Form.Requery
rs1.Close
rs2.Close
End Sub
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|