Vvmebel.com

Новости с мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Обновление формы access vba

Обновление данных в формах и элементах управления

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

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

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

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

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

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

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

Замечание

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

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

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

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

Обновление данных в формах и элементах управления

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

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

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

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

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

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

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

Замечание

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

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

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

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

12.5 Работа с формами Access из VBA (объект Form )

Объект Access.Form, работа с формами Access средствами VBA, открытие формы Access, работа с элементами управления на форме Access

Один из важнейших элементов Access, который широко используется в приложениях — это формы. Формы Access предназначены для того же, для чего и обычные формы VBA — это прежде всего контейнеры для графических элементов управления. Но устройство форм Access, их функциональные возможности, приемы работы с ними и даже наборы элементов управления, которые на них можно размещать, сильно отличаются от привычных нам форм VBA, которые можно использовать в Word и Excel.

Читать еще:  Как удалить майкрософт офис полностью

Формы Access используются:

  • Для редактирования записей в таблицах базы данных Access и внешних источников данных. Для того, чтобы создать такие формы, вообще не нужно никакого программирования — достаточно создать форму в режиме конструктора или воспользоваться мастером создания форм. Подключиться к внешнему источнику данных (например, базе данных SQL Server или Oracle) можно, воспользовавшись в Access меню Файл ->Внешние данные ->Связь с таблицами.
  • Как панели управления вашего приложения. Очень часто в приложении на основе Access создается начальная форма, которая открывается при запуске этого приложения. На этой формы предусмотрены кнопки и другие элементы управления для вызова других форм, отчетов, макросов, выхода из приложения и выполнения прочих операций. После закрытия других форм управления опять передается начальной форме.
  • Просто для предоставления пользователю возможности выполнения любых действий. Например, форму можно использовать для выбора пользователем параметров отчета, выгрузки данных во внешнее приложение (например, Excel) и т.п.

Как работать с формами Access из VBA?

Первое, что необходимо сказать — для работы с формами во многих ситуациях нам придется использовать общий объект AccessObject, который представляет в Access не только формы, но и таблицы, макросы, модули, отчеты и множество других элементов. Поскольку этот объект — универсальный, то, конечно, большой помощи от Intellisense — подсказки в редакторе VBA у нас не будет. Обратиться к объекту формы можно через коллекцию AllForms, которая доступна через объекты CodeProject и CurrentProject. Например, получить информацию о всех формах в базе данных Access можно так:

Dim oA As AccessObject

For Each oA In CurrentProject.AllForms

Если вы будете обращаться к формам в коллекции AllForms по индексу, обратите внимание, что нумерация форм в этой коллекции начинается с 0. Обращаться к элементам в этой коллекции можно и по имени:

Специальное свойство IsLoaded определяет, открыта ли эта форма (то есть загружена ли она в оперативную память).

Программным образом формы можно найти и другим способом. Все открытые формы Access автоматически помещаются в коллекцию Application.Forms и представляются в виде объекта Form. Это — уже нормальный объект, свойства которого соответствуют свойствам формы, доступным через графический интерфейс. Например, если форма Форма1 открыта, получить информацию о ее ширине можно так:

Debug.Print Application.Forms(«Форма 1»).Width

Это свойство можно использовать и для изменения ширины формы, но для этой цели рекомендуется использовать метод DoCmd.MoveSize(), который изменяет размеры активного объекта (например, нашей формы, если она активна):

DoCmd.MoveSize Width :=10000

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

Как можно открыть форму?

Первое, что нужно сказать — если в Word или Excel нам обязательно потребуется открыть форму программным способом, то в Access это совсем необязательно. Можно открыть форму и вручную из окна базы данных (см. рис. 12.1). Из этого же окна обычно производится создание новых форм или изменение существующих.

Рис. 12.1 Окно для работы с формами в Access

Еще один часто используемый способ — просто запускать форму при открытии базы данных Access. Для этого в меню Сервис нужно выбрать Параметры запуска и выбрать нужную форму в списке Вывод формы/страницы. Если при этом вы уберете все остальные флажки, то приложение при открытии приложение может выглядеть так, как показано на рис. 12.2:

Рис. 12.2 Все лишние возможности Access спрятаны от пользователя

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

Если все-таки нужно открыть форму программным способом (например, из другой формы), то для этой цели можно использовать метод DoCmd.OpenForm(). В самом простом варианте этот метод просто принимает параметр с именем формы:

Если же форма уже открыта, то этот метод, конечно, не открывает форму заново, а просто активизирует ее. Метод DoCmd.OpenForm() принимает также несколько необязательных параметров, при помощи которых вы можете настроить фильтр на отображение записей в форме, режим открытия формы (например, модальность) и т.п. Закрытие формы производится при помощи метода DoCmd.Close(). Если же вам нужно просто спрятать форму, чтобы сохранить введенные на ней пользователем значения и отобразить их при следующем показе, можно просто сделать форму невидимой, назначив ее свойству Visible значение False.

Форма нам обычно нужна не сама по себе, а как контейнер для расположенных на ней элементов управления. Обычно элементы управления программным способом создавать не требуется — намного проще и удобнее поместить их на форму в режиме конструктора для формы. В наборе элементов управления для формы предусмотрены как знакомые нам элементы управления — текстовые поля, надписи, кнопки, флажки и переключатели, так и новые элементы — свободная и присоединенная рамки объектов, разрывы страниц, подчиненные формы/отчеты и т.п. В верхнем правом углу Toolbox в конструкторе формы Microsoft Access находится специальная кнопка Мастера. Если она нажата, то добавление на форму привычных элементов управления (например, кнопки) приведет к появлению окна мастера, который попытается помочь вам автоматически сгенерировать нужный код VBA для этого элемента управления (см. рис. 12.3)

Рис. 12.3 Мастер создания кнопок

Можно использовать генерируемый мастером код как заменитель макрорекордера (которого в Access нет), чтобы понять, как можно выполнить те или иные действия.

Для чего используются нестандартные (по отношению к обычным формам VBA) элементы управления:

  • Свободная рамка объекта — возможность разместить на форме OLE-объект (например, документ Word, лист Excel, презентация PowerPoint, рисунок, звукозапись или видеоклип), который может быть встроен в базу данных Access (но не помещен в таблицу!) или находиться во внешнем по отношению к базе данных Access файлу.
  • Присоединенная рамка объекта — то же самое, за исключением того, что он применяется для работы с объектами OLE, которые хранятся в таблицах внутри баз данных Access или внешнего источника данных. Это — самый удобный способ генерации отчетов в Word.

Например, предположим, что в нашей базе данных Access находится таблица с тремя столбцами, как показано на рис. 12.4.

Рис. 12.4 Таблица для хранения шаблонов Word

В столбце File у нас хранятся шаблоны Word, которые используются для генерации отчетов. Мы помещаем на форму элемент управления Присоединенная рамка объекта с именем WordTemplate. После этого все, что нужно для создания файла Word на основе шаблона из базы данных, у нас уже есть. Для кнопки, по нажатию на которой будет формироваться отчет, можно использовать следующий код:

‘Получаем ссылку oFrame на объект присоединенной рамки на форме

Dim oFrame As BoundObjectFrame

Set oFrame = oForm.Controls(«WordTemplate»)

‘При помощи метода DLookup () скачиваем в него значение столбца File из таблицы

‘Templates, где номер строки (значение столбца Num ) равно 1

oFrame = Application.DLookup(«[File]», «Templates», «[Num] = 1»)

‘Открываем объект в отдельном окне приложения — то есть создаем

‘документ Word на основе шаблон, загруженного в рамку объекта на форме

‘Активизируем объект приложения

‘Получаем ссылку на Word в переменную oWord

Dim oWord As Word.Application

Set oWord = GetObject(, «Word.Application»)

‘Получаем ссылку на созданный нами документ

Dim oDoc As Word.Document

Set oDoc = oWord.ActiveDocument

