C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Динамическое создание новых полей в TDataSet
L33t
Отправлено: 25.06.2006, 17:32


Ученик-кочегар

Группа: Участник
Сообщений: 1



C++ Builder 6. WinXP SP1. VCL.

Требуется создать 31 поле с названиями "DayN" (N = 1..31) в датасете WorkersDataSet.

Что делаю я:
CODE

WorkersDataSet->Close();
for (int i=1; i<32; i++) {
   TStringField *T = new TStringField(WorkersDataSet);
   T->FieldName = "Day"+IntToStr(i);
   T->Name = WorkersDataSet->Name + T->FieldName;
   T->Index = WorkersDataSet->FieldCount;
   T->DataSet = WorkersDataSet;
   WorkersDataSet->Fields->Add(T);
   delete T;
}
WorkersDataSet->Open();


Билдер при компиляции выдает следующее сообщение:
QUOTE
---------------------------
Debugger Exception Notification
---------------------------
Project CarPark.exe raised exception class EDatabaseError with message 'WorkersDataSet: Duplicate field name 'Day2''. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help  
---------------------------
AVC
Отправлено: 27.06.2006, 10:35


Ветеран

Группа: Модератор
Сообщений: 1583



CODE

for (int i=1; i<32; i++) {
  TStringField *T = new TStringField(WorkersDataSet);
  T->FieldName = "Day"+IntToStr(i);
  T->Name = WorkersDataSet->Name + T->FieldName;
  T->Index = WorkersDataSet->FieldCount;
  T->DataSet = WorkersDataSet;
T->Calculated = true;
//   WorkersDataSet->Fields->Add(T);
//   delete T;
}

При повторном использовании не забывайте удалять созданные компоненты.
olegenty
Отправлено: 27.06.2006, 11:23


Ветеран

Группа: Модератор
Сообщений: 2412



не забудь перед Open() сделать так:
CODE

WorkersDataSet->FieldDefs->UpDate();


Вернуться в Работа с базами данных в C++Builder