Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дублирование полей DataSet при повторном выполнении / 13 сообщений из 13, страница 1 из 1
07.09.2017, 15:59:49
    #39517510
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
Есть код, создающий динамически dxMemData из колонок cxGrid
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  AMemData.Close;
  if AMemData.Fields.Count > 0 then
    for i := 0 to AMemData.FieldCount - 1 do
      AMemData.Fields[i].Free;

  while AMemData.FieldCount > 1 do
    AMemData.Fields[AMemData.FieldCount - 1].Free;

  AMemData.DisableControls;
  for i := 0 to grdMainGridDBTableView.ColumnCount - 1 do
  begin
    CreateField(AMemData, grdMainGridDBTableView.Columns[i].DataBinding.FieldName, grdMainGridDBTableView.Columns[i].DataBinding.Field.DataType);
    AMemData.FieldDefs.Update;
  end;
  AMemData.EnableControls;



Если выполнить данный код повторно возникает ошибка дублирования полей DataSet, подскажите почему ?
...
Рейтинг: 0 / 0
07.09.2017, 16:07:53
    #39517520
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
wsnet
Код: pascal
1.
2.
3.
4.
5.
6.
if AMemData.Fields.Count > 0 then
    for i := 0 to AMemData.FieldCount - 1 do
      AMemData.Fields[i].Free;

  while AMemData.FieldCount > 1 do
    AMemData.Fields[AMemData.FieldCount - 1].Free;


Добиваешь?
wsnet
Код: pascal
1.
AMemData.DisableControls;


Это должно быть первой строкой.

Ну и принято давать точный текст ошибки, а не свою трактовку.
...
Рейтинг: 0 / 0
07.09.2017, 16:09:23
    #39517523
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
wsnet,

Чистишь некорректно, значит.
Нельзя вызвать Clear для Fields/FieldDefs?
Или тупо пересодать батареи (с переподключением его контролирует, конечно).
...
Рейтинг: 0 / 0
07.09.2017, 16:10:48
    #39517525
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
чччДИли тупо пересодать батареи датасет (с переподключением его контролирует, конечно).
...
Рейтинг: 0 / 0
07.09.2017, 16:12:35
    #39517529
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
чччДчччДИли тупо пересодать батареи датасет (с переподключением его контролирует контролов, конечно).

:(
...
Рейтинг: 0 / 0
07.09.2017, 16:14:54
    #39517530
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
wsnet,

AMemData.ClearFields - проще и понятнее.
...
Рейтинг: 0 / 0
07.09.2017, 16:21:12
    #39517539
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
schiwsnet,

AMemData.ClearFields - проще и понятнее.
Учитывая, что пациент уже наваял, пусть лучше "с перебором" разберётся. О ведь такой же код где-то ещё применит.
...
Рейтинг: 0 / 0
07.09.2017, 19:42:59
    #39517721
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
wadmanwsnet
Код: pascal
1.
2.
3.
4.
5.
6.
if AMemData.Fields.Count > 0 then
    for i := 0 to AMemData.FieldCount - 1 do
      AMemData.Fields[i].Free;

  while AMemData.FieldCount > 1 do
    AMemData.Fields[AMemData.FieldCount - 1].Free;


Добиваешь?
wsnet
Код: pascal
1.
AMemData.DisableControls;


Это должно быть первой строкой.

Ну и принято давать точный текст ошибки, а не свою трактовку.
Добиваю ) разные варианты пробовал просто, в чем проблема не пойму (
...
Рейтинг: 0 / 0
07.09.2017, 19:46:08
    #39517723
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
чччДschiwsnet,

AMemData.ClearFields - проще и понятнее.
Учитывая, что пациент уже наваял, пусть лучше "с перебором" разберётся. О ведь такой же код где-то ещё применит.

Это я ошибся. Не тот метод.

Надо AMemData.Fields.Clear
...
Рейтинг: 0 / 0
07.09.2017, 20:42:23
    #39517740
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
schiчччДпропущено...

Учитывая, что пациент уже наваял, пусть лучше "с перебором" разберётся. О ведь такой же код где-то ещё применит.

Это я ошибся. Не тот метод.

Надо AMemData.Fields.Clear

Делаю таким образом:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
 AMemData.Close;

  AMemData.Fields.Clear;

  for i := 0 to grdMainGridDBTableView.ColumnCount - 1 do
  begin
    CreateField(AMemData, grdMainGridDBTableView.Columns[i].DataBinding.FieldName, grdMainGridDBTableView.Columns[i].DataBinding.Field.DataType);
    AMemData.FieldDefs.Update;
  end;



И все равно ошибка:

Код: pascal
1.
Duplicate name 'ID' in TFieldDefs



В чем проблема не понимаю.
...
Рейтинг: 0 / 0
07.09.2017, 20:55:08
    #39517747
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
wsnetИ все равно ошибка:

Код: pascal
1.
Duplicate name 'ID' in TFieldDefs



В чем проблема не понимаю.

В том, что FieldDefs тоже надо очистить, видимо
...
Рейтинг: 0 / 0
07.09.2017, 21:18:03
    #39517757
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
schi,

А чем fielddefs отличается от field ?
...
Рейтинг: 0 / 0
07.09.2017, 22:40:58
    #39517810
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование полей DataSet при повторном выполнении
wsnetschi,

А чем fielddefs отличается от field ?

"Datasets use TFieldDefs to manage the field definitions they use to create field objects that correspond to fields in a database table. Every field definition listed by TFieldDefs has a corresponding TField object, but not all TField objects have a corresponding field definition. For example, calculated fields do not have field definitions.

TTable and TClientDataSet objects also use TFieldDefs when creating a new table.

With object field types, such as TADTField and TArrayField , there are two ways to represent the field definitions: hierarchically or flattened. When represented hierarchically, object field definitions contain a set of child definitions for the constituent subfields. When represented as a flattened set, child field definitions appear as siblings sequentially after the parent field definition.

TFieldDefs stores field definitions hierarchically. This is in contrast to TFieldDefList , which lists the child TFieldDef objects of object fields sequentially after the parent TFieldDef .

Use the properties and methods of TFieldDefs to:

Access a specific field definition.

Add or delete field definitions from the list (when creating new tables).

Find out how many fields are defined.

Copy a set of field definitions to another dataset.
"


vs

"TField encapsulates the fundamental behavior common to all field components. It introduces the properties, events, and methods that are used to:

Change the value of a field in a dataset.

Convert the value of a field from one data type to another.

Validate data that the user enters for a field.

Define how the data in the field appears as it is displayed or edited.

Calculate the value of a field from code written in the OnCalcFields event of the dataset.

Look up the field's value from another dataset.

Do not create instances of TField. TField descendants are created automatically each time a dataset is activated. These descendants can be dynamic (the default) or persistent. Dynamic field components reflect the columns in the underlying metadata at the time a dataset is opened. Persistent field components are created at design time using the Fields editor, which specifies the fields in the dataset, their properties, and their ordering.

Creating persistent field components guarantees that each time an application runs, it uses and displays the same columns, in the same order, even if the physical structure of the underlying database changes. If a column on which a persistent field component is based is deleted or changed, the IDE generates an exception rather than opening the dataset against a nonexistent column or mismatched data. If this happens, remove the field component for the nonexistent field using the Fields editor.
"
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дублирование полей DataSet при повторном выполнении / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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