Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL-Запрос для выбора диапазона дат 
:(
    Опции темы
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   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1161 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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