Дубликат Main и подчиненной формы через Insert в vba не вставляется, а в запросе работает - PullRequest
2 голосов
/ 30 марта 2020

Все,

Я уже некоторое время борюсь с проблемой. Я везде смотрю на inte rnet, но пока не нашел решения. У меня есть две таблицы, основная таблица (tbl_D_opp_prod_offer) и таблица подробностей (tbl_D_opp_prod_offer_line). Пользователь может выбрать в пользовательской форме создание дубликата записи в основной форме, чтобы начать изменение новой записи. Также должны быть продублированы соответствующие записи таблицы данных. Это связано с тем, что иногда пользователю быстрее выбрать другую строку в качестве шаблона, поскольку она уже заполнена. Я упростил приведенный ниже пример.

Основная таблица состоит из:
Opp_ID = PK (автономный номер)
Проект (и несколько других полей)

Подробная таблица состоит из:
Opp_line_ID = PK (autonumber)
Opp_ID = FK (число)
Продукт (и несколько других полей)

Я использовал два способа, один с sql и один с наборами записей. Оба не работают. Когда я debug.print маршрут sql в качестве нового запроса, он работает. Так что я не понимаю, где это идет не так. Отношения имеют принудительную ссылочную целостность, каскадное обновление и каскадное удаление. Я действительно надеюсь, что кто-то может помочь мне с этим, я теряю волосы ;-) Поскольку я сохранил это в объекте класса Form главной формы, это могло быть проблемой? Или ключевое нарушение? Как я могу изменить это?

Код, который у меня есть для решения SQL:

Public Function duplicate()
    'Find selected record
    DoCmd.SearchForRecord , , , "[Project_ID] = " & "'" & [Forms]![Frm_Opp_prod_offer]!        [lst_Edit_project_ID] & "'"

      Dim OldId As Integer, NewId As Integer

' Read old ID
OldId = Me.Opp_ID

' copy main table records to new record
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdCopy
DoCmd.RunCommand acCmdRecordsGoToNew
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdPaste

' Read new ID
NewId = Me.Opp_ID


' Copy all records from old ID to new ID
       S = "INSERT INTO [tbl_D_opp_prod_offer_line] (Opp_ID, Product) " & _
            "SELECT " & NewId & " As Opp_ID, Product " & _
            "FROM [tbl_D_opp_prod_offer_line] WHERE Opp_ID = " & OldId

    Debug.Print S
       Stop
        ' Hit Ctrl+G, copy SQL from Immediate Window to a new query

        CurrentDb.Execute S, dbFailOnError


      ' Load copied records
        Me!Frm_Opp_prod_offer_line.Form.Requery

    End Function

`

Решение через Recordset:

Sub method2()


      Dim rstSource   As DAO.Recordset
      Dim rstInsert   As DAO.Recordset
      Dim fld         As DAO.Field
      Dim strSQL      As String
      Dim lngLoop     As Long
      Dim lngCount    As Long
      Dim OldId As Integer, NewId As Integer

    'Beginning is same
    'Find selected record
    DoCmd.SearchForRecord , , , "[Project_ID] = " & "'" & [Forms]![Frm_Opp_prod_offer]![lst_Edit_project_ID] & "'"

' Read old ID
OldId = Me.Opp_ID

' copy main table records to new record
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdCopy
DoCmd.RunCommand acCmdRecordsGoToNew
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdPaste

' Read new ID
NewId = Me.Opp_ID

      strSQL = "SELECT * FROM tbl_D_opp_prod_offer_line WHERE Opp_ID = " & OldId

      ' Change this to the RecordsetClone of the subform.
      Set rstInsert = CurrentDb.OpenRecordset(strSQL)


      Set rstSource = rstInsert.Clone
      With rstSource
        lngCount = .RecordCount
        For lngLoop = 1 To lngCount
          With rstInsert
            .AddNew
              For Each fld In rstSource.Fields
                With fld
                  If .Attributes And dbAutoIncrField Then
                    ' Skip Autonumber or GUID field.
                 If .Name = "Opp_ID" Then  ' Name of FK.
                      rstInsert.Fields(.Name).Value = NewId  ' The new ID of the parent.
                           Else
                    ' Copy field content.
                    rstInsert.Fields(.Name).Value = .Value
                  End If
                  End If
                End With
              Next

    .Update
  End With
  .MoveNext
Next
rstInsert.Close
.Close
      End With

      Set rstInsert = Nothing
      Set rstSource = Nothing


End Sub

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Вы не искали ТАК, так что кажется. Полный код здесь:

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

Этот универсальный c метод чрезвычайно быстр и будет автоматически запрашивать.

0 голосов
/ 30 марта 2020

После создания новой основной записи в форме необходимо сначала зафиксировать таблицу перед созданием зависимых записей.

Способы принудительного совершения записи:

If Me.Dirty Then Me.Dirty = False

RunCommand acCmdSaveRecord

DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70

Me.Refresh

Me.Requery
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...