Пример вычисления общей суммы в таблице базы данных Microsoft Access без использования SQL-запроса
Бывают случаи, когда в таблице базы данных нужно посчитать сумму числовых значений некоторого столбца. Для этого существуют разные методы вычисления, один из которых базируется на использовании соответствующего SQL-запроса.
В данной задаче, на примере таблицы Microsoft Access, вычисляется общая сумма без использования SQL-запроса. Дополнительно вычисляется среднее арифметическое значений ячеек заданного столбца.
Используя данный пример, можно создавать любые числовые вычисления над множеством записей заданного столбца.
Условие задачи
Дана таблица, сформированная средствами СУБД Microsoft Access. Таблица содержит данные с начисленной заработной платой сотрудников.
Таблица имеет следующую структуру.
Сразу после загрузки, приложение должно вычислять общую начисленную сумму и среднее арифметическое. Результат нужно выводить в компоненты типа TStaticText.
Решение
Создать приложение как Windows Forms Application.
Сохранить проект под любым именем.
- Создание формы.
Разместить на форме следующие компоненты (рис. 1):
– из вкладки “dbGo” компонент TADOConnection. Создается объект с именем ADOConnection1;
– из вкладки “Data Access” компонент TDataSource. Создается объект с именем DataSource1;
– из вкладки “dbGo” компонент типа TADOTable. Создается объект с именем ADOTable1;
– из вкладки “Data Controls” компонент типа TDataGrid. Создается объект с именем DBGrid1;
– из вкладки “Additional” три компонента типа TStaticText. Создаются объекты с именами StaticText1, StaticText2.
В компоненте StaticText1 будет выведена общая сумма.
В компоненте StaticText2 будет выведена средняя заработная плата (среднее арифметическое).
- Подключение базы данных. Свойство ConnectionString компонента ADOConnection1.
Процесс подключения приложения к базе данных Microsoft Access подробно описан здесь.
В результате формируется строка ConnectionString в компоненте ADOConnection1 (рис. 2). В этой строке указывается тип поставщика данных и полный путь к файлу базы данных.
Рис. 2. Строка ConnectionString компонента ADOConnection1
- Настройка компонент ADOConnection1, ADOTable1, DataSource1, DBGrid1.
Чтобы отобразить таблицу базы данных, нужно настроить следующие свойства компонент:
– в компоненте ADOConnection1 свойство LoginPrompt = “false” (рис. 3) (отмена запроса имени пользователя и пароля для доступа к базе данных);
– в компоненте ADOTable1 свойство Connection = “ADOConnection1” (рис. 4);
– в компоненте DataSource1 свойство DataSet = “ADOTable1” (рис. 5);
– в компоненте DBGrid1 свойство DataSource = “DataSource1” (рис. 6);
– в компоненте ADOTable1 свойство TableName = “Worker” (рис. 7);
– в компоненте DBGrid1 из свойства Options установить опцию dgEditing = false (запрет внесения данных в ячейки таблицы непосредственно из сетки DBGrid1) (рис. 8).
Рис. 3. Свойство LoginPrompt компонента ADOConnection1
Рис. 4. Свойство Connection компонента ADOTable1
Рис. 5. Свойство DataSet компонента DataSource1
Рис. 6. Свойство DataSource компонента DBGrid1
Рис. 7. Свойство TableName компонента ADOTable1
Рис. 8. Опция dgEditing свойства Options компонента DBGrid1
- Активизация таблицы.
Для отображения данных в таблице нужно выполнить следующие действия (рис. 9):
– выделить таблицу ADOTable1;
– свойство Active = true.
После этого данные таблицы отобразятся в DBGrid1.
Рис. 9. Свойство Active компонента ADOTable1
- Настройка размеров компонент и формы.
Следующим шагом нужно настроить размеры и позиции компонент на форме, как изображено на рисунке 10.
Рис. 10. Основная форма приложения
- Скрытие поля ID_Worker в DBGrid1.
Чтобы отображаемая таблица имела корректный вид, нужно скрыть поле ID_Worker, которое есть ключевым полем. В таблице это поле является счетчиком. При добавлении новой записи значение в этом поле формируется автоматически (увеличивается на 1).
Сначала нужно вызвать редактор полей (“Fields Editor…”) компонента ADOTable1 из контекстного меню (рис. 11).
Рис. 11. Вызов редактора полей компонента ADOTable1
Откроется окно Form1.ADOTable1. В этом окне, с помощью мышки, нужно вызвать контекстное меню. В контекстном меню выбрать команду «Add All fields».
В результате, окно редактора примет вид, как изображено на рисунке 12.
В редакторе полей Form1.ADOTable1 отображаются все поля таблицы Worker. Чтобы удалить поле ID_Worker, нужно на строке ID_Worker сделать клик правой кнопкой «мыши» и в контекстном меню выбрать команду Delete. После этого можно закрыть редактор.
В результате, в таблице DBGrid1 будет отображено только два поля (рис. 13).
Рис. 13. Отображение таблицы Worker с двумя полями
- Установление фильтра вывода с двумя знаками после запятой в поле Salary.
Для того, чтобы в поле Salary корректно отображалось значение суммы (2 знака после запятой) нужно выполнить следующие действия.
Выделить компонент ADOTable1. Вызвать редактор полей “Fields Editor…” так как описано в пункте 6. В результате откроется список из двух полей Name и Salary. Выделить строку с названием Salary. В Object Inspector будет активирован объект с именем ADOTable1Salary.
Следующим шагом нужно в Object Inspector в поле “Display Format” установить значение «0.00» (рис. 14).
Рис. 14. Установление формата вывода в поле Salary объекта ADOTable1
После выполненных действий, поле Salary в таблице будет выводиться с точностью 2 знака после запятой.
- Ввод внутренних переменных.
Для сохранения данных суммы и среднего арифметического нужно ввести в текст класса формы TForm1 внутренние переменные с именами sum и avg.
Переменные вводятся в раздел private. Фрагмент кода класса TForm1 формы имеет следующий вид:
... type TForm1 = class(TForm) ADOConnection1: TADOConnection; DataSource1: TDataSource; ADOTable1: TADOTable; DBGrid1: TDBGrid; StaticText1: TStaticText; StaticText2: TStaticText; StaticText3: TStaticText; ADOTable1Name: TWideStringField; ADOTable1Salary: TFloatField; procedure FormActivate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } sum:real; // сумма avg:real; // среднее арифметическое public { Public declarations } end; ...
- Программирование события активизации формы.
Как только пользователь загрузит программу, нужно сразу рассчитать значения суммы и среднего арифметического в таблицы.
Поэтому, нужно запрограммировать событие OnActivate формы Form1. Событие OnActivate вызовется в момент активизации формы после запуска программы на выполнение.
Пример программирования события в Delphi подробно описан здесь.
В нашем случае обработчик события имеет следующий вид:
procedure TForm1.FormActivate(Sender: TObject); var f:TField; // дополнительная переменная типа «Поле» begin // 1. Проверка, есть ли записи в таблице if ADOTable1.RecordCount = 0 then exit; // 2. Отключить визуализацию в DBGrid1 ADOTable1.DisableControls; // 3. Перебор всех записей таблицы Worker // 3.1. Перейти на первую запись ADOTable1.First; // 3.2. Обнулить сумму sum := 0; // 3.3. Взять значение зарплаты из первой записи f := ADOTable1.FieldByName('Salary'); // 3.4. Цикл перебора записей в таблице // - проверка на достижение конца таблицы while ADOTable1.Eof<>true do begin // 3.4.1. Увеличить сумму sum := sum + f.Value; // 3.4.2. Перейти на следующую запись ADOTable1.Next; end; // 4. Вычислить среднее арифметическое avg := sum / ADOTable1.RecordCount; // 5. Заполнить строки типа TStaticText StaticText1.Caption := 'Сумма: ' + FloatToStr(sum, ffFixed, 8, 2); StaticText2.Caption := 'Средняя зарплата: ' + FloatToStr(avg, ffFixed, 8, 2); // 6. Включить визуализацию в DBGrid ADOTable1.EnableControls; end;
Объясним некоторые фрагменты кода.
Методы DisableControls и EnableControls отвечают за отключение и включение подключенных к набору данных (базы данных) визуальных элементов управления. Вызов метода DisableControls позволяет значительно ускорить процесс перебора записей, поскольку заставит приложение не тратить время на перерисовывание содержимого элемента управления DBGrid1 с каждым изменением записи.
Свойство
ADOTable1.RecordCount
указывает число записей в таблице.
Метод
ADOTable1.First
устанавливает активным первую запись таблицы.
Метод
ADOTable1.FieldByName()
позволяет получить объект типа TField для заданного поля. Потом в этом объекте можно получить информацию из текущей записи. В программе для доступа к значениям записей поля Salary, используется дополнительная переменная f типа TField. Чтобы прочитать значение в текущей записи поля Salary достаточно вызвать оператор
f.Value
Свойство
ADOTable1.Eof
становится равным true, если достигнут конец таблицы.
Метод
ADOTable1.Next
реализует переход на следующую запись таблицы.
Результат суммы выводится в свойстве Caption компонента StaticText1.
Значение среднего арифметического выводится в свойстве Caption компонента StaticText2.
- Запуск приложения на выполнение.
Теперь можно запустить приложение на выполнение.
Похожие статьи: