powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFDMemTable. Как правильно добавить новое поле в открытом датасете?
14 сообщений из 14, страница 1 из 1
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628087
max_fox_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Копирую набор данных:
Код: pascal
1.
FDMemTable.CopyDataSet(SourceDataSet, [coStructure, coRestart, coAppend]);



Далее мне необходимо добавить ещё одно поле:
Код: pascal
1.
FDMemTable.FieldDefs.Add('Edited', ftBoolean);



и отредактировать данное поле по всем записям:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
First;
  while not FDMemTable.Eof do
  begin
    FDMemTable.Edit;
    FDMemTable.FieldByName('Edited').AsBoolean := False;
    FDMemTable.Post;
  end;



На последнем вылетает ошибка, что поля 'Edited' не существует.
У меня задача создать кэш-таблицу, записи у такой таблице могут быть отредактированы, мне нужно знать какие именно были отредактированы. Идея следующая, клонирую датасет и добавляю поле, которое будет менять свой флаг после редактирования. Но из за ошибки залип... подскажите что делаю не так
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628117
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_fox_m,

После FieldDefs.Add() обычно необходим CreateDataset()..
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628127
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
в запрос, который в SourceDataSet, добавь фиктивные поля.

Типа, вот так:
Код: plsql
1.
2.
Select ID, Name, 0 as Edited
  From Table



Ну а потом уже
Код: pascal
1.
FDMemTable.CopyDataSet(SourceDataSet, [coStructure, coRestart, coAppend]);


и не надо изгаляться
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628199
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_fox_mДобрый день.

Копирую набор данных:
Код: pascal
1.
FDMemTable.CopyDataSet(SourceDataSet, [coStructure, coRestart, coAppend]);



Далее мне необходимо добавить ещё одно поле:
Код: pascal
1.
FDMemTable.FieldDefs.Add('Edited', ftBoolean);



и отредактировать данное поле по всем записям:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
First;
  while not FDMemTable.Eof do
  begin
    FDMemTable.Edit;
    FDMemTable.FieldByName('Edited').AsBoolean := False;
    FDMemTable.Post;
  end;



На последнем вылетает ошибка, что поля 'Edited' не существует.
У меня задача создать кэш-таблицу, записи у такой таблице могут быть отредактированы, мне нужно знать какие именно были отредактированы. Идея следующая, клонирую датасет и добавляю поле, которое будет менять свой флаг после редактирования. Но из за ошибки залип... подскажите что делаю не так

в открытый - никак
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628221
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecatorв запрос, который в SourceDataSet, добавь фиктивные поля.

Типа, вот так:
Код: plsql
1.
2.
Select ID, Name, 0 as Edited
  From Table



Ну а потом уже
Код: pascal
1.
FDMemTable.CopyDataSet(SourceDataSet, [coStructure, coRestart, coAppend]);


и не надо изгаляться

Спасибо, я уже так же к такому способу стал склоняться
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628224
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_fox_mИдея следующая, клонирую датасет и добавляю поле
Сначала добавляем поле, потом клонируем датасет.
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628237
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AX-Classmax_fox_mИдея следующая, клонирую датасет и добавляю поле
Сначала добавляем поле, потом клонируем датасет.
не знаю, как в TFDMemTable,
но в тех MemTable, с которыми я работал,
всё, что было добавлено ДО клонирования,
вычищается и создаётся новая структура на основе источника
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628238
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Игорь_UUSdefecatorв запрос, который в SourceDataSet, добавь фиктивные поля.

Типа, вот так:
Код: plsql
1.
2.
Select ID, Name, 0 as Edited
  From Table




Ну а потом уже
Код: pascal
1.
FDMemTable.CopyDataSet(SourceDataSet, [coStructure, coRestart, coAppend]);



и не надо изгаляться

Спасибо, я уже так же к такому способу стал склоняться
А у тебя других вариантов нет от слова совсем
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628243
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorAX-Classпропущено...

Сначала добавляем поле, потом клонируем датасет.
не знаю, как в TFDMemTable,
но в тех MemTable, с которыми я работал,
всё, что было добавлено ДО клонирования,
вычищается и создаётся новая структура на основе источника
Странно, если бы было по другому.
Это же не в лоб нужно делать.
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628273
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AX-Classmax_fox_mИдея следующая, клонирую датасет и добавляю поле
Сначала добавляем поле, потом клонируем датасет.

не клонируем, а копируем из SourceDataSet
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628287
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaratIskAX-Classпропущено...

Сначала добавляем поле, потом клонируем датасет.

не клонируем, а копируем из SourceDataSet

Если так, то приведите пример, я так и не смог разобраться как это реализовать через TFDMemTable
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628315
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
  FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, Data.DB,
  FireDAC.Comp.DataSet, FireDAC.Comp.Client;

