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

 
ClientDataSet, очистка данных перед загрузкой новы
** Инга
Отправлено: 25.11.2005, 17:57


Не зарегистрирован







Заполняю, во время выполнения, данными ClientDataSet. Просмотрев их, хочу загрузить в этот же ClientDataSet другие данные.
Как проверить содержаться ли в ClientDataSet данные и если да, то очистить ClientDataSet и приступить к заполнению новыми данными.
Удалять, наверное, правильно так:
CODE

if(ClientDataSet2->Active==true)
  {
   ClientDataSet2->First();

   for(int i=1; i<=ClientDataSet2->FieldCount; i++)
    {
     ClientDataSet2->Edit();
     ClientDataSet2->ClearFields();
     ClientDataSet2->FindNext();
    }
  ClientDataSet2->EmptyDataSet();

  }
 ClientDataSet2->Active=false;

Мне надо удалить и колонки и все записи, чтобы компонет пришел в такое состояние, когда его только положили на форму.
Guest
Отправлено: 25.11.2005, 18:33


Не зарегистрирован







Достаточно
DataSet2->Active=false;
** Инга
Отправлено: 25.11.2005, 18:41


Не зарегистрирован







Что такое DataSet2?
У меня ClientDataSet2 соединен с DataSource, но у DataSource нет свойства Active sad.gif
** Инга
Отправлено: 25.11.2005, 18:44


Не зарегистрирован







ClientDataSet2->Active = false;
так не работает. Исключение пишет, что поля уже определены.
** Инга
Отправлено: 25.11.2005, 19:03


Не зарегистрирован







И так исключение, если в самом начале поставить:
DataSource3->DataSet->Active=false;
Admin
Отправлено: 25.11.2005, 21:22


Владимир

Группа: Администратор
Сообщений: 1190



Никогда не приходилось работать с ClientDataSet,
но почему бы не попробовать динамически создавать его,
а когда стал не нужен — удалять ?
CODE

// создаем
TClientDataSet* ClientDataSet = new TClientDataSet(Form1);
// работаем с ним
.....
// удаляем
delete ClientDataSet;
** Инга
Отправлено: 26.11.2005, 15:13


Не зарегистрирован







Данные выводятся в гриде который расположен на другой форме и присодинет к ClientDataSet на главной. Если бы все было в одной форме, то с new было бы легче.

Может чистить ClientDataSet как-то так:
if(ClientDataSet2->FieldDefs->Count)
{
for(int i=0; iFieldDefs->Count; i++)
{
ClientDataSet2->Edit();
ClientDataSet2->Fields->Fields[i]->Clear();

}
}
Как очистить списки FieldDefs?
После очистки нужно ли еще ClientDataSet2->EmptyDataSet();?


** Инга
Отправлено: 26.11.2005, 15:26


Не зарегистрирован







Вроде получилось, исключения пропали, но надежен ли такой код?
Вставляю перед заполнением:

CODE

if(ClientDataSet2->FieldDefs->Count)
       {

          ClientDataSet2->Edit();
          ClientDataSet2->FieldDefs->Clear();
          ClientDataSet2->IndexDefs->Clear();
          ClientDataSet2->Close();

       }
//далее заполняю новыми колонками и данными



Так надежно?
Guest
Отправлено: 26.11.2005, 19:16


Не зарегистрирован







Вполне надежен.

А попробуйте этот код без строчки:
ClientDataSet2->Edit();
будет рабатать ?

Если будет, то оставляйте без этой строчки,
не будет — оставляйте с этой строчкой.

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