Поиск:

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


Шустрый
*


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

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



Значит хочу реализовать следующее (Пока не реализовано хочу пошагово разобраться)
Помогите написать SQL – Запрос. 
Delphi/Ассеss
Есть не большая БД в ней есть  таблица(persona_stor) в которой несколько столбцов ФИО (fio_work), Дата увольнения (date_uvolnenie),  Значение (znachenie).
 Читаю на форумах рекомендуют использовать SQL – запрос, тут у меня немного проблемно.
Нужно, что бы из таблицы «persona_stor», столбца «date_uvolnenie» выбрал все даты,  которые удовлетворяют критерию, с 20.08.2011 по 20.09.2011, вывел всех сотрудников, кто уволился в это период. Затем дабы избежать повторного выбора этих сотрудников их нужно исключить из поиска добавив (записать в таблицу), в столбец  «znachenie»,  каждому из найденных сотрудников значение, например, -«обработано». При выборке SQL – Запросом в  следующий раз он уже должен их исключать. 
1)    Для начала хочу просто разобраться с отбором всех сотрудников кто уволился с 20.08.2011 по 20.09.2011
Что пытаюсь сделать.
Код


begin
  try
    DataModule1.ADOQuery1.SQL.Clear;
    DataModule1.ADOQuery1.SQL.Add('SELECT * FROM persona_stor  WHERE  date_uvolnenie  <= "20.08.2011" '); //ставлю в место # в DBGrid1 прорисовывает столбы с пустой строкой.
    DataModule1.ADOQuery1.Active:=True;
    DBGrid1.SelectedField;
 except
    on e:Exception do
  end;

Почему то не работает вроде правильно делаю или нет?!.
SELECT * -выбираю все поля 
FROM    persona_stor  - беру таблицу 
WHERE критерий отбора все даты которые 

Есть сотрудник и его дата увольнения, мне нужно чтобы
Попов Ф.А. 11.07.2011  
Иванов И.П. 20.08.2011
Сидоров С.В. 30.08.2011
Петров В.Ф. 01.09.2011
  


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


Бывалый
*


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

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



Цитата(ivanfr @ 20.9.2011,  12:04)
Есть не большая БД в ней есть  таблица(persona_stor) в которой несколько столбцов ФИО (fio_work), Дата увольнения (date_uvolnenie),  Значение (znachenie).
Нужно, что бы из таблицы «persona_stor», столбца «date_uvolnenie» выбрал все даты,  которые удовлетворяют критерию, с 20.08.2011 по 20.09.2011, вывел всех сотрудников, кто уволился в это период.

Код

select fio_work, date_uvolnenie from persona_stor where date_uvolnenie between :data_nach and :data_kon

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


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Цитата(ivanfr @  20.9.2011,  13:04 Найти цитируемый пост)
 “20.08.2011”'

Что за конструкция такая вообще? Access её явно не знает.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
ivanfr
Дата 20.9.2011, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Цитата(ivanfr @ 20.9.2011,  12:04)
Есть не большая БД в ней есть  таблица(persona_stor) в которой несколько столбцов ФИО (fio_work), Дата увольнения (date_uvolnenie),  Значение (znachenie).
Нужно, что бы из таблицы «persona_stor», столбца «date_uvolnenie» выбрал все даты,  которые удовлетворяют критерию, с 20.08.2011 по 20.09.2011, вывел всех сотрудников, кто уволился в это период.

код SQL
1:
  select fio_work, date_uvolnenie from persona_stor where date_uvolnenie between :data_nach and :data_kon

Что то не с работало. А вот between :data_nach and :data_kon в коде так написал  between :20.08.2011 and :20.09.2011
Цитата

Цитата(ivanfr @  20.9.2011,  13:04 )
 “20.08.2011”'


Что за конструкция такая вообще? Access её явно не знает

там нормально Ковычки. были. есть.
PM MAIL   Вверх
AndreyIQ
Дата 20.9.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ivanfr @ 20.9.2011,  13:06)
Цитата

Цитата(ivanfr @ 20.9.2011,  12:04)
Есть не большая БД в ней есть  таблица(persona_stor) в которой несколько столбцов ФИО (fio_work), Дата увольнения (date_uvolnenie),  Значение (znachenie).
Нужно, что бы из таблицы «persona_stor», столбца «date_uvolnenie» выбрал все даты,  которые удовлетворяют критерию, с 20.08.2011 по 20.09.2011, вывел всех сотрудников, кто уволился в это период.

