#ms-access #duplicates
#ms-access #дубликаты
Вопрос:
Я хочу дублировать форму с 3 подчиненными формами — чтобы объяснить это просто: представьте рецепт (основная форма: некоторые общие данные; подформа 1: список ингредиентов, подформа 2: инструкции; подформа 3: цены; иногда в рецептах меняется только тип муки, поэтому я не хочу вводить все заново, а просто иметь ту же форму с новым уникальным идентификатором и этим единственным изменением в списке ингредиентов)
дублировать основную форму легко, но вспомогательные формы пусты. есть несколько идей, которые я нашел в Интернете, но это кажется невероятно сложным (я начинающий программист), см., Например, Предложение Microsoft: https://support.microsoft.com/en-us/help/208824/acc2000-how-to-duplicate-a-main-form-and-its-subform-detail-records
В принципе, я хочу иметь тот же контент с » 1″ к уникальному идентификатору.
Есть идеи?
Спасибо!
Ответ №1:
У вас может быть кнопка на главной форме для запуска этого кода для копирования родительской записи и всех дочерних записей без внешних запросов или запроса подчиненных форм.
Здесь вы копируете две подчиненные формы. Просто расширьте его аналогичным кодом, чтобы скопировать дочерние записи 3, поскольку у вас есть три подчиненные формы:
Private Sub CopyButton_Click()
Dim rst As DAO.Recordset
Dim rstAdd As DAO.Recordset
Dim fld As DAO.Field
Dim Count As Integer
Dim Item As Integer
Dim Bookmark As Variant
Dim OldId As Long
Dim NewId As Long
' Copy parent record.
Set rstAdd = Me.RecordsetClone
Set rst = rstAdd.Clone
' Move to current record.
rst.Bookmark = Me.Bookmark
OldId = rst!Id.Value
With rstAdd
.AddNew
For Each fld In .Fields
With fld
If .Attributes And dbAutoIncrField Then
' Skip Autonumber or GUID field.
Else
.Value = rst.Fields(.Name).Value
End If
End With
Next
.Update
' Pick Id of the new record.
.MoveLast
NewId = !Id.Value
End With
' Store location of new record.
Bookmark = rstAdd.Bookmark
' Copy child records 1.
Set rstAdd = Me!subChild1.Form.RecordsetClone
Set rst = rstAdd.Clone
If rstAdd.RecordCount > 0 Then
rstAdd.MoveLast
rstAdd.MoveFirst
End If
Count = rstAdd.RecordCount
For Item = 1 To Count
With rstAdd
.AddNew
For Each fld In .Fields
With fld
If .Attributes And dbAutoIncrField Then
' Skip Autonumber or GUID field.
ElseIf .Name = "FK" Then
' Skip master/child field.
.Value = NewId
Else
.Value = rst.Fields(.Name).Value
End If
End With
Next
.Update
End With
rst.MoveNext
Next
' Copy child records 2.
Set rstAdd = Me!subChild2.Form.RecordsetClone
Set rst = rstAdd.Clone
If rstAdd.RecordCount > 0 Then
rstAdd.MoveLast
rstAdd.MoveFirst
End If
Count = rstAdd.RecordCount
For Item = 1 To Count
With rstAdd
.AddNew
For Each fld In .Fields
With fld
If .Attributes And dbAutoIncrField Then
' Skip Autonumber or GUID field.
ElseIf .Name = "FK" Then
' Skip master/child field.
.Value = NewId
Else
.Value = rst.Fields(.Name).Value
End If
End With
Next
.Update
End With
rst.MoveNext
Next
rst.Close
rstAdd.Close
' Move to the new recordcopy.
Me.Bookmark = Bookmark
Set fld = Nothing
Set rstAdd = Nothing
Set rst = Nothing
End Sub
Пожалуйста, обратите внимание, что subChildx
это представляют собой имена элементов управления подчиненной формы, которые могут отличаться от имен самих подчиненных форм.
Комментарии:
1. большое спасибо за ваш быстрый ответ!!! Я пытаюсь соответствующим образом адаптировать код, однако я получаю разные сообщения об ошибках. Боюсь, что мне не хватает важной адаптации в вашем коде, чтобы заставить его работать. Я добавил имена дочерних записей, но здесь что-то пошло не так