C/C++ - Определение индексов при создании таблицы в Builder

Ответить
Аватара пользователя
Apock

C/C++ - Определение индексов при создании таблицы в Builder

Сообщение Apock »

Доброго времени суток всем. Нужна помощь такого плана - пишу прогу на С++ Builder 6. При вводе кое-каких данных и нажатии на кнопку должна создаваться таблица(если её ещё нет) и вноситься в неё данные. В суть программы думаю вникать не буду сейчас, так как не в этом суть. Примерный код такой:



Код:

Код: Выделить всё

AnsiString b=ComboBox4->Text+".db";//таблица имеет имя, вводимое или выбираемое в списке
  if(access(b.c_str(),0)!=0)//проверяем существование таблицы
 {
  Table1->Active = false; // Компонент TTable должен быть отключен.
// Опишем параметры таблицы.
   Table1->DatabaseName = "AceLet";//БД
   Table1->TableType = ttParadox; //как обычно, Парадокс.
// Опишем поля и их типы.
   Table1->FieldDefs->Clear();
   TFieldDef *pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Date";// Дата матча
    pNewDef->DataType=ftDate;//тип поля
    pNewDef->Required=true;
   pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Name";// имя
    pNewDef->DataType=ftString;//тип поля
    pNewDef->Size=15;
//установим, является ли поле обязательным
   pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="sex";// пол, принимает значения 1 или 0. Можно было сделать тип boolean, но что-то не могу с ним разобраться
    pNewDef->DataType=ftInteger;//тип поля
   pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Ageh";// возраст1.
    pNewDef->DataType=ftInteger;//тип поля
   pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Agea";// возраст3.
    pNewDef->DataType=ftInteger;//тип поля
   pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Age2h";// возраст4.
    pNewDef->DataType=ftInteger;//тип поля
   pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Age2a";// возраст5.
    pNewDef->DataType=ftInteger;//тип поля
//следующие поля просто создаются, данные в них вносятся с другой формы позже
   pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Red";// цвет
    pNewDef->DataType=ftInteger;//тип поля
   pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Yel";// цвет2.
    pNewDef->DataType=ftInteger;//тип поля
   pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Place";// место.
    pNewDef->DataType=ftInteger;//тип поля
// Теперь взялись за индексы
   Table1->IndexDefs->Clear();
   TIndexDef *newIndexDef = Table1->IndexDefs->AddIndexDef();
     newIndexDef->Name = "T3";
     newIndexDef->Fields = "Date";
     newIndexDef->Options = TIndexOptions() << ixPrimary << ixUnique;
// Ну и наконец, создаем таблицу.
   Table1->CreateTable();
   Table1->Active=true;
   Table1->Append();
   Table1->FieldValues["Date"] = DateTimePicker1->Date;
   Table1->FieldValues["Name"] = ComboBox4->Text;
   Table1->FieldValues["sex"] = 0;
   if(RadioButton1->Checked==false)
   {
    Table1->FieldValues["Ageh"] = CSpinEdit1->Value;
    Table1->FieldValues["Ageа"] = CSpinEdit2->Value;
   }
   Table1->FieldValues["Age2h"] = CSpinEdit3->Value;
   Table1->FieldValues["Age2а"] = CSpinEdit4->Value;
   Table1->Post();
   Table1->ApplyUpdates();
  }
//если таблица существует, то просто вносим данные
  else 
      {
       Table1->Active=true;
       Table1->Append();
       Table1->FieldValues["Date"] = DateTimePicker1->Date;
       Table1->FieldValues["Name"] = ComboBox3->Text;
       Table1->FieldValues["sex"] = 1;
       if(RadioButton1->Checked==false)
       {
        Table1->FieldValues["Ageh"] = CSpinEdit1->Value;
        Table1->FieldValues["Ageа"] = CSpinEdit2->Value;
       }
       Table1->FieldValues["Age2h"] = CSpinEdit3->Value;
       Table1->FieldValues["Age2а"] = CSpinEdit4->Value;
       Table1->Post();
       Table1->ApplyUpdates();
      }

Проблема с описанием индексов. Сокращаю создаваемую таблицу до двух полей - всё ОК. Ставлю, как в данном примере - выползает "Key Violation" и хоть об стену убейся. Пробовал ставить для каждого поля, начиная со второго ещё индексы, типа

Table1->IndexDefs->Add("Fld5Index","Agea", TIndexOptions()
Ответить

Вернуться в «Программирование и базы данных»