Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Вычисление и вставка времени в поле


Автор: Deee 25.5.2009, 19:12
Здравствуйте! Делаю базу данных и клиентское приложение к ней. (InterBase 6.0, клиентское приложение пишу на delphi 7.0)
тема железнодорожная касса. Есть таблица со всеми станциями железной дороги. Выбирается две станции (отправления и назначения) нужно сделать так чтобы можно было увидеть время отправления и прибытия поезда в таблице "маршрут". 
Для простоты и наглядности, время движения поезда по всей железной дороге разделим на количество станций и получим одинаковые промежутки времени между станциями. 
Требуется, зная время отправления поезда от самой первой станции железной дороги определить время отправления с выбранной станции и время прибытия на выбранную станцию. т.е. время отправления и прибытия на конкретном участке железной дороги (маршруте), и еще время в пути.
Вот скрин  http://s45.radikal.ru/i109/0905/b9/b280442a672d.jpg 
заранее спасибо!

Автор: Akella 25.5.2009, 22:41
Цитата(Deee @  25.5.2009,  19:12 Найти цитируемый пост)
InterBase 6.0

Неужели Firebird 2.0 нельзя использовать? Почему?

Добавлено через 3 минуты и 3 секунды
Цитата(Deee @  25.5.2009,  19:12 Найти цитируемый пост)
Требуется, зная время отправления поезда от самой первой станции железной дороги определить время отправления с выбранной станции и время прибытия на выбранную станцию.

А проблема-то в чём? В чём вопрос? Ты не умеешь вычитать средствами сервера?
Это же задачки для второго или третьего класса?
Из пункта А в пункт Б вышел поезд......

Добавлено через 4 минуты и 14 секунд
Время прибытия на станцию = время отправления + время в пути

Добавлено через 4 минуты и 54 секунды
Время отправления со станции = время отправления с начальной станции + время в пути + время на стоянку

Автор: Deee 25.5.2009, 22:58
Akella, у меня InterBase стоит на университетской машине, поэтому я и работаю в нем...


Цитата(Akella @  25.5.2009,  22:41 Найти цитируемый пост)
Время прибытия на станцию = время отправления + время в пути

получается, что нужно в таблице "станции" завести столбец время??
а как правильно сложить значения определенного диапазона полей?? создать процедуру?

Автор: Akella 25.5.2009, 23:43
Цитата(Deee @  25.5.2009,  22:58 Найти цитируемый пост)
а как правильно сложить значения определенного диапазона полей??

а так?
Код
select ((time1 - time2) as time3) from table1 where ...


Добавлено через 1 минуту и 17 секунд
Цитата(Deee @  25.5.2009,  22:58 Найти цитируемый пост)
получается, что нужно в таблице "станции" завести столбец время??

Не знаю, наверное, я в структуру базы сильно не вникал.

Автор: Deniz 26.5.2009, 05:51
Цитата(Deee @  25.5.2009,  22:12 Найти цитируемый пост)
Вот скрин  базы 
еще покажи связи между таблицами
PS: Deee, это реальная работа или диплом/курсач?

Автор: Deee 26.5.2009, 15:47
Deniz, а как в InterBase связи показать? я не разобрался...
это не диплом\курсач, это просто мой пример базы данных на зачет по информатике) (все делал абсолютно сам)

Автор: Akella 26.5.2009, 17:25
Цитата(Deee @  26.5.2009,  15:47 Найти цитируемый пост)
это не диплом\курсач


Цитата(Deee @  26.5.2009,  15:47 Найти цитируемый пост)
на зачет по информатике


а что, есть разница?

Добавлено через 1 минуту и 34 секунды
Цитата(Deniz @  26.5.2009,  05:51 Найти цитируемый пост)
еще покажи связи между таблицами


Цитата(Deee @  26.5.2009,  15:47 Найти цитируемый пост)
Deniz, а как в InterBase связи показать? я не разобрался...


Наверное, Deniz имел ввиду, что нам покажи, т.е. нарисуй в паинте стрелочками. Чтобы было видно, по каким полям связаны таблицы, если они связаны.

Автор: Deee 26.5.2009, 18:51
Akella, ну обычно диплом и курсовая это достаточно серьезные и объемные работы...
вот показал http://i053.radikal.ru/0905/b0/ae39d403619e.jpg ... вроде бы так.
только у меня есть еще 2 таблицы с одинаковыми данными (станции отправления и станции назначения). отличаются только названиями и ключевыми полями, соответственно из таблицы маршрут поля "отправление" и "назначение" будут связаны с ключевыми полями соответствующих таблиц (на картинке для наглядности показал, что они связаны по ключу "NS")

Автор: Akella 26.5.2009, 22:48
Deee, а почему ты не хочешь использовать IBExpert? Там и построитель диаграмм есть.

Добавлено через 3 минуты и 52 секунды
Цитата(Deee @  25.5.2009,  19:12 Найти цитируемый пост)
зная время отправления поезда от самой первой станции железной дороги

На нашёл время отправления поезда. В какой таблице, в каком поле?

Добавлено через 6 минут и 5 секунд
мне кажется, что тебе нужно переделать структуру. По крайне мере я не вижу ни одного поля типа Time

Добавлено через 14 минут и 13 секунд
В итоге у тебя должна получится таблица в виде цепочки записей:
user posted image

Автор: Deee 27.5.2009, 01:25
Akella, спасибо попробую!
а как сделать так, чтобы когда время отправления и прибытия и другая информация выведены на сетку (DBGrid), при нажатии на кнопку "поезд опаздывает" бралось значение из edit(mask edit или другого компанента) и прибавлялось к значению времени прибытия (время прибытия+задержка)...
а потом соответственно при все возвращалось на круги своя??  

Автор: Deniz 27.5.2009, 05:49
Цитата(Deee @  26.5.2009,  18:47 Найти цитируемый пост)
Deniz, а как в InterBase связи показать? я не разобрался...
InterBase тут не причем.
Для показа можно в Access сделать структуру БД и там есть возможность показать эту структуру или можно показать скрипт создания БД.
Судя по рисунку, базу нужно нормализовать. Например, связь(если она есть) "Железные дороги" - "Маршруты" не нужна.
Таблицу "Маршруты" можно реализовать в 2-х вариантах:
1. Как показал Akella.
Минусы: трудное редактирование маршрута (добавить/удалить станцию для добавления 1 insert + 2 update)
Плюсы: наглядность, легкость в написании SQL запросов

2. Примерно так же, как рисуют в поездах.
"Станция"
"Время прибытия"
"Время отправления"
Плюсы: легче редактировать маршрут, легче учитывать опоздание поезда (отслеживать прохождение по маршруту)
Минусы: сложности(одним SQL запросом) с разными вычислениями
PS: для зачета думаю сильно углубляться не стоит.

Автор: Akella 27.5.2009, 08:40
Deee, сначала построй правильную базу, а затем уже...
Цитата(Deee @  27.5.2009,  01:25 Найти цитируемый пост)
а как сделать так, чтобы когда время отправления и прибытия и другая


Добавлено @ 08:43
Цитата(Deniz @  27.5.2009,  05:49 Найти цитируемый пост)
1. Как показал Akella.

Deniz у меня это не структура исходной таблицы, а не готовый результат после (как бы) выполнения SQL запроса. Такой результат просто нагляднее хотя бы, чем у автора. Видно хотя бы время  smile

Добавлено @ 08:43
Да и вообще нужно поле не время, а дата + время (timestamp)

Автор: Deniz 27.5.2009, 09:10
Цитата(Akella @  27.5.2009,  11:40 Найти цитируемый пост)
Да и вообще нужно поле не время, а дата + время (timestamp)
а вот здесь не согласен.
Для шаблона нужно время без даты, потому как поезда могут ходить например так:
каждую пятницу отправление в 14:00
каждый вторник отправление в 12:00

Автор: Akella 27.5.2009, 10:31
Deniz, смотря в какой таблице. Если в таблице поездов, то да, нужно только время. И можно ещё одно поле текстовое, где будет хранится что-то типа расписания: "1010100". Это значит, что поезд отправляется: пн, ср, пт, то есть 1 - это отправляется, а 0 - это не отправляется. Семь чисел = семь дней недели. Можно расписание сделать в виде текстового поля, где хранить список дат отправки через запятую.

Автор: Deniz 27.5.2009, 11:45
Akella, вариант "1010100" тоже не очень хороший. Был печальный опыт(авиаперевозки) и пришлось переделывать.
Шаблон может выглядеть так:
Дата начала
Дата конца
ИД поезда
Статус integer
Дни integer
+ вспомогательные поля
Поле статус самое сложное: 
0 - разовый переезд, без периода
1 - в поле "Дни" указан период, через которые происходит движение, например "Дни" = 14 следовательно 1 раз в две недели
2 - в поле "Дни" указана номер дня месяца, по которым происходит движение, например "Дни" = 14 следовательно каждой 14 число месяца
PS: Это так, остатки горького опыта, может кому пригодится.

Автор: Akella 27.5.2009, 12:18
Цитата(Deniz @  27.5.2009,  11:45 Найти цитируемый пост)
Akella, вариант "1010100" тоже не очень хороший. Был печальный опыт(авиаперевозки) и пришлось переделывать.

и у меня также, поэтому я сделал поле, где хранил список дат через запятую.
Можно приклеить таблицу полями дата и время

Добавлено через 1 минуту и 9 секунд
Цитата(Deniz @  27.5.2009,  11:45 Найти цитируемый пост)
Дата начала
Дата конца
ИД поезда
Статус integer
Дни integer
+ вспомогательные поля

только хотел написать

