【问题标题】:How can I use the database commands 'Seek' and results 'NoMatch'?如何使用数据库命令“Seek”和结果“NoMatch”?
【发布时间】:2011-11-21 15:00:40
【问题描述】:

这是我的问题:

假设我有这些表:

表1

1 - “一个”

2 - “b”

表2

1 -

2 -

3 -

现在,我使用以下代码来比较表格:

table2.MoveFirst
Do While Not table2.EOF
 table1.Seek "=", table2!field2
  If table1.NoMatch Then
               go do a lot of things to find that information
  Else 
   table2.Edit
   table2!Field2 = table1!field2
   table2.update
  End If
 table2.MoveNext
Loop

但是行

table2!Field2 = table1!field2

效果不太好。我很确定我在这里做错了什么,但我在寻找解决方案时遇到了问题。我什至不确定我应该用谷歌搜索什么......

编辑:字段 2 在表 1 中编入索引,因此“查找”有效。

【问题讨论】:

  • 您不使用查询来匹配两个表是否有原因?请注意,如果您有空值,事情会变得有点复杂。
  • 除了我还是个菜鸟之外,没有什么好的理由。问题是:如果 table1 上没有匹配项,我需要运行大量代码来捕获该信息并更新 table1 和 table2。有没有更有效的方法来做到这一点?我可以像使用表一样使用查询吗?
  • 是的,你可以,而且会快很多。我将在下面草绘一些笔记。

标签: ms-access vba vb5


【解决方案1】:

一些笔记。

假设您想要 Table2 中名为 Field1 的字段上没有匹配项的所有记录:

sSQL = "SELECT Field1, FieldX FROM Table2 " _
     & "LEFT JOIN Table1 " _
     & "ON Table2.Field1 = Table1.Field1 " _
     & "WHERE Table1.Field1 Is Null"

当然,您可以在查询设计窗口中构建查询并摆弄直到是您想要的,然后切换到 SQL 视图以获取正确的(ish)SQL 字符串。

Dim rs As DAO.Recordset

Set rs = CurrentDB.Openrecordset(sSQL)

''table2.MoveFirst
Do While Not rs.EOF ''table2.EOF

''You do not need no match, all these records are missing a match
''    table1.Seek "=", table2!field2
''    If table1.NoMatch Then
           go do a lot of things to find that information
    rs.MoveNext
Loop
''This can all be done with one update query
''    Else 
''    table2.Edit
''    table2!Field2 = table1!field2
''    table2.update
''    End If
''    table2.MoveNext
''    Loop

sSQL = "UPDATE Table2 " _
     & "INNER JOIN Table1 " _
     & "SET table2.Field2 = table1.field2 " 

CurrentDB.Execute sSQL dbFailOnerror

请把以上内容当作注释,不是完成的代码。

【讨论】:

  • 我认为在理解这段代码之前我需要阅读我的 SQL 书籍。但我想这是做同样事情的一种更简单的方法。
  • 非常感谢您的回复,代码运行良好,也让我有机会进一步了解 SQL。
【解决方案2】:

但是table2!Field2 = table1!field2 这条线运行得不太好

...不能很好地描述问题所在。

代码是否在此行停止/崩溃?
它运行时是否没有错误,但没有执行任何操作/超出您的预期?

我想您正在使用 DAO 记录集。
没有更多信息很难给出建议,但我会尝试一下:

  1. table2 完全是空的吗?您的描述如下所示:

    table2
    1 -
    2 -
    3 -

    如果是,整个循环可能根本不会执行。

  2. 记录集 table2 可以更新吗?
    并非所有类型的 Recordsets 都支持这一点,这取决于您如何创建它。见 MSDN:Recordset Object (DAO),开头有一个 Recordset 类型的列表。
    如果它不可更新,您在调用.Update 时应该会收到错误消息。

【讨论】:

  • 1.) 大部分是空的。当 table2 为空且 table1 上没有信息时,我确实设法更新 table1 上的信息并在 table2 上创建一个新条目。 2.) 可以。
【解决方案3】:

如果您使用的是 DAO 记录集(如 Christian 建议的那样),您可以更改行

table2!Field2 = table1!field2

table2.Fields("Field2").value = table1.Fields("field2").value

我假设两个 Field2 都是文本数据类型。

【讨论】:

    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多