Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Как актуализировать высчитываемое поле


Автор: Neuling 28.6.2006, 20:15
Есть два формуляра: главный - frm1 и подчинённый 1:n - frm2. Как сделать так, чтобы при любом изменении значений одного из полей frm2, происходила автоматическая запись суммы всех значений данного поля из формуляра frm2 в одно из полей frm1. Сумма должна не просто отображаться, а именно переписываться сразу же после изменения любого значения или добавления нового. В общем случае это может быть не только сумма, но и любая другая формула. Очевидно, что данная операция д.б. широко востребована, но мне почему-то не удалось отыскать способа её реализации. Стоит Access 97. 

Автор: Neuling 22.7.2006, 10:36
Никто не знает ответа? Или я не чётко сформулировал вопрос?
Тогда ещё одна попытка. Насколько я понимаю, Access запоминает введённые данные только при переходе к новой записи. А это означает, что для того, чтобы использовать эти вновь введённые данные для рассчёта и записи значения в какоге-либо другое поле, необходимо сначала перейти к какой-нибудь другой записи, затем вернуться назад и только после этого произвести расчёт. Мой вопрос заключается в том, можно ли обойтись без таких трюков и производить данную операцию сразу после ввода или изменения значения какого-либо поля.
Ответьте хоть кто-нибудь, а то программирование искусственного интеллекта застопорилось:-) 

Автор: dionisiu 5.9.2006, 12:05
каждая форма имеет рекордсет, который может быть представлен просто таблицей либо запросом на выборку/объединение, причём иногда с параметрами/условиями/сортировкой. подчинение форм происходит по одному/нескольким полям или может отсутствовать.

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

Автор: Akina 5.9.2006, 12:53
Насколько я понимаю, поле главной формы не привязано к рекордсету-источнику данных этой формы - иначе теряется смысл действа.

А коли так - нужно просто обработать событие Change поля подчиненной формы и обновить содержимое нужного поля главной формы.

Автор: Neuling 5.9.2006, 19:30
Чтобы было более понятно, я вот сделал маленький http://www.arbuz.de/ftp/Primer.zip . Требуется, чтобы сразу после любых изменений или новых записей поля "Prihod", высчитывалась сумма их значений и записывалась в соответствующее поле "Summa" (разумеется, для каждого ID отдельно). Как это можно сделать?

Автор: Akina 5.9.2006, 23:48
Neuling
Теперь вопрос понятен.

Настоятельная рекомендация - немедленно отказаться от подобного подхода. Рекомендую воспользоваться поиском и понять что такое нормализация баз данных. Переопределенные данные - потенциальный источник разрушения логической целостности данных. 

Применительно к примеру - таблица сумм не должна существовать вообще, а сумма по категориям должна считаться именно в тот момент, когда она нужна - динамическим либо статическим запросом.

Автор: Neuling 6.9.2006, 10:26
Спасибо, Akina.
Мне не нравится то, что высчитываемые поля, особенно если их много или формулы достаточно сложны,- появляются со значительной задержкой и создают впечатление тормознутости программы. Для контроля целостности данных достаточно сделать индикатор, появляющийся в случае, если по какой-то причине сумма, например окажется не равной составляющим слагаемым.

Автор: Akina 6.9.2006, 10:34
Цитата(Neuling @  6.9.2006,  11:26 Найти цитируемый пост)
высчитываемые поля, особенно если их много или формулы достаточно сложны,- появляются со значительной задержкой 

??? у тебя каков объем данных? сотни тысяч записей? миллионы? потому что если это наблюдается на 10 тыс. записей - явно где-то косяк. 

Автор: Neuling 6.9.2006, 15:06
Это заметно даже если запись всего одна. Всегда можно отличить высчитываемое поля от поля с постоянным значением, поскольку всегда заметна небольшая задержка. Если таких полей достаточно много и формулы достаточно сложны, то задержка явно бросается в глаза. В случае табличных форм, когда производится расчёт сразу для множества записей, задержка становится ещё более заметной. Разумеется многое зависит и от мощности самого компьютера, но в этом случае я ориентируюсь на худший вариант. Всегда наблюдал такие эффекты на самых разных программах и думаю "косяки" здесь ни при чём. В качестве примера задержки,- я реализовывал функцию, когда по адресу клиента или его телефонному коду должны высчитываться и отображаться расстояния до десяти фиксированных аэропортов. В исходной таблице с координатами населённых пунктов и с их телефонными кодами около 16000 записей и задержка при отображении расстояний составляет от 1 до 2 сек в зависимости от мощности компьютера.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)