Access 2007 VBA将记录复制到同一个表

时间:2013-12-24 13:58:59

标签: ms-access-2007 access-vba

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

需要项目的一些背景知道我想要做什么

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

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

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

这是我遇到的问题

当您选择了一个软件版本时,我希望您有一个单击的按钮,它会将所有相关的测试脚本复制它们并分配所选的软件版本,如果它已经完成了。这将允许您为特定脚本做出注释,这些脚本可能因版本而异。

我目前正在尝试使用联合查询执行此操作,并尝试使用追加查询但是没有任何运气,使用我在按下按钮执行分配时得到的结果的代码片段软件版本提醒正确的"测试脚本",PROC_CHECK_ID和"软件版本"但后来我得到一个奇怪的提示,即sais"输入Paramater Value"它是测试脚本名称"测试脚本名称"使用文本字段,这会进入一个infite循环,我可以继续在文本字段中输入值。

这是我的代码

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

我感谢任何帮助,并且愿意完全重写这个机制,我可能会使这个问题变得复杂:/

谢谢!

1 个答案:

答案 0 :(得分:1)

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

如果您执行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