Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / При обновлении формы методом Requery объект RecordSet уничтожается. / 18 сообщений из 18, страница 1 из 1
18.04.2017, 09:20
    #39439981
Python of Jungle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При обновлении формы методом Requery объект RecordSet уничтожается.
Доброго дня.
Есть две таблицы 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
18.04.2017, 12:08
    #39440127
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При обновлении формы методом Requery объект RecordSet уничтожается.
Python of Jungle,
очень подробно описано КАК Вы что-то делаете,а вот про то ЧТО именно ...???
...
Рейтинг: 0 / 0
18.04.2017, 12:21
    #39440136
Python of Jungle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При обновлении формы методом Requery объект RecordSet уничтожается.
Хм ))) Извините, не понял вопроса.
Нужно на главной форме иметь две подчиненные формы, таблицы которых связаны между собой. При перемещении курсора в первой форме нужно, чтобы вторая форма обновлялась, отбирая записи, связанные с активной строкой первой формы. Для этого используется событие OnCurrent в первой форме и вызывается метод Requery второй формы.
Кроме того, хотелось оставить возможность пользователю интерактивно (нажатием del или кнопки на панели) удалить строку из первой таблицы с каскадным удалением всех связанных строк второй таблицы. Но при таком каскадном удалении источник данных (Recordset) второй подчиненной формы уничтожается. Если убрать реакцию на событие OnCurrent, уничтожения не происходит.
Собственно, вопрос - почему так выходит и как этого избежать.
...
Рейтинг: 0 / 0
18.04.2017, 14:11
    #39440217
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При обновлении формы методом Requery объект RecordSet уничтожается.
Python of Jungle,
а каков RecordSource "главная" формы и как она связана с подчиненными? (наивный вопрос)
...
Рейтинг: 0 / 0
18.04.2017, 14:21
    #39440224
Python of Jungle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При обновлении формы методом Requery объект RecordSet уничтожается.
sdku,

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

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

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

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

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

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

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

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


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