Как сделать refresh для отдельного поля в форме access?

Последняя группа макрокоманд в рассматриваемой категории связана с обновлением данных в активных формах, таблицах и запросах. Если несколько человек в сети одновременно изменяют данные, то формы и таблицы у конкретного пользователя могут не отражать актуальных данных. Для того чтобы отображаемые данные соответствовали текущему состоянию базы данных, их необходимо обновить с помощью команды Записи, Обновить (Record, Refresh) (см. разд.Работа с записями гл. 2).

Похожая ситуация возникает даже в однопользовательском режиме, если в форме используется поле со списком, источником данных для которого является таблица или запрос. Если в исходную таблицу были добавлены записи, то в поле со списком они автоматически не появятся — нужно повторно выполнить запрос. Кроме полей со списком, к элементам управления, требующим обновления отображаемых данных, относятся также списки и элементы управления подчиненной формы, объекты OLE и вычисляемые элементы управления, содержащие статистические функции по подмножеству записей, такие как DLookUp () или DSum ().

Для того чтобы выполнить обновление записей в формах, таблицах или элементах управления, используются макрокоманды Обновление(Requery), ПоказатьВсеЗаписи(ShowAllRecords) И ОбновитьОбъект(RepaintObject).

Макрокоманда Обновление (Requery) обновляет данные в объекте базы данных путем повторного просмотра источника данных. Макрокоманда имеет один аргумент, содержащий имя объекта, который следует обновить. Если обновляется активный объект, например форма, то поле аргумента следует оставить пустым. При этом макрокоманда будет повторно выполнять запрос, указанный в свойстве Источник данных (RecordSource) этой формы.

Рассмотрим пример использования макроса для обновления данных. В форме «Клиенты» (Customers) есть поле со списком «Страна» (Country). Источником данных для этого поля является запрос, который выбирает значения из поля «Страна» (Country) таблицы «Клиенты» (Customers):

 SELECT DISTINCT Клиенты.Страна FROM Клиенты; 

Если при вводе клиента в таблицу добавляется новое название страны, то в списке эта страна не появится, поскольку запрос будет выполнен повторно только при следующем открытии формы. Чтобы провести обновление списка стран раньше, следует назначить событию После обновления (After Update) формы макрос Клиенты.Обновление списка стран, который состоит из одной макрокоманды Обновление (Requery) со значением аргумента «Страна» (Country) (рис. 11.18).

Рис. 11.18. Назначение макроса событию формы После обновления

Замечание

Макрокоманда Обновление (Requery) обновляет только один объект, поэтому если в форме существуют элементы управления, требующие обновления отображаемых данных, и в макросе, назначенном этой форме, используется макрокоманда Обновление (Requery) с пустым значением аргумента, то обновляться будут только записи в форме. Для каждого такого элемента управления нужно использовать отдельную макрокоманду. Если эта макрокоманда в качестве аргумента содержит имя элемента управления, то при ее выполнении обновляется только данный элемент. Записи в самой форме не обновляются.

С помощью макрокоманды Обновление (Requery) можно обновлять данные и в неактивной форме, точнее, не в той форме, которой назначен макрос. Однако в этом случае сначала необходимо выполнить макрокоманду ВыделитьОбъект(SelectObject), которая перенесет фокус на нужную форму, чтобы ее активизировать (потом фокус можно вернуть обратно).

Макрокоманда ПоказатьВсеЗаписи (ShowAllRecords), как уже отмечалось, отменяет действие фильтра и повторно просматривает источник записей. Ее часто используют для обновления данных в подчиненной форме.

Макрокоманда ОбновитьОбъект (RepaintObject) применяется только к объекту базы данных (к таблице, запросу, форме, отчету, странице, макросу и модулю) и не применяется к элементу управления. Она выполняет немедленное обновление указанного открытого объекта (если имя объекта не задано, обновляется активный объект), хотя при этом не производится повторное выполнение запроса к источнику данных. Обновление объекта не влияет на. отображение новых и удаленных записей, как это происходит при выполнении макрокоманды Обновление (Requery). Обычно макрокоманду ОбновитьОбъект (RepaintObject) применяют для отображения результатов изменения данных с помощью макрокоманд ЗадатьЗначение (SetValue), а также для повторного вычисления значений выражений в вычисляемых элементах управления.

