MS Access - Есть ли простой способ дублировать полевую информацию формы и ее подчиненных форм? - PullRequest
1 голос
/ 28 марта 2019

Я хочу продублировать форму с 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 Ответ

0 голосов
/ 28 марта 2019

У вас может быть кнопка в главной форме, чтобы запустить этот код для копирования родительской записи и всех дочерних записей без внешних запросов или запроса субформ.

Здесь вы копируете две субформы.Просто расширите его с помощью аналогичного кода до Копировать дочерние записи 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 представляет имена подчиненной формы control , что может отличаться от имен самих подчиненных форм.

...