Начал получать ошибку во время выполнения «3159»; Не верная закладка внезапно в Access 2007 - PullRequest
0 голосов
/ 22 января 2010

Я действительно новичок в программировании доступа. Я конвертировал старую базу данных доступа 97 для доступа 2007, и некоторое время он работал нормально. Сегодня я вхожу в это и слоняюсь в представлении дизайна и смотрю на код. Я ничего не изменил. Просто посмотрел. Когда я запускал код, я получал ошибку «Неправильная закладка». Просто чтобы убедиться, что я открыл старую программу, которую я конвертировал, и весь код такой же, строка, которая вызывает у меня проблему, это

Me.Bookmark = pos

Ниже приводится вся рутина.

Заранее спасибо.

Private Sub ProductID_AfterUpdate()
    Dim pos As Variant
    Me![UnitPrice] = Me![ProductID].Column(2)
    Me![ProductName] = Me![ProductID].Column(1)
    Me![GLAcct] = Me![ProductID].Column(3)
    DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
    pos = Me.Bookmark
    Me.Requery
    Me.Bookmark = pos
End Sub

Редактировать: я уже пробовал компактировать и восстанавливать.

Ответы [ 2 ]

1 голос
/ 23 января 2010

Чтобы запросить форму и вернуться к той же записи, сделайте это:

  Dim lngPKValue As Long

  With Me.RecordsetClone
    lngPKValue = Me!ID
    ' Me.Dirty = False is unnecessary, as the Requery saves the data
    Me.Requery
    .FindFirst "[ID]=" & lngPKValue
    If Not .NoMatch Then
       Me.Bookmark = .Bookmark
    End If
  End With

Теперь, где вы положили этот код, зависит. Я не совсем понимаю в исходном коде, почему нужно запрашивать, так как обновления были сделаны для записи, на которой вы уже находитесь, поэтому вы ничего не добиваетесь, запрашивая и возвращаясь к записи, на которой вы начали , Но есть обстоятельства, при которых вы хотите это сделать (например, в упорядоченном наборе записей, где вы отредактировали значения, которые изменят место этой конкретной записи в отсортированном результате), и вышеописанный способ это сделать. .

Если это необходимо, вы, вероятно, захотите отключить рисование формы (Me.Painting = False, Me.Painting = True после установки закладки) или приложения (Application.Echo = False / Правда), чтобы экран не мерцал, и вы не видите запрашивающий и навигацию. Но убедитесь, что вы добавили обработчик ошибок, так как если ошибка произошла, когда рисование экрана выключено, ваш пользователь может застрять и не сможет продолжить.

1 голос
/ 23 января 2010

Вам нужно будет изменить этот код, так как он устарел в течение достаточно долгого времени. Я не уверен, почему это сработало в первую очередь, потому что закладки будут изменены после обновления, сохранения и запроса. Я прокомментировал строку запроса, потому что она, кажется, не служит полезной цели, если вы хотите обновить комбо, запросите это. Если вы хотите найти запись после действия, сохраните уникальный идентификатор в переменной и найдите его. DoMenuItem устарел, вместо этого вы можете использовать RunCommand, однако в этом случае Me.Dirty = false сохранит.

Private Sub ProductID_AfterUpdate()
    Dim pos As Variant
    Me![UnitPrice] = Me![ProductID].Column(2)
    Me![ProductName] = Me![ProductID].Column(1)
    Me![GLAcct] = Me![ProductID].Column(3)
    Me.Dirty=False
    'pos = Me.Bookmark
    'Me.Requery 
    'Me.Bookmark = pos
End Sub
...