Office中国论坛/Access中国论坛

标题: 记录写入问题 [打印本页]

作者: des    时间: 2006-7-31 04:02
标题: 记录写入问题
有两个表 info 和inftotemp两表的结构完全相同, [attach]19368[/attach]

info 表中有记录但是其中的成绩字段为空, 想把infotemp中的成绩字段的值一一对应的写入到info 表中,注意:infoetmp表中的记录顺序和info 的记录顺序可能不同。

我用下面的函数来实现:

但是有点小错误,如果两个表中考号(唯一索引)顺序不相同时,成绩采集不完全。望指正:

Public Sub insoure()

Dim rstemp1 As ADODB.Recordset '临时表记录集合
Dim rs1    As ADODB.Recordset '信息表正式集合
Dim totalin1
Dim j
Dim temps1
Dim isin1 '用于表识是否存在重复数据
totalin1 = 0
tatall2 = 0
Set rstemp1 = New ADODB.Recordset
rstemp1.Open "infotemp", CurrentProject.Connection, adOpenDynamic, adLockOptimistic, adCmdTableDirect
Set rs1 = New ADODB.Recordset
rs1.Open "info", CurrentProject.Connection, adOpenDynamic, adLockOptimistic, adCmdTableDirect

'If Not rs.BOF And Not rs.EOF Then
'rs.MoveLast
Do While Not rstemp1.EOF
temps1 = rstemp1("考号")
allnum1 = DCount("*", "info")
'If Not rs1.BOF And rs1.EOF Then
Do While Not rs1.EOF
'检测数据的冗余程度
'If Not rs1.BOF And Not rs1.EOF Then
'rs1.MoveFirst
'rs1.MoveLast
'For i = 1 To allnum1  '只检测条以内的记录
'If Not rs1.BOF Then
inwhat = rs1("考号")
If temps1 = inwhat Then
'存在重复记录时则跳过添加记录这一项目
'MsgBox "该数据已录入,请检查已输入的记录!", vbOKOnly + vbInformation, "提示"
'isin1 = 1 '说明记录存在 对该字段的名称进行修改....查看效果怎么样

rs1!成绩 = rstemp1("成绩")
rs1.Update

totalin1 = totalin1 + 1
'rs1.MovePrevious
rs1.MoveFirst
Exit Do
Else
'rs1.MovePrevious
rs1.MoveNext

'isin1 = 0

End If

'End If
Loop
'End If
tatall2 = tatall2 + 1
rstemp1.MoveNext

Loop
MsgBox "本次采集共输入数据" & totalin1 & "条" & tatall2, , "系统提示"
Set rs1 = Nothing
Set rstemp1 = Nothing

End Sub
[attach]19369[/attach]


[此贴子已经被作者于2006-7-30 21:24:00编辑过]


作者: fan0217    时间: 2006-7-31 04:21
用更新查询不是更简单吗?

记录中的顺序是没有什么太大的实际意义的,SQL处理记录没有先后顺序之说。

[此贴子已经被作者于2006-7-30 22:09:44编辑过]


作者: des    时间: 2006-7-31 04:31
我是作成按钮的形式的,直接点一下就能完成全部的工作, 或者谁有好的方式,请赐教
作者: fan0217    时间: 2006-7-31 04:51
把例子放上来。

在按钮中同样可以执行查询的啊!
作者: des    时间: 2006-7-31 05:25
例子已经发上去了。请帮忙,多谢了
作者: fan0217    时间: 2006-7-31 06:11
方法1:采用更新查询,速度较快,推荐!

Private Sub Command1_Click()
Dim conn As New ADODB.Connection
Dim strSQL As String
Set conn = CurrentProject.Connection

    strSQL = "UPDATE info INNER JOIN infotemp ON info.考号 = infotemp.考号 SET info.成绩 = [infotemp.成绩];"
    conn.Execute strSQL

MsgBox "采集成功", , "系统提示"
   
    conn.Close
Set conn = Nothing
End Sub


[此贴子已经被作者于2006-7-30 22:13:19编辑过]


作者: fan0217    时间: 2006-7-31 06:12
方法2:采用ADO,速度慢,不推荐。

Sub MyInsoure()
Dim conn As New ADODB.Connection
Dim rsTemp As New ADODB.Recordset '临时表记录集合
Dim rs As New ADODB.Recordset  '信息表正式集合
Dim strSQL As String

Set conn = CurrentProject.Connection

strSQL = "SELECT * FROM info;"
rs.Open strSQL, conn, adOpenDynamic, adLockOptimistic
    Do While Not rs.EOF
        strSQL = "SELECT * FROM infoTemp WHERE 考号='" & rs("考号") & "';"
        rsTemp.Open strSQL, conn, adOpenDynamic, adLockOptimistic
            If Not rsTemp.BOF And Not rsTemp.EOF Then
                rs("成绩") = rsTemp("成绩")
                rsTemp.Update
            End If
        rsTemp.Close
        rs.MoveNext
    Loop
rs.Close

Set rsTemp = Nothing
Set rs = Nothing
Set conn = Nothing


MsgBox "采集成功", , "系统提示"


End Sub
作者: des    时间: 2006-7-31 23:06
已经测试通过了。多谢了,方法一快很多




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3