您还没有绑定微信,更多功能请点击绑定

如何用vb编写bom查询程序





我在用vb编写一个bom查询小程序,但是无奈是vb菜鸟,目前遇到一个问题怎么也搞不定,请教大家,我是新人,愿意把所有分都送上! 情况是这样,数据库里面有6张表(INVENTORY,bas_part,bom_parent,bom_bom,bom_opcomponentopt,bom_opcomponent):表之间通过bomid,cinvcode,OptionsId,partId,OpComponentId和ParentId相互关联. 1.在text1里面输入母件编码(invcode)在text2里面输入版本号(version);然后点击查询按钮(commandbutton) 我要达到的目的是: 点击查询按钮后根据母件编码和版本号在数据库里面查询到bomid(bomid可能有多个),然后根据bomid又查询到cInvcode(有多个),然后根据cinvcode又继续查询bomid.如此循环! 然后将数据记录到mshflexgrid 应该就是树形结构完全展开 涉及到的sql语句是:1.Select a.bomid from bom_bom a inner join bom_parent b on a.bomid =b.bomid inner join bas_part c on b.parentId=c.partId where c.InvCode='F3110212' and a.version='10' 2.Select a.SortSeq,a.OpSeq,c.cInvcode,c.cInvName,c.cInvStd,c.cInvAddCode,d.cComUnitName,a.BaseQtyN,a.BaseQtyD ,a.CompScrap,Qty=a.BaseQtyN/a.BaseQtyD ,a.OpComponentId ,b.Free1 FROM bom_opcomponent a inner join bas_part b on a.componentId=b.partId INNER JOIN inventory c on b.invcode=c.cinvcode INNER JOIN ComputationUnit d on c.cComUnitCode=d.cComunitCode Where a.bomid = 207 Order by a.SortSeq 3.Select top 1 a.bomid from bom_bom a inner join bom_parent b on a.bomid =b.bomid inner join bas_part c on b.parentId=c.partId where c.InvCode='S3000006' Order by Versio 然后根据查询出的bomid和cinvcode进行2-3循环.知道完全展开bom!我想问大家如何根据这几个select语句写循环?





问题点数:80 回复次数:25 显示所有回复显示星级回复显示楼主回复 修改 删除 举报 引用 回复







加为好友
发送私信
在线聊天

wangwei1979
破碎虚空
等级:
可用分等级:掌柜
总技术分:2082
总技术分排名:10567





发表于:2008-12-24 10:14:201楼 得分:0

我喜欢采用递归形式



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

Tiger_Zhao
VB老鸟
等级:
可用分等级:掌柜
总技术分:39446
总技术分排名:237


4

4

3




发表于:2008-12-24 10:44:062楼 得分:20



VB code
dim rsID as adodb.recordset, dim rsDetail as adodb.recordset
dim oIDList as collection, i as long, lID as long
set oIDList = new collection
set rsID = 查询(SQL1)
while not rsID.EOF
oIDList.Add rsID("bomid").Value, "K" & rsID("bomid").Value
rsID.MoveNext
wend

i = 1
while i<= oIDList.Count
lID = oIDList(i)

set rsDetail = 查询(SQL2, 条件 lID)
while not rsDetail.EOF
添加 rsDetail 当前行到 Grid

set rsID = 查询(SQL3, 条件 rsDetail("InvCode").Value)
while not rsID.EOF
on error resume next '忽略重复的 bomid
oIDList.Add rsID("bomid").Value, "K" & rsID("bomid").Value
on error goto 0
rsID.MoveNext
wend

rsDetail.MoveNext
wend

i = i+1
wend




<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

hupeng213
小鹏
等级:
可用分等级:富农
总技术分:1205
总技术分排名:17582





发表于:2008-12-24 11:01:233楼 得分:0

不用一次都全部读入吧。 用listview控件,NOD不自动展开,点击时再展开,并执行查询。 只需要读入第一层的信息, 在每个点击事件添加函数,注意分级就行了。



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-24 11:04:214楼 得分:0

LS说的是treeview么? 我要同时输出多个值 级次 子件编码 子件名称 规格型号 计量单位 基本用量(分子) 基本用量(分母) 损耗率% 基本用量 使用数量 备注



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

vbscape
五湖废人
等级:
可用分等级:掌柜
总技术分:1298
总技术分排名:16820





发表于:2008-12-24 11:09:585楼 得分:0

母件如果是个机型码,下面的组件往往成千上万,3楼的比较好。但是不全部读入的话,是不是那个“+”不会显示阿。



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-24 11:32:066楼 得分:0

