Skip navigation
All People > TMACUL > Tiago MACUL's Blog > 2016 > January > 01

INGUAGEM SPEL (Continuação)

Abaixo a lista de funções que abordarei aqui no facebook:

 

downcase

upcase

format

gsub

is_empty

is_null

sindex

strlen

substr

logf

printf

scanf

split

expand

exec

getenv

setenv

now

send_wait

workshift_abs2work

workshift_work2abs

if

for

while

access

event

class

sleep

switch

break

continue

setilimit

return

set_error

set_return_data

msg_length

argv

argc

userid

format_to_js

dump_args

send_frame_resp

thread_object_ptr

 

Se esqueci de alguma, me avisem.

 

Publicado Originalmente: 21 de setembro às 14:02

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

TMACUL

LINGUAGEM SPEL 19/09/2015

Posted by TMACUL Champion Jan 1, 2016
LINGUAGEM SPEL
Quem é implementador da ferramenta SDM sabe como é difícil encontrar documentação da linguagem SPEL utilizada na ferramenta para construção de métodos que manipulem os objetos.
Essa linguagem é baseada no C++ mas parece que a CA "enxugou" ela ao máximo e poupou nos includes das bibliotecas.

Muito do que descobri veio através do fantástico recurso de "copy & paste" de outros códigos presentes na própria ferramenta. Outros comandos fui aprendendo nos sites sercicedeskusers.com,helpdeskusers.com (que Deus o tenha :)) e nas próprias comunidades oficiais da CA.
Pra dificultar ainda mais, a CA criptografou a maioria dos arquivos SPL no padrão PCODE de forma irreversível.

Quando o desafio e a necessidade falam mais alto, vale tudo. Desde inspecionar o arquivo spelsrvr.exe e até mesmo utilizar o comando pdm_logstat.exe para depurar o funcionamento dessa linguagem.

Por conta disso, na próxima semana iniciarei uma série de posts descrevendo o funcionamento de cada um dos comandos já descobertos.
Tenho certeza que até os melhores implementadores ficarão surpresos com o conteúdo que divulgarei.
Até lá!

 

 

 

Publicado Originalmente: 19 de setembro às 12:59

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

GESTÃO DE CONFIGURAÇÃO: Famílias, Classes e relacionamentos
Ontem acabou não dando tempo pra dar continuidade no assunto, mas vamos lá...

FAMÍLIAS & CLASSES
Todos os IC's/ativos no CMDB são divididos em famílias e classes. Dentro de uma mesma família podem existir diferentes classes especialistas.

Um IC pode ser qualquer coisa. Servidor, equipamento, rede, pessoa, local, serviço, organização, contrato, enfim, tudo que sua imaginação permitir. Basta você querer gerenciá-lo.

Na minha opinião, o modelo de dados do CMDB foi muito bem planejado dentro da ferramenta. Dependendo do tipo de IC, poderão existir mais ou menos atributos envolvidos no objeto.

Portanto, todos os itens possuem atributos comuns mas, dependendo da família envolvida, atributos adicionais poderão existir.
Desta forma, é possível de uma forma racional armazenar qualquer tipo de informação na base, gerenciada (IC) ou não (ativo).

O CMDB pode armazenar tanto IC's como ativos patrimoniais. Quando um item for considerado apenas um ativo, por padrão, ele deixará de ser gerenciado pela ferramenta SDM. No lugar dela, a ferramenta CA Asset poderá desempenhar este papel se ela estiver integrada com a SDM.

Sempre lembrando que, quanto mais granular for o seu CMDB, mais famílias e classes serão utilizadas e mais trabalho você terá para administrá-las.

E o mais importante: Nem tudo que pode ser cadastrado precisa ser cadastrado na base. E é por esta razão que é preciso dar foco apenas nos itens de configuração que serão gerenciados por sua empresa.
Essa decisão não é fácil de ser tomada pois envolve algumas questões conceituais que abordarei quando tratar de relacionamentos na base.

RELACIONAMENTOS
Dificilmente um IC está isolado na infraestrutura. Na maioria das vezes, existe um IC provedor e um IC dependente deste IC.
Para exemplificar, pense em um servidor...
Ele está conectado na rede, depende de outros equipamentos para prover serviços, atende clientes específicos, possui softwares, e todos esses relacionamentos "podem" ser considerados IC's.

Portanto, dependendo da finalidade de um IC e da infraestrutura física e lógica envolvida, podem existir dezenas de "elos" que conectam as "peças desse quebra cabeça".

E assim como a base cadastral de IC's, os relacionamentos também precisam ser cadastrados e mantidos no CMDB, manualmemte ou automaticamente.

Pois somente desta forma será possível responder aquelas perguntas que fiz no primeiro post que escrevi sobre a eficiência do processo de configuração.
Para ser mais didático, acompanhe o raciocínio...

Quando uma requisição de mudança é aberta por um analista, no mínimo um IC será modificado e poderá causar impacto na sua infraestrutura. E dependendo do tamanho dessa infraestrutura, é possível que esse analista não consiga avaliar com precisão a repercussão real de sua mudança.
E esse impacto gerado só poderá ser calculado se existirem relacionamentos entre este IC e seus respectivos serviços.

A maior dificuldade nesta avaliação é percorrer todos os níveis de relacionamento para identificar todos os IC's da familia serviço envolvidos. Não esqueça que está relação de dependência pode ser indireta, isto é, podem existir outros IC's em diferentes níveis envolvidos nesta topologia.

Para facilitar este trabalho, os " Gerenciadores de mudança" poderão utilizar a ferramenta "CMDB Visualizer" ou a próprio "Explorador de impacto" da mudança, presente na ferramenta SDM.

Uma das questões mais difíceis que precisam ser respondidas antes que seja iniciado qualquer processo de implantação de relacionamentos é sobre a granularidade que existirá no CMDB.

Um sistema pode ser considerado um único IC da família software. Mas nada impede que este sistema seja "quebrado" em IC's menores do tipo módulos, funcionalidades, serviços de infraestrutura, webservices, URLs, etc.
Tudo isso para prover informações de impacto mais precisas para um serviço de negócio.
O grande problema é que quanto mais partes houverem, mais relacionamentos existirão. E nem todos os relacionamentos podem ser criados automaticamente.

Viu o tamanho da dor de cabeça? Pois é. Minha recomendação é pensar bem antes que as cargas de relacionamentos sejam iniciadas. As vezes não é fácil ser muito especialista.

Semana que vem publicarei uma rotina SPEL que desenvolvi que facilita a varredura de relacionamentos na base e agrega muito valor para as mudanças. Aguarde!

Bom final de semana!

 

 

Publicado Originalmente: 18 de dezembro de 2015 às 23:38

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

GESTÃO DE CONFIGURAÇÃO: Atualização do CMDB
Quando você ouviu falar pela primeira vez sobre um único banco de dados de gerenciamento da configuração que armazenaria todos os itens de configuração e ativos da sua empresa, tenho certeza que você ficou muito animado com a ideia. Pois é, eu e muita gente também ficou.

Eu pensava que magicamente todos os ICS seriam "descobertos", relacionados, jogados na base e todos os processos de apoio ficariam felizes. #sóquenão

Aos poucos a "ficha caiu" e o que era pra ser fantástico, se transformou em uma enorme carga de trabalho.
Por mais que existam tecnologias e soluções integráveis ao CA CMDB, a implantação e manutenção não é fácil. Não adianta se enganar.

Se você trabalha com ferramentas de monitoria do tipo Zabbix, Instroscope, Selenium, SOI, Spectrum, E-Health e muitas outras, você sabe do que estou falando.
O protocolo SNMP e as famosas MIBS de monitoramento são realmente lindas, mas infelizmente se Steve Jobs ainda estivesse vivo e se interessasse por esse assunto, certamente ele mandaria jogar tudo no lixo e reformular.

Em suma: Comprar e instalar é muito fácil, mas manter atualizado é o maior desafio.

Depois dessa baita introdução que fiz questão de fazer pra mostrar "que nem tudo são flores", resta agora esquecer os problemas e pensar nas alternativas de solução mencionadas no post anterior.
Como iremos manter o CMDB atualizado?

ATUALIZAÇÃO AUTOMÁTICA
Através de algumas soluções homologadas compatíveis com a ferramenta SDM é possível alimentar o CMDB automaticamente através de serviços de descoberta externos baseados no protocolo SNMP ou através de arquivos intermediários de carga, quando é uilizado o utilitário GRLOADER da CA.

Quase todas aquelas ferramentas que mencionei antes podem fazer isso. Basta configurá-las ou planejar os arquivos de carga.
Em seguida, é necessário criar regras de reconciliação MDR para que o mapeamento de atributos na base de origem coincida com os atributos na base de destino, ou seja, no CMDB. Se isso não for feito corretamente, as informações descobertas pela ferramenta de monitoria não serão armazenadas nos seus devidos lugares dentro do CMDB.
E além disso, é indispensável entender o funcionamento do CORA, mecanismo esse que determina se um IC foi apenas atualizado ou deverá ser criado/inativado na base.
Feito isso, os IC's e seus relacionamentos serão atualizados automaticamente no CMDB ou irão parar na TWA, camada essa presente no CMDB utilizada temporariamente para que um "Analista de configuração" possa avaliar se a descoberta de IC's foi feita corretamente e se isso deve ser propagado na base oficial.

Outra possibilidade interessante em alguns casos é implantar o conceito de CMDBf que possibilita consolidar diversas bases "federadas" de configuração dentro do CMDB. Desta forma a atualização de dados ocorrerá instantaneamente. O processo ocorre por meio de webservices.

Deu pra perceber que esse assunto é bem complexo e acho que não seria possível detalhá-lo minuciosamente aqui no grupo devido a particularidades de cada ambiente.
Recomendo a leitura dos manuais de implementação e administração da ferramenta SDM, do CMDB e das ferramentas de monitoria homologadas.
E se mesmo assim você precisar de auxílio, não exite e recorra à CA ou integradores parceiros de sua empresa.

ATUALIZAÇÃO MANUAL
Outra forma muito popular de manter o CMDB atualizado é fazer este processo manualmemte por intermédio dos Analistas de configuração.
A prática mais comum é "amarrar" esta atividade no meio dos processos de mudança e incidente. Fazendo isso, toda alteração realizada nos IC's deverá refletir no CMDB. Mas não basta fazer apenas isso...
Como existe um risco considerável da base ficar desatualizada devido a não execução de alguma atividade cadastral, devido a falha no processo ou desconhecimento da alteração, se faz necessário instituir alguns processos de auditoria da base de configuração. O ideal é que estes processos de controle sejam executados periodicamente e sistematizados através de monitorias específicas.
Dependendo da quantidade de IC's e quantidade de mudanças realizadas na sua infraestrutura, processos manuais de cadastro tendem a ser menos eficientes e consequentemente, menos confiáveis.
A prática mais comum é investir em automação nos processos de cadastro mais sensíveis do negócio e manter processos manuais apenas nos cadastros menos críticos.

E pra finalizar...
Como eu disse anteriormente, o processo de configuração foi criado para fornecer respostas aos demais processos de apoio. E é por essa razão que é indispensável que as informações contidas no CMDB sejam confiáveis. Principalmente as de negócio.
Portanto nunca esqueça que, quanto mais granulares forem as informações de seu CMDB, mais esforços serão gastos para mantê-lo atualizado.
Avalie sempre este assunto com muita cautela focando primordialmente o negócio e secundariamente a TI. Você verá que com essa estratégia o esforço será menor e o resultado será mais significativo.

Amanhã falarei sobre famílias, classes e relacionamentos do CMDB.
Até lá!

 

Publicado Originalmente: 16 de dezembro de 2015 às 00:41

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Acho que a melhor frase que ouvi a respeito desse tema foi: "O nível de maturidade dos processos de incidentes, problemas e mudanças nunca será maior que o nível de maturidade do processo de gestão de configuração."

 

Isso significa dizer que não é possível elevar o nivel de maturidade do processo de mudanças sem antes elevar o nível do processo de configuração, por exemplo.

 

E é por esta razão que a maioria das empresas quando implanta ITIL, geralmente segue a mesma estratégia: Primeiro implanta o processo de incidentes, depois, problemas, mudanças, e logo em seguida, configuração. Mas porquê?

 

Bom... Na minha opinião, as bases cadastrais de ativos/IC's são apenas um objetivo secundário pois o principal objetivo do processo de configuração é fornecer respostas aos demais processos de apoio.

 

Pra ser mais didático, apenas um bom processo de configuração conseguirá responder as perguntas abaixo:

 

"Qual será o impacto real desta mudança?"

"Que serviço/cliente está sendo afetado por este incidente?"

"Quanto custa a infraestrutura utilizada pelo serviço?"

"Qual a causa raiz desse problema?"

"Quais serviços dependem desee item de configuração?"

"Quantos ativos e itens de configuração existem na base?"

 

Não é a toa que este é um processo bem trabalhoso de ser implantado em qualquer empresa. A base de configuração muda todo dia. E são os processos de mudanças e incidentes os principais motivadores dessas alterações.

 

Portanto manter a base de configuração atualizada sem investir os devidos esforços em processos de atualização de cadastro e gerenciamento de mudanças acaba sendo uma "batalha perdida".

 

E só existem duas formas de se atualizar o cadastro da base de configuracao: Manualmente e automaticamente.

Cada um desses métodos tem vantagens e desvantagens e amanhã falarei mais sobre isso.

 

Até lá

 

Publicado Originalmente: 16 de dezembro de 2015 às 03:02

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Existe um desafio diário existente na vida de todos os profissionais que atuam nas funções de gestão de processo e de ferramenta: Atender expectativas.

 

Mais do que atender as expectativas do negócio, gostaria de destacar as expectativas dos usuários. O argumento é bem simples: São "eles" os utilizadores da ferramenta e ao mesmo tempo os principais atores dos processos de negócio.

 

Não é fácil promover a eficiência nos processos se as ferramentas não ajudam. E vice-versa.

Por essa razão não acho possível tratar esses dois assuntos de forma isolada.

 

Obter feedback através de pesquisas de satisfação, conversar constantemente com os usuários e conhecer práticas de gestão de outras empresas é obrigatório para promover a melhoria contínua desejada.

Todo mundo conhece esse discurso de "cor e salteado" mas a grande verdade é que poucos de fato, conseguem alcançar esses objetivos. Por conta disso, tentem se fazer as seguintes perguntas:

 

Quantas vezes nesse ano...

1) Você teve uma conversa franca com seus usuários com o objetivo de identificar as dificuldades enfrentadas nos processos e ferramentas?

2) Se alguma pesquisa de satisfação foi realizada, os resultados e o planos de ação foram divulgados aos usuários participantes? Qual foi o resultado prático dessa pesquisa?

3) Os processos e a aderência nas ferramentas foram auditados regularmente? Quem fez a auditoria?

4) Você monitorou os falhas nas ferramentas utilizadas? Sabe dizer se a performance foi adequada pra todos? Quantas indisponibilidades de ferramenta ocorreram?

5) Enfim, qual a satisfação "real" dos seus usuários?

 

Sem que esse "mea culpa" seja feito fica bem difícil atender as expectativas.

Nunca esqueça que a realidade do negócio muda a cada dia e os processos e ferramentas não podem ficar pra trás. O que era bom ontem pode não ser hoje. Estar atento a essas mudanças é indispensavel.

E o mais importante: Nossos usuários são nossos principais aliados e não nossos inimigos.

 

Bom final de semana a todos!

Até a próxima.

 

Publicado Originalmente: 20 de novembro de 2015 às 23:15

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Dando continuidade à série, aqui vai o último post da série que trata de dois assuntos muito importantes no processo.

 

ACOMPANHAMENTO DE COMENTÁRIOS

Por padrão, todos os usuários estão aptos a avaliar e comentar em documentos de conhecimento.

Na minha opinião, este é o principal instrumento de melhoria no processo de gestão do conhecimento. Levando em conta que a base de conhecimento foi criada principalmente para atender os usuários, nada mais justo do que dar total prioridade no atendimento dos comentários feitos por eles. Nunca esqueça que "eles" são o melhor "gatilho de melhoria" em seu processo.

 

Em contrapartida, se os usuários perceberem que nada está sendo feito para corrigir os problemas apontados nos documentos de conhecimento, possivelmente estes usuários buscarão outras alternativas para obter conhecimento e por consequência, seu processo entrará em declínio.

 

E é por esta razão que a ferramenta SDM disponibiliza aos "Analistas de Conhecimento" algumas filas de atendimento dedicadas especialmente a esta atividade. Comentários "abertos" precisam ser "fechados" rapidamente e os seus respectivos documentos revisados.

Além disso, alguns votos de avaliação de documento possuem metas de acompanhamento (calculadas em dias) para facilitar a priorização dos processos de revisão. Portanto é uma boa prática fazer com que os "Gerenciadores de conhecimento" acompanhem estes indicadores junto aos analistas.

 

TOMBAMENTO DE DOCUMENTOS LEGADO

Este é nome dado ao processo de importar documentos de conhecimento armazenados em outras bases para dentro da base oficial de conhecimento. Este processo geralmente ocorre na implantação e precisa ser tratado com muita atenção.

A título de referência, a metodologia KCS "prega" que todo documento de conhecimento seja criado apenas no momento de sua primeira utilização (Just-in-time). E esta recomendação não surgiu à toa.

 

O Instituto HDI internacional, responsável pela metodologia, fez a pergunta "Tombar ou não tombar, eis a questão?!" para diversos clientes que fizeram este investimento e além disso, avaliaram a eficácia dos processos de tombamento e os resultados infelizmente nunca foram animadores.

Em média, cerca de 90% dos documentos importados no tombamento NÃO SÃO ÚTEIS para a base de conhecimento. Em resumo: O esforço geralmente é enorme e o resultado é sempre minúsculo.

 

Mas mesmo sabendo destes dados, a maioria das empresas que consultei, se fez a mesma pergunta e decidiu fazer o tombamento. E se você é ou foi uma delas, espero que você faça parte dos 10% de aproveitamento.

 

A única recomendação que eu faço sobre este tema é fazer um trabalho preliminar de qualificação de todos os documentos candidatos aos tombamento. Este trabalho deve ser conduzido de tal forma que seja possível fazer um ranking dos documentos mais utilizados pelos usuários.

 

E isso não significa observar apenas os "documentos mais acessados", mas sim, obervar os "documentos mais úteis" na avaliação dos usuários. Pense em um botão de "Gostei" em cada documento e compartilhe esta responsabilidade com os usuários durante um período de coleta destas métricas. Três meses é um período muito bom de amostragem.

E quando os resultados forem coletados, invista esforços e priorize as "ondas de implantação" apenas nos documentos úteis. Isso diminuirá sensivelmente o risco de atraso no projeto além de justificar os esforços neste processo de tombamento.

 

E pra finalizar esta série, fica aqui minha última recomendação: Se quer investir em gestão de conhecimento, invista 80% em "gestão" e 20% em operação. Sucesso garantido!

 

Até a próxima

 

Publicado Originalmente: 14 de dezembro de 2015 às 23:16

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

MODELOS DE DOCUMENTO

Através dos modelos é possível criar diferentes tipos de documento.

A configuração na ferramenta é simples bastando que sejam definidos os atributos que não serão exibidos quando o modelo for selecionado pelo usuário.

Por padrão, os documentos podem possuir as seguintes informações:

 

TÍTULO: Identifica o documento. Ex.: Erro no cadastramento de materiais no sistema XYZ

 

RESUMO: Identifica o objetivo do documento de forma resumida. Para documentos de solução de contorno, geralmente indica o sintoma percebido pelo usuário. Ex.: Erro 98765: Não foi possível concluir a operação.

 

DESCRIÇÃO: identifica a descrição do documento de forma mais detalhada. Para documentos de solução de contorno, é utilizado para descrever em que situação o problema ocorre (cenário). Ex.: Um usuário tentando cadastrar materiais no módulo de almoxarifado utilizando uma versão de Java JRE incompatível com o sistema.

 

RESOLUÇÃO: Identifica as ações necessárias que devem ser executadas pelo usuário. Ex.: Atualizar a versão de Java JRE do usuário.

 

OBSERVAÇÕES: Informações complementares do documento. Geralmente utilizado para fornecer orientações adicionais para auxiliar o usuário.

 

Para documentos de solução de contorno, geralmente são utilizados todos os atributos disponíveis. Mas não esqueça de fazer isso sempre de uma forma bem objetiva e preferencialmente que todo o documento possa ser exibido em uma única página. Esse é o desafio.

 

Também é possível projetar árvores de conhecimento (decisão) através de um modelo específico destinado especialmente a centrais de atendimento. Dá um pouco de trabalho pra fazer, mas proporciona um atendimento guiado ao usuário muito eficaz.

 

Documentos mais simples podem utilizar o modelo de edição rápida que contém apenas o titulo e a resolução do documento. Geralmente é utilizado para gerar documentos não estruturados ou outros procedimentos mais simples.

 

Eu ia escrever hoje sobre tombamento de documentação legado e comentários de acompanhamento mas preferi dedicar um outro post pra isso porque o assunto eh bem longo.

 

Até segunda!

 

Publicado Originalmente: 12 de dezembro de 2015 às 23:36

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

GESTÃO DO CONHECIMENTO: Ajustando o processo na ferramenta (Processos de aprovação)

Os processos de aprovação de conhecimento são necessários para que todos os documentos enviados obedeçam as regras definidas no processo.

 

Será mesmo? Mas que regras são essas? E quem as define? Ou o quê?

É o negócio que manda. Essa é a realidade. E pra ser mais específico, podemos dizer que geralmente existem vários modelos de processo de aprovação vigentes em uma mesma empresa.

A necessidade dos usuários e do negócio sempre fala mais alto.

 

Resumido: Definir um processo de aprovação de conhecimento não significa que exista apenas um modelo de processo. É mais fácil entender que no mínimo existirá um processo "padrão" que será utilizado apenas nas situações onde não exista um processo mais específico.

 

Eu já vi vários modelos de processos de aprovação em funcionamento em algumas empresas e posso assegurar que não existe processo perfeito. Só existem dois tipos de processo: Os que funcionam e os que não funcionam. E quem avalia a eficiência deles é a própria empresa e principalmente os seus usuários.

Simples assim.

 

Por essa razão que infelizmente não tenho uma "receita de bolo" pra explicar aqui. Só sei que, dependendo do tipo de documento, da área envolvida, da cultura da empresa ou da própria necessidade, existirá um modelo que trará o melhor resultado.

Para facilitar o entendimento, vou descrever alguns modelos que já vi funcionando ou que me disseram que funciona.

Você decidirá se eles poderão ser úteis em seu processo. Vamos lá...

 

MODELO 01:

1) Todos usuários podem criar documentos rascunho;

2) Uma equipe composta de analistas de conhecimento de diferentes áreas executam a tarefa de avaliação que consiste em validar a necessidade do conhecimento, a não existência de duplicatas, categorização, definição de proprietário e especialista, privilégios de acesso e aceite do proprietário antes que o trabalho de construção seja executado;

3) Passada a avaliação, uma outra equipe de criação/revisão composta de autores variáveis, começa a construir o documento seguindo os padrões de conteúdo definidos;

4) Em seguida um especialista no assunto revisa o conteúdo;

5) E por fim, o proprietário da categoria de conhecimento aprova e publica o documento na base.

 

MODELO 02:

1) Todos usuários podem criar documentos rascunho;

2) O respectivo proprietário da categoria do conhecimento faz a primeira avaliação e decide se algum trabalho será executado;

3) Em seguida, o documento é direcionado para a respectiva equipe de revisão que além de finalizar o documento quanto ao conteúdo e padronização, define a categorização e publica o documento na base.

 

MODELO 03:

1) Todos usuários podem criar, alterar e publicar documentos na base, sem que haja um processo de aprovação.

2) O proprietário da categoria é notificado e de acordo com o conteúdo gerado, solicita a alteração, remoção ou adequação do documento na base;

3) Paralelo a isso, políticas automatizadas de auditoria são disparadas regularmente observando as avaliações dos usuários, relevância do documento, nível de utilização e outros critérios. De acordo com o resultado o documento permanece/desaparece da base.

 

MODELO 04:

1) Somente analistas de Service Desk podem criar documentos. Toda a criação e revisão do documento e feita pelo próprio analista. Ele é o proprietário do documento e todo o processo de ciclo de vida é de sua responsabilidade;

2) Os critérios "Aceite de solução" e "Avaliação" são os fatores preponderantes para permanência do documento na base.

 

MODELO 05:

1) Somente um único grupo de analistas de conhecimento criam e publicam documentos na base;

2) O processo de criação é reativo e disparado de forma eventual através dos processos de apoio (incidentes, solicitações, etc) ou processos normativos. A criação desses documentos são demandados pelos gestores dos respectivos processos;

3) E são os gestores desses processos, os proprietários, que decidirão se os documentos permanecerão na base ou deverão ser revisados.

 

MODELO 06

1) Todos usuários podem criar, alterar e publicar documentos de forma colaborativa;

2) Não existe fluxo de trabalho definido. A base de conhecimento é simplesmente considerada como um grande repositório de documentos.

 

Depois de expostos estes modelos fica fácil presumir que a necessidade justifica os meios.

O importante é que traga resultado prático. Melhorias na execução de processos e principalmente no dia a dia dos usuários que consumirão o conhecimento gerado.

 

E mesmo que as coisas dêem errado em um primeiro momento, acredite que o(s) processo(s) definido(s) precisam ser bem controlados e corrigidos rapidamente para evitar a perda de credibilidade por parte dos usuários.

 

Amanhã falarei sobre os tipos de documento, acompanhamento de comentários e tombamento de bases de conhecimento legado.

 

Até a próxima

 

Publicado Originalmente: 03 de dezembro de 2015 às 01:15

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

GESTÃO DE CONHECIMENTO: Ajustando o processo na ferramenta (categorias)
Depois que alguns conceitos básicos já foram explicados nos posts anteriores, nada melhor do que testar na prática a execução do processo.
E para isso, precisamos configurar minimamente nosso processo dentro da ferramenta da seguinte forma:

