Копирование записи в VBA 2 (новый вопрос) - PullRequest
0 голосов
/ 16 июня 2009

У меня есть этот код, с которым я пытаюсь скопировать запись в VBA. К сожалению, я не могу заставить его работать. Я не знаю, почему он ничего не сделает.

Dim OldRecord As DAO.Recordsets, NewRecord As DAO.Recordset
Dim strSQL As String

strSQL = "SELECT [Tote Log].* FROM [Tote Log] WHERE Number = " & _
            Me.tbScannerRead.Value

Set OldRecord = CurrentDb.OpenRecordset(strSQL)

If OldRecord.Count = 1 Then
    Set NewRecord = _
                CurrentDb.OpenRecordset("SELECT [Tote Log].* FROM [Tote Log]")
    With NewRecord
        .AddNew
        For i = 0 To .Fields.Count - 1
            .Fields(i).Value = OldRecord.Fields(i).Value
        Next i
        .Fields("Number").Value = Me.tbScannerRead & "B2"
        .Update
        varBookMark = .Bookmark
    End With
    NewRecord = varBookMark
    DoCmd.RunCommand acCmdSelectRecord
    Me.tbMessageBox = "Added new record"
    Me.tbMessageBox.Visible = True
    GoodToteRead = False
    Me.tbScannerRead.SetFocus
End If

Я ничего не получаю, я пытаюсь скопировать запись из журнала тотализаторов и изменить номер, скажем, с L20444 на L20444B2, и у меня та же информация поля, что и у оригинала. Это где я так далеко, но я ничего не получаю. Ах, Помощь будет очень, и я имею в виду, высоко ценится. Спасибо

Ответы [ 2 ]

1 голос
/ 18 июня 2009

Есть несколько вещей, которые могут быть причиной этого. Вот один. Есть ли у вашей таблицы первичный ключ? Похоже, вы пытаетесь обновить первичный ключ до значения, которое уже существует в таблице, прежде чем изменять его. Это происходит в форме? В этом случае Access может расстроиться из-за того, что вы изменили набор записей за его спиной. me.undo() перед внесением изменений может помочь. Также, если вы находитесь в форме, вы можете выполнить то же самое таким образом. Это немного глупо, но это простой способ.

DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdCopy
DoCmd.GoToRecord , , acNewRec
DoCmd.RunCommand acCmdPaste

В качестве альтернативы я бы порекомендовал что-то подобное.

Dim sSql As String
Dim sUpdateSuffix as string
sUpdateSuffix="B2"
Const sTableName As String = "[Tote Log] "
sSql = "INSERT INTO "[Tote Log]([number],[whateverelse]) " & _
       "SELECT [number]" & sUpdateSuffix & ",[whateverelse]  FROM [Tote Log] WHERE Number = " & Me.tbScannerRead.Value
CurrentProject.Connection.Execute sSql

Если вы хотите построить строку sql динамически, используйте тот же метод, который вы уже использовали для циклического обхода полей и построения строки запроса. me.requery восстановит набор записей формы.

Надеюсь, это поможет вам

0 голосов
/ 16 июня 2009

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

В любом случае, вы должны открыть свои наборы записей следующим образом:

Set rs = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges) 

особенно если вы используете SQL Server в качестве бэкэнда (что вам и нужно).

После того, как вы сохранили запись, вам, вероятно, следует просто перезагрузить запись обратно в форму, выполнив recordset.find (), а не пытаться добавить ее в закладки. Закладки работают только с тем набором записей, с которого они были созданы. Это обеспечивает возможность проверки того, что данные действительно были сохранены в базе данных.

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