母件编码: F3110211 版本号: 10 级次 子件编码 子件名称 规格型号 计量单位 基本用量(分子) 基本用量(分母) 损耗率% 基本用量 使用数量 + 41700038 + 41300041 + 41000044 + S3000013 ++ S3000008 +++ 30202009 +++ S3000007 ++++ 30608200 ++++ 30608201 ++++ 30608098 ++++ 30608202 后面名称..规格型号..计量单位..等数据我就不罗列出来了 恳求大家帮忙 最好给出代码



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

Tiger_Zhao
VB老鸟
等级:
可用分等级:掌柜
总技术分:39446
总技术分排名:237


4

4

3




发表于:2008-12-24 13:10:507楼 得分:0

如果要显示级次,那么就不能过滤重复的 bomid 了。 grid 中需要有 bomid和cinvcode 的列。 这是逐个展开的方式,性能会比较差。

VB code
dim rsID as adodb.recordset, dim rsDetail as adodb.recordset
dim lID as long, sInvCode as string, lLevel as long
dim i as long, j as long
lLevel = 1
set rsID = 查询(SQL1)
while not rsID.EOF
lID = rsID("bomid").Value

set rsDetail = 查询(SQL2, 条件 lID)
while not rsDetail.EOF
添加 (lLevel、lID 和 rsDetail当前行) 到 Grid 的最后
rsDetail.MoveNext
wend

rsID.MoveNext
wend

i = 1
while i<= MSHFlexGrid1.Rows
sInvCode = MSHFlexGrid1.TextMatrix(i, InvCode列)
lLevel = MSHFlexGrid1.TextMatrix(i, 级次列)+1
j = i+1 '子级的插入位置

set rsID = 查询(SQL3, 条件 rsDetail("InvCode").Value)
while not rsID.EOF
lID = rsID("bomid").Value

set rsDetail = 查询(SQL2, 条件 lID)
while not rsDetail.EOF
插入 (lLevel、lID 和 rsDetail当前行) 到 Grid 的第j行
j = j+1
rsDetail.MoveNext
wend

rsID.MoveNext
wend

i = i+1
wend




<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

Leftie
左手,为人民币服务
等级:
可用分等级:小地主
总技术分:60658
总技术分排名:132





发表于:2008-12-24 13:58:118楼 得分:60

楼主用的是U8的物料清单吧,可以直接使用U8后台的存储过程生成临时表来读取BOM信息: 方法一: StrSql = " exec Usp_BO_ExpandByParent '开始母件编码','截止母件编码',0,99999999 ,'2000-01-01','2099-12-31', '" & Format(Now(), "YYYY-MM-DD") & "',1,0, '','','','','','','','','','','','','','','','','','','','', 0, 3, 0, 0, 0,1, '' ,'临时表名'" conn.execute strsql 然后查询临时表就可以 方法二: StrSql = " exec Usp_BO_BO02007 1,'开始母件编码','截止母件编码','','', 0,99999999 ,'2000-01-01','2099-12-31','" & Format(Now(), "YYYY-MM-DD") & "',1, 0,'','','','','','','','','','','','','','','','','','','','', 0, 3, 0, 0 , '','临时表名'" conn.execute strsql 然后查询临时天就可以



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-24 14:51:419楼 得分:0

这个临时表名是我自己加的还是U8系统生成的?



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

Leftie
左手,为人民币服务
等级:
可用分等级:小地主
总技术分:60658
总技术分排名:132





发表于:2008-12-24 14:53:3210楼 得分:0

临时表名可以自己定义的



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-24 15:01:0711楼 得分:0

就是先自定义一个临时表名.然后在vb里面查询存储过程生成的这张临时表?并在datagrid里面显示出数据? 存储过程结果临时表不是即时删除的么? 菜鸟,不好意思



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

Leftie
左手,为人民币服务
等级:
可用分等级:小地主
总技术分:60658
总技术分排名:132





发表于:2008-12-24 15:05:2012楼 得分:0

不用先定义表名,存储过程在执行时会自动生成临时表,执行前先判断一下表名存不存在就可以



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-24 15:38:2413楼 得分:0

大哥,能不能给出点比较详细的调用和输出查询数据的代码啊? 谢谢了



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-24 16:38:2514楼 得分:0

我写了下面的代码: Dim strsql As String Dim rs As New adodb.Recordset strsql = " exec Usp_BO_ExpandByParent 'F3110211','F3110211',10,10,'2000-01-01','2099-12-31', '2008-12-18',1, 0, '','','','','','','','','','','','','','','','','','','','', 0, 3, 0, 0, 0,1, '' ,'tempdb..TMPUF_1265276719_heron1066226971_ERP'" Set rs = g_ConnUFData.Execute(strsql) Set DataGrid1.DataSource = rs DataGrid1.Refresh 为什么既不报错也没有结果显示出来呢?



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

Leftie
左手,为人民币服务
等级:
可用分等级:小地主
总技术分:60658
总技术分排名:132





发表于:2008-12-24 16:45:4515楼 得分:0

Dim strsql As String Dim rs As New adodb.Recordset strsql = " exec Usp_BO_ExpandByParent 'F3110211','F3110211',10,10,'2000-01-01','2099-12-31', '2008-12-18',1, 0, '','','','','','','','','','','','','','','','','','','','', 0, 3, 0, 0, 0,1, '' ,'tmpdata'" g_connufdata.execute strsql if rs.state <>adstateclosed then rs.close rs.open "select * from tmpdata",g_connufdata,adopenkeyset,adlockreadonly set mshflexgrid1.datasource=rs rs.close



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-24 17:16:5116楼 得分:0

OK,多谢LS的同学们. 特别感谢Leftie和Tiger_Zhao 由于新人分有限,只能平分给你们两位了,衷心感谢



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-24 18:36:2517楼 得分:0

晕了,请问LS的兄弟 我代码改为: Dim strsql As String Dim rs As New adodb.Recordset strsql = " exec Usp_BO_ExpandByParent '母件编码1','母件编码2',版本1,版本2,'2000-01-01','2099-12-31', '2008-12-18',1, 0, '','','','','','','','','','','','','','','','','','','','', 0, 3, 0, 0, 0,1, '' ,'tmpdata'" g_connufdata.execute strsql if rs.state <>adstateclosed then rs.close rs.open "select * from tmpdata",g_connufdata,adopenkeyset,adlockreadonly set mshflexgrid1.datasource=rs rs.close 为什么出来的值总是:F3110211的值? 我要的是随查询条件不断变化出现不同的值......



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-24 19:59:3618楼 得分:0

换了一个帐套,现在显示:对象名"tmpdata"无效 晕过去了,现在



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

success000
昵称
等级:
可用分等级:中农
总技术分:1248
总技术分排名:19041





发表于:2008-12-24 20:15:3119楼 得分:0

不懂,帮顶



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-24 22:20:5820楼 得分:0

顶一顶,等Leftie高手来解答,呵呵



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-25 09:08:5821楼 得分:0

顶啊,还是没解决



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

AisaC
AisaC
等级:
可用分等级:中农
总技术分:1079
总技术分排名:20211





发表于:2008-12-25 10:10:1822楼 得分:0


引用 18 楼 janselin 的回复:换了一个帐套,现在显示:对象名"tmpdata"无效 晕过去了,现在 换了帐套还有那个存储过程吗? 你是否先创建了tmpData呢? strsql = " exec Usp_BO_ExpandByParent 'F3110211','F3110211',10,10,'2000-01-01','2099-12-31', '2008-12-18',1, 0, '','','','','','','','','','','','','','','','','','','','', 0, 3, 0, 0, 0,1, '' ,'tmpdata'" g_connufdata.execute strsql tmpdata这是个临时表名,这个名字最好更新成一个特别点的,重复了会有大麻烦的. 另外清单查出来之后最好要可以像3楼说的那样,不然你还会有类似的活要做



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-25 10:52:3023楼 得分:0

换了帐套还是有这个存储过程的. 现在清单出来正是我想要的,但是问题就是无论我选择什么样的查询条件,vb输出来的结果都是第一次查询的结果...就是tmpdb这个临时表的内容.不更新..



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

Leftie
左手,为人民币服务
等级:
可用分等级:小地主
总技术分:60658
总技术分排名:132





发表于:2008-12-25 11:06:0824楼 得分:0

'每次查询时可以先删除临时表: StrSql = " if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tmpdata]') " _ & " and OBJECTPROPERTY(id, N'IsUserTable') = 1) " _ & " drop table [dbo].[tmpdata]" g_connufdata.Execute StrSql '再执行存储过程生成临时表: strsql = " exec Usp_BO_ExpandByParent 'F3110211','F3110211',10,10,'2000-01-01','2099-12-31', '2008-12-18',1, 0, '','','','','','','','','','','','','','','','','','','','', 0, 3, 0, 0, 0,1, '' ,'tmpdata'" g_connufdata.execute strsql



<!--
预留的文字链广告位</span>
//-->修改 删除 举报 引用 回复






加为好友
发送私信
在线聊天

janselin
该用户很懒,没有设置昵称
等级:
可用分等级:贫农
总技术分:56
总技术分排名:159903





发表于:2008-12-25 11:27:1525楼 得分:0

感谢leftie.终于搞定了

0 个评论

游客无法查看评论和回复, 请先登录注册

推荐文章

文章状态

  • 发布时间: 2009-02-23 18:17
  • 浏览: 1274
  • 评论: 0
  • 赞: 0