type

  TExFDMemTable = class(TFDMemTable)
  private
    FOnBeforeCreateFields: TProc<TDataSet>;
  protected
    procedure CreateFields; override;
  public
    property OnBeforeCreateFields: TProc<TDataSet> read FOnBeforeCreateFields write
        FOnBeforeCreateFields;
  end;

  TFDMemTable = class(TExFDMemTable)
  end;

  TForm2 = class(TForm)
    FDMemTable1: TFDMemTable;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
var
  SomeDataSet: TFDMemTable;
begin
  SomeDataSet := TFDMemTable.Create(Self);
  with SomeDataSet do
    begin
      with FieldDefs do
        begin
          Clear;
          Add('ID', ftInteger);
          Add('Name', ftString);
          Add('CurrDate', ftDateTime);
        end;
      Active := True;
      AppendRecord([0, 'DDD', '18.01.2016']);
      AppendRecord([1, 'SSS', '17.01.2016']);
      AppendRecord([2, 'AAA', '19.01.2016']);
      AppendRecord([3, 'VVV', '20.01.2016']);
    end;

  FDMemTable1.OnBeforeCreateFields := procedure(ADataSet: TDataSet)
    begin
      if ADataSet.FieldDefs.IndexOf('Edited') = -1 then
        ADataSet.FieldDefs.Add('Edited', ftBoolean);
    end;
  FDMemTable1.CopyDataSet(SomeDataSet, [coStructure, coRestart, coAppend]);

  FDMemTable1.First;
  while not FDMemTable1.Eof do
    begin
      FDMemTable1.Edit;
      FDMemTable1.FieldByName('Edited').AsBoolean := False;
      FDMemTable1.Post;
      FDMemTable1.Next;
    end;

  SomeDataSet.Free;
end;

procedure TExFDMemTable.CreateFields;
begin
  if Assigned(FOnBeforeCreateFields) then
    FOnBeforeCreateFields(Self);
  inherited CreateFields;
end;


end.


Может, что не учел, но смысл понятен.
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628323
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AX-ClassИгорь_UUS,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
  FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, Data.DB,
  FireDAC.Comp.DataSet, FireDAC.Comp.Client;

type

  TExFDMemTable = class(TFDMemTable)
  private
    FOnBeforeCreateFields: TProc<TDataSet>;
  protected
    procedure CreateFields; override;
  public
    property OnBeforeCreateFields: TProc<TDataSet> read FOnBeforeCreateFields write
        FOnBeforeCreateFields;
  end;

  TFDMemTable = class(TExFDMemTable)
  end;

  TForm2 = class(TForm)
    FDMemTable1: TFDMemTable;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
var
  SomeDataSet: TFDMemTable;
begin
  SomeDataSet := TFDMemTable.Create(Self);
  with SomeDataSet do
    begin
      with FieldDefs do
        begin
          Clear;
          Add('ID', ftInteger);
          Add('Name', ftString);
          Add('CurrDate', ftDateTime);
        end;
      Active := True;
      AppendRecord([0, 'DDD', '18.01.2016']);
      AppendRecord([1, 'SSS', '17.01.2016']);
      AppendRecord([2, 'AAA', '19.01.2016']);
      AppendRecord([3, 'VVV', '20.01.2016']);
    end;

  FDMemTable1.OnBeforeCreateFields := procedure(ADataSet: TDataSet)
    begin
      if ADataSet.FieldDefs.IndexOf('Edited') = -1 then
        ADataSet.FieldDefs.Add('Edited', ftBoolean);
    end;
  FDMemTable1.CopyDataSet(SomeDataSet, [coStructure, coRestart, coAppend]);

  FDMemTable1.First;
  while not FDMemTable1.Eof do
    begin
      FDMemTable1.Edit;
      FDMemTable1.FieldByName('Edited').AsBoolean := False;
      FDMemTable1.Post;
      FDMemTable1.Next;
    end;

  SomeDataSet.Free;
end;

procedure TExFDMemTable.CreateFields;
begin
  if Assigned(FOnBeforeCreateFields) then
    FOnBeforeCreateFields(Self);
  inherited CreateFields;
end;


end.



Может, что не учел, но смысл понятен.

зачем столько букв, если есть вариант в сотню раз проще 21327810
...
Рейтинг: 0 / 0
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
    #39628333
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSMaratIskпропущено...


не клонируем, а копируем из SourceDataSet

Если так, то приведите пример, я так и не смог разобраться как это реализовать через TFDMemTable

что сложного?

1. копируешь структуру SourceDataSet
2. добавляешь свое поле
3. копируешь данные
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFDMemTable. Как правильно добавить новое поле в открытом датасете?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]