Как вычислить состояние ТС?
|
|
GorodetskiKP | Дата: Среда, 30.01.2013, 09:37 | Сообщение # 1 |
Нерюнгри
Группа: Проверенные
Сообщений: 1
Репутация: 1
Статус: Offline
| Необходимо выбрать из БД количество техники по текущим состояниям: - Отсутствует связь с ТС (коричневый) - Отсутствует связь с ГЛОНАСС (желтый) - Тревожное событие (красный) - ТС стоит (зеленый) - ТС движется (белый)
Нашел в базе функцию dbo.FLEET_CalcCurrentColors - судя по всему, она и подкрашивает.. но до конца механизм не ясен..
|
|
| |
vad | Дата: Четверг, 31.01.2013, 07:57 | Сообщение # 2 |
Барнаул
Группа: Проверенные
Сообщений: 223
Репутация: 17
Статус: Offline
| Посмотри в таблице SYS_DEV_CurrentData. Там есть все что нужно для того чтобы разукрасить табличку. Если Flag=4 то значит состояние стоянка, 5 - в движении. Собственно эти данные в dbo.FLEET_CalcCurrentColors и анализируются. Добавлено (31.01.2013, 07:57) --------------------------------------------- А могу я поинтересоваться для чего это понадобилось? Неужели и в Ночном Дозоре стоит флит?
|
|
| |
logoff | Дата: Пятница, 01.02.2013, 09:21 | Сообщение # 3 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| Цитата vad Если Flag=4 то значит состояние стоянка, 5 - в движении. флаг битовый, равенство проверять нельзя
нужно делать побитовое сравнение оператором & по таблице currentdata можно определенить flags&1=0 - стоянка (зеленый), flags&1<>0 - движение flags&4=0 - черный ящик (синий), flags&4<>0 - нормальные данные нет глонасс определяется по valid=0 (желтый) , ну и по датчику - но это сложнее
с отсутствием данных - только сравнением последней координаты с текущим временем (коричневый). примерно так Код /****** Скрипт для команды SelectTopNRows из среды SSMS ******/ SELECT TOP 1000 [device_id] ,[device_code] ,[tele_time] , [flags],case when flags&1=0 -- стоянка then case when (getdate()-cd.tele_time)>(cast('1900-01-01 00:00:00.000' as datetime)+cast(d.opt_int2 as float)/86400) then 'потеря связи' else '' end else case when getdate()-cd.tele_time>cast('1900-01-01 00:00:00.000' as datetime)+cast(d.opt_int1 as float)/86400 then 'потеря связи' else '' end end ,case when flags&1=0 -- стоянка then 'стоянка' else '' end FROM [BN].[dbo].[SYS_DEV_CurrentData] as CD inner join [BN].[dbo].[SYS_DEV_Device] as D on d.id=CD.device_id
а вот с тревожным сообщением (красный цвет) - надо делать уже выборку с [FLEET_Events] c фильтром where [WorkOffDateTime]is null
примерно так Код SELECT [IDObject]FROM [BN].[dbo].[FLEET_Events] where [WorkOffDateTime]is null group by [IDObject] на выходе список ObjectID (идентификаторов по таблице [FLEET_Object]) для которых есть необработанные сообщения
осталось это все свести в один запрос вам
|
|
| |
logoff | Дата: Пятница, 01.02.2013, 09:23 | Сообщение # 4 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| Цитата (GorodetskiKP) Нашел в базе функцию dbo.FLEET_CalcCurrentColors - судя по всему, она и подкрашивает.. но до конца механизм не ясен.. ну flags, valid берется из currentdata, а вот параметр @AlarmMess - не понятен, его видно клиент (или сервер) считает сам.... но, смотреть ответ выше
|
|
| |
logoff | Дата: Пятница, 01.02.2013, 09:52 | Сообщение # 5 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| Цитата (logoff) осталось это все свести в один запрос вам ну сам себе и отвечаю
Код create table #t(sost int, ObjectID int)
insert into #t select case when Ev. [IDObject]is not null then 5 when valid=0 then 4 when case when flags&1=0 -- стоянка then case when (getdate()-cd.tele_time)>(cast('1900-01-01 00:00:00.000' as datetime)+cast(d.opt_int2 as float)/86400) then 'потеря связи' else '' end else case when getdate()-cd.tele_time>cast('1900-01-01 00:00:00.000' as datetime)+cast(d.opt_int1 as float)/86400 then 'потеря связи' else '' end end ='потеря связи' then 3 when Flags&4=0 then 2 when Flags&1=0 then 1 else 0 end ,cd.ObjectID
from bn.dbo.SYS_DEV_CurrentData as CD inner join bn.[dbo].FLEET_Object as o on o.ObjectID=cd.ObjectID inner join bn.[dbo].[SYS_DEV_Device] as D on d.id=cd.device_id left join (SELECT [IDObject]FROM [BN].[dbo].[FLEET_Events] where [WorkOffDateTime]is null group by [IDObject]) as Ev on Ev.[IDObject]=Cd.ObjectID
where o.ObjectActive=1
--select * from #t select sost,count(*) from #t group by sost drop table #t точность работы не гарантирую - надо проверять на практике... для этого убрать комментарий на select * from #t и для каждого идентификатора выборочно проверить состояние по ТС могут быть перепутаны состояния 5,3... ибо как они расставлены в функции не очень понятно (порядок).
|
|
| |
Noel | Дата: Понедельник, 11.08.2014, 10:30 | Сообщение # 6 |
Москва
Группа: Модераторы
Сообщений: 67
Репутация: 4
Статус: Offline
| Цитата vad ( ) Flag=4 то значит состояние стоянка, 5 - в движении А у меня обнаружилась такая вот проблема, что флаг у терминала = 4, даже когда машина едет. Правильно ли я понимаю, что если машина стоит, то с датчиков не снимается ни какая информация ? Т.е он думает, что ТС стоит. Было у кого такое ?
|
|
| |