среда, 27 февраля 2019 г.

Внутренние проверки витрин

Вначале делали проверки через 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.

Комментариев нет:

Отправить комментарий