‘Дальше работаем средствами Word, например, вставляем нужный текст

Читать еще:  Офис 365 скачать крякнутый

‘в места, отмеченные закладками

Конечно же, правильнее будет при этом сделать эту присоединенную рамку объекта на форме изначально невидимой — чтобы пользователь не мог этот объект активизировать по собственной инициативе.

  • Элемент управления Разрыв страницы — определяет начало нового экрана формы.
  • Подчиненная форма/отчет — используется для размещения на форме подчиненных форм, таблиц или отчетов.

Как уже говорилось, программным способом элементы управления в форме Access приходится создавать редко. Если на форме вам нужен переменный набор элементов управления, то правильнее будет с самого начала создать все нужные элементы управления и по необходимости делать их то видимыми, то невидимыми. Тем не менее создать программным способом элементы управления на форме тоже можно. Эта операция выполняется при помощи метода Application.CreateControl(), который принимает множество параметров — имя формы, на которой создается элемент управления, тип элемента управления, его месторасположение на форме и т.п.

Обращение к значениям элементов управления на форме производится через коллекцию Controls, которая умеет работать с именами элементов управления:

MS ACCESS — — — обновить все через VBA

Как мне обновить все через vba? Я хочу обновить все открытые формы.

3 Ответа

Причина, по которой @CodeSlave’s answer , вероятно, не сделал то, что вам нужно, заключается в том, что метод VBA вам нужен requery, а не refresh. Обновление будет отображать изменения, внесенные в существующие записи, но только requery будет отображать новые добавленные записи.

Вот более сжатая версия кода (поместите это в модуль, чтобы вы могли вызвать его из любой формы):

NOTE: к сожалению, requery имеет побочный эффект потери выбранной в данный момент записи. Это может быть особенно неприятно для использования, если есть длинный список записей, так как им, возможно, придется прокрутить вниз длинный путь, чтобы найти запись, которую они ранее просматривали.

А как насчет чего-то вроде этого?

В комментарии выше вы говорите::

Я бы хотел, чтобы новый альбом просто добавили к таблица, которая будет доступна в этой форме когда я вернусь к нему

Возможно,вы захотите изучить событие Activate. Но мне неприятно запрашивать форму, если вы не знаете наверняка, что записи были добавлены. Я ожидаю, что если бы мне нужно было сделать это (на самом деле я никогда этого не делал-мои пользователи знают о Shift-F9, где это уместно, но большинство из них никогда не нуждаются в этом), я бы использовал событие OnActivate и проверил текущее количество записей и только запросил форму, если количество не соответствует текущему набору записей.

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

Похожие вопросы:

Я надеялся сделать простую форму в базе данных MS Access 2010, где пользователь может выбрать тему для использования. Как изменить тему базы данных через vba? Google не очень помог с этим вопросом.

Мне определенно нравится MS Access как RAD-инструмент для небольших приложений, управляемых данными. Но одна вещь, которую мне действительно не хватает как .Net-разработчику, — это регулярные.

Я ищу код VBA для запуска нескольких сохраненных импорта в MS Access 2010. Я использовал DoCmd.RunSavedImportExport * , но дал ошибку. Я знаю, что делаю что-то неправильно здесь. Пожалуйста.

Как я могу связать таблицу из одной базы данных MS Access (*.МБР или *.accdb) к другой базе данных Access в VBA? В основном я просто должен был использовать VBA для репликации того, что делает.

Мне нравится индексировать содержимое (таблицы) и код (VBA, просмотр запросов) нескольких файлов MS Access, предпочтительно на машине, на которой не установлен MS Access. Я использовал.

Как я могу отправить email через учетную запись, используя MS Access VBA? Я знаю, что этот вопрос туманен, но так трудно найти соответствующую информацию в интернете, которая не устарела в некотором.

Это действительно раздражает. В MS Access VBA должен быть linebreak и отладка, однако он всегда проходит через мой код, не задевая ни одного из моих разрывов. Есть ли где-то место, где мне нужно.

