Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MemTableEh - динамическое создание полей / 19 сообщений из 19, страница 1 из 1
26.02.2020, 10:12
    #39930915
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
Взял пример из Demos\MemTableEh.LifeRestructure.
По кнопке AddField там в сетку добавляется поле.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TForm1.Button1Click(Sender: TObject);
var
  NewStruct: TMTDataStructEh;
  bf: TMTStringDataFieldEh;
begin
  NewStruct := MemTableEh1.RecordsView.MemTableData.DataStruct.BeginRestructure;

  bf := TMTStringDataFieldEh(NewStruct.CreateField(TMTStringDataFieldEh));
  bf.FieldName := GetFieldUnicName('StringField');

  MemTableEh1.RecordsView.MemTableData.DataStruct.EndRestructure(NewStruct, True);
end;



Преобразовал это в свой код таким образом:
Код: 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.
  procedure AppendField(AFieldName: string);
  var
    NewStruct: TMTDataStructEh;
    bf: TMTStringDataFieldEh;
  begin
    NewStruct := MemTableSchedule.RecordsView.MemTableData.DataStruct.BeginRestructure;

    bf := TMTStringDataFieldEh(NewStruct.CreateField(TMTStringDataFieldEh));
    bf.FieldName := AFieldName;    // GetFieldUnicName('StringField');

    MemTableSchedule.RecordsView.MemTableData.DataStruct.EndRestructure(NewStruct, True);
  end;

...
      MemTableSchedule.Open;
      MemTableSchedule.EmptyTable;

      // Заполняем строки
      ....
      if q.Open > 0 then
        begin
          AppendField('m1'); // добавление поля
          AppendField('mh1'); // добавление поля
          while not q.Q.Eof do
            begin
              MemTableSchedule.Append;
              MemTableSchedule.FieldByName('id').AsInteger := q.Q.FieldByName('id').AsInteger;
              MemTableSchedule.FieldByName('sequence_number').AsInteger := q.Q.FieldByName('sequence_number').AsInteger;
              MemTableSchedule.FieldByName('group_path').AsString := q.Q.FieldByName('group_path').AsString;
              MemTableSchedule.FieldByName('technic_process_name').AsString := q.Q.FieldByName('technic_process_name').AsString;

              MemTableSchedule.FieldByName('m1').AsString := '5'; // на этих строках выдает ошибку
              MemTableSchedule.FieldByName('mh1').AsString := '10';

              MemTableSchedule.Post;


На строке MemTableSchedule.FieldByName('m1').AsString := '5'; выдает ошибку, что поле m1 не существует.
...
Рейтинг: 0 / 0
26.02.2020, 10:53
    #39930944
Gluck99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
svnvlad,
Почему AppendField, а не FieldDefs.Add()?
...
Рейтинг: 0 / 0
26.02.2020, 11:18
    #39930954
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
Gluck99
svnvlad,
Почему AppendField, а не FieldDefs.Add()?

какая разница, как назвать?
...
Рейтинг: 0 / 0
26.02.2020, 11:22
    #39930957
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
Gluck99,

разные варианты перепробовал:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  procedure AddNewField(AFieldName: string);
  var
    fd: TFieldDef;
  begin
    fd := MemTableSchedule.FieldDefs.AddFieldDef;
    fd.DataType := ftInteger;
    fd.Name := AFieldName;
  end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  procedure AddNewField(AFieldName: string);
  var
    fd: TFieldDef;
    f: TField;
  begin
    MemTableSchedule.FieldDefs.Add(AFieldName, ftInteger);
    f := fd.CreateField(MemTableSchedule);
  end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  procedure AddNewField(AFieldName: string);
  var
    DataField: TMTDataFieldEh;
  begin
    DataField := MemTableSchedule.RecordsView.MemTableData.DataStruct.CreateField(TMTNumericDataFieldEh);
    DataField.FieldName := AFieldName;
    TMTNumericDataFieldEh(DataField).NumericDataType := fdtIntegerEh;
  end;



