Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ClientDataSet->LoadFromFile, обновить 
:(
    Опции темы
Лена
Дата 25.9.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как сразу, после открытия предварительно сохраненного файла *.xml, обновить на основании его таблицу в базе данных? Пишу:
Код

void __fastcall TForm1::ButtonOpenClick(TObject *Sender)
{
   if(OpenDialog1->Execute())
    {
     DataModule2->ClientDataSetKey->LoadFromFile(OpenDialog1->FileName); //загрузка нужного файла *.xml все нормально
     DataModule2->ClientDataSetKey->ApplyUpdates(-1); //сразу хочу обновить базу на основе загруженнного
    }
}

В ClientDataSetKey открывается содержимое OpenDialog1->FileName. Я его вижу. Хочу сразу переслать его в базу. Однако, не взирая на наличие строки:   DataModule2->ClientDataSetKey->ApplyUpdates(-1); открываю саму базу и вижу что там не произошло обновление на основании содержимого загруженного строкой DataModule2->ClientDataSetKey->LoadFromFile(OpenDialog1->FileName); Как сразу после загрузки в ClientDataSet обновить на его основании таблицу в базе данных?


PM MAIL   Вверх
Лена
Дата 25.9.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кажись начинаю понимать.  smile 
Наверное надо сначала удалить все записи из таблицы в базе данных и лишь потом засылать новые данные, полученнные LoadFromFile
PM MAIL   Вверх
Vyacheslav
Дата 25.9.2006, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Думаю, что это не поможет. Дело в том, что ClientDataSet предназначался для работы в briefcase model и сиьуация при которой сначала содержимое сбрасывается в файл и потом восстанавливается является стандартной: закачали данные с сервера, отключились от сервера, сохранили данные, выключили компьютер и уехали  куда-то, где сервер недоступен(в командировку к клиенту smile ).
Там включили компьютер, загрузили данные из файла  и вместе с клиентом сделали изменения(заказ).  Сохранили в файле. Приехали домой, подключились к серверу, загрузили данные из файла и проапдейтили данные на сервере.
При этом у нас изменениями будут считаться только те данные, которые отредактированы.
Вам скорее всего придется сделать таким образом: загрузить в другой ClientDataSet, и из него перегнать в тот, который связан с провайдером 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 25.9.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vyacheslav @ 25.9.2006,  16:06)
Думаю, что это не поможет. 


Да не помогло:
Код

void __fastcall TForm1::ButtonOpenClick(TObject *Sender)
{
   if(OpenDialog1->Execute())
    {
     DataModule2->ClientDataSetKey->LoadFromFile(OpenDialog1->FileName);
     if (Application->MessageBox("Заменить этой открываемой таблицей соответствующую ей таблицу в базе данных?",
         "Произвести замену?", MB_YESNO + MB_ICONQUESTION) == IDYES) {

         DataModule2->ADOQueryKey->Active = false;
         DataModule2->ADOQueryKey->SQL->Clear();
         DataModule2->ADOQueryKey->SQL->Add("delete FROM keys");
         DataModule2->ADOQueryKey->Active = true;
         DataModule2->ClientDataSetKey->ApplyUpdates(-1); //исключение
     }
     else {

       return;
     }

    }


}


ОШИБКА: Command text does not return a result set!


>загрузить в другой ClientDataSet


Буду пробывать.  smile 



P.S. Как правильно содержимое одного ClientDataSet присваивать другому и нужно ли очищать от данных после присвоения ClientDataSet-источник, чтобы он не оставался заполненным?





Это сообщение отредактировал(а) Лена - 25.9.2006, 16:30
PM MAIL   Вверх
Vyacheslav
Дата 25.9.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



попробу сначала вот так. Может пройдет и без второго ClientDataSet  через провайдера ( не знаю как у Вас он называется. Пусть будет  ProviderKey
Код

ProviderKey->(ClientDataSetKey->Data, -1, ErrCount);



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 25.9.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



На новой строке пока ошибка:
Код

void __fastcall TForm1::ButtonOpenClick(TObject *Sender)
{
   if(OpenDialog1->Execute())
    {

     DataModule2->ClientDataSetKey->LoadFromFile(OpenDialog1->FileName);
     if (Application->MessageBox("Çàìåíèòü ýòîé îòêðûâàåìîé òàáëèöåé ñîîòâåòñòâóþùóþ åé òàáëèöó â áàçå äàííûõ?",
         "Ïðîèçâåñòè çàìåíó?", MB_YESNO + MB_ICONQUESTION) == IDYES) {

         DataModule2->ADOQueryKey->Active = false;
         DataModule2->ADOQueryKey->SQL->Clear();
         DataModule2->ADOQueryKey->SQL->Add("delete FROM keys");
         DataModule2->ADOQueryKey->Active = true;
         DataModule2->DataSetProviderKey->(ClientDataSetKey->Data, -1, ErrCount); //ошибка!
         DataModule2->ClientDataSetKey->ApplyUpdates(-1);
     }
     else {

       return;
     }

    }

}


[C++ Error] MDataBase.cpp(59): E2280 Member identifier expected

Это сообщение отредактировал(а) Лена - 25.9.2006, 17:12
PM MAIL   Вверх
Vyacheslav
Дата 25.9.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



smile
Код

ProviderKey->ApplyUpdates(ClientDataSetKey->Data, -1, ErrCount);


Добавлено @ 17:33 
Эй - ей. Так
Код

DataModule2->ADOQueryKey->Active = false;
DataModule2->ADOQueryKey->SQL->Clear();
DataModule2->ADOQueryKey->SQL->Add("delete FROM keys");



нельзя. Это же у вас запрос, который с помощью провайдера подрубается к ClientDataSet. Вы его меняете на "delete FROM keys", а потом этот запрос "delete FROM keys" пытаетесь проапдейтить.
Естесвенный ответ 
Command text does not return a result set!
Кто нибудь будет спорить, что delete FROM keys не возвращает результата ? smile



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 26.9.2006, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пока не получается. Пробую так: 

Код

void __fastcall TForm1::ButtonOpenClick(TObject *Sender)
{
   if(OpenDialog1->Execute())
    {
    DataModule2->ClientDataSetKey->LoadFromFile(OpenDialog1->FileName);
     if (Application->MessageBox("Заменить этой открываемой таблицей соответствующую ей таблицу в базе данных?",
         "Произвести замену?", MB_YESNO + MB_ICONQUESTION) == IDYES) {
         int ErrCount = 0;
         DataModule2->DataSetProviderKey->ApplyUpdates(DataModule2->ClientDataSetKey->Data, -1, ErrCount);


     }
     else {

       return;
     }

    }

Загружаю файл, жму "ОК". Во вновь загруженные в грид данные добавляю еще одну строку с данными. Закрываю приложение. Открываю его вновь. В гриде находиться только строка, которую я добавила, а всех данных из .xml файла снова нет в гриде. Не происходит замена и пересылка данных после LoadFromFile в базу. Как подправить код?  smile 
PM MAIL   Вверх
Vyacheslav
Дата 26.9.2006, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Скорее всего только так

Код

void __fastcall TForm1::ButtonOpenClick(TObject *Sender)
{
   if(OpenDialog1->Execute())
    {
    DataModule2->TempClientDataSetKey->LoadFromFile(OpenDialog1->FileName);
     if (Application->MessageBox("Заменить этой открываемой таблицей соответствующую ей таблицу в базе данных?",
         "Произвести замену?", MB_YESNO + MB_ICONQUESTION) == IDYES) {
         int ErrCount = 0;
         for(DataModule2->TempClientDataSetKey->First(); !DataModule2->TempClientDataSetKey->Eof; DataModule2->TempClientDataSetKey->Next()){
    DataModule2->ClientDataSetKey->Insert();
    for(int i = DataModule2->ClientDataSetKey->FieldCount; i--) {
         DataModule2->ClientDataSetKey->Fields->Fields[i]->Value = DataModule2->TempClientDataSetKey->Fields->Fields[i]->Value; 
    }
        
    DataModule2->ClientDataSetKey->Post();
    
}
             }
     else {

       return;
     }

    }




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 26.9.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не получается smile 
Кол-во записей между теми что в файле и теми которые в реальной таблице разные. Не получается полностью обновить.
Может мне использовать компонент ADOCommand и дать в нем команду на удаление записей в базе данных, а потом добавить записи из открываемого файла в уже пустую таблицу в базе?

P.S.
Подскажите еще, пожалуйста, как правильно обработать ошибку, если пользователь вводит в колонку значение, а оно не должно дублироваться, т.е. все значения должны быть в этой колонке уникальными. Как правильно это отслеживать?
Спасибо.



Это сообщение отредактировал(а) Лена - 26.9.2006, 19:00
PM MAIL   Вверх
Vyacheslav
Дата 27.9.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Лена. 
Вы начинаете с технической проблемы, а потом выясняется что проблема не техничская, а логическая.
Сейчас попробую восстановить постановку задачи.
В таблицы есть записи, имеющие первичный ключ.
Есть файл с записями, которыми таблица может быть обновлена. Причем в файле могут быть записи, соответсвующие по первичному ключу  записям таблицы.
Требуется обновить таблицу записями из файла.

Теперь некоторые предположения: поскольку Вы постоянно стремитесь очистить таблицу перед загрузкой, я делаю два вывода :
1. что при удалении записи из таблицы  каскадного удаления из других таблиц не происходит
2. если при обновлении из файла, в файле нет записи, которую по первичному ключу можно сопоставить с записью в таблице, то такая запись в таблице должна быть удалена. То есть при обновлении из файла происходит не  мерж, а замена.
После обновления содержимое таблицы полностью эквиавлентно содержимому файла

Код

         
  //временно  убираем вызов ApplyUpdates, чтобы не дергать на каждую запись сервер
try{
  DataModule2->ClientDataSetKey->AfterDeleter = NULL;
  DataModule2->ClientDataSetKey->AfterPost = NULL;
  //очищаем таблицу 
  DataModule2->ClientDataSetKey->EmptyDataSet();
  DataModule2->ClientDataSetKey->ApplyUpdates(-1);
  for(DataModule2->TempClientDataSetKey->First(); !DataModule2->TempClientDataSetKey->Eof; DataModule2->TempClientDataSetKey->Next()){
    DataModule2->ClientDataSetKey->Insert();
    for(int i = DataModule2->ClientDataSetKey->FieldCount; i--) {
         DataModule2->ClientDataSetKey->Fields->Fields[i]->Value = DataModule2->TempClientDataSetKey->Fields->Fields[i]->Value; 
    }
}        
    DataModule2->ClientDataSetKey->Post();
    
}
DataModule2->ClientDataSetKey->ApplyUpdates(-1);
}
__finally
{
  //восстанавливаем обработчики
  DataModule2->ClientDataSetKey->AfterDelete= DataModule2->ClientDataSetKey->ClientDataSetKeyAfterDelete
  DataModule2->ClientDataSetKey->AfterPost = DataModule2->ClientDataSetKey->ClientDataSetKeyAfterPost;
;

}






--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 27.9.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vyacheslav, огромное спасибо!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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