C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Вычислямые поля
Nick
Отправлено: 15.11.2003, 09:12


Машинист паровоза

Группа: Участник
Сообщений: 247



Есть Грид в котором отображаются две вычисляемые колонки.
Результат зависит от коефф.
Каким методом нужно пересчитать колонку по всему гриду при изменении коефф.
Вычисляемое поле создано в датасете.
В событии onCalcFields прописана формула вычисления.
Grid->Refresh не вызывает onCalcFields для каждой записи.
PageDown, PageUp спасают положение но мне это не нравится.
Admin
Отправлено: 16.11.2003, 19:21


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE

Write an OnCalcFields event handler to take specific action when an application recalculates calculated fields. A calculated field is one that derives its value from the values in one or more fields in the dataset, sometimes with additional processing.

OnCalcFields is triggered when

A dataset is opened.
A dataset is put into dsEdit state.
A record is retrieved from a database.

When the AutoCalcFields property is true, OnCalcFields is also triggered when:

Focus moves from one visual control to another, or from one column to another is a data-aware grid control and modifications were made to the record.

и т.д. см help

То есть я так понимаю, что коэффициэнт не в полях базы,а
какой-то внешний, например вводится в Edit1

Наверное самое простое:
Table->Close(); Table->Open();

CODE

// t1,t2 — вычисляемые поля, в Edit1->Text — коэффициэнт
//---------------------------------------------------------------------------

void __fastcall TForm1::Table1CalcFields(TDataSet *DataSet)
{
Table1t1->Value = Edit1->Text.ToInt() * Table1PriceRub->Value + Table1Quantity->Value;
Table1t2->Value = Edit1->Text.ToInt() * Table1PriceRub->Value — Table1Quantity->Value;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
if(Edit1->Text == "") Edit1->Text = "0";
Table1->Close(); Table1->Open();
}
//---------------------------------------------------------------------------

// или Table1->Refresh();
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
if(Edit1->Text == "") Edit1->Text = "0";
Table1->Refresh();
}
//---



то есть Table1->Refresh(); а не DBGrid1->Refresh();


Отредактировано Admin — 16/11/2003, 20:28
Nick
Отправлено: 18.11.2003, 11:46


Машинист паровоза

Группа: Участник
Сообщений: 247



Спасибо.
Но по команде pFIBDS_Price->Refresh() колонка обновлялась как надо и выскакивало сообщение Can't refresh row (pFIBDS_Price)
Я его заглушил молчаливым try {} catch(...){}.
Но хотелось бы знать в чем дело.
Admin
Отправлено: 18.11.2003, 15:24


Владимир

Группа: Администратор
Сообщений: 1190



То есть, я понял что работаете через компоненты FIBPlus. smile.gif
Если это так, то у них есть метод RefreshClientFields:

QUOTE

procedure RefreshClientFields; Description

Call the RefreshClientFields method to refresh values of calculated
and lookup fields.


CODE

pFIBDS_Price->RefreshClientFields()


а для быстрого переоткрытия:

CODE

pFIBDS_Price->CloseOpen(false);


Вернуться в Работа с базами данных в C++Builder