Ни один не работает.
...
Рейтинг: 0 / 0
26.02.2020, 11:47
    #39930972
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
Насколько помню, сначала FieldDefs заполняются. Затем Fields и дергается CreateDataSet.
...
Рейтинг: 0 / 0
26.02.2020, 12:02
    #39930987
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
wadman
Насколько помню, сначала FieldDefs заполняются. Затем Fields и дергается CreateDataSet.

Очистил все определения полей, которые назначал в дезайн тайме.
Написал такой код:
Код: 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.
procedure TfmRepairObject.DrawTableSchedule;
var

  procedure AddNewField(AFieldName: string; AFieldType: TFieldType);
  var
    fd: TFieldDef;
    f: TField;
  begin
    fd := MemTableSchedule.FieldDefs.AddFieldDef;
    fd.DataType := AFieldType;
    fd.Name := AFieldName;

    f := fd.CreateField(MemTableSchedule);
  end;

begin
    q := TBISMySQLQuery.Create;
    q2 := TBISMySQLQuery.Create;
    try
      MemTableSchedule.DestroyTable;
      AddNewField('id', ftInteger);
      AddNewField('sequence_number', ftInteger);
      AddNewField('group_path', ftString);
      AddNewField('technic_process_name', ftString);
      AddNewField('abbreviation', ftString);
      AddNewField('sector_name', ftString);
      AddNewField('unit_name', ftString);
      AddNewField('quantity', ftInteger);
      AddNewField('note', ftString);
      AddNewField('m1', ftInteger);
      AddNewField('mh1', ftInteger);
      MemTableSchedule.CreateDataSet;

      MemTableSchedule.Open;
      MemTableSchedule.EmptyTable;

      // Заполняем строки
      ....
      if q.Open > 0 then
        begin
          while not q.Q.Eof do
            begin
              MemTableSchedule.Append;
              MemTableSchedule.FieldByName('id').AsInteger := q.Q.FieldByName('id').AsInteger;
              MemTableSchedule.FieldByName('sequence_number').AsInteger := q.Q.FieldByName('sequence_number').AsInteger;
              MemTableSchedule.FieldByName('group_path').AsString := q.Q.FieldByName('group_path').AsString;
              MemTableSchedule.FieldByName('technic_process_name').AsString := q.Q.FieldByName('technic_process_name').AsString;
              MemTableSchedule.FieldByName('abbreviation').AsString := q.Q.FieldByName('abbreviation').AsString;
              MemTableSchedule.FieldByName('sector_name').AsString := q.Q.FieldByName('sector_name').AsString;
              MemTableSchedule.FieldByName('unit_name').AsString := q.Q.FieldByName('unit_name').AsString;
              MemTableSchedule.FieldByName('quantity').AsInteger := q.Q.FieldByName('quantity').AsInteger;
              MemTableSchedule.FieldByName('note').AsString := q.Q.FieldByName('note').AsString;

              MemTableSchedule.FieldByName('m1').AsInteger := 5;
              MemTableSchedule.FieldByName('mh1').AsInteger := 10;

              MemTableSchedule.Post;

              q.Q.Next;
            end;
        end;


Ошибок не выдает, но теперь сетка пустая. До того, как в рантайме создавал поля, хотя бы данные отображались (кроме m1 и mh1). Теперь не отображается ничего.
...
Рейтинг: 0 / 0
26.02.2020, 12:05
    #39930989
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
Нашел так же на просторах интернета, что после всего нужно вызвать DBGridEh1.Columns.AddAllColumns(true);
Но, во-первых, у меня не DBGridEh, а tcxGrid, а во-вторых, причем тут сетка вообще, если речь идет о датасетах.
...
Рейтинг: 0 / 0
26.02.2020, 12:11
    #39931001
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
Кстати, с DBGridEh трюк действительно работает. Но надо, чтобы отображалось в tcxGrid (TcxGridDBBandedTableView).
...
Рейтинг: 0 / 0
26.02.2020, 12:11
    #39931002
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
svnvlad
Нашел так же на просторах интернета, что после всего нужно вызвать DBGridEh1.Columns.AddAllColumns(true);
Но, во-первых, у меня не DBGridEh, а tcxGrid, а во-вторых, причем тут сетка вообще, если речь идет о датасетах.


