Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1012 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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