|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
Войнушки продолжаются. Есть форма 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 авторЕсть две формы, главная и подчинённая (табличная с источником данных = запрос) При обновлении главной формы, естественно, обновляется и подчинённая, и у подчинённой вызывается событие Текущая запись, в котором я вывожу значения текущей записи из подчинённой формы в поля ввода главной формы, что-то в роде: Код: vbnet 1.
В событии Текущая запись сбивается Recordset подчинённоё формы И выдаёт ошибку что текущая запись не установлена. Как обновить подчинённую форму (происходит добавление записи - хочу вывести вновь введённую запись) и сделать новую запись текущей??? >>Скорее всего, нужно отказаться от использования свойств «Подчиненные поля» (LinkChildFields) и «Основные >>поля» (LinkMasterFields) и проводить обновления самостоятельно и последовательно во времени. Я не использую поля: «Подчиненные поля», «Основные поля». У меня есть форма без источника данных, т.е. не с чем не связанная. На ней есть поля ввода, для заполнения таблицы. На этой же форме я вывожу др. форму (подчинённую) в виде таблицы, по факту она ни чему не "подчиняется" она только размещается на главной форме. Оговорка: Правильнее сказать, что Recordset не сбивается, а в момент обновления подчинённой формы нет выбранной записи, т.е. ни какая запись из таблицы не является текущей. Хотя событие «Текущая запись» вызывается, но Recordset в данные момент ни на что не ссылается. Свойство Recordset.Fields(i).Name - связанно со столбцом таблицы, а Recordset.Fields(i).Value - (что-то вроде) "Отсутствует текущая запись". ------------------------------------------------------------------------------------------------------------- Решил проблему тем, что обновляю именно Recordset подчинённой формы Код: vbnet 1.
При этом не вызывается событие «Текущая запись» И при вставке делаю только что вставленную записи текущей Код: vbnet 1.
Вопросы: 1. Что это за состояние такое у формы Form2 ? 2. Почему форма переходит в это состояние ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2013, 21:33 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
Cyrax_02, Эта ошибка и у меня выскакивала, когда в подчиненной форме отсутствовала запись. То есть значений никаких не было. У вас скорее всего при открытии главной формы, первая запись на главной форме не содержит никаких записей в подчиненной. Я решил эту проблему навесив на событие текущая запись процедуру проверки количества строк в подчиненной таблице. Если количество записей в подчиненной таблице по критерию текущей записи в главной таблице форме равно 0, то у меня вообще в подчиненной ничего не выводилось. То есть сначала нужна проверка, а потом только вешать вашу процедуру связывания. Серьезная проблемка кстати. Вы наверное unbound формы любите? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2013, 22:05 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
Cyrax_02, вот , что я наблюдаю после нажатия на кнопочку Refresh ... любит вас акцесс какой-то особенной любовью ... или вы его ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2013, 22:51 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
guest_rusimport... любит вас акцесс какой-то особенной любовью ... или вы его :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2013, 23:02 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
авторЭта ошибка и у меня выскакивала, когда в подчиненной форме отсутствовала запись. То есть значений никаких не было. Конечно, в большинстве случаев эта ошибка выскакивает при отсутствии записей, либо при EOF = True, либо BOF = True. Но у меня текущая запись фактически есть: а) можно обратиться к любому полю формы через Form2.имяПоля б) можно нормально редактировать поля формы (в процессе редактирования аномальное состояние формы сохраняется) авторУ вас скорее всего при открытии главной формы, первая запись на главной форме не содержит никаких записей в подчиненной. При загрузке главной формы подчинённой форме присваивается пустой RecordSet (т.к. связанных записей нет) и Visible = False Далее при выборе в дереве (дерево находится на форме form1) некоторого узла подчинёной форме form2 присваивается RecordSet, указанный выше (+ requery). Далее выполняю form1.Refresh и форма form2 переходит в это самое состояние. авторЯ решил эту проблему навесив на событие текущая запись процедуру проверки количества строк в подчиненной таблице. Если количество записей в подчиненной таблице по критерию текущей записи в главной таблице форме равно 0, то у меня вообще в подчиненной ничего не выводилось. У form2 переходит в это самое аномальное состояние в тот момент, когда имеют место одновременно: а) form2 отображает запись, которая существует и соответствует текущей записи главной формы form1 (и нормально редактируется) б) выполняется form1.Refresh После этого форма form2 уходит в ступор. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2013, 23:18 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
guest_rusimport , именно поэтому я и не состряпал тестовый пример. Знаю, что будет всё нормально. Вы лучше скажите, как такое возможно: на форме можно редактировать поля (и изменения реально сохраняются), но в то же время при попытке доступа к любому из полей через Recordset формы выскакивает ошибка "Текущая запись отсутствует". Это ж аномалия в чистом виде. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2013, 23:31 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
Cyrax_02 guest_rusimport , именно поэтому я и не состряпал тестовый пример. Знаю, что будет всё нормально. Вы лучше скажите, как такое возможно: на форме можно редактировать поля (и изменения реально сохраняются), но в то же время при попытке доступа к любому из полей через Recordset формы выскакивает ошибка "Текущая запись отсутствует". Это ж аномалия в чистом виде. в случае unbound форм , если вы используете Refresh основной формы один раз - ошибка возникать не будет, другое дело , если вы используете Refresh основной формы несколько раз подряд, то recordset подчиненной формы как бы перейдет в "неопределенное" состояние - текущая запись после таких "свистоплясок" у подчиненной формы в recordset-e "собъется" , т.е. будет не определена и достаточно будет "пробежаться" по рекордсету подчиненной формы , чтобы установить текущую запись (movelast - movefirst)... Когда же вы работаете с формой , так сказать, "визуально", то вы установливая курсор на то или иное поле подчиненной формы, сами того не ведая, определяете рекордсету текущую запись ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2013, 23:50 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
Кстати стремно обращаться к рекордсету формы напрямую, типа me.recordset.действие , глючная нестабильная конструкция по умолчанию. Один раз ради прикола прокатился циклом по именно данной конструкции, с подсчетом нарастающего итога в каждой последующей строке. Записей было около 10 тыщ. Визуально просто эффектно смотриться - курсор физически бежит по строкам и значения вставляются. Но чуть что где сбилось и все - понеслись косяки. Нежнее и без лишних педалей использовать все связки на уровне модуля. Там есть волшебное свойство Dim тратата As recordset2. И если простая форма с использованием всего двух наборов записей то как говориться сам доктор прописал. Влупил все проверки на уровне кода, а в подчиненную остается лишь выводить результат. Извините что не могу скинуть идентичный пример, пишу с мобилы. Смысл-схлестывать два рекорсета в модуле , передавать значение текущей записи через глобальную переменную/или переменную модуля формы и только после всех проверок что то выводить на формы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2013, 01:43 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
Вот что имеем для подчинённой формы в сабжевом состоянии: 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 Т.е. восстанавливаем текущую запись в рекордсете. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2013, 10:56 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
авторСмысл-схлестывать два рекорсета в модуле , передавать значение текущей записи через глобальную переменную/или переменную модуля формы и только после всех проверок что то выводить на формы. Сергей Лалов , что-то мне подсказывает, что у Вас была несколько иная проблема. В моей ситуации подчинённая форма имеет запись для отображения и корректное значение текущей записи содержится в 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2013, 11:10 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2013, 11:45 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
авторПроще всего и корректнее всего так: 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 ????? , ну так каково заключение ? Там вроде тоже не решили проблему. Да и воспроизвести на тестовом примере не смогли. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2013, 13:08 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
Cyrax_02, Cyrax_02Да и воспроизвести на тестовом примере не смогли.Да, повезло! Не у всех такие золотые руки! И не имеет значения откуда они растут. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2013, 13:41 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
У меня 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.07.2013, 14:54 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
Cyrax_02...а) на главной форме F1 расположена подформа F2, на подформе F2 - вкладка V1, на вкладке V1 - подформа F3, на подформе F3 - вкладка V2, на вкладке V2 - подформа FF (проблемная подформа)...токо обращаясь к ней можно набить мозоли на пальцах ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2013, 16:30 |
|
Аномальное состояние подчинённой формы: "Текущая запись отстутствует"
|
|||
---|---|---|---|
#18+
Cyrax_02Проще всего и корректнее всего так: If (frm.Recordset.AbsolutePosition <> frm.CurrentRecord) Then frm.Recordset.AbsolutePosition = frm.CurrentRecord Т.е. восстанавливаем текущую запись в рекордсете. Дай Вам бог здоровья! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2019, 13:43 |
|
|
start [/forum/topic.php?fid=45&msg=38322718&tid=1610725]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
168ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 329ms |
total: | 579ms |
0 / 0 |