Скрипт для ...
|
|
passHumster | Дата: Вторник, 24.04.2012, 10:00 | Сообщение # 1 |
Казань
Группа: Проверенные
Сообщений: 5
Репутация: 0
Статус: Offline
| Помогите пожалуйста. Нужен скрипт, который для конкретной машины отфильтровывает времена посещения конкретной зоны. Критерий фильтра: время входа в зону позднее некоторого момента (например 17:00) ИЛИ время выхода из зоны раньше некоторого момента (раньше 7:00 например). Указывать гос номер, зона (предпологается 1), время выхода, время входа.
|
|
| |
logoff | Дата: Вторник, 24.04.2012, 12:03 | Сообщение # 2 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| т.е. скрипт, который бы по указанному гос номеру, названию зоны, периоды с по выдал бы все моменты посещения этой зоны в виде - время входа-время выхода из зоны?
|
|
| |
passHumster | Дата: Вторник, 24.04.2012, 13:25 | Сообщение # 3 |
Казань
Группа: Проверенные
Сообщений: 5
Репутация: 0
Статус: Offline
| нет, нужно чтоб он выбрал те , время которых удовлетворяет условиям. но можно и без этого (фильтром просто отфигачить потом), главное одна машина, одна зона и все посещения за период списком.
|
|
| |
logoff | Дата: Среда, 25.04.2012, 09:11 | Сообщение # 4 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| под рукой готового нет. в течении пары дней могу сделаю можете сами попробовать сделать, за основу использовав код процедуры dbo.FLEET_GetZonesObjectsForReport - для объекта получение списка из всех зон (нужно просто список зон для ограничить только вашей). Если получится у вас, то отпишитесь, пожалуйста.
|
|
| |
logoff | Дата: Среда, 25.04.2012, 09:33 | Сообщение # 5 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 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 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| сверхурочные - это время нахождения вне зоны позже 17:00 и раньше 08:00?
|
|
| |
logoff | Дата: Среда, 25.04.2012, 12:43 | Сообщение # 8 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| нужно именно скриптом? если нет, то можно через отчеты: Выбрать ТС в списке, Отчеты - Отчет о посещении зон, выбрать только одну зону, настроить период - получится отчет о посещении одной зоны. Далее в excel добавить 5 колонок:\ 1,2 - это время без даты входа и выхода из зоны - это для фильтра 3,4 - это количество времени превышения для выхода и выхода из зоны 5 - это сумма 3,4
Если отработать один раз, то можно данные внести в шаблочик отчета
|
|
| |
logoff | Дата: Среда, 25.04.2012, 13:15 | Сообщение # 9 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 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 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| Quote (passHumster) так у мну не получится, для одной машины нельзя выбрать только одну зону (нет такого пункта), зоны можно выбирать в отчете посещения зон группой ТС... по умолчанию там выбраны все зоны перенесите все зоны в окно слева, перенесите одну зону в окно справа. будет выбрана одна зона
|
|
| |
passHumster | Дата: Среда, 25.04.2012, 13:53 | Сообщение # 12 |
Казань
Группа: Проверенные
Сообщений: 5
Репутация: 0
Статус: Offline
| у меня не так. Моя версия 1.15.2.3.
|
|
| |
logoff | Дата: Среда, 25.04.2012, 14:04 | Сообщение # 13 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 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 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| Quote (passHumster) у меня не так. Моя версия 1.15.2.3. у меня 1.17.2.1 думаю, вам стоит обновиться.
|
|
| |
logoff | Дата: Среда, 25.04.2012, 14:14 | Сообщение # 15 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 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
примерно так
но это не совсем решит вашу задачку... мне кажется. голова забита, не могу сообразить хватит ли вам этого... точно не хватит, ибо нужно учитывать предыдущий выход из этой зоны (пред строка), а не текущий...
|
|
| |