Робота з ado в delphi

Робота з ado в delphi

Всім привіт, знову ж таки, пишу статтю про ADO. а також на прохання читача мого блогу, який попросив розповісти, як в БД можна працювати з обчислюваними полями (щоб значення обчислюваного поля відразу змінювалося, при введенні нового значення), на прикладі БД - MS Access. Я розповім 2 способи роботи з обчислювані полями, а на прикладі покажу тільки один спосіб. Ну, перший спосіб полягає в тому, що всі поля, в тому числі і обчислюється, ми створюємо відразу в БД - MS Access. причому тип даних, поля, в якому буде міняти значення - вказуємо Обчислюване поле.







Що стосується другого способу, то обчислюється поле, ми створимо в нашому проекті, через компоненти TAdoQuery або TAdoTable.

Ну і відразу скажу, що є, не дуже правильний 3 метод, при якому можна використовувати TTimer.

Давайте почнемо з нашої БД.

У мене в БД має наступну структуру:

Отже, БД в MS Access у нас створена, тепер переходимо до самого проекту в Delphi. на формі у мене такі компоненти:

Тепер, робимо підключення до нашої БД, як це робити, ми розглядали в статті. так що загострювати увагу на цьому, я не буду. Далі, нам необхідно всі наші компоненти зв'язати між собою, ну ось і приступимо. Виділяємо компонент TADOQuery і у властивості Connection вказуємо - TADOConenction. Далі, виділяємо компонент TDataSource і у властивості DataSet вказуємо TADOQuery. Потім, виділяємо компонент TDBGrid і у властивості DataSource вказуємо TDataSource.

Все, тепер додамо всі наші поля. Для цього, нам необхідно активувати наш запит і підключення. У властивості компонента TADOConenction - Connected встановлюємо True. а у властивості компонента TADOQuery - SQL. напишемо наступний запит

Спасибі Андрей53. Класний приклад. А я як тільки не пробував, не виходило. Виявляється просто як і все геніальне. У тебе на сайті, по базам даних, вистачить на добротний підручник. І я думаю, якщо б вдалося видати, він би користувався популярністю, принаймні серед початківців (як мінімум). Дякую що допомагаєш розбиратися і не залишаєш питання без уваги.






пробував повторити
procedure TForm1.ADOQuery1CalcFields (DataSet: TDataSet);
begin
ADOQuery1Sum.AsInteger: =
ADOQuery1Values.AsInteger * ADOQuery1Count.AsInteger;
end;
вилітали помилки, хоча в исходнике все також прописано і працює.
Спробував прописати стовпчики за допомогою fields
begin
AdoQuery1.Fields.FieldByName ( 'Ост'). AsInteger: =
AdoQuery1.Fields.FieldByName ( 'Прихід'). AsInteger-AdoQuery1.Fields.FieldByName ( 'Витрата'). AsInteger;
end;
Запрацювало.
Може він саме на російські назви лаявся,
або те що замість звичайного Grida я використовую DBGridEh?

Ні, то що замість стандартного гріда використовуєш DBGRidEh не в цьому проблема, а помилка хоч якась вилітала?

Привіт велике спасибі за статтю.
Допоможіть будь ласка я ще погано розбираюся з базами даних і не можу зрозуміти куди зберігається сума складана з двох полів?
У базі Access поле яке створили через Delphi 7 нету відповідно і значень теж немає. Відкриваю прогу значення є.
Чи можна зробити щоб в Access записувалися обчислювані значення?

да, можна, їх треба просто зберегти, ADOQuery.Post

Не зовсім зрозумів, але в Delphi можна визначити кількість днів у місяці, в залежності від цієї кількості Ви зможете створити таблицю в БД з потрібним кількість рядків!

Ще один спосіб, при якому в DBGrid (DBGridEh) організовується колонка, де відображається розраховане значення або, взагалі, будь-яка інша рядок.
У списку колонок DBGrid створюється ще одна, яка не зв'язується ні з яким полем таблиці БД.
У процедурі обробки події OnDrawColumnCell гріди відбувається обробка даних, отримання і висновок результату:
procedure TForm1.DBGrid1DrawColumnCell (Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
D. string;
R. TRect;
begin
if Column.Index = 6 then begin // індекс додаткової колонки
// оператори обчислень або будь-які інші
R: = Rect;
InflateRect (R, 0, -2);
DrawText (DBGrid1.Canvas.Handle, PChar (D), -1, R, DT_Center);
end;
end;

Недолік у тому, що відображений результат не може бути використаний в інших місцях програми. Але і ситуацій, коли цього не потрібно цілком достатньо.

А можна якось фільтрувати по обчислюваному полю? Пробував, не вийшло!
int n;
n = 2500;
ADOTable1-> Filtered = false;
ADOTable1-> Filter = «(Відпрацьовано = '« + IntToStr (n) + »')»;
ADOTable1-> Filtered = true;
DBChart1-> RefreshData ();>

Поле «відпрацьовано» - обчислюється!
Заздалегідь дякую!







Схожі статті