Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL-Запрос для выбора диапазона дат 
:(
    Опции темы
ivanfr
Дата 30.9.2011, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 
Код


ADOQuery2.SQL.Text:= 'UPDATE persona_stor SET znachenie=true WHERE id = :id';

  ADOQuery1.First;
  while not ADOQuery1.Eof do
  begin
    ADOQuery2.Parameters.ParamByName('id').Value:= ADOQuery1.FieldByName('id').Value;
    ADOQuery2.ExecSQL;
    ADOQuery1.Next;
  end;

в данном случае нужно испоьлзовать 2 шт ADOQuery2
первый делает запрос а второй берет данные из первого и помещает в  вторым в бд" правильно? 
Тогда мне нужно задублировать все компоненты, чтоли?

Это сообщение отредактировал(а) ivanfr - 19.7.2012, 07:29
PM MAIL   Вверх
ivanfr
Дата 30.9.2011, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот что у меня получилось.
  
Код


DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Text:='SELECT * '      //fio_work, tabel_nomer,filial, date_uvolnenie, znachenie
                                 +'FROM persona_stor '
                                 +'WHERE date_uvolnenie between :data_nach and :data_kon AND znachenie<>true'; //fio_work, date_uvolnenie,znachenie
  DataModule1.ADOQuery1.Parameters.ParamByName('data_nach').Value:=StrToDate('20.08.2011');
  DataModule1.ADOQuery1.Parameters.ParamByName('data_kon').Value:=StrToDate('20.09.2011');
  DataModule1.ADOQuery1.Open;
//добавить из ADOQuery1, в столбец znachenie в БД  . 
  DataModule1.ADOQuery2.SQL.Text:= 'UPDATE persona_stor SET znachenie=true WHERE id_persona_stor = :id_persona_stor';
  DataModule1.ADOQuery1.First;
  while not DataModule1.ADOQuery1.Eof do
  begin
    DataModule1.ADOQuery2.Parameters.ParamByName('id_persona_stor').Value:=DataModule1.ADOQuery1.FieldByName('id_persona_stor').Value;
    DataModule1.ADOQuery2.ExecSQL;
    DataModule1.ADOQuery1.Next;
  end;

Огромное всем спасбо что помогли объяснить что да как работает. За примеры, код и запросы...

Это сообщение отредактировал(а) ivanfr - 30.9.2011, 11:59
PM MAIL   Вверх
AndreyIQ
Дата 30.9.2011, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ivanfr @ 30.9.2011,  11:33)
ADOQuery2.SQL.Text:= 'UPDATE persona_stor SET znachenie=true WHERE id = :id';

  ADOQuery1.First;
  while not ADOQuery1.Eof do
  begin
    ADOQuery2.Parameters.ParamByName('id').Value:= ADOQuery1.FieldByName('id').Value;
    ADOQuery2.ExecSQL;
    ADOQuery1.Next;
  end;
в данном случае нужно испоьлзовать 2 шт ADOQuery2
первый делает запрос а второй берет данные из первого и помещает в  вторым в бд" правильно? 
Тогда мне нужно задублировать все компоненты, чтоли?

Внимание код с комментариями!
Код

var
  QrSelect: TADOQuery; // ADOQuery для выборки
  QrUpdate: TADOQuery; // ADOQuery для изменения данных
begin
  //---------------------------//
  //     Выбираем записи       //
  //---------------------------//
  QrSelect.SQL.Text:='SELECT id_persona_stor, fio_work, tabel_nomer,filial, date_uvolnenie, znachenie '
    +'FROM persona_stor '
    +'WHERE date_uvolnenie between :data_nach and :data_kon AND znachenie<>true'; // Присваиваем запрос на выборку
  QrSelect.Parameters.ParamByName('data_nach').Value:=StrToDate('20.08.2011');
  QrSelect.Parameters.ParamByName('data_kon').Value:=StrToDate('20.09.2011');
  QrSelect.Open; // Получаем данные

  QrUpdate.SQL.Text:= 'UPDATE persona_stor SET znachenie=true WHERE id_persona_stor = :prm_id_persona_stor'; // Присваиваем запрос на изменение данных

  //---------------------------//
  //     Изменяем значения     //
  //---------------------------//
  QrSelect.First; // Переходим на первую запись выборки
  while not QrSelect.Eof do // Пока недошли до конца выборки
  begin
    QrUpdate.Parameters.ParamByName('prm_id_persona_stor').Value:= // Присваиваем параметру id запроса на изменение
      QrSelect.FieldByName('id_persona_stor').Value;               // значение из текущей записи выборки
    QrUpdate.ExecSQL; // Выполняем изменения в БД
    QrSelect.Next;    // Переходим на след. запись выборки
  end;
end;

PM MAIL   Вверх
ivanfr
Дата 30.9.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



AndreyIQ

Цитата
 Внимание код с комментариями!


Я конечно по другому сделал. Но так я не умел. Спасибо за пример.


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


Шустрый
*


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

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



Код


var
QrUpdate: TADOQuery;
begin
DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Text:='SELECT * '      //fio_work, tabel_nomer,filial, date_uvolnenie, znachenie
                                 +'FROM persona_stor '
                                 +'WHERE date_uvolnenie between :data_nach and :data_kon AND znachenie<>true'; //fio_work, date_uvolnenie,znachenie
  DataModule1.ADOQuery1.Parameters.ParamByName('data_nach').Value:=StrToDate('20.08.2011');
  DataModule1.ADOQuery1.Parameters.ParamByName('data_kon').Value:=StrToDate('20.09.2011');
  DataModule1.ADOQuery1.Open;
//добавить из ADOQuery1, в столбец znachenie в БД  . 
  
QrUpdate.SQL.Text:= 'UPDATE persona_stor SET znachenie=true WHERE id_persona_stor = :id_persona_stor'; // Ошибка вылетает ТУТ!!!!
  DataModule1.ADOQuery1.First;
  while not DataModule1.ADOQuery1.Eof do
  begin
    QrUpdate.Parameters.ParamByName('id_persona_stor').Value:=DataModule1.ADOQuery1.FieldByName('id_persona_stor').Value;
    QrUpdate.ExecSQL;
    DataModule1.ADOQuery1.Next;
  end;

Выдает ошибку Access violation at address 42BDE073. Read of address 42BDE073. 
и не хочет добовлять данные бд. 

Мой выше код работает корректно.
Код

DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Text:='SELECT * '      //fio_work, tabel_nomer,filial, date_uvolnenie, znachenie
                                 +'FROM persona_stor '
                                 +'WHERE date_uvolnenie between :data_nach and :data_kon AND znachenie<>true'; //fio_work, date_uvolnenie,znachenie
  DataModule1.ADOQuery1.Parameters.ParamByName('data_nach').Value:=StrToDate('20.08.2011');
  DataModule1.ADOQuery1.Parameters.ParamByName('data_kon').Value:=StrToDate('20.09.2011');
  DataModule1.ADOQuery1.Open;
//добавить из ADOQuery1, в столбец znachenie в БД  . 
  DataModule1.ADOQuery2.SQL.Text:= 'UPDATE persona_stor SET znachenie=true WHERE id_persona_stor = :id_persona_stor';
  DataModule1.ADOQuery1.First;
  while not DataModule1.ADOQuery1.Eof do
  begin
    DataModule1.ADOQuery2.Parameters.ParamByName('id_persona_stor').Value:=DataModule1.ADOQuery1.FieldByName('id_persona_stor').Value;
    DataModule1.ADOQuery2.ExecSQL;
    DataModule1.ADOQuery1.Next;
  end;




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


Бывалый
*


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

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



Цитата(ivanfr @ 30.9.2011,  12:31)
Выдает ошибку Access violation at address 42BDE073. Read of address 42BDE073. У меня есть подозрение что ошибка происходит из того что в ADOQuery1 нет данных? хотя черт его знает  

Если Вы его без изменений скопировали и не создали QrUpdate, то естественно будет выдавать ошибку.

Это сообщение отредактировал(а) AndreyIQ - 30.9.2011, 12:40
PM MAIL   Вверх
ivanfr
Дата 30.9.2011, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Точно. блин я ж его не создал. 

QrUpdate:=TADOQuery.Create(nil);

Добавлено @ 12:51



