BOM表查询的VB实现方法文档格式.docx
《BOM表查询的VB实现方法文档格式.docx》由会员分享,可在线阅读,更多相关《BOM表查询的VB实现方法文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
SA2PT37.0000
DimmBomValueAscBomValue
SetmBomValue=NewcBomValue
mBomValue.AssBom="
FG"
mBomValue.BomPoint="
SA1"
mBomValue.Quantity=2
mBom.AddmBomValue
SA2"
mBomValue.Quantity=3
PT1"
mBomValue.Quantity=4
PT2"
mBomValue.Quantity=5
mBomValue.Quantity=6
PT3"
mBomValue.Quantity=7
EndSub
PrivateSubCommand1_Click()
DimiAsInteger
DimmAscBomValue
进行计算
注意以下两个新建实例,必须放置于GetBomList前,该操作也有清空现有数据的作用,否则会造成错误
即第一次运行后保存了数据于该两个变量中,并未清除相关记录,而下一次运行则在现有的基础上再进行加操作,因此数据错误了。
SetmBomReturn=NewCollection
SetmBomReturnLast=NewCollection
CallGetBomList
计算后,mBomReturnLast返回的就是最终结果
IfmBomReturnLast.Count<
0Then
MsgBox"
没有记录!
"
vbInformation+vbOKOnly,"
BOM表计算"
ExitSub
Else
在窗体中打印出列表的内容
Me.Cls
Print"
Assbom"
&
vbTab&
"
Point"
Quantity"
Fori=1TomBomReturnLast.Count
Setm=mBomReturnLast.Item(i)
Printm.AssBom&
m.BomPoint&
m.Quantity
Nexti
EndIf
PrivateSubForm_Load()
窗体调用处新建实例,然后再装入数据
SetmBom=NewCollection
AddBomRecord
***************************************************************
*
*以下为进行计算部分的代码,注意Collection里面的处理
PrivateSubGetBomList()
DimmBomTopAsCollection'
这里保存了顶级产成品
DimjAsInteger
DimmAscBomReturnValue
DimmLastAscBomValue
DimbFindAsBoolean
SetmBomTop=NewCollection
装入顶级产成品
LoadBomTopmBomTop
对顶级产品进行下级的判断
Fori=1TomBomTop.Count
最后一个参数为1,表示一个单位的产成品
CallCalcNextBom(mBomTop.Item(i),mBomTop.Item(i),"
1"
)
最终得以mBomReturn,这里面已初步形成了结果了
再进行表达式计算,得到的值返回到mBomReturnLast中,注:
mBomReturnLast这个集合加入cBomValue内容
Fori=1TomBomReturn.Count
处理一下最终结果,如果没有在Collection里面发现相同的AssBom及BomPoint,则新增加一个,如果已发现,仅只是数量相加
Setm=mBomReturn(i)
查找是否已加入
bFind=False
Forj=1TomBomReturnLast.Count
SetmLast=mBomReturnLast(j)
IfTrim(mLast.AssBom)=Trim(m.AssBom)AndTrim(mLast.BomPoint)=Trim(m.BomPoint)Then
如果发现有相同的,则加入相关数字
mLast.Quantity=mLast.Quantity+CalcExpression(m.Expression)
bFind=True
Nextj
IfbFind=FalseThen
如果没有找到
SetmLast=NewcBomValue
mLast.AssBom=Trim(m.AssBom)
mLast.BomPoint=Trim(m.BomPoint)
mLast.Quantity=CalcExpression(Trim(m.Expression))
mBomReturnLast.AddmLast
所有操作完毕
PrivateSubLoadBomTop(ByRefBomTopAsCollection)
装入顶级产成品,并返回到BomTop中
即存储过程中GetBomList中的第一个游标的创建@bomTop
DimnAsInteger
DimbMarkAsBoolean'
这只是一个标识符,表明是否发现非顶级
DimbMarkAddAsBoolean'
用于判断是否已加入到BomTop中的标识
判断方法,如果AssBom不在BomPoint中,那就是顶级了
DimsBomAssBomAsString
Fori=1TomBom.Count
sBomAssBom=Trim(mBom.Item(i).AssBom)
再进行循环
bMark=False
Forj=1TomBom.Count
IfsBomAssBom=Trim(mBom.Item(j).BomPoint)Then
bMark=True
IfbMark=FalseThen
如果没有发现有相同的,则BomTop加入
加入前需要进行判断是否已加入
Forn=1ToBomTop.Count
IfBomTop.Item(n)=sBomAssBomThen
bMarkAdd=True
Nextn
IfbMarkAdd=FalseThen
如果没有加入过,则加入
BomTop.AddsBomAssBom
GetBomTrueList的存储过程用VB来描述
PrivateSubCalcNextBom(sAssBomAsString,sAssPointAsString,sExpAsString)
DimdQuanAsDouble
DimsExpressionAsString
DimsPointAsString
DimBomTopAsString
创建point_cursor处的游标
DimmBomPointAsCollection
SetmBomPoint=NewCollection
装入相关的集合
CallLoadNextPoint(mBomPoint,sAssPoint)
装入完毕后,再进行判断是否为明细级半成品,如果不是,递归一次本函数,如果是,加入到mBomReturn里面去
DimmBomReturnValueAscBomReturnValue
Fori=1TomBomPoint.Count
判断是否为明细级
IfIsDetailPoint(Trim(mBomPoint.Item(i).BomPoint))=TrueThen
如果是明细级,则加入到cBomReturnValue
SetmBomReturnValue=NewcBomReturnValue
mBomReturnValue.AssBom=Trim(sAssBom)
mBomReturnValue.BomPoint=Trim(mBomPoint.Item(i).BomPoint)
构建表达式
mBomReturnValue.Expression=sExp&
*"
Trim(CStr(mBomPoint.Item(i).Quantity))
mBomReturnValue.Quantity=mBomPoint.Item(i).Quantity
加入
mBomReturn.AddmBomReturnValue
如果不是明细项,则再次递归,注意传入的第一个参数,总是顶级Bom,仅作标识符用
CallCalcNextBom(sAssBom,Trim(mBomPoint.Item(i).BomPoint),sExp&
Trim(CStr(mBomPoint.Item(i).Quantity)))
PrivateSubLoadNextPoint(ByRefBomPointAsCollection,ByValPointNameAsString)
相当于GetBomTrueList中的游标中的selectdistinctpoint,slfromtewhereAssbom=@pointName
DimbMarkAsBoolean
DimmPointValueAscPointValue
IfTrim(mBom.Item(i).AssBom)=Trim(PointName)Then
判断是否已加入
Forj=1ToBomPoint.Count
IfTrim(BomPoint.Item(j).BomPoint)=Trim(mBom.Item(i).BomPoint)AndBomPoint.Item(j).Quantity=mBom.Item(i).QuantityThen
表示没有加入
SetmPointValue=NewcPointValue
mPointValue.BomPoint=Trim(mBom.Item(i).BomPoint)
mPointValue.Quantity=mBom.Item(i).Quantity
BomPoint.AddmPointValue
PrivateFunctionIsDetailPoint(ByValPointNameAsString)AsBoolean
判断是否为底级半成品
只需要判断PointName不在mBom的AssBom项中即可
如果找到了,直接返回False,并退出函数
IsDetailPoint=False
ExitFunction
如果到了这里还没有找到,那么就肯定是底级了
IsDetailPoint=True
EndFunction
PublicFunctionCalcExpression(strExpAsString)AsDouble
计算处理中的表达式,注意,只有乘法
DimsItemExp()AsString
DimdReturnValueAsDouble
DimiIndexAsInteger
sItemExp=Split(Trim(strExp),"
IfUBound(sItemExp)<
CalcExpression=0
dReturnValue=1
ForiIndex=0ToUBound(sItemExp)
IfTrim(sItemExp(iIndex))="
Then
sItemExp(iIndex)=0
dReturnValue=dReturnValue*CDbl(sItemExp(iIndex))
NextiIndex
CalcExpression=dReturnValue
类模块一:
类名:
cBomReturnValue
保持属性值的局部变量
PrivatemvarAssBomAsString'
局部复制
PrivatemvarBomPointAsString'
PrivatemvarQuantityAsDouble'
PrivatemvarExpressionAsString'
PublicPropertyLetExpression(ByValvDataAsString)
向属性指派值时使用,位于赋值语句的左边。
Syntax:
X.Expression=5
mvarExpression=vData
EndProperty
PublicPropertyGetExpression()AsString
检索属性值时使用,位于赋值语句的右边。
Debug.PrintX.Expression
Expression=mvarExpression
PublicPropertyLetQuantity(ByValvDataAsDouble)
X.Quantity=5
mvarQuantity=vData
PublicPropertyGetQuantity()AsDouble
Debug.PrintX.Quantity
Quantity=mvarQuantity
PublicPropertyLetBomPoint(ByValvDataAsString)
X.BomPoint=5
mvarBomPoint=vData
PublicPropertyGetBomPoint()AsString
Debug.PrintX.BomPoint
BomPoint=mvarBomPoint
PublicPropertyLetAssBom(ByValvDataAsString)
X.AssBom=5
mvarAssBom=vData
PublicPropertyGetAssBom()AsString
Debug.PrintX.AssBom
AssBom=mvarAssBom
类模块二:
cBomValue
类模块三:
cPointValue
加入后可直接在窗体中Print出列表。