CATEGORIAS
Através das categorias de conhecimento é possível atribuir um proprietário, privilégios de acesso, processo de aprovação, modelo de documento ou associação de categorias de tickets aos documentos.

É bom destacar que não é aconselhável comparar categorias de conhecimento com pastas de um servidor de arquivos. É parecido, porém diferente.

Sempre tenha em mente que esta estrutura de categorias não agrega em nada na experiência dos usuários que procuram conhecimento na base. Nenhum usuário ficará navegando nas categorias criadas...

O usuário quer apenas pesquisar palavras chave, clicar em pesquisar e o documento precisa ser encontrado onde quer que ele esteja na estrutura de categorias.

Em contrapartida, uma má definição destas categorias comprometerá seriamente a experiência do usuário. Vou explicar o porquê:

Uma das configurações mais importantes que precisa ser bem definida são os privilégios de acesso da categoria. Somente desta forma será possível restringir a visibilidade de alguns documentos para que assim, os resultados da pesquisa do usuário sejam mais precisos e relevantes para suas necessidades.

Por conta disso, é uma prática comum criar uma estrutura raiz de categorias logo abaixo da categoria "SUPERIOR" vinculada à função do usuário. Ex.: Atendimento=>Analista de nível 1, Operacional=>Analista de nível 2, Cliente=>Cliente, etc.
E mesmo com esta "estrutura base" de categorias, é possível que seja necessário criar outras subcategorias para refinar ainda mais a estrutura e facilitar a manutenção.

Desta forma, também é prática comum criar categorias de conhecimento específicas para armazenar documentos específicos.
Mas essa prática só se justifica quando algumas das 05 perguntas abaixo recebe um "SIM" como resposta:

Os documentos dessa nova categoria...
1) ... terão um proprietário diferente da categoria pai?
2) ... terão privilégios de acesso diferentes da categoria pai?
3) ... utilizarão um processo de aprovação diferente?
4) ... utilizarão um modelo de documento diferente?
5) ... estarão associados a uma categoria de incidente/problema/solicitação/ocorrência diferente?

Se a resposta correta for confirmada, daí sim a nova categoria deverá ser criada. E esta atividade geralmente deve ser atribuída à função "Gerenciador de conhecimento", destinada a estruturação do processo dentro da ferramenta.
Portanto atribuir esta atividade de estruturação aos "Analistas de conhecimento" não é uma boa prática. Esta função trabalha no dia a dia e o ideal é condicionar suas atividades apenas utilizando as estruturas já criadas pelo processo.
Se isso não for feito, há sério risco da estrutura definida ficar " bagunçada" com o tempo.

Outra configuração importante definida nas categorias é a associação entre as categorias de conhecimento com as áreas de tickets.
Se isso for feito corretamente, não haverá necessidade de formar um grupo de analistas de conhecimento para fazer o redirecionamento dos documentos para os respectivos proprietários.
Isso ocorrerá de forma automática quando o conhecimento gerado for oriundo da Atividade de solução de um ticket.
Mas lembre-se que uma categoria de ticket só pode estar associada a uma única categoria de conhecimento. É interessante conversar com o gestor do respectivo processo para ajustar estas associações de categoria. Essa funcionalidade ajuda muito e elimina um eventual processo de triagem na geração de conhecimento.

Amanhã falarei sobre a definição dos processos de aprovação que podem estar associados as categorias.
Até lá.

 

Publicado Originalmente: 03 de dezembro de 2015 às 01:15

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

GESTÃO DO CONHECIMENTO: Dicas de implantação
Não posso me considerar um profundo conhecedor desse assunto porque estou participando de um projeto recente de implantação na minha empresa, mas de qualquer forma, resolvi iniciar uma série de posts relatando minhas experiências na implantação desse processo na ferramenta SDM.

O que me ajudou bastante a compreender com mais facilidade alguns conceitos da ferramenta e do processo, foi minha formação em KCS que fiz na HDI a alguns anos e muito material que li na internet. E além disso, acabei tendo a feliz oportunidade de conhecer alguns cases de sucesso e muitos outros cases de fracasso. Portanto, "acho" que sei "o que fazer" e principalmente, "o que não fazer" no processo e na ferramenta. Vamos lá então...

PORQUE INVESTIR EM CONHECIMENTO?
Essa é a principal pergunta que precisa ser bem respondida antes que um projeto de gestão de conhecimento seja iniciado. Por isso destaco abaixo 10 possiveis objetivos estratégicos que podem ser aderentes as suas necessidades:

1) Diminuir os custos de suporte de 2º e 3º nível aumentando assim a eficiência do 1º nível de atendimento e otimizando indicadores de performance;


2) Aumentar o nivel de proficiência de novos recursos humanos que ingressarem na empresa, devido ao alto turn over e propiciar a criação de materiais de instrução para treinamentos;


3) Promover o auto-atendimento em portais de relacionamento principalmente para clientes externos, para reduzir o número de ligações recebidas na central de serviços;


4) Padronizar o processo de atendimento para ter dependência mínima de alguns "heróis" na empresa e ao mesmo tempo transformar o conhecimento tácito em conhecimento explícito;


5) Criar e manter através de um processo de ciclo de vida uma única base de conhecimento organizacional na empresa;


6) Respeitar a legislação vigente ou se adequar a padrões internacionais de qualidade ou outros requisitos particulares de uma ou mais linhas de serviço da empresa;


7) Aumentar a satisfação dos analistas de atendimento diminuindo o stress na busca de soluções para incidentes;


8) Melhorar a eficiência do processos de gestão de problemas, incidentes e solicitações.


9) Documentar todo o conhecimento operacional para facilitar um processo futuro de terceirização do atendimento (outsourcing);


10) Padronizar o processo de atendimento na matriz e em todas as filiais da empresa.

 

Fiz questão de destacar esses objetivos para que você reflita sobre a repercussão das suas escolhas. Quanto mais objetivos simultâneos forem definidos, menor será a probabilidade de sucesso de seu projeto de gestão de conhecimento. Portanto, tente priorizar apenas um desses objetivos e dê foco exclusivo a ele. Tente eleger o mais importante nesse primeiro momento. Só pense em atacar outros objetivos quando o primeiro for alcançado em sua plenitude.

Esse é um dos processos mais dificeis de serem implantados e mantidos na minha opinião. A razão é simples: A grande maioria das pessoas NÂO gosta de documentar e muito menos procurar documentação. E além disso, existe um esforço gigantesco na padronização, definição de políticas, tombamento e manutenção do processo e de toda base de conhecimento.

Fica fácil presumir que o desafio é bem grande, o risco é enorme, mas mesmo assim, vale muito a pena o investimento. Amanhã eu continuo citando algumas estratégias no processo e na ferramenta que já vi darem certo.

Até a próxima.

hwcorp.files.wordpress.com
hwcorp.files.wordpress.com

 

Publicado Originalmente: 03 de dezembro de 2015 às 01:15

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

ATRIBUIÇÃO AUTOMÁTICA DE TAREFAS A CONTATOS DE OBJETO

Hoje sem querer, acabei descobrindo/inventando uma solução para atribuir responsáveis em tarefas de fluxo de trabalho (workflow) de forma dinâmica sem precisar atribuir ações de macro SPEL em comportamentos de status de tarefa ou mesmo atribuindo o responsável/grupo explicitamente no modelo de tarefas das categorias.

 

Imagine poder definir em um template de tarefa um responsável que está associado a um IC, ou mesmo, o criador/solicitante/supervisor de uma mudança/ocorrência/solicitação... E sem precisar criar ações de macro ou triggers "mirabolantes"... Já imaginou?

 

"MAS SEUS PROBLEMAS ACABARAM"

 

E tudo isso criando apenas um único atributo SREL e algumas poucas de linha de código em um método SPEL. E além disso, podendo criar novos "contatos de objeto" diretamente na interface da ferramenta sem precisar criar nenhuma nova estrutura de customização...

 

Esta solução poderá ser utilizada em todo tipo de workflow da ferramenta (incidente, mudança, ocorrência, conhecimento, etc).

 

Em breve explico como funciona esta pequena customização.

 

Até a próxima.

 

 

Publicado Originalmente: 26 de novembro de 2015 às 20:37

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Teoricamente" podemos dizer que existem apenas dois tipos de variáveis, uma manipulada no servidor (backend) através da marca PDM_SET, e outra manipulada no cliente (frontend) através de JavaScript.

 

E entre estas duas, não existe compartilhamento de informações, pois primeiro o servidor SDM processa as marcas HTMPL e por último, o browser do cliente interpreta o código JavaScript.

 

Bom,... Mais ou menos...

 

Existe uma forma de fazer uma marca PDM_SET armazenar um valor contido em uma variável JavaScript. Só descobri isso inspecionando alguns arquivos HTMPL nativos da própria ferramenta (Ex.: cmdbNotebook.html).

 

Para que essa "mágica" funcione, basta referenciar uma variável JavaScript envolta de 2 aspas duplas + variavel + 2 aspas duplas.

 

EXEMPLO:

<script>

var myWC = "active = 1";

</script>

 

<PDM_SET args.wc=""+myWC+"">

<PDM_LIST PREFIX=list FACTORY=cr WHERE="$args.wc">

// faz algo

</PDM_LIST>

 

Só não me perguntem como "essa coisa" funciona porque eu realmente gostaria de saber...

 

Mas fica a dica.

 

Até a próxima.

 

 

Publicado Originalmente: 25 de novembro de 2015 às 20:02

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

marca PDM_MACRO insere um trecho de código JavaScript dentro de um formulário HTMPL que será apresentado para o usuário. A maioria dos controles de formulário da web são criados com esta tag. Basicamente uma macro é utilizada da seguinte forma:

<PDM_MACRO NAME=nomeDaMacro [prop1="valor"] [prop2="valor"] ... >

O qualificador PDM_MACRO pode ter uma ou mais propriedades. O parâmetro NAME é necessário em cada PDM_MACRO para especificar o nome da macro. Outras propriedades são necessárias ou opcionais, dependendo da macro.

Para conhecer todas as propriedades das macros e saber como utilizá-las, basta acessar a pasta $NX_ROOT\samples\macro. Nesta pasta estão todos os arquivos .MAC com as definições das macros suportadas pelo sistema.

É possível também customizá-las ou mesmo criar novas macros, bastando para isso criar arquivos .MAC na pasta $NX_ROOT\site\mods\www\macro. Em seguida, basta reiniciar o serviço SDM e testá-las nos formulários HTMPL.

OBSERVAÇÃO: Cabe destacar que a CA não recomenda este tipo de customização no produto. Portanto, saiba bem o que você está fazendo.

Até a próxima.
Definições de macro do PDM - CA Service Management - 14.1 - Portuguese - Brazil - CA...
wiki.ca.com

 

 

Publicado Originalmente: 23 de novembro de 2015 às 19:37

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

A marca PDM_LIST é usada para delimitar seções repetidas de HTML para saída de vários registros. Todo o texto entre a marca é repetido uma vez para cada registro de saída. Há dois tipos de PDM_LIST: SOURCE & WHERE.

PDM_LIST SOURCE
Listas obtidas a partir de um atributo de objeto que implica uma lista. Por exemplo, o atributo "properties" do objeto de "solicitação" é a lista de propriedades associada a essa solicitação. Esse tipo de PDM_LIST sempre tem uma propriedade SOURCE. Um atributo de objeto assume as seguintes propriedades:

ESC_STYLE=NONE | C | HTML | JS | JS2 | URL (opcional)
Especifica o tipo de escape do texto formatado. Os valores válidos para esta propriedade já foram descritos na marca PDM_FMT (https://www.facebook.com/groups/usuariossdmbrasil/permalink/1038716829492564/).

LENGTH=nn (opcional)
Especifica o número de linhas de saída (o padrão é todas).

PREFIX=prefixo (opcional)
Especifica o prefixo em referências a atributos de registros na lista. Estes são referidos no formulário $prefixo.nome_do_atributo no texto entre e . Se PREFIX for omitida, o valor de SOURCE também será usado para o prefixo.

SEARCH_TYPE=DISPLAY | GET_DOB (opcional)
Especifica o método que o servidor deve usar para criar a lista de formulários: DISPLAY especifica que o servidor deverá emitir uma única consulta para todo o formulário. GET_DOB especifica que o servidor deverá emitir consultas separadas para cada linha do formulário. A escolha afeta o desempenho da lista e depende da complexidade da lista (o número de uniões necessárias para exibi-la) e das características do DBMS. GET_DOB tem desempenho mais previsível que DISPLAY, e é o padrão.

SORT=nome-do-índice (opcional)
Especifica o nome de índice a ser usado para classificação. O valor padrão desse argumento é DEFAULT (que significa que é utilizado o primeiro índice de classificação da fábrica subjacente).

SOURCE=origem (obrigatória)
Especifica a variável de objeto que define essa lista. Não coloque um cifrão ($) na frente de origem na instrução PDM_LIST. Se a propriedade PREFIX não for definida, a origem também será usada como o prefixo para referências aos atributos dos registros na lista, em referências do formulário $source.attr_name. Quando usada em uma referência, a origem requer um sinal de cifrão precedente.

START=nn (opcional)
Especifica a primeira linha de saída (o padrão é zero).

EXEMPLO:
<table border>
<tr>
<th>Número da requisição de mudança filha</th>
<th>Resumo</th>
</tr>
<PDM_LIST SOURCE=args.children>
<tr>
<td>$args.children.chg_ref_num</td>
<td>$args.children.summary</td>
</tr>
</PDM_LIST>
</table>

Como não foi especificado nenhum prefixo, as referências a atributos dos registros listados receberão o prefixo "$args.children", o valor de origem.

PDM_LIST WHERE
Listas com uma cláusula Where explícita. Esse tipo de PDM_LIST sempre tem uma propriedade WHERE. Uma cláusula Where PDM_LIST assume as seguintes propriedades:

FACTORY=nome (obrigatória)
Especifica uma classe de objeto a ser pesquisada.

LENGTH=nn (opcional)
Especifica o número de linhas de saída (o padrão é todas).

ORDER_BY=nome_do_atributo (opcional)
Especifique o nome de atributo a ser usado para classificação. Pode conter os modificadores DESC (decrescente) ou ASC (crescente).

DOMSET=nome_do_domset (opcional)
Especifique qual domset da factory deve ser utilizado. Um domset incorpora outra cláusula Where para a pesquisa. Para consultar os domsets disponíveis, utilize o comando "bop_sinfo -m nome_da_factory".

PREFIX=prefixo (obrigatória)
Especifica o prefixo em referências a atributos de registros na lista. Estes são referidos no formulário $prefixo.nome_do_atributo no texto entre e . A propriedade PREFIX é obrigatória em uma lista de cláusulas Where.

START=nn (opcional)
Especifica a primeira linha de saída (o padrão é zero).

WHERE=cláusula-where (obrigatória)
Especifique a cláusula Where para a pesquisa. Pode conter atributos (com pontos).

EXEMPLO:
<table>
<tr>
<th>Número da requisição de mudança filha</th>
<th>Resumo</th>
</tr>
<PDM_LIST PREFIX=list FACTORY=chg WHERE="status = 'OP'">
<tr>
<td>$list.chg_ref_num</td>
<td>$list.summary</td>
</tr>
</PDM_LIST>
</table>

Até a próxima.

 

Marcas HTMPL - CA Service Management - 14.1 - Portuguese - Brazil - PDM_LIST

Publicado Originalmente: 19 de novembro de 2015 às 21:01

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Não tenho intenção de encerrar este assunto neste post. Caso você conheça outras alternativas de validação, contribua conosco.

Dando continuidade ao post anterior...

 

VALIDAÇÃO DE SALVAMENTO VINCULADO À CATEGORIA

Essa customização se faz necessária quando existe a necessidade de criar regras de salvamento de acordo com a categoria do ticket. O funcionamento é baseado na "injeção" de código Javascript importado do "template" da categoria, de forma que, através de um "eval", esta validação seja processada através de uma etapa de execução da função "preSaveTrigger".

Quem estiver interessado no seu funcionamento, acesse o post https://www.facebook.com/groups/usuariossdmbrasil/permalink/1011830798847834/.

RECOMENDAÇÃO: Esta funcionalidade só é possível através de uma customização "hardcore" na ferramenta e deve ser muito bem avaliada. Para administradores da ferramenta que precisam vincular a regra de negócio na categoria do ticket utilizando a linguagem Javascript ao invés de manter uma trigger SPEL específica que só tende a crescer. Esta customização mesmo sendo bastante complexa, proporciona uma maior agilidade nas mudanças de regra de negócio das categorias, sem causar indisponibilidade na ferramenta e ao mesmo tempo, com reflexo imediato nas novas criações de ticket. Mas é bom destacar que esta customização deve ser exaustivamente testada pelo fato do browser do usuário poder interferir no pleno funcionamento da solução.

EXEMPLO: Ao preencher um formulário e suas propriedades, antes que o usuário salve o ticket, os dados são validados em fontes externas utilizando webservices REST/SOAP de fontes externas de validação.

 

OUTRAS FUNÇÕES JAVASCRIPT

Através de eventos Javascript associados a elementos no formulário, funções de validação/complementação de dados são executadas imediatamente durante o preenchimento do ticket mesmo que o objeto ainda não esteja salvo, otimizando a experiência do usuário.

RECOMENDAÇÃO: Outra customização "hardcore" que deve ser muito bem avaliada. Para administradores da ferramenta que precisam acessar informações em outras bases de dados ou que precisam executar validações imediatas no formulário antes que o ticket seja salvo. Caso a fonte dos dados de validação/complementação esteja hospedada em outro domínio diferente da SDM, é recomendável construir uma "bridge de acesso" dentro do contexto Java (CAIsd) da aplicação. Somente desta forma, os problemas de "crossBrowsing" serão evitados. Mas é bom destacar que esta customização deve ser exaustivamente testada pelo fato do browser do usuário poder interferir no pleno funcionamento da solução.

EXEMPLO: Ao alterar o conteúdo de um atributo específico de um formulário (onChange), uma chamada externa REST direcionada a outra fonte de dados é executada retornando um dado JSON utilizado para preencher automaticamente outro atributo do formulário.

 

FUNÇÕES REGEX ACOPLADAS A PROPRIEDADES

Através de um evento Javascript que executa uma expressão regular (RegEx), uma informação digitada pelo usuário em uma propriedade é validada imediatamente retornando uma mensagem amigável de alerta caso ocorra falha na validação. Estas expressões RegEx e suas respectivas mensagens de alerta são associadas ao template das propriedades da categoria de acordo com as regras de negócio definidas. A importação dessas regras a partir do template só ocorre durante a geração do ticket e cada expressão RegEx é armazenada em um atributo específico da tabela de propriedades relacionada ao objeto.

RECOMENDAÇÃO: Outra customização "hardcore" que deve ser muito bem avaliada. Para administradores da ferramenta que precisam validar informalções preenchidas em propriedades através de expressões regulares. Mas é bom destacar que esta customização deve ser exaustivamente testada pelo fato do browser do usuário poder interferir no pleno funcionamento da solução.

EXEMPLO: Uma propriedade de uma solicitação que exige um número de CPF válido ou uma URL respeitando determinada RFC.

 

CONDIÇÕES DE TRANSIÇÃO DE STATUS EM TAREFAS

A ferramenta permite nativamente que seja definida uma condição de transição de status em uma tarefa de fluxo de trabalho de forma que, uma validação seja executada antes que o usuário consiga modificar o status da respectiva tarefa. A solução é baseada em uma condição SPEL que retorna os valores TRUE/FALSE e uma mensagem de erro caso o retorno da validação seja falso.

RECOMENDAÇÃO: A implementação das condições de transição é bem simples e depende apenas da associação desta com cada respectivo comportamento de tarefa.

EXEMPLO: Antes que a tarefa "XYZ" que está com o status "Pendente" seja "Concluída", uma validação de preenchimento de um atributo opcional da requisição de mudança deve ser executada.

 

Até a próxima.

 

Publicado Originalmente: 18 de novembro de 2015 às 21:20

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

MARCAS HTMPL: PDM_FMT

As marcas PDM_FMT são usadas para formatar blocos de texto inseridos por variáveis de servidor ($args.***) conforme instrução de seus argumentos.

Observação: é ignorada para literais, incluindo as variáveis $prop.***.

 

A tabela a seguir descreve essas marcas:

ESC_STYLE = Especifica o tipo de escape do texto formatado. Os valores válidos são:

 

ESC_STYLE=NONE: Configuração padrão. Especifica que nenhum tratamento especial seja dado a qualquer caractere do corpo do conteúdo.

 

ESC_STYLE=C: Dar tratamento especial aos caracteres ', ", \, \r, ` e \n, que são significativos em programas em C. Estes caracteres serão alterados por uma sequência de Escape.

 

ESC_STYLE=HTML: Dar tratamento especial aos seguintes caracteres, que são significativos em texto HTML: & torna-se &amp; ' torna-se ', " torna-se ", < torna-se &lt;, > torna-se %gt;

 

ESC_STYLE=JS: Dar tratamento especial aos seguintes caracteres, que são significativos em texto JavaScript: ' torna-se %27, " torna-se %22, / torna-se %2F, \ torna-se %5C, \r torna-se %0D, \n torna-se %0A

 

ESC_STYLE=JS2: Mesmo que JS, mas não dê nenhum tratamento especial ao caractere / e dê tratamento especial a dois caracteres adicionais: % torna-se %25, As quebras de linha são precedidas de %0A

 

ESC_STYLE=URL: Converta todos os caracteres que não sejam letras, dígitos e '@*-_.#' a ' % xx', onde xx é a codificação hexadecimal do caractere convertido.

 

JUSTIFY = Especifica a justificação do texto formatado. Os valores válidos são:

 

JUSTIFY=TRUNCATE: Configuração padrão. Elimina a formatação HTML substituindo '<' e '>' por &lt; e &gt; Observação: para obter mais informações, consulte os dados a seguir sobre KEEPLINKS e KEEPTAGS.

 

JUSTIFY=LEFT|CENTER|RIGHT: Produz o número exato de caracteres de WIDTH, truncados ou preenchidos com espaços, conforme necessário, com quaisquer novas linhas incorporadas substituídas por um único espaço e o texto de saída é delimitado pelas marcas [definir a variável pre de seu registro] e . O argumento WIDTH (largura) deve ser especificado como um número inteiro positivo.

 

JUSTIFY=WRAP: Mesmo que LEFT, exceto que a quebra de texto respeita os limites das palavras (as quebras de linha não são colocadas dentro de palavras).

 

JUSTIFY=LINE: Igual a TRUNCATE, exceto que também substitui todas as quebras de linha incorporadas por marcas.

 

KEEPLINKS=YES|NO: Se KEEPLINKS=YES for especificado, a ação de JUSTIFY=LINE ou JUSTIFY=TRUNCATE será modificada para preservar as marcas de âncora de HTML ( ) durante a conversão de todos os outros caracteres '<' e '>'. Mutuamente exclusivo com KEEPTAGS.

 

KEEPNL=YES|NO: A ação normal do PDM_FMT é converter todas as novas linhas integradas e quaisquer espaços que se seguem em um único espaço. Se KEEPNL=YES for especificado, as novas linhas integradas serão preservadas. Esse argumento é ignorado para JUSTIFY=LINE.

 

KEEPTAGS=YES|NO: Se KEEPTAGS=YES é especificado, a ação de JUSTIFY=LINE ou JUSTIFY=TRUNCATE é modificada para preservar todas as marcas HTML. Mutuamente exclusivo com KEEPLINKS.

 

PAD=YES|NO: Se PAD=NO é especificado, PDM_FMT não converte sequências vazias em um único espaço. Esta é a ação normal quando WIDTH é diferente de zero ou JUSTIFY é TRUNCATE ou WRAP.

 

WIDTH=nn: Quando diferente de zero, especifica que o texto deve ser formatado com o número exato de caracteres de WIDTH.

 

OBSERVAÇÃO: <PDM_FMT> sem WIDTH ou JUSTIFY não aplica nenhuma formatação ao texto incluído, mas circunda o texto com [definir a variável pre de seu registro] e </pre>.

Por exemplo, para produzir uma descrição em várias linhas, digite o seguinte:

<PDM_FMT WIDTH=50 JUSTIFY=WRAP>$args.description</PDM_FMT>

 

Para produzir uma saída em várias colunas, digite o seguinte:

<PDM_FMT><PDM_FMT WIDTH=20 JUSTIFY=LEFT>$cst.last_name</PDM_FMT>

<PDM_FMT WIDTH=20 JUSTIFY=LEFT>$cst.first_name</PDM_FMT>

<PDM_FMT WIDTH=20 JUSTIFY=TRUNCATE>$cst.middle_name</PDM_FMT>

</PDM_FMT>

 

Fonte: https://wiki.ca.com/display/CASM1401BR/Marcas+HTMPL#MarcasHTMPL-PDM_FMTFormatartextodeumavari%C3%A1veldeservidor

 

Até a próxima.

 

Publicado Originalmente: 16 de novembro de 2015 às 16:51

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

BOAS PRÁTICAS DE CUSTOMIZAÇÃO (continuação)
Depois de apanhar bastante com algumas customizações feitas por mim e por outros profissionais, acabei praticando um "checklist" de boas práticas que me ajudam diariamente.

1) QUESTIONE: Atue como analista e não como um simples desenvolvedor. Entenda o problema que precisa de solução. Ache a causa raiz dele. As vezes as demandas chegam ao desenvolvedor já descrevendo a customização que deve ser feita na ferramenta e não o problema real que precisa ser resolvido. Esse simples questionamento pode evitar uma customização desnecessária e propiciar uma simples configuração de funcionalidade na ferramenta.

2) CONSULTE: Duas ou mais cabeças pensam melhor que uma. Essa máxima não é a toa. Nunca pense que você está sozinho e que nenhuma empresa enfrenta o mesmo problema que você. Na maioria das vezes, os problemas são iguais e apenas as soluções aplicadas que são bem diferentes. Muitas vezes a própria ferramenta já previu esta funcionalidade e só você ainda não sabe. Aumente seu "networking" com outros clientes da ferramenta, troque experiências, use e abuse do suporte CA e/ou suporte especializado de empresas parceiras. E não esqueça de frequentar comunidades (Ex.: CA Service Desk Manager (Brasil) no Facebook).

