Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];

Вниз

Как в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
1-48043
Poirot
2002-08-03 06:50
2002.08.15
Как сообщить компоненту из свойства-объекта - надо перерисов


1-48085
maxim2
2002-08-05 08:22
2002.08.15
Люди не могу разобраться с заставкой


1-48066
Nostradamus
2002-08-02 23:05
2002.08.15
Delphi виснет


1-48127
BlackSun
2002-07-31 17:10
2002.08.15
exe+dll->exe


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский