MS Access — Есть ли простой способ дублировать информацию о полях формы и ее подчиненных формах?

#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. большое спасибо за ваш быстрый ответ!!! Я пытаюсь соответствующим образом адаптировать код, однако я получаю разные сообщения об ошибках. Боюсь, что мне не хватает важной адаптации в вашем коде, чтобы заставить его работать. Я добавил имена дочерних записей, но здесь что-то пошло не так