AndreyIQ 

Eсть еще одна ошибка?

Parameter'id_persona_stor' not found.
и такая ошибка : Не возможно найти устанавливанмый ISAM

Может Датасурс нужно добавить таким же образом?

Это сообщение отредактировал(а) ivanfr - 30.9.2011, 13:39
PM MAIL   Вверх
superVad
Дата 30.9.2011, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ivanfr, я не могу въехать - зачем ты вносишь изменения перебором и кучей запросов - если можно все сделать одним запросом...
PM MAIL   Вверх
ivanfr
Дата 30.9.2011, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



superVad 
Ну дык я тут пытаюсь научится. 
Покажи мастер класс. 
как это сделать одним запросом? 
PM MAIL   Вверх
AndreyIQ
Дата 30.9.2011, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ivanfr @ 30.9.2011,  12:44)
Eсть еще одна ошибка?

Parameter'id_persona_stor' not found.

Покажите участок кода где ругается и какой запрос в query
PM MAIL   Вверх
ivanfr
Дата 30.9.2011, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



AndreyIQ

Код


procedure TForm2.BitBtn2Click(Sender: TObject);
  var
   MassivRezultSQL: Array of Array of String;
   iColumnsCount: Integer;
   iRowsCount: Integer;
   i: Integer;
   j: Integer;
   k: Integer;
   QrUpdate: TADOQuery; // ADOQuery для изменения данных
   DataSourceDate: TDataSource;
begin

  //SELECT * FROM persona_stor WHERE date_uvolnenie BETWEEN :data_nach AND :data_kon AND znachenie<>true
  //ПРоизводинм запрос на интервал уволенных плюс добавляем им значение труе так, как они обработаны
  DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Text:='SELECT * '      //fio_work, tabel_nomer,filial, date_uvolnenie, znachenie
                                 +'FROM persona_stor '
                                 +'WHERE date_uvolnenie between :data_nach and :data_kon AND znachenie<>true'; //fio_work, date_uvolnenie,znachenie
  DataModule1.ADOQuery1.Parameters.ParamByName('data_nach').Value:=StrToDate('20.08.2011');
  DataModule1.ADOQuery1.Parameters.ParamByName('data_kon').Value:=StrToDate('20.09.2011');
  DataModule1.ADOQuery1.Open; // Тут вылетает  и такая ошибка : Не возможно найти устанавливанмый ISAM

  QrUpdate:=TADOQuery.Create(nil);
  DataSourceDate:= TDataSource.Create(nil);
  DataSourceDate.DataSet := QrUpdate;
  QrUpdate.SQL.Text:= 'UPDATE persona_stor SET znachenie=true WHERE id_persona_stor = :prm_id_persona_stor'; //а тут Parameter'id_persona_stor' not found 
  DataModule1.ADOQuery1.First;
  while not DataModule1.ADOQuery1.Eof do
  begin
    QrUpdate.Parameters.ParamByName('prm_id_persona_stor').Value:=DataModule1.ADOQuery1.FieldByName('id_persona_stor').Value;
    QrUpdate.ExecSQL;
    DataModule1.ADOQuery1.Next;
  end;

Может это важно поле id_persona_stor не является ключевым.

Это сообщение отредактировал(а) ivanfr - 30.9.2011, 13:45
PM MAIL   Вверх
AndreyIQ
Дата 30.9.2011, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

DataModule1.ADOQuery1.Open; // Тут вылетает  и такая ошибка : Не возможно найти устанавливанмый ISAM

Это походу с АДО связано, поэтому хз, я с адо не работаю
Цитата

QrUpdate.SQL.Text:= 'UPDATE persona_stor SET znachenie=true WHERE id_persona_stor = :prm_id_persona_stor'; //а тут Parameter'id_persona_stor' not found 

А в этой строчке вообще ошибка этого рода не должна вылазить, а вот здесь может
Код

QrUpdate.Parameters.ParamByName('prm_id_persona_stor').Value:=DataModule1.ADOQuery1.FieldByName('id_persona_stor').Value;

Потому что неуказан QrUpdate.Connection или как там прописывается путь к базе

Это сообщение отредактировал(а) AndreyIQ - 30.9.2011, 14:03
PM MAIL   Вверх
ivanfr
Дата 3.10.2011, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код


DataModule1.ADOQuery1.Open; // Тут вылетает  и такая ошибка : Не возможно найти устанавливанмый ISAM

Проблема решилась сама собой, после удаления ADOConnection1 и создания заново. Видемо что-то сбилось.
Цитата

код Pascal/Delphi
1:
  QrUpdate.Parameters.ParamByName('prm_id_persona_stor').Value:=DataModule1.ADOQuery1.FieldByName('id_persona_stor').Value;
Потому что неуказан QrUpdate.Connection или как там прописывается путь к базе

после прописания QrUpdate.Connection заработало. 
Код работает хорошо. привожу полученный результат.
Код

  DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Text:='SELECT * '      //fio_work, tabel_nomer,filial, date_uvolnenie, znachenie
                                 +'FROM persona_stor '
                                 +'WHERE date_uvolnenie between :data_nach and :data_kon AND znachenie<>true'; //fio_work, date_uvolnenie,znachenie
  DataModule1.ADOQuery1.Parameters.ParamByName('data_nach').Value:=StrToDate('20.08.2011');
  DataModule1.ADOQuery1.Parameters.ParamByName('data_kon').Value:=StrToDate('20.09.2011');
  DataModule1.ADOQuery1.Open;
  QrUpdate:=TADOQuery.Create(nil);
  QrUpdate.Connection:=DataModule1.ADOConnection1_base_uvol;
  //DataSourceDate:= TDataSource.Create(Application);
  //DataSourceDate.DataSet := QrUpdate;
  QrUpdate.SQL.Text:= 'UPDATE persona_stor SET znachenie=true WHERE id_persona_stor = :id_persona_stor';
  DataModule1.ADOQuery1.First;
  while not DataModule1.ADOQuery1.Eof do
  begin
    QrUpdate.Parameters.ParamByName('id_persona_stor').Value:=DataModule1.ADOQuery1.FieldByName('id_persona_stor').Value;
    QrUpdate.ExecSQL;
    DataModule1.ADOQuery1.Next;
  end;





Это сообщение отредактировал(а) ivanfr - 3.10.2011, 05:25
PM MAIL   Вверх
ivanfr
Дата 19.7.2012, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!
Немного модифицировал свой код, речь, о котором идет выше.

Принцип работы.
1. загружаю данные xls в массив.
2. из массива беру первую строку с данными
[B]3. делаю запрос в таблицу БД. 
4. пытаюсь импортировать данные из запроса в массив  тут и возникает проблема.
четвертом пункте в ниже приведённом коде - выдаёт ошибку, зависает Делфи.
в таблица содержит следующие данные string, integer?, datatime
Массив заполняется до тех пор потока не доходит до ячейки таблице с типом Дата/Время. Хотя я использую тип данных Variant
При этом ему по барабану стоит там try except  или нет тупо виснет.
4 хочу сравнить одинаковые данные есть или нет?
 
Код

try
        DataModule1.ADOQuery1.Open;
        iRowsCount := DataModule1.ADOQuery1.RecordCount; // + шапка
        iColumnsCount:= DataModule1.ADOQuery1.FieldCount;
        SetLength(MassivRezultSQL,iRowsCount,iColumnsCount);
        DataModule1.ADOQuery1.First;
        for iExtractingDataFromQuery := 0 to iRowsCount-1 do
          begin
            for jExtractingDataFromQuery:= 0 to iColumnsCount-1 do
{тут ошибка}   
           MassivRezultSQL[iExtractingDataFromQuery, jExtractingDataFromQuery] := DataModule1.ADOQuery1.Fields.Fields[jExtractingDataFromQuery].AsVariant;
            DataModule1.ADOQuery1.Next;
          end;
      except
        ShowMessage('Ошибка при извлечении данных из Датасурса- ADOQuery1 ');
      end;


Помогите решить проблему.



Это сообщение отредактировал(а) ivanfr - 19.7.2012, 07:45
PM MAIL   Вверх
ivanfr
Дата 24.7.2012, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Народ помогите избавиться от ошибки.
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

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

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


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

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

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


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

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


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

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


 




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


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

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