код SQL
1:
  select fio_work, date_uvolnenie from persona_stor where date_uvolnenie between :data_nach and :data_kon

Что то не с работало. А вот between :data_nach and :data_kon в коде так написал  between :20.08.2011 and :20.09.2011

К сожалению с Access'ом не работаю, но в firebird нормально работает, и для access'а должно примерно так работать
Код

  ADOQuery1.SQL.Text:='select fio_work, date_uvolnenie from persona_stor where date_uvolnenie between :data_nach and :data_kon';
  ADOQuery1.Parameters.ParamByName('data_nach').Value:=StrToDate('20.08.2011');
  ADOQuery1.Parameters.ParamByName('data_kon').Value:=StrToDate('20.09.2011');
  ADOQuery1.Open;

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


Новичок



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

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



А если попробовать так:
Код

SELECT * FROM persona_stor  WHERE  date_uvolnenie  <= #20/08/2011#


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


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Цитата(ivanfr @  20.9.2011,  14:06 Найти цитируемый пост)
Что то не с работало. 

Посмотри в самом Access'е, в конструкторе запросов, как оформляется дата. Там всякие ##, т.е. не всё так просто.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
ivanfr
Дата 20.9.2011, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата


А если попробовать так:код SQL
1:
  SELECT * FROM persona_stor  WHERE  date_uvolnenie  <= #20/08/2011#


Вот так помогло, только >= знак в больше,  поставил не правильно сейчас вроде корректно выводит то, что я и хотел.

Код


'SELECT * FROM persona_stor  WHERE  date_uvolnenie  >= #20/08/2011#'

Ну да ладно завтра займусь продолжением решение данного вопроса. Надеюсь на вашу помощь.

Как работать с полученными данными?
Он их  же в ДБ грид помещает.

Добавлено @ 13:51
А какой лучше надёжней,... вариант использовать?
1)
Код


DataModule1.ADOQuery1.SQL.Text:='select fio_work, date_uvolnenie from persona_stor where date_uvolnenie between :data_nach and :data_kon';
  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;



2) 
Код


 try
    DataModule1.ADOQuery1.SQL.Clear;
    DataModule1.ADOQuery1.SQL.Add('SELECT * FROM persona_stor  WHERE  date_uvolnenie  >= #20/08/2011#');
    DataModule1.ADOQuery1.Active:=True;
    DBGrid1.SelectedField;
 except
    on e:Exception do
  end;
'

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


Бывалый
*


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

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



Цитата

Как работать с полученными данными?

Что имено не понятно?
Цитата

А какой лучше надёжней,... вариант использовать?

Первый

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


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Цитата(ivanfr @  20.9.2011,  14:42 Найти цитируемый пост)
Он их  же в ДБ грид помещает.

Кто "он" - программист, что ли? smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
ivanfr
Дата 21.9.2011, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну он в смысле запрос. Я подключил DataSource  к DataModule1.ADOQuery1. а  DBGrid1 к DataSource, вот.

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


Шустрый
*


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

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




Нашёл кусок кода где на прямую после запроса в эксель импорт данных чуть- чуть переделал, но не получилось в чем моя ошибка?
Конечный результат Хотел данные полученные SQL запросом поместить в массив. а затем записать в БД. Пока хочу разобраться только с занесением данных в массив.  

Код


var
   MassivRezultSQL: Array of Array of OLEVariant;
   iColumnsCount: Integer;
   iRowsCount: Integer;
   i: Integer;
   j: Integer;
begin
  DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Text:='select * from persona_stor where date_uvolnenie between :data_nach and :data_kon'; //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;

  iRowsCount := DataModule1.ADOQuery1.RecordCount; // + шапка
  iColumnsCount:= DataModule1.ADOQuery1.FieldCount;
// for j:= 1 to iColumnsCount do      Низнаю зачем это закоментировал...
//  MassivRezultSQL[i, j] := DataModule1.ADOQuery1.Fields.Fields[j - 1].Value;
  
DataModule1.ADOQuery1.First;
  for i := 1 to iRowsCount-1 do
     begin
        for j:= 1 to iColumnsCount-1  do
          MassivRezultSQL[i, j] := DataModule1.ADOQuery1.Fields.Fields[j - 1].AsVariant;
          DataModule1.ADOQuery1.Next;
     end