в TcxGrid нужно создавать колонки явно, сам он их не созздаёт
...
Рейтинг: 0 / 0
26.02.2020, 12:16
    #39931004
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
Все, разобрался, не был подключен DataSource к сетке.
...
Рейтинг: 0 / 0
26.02.2020, 12:17
    #39931005
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
defecator
svnvlad
Нашел так же на просторах интернета, что после всего нужно вызвать DBGridEh1.Columns.AddAllColumns(true);
Но, во-первых, у меня не DBGridEh, а tcxGrid, а во-вторых, причем тут сетка вообще, если речь идет о датасетах.


в TcxGrid нужно создавать колонки явно, сам он их не созздаёт

Кстати, на очереди создание колонок в tcxGrid в рантайме.
...
Рейтинг: 0 / 0
26.02.2020, 12:24
    #39931009
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
svnvlad
Код: pascal
1.
    f := fd.CreateField(MemTableSchedule);


А где название у колонки?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
      with qSpecsParamValues.FieldDefs.AddFieldDef do begin
        Name := 'qSpecsParamValuesid';
        DataType := ftInteger;
        with CreateField(qSpecsParamValues) do begin
          FieldName := 'id';
          DisplayLabel := 'id';
        end;
      end;
...
Рейтинг: 0 / 0
26.02.2020, 12:27
    #39931010
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
wadman
svnvlad
Код: pascal
1.
    f := fd.CreateField(MemTableSchedule);


А где название у колонки?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
      with qSpecsParamValues.FieldDefs.AddFieldDef do begin
        Name := 'qSpecsParamValuesid';
        DataType := ftInteger;
        with CreateField(qSpecsParamValues) do begin
          FieldName := 'id';
          DisplayLabel := 'id';
        end;
      end;



Ну вот здесь вроде как
Код: pascal
1.
2.
3.
    fd := MemTableSchedule.FieldDefs.AddFieldDef;
    fd.DataType := AFieldType;
    fd.Name := AFieldName;
...
Рейтинг: 0 / 0
26.02.2020, 12:28
    #39931014
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
Т.е. кроме FieldDefs, еще надо и у Field название колонки отдельно делать?
А почему работает без этого?
...
Рейтинг: 0 / 0
26.02.2020, 12:28
    #39931015
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
svnvlad
Ну вот здесь вроде как

Это не то название, хотя и таблица не запрос, а виртуальная. Сойдет.
...
Рейтинг: 0 / 0
26.02.2020, 12:29
    #39931017
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
svnvlad
А почему работает без этого?

Я на живом запросе привел пример. Немного иная ситуация.
...
Рейтинг: 0 / 0
26.02.2020, 12:51
    #39931031
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
wadman,

а вот еще вопрос - при повторном вызове процедуры ругается на дубликаты полей. MemTableSchedule.DestroyTable; видимо не помогает. Что надо вызывать?
...
Рейтинг: 0 / 0
26.02.2020, 12:56
    #39931032
Gluck99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
svnvlad
wadman,а вот еще вопрос - при повторном вызове процедуры ругается на дубликаты полей. MemTableSchedule.DestroyTable; видимо не помогает. Что надо вызывать?
Ну так ты в список добавляешь поля, которые там уже есть. Очищай список, вызывай FieldDefs.Clear или что там вместо него у тебя.
...
Рейтинг: 0 / 0
26.02.2020, 13:15
    #39931045
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MemTableEh - динамическое создание полей
Gluck99,

Убрал создание TField, тоже работает.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  procedure AddNewField(AFieldName: string; AFieldType: TFieldType; AFieldSize: integer = 0);
  var
    fd: TFieldDef;
    f: TField;
  begin
    fd := MemTableSchedule.FieldDefs.AddFieldDef;
    fd.DataType := AFieldType;
    fd.Name := AFieldName;
    if AFieldSize <> 0 then
      fd.Size := AFieldSize;

//    f := fd.CreateField(MemTableSchedule);
//    f.FieldName := AFieldName;
//    if AFieldSize <> 0 then
//      f.Size := AFieldSize;
  end;


Потом просто вызываю MemTableSchedule.FieldDefs.Clear.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MemTableEh - динамическое создание полей / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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