Кто-нибудь знает процедуру VBA, которая автоматически связывает и обновляет связанные таблицы Postgres (через ODBC) в MS-Access 2010? Это потому, что я ищу DSN-менее соединение, чтобы сделать вещи.

как я могу обновить любое значение поля через код VBA в ms access. когда я ввожу значения в combobox. некоторые поля в соответствующих таблицах обновляются по мере ввода данных. тогда как.

Я новичок в MS Access и хотел бы ввести EmployeeID в текстовое поле 1 (text_in), и после нажатия кнопки запрос результата (одно уникальное значение, например, имя сотрудника, взятое из таблицы).

Обновление формы access vba

INSERT, UPDATE и DELETE — управление данными в таблицах прямым выполнением SQL инструкций.

В дополнение к DAO или ADO, Access предоставляет способ «прямого» управления данными в таблице прямым выполнением команд SQL — добавить данные (INSERT), обновить данные (UPDATE) и удалить данные (DELETE). Можно легко написать приложение, которое не будет использовать ни DAO, ни ADO, следовательно никаких «заморочек» со этими ссылками при распространении приложения на другие компьютеры сети у Вас не будет (конечно, источники записей форм должны быть связаны с таблицами).

С другой стороны, хотя это будет вполне работоспособно, но слишком опрометчиво использовать прямое выполнение команд SQL в мультипользовательской среде, однако для сохранения различных настроек приложения подойдет вполне. Причем, никакой разницы нет — в линкованных таблицах сохраняются значения или в локальных.

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

У Access’a имеется метод .Execute, которому и требуется передавать заранее собранную SQL-строку для выполнения.

SQL [es kju:’el], [‘si:kwel] Structured Query Language: язык структурированных запросов, язык SQL. Вот не поленился и даже в транскрипции написал — как хотите, так и говорите. Указал специально, чтобы при чтении статьи у Вас закрепилось внутреннее произношение 😉

В принципе, инструкции SQL, человеку более, менее понимающему английский язык, понятны сразу, вот только реализация всегда кроется в тонких и не всегда очевидных деталях. Освещению таких деталей я и посвятил статью.

Сначала возьмем очень простой пример. Допустим, у нас есть справочная таблица tblРайоны, состоящая из всего двух полей:

КодРайона тип Счетчик

Район тип Текстовый

И у нас имеется форма, с текстовым полем txtРайон, значение из которого необходимо добавить (INSERT) в таблицу:

Код очень простой — сначала формируем текстовую строку и передаем ее методу .Execute:

Dim strSQL As String
‘ процедура добавления в таблицу нового района
strSQL = «INSERT INTO tblРайоны([Район]) VALUES » & _
«(‘» & Me.txtРайон.Value & «‘);»
CurrentDb.Execute strSQL

Сразу хочу обратить пристальное внимание на проверку передаваемого значения на NULL, если передать NULL (поле txtРайон не заполнено пользователем), то метод выполнится как ни в чем не бывало, но изменений в таблице tblРайоны не произойдет (не удивляйтесь потом, что ничего не работает ;).

Поэтому сразу будем делать правильно:

Dim strSQL As String
‘ процедура добавления в таблицу нового района
If Not IsNull(Me.txtРайон.Value) Then
strSQL = «INSERT INTO tblРайоны([Район]) VALUES » & _
«(‘» & Me.txtРайон.Value & «‘);»
CurrentDb.Execute strSQL

Читать еще:  Как перезапустить приложения офиса 2020

Else
MsgBox «Вы должны заполнить поле [Район]», vbExclamation, «Не указан район»
End If

Вот теперь и проверяем на NULL, заодно и пользователя целенаправленно предупреждаем.

Как видно из примера, полем типа Счетчик (КодРайона) мы управлять не можем, да и не надо нам это, Access самостоятельно управляет этим полем (автоматом наращивает значение).

Теперь начнем удалять (DELETE) запись из таблицы

Dim strSQL As String
strSQL = «DELETE [Район] from tblРайоны WHERE [Район] = » & Me.txtРайон.Value & «;»
CurrentDb.Execute strSQL

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

Лично я вижу удаление так: в форме создаем список из двух столбцов (первый столбец скрываем, зачем код записи пользователю видеть-то?), связанный с таблицей tblРайоны и где-нибудь рядом кнопку [Удалить], на событие [Нажатие кнопки] которой вешаем код

Dim strSQL As String
‘ процедура удаления из таблицы выбранного в списке района
If Not IsNull(Me.lstРайон.Column(0)) Then
strSQL = «DELETE [Район] from tblРайоны WHERE [КодРайона] = » & Me.lstРайон.Column(0) & «;»
CurrentDb.Execute strSQL
‘ обновим список
Me.lstРайон.Requery
Else
MsgBox «Выберите район из списка для удаления», vbExclamation, «Не выбран район»
End If

Мы считываем из первого столбца списка lstРайон.Column(0) (нумерация столбцов в списках всегда начинается с 0) код записи, однозначно определяющий удаляемую запись в таблице и передаем ее инструкции за удаление.
Проверка на NULL заодно позволяет предотвратить ошибку, когда вообще строка в списке районов не выделена. Обратите внимание на обновление списка районов после удаления записи — пользователю приятно видеть, что выбранный район пропал ;).

Обычно я рисую список, текстовое поле (для указания новых или обновляемых значений) прямо над ним и три кнопки рядом со списком [Добавить], [Обновить], [Удалить]. Думаю, с реализацией таких интерфейсов у Вас не должно быть никаких проблем.

Заметьте, что Access автоматически удалит и поле счетчика КодРайона, что логично — сам наращивает, пусть сам и удаляет.

Строку на удаление можно подать и так:

strSQL = «DELETE * from tblРайоны WHERE [КодРайона] = » & Me.lstРайон.Column(0) & «;»

Звездочка (*) означает ВСЁ — всё, что есть в этой записи. Этот способ удаления отлично действует, когда полей в записи много — нет нужды указывать каждое удаляемое поле.

Ну и последний кит — инструкция на обновление (UPDATE)

Dim strSQL As String
‘ процедура обновления соответствующей записи в таблице
If Not IsNull(Me.txtРайон.Value) And Not IsNull(Me.lstРайон.Column(0)) Then
strSQL = «UPDATE tblРайоны SET [Район] = ‘» & Me.txtРайон.Value & «‘ WHERE [КодРайона] = » & Me.lstРайон.Column(0) & «;»
CurrentDb.Execute strSQL
‘ обновим список
Me.lstРайон.Requery
Else
MsgBox «Выделите район из списка, реквизиты которого необходимо изменить», vbExclamation, «Не выбран район для изменения»
End If

Раз у нас инструкция на обновление — необходимо проверять как поле txtРайон, в котором указано новое значение, так и строку в списке lstРайон (выбрана ли?). И, конечно, списочек обновить, чтобы изменения показать.

Вначале я рассмотрел простые примеры, чтобы Вы сразу не убежали ;). Теперь займемся плотнее — усугубим примеры управлением несколькими полями записи. Принцип абсолютно такой же, просто к написанию инструкции надо подойти немного тщательнее.

Теперь увеличим размер таблицы tblРайоны:

КодРайона тип Числовой

НаимПодразд тип Текстовый

ИндексПодразд тип Текстовый

ГородПодразд тип Текстовый

УлицаПодразд тип Текстовый

ДомПодразд тип Текстовый

КомПодразд тип Текстовый

ТелефонПодразд тип Текстовый

ПрефиксПротПодразд тип Текстовый

ПрефиксКвитПодразд тип Текстовый

НачальникПодраздЗвание тип Текстовый

НачальникПодраздФИО тип Текстовый

НачальникРУВДРайона тип Текстовый

РайонПоУмолчанию тип Числовой

Внушает ? Будем работать теперь с ней:

В этом примере мы сами управляем полем кода подразделения — с помощью агрегатной функции DMax вычисляем максимальное значение в столбце кодов таблицы tblРайоны и прибавляем единицу. Практически то же самое делает Access (если поле типа Счетчик), но есть большая разница, если мы удалим подразделение, то код удаленного подразделения Access повторно использовать не будет!. Объясню на пальцах: у нас было создано подразделение с автоматическим присвоением (счетчиком) кода с цифрой 3, потом мы его удалили, так вот, логично было бы следующему подразделению присвоить освобожденную цифру 3, нет Access присвоит уже цифру 4. Чтобы не допустить напрасного расходования кодов (и пропусков в списке) я и решил взять автоматическое присвоение кодов на себя.

Обратите внимание мы проигнорировали поле РайонПоУмолчанию. Ну проигнорировали и проигнорировали — значит туда ничего не будет записано.

Рекомендую оформлять такие длинные примеры именно по приведенной мною схеме — легче будет понять пример и выявить ошибку.

Процедура удаления записи с любым значением полей уже становится тривиальной 😉

Dim strSQL As String

‘ процедура удаления из таблицы выбранного в списке подразделения
If Not IsNull(Me.lstПодразд.Column(0)) Then
strSQL = «DELETE * from tblРайоны WHERE [КодРайона] = » & Me.lstПодразд.Column(0) & «;»
CurrentDb.Execute strSQL
‘ обновим список
Me.lstПодразд.Requery
Else
MsgBox «Выберите подразделение из списка для удаления», vbExclamation, «Не выбрано подразделение»
End If

К слову, если подать на выполнение такую строку:

strSQL = «DELETE * from tblРайоны;»

то ВСЕ записи в таблице будут удалены! Мы использовали удаление без всяких условий и получим пустую таблицу. Иногда и это нужно 😉

Вот примерчик на обновление записи:

Опять в коде выше игнорируем поле РайонПоУмолчанию, у нас для него припасена отдельная команда:

CurrentDb.Execute «UPDATE tblРайоны SET [РайонПоУмолчанию] = ‘» & Me.lstПодразд.Column(0) & «‘;»

что произойдет? во ВСЕ записи таблицы в поле РайонПоУмолчанию добавится значение из первого столбца списка lstПодразд. Но это то, мне и нужно было, если Вам необходимо обновить поле только в определенной записи, дополните эту инструкцию SQL условием WHERE.

Т.е. мы запросто можем обновлять и сразу весь столбец таблицы — поле во всех записях таблицы сразу!

Раньше мы заранее формировали инструкцию SQL в переменной strSQL, а в этом примере скармливаем методу .Execute непосредственно. Никаких различий в исполнении не будет, но, уверяю Вас, формирование строки заранее в переменной удобнее — можно посмотреть составленную инструкцию SQL командой MsgBox strSQL (перед передачей ее на выполнение) или распечатать ее для анализа в окне Immediate в режиме пошаговой отладки — ? strSQL. И с точки зрения оформления кода использование переменных более «правильно» ;).

А если нам сначала надо проверить, есть ли такая запись в таблице, и если есть, тогда обновить, а если нет, тогда добавить новую запись? Нет проблем, все решается тривиально:

Сначала мы пытаемся найти с помощью функции DLookup найти запись с искомым значением поля КодНарушения и если получаем NULL (функция DLookup вернула NULL), тогда удовлетворяющего значения поля не найдено — переходим к добавлению новой записи, иначе, если поле с таким значением в таблице где-то есть, переходим к обновлению. От функции DLookup нам требуется лишь подтверждение — найдено или нет искомое значение в указанном поле таблицы (конечно, искать необходимо только по полю с уникальными значениями (КодНарушения), чтобы избежать неоднозначности.

Засим откланиваюсь и надеюсь, что пелену тумана над непонятными инструкциями SQL немного развеял. Если что-нибудь интересное встречу или вспомню, обязательно добавлю. Теперь Ваше время экспериментировать — в инструкциях SQL удивительно сочетаются и мощь и удобство и простота. Не забывайте заглядывать в справочную систему 😉

Ссылка на основную публикацию
Adblock
detector