powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Отслеживание редактирования
5 сообщений из 5, страница 1 из 1
Отслеживание редактирования
    #39276318
Шпинат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня!

Прошу помочь с DSum или натолкнуть на более правильный подход. Есть форма и на ней две абсолютно идентичные ленточные субформы, нижняя для чтения, верхняя для редактирования. В каждой из них ровно 11 записей и 12 полей. Null разрешён. Редактировать можно все поля, кроме ID. Задача - понимать, произведено ли редактирование. Что уже сделано:

1. На редактируемой субформе в каждом контроле есть условное форматирование
Код: sql
1.
Nz(DLookUp("[controlname1]";"sfrm_readonly";"[ID] =" & [ID]);'')<>Nz([controlname1];'')

Так пользователю подсвечиваются отредактированные значения.

2. На редактируемой субформе есть скрытый контрол [row_check] не привязанный к таблице. В нем источник данных
Код: sql
1.
2.
3.
4.
=iif(Nz(DLookUp("[controlname1]";"sfrm_readonly";"[ID] =" & [ID]);'')<>Nz([controlname1];'');1;0) + 
 iif(Nz(DLookUp("[controlname2]";"sfrm_readonly";"[ID] =" & [ID]);'')<>Nz([controlname2];'');1;0) + 
 ...
 iif(Nz(DLookUp("[controlname12]";"sfrm_readonly";"[ID] =" & [ID]);'')<>Nz([controlname12];'');1;0)

Если в поле не 0, то я понимаю, что запись редактировалась.

3. В примечании формы есть скрытый контрол, в котором я хочу вывести 1, если хотя бы одна из записей была отредактирована, или 0 в противном случае. Перепробовал разные варианты с DSum и DMax. Сейчас там
Код: sql
1.
=DMax("[row_check]";"sfrm_for_edit")

, и он всегда даёт 0. Был ещё вариант
Код: sql
1.
=DSum("[row_check]";"sfrm_for_edit";"[row_check] > 0")

, так этот показывает то 11 (по числу записей), то null.

По-видимому, я не до конца понимаю логику этих функций. Как сделать правильно?

P. S. Конечная цель - не считать отредактированной форму, в которой пользователь что-то поменял, но потом вернул как было.
...
Рейтинг: 0 / 0
Отслеживание редактирования
    #39276429
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы полностью взял управление в "ручной режим", например так:
...
Рейтинг: 0 / 0
Отслеживание редактирования
    #39276440
Что такое "sfrm_readonly" и "sfrm_for_edit"? Таблицы?
"controlname1" - имена контролов на форме совпадают с именами полей в таблице?

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

В форме не может быть несколько редактируемых записей. Как только вы переходите с редактируемой записи на другую - изменения сохраняются.
ШпинатПрошу помочь с DSum или натолкнуть на более правильный подход!
У полей формы, связанных с источником, св-во OldValue возвращает исходное значение в источнике, которое можно сравнить с текущим значением. Вместо многократного использования DLookup можно прямо в модуле формы (ну или в общем модуле) нарисовать функцию, сравнивающую эти значения у указанного поля или у всех полей формы в цикле.
...
Рейтинг: 0 / 0
Отслеживание редактирования
    #39276474
Шпинат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PredeclaredЯ бы полностью взял управление в "ручной режим"Не понял. Поля в форме для редактирования и так редактируются пользователем вручную.
Анатолий ( Киев )Что такое "sfrm_readonly" и "sfrm_for_edit"? Таблицы?Это имена субформ. Каждая из них имеет источником данных одноимённую таблицу. На момент открытия главной формы обе таблицы заполняются одинаковым стартовым набором данных, но одна субформа отведена для редактирования, а вторая просто показывает состояние "Как было".

Анатолий ( Киев )"controlname1" - имена контролов на форме совпадают с именами полей в таблице? Да. Кроме контрола [row_check]

Анатолий ( Киев )Функции по подмножеству работают исключительно с полями указанной таблицы (или сохраненного запроса), в т.ч. и в условии отбора. Вычисляемое поле формы ("row_check") в них использовать нельзя.Ясно. Не знал. Спасибо!

Анатолий ( Киев )В форме не может быть несколько редактируемых записей. Как только вы переходите с редактируемой записи на другую - изменения сохраняются.Это я, слава богу, понимаю.

Анатолий ( Киев )У полей формы, связанных с источником, св-во OldValue возвращает исходное значение в источнике, которое можно сравнить с текущим значением. Пробовал. После сохранения записи OldValue = Value. История не сохраняется. А мне нужно, чтобы можно было несколько разных вариантов внести, и даже после этого если введённое значение совпадает с аналогичным из нижней формы, чтобы оно помечалось как не редактированное.
Анатолий ( Киев )Вместо многократного использования DLookup можно прямо в модуле формы (ну или в общем модуле) нарисовать функцию, сравнивающую эти значения у указанного поля или у всех полей формы в цикле.Анатолий, я не хотел этого делать, т. к. надеялся, что есть способ проще и не хотел загромождать модули необязательным кодом. Если кроме VBA путей нет, буду делать на VBA. Спасибо за разъяснение!
...
Рейтинг: 0 / 0
Отслеживание редактирования
    #39276491
Шпинат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев )Вместо многократного использования DLookupНо для условного форматирования-раскраски без DLookup-ов ведь не обойтись?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Отслеживание редактирования
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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