![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить значение вычислимого поля? [D5]
serg128 © (2004-06-17 12:08:00)Как получить значение вычислимого поля, ну типа: x := ds.FieldByName('calcfld').AsString;
Если я так делаю, то возвращается пустое значение (хотя в датасете значение есть).
serg128 (2004-06-17 15:43:00) [1]Спасибо, я уже разобрался....
Sandman25 (2004-06-17 13:57:00) [2][15] serg128 (17.06.04 12:33)
Интересный приемчик Вы использовали...
Все же лучше написать
MyDataSet.OnCalcFields := MyDataSetCalcFields;
Почитайте про OnCalcFields в хелпе
serg128 (2004-06-17 12:33:00) [3]Динамически создаю поле, типа "Вычислимое" и подсовываю его в TClientDataSet:
TStringField *fl;
fl = new TStringField(cds);
fl->FieldKind = fkCalculated;
fl->Name = name;
fl->FieldName = name;
fl->Size = 100;
fl->DataSet = cds;
fl->Tag = code;
fl->OnGetText = CalcFld;
Теперь подсовываю обработчик события
void __fastcall TForm1::CalcFld(TField *Sender, AnsiString &Text, bool DisplayText)
{
cdsCorAcc->Filter = "(OP_ID="+ cdsCor->FieldByName("OP_ID")->AsString +")AND(OP_SUBID="+ cdsCor->FieldByName("OP_SUBID")->AsString +")";
cdsCorAcc->Filtered = true;
float ac1 = 0;
float ac2 = 0;
if(cdsCorAcc->Locate("CODE", Sender->Tag, TLocateOptions()))
{
ac1 = cdsCorAcc->FieldByName("SUM")->AsFloat;
cdsCorAcc->Locate("CODE", IdAcc, TLocateOptions());
ac2 = cdsCorAcc->FieldByName("SUM")->AsFloat;
Text = FloatToStr((ac1 > ac2) ? ac1 : ac2);
}
else Text = "0";
}
Domkrat (2004-06-17 12:31:00) [4]procedure Dm.MyDatasetCalcFields(DataSet: TDataSet);
begin
with DataSet do
begin
FieldByName('calcfld').AsString:=
FieldByName('FIELD1').AsString+
FieldByName('FIELD2').AsString;
end;
end;
К примеру
Соловьев (2004-06-17 12:28:00) [5]
> Там нету такого события :((
так ты его в запросе может вычисляешь?
Anatoly Podgoretsky (2004-06-17 12:27:00) [6]Sandman25 © (17.06.04 12:23) [9]
Еще не вечер!
Sandman25 (2004-06-17 12:27:00) [7]Если Вы не обрабатываете OnCalcFields, то ds.FieldByName('calcfld').AsString действительно будет возвращать пустую строку.
Sandman25 (2004-06-17 12:23:00) [8][6] serg128 (17.06.04 12:21)
OnCalcFields. Вы можете объяснить, что где у Вас происходит?
serg128 (2004-06-17 12:23:00) [9]А строчка x := ... где находится? В каком обработчике?
Находится в OnButton1Click
а проверяю: ShowMessage(ds.FieldByName('calcfld').AsString);
Соловьев (2004-06-17 12:23:00) [10]
> Там нету такого события :((
там это где? вообще-то оно у датасета. Это не твоя прога?
Соловьев (2004-06-17 12:22:00) [11]
> А строчка x := ... где находится? В каком обработчике?
телепат моде - on :)
OnCalcField :)
serg128 (2004-06-17 12:21:00) [12]> Событие OnCalcField обрабатывается?
Там нету такого события :((
Sandman25 (2004-06-17 12:20:00) [13]А строчка x := ... где находится? В каком обработчике?
Соловьев (2004-06-17 12:20:00) [14]
> Если я так делаю, то возвращается пустое значение
а тут как проверяешь?
serg128 (2004-06-17 12:18:00) [15]Поле TStringField, смотрю в гриде.
Sandman25 (2004-06-17 12:13:00) [16]Событие OnCalcField обрабатывается?
Соловьев (2004-06-17 12:13:00) [17]
> хотя в датасете значение есть
в гриде смотришь?
а поле какого типа?