ЖУРНАЛ «СТА» 4/2016

108 СТА 4/2016 www.cta.ru очень длинные пути в поле Area и без их разбора колонки от- чёта будут слишком длинными и будут содержать ненужную информацию. Например: Исходное значение Area – АРМ Э\ВНЕШНЯЯ ТЕРРИТО- РИЯ\БКТП\СЭ\ШРНН_1. После разбора колонка с названием объекта будет содер- жать «ВНЕШНЯЯ ТЕРРИТОРИЯ\БКТП», а колонка с на- званием системы будет содержать «ШРНН_1». Также в spGetTodayAlarms происходит анализ собранной ин- формации, и в соответствующих полях (с метками времени) выводится поясняющая информация. Например, если ава- рийный сигнал не квитирован на момент формирования от- чёта, в поле «время квитирования» будет написано «Не кви- тировано». Если аварийный сигнал ещё не пропал или для аналогового сигнала произошло изменение одного аварий- ного уровня на другой, будет написано «Авария не снята/сме- нила уровень». С ОЗДАНИЕ ОТЧЁТА ДЛЯ R EPORT W OR X Для создания отчёта необходимо в ReportWorX Configurator создать новую конфигурацию (рис. 4) или использовать имеющуюся. Для конфигурации важно задать имя, и путь к В ЗАПИСНУЮ КНИЖК У ИНЖЕ Н Е РА Листинг 1. Функция spGetTodayAlarms USE [AlarmWorX64 Logger Database] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[spGetTodayAlarms] -- Add the parameters for the stored procedure here @SystemName varchar(100) = '', @ARMName varchar(100) = '', @SeverityVal int = 500 AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; SET LANGUAGE russian DECLARE @dd1 datetime, @dd2 datetime -- Insert statements for procedure here SET @dd1 = DATEADD(hh,00,GETDATE()- {fn CURRENT_time()}) -- Начало текущего дня SET @dd2 = cast(convert(char(10),@dd1,112)+'23:59:59' as datetime) -- Конец текущего дня SET @ARMName = @ARMName + '\' SET @SystemName = '\' +@SystemName /*Создаём временную таблицу для выборки алармов за сегодня*/ SELECT [Area],[EventTime],[Source],[Acked],[Condi- tionActive],[Message] ,[ActiveTime],[ChangeMask] INTO #TempAlarmLog FROM [AlarmWorX64 Logger Database].[dbo].[AlarmLog] WHERE [Area] LIKE @ARMName + '%' + @SystemName + '%' and Severity >= @SeverityVal and [_AckRequired] = 1 AND ([EventTime] BETWEEN @dd1 AND @dd2) /* Делаем выборку из временной таблицы, увязывая це- почку событий: появление аларма, квитирование, пропажа аларма */ SELECT SUBSTRING( SUBSTRING( EventTimeTable.Area, CHARINDEX( '\', EventTimeTable.Area) + 1, LEN(EventTimeTable.Area)), 1, CHARINDEX( @SystemName, SUBSTRING( EventTimeTable.Area, CHARINDEX('\', EventTimeTable.Area) + 1, LEN(EventTimeTable.Area))) - 1 ) As ObjectName, SUBSTRING(EventTimeTable.Area, CHARINDEX(@System- Name, EventTimeTable.Area) + LEN(@SystemName) + 1, LEN(EventTimeTable.Area)) As SystemName, EventTimeTable.Source, EventTimeTable.Message, REPLACE(ISNULL(convert(char(100), EventTimeTable.EventTime, 113), 'Не известно'),':000', '') As EventTime, REPLACE(ISNULL(convert(char(100), AckedTimeTable.EventTime, 113), 'Не квитирована'),':000', '') As AckedTime, REPLACE(ISNULL(convert(char(100), Condition- TimeTable.EventTime, 113), 'Авария не снята/сменила уровень'),':000', '') As ConditionTime FROM (SELECT * FROM #TempAlarmLog WHERE [Acked] = 0 And [ConditionActive] = 1) As EventTimeTable LEFT JOIN (SELECT [EventTime],[ActiveTime],[Acked],[ChangeMask],[Condi- tionActive] FROM #TempAlarmLog WHERE ([Acked] = 1 And [ConditionActive]= 1 And [ChangeMask] = 2) OR ([Acked] = 1 And [ConditionActive]= 0 And [ChangeMask] = 2)) As AckedTimeTable ON (EventTimeTable.ActiveTime = AckedTimeTable.Ac - tiveTime) LEFT JOIN (SELECT [EventTime],[ActiveTime],[Change- Mask],[ConditionActive] FROM #TempAlarmLog WHERE ([ConditionActive]= 0) And ([ChangeMask] = 1 OR [ChangeMask] = 257)) As Con- ditionTimeTable ON (EventTimeTable.ActiveTime = Condition- TimeTable.ActiveTime) DROP TABLE #TempAlarmLog; END

RkJQdWJsaXNoZXIy MTQ4NjUy