Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование таблиц одной базы в другую, с заменой значение определлных колонок 
V
    Опции темы
Rodeon
  Дата 25.8.2009, 05:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 28.8.2008
Где: Россия, Ухта

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



Здравствуйте уважаемые!

Такая задача иметься, две базы mdb, одна пустая, вторая с данными, базы абсолютно идентичные по количеству таблиц и наименований полей. Надо из второй скопировать из таблиц все значения в первую по условию, т.е. только те значения, в которых номер поля «скважина» соответствует выбранному в combobox-е, и потом уже скопировать таблицу в первую (пустую) базу, но уже с измененным номером поля «скважина» с заранее введенный в edit-е.
На форме все настроено уже для открытия обоих баз и передачи названий скважин из второй базы в combobox.
После этого передаются данные из второй таблицы в  Query с сортировкой
Код

ADOQuery.SQL.Add('SELECT * FROM T_18 WHERE T_18.Скважина='+IntToStr(ComboBox2.ItemIndex+1)+' ORDER BY T_18.Кровля);

Надо теперь изменить значения T_18.Скважина, загруженные в Query на значение из Edit-а и сохранить во вторую базу. Как лучше это сделать, в цикле или есть более действенный способ и как все потом записать в первую базу?
Было бы очень уж хорошо кусочек кода, хотя бы схематически!  smile 
Заранее спасибо за ответ!
PM MAIL   Вверх
vovk
Дата 25.8.2009, 05:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если действие одноразовое, то можно скопировать файлик с данными, а там просто удалить не нужное, и изменить значения
PM MAIL   Вверх
Rodeon
  Дата 25.8.2009, 05:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 28.8.2008
Где: Россия, Ухта

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



Задача осложняеться тем, что в базе таблиц окола 40+. Просто хочу по аналогии все в программе что-бы редактировалось. В ручную счас делают, но не удобно и долго, тем более что все данные перепутаны, т.е. сортировка отсутствует как факт и не сохраняеться.
PM MAIL   Вверх
Frees
Дата 25.8.2009, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

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





--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Rodeon
  Дата 25.8.2009, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 28.8.2008
Где: Россия, Ухта

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



Спасибо за ссылку, читал уже этот пример через поиск!
Код

INSERT INTO T_18 SELECT * FROM T_18 WHERE T_18.Скважина='+IntToStr(ComboBox2.ItemIndex+1)+' ORDER BY T_18.Кровля);


Под мой случай было бы наверное так!?
Но в этом примере, как я понял для ситуации, когда таблицы из одной базы, а у меня разные базы, два файла.
Так-то было бы неплохо, но как-то можно явно указать из какой базы брать и в какую вставлять!? Причем после редактирования поля "Скважина", т.е. присвоению всему полю "Скважина" значения из edit-а.

Редактирование сделал:
Код

  For i:=0 to ADOQuery.RecordCount-1 do
  Begin
    ADOQuery.IndexFields[0].Value:=StrToint(Edit1.Text);
  End;

Остался вопрос как из Query измененные данные сохранить в первой, пустой базе, не изменяв их во второй.

Это сообщение отредактировал(а) Rodeon - 25.8.2009, 06:45
PM MAIL   Вверх
Frees
Дата 25.8.2009, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

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



Цитата(Rodeon @  25.8.2009,  09:38 Найти цитируемый пост)
, а у меня разные базы,

адо помоему умеет к разным бд запрос делать...(не уверен доку надо читать)
погугли гетерогенные запросы в адо

либо цикл по записям


Это сообщение отредактировал(а) Frees - 25.8.2009, 06:47


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Rodeon
  Дата 25.8.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 28.8.2008
Где: Россия, Ухта

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



Показались сложными пока мне эти гетерогенные запросы!
Сделал все в цикле.
Кинул на форму 2 ADOConnection
Первый связал с AdoQuery
Второй с ADOTable
В Query делаю запрос
Код

 ADOQuery.SQL.Add('SELECT * FROM T_18 WHERE T_18.Скважина='+IntToStr(ComboBox2.ItemIndex+1)+' ORDER BY T_18.Кровля');


Потом в цикле переношу все в AdoTable с присвоением полю "Скважина" значение из Edit-а
Код

begin
  ADOQuery.SQL.Clear;
  ADOQuery.SQL.Add('SELECT * FROM T_18 WHERE T_18.Скважина='+IntToStr(ComboBox2.ItemIndex+1)+' ORDER BY T_18.Кровля');
  ADOQuery.Active:=true;
  ADOQuery.First;
  adotable.TableName:='T_18';
  adotable.Active:=true;
  For i:=0 to ADOQuery.RecordCount-1 do
  Begin
    Adotable.Insert;
    Adotable.FieldByName('Скважина').Value:=StrToint(Edit.Text);
    Adotable.Fields.Fields[2].Value:=ADOQuery.Fields.Fields[2].Value;
    Adotable.Fields.Fields[3].Value:=ADOQuery.Fields.Fields[3].Value;
    ....
    ....
    ....
    Adotable.Fields.Fields[9].Value:=ADOQuery.Fields.Fields[9].Value;
    ADOQuery.Next;
    Adotable.Next;
  End;

end;

В принципе работает, может и не так быстро как хотелось бы, но все же лучше, чем в ручную копировать данные из базы в базу. Если кто подскажет как можно ускорить процесс - буду благодарен!
PM MAIL   Вверх
vovk
Дата 25.8.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



записи начинаются не 0 а с 1 по моему тут так
For i:=1 to ADOQuery.RecordCount do
  аа посмотрел смысл тотже .. там же только количество прохождения цикла, то же самое в общем

просто обычно по записям так пробегают

Код

ADOQuery.First;
While not ADOQUery.Eof do
begin
...
...
...
ADOQuery.next;
end;


 вместо этого  Adotable.Next; надо Adotable.Post;

процесс немного ускорит отключения контроля на момент копирования записей
до начала цикла
Код

ADOTable.DisableControls;
ADOQuery.DisableControls;


а после окончания копирования
Код

ADOTable.EnableControls;
ADOQuery.EnableControls;


Есть одна мысль. Домой с работы вернусь попробую сделать отпишусь если выйдет

Это сообщение отредактировал(а) vovk - 26.8.2009, 03:21
PM MAIL   Вверх
Rodeon
  Дата 25.8.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 28.8.2008
Где: Россия, Ухта

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



Посидел еще, тоже на мысль о цикле пришла в голову, после того как в одной таблице увидел 36 полей:
Код

For j:=0 to ADOQuery.FieldCount-1 do Adotable.Fields.Fields[j].Value:=ADOQuery.Fields.Fields[j].Value;

Счас попробую насчет отключения контроля.
Спасибо всем за советы!
PM MAIL   Вверх
vovk
Дата 25.8.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



вот тут проверил запрос типа

Код

Insert into Table1 select * from table1 IN "c:\data\my.mdb"
 нормально работает....
как раз о таком вроде Frees в 6 посте говорил

ЗЫ мысль была другая, к ней ещё может вернусь еси время будет..

Это сообщение отредактировал(а) vovk - 25.8.2009, 15:21
PM MAIL   Вверх
Rodeon
  Дата 26.8.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 28.8.2008
Где: Россия, Ухта

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



Блин, что-то не до конца понимаю, table1 - это что? Выбранная база в Query через запрос:
Код

ADOQuery.SQL.Add('SELECT * FROM T_18 WHERE T_18.Скважина='+IntToStr(ComboBox2.ItemIndex+1)+' ORDER BY T_18.Кровля');

В запросе поменял таблицу на свою:
Код

 ADOQuery.SQL.Add('Insert into T_18 select * from T_18 IN "'+OpenDialog1.FileName+'"');

Ошибки выдает, либо найти не может таблицу T_18, либо синтаксическая ошибка, либо "текущий проводник не поддерживает возврат нескольких наборов записи в результате одной операции"!? 

Может кусок кода рабочего с этим запросом напишите или объясните, что надо за Table1 выдавать?
Спасибо заранее!
PM MAIL   Вверх
vovk
Дата 26.8.2009, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



вот пожалуйста 
Код

procedure TForm1.btn1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
ADOQuery1.SQL.Text:='INSERT INTO table_ '+
'Select * From table_1 IN "'+OpenDialog1.FileName+'"';
ADOQuery1.ExecSQL;
  end;
end;

Так выглядит строка подключения 
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\data\newaccess.mdb;Persist Security Info=False
записи копируются из файла C:\data\newaccess1.mdb
table_1  имя таблицы в файле из которого копируем 

кстати ADOQuery.SQL.Add добавляет текст к тому что находится в ADOQuery.SQL.Text

если вы пишите новый запрос то перед этим надо очистить содержимое ADOQuery.SQL.Text
хотябы так ADOQuery.SQL.Clear; 

а ошибка 
Цитата

либо "текущий проводник не поддерживает возврат нескольких наборов записи в результате одной операции"!? 

 возникает, когда запрос не возвращающий записей пробуют выполнить с помощью open
или active:=true, что вобщемто одно и тоже

если не получится покажите код с помощью которого пробуете добавить записи, может просто чегото не учли..


Это сообщение отредактировал(а) vovk - 26.8.2009, 03:35
PM MAIL   Вверх
Rodeon
  Дата 26.8.2009, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 28.8.2008
Где: Россия, Ухта

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



Ура!!!!
Спасибо огромное за помощь! Все получилось, копирует мгновенно!
Окончательная версия, так сказать:

Код

  ADOQuery.SQL.Clear;
  ADOQuery.SQL.Text:='INSERT INTO T_18 Select * From T_18 IN "'+OpenDialog.FileName+'" WHERE T_18.Скважина='+IntToStr(Nomer[ComboBox2.ItemIndex])+' ORDER BY T_18.Кровля';
  ADOQuery.ExecSQL;


Позже, открываю эту же таблицу и в цикле меняю поле T_18.Скважина на нужное из Edit-а.

Еще раз спасибо всем, особенно vovk за оперативность и доходчивые ответы.
Все. Задача решена.

Это сообщение отредактировал(а) Rodeon - 26.8.2009, 05:20
PM MAIL   Вверх
vovk
Дата 26.8.2009, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



изменения тоже можно прямо в запросе делать

Код

ADOQuery1.SQL.Text:='INSERT INTO table_ (pole1, pole2, pole3, pole4)'+
'Select ('+quotedstr(edit1.text)+'pole2, pole3, pole4) as new_data, From table_1 IN "'+OpenDialog1.FileName+'"';

если сделать так, то во все записи pole1, в таблице table_ попадёт значение содержащееся в edit1.text.
Можно и вычисления делать или менять текст в зависимости от значений в других полях этой записи.

Или потом изменения вносить можно тоже с помощью запроса а не в цикле.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

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

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


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

FAQ раздела лежит здесь!


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




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


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

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