powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / При обновлении формы методом Requery объект RecordSet уничтожается.
18 сообщений из 18, страница 1 из 1
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39439981
Python of Jungle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня.
Есть две таблицы ReportVariants и ReportSheets, связь один ко многим по ключевому полю первой таблицы ReportVariants.ID. Включено встроенное обеспечение целостности с каскадным изменением/удалением. На главной форме ReportSettings есть две подчиненные формы, соответствующие этим таблицам. Запрос на выборку данных из второй таблицы ReportSheets отображает только записи соответствующие активной записи в таблице ReportVariants.
Код: sql
1.
2.
3.
SELECT ReportSheets.Name, ReportSheets.ReportID, ReportSheets.ID
FROM ReportSheets
WHERE (((ReportSheets.ReportID)=[ReportVariants].[Form].[ID]));


Для обновления второй формы ReportSheets при изменении положения курсора для формы ReportVariants на событие ReportVariants.Form.OnCurrent установлен макрос

Код: vbnet
1.
2.
3.
Private Sub Form_Current()
    Parent.ReportSheets.Requery
End Sub





Неприятность происходит при интерактивном удалении строки из первой подчиненной формы ReportVariants.



Вне зависимости от согласия пользователя с удалением, событие ReportVariants.Form.OnCurrent срабатывает дважды, и при втором вызове объект ReportSheets.Form.RecordSet становится равным Nothing.



Все, после этого вторая подчиненная форма ReportSheets не обновится, пока форма не будет прееоткрыта, поскольку источник данных уничтожен. Как с этим бороться?

Используется Access 2010 x64. Раньше Access никогда не использовал, сейчас вынужден прибегнуть именно к нему. В процессе попыток быстро пришел к выводу, что чем меньше пользоваться встроенными возможностями Access, используя обработку событий вручную на VBA, тем стабильнее будет результат. Возможно я ошибаюсь. В данном случае, для меня проще всего запретить интерактивное удаление строк и сделать то же самое запросом из макроса. Но хотелось бы узнать у специалистов, я что-то не так сделал, или это просто такой баг у самого Access. Полагаю с этим уже сто раз столкнулись, но я не нашел.

База с только описанными объектами прилагается. Достаточно открыть форму ReportVariants и попробовать интерактивно удалить строку из первой таблицы.

Спасибо за помощь.
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440127
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Python of Jungle,
очень подробно описано КАК Вы что-то делаете,а вот про то ЧТО именно ...???
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440136
Python of Jungle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм ))) Извините, не понял вопроса.
Нужно на главной форме иметь две подчиненные формы, таблицы которых связаны между собой. При перемещении курсора в первой форме нужно, чтобы вторая форма обновлялась, отбирая записи, связанные с активной строкой первой формы. Для этого используется событие OnCurrent в первой форме и вызывается метод Requery второй формы.
Кроме того, хотелось оставить возможность пользователю интерактивно (нажатием del или кнопки на панели) удалить строку из первой таблицы с каскадным удалением всех связанных строк второй таблицы. Но при таком каскадном удалении источник данных (Recordset) второй подчиненной формы уничтожается. Если убрать реакцию на событие OnCurrent, уничтожения не происходит.
Собственно, вопрос - почему так выходит и как этого избежать.
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440217
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Python of Jungle,
а каков RecordSource "главная" формы и как она связана с подчиненными? (наивный вопрос)
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440224
Python of Jungle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

Никакого. Главная форма используется только как контейнер.
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440240
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Python of Jungle,
Как Вы её хотите использовать-это Ваши "хотелки"
Ответьте себе на вопрос "как связаны (по каким поля) при этом главная и подчиненные формы? (Хоть Вы и хотите её использовать в качестве контейнера она остается "главной" по отношению к "подчиненным" и должна иметь поле связи, причем с источником )
уберите у форм автоматический размер и расположение по центру, расположите их рядом,на событие текущая запись главной формы повесьте открытие "подчиненной" с условием where полеСвязи=ID. Касаемо каскадного удаления: я бы не рекомендовал-Вы напрочь лишитесь истории
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440270
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Python of Jungle, увы, твой пример у меня на текущей машине не открылся, тут есть только 2002 акс. Но я глянул на твои картинки и сделал по их мотивам пример.
С твоим посылом
Python of Jungleчем меньше пользоваться встроенными возможностями Access, используя обработку событий вручную на VBA, тем стабильнее будет результат. не согласен.
В пример без кода демонстрируется, ИМХО, ответ на твой вопрос.
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440271
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правда форм там одна
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440274
Python of Jungle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
Намекаете что не надо из дома выходить через окно и все будет в порядке? :)
Все ваши советы разумны и я бы подписался под каждым, но вопрос не в этом.
Описанная проблема для меня носит академический характер. Ее даже в текущем виде вполне можно решить, например, запретив интерактивное удаление строк и добавив кнопочку с крестиком а заодно и перехват delete. Или другим способом, не принципиально.

