【问题标题】:Access 2007 VBA Copying Records to Same Table访问 2007 VBA 将记录复制到同一个表
【发布时间】:2014-01-12 18:36:11
【问题描述】:

所以我在这个问题上一直摸不着头脑,虽然理论上看起来很简单,但我很难在 VBA 中实现它。

需要一些项目背景才能理解我想要做什么

因此,我们的数据库/应用程序旨在跟踪我们如何测试软件版本、结果是什么以及测试是否正确完成。我们有一组特定的脚本,我们使用不同的版本。

在数据库中,我们有一个表格列出了这些脚本,而没有将它们分配给特定的软件版本。

然后我们有一个表格,您可以在其中选择您正在运行的软件版本。

这是我遇到的问题

当您选择了一个软件版本后,我希望您点击一个按钮,它会获取所有相关的测试脚本复制它们并分配选定的软件版本(如果尚未完成)。这将允许您为可能因版本而异的特定脚本做笔记。

我目前正在尝试使用联合查询来执行此操作,并尝试使用附加查询,但运气不佳,我将代码 sn-p 放在单击按钮执行时得到的结果下方软件版本的分配它会提醒正确的“测试脚本”、PROC_CHECK_ID 和“软件版本”,但随后我收到一个奇怪的提示,即“输入参数值”,它是带有文本字段的“测试脚本名称”,这个进入一个无限循环,我可以继续在文本字段中输入值。

这是我的代码

Dim rs1 As DAO.Recordset
Dim unionquery As String

 Dim CURRENT_SOFTWARE_VERSION As String

 CURRENT_SOFTWARE_VERSION = Me.Parent.[Software Version].Value


 unionquery = "select [Test Script] , [PROC_CHECK_ID], [Software Version] from (FORMAL_CERT_PROCEDURE_TEST_SCRIPTS inner join FORMAL_CERT_PROCEDURE_CHECK on FORMAL_CERT_PROCEDURE_TEST_SCRIPTS.TEST_CASE_ID = FORMAL_CERT_PROCEDURE_CHECK.TEST_CASE_ID) inner join FORMAL_CERT_SOFTWARE_VERSION on FORMAL_CERT_PROCEDURE_TEST_SCRIPTS.TEST_CASE_ID = FORMAL_CERT_SOFTWARE_VERSION.TEST_CASE_ID where PROC_CHECK_ID=" & Me.PROC_CHECK_ID & " AND [Software Version]=""" & CURRENT_SOFTWARE_VERSION & """ "


 ' Debug.Print unionquery

 Set rs1 = CurrentDb.OpenRecordset(unionquery, dbOpenForwardOnly)

 If Not (rs1.EOF And rs1.BOF) Then

    Do Until rs1.EOF = True
        ' MsgBox " " & rs1![Test Script] & ", " & rs1![PROC_CHECK_ID] & ", " & rs1![Software Version] & " "

        INSERT_INTO_TEST_SCRIPTS = "insert into FORMAL_CERT_PROCEDURE_TEST_SCRIPTS([Test Script], [PROC_CHECK_ID_FK], [Software_Version], [TEST_CASE_ID]) values(" & rs1![Test Script] & ", " & rs1!PROC_CHECK_ID & ", " & rs1![Software Version].Value & ", " & Me.TEST_CASE_ID & ")"

        ' APPEND QUERY THAT THROWS INTO AN INFINITE LOOP *NEEDS WORK* INSERT_INTO_TEST_SCRIPTS = "INSERT INTO FORMAL_CERT_PROCEDURE_TEST_SCRIPTS([Test Script], [PROC_CHECK_ID_FK], [Software_Version], [TEST_CASE_ID]) SELECT FORMAL_CERT_PROCEDURE_TEST_SCRIPTS.[Test Script], " & rs1!PROC_CHECK_ID & ",  " & rs1![Software Version].Value & ", FORMAL_CERT_PROCEDURE_TEST_SCRIPTS.TEST_CASE_ID FROM FORMAL_CERT_PROCEDURE_TEST_SCRIPTS WHERE FORMAL_CERT_PROCEDURE_TEST_SCRIPTS.TEST_CASE_ID = " & Me.TEST_CASE_ID & " "

        DoCmd.SetWarnings False
          DoCmd.RunSQL INSERT_INTO_TEST_SCRIPTS
        DoCmd.SetWarnings True

        rs1.MoveNext
    Loop

 End If

我感谢任何帮助,并愿意完全重做这个机制,我可能过于复杂了:/

谢谢!

【问题讨论】:

  • 看起来您在第一个查询中引用了软件版本,但没有在第二个查询中引用。此外,如果您有拼写错误,通常会打开“输入参数值”对话框,而您并不打算这样做。
  • 另外,您的“unionquery”中没有UNION,所以我不会称它为“unionquery”。我认为使用带有条件的查询来检查软件版本是否为空会更容易。像这样的东西:"UPDATE FORMAL_CERT_PROCEDURE_TEST_SCRIPTS SET [Software Version]=""" & Me.Parent.[Software Version].Value & """ WHERE [Software Version] Is Null;" ...我想我只是误解了你的解释,所以这可能没有帮助。

标签: ms-access vba ms-access-2007


【解决方案1】:

您的第一个 SELECT 查询 (unionquery) 在 [Software Version] 的值周围有引号,表明它是一个文本字段。但是,您随后的 INSERT 查询 (INSERT_INTO_TEST_SCRIPTS) 会省略引号。因此,INSERT 查询将您尝试插入的 value 视为其他字段的 name,并且由于不存在具有该名称的其他字段,因此您正在获取参数提示。

如果您执行 Recordset 插入而不是将 INSERT 语句“粘合在一起”,您的代码可能会更简洁(并且更可靠)。这种方法看起来像这样:

Dim rs2 As DAO.Recordset
Set rs2 = CurrentDb.OpenRecordset( _
        "SELECT * FROM FORMAL_CERT_PROCEDURE_TEST_SCRIPTS", _
        dbOpenDynaset)
rs2.AddNew
rs2![Test Script] = rs1![Test Script]
rs2![PROC_CHECK_ID_FK] = rs1!PROC_CHECK_ID
rs2![Software_Version] = rs1![Software Version]
rs2![TEST_CASE_ID] = Me.TEST_CASE_ID
rs2.Update
rs2.Close
Set rs2 = Nothing

【讨论】:

  • 这太棒了!感谢 Gord,虽然发生了一些奇怪的事情.... 1.) 它确实分配了软件版本,但它创建了多次?我相信循环发生了一些奇怪的事情,因为它是随机的 2.) 它不会让我分配第一个之后的软件版本,我得到一个奇怪的语法错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
相关资源
最近更新 更多