Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение структуры DBF-а в программе 
:(
    Опции темы
GraNit
Дата 4.3.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

Репутация: нет
Всего: нет



Здравствуйте!

Может вы сможете мне помочь? Писал уже в форум 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;
      }

Прошу вашей помощи. Спасибо.
PM MAIL   Вверх
Данкинг
Дата 4.3.2010, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Приложи таблицу ради интереса.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
GraNit
Дата 5.3.2010, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

Репутация: нет
Всего: нет



Вот, пожалуйста.

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

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  PAYDOC.DBF 0,44 Kb
PM MAIL   Вверх
GraNit
Дата 12.3.2010, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

Репутация: нет
Всего: нет



Разобрался.
Вот в чем была проблема:
      Данные о полях таблицы в первую очередь хранят компонент 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();
 
Далее создаем соединение и открываем базу.
Кажется все.
PM MAIL   Вверх
Данкинг
Дата 12.3.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



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

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

user posted image


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Advantage Database Server | Следующая тема »


 




[ Время генерации скрипта: 0.9701 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.