агато слів для того, щоб описати процес показаний вище, але, фактично, виконання команд в Експерті форм БД легко і інтуїтивно.
Виділіть перший з двох об'єктів TQuery і встановлять властивість Active в True. Для Query2 у властивості SQL напишіть текст запиту:
* from Items I, Parts P
where (I.OrderNo =: OrderNo) and
(I.PartNo=P.PartNo)
Активізуйте об'єкт Query2 (Active встановіть в True) і викличте редактор DataSet (Fields Editor) для нього. Викличте діалог Add Fields і додайте поля OrderNo, PartNo, Qty і ListPrice.
Натисніть Define і ведіть слово Total в поле FieldName. Встановіть Field Type в CurrencyField. Перевірте що Calculated CheckBox відзначений. Натисніть Ok і закрийте редактор DataSet.
Простий процес описаний в попередньому абзаці, показує як створити обчислюване поле. Якщо подивитися в DBGrid, то можна бачити, що там тепер є ще одне порожнє поле. Для того, щоб помістити значення в це поле, відкрийте в Інспектора Об'єктів сторінку подій для об'єкта Query2 і зробіть подвійне клацання на OnCalcFields. Заповніть створений метод так:
TForm2.Query2CalcFields (DataSet: TDataSet); NewTotalInvoice.Value:=23.0 ;;
Після запуску програми поле Total буде містить рядок $ 23.00.
Етпро показує, наскільки просто створити обчислюване поле, яке показує правильно сформатував дані. Насправді це поле повинне показувати щось інше - твір полів Qty (кількість) і ListPrice (ціна). Для цього вищенаведений код для події OnCalcFields потрібно змінити наступним чином:
procedure TForm1.Query2CalcFields (DataSet: TDataset); Total.Value:=Query2Qty.Value * Query2ListPrice.Value;
end;
Якщо тепер запустити програму, то поле Total буде містити потрібну установку.
У обробнику події OnCalcFields можна виконувати і більш складні обчислення (це буде показано пізніше), однак слід пам'ятати, що це викликає відповідний уповільнення швидкості роботи програми.
Тепер давайте додамо обчислюване поле для першої таблиці (Query1, ORDERS), яке буде відображати суму значень з поля Total другої таблиці (Query2) для даного замовлення. Викличте редактор DataSet для об'єкта Query1 і додайте обчислюване поле NewItemsTotal типу CurrencyField. У обробнику події OnCalcFields для Query1 потрібно підрахувати суму і привласнити її полю NewItemsTotal:
TForm1.Query1CalcFields (DataSet: TDataset); R: Double;:=0; Query2 do begin ;;;:=R + Query2Total.Value ;; EOF ;;;; NewItemsTotal.Value:= R ;;
У даному прикладі сума підраховується за допомогою простого перебору записів, це не найоптимальніший варіант - можна, наприклад, для підрахунку суми використовувати додатковий об'єкт типу TQuery. Метод DisableControls викликається для того, щоб скасувати перерисовку DBGrid при скануванні таблиці. Запит Query2 перевідкривається для впевненості в тому, що його поточний набір записів відповідає поточному замовленням.
Помістіть на форму ще один елемент DBEdit і прив'яжіть його до Query1, полю NewItemsTotal. Запустіть програму, її приблизний вигляд показаний на ріс.12.19.
Рис. 12.19. Програма CALC_SUM
Як видно з програми, наявність поля ItemsTotal в таблиці ORDERS для даного прикладу необов'язково і його можна було б видалити (проте, воно необхідне в інших випадках).
Управління TDBGrid під час виконання
Об'єкт DBGrid може бути повністю реконфигурирован під час виконання програми. Ви можете ховати і показувати колонки, змінювати порядок показу колонок та їх ширину.
Ви можете використовувати властивість Options об'єкта DBGrid, щоб змінити її уявлення. Властивість Options може приймати наступні можливі значення: Встановлений по-замовчуванню в true, дозволяє користувачеві редагувати grid. Ви можете також встановити властивість ReadOnly grid в True або False. Чи будуть видно назви колонок. Чи будуть видно невеликі іконки зліва. Чи може користувач міняти розмір колонки. Чи показувати лінії між колонками. Чи показувати лінії між рядками. Чи може користувач використовувати tab і shift-tab для перемикання між колонками.
Як оголошено в цій структурі:
TDBGridOption=(dgEditing, gdAlwaysShowEditor, dgTitles ,, dgColumnResize, dgColLines,
dgRowLines, dgTabs);
Наприклад, Ви можете встановити опції в Runtime написавши такий код:
. Options:=[dgTitles, dgIndicator];
...