| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Firebird, Interbase > Вычисление и вставка времени в поле |
| Автор: Deee 25.5.2009, 19:12 |
| Здравствуйте! Делаю базу данных и клиентское приложение к ней. (InterBase 6.0, клиентское приложение пишу на delphi 7.0) тема железнодорожная касса. Есть таблица со всеми станциями железной дороги. Выбирается две станции (отправления и назначения) нужно сделать так чтобы можно было увидеть время отправления и прибытия поезда в таблице "маршрут". Для простоты и наглядности, время движения поезда по всей железной дороге разделим на количество станций и получим одинаковые промежутки времени между станциями. Требуется, зная время отправления поезда от самой первой станции железной дороги определить время отправления с выбранной станции и время прибытия на выбранную станцию. т.е. время отправления и прибытия на конкретном участке железной дороги (маршруте), и еще время в пути. Вот скрин http://s45.radikal.ru/i109/0905/b9/b280442a672d.jpg заранее спасибо! |
| Автор: Deee 25.5.2009, 22:58 |
| Akella, у меня InterBase стоит на университетской машине, поэтому я и работаю в нем... получается, что нужно в таблице "станции" завести столбец время?? а как правильно сложить значения определенного диапазона полей?? создать процедуру? |
| Автор: Akella 25.5.2009, 23:43 | ||
а так?
Добавлено через 1 минуту и 17 секунд Не знаю, наверное, я в структуру базы сильно не вникал. |
| Автор: Deniz 26.5.2009, 05:51 |
| еще покажи связи между таблицами PS: Deee, это реальная работа или диплом/курсач? |
| Автор: Deee 26.5.2009, 15:47 |
| Deniz, а как в InterBase связи показать? я не разобрался... это не диплом\курсач, это просто мой пример базы данных на зачет по информатике) (все делал абсолютно сам) |
| Автор: Akella 26.5.2009, 17:25 |
а что, есть разница? Добавлено через 1 минуту и 34 секунды Наверное, 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 секунды
На нашёл время отправления поезда. В какой таблице, в каком поле? Добавлено через 6 минут и 5 секунд мне кажется, что тебе нужно переделать структуру. По крайне мере я не вижу ни одного поля типа Time Добавлено через 14 минут и 13 секунд В итоге у тебя должна получится таблица в виде цепочки записей: ![]() |
| Автор: Deee 27.5.2009, 01:25 |
| Akella, спасибо попробую! а как сделать так, чтобы когда время отправления и прибытия и другая информация выведены на сетку (DBGrid), при нажатии на кнопку "поезд опаздывает" бралось значение из edit(mask edit или другого компанента) и прибавлялось к значению времени прибытия (время прибытия+задержка)... а потом соответственно при все возвращалось на круги своя?? |
| Автор: Deniz 27.5.2009, 05:49 |
| InterBase тут не причем. Для показа можно в Access сделать структуру БД и там есть возможность показать эту структуру или можно показать скрипт создания БД. Судя по рисунку, базу нужно нормализовать. Например, связь(если она есть) "Железные дороги" - "Маршруты" не нужна. Таблицу "Маршруты" можно реализовать в 2-х вариантах: 1. Как показал Akella. Минусы: трудное редактирование маршрута (добавить/удалить станцию для добавления 1 insert + 2 update) Плюсы: наглядность, легкость в написании SQL запросов 2. Примерно так же, как рисуют в поездах. "Станция" "Время прибытия" "Время отправления" Плюсы: легче редактировать маршрут, легче учитывать опоздание поезда (отслеживать прохождение по маршруту) Минусы: сложности(одним SQL запросом) с разными вычислениями PS: для зачета думаю сильно углубляться не стоит. |
| Автор: Akella 27.5.2009, 08:40 | ||
Deee, сначала построй правильную базу, а затем уже...
Добавлено @ 08:43 Deniz у меня это не структура исходной таблицы, а не готовый результат после (как бы) выполнения SQL запроса. Такой результат просто нагляднее хотя бы, чем у автора. Видно хотя бы время Добавлено @ 08:43 Да и вообще нужно поле не время, а дата + время (timestamp) |
| Автор: Deniz 27.5.2009, 09:10 |
| а вот здесь не согласен. Для шаблона нужно время без даты, потому как поезда могут ходить например так: каждую пятницу отправление в 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 | ||||
и у меня также, поэтому я сделал поле, где хранил список дат через запятую. Можно приклеить таблицу полями дата и время Добавлено через 1 минуту и 9 секунд
только хотел написать |
| Автор: Deee 27.5.2009, 14:48 | ||
| Akella, сделал http://i039.radikal.ru/0905/f0/8efaae125bd9.jpg...время поджимает, поэтому пошел на хитрость...(понимая,конечно, что это больше напоминает китайское программирование У меняимеется таблица "станции"(stan) и две точные ее копии "станции отправления"(sto) и "станции назначения"(stn) итого 1+2=3 одинаковых таблицы (верю, что нелогично!). таблица stan показана на форме и используется для показа результатов небольших тестовых запросов, 2 другие связаны с комбобоксами и их значения как раз и показаны в сетке "маршруты" (название маршруты совершенно условное, не успел додумать). также в этих двух таблицах (stn и sto) в каждой есть по два столбца ("время отправления"(timo) и "время прибытия"(timn))...то есть время привязано к ключу станции. вот запрос: (может что-то и некоректно, я ведь только учусь!)
|
| Автор: Akella 27.5.2009, 17:17 |
| И что, где-то ошибка закралась? Или что. Я последнее сообщение не понял к чему ты ведёшь? Если ты думаешь, что у меня есть время на полный разбор твоего приложения, то ты ошибаешься. :( |
| Автор: Deee 27.5.2009, 18:10 | ||
| Akella, причем тут полный разбор?! ты писал я уже решил вопрос со временем отправления и прибытия... у меня по ходу дела появился другой и я его уже задал (только его почему-то не заметили)
там процедуру встроенную создавать надо? или можно как-то обойтись без изменения данных хранящихся в таблицах?? |
| Автор: Akella 27.5.2009, 23:24 | ||
| Если программа будет работать по сети, то эту информацию должны видеть, типа, что поезд опаздывает и другие пользователи. А значит можно добавить поле в таблицу, типа время опоздания, например целочисленное, где будет хранится 10-20-150 или 300 минут опоздания. А можно создать таблицу какой-то хитрой структуры, в которой будет хранится инфа по времени опоздания, какой поезд опаздывает, маршрут, между какими станциями. Ну или ка-то так. Ну или совсем просто... В событии OnSetText persistent столбца набора данных (TIBDataSet или что там у тебя) написать код:
И тогда в гриде увидишь у нужной запись время + столько минут опоздания. Можно сделать вычисляемое поле в твоём наборе данных. В нём будет вычисляться время прибытия + минуты опоздания. Тогда в таблице нужно будет хранить доп. поле для количества минут опоздания. При чём можно хранить, как отрицательное время, так и положительное, отрицательное - это опоздание, а положительное - это раннее прибытие Теперь выбираем запись. Жмакаем кнопку, вводим -12 и записываем значение в базу. Ну может кто предложит более оптимальный вариант |
| Автор: Deee 28.5.2009, 16:32 | ||
Akella,
не совсем понял... у меня работает связка ibquery+DBGrid1+dataset и я там не нашел ... строку тоже не понял... id чего? туплю?? |
| Автор: Akella 28.5.2009, 17:32 |
как это??? Добавлено @ 17:33 У набора данных ты создаёшь поля? Добавлено @ 17:34 Дважды щёлкни по набору данных, появится редактор полей.... вот я о чём... у каждого поля есть события, в том числе и OnSetTex Добавлено @ 17:39 хотя с OnSetTex неудачный пример, забудь. Лучше, думаю, хранить данные по опозданию в базе. В той же таблице, или создать отдельную. |