|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
Доброго дня. Есть две таблицы ReportVariants и ReportSheets, связь один ко многим по ключевому полю первой таблицы ReportVariants.ID. Включено встроенное обеспечение целостности с каскадным изменением/удалением. На главной форме ReportSettings есть две подчиненные формы, соответствующие этим таблицам. Запрос на выборку данных из второй таблицы ReportSheets отображает только записи соответствующие активной записи в таблице ReportVariants. Код: sql 1. 2. 3.
Для обновления второй формы ReportSheets при изменении положения курсора для формы ReportVariants на событие ReportVariants.Form.OnCurrent установлен макрос Код: vbnet 1. 2. 3.
Неприятность происходит при интерактивном удалении строки из первой подчиненной формы ReportVariants. Вне зависимости от согласия пользователя с удалением, событие ReportVariants.Form.OnCurrent срабатывает дважды, и при втором вызове объект ReportSheets.Form.RecordSet становится равным Nothing. Все, после этого вторая подчиненная форма ReportSheets не обновится, пока форма не будет прееоткрыта, поскольку источник данных уничтожен. Как с этим бороться? Используется Access 2010 x64. Раньше Access никогда не использовал, сейчас вынужден прибегнуть именно к нему. В процессе попыток быстро пришел к выводу, что чем меньше пользоваться встроенными возможностями Access, используя обработку событий вручную на VBA, тем стабильнее будет результат. Возможно я ошибаюсь. В данном случае, для меня проще всего запретить интерактивное удаление строк и сделать то же самое запросом из макроса. Но хотелось бы узнать у специалистов, я что-то не так сделал, или это просто такой баг у самого Access. Полагаю с этим уже сто раз столкнулись, но я не нашел. База с только описанными объектами прилагается. Достаточно открыть форму ReportVariants и попробовать интерактивно удалить строку из первой таблицы. Спасибо за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 09:20 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
Python of Jungle, очень подробно описано КАК Вы что-то делаете,а вот про то ЧТО именно ...??? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 12:08 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
Хм ))) Извините, не понял вопроса. Нужно на главной форме иметь две подчиненные формы, таблицы которых связаны между собой. При перемещении курсора в первой форме нужно, чтобы вторая форма обновлялась, отбирая записи, связанные с активной строкой первой формы. Для этого используется событие OnCurrent в первой форме и вызывается метод Requery второй формы. Кроме того, хотелось оставить возможность пользователю интерактивно (нажатием del или кнопки на панели) удалить строку из первой таблицы с каскадным удалением всех связанных строк второй таблицы. Но при таком каскадном удалении источник данных (Recordset) второй подчиненной формы уничтожается. Если убрать реакцию на событие OnCurrent, уничтожения не происходит. Собственно, вопрос - почему так выходит и как этого избежать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 12:21 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
Python of Jungle, а каков RecordSource "главная" формы и как она связана с подчиненными? (наивный вопрос) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 14:11 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
sdku, Никакого. Главная форма используется только как контейнер. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 14:21 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
Python of Jungle, Как Вы её хотите использовать-это Ваши "хотелки" Ответьте себе на вопрос "как связаны (по каким поля) при этом главная и подчиненные формы? (Хоть Вы и хотите её использовать в качестве контейнера она остается "главной" по отношению к "подчиненным" и должна иметь поле связи, причем с источником ) уберите у форм автоматический размер и расположение по центру, расположите их рядом,на событие текущая запись главной формы повесьте открытие "подчиненной" с условием where полеСвязи=ID. Касаемо каскадного удаления: я бы не рекомендовал-Вы напрочь лишитесь истории ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 15:07 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
Python of Jungle, увы, твой пример у меня на текущей машине не открылся, тут есть только 2002 акс. Но я глянул на твои картинки и сделал по их мотивам пример. С твоим посылом Python of Jungleчем меньше пользоваться встроенными возможностями Access, используя обработку событий вручную на VBA, тем стабильнее будет результат. не согласен. В пример без кода демонстрируется, ИМХО, ответ на твой вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 15:49 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
правда форм там одна ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 15:50 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
sdku, Намекаете что не надо из дома выходить через окно и все будет в порядке? :) Все ваши советы разумны и я бы подписался под каждым, но вопрос не в этом. Описанная проблема для меня носит академический характер. Ее даже в текущем виде вполне можно решить, например, запретив интерактивное удаление строк и добавив кнопочку с крестиком а заодно и перехват delete. Или другим способом, не принципиально. Вопрос к знатокам Access исключительно по механизму работы. "Хотелка" заключается в желании узнать, что происходит именно в той ситуации, которая описана. Не понятно, почему когда я удаляю строку с каскадным удалением и срабатывает событие OnCurrent, то зависимый от этой строки RecordSet в момент выполнения Requery становится равным Nothing. Ну передали ему NULL, должен быть пустой результат выборки. Хоть до каскадного удаления, хоть после. Куда объект девается? Убираем реакцию на событие - объект на месте. Спасибо заранее. Насчет "нафига так извращаться", поясню, если любопытно. Читать не обязательно :)Задача стоит - сделать возможность оперативного формирования отчетов из разных БД, мало того из разных СУБД. В частности MSSQL + Firebird + MySQL. Не спрашивайте, откуда такой зоопарк :) Проще всего это сделать в Access через ODBC. Те данные, которые будут храниться непосредственно в Access принципиальной ценности иметь не будут. Это всего лишь настройки формирования отчетов. Соответственно история там нафиг не сдалась, хочет пользователь грохнуть настройки отчета со всеми связанными записями - флаг ему в руки. Насчет грамотного выстраивания иерархии форм тоже согласен, но видите ли, это я только для примера прицепил две подчиненные формы. На практике их там будет больше, причем с подчинением таблиц в три а то и четыре уровня. И все в одном окне. Плюсом там висят ListBox-ы, заполняемые из других БД, кнопочки, поля, в общем много хрени всякой. Я понимаю, что логика работы этого безобразия не совпадает с, скажем так, предполагаемой логикой работы проекта на Access. Но Access был выбран лишь как морда к другим БД. Соответственно я и делаю такой интерфейс, который будет удобен пользователю. И если ему удобно на одной форме иметь возможность настроить отчет и источники его формирования - то я и взял одну форму для контейнера. Собственно настроить взаимосвязь всей этой кухни с помощью VBA не так уж сложно, когда известно что хочешь получить. Вполне возможно, что окажется удобнее разнести настройки по разным формам, это будет видно в процессе. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 15:51 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
Панург, Форма одна, остальные внедренные... Понятия не имел, что так можно. Не сразу даже понял, как это сделано, оказалось, мастера отключить и все... Сразу надо было так сделать, мастера всякие от лукавого. Не особо их люблю, просто по первой надо хоть на примере мастера понять, что куда прописывать. А тут еще и поля по-русски все. Фигово, когда ни черта про среду не знаешь. Спасибо огромное! :) Насчет скрытого поля - фишка, однако... Вопрос сразу встречный, это нормальная практика в Access, или мерзкий костыль? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 16:06 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
Панургправда форм там одна Вам же толкуют о том,что не надо использовать подчиненные формы-одна форма с полямиСоСписком(списками) даст Вам возможность выбрать данные для формирования отчета (а Вы уверены что RS куда-то "девается"-может он просто пуст) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 16:12 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
Python of JungleВопрос сразу встречный, это нормальная практика в Access, или мерзкий костыль? да бог его знает. Работает же. Так скажем обходной манёвр с использованием штатных возможностей. Есть и другие варианты решения, но там кода немного нужно или многа, смотря на что замахиваешься и как. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 16:14 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
sdkuВам же толкуют о том,что не надо использоватьМну? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 16:17 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
sdku, Панург сделал таки подчиненные формы. Но они не отображаются в списке объектов Access. Нужна возможность добавлять строки в любую из форм, как тут полем со списком обойдешься. Оно хорошо для выбора значения. Сначала я тут еще и TreeView хотел прикрутить, но на x64 его из стандартных объектов выпилили к сожалению уже давно. А сторонние классы брать не хочется. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 16:20 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 16:33 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
Python of Jungle....Панург сделал таки подчиненные формы... а формы ли это-пусть он Вам и скажет ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 16:58 |
|
При обновлении формы методом Requery объект RecordSet уничтожается.
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 17:03 |
|
|
start [/forum/topic.php?fid=45&msg=39440224&tid=1612537]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 337ms |
total: | 486ms |
0 / 0 |