Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Advantage Database Server > Изменение структуры DBF-а в программе


Автор: GraNit 4.3.2010, 19:11
Здравствуйте!

Может вы сможете мне помочь? Писал уже в форум C++Builder т.к. программа пишется в этой среде, но пока безуспешно.
Суть проблемы:
Следует изменить структуру DBF файла программой. Использую компонент Advantage TDataSet Descendant 8.1. В нем есть специальный метод AdsTable1->Restructure, но при попытке открыть измененную таблицу получаю ошибку "Project Project.exe raised exeption class EDatabaseError with message 'AdsTable1: Field 'DVV' not found'. Process stoped. Use Step or Run to continue."
Вопрос: каким образом программа знает о удаленном поле? его уже физически нет в базе.
Вот код:
Код

     if ( AdsTable1->FieldDefs->IndexOf("DVV")> -1) AdsTable1->Restructure("","DVV","");
     if ( AdsTable1->FieldDefs->IndexOf("DAV")> -1) AdsTable1->Restructure("","DAV","");
     if ( AdsTable1->FieldDefs->IndexOf("INN")> -1) AdsTable1->Restructure("","INN","");
     if ( AdsTable1->FieldDefs->IndexOf("LIST")== -1) AdsTable1->Restructure("LIST,Numeric,1","","");
     AdsTable1->FieldDefs->Update();
     try {
        AdsTable1->Active = true;
      }
     catch( ... )
      {
            MessageDlg( "Программа не может открыть таблицу!", mtError, TMsgDlgButtons( ) << mbOK, 0 );
            Application->Terminate( );
            return;
      }

Прошу вашей помощи. Спасибо.

Автор: Данкинг 4.3.2010, 19:39
Приложи таблицу ради интереса.

Автор: GraNit 5.3.2010, 06:53
Вот, пожалуйста.

Добавлено через 1 минуту и 58 секунд
Ха smile
Первый раз что-то не получилось
А так?

Автор: GraNit 12.3.2010, 19:18
Разобрался.
Вот в чем была проблема:
      Данные о полях таблицы в первую очередь хранят компонент TField. (Для чего требуется FieldDefs я пока не понял. Ну это я  пока отложу.) По этой проблеме я получал ошибку при изменении структуры таблицы, т.к. после изменения, НО до открытия таблицы следует сделать Table1->Fields->Clear(). И после этого можно смело открывать базу. Т.к. я использую компонент Advantage TDataSet Descendant, то в моем распоряжении имеется специальная функция AdsRestructureTable, которая поможет мне изменить таблицу.
     Ну а вот, собственно, решение:
Код

     UNSIGNED32 RetCode;

     AnsiString TableName = GetCurrentDir()+"\\"+AdsConnection->ConnectPath+"PAYDOC.DBF";

     RetCode = AdsRestructureTable(0, TableName.c_str(), NULL,
                                   ADS_NTX, ADS_ANSI, ADS_COMPATIBLE_LOCKING,
                                   ADS_IGNORERIGHTS,
                                   "",
                                   "DVV; DAV; INN",
                                   "");
     RetCode = AdsRestructureTable(0, TableName.c_str(), NULL,
                                   ADS_NTX, ADS_ANSI, ADS_COMPATIBLE_LOCKING,
                                   ADS_IGNORERIGHTS,
                                   "LIST,N,1",
                                   "",
                                   "");
     AdsTable1->Fields->Clear();
 
Далее создаем соединение и открываем базу.
Кажется все.

Автор: Данкинг 12.3.2010, 19:31
Извиняюсь, забыл про эту темку. smile 
Цитата(GraNit @  4.3.2010,  19:11 Найти цитируемый пост)
Вопрос: каким образом программа знает о удаленном поле? его уже физически нет в базе.

Как это нет поля DVV? А это что? smile 

http://www.radikal.ru

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)