![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как организовать данные?
Лёша © (2009-04-22 11:22:00)Имеется парк машин. У каждой машины может быть несколько состояний логического типа. Нужно вести лог по изменению этих сотояний. Проблема в том, что типы состояний постоянно добавляются. И поэтому иметь поле в логе на каждое состояние нельзя.
При изменении состояния в логе я добавляю запись с флагом включилось оно или нет.
Вот, что получается:
Дата Машина Сотояние Включено Описание
'01.01.2009' 123 'Ремонт' 1
'02.01.2009' 123 'Ремонт' 0
'05.01.2009' 123 'Ремонт' 1
'05.01.2009' 123 'Запуск' 1
'05.01.2009' 444 'Запуск' 1
'05.01.2009' 444 'Ремонт' 1
'06.01.2009' 333 'Резервация' 1
'06.01.2009' 444 'Запуск' 0
'07.01.2009' 123 'Перемещение' 1
'11.01.2009' 123 'Ремонт' 0
Вопрос. Правильно ли я организовал лог изменений?
Jeer (2009-04-22 15:24:00) [1]
> Лёша (22.04.09 13:31) [17]
>
> Один пользователь ставит сотояние с описанием, снимать сотояние
> может другой пользователь со своим описанием. Оба они должны
> быть отмечены в журнале.
>
Или Вы не программист ( по статусу ) - тогда наймите специалиста.
Либо Вы только учитесь - тогда вслушивайтесь в рекомендации.
В общем, успеха !
Попытки создания запросов без предварительно тщательно спланированной технологии учета и спроектированной надлежащей архитектуры БД могут стать причиной Вашего увольнения без выходного пособия :)
clickmaker (2009-04-22 13:37:00) [2]> [17] Лёша (22.04.09 13:31)
ну так тогда
OperationID (identity), InitialOperationID, CarID, StateID, CurrentUser, CurrentTime, Description
машина вошла - InitialOperationID NULL
вышла - InitialOperationID = OperationID операции "входа"
Лёша (2009-04-22 13:31:00) [3]Один пользователь ставит сотояние с описанием, снимать сотояние может другой пользователь со своим описанием. Оба они должны быть отмечены в журнале.
clickmaker (2009-04-22 13:27:00) [4]> Если делать "Двойную" дату, прийдется и дублировать остальные
> поля
зачем?
таблица такого вида
CarID, StateID, CurrentUser, CurrentTime, Description, BeginDate, EndDate
машина вошла в состояние - установили BeginDate
вышла - EndDate
Лёша (2009-04-22 13:11:00) [5]clickmaker © (22.04.09 11:34) [6]
> таблица Car
> поля CarID ...
> таблица CarState
> поля CarID - ссылается на Car, StateID - ссылается на справочник
> состояние, BeginDate, EndDate
> то есть в этой таблице может быть несколько записей для
> одной машины
У меня в журнале имеются еще поля: CurrentUser, CurrentTime, Description.
Если делать "Двойную" дату, прийдется и дублировать остальные поля. Еще немного усложняется процедура добавления/снятия сотояний.
Но это не страшно. Дело в том, что запрос к такой таблице, который мне нужен (Лёша (22.04.09 11:25) [1] ). Имхо, не сильно упрощается.
Sergey13 (2009-04-22 12:28:00) [6]> [12] Jeer © (22.04.09 12:06)
Примерно так. 8-)
У меня это помнится называлось АРМ "План-график планово-предупредительного ремонта" и планы были примерно такими как ты написал.
Но как это часто бывает, все сошло на нет, когда выяснилось, что туда надо постоянночто-то оперативно вводить, не считая здоровенной справочной информации. Главный механик оказывается мечтал о волшебных электронных шахматке, карандаше и ластике, которые по щучьему велению нарисуют ему все сами.
Лёша (2009-04-22 12:22:00) [7]Jeer © (22.04.09 11:42) [8]
> дата означает конец предыдущей операции и
> начало следующей
Нет не так.
Машина переходит в сотояние 'Ремонт' отметкой в журнале:
Дата Машина 'Ремонт' Включено.
Машина выходит из сотояния 'Ремонт' толькоотметкой в журнале:
ДатаБольше Машина 'Ремонт' Выключено.
Паралельно с этим у этой машины меняются другие состояния, которые на 'Ремонт' никак не влияют.
Таблица (лог, журнал) меня почти устраивают. Я могу узнать, как менялись сотояния у одной машины. Я могу узнать ее состояния на конкретную дату.
Я могу видеть все автоматы, которые, например 'Перемещаются'.
Но я не могу написать запрос, который выводит все текущие состояния (те, которые включены) всех машин.
Jeer (2009-04-22 12:06:00) [8]
> там куча подводных камней.
Ага, потом еще появится календарное планирование, оптимизация, премии и наказания, etc..
Sergey13 (2009-04-22 11:58:00) [9]> [0] Лёша (22.04.09 11:22)
> Нужно вести лог по изменению этих сотояний.
Мне кажется слово "ЛОГ" тут ен совсем уместно. Лог это нечто автоматическое и паралельное.
Тут же я так думаю надо говорить о "Журнале обслуживания оборудования" или что-то в этом роде. Наверное выписываются какие то документы на ремонт, соблюдаются какие то графики этого ремонта, работу наконец выполнят конкретные исполнители у кторых есть свой график работы и т.д.и т.п.
Если я прав, то екселевским подходом тут не обойдешься.
Помнится давным давно делал нечто подобное - там куча подводных камней.
Jeer (2009-04-22 11:47:00) [10]Да, похоже он пока в творческих муках.
Anatoly Podgoretsky (2009-04-22 11:46:00) [11]> Jeer (22.04.2009 11:42:08) [8]
С другой стороны неясно как нужно, автор не желает пока раскрывать этой тайны.
Jeer (2009-04-22 11:42:00) [12]
> Если ты думаешь об этом, то достаточно одного поля Дата
> операции, только оно должно быть со временем.
Я не стал уточнять формат даты - это зависит от дискретности учета.
Может им время и не надо.
С другой стороны, действительно можно обойтись одни полем "Дата:время", если считать, что поток состояний машины непрерывно фиксируется
В этом случае дата означает конец предыдущей операции и начало следующей
Разборка дата
Простой дата
Промывка дата
Очистка дата
Простой дата
Замена дата
Сборка дата
Простой дата
Перемещение дата
Но для двух полей дат и признака завершения операции легче будет с выборками, как мне кажется.
Jeer (2009-04-22 11:36:00) [13]Ну и ладно, это не противоречит
Предположим состояние Ремонт может включать:
- разборка
- очистка
- замена
- покраска
- сборка
- испытание
В таком случае даты начала и окончания комплексной операции Ремонт
включают в себя все промежуточные даты
Можно ввести признак "Операция завершена", либо по специальному значения даты окончания ( начало прошлого века или "нулевая" дата ) отслеживать окончание той или иной операции.
clickmaker (2009-04-22 11:34:00) [14]> В том-то и проблема, что может.
таблица Car
поля CarID ...
таблица CarState
поля CarID - ссылается на Car, StateID - ссылается на справочник состояние, BeginDate, EndDate
то есть в этой таблице может быть несколько записей для одной машины
Anatoly Podgoretsky (2009-04-22 11:34:00) [15]> Jeer (22.04.2009 11:27:02) [2]
Если ты думаешь об этом, то достаточно одного поля Дата операции, только оно должно быть со временем.
Anatoly Podgoretsky (2009-04-22 11:32:00) [16]> Лёша (22.04.2009 11:22:00) [0]
А как надо?
Лёша (2009-04-22 11:29:00) [17]Jeer © (22.04.09 11:27) [2]
> Как я понимаю, машина не может одновременно пребывать в
> нескольких состояниях ?
В том-то и проблема, что может.
Jeer (2009-04-22 11:27:00) [18]Как я понимаю, машина не может одновременно пребывать в нескольких состояниях ?
Я бы ввел два поля "Дата начала операции" и "Дата окончания операции"
Поле Включено убрать.
Лёша (2009-04-22 11:25:00) [19]Если правильно, ответте:
Как вывести все последние состояния для всех машин?
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1240379974&n=18