Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить значение вычислимого поля? [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]


> хотя в датасете значение есть

в гриде смотришь?
а поле какого типа?


Наверх

Титульная страница Поиск, карта сайта Написать письмо