Form.CurrentRecord = 1 и Form.RecordSet.Absoluteposition = -1 - PullRequest
3 голосов
/ 22 мая 2009

Как и в названии, я сталкиваюсь со странным явлением. У меня есть форма, которая содержит две подчиненные формы. В обеих подчиненных формах у меня есть кнопка, которая вызывает запрос соответствующей подчиненной формы. Если после загрузки формы я немедленно нажимаю на эту кнопку (запросить форму), я получаю ошибку «3021: нет текущей записи», когда пытаюсь сохранить значение первичного ключа текущей записи в событии OnCurrent в переменной. Как ни странно, в отладчике соответствующие значения выглядят так:

  Form.CurrentRecord=1
  Form.RecordSet.Absoluteposition=-1
  Form.RecordSet.RecordCount=14
  Form.RecordSet.EOF=False
  Form.RecordSet.BOF=False

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

Где-то между Form_Load и мной, нажав эту кнопку запроса, статус формы не синхронизирован. Я только недавно перешел с Access 2003 на 2007, и, насколько я помню, этой ошибки раньше не было (хотя я мог бы просто не нажимать эту кнопку сразу после загрузки).

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

Ответы [ 3 ]

1 голос
/ 26 мая 2009

Если это ADO, проверьте, какой поставщик OLE DB используется, например. (Угадывание)

Debug.Print Form.RecordSet.ActiveConnection.Provider

Если случайно это версия 3.51, см .:

ИНФОРМАЦИЯ: свойство AbsolutePosition с базами данных JET в ADO

... если вы используете провайдера ACE, возможно, это ошибка регрессии?!

0 голосов
/ 19 июня 2011

У меня точно такая же проблема, когда я пытаюсь перейти к «Представлению дизайна». Мне не нужно быстро нажимать, я могу подождать час, а затем сделать это и ударить! есть эта ошибка.

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

AbsolutePosition установлен в -1, когда курсор в данный момент не указывает на определенную позицию. Кроме того, это значение основано на нуле (как упомянуто кем-то еще: первая строка - AbsolutePosition 0). Тем не менее, эта позиция может быть -1, даже если вы сфокусировались на конкретной строке в форме. Это значит, что это бесполезно.

То, что вы хотите использовать, если вам нужно знать, что текущая позиция курсора - это CurrentRecord. Это число, начинающееся с 1. Я думаю, что если список пуст, то CurrentRecord может быть установлен в 0 или -1, что означает отсутствие доступной строки.

Я использовал все это в функции, используемой для вычисления сложного общего количества различных столбцов, вот страница http://linux.m2osw.com/msaccess-sum-focus-recordset-problem

0 голосов
/ 23 мая 2009

Вы должны поместить указатель записи на определенную запись в наборе записей формы через MoveFirst или что-либо еще. И возвращаемое значение, кажется, начинается с нуля, а не с 1.

Я не могу воспроизвести ошибку, которую вы получаете, возвращая -1. Вы устанавливаете набор записей формы на набор записей ADO? Если это так, это могло бы объяснить это - наборы записей DAO никогда не возвращают -1 для любого из этих значений, но я полагаю, что до .MoveLast ADO RecordCount возвращает -1. Возможно, AbsolutePosition делает то же самое в ADO.

Чего ты пытаешься достичь? Я не вижу никакой утилиты в использовании объекта Recordset формы, когда намного проще назначить источник записей и перемещаться по RecordsetClone (который гораздо более тесно связан с буфером редактирования / отображения формы, чем набор записей формы, особенно когда набор записей был назначен с набором записей ADO).

...