3) CONHEÇA: Tenha no mínimo um profissional na sua empresa dedicado na ferramenta. Capacite-se em processos e ferramentas. É sempre bom ter uma certa autonomia para lidar com a ferramenta e não depender exclusivamente de terceiros para operar/parametrizar/customizar sua ferramenta. Sua opinião também é importante.

4) DOCUMENTE: Já que nenhum desenvolvedor é insubstituível e mesmo se fosse, não teria uma memória de elefante, documente suas customizações. Isso parece uma coisa óbvia mas muitas vezes isso não é feito. Se documentar fora do código, legal. Mas não esqueça que é bem provável que esta documentação fique desatualizada com o tempo. O mais fácil é fazer isso diretamente no código. A pior coisa que pode acontecer é você não saber porque uma customização foi feita ou como ela funciona exatamente. Se não quer transformar seu código HTML/SPEL em um bloco de notas, então no mínimo cite o número da demanda que aquele trecho de código visava atender e quem fez isso.

5) ORGANIZE: Se precisar construir uma nova trigger para o objeto "cr", crie arquivos específicos para isso (Ex.: z_cr.mod e z_cr.spl). Se for modificar arquivos HTMPL/JS já existentes, utilize marcações do tipo <!-- Alterado por Fulano - 21/05/2015 - Demanda #15000 -->. E no final da modificação inclua <!-- Fim da alteração -->. Isso ajudará muito no processo de portar customizações para uma nova versão da ferramenta.

6) IDENTIFIQUE: O prefixo "z" recomendado pela CA para qualquer tipo de customização deve ser sempre utilizado. E nas situações que essa prática não seja possível, cite que o objeto foi modificado com alguma outra assinatura (Ex.: (CUSTOM)). Mesmo que isso seja feito em um campo de descrição de algum objeto. Eu costumo não alterar NADA que tenha sido gerado pela própria ferramenta (Ex.: Novos códigos de status, novas funções, acessos funcionais, etc).

7) TESTE: Se for utilizar SPEL, prefira métodos da própria API ao invés de construir os seus. São mais seguros e dificilmente apresentarão erros nas migrações de versão. A CA sempre toma cuidado para que os métodos projetados em versões anteriores continuem funcionando em novas versões. Mesmo quando novas opções são incluídas. Se for utilizar Javascript, prefira jQuery. Gera código mais limpo e confiável em todos browsers. A não ser que você tenha toda a paciência de testar sua customização com todas as versões de browsers presentes na matriz de compatibilidade de browsers da ferramenta. E além disso, quando possível, utilize funções javascript da própria API da ferramenta ao invés de criar sua funções (Ex.: Ao invés de manipular "AlertMsg", utilize "detailReportValidation").

8) PENSE: É sempre bom pensar muito bem antes de iniciar uma nova customização. Estude o assunto Triggers e entenda bem o seu funcionamento. Existe uma enorme diferença entre uma trigger ON_POST_VAL e uma POST_VALIDATE. E se for customizar na camada web, nunca esqueça que o funcionamento desta customização dependerá da infra do usuário. E a qualidade da experiência dele é muito importante. Os assuntos "Browser" e "Performance Javascript" são bem delicados e precisam ser muito bem avaliados. E não esqueça de avaliar os assuntos "segurança" e "confiabilidade".

9) INTERCEPTE: Intercepte erros o mais rápido possível e não seja o último a saber. Nenhum desenvolvedor fica "assistindo" logs de servidor o dia inteiro. Crie mecanismos para ser notificado automaticamente na ocorrência destes erros. E se isso não for feito na camada web, pior ainda. Faça o tratamento adequado para todos os erros gerados no frontend e backend.

10) COMPARTILHE: Faça o seu usuário participar ativamente no processo de homologação de uma customização. Compartilhe sua responsabilidade com ele. Compartilhe código com outros desenvolvedores. Esta é uma forma eficaz de obter "gratuitamente" novas funcionalidades da ferramenta e ao mesmo tempo, gerar conhecimento e experiência.

Até a próxima.

 

Publicado Originalmente: 13 de novembro de 2015 às 12:42

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

LINGUAGEM SPEL (SUPER métodos - Parte 06)

Dando continuidade a mais funções interessantes da linguagem, segue abaixo mais 06 funções variadas da SDM que considero muito úteis. Mas hoje vou descrevê-las apenas descrevendo a sintaxe e exemplificando sua utilização:

 

SINTAXE

get_handle_for_userid(string userid_contato);

get_group_list(string id_contato)

get_member_list(string id_grupo)

get_prptpl_list_for_category(string persid_categoria)

get_properties(string persid_ticket)

get_related_assets(string persid_ticket)

 

EXEMPLOS

// Identifica o usuário

uuid who;

send_wait(0, top_object(), "call_attr", "cnt", "current_user_id");

who = msg[0];

int zi_i;

 

// Descobre o PERSISTENT_ID DO USUARIO

send_wait(0, top_object(), "call_attr", "api", "get_handle_for_userid", "procergs-joao-silva");

printf("msg[0]: '%s'\n", msg[1]);

 

 

// Descobre os GRUPOS DO USUARIO

send_wait(0, top_object(), "call_attr", "api", "get_group_list", (string) who);

// Obtem os ids dos grupos

send_wait(0, top_object(), "call_attr", "api", "get_list_values", who, msg[0], 0, msg_length(), 0, "group");

for (zi_i=0;zi_i<msg_length();zi_i++) {

printf("msg[%d]: '%s'\n", zi_i, msg[zi_i]);

}

 

 

// Descobre os MEMBROS DO GRUPO

send_wait(0, top_object(), "call_attr", "api", "get_member_list", (string) '1EE8B00464B58D44BCACE23D0855230B');

// Obtem os ids dos membros

send_wait(0, top_object(), "call_attr", "api", "get_list_values", who, msg[0], 0, msg_length(), 0, "member");

for (zi_i=0;zi_i<msg_length();zi_i++) {

printf("msg[%d]: '%s'\n", zi_i, msg[zi_i]);

}

 

 

// Descobre as PROPRIEDADES DA CATEGORIA

send_wait(0, top_object(), "call_attr", "api", "get_prptpl_list_for_category", 'isscat:400156');

// Obtem atributos das propriedades

send_wait(0, top_object(), "call_attr", "api", "get_list_values", who, msg[0], 0, msg_length(), 0, "label", "required");

for (zi_i=0;zi_i<msg_length();zi_i++) {

printf("msg[%d]: '%s'\n", zi_i, msg[zi_i]);

}

 

 

// Descobre as PROPRIEDADES DO TICKET

send_wait(0, top_object(), "call_attr", "api", "get_properties", 'iss:437486');

// Obtem os atributos das propriedades

send_wait(0, top_object(), "call_attr", "api", "get_list_values", who, msg[0], 0, msg_length(), 0, "label", "value", "required");

for (zi_i=0;zi_i<msg_length();zi_i++) {

printf("msg[%d]: '%s'\n", zi_i, msg[zi_i]);

}

 

// Descobre os IC's ASSOCIADOS ao ticket

send_wait(0, top_object(), "call_attr", "api", "get_related_assets", 'chg:415903');

// Obtem os atributos dos IC's

send_wait(0, top_object(), "call_attr", "api", "get_list_values", who, msg[0], 0, msg_length(), 0, "nr.name", "nr.class.type");

for (zi_i=0;zi_i<msg_length();zi_i++) {

printf("msg[%d]: '%s'\n", zi_i, msg[zi_i]);

}

 

Até a próxima!

 

Publicado Originalmente: 04 de novembro de 2015 às 13:56

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Hoje eu e minha equipe tivemos a feliz oportunidade de conhecer um dos melhores cases de sucesso de implantação do processo de Gestão de Conhecimento.

A Sicredi conseguiu um feito que realmente impressiona. Adotou a melhor estratégia que qualquer empresa deveria adotar. Investiu muito em pessoas, processo, metodologia, comunicação e definiu objetivos muito claros e mensuráveis.

A ferramenta utilizada ajudou e foi a CA Service Desk Manager.

E incrivelmente, a ferramenta não foi customizada para viabilizar a implantação. Sinal de que, a ferramenta foi bem aderente as necessidades definidas.

Confesso que essa foi a primeira vez que conheci uma empresa que implantou esse processo sem precisar customizar. E olha que já conheci outras empresas que usam a mesma ferramenta com esse processo...

E mais surpreendentemente ainda, foi saber que a capacitação de alguns colaboradores na metodologia KCS da HDI só ocorreu depois da implantação. Mais um ponto pra Sicredi.

Isso só me convence que tudo fica mais fácil quando sabemos qual problema queremos resolver. E foi o que eles fizeram.

Os objetivos foram bem definidos e o foco era promover o auto-atendimento, reduzir o número de chamados e consequentemente reduzir custos. E conseguiram isso de forma muito significativa.

Na minha opinião, qualquer CIO ficaria feliz com os resultados obtidos. Não é a toa que este case foi apresentado no último congresso da HDI em São Paulo.

O projeto levou cerca de 2 anos e contou com o apoio de parceiros e da própria CA.

O volume de conhecimento gerado desde a implantação é bem grande e o mais importante é destacar que o processo de conhecimento tem muita vitalidade devido a metodologia e gestão adotada pela empresa.

Acho ainda que a sensibilização e comunicação da importância do processo entre os envolvidos foi um dos principais fatores determinantes do sucesso.

Enfim, parabéns Sicredi!

 

sicred.jpg

 

Publicado Originalmente: 11 de novembro de 2015 às 19:51

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Existe um vasto material na internet sobre esse assunto e todos que eu já li dizem mais ou menos a mesma coisa. Não tem "receita de bolo". Tudo dependerá da natureza do seu negócio, dos critérios definidos e das práticas adotadas dentro da sua organização. Vou apenas destacar alguns pontos que considero importante:

 

1) A priorização de um chamado é calculada com 02 critérios: Objetivos e Subjetivos;

 

2) Critérios objetivos são definidos sistematicamente e critérios subjetivos dependem da interpretação de um "ser humano".

 

3) Não interessando a quantidade de critérios que serão utilizados para a priorização dos chamados, o ideal é utilizar a proporção de 80-20, isto é, 80% para critérios objetivos e os outros 20% para os critérios subjetivos definidos pelo agente de atendimento ou pelo próprio cliente.

 

4) Mesmo parecendo um paradoxo, os critérios subjetivos devem ser muito "objetivos" e facilmente entendidos por quem os utiliza. Já abordei o assunto "Categorização & Classificação" de incidentes aqui no grupo, onde destaco algumas recomendações (https://www.facebook.com/groups/usuariossdmbrasil/permalink/1005206292843618/).

 

5) Quanto aos critérios objetivos, recomendo a leitura desse material que encontrei na internet. A abordagem é muito didática (http://www.bridgeconsulting.com.br/como-priorizar-incidente…)

 

6) Depois de tudo definido, isto é, os chamados sendo "carimbados" com a priorização correta (ALTA, MÉDIA, BAIXA, etc), não esqueça que essa priorização deve necessariamente refletir a ordem de atendimento destes chamados pelos analistas de atendimento. Problemas ocorrerão nesta logística de atendimento se quase tudo que for transferido tiver prioridade alta.

 

7) Antes de colocar em prática uma modificação no cálculo da priorização dos chamados, se possível, tente aplicar a novo cálculo a uma amostra considerável de chamados para validar os resultados e verifique se diferentes agentes de atendimento tem o mesmo entendimento na classificação e categorização do chamado. Isso ajudará muito.

 

Até a próxima!

 

Publicado Originalmente: 29 de outubro de 2015 às 00:33

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Dando continuidade ao assunto, hoje falarei sobre as triggers de ATRIBUTO.

As triggers podem ser utilizadas quando estamos declarando um novo objeto ou quando estamos modificando um já existente. Para isso são usadas duas palavras chave: OBJECT e MODIFY.

Para fins didáticos, vou focar este post utilizando a palavra chave MODIFY devido a algumas diferenças de sintaxe da declaração OBJECT.

Vamos lá...

 

Basicamente, as triggers de atributo possuem uma condição e uma ação, mas algumas delas podem permitir outros parâmetros de execução.

 

Tipos de evento

ON_NEW DEFAULT valor;

ON_CI SET valor;

ON_DB_INIT SET valor;

ON_PRE_VAL metodo( args ) seq [ timeout [ acao_timeout ] ] [ FILTER (condicao) ] ;

ON_POST_VAL metodo( args ) seq [ timeout [ acao_timeout ] ] [ FILTER (condicao) ];

ON_POST_VAL_ASYNC metodo( args ) seq [ timeout [ acao_timeout ] ] [ FILTER (condicao) ] ;

 

Onde:

evento = ON_NEW, ON_CI, etc

valor = valor que será armazenado no atributo. Também podem ser utilizadas as constantes USER e NOW que armazena o nome do usuário que executou a ação ou a data e hora, respectivamente.

 

metodo = Nome do metodo SPEL que será executado.

args = Lista de atributos separados por vírgula que serão repassados ao método como argumento de execução

seq = Número que define a ordem de execução da trigger dentro do evento

timeout = [opcional] Especifica o número máximo de segundos que a trigger pode levar pra ser executada. O valor padrão é definido na variável de ambiente NX_BPTIMEMOUT.

acao_timeout = [opcional] Especifica o que deve ser feito se um erro ocorrer ou o tempo de timeout for atingido. ABORT e IGNORE são as ações possíveis. Se um timeout for especificado, a ação padrão será IGNORE, caso contrário, a ação será ABORT.

FILTER condicao = [opcional]

 

UTILIZAÇÃO:

 

Evento: ON_NEW

Função: Inicializa um atributo definindo um valor quando o objeto estiver sendo criado.

Exemplo: MODIFY chg log_agent { ON_NEW DEFAULT USER; };

 

Evento: ON_CI

Função: Inicializa um atributo definindo um valor que será armazenado quando o objeto for salvo.

Exemplo: MODIFY chg modified_date { ON_CI SET NOW ; };

 

Evento: ON_DB_INIT

Função: Inicializa um atributo de forma similar ao evento ON_CI. Mas não sei a diferença. (???)

Exemplo: MODIFY chg modified_date { ON_DB_INIT SET NOW ; };

 

Evento: ON_PRE_VAL

Função: Valida o valor de um atributo antes que o processo de "check_in" do objeto seja feito. Este evento é executado antes da operação "set_val". Caso este evento de validação retorne um erro, a variável msg[0] será populada.

Exemplo: MODIFY chg sched_start_date {ON_PRE_VAL zvalida_data(open_date, sched_start_date) 100 FILTER (delete_flag != 1); };

 

Evento: ON_POST_VAL

Função: Chamar uma função SPEL depois que um atributo tiver um novo valor definido. Este evento é executado após a operação "set_val". Não existe retorno de erro para este evento.

Exemplo: MODIFY chg sched_start_date {ON_POST_VAL zfazalgo(open_date, sched_start_date) 100 FILTER (delete_flag != 1); };

 

Evento: ON_POST_VAL_ASYNC

Função: Igual ao evento ON_POST_VAL mas é executado de forma ***íncrona.

Exemplo: MODIFY chg sched_start_date {ON_POST_VAL_ASYNC zfazalgo(open_date, sched_start_date) 100 FILTER (delete_flag != 1); };

 

Amanhã falarei sobre os operadores e filtros de condição nas triggers.

Até lá.

 

Publicado Originalmente: 21 de outubro de 2015 às 15:01

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Basicamente, a diferença das funções send e send_wait é que a primeira executa de forma ***íncrona e a segunda, síncrona. Além disso, a função send não tem tratamento de timeout nem de erro.

E por falar em exceção, a linguagem SPEL possui constantes que são muito utilizadas no send_wait para o tratamento de erro. No final deste post descrevo algumas que eu conheço.

 

É prudente tratar os erros SPEL sempre capturando toda a mensagem de erro, o contexto da execução, registrando em "log" e preferencialmente, notificando o administrador sobre o incidente por email ou ticket. Abaixo um exemplo:

 

string zs_error; // Variavel global para armazenar erros

string zs_metodo; // Variavel global para armazenar o nome do metodo que esta sendo executado

zs_metodo = "z_teste"; // Nome do metodo que esta sendo executado

zs_object = "cnt:312364654543545464"; // Nome do objeto onde o método está sendo executado

 

send_wait(0, top_object(), "call_attr", "cnt", "val_by_key", "blablabla");

if (msg_error()) {

zs_error = format("%s ERRO ao executar a funcao 'val_by_key' no objeto '%s': ", zs_metodo, zs_object);

if (msg_length()>1) {zs_error += format("%s (%s)", msg[0], msg[1]);} else {zs_error += msg[0];}

logf(ERROR, "%s", zs_error);

z_notifica_erro(zs_error); // Notifica o erro por email/incidente ao administrador

return;

}

 

É bom destacar que nem sempre uma mensagem de erro é armazenada em uma unição posição do array msg[0]. Por vezes, a posição msg[1] também é utilizada.

 

Segue abaixo os erros mais comuns:

 

General errors

E_FAILURE = 1 (Failure)

E_INVALID = 2 (Invalid)

E_TOO_MANY_ARGS = 3 (Too many args)

E_INSUFFICIENT_ARGS = 4 (Insufficient args)

E_BAD_ARG_TYPE = 5 (Bad arg type)

E_BAD_LIST_TYPE = 6 (Bad type-expected long list count)

E_TIMEOUT = 7 (Msg method call timed out)

E_ILLEGAL_CALL = 8 (Illegal call on an object)

E_INTERNAL = 9 (Internal problem)

E_UNKNOWN_MESSAGE = 10 (Unknown message).

E_UNKNOWN_NAME = 11 (Unknown name).

E_UPDATE_NOT_CHECKED_OUT = 12

E_UPDATE_NOT_POSSIBLE = 13 (Cannot update for various rsns)

E_CHECKIN_NOT_CHECKED_OUT = 14 E_ABANDON_NOT_CHECKED_OUT = 15 E_CHECKOUT_NOT_POSSIBLE = 16 (Checkout not possible)

E_NOT_CHECKED_OUT = 17 (Not checked out)

E_UNINITIALIZED_ATTRIBUTE = 18 (Attempt to send to un-init attr)

E_UNKNOWN_ATTRIBUTE_NAME = 19 (Unknown attribute name)

E_NO_WARM_LINK = 20 (Warm link category not found)

E_REQUEST_DENIED = 21

E_VALIDATE_NOT_CHECKED_OUT = 22 (Attempt to validate with nothing)

E_MODIFY_NOT_CHECKED_OUT = 23 (Attempt to modify with out)

E_ACCESS_NULL_VALUE = 24 (Attempt to acess NULL value)

E_ABORT = 25 (Abort the trigger methods)

 

Errors in the domain server

E_DOMSET_NAME = 100 (Bad domset name passed in)

E_NOT_SUPPORTED = 101 (Call of non-supported feature)

E_NOT_FOUND = 102 (Item not found)

E_BAD_ARG = 103 (Bad argument value passed in)

E_CHECK_DEL = 104 (Attempt to checkout deleted)

E_CHECK_NULL = 105 (Attempt to CO a null object)

E_SREL_CO_CONFLICT = 106 (Attempt to set an CO srel)

E_REMAP_CO = 107 (Dob remap on checked out dob1)

E_REMAP_BAD_CLASS = 108 (Attempt to remap to a bad class)

E_IN_FETCH = 109 (We are in a fetch and can't do it)

E_NO_MORE_FETCH = 110 (No more fetch possible)

E_BAD_DOMSET_TYPE = 111 (A bad domset type)

E_BAD_MERGE_TYPE = 112 (Can't merge that)

E_DUPLICATE = 113 (Duplicate)

 

Errors for Animation

E_INVALID_TARGET = 200/201 (Bad target +/or method specified)

E_INVALID_PERSID_ID = 202 (Bad target instance specification)

E_INVALID_TYPE = 203 (Bad target type)

E_INVALID_POST_ACTIVITY = 204 (Bad post action)

E_UNKNOWN_ERROR_CODE = 205 (Always the last error code)

 

Até a próxima.

 

 

 

Publicado Originalmente: 14 de outubro de 2015 às 11:25

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

As vezes é necessário consultar uma lista de registros de um objeto e para isso, é importante conhecer o funcionamento dos domset's. Um domset define como uma lista de valores deve ser criada. Portanto, a utilização correta de um domset influencia diretamente no resultado e na performance da função "sync_fetch", por exemplo. Além de várias outras funções similares de listagem ("select", "select_count", "fetch", etc).

 

Basicamente existem 02 tipos de Domsets: MLIST (Master) e RLIST (Restrito), e dentro desses, outros dois subtipos: STATIC e DYNAMIC.

E além disso podem existir outros domsets específicos de uma factory que foram criados para uma necessidade específica da aplicação (Ex.: scoreboard no objeto cr).

 

Para consultar todos os domset's disponíveis em um objeto, utilize o comando

bop_sinfo -l nomeDoObjeto

 

Por via de regra, domset's restritos (RLIST) possuem cláusula "where" embutida em seu funcionamento. E por conta disso geram um subconjunto de registros de um domset MLIST. Vou destacar dois domset's da factory "imp":

 

MLIST_STATIC

List Cols: delete_flag

Sort Cols: sym, enum

 

RLIST_STATIC

Where : delete_flag = 0

List Cols: delete_flag

Sort Cols: sym, enum

 

A diferença desses domsets é que o RLIST só incluirá registros "ativos" na lista. Além disso, MLIST's geralmente são mais rápidos pois a SDM mantém ponteiros de colunas de objeto na memória RAM do servidor ao invés de utilizar um índice de banco. Isso é bom e mau ao mesmo tempo mas não vou me alongar por aqui.

 

Mas qual a diferença entre domset STATIC e DYNAMIC?

Objetos de lista utilizando domsets estáticos quando criados NÃO sofrerão mudança de conteúdo mesmo quando durante o processo, algum registro for incluído, alterado ou excluído. Se ele fosse dinâmico, isso aconteceria e o resultado da busca se modificaria.

 

E pra finalizar, uma dica interessante:

Muitos implementadores costumam criar um arquivo .MOD de determinado objeto declarando um STANDARD_LIST como no exemplo abaixo:

 

MODIFY FACTORY in {

STANDARD_LISTS {

SORT_BY "open_date DESC,priority DESC";

};

};

 

Isso faz com que a SDM "substitua" todos os domsets MLIST e RLIST preexistentes no objetos e os resultados, por vezes, afetam diretamente a performance do produto. Ao invés disso, prefira customizar o formulário "list_***.htmpl" alterando a PDM_MACRO "lsend" ou manipulando a variável de servidor $sort. É muito mais prático além de permitir diferentes configurações de ordenação de registro de acordo com a função (role) do usuário.

 

Até a próxima.

 

 

Publicado Originalmente: 13 de outubro de 2015 às 16:06

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Existem várias formas de consultar atributos de objetos via SPEL. De acordo com a necessidade e cenário devemos optar por um ou outro método. Alguns métodos são mais confiáveis e até mesmo mais performáticos que outros. A melhor forma de comparar é testá-los intensamente com grandes consultas à base.

Abaixo um código de exemplo que demonstra o funcionamento de cada um desses métodos:

 

// Definindo o persistent_id do objeto que será consultado

// Tentaremos consultar atributos do contato no objeto cnt

// fornecendo apenas apenas a chave persistent_id do contato.

string zs_persid, zs_name;

zs_persid = 'cnt:ED4D469F18BC4943B940AB934D020C6D';

 

// 'expand'

// Consulta apenas UM atributo sem tratamento de erro e sem instanciar o objeto

zs_name = expand(format("&{%s = cnt.persistent_id->last_name}", zs_persid));

 

// 'send_wait (val_by_key)'

// Consulta UM ou VÁRIOS atributos sem instanciar o objeto

send_wait(0, top_object(), "call_attr", "cnt", "val_by_key", "persistent_id", zs_persid, 3, "first_name", "middle_name", "last_name");

if (msg_error()) {

logf(ERROR, "ERRO ao consultar atributo do objeto '%s': '%s'", zs_persid, msg[0]);

return;

}

zs_name = format("%s %s %s", msg[1], msg[2], msg[3]);

 

// 'send_wait (dob_by_persid)'

// INSTANCIANDO um objeto para futura consulta com outros metodos

send_wait(0, top_object(), "call_attr", "cnt", "dob_by_persid", 0, zs_persid);

if (msg_error()) {

logf(ERROR, "ERRO ao instanciar o objeto '%s': %s", zs_persid, msg[0]);

return;

}

object zo_cnt;

zo_cnt = msg[0];

 

// Consulta DIRETA ao atributo do objeto instanciado sem tratamento de erro

zs_name = zo_cnt.last_name;

 

// 'send_wait (get_val)'

// Consulta apenas UM atributo do objeto instanciado

send_wait(0, zo_cnt, "call_attr", "last_name", "get_val");

if (msg_error()) {

logf(ERROR, "ERRO ao consultar atributo no objeto '%s': %s", zs_persid, msg[0]);

return;

}

zs_name = msg[0];

 

// 'send_wait (get_attr_vals)'

// Consulta UM ou VÁRIOS atributos do objeto instanciado

send_wait(0, zo_cnt, "get_attr_vals", 3, "first_name", "middle_name", "last_name");

if (msg_error()) {

logf(ERROR, "ERRO ao consultar atributos no objeto '%s': %s", zs_persid, msg[0]);

return;

}

zs_name = format("%s %s %s", msg[3], msg[6], msg[9]);

 

// EXIBINDO o nome do usuario

logf(SIGNIFICANT, "Nome do usuario: '%s'", zs_name);

 

Até a próxima.

 

 

Publicado Originalmente: 09 de outubro de 2015 às 11:24

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Antes de abordar as funções "send_wait", "send" e "send_catch", é bom nivelar o conhecimento abaixo:

 

TIPOS DE DADOS

string

int

long

float

date

duration

bool

uuid

object

 

EXEMPLOS

string nome[2]; // array de 3 posicoes

string usuario;

int idade;

bool sexo;

float renda;

date nascimento;

duration durSessao;

uuid identificacao;

 

nome[0] = "Fulano";

nome[1] = NULL; // valor nulo

nome[2] = "Silva";

usuario = "fulano-silva";

idade = 35;

sexo = 1;

renda = 876.54321;

nascimento = (date) '04/30/2015 23:45:59';

durSessao = (duration) '01:00:00';

identificacao = (uuid) expand("&{%s=cnt.userid->id}", usuario);

 

// Consultando o departamento do usuario

send_wait(0, top_object(), "call_attr", " cnt", "val_by_key", "userid", usuario, (int) 1, "dept.name");

 

// Consultando o objeto msg

if (msg_error()) {

logf(ERROR, "Erro: %s", msg[0]);

} else {

logf(SIGNIFICANT, "Departamento: %s", msg[1]);

}

 

OPERADORES ARITMÉTICOS

+ Adição

- Subtração

* Multiplicação

/ Divisão

% Resto da divisão

 

OPERADORES DE COMPARAÇÃO

== Igual

!= Diferente

<= Menor ou igual

< Menor

>= Maior ou igual

> Maior

 

OPERADORES DE CONCATENAÇÃO

+

 

OPERADORES LÓGICOS

|| OU

&& E

! NÃO

 

OPERADORES DE ATRIBUIÇÃO

= atribuição simples

+= Adição composta

-= Subtração composta

*= Multiplicação composta

/= Divisão composta

%= Resto da divisão composta

 

Até a próxima.

 

 

Publicado Originalmente: 06 de outubro de 2015 às 23:44

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Instanciar objetos na SDM é necessário quando precisamos sensibilizar algum registro para consulta, alteração, exclusão ou outros processos.

Por conta disso, destacarei os 03 métodos mais utilizados na linguagem SPEL:

 

// Tentaremos instanciar um objeto localizando o registro por ID, PERSID ou WHERE CLAUSE no producer 'imp'

int zi_imp_id;

string zs_imp_persid;

string zs_producer;

zs_producer = 'imp'; // Define em que producer iremos trabalhar

zi_imp_id = 1600; // Define o ID que queremos instanciar

zs_imp_persid = 'imp:1600'; // Define o PERSID que queremos instanciar

zs_imp_wc = format("id = %d", zi_imp_id); // Define a WHERE CLAUSE que retornara o objeto a ser instanciado

 

// Informando ID

send_wait(0, top_object(), "call_attr", zs_producer, "dob_by_id", 0, zi_imp_id, NULL, NULL);

if (!msg_error()) {

object zo_obj_by_id;

zo_obj_by_id = msg[0];

}

 

// Informando PERSID

send_wait(0, top_object(), "call_attr", zs_producer, "dob_by_persid", 0, zs_imp_persid);

if (!msg_error()) {

object zo_obj_by_persid;

zo_obj_by_persid = msg[0];

}

 

// Informando WHERE CLAUSE

// Primeiro procuramos o registro

send_wait(0, top_object(), "call_attr", zs_producer, "sync_fetch", "STATIC", zs_imp_wc, -1, 0);

if (!msg_error()) {

object zo_obj_list;

zo_obj_list = msg[0];

 

// Depois instanciamos

send_wait(0, zo_obj_list, "dob_by_index", "DEFAULT", 0, 0);

if (!msg_error()) {

object zo_obj_by_wc;

zo_obj_by_wc = msg[0];

}

}

 

Até a próxima.

 

 

 

Publicado Originalmente: 16 de outubro de 2015 às 18:39

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

LINGUAGEM SPEL: Client REST x SDM

Imagine poder integrar sua SDM com outros sistemas utilizando REST da seguinte forma:

 

1) Um usuário altera um atributo em algum formulário da SDM;

2) Uma trigger POST_VALIDATE do respectivo objeto intercepta esta modificação e executa um Client REST que sincroniza esta informação modificada em outra base de outro sistema.

 

Para isso desenvolvi a função genérica "z_rest_exec" que através da função "z_executar", executa o client "CURL" para fazer a operação desejada em REST. Tudo funciona de forma síncrona e qualquer erro ocorrido é exibido ao usuário no formulário em edição.

 

MODO DE UTILIZAÇÃO

 

1) Copie o arquivo "CURL.EXE" para qualquer pasta que esteja no PATH do(s) servidor(es) SDM;

 

2) Copie o arquivo "z_executar_bridge.cmd" (que foi pra versão 1.01) para a pasta $NX_ROOT/bin;

 

3) Copie os arquivos "z_executar.spl" e "z_rest_exec.spl" para a pasta $NX_ROOT/site/mods/majic;

 

4) Crie uma trigger em um arquivo .MOD que faça a chamada de uma função de validação do objeto que por sua vez chamará a função "z_rest_exec" obedecendo a sintaxe definida no método.

 

 

Publicado Originalmente: 15 de outubro de 2015 às 16:41

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Uma função muito interessante que acabei não explicando o suficiente é o "expand". Por mais que não seja indicado utilizá-lo para expandir atributos devido ao não tratamento de erros, as duas outras funcionalidades são muito utilizadas. Segue abaixo alguns exemplos:

 

// Expandindo variáveis SET de sistema operacional e ambiente NXENV

printf(expand("O $NX_PRODUCT_NAME esta instalado na pasta $NX_ROOT do servidor $COMPUTERNAME e atende pelo endereco $NX_WEB_CGI_URL\n"));

 

// Expandindo atributos de objetos

printf("O 'id' do usuario servicedesk eh '%s'\n", expand(format("&{%s = cnt.last_name->id}", "servicedesk")));

 

// Lendo o conteúdo de um arquivo

printf("O conteudo do arquivo eh\n%s", expand("<{" + expand("D:/dados/arquivo.txt") + "}"));

 

 

Publicado Originalmente: 11 de outubro de 2015 às 13:03

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

TMACUL

CONTROLE DE DEPURAÇÃO SPEL

Posted by TMACUL Champion Jan 1, 2016

os desenvolvedores de plantão:

Imaginem controlar o comportamento das funções SPEL através da própria interface web.

Controlar o nível de depuração, o recebimento por email de mensagens de erro, desativação dos métodos, validade de funcionamento, limite de instruções, além de servir para a própria documentação das funções customizadas.

Sim. Isso é possível.

Basta querer.

 

12088584_1088081871217031_1619804774148521376_n.jpg

 

 

12143311_1088081854550366_5854884017582200790_n.jpg

Publicado Originalmente: 04 de outubro de 2015 às 10:34

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

 

UMA IDEIA INTERESSANTE:

Recentemente fizemos uma pesquisa de satisfação com os usuários da ferramenta SDM em minha organização e os resultados de forma geral foram muito satisfatórios. Mas nem tudo são flores...

O único critério avaliado que não recebeu notas boas foi a usabilidade. Mais especificamente a interface da ferramenta.

 

A grande verdade é que a pesquisa de satisfação só serviu para transformar uma suspeita nossa em fato. E de fato os usuários consideram a interface da SDM um tanto confusa. E existe uma explicação bem coerente que justifica esta reclamação.

 

A maioria das ferramentas que utilizamos diariamente tem um design bem similar.

O conceito de botões nem é mais utilizado, não existem mais barras de menu, nem popups, além do design ser sempre muito simplista. Este antigo conceito de exibir um universo de funcionalidades já "caiu por terra" a muito tempo. E por um motivo bem óbvio:

Não adianta agradar apenas 10% dos usuários diferenciados se a grande maioria dos usuários "comuns" só quer simplicidade e objetividade. Chega a ser irracional fazer isso.

 

Experimente analisar criteriosamente os serviços Facebook, Gmail, Instagram, Twitter, Outlook e tantos outros serviços populares. Se comparar apenas os serviços da Google fica ainda mais fácil perceber que a interface precisa utilizar um estilo bem minimalista.

 

Por conta disso resolvi pensar a respeito para tentar resolver esse "probleminha" da SDM.

 

Tentem imaginar uma página inicial da SDM no estilo Gmail. Imaginem uma "Caixa de entrada" que exibe todos os tipos de tickets/tarefas sinalizando estes itens com cores e ícones diferenciados. Os usuários são muito visuais e uma imagem vale mais que mil palavras.

Ações de encaminhar (transferir), responder (solucionar), excluir (cancelar/fechar), poderiam estar presentes nessa tela.

 

Em uma primeira versão desta interface, quando o usuário tentasse abrir algum item, o formulário do objeto seria aberto utilizando o framework nativo da ferramenta. Em um segundo momento quem sabe, poderiam ser desenvolvidos frames de mini-preview para estes objetos com o mesmo design.

E além da caixa de entrada, imagine a opção de "Histórico" ou "Atividade recente" que exibiria todas as atividades que o usuário realizou recentemente na ferramenta SDM. Não interessando em que objeto esta atividade ocorreu, tudo precisa ser exibido no mesmo lugar.

 

Em suma, acabei ficando animado com está ideia.

Pensei em desenvolver isso em um formulário HTMPL, com JavaScript, jQuery e AngularJS e outros formulários de apoio para fazer consultas na base.

Logicamente este formulário ficaria dentro do contexto da aplicação SDM. Seria apenas um formulário diferenciado com recursos inovadores.

Já fiz isso antes em um formulário que desenvolvemos para exibir de forma mais elegante as categorias de requisições de serviço e os resultados foram excelentes.

 

Se algum implementador aqui do grupo quiser participar deste projeto acho que será bem legal. Quem sabe até a CA compra a ideia.

 

O que acham?

 

Publicado Originalmente: 03 de outubro de 2015 às 18:14

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Duas funções muito utilizadas e as vezes mal utilizadas por descuido são as funções booleanas "bool is_empty(attr)" e "bool is_null(attr)".

Os valores nulos ou vazios são tratados de forma diferente na maioria das linguagens de programação. E SPEL não é diferente.

Não existir valor em um atributo/variável não significa que ele está vazio. Um atributo/variável nunca será nulo E vazio ao mesmo tempo. É uma coisa ou outra ou nenhuma das duas.

A regra de utilização destas funções é bem simples: Se o atributo/variável ainda não foi inicializado com algum valor, não tem sentido utilizar a função is_empty. Vou exemplificar:

 

string zs_teste_nulo, zs_teste_vazio;

zs_teste_vazio = "Ola";

 

printf("%d\n", is_null(zs_teste_nulo)); // retorna TRUE (1) pois a variável não foi inicializada

 

printf("%d\n", is_empty(zs_teste_nulo)); // retorna FALSE (0) pois o valor é NULO

 

printf("%d\n", !is_empty(zs_teste_vazio)); // retorna TRUE (1) pois existe valor

 

printf("%d\n", !is_null(zs_teste_vazio)); // retorna TRUE (1) pois existe valor

 

Até a próxima.

 

Publicado Originalmente: 03 de outubro de 2015 às 14:02

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

LINGUAGEM SPEL (Continuação)

Todos os objetos nativos da SDM possuem os métodos "method_list" e "method_info". Estes métodos servem para detalhar o modo de funcionamento de cada método existente na ferramenta.

É quase como um manual de utilização da API (#sqn) e no mínimo ajuda muito aos usuários que querem aprender novas técnicas na linguagem.

Abaixo segue uma função que desenvolvi para "exibir o help" de todos os métodos do objeto "api". Quem for mais curioso ainda, aproveite pra consultar o objeto "macro".

Garanto que tem muita coisa boa...

 

// Define o objeto que sera consultado

string zs_object;

zs_object = "api";

 

// Consulta todos os metodos do objeto

send_wait(0, top_object(), "call_attr", zs_object, "method_list");

if (msg_error()) {

logf(ERROR, "ERRO ao consultar a lista de metodos disponiveis: %s", zs_metodo, msg[0]);

return;

}

int zi_count_list;

zi_count_list = msg_length();

 

// Armazena o nome de todos os metodos encontrados em um array

string zs_array[200];

int zi_i, zi_j;

for (zi_i=1; zi_i<zi_count_list; zi_i++) {

zs_array[zi_i] = msg[zi_i];

}

 

// Consulta e exibe as informacoes de cada metodo encontrado

for (zi_i=1; zi_i<zi_count_list; zi_i++) {

send_wait(0, top_object(), "call_attr", zs_object, "method_info", zs_array[zi_i]);

if (msg_error()) {

logf(ERROR, "ERRO ao consultar o metodo '%s': %s", zs_array[zi_i], msg[0]);

}

for (zi_j=0; zi_j<msg_length(); zi_j++) {

if (zi_j == 0) printf("Nome : %s\t(%s)\n", msg[zi_j], msg[zi_j+1]);

if (zi_j == 2) printf("Parametros: %s\n\n", msg[zi_j]);

}

}

 

Até a próxima.

 

 

Publicado Originalmente: 29 de setembro de 2015 às 10:04

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Por padrão qualquer método SPEL que seja invocado tem um limite máximo de 200000 instruções que podem ser processadas. Quando esse valor é ultrapassado, ocorrerá o erro "ilimit exceeded" e o método será abortado.

Para resolver esse problema, o mais fácil é redefinir esse limite através da função "void set_ilimit(int value)" que pode ser declarada em qualquer parte do código. Mas será que é a melhor alternativa?

 

Este mecanismo de limite de execução foi criado pela CA exatamente para prevenir que um método problemático comprometa a performance dos processos spelsrvr.exe e webengine.exe, responsáveis pela interpretação da linguagem SPEL.

 

As vezes realmente é necessário utilizar a função set_ilimit devido a necessidade de processamento em larga escala utilizando a linguagem. Rotinas batch são um exemplo bem familiar desta necessidade.

 

Mas na maioria das vezes, o ideal é a revisão do código a fim de identificar possíveis vilões no processamento do método.

Dentre as principais causas de ônus no processamento, destaco abaixo:

 

1) Instanciar objetos de forma desnecessária.

Instanciar é custoso para qualquer linguagem orientada a objetos. Ao invés disso, existem alternativas que vão desde a utilização da função "expand" ou até mesmo métodos mais performáticos quando se quer consultar atributos de um objeto de forma rápida. O método "val_by_key" utilizado através da função "send_wait" é uma ótima opção. Caso seja realmente necessário instanciar um objeto para consultar vários atributos, utilize o método "get_attr_vals" ao invés de várias linhas chamando o método "get_val".

 

2) Execução de rotinas recursivas.

Quem já trabalhou com o objeto "bmhier", sabe do que eu estou falando. Rotinas recursivas ás vezes são a única saída para vasculhar informações que estão distribuídas em milhares de registros relacionados entre si. Aqui não tem receita de bolo. É necessário muita atenção ao desenvolver rotinas para esta finalidade. Um erro muito comum é declarar variáveis dentro de enlaces de repetição (for, while, etc). Mas existem dezenas de outras causas...

 

3) Select's encadeados desnecessários.

Não esqueça que programar em SPEL significa programar em alto nível, por se tratar de uma linguagem orientada a objetos. Quem só conhece INNER_JOINS de SQL pode ter uma certa dificuldade ao utilizar a função "sync_fetch". Um bom "sync_fetch" com uma boa cláusula pode diminuir significativamente o processamento gerado.

Imagine criar uma lista de todos os analistas ativos que trabalham no departamento XYZ. Além de ser bem semântica, a cláusula where mais performática deveria ser parecida com "delete_flag=0 and type.sym='Analista' and dept.name='XYZ'" ao invés de ter que descobrir previamente o id dos tipos de contato e o id dos departamentos. Se possível, evite os LIKE's nas comparações, principalmente em atributos que não são indexados.

Outro fator importante é a utilização correta do DOMSET do objeto de acordo com a necessidade da consulta. Se você nem sabe o que é isso, te aconselho a ler a respeito ou esclarecer suas dúvidas aqui.

 

Vou deixar pra escrever mais em breve porque esse assunto é enorme.

Até a próxima.

 

Publicado Originalmente: 28 de setembro de 2015 às 15:31

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Testando a nova funcionalidade "Unified Self Service" da versão 14.1...

Pra quem não sabe esse recurso torna as interfaces de cliente e funcionário muito mais atrativas. O design é bem legal.

É o antigo "CA Open Space" mas bem melhorado. Assim que eu fizer mais testes, posto aqui o resultado. Até.

 

Publicado Originalmente: 25 de setembro às 00:47

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Segue abaixo um exemplo das funções workshift_abs2work, workshift_work2abs e workshift_validate utilizadas para manipular workshifts.

 

Função: workshift_abs2work

Sintaxe: int workshift_abs2work(string workshift, date start, date finish)

Retorno: Calcula a diferença em segundos entre duas datas observando o workshift informado.

 

Função: workshift_work2abs

Sintaxe: date workshift_work2abs(string workshift, date start, duration seconds)

Retorno: Retorna a próxima data útil levando em conta a soma dos segundos com a data inicial observando o workshift informado.

 

Função: workshift_validate

Sintaxe: string workshift_validate(string workshift)

Retorno: Verifica se o workshift informado é válido. Caso o retorno seja uma string vazia, o workshift é válido.

 

 

 

 

Publicado Originalmente: 27 de setembro às 13:37

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Como não sei o nível de conhecimento de cada um, vou tentar exemplificar cada função Spel. Segue abaixo um exemplo das funções strlen, downcase, upcase, gsub, substr, sindex, split, format, printf e for

 

// Demonstrando as funcoes Spel para manipular variaveis

string zs_msg;

zs_msg = format("Esta mensagem pode mudar sua vida a partir de hoje (%s). Acredite nisso. Eh a mais pura verdade.", now());

 

// strlen

printf("Tamanho: '%d'\n", strlen(zs_msg));

 

// downcase

printf("Minusculas: '%s'\n", downcase(zs_msg));

 

// upcase

printf("Maiusculas: '%s'\n", upcase(zs_msg));

 

// gsub

printf("Substituicao: '%s'\n", gsub(zs_msg, "Acredite", " Pense"));

 

// substr

printf("Trecho: '%s'\n", substr(zs_msg, sindex(zs_msg, ".")+1));

 

// split

string zs_array[5]; // Utilizando um array para armazenar a mensagem

int zi_bound;

zi_bound = split(zs_array, zs_msg, ". ");

printf("Exibindo as %d linhas do array...", zi_bound+1);

 

// Iterando o array

int zi_i;

for (zi_i=0; zi_i<zi_bound; zi_i++) {

printf("Posicao %d: '%s'\n", zi_i, zs_array[zi_i]);

}

 

Publicado Originalmente: 24 de setembro às 12:22

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

Hi All,

 

Does anyone know how to invoke/start a ITPAM process or SRF from an external application or website, possibly via ITPAM webservices or an API?

 

I found documentation on the command line API but would prefer to use a webservice, I have not yet found any documentation on it.

 

Thank you

 

This post has been edited by nooblet: Oct 1 2012, 04:11 AM

 

Found the ITPAM WSDL:

 

http://servername:port/itpam/soap?wsdl

or newer versions:

 

http://servername:port/pam/soap?wsdl

Overview

This article provides instructions for adding Contact Searching capabilities to the Employee/Customer Interface.

Procedures

Step 1. Remove Data Partition Constraints

By default the Employee and Customer Access Types have Data Partitions associated with them. Delete or Inactivate the VIEW constraint on the ca_contact table.

Step 2. Add lookup field to forms

Add a dtlLookup PDM_MACRO to the desired detail form (detail_chg.htmpl, detail_cr.htmpl, detail_iss.htmpl). When the label of this field is selected the list_cnt.htmpl form is launched. Example:

<PDM_MACRO NAME=dtlLookup hdr="My Field" attr="zyourfield"> 

Step 3. Create list_cnt.htmpl Form

The list_cnt.htmpl will display the list of contacts from which to make a selection.

Click Here to download file, or copy syntax below.

<html lang="en"><HEAD>

<PDM_PRAGMA RELEASE=110>

<PDM_INCLUDE FILE="std_head.htmpl">

<pdm_set PRE.Is3FieldContact=1>

<SCRIPT>

var argBackfillField = '$args.KEEP.backfill_field';

var argBackfillForm = '$args.KEEP.backfill_form';

var argBackfillAttr = '$args.KEEP.backfill_attr';

 

<PDM_IF "${current:n/a}" == "n/a">

searchFilterInitialState = "show";

<PDM_ELSE>

var cfgCurrent = '$current';

var cfgTotal = '$total';

var cfgRecordCount = '$record_count';

var cfgStart = '$start';

var cfgLength = '$length';

</PDM_IF>

var cfgIsPopup = '$args.KEEP.IsPopUp';

var rptName = new Array("no", "no");

var cfgCanEdit = true;

</SCRIPT>

<PDM_INCLUDE FILE=std_list_include.htmpl>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/sitemods.js"></SCRIPT>

</HEAD>

<BODY CLASS="list">

<PDM_INCLUDE FILE=std_body.htmpl>

 

<SCRIPT LANGUAGE="JavaScript">

<pdm_macro name=sfStart factory=cnt>

 

<pdm_macro name=sfStartRow>

<pdm_macro name=sfTextbox hdr="Last Name" attr=last_name size=20>

<pdm_macro name=sfTextbox hdr="First Name" attr=first_name size=20>

<pdm_macro name=sfTextbox hdr="Middle Name" attr=middle_name size=20>

 

<pdm_macro name=sfStartRow>

<pdm_macro name=sfDropdown hdr="Active" attr=delete_flag>

<pdm_macro name=sfTextbox hdr="Contact ID" attr=contact_num size=20>

<pdm_macro name=sfTextbox hdr="Phone Number" attr=phone_number size=20>

 

<pdm_macro name=sfEnd>

</SCRIPT>

<PDM_FORM NAME="frmFID">

</PDM_FORM>

<PDM_IF "${current:n/a}" != "n/a">

<SCRIPT LANGUAGE="JavaScript">

var msgFoundNone = "No contacts found";

var msgFound1 = "1 contact found";

var msgFound = "%1 contcts found";

var msgFoundMore = "%1 contacts found. Displaying %2 through %3";

var msgSelect = "Click to select desired contact";

 

<pdm_macro name=lsStart>

<pdm_macro name=lsCol hdr="Name" attr=combo_name link=yes>

<pdm_macro name=lsCol hdr="Phone Number" attr=phone_number>

<pdm_macro name=lsCol hdr="Location" attr=location.name>

<pdm_macro name=lsCol hdr="Organization" attr=organization.name>

<pdm_macro name=lsCol hdr="Status" attr=delete_flag>

<pdm_macro name=lsEnd>

</SCRIPT>

</PDM_IF>

<BASE TARGET="_top">

<PDM_INCLUDE FILE="std_footer.htmpl">

</BODY>

</HTML>


Step 4. Clear the web cache

The final step is to clear Service Desk's cache. Publish your changes via the Web Screen Painter. The process of publishing automatically initiates a pdm_webcache.

Available exclusively from SDU is Enhancement Pack 1 (EP1) for CA Service Desk r12. EP1 contains 5 commonly implemented customizations focusing on improving technician efficiencies.

List of Enhancements

Consolidated Request, Incident, & Problem Gobtn Search
Simplifies finding the proper ticket when all you know is the number. Applies to Requests, Incident, and Problems.

Change Requests to Incidents (or Incidents to Requests)
Adds the ability to change a Request to an Incident (or vice versa) eliminating the need to create duplicate tickets. Applies to Requests and Incidents, but can be added to Problems with slight modification.

Create Child button
Expedites the child creation process by copying most of the values from the Parent and automatically attaching the two tickets. Applies to Requests, Incidents, Problems, Change Orders, and Issues.

Propagate Status from Parent to Child(ren)
When the Status is being set on a Parent ticket, there is an option to push that Status to all the children. Applies to Requests, Incidents, Problems, Change Orders, and Issues.

Propagate Solution from Parent to Child(ren)
When logging a Solution on a Parent ticket, there is an option to push that Solution to all the children. Applies to Requests, Incidents, Problems, and Issues.

Implementation Procedures

Step 1. Download Package

Click Here to download r12 EP1.

Step 2. Add Scripts

Copy the files from the majic directory of this package to $NX_ROOT\site\mods\majic of the Primary Server.

Step 3. Add Triggers

Launch the Schema Designer and add the following Site-Defined Triggers to the tables specified.

Table: alg (Request Activity Log)

POST_VALIDATE zcr_stat_to_child() 111 FILTER((type{-> 'CL'} || type{-> 'RE'} || type{-> 'ST'}) && zset_child_f == 1); POST_VALIDATE zcr_soln_to_child() 121 FILTER(type{-> 'SOLN'} && zset_child_f == 1 );

Table: chgalg (Change Order Activity Log)

POST_VALIDATE zchg_stat_to_child() 111 FILTER((type{-> 'CL'} || type{-> 'CNCL'} || type{-> 'RE'} || type{-> 'ST'}) && zset_child_f == 1);

Table: issalg (Issue Activity Log)

POST_VALIDATE ziss_stat_to_child() 111 FILTER((type{-> 'CL'} || type{-> 'CNCL'} || type{-> 'RE'} || type{-> 'ST'}) && zset_child_f == 1); POST_VALIDATE ziss_soln_to_child() 121 FILTER(type{-> 'SOLN'} && zset_child_f == 1 );

Note: If triggers currently exist for these tables using the sequence numbers provided (111 & 121), then simply use different numbers.

Step 4. Publish Schema Changes

To publish schema changes made in step 3, use the CA supported method which is as follows:

  1. File > Save and Publish.
  2. Close all the Schema Designer and Web Screen Painter windows.
  3. Stop the "CA Service Desk Server" service.
  4. Run the "pdm_publish" command from a command prompt.
  5. Start the "CA Service Desk Server" service.

Step 5. Add Analyst HTMPL Files

Copy the files from the htmpl directory of this package to $NX_ROOT\site\mods\www\htmpl\web\analyst on ALL the CA Service Desk servers.Note 1: If utilizing Form Groups, ensure these files are placed within the appropriate Form Group folder located within the analyst directory on all of the CA Service Desk servers.Note 2: If these files already exist in the specified destinations, then simply locate the added or modified code clearly identified within the files provided here, and copy the code to the existing files.

Step 6. Add Javascript Files

Copy the files from the script directory of this package to $NX_ROOT\site\mods\www\wwwroot\scripts on ALL the CA Service Desk servers.

Step 7. Add Extract File

Copy usp_web_form.dat from this package to C: of the Primary Server.

Step 8. Load Extract

From a command prompt run "pdm_load -f C:\usp_web_form.dat -i" from the Primary Server.

Step 9. Clear Cache

From a command prompt run the "pdm_webcache" from the Primary Server.

Step 10. Modify Roles

Via the Administration tab, go to Security and Role Management > Role Management > Role List and select the Administrator role.

  1. From the Administrator Role Detail, access tab "8. Go Resources".
  2. Select the "Update Go Resources" button.
  3. On the Web Form Search select the "Search" button.
  4. Move the Req/Inc/Prb options to the right and select "OK"

Note 1: Once the Req/Inc/Prb option has been added to the Go Button Search options, feel free to remove the individual Incident, Problem, and Request options.

Note 2: Step 10 should be performed on all Roles where a combined search function is desired.

History

03/20/09 - Updated Read_Me.txt
02/06/09 - Removed gobtn.html and added procedures for adding new Go Button Resources
02/05/09 - Generally available.

 

 

export from: http://webcache.google

Overview

This article provides instructions for adding workflow capabilities to the Employee/Customer Interface. Workflow refers to the built-in classic legacy workflow, not the CA Workflow application that is included with the Service Desk installation.

Procedures

Step 1. Set Access Type

In order to be able to complete a Workflow Task, the Employee/Customer Access Types will need to be updated. The Functional Access for Change Orders must be changed to Modify.

Step 2. Add Nodes to Employee/Customer Scoreboards

Customize the Employee/Customer Scoreboard by adding a Node with the following parameters
Node label: pending tasks
Node's Stored Query: My Pending Tasks

Note: The My pending Tasks query is the default label for a query with the code of MYPEND which contains the syntax of...

assignee = @cnt.id AND status = \'PEND\' 

Step 3. Create list_wf.htmpl Form

The list_wf.htmpl form is needed if workflow nodes are added to the Employee/Customer Scoreboards. From this list, all of the workflow tasks meeting the criteria of the Stored Query associated with the node will be displayed. These are typically all the tasks assigned to the logged in person.

Click Here to download files, or copy syntax below.

<html lang="en"><HEAD>

<PDM_PRAGMA RELEASE=110>

<PDM_INCLUDE FILE="std_head.htmpl">

<SCRIPT>

var argBackfillField = '$args.KEEP.backfill_field';

var argBackfillForm = '$args.KEEP.backfill_form';

var argSearchSqlClause = '<PDM_FMT PAD=NO ESC_STYLE=C>$args.search_sql_clause</PDM_FMT>';

var argSearchWhereClause = '<PDM_FMT PAD=NO ESC_STYLE=C>$args.search_where_clause</PDM_FMT>';

var argSaveSqlClause = '<PDM_FMT PAD=NO ESC_STYLE=C>$args.KEEP.save_sql_clause</PDM_FMT>';

<PDM_IF "${current:n/a}" == "n/a">

var searchFilterInitialState = "show";

<PDM_ELSE>

var cfgCurrent = '$current';

var cfgTotal = '$total';

var cfgRecordCount = '$record_count';

var cfgStart = '$start';

var cfgLength = '$length';

</PDM_IF>

var cfgUseTemplate = '$args.use_template';

var cfgIsPopup = '$args.KEEP.IsPopUp';

var rptName = new Array("no", "no");

var cfgCanEdit = true;

</SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/date_helper.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/convert_date.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/val_type.js"></SCRIPT>

<PDM_INCLUDE FILE=std_list_include.htmpl>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/comboname.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/sitemods.js"></SCRIPT>

</HEAD>

<BODY CLASS="emp">

<PDM_INCLUDE FILE=std_body.htmpl>

<PDM_FORM NAME="frmFID">

</PDM_FORM>

<PDM_IF "${current:n/a}" != "n/a">

<SCRIPT LANGUAGE="JavaScript">

var msgFoundNone = "No workflow tasks found";

var msgFound1 = "1 workflow task found";

var msgFound = "%1 workflow tasks found";

var msgFoundMore = "%1 workflow tasks found. Displaying %2 through %3";

var msgSelect = "Click to select desired workflow task";

var ref_num_style;

<pdm_macro name=lsStart>

rs.overrideMenu=true;

<pdm_macro name=lsCol hdr="Task" attr=task link=yes>

<pdm_macro name=lsCol hdr="Assignee" attr=assignee>

<pdm_macro name=lsCol hdr="Status" attr=status>

<pdm_macro name=lsCol hdr="Description" attr=description  width=200>

<pdm_macro name=lsEnd factory=wf>

</SCRIPT>

</PDM_IF>

<BASE TARGET="_top">

<PDM_INCLUDE FILE="std_footer.htmpl">

</BODY>

</HTML>


Step 4. Create detail_wf.htmpl Form

The detail_wf.htmpl form will be accessed directly from an email URL or from the list_wf.htmpl. Sections have been added to allow for viewing details of the Change Order as well as viewing any Attachments on the Change Order. Both of these sections can be easily removed.

Click Here to download files, or copy syntax below.


<html lang="en"><HEAD>

<PDM_PRAGMA RELEASE=110>

<PDM_INCLUDE FILE=styles.htmpl>

<SCRIPT LANGUAGE="JavaScript">

var hdrTitle = "Change Workflow Detail";

var hdrTitleUpd = "Update Change Workflow";

var hdrTitleNew = "Create New Change Workflow";

</SCRIPT>

<PDM_INCLUDE FILE=std_head.htmpl >

<SCRIPT>

cfgDateFormat = "$date_format"

</SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/detail_form.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/arrow_button.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/check_submit.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/img_link.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/val_type.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/sitemods.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/attevts.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/convert_date.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/attmnt_upload.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript" SRC="$CAisd/scripts/upload.js"></SCRIPT>

<SCRIPT LANGUAGE="JavaScript">

<PDM_IF "$prop.form_name_3" == "ro">

var cfgAllowPopupResize = true;

var lnkid = -1;

var attdata = new Array();

</PDM_IF>

argPersistentID = "$args.persistent_id";

function unloadActions()

{

  if ( _dtl.edit )

  unload_check();

}

</SCRIPT>

</HEAD>

<BODY class=detailro onUnload="unloadActions()">

</SCRIPT>

<PDM_INCLUDE FILE=std_body.htmpl filename="Change Workflow">

<CENTER>

 

<INPUT TYPE=hidden NAME=FACTORY VALUE=wf>

<PDM_IF "$prop.form_name_3" == "edit">

<INPUT TYPE=hidden NAME=OP VALUE="UPDATE">

<PDM_IF 0 == $args.id>

<SPAN class=labeltext>You are not allowed to create a new Workflow</SPAN>

<PDM_ELSE>

<PDM_IF $args.id>

<INPUT TYPE=hidden NAME=SET.id  VALUE="$args.id">

</PDM_IF>

</PDM_IF>

</PDM_IF>

 

<SCRIPT LANGUAGE="JavaScript">

<PDM_MACRO NAME=dtlForm factory=wf button=false>

<PDM_IF "$prop.form_name_3" == "edit">

ImgBtnRow();

ImgBtnCreate("btn001", msgtext(208), "detailSave()", true, 120);

ImgBtnCreate("btncncl", msgtext(209), "cancel_update('$prop.form_name_2','$args.id','$args.NEXT_PERSID')", true, 120);

ImgBtnCreate("btn003", msgtext(400), "pdm_reset()", true, 120);

ImgBtnEndRow();

</PDM_IF>

</SCRIPT>

<PDM_IF "$prop.form_name_3" == "ro">

<PDM_IF "$args.status.allow_task_update" == "1" || "$args.status.code" == "COMP">

<PDM_FORM NAME="frmDTLRO">

<INPUT TYPE=hidden NAME=FACTORY VALUE=wf>

<INPUT TYPE=hidden NAME=SET.id  VALUE="$args.id">

<INPUT TYPE=hidden NAME=OP>

<SCRIPT LANGUAGE="JavaScript">

ImgBtnRow();

ImgBtnCreate("btn001", msgtext(513), "pdm_submit('frmDTLRO','UPDATE')", true, 120);

</SCRIPT>

</PDM_FORM>

</PDM_IF>

<SCRIPT LANGUAGE="JavaScript">

ImgBtnEndRow();

</SCRIPT>

</PDM_IF>

<SCRIPT>

<PDM_MACRO NAME=dtlStart>

<PDM_MACRO NAME=dtlStartRow>

<PDM_MACRO NAME=dtlReadonly hdr=Task attr="task.sym">

<PDM_MACRO NAME=dtlReadonly hdr=Assignee attr="assignee">

<PDM_IF "$prop.form_name_3" == "edit">

detailRowHdr("Status", 1 , "$args.REQUIRED_status");

var item = '<PDM_SELECT NAME=SET.status ESC_STYLE=HTML FACTORY=tskstat WF_FAC_FOR_TSKSTAT=wf SELECTED="$args.status" SELECTED_SYM="$args.status.COMMON_NAME">';

var ins_pos = item.indexOf("NAME=");

if (ins_pos > 0)

{

  _dtl.tabIndex++;

  item = item.substring(0, ins_pos) + " TABINDEX=" + _dtl.tabIndex + " " + item.substring(ins_pos, item.length);

}

detailSetRowData(item);

<PDM_ELSE>

<PDM_MACRO NAME=dtlReadonly hdr=Status attr="status.sym">

</PDM_IF>

<PDM_MACRO NAME=dtlStartRow>

<PDM_MACRO NAME=dtlTextbox hdr="Task Description" attr="description" size=70 colspan=4 rows=4 spellchk=yes>

 

<!-- BEGIN CHANGE DETAILS -->

<PDM_IF "$prop.form_name_3" == "ro">

<PDM_MACRO NAME=dtlStartRow>

<PDM_MACRO NAME=dtlReadonly hdr=Change# attr="chg.chg_ref_num">

<PDM_MACRO NAME=dtlReadonly hdr=Category attr="chg.category.sym">

<PDM_MACRO NAME=dtlReadonly hdr=Requestor attr="chg.requestor.combo_name">

<PDM_MACRO NAME=dtlReadonly hdr="End User" attr="chg.affected_contact.combo_name">

<PDM_MACRO NAME=dtlStartRow>

<PDM_MACRO NAME=dtlReadonly hdr="Change Description" attr="chg.description" colspan=4>

</PDM_IF>

<!-- END CHANGE DETAILS -->

 

<PDM_MACRO NAME=dtlEndTable>

</SCRIPT>

 

<!-- BEGIN CHANGE ATTACHMENTS -->

<PDM_IF "$prop.form_name_3" == "ro" && $args.chg.attachments.length != 0 >

<P>

<TABLE WIDTH=90%>

<SCRIPT>

document.writeln("<TR>");

document.write("<TH CLASS=detailro ALIGN=left VALIGN=top>Attachments");

document.writeln("</TH>");

document.writeln("</TR>");

<PDM_LIST SOURCE=args.chg.attachments>

attdata[++lnkid] = new Object();

attdata[lnkid].id = "$args.chg.attachments.id";

attdata[lnkid].attmnt_name = unescape('<PDM_FMT ESC_STYLE=JS2>$args.chg.attachments.attmnt_name</PDM_FMT>');

attdata[lnkid].orig_file_name = unescape('<PDM_FMT ESC_STYLE=JS2>$args.chg.attachments.orig_file_name</PDM_FMT>');

attdata[lnkid].status = "$args.chg.attachments.status";

<PDM_IF "$args.chg.attachments.link_only" != "1">

attdata[lnkid].cgi_path ="$args.chg.attachments.repository.servlet_path";

attdata[lnkid].protocol = "servlet";

attdata[lnkid].server = "$args.chg.attachments.repository.server";

attdata[lnkid].retrieve_path = "$args.chg.attachments.repository.retrieve_path";

attdata[lnkid].file_name = "$args.chg.attachments.file_name";

</PDM_IF>

document.writeln("<TR>");

document.write("<TD CLASS=detailro ALIGN=left VALIGN=top>");

var link = "<A HREF=\"javascript:download_exec(attdata[" + lnkid + "])\">";

document.write(link + '<PDM_FMT esc_style=c><PDM_FMT JUSTIFY=TRUNCATE WIDTH=40>$args.chg.attachments.attmnt_name</PDM_FMT></PDM_FMT></A>');

document.writeln("</TD>");

document.writeln("</TR>");

</PDM_LIST>

</SCRIPT>

</table>

</P>

</PDM_IF>

<!-- END CHANGE ATTACHMENTS -->

 

<PDM_MACRO NAME=dtlEnd>

<PDM_INCLUDE FILE=std_footer.htmpl>

</BODY>

</HTML>

<PDM_WSP>


Step 5. Clear the web cache

The final step is to clear Service Desk's cache. Publish your changes via the Web Screen Painter. The process of publishing automatically initiates a pdm_webcache.

R12 Go button Search Customization

 

From SDU

Jump to: navigation, search

 

To modify the GO button in CA Service Desk R12_1 with option to search for any ticket number without having to know if it is an incident, problem or request.

1. Create \\site\mods\majic\zrip.mod file and add the following code

OBJECT cr {

  FACTORY [factory name e.g zrip] {

  DOMSET template_list "template_name" "" DYNAMIC ;

  DOMSET zrip_list "open_date desc, ref_num desc" "" $NX_CR_LIST_VOLAT;

  STANDARD_LISTS {

  SORT_BY "open_date DESC, id DESC, status, priority DESC, ref_num" ;

  MLIST OFF ;

  RLIST OFF ;

  };

  REL_ATTR persistent_id ;

  COMMON_NAME ref_num ;

  FUNCTION_GROUP "call_mgr" ;

  } ;

  };

NOTE: the factory name will be what you want your table name to be. Example: the name of my table is zrip and the list is zrip_list. The table only exists in the Object Engine like tables ‘in’ and ‘pr’.

2. Restart Service Desk and the new table will appear in the Schema Designer.

3. Using Web Screen Painter (WSP) open ‘detail_web_form.htmpl’ and add the following line to ‘function get_go_sel_arr()’:

            sel_arr[idx++] = new go_element(“zrip”, “Any I/R/P Ticket”); 

4. Create a detail file for the newly created table e.g. detail_zrip.htmpl

5. Log into SD and select ‘Administration’ tab.

6. Click ‘Security and Role Management’ in the left pane

7. Click ‘Role Management’

8. Click ‘Web Forms’

9. Click ‘Create New’ button in right pane to open ‘Create New Web Form’ window

10. Fill out new form (see Fig. 1) and click ‘Save’ button.

       Image description 

11. Click on ‘Role List’ in left pane

12. Select the role that you want the go button menu to display the new menu option e.g. ‘Administrator’. This opens the ‘Administrator Role Detail’ form.

13. Click on ‘Go Resources’ tab.

14. Click on ‘Update Go Resources’ button. The ‘Web Form Search’ form is displayed

15. Click the ‘Search’ button to display the ‘Go Resource Assigned Update’ window.

16. Select the new menu option and click the ‘>>’ button (see Fig. 2).

         Image description 

17. Click ‘OK’ button. The new menu item is listed in the ‘Go Resource List’ of the ‘Go Resources’ Tab of the role. See Fig. 3.

         Image description 

18. Click the ‘Any I/R/P Ticket’ radio button and then click ‘Set Default’ button if you want it to be the default menu selection displayed in the go button.

Retrieved from "http://www.servicedeskusers.com/R12_Go_button_Search_Customization"

Overview

This article provides instructions for easily moving schema changes from one environment to another.

Procedures

Step 1. Make Schema Changes

From your source environment make the desired schema changes via the Schema Designer. Be sure to follow the proper protocol for publishing your schema changes.

Create configuration files using File - Save and Publish in Schema Designer's menu.

Step 2. Extract WSP Tables

pdm_extract wsptbl > wsptbl.txt pdm_extract -f "SELECT column_name,dbms_name,description,display_name,is_cluster,is_descending,is_indexed,is_local,is_not_null,is_order_by,is_required,is_skey,is_unique,is_write_new,is_wsp,last_mod_dt,on_ci_set,on_new_default,schema_name,status,string_len,table_name,type,xrel_table FROM wspcol" > wspcol.txt

Step 3. Copy Files

Copy the following files from the source to the destination environment:

  • $NX_ROOT/site/mods/majic/wsp.mods
  • $NX_ROOT/site/mods/wsp.altercol
  • $NX_ROOT/site/mods/wsp.altertbl
  • $NX_ROOT/site/mods/wsp_index.sch
  • $NX_ROOT/site/mods/wsp_schema.sch
  • wsptbl.txt (extract from previous step)
  • wspcol.txt (extract from previous step)

Step 4. Load Extracts

style="color:rgb(0, 0, 0);font-family:'Times New Roman';font-size:medium"

  • Start the Service Desk service

Optional Steps

If you want to save SCH and MOD changes in your own file with better name, follow these steps:

  1. Copy content of wsp.mods file to some *.mod in $NX_ROOT/site/mods/majic
  2. Copy content of wsp_schema.sch file to some *.sch in $NX_ROOT/site/mods
  3. Copy content of wsp_index.sch file to some *.sch in $NX_ROOT/site/mods
  4. Delete wsp.mods, wsp_index.sch and wsp_schema files

Because content of wsptbl and wspcol tables on destination server is pointless from now, we can purify these tables using this two commands:

pdm_load -rf wsptbl.txt pdm_load -rf wspcol.txt

Add Checkbox, Date, Drop-down, Lookup, Readonly and Text Fields to Properties

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

Format Properties Data Value

Please note that you will need to clear your web browser cache. Also, would suggest you to review the Notes section at the bottom of this document to fully understand the limitations associated with this customization including the fact that this is a not supported customization

Steps to activate the script file

Download sitemods File : Sitemods.zip

  1. Copy the sitemods.js file from $NX_ROOT/bopcfg/www/wwwroot/scripts to $NX_ROOT/site/mods/www/wwwroot/scripts
  2. Append the contents of the sitemods.js file included in the download to the end of sitemods.js on your system.
  3. Clear your web browser cache
  4. Open the Request Area, Change Order Category or Issue Category “Property Template Detail” form for any properties that you want to provide a selectable list of values (on the web interface)
  5. In the “Examples” field (“sample” attribute) enter following details to populate the corresponding html data control.
Sr NoControlSample ValueExample
1DateDT
2Lookup/SearchLU objectnameLU cnt
3CheckboxCH
4Text AreaTT
5Readonly FieldRD
6Drop-downDD value1, value2... valuenDD India, China, Australia
  • Once you save this information by clicking “Save”, your control will be active for any new Requests/Incidents/Problems that use the Area
  • Similarly in the customer or employee interface if a property is defined with custom sample argument the control will be visible accordingly.

Notes

No SUPPORT for this CUSTOMIZATION: This customization creates a new version of the following two (2) JavaScript functions:
  • function detailWriteProperty() JavaScript function from the detail_form.js file.
  • CategorySink.prototype.showProperties = function() JavaScript code from the cst_cat.js file.
  • If these functions ever be updated in a patch, the changes will not take effect unless someone goes and ports the changes manually. This will be user’s responsibility.
LIMITATIONS – Interface: This functionality is not designed for and does not work on the Java-based USD Client. It is only designed to work in the Web Interface of USD r11.2. Currently this functionality is limited to no of properties. It supports the property list up to 50.LIMITATIONS – Updating Properties settings: Any administrative changes that are made to the Properties after the Request Area has been attached to the Request will not take effect on existing requests unless the Request Area is removed and reattached. The same is true for Incidents, Problems, Change Orders and Issues respectively.

Testing

  • Tested and works with Internet Explorer
  • It’s not tested to work on earlier versions than r11.2 of USD.

Retrieved from "http://www.servicedeskusers.com/Add_Checkbox%2C_Date%2C_Drop-down%2C_Lookup%2C_Readonly_and_Text_Fields_to_Properties"

Overview

This article provides instructions for controlling the Request Areas that are visible to the End Users via the Employee Interface.

 

Procedures

Step 1. Create new field

 

r11.x Screenshot - Add Column

 

r11.x Screenshot - Add Column

The methods used to create new tables columns vary based on the Service Desk release.

For r11.x releases, follow these steps:

  1. Launch the Web Screen Painter then the Schema Designer
  2. Add a column per the image to the right.
  3. Save and Publish your Schema changes
  4. Stop the Service Desk service
  5. Run pdm_publish from a command line
  6. Start the Service Desk service

For older releases, follow these steps:

1. Create a .sch file with the following syntax and place it in the $NX_ROOT/site/mods directory. Name the .sch anything you like, but it is recommended that it be preceded with a 'z'.

TABLE Prob_Category { 
zemp_view     INTEGER REF Boolean_Table;
}

2. Create a .mod file with the following syntax and place it in the $NX_ROOT/site/mods/majic directory. Name the .mod anything you like, but it is recommended that it be preceded with a 'z'.

 

OBJECT pcat {

  ATTRIBUTES Prob_Category {

  zemp_view SREL bool

  REQUIRED

   {

  ON_NEW DEFAULT 0;

   };

  };

};

 

3. Run a pdm_extract command of the target table. Example:

pdm_extract Prob_Category > Prob_Category.txt 

4. Run the Configuration Utility and do not start the Service Desk services.

5. Run a build command of the target table. Example:

sqlbuild -p Prob_Category AHD "C:\Program Files\CA\Unicenter ServicePlus Service Desk\site\ddict.sch" 

6. Start the Service Desk services

7. Run a pdm_load command of the previously extracted data. Example:

pdm_load -f Prob_Category.txt -v 

Step 2. Publish the Schema changes

The methods used to publish schema changes vary based on the Service Desk release.

For r11.x releases, follow these steps:

  1. Save your Schema changes
  2. Stop the Service Desk service
  3. Run pdm_publish from a command line (Applicable if you made changes via WSP)
  4. Start the Service Desk service

For older releases recycle the Service Desk service.

Step 3. Modify detail_pcat.htmpl

Modify the detail_pcat.htmpl in the Analyst Interface by adding a checkbox.

<PDM_MACRO NAME=dtlCheckbox hdr="Employee View"  attr=zemp_view  on=Yes off=No>

For r11.x releases it is recommended that you edit your pages via the Web Screen Painter.

Step 4. Create the Data Partition Constraint

Create a VIEW Constraint on the Prob_Category table for the Employee Data Partition with the following syntax: zemp_view = 1

Step 5. Recycle the Service Desk Service

After recycling the Services, your Constraint will be active.

Overview

This article provides instructions for calculating the number of times a ticket is reopened.

Procedures

Step 1. Create new field

The methods used to create new tables columns vary based on the Service Desk release.

r11.x Screenshot - Add Column

 

r11.x Screenshot - Add Column

For r11.x releases, follow these steps:

  1. Launch the Web Screen Painter then the Schema Designer
  2. Add a column per the image to the right.
  3. Save and Publish your Schema changes
  4. Stop the Service Desk service
  5. Run pdm_publish from a command line
  6. Start the Service Desk service

style="color:rgb(0, 0, 0);font-family:'Times New Roman';font-size:medium"

  • Stop the Service Desk service
  • Start the Service Desk service

For older release recycle the Service Desk service.

 

1. Create a .sch file with the following syntax and place it in the $NX_ROOT/site/mods directory. Name the .sch anything you like, but it is recommended that it be preceded with a 'z'.

// Use TABLE Call_Req for Requests, Incidents & Problems

// Use TABLE Change_Request for Change Orders

// Use TABLE Issue for Issues

TABLE Call_Req {

  zreopen_count INTEGER;

}

 

2. Create a .mod file with the following syntax and place it in the $NX_ROOT/site/mods/majic directory. Name the .mod anything you like, but it is recommended that it be preceded with a 'z'.

 

 

/ Use OBJECT cr and ATTRIBUTE Call_Req for Requests, Incidents & Problems

// Use OBJECT chg and ATTRIBUTE Change_Request for Change Orders

// Use OBJECT iss and ATTRIBUTE Issue for Issues

OBJECT cr {

  ATTRIBUTES Call_Req {

  zreopen_count INTEGER

   {

  ON_NEW DEFAULT "0";

   };

   };

};

 

 

3. Run a pdm_extract command of the target table. Example:

pdm_extract Call_Req > Call_Req.txt

4. Run the Configuration Utility and do not start the Service Desk services.

5. Run a build command of the target table. Example:

sqlbuild -p Call_Req AHD "C:\Program Files\CA\Unicenter ServicePlus Service Desk\site\ddict.sch"

6. Start the Service Desk services

7. Run a pdm_load command of the previously extracted data. Example:

pdm_load -f Call_Req.txt -v

Step 2. Create the script

A script is created as an .spl file and placed in the $NX_ROOT/site/mods/majic directory. When the Service Desk service starts, the contents of the majic directory are processed and cached. You can use any naming scheme you like for your .spl file, but it is recommended that the file be preceded with a 'z' for easy identification as a custom file (eg zMyCompany.spl, zcr_scripts.spl, zMyScripts.spl).

 

// Use 'cr' for Requests, Incidents & Problems, 'chg' for Changes, and 'iss' for Issues

cr::zmyscript(...) {

int i, n;

if (is_null(zreopen_count)) {

i = 0;

} else {

i = zreopen_count;

}

n = i + 1;

send_wait(0, this, "call_attr", "zreopen_count", "set_val", n, "SURE_SET");

}

 

Step 3. Create the trigger

This step is to create the trigger that will initiate the script. The methods used to implement the trigger vary based on the Service Desk release.

For r11.x releases triggers are created via the Schema Designer utility. Simply add the following code as a Site-Defined Trigger to the cr (Request), chg (Change Order), or iss (Issue) table.

PRE_VALIDATE zmyscript() 111 FILTER(active{->1}); 

For older releases triggers are made by creating a .mod file and placing it in the $NX_ROOT/site/mods/majic directory. Name the .mod anything you like, but it is recommended that it be preceded with a 'z'.

 

// Use OBJECT cr for Requests, Incidents & Problems

// Use OBJECT chg for Change Orders

// Use OBJECT iss for Issues

OBJECT cr {

  TRIGGERS {

  POST_VALIDATE zmyscript() 111 FILTER(active{->1});

  };

};

 

Step 4. Publish the Schema changes

The methods used to publish schema changes vary based on the Service Desk release.

For r11.x releases, follow these steps:

  1. Save your Schema changes
  2. Stop the Service Desk service
  3. Run pdm_publish from a command line
  4. Start the Service Desk service

For older release recycle the Service Desk service.

SPELL CODE to to add event at 50% and 75% of the time between schedule start time and duration

 

From SDU

Jump to: navigation, search

 

SPELL - Cancel and Add events based on the scheduling time in CO in ServiceDesk Manager R12.5 

This code add 2 events to CO one that fires at 50% of the scheduled time and another at 75%.

The 50% starts at sched_start_time and fires at sched_start_time + duration /2 The 75% starts at sched_start_time and fires at sched_start_time + duration /4*3

Whenever there is a change this code check if there are similar events and cancel them.

STEP1

Trigger to add, create a z_my_event_sched_end_date.mod and put at $NX_ROOT/site/mods/majic with the following code, and restart the service desk:

OBJECT chg {

  TRIGGERS {

  POST_VALIDATE z_my_event_sched_end_date( persistent_id, sched_start_date, sched_end_date, sched_duration) 250 FILTER( EVENT("INSERT UPDATE") && active != 0 && sched_start_date != NULL && sched_duration >0);

  };

  };

STEP2

SPELL code create a z_my_event_sched_end_date.spl and put at $NX_ROOT/site/mods/majic with the following code and kill the process spel_srv or restart the servicedesk:


////////////////////////////////////////////////////////////////////////////////

// Module: z_my_event_sched_end_date.spl

// Created: 10-02-2011

// Author: ribru02@ca.com

////////////////////////////////////////////////////////////////////////////////

// Description:

//

// Spel to add event when sched_duration or sched_start_date are inserted or updated

// Add and remove fixed events. Add 2 events one to advise at 50% of the elapsed time and other for 75% of the elapsed time

// Starting the event at sched_start_time delaying it duration/2 (50% between start and end sechduled time)

// Starting the event at sched_start_time and delaying it duration/4*3 (75% between start and end sechduled time)

//

//Fired with the following trigger:

//OBJECT chg {

// TRIGGERS {

// POST_VALIDATE z_my_event_sched_end_date( persistent_id, sched_start_date, sched_end_date, sched_duration) 250 FILTER( EVENT("INSERT UPDATE") && active != 0 && sched_start_date != NULL && sched_duration >0);

// };

//};

//

////////////////////////////////////////////////////////////////////////////////

//History

//v1.0 - ribru02@ca.com - First version

////////////////////////////////////////////////////////////////////////////////

#define VERSION "v1.0"

 

 

// DEBUG 0 for no debug

// DEBUG 1 for debug

 

 

#define DEBUG 2

 

 

chg::z_my_event_sched_end_date (...)

{

////////////////////////////////////////////////////////////////////////////////

//vars

////////////////////////////////////////////////////////////////////////////////

  date schedule_start_date_old,schedule_start_date_new, schedule_start_date_75;

  duration duration_schedule_old,duration_schedule_new, duration_50, duration_75;

  string event_name_50, event_name_75, event_name_50_tmpl_persid,event_name_75_tmpl_persid;

  object atev_dob, atev_list, group_leader;

  string persistent_id,method;

  string wc;

  int atev_count, i;

 

  method = "z_my_event_sched_end_date"+"_"+ VERSION;

 

  persistent_id=argv[3];

  schedule_start_date_old = argv[5];

  schedule_start_date_new = argv[6];

  duration_schedule_old = argv[11];

  duration_schedule_new = argv[12];

   //UPDATE YOUR EVENTS HERE

  event_name_50= "Increase Priority base on scheduled time 50%";

  event_name_50_tmpl_persid="evt:7649776";

  event_name_75= "Increase Priority base on scheduled time 75%";

  event_name_75_tmpl_persid="evt:7649777";

 

 

////////////////////////////////////////////////////////////////////////////////

//Previous validation

//If there is no change in one of the field there is no calculation

///////////////////////////////////////////////////////////////////////////////

 

if (DEBUG) logf(SIGNIFICANT,"=========== START : %s %s:%s ===========",method,type,chg_ref_num);

if (DEBUG == 2) logf(SIGNIFICANT,"%s - CO nº %s - NºArgs: %s => %s = %s -> %s| %s = %s -> %s | %s = %s -> %s ", method, chg_ref_nuu

m, argv[0],argv[4], argv[5], argv[6], argv[7],argv[8], argv[9], argv[10], argv[11],argv[12]);

 

 

if (!((schedule_start_date_old == schedule_start_date_new) && (duration_schedule_old == duration_schedule_new)))

{

   //getting group leader

  send_wait(0, top_object(), "get_co_group");

  group_leader = msg[0];

   ////////////////////////////////////////////////////////////////////////////////

   //calculation metrics

   //fire 50% and new event fire 75% of time duration

   ////////////////////////////////////////////////////////////////////////////////

  duration_50=(duration)((int)duration_schedule_new/2);

  duration_75=(duration)((int)duration_schedule_new/4*3);

 

   ////////////////////////////////////////////////////////////////////////////////

   //debug Info

   ////////////////////////////////////////////////////////////////////////////////

 

////////////////////////////////////////////////////////////////////////////////

   //remove existing events before adding new ones

   ////////////////////////////////////////////////////////////////////////////////

 

// Identify the persids of the events to be deleted.

  wc = format("(event_tmpl = '%s' OR event_tmpl = '%s') AND obj_id = '%s' AND status_flag = 2", event_name_50_tmpl_persid,event_name_75_tmpl_persid,persistent_id);

  send_wait(0, top_object(), "call_attr", "atev", "sync_fetch", "STATIC", wc, -1, 0);

  atev_list = msg[0];

  atev_count = msg[1];

   if (DEBUG) logf(SIGNIFICANT, "%s - need to cancel %s event for CO %s", method, atev_count,chg_ref_num);

   if (atev_count > 0) {

   for (i=0;i<atev_count;i++) {

  send_wait(0, atev_list, "dob_by_index", "DEFAULT", i, i);

  atev_dob = msg[0];

  send_wait(0, group_leader, "checkout", atev_dob);

  send_wait(0, atev_dob, "cancel_me");

  send_wait(0, group_leader, "checkin");

   if (msg_error())

   {

  logf(ERROR, "%s - error cancelling event for CO %s - %s", method, chg_ref_num, msg[0]);

   }

   else

   {

   if (DEBUG) logf(SIGNIFICANT, "%s - successfully canceled event for CO %s", method, chg_ref_num);

   }

   }

   }

 

 

////////////////////////////////////////////////////////////////////////////////

   // Add events 50% and 75% of the duration time

   ////////////////////////////////////////////////////////////////////////////////

   if (DEBUG == 2) logf(SIGNIFICANT, "%s - Command executed in CO nº: %s to add event: %s - duration: %s - start_date 
%s"
, method, chg_ref_num,event_name_50,(duration)duration_75,(date)schedule_start_date_new);

  send_wait(0,top_object(),"call_attr","evt","new_attached_event", group_leader,persistent_id,event_name_50,(duration)duration_50,(date)schedule_start_date_new,"INCPRI",0,0,"");

   if (msg_error())

   {

  logf(ERROR, "%s - error new_attached_event failed for CO %s - %s", method, chg_ref_num, msg[0]);

   }

   else

   {

   if (DEBUG) logf(SIGNIFICANT, "%s - successfully new_attached_event for CO %s - %s", method, chg_ref_num, msg[0]);

   }

 

 

if (DEBUG == 2) logf(SIGNIFICANT, "%s - Command executed in CO nº: %s to add event: %s - duration: %s - start_date 
%s"
, method, chg_ref_num,event_name_75,(duration)duration_75,(date)schedule_start_date_new);

  send_wait(0,top_object(),"call_attr","evt","new_attached_event", group_leader,persistent_id,event_name_75,(duration)duration_75,(date)schedule_start_date_new,"INCPRI",0,0,"");

   if (msg_error())

   {

  logf(ERROR, "%s - error new_attached_event failed for CO %s - %s", method, chg_ref_num, msg[0]);

   }

   else

   {

   if (DEBUG) logf(SIGNIFICANT, "%s - successfully new_attached_event for CO %s - %s", method, chg_ref_num, msg[0]);

   }

 

 

  send_wait(0, group_leader, "checkin");

   if (msg_error())

   {

  logf(ERROR, "%s - Add event checkin failed for CO %s - %s", method, chg_ref_num, msg[0]);

  send_wait(0, group_leader, "uncheck");

   }

   else

   {

   if (DEBUG == 2) logf(SIGNIFICANT, "%s - Add event checkin successfull CO %s - %s", method, chg_ref_num, msg[0]);

   }

   }

   if (DEBUG) logf(SIGNIFICANT,"=========== END : %s %s:%s ===========",method,type,chg_ref_num);

 

 

 

 

Retrieved from "http://www.servicedeskusers.com/SPELL_CODE_to_to_add_event_at_50%25_and_75%25_of_the_time_between_schedule_start_time_and_duration"

Search Requests, Incidents, and Problems Simultaneously for Ticket Number

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This article provides instructions for implementing a customization that will allow searching for an Incident, Request, and Problem ticket number simultaneously via the Go Button Search.

Notice: This customization does NOT work for r12.

Procedures

Step 1. Create the new factory

This step is to create the factory that will allow for searching through all three ticket types.

Create a .mod file and placing it in the $NX_ROOT/site/mods/majic directory. Name the .mod anything you like, but it is recommended that it be preceded with a 'z'.

BJECT cr {

  FACTORY zallcrs {

  STANDARD_LISTS {

  SORT_BY "open_date DESC, id DESC, status, priority DESC, ref_num";

  MLIST OFF;

  RLIST OFF;

   };

  FUNCTION_GROUP "call_mgr";

  REL_ATTR persistent_id;

  COMMON_NAME ref_num;

  };

};

Step 2. Publish the Schema changes

Recycle the Service Desk service.

Step 3. Modify gobtn.html

For r11.x releases it is recommended that you edit your pages via the Web Screen Painter. For older releases you must edit the files directly. The default gobtn.html, located in$NX_ROOT\bopcfg\www\wwwroot\html, must be copied and placed in the $NX_ROOT\site\mods\www\wwwroot\html directory. Remember to edit the copy, never the original.

 

Search for the if (cfgAccessReqMgr) statement in gobtn.html and add the following:

html += "<OPTION VALUE='zallcrs.ref_num'>Reqs/Incs/Probs</OPTION>";

Step 4. Create a Detail and List page

The system expects both a detail and a list file for each factory. To fulfill this requirement we will create a new detail_zallcrs.htmpl and list_zallcrs.htmpl file. To simplify administration of these files, as well as the implementation of this customization, we will put only a single line of code in both files.

Entire content of detail_zallcrs.htmpl:
<PDM_INCLUDE FILE=detail_cr.htmpl>
Entire content of list_zallcrs.htmpl:
<PDM_INCLUDE FILE=list_cr.htmpl>

The PDM_INCLUDE is a redirect function. In both cases we are redirecting to the default Request pages.

Ensure the new files reside in the $NX_ROOT\site\mods\www\htmpl\web\analyst directory.

Step 5. Clear the web cache

The final step is to clear Service Desk's cache. The methods vary depending on release.

For r11.x releases publish your changes via the Web Screen Painter. The process of publishing automatically initiates a pdm_webcache.

For older releases execute pdm_webcache from a command prompt on the Primary Server. There is no need to run this command on the Secondary Servers.

Additional Considerations

You may find that you no longer have a need for the individual Incident, Problem and Request items in the drop-down.

You can remove these one of two ways 

A: At the role level detail you can add/remove go resources. Find the appropriate role detail page from the admin tab --> security and role management --> role management --> role list --> role. On the Go Resource tab remove the individual R/I/P items.

B: To remove them, simply comment out the entries as shown below from gobtn.html:

// if ( propIsITIL ) {

// html += "<OPTION VALUE='in.ref_num'>Incident</OPTION>";

// html += "<OPTION VALUE='pr.ref_num'>Problem</OPTION>";

// }

// html += "<OPTION VALUE='cr.ref_num'>Request</OPTION>";

Retrieved from "http://www.servicedeskusers.com/Search_Requests%2C_Incidents%2C_and_Problems_Simultaneously_for_Ticket_Number"

URLS for Computer Telephony Integration (CTI)

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This Article contains the URLs that can be used for launching Service Desk for a CTI implementation.

Examples

In the examples below, replace the data in the brackets.

Open an existing Request

http://[SERVER]/CAisd/pdmweb.exe?OP=SEARCH+FACTORY=cr+SKIPLIST=1+QBE.EQ.ref_num=[Ticket Number] 

Creating a new Request

http://[SERVER]/CAisd/pdmweb.exe?OP=CREATE_NEW+FACTORY=cr+PRESET_REL=customer:cnt.id:userid:[USERID] http://[SERVER]/CAisd/pdmweb.exe?OP=CREATE_NEW+FACTORY=cr+PRESET_REL=customer:cnt.id:contact_num:[contact_num] 

Launch the Profile Browser

http://[SERVER]/CAisd/pdmweb.exe?OP=JUST_GRONK_IT+HTMPL=profile_browser.htmpl+FACTORY=cnt+PERSID=cnt:xxxxxxxxxxxxxxxxx 

R11.2 Requires cumulative patch QO91539 for the above URL to work.

http://[SERVER]/CAisd/pdmweb.exe?OP=JUST_GRONK_IT+HTMPL=profile_browser.htmpl+FACTORY=cnt+PERSID=cnt:userid:[USERID] 

Open an existing Contact

http://[SERVER]/CAisd/pdmweb.exe?OP=SEARCH+FACTORY=cnt+SKIPLIST=1+QBE.EQ.userid=[USERID] http://[SERVER]/CAisd/pdmweb.exe?OP=SEARCH+FACTORY=cnt+SKIPLIST=1+QBE.EQ.id=[ID] 

Retrieved from "http://www.servicedeskusers.com/URLS_for_Computer_Telephony_Integration_%28CTI%29"

SPELL CODE to Make ACT / EVT INTERNAL

 

From SDU

Jump to: navigation, search

 

The requirement is that whenever an event / activity is performed - e.g. SLA VIOLATION - then that activity should be logged as Internal so that Employees would not be able to view it. If new activities are added - e.g. UPDATE FIELD - to ticket (CR) who's SLA is already violated then log that activity as Internal. To achieve the above requiremtn I have written two mod and spel files.

  1. MOD File (zactint.mod)
MODIFY alg POST_VALIDATE zevt_set() 125 FILTER( EVENT("INSERT")) ; 
  1. SPEL File (zactint.spl)

//method zevt_set()

//Sets the EVENT of SDMr12.1 as internal =>1

//author: adi : adi_g001@yahoo.com

//********************************************************

 

alg::zevt_set( ... ) {

  logf(SIGNIFICANT, "SPELL zevt_set %s",type.code);

if(type.code == "EVT")

{

send_wait(0, this, "call_attr", "internal", "set_val", 1,"SURE_SET");

if ( msg_error() ) {

  logf(ERROR, "Error initializing object:%s",msg[0]);

return;

  }

}

logf(SIGNIFICANT, "SPELL zevt_set %s",internal);

}


Save the above files in $NXOOT/site/mods/majic folder and bounce the SDMr12.1 services.


--Mitu 01:54, 31 January 2010 (MST) Of course, it is much simpler to actually mark the 'Event Occured' Activity type as Internal from the Administration ('Notifications->Activity Notifications') and no customization is needed.

Retrieved from "http://www.servicedeskusers.com/SPELL_CODE_to_Make_ACT_/_EVT_INTERNAL"

Conditional Display of Drop-Down Content

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This article provides instructions on how to put a parameter on a drop-down list to allow for a unique list of options for each ticket type. The customization is ideal for shared codes that are used by multiple ticket types, such as Priority. Priority will be used in the example that follows.

Procedures

Step 1. Edit the desired htmpl form

The dtlDropdown PDM_MACROs support the addition of a whereclause to further qualify the results. For example, if your Priority scale is something like 1-Emergency, 2-High, 3-Medium, 4-Low, usewhereclause="(sym ='3-Medium') or (sym ='4-Low')" if you wish to only show the 2 lowest options. To implement this logic simply look for the following syntax:

<PDM_MACRO NAME=dtlDropdown hdr="Priority" attr=priority lookup=no evt="onBlur=\\\"detailSyncEditForms(this)\\\"">

...then add the whereclause to it. The result should look like this:

<PDM_MACRO NAME=dtlDropdown hdr="Priority" attr=priority lookup=no evt="onBlur=\\\"detailSyncEditForms(this)\\\"" whereclause="(sym ='3-Medium') or (sym ='4-Low')">

A change such as this will allow you to have options that are tailored to the ticket type.

While I used the sym values in the example above, I would recommend actually using the id, enum, persid, or code value that is actually saved to the ticket. Whenever a sym or name field is referenced there is always the chance of the sym/name being changed and thus requiring updates to your customizations.

For r11.x releases it is recommended that you edit your pages via the Web Screen Painter. For older releases you must edit the files directly.

Step 2. Clear the web cache

The final step is to clear Service Desk's cache. The methods vary depending on release.

For r11.x releases publish your changes via the Web Screen Painter. The process of publishing automatically initiates a pdm_webcache.

For older releases execute pdm_webcache from a command prompt on the Primary Server. There is no need to run this command on the Secondary Servers.

Retrieved from "http://www.servicedeskusers.com/Conditional_Display_of_Drop-Down_Content"

How To Manage Spell-Based Macros

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

CA does not provide a GUI supported method for creating or modifying Condition Macros or Action Macros. However, the function that these types of Macros provides can be crucial. This article explains the steps to take for creating new or editing existing. Keep in mind, CA does not support any changes to the default Action Macros or Condition Macros and will not support any that you create. It is also highly recommended that you never modify the defaults, but rather copy them and create your own custom ones.

Procedures

Step 1. Extract a Sample Macro

The first step is to extract a macro from the system and use this as guide. Take note of the macro's name the enter the following command:

pdm_extract -f "SELECT del,fragment,lock_object,ob_type,sym,type FROM Spell_Macro WHERE sym = 'sample macro name'" > yourfile.txt

Step 2. Add Your Script

Now that you have the sample macro extracted from the system, modify the contents of the 'fragment' column to suit your scripting needs. Remember to use \\0012 for your carriage returns and \ to cancel out the double quotes in your script.

Also, be sure to change the value of the 'sym' column or your new macro will not be loaded.

Step 3. Load New Macro

Run the following command to load your new macro into the system:

pdm_load -f yourfile.txt -i -v

Step 4. Extract New Macro for Additional Changes

Run the following command to extract your new macro if additional changes are required:

pdm_extract -f "SELECT * FROM Spell_Macro WHERE sym = 'sample macro name'" > yournewfile.txt

Step 5. Uploading Changes

Run the following command to extract your new macro if additional changes are required:

pdm_load -f yournewfile.txt -v

Notice there is no -i this time. A -i is only used when "inserting" a new macro, not when editing an existing one.

Retrieved from "http://www.servicedeskusers.com/How_To_Manage_Spell-Based_Macros"

Yellow Pages:Xtraction Solutions

 

From SDU

Jump to: navigation, search

 

 

 

 

 

Drag-and-drop dashboards and reports for CA Service Desk, Portfolio Manager, Asset Management, CMDB, and more...

 

Xtraction for Service Desk

Create dashboards and reports with less time, less effort and less cost. Elevate your service management capabilities and take control of reporting and dashboard creation. Xtraction for Service Desk allows you to create and interact with visually rich dashboards. The Self-service drag-and-drop design removes dependence and bottlenecks with specialized technical skills and database knowledge.

How Xtraction will help you:

  • Dramatically reduce time to create dashboards and share to other users.
  • ITIL aligned Continual Service Improvement can begin - anyone can use Xtraction.
  • Extend to multiple data sources to allow disparate data on same dashboards
  • Security layer allows control over user access to data sources and dashboard folders.
You can build simple or complex dashboards from the data fields which are presented as 'building blocks' ready to drag into the dashboard. With an extremely intuitive GUI and interactive approach, Xtraction allows simple 'click into' data for more focused drill-down analysis.
*** Click to request free trial *** setup takes less than 1hour
We offer an integrated software solution that will revolutionize your reporting and dashboard abilities for CA Service Desk.
Related documents:
Xtraction - Quick Facts:
  • Real-time, interactive status dashboards—drill-down and slice the information
  • Remove ongoing costs of services engagements
  • Export to pre-formatted MS Word templates [1]
  • Installed in minutes — immediate realization of value
  • Closely align with ITIL best practices and SOX audit compliance
  • Browser accessible, no client software

Contact us for a demonstration or trial of Xtraction for Service Desk.
USA: +1 855 498 7228
Australia: +61 1300 987 228
Email: sales@xtractionsolutions.com
www.xtractionsolutions.com

Retrieved from "http://www.servicedeskusers.com/Yellow_Pages:Xtraction_Solutions"

Command-Line Interface

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

These are notes I made re using the command line interface with v6, I have no idea if they will relate to r11 but would not expect the command line interface to have changed.

Please excuse the format but trying to manage wiki formatting with all the -'s and %'s was too painful.

Details

The quickest summary of the command can be obtained by using the standard -h help switch

>pdm_text_cmd -h pdm_text_cmd: Text API Command Line Interface - Sends text commands to Text API Daemon.

Usage: pdm_text_cmd -t table { -u from_userid | -p from_persid } [-o operation] [-f input_file] [-T timeout] [-h] Where:

 -t = Table to process. -o = Operation to perform. Valid: NEW|UPD|UPDATE|UPDO|UPDATE_ONLY. Default: NEW -f = File to process. Default is to use STDIN. -u = Cmd from userid. -p = Cmd from persid. -T = Time out in seconds. -h = This help. 

Table and Operation parameters are case-insensitive. Valid Table values are listed in the Options section of the text_api.cfg file.

Valid tables are: ASSET CHANGE CONTACT ISSUE REQUEST

If no parameters are defined in file all text is assumed to be description.

Summary is created as first 60 characters of description if not otherwise set.

Will default assignee where requestor is an analyst.

Parameters can be specified as below in file

>pdm_text_cmd -t REQUEST -u st00002 -f pdm_text_cmd.text (default operation is NEW)

where pdm_text_cmd.text is %SUMMARY=My Summary %DESCRIPTION=Please fix the problem I've described in the description %PRIORITY=3 %CUSTOMER=mparssey %CATEGORY=Hardware %ASSIGNEE=agrainger

To update an existing record >pdm_text_cmd -t REQUEST -u mparssey -o UPDATE -f change_status.txt

where change_status.txt is %SEARCH=REQUEST_ID %REQUEST_ID=102953 %STATUS=Work In Progress

where you can write %SEARCH=keyword1;keyword2;keyword3 %keyword1=value1 %keyword2=value2 %keyword3=value3 %keyword4=new value1 %keyword5=new value2 %keyword6=new value3

You can add multiple requests to a file using %%%%% as the separator.

Retrieved from "http://www.servicedeskusers.com/Command-Line_Interface"

Cnt.get members to notify by persid

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This method gets a list of members with Notify flag set ON for specified group .

This action can be called in spell code in method send_wait (or send) using call_attr action.

Usage

void send_wait (int timeout, object top_object, "call_attr", "cnt", "get_members_to_notify_by_persid", contact_persid)
  • timeout - how long (in seconds) should the method wait for finishing the method (0 means infinite [no timeout] and is generally the value used)
  • top_object - root object for the method (on which the method is called)
  • contact_persid - persistent ID of a group for which members you are looking for

Results

success or failure is tested with msg_error() (boolean function)On success the resulted list is filled into a global array msg as follows:
  • msg[0] - the number of assigned groups
  • msg[1] - one string with a list of member persistent IDs separated by spaces (" ")
On failure
  • msg[0] - failure reason

Examples


int i;

send_wait(0, top_object(), "call_attr", "cnt", "get_members_to_notify_by_persid", "cnt:776B094702EABB4B87F04A139E72D44B");

if( msg_error()) {

  logf (ERROR, "failure in send_wait ..... .Reason: %s",msg[0]);

} else {

  string member_persids[msg[0]];

  split(member_persids, msg[1], " ");

   for (i=0;i<msg[0];i++) {

  logf (SIGNIFICANT, "Notify %s", member_persids[i]);

   }

}

 

 

string notify_list;

send_wait(0, top_object(), "call_attr", "cnt", "get_members_to_notify_by_persid", msg_target);

if (msg_error()) {

  logf(ERROR, "%s: Error in get_members_to_notify_by_persid(%s)", method, msg_target);

   return 1;

} else {

  notify_list = msg[1] + " " + msg_target;

}

 

logf(TRACE, "%s: Going to notify these users: %s", method, notify_list);

send_wait(0, top_object(), "call_attr", "cnt", "notify_list", notify_list, msg_level, msg_title, msg_body, "" /* msg_ack */,

  tran_pt, ticket, is_internal, 0 /* cmth_override */);

 

 

 



Retrieved from "http://www.servicedeskusers.com/Cnt.get_members_to_notify_by_persid"

Time-based Stored Queries

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Details

Time-Base Queries are used in Stored Queries to make DateTime WHERE clauses possible. This is partly described in Unicenter Service Desk Modification Guide in the chapter 4. Customization of Queries and Messages.

You can use an exact date in the Time-Based Stored Queries or counted time using one of these 2 functions:

StartAtTime (timespan-name)

returns begin of the timespan's period.

EndAtTime (timespan-name)

returns end of the timespan's period.

Caution: Time-based stored queries recalculate timespans only when Trigger Time Milestone occured.

Timespans

Timespans are simple string values (so must be enclosed in simple quotes leaded by backslash). They are defined in a special enumeration table, which can be out-of-the-box found in Administration tab -> Service Desk -> Application Data -> Codes -> Timespans.

Each timespan has 3 milestones which are connected to current time:

  • Start Time - beginning of the timespan period
  • End Time - end of the timespan period
  • Trigger Time - this milestone guides how often is time value recalculated in a stored query

You can define exact values (ie. 2008 for year, 4 for month, 3 for day and so on) into the time parts or relative differences against current value (ie. +1 or -5 and so on).

Out-of-the-box timespans

Here are list of predefined timespan names, but you can create new ones if you need. Examples assume actual date and time is 26.6.2008 11:07.

NameStartAtTimeEndAtTimeComment
AFTER_NOON26.6.2008 12:0027.6.2008 00:00
BEFORE_NOON26.6.2008 00:0026.6.2008 12:00
LAST_HOUR26.6.2008 10:0726.6.2008 11:07
LAST_MONTH1.5.2008 00:001.6.2008 00:00full previous month
LAST_YEAR1.1.2007 00:001.1.2008 00:00full previous year
PAST_HOUR26.6.2008 10:0726.6.2008 11:07Current time -1 hour
PAST_DAY25.6.2008 11:0726.6.2008 11:07Current time -1 day
PAST_WEEK19.6.2008 11:0726.6.2008 11:07Current time -7 days
PAST_MONTH26.5.2008 11:0726.6.2008 11:07Current time -30 days
PAST_YEAR26.6.2007 11:0726.6.2008 11:07Current time -1 year
THIS_HOUR26.6.2008 11:0026.6.2008 11:07
THIS_MONTH1.6.2008 00:0026.6.2008 11:07
THIS_MONTH_LAST_YEAR1.6.2007 00:001.7.2007 00:00
TODAY26.6.2008 00:0026.6.2008 11:07
TODO_TODAY26.6.2008 11:0727.6.2008 00:00used in TO DO and callback stored queries
TTV_THRESHOLD26.6.2008 11:0727.6.2008 00:00Use this to define the query used by the Option 'ttv_highlight'. See the readme for that Option for more information.
YESTERDAY25.6.2008 00:0026.6.2008 00:00

See Also

Stored Queries

Unicenter Service Desk Modification Guide page 70.

Retrieved from "http://www.servicedeskusers.com/Time-based_Stored_Queries"

 

Summary CA SDM Scoreboard 

Changing Error Alert Color and adding Error Alert Pop-ups

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

Our analysts complained that they were loosing tickets because USD displayed error messages in the same color, yellow, as successful save messages. The analysts would miss the error message and the click “Close Window” button thinking that the ticket was created.
We had an issue open with CA, and their advice was to change BACKGROUND-COLOR for alertmsg class in styles_ahd.css. Of course, that would not do us any good, because it would apply to successful save messages as well.
I made modifications to a couple of java script functions to change this behavior. Originally I did two things: made the color of the error messages red, and in addition to that, displayed the same error message in a pop-up. In the end we decided that red was too much, since we now have the pop-up. But at least we know how to change the color, if we want to.
There are two different scenarios that lead to displaying of an alert message. If you want your color change to affect both scenarios, you will have to customize two Java script functions.

 

The 1st scenario is triggered when an unconditionally required field (i.e. defined as required at the schema level) is not filled in. The function showAlertMsg() is called in this case, and that’s the one we need to modify. This scenario is covered by Part I of this article.

 

The 2nd scenario is when either data partition constraints or SPL triggers enforce data validation. In this case, endDetail() is the function that needs to be modified. The details are provided in Part II of the article

 

Please note that this change will affect all detail forms in all interfaces in USD, not only tickets for analysts.

Part I. Alerts for unconditionally required fields

Step 1. Create sitemods.js

If you don’t have sitemods.js in $NX_ROOT\site\mods\www\wwwroot\scripts, copy it from $NX_ROOT\bopcfg\www\wwwroot\scripts.

Step 2. Add showAlertMsg() function to sitemods.js

Copy function showAlertMsg() from $NX_ROOT\bopcfg\www\wwwroot\scripts\detail_form.js and paste it into $NX_ROOT\site\mods\www\wwwroot\scripts\sitemods.js
Note: Any patches/updates to showAlertMsg() in $NX_ROOT\bopcfg\www\wwwroot\scripts\detail_form.js must be manually ported to showAlertMsg() in $NX_ROOT\site\mods\www\wwwroot\scripts\sitemods.js

Step 3. Modify showAlertMsg() in sitemods.js

If you want to change the color of the error messages, add this line:

alertmsg.style.backgroundColor="red";

If you want error messages to be displayed in a pop-up, remove the condition that prevents pop-up for Analyst Interface.
Original code:

if ((ahdtop.cstUsingScreenReader||ahdtop.cfgUserType!="analyst")&&(typeof popup_alertmsg!="boolean"||popup_alertmsg))

Modified code:

if (typeof popup_alertmsg!="boolean"||popup_alertmsg)

Step 4. Clear your Web browser cache

Clear your Web browser cache to test (no need to recycle USD)

Example Modified showAlertMsg()

function showAlertMsg(msg,popup_alertmsg)

{

  e=document.getElementById("alertmsgText");

  if(e!=null&&typeof msg=="string"&&msg.length>0)

  {

   if(typeof AlertMsg!="string")

  AlertMsg="";

   if(AlertMsg.length>0)

  AlertMsg+="<BR>"+msg;

   else

  AlertMsg=msg;

   if(e.innerHTML!=AlertMsg)

   {

  e.innerHTML=AlertMsg;

   // Commented out the original condition that prevents popups for analyst interface, and replaced it with a simplified one.

   //if ((ahdtop.cstUsingScreenReader||ahdtop.cfgUserType!="analyst")&&(typeof popup_alertmsg!="boolean"||popup_alertmsg))

   if (typeof popup_alertmsg!="boolean"||popup_alertmsg) 

   {

   var popupMsg=AlertMsg.replace(RegExp("<BR>","gi"),"\\n")

  .replace(RegExp('\n',"g"),"\\n")

  .replace(RegExp('"',"g"),'\\"');

  window.setTimeout('alert("'+popupMsg+'")',5);

   }

   }

   var alertmsg=document.getElementById("alertmsg");

   if(alertmsg!=null&&alertmsg.style.display!="block")

   {

  alertmsg.style.display="block";

   // Change color for the message within the page, in addition to the popup

  alertmsg.style.backgroundColor="red";

  adjScrollDivHeight();

   }

  }

}

Part II. Alerts for data constraint and spell trigger validations

Step 1. Add endDetail() function to sitemods.js

Copy function endDetail() from $NX_ROOT\bopcfg\www\wwwroot\scripts\detail_form.js and paste it into $NX_ROOT\site\mods\www\wwwroot\scripts\sitemods.js
Note: Any patches/updates to endDetail() in $NX_ROOT\bopcfg\www\wwwroot\scripts\detail_form.js must be manually ported to endDetail() in $NX_ROOT\site\mods\www\wwwroot\scripts\sitemods.js

Step 2. Modify endDetail() in sitemods.js

If you want to change the color of the error messages, find line

e.style.display="block";

and add the following under it:

if (AlertMsg.substr(0,15) != "Save Successful") e.style.backgroundColor="red";

If you want error messages to be displayed in a pop-up, find line

if(typeof e=="object"&&e!=null){

and add the following code under it:

if (AlertMsg.substr(0,15) != "Save Successful")  // prevent popup for success messages 

   {

   var popupMsg=AlertMsg.replace(RegExp("<BR>","gi"),"\\n")

  .replace(RegExp('\n',"g"),"\\n")

  .replace(RegExp('"',"g"),'\\"');

  window.setTimeout('alert("'+popupMsg+'")',3);

   }

Step 3. Clear your Web browser cache

Clear your Web browser cache to test (no need to recycle USD)

Example Modified endDetail()

function endDetail()

{

  detailEndRow();

  var out="";

  if(_dtl.tableStarted)

  out="</TABLE>\n";

  if(_dtl.formStarted)

  out+="</FORM>";

  docWriteln(out);

  _dtl.tableStarted=false;

  if(typeof AlertMsg=="string"&&AlertMsg.length>0)

  {

   var e=document.getElementById("alertmsgText");

   if(typeof e=="object"&&e!=null){

   // Popup alert with same text that is displayed in alertmsg area of the form

   if (AlertMsg.substr(0,15) != "Save Successful")  

   {

   var popupMsg=AlertMsg.replace(RegExp("<BR>","gi"),"\\n")

  .replace(RegExp('\n',"g"),"\\n")

  .replace(RegExp('"',"g"),'\\"');

  window.setTimeout('alert("'+popupMsg+'")',3);

   }

 

  e.innerHTML=AlertMsg;

  e=document.getElementById("alertmsg");

  e.style.display="block";

   // display alert in red

   if (AlertMsg.substr(0,15) != "Save Successful")

  e.style.backgroundColor="red";

  adjScrollDivHeight();

   }

  }

  if(typeof _dtl.firstField=="string")

  {

  _dtl.firstField=document.getElementById(_dtl.firstField);

   if(_dtl.firstField!=null)

   {

  _dtl.onload=window.onload;

  window.onload=detailOnload;

   }

   else if(_dtl.edit)

  _dtl.form[0].style.display="block";

  }

  if(_dtl.center)

  docWriteln("</CENTER>");

  if(typeof ahdtop=="object"&&typeof ahdtop.detailForms=="object"

  &&(typeof alg_factory!="string"||alg_factory==propFactory))

  {

   if(typeof argPersistentID=="string"&&argPersistentID.length>0)

  ahdtop.detailForms[argPersistentID]=window.parent;

   if(propFactory=="chg"&&typeof argChgRefNum=="string")

  ahdtop.detailForms["chg"+argChgRefNum]=window.parent;

   else if((propFactory=="cr"||propFactory=="iss")&&typeof argRefNum=="string")

  ahdtop.detailForms[propFactory+argRefNum]=window.parent;

  }

  if(_dtl.spellchk)

  {

  do_hiddenfm('spell_form','main_form');

  }

} // endDetail()

Retrieved from "http://www.servicedeskusers.com/Changing_Error_Alert_Color_and_adding_Error_Alert_Pop-ups"

Pdm publish

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This command is used to update the DBMS and data dictionary with schema changes published by the Web Screen Painter. The Service Desk Service must be stopped in order to run this command.

Retrieved from "http://www.servicedeskusers.com/Pdm_publish"

Get attr vals

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

Get values of attributes on the root object.

Usage

get_attr_vals(int count, [ string attr_path... ])

  • count - number of attributes to get. It must corresponds to the number of attr_path parameters
  • attr_path - name of the attribute with dot convention (you can ask for value also on subsidiary objects)

Result

You can found values in msg array on a triplicate position (first value is on msg[3], second on msg[6] and so on)

Examples

  • get first name, last name and email from CR's customer

send_wait (0, this, "get_attr_vals", 3, "customer.first_name", "customer.last_name", "customer.email");

cstName = msg[3];

cstSurname = msg[6];

cstEmail = msg [9];

Retrieved from "http://www.servicedeskusers.com/Get_attr_vals"

Get val Spell method

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This method gets value of some single (not REL) attribute and returns it. It also preserves datatype of column. It is suitable for accessing attributes with reserved name (bool, function, class...), n-th item of multivalue (group.member_list.0.combo_name) or dynamic reading, where attribute name is in variable.

This action can be called in spell code in method send_wait for call_attr.

Usage

void send_wait (int timeout, object top_object, "call_attr", string attr_name, "get_val")
  • timeout - how long (?in seconds?) should the method wait for finishing the method (0 means infinite)
  • top_object - object where the attribute is placed
  • attr_name - name of attribute which value should be get

Results

On success attribute value is in the first position of global array msg.

retval = msg[0];

Examples

// Part of code to read group members

for( iLoop = 0; iLoop < member_count; iLoop++ ) {

  send_wait(0, some_group, "call_attr", format("member_list.%d.combo_name",iLoop), "get_val");

   if (msg_error()) {

  logf(ERROR, "%s: error in get_val: %s", method, msg[0]);

   continue;

   }

  member_name = msg[0];

  ....

}

Retrieved from "http://www.servicedeskusers.com/Get_val_Spell_method"

Display Buttons for Group members only

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This article describe in example how to simply show a button (or anything else, button code of course can be easily changed) on page only for members of group filled in ticket.

Code

We need to show button Take, which change status from Assigned to Work in progress and set Assignee to logged in user, but this button must be shown only for members of a group filled in ticket. Here is a solution for Incident object, but for change object is the solution very similar:

<PDM_IF "$cst.group_list.length" \> "0">

// check if logged user is in ticket's group

if (false // to prevent || operator as a first literal in command, add this "non-sense" literal (false) to if condition

<PDM_LIST PREFIX="list" FACTORY="grpmem" WHERE="member = U'$cst.id'">

|| '$list.group' == '$args.group'

</PDM_LIST>

) {

// this is ticket on one of my groups and isn't mine, so draw Take/Control button

popupURLtk = '$cgi?SID=$SESSION.SID+FID=' + fid_generator() +

'+FACTORY=cr+PERSID=$args.persistent_id+OP=UPDATE+ACTIVITY_LOG_TYPE=ST+HTMPL=xfer_take_cr.htmpl';

ImgBtnCreate('take', 'Take', "popupActivityWithURL(popupURLtk, 'status')", true, 120);

}

</PDM_IF>

Retrieved from "http://www.servicedeskusers.com/Display_Buttons_for_Group_members_only"

Get dob Spell method

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This method loads from database an object connected over SREL relation to an another object and return it as full DOB object.

This action can be called in spell code in method send_wait for call_attr.

Usage

void send_wait (int timeout, object top_object, "call_attr", string attr_name, "get_dob")
  • timeout - how long (?in seconds?) should the method wait for finishing the method (0 means infinite)
  • top_object - object where the attribute is placed
  • attr_name - name of SREL attribute

Results

On success attribute DOB object is in the first position of global array msg.

object retval; retval = msg[0];

Examples

// Part of code to read request Affected End User

send_wait(0, this, "call_attr", "customer", "get_dob");

if (msg_error()) {

  logf(ERROR, "%s: error in get_dob(customer): %s", method, msg[0]);

   return;

}

object aff_eu;

aff_eu = msg[0];

....

Retrieved from "http://www.servicedeskusers.com/Get_dob_Spell_method"

Pdm d refresh

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This utility is used to selectively start, stop and restart sets of daemons while the daemon manager is running. It does not start or stop the daemon manager.

Usage

pdm_d_refresh [-h] [-s] [-r] [-c] [-x] set_name

If -r or -h are not specified then all stopped daemons in the current set will be started.

If only a set_name is specified then only the stopped daemons in this set are started.

CommandDescriptionRemarks
-hHelp
-sStart daemon setset_name optional
-rShuts down daemons and daemons dependentsset_name optional
-cChange to set_name on these daemons. And restarts
-xStops daemons and daemons dependent on these daemons. If set_name is not given all daemons will be stoppedset_name optional

Examples

  • Start all stopped daemons
pdm_d_refresh 

Retrieved from "http://www.servicedeskusers.com/Pdm_d_refresh"

Modify Action and Condition Macros via the GUI

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This article provides instructions on how to modify Action and Condition Macros via the Web Client.

Notice: CA does not support modifications to any default Action or Condition Macros, nor do they support the creation of any custom Action or Condition Macros.

Procedures

Step 1. Edit the detail_macro.htmpl form

Look for the following PDM_IF:

<PDM_IF "$args.type" == "ACT" || "$args.type" == "COND"> //Action and Condition Macros

Shortly after you will see the following:

<PDM_MACRO NAME=dtlReadonly  hdr="Macro Type Description"  attr=type.description colspan=3> <PDM_MACRO NAME=dtlStartRow> <PDM_MACRO NAME=dtlReadonly  hdr="Macro Code"  attr=usr_string1 colspan=3>

Simply replace the above lines with the following:

<PDM_MACRO NAME=dtlTextbox  hdr="Macro Type Description"  attr=type.description colspan=3> <PDM_MACRO NAME=dtlStartRow> <PDM_MACRO NAME=dtlTextbox  hdr="Macro Code"  attr=usr_string1 rowspan=10 size=60 colspan=3>

Simply replace the above lines with the following for R12.6:

<PDM_MACRO NAME=dtlTextbox  hdr="Macro Type Description"  attr=type.description size=80 colspan=4> <PDM_MACRO NAME=dtlStartRow> <PDM_MACRO NAME=dtlTextbox  hdr="Macro Code"  attr=usr_string1 rows=20 size=80 colspan=4>


For r11.x releases it is recommended that you edit your pages via the Web Screen Painter.

Step 2. Clear the web cache

The final step is to clear Service Desk's cache. Publish your changes via the Web Screen Painter. The process of publishing automatically initiates a pdm_webcache.

Retrieved from "http://www.servicedeskusers.com/Modify_Action_and_Condition_Macros_via_the_GUI"

R12 Go button Search Customization

 

From SDU

Jump to: navigation, search

 

To modify the GO button in CA Service Desk R12_1 with option to search for any ticket number without having to know if it is an incident, problem or request.

1. Create \\site\mods\majic\zrip.mod file and add the following code

            OBJECT cr { FACTORY [factory name e.g zrip] { DOMSET template_list "template_name" "" DYNAMIC ; DOMSET zrip_list  "open_date desc, ref_num desc" "" $NX_CR_LIST_VOLAT; STANDARD_LISTS { SORT_BY "open_date DESC, id DESC, status, priority DESC, ref_num" ; MLIST OFF ; RLIST OFF ; }; REL_ATTR persistent_id ; COMMON_NAME ref_num ; FUNCTION_GROUP "call_mgr" ; } ; }; 

NOTE: the factory name will be what you want your table name to be. Example: the name of my table is zrip and the list is zrip_list. The table only exists in the Object Engine like tables ‘in’ and ‘pr’.

2. Restart Service Desk and the new table will appear in the Schema Designer.

3. Using Web Screen Painter (WSP) open ‘detail_web_form.htmpl’ and add the following line to ‘function get_go_sel_arr()’:

            sel_arr[idx++] = new go_element(“zrip”, “Any I/R/P Ticket”); 

4. Create a detail file for the newly created table e.g. detail_zrip.htmpl

5. Log into SD and select ‘Administration’ tab.

6. Click ‘Security and Role Management’ in the left pane

7. Click ‘Role Management’

8. Click ‘Web Forms’

9. Click ‘Create New’ button in right pane to open ‘Create New Web Form’ window

10. Fill out new form (see Fig. 1) and click ‘Save’ button.

       Image description 

11. Click on ‘Role List’ in left pane

12. Select the role that you want the go button menu to display the new menu option e.g. ‘Administrator’. This opens the ‘Administrator Role Detail’ form.

13. Click on ‘Go Resources’ tab.

14. Click on ‘Update Go Resources’ button. The ‘Web Form Search’ form is displayed

15. Click the ‘Search’ button to display the ‘Go Resource Assigned Update’ window.

16. Select the new menu option and click the ‘>>’ button (see Fig. 2).

         Image description 

17. Click ‘OK’ button. The new menu item is listed in the ‘Go Resource List’ of the ‘Go Resources’ Tab of the role. See Fig. 3.

         Image description 

18. Click the ‘Any I/R/P Ticket’ radio button and then click ‘Set Default’ button if you want it to be the default menu selection displayed in the go button.

Retrieved from "http://www.servicedeskusers.com/R12_Go_button_Search_Customization"

Data Type Conversion

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This This article details how to convert from one data type to another in Spel code. This concept is regarded as casting.

Details

Primary data types used in USD spell.

  • string
  • int
  • float
  • date
  • duration
  • bool
  • uuid (introduced in r11.x)
  • object

Example:

string MyString; int MyInt; 

float MyFloat; date MyDate;

duration MyDuration; uuid MyUUID; 

MyString = "Hello world no: " +(string) 1; // result: "Hello world no: 1"

MyInt = (int) "2 times")// result: 2

MyFloat = (float)MyInt; // result: 2.00000

MyDate = (date)( (string) now()); // result: the actual date depending of your system time configuration

MyDuration = (duration)((int) "2" + 3), // result: duration of 5 sec.

MyUUID = (uuid)expand( "&{'mylogin'=cnt.userid->id}"); // result: the id of contact having userid "mylogin"

Arrays

In Spell code you can use arrays as well.

Accessing array fields is very similar to other languages, simply use

myArray[3]

to access forth element of an array myArray. Arrays are 0-based.

Here is the example of declarantion of a new array of strings with 4 elements:

string msgs[4];

Retrieved from "http://www.servicedeskusers.com/Data_Type_Conversion"

Pdm webcache

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This command is used to clear the web page cache. The system maintains a cache to improve system

Usage

pdm_webcache [-b] [-H] [-f form] [-g fgroup] [-i interface_type] [-m] [-p webengine_process] [-t timeout] [-v] [-h]

CommandDescriptionRemarks
-bbrowser cache. Alert users to update browser cacheTo undo this command, delete a file called browser_refresh.txt then restart services.
-Hhtmpl cache. Clear webengine HTMPL cache
-fForm name. Default is all forms.
-gForm group. Default is all form groups
-iInterface type. Default is all interface types
-mmacro cache. Clear webengine macro cache
-pProcess name of webengine to update. Default is all webengine
-tTime out in seconds. Default is 30 seconds.
-vVerbose (list all forms deleted from cache)
-hhelp

The -f, -g, and -i arguments may contain '*' as a wildcard character. The -H argument is the default if none of the -b, -H, or -m options are specified.

When initiated from a Primary Server, the cache of the Secondary Servers will be cleared as well, assuming -p was not used.

Examples

  • To clear all web cache for all domservers
pdm_webcache -v 
  • To clear all web cache for all domservers and prompt users to clear browser cache
pdm_webcache -b 
  • To clear a specific FORM\SCREEN from the cache
pdm_webcache -f detail_cr.htmpl 
  • To clear a specific screen FORM GROUP from the cache
pdm_webcache -g ITIL 

Retrieved from "http://www.servicedeskusers.com/Pdm_webcache"

How to Script Buttons

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

Service Desk buttons are created using a ImgBtnCreate function.

ImgBtnCreate(btnID, btnCaption, func, btnEnabled, btnWidth, help, tabIndex)

 

AttributeDescriptionExamples
btnIDUsed for referencing the button. This is typically a label used for easy identification of the button in scripts.
ImgBtnCreate("btn001", ... ImgBtnCreate("btnchg", ... ImgBtnCreate("mybtn", ...
btnCaptionThe text to be displayed on the button. Either identify the string such as "My Button" or reference a msgtext() value. The msgtext() value is obtained from the msg_cat.js file.
ImgBtnCreate(..., "I am a button"... ImgBtnCreate(..., msgtext(514), ...
funcThe script to be initiated when the button is selection
ImgBtnCreate(..., ..., "detailSave('NEW_CHANGE')", ... ImgBtnCreate(..., ..., "myscript()", ...
btnEnabledIf true then the button is Active. If false then it is not.
ImgBtnCreate(..., ..., ..., true, ... ImgBtnCreate(..., ..., ..., false, ...
btnWidthButton width in pixels. 0 defaults to the size of the text.
ImgBtnCreate(..., ..., ..., ..., 0, ... ImgBtnCreate(..., ..., ..., ..., 220, ...
helpDisplays information in status bar of the browser window. This is typically the bottom left-hand corner of your.
ImgBtnCreate(..., ..., ..., ..., ..., "Click here to open a ticket", ...
tabIndex

More Examples

Open a Service Desk htmpl file in a new window

ImgBtnCreate("btn001", "Custom Form", "popup_window('','ztest.htmpl'))", true, 0, "Select this button to view a Service Desk htmpl in a new window");

Open a Service Desk htmpl file in an existing window

ImgBtnCreate("btn001", "Existing Window", "upd_frame('ztest.htmpl')", true, 0, "Select this button to use the existing window");

Open a new window referencing an external URL

ImgBtnCreate("btn001", "SDU", "popupWithURL('http://www.servicedeskusers.com', 1, 1, '')", true, 0, "User Community for CA/Unicenter Service Desk");

Open a new email message referencing the ticket

ImgBtnCreate("btn001", "Send eMail", "window.open('mailto:?subject=Regarding $args.type.sym $args.ref_num&body=Click on the following URL to view $args.type.sym $args.ref_num: $args.web_url')", true, 0);

Launch an application

function ExecuteMyApp() { var myshell = new ActiveXObject( "WScript.shell" ); myshell.run( 'enter application command line here', 1, true ); } ImgBtnCreate("btn001", "My Application", "ExecuteMyApp()", true, 0, "Click this button to launch My Application");

Retrieved from "http://www.servicedeskusers.com/How_to_Script_Buttons"

Troubleshooting Spell Code

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

Troubleshooting spell code always was such as a **** for me, until I meet bop_cmd.

Every once in a while we need to test some kind of structure, logic or even code and we always forget a semicolon, a curly bracket and BANG Service Desk crashes and we need to debug, restart, copy code and of course, lose time.

With bop_cmd we can run spell code with little or no impact in Service Desk.

Of course, to run a spell file, we need the pdm_daemon_manager service to be running.

Usage

bop_cmd -s spell file.spl  "spell_function in file(0, parameter1, parameter2, parameter3)"

To simulate the triggering event such as Service Desk does, always send to the function a first parameter 0 (which I do not know what it is, but trust me, you need to do this), the name of the property described in the mod file, and two values, one representing the value before the trigger was fired, and one after.

Examples

  • In this example, we start a spell function named chips in a spell file named potato.spl, simulating the priority change from 0 to 1.
bop_cmd -s potato.spl "chips(0, 'priority', 0, 1 )"

Retrieved from "http://www.servicedeskusers.com/Troubleshooting_Spell_Code"

Conditionally Attach an Event

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This article provides instructions for having an event conditionally attached to a ticket.

Procedures

Step 1. Create the script

A script is created as an .spl file and placed in the $NX_ROOT/site/mods/majic directory. When the Service Desk service starts, the contents of the majic directory are processed and cached. You can use any naming scheme you like for your .spl file, but it is recommended that the file be preceded with a 'z' for easy identification as a custom file (eg zMyCompany.spl, zcr_scripts.spl, zMyScripts.spl).

 

// Use 'cr' for Requests, Incidents & Problems, 'chg' for Changes, and 'iss' for Issues

cr::zmyscript(...){

object group_leader;

object attached_events_table_record;

send_wait(0, top_object(), "get_co_group");

if (msg_error()) {

logf(ERROR, "%s - %s", ref_num, msg[0]);

}

group_leader = msg[0];

send_wait( 0, top_object(), "call_attr", "atev", "get_new_dob", NULL, NULL, group_leader);

if (msg_error()) {

logf(ERROR, "%s - %s", ref_num, msg[0]);

}

attached_events_table_record = msg[0];

attached_events_table_record.obj_id = persistent_id;

// Enter the persid of the event

attached_events_table_record.event_tmpl = "evt:400001";

send_wait(0, group_leader, "checkin");

if (msg_error()) {

logf(ERROR, "%s - %s", ref_num, msg[0]);

 

The trigger that will be created in step 2 is the first level filtering. If you need further filtering then utilize an if statement in the spel code above.

Step 2. Create the trigger

This step is to create the trigger that will initiate the script. The methods used to implement the trigger vary based on the Service Desk release. In the examples to follow, the trigger is designed to fire if the Status is being changed to 'Resolved'. Use whatever filter you like for attaching your Event.

For r11.x releases triggers are created via the Schema Designer utility. Simply add the following code as a Site-Defined Trigger to the cr (Request), chg (Change Order), or iss (Issue) table.

POST_VALIDATE zmyscript() 111 FILTER(status{->'RE'}); 

For older releases triggers are made by creating a .mod file and placing it in the $NX_ROOT/site/mods/majic directory. Name the .mod anything you like, but it is recommended that it be preceded with a 'z'.

 

// Use OBJECT cr for Requests, Incidents & Problems

// Use OBJECT chg for Change Orders

// Use OBJECT iss for Issues

OBJECT cr {

  TRIGGERS {

  POST_VALIDATE zmyscript() 111 FILTER(status{->'RE'});

  };

};

 

tep 3. Publish the Schema changes

The methods used to publish schema changes vary based on the Service Desk release.

For r11.x releases, follow these steps:

  1. Save your Schema changes
  2. Stop the Service Desk service
  3. Run pdm_publish from a command line (Applicable if you made changes via WSP)
  4. Start the Service Desk service

For older releases recycle the Service Desk service.

 

Retrieved from "http://www.servicedeskusers.com/Conditionally_Attach_an_Event"

Add Personalized Response to Manual Notification

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This article provides instructions on how to add Personalized Responses to a Manual Notification. Surprisingly, Manual Notifications are one Activity that does not utilize Personalized Responses. The code that follows provides an option for appending the field content (which is the standard system-wide behavior) or replacing the field content.

Procedures

Step 1. Edit the nf.htmpl form

Add the following code to the HEAD of the form:

<SCRIPT LANGUAGE="JavaScript">

var resp_sym = new Array();

var resp_ids = new Array();

resp_sym[0] = "";

resp_ids[0] = "";

resp_field="KEEP.msgtxt";

resp_persid='$args.persistent_id';

resp_title="KEEP.msgtitle";

 

<PDM_IF "$prop.factory" == "chg">

var title_strg = "Change order $args.chg_ref_num Manual Notify";

<PDM_ELIF "$prop.factory" == "iss">

var title_strg = "Issue $args.ref_num Manual Notify";

<PDM_ELSE>

<PDM_IF "$env.NX_OTB_MARKET" == "itil">

var title_strg = "$args.type.sym $args.ref_num Manual Notify";

<PDM_ELSE>

var title_strg = "Request $args.ref_num Manual Notify";

</PDM_IF>

</PDM_IF>

 

<PDM_IF "$prop.factory" == "chg">

<PDM_LIST ESC_STYLE=JS2 prefix=list factory=response where="delete_flag=0 AND (response_owner IS NULL or response_owner = U'$cst.id') AND chg_flag=1">

resp_sym[resp_sym.length] = decodeURIComponent('$list.sym');

resp_ids[resp_ids.length] = '$list.id';

</PDM_LIST>

<PDM_ELSE>

<PDM_IF "$args.type" == "R" || "$args.type" == "">

<PDM_LIST ESC_STYLE=JS2 prefix=list factory=response where="delete_flag=0 AND (response_owner IS NULL or response_owner = U'$cst.id') AND cr_flag=1">

resp_sym[resp_sym.length] = decodeURIComponent('$list.sym');

resp_ids[resp_ids.length] = '$list.id';

</PDM_LIST>

<PDM_ELIF "$args.type" == "I">

<PDM_LIST ESC_STYLE=JS2 prefix=list factory=response where="delete_flag=0 AND (response_owner IS NULL or response_owner = U'$cst.id') AND in_flag=1">

resp_sym[resp_sym.length] = decodeURIComponent('$list.sym');

resp_ids[resp_ids.length] = '$list.id';

</PDM_LIST>

<PDM_ELIF "$args.type" == "P">

<PDM_LIST ESC_STYLE=JS2 prefix=list factory=response where="delete_flag=0 AND (response_owner IS NULL or response_owner = U'$cst.id') AND pr_flag=1">

resp_sym[resp_sym.length] = decodeURIComponent('$list.sym');

resp_ids[resp_ids.length] = '$list.id';

</PDM_LIST>

</PDM_IF>

</PDM_IF>

 

function add_response_nf(i)

{

if(ahdframe.currentAction==0&&i>0)

{

var url=cfgCgi+"?SID="+cfgSID+"+FID="+fid_generator()+

"+OP=PERSRESP_EXPAND+MSG_ID="+resp_ids[i]+

"+PERSID="+resp_persid+

"+CALLBACK=parent.ahdframe.add_response_callback_nf";

display_new_page(url,ahdframeset.workframe);

set_action_in_progress(ACTN_AUTOFILL);

}

}

 

function add_response_callback_nf(msg){

set_action_in_progress(0);

if (document.main_form.elements["KEEP.msgtxt"].value == "") {

document.main_form.elements[resp_title].value=unescape(title_strg);

}

document.main_form.elements[resp_field].value+=unescape(msg); // Use to append Message Text content

// document.main_form.elements[resp_field].value=unescape(msg); // Use to replace Message Text content

}

</SCRIPT>

 

Add the following code to the BODY of the form:

 

 

if (resp_ids.length > 1)

{

<PDM_MACRO NAME=dtlStartRow>

detailRowHdr("Personalized Response",1,0);

docWriteln('<TR><TD ALIGN=LEFT>');

_dtl.eventHandler = 'onBlur="add_response_nf(selectedIndex)"';

docWriteln('<SELECT' + detailNextID(true) + '>');

for (i = 0; i < resp_ids.length; i++)

{

docWrite('<OPTION VALUE="' + resp_ids[i] + '" ');

docWriteln('>' + resp_sym[i] +'</OPTION>');

}

docWriteln('</SELECT></TD></TR>');

 

tep 2. Clear the web cache

Publish your changes via the Web Screen Painter. The process of publishing automatically initiates a pdm_webcache.

Retrieved from "http://www.servicedeskusers.com/Add_Personalized_Response_to_Manual_Notification"

 

 

Action Macro to Log Solution and Resolve Ticket

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This Article provides the syntax for adding an Action Macro that will log a solution and Resolve the ticket. This Action Macro has been scripted to process the content of the Event's Text field as the solution to be used. This allows for this Macro to be used for multiple Events and generate different results.

Procedures

Step 1. Upload New Action Macro

The first step is to add the new Action Macro. This is done via a data load since Service Desk does not provide a GUI method of created or updating Action Macros.

 

Create a text file using the following syntax:

 

TABLE Spell_Macro

del description fragment lock_object msg_html ob_type sym type

 

{ "0" ,"add a log solution activity log entry and set status to resolved",

"uuid log_userid;\\0012log_userid = (uuid)\"793ED69B4E87A545BD8E911834D829FC\";\\0012\\0012string log;\\0012log = expand(event_tmpl.user_smag);\\0012send_wait(0, this, \"log_solution\", (string)group_leader, log_userid, log, \"PDM\",\"\");\\0012if (msg_error()) {\\0012 logf(ERROR, format(\"Macro event error '%s'\", msg[0]));\\0012}\\0012\\0012if (soln_log.length != 0) {\\0012 status = \"RE\";\\0012}\\0012\\0012",

"0" ,"" ,"cr" ,"Add Solution and Resolve", "ACT" }

 

Then run the following command:
pdm_load -f yourfile.txt -i -v 

Here is what the script looks like:

uuid log_userid;

log_userid = (uuid)"793ED69B4E87A545BD8E911834D829FC";

 

string log;

log = expand(event_tmpl.user_smag);

send_wait(0, this, "log_solution", (string)group_leader, log_userid, log, "PDM","");

if (msg_error()) {

logf(ERROR, format("Macro event error '%s'", msg[0]));

}

 

if (soln_log.length != 0) {

status = "RE";

}

Step 2. Using the New Action Macro

 

r11.x Screenshot - Event Configuration
r11.x Screenshot - Event Configuration

 

To use this Action Macro you simply add it to the desired Event. Within the Text field of the Event you add the syntax you want to be added as the solution that is to be displayed in the Activity Log.

 

 

 

 

 

 

 

 

 

 

 

Increasing Default Field Size

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

How to Increase the field length of an out of the box field


Requirement: To display multiple attributes in Service Desk multiple notification macro

Ex: To display Urgency, Request Type, Reference Number and Summary in Subject line (see below)

Urgency @{call_req_id.urgency.sym} - @{call_req_id.type.sym} @{call_req_id.ref_num} - @{call_req_id.summary}

The subject line of the macro OOB is 80 characters and the system won’t allow you to add multiple attributes to subject line due to character limitation. This change will help you add multiple attributes to your custom Multiple Notification Macros, Initial, Close and Manual Notify activity notifications etc.


The below steps will demonstrate how to increase the field length of Multiple notification macro Subject line field.

Database Table: act_type

Field name: notify_title

Procedures

Step1: Create a Schema (.Sch) file in site/MODS directory as below


zAct_Type.sch (Schema definition)

TABLE Act_Type { notify_title STRING 100 ; }


Step 2: Create a MOD (.MOD) file in site/mods/MAJIC directory as below

zAct_Type.MOD (Object/Attribute definition)

OBJECT aty { ATTRIBUTES Act_Type { notify_msg_title STRING 100;

}; };

Step 3: Make the change in database.

Table: Act_Type Field: notify_title Length: 100

Step 4: Configure the primary server After Configuration, the length definition will be updated in ddict.sch and WSP.

Note: -- You need to do all the above 4 steps to make it work successfully. -- Please note, this is not supported by CA. Try it out first in test box. -- You might see “Duplicate definition, use MODIFY statement” errors in stdlogs. Please ignore as this wont cause any issues.

You can follow the above steps to increase the field length of properties and other out of the box fields. When you increase field length of properties, you need to make the change both in template and as well as property table (cr_prp, cr_prptpl)

Retrieved from "http://www.servicedeskusers.com/Increasing_Default_Field_Size"

Send WaitCall Attr

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This is some kind of global method (callable on TOP object). It can be called in Spell Code using send_wait method.

Using this method you can call some actions on object attributes or on other factories. So we can distinguish between usage of this method on current object's attributes and other factories.

Usage

When calling action on some of top_object's attribute:

void send_wait (int timeout, object top_object, "call_attr", string attr_name, string action_name, [ var parameters… ])

or when calling action on some distinct factory:

void send_wait (int timeout, object top_object, "call_attr", string factory_name, string method_name, [ var parameters… ])
  • timeout - how long (?in seconds?) should the method wait for finishing the method (0 means infinite)
  • top_object - root object for the method (on which the method is called)
  • attr_name - name of attribute on which the action is called
  • factory_name - name of factory on which the action is called
  • action/method - name of the called action/method
  • parameters - variable number of parameters based on the called action

Results

Methods usually fill global msg array with return values. What values are on what positions depends on the called action.

Available method/actions

Defined on Object attributes

Object attributes

Defined on factories

Examples

// Get currently logged in user uuid login_userid send_wait(0, top_object(), "call_attr", "cr", "current_user_id"); login_userid = msg[0];

Retrieved from "http://www.servicedeskusers.com/Send_WaitCall_Attr"

 

This page was last modified 15:20, 1 March 2012.  This page has been accessed 8,395 times.  Content is available under Attribution-Noncommercial-Share Alike 3.0 UnportedDisclaimers

Events and Macros

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

Starting with the r11.x releases, events and macros are managed in the web client. Prior to r11, they were managed in the java client.

Events

Events are the combination of a condition and one or more actions. They are attached with tickets via Service Types, Service Contracts, or custom code. If an event is attached to a ticket, it will trigger after a defined period of time. When an event is triggered, it's condition is evaluated and will return either True or False. Any actions associated with the condition evaluating to True or False are then executed.

Macros

The conditions and actions that are used in defining Events are done using macros. While condition macros evaluate to either True or False, action macros allow for just about any action possible within Service Desk. Below are explanations and examples of the two types of condition macros (Condition Macros and Site-Defined Condition Macros) and 4 types of action macros (Action Macros, Attach Event Macros, Multiple Notification Macros, Remote Reference Macro).

Site-Defined Condition Macro

Site-Defined Condition Macros are a special kind of condition macro. There are no site-defined condition macros included in a fresh install of Service Desk. They are created by the client. While the Site-Defined Condition Macros provide an easy to use interface and offer vast flexibility, they do not offer as much flexibility as Condition Macros.

Condition Macro

When a site-defined macro won't do the job, it is time to use Condition Macros. A fresh install of Service Desk contains quite a few to start with. There are no default capabilities for managing Condition Macros within the administration interface. Since they are written in Spell code and Spell code is not officially supported by CA, take special caution when working with them. To add new Condition Macros, see How To Manage Spell-Based Macros.

It is highly recommended that you do not modify ANY of the default Condition Macros. If changes are needed, create a new one based on the original. It is best to reference existing Condition Macros to understand the coding that is needed.

Action Macro

Action Macros are typically used to set field values, such as increasing Priority or setting the SLA violation. However, since they are written in Spell code, they can perform just about any action possible within Service Desk. A fresh install of Service Desk contains quite a few to start with. There are no default capabilities for managing Action Macros. To add new Action Macros, see How To Manage Spell-Based Macros.

It is highly recommended that you do not modify ANY of the default Action Macros. If changes are needed, create a new one based on the original. It is best to reference existing Action Macros to understand the coding that is needed.

Attach Event Macro

Attach Event Macros are used to attach another event. This allows for complex branching in your conditioning as well as on going processing.

Multiple Notification Macro

Multiple Notification Macros are the most commonly used type of macros. They are used to send out notifications. Unlike Activity Notifications, Events combined with Multiple Notification Macros add more flexibility with notification. However, by default, Multiple Notification Macros do not provide HTML email support.

Remote Reference Macro

Examples

Condition Macros

Site-Defined Condition Macros

Action Macros

Add Custom Activity Log

Attach Event Macros

Multiple Notification Macros

Remote Reference Macros

 

 

Retrieved from "http://www.servicedeskusers.com/Events_and_Macros"

 

 

This page was last modified 05:24, 30 November 2010.  This page has been accessed 20,957 times.  Content is available under Attribution-Noncommercial-Share Alike 3.0 UnportedDisclaimers

Root Cause

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This article provides insight into using Root Cause and suggestions about its content.

Using Root Cause

When contemplating the initial content of your Root Cause listing, stay focused. Remember that Root Cause should identify WHY the ticket was created. Do not confuse it with Configuration Item, which identifies WHAT the ticket is regarding. For example, a ticket was created for user John D User with regards to Outlook. Outlook is the Configuration Item because it is the WHAT. During the course of troubleshooting you discover that the reason the user was experiencing problems with Outlook was because of a network outage. Network Outage is your Root Cause because it tells you WHY.

List of Root Causes

SymbolDescription
Hardware
Communication ErrorFailure of one piece of hardware to communicate with another.
Depleted ConsumableEmpty/low/worn ink cartridges, toner cartridges, or ribbon.
Hardware FailureA failed piece of hardware.
Minimum Requirements Not FulfilledFailure to function properly due to minimum hardware requirements not being met.
Needs CleaningItem needing cleaning in order to function properly.
Paper JamPaper Jam in a printer or fax caused an error
User Induced DamageDamage caused by the user.
Network
IP Address ConflictConflicting IP Addresses on the company network.
ISP IssueProblem's associated with Home user's Internet Service Provider.
LagA problem resulting from a slow network.
OutageNetwork unavailability experienced by two or more machines in close proximity.
None
Unavailable Function/FeatureThe function or feature desired is not available in the application.
Company PolicyCorporate or Department Policy dictates the functionality that is reported.
Works as DesignedThe reported problem actually works as designed.
Other
Access RestrictedAccess has been intentionally restricted.
Backup OverageBackups exceeded the anticipated duration.
Change in Roles & ResponsibilitiesChanges in Roles and/or Responsibilities are the causes of the observed behavior.
Environmental ConditionsPrimary cause is the environment. For example, excessive moisture caused a circuit card to short circuit.
MisleadingObserved behavior is not necessarily wrong, but it is misleading and should be changed.
Misspelling/TypoProblem caused by a misspelling or a typo.
No Longer EmployedUser is no longer employed by the company and is the cause for the observed behavior.
Scheduled Server OutageHost Server is unavailable and was scheduled to be down.
Unscheduled Server OutageHost Server is unavailable and was not scheduled to be down.
Side-EffectSide-effect from making a previous change.
Unfamiliar with Product/ProcessUser is unfamiliar with a product or process and has requested assistance or HOW TO instructions.
Unknown CauseThe single root cause of the problem cannot be identified.
Unsupported SoftwareSoftware not supported by IT.
User ErrorUser mistake.
Vendor ErrorVendor is responsible for item failure.
Software
Beyond Software CapabilitiesSoftware is not capable of producing the desired result.
DatabaseDatabase issue causing software problems.
Device Not MappedMissing Printer, Fax, or Scanner mapping results in error or inability to use device.
Failed InstallA failed, incomplete, or improperly installed application.
Incorrect PermissionsNeeded account permissions are incorrect.
LicensingLicensing issues causing software problems.
Minimum Requirements Not FulfilledFailure to function properly due to minimum software requirements not being met.
Missing DriversItem cannot be used due to missing software driver(s).
Missing FilesEssential files are missing.
Missing Function/FeatureA function or feature that should be present is missing from an application.
Missing PatchesRequired patches are missing.
Out of SyncDevices are unable to establish or maintain synchronization.
Outdated DriversOutdated software drivers.
Outdated SoftwareSoftware is not at the currently supported level.
Password (Administrative)Requiring a password reset that is NOT the result of a user error.
IT Design FlawProblem attributed to IT scripting error.
Service OutageAn outage of an individual service, not necessarily an entire server.
Software BugA defect in the software.
Software NeededSoftware needs to be installed in order for user to perform necessary function.
VirusA virus, worm or Trojan Horse.
Wrong Configuration/SettingProblems resulting from something being improperly configured or set wrong.

Retrieved from "http://www.servicedeskusers.com/Root_Cause"

 

This page was last modified 19:45, 14 July 2009.  This page has been accessed 5,134 times.  Content is available under Attribution-Noncommercial-Share Alike 3.0 UnportedDisclaimers

Add Log Entry When a Property Value Changes on a Ticket

 

From SDU

Jump to: navigation, search

 

To make corrections or additions to this article, select the edit tab above.
To discuss or ask questions about this article, select the discussion tab above.


 

Overview

This article provides instructions for adding entries to the Activity Log when a property value changes on a ticket. The steps involved are creating a new Activity Notification, adding Site-Defined Triggers, and writing SPEL code for functions used by the the triggers.

Procedures

Step 1. Create the Activity Notification

Create a new Activity Notification, “Property Update” in USD Web Client. It can be done by copying an existing Activity Notification, "Field Update" via File | Copy menu option. Use the code "PROP" for the new activity. This code will be used in the SPEL code when specifying log type:

alg.type = "PROP"; chgalg.type = "PROP"; issalg.type = "PROP";

Step 2. Create the spell file

Create a spel file prop_log.spl in $NX_ROOT\site\mods\majic folder. Note: if you change the name of the spel file, change the name of the dummy function in the beginning of the spel file accordingly

//  Dummy function, just so RCS Id is embedded in compiled spell file... string prp_log_spl_RCSID() { return "@(#)$Id: prp_log.spl,v 1.00 2007/21/0 21:54:25 lauke01 Exp $"; }   // Request property cr_prp::zlog_value_change(...) { string ME; ME = "cr_prp::zlog_value_change";   string prp_persid, cr_persid, old_val, new_val, zzlabel, zzsequence;   prp_persid = argv[3]; cr_persid = argv[6]; old_val = argv[8]; new_val = argv[9]; zzlabel = argv[12]; zzsequence = argv[15];   send_wait(0, top_object(), "call_attr", "cr", "dob_by_persid", 0, cr_persid); if (msg_error()) { logf (ERROR, "%s: could not get dob for cr=%s property=%s: %s", ME, cr_persid, zzsequence, msg[0]); return; } object dob; dob = msg[0];   send_wait(0, top_object(), "get_co_group"); if (msg_error()) { logf (ERROR, "%s: could not get group leader for cr=%s property=%s: %s", ME, cr_persid, zzsequence, msg[0]); return; } object group_leader; group_leader = msg[0];   send_wait(0, group_leader, "checkout", dob); if (msg_error() && msg[0] != "NO") { logf(ERROR, "%s: checkout failed for cr=%s property=%s: %s", ME, cr_persid, zzsequence, msg[0]); return; }   send_wait(0, dob, "call_attr", "log_agent", "get_val"); if (msg_error()) { logf (ERROR, "%s: could not get log agent for cr=%s property=%s: %s", ME, cr_persid, zzsequence, msg[0]); return; } uuid log_agt; log_agt = msg[0];   object alg; send_wait( 0, top_object(), "call_attr", "alg", "get_new_dob", NULL, NULL, group_leader); if (msg_error()) { logf (ERROR, "%s: could not get new alg for cr=%s property=%s: %s", ME, cr_persid, zzsequence, msg[0]); return; }   alg = msg[0]; alg.type = "PROP"; // Code that identifies "Property Update" Activity Notification alg.description = format("FIELD='property' LABEL='%s' SEQUENCE='%s' OLD='%s' NEW='%s'", zzlabel,zzsequence,old_val,new_val); alg.time_spent = "00:00:00"; alg.call_req_id = cr_persid; alg.analyst = log_agt; alg.system_time = (int)now(); alg.last_mod_dt = (int)now();   send_wait(0, group_leader, "checkin"); if (msg_error()) { logf(ERROR, "%s: checkin failed for cr=%s property=%s: %s", ME, cr_persid, zzsequence, msg[0]); send_wait(0, group_leader, "uncheck"); return; } }   // Change Order property prp::zlog_value_change(...) { string ME; ME = "prp::zlog_value_change";   string prp_persid, chg_id, chg_persid, old_val, new_val, zzlabel, zzsequence;   prp_persid = argv[3]; chg_id = argv[6]; chg_persid = format("chg:%s",chg_id); old_val = argv[8]; new_val = argv[9]; zzlabel = argv[12]; zzsequence = argv[15];   send_wait(0, top_object(), "call_attr", "chg", "dob_by_persid", 0, chg_persid); if (msg_error()) { logf (ERROR, "%s: could not get dob for chg=%s property=%s: %s", ME, chg_persid, zzsequence, msg[0]); return; }   object dob; dob = msg[0];   send_wait(0, top_object(), "get_co_group"); if (msg_error()) { logf (ERROR, "%s: could not get group leader for chg=%s property=%s: %s", ME, chg_persid, zzsequence, msg[0]); return; } object group_leader; group_leader = msg[0];   send_wait(0, group_leader, "checkout", dob); if (msg_error() && msg[0] != "NO") { logf(ERROR, "%s: checkout failed for chg=%s property=%s: %s", ME, chg_persid, zzsequence, msg[0]); return; }   send_wait(0, dob, "call_attr", "log_agent", "get_val"); if (msg_error()) { logf (ERROR, "%s: could not get log agent for chg=%s property=%s: %s", ME, chg_persid, zzsequence, msg[0]); return; } uuid log_agt; log_agt = msg[0];   object chgalg; send_wait( 0, top_object(), "call_attr", "chgalg", "get_new_dob", NULL, NULL, group_leader); if (msg_error()) { logf (ERROR, "%s: could not get new chgalg for chg=%s property=%s: %s", ME, chg_persid, zzsequence, msg[0]); return; }   chgalg = msg[0]; chgalg.type = "PROP"; // Code that identifies "Property Update" Activity Notification chgalg.description = format("FIELD='property' LABEL='%s' SEQUENCE='%s' OLD='%s' NEW='%s'", zzlabel,zzsequence,old_val,new_val); chgalg.time_spent = "00:00:00"; chgalg.change_id = chg_id; chgalg.analyst = log_agt; chgalg.system_time = (int)now(); chgalg.last_mod_dt = (int)now();   send_wait(0, group_leader, "checkin"); if (msg_error()) { logf(ERROR, "%s: checkin failed for chg=%s property=%s: %s", ME, chg_persid, zzsequence, msg[0]); send_wait(0, group_leader, "uncheck"); return; } }   // Issue property iss_prp::zlog_value_change(...) { string ME; ME = "iss_prp::zlog_value_change";   string prp_persid, iss_persid, old_val, new_val, zzlabel, zzsequence;   prp_persid = argv[3]; iss_persid = argv[6]; old_val = argv[8]; new_val = argv[9]; zzlabel = argv[12]; zzsequence = argv[15];   send_wait(0, top_object(), "call_attr", "iss", "dob_by_persid", 0, iss_persid)