Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.01.2012, 12:58
fen fen вне форума
Прохожий
 
Регистрация: 23.01.2008
Сообщения: 7
Репутация: 10
По умолчанию Таймер. Запрос в БД. Не срабатывает условие

Добрый день!
Есть некоторая БД с 2 таблицами USERS (Сотрудники), MAIN (Учет рабочего времени сотрудников)
В общем суть программы заключается в том, что сотрудник отмечается rfid-картой через считыватель подключенным к COM-порту, при этом программа должна добавлять запись в БД с полями: дата прихода, время прихода, время ухода, примечание (опоздание, норма и т.д.)

Процедуру организовал через таймер, добавил условие на сравнение текущей даты с уже имеющимися датами прихода в БД сотрудника. Но условие срабатывает неправильно, запись с текущей датой должна добавиться 1 раз,а в моем случае добавляется множественное кол-во раз.

условие
Код HTML:
if prd <> DatetoStr(Date) then

Помогите разобраться, как правильно организовать этот код, чтобы условие правильно срабатывало
Код HTML:
//процедура организована через таймер //некоторый код: получение данных с COM-порта (к COM порту подключен считыватель RFID-карт) //переменная card (тип string) в режиме ожидания получает данные с COM-порта if card <> '' then //если код карты имеет значение begin QSverka.SQL.Clear; QSverka.Active := false; QSverka.SQL.Text:='SELECT users.id,users.us_name,users.us_k_code,users.otd_name,main.pr_date,main.pr_t,main.uh_t,main.us_id '+ 'FROM users,main '+ 'WHERE (users.id=main.us_id) and (users.us_k_code=:us_k)'; //запрос на идентификацию карты сотрудника QSverka.Parameters.ParamByname('us_k').value:=card; //код карты передаётся в запрос в виде параметра QSverka.Open; prd:=QSverka.FieldByName('pr_date').asstring; if prd <> DatetoStr(Date) then //определение текущей даты у сотрудни ка в БД begin //если её нет в БД, то TZapis.Active:=true; TZapis.Insert; //добавялем запись в таблицу MAIN TZapis.FieldByName('us_id').Asstring:=QSverka.FieldByName('id').Asstring; //присваиваем id сотрудника TZapis.FieldByName('pr_date').Asstring:=DatetoStr(Date); //присваиваеим текущую дату TZapis.FieldByName('pr_t').Asstring:=TimetoStr(Time); //время прихода устанавливаем как текущее TZapis.FieldByName('uh_t').Asstring:='0'; //время ухода устанавливаем в ноль TZapis.Post; //публикуем запись MsgPrihod.Show; //показываем на мгновение форму с текстом: ПРИХОД Application.ProcessMessages; Sleep(1000); MsgPrihod.Close; end else ShowMessage ('Сотрудник сегодня уже отметился, попробуйте завтра'); end;

Последний раз редактировалось fen, 11.01.2012 в 13:01.
Ответить с цитированием
  #2  
Старый 11.01.2012, 13:56
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Смею предположить, что TZapis-ето таблица MAIN.
А теперь спросите себя, что вернёт Ваш запрос, если в таблице MAIN есть несколько записей с искомым 'us_id'? А Вы проверяете только первую.
Вам скорее всего нужно сделать два запроса - один к таблице USERS на предмет того, что сотрудник с такой карточкой есть в базе, и второй, к таблице MAIN, с поиском по двум полям - US_ID и PR_DATE.
Если в результате второго запроса что-то нашли - сообщаем об этом,
если получили пустую таблицу - добавляем отметку о приходе.
Ответить с цитированием
  #3  
Старый 18.01.2012, 13:18
fen fen вне форума
Прохожий
 
Регистрация: 23.01.2008
Сообщения: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Смею предположить, что TZapis-ето таблица MAIN.
А теперь спросите себя, что вернёт Ваш запрос, если в таблице MAIN есть несколько записей с искомым 'us_id'? А Вы проверяете только первую.
Вам скорее всего нужно сделать два запроса - один к таблице USERS на предмет того, что сотрудник с такой карточкой есть в базе, и второй, к таблице MAIN, с поиском по двум полям - US_ID и PR_DATE.
Если в результате второго запроса что-то нашли - сообщаем об этом,
если получили пустую таблицу - добавляем отметку о приходе.

благодарю за подсказку. правильные запросы пока не смог составить и сделал временно запрос через сортировку ORDER BY
условие проверяет последнюю запись прихода с текущей датой, если не равно, то добавляет запись в таблицу. Программа работает, но теоретически, если случайно системную дату изменят на заднее число, то записи будут дублироваться. Хотя практически, если следить за системной датой, то такого произойти не должно.
Код HTML:
QSverka.SQL.Text:='SELECT users.id,users.us_k_code,main.pr_date,main.us_id '+ 'FROM users,main '+ 'WHERE (users.id=main.us_id) and (users.us_k_code=:us_k) '+ 'ORDER BY main.pr_date DESC';

Наверно правильнее было проверять не по последней записи, а по всем записям. Нужна Ваша помощь, чтобы сформировать запрос на проверку по всем датам прихода пользователя
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:28.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter