Ola pessoal,
Neste artigo pretendo mostrar como fazer um relatório filtrando por categorias no CA
Service Desk 12.6 uma vez que as categorias sao armazenadas em um único campo separando os subníveis por ponto.
Pretendo utilizar o comando parsename para separar os níveis, so que temos um problema com esse comando. Ele conta a partir da direita para esquerda e tambem ele considera outros caracteres como por exemplo aspas como separador. Com isso nao podemos confiar neles para definir os niveis. Para isso criei uma funcao que conta a quantidade de pontos do campo. Assim a quantidade de pontos + 1 seria a quantidade de níveis que aquele campo teria.
Primeiramente temos que criar um no SQL Server uma
função para contar a quantidade de um determinado caracter que voces podem ver acessando o link.
Utilizando a função CountChar + o comando
parsename do SQL Server para localizar os níveis das categorias:
use mdb
go
select sym, dbo.CountChar('.',sym)+1 as 'QtdNiveis',
CASE WHEN
dbo.CountChar('.',sym)>0 THEN substring(sym,1,(charindex('.',sym)-1)) ELSE ct.sym END as 'CTG_1nivel',
CASE WHEN
(dbo.CountChar('.',sym)+1)=2 THEN parsename(sym,1)
WHEN (dbo.CountChar('.',sym)+1)=3 THEN parsename(sym,2)
WHEN (dbo.CountChar('.',sym)+1)=4 THEN parsename(sym,3)
WHEN (dbo.CountChar('.',sym)+1)=5 THEN parsename(sym,4) ELSE '' END as 'CTG_2nivel',
CASE WHEN
(dbo.CountChar('.',sym)+1)=3 THEN parsename(sym,1)
WHEN (dbo.CountChar('.',sym)+1)=4 THEN parsename(sym,2)
WHEN (dbo.CountChar('.',sym)+1)=5 THEN parsename(sym,3) ELSE '' END as 'CTG_3nivel',
CASE WHEN
(dbo.CountChar('.',sym)+1)=4 THEN parsename(sym,1)
WHEN (dbo.CountChar('.',sym)+1)=5 THEN parsename(sym,2) ELSE '' END as 'CTG_4nivel',
CASE WHEN (dbo.CountChar('.',sym)+1)=5 THEN parsename(sym,1) ELSE '' END as 'CTG_5nivel'
from prob_ctg
ct
A consulta acima mostra o campo das categorias (sym) separando por niveis. A partir dai a imaginação é o limite. :-) Seguem alguns exemplos:
Exemplo 1: FILTRA TODOS OS CHAMADOS ATIVOS DO TIPO PROBLEMA ONDE A CATEGORIA
DE PRIMEIRO NIVEL SEJA IGUAL A TI
use mdb
go
select cr.ref_num, ct.sym
from Call_Req
cr, prob_ctg ct
where cr.active_flag=1 -- chamados ativos
and cr.category = ct.persid
and cr.type like 'P' -- do tipo Problema
and (CASE WHEN dbo.CountChar('.',ct.sym)>0
THEN substring(ct.sym,1,(charindex('.',ct.sym)-1))
ELSE ct.sym
END) like 'TI' -- Categoria de Primeiro Nivel igual a TI
Exemplo 2: FILTRA TODOS OS CHAMADOS ATIVOS DO TIPO PROBLEMA ONDE A CATEGORIA DE
SEGUNDO NIVEL IGUAL A BANCO DE DADOS
use mdb
go
select cr.ref_num, ct.sym
from Call_Req
cr, prob_ctg ct
where cr.active_flag=1 -- chamados ativos
and cr.category = ct.persid
and cr.type like 'P' -- do tipo Problema
and (CASE WHEN (dbo.CountChar('.',sym)+1)=2 THEN parsename(sym,1)
WHEN (dbo.CountChar('.',sym)+1)=3 THEN parsename(sym,2)
WHEN (dbo.CountChar('.',sym)+1)=4 THEN parsename(sym,3)
WHEN (dbo.CountChar('.',sym)+1)=5 THEN parsename(sym,4) ELSE '' END)
like 'Banco de
Dados' -- Categoria de Segundo Nivel igual a
Banco de Dados
Espero que tenha sido útil para voces.
Abraço e até a próxima !
Fabio Motta
Consultor de TI