我的思路是:有3个ComboBox,让用户做分级选择,一个“刷新查询”命令按扭,实现筛选查询功能。
求教的地方:第1次执行代码查询是正常的,然后用户在ComboBox中选了其它条件执行查询后,再选条件执行查询,MSHFlexGrid表格中就会少了一条记录。做实验,Set DataGrid1.DataSource = Adodc2 ,DataGrid表格中始终是正常的。我琢磨好几天了,已经极至郁闷,请高手们帮帮小弟吧!衷心感谢!
主要代码如下:Private Sub sxcx() '刷新查询。
Text7.Visible = False
MSHFlexGrid1.Rows = 3 '让其总行数等于3,目的是为了让表格恢复到干净状态。
Dim i As Byte '此循环语句是为了清空表格第1行里的数据。
For i = 1 To MSHFlexGrid1.Cols - 1
MSHFlexGrid1.TextMatrix(2, i) = ""
Next
MSHFlexGrid1.Row = 2 '将活动单元格移到第2行。
If Text3.Text <> "" Then '文本框中的内容是由ComboBox中赋过来的。
Adodc2.ConnectionString = Cnn
Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " and Len(Trim(s.类别编号)) >= 6 And left(s.类别编号,6)= '" + Trim(Text3.Text) + "' order by s.类别编号 asc,s.名称 asc"
Adodc2.Refresh 'Refresh 方法(ADO):更新集合中的对象以便反映来自并特定于提供者的对象。
If Adodc2.Recordset.RecordCount > 0 Then 'RecordCount 属性(ADO):指示 Recordset 对象中记录的当前数目。返回长整型值。
Adodc2.Recordset.MoveFirst '使用 MoveFirst 方法将当前记录位置移动到 Recordset 中的第一个记录。
Do While Adodc2.Recordset.EOF = False
Call drsj '调用通用过程。往“MSHFlexGrid1”表格读入数据。
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1 '在表格中增加一行空行。
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1 '将活动单元格向前移动1行。移到刚刚空行位置。
Adodc2.Recordset.MoveNext '使用 MoveNext 方法将当前记录向前移动一个记录(向 Recordset 的底部)。
Loop
MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1) '删除由循环语句生成的最后一行的空行。
End If
ElseIf Text2.Text <> "" Then
Adodc2.ConnectionString = Cnn
Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " and Len(Trim(s.类别编号)) >= 4 And left(s.类别编号,4)= '" + Trim(Text2.Text) + "' order by s.类别编号 asc,s.名称 asc"
Adodc2.Refresh
If Adodc2.Recordset.RecordCount > 0 Then
Adodc2.Recordset.MoveFirst
Do While Adodc2.Recordset.EOF = False
Call drsj
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
Adodc2.Recordset.MoveNext
Loop
MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
End If
ElseIf Text1.Text = "全部" Then
Adodc2.ConnectionString = Cnn
Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " order by s.类别编号 asc,s.名称 asc"
Adodc2.Refresh
Set DataGrid1.DataSource = Adodc2 '做实验用,看Adodc2查询是否正常。反映在DataGrid1里是正常的。
If Adodc2.Recordset.RecordCount > 0 Then
Adodc2.Recordset.MoveFirst
Do While Adodc2.Recordset.EOF = False
Call drsj
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
Adodc2.Recordset.MoveNext
Loop
MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
End If
Else
Adodc2.ConnectionString = Cnn
Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " and Len(Trim(s.类别编号)) >= 2 And left(s.类别编号,2)= '" + Trim(Text1.Text) + "' order by s.类别编号 asc,s.名称 asc"
Adodc2.Refresh
If Adodc2.Recordset.RecordCount > 0 Then
Adodc2.Recordset.MoveFirst
Do While Adodc2.Recordset.EOF = False
Call drsj
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
Adodc2.Recordset.MoveNext
Loop
MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
End If
End If Call gbbjs '调用通用过程。改变“MSHFlexGrid1”控件指定列的背景色。
End Sub
求教的地方:第1次执行代码查询是正常的,然后用户在ComboBox中选了其它条件执行查询后,再选条件执行查询,MSHFlexGrid表格中就会少了一条记录。做实验,Set DataGrid1.DataSource = Adodc2 ,DataGrid表格中始终是正常的。我琢磨好几天了,已经极至郁闷,请高手们帮帮小弟吧!衷心感谢!
主要代码如下:Private Sub sxcx() '刷新查询。
Text7.Visible = False
MSHFlexGrid1.Rows = 3 '让其总行数等于3,目的是为了让表格恢复到干净状态。
Dim i As Byte '此循环语句是为了清空表格第1行里的数据。
For i = 1 To MSHFlexGrid1.Cols - 1
MSHFlexGrid1.TextMatrix(2, i) = ""
Next
MSHFlexGrid1.Row = 2 '将活动单元格移到第2行。
If Text3.Text <> "" Then '文本框中的内容是由ComboBox中赋过来的。
Adodc2.ConnectionString = Cnn
Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " and Len(Trim(s.类别编号)) >= 6 And left(s.类别编号,6)= '" + Trim(Text3.Text) + "' order by s.类别编号 asc,s.名称 asc"
Adodc2.Refresh 'Refresh 方法(ADO):更新集合中的对象以便反映来自并特定于提供者的对象。
If Adodc2.Recordset.RecordCount > 0 Then 'RecordCount 属性(ADO):指示 Recordset 对象中记录的当前数目。返回长整型值。
Adodc2.Recordset.MoveFirst '使用 MoveFirst 方法将当前记录位置移动到 Recordset 中的第一个记录。
Do While Adodc2.Recordset.EOF = False
Call drsj '调用通用过程。往“MSHFlexGrid1”表格读入数据。
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1 '在表格中增加一行空行。
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1 '将活动单元格向前移动1行。移到刚刚空行位置。
Adodc2.Recordset.MoveNext '使用 MoveNext 方法将当前记录向前移动一个记录(向 Recordset 的底部)。
Loop
MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1) '删除由循环语句生成的最后一行的空行。
End If
ElseIf Text2.Text <> "" Then
Adodc2.ConnectionString = Cnn
Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " and Len(Trim(s.类别编号)) >= 4 And left(s.类别编号,4)= '" + Trim(Text2.Text) + "' order by s.类别编号 asc,s.名称 asc"
Adodc2.Refresh
If Adodc2.Recordset.RecordCount > 0 Then
Adodc2.Recordset.MoveFirst
Do While Adodc2.Recordset.EOF = False
Call drsj
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
Adodc2.Recordset.MoveNext
Loop
MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
End If
ElseIf Text1.Text = "全部" Then
Adodc2.ConnectionString = Cnn
Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " order by s.类别编号 asc,s.名称 asc"
Adodc2.Refresh
Set DataGrid1.DataSource = Adodc2 '做实验用,看Adodc2查询是否正常。反映在DataGrid1里是正常的。
If Adodc2.Recordset.RecordCount > 0 Then
Adodc2.Recordset.MoveFirst
Do While Adodc2.Recordset.EOF = False
Call drsj
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
Adodc2.Recordset.MoveNext
Loop
MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
End If
Else
Adodc2.ConnectionString = Cnn
Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " and Len(Trim(s.类别编号)) >= 2 And left(s.类别编号,2)= '" + Trim(Text1.Text) + "' order by s.类别编号 asc,s.名称 asc"
Adodc2.Refresh
If Adodc2.Recordset.RecordCount > 0 Then
Adodc2.Recordset.MoveFirst
Do While Adodc2.Recordset.EOF = False
Call drsj
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
Adodc2.Recordset.MoveNext
Loop
MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
End If
End If Call gbbjs '调用通用过程。改变“MSHFlexGrid1”控件指定列的背景色。
End Sub
解决方案 »
- 同一个问题
- VB Script中实现与VC 中Sleep相同功能的函数是什么?
- 这个问题怎么解决????
- 问个简单问题,我有一个很长的字符串一行写不下,要用两行来写,怎么做啊
- 急求高手指导,vb如何删除Temporary Internet Files里的所有文件
- ocx组件注册器1.0(含源码)[浏览868]
- 如何保存COMMON DIALOG的设置,以及如何知道点击了确定后保留,电击取消放弃,是if button=vbyes then .....end if
- 关于Either EOF or BOF is True, or the current record has been deleted.
- 求救:ActiveX不能创建对象,但是按F8却可以顺利运行这句语句
- 文件存在判断
- 我我我我我我.......
- 关于BASE64
按条件检索只是改变RecordSet中的数据,显示只是从RecordSet中加载而已.楼主再想想看
我设了断点后,按F8键逐句逐句的执行句子,现在确定下来是循环语句那里有问题。
Do While Adodc2.Recordset.EOF = False '我断点设在这句上。
Call drsj
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1 '第一遍执行循环是正常的,到了第2遍
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1 '的时候这两句没反应,第3遍开始又都好了。
Adodc2.Recordset.MoveNext
Loop
请教高手这是怎么回事呢?
mshflexgrid1.additem后,你看看行数是不是增加了?你检查一下drsj干了什么?
问题就出在这第2遍循环,第2遍循环的时候,在执行这句“MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1”,MSHFlexGrid1表格中并没有增加出一行来,那随后的这句“MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1 ”自然也就没体现了,奇怪的也不报错。但“Adodc2.Recordset.MoveNext”这句应该是有执行的,因为接着第3遍循环的时候,MSHFlexGrid1中增加出来的记录是第3条记录。drsj通用过程为:
Private Sub drsj() '往“MSHFlexGrid1”表格读入数据。
If Adodc2.Recordset.Fields("名称") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 1) = Adodc2.Recordset.Fields("名称")
'TextMatrix(行,列) 属性:返回或设置一个任意单元的文本内容。Col(列) 和 Row(行) 属性(MSHFlexGrid):这两个属性返回或设置 MSHFlexGrid 中活动单元的坐标。在设计时不可用。
If Adodc2.Recordset.Fields("单位") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 2) = Adodc2.Recordset.Fields("单位")
If Adodc2.Recordset.Fields("基价") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 3) = Format(Val(Adodc2.Recordset.Fields("基价")), "0.00")
'Val 函数:返回包含于字符串内的数字,字符串中是一个适当类型的数值。 Format 函数:返回 Variant变体型 (String字符型),其中含有一个表达式,它是根据格式表达式中的指令来格式化的。
If Adodc2.Recordset.Fields("采购价审批与查阅表ID") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 4) = Adodc2.Recordset.Fields("采购价审批与查阅表ID")
If Adodc2.Recordset.Fields("商品资料ID") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 6) = Adodc2.Recordset.Fields("商品资料ID")
If Adodc2.Recordset.Fields("含税原价") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 7) = Format(Val(Adodc2.Recordset.Fields("含税原价")), "0.00")
If Adodc2.Recordset.Fields("含税折扣率") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 8) = Format(Val(Adodc2.Recordset.Fields("含税折扣率")), "0.000")
If Adodc2.Recordset.Fields("含税折后价") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 9) = Format(Val(Adodc2.Recordset.Fields("含税折后价")), "0.00")
If Adodc2.Recordset.Fields("含税价报价人") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 10) = Adodc2.Recordset.Fields("含税价报价人")
If Adodc2.Recordset.Fields("含税价报价时间") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 11) = Adodc2.Recordset.Fields("含税价报价时间")
If Adodc2.Recordset.Fields("未税原价") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 12) = Format(Val(Adodc2.Recordset.Fields("未税原价")), "0.00")
If Adodc2.Recordset.Fields("未税折扣率") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 13) = Format(Val(Adodc2.Recordset.Fields("未税折扣率")), "0.000")
If Adodc2.Recordset.Fields("未税折后价") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 14) = Format(Val(Adodc2.Recordset.Fields("未税折后价")), "0.00")
If Adodc2.Recordset.Fields("未税价报价人") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 15) = Adodc2.Recordset.Fields("未税价报价人")
If Adodc2.Recordset.Fields("未税价报价时间") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 16) = Adodc2.Recordset.Fields("未税价报价时间")
End Sub最后,再一次由衷的感谢这位帮助我的朋友!
Dim a As Integer
a=2
If Adodc2.Recordset.RecordCount > 0 Then
Adodc2.Recordset.MoveFirst
Do While Adodc2.Recordset.EOF = False
MSHFlexGrid1.Row = a
Call drsj
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
a = a + 1
Adodc2.Recordset.MoveNext
Loop
MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
End If
尝试1:是不是在执行“AddItem”方法时,所要插入行的位置不对呢?
Dim a As Integer
a=3
If Adodc2.Recordset.RecordCount > 0 Then
Adodc2.Recordset.MoveFirst
Do While Adodc2.Recordset.EOF = False
Call drsj
MSHFlexGrid1.AddItem "", a
MSHFlexGrid1.Row = a
a = a + 1
Adodc2.Recordset.MoveNext
Loop
MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
End If
尝试3:Do While…Loop,是不是这个循环语句不对呢?我换一个循环语句看看。
Dim a As Integer
If Adodc2.Recordset.RecordCount > 0 Then
Adodc2.Recordset.MoveFirst
For a = 1 To Adodc2.Recordset.RecordCount
Call drsj
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
Adodc2.Recordset.MoveNext
Next a
MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
End If 我真的很菜,我这都是在瞎想,让高手们见笑了,请多多指教啊!
debug.print "A rows=";MSHFlexGrid1.Rows,"row=";MSHFlexGrid1.Row
Call drsj
debug.print "B rows=";MSHFlexGrid1.Rows,"row=";MSHFlexGrid1.Row
MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1 '第一遍执行循环是正常的,到了第2遍
debug.print "C rows=";MSHFlexGrid1.Rows,"row=";MSHFlexGrid1.Row
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1 '的时候这两句没反应,第3遍开始又都好了。
debug.print "D rows=";MSHFlexGrid1.Rows,"row=";MSHFlexGrid1.Row
Adodc2.Recordset.MoveNext
Loop
当你MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1),执行后你的row其实是向上推了一行的,你这样和additem肯定增加了,
你只要在建立一个project,然后单做实验就知道了。
MSHFlexGrid1.AddItem "" ‘这样就好了
如果实在不行你就用 MSHFlexGrid1.rows=MSHFlexGrid1.rows+1
什么叫第二次循环,第三次循环阿。是不是第二次或者第三次调用sxcx函数?你检查adoac.recordset.recordcount看看循环次数Ps: 我是女子,不是兄弟 :)