俺是新手. 用VB做了个物料管理Access数据库. 需要用text文本框做为物料编号的输入. 在物料输入时候.先查询数据表中是否有同编号的记录. 我用的查询方法可以实现. 但效率非常低. 特别是现在数据库有几千条记录时候. 从表头查到表尾的花一分种. 太长了. 以下是我的代码. 请问哪位大侠帮改改. 主要是想知道当前数据表中时候有同物料编号和描述的记录存在. 如有. 增加新记录失败.
'检查是否物料编号重复
If Adodc1.Recordset.RecordCount > 0 Then
Adodc1.Recordset.MoveFirst
Do While Adodc1.Recordset.EOF <> True
If Adodc1.Recordset.Fields(1).Value = Text1(1).Text Or Adodc1.Recordset.Fields(2).Value = Text1(2).Text Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"
Text1(1).SetFocus
Exit Sub
End If
Adodc1.Recordset.MoveNext
Loop
End If
'检查是否物料编号重复
If Adodc1.Recordset.RecordCount > 0 Then
Adodc1.Recordset.MoveFirst
Do While Adodc1.Recordset.EOF <> True
If Adodc1.Recordset.Fields(1).Value = Text1(1).Text Or Adodc1.Recordset.Fields(2).Value = Text1(2).Text Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"
Text1(1).SetFocus
Exit Sub
End If
Adodc1.Recordset.MoveNext
Loop
End If
解决方案 »
- 是 進程還是綫程 ???
- Like 语句的用法,请教!
- 怎么用 Setup Factory 打包关联自己定义的文件?
- 如何在win2000下取得当前用户名称
- 一个串口通讯的问题
- 请问如何从驱动器的盘符得出其对应的deviceID,如假设我的光驱是H:,那么我怎么知道它是deviceID是几号?
- 怎么样才能让text控件里边只能填数字???????
- 急急急!!!怎样判断局域网内另一台机器是否安装SQL?----在线等待
- 用到时间的时候,比如求出某天距离现在差几天,是否先把根据NOW()求得的时间拆分再去计算?
- 串口通讯模拟?
- 用loadpicture的方式能将picture里的图片放大缩小吗?
- 在VB中listbox控件的使用,请帮忙
然后:
dim rs as Recordsetset rs=connection.execute("select count(*) from TableName where 编号='" & text1 & "'")if rs.fie;f(0) then msgbox "已存在"
Dim rst As ADODB.Recordset
Dim sql As String
sql = "select distinct 物料编号 from form "
While Not rst.EOF
If text1.Text = rst.Fields("物料遍号") Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"
text1(1).SetFocus
End If
Wend
con.ConnectionString = ""
con.Open
rst.Open con, sql, adOpenDynamic, adLockOptimistic, -1
End Function
Adodc1.Recordset.Requery
If Not Adodc1.Recordset.EOF Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"End If
gdgf. 我按照你的程序更改如下.
Dim con As ADODB.Connection
Dim rs As Recordset
Set rs = con.Execute("select count(*) from table_no where 物料编号='" & Text1(1).Text & "'")
If rs.Find Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"
End If
程序执行出错. 错在 if rs.Find这条句子.christion:按照你的程序更改如下. 执行也出错.
Dim con As ADODB.Connection
Dim rst As ADODB.Recordset
While Not rst.EOF
If Text1(1).Text = rst.Fields("物料编号") Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"
End If
Wendfaysky2: 您的程序应该会重新设置adodc1的数据源吧. 那么datagrid显示也会变. 我只想查询是否有重叠编号. 不需要重新建立数据源. 怎么修改才好?
2、定义 Dim con As New ADODB.Connection
用Open方法打开与数据库的连接:
con.Open ConnectString
其中,ConnectString 是连接到你的数据库的连接串(不清楚如何设置可参考VB联机帮助)
只有当con.Open 方法正确打开后,才能继续后面的查询操作。Dim rs As Recordset
Set rs = con.Execute("select count(*) from table_no where 物料编号='" & Text1(1).Text & "'")在此用rs.Find方法是不行的,只能通过判断rs.Field(0).Value的值。
因为用 select Count(*) 返回的记录一定存在(非0的数字),程序可通过判断此数值确定记录是否存在。
cn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;data source=" & dataname
Dim rs As Recordset
Set rs = cn1.Execute("select count(*) from table_no where 物料编号='" & Text1(1).Text & "'")
If rs.Fields(0).Value = "" Then
MsgBox "物料编号(描述)与该物料相同.请输入另一物料编号(描述)!", vbOKOnly + vbExclamation, "警告"
End If
以上是我按照gdgf大侠的意思更改后的程序. 运行出错. 好象还没连到数据库.
========================================================================
增加新物料前. 该数据库已经被adodc连接到并打开显示在datagrid了.
我只想在输入新物料前. 查查看是否与数据表中记录重叠(查询的结果不需要显示datagrid中.也就是这个查询是后台运行的). 我只要知道是否找到重叠的记录即可. 我忙了一上午了. 还是不行. 真是晕啊!
为了确定是否成功,你可加入下列语句:
在过程开时:
on error resume next
在下语句之后 cn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;data source=" & dataname
加上: if err then msgbox err.description
若此处出错,则后面肯定不正确.此外,你的这条语句也将出现类型不匹配的错误: If rs.Fields(0).Value = "" Then
因为 rs.Fields(0).Value 的类型为数值型,非字符串类型.建议在
Set rs = cn1.Execute("select count(*) from table_no where 物料编号='" & Text1(1).Text & "'")
之后,加上: if err then msgbox err.description
这样,可以有助于排错.再试试吧.
Private Sub Command1_Click()
Dim AdoCon As New ADODB.Connection
Dim AdoRec As New ADODB.Recordset
Dim ctl As Object
AdoCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\test.xls;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1""" '根据用户输入的姓名,查找对应的记录
AdoRec.Open "select 姓名,年龄,学历,性别 from [Sheet1$] where 姓名='" & Text1.Text & "' ", AdoCon, adOpenDynamic, adLockReadOnly With DataReport1
Set .DataSource = AdoRec
For Each ctl In .Sections.Item("Section1").Controls
If TypeName(ctl) = "RptTextBox" Then
Select Case ctl.Name
Case "Text1"
ctl.DataField = AdoRec.Fields("姓名").Name
Case "Text2"
ctl.DataField = AdoRec.Fields("年龄").Name
Case "Text3"
ctl.DataField = AdoRec.Fields("学历").Name
Case "Text4"
ctl.DataField = AdoRec.Fields("性别").Name
End Select
End If
Next
End With
DataReport1.Show
End Sub