Приклад обчислення загальної суми в таблиці бази даних 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 встановити опцію goEditing = 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, яке є ключовим полем. Це поле є лічильником. При додаванні нового запису значення в цьому полі формується автоматично.
Спочатку потрібно викликати редактор полів (“Fields Editor…”) компонента ADOTable1 з контекстного меню (рис. 11).
Рис. 11. Виклик редактора полів компонента ADOTable1
Відкриється вікно Form1.ADOTable1. У цьому вікні, з допомогою мишки, потрібно викликати контекстне меню. У контекстному меню вибрати команду «Add All fields».
У результаті вікно редактора прийме вигляд, як показано на рисунку 12.
У редакторі полів відображаються усі поля таблиці Worker. Щоб видалити поле ID_Worker потрібно на рядку ID_Worker зробити клік правою кнопкою «миші» і в контекстному меню вибрати команду Delete. Після цього можна закрити редактор Form1.ADOTable1.
У результаті, в таблиці 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 := 'Сума: ' + FloatToStrF(sum, ffFixed, 8, 2); StaticText2.Caption := 'Середня зарплата: ' + FloatToStrF(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.
- Запуск додатку на виконання.
Тепер можна запустити додаток на виконання.
Подібні статті: