Вначале делали проверки через ABAP, там же формировали результат в виде отчёта и отправляли на почту.
С возможностью создавать отчёты SAP BO на произвольном SQL-скрипте стало проще.
Версия не последняя, возможны изменения. Но чтобы не забыть.
Таблица ZPSB_BWA_MAP:
AUDITS_FLAG CHAR 3 0 Флаг\ключ проверки
TIME_VALUE DEC 10 2 Глубина проверки
DESCRIPTION TEXT255 CHAR 255 0 Текст, 255 знаков
Настроечная таблица для проверяемых в BW объектов
Таблица с параметрами проверки для объектов из таблицы ZPSB_BWA_OBJ.
Поле TIME_VALUE определяет глубину времени проверки, "Период С".
Так как на языке SQL арифметические операции с датами выполняются в часах, получаем значение TIME_VALUE по формуле = (1*нужное_значение_в_часах)/24.
Округляйте до двух знаков после запятой.
Таблица ZPSB_BWA_OBJ:
DSO_NAME RSBKTGTNM CHAR 45 0 Имя цели данных процесса переноса данных
AUDITS_FLAG CHAR 3 0 Флаг\ключ проверки
Список проверяемых в BW объектов и код проверки
Таблица связь объекта и типа проверки.
Параметры проверки ведутся в таблице ZPSB_BWA_MAP
Сами скрипты:
----------------------------------------------------------------------------------------------------------------------------------------
with param_value
as (
select obj.DSO_NAME as TGT,
map.TIME_VALUE as tm,
map.DESCRIPTION as descr
from sapsr3.ZPSB_BWA_OBJ obj
inner join sapsr3.ZPSB_BWA_MAP map on obj.AUDITS_FLAG = map.AUDITS_FLAG
order by tm, tgt
)
select distinct
onetab.TGT as Object_name,
(select tm from param_value where tgt = onetab.TGT) as Time_value,
(select descr from param_value where tgt = onetab.TGT) as Dectription,
'Как это ни печально, но нет' as Results,
'Последняя успешная загрузка была ' || to_char(to_date(substr(three.max_tmstmp, 0, 14), 'YYYY.MM.DD HH24:MI:SS') + to_dsinterval('00 3:00:00'), 'DD.MM.YYYY HH24:MI:SS') as Comments
from sapsr3.RSBKREQUEST onetab
left join (
select distinct
RSBKREQUEST.TGT --, RSBKREQUEST.REQUID, RSBKREQUEST.TSTMP_FINISH
from sapsr3.RSBKREQUEST RSBKREQUEST
where RSBKREQUEST.TSTMP_FINISH between to_number(to_char(cast(SYSTIMESTAMP at time zone '0:00' as timestamp)-(select tm from param_value where tgt = RSBKREQUEST.TGT), 'yyyymmddhh24miss'))
and to_number(to_char(cast(SYSTIMESTAMP at time zone '0:00' as timestamp), 'yyyymmddhh24miss'))
and RSBKREQUEST.LINESTRANSFERRED > 0
and RSBKREQUEST.TGT in ( select tgt from param_value )
) twotab on onetab.TGT = twotab.TGT
inner join (
select TGT, max(TSTMP_FINISH) as max_tmstmp
from sapsr3.RSBKREQUEST
where LINESTRANSFERRED > 0
and RSBKREQUEST.TGT in ( select tgt from param_value )
and TSTATE in ('1', '2', '6', '7', '8')
group by tgt
) three on onetab.TGT = three.TGT
where twotab.TGT is null
and onetab.TGT in ( select tgt from param_value )
and onetab.TSTMP_FINISH > 0
----------------------------------------------------------------------------------------------------------------------------------------
union all
select distinct
'W4SALREG' as Object_name,
3 as Time_value,
'Есть ли данные за последние три дня?' as Dectription,
'Как это ни печально, но нет' as Results,
'Последняя успешная загрузка была ' || to_char(to_date(substr(( select max(TSTMP_FINISH) as max_tmstmp
from sapsr3.RSBKREQUEST
where LINESTRANSFERRED > 0
and RSBKREQUEST.TGT = 'W4SALREG'
and TSTATE in ('1', '2', '6', '7', '8')
group by tgt
), 0, 14), 'YYYY.MM.DD HH24:MI:SS') + to_dsinterval('00 3:00:00'), 'DD.MM.YYYY HH24:MI:SS') as Comments
from dual
where not exists (
select distinct
LOAD_DATE
from sapsr3."/BIC/AW4SALREG00" W4SALREG
where LOAD_DATE = to_char(sysdate, 'YYYYMMDD' )
or LOAD_DATE = to_char(sysdate-1, 'YYYYMMDD' )
or LOAD_DATE = to_char(sysdate-2, 'YYYYMMDD' )
)
----------------------------------------------------------------------------------------------------------------------------------------
union all
select *
from (
select 'ZRRQST' as Object_name,
7 as Time_value,
'Есть ли слишком большие отклонения по количеству загруженных строк за последние 7 дней?' as Dectription,
'Как это ни печально, но да' as Results,
'Дата ' || chr(9) || 'Число записей '
|| listagg(chr(10) || to_char(to_date(dat, 'YYYYMMDD'), 'DD.MM.YYYY') || chr(9) || to_char(co, '999G999G999D99','NLS_NUMERIC_CHARACTERS = '', ''') )
within group (order by to_char(to_date(dat, 'YYYYMMDD'), 'DD.MM.YYYY') desc) as Comments
from (
select "/BIC/ZRRQSDT" as dat,
count("/BIC/ZRRQSDT") as co,
stddev(count("/BIC/ZRRQSDT")) over () / avg(count("/BIC/ZRRQSDT")) over () * 100 as srqd
from sapsr3."/BIC/AZRRQST00"
where "/BIC/ZRRQSDT" between to_char(sysdate-7, 'yyyymmdd') and to_char(sysdate-1, 'yyyymmdd')
group by "/BIC/ZRRQSDT"
) ct
having min(ct.srqd) > 20
)
----------------------------------------------------------------------------------------------------------------------------------------
union all
select 'ZREQREF' as Object_name,
1 as Time_value,
'Была ли хоть какая-то загрузка за последние сутки?' as Dectription,
'Как это ни печально, но нет' as Results,
'Последняя успешная загрузка была ' || to_char(to_date(substr( (
select max(TSTMP_FINISH)
from sapsr3.RSBKREQUEST
where TGT = 'ZREQREF'
and LINESTRANSFERRED > 0
and TSTATE in ('1', '2', '6', '7', '8')
group by tgt
), 0, 14), 'YYYY.MM.DD HH24:MI:SS') + to_dsinterval('00 3:00:00'), 'DD.MM.YYYY HH24:MI:SS') as Comments
from dual
where not exists (
select TSTMP_FINISH
from sapsr3.RSBKREQUEST
where LINESTRANSFERRED > 0
and TGT = 'ZREQREF'
and TSTMP_FINISH between to_number(to_char(cast(SYSTIMESTAMP at time zone '0:00' as timestamp)-1, 'yyyymmddhh24miss'))
and to_number(to_char(cast(SYSTIMESTAMP at time zone '0:00' as timestamp), 'yyyymmddhh24miss'))
)
----------------------------------------------------------------------------------------------------------------------------------------
Про формат отчёта и разные тонкости, типа сортировки проверок в нужной последовательности писать не буду - всё индивидуально.
Рассылаем там же, в BO, список рассылки - через группу в AD.
Таблица с параметрами проверки для объектов из таблицы ZPSB_BWA_OBJ.
Поле TIME_VALUE определяет глубину времени проверки, "Период С".
Так как на языке SQL арифметические операции с датами выполняются в часах, получаем значение TIME_VALUE по формуле = (1*нужное_значение_в_часах)/24.
Округляйте до двух знаков после запятой.
Таблица ZPSB_BWA_OBJ:
DSO_NAME RSBKTGTNM CHAR 45 0 Имя цели данных процесса переноса данных
AUDITS_FLAG CHAR 3 0 Флаг\ключ проверки
Список проверяемых в BW объектов и код проверки
Таблица связь объекта и типа проверки.
Параметры проверки ведутся в таблице ZPSB_BWA_MAP
Сами скрипты:
----------------------------------------------------------------------------------------------------------------------------------------
with param_value
as (
select obj.DSO_NAME as TGT,
map.TIME_VALUE as tm,
map.DESCRIPTION as descr
from sapsr3.ZPSB_BWA_OBJ obj
inner join sapsr3.ZPSB_BWA_MAP map on obj.AUDITS_FLAG = map.AUDITS_FLAG
order by tm, tgt
)
select distinct
onetab.TGT as Object_name,
(select tm from param_value where tgt = onetab.TGT) as Time_value,
(select descr from param_value where tgt = onetab.TGT) as Dectription,
'Как это ни печально, но нет' as Results,
'Последняя успешная загрузка была ' || to_char(to_date(substr(three.max_tmstmp, 0, 14), 'YYYY.MM.DD HH24:MI:SS') + to_dsinterval('00 3:00:00'), 'DD.MM.YYYY HH24:MI:SS') as Comments
from sapsr3.RSBKREQUEST onetab
left join (
select distinct
RSBKREQUEST.TGT --, RSBKREQUEST.REQUID, RSBKREQUEST.TSTMP_FINISH
from sapsr3.RSBKREQUEST RSBKREQUEST
where RSBKREQUEST.TSTMP_FINISH between to_number(to_char(cast(SYSTIMESTAMP at time zone '0:00' as timestamp)-(select tm from param_value where tgt = RSBKREQUEST.TGT), 'yyyymmddhh24miss'))
and to_number(to_char(cast(SYSTIMESTAMP at time zone '0:00' as timestamp), 'yyyymmddhh24miss'))
and RSBKREQUEST.LINESTRANSFERRED > 0
and RSBKREQUEST.TGT in ( select tgt from param_value )
) twotab on onetab.TGT = twotab.TGT
inner join (
select TGT, max(TSTMP_FINISH) as max_tmstmp
from sapsr3.RSBKREQUEST
where LINESTRANSFERRED > 0
and RSBKREQUEST.TGT in ( select tgt from param_value )
and TSTATE in ('1', '2', '6', '7', '8')
group by tgt
) three on onetab.TGT = three.TGT
where twotab.TGT is null
and onetab.TGT in ( select tgt from param_value )
and onetab.TSTMP_FINISH > 0
----------------------------------------------------------------------------------------------------------------------------------------
union all
select distinct
'W4SALREG' as Object_name,
3 as Time_value,
'Есть ли данные за последние три дня?' as Dectription,
'Как это ни печально, но нет' as Results,
'Последняя успешная загрузка была ' || to_char(to_date(substr(( select max(TSTMP_FINISH) as max_tmstmp
from sapsr3.RSBKREQUEST
where LINESTRANSFERRED > 0
and RSBKREQUEST.TGT = 'W4SALREG'
and TSTATE in ('1', '2', '6', '7', '8')
group by tgt
), 0, 14), 'YYYY.MM.DD HH24:MI:SS') + to_dsinterval('00 3:00:00'), 'DD.MM.YYYY HH24:MI:SS') as Comments
from dual
where not exists (
select distinct
LOAD_DATE
from sapsr3."/BIC/AW4SALREG00" W4SALREG
where LOAD_DATE = to_char(sysdate, 'YYYYMMDD' )
or LOAD_DATE = to_char(sysdate-1, 'YYYYMMDD' )
or LOAD_DATE = to_char(sysdate-2, 'YYYYMMDD' )
)
----------------------------------------------------------------------------------------------------------------------------------------
union all
select *
from (
select 'ZRRQST' as Object_name,
7 as Time_value,
'Есть ли слишком большие отклонения по количеству загруженных строк за последние 7 дней?' as Dectription,
'Как это ни печально, но да' as Results,
'Дата ' || chr(9) || 'Число записей '
|| listagg(chr(10) || to_char(to_date(dat, 'YYYYMMDD'), 'DD.MM.YYYY') || chr(9) || to_char(co, '999G999G999D99','NLS_NUMERIC_CHARACTERS = '', ''') )
within group (order by to_char(to_date(dat, 'YYYYMMDD'), 'DD.MM.YYYY') desc) as Comments
from (
select "/BIC/ZRRQSDT" as dat,
count("/BIC/ZRRQSDT") as co,
stddev(count("/BIC/ZRRQSDT")) over () / avg(count("/BIC/ZRRQSDT")) over () * 100 as srqd
from sapsr3."/BIC/AZRRQST00"
where "/BIC/ZRRQSDT" between to_char(sysdate-7, 'yyyymmdd') and to_char(sysdate-1, 'yyyymmdd')
group by "/BIC/ZRRQSDT"
) ct
having min(ct.srqd) > 20
)
----------------------------------------------------------------------------------------------------------------------------------------
union all
select 'ZREQREF' as Object_name,
1 as Time_value,
'Была ли хоть какая-то загрузка за последние сутки?' as Dectription,
'Как это ни печально, но нет' as Results,
'Последняя успешная загрузка была ' || to_char(to_date(substr( (
select max(TSTMP_FINISH)
from sapsr3.RSBKREQUEST
where TGT = 'ZREQREF'
and LINESTRANSFERRED > 0
and TSTATE in ('1', '2', '6', '7', '8')
group by tgt
), 0, 14), 'YYYY.MM.DD HH24:MI:SS') + to_dsinterval('00 3:00:00'), 'DD.MM.YYYY HH24:MI:SS') as Comments
from dual
where not exists (
select TSTMP_FINISH
from sapsr3.RSBKREQUEST
where LINESTRANSFERRED > 0
and TGT = 'ZREQREF'
and TSTMP_FINISH between to_number(to_char(cast(SYSTIMESTAMP at time zone '0:00' as timestamp)-1, 'yyyymmddhh24miss'))
and to_number(to_char(cast(SYSTIMESTAMP at time zone '0:00' as timestamp), 'yyyymmddhh24miss'))
)
----------------------------------------------------------------------------------------------------------------------------------------
Про формат отчёта и разные тонкости, типа сортировки проверок в нужной последовательности писать не буду - всё индивидуально.
Рассылаем там же, в BO, список рассылки - через группу в AD.
Комментариев нет:
Отправить комментарий