Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2016, 22:31   #1
VanRay_713
Новичок
Джуниор
 
Регистрация: 22.09.2016
Сообщений: 1
Восклицание Проверка диапазона Delphi

Ребят такая задачка. Есть фирма по прокату авто. При регистрации проката есть поля фамилия,модель авто,гос номер,дата выдачи,кол-во дней,дата возврата. Надо сделать проверку чтоб нельзя было одну машину взять в прокат в те дни когда она взята уже в прокат. БД Acsess соединено через ADOTAble. Как решить эту задачу?
Нужен будет код кнопки добавления выложу

Последний раз редактировалось VanRay_713; 22.09.2016 в 22:34.
VanRay_713 вне форума Ответить с цитированием
Старый 23.09.2016, 15:53   #2
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Добавьте поле "машина уже в прокате" и вся недолга...
При регистрации проката смотрим это поле и если оно FALSE, оформляем прокат и делаем поле TRUE.
При возврате машины ставим его опять в FALSE.
kropotkina-alice вне форума Ответить с цитированием
Старый 23.09.2016, 15:55   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Добавьте поле "машина уже в прокате" и вся недолга
Это поможет только для бессрочного проката. А если прокат с - по, то ни чего не даст
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.09.2016, 16:03   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

пересечение временных диапазонов можно сделать так

допустим,
D1Beg - дата начала 1-го диапазона (проката)
D1End - дата окончания 1-го диапазона (проката)

при попытке забронировать авто в период с D2Beg по D2End
признак пересечения диапазонов такой

если
(D1Beg between D2Beg and D2End)
or
(D1End between D2Beg and D2End)
or
(D2Beg between D1Beg and D1End)

то есть пересечение интервалов (машина занята),

иначе - период D2Beg and D2End свободен.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.09.2016, 16:14   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
insert Reg (auto, startdate, finishdate)
select auto, start, finish
from auto as R
where  auto=NN  --нужное авто
   and not exists ( -- и проверяем некорректные ситуации
                   select 1 from reg as test
                   where  test.auto =R.auto --для нашего авто
                     and ( (R.start<=test.startdate and R.finish>=test.startdate) -- хотим начать ДО и НЕ УСПЕЕМ  закончить
                        or (R.start>=test.startdate and R.start<=test.finishdate ) --хотим начать ВО время другого проката
                         )
                  )
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 23.09.2016 в 16:19.
evg_m вне форума Ответить с цитированием
Старый 23.09.2016, 16:29   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

evg_m, круто! Годится.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.09.2016, 16:50   #7
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Это поможет только для бессрочного проката. А если прокат с - по, то ни чего не даст
Ничего не даст, если не фиксировать возврат машины, что есть глупость несусветная
kropotkina-alice вне форума Ответить с цитированием
Старый 23.09.2016, 22:50   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
Ничего не даст, если не фиксировать возврат машины, что есть глупость несусветная
Вы или не понимаете суть задачи или понимаете её как-то по другому.

Вот сегодня 23 сентября.
пришёл человек и записал (забронировал) машину в прокат с 1 октября по 10 октября.
По вашему, машина находится в прокате? Признак "машина уже в прокате" Вы поставите в True?
а если придёт человек бронировать машину с 20 октября по 30 октября, Вы ему откажете, так? Ведь у Вас машину уже в прокате?
или пришёл человек, который хочет взять машину с 26 сентября по 28 сентября, он тоже "пролетает"?
Ваша контора, с таким подходом, разорится.


p.s. я не призываю обсуждать задачу и способы решения.
Ответ уже дал evg_m.
Задача, на мой взгляд, решена.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.09.2016, 01:11   #9
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
Вы или не понимаете суть задачи или понимаете её как-то по другому.
Даты датами, а указание что машина физически в гараже или нет тоже нужно, что толку что вы в базе выпишите её, но 10 октября ее в хлам раздолбали?
так что вы тоже с таким подходом не преуспеете.
come-on вне форума Ответить с цитированием
Старый 24.09.2016, 10:37   #10
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Принципы любого учета (прокат не исключение).

БД хранит две сущности: объекты учета и действия с ними.
Объекты: авто (ID, Марка, ...). Клиенты тоже объекты учета.
Действия: выдача и возврат авто.
Примерная структура таблицы БД: ID, Дата/время, IDAuto, IDClient, Признак, Дата_возврата(для контроля), пробег, ...

После того как в таблицу-справочник занесены все авто, необходимо записать остатки в виде "прихода" (возврата), т.е. какие авто находятся в конторе на дату начала учета:
Код:
ID, Дата/время, IDAuto, IDClient, признак
1   01.09.2016  1       null      1
2   01.09.2016  2       null      1
3   01.09.2016  5       null      1
...
После можно фиксировать выдачы и возвраты, которые пишутся в эту же таблицу:
Код:
100 02.09.2016  5       1         -1  (выдан)
101 03.09.2016  2       7         -1  (выдан)
...
110 10.09.2016  5       1          1  (возврат)
Чтобы определить находится авто в прокате или на базе нужно посчитать остаток (сумму) по полю "признак" в группировке IDAuto на тот день (и час) который нужен, допустим, текущие (в условии выборки Дата/время < Текущая дата).
Если остаток 0, то в прокате, если 1, то можно выдавать.

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


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка диапазона ячеек natan02 Microsoft Office Excel 2 02.07.2012 03:50
Проверка значений диапазона Verano naranjo Microsoft Office Excel 1 24.02.2010 11:14
Проверка ячейки на значение и форматирование диапазона voievod Microsoft Office Excel 5 24.08.2009 11:24
Проверка диапазона ячеек Last Microsoft Office Excel 9 16.08.2009 19:19
проверка диапазона Bezdar Microsoft Office Excel 15 30.07.2008 08:59