Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2014, 20:27   #1
terexa
Пользователь
 
Регистрация: 05.12.2014
Сообщений: 11
По умолчанию Скопировать выделенные строки в DBGrid из одной таблицы в другую

Форма:
TDataSource2, TADOQuery2, DBGrid2 - отображение таблицы HourData
TDataSource3, TADOQuery3, DBGrid3 - отображение таблицы HourData_3
Структура таблиц аналогичная: поля Data, TimeMs, TStreet, Tinside, DataEdit
Для DBGrid2 установлено MultiSelect=True

1) Необходимо скопировать только выделенные в DBGrid2 строки из таблицы2 (HourData) в таблицу3 (HourData_3).


Просмотрел статьи на форуме,везде идут отсылки на одно и тоже, и нет информации в случае MultiSelect.
Попытался в таком формате, но получаю ошибку.
Код:
for i:=0 to DBGrid2.SelectedRows.Count-1 do
begin
      DBGrid2.DataSource.DataSet.GotoBookmark(Pointer(DbGrid2.SelectedRows[i]));
      with ADOQuery3 do
      begin
        Active:=False;
        SQL.Clear;
        Zapros:='INSERT INTO HourData_3 (Data,TimeMs,TemperatureInside,TemperatureStreet,DataFull) VALUES (:pData,:pTimeMs,:pTempInside,:pTempStreet,:pDataTime);';
        SQL.Add(Zapros);
        Parameters.ParamByName('pData').Value:=DBGrid2.DataSource.DataSet.Fields[0].Value;
        Parameters.ParamByName('pTimeMs').Value:=DBGrid2.DataSource.DataSet.Fields[1].Value;
        Parameters.ParamByName('pTempInside').Value:=DBGrid2.DataSource.DataSet.Fields[2].Value ;
        Parameters.ParamByName('pTempStreet').Value:=DBGrid2.DataSource.DataSet.Fields[3].Value ;
        ExecSQL;
        Active:=True;
      end;
      DBGrid2.SelectedRows.Clear;
end;
Как только выполнение доходит до:
Parameters.ParamByName('pData').Val ue:=
Ошибка1: Argument out of range.
Как понимаю, ругается на правую часть.

При проверке, если заменить не на значения из БД:
Parameters.ParamByName('pData').Val ue:=DateOf(Now) ;//DateOf(Now);
Ошибка2: ADOQuery3: CommandText does not return a result set.

Последний раз редактировалось Stilet; 17.12.2014 в 21:16.
terexa вне форума Ответить с цитированием
Старый 17.12.2014, 20:32   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Какой Active:=True для UPDATE после ExecSQL? Не будет там ни какого набора данных после. SELECT нужен, и очень желательно в другом датасете
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.12.2014, 20:56   #3
terexa
Пользователь
 
Регистрация: 05.12.2014
Сообщений: 11
По умолчанию Прошу прощения, но не понятно

про Active:=True - это я уже заэкспериментировался. Про SELECT не понял, ведь сначала надо вставить выделенное, а ругается уже на этапе присваивания полю в первой выделенной строке значения, как параметру
terexa вне форума Ответить с цитированием
Старый 17.12.2014, 21:44   #4
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

А попробуйте вот так:
Код:
Parameters.ParamByName('pData').Value:=DBGrid2.Fields[0].AsVariant;
И остальное перепишите без ненужных, лишних символов.
Зачем вы сами себе ухудшаете разборчивость программы?
kropotkina-alice вне форума Ответить с цитированием
Старый 18.12.2014, 13:07   #5
terexa
Пользователь
 
Регистрация: 05.12.2014
Сообщений: 11
По умолчанию To kropotkina-alice: Не сработало

исправил на предложенный Вами вариант. Изменилось только сообщение (прилагаю). При отладке в этих значения Innaccessible value....
Изображения
Тип файла: jpg Проблема Selected 1.jpg (28.9 Кб, 170 просмотров)
terexa вне форума Ответить с цитированием
Старый 19.12.2014, 19:42   #6
terexa
Пользователь
 
Регистрация: 05.12.2014
Сообщений: 11
По умолчанию Заработало. Спасибо.

Спасибо, Avatar, за определение курса. Спасибо kropotkina-alice за оптимизацию.

Действительно, проблема была в ADOQuery.Active:=true, т.к. выше в цикле Запрос менялся на INSERT, соответственно при Active=True и выдавались ошибки (прилагаю, чтобы был ориентир для других), меняю на SELECT и все работает.
Сбил с толку пример c форума, на основании которого и был сделан первый вариант.

Итоговый вариант:

for i:=0 to DBGrid2.SelectedRows.Count-1 do
begin
DBGrid2.DataSource.DataSet.GotoBook mark(Pointer(DbGrid2.SelectedRows[i]));
with ADOQuery3 do
begin
Active:=False;
SQL.Clear;
Zapros:='INSERT INTO HourData_2 (Data,TimeMs,TemperatureInside,Temp eratureStreet,DataFull) VALUES (:pData,:pTimeMs,:pTempInside,:pTem pStreet,:pDataTime);';
SQL.Add(Zapros);
Parameters.ParamByName('pData').Val ue:=DateOf(DBGrid2.DataSource.DataS et.Fields[0].Value) ;
Parameters.ParamByName('pTimeMs').V alue:=DBGrid2.Fields[1].Value ;
Parameters.ParamByName('pTempInside ').Value:=DBGrid2.Fields[2].Value ;
Parameters.ParamByName('pTempStreet ').Value:=DBGrid2.Fields[3].Value ;
Parameters.ParamByName('pDataTime') .Value:=Now;
ExecSQL;
end;
end;
//DBGrid2.SelectedRows.Clear;//используем, если надо снять выделение строк. Мне не надо.
with ADOQuery3 do
begin
SQL.Clear;
Zapros:='SELECT * FROM HourData_2;';
SQL.Add(Zapros);
Active:=True;
end;
Изображения
Тип файла: jpg Проблема Selected 2.jpg (30.1 Кб, 106 просмотров)
Тип файла: jpg Проблема Selected 2_2.jpg (27.6 Кб, 90 просмотров)
terexa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача строки из одной таблицы в другую, при помощи DBGrid!? Bane БД в Delphi 4 17.03.2014 15:23
Как скопировать данные из одной таблицы в другую? Ольга А Microsoft Office Access 0 29.10.2012 19:46
MS SQL SERVER 2005 копирование таблицы из ОДНОЙ БД В другую или перенести все строки из одной таблицы в другую reihtmonbern БД в Delphi 4 17.07.2012 23:25
Скопировать значения blob поля из одной таблицы в другую BDE Paradox astecenko БД в Delphi 1 02.12.2011 11:26
Как скопировать данные таблицы из одной базы access в другую? AK BULLETS БД в Delphi 2 31.03.2010 13:09