18.10.2017
Эффективная Навигация М2М
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум (скрипты, вопросы...) » CyberFleet » Скрипты для CyberFleet, CrossPoint » Скрипт для ... (выборка из истории о посещении зон конкретных машин,)
Скрипт для ...
passHumsterДата: Вторник, 24.04.2012, 10:00 | Сообщение # 1
Казань
Группа: Проверенные
Сообщений: 5
Репутация: 0
Статус: Offline
Помогите пожалуйста. cry
Нужен скрипт, который для конкретной машины отфильтровывает времена посещения конкретной зоны. Критерий фильтра: время входа в зону позднее некоторого момента (например 17:00) ИЛИ время выхода из зоны раньше некоторого момента (раньше 7:00 например). Указывать гос номер, зона (предпологается 1), время выхода, время входа.
 
logoffДата: Вторник, 24.04.2012, 12:03 | Сообщение # 2
Тамбов
Группа: Администраторы
Сообщений: 649
Репутация: 19
Статус: Offline
т.е. скрипт, который бы по указанному гос номеру, названию зоны, периоды с по выдал бы все моменты посещения этой зоны в виде - время входа-время выхода из зоны?
 
passHumsterДата: Вторник, 24.04.2012, 13:25 | Сообщение # 3
Казань
Группа: Проверенные
Сообщений: 5
Репутация: 0
Статус: Offline
нет, нужно чтоб он выбрал те , время которых удовлетворяет условиям. но можно и без этого (фильтром просто отфигачить потом), главное одна машина, одна зона и все посещения за период списком.
 
logoffДата: Среда, 25.04.2012, 09:11 | Сообщение # 4
Тамбов
Группа: Администраторы
Сообщений: 649
Репутация: 19
Статус: Offline
под рукой готового нет. в течении пары дней могу сделаю
можете сами попробовать сделать, за основу использовав код процедуры dbo.FLEET_GetZonesObjectsForReport - для объекта получение списка из всех зон (нужно просто список зон для ограничить только вашей).
Если получится у вас, то отпишитесь, пожалуйста.
 
logoffДата: Среда, 25.04.2012, 09:33 | Сообщение # 5
Тамбов
Группа: Администраторы
Сообщений: 649
Репутация: 19
Статус: Offline
а 17:00 - 07:00 это для каждого дня, или конкретная дата будет в запросе?
ваша задача напоминает задачу по слежению за ТС на стоянке (покидающие стоянку в неурочное время)...
 
passHumsterДата: Среда, 25.04.2012, 11:47 | Сообщение # 6
Казань
Группа: Проверенные
Сообщений: 5
Репутация: 0
Статус: Offline
время для всех дней одинаково: выход из зоны раньше 8:00 и вход в зону позже 17:00...
Да кстати, задача именная такая и стоит нужно подсчитать сверхурочные за зимний период..
 
logoffДата: Среда, 25.04.2012, 12:27 | Сообщение # 7
Тамбов
Группа: Администраторы
Сообщений: 649
Репутация: 19
Статус: Offline
сверхурочные - это время нахождения вне зоны позже 17:00 и раньше 08:00?
 
logoffДата: Среда, 25.04.2012, 12:43 | Сообщение # 8
Тамбов
Группа: Администраторы
Сообщений: 649
Репутация: 19
Статус: Offline
нужно именно скриптом?
если нет, то можно через отчеты:
Выбрать ТС в списке, Отчеты - Отчет о посещении зон, выбрать только одну зону, настроить период - получится отчет о посещении одной зоны.
Далее в excel добавить 5 колонок:\
1,2 - это время без даты входа и выхода из зоны - это для фильтра
3,4 - это количество времени превышения для выхода и выхода из зоны
5 - это сумма 3,4

Если отработать один раз, то можно данные внести в шаблочик отчета
 
logoffДата: Среда, 25.04.2012, 13:15 | Сообщение # 9
Тамбов
Группа: Администраторы
Сообщений: 649
Репутация: 19
Статус: Offline
скрипт создания процедуры для базы данных BN_PATP_DOB

Code

USE [bn_patp_dob]
GO
/****** Object:  StoredProcedure [dbo].[FLEET_GetZonesObjectsForReport]    Script Date: 04/25/2012 12:59:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

alter PROCEDURE [dbo].[FLEET_GetZonesObjectsForReport_sverh]
      @ObjectGos varchar(30),@ZoneName varchar(256),
     @PeriodFrom smalldatetime,
     @PeriodTo smalldatetime,
     @SkipZoneTime int, --игнорируемое время внутри зон, с
     @SkipInBothTables bit=0
AS
BEGIN
     SET NOCOUNT ON
declare @ObjectID int

select top 1 @ObjectID=ObjectID from bn.dbo.FLEET_Object where ObjectGosNum=@ObjectGos and ObjectActive=1
if @ObjectID is null begin print 'не найдено ТС' return end
     Create table #TempData
     (
       ZoneName varchar(256),
       ZonePeriodFrom datetime,
       ZonePeriodTo datetime,
       ZoneTime int null,
     )

     Declare
        @ZoneID int
       ,@ZonePeriodFrom datetime
       ,@ZonePeriodTo datetime
       ,@ZoneRunFrom int
       ,@ZoneRunTo int
       ,@InZone bit
       ,@First bit

       Declare ZoneCurs cursor local fast_forward for select
         ZoneID,
         Name
       from bn.dbo.FLEET_Zone with(nolock)
       where
         (ZoneActive=1
         or
         (
           ZoneActive = 0 -- Zone has been deleted
           and IsTemporary = 1 -- Zone was temporary zone (inserted by some kind of integration procedure)
           and @PeriodTo >= AddDate -- And report period is crossing with zone life period
           and @PeriodFrom <= DeleteDate -- --"-- If zone was deleted before adding of DeleteDate column it should not present in report in any case.
                      -- It archived by FALSE result for comparison with NULL value in this column
         ))
         and name = @zoneName
       

     Open ZoneCurs
     while 0=0
     begin
       Fetch from ZoneCurs into @ZoneID, @ZoneName
       if @@Fetch_Status != 0 break

       Select
          @ZonePeriodFrom = null
         ,@ZonePeriodTo = null
         ,@InZone = 0
         ,@First = 1

       while 1 = 1
       begin

         if @First = 1
         begin
           -- Ищем первую за период отчёта координату в этой зоне
           Select top 1
              @ZonePeriodFrom = tele_time
             ,@ZoneRunFrom = CurrentRun
           from bn.dbo.SYS_DEV_ArchiveData with(index(IX2_SYS_DEV_ArchiveData))
           where
             ObjectID = @ObjectID
             and tele_time between @PeriodFrom and @PeriodTo
             and valid = 1
             and bn.dbo.FLEET_IsCoordinateInZone(long, lat, @ZoneID) = 1
           order by
             tele_time
             
           if @ZonePeriodFrom is null
             break -- До конца периода отчёта больше не нашлось координаты в этой зоне
        
           Select
              @InZone = 1
             ,@First = 0
         end
         else
           if @InZone = 0
           begin
             -- Ищем очередную первую координату в этой зоне
             Select top 1
                @ZonePeriodFrom = tele_time
               ,@ZoneRunFrom = CurrentRun
             from bn.dbo.SYS_DEV_ArchiveData with(index(IX2_SYS_DEV_ArchiveData))
             where
               ObjectID = @ObjectID
               and tele_time > @ZonePeriodTo
               and tele_time <= @PeriodTo
               and valid = 1
               and bn.dbo.FLEET_IsCoordinateInZone(long, lat, @ZoneID) = 1
             order by
               tele_time
             
             if @ZonePeriodFrom is null
               break -- До конца периода отчёта больше не нашлось координаты в этой зоне
        
             Select
                @InZone = 1
           end
           else
           begin
             -- Ищем первую очередную координату вне зоны
             Set @ZonePeriodTo = null

             Select top 1
                @ZonePeriodTo = tele_time
               ,@ZoneRunTo = CurrentRun
             from bn.dbo.SYS_DEV_ArchiveData with(index(IX2_SYS_DEV_ArchiveData))
             where
               ObjectID = @ObjectID
               and tele_time > @ZonePeriodFrom
               and tele_time <= @PeriodTo
               and valid = 1
               and bn.dbo.FLEET_IsCoordinateInZone(long, lat, @ZoneID) = 0
             order by
               tele_time
                
             if @ZonePeriodTo is null
               break -- До конца периода отчёта не найдено координат вне этой зоны

             Insert into #TempData
             (
                ZoneName
               ,ZonePeriodFrom
               ,ZonePeriodTo
             )
             values
             (
                @ZoneName
               ,@ZonePeriodFrom
               ,@ZonePeriodTo
             )

             Select
                @InZone = 0
               ,@ZonePeriodFrom = null

           end
       end

       if @ZonePeriodFrom is not null
       begin
         -- До окончания периода была обнаружена координата в этой зоне,
         -- но до окончания периода отчёта выход из зоны так и не произошёл.
         -- Надо взять данные из последней координаты в периоде отчёта.
         Select top 1
            @ZonePeriodTo = tele_time
           ,@ZoneRunTo = CurrentRun
         from bn.dbo.SYS_DEV_ArchiveData with(index(IX2_SYS_DEV_ArchiveData))
         where
           ObjectID = @ObjectID
           and tele_time between @ZonePeriodFrom and @PeriodTo
           and valid = 1
         order by
           tele_time desc

         Insert into #TempData
         (
            ZoneName
           ,ZonePeriodFrom
           ,ZonePeriodTo
         )
         values
         (
            @ZoneName
           ,@ZonePeriodFrom
           ,@ZonePeriodTo
         )
       end

     end  -- Zone cursor

     Close ZoneCurs
     Deallocate ZoneCurs

     Update TTD
     set
       ZoneTime=datediff(ss, ZonePeriodFrom, ZonePeriodTo)
     from #TempData TTD

     Update #TempData
     set
       ZoneTime=1
     where
       ZoneTime<1

     Select
       ZoneName,
       ZonePeriodFrom,
       ZonePeriodTo,
       ZoneTime
     from #TempData
     where
       ZoneTime>=@SkipZoneTime
     order by
       ZonePeriodFrom,
       ZoneName

    
     Drop table #TempData
END



Если базы данных BN_PATP_DOB у вас нет, то можно процедуру разместить и в бд флита

замените тогда
USE [bn_patp_dob]
на
USE [bn]

использование:

Code
DECLARE @RC int
DECLARE @ObjectGos varchar(30)
DECLARE @ZoneName varchar(256)
DECLARE @PeriodFrom smalldatetime
DECLARE @PeriodTo smalldatetime
DECLARE @SkipZoneTime int
DECLARE @IsFilterGroup bit
DECLARE @SkipInBothTables bit

-- TODO: задайте здесь значения параметров.
set dateformat dmy
EXECUTE @RC = [bn_patp_dob].[dbo].[FLEET_GetZonesObjectsForReport_sverh]    
      @ObjectGos='М613ТХ 68'-- гос номер
     ,@ZoneName='АЗС СтройПлюс Бастионная' -- название зоны
     ,@PeriodFrom ='01/04/2012 00:00:00' -- периода начала проверки
     ,@PeriodTo ='24/04/2012 00:00:00' -- период окончания проверки
     ,@SkipZoneTime = 5 -- фильтр на время мин внутри зоны - посещения меньше будут удалены
     ,@SkipInBothTables=0
GO
 
passHumsterДата: Среда, 25.04.2012, 13:40 | Сообщение # 10
Казань
Группа: Проверенные
Сообщений: 5
Репутация: 0
Статус: Offline
Quote
сверхурочные - это время нахождения вне зоны позже 17:00 и раньше 08:00?

Quote
Выбрать ТС в списке, Отчеты - Отчет о посещении зон, выбрать только одну зону, настроить период - получится отчет о посещении одной зоны.
так у мну не получится, для одной машины нельзя выбрать только одну зону (нет такого пункта), зоны можно выбирать в отчете посещения зон группой ТС...
Quote
Далее в excel добавить 5 колонок:\
1,2 - это время без даты входа и выхода из зоны - это для фильтра
3,4 - это количество времени превышения для выхода и выхода из зоны
5 - это сумма 3,4
поподробнее пожалуйста, если можно.
 
logoffДата: Среда, 25.04.2012, 13:48 | Сообщение # 11
Тамбов
Группа: Администраторы
Сообщений: 649
Репутация: 19
Статус: Offline
Quote (passHumster)
так у мну не получится, для одной машины нельзя выбрать только одну зону (нет такого пункта), зоны можно выбирать в отчете посещения зон группой ТС...

по умолчанию там выбраны все зоны
перенесите все зоны в окно слева, перенесите одну зону в окно справа.
будет выбрана одна зона
Прикрепления: 8988583.png(16Kb)
 
passHumsterДата: Среда, 25.04.2012, 13:53 | Сообщение # 12
Казань
Группа: Проверенные
Сообщений: 5
Репутация: 0
Статус: Offline
у меня не так.
Моя версия 1.15.2.3.
 
logoffДата: Среда, 25.04.2012, 14:04 | Сообщение # 13
Тамбов
Группа: Администраторы
Сообщений: 649
Репутация: 19
Статус: Offline
Quote (passHumster)
Quote
Далее в excel добавить 5 колонок:\
1,2 - это время без даты входа и выхода из зоны - это для фильтра
3,4 - это количество времени превышения для выхода и выхода из зоны
5 - это сумма 3,4
поподробнее пожалуйста, если можно.

L18 =(B18-ЦЕЛОЕ(B18))*24 - количество часов после 00:00:00 для момента входа
M18 =(C18-ЦЕЛОЕ(C18))*24 - для момента выхода
N18 = ЕСЛИ(M18>=17;M18-17;0) - выход после 17
O18 = ЕСЛИ(L18<=8;8-L18;0) - заход раньше 08

P18=N18+O18

примерно так

но это не совсем решит вашу задачку... мне кажется. голова забита, не могу сообразить хватит ли вам этого...
 
logoffДата: Среда, 25.04.2012, 14:07 | Сообщение # 14
Тамбов
Группа: Администраторы
Сообщений: 649
Репутация: 19
Статус: Offline
Quote (passHumster)
у меня не так.
Моя версия 1.15.2.3.

у меня 1.17.2.1
думаю, вам стоит обновиться.
 
logoffДата: Среда, 25.04.2012, 14:14 | Сообщение # 15
Тамбов
Группа: Администраторы
Сообщений: 649
Репутация: 19
Статус: Offline
Quote (logoff)
L18 =(B18-ЦЕЛОЕ(B18))*24 - количество часов после 00:00:00 для момента входа
M18 =(C18-ЦЕЛОЕ(C18))*24 - для момента выхода
N18 = ЕСЛИ(M18>=17;M18-17;0) - выход после 17
O18 = ЕСЛИ(L18<=8;8-L18;0) - заход раньше 08

P18=N18+O18

примерно так

но это не совсем решит вашу задачку... мне кажется. голова забита, не могу сообразить хватит ли вам этого...

точно не хватит, ибо нужно учитывать предыдущий выход из этой зоны (пред строка), а не текущий...
 
Форум (скрипты, вопросы...) » CyberFleet » Скрипты для CyberFleet, CrossPoint » Скрипт для ... (выборка из истории о посещении зон конкретных машин,)
Страница 1 из 11
Поиск:

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