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

Копирую набор данных:
Код: 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
10.04.2018, 20:47
    #39628117
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
max_fox_m,

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

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



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


и не надо изгаляться
...
Рейтинг: 0 / 0
11.04.2018, 05:26
    #39628199
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
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
11.04.2018, 08:04
    #39628221
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
defecatorв запрос, который в SourceDataSet, добавь фиктивные поля.

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



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


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

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

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




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



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

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

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

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

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

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

Если так, то приведите пример, я так и не смог разобраться как это реализовать через TFDMemTable
...
Рейтинг: 0 / 0
11.04.2018, 11:56
    #39628315
AX-Class
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
Игорь_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
11.04.2018, 12:11
    #39628323
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
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
11.04.2018, 12:31
    #39628333
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDMemTable. Как правильно добавить новое поле в открытом датасете?
Игорь_UUSMaratIskпропущено...


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

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

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

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


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