Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как организовать данные?


Лёша ©   (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


Наверх

Титульная страница Поиск, карта сайта Написать письмо