Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1253
Войнушки продолжаются.
Есть форма Form1 с Recordset = "SELECT TOP 1 department.* FROM department WHERE (department.id = 3)"
Есть подчинённая форма Form2 с Recordset = "SELECT TOP 1 address.* FROM address WHERE (address.department_id = 3) AND (address.addressType_id = 1)"

При выполнении Form1.Refresh форма Form2 переходит в какое-то аномальное состояние, в котором:
а) доступ к любому полю через Form1.Recordset.Fields завершается ошибкой 3021 "Текущая тапись отстутствует"
б) доступ к любому полю через форму (например, Form.id, где "id" - имя поля) осуществляется нормально
в) форма нормально отображает данные, данные на форме можно вводить и изменять (в ходе изменения данных на форме Form2 её аномальное состояние сохраняется)


Вот лог из IW:
автор
?form2.RecordSet.RecordCount
1
?form2.CurrentRecord
1
?form2.RecordSet.Fields.Count
67
?form2.RecordSet.Fields(0).Name
id
?form2.RecordSet.Fields("id").Name
id
?form2.RecordSet.Fields("id")
ошибка 3021 "Текущая тапись отстутствует"
?form2.id
3 //ошибки нет
?form2.RecordSet.EOF
False
?form2.RecordSet.BOF
False

?form1.RecordSource
SELECT TOP 1 department.* FROM department WHERE (department.id = 3)
?form2.RecordSource
SELECT TOP 1 address.* FROM address WHERE (address.department_id = 3) AND (addressType_id = 1)


Вот аналогичная проблема с другого форума ("решена" с помощью заплатки):
http://www.cyberforum.ru/vba/thread511413.html
автор
Есть две формы, главная и подчинённая (табличная с источником данных = запрос)
При обновлении главной формы, естественно, обновляется и подчинённая, и у подчинённой вызывается событие Текущая запись, в котором я вывожу значения текущей записи из подчинённой формы в поля ввода главной формы, что-то в роде:

Me.Parent.[Имя поля] = Me.Recordset("[Название столбца]")


В событии Текущая запись сбивается Recordset подчинённоё формы
И выдаёт ошибку что текущая запись не установлена.

Как обновить подчинённую форму (происходит добавление записи - хочу вывести вновь введённую запись) и сделать новую запись текущей???

>>Скорее всего, нужно отказаться от использования свойств «Подчиненные поля» (LinkChildFields) и «Основные
>>поля» (LinkMasterFields) и проводить обновления самостоятельно и последовательно во времени.


Я не использую поля: «Подчиненные поля», «Основные поля».

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

Оговорка: Правильнее сказать, что Recordset не сбивается, а в момент обновления подчинённой формы нет выбранной записи, т.е. ни какая запись из таблицы не является текущей. Хотя событие «Текущая запись» вызывается, но Recordset в данные момент ни на что не ссылается.
Свойство Recordset.Fields(i).Name - связанно со столбцом таблицы,
а Recordset.Fields(i).Value - (что-то вроде) "Отсутствует текущая запись".

-------------------------------------------------------------------------------------------------------------
Решил проблему тем, что обновляю именно Recordset подчинённой формы
Me.subForm.Form.Recordset.Requery

При этом не вызывается событие «Текущая запись»
И при вставке делаю только что вставленную записи текущей
Me.subForm.Form.Recordset.FindLast ("id = " & id_Только_что_вставленной_записи)


Вопросы:
1. Что это за состояние такое у формы Form2 ?
2. Почему форма переходит в это состояние
5 июл 13, 21:33    [14530033]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
Сергей Лалов
Member

Откуда: Питер,Москва, Выборг, Светогорск
Сообщений: 1267
Cyrax_02,
Эта ошибка и у меня выскакивала, когда в подчиненной форме отсутствовала запись. То есть значений никаких не было. У вас скорее всего при открытии главной формы, первая запись на главной форме не содержит никаких записей в подчиненной. Я решил эту проблему навесив на событие текущая запись процедуру проверки количества строк в подчиненной таблице. Если количество записей в подчиненной таблице по критерию текущей записи в главной таблице форме равно 0, то у меня вообще в подчиненной ничего не выводилось. То есть сначала нужна проверка, а потом только вешать вашу процедуру связывания. Серьезная проблемка кстати. Вы наверное unbound формы любите?
5 июл 13, 22:05    [14530138]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
guest_rusimport
Guest
Cyrax_02,

вот , что я наблюдаю после нажатия на кнопочку Refresh

... любит вас акцесс какой-то особенной любовью ... или вы его

К сообщению приложен файл. Размер - 132Kb
5 июл 13, 22:51    [14530239]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
qwerty112
Guest
+
guest_rusimport
... любит вас акцесс какой-то особенной любовью ... или вы его

:))
5 июл 13, 23:02    [14530265]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1253
автор
Эта ошибка и у меня выскакивала, когда в подчиненной форме отсутствовала запись. То есть значений никаких не было.

Конечно, в большинстве случаев эта ошибка выскакивает при отсутствии записей, либо при EOF = True, либо BOF = True.
Но у меня текущая запись фактически есть:
а) можно обратиться к любому полю формы через Form2.имяПоля
б) можно нормально редактировать поля формы (в процессе редактирования аномальное состояние формы сохраняется)

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

При загрузке главной формы подчинённой форме присваивается пустой RecordSet (т.к. связанных записей нет) и Visible = False
Далее при выборе в дереве (дерево находится на форме form1) некоторого узла подчинёной форме form2 присваивается RecordSet, указанный выше (+ requery). Далее выполняю form1.Refresh и форма form2 переходит в это самое состояние.

автор
Я решил эту проблему навесив на событие текущая запись процедуру проверки количества строк в подчиненной таблице. Если количество записей в подчиненной таблице по критерию текущей записи в главной таблице форме равно 0, то у меня вообще в подчиненной ничего не выводилось.

У form2 переходит в это самое аномальное состояние в тот момент, когда имеют место одновременно:
а) form2 отображает запись, которая существует и соответствует текущей записи главной формы form1 (и нормально редактируется)
б) выполняется form1.Refresh
После этого форма form2 уходит в ступор.
5 июл 13, 23:18    [14530309]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1253
guest_rusimport, именно поэтому я и не состряпал тестовый пример. Знаю, что будет всё нормально.
Вы лучше скажите, как такое возможно: на форме можно редактировать поля (и изменения реально сохраняются), но в то же время при попытке доступа к любому из полей через Recordset формы выскакивает ошибка "Текущая запись отсутствует". Это ж аномалия в чистом виде.
5 июл 13, 23:31    [14530330]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
guest_rusimport
Guest
Cyrax_02
guest_rusimport, именно поэтому я и не состряпал тестовый пример. Знаю, что будет всё нормально.
Вы лучше скажите, как такое возможно: на форме можно редактировать поля (и изменения реально сохраняются), но в то же время при попытке доступа к любому из полей через Recordset формы выскакивает ошибка "Текущая запись отсутствует". Это ж аномалия в чистом виде.


в случае unbound форм , если вы используете Refresh основной формы один раз - ошибка возникать не будет, другое дело , если вы используете Refresh основной формы несколько раз подряд, то recordset подчиненной формы как бы перейдет в "неопределенное" состояние - текущая запись после таких "свистоплясок" у подчиненной формы в recordset-e "собъется" , т.е. будет не определена и достаточно будет "пробежаться" по рекордсету подчиненной формы , чтобы установить текущую запись (movelast - movefirst)... Когда же вы работаете с формой , так сказать, "визуально", то вы установливая курсор на то или иное поле подчиненной формы, сами того не ведая, определяете рекордсету текущую запись
5 июл 13, 23:50    [14530384]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
Сергей Лалов
Member

Откуда: Питер,Москва, Выборг, Светогорск
Сообщений: 1267
Кстати стремно обращаться к рекордсету формы напрямую, типа me.recordset.действие , глючная нестабильная конструкция по умолчанию. Один раз ради прикола прокатился циклом по именно данной конструкции, с подсчетом нарастающего итога в каждой последующей строке. Записей было около 10 тыщ. Визуально просто эффектно смотриться - курсор физически бежит по строкам и значения вставляются. Но чуть что где сбилось и все - понеслись косяки. Нежнее и без лишних педалей использовать все связки на уровне модуля. Там есть волшебное свойство Dim тратата As recordset2. И если простая форма с использованием всего двух наборов записей то как говориться сам доктор прописал. Влупил все проверки на уровне кода, а в подчиненную остается лишь выводить результат. Извините что не могу скинуть идентичный пример, пишу с мобилы. Смысл-схлестывать два рекорсета в модуле , передавать значение текущей записи через глобальную переменную/или переменную модуля формы и только после всех проверок что то выводить на формы.
6 июл 13, 01:43    [14530572]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1253
Вот что имеем для подчинённой формы в сабжевом состоянии:
form2.CurrentRecord = 1
form2.RecordSet.AbsolutePosition = -1

автор
в случае unbound форм , если вы используете Refresh основной формы один раз - ошибка возникать не будет, другое дело , если вы используете Refresh основной формы несколько раз подряд, то recordset подчиненной формы как бы перейдет в "неопределенное" состояние - текущая запись после таких "свистоплясок" у подчиненной формы в recordset-e "собъется" , т.е. будет не определена

guest_rusimport, откуда у Вас эта информация ? Вы воспроизвели глюк в своём тестовом примере ?

Проверил по коду - с момента загрузки главной формы Refresh у меня вызывается только один раз. И сразу приводит к ступору подчинённой формы. Возможно, на этот ступор влияют предварительные Repaint, Painting = True/False, RecordSource = ..., Requery (таковые имеются).

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

Не рекордсету, а форме. Т.е. form2.CurrentRecord. А это свойство и до установки курсора определено и равно 1.
Что касается form2.RecordSet.AbsolutePosition, то он как и был равен (-1), так и остаётся равным (-1) при установке курсора в поле и при редактирования полей.
Вывод: в сабжевом аномальном состоянии редактирование полей формы form2 происходит при form2.RecordSet.AbsolutePosition = -1. Как это форме удаётся - непонятно. Ведь работает форма с БД не напрямую, а через этот самый recordset.

автор
и достаточно будет "пробежаться" по рекордсету подчиненной формы , чтобы установить текущую запись (movelast - movefirst)...

Проще всего и корректнее всего так:
If (frm.Recordset.AbsolutePosition <> frm.CurrentRecord) Then frm.Recordset.AbsolutePosition = frm.CurrentRecord
Т.е. восстанавливаем текущую запись в рекордсете.
6 июл 13, 10:56    [14530826]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1253
автор
Смысл-схлестывать два рекорсета в модуле , передавать значение текущей записи через глобальную переменную/или переменную модуля формы и только после всех проверок что то выводить на формы.

Сергей Лалов, что-то мне подсказывает, что у Вас была несколько иная проблема. В моей ситуации подчинённая форма имеет запись для отображения и корректное значение текущей записи содержится в form.CurrentRecord. А сбивается значение form.RecordSet.AbsolutePosition.

--------------------------
Что касается момента перехода подчинённой формы в сабжевое состояние.
Из всех вот этих операций
frm.Repaint
frm.Requery
frm.Refresh
frm.Recalc
frm.Painting = True/False
frm.RecordSource = ...

в ступор подчинённую форму переводят операции:
frm.Refresh
frm.Recalc
выполняемые для главной формы (выполнение их для подчинёной формы к глюку НЕ приведёт).

Судя по нормально работающему примеру guest_rusimport'а, для наблюдения глюка одновременно с выполнением данных команд должны иметь место ещё какие-то факторы. Возможно, это предварительные Repaint, Painting = True/False, RecordSource = ..., Requery.
6 июл 13, 11:10    [14530838]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
?????
Guest
10981941
6 июл 13, 11:45    [14530893]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1253
автор
Проще всего и корректнее всего так:
If (frm.Recordset.AbsolutePosition <> frm.CurrentRecord) Then frm.Recordset.AbsolutePosition = frm.CurrentRecord
Т.е. восстанавливаем текущую запись в рекордсете.

Правильно так:
If (frm.Recordset.AbsolutePosition <> frm.CurrentRecord - 1) Then frm.Recordset.AbsolutePosition = frm.CurrentRecord - 1
Первый вариант будет работать только если frm.CurrentRecord - последняя (или единственная) запись на форме
(т.к. при присваивании frm.Recordset.AbsolutePosition'у значения recordCount значение автоматически корректируется на (recordCount - 1))

?????
10981941

?????, ну так каково заключение ?
Там вроде тоже не решили проблему. Да и воспроизвести на тестовом примере не смогли.
6 июл 13, 13:08    [14531000]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
гыы!
Guest
Cyrax_02,

Cyrax_02
Да и воспроизвести на тестовом примере не смогли.
Да, повезло! Не у всех такие золотые руки! И не имеет значения откуда они растут.
6 июл 13, 13:41    [14531047]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1253
У меня recordset у подчинённой формы сбрасываться в следующей ситуации:
а) на главной форме F1 расположена подформа F2, на подформе F2 - вкладка V1, на вкладке V1 - подформа F3, на подформе F3 - вкладка V2, на вкладке V2 - подформа FF (проблемная подформа)
б) на вкладке V1 расположен ещё один экземпляр FF
в) оба экземпляра FF отображают разные записи из одной и той же формы
г) выполняется Refresh или Recalc подформы F3 => подформа FF переходит в аномальное состояние

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

Могу предположить, что Repaint/Recalc сбрасывает Recordset.AbsolutePosition формы в (-1) в том случае, если в момент Repaint/Recalc открыт ещё один recordset на основе той же самой таблицы, данные из которой отображает проблемная форма.

Может, кто проверит, не поленится ?
13 июл 13, 14:54    [14561931]     Ответить | Цитировать Сообщить модератору
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5744
Cyrax_02
...а) на главной форме F1 расположена подформа F2, на подформе F2 - вкладка V1, на вкладке V1 - подформа F3, на подформе F3 - вкладка V2, на вкладке V2 - подформа FF (проблемная подформа)...
токо обращаясь к ней можно набить мозоли на пальцах
13 июл 13, 16:30    [14561995]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Аномальное состояние подчинённой формы: "Текущая запись отстутствует"  [new]
vremennyy
Member

Откуда:
Сообщений: 121
Cyrax_02
Проще всего и корректнее всего так:
If (frm.Recordset.AbsolutePosition <> frm.CurrentRecord) Then frm.Recordset.AbsolutePosition = frm.CurrentRecord
Т.е. восстанавливаем текущую запись в рекордсете.


Дай Вам бог здоровья!
11 май 19, 13:43    [21882462]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить