|
楼主 |
发表于 2013-4-8 17:25
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 lee1892 于 2013-4-10 10:56 编辑
使用正确的数据结构的例子(三)
本贴附件:
发货明细统计 by Lee1892.rar
(18.98 KB, 下载次数: 451)
示例的原贴:[求助] 发货明细统计
该例子中,有原始数据的出入库记录若干,需要根据这些记录统计计算库存结余。本来是一个非常简单的事情,只需要根据不同的品名让出入库数量对号入座就可以得出结果,相信所有人的第一反应是用个字典索引品名就可以的。
可这个例子中,有个有意思的要求,其每条出入库记录的备注栏内用形如“50*5+44+30*4”这样的字符串来表达出入库数量的包装详细信息,前述这样的一个字符串表达了:50个单位一个包装的计5包,44个单位一个包装的计1包,30个单位一个包装的计4包。该例要求计算结余的同时得出库存结余的包装详细信息,以前述的这个数量作为入库数量,则该品名入库了 50*5+44+30*4 = 414 个单位,若出库了 50*2+30*3 = 190 个单位,则结余应为:224 = 50*3+44+30
该贴中有两个回复尝试解决的,可都出现了偏差。实际上可以构建一个树形结构,每个品名下有若干种包装数量,出入库时除了品名需要对号入座外,不同的包装数量也需要对号入座。为此,我们可以设置如下的自定义数据类型:
[code=vb]
Private Type PACKAGE_DETAIL
UnitQty As Long
PackNum As Long
End Type
Private Type ITEM_INFO
Name As String
Unit As String
Quantity As Long
Packs() As PACKAGE_DETAIL
dicIndex As Object
End Type
[/code]
其中,dicIndex会被创建为字典对象,用包装的单位数量(即每包的数量)来索引Packs这个数组的元素下标,从而实现对号入座。
另外,我们还需要至少两个私有过程或函数,用来将Packs数组翻译成字符串和将字符串翻译成Packs数组,下面的代码还包括了统计计算Packs数组的总数量的函数:
[code=vb]
Private Sub StringToPacks(ByVal strDetail$, ByRef arrPacks() As PACKAGE_DETAIL)
Dim aPackStr, i&, aDetail
aPackStr = Split(strDetail, "+")
ReDim arrPacks(1 To UBound(aPackStr) + 1)
For i = 0 To UBound(aPackStr)
aDetail = Split(aPackStr(i), "*")
With arrPacks(i + 1)
.UnitQty = CInt(aDetail(0))
If UBound(aDetail) = 1 Then
.PackNum = CInt(aDetail(1))
Else
.PackNum = 1
End If
End With
Next
End Sub
Private Function PacksToString$(ByRef arrPacks() As PACKAGE_DETAIL)
Dim i&, aPackStr$(), nCount&
ReDim aPackStr(1 To UBound(arrPacks))
nCount = 0
For i = 1 To UBound(arrPacks)
With arrPacks(i)
If .PackNum > 0 Then
nCount = nCount + 1
aPackStr(nCount) = .UnitQty & IIf(.PackNum = 1, "", "*" & .PackNum)
End If
End With
Next
ReDim Preserve aPackStr(1 To nCount)
PacksToString = Join(aPackStr, "+")
End Function
Private Function PacksQty&(ByRef arrPacks() As PACKAGE_DETAIL)
Dim i&
PacksQty = 0
For i = 1 To UBound(arrPacks)
With arrPacks(i)
PacksQty = PacksQty + .PackNum * .UnitQty
End With
Next
End Function
[/code]
具体实现的详细代码,见此帖附件。该代码除了能实现原贴要求的功能外,还实现了一些初步的原始数据校对的工作:核对备注数据和出入数量是否相符、出库时检查是否有该品名的库存、出库时检查是否所有出库的包装数量都有足够的库存。
由于参与计算的数据被组织成有内在联系的、逻辑清晰的数据结构,所以该代码也很容易扩充其他功能,如结合上期库存结余,和当期的出入数量,计算当期结束时的库存结余等等。 |
评分
-
1
查看全部评分
-
|