22.11.2024
Эффективная Навигация М2М
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Как вычислить состояние ТС?
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]) для которых есть необработанные сообщения

осталось это все свести в один запрос вам smile
 
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)
осталось это все свести в один запрос вам
ну сам себе и отвечаю smile

Код
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, даже когда машина едет. Правильно ли я понимаю, что если машина стоит, то с датчиков не снимается ни какая информация ? Т.е он думает, что ТС стоит. Было у кого такое ?
 
  • Страница 1 из 1
  • 1
Поиск:

LogOff © 2024
Сайт создан в системе uCoz Рейтинг GPS Клуба. GPS навигаторы. GPS мониториг. GPS трекеры. ГЛОНАСС