Автор: Deee 27.5.2009, 14:48
Akella, сделал http://i039.radikal.ru/0905/f0/8efaae125bd9.jpg...время поджимает, поэтому пошел на хитрость...(понимая,конечно, что это больше напоминает китайское программирование smile )
У меняимеется таблица "станции"(stan) и две точные ее копии "станции отправления"(sto) и "станции назначения"(stn) итого 1+2=3 одинаковых таблицы (верю, что нелогично!).
таблица stan показана на форме и используется для показа результатов небольших тестовых запросов, 2 другие связаны с комбобоксами и их значения как раз и показаны в сетке "маршруты" (название маршруты совершенно условное, не успел додумать).
также в этих двух таблицах (stn и sto) в каждой есть по два столбца ("время отправления"(timo) и "время прибытия"(timn))...то есть время привязано к ключу станции.
вот запрос: (может что-то и некоректно, я ведь только учусь!)
Код

Select distinct 
p.NUM NOMER, so.Nams 
Otpravlenie, sn.Nams 
Naznachenie,
so.Namz ZHD, b.Cl Class,so.Timo, sn.Timn, b.Cena Stoimost
From Marshrut m, STO so, STN sn, 
Stan s, Zhd z, Poezd p, BILET b
Where (so.NSTO=:par0 and 
sn.NSTN=:par1) and 
so.Nzh=s.Nzh and s.Nzh=sn.Nzh 
and m.N=:par2 and sn.nzh=m.n and 
b.BIL=:par3 and b.N=p.N and (so.Nsto=:par0 and sn.Nstn=:par1)


Автор: Akella 27.5.2009, 17:17
И что, где-то ошибка закралась? Или что. Я последнее сообщение не понял к чему ты ведёшь?
Если ты думаешь, что у меня есть время на полный разбор твоего приложения, то ты ошибаешься. :(

Автор: Deee 27.5.2009, 18:10
Akella, причем тут полный разбор?!
ты писал 
Цитата(Akella @  27.5.2009,  08:40 Найти цитируемый пост)
Deee, сначала построй правильную базу, а затем уже...

 я уже решил вопрос со временем отправления и прибытия... smile 

у меня по ходу дела появился другой  и я его уже задал (только его почему-то не заметили)

Цитата(Deee @  27.5.2009,  01:25 Найти цитируемый пост)
а как сделать так, чтобы когда время отправления и прибытия и другая информация выведены на сетку (DBGrid), при нажатии на кнопку "поезд опаздывает" бралось значение из edit(mask edit или другого компанента) и прибавлялось к значению времени прибытия (время прибытия+задержка)...
а потом соответственно при все возвращалось на круги своя??   


там процедуру встроенную создавать надо? или можно как-то обойтись без изменения данных хранящихся в таблицах??

Автор: Akella 27.5.2009, 23:24
Если программа будет работать по сети, то эту информацию должны видеть, типа, что поезд опаздывает и другие пользователи. А значит можно добавить поле в таблицу, типа время опоздания, например целочисленное, где будет хранится 10-20-150 или 300 минут опоздания.
А можно создать таблицу какой-то хитрой структуры, в которой будет хранится инфа по времени опоздания, какой поезд опаздывает, маршрут, между какими станциями. Ну или ка-то так.
Ну или совсем просто... В событии OnSetText persistent столбца набора данных (TIBDataSet или что там у тебя) написать код:
Код

  if id = .... then
     Field.Value := Field.Value + столько-то минут опоздания

И тогда в гриде увидишь у нужной запись время + столько минут опоздания.


Можно сделать вычисляемое поле в твоём наборе данных. В нём будет вычисляться время прибытия  + минуты опоздания. Тогда в таблице нужно будет хранить доп. поле для количества минут опоздания. При чём можно хранить, как отрицательное время, так и положительное, отрицательное - это опоздание, а положительное - это раннее прибытие smile
Теперь выбираем запись. Жмакаем кнопку, вводим -12 и записываем значение в базу.

Ну может кто предложит более оптимальный вариант smile 

Автор: Deee 28.5.2009, 16:32
Akella, 
Цитата(Akella @  27.5.2009,  23:24 Найти цитируемый пост)
Ну или совсем просто... В событии OnSetText persistent столбца набора данных (TIBDataSet или что там у тебя) написать код:
  if id = .... then
     Field.Value := Field.Value + столько-то минут опоздания

И тогда в гриде увидишь у нужной запись время + столько минут опоздания.


не совсем понял... у меня работает связка ibquery+DBGrid1+dataset и я там не нашел
Цитата(Akella @  27.5.2009,  23:24 Найти цитируемый пост)
OnSetText
...

строку
Цитата(Akella @  27.5.2009,  23:24 Найти цитируемый пост)
if id = .... then
 тоже не понял... id чего?
туплю?? smile 

Автор: Akella 28.5.2009, 17:32
Цитата(Deee @  28.5.2009,  16:32 Найти цитируемый пост)
ibquery+DBGrid1+dataset 

как это??? smile

Добавлено @ 17:33
Цитата(Deee @  28.5.2009,  16:32 Найти цитируемый пост)
OnSetText
...

У набора данных ты создаёшь поля?

Добавлено @ 17:34
Дважды щёлкни по набору данных, появится редактор полей.... вот я о чём... у каждого поля есть события, в том числе и OnSetTex

Добавлено @ 17:39
хотя с OnSetTex неудачный пример, забудь. Лучше, думаю, хранить данные по опозданию в базе. В той же таблице, или создать отдельную.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)