如何从单个表单在单个Microsoft Access表中创建多个(重复)记录?

时间:2015-02-24 23:58:44

标签: forms vba ms-access-2010 duplicates

我一直在为我们的培训机构创建一个主屏幕。在这个主屏幕中,我创建了一个按钮,用于启动教师将用于输入培训评估的表单。我已经请求建立一个额外的按钮,它将启动一个不同的形式,以便教师可以为每个问题提供平均分数,并说出有多少人参加了课程。提交此表单后,需要创建与参与者一样多的记录,以便在运行报告时每天的平均权重可以正常。

我找不到符合我需要的解决方案,但这里是我尝试使用的按钮的VBA:

DoCmd.RunMacro“DuplicateRecord”,Forms!Feedback_Form!Attendees

这对我来说似乎没有任何作用。我知道这很简单,但我是VBA的新手。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

不幸的是,从您的描述中我无法理解,特别是因为我无法看到您桌子的结构。 无论如何,让我们讨论如何将记录从表复制到另一个表。 有很多方法可以做到这一点(像往常一样)。 我告诉你两个 第一个是一个非常紧凑的复制记录解决方案(在你的情况下只有一个)。

如果你是vba的新手,那么第二个会有点棘手,但是你可以更好地控制你正在做的事情。 我个人更喜欢第二种解决方案

第一个解决方案 - 使用SQL SELECT INTO指令

SQL事务是

SELECT *
INTO TargetTable 
FROM SourceTable WHERE Condition;

在此示例中, newtable 是您要复制记录的目标表名称。 SourceTable 是要从中复制记录的表的名称 条件是选择要复制的记录的条件。如果您的记录有ID字段(例如,名为ID),则条件可以是 ID = NumID ,其中NumID是要复制的记录的ID值。

您如何使用此交易? 您可以为SQL语句构建一个字符串,然后执行它。

Private Sub CopyRecord(lngID As Long, strSourceTable As String, strTargetTable As String)
    Dim strSQL as string

    strSQL = "SELECT * INTO " & strTargetTable " FROM " & strSourceTable & " WHERE ID=" & CStr(lngID)

    DoCmd.RunSQL strSQL

End Sub

可以从您以某种方式访问​​某个记录的表单中调用此子例程

    Call CopyRecord(Me.ID,"SourceTable", "TargetTable")              ' Copy record

    DoCmd.OpenForm "frmFeedback_Form", ,acNormal,"ID = "+CStr(Me.ID) ' Open 2nd form @ new record

第二个解决方案 - 使用DAO.RECORDSET 使用此解决方案,您可以在复制期间修改字段的内容。 您还可以为2个不同的表使用不同的名称。在第一种情况下,您使用相同的字段名称物理复制记录。

Private CopyRecord(lngID As Long, strSourceTable As String, strTargetTable As String)   
  dim rsSource as DAO.RecordSet
  dim rsTarget as DAO.RecordSet

  Set rsSource = CurrentDb.OpenRecordSet("SELECT * FROM SourceTable WHERE ID = " & CStr(lngID),dbOpenDynaset) ' Open Source Table

  Set rsTarget = CurrentDb.OpenRecordSet("SELECT * FROM SourceTable WHERE ID = " & CStr(lngID),dbOpenDynaset) ' Open Target Table

  if rsSource.EOF Then Exit Sub                 ' Exit if no record is selected  

  rsTarget.AddNew                               ' Append a new record to destination table
  rsTarget!TrgtField1 = rsSource!SrcFields1     ' Copy Source field 1 into target field 1
  rsTarget.TrgtField2 = rsSource!SrcFields2     ' Copy Source field 2 into target field 2
  ...
  rsTarget.Update                               ' Save new record

  rsTarget.Close                                ' Close Recordset
  rsSource.Close                                ' Close Recordset

  Set rsSource = Nothing                        ' Free memory
  Set rsTarget = Nothing                        ' Free memory

End Sub

子程序的调用与第一种情况相同。

请注意我已注意到目标记录的ID字段。 这非常重要,因为如果您使用带有自动编号的ID字段(KEY)(像往常一样),您不必为其分配任何内容,因为插入后它会自动生成新记录。

请告诉我这是否适合您。

再见: - )