end;

Выдает ошибку след содержания Access violahion at address 004C6F24 in module ... Read of address 00000004
PM MAIL   Вверх
AndreyIQ
Дата 21.9.2011, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ivanfr @ 21.9.2011,  08:14)
Нашёл кусок кода где на прямую после запроса в эксель импорт данных чуть- чуть переделал, но не получилось в чем моя ошибка?
Конечный результат Хотел данные полученные SQL запросом поместить в массив. а затем записать в БД. Пока хочу разобраться только с занесением данных в массив.  

Код


var
   MassivRezultSQL: Array of Array of OLEVariant;
   iColumnsCount: Integer;
   iRowsCount: Integer;
   i: Integer;
   j: Integer;
begin
  DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Text:='select * from persona_stor where date_uvolnenie between :data_nach and :data_kon'; //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;

  iRowsCount := DataModule1.ADOQuery1.RecordCount; // + шапка
  iColumnsCount:= DataModule1.ADOQuery1.FieldCount;
// for j:= 1 to iColumnsCount do      Низнаю зачем это закоментировал...
//  MassivRezultSQL[i, j] := DataModule1.ADOQuery1.Fields.Fields[j - 1].Value;
  
DataModule1.ADOQuery1.First;
  for i := 1 to iRowsCount-1 do
     begin
        for j:= 1 to iColumnsCount-1  do
          MassivRezultSQL[i, j] := DataModule1.ADOQuery1.Fields.Fields[j - 1].AsVariant;
          DataModule1.ADOQuery1.Next;
     end
end;

Выдает ошибку след содержания Access violahion at address 004C6F24 in module ... Read of address 00000004

Как минимум не заметил, гда задается размер массива MassivRezultSQL.
Я делал так 
PM MAIL   Вверх
ivanfr
Дата 21.9.2011, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Кубическая СИЛА. Яж строку целую написать забыл SetLength(MassivRezultSQL,iRowsCount, iColumnsCount);

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


Шустрый
*


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

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



Потестил, доработал, замечательно работает, читает данные в массив.
Код
 
var
   MassivRezultSQL: Array of Array of String;
   iColumnsCount: Integer;
   iRowsCount: Integer;
   i: Integer;
   j: Integer;
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'; //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;
  //Обработка данных запроса
  iRowsCount := DataModule1.ADOQuery1.RecordCount; // + шапка
  iColumnsCount:= DataModule1.ADOQuery1.FieldCount;
  SetLength(MassivRezultSQL,iRowsCount,iColumnsCount);
  DataModule1.ADOQuery1.First;
  for i := 0 to iRowsCount-1 do
     begin
        for j:= 0 to iColumnsCount-1 do
          MassivRezultSQL[i, j] := DataModule1.ADOQuery1.Fields.Fields[j].AsString;
          DataModule1.ADOQuery1.Next;
     end
end;

Спасибо за помощь. 
Осталось у полученных данных  обновить значение столбца путем добавления в него  данных.

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


Шустрый
*


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

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



Всем привет, нашлась свободная минута хотел бы продолжить.
С помощью оператора UPDATE добавляются данные .
UPDATE  Имя_таблицы   SET Имя_поля=Значение WHERE Условие выборки.
Ранее с помощью SQL – Запроса получили данные выборки работников, которые уволились в определенный промежуток времени с 20.08.2011по 20.09.2011. 
Далее научился эти данные переносить в динамический массив, что бы можно было с ними работать. 
Задача 1
Теперь перед мной стоит следующая задача, как добавить отобранным работникам в столбец значение  (znachenie), таблицы (persona_stor)  значение «обработан»?
Для чего, для того чтобы когда я буду формировать запрос выборки SQL:
Код

DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Text:='select * from persona_stor where date_uvolnenie between :data_nach and :data_kon'; //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;
iRowsCount := DataModule1.ADOQuery1.RecordCount; // + шапка
  iColumnsCount:= DataModule1.ADOQuery1.FieldCount;
  SetLength(MassivRezultSQL,iRowsCount,iColumnsCount);
  DataModule1.ADOQuery1.First;
 
 for i := 0 to iRowsCount-1 do
     begin
        for j:= 0 to iColumnsCount-1 do
          MassivRezultSQL[i, j] := DataModule1.ADOQuery1.Fields.Fields[j].AsString;
          DataModule1.ADOQuery1.Next;
     end 

ЗАДАЧА 2
В условия выборки SQL-Запроса  хотел бы добавить  дополнительное условие отбора, например, 
бери все даты, которые соответствую условию (с 20.08.2011по 20.09.2011), но если у них в столбец значение  (znachenie), таблицы (persona_stor) есть значение  «обработан», то исключи его из выборки.
Для  начала хотел бы узнать, можно ли это реализовать с помощью SQL-запроса?  



Это сообщение отредактировал(а) ivanfr - 29.9.2011, 06:36
PM MAIL   Вверх
14SatanA88
Дата 29.9.2011, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ivanfr @  29.9.2011,  06:35 Найти цитируемый пост)
Для  начала хотел бы узнать, можно ли это реализовать с помощью SQL-запроса? 

разумеется

Цитата(ivanfr @  29.9.2011,  06:35 Найти цитируемый пост)
Задача 1

Код

UPDATE persona_stor SET znachenie=true WHERE date_uvolnenie between :data_nach and :data_kon


Цитата(ivanfr @  29.9.2011,  06:35 Найти цитируемый пост)
ЗАДАЧА 2

Код

SELECT * FROM persona_stor WHERE date_uvolnenie BETWEEN :data_nach AND :data_kon AND znachenie<>true

здесь, может быть, надо будет еще скобки расставить.

Добавлено @ 08:25
и я еще не понял, зачем динамический массив?

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


Шустрый
*


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

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



Цитата

разумеется
Цитата(ivanfr @  29.9.2011,  06:35 )
Задача 1

код SQL
1:
  UPDATE persona_stor SET znachenie=true WHERE date_uvolnenie between :data_nach and :data_kon


14SatanA88 Скажи пожалуйста 

SET znachenie=true  когда так пишем то мы SQL запросом как бы спрашиваем, что   значение "znachenie" Пустое - false  или не пустое – true ( то есть в данном столбце, есть какие-то данные. если true, то не пустое если false- то данные есть), 
так тип "znachenie" текстовый  у меня. 
Или логичней сделать его  логическим типом? я то собирался туда записывать слова типа "Обработано".

PM MAIL   Вверх
14SatanA88
Дата 29.9.2011, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ivanfr @  29.9.2011,  09:54 Найти цитируемый пост)
Или логичней сделать его  логическим типом

имхо намного логичней
ну если текст то просто SET znachenie='какой-то текст'

Добавлено через 2 минуты и 10 секунд
Цитата(ivanfr @  29.9.2011,  09:54 Найти цитируемый пост)
когда так пишем то мы SQL запросом как бы спрашиваем

нет, SET просто поверх старого значения пишет в таблицу то, что ему указали
в данном случае в логическое (!) поле пишется логическая единица
PM MAIL ICQ   Вверх
ivanfr
Дата 29.9.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

SELECT * FROM persona_stor WHERE date_uvolnenie BETWEEN :data_nach AND :data_kon AND znachenie<>true

Хорошо это запрос применил работает на ура.
Вот теперь что- то не соображу

Код

UPDATE persona_stor SET znachenie=true WHERE date_uvolnenie between :data_nach and :data_kon 

- этот кусок кода, как пременить вроди бы этот код отработал:
Код

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;
  
   //Обработка данных запроса для помещения данных в массив.
  iRowsCount := DataModule1.ADOQuery1.RecordCount; // + шапка
  iColumnsCount:= DataModule1.ADOQuery1.FieldCount;
  SetLength(MassivRezultSQL,iRowsCount,iColumnsCount);
  DataModule1.ADOQuery1.First;
  for i := 0 to iRowsCount-1 do
     begin
        for j:= 0 to iColumnsCount-1 do
          MassivRezultSQL[i, j] := DataModule1.ADOQuery1.Fields.Fields[j].AsString;
          DataModule1.ADOQuery1.Next;
     end;


и данные находяться в ADOQuery1, а  он требует нового создания запроса. что то я не пойму как это работает? Ранее я их помещал в массив. куда какую запись вставлять(по строчка по столбика), как это сказать запросу? 
Объясните как это работает?


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


Бывалый
*


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

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



Цитата

и данные находяться в ADOQuery1, а  он требует нового создания запроса

Кто требует?
Цитата

Объясните как это работает?

Что имено непонятно? Задайте конкретный вопрос.
PM MAIL   Вверх
ivanfr
Дата 29.9.2011, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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;

, выбрал людей, которые уволились в определнный интервал с 20.08.2011 по 20.09.2011. так вот
данные поместились в ADOQuery1. Правильно. 

Теперь нужно обновить у найденных сотрудников столбец значение "znachenie" с записью в БД тоесть записать туда значение True изначально там находиться false.

Я что то не соображу  как записать обновление у этих работников с помощью след строки.
Код

UPDATE persona_stor SET znachenie=true WHERE date_uvolnenie between :data_nach and :data_kon 

А точней в какое место поставить строку в коде.
PM MAIL   Вверх
AndreyIQ
Дата 29.9.2011, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если я Вас правильно понял, то
Код

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;

Вам вообще не нужен, он только для того чтобы посмотреть список сотрудников уволеных за определенный период, а для того что бы изменить поле znachenie, необходимо просто выполнить следующее
Код

DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Text:='UPDATE persona_stor SET znachenie=true WHERE date_uvolnenie between  data_nach and :data_kon';
  DataModule1.ADOQuery1.Parameters.ParamByName('data_nach').Value:=StrToDate('20.08.2011');
  DataModule1.ADOQuery1.Parameters.ParamByName('data_kon').Value:=StrToDate('20.09.2011');
  DataModule1.ADOQuery1.ExecSQL;

Данный код всем сотрудникам уволеным в период с 20.08.2011 по 20.09.2011 сделает znachenie = true

Это сообщение отредактировал(а) AndreyIQ - 29.9.2011, 14:55
PM MAIL   Вверх
14SatanA88
Дата 29.9.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



AndreyIQ, я понял вопрос так же и ответ у меня приблизительно такой же )

ivanfr, чтобы не возникало далее вопросов типа "почему не выполянется запрос" или "почему запрос ничего не возвращает", обязательно прочитай и запомни вот это.



Это сообщение отредактировал(а) 14SatanA88 - 29.9.2011, 15:35
PM MAIL ICQ   Вверх
14SatanA88
Дата 29.9.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ivanfr, массив тебе не нужен точно.

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


Шустрый
*


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

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



Цитата

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


Не совсем правильно, дело в том, что список мне этот нужен для отслеживания уволенных сотрудников, а добавление данных в столбец znachenie=true, чтобы не было повторов при выводе данных из БД. Ведь в самом деле зачем мне одного и того же уволенного сотрудника проверять два раза .
Стоит такая задача:
1)Делаю выборку SQL-запросом и смотрю  полученные данные в ДБГриде, кто уволился в виде таблицы, - эти данные нужны.
2)Затем я их посмотрел, скопировал, поделал что либо с данными запроса...
3) Далее мне нужно добавить всем найденным (первым запросом) в столбец znachenie = true (я эти данные посмотрел в следующий раз они мне не понадобятся, но фишка в  том, что в список(точней в период с 20.08.2011 по 20.09.2011) может попасть сотрудник, который был уволен в эти дни, но в БД его еще нет, а попадет в БД  после обработки следующего раза и с датой (периода с 20.08.2011 по 20.09.2011), но при этом в столбце "znachenie"  у него уже будет стоять false, потому что при добавлении данных в мою БД им будет по умолчанию ставиться это значение. 
И вот потом когда я буду делать запрос второй, третий,….. раз  я всегда смогу узнать, а не добавлялись ли данные.

Вы мне предлагаете использовать следующий запрос
код Pascal/Delphi
Код


DataModule1.ADOQuery1.SQL.Clear;
DataModule1.ADOQuery1.SQL.Text:='UPDATE persona_stor SET znachenie=true WHERE date_uvolnenie between  data_nach and :data_kon';
DataModule1.ADOQuery1.Parameters.ParamByName('data_nach').Value:=StrToDate('20.08.2011');
DataModule1.ADOQuery1.Parameters.ParamByName('data_kon').Value:=StrToDate('20.09.2011');
DataModule1.ADOQuery1.ExecSQL;

, который просто добавляет данные в значение столбец "znachenie" не давая возможности предварительно посмотреть список сотрудников.
Вот я и спрашиваю, как можно сделать так чтобы данные добавились в столбец "znachenie" после просмотра таблицы SQL-запроса?

Цитата

AndreyIQ, я понял вопрос так же и ответ у меня приблизительно такой же )
ivanfr, чтобы не возникало далее вопросов типа "почему не выполянется запрос" или "почему запрос ничего не возвращает", обязательно прочитай и запомни вот этоссылка.

Я про это уже читал.

Цитата

ivanfr, массив тебе не нужен точно.

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

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


Опытный
**


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

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



Цитата(ivanfr @  30.9.2011,  05:41 Найти цитируемый пост)
Вот я и спрашиваю, как можно сделать так чтобы данные добавились в столбец "znachenie" после просмотра таблицы SQL-запроса?


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

тогда просто выполни последовательно 3 запроса:

1. select... 
2. update...
3. select...


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


Бывалый
*


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

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



Цитата

1)Делаю выборку SQL-запросом и смотрю  полученные данные в ДБГриде, кто уволился в виде таблицы, - эти данные нужны.

Код

DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Text:='SELECT id, 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;

Цитата

3) Далее мне нужно добавить всем найденным (первым запросом) в столбец znachenie = true

Код

  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;

ЗЫ В коде могут быть ошибки, с АДО не работаю.
PM MAIL   Вверх
ivanfr
Дата 30.9.2011, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код


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


В данном случае  id  - это название ключевого поля или поля счетчика? у меня ключевое поле - 'tabel_nomer'
а счетчик id_persona_stor'.

Правильно ли я понимаю описание строки обнови в таблице  persona_stor значение  znachenie на труе с условием совпанения  id_persona_stor. Который будет одним и тем же что в запросе Адоквери1 что в  таблице БД"persona_stor"? 
 
Поля БД  access
Код


object ADOTable_persona_storid_persona_stor: TAutoIncField
  DisplayWidth = 16
  FieldName = 'id_persona_stor'
  ReadOnly = True
end

Код


object ADOTable_persona_storfio_work: TWideStringField
  DisplayWidth = 39
  FieldName = 'fio_work'
  Size = 100
end

Код


object ADOTable_persona_stortabel_nomer: TWideStringField
  DisplayWidth = 15
  FieldName = 'tabel_nomer'
  Size = 255
end

Код


object ADOTable_persona_stordate_uvolnenie: TDateTimeField
  DisplayWidth = 22
  FieldName = 'date_uvolnenie'
end

Код


object ADOTable_persona_storznachenie: TBooleanField
  FieldName = 'znachenie'
end

Цитата



Цитата

Цитата(ivanfr @  30.9.2011,  05:41 )
Вот я и спрашиваю, как можно сделать так чтобы данные добавились в столбец "znachenie" после просмотра таблицы SQL-запроса?


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

тогда просто выполни последовательно 3 запроса:

1. select... 
2. update...
3. select...

 я это и спрашиал как мне  это делать в одном запросе или все-таки раздельно. Можно ли сразу одновремено выполнить выборку и вести на экран тутже записать значения. одним запросом. 



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


Бывалый
*


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

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



Цитата

В данном случае  id  - это название ключевого поля или поля счетчика? у меня ключевое поле - 'tabel_nomer'
а счетчик id_persona_stor'.

id_persona_stor
Цитата

Правильно ли я понимаю описание строки обнови в таблице  persona_stor значение  znachenie на труе с условием совпанения  id_persona_stor. Который будет одним и тем же что в запросе Адоквери1 что в  таблице БД"persona_stor"? 

Все верно.
PM MAIL   Вверх
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   Вверх
ivanfr
Дата 24.7.2012, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Решил проблему. в место Variant использовал WideString.
Попробовал в базе поменя тип поля с Время/Дата на Текстовый. Потом вошёл в Делфи попробал работало нормально. Но мне нужно чтоб было именно дата/время. Вернулся поставли все наместо.
Запусил проект, тут выскочило окно с ошибкой,  тип поля сейчас WideString, а не точто сохранено в делфе(String). Не долго думая. Заменил тип данных.

Код

var
MassivRezultSQL: Array of Array of WideString;
begin
 MassivRezultSQL[iExtractingDataFromQuery, jExtractingDataFromQuery] := DataModule1.ADOQuery1.Fields.Fields[jExtractingDataFromQuery].AsWideString;
end;

Теперь зависания не происходит данные присваиваются как надо.

Это сообщение отредактировал(а) ivanfr - 24.7.2012, 13:25
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.1767 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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