Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.15;
Скачать: CL | DM;

Вниз

Как в runtime добавить Calc Field в TTable?   Найти похожие ветки 

 
Виктор ©   (2002-07-18 16:56) [0]

Пытаюсь добавить вычисляемое поле к уже имеющемуся набору полей таблицы - пока ничего не получается. Делаю так:

fld := TStringField.Create(nil);
fld.FieldKind := fkCalculated;
fld.FieldName := "Calc_FIO";
fld.DisplayLabel := "ФИО";
tbl.Fields.Add(fld);


 
Виктор ©   (2002-07-18 23:06) [1]

АУ! Мастера Delphi! Как добавить Calc Field в runtime?


 
kaif ©   (2002-07-19 02:23) [2]

По-моему это не через tbl.fields.add делается, а присвоением fld.DataSet := tbl или что-то в этом роде (не помню). Но однозначно нужно метод экземляра TField вызывать а не метод экземляра TDataSet. И еще рекомендую владельца для TField назначать (можно тот же tbl), чтобы об удалении экземпляра потом не думать. fld := TStringField.Create(tbl);


 
Виктор ©   (2002-07-19 10:36) [3]

Спасибо. Попробовал, действительно при fld.DataSet := tbl появляется calc поле. Теперь проблема в следующем. Это присвоение можно делать только при закрытой DataSet. Если закрыть, присвоить и открыть заново, то остается только одно кальк-поле. При открытии таблицы не происходит заполнение fields полями из таблицы, если fields непусто (а содержит уже добавленной мной кальк-поле). Поэтому в моем случае при полностью динамическом формировании fields придется отказаться от кальк-полей и делать обычные поля непосредственно в базе. Минус - то, что база будет чуть больше, а плюс - можно будет индексы по ним строить. А как вы думаете?


 
Пастор   (2002-07-19 10:53) [4]

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, Grids, DBGrids, ExtCtrls, DBCtrls, DB,
DBTables, StdCtrls;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure TaxAmountCalc(DataSet: TDataset);
private
{ Private declarations }
TaxAmount: TFloatField;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.TaxAmountCalc(DataSet: TDataset);
begin
Dataset["TaxAmount"] := Dataset["ItemsTotal"] * (Dataset["TaxRate"] / 100);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
MyTable: TTable;
MyDataSource: TDataSource;
MyGrid: TDBGrid;
begin
{ Создаем компонент TTable -- связанная таблица базы данных будет создана ниже. }
MyTable := TTable.Create(Self);

with MyTable do
begin
{ Определяем основную базу данных и таблицу.
Примечание: Test.DB пока не существует. }
DatabaseName := "DBDemos";
TableName := "Test.DB";

{ Назначаем TaxAmountCalc обработчиком события,
чтобы использовать его при наступлении события
OnCalcFields в MyTable. }
OnCalcFields := TaxAmountCalc;

{ Создаем и добавляем определения полей к массиву TTable
FieldDefs, затем создаем TField с использованием
информации из определения поля. }
with FieldDefs do
begin
Add("ItemsTotal", ftCurrency, 0, false);
FieldDefs[0].CreateField(MyTable);
Add("TaxRate", ftFloat, 0, false);
FieldDefs[1].CreateField(MyTable);
TFloatField(Fields[1]).DisplayFormat := "##.0%";

{ Создаем вычисляемое TField, назначаем свойства,
и добавляем поле к массиву определений MyTable. }
TaxAmount := TFloatField.Create(MyTable);
with TaxAmount do
begin
FieldName := "TaxAmount";
Calculated := True;
Currency := True;
DataSet := MyTable;
Name := MyTable.Name + FieldName;
MyTable.FieldDefs.Add(Name, ftFloat, 0, false);
end;
end;

{ Создаем в базе данных новую таблицу,
используя в качестве основы MyTable. }
MyTable.CreateTable;
end;

{ Создаем компонент TDataSource
и назначаем его MyTable. }
MyDataSource := TDataSource.Create(Self);
MyDataSource.DataSet := MyTable;

{ Создаем табличную сетку, отображаем
на форме, и назначаем MyDataSource для
получения доступа к данным из MyTable. }
MyGrid := TDBGrid.Create(Self);
with MyGrid do
begin
Parent := Self;
Align := alClient;
DataSource := MyDataSource;
end;

{ Запускаем нашу конструкцию! }
MyTable.Active := True;
Caption := "Новая таблица " + MyTable.TableName;
end;

end.


 
kaif ©   (2002-07-19 11:46) [5]

У DataSet-а есть свойство FieldDefs. Этот объект имеет способность извлекать определения полей из таблицы (в закрытом состоянии) и управлять строительством полей runtime. Изучи его работу. Не бросай начатое дело. Сам себе потом спасибо скажешь.


 
Виктор ©   (2002-07-19 22:31) [6]

Спасибо, Знатоки. Пошел разбираться.



Страницы: 1 вся ветка

Текущий архив: 2002.08.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
14-48281
ev
2002-07-20 18:24
2002.08.15
как объявить функцию в C?


1-48190
Олеся
2002-08-02 15:54
2002.08.15
Как работать с indy?


14-48269
Vladimir ;)
2002-07-21 02:29
2002.08.15
Помогите с делом!


1-48072
Man-In-Red
2002-08-01 00:25
2002.08.15
???


14-48285
MadMarine
2002-07-21 18:30
2002.08.15
Delphi5 &WinXP