Вопрос к знатокам Access исключительно по механизму работы. "Хотелка" заключается в желании узнать, что происходит именно в той ситуации, которая описана. Не понятно, почему когда я удаляю строку с каскадным удалением и срабатывает событие OnCurrent, то зависимый от этой строки RecordSet в момент выполнения Requery становится равным Nothing. Ну передали ему NULL, должен быть пустой результат выборки. Хоть до каскадного удаления, хоть после. Куда объект девается? Убираем реакцию на событие - объект на месте.

Спасибо заранее.

Насчет "нафига так извращаться", поясню, если любопытно.
Читать не обязательно :)Задача стоит - сделать возможность оперативного формирования отчетов из разных БД, мало того из разных СУБД. В частности MSSQL + Firebird + MySQL. Не спрашивайте, откуда такой зоопарк :) Проще всего это сделать в Access через ODBC. Те данные, которые будут храниться непосредственно в Access принципиальной ценности иметь не будут. Это всего лишь настройки формирования отчетов. Соответственно история там нафиг не сдалась, хочет пользователь грохнуть настройки отчета со всеми связанными записями - флаг ему в руки.
Насчет грамотного выстраивания иерархии форм тоже согласен, но видите ли, это я только для примера прицепил две подчиненные формы. На практике их там будет больше, причем с подчинением таблиц в три а то и четыре уровня. И все в одном окне. Плюсом там висят ListBox-ы, заполняемые из других БД, кнопочки, поля, в общем много хрени всякой.
Я понимаю, что логика работы этого безобразия не совпадает с, скажем так, предполагаемой логикой работы проекта на Access. Но Access был выбран лишь как морда к другим БД. Соответственно я и делаю такой интерфейс, который будет удобен пользователю. И если ему удобно на одной форме иметь возможность настроить отчет и источники его формирования - то я и взял одну форму для контейнера. Собственно настроить взаимосвязь всей этой кухни с помощью VBA не так уж сложно, когда известно что хочешь получить. Вполне возможно, что окажется удобнее разнести настройки по разным формам, это будет видно в процессе.
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440292
Python of Jungle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панург,

Форма одна, остальные внедренные... Понятия не имел, что так можно. Не сразу даже понял, как это сделано, оказалось, мастера отключить и все... Сразу надо было так сделать, мастера всякие от лукавого. Не особо их люблю, просто по первой надо хоть на примере мастера понять, что куда прописывать. А тут еще и поля по-русски все. Фигово, когда ни черта про среду не знаешь.
Спасибо огромное! :)
Насчет скрытого поля - фишка, однако... Вопрос сразу встречный, это нормальная практика в Access, или мерзкий костыль?
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440297
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панургправда форм там одна
Вам же толкуют о том,что не надо использовать подчиненные формы-одна форма с полямиСоСписком(списками) даст Вам возможность выбрать данные для формирования отчета
(а Вы уверены что RS куда-то "девается"-может он просто пуст)
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440300
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Python of JungleВопрос сразу встречный, это нормальная практика в Access, или мерзкий костыль? да бог его знает. Работает же. Так скажем обходной манёвр с использованием штатных возможностей.
Есть и другие варианты решения, но там кода немного нужно или многа, смотря на что замахиваешься и как.
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440303
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdkuВам же толкуют о том,что не надо использоватьМну?
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440306
Python of Jungle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

Панург сделал таки подчиненные формы. Но они не отображаются в списке объектов Access. Нужна возможность добавлять строки в любую из форм, как тут полем со списком обойдешься. Оно хорошо для выбора значения. Сначала я тут еще и TreeView хотел прикрутить, но на x64 его из стандартных объектов выпилили к сожалению уже давно. А сторонние классы брать не хочется.
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440320
Python of Jungle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku(а Вы уверены что RS куда-то "девается"-может он просто пуст)
К сожалению, уверен.

...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440346
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Python of Jungle....Панург сделал таки подчиненные формы...
а формы ли это-пусть он Вам и скажет
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440355
Python of Jungle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

А что это?
Access пишет "подчиненная форма/отчет"
...
Рейтинг: 0 / 0
При обновлении формы методом Requery объект RecordSet уничтожается.
    #39440387
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdkuа формы ли это-пусть он Вам и скажетА что не так? Формально это формы.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / При обновлении формы методом Requery объект RecordSet уничтожается.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]