Всем привет! В этой статье я расскажу как сделать информационное сообщение при изменении данных в базе Access.

Как сделать информационное сообщение при изменении данных в базе Access

По умолчанию, когда пользователь вводит или редактирует данные с помощью формы, программа Microsoft Access автоматически сохраняет любые внесенные изменения в таблицах, так как поля формы напрямую связаны с полями соответствующей таблицы. Если пользователь закроет форму или создаст новую запись, все внесенные ранее изменения также автоматически сохраняются. Согласитесь, было бы удобно организовать работу следующим образом: пользователь открывает форму, вносит или изменяет данные. Если он закрывает форму или переходит к новой записи, система выводит информационное сообщение: «Сохранить внесенные изменения?» Если он не вносит изменения, то, соответственно, информационное сообщение не появляется. Также для удобства работы на форме можно создать кнопку «Сохранить». Данная кнопка будет неактивна при запуске самой формы. Как только будут внесены изменения, кнопка «Сохранить» становится активной.

Как это работает?

Откроем любую форму, на которой расположены кнопки «Сохранить», «Новая запись» и «Выход». Кнопка «Сохранить» не доступна.

как сделать refresh для отдельного поля в форме access

Внесем изменение в поле «Цена» (350 вместо 250). Кнопка «Сохранить» становится доступной.

как сделать refresh для отдельного поля в форме access

Если нажать кнопку «Сохранить», изменения сохранятся, кнопка «Сохранить» станет вновь недоступна. Если создать новую запись или выйти из формы, никаких информационных сообщений не появляется.

как сделать refresh для отдельного поля в форме access

Поменяем теперь код бренда на «Красота от природы».

как сделать refresh для отдельного поля в форме access

Нажмем кнопку «Выход».

как сделать refresh для отдельного поля в форме access

Если нажать «Да», внесенные изменения сохранятся, форма закроется. Если нажать «Нет», код бренда снова станет «Кислородная линия», форма закроется.

Как это сделать?

Шаг 1. Создание формы

Для того, чтобы понять как сделать информационное сообщение при изменении данных в базе Access, необходимо создать простейшую форму. Я буду использовать форму, созданную в базе данных Косметическая продукция.

как сделать refresh для отдельного поля в форме access

Если вы не знаете как создать формы в базе данных Access, то посмотрите видео ниже.

как сделать refresh для отдельного поля в форме access

Шаг 2. Добавление кнопки «Сохранить»

Переходим в конструктор форм, на панели инструментов нам понадобится инструмент «Кнопка».

как сделать refresh для отдельного поля в форме access

Мастер создания кнопок не нужен, нажимаем кнопку «Отмена».

как сделать refresh для отдельного поля в форме access

Щелкаем по созданной кнопке и набираем текст «Сохранить».

как сделать refresh для отдельного поля в форме access

Далее дважды щелкаем по кнопке, чтобы открыть окно свойств. Переходим на вкладку «Данные», пункт «Доступ» — ставим «Нет».

как сделать refresh для отдельного поля в форме access

Переходим на вкладку «Другие» и задаем имя кнопки «cmdSave»

как сделать refresh для отдельного поля в форме access

Шаг 3. Вставка VBA-кода на событие «Внесены изменения»

Переходим в свойства формы, вкладка «Событие», пункт «Внесены изменения». Нажимаем кнопку с тремя точками, выбираем пункт «Программы».

как сделать refresh для отдельного поля в форме access

VBA код:

Private Sub Form_Dirty(Cancel As Integer)      Me.cmdSave.Enabled = True  End Sub

При загрузке формы кнопка cmdSave недоступна (см. Шаг 2) (значение свойства Enabled равно False). Как только пользователь вносит или изменяет данные срабатывает событие формы «Внесены изменения» и кнопка cmdSave становится доступа (значение Enabled меняется на True).

Шаг 4. Создание булевой переменной

Для отслеживания статуса кнопки «Сохранить» (нажата кнопка или нет) создадим переменную Saved с помощью оператора Private. Для этого вставим строку Private Saved As Boolean под строкой Option Compare Database в самом верху экрана.

как сделать refresh для отдельного поля в форме access

Шаг 5. Вставка VBA-кода на событие «Нажатие кнопки»

Дважды щелкаем по кнопке «Сохранить», переходим в окно свойств, вкладка «Событие», пункт «Нажатие кнопки». Нажимаем кнопку с тремя точками, выбираем пункт «Программы».

как сделать refresh для отдельного поля в форме access

VBA код:

Private Sub cmdSave_Click()      Saved = True      DoCmd.RunCommand (acCmdSaveRecord)      Me.cmdSave.Enabled = False      Saved = False  End Sub

Если мы внесли изменения, кнопка cmdSave становится доступна (шаг 3). Когда мы нажимаем кнопку «Сохранить», булевая переменная Saved (шаг 4) получает значение True (т.е. кнопка cmdSave нажата), происходит сохранение изменений, после этого кнопка cmdSave становится снова недоступной, а переменная Saved получает значение False до тех пор пока снова не будет нажать кнопка «Сохранить».

Шаг 6. Вставка VBA-кода на событие «До обновления»

Переходим в свойства формы, вкладка «Событие», пункт «До обновления». Нажимаем кнопку с тремя точками, выбираем пункт «Программы».

как сделать refresh для отдельного поля в форме access

VBA код:

Private Sub Form_BeforeUpdate(Cancel As Integer)  Dim Response As Integer  If Saved = False Then      Response = MsgBox("Сохранить внесенные изменения?", vbYesNo, "Сохранить изменения?")      If Response = vbNo Then         Me.Undo      End If      Me.cmdSave.Enabled = False  End If  End Sub

Событие До обновления (BeforeUpdate) возникает при любом изменении данных в записи или элементе управления. Если пользователь нажмет кнопки «Новая запись» или «Выход», не кликнув перед этим на кнопку «Сохранить», то появится информационное окно «Сохранить изменения?» (MsgBox(«Сохранить внесенные изменения?», vbYesNo, «Сохранить изменения?»)). Если пользователь нажмет «ДА», то все внесенные изменения сохраняются. Если пользователь нажмет «НЕТ», произойдет отмена всех изменений (Me.Undo). Далее кнопка cmdSave снова станет не доступна независимо от того, нажал пользователь «Да» или нажал «Нет» (Me.cmdSave.Enabled = False).

как сделать refresh для отдельного поля в форме access

В данной статье мы разобрали как сделать информационное сообщение при изменении данных в базе Access.

Если вам нужна готовая база данных Access, то ознакомьтесь со списком представленным ЗДЕСЬ.
—————————————————
Полезные ссылки:
Урок 17: мастер запросов
Урок 16: запрос на создание таблицы
Урок 15: запросы с параметром
Урок 14: запросы с вычисляемыми полями
Урок 13: Как определить ГОД, КВАРТАЛ, МЕСЯЦ, ДЕНЬ НЕДЕЛИ в запросе
Урок 12: Как создать ЗАПРОС С УСЛОВИЕМ
Урок 11: Как задать условия для ТЕКСТОВЫХ полей в запросах
Уроки по SQL-запросам

26 августа 2003 года

SergeySV

1.5K / / 19.03.2003

Цитата:

Originally posted by natalia
Получилось! Получилось! Спасибо! Вот только не с первого разу, вот это то я и упустила (дура глупая): Forms!.Requery
Set rstClone = Forms!.RecordsetClone
rstClone.MoveLast
Forms!.Bookmark = rstClone.Bookmark и тут же вопрос — это дело я вставила в цикл до next i, может неправильно, а? А то записи ТО правильно добавляются, ТО их больше в два раза от того, что уникальное поле запоминается из предыдущей записи.. странно как-то… Подскажите этот момент поподробнее и эту часть кода, что она выполняет? Что за RecordsetClone? :)))

Этот кусок кода я опустил в последнем примере, потому как подумал, что для твоей ситуации он не очень критичен.

А смысл его вот какой:

Когда ты обращаешься к таблице программно напрямую (через DAO, ADO и т.д.), а в это же время эта таблица показывается в форме, то все твои изменения в таблице не будут отображены, пока ты принудительно не заставишь Access обновить выводимую таблицу в форме через метод формы — Requery.

Т.е. в твоем случае надо в конце написать:

Forms!]!.Form.Requery

И вот тут одна нехорошая такая вещь после этого происходит — записи загружаются заново и по умолчанию фокус устанавл. на первую запись. Т.е. ты добавил записи и после этого ты попадаешь на начало. Чтобы не заставлять пользователя вручную возвращаться, можно сразу добавить такой код:

DoCmd.GoToRecord ,,acLast

Но у этого метода такой недостаток, чтобы так написать, надо (ОБЯЗАТЕЛЬНО) перевести фокус на элемент (любой) этой подчин. формы., т.е. в итоге:

Forms!]!.Form.Requery

Forms!!.SetFocus
Forms!!.Form!.SetFocus
DoCmd.GoToRecord ,,acLast

Тебе такой вариант может подойти.

Но вот существуют ситуации когда переводить фокус на форму ради этого действия очень не хочется.

Например: пользователь работает с одной подч. формой (главный экран), нажимает кнопки, обрабатывает что-то, а на этой же форме, но на другой вкладке другая подчин. форма где ведется лог. И вот в этот лог надо добавить запись и перейти в конец (на последнюю запись, чтобы опять же не прокручивать всю эту форму).
Если мы будем действовать по приведенному выше коду, то у пользователя быстро переключится вид на форму с логом, добавиться запись, обновиться, перескочет на последнюю и только потом его бедного опять вернут к своей любимой форме… 🙂
Приятного мало.

Подитожу. Процесс добавления записей и Requery можно производить с неактивной (ее вообще может быть не видно) формой, а вот для того что перейти в этой НЕАКТИВНОЙ форме на последнюю запись, я и применяю этот код:

Set rstClone = Forms!.RecordsetClone
rstClone.MoveLast
Forms!.Bookmark = RecordsetClone.Bookmark

Делает он следующее.

У каждой формы есть свойство RecordsetClone, которое возвращает объект Recordset (набор записей, про него в справке лучше почитай), в котором находятся записи этой формы. По сути Recordset эта таже таблица, только в виде объекта DAO для того чтобы можно было делать всякие вещи с полями и записями как с обычными объектами в языках программирования.
В этом rstClone мы по умолчанию стоим на первой записе. Переходим на последнюю — rstClone.MoveLast
Теперь используем свойство Bookmark — закладка. Эта Bookmark для того, чтобы можно было поставить закладку, а потом быстро вернуться на нужную запись в Recordset или в форме (она тоже поддерживает закладки). Вот и мы и переходим в форме на ту же запись, что уже перешли в объекте RecordsetClone.

Это свойство Bookmark может немного смутить. У него такая хитрость:

Когда мы обращаемся (ЧИТАЕМ) к свойству -RecordsetClone.Bookmark — то оно возвращает закладку на активную запись в объекте RecordsetClone. Мы например, можем эту закладку сохранить в отд. переменной:
Dim bk as Bookmark
Set bk=RecordsetClone.Bookmark
и потом ее использовать где-нибудь дальше.

А вот когда мы присваиваем (ПИШЕМ) этому свойству RecordsetClone.Bookmark = bk другую закладку, это значит, мы меняем активную запись на ту, которая была активна, когда считывалась эта закладка (bk), т.е. просто переходим на указанную запись.

В нашем примере эти два действия сразу в одной строке получились:
Forms!.Bookmark = RecordsetClone.Bookmark

Цитата:

——

С галочкой я так поступаю, может вовсе некорректно:

Private Sub flag_Click()

If flag=True Then

Form_podForm1.pddate.Enabled = False

Else

Form_podForm1.pddate.Enabled = True

End If

End Sub

в итоге во ВСЕХ записях поле pddate становится недоступным. Как же сделать это Enabled только для той записи, в которой я ставлю галочку?

А оно и будет заблокировано во всех выводимых записях, но так пользователь не может работать сразу с несколькими, а только с одной, то как только он будет переходить к следующей записи, мы будем решать: блокировать ее или нет.

К твоему коду, надо добавить еще код обработчик событии формы Current (возникает при ЛЮБОМ переходе польз. к другой записе):

Private Sub Form_Current()

If flag=True Then
Form_podForm1.pddate.Enabled = False
Else
Form_podForm1.pddate.Enabled = True
End If
End Sub

Так что мы всегда его опередим и пользователь от нас не уйдет 🙂

Уф, вроде бы все.