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

REQUISIÇÕES DE SERVIÇO (Funcionamento)     

 

Antes de detalhar as customizações e parametrizações que foram feitas na ferramenta para implantar o processo de requisições, falarei um pouco mais sobre o funcionamento das tarefas de fluxo de trabalho (Clássico) da SDM utilizadas nos módulos de Ocorrência, Mudança e Solicitações (Apenas 14.1)..

 

As tarefas, assim como as propriedades, são vinculadas às categorias de ocorrência/mudança/solicitação. Cada tarefa tem um tipo específico (Aprovação, Execução, etc) e esta tarefa possui um ou mais códigos de status (Pendente, Aprovar, etc) e cada código de status possui uma ou mais macros SPEL vinculadas que são utilizadas para definir ações, condições e validações de transição de status.

 

É bom destacar que os "códigos de status de tarefa" e os "tipos de tarefa de fluxo de trabalho" que forem criados na ferramenta para requisições de mudança também poderão ser utilizados em outros módulos que suportem esta funcionalidade (Ex.: Ocorrências/Solicitações). O mesmo não ocorre com os "Status", "Categorias" e outras estruturas de dados que são independentes em cada módulo.

 

EXEMPLO:

Imagine uma categoria de requisição de serviço que possui uma tarefa de aprovação chamada "Aprovação da chefia". Esta tarefa está atribuída a algum grupo/responsável que é notificado automaticamente quando esta tarefa muda seu status para "Pendente". Em seguida, quando o responsável "Aprovar" esta tarefa, o status do ticket é modificado automaticamente para "Em andamento" e a próxima tarefa do fluxo é executada.

 

Portanto, cada código de status de tarefa executa códigos de macro SPEL que precisam ser criados e modificados conforme as nossas necessidades. Destacando que, a ferramenta não permite a criação/edição de macros de Ação/Condição sem que o formulário "detail_macro.htmpl" seja desbloqueado.

Esta medida foi tomada pela CA para garantir a segurança e a estabilidade do produto e nenhum nível de suporte será dado neste tipo de customização pelo fornecedor.

 

Continuando...

Os "Tipos de tarefa" são modelos (templates) que podem ser criados/alterados e servem para agilizar a construção de novas categorias de requisição de serviço/mudança/solicitação. Portanto, toda vez que uma tarefa de "Aprovação" for criada em uma categoria, os códigos de status "Aguardar", "Aprovar", "Pendente" e "Rejeitar" serão incluídos automaticamente na tarefa. E além disso, é possível incluir outros status manualmente no template ou especificamente na tarefa, caso seja necessário.

 

Toda tarefa possui em seu ciclo de vida os seguintes status gerenciados pela ferramenta que NÃO podem ser alterados pelo usuário:

 

AGUARDAR: Indica que a tarefa ainda não foi iniciada. Este é o primeiro status que uma tarefa assume e é o único que NÃO executa códigos de macro mesmo se existirem códigos associados a ele.

 

PENDENTE: Indica que a tarefa foi iniciada. Este é o segundo status que a tarefa assume e será o primeiro status que executará condições e ações de macro definidos no template da categoria.

 

CANCELADA: Indica que a tarefa foi cancelada. Este status só é utilizado pela ferramenta quando o ticket que originou as tarefas foi cancelado.

 

REABRIR-AGUARDAR: Indica que uma tarefa que foi concluída anteriormente teve seu status modificado para "Reabrir". Este status só é utilizado pela ferramenta quando a tarefa possui este status em seu template.

 

Status que podem ser utilizados pelo usuário:

 

APROVAR/REJEITAR: Geralmente utilizado em tarefas de aprovação.

 

CONCLUÍDA/EM ESPERA: Geralmente utilizado em tarefas de execução.

 

REABRIR: Este é um status especial que trabalha em conjunto com o status "Reabrir-Aguardar".

 

IGNORAR: Utilizado para "concluir" uma tarefa indicando que a tarefa não precisou ser executada.

 

OUTROS STATUS: Novos status podem ser criados conforme a necessidade.

 

Amanhã falarei mais sobre os códigos de macro e automações.

Até lá.

 

20160129.jpg

 

publish originally: January 29 of 2016 17:16

From: CA SDM Brasil

By: Daniel Bighelini

 

 

 

CA SDM Brasil Sumário - Índice

Resume CA Service Management Community

bop_sinfo -dq event_log

 

Factory event_log < event_log >

Attributes:

   id                   INTEGER UNIQUE

   producer_id          LOCAL STRING(20)

   persistent_id        LOCAL STRING(60)

   log_time             DATE REQUIRED

   millitime            INTEGER

   event                SREL -> event_type.id

   session <session_id> SREL -> session_log.id

   kd kd_id             SREL -> KD.id TENANCY_UNRESTRICTED

   sd_obj_type          STRING(30)

   sd_obj_id            INTEGER

   numdata1             INTEGER

   numdata2             INTEGER

   textdata1            STRING(500)

   textdata2            STRING(500)

 

 

Não está considerando horário de Brasília, o horário registrado na solução é o GMT, portanto se for necessário o horário exato faz-se necessário considerar GMT-2 em horário de verão ou GMT-3 no resto do ano.

select cnt.userid,  dateadd(ss, a.log_time , '19700101')

from event_log  as a

inner join  session_log as b on a.session_id = b.session_id

inner join ca_contact as cnt on b.contact = cnt.contact_uuid

order by a.id desc

TMACUL

REQUISIÇÕES DE SERVIÇO

Posted by TMACUL Champion Jan 28, 2016

REQUISIÇÕES DE SERVIÇO

 

12650848_1154018541290030_3159036928028727435_n.jpg

 

A uns dois anos atrás decidimos implantar o processo de requisições de serviço na SDM.

Até então, as únicas requisições existentes eram solicitadas através de outras ferramentas desenvolvidas internamente.

 

Basicamente existiam dois tipos de requisição: as padronizadas com uma engine de workflow e as não padronizadas que eram solicitadas em formato de texto livre e um "orquestrador humano" dava o encaminhamento para a área executora. Neste último caso o processo era bem manual e não era incomum os servicos demorarem para serem entregues.

Não tínhamos gestor para este processo e muitas requisições continuavam sendo atendidas por email, telefone ou atendidas diretamente com o executor sem nenhum registro.

 

Precisávamos reverter aquele quadro e nosso objetivo principal naquele momento era migrar as requisições "operacionais" para dentro da ferramenta SDM.

 

Na época utilizávamos a versão 12.5 da ferramenta e já havíamos implantado os processos de incidente, problema, mudança, liberação e configuração.

 

Foi cogitado por nós utilizar o módulo de "Solicitações", mas acabamos desistindo da ideia depois que descobrimos que este módulo não possuía a funcionalidade de tarefas de fluxo de trabalho no modo clássico (que agora está disponível na 14.1).

Por conta disso, seria necessário a utilização da ferramenta CA IT-PAM (antigo CA Workflow), mas isso não estava nos nossos planos devido a três fatores:

 

1) 90% de nossas requisições não exigiam um sistema de workflow tão sofisticado;

 

 

2) Não tínhamos capacitação nem recursos humanos para utilizar o IT PAM;

 

 

3) Já utilizávamos a funcionalidade de tarefas de fluxo de trabalho (modo clássico) no processo de mudanças e os resultados eram bons.

 

Por conta disso, acabamos implantando o processo de requisição no módulo de "Ocorrências" da SDM.

Rebatizamos o módulo para "Requisição de serviço", fizemos alguns ajustes e começamos a implantar as primeiras requisições. O gestor do processo também foi definido dentro do projeto e esse certamente foi um dos fatores preponderantes do sucesso.

 

Depois de aproximadamente um ano de trabalho já haviam sido implantadas mais de 100 requisições de serviço. Atualmente temos mais de 150 categorias definidas na ferramenta.

Todas com seu processo mapeado e sendo aperfeiçoadas diariamente com a ajuda dos usuários e do próprio gestor do processo.

 

Amanhã conto mais o segredo disso tudo.

Até lá.

 

publish originally: January 28 of 2016 01:04

From: CA SDM BRASIL

By: Daniel Bighelini

 

Before open a support issue - Environment Informations

CA SDM - CA Service Desk - AHD Codes - Error

 

CA Service Desk & LDAP Integration - troubleshooting

 

CA SDM Brasil Sumário - Índice

Resume CA Service Management Community

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Translated powered by Google Translator:

 

A couple of years ago decided to implement the process of service requests in the SDM.

 

Until then, the only existing requests were requested by other tools developed internally.

 

Basically there are two types of request: the standard with a workflow engine and the non-standard that were requested in free text format and a "human orchestrator" gave the referral to the performing area. In the latter case the process was very manual and it was not unusual to linger services to be delivered.

 

We had no manager for this process and many requests were still being met by email, phone or met directly with the performer without any records.

We needed to reverse that picture and our main goal now was to migrate the 'operational' requests into the SDM tool.

 

At the time we used the 12.5 version of the tool and had already implemented the processes incident, problem, change, release and configuration.

 

It was contemplated by us use the module "Requests", but ended up giving up the idea after we found out that this module did not have the functionality of workflow tasks in classic mode (which is now available in 14.1).

Because of this, it would require the use of CA IT tool-PAM (formerly CA Workflow), but this was not in our plans due to three factors:

 

1) 90% of our requests did not require a workflow system so sophisticated;

 

2) We had no training or human resources to use the IT PAM;

 

3) Have we used the functionality of workflow tasks (classic mode) in the process of change and the results were good.

Because of this, just deploying the application process in the module "Events" of the SDM.

Rebatizamos the module "Service Request", we made some adjustments and we began to implement the first requests. The process manager was also defined within the project and this was certainly one of the important factors of success.

 

After about a year of work had already been deployed more than 100 service requests. We currently have over 150 categories defined in the tool.

 

All with their process mapped and being improved daily with the help of users and process manager itself.

 

Tomorrow more secrets.

see you

TMACUL

DORES DE CABEÇA

Posted by TMACUL Champion Jan 27, 2016

DORES DE CABEÇA


"O pior problema é aquele que você pensa que não tem". (Daniel Bighelini)


Essa frase só me vem à tona quando dedico algum tempo observando os logs da ferramenta SDM. Pode parecer exagero, mas não é.
É sabido que a ferramenta é muito estável mas não convém abusar da sorte ou displicência. Customizações que não sejam feitas com o devido cuidado causarão muitas dores de cabeça para os administradores. Pode acreditar...

Por conta disso resolvi escrever algumas dicas para prevenir algumas situações:

 

1) OBSERVE OS LOGS
Mensagens de erro podem ocorrem ocasionalmente na ferramenta mas não frequentemente. A frequência indica que um ou mais problemas precisam ser resolvidos.
Mensagens dos tipos ERROR, FATAL, SEVERE_ERROR e CRITICAL precisam ser observadas e tratadas com total prioridade.

 

2) TRIGGERS PRE_VALIDATE & POST_VALIDATE

Estes tipos de trigger não podem conter erros porque são executadas sequencialmente pelos processos SPEL_SRVR e WEBENGINE. Se uma trigger falhar, a ferramenta começará a empilhar a execução de outras triggers subsequentes e por fim a ferramenta cai. Esse é o tipo de problema mais comum que vejo em instalações de SDM. Para resolver esse problema é necessário monitorar os logs frequentemente e fazer o tratamento de exceção adequado em todos os códigos SPEL customizados.

 

3) PROCESSO REP_DAEMON
O processo que gerancia anexos na ferramenta é um processo muito sensível e precisa ser bem configurado para evitar que a ferramenta fique indisponível ou lenta quando um usuário anexa um arquivo a um chamado, por exemplo.
Limitar o tamanho dos arquivos que podem ser anexados é indispensável.

 

4) ANTIVÍRUS E FIREWALL
Os assuntos antivírus e firewall geralmente são um caso a parte com qualquer ferramenta instalada em servidores de aplicação. Problemas do tipo "notificações não enviadas", "pdm_mail_nxd caindo" ou "processos ficando instáveis ou reiniciando" podem ser facilmente resolvidos incluindo a pasta da ferramenta na lista de exceções de verificações do firewall e antivírus.

 

5) FORMULÁRIOS INCOMPATÍVEIS
Cada formulário HTMPL possui uma versão geralmente indicada na última linha do formulário. Quando uma migração de versão ocorre com a ferramenta ou um simples patch/textfix é aplicado, é necessário verificar se algum formulário nativo foi alterado para uma nova versão. Se isso ocorrer, as customizações deverão ser obrigatoriamente portadas para a nova versão do formulário.

 

6) CUSTOMIZAÇÕES DESNECESSÁRIAS
Antes de customizar, questione a CA através de chamados abertos no portal qual alternativa é recomendada para contornar a situação. Converse com outras empresas para verificar alternativas. Desta forma é provável que novas possibilidades de solução sejam viabilizadas.

 

Até a próxima.

 

publish originally: January 26 of 2016 23:00

From: CA SDM BRASIL

By: Daniel Bighelini

 

 

Before open a support issue - Environment Informations

CA SDM - CA Service Desk - AHD Codes - Error

 

CA Service Desk & LDAP Integration - troubleshooting

 

CA SDM Brasil Sumário - Índice

Summary CA Service Management Community

 

CICLO DE VIDA DE CHAMADOS (Customização & código fonte)

 

Em anexo o código fonte das triggers, funções e formulários da customização de ciclo de vida de incidentes/problemas/solicitações.

 

 

Lembrando que antes de colocar estes arquivos no ambiente SDM é necessário primeiro publicar as alterações de esquema envolvendo o novo objeto "z_ciclo_de_vida_cr". Mencionei os atributos no post anterior.

 

 

Bom proveito.

Até a próxima.

 

z_ciclo_de_vida_cr.zip

 

 

publish originally: January 22 of 2016 17:46

From: CA SDM BRASIL

By: Daniel Bighelini

CICLO DE VIDA DE CHAMADOS (Conceito & preparativos)

 

O ciclo de vida de um chamado é representado por todas as mudanças de status ocorridas desde a sua abertura dentro da ferramenta de Service Desk.

Normalmente um chamado é aberto, entra em atendimento, é solucionado e por fim, é encerrado. Mas essas não são as únicas possibilidades. Tudo dependerá do processo de atendimento definido na organização.

 

Mas o ciclo de vida não é utilizado somente para esta finalidade. É através dele que os SLA's e SLO's podem ser mensurados e auditados na ferramenta. Isso ocorre geralmente na contabilização de tempo gasto pelos grupos envolvidos no atendimento do chamado.

Infelizmente a ferramenta SDM não possui esta funcionalidade nativamente e isso nos obriga a fazer uma customização específica, caso não seja utilizado algum sistema de workflow para "orquestrar" o chamado.

Outra alternativa seria utilizar alguns relatórios predefinidos na ferramenta BOXI e esta é recomendação oficial da CA. No caso da minha empresa, esta alternativa não foi viável.

 

Até a versão 12.9 da SDM, era necessário a utilização da solução CA IT PAM (Antigo CA Workflow) para que os incidentes, problemas e solicitações pudesse utilizar esta funcionalidade. Somente ocorrências e mudanças possuiam a "engine" de tarefas de fluxo de trabalho nativa (Workflow clássico).

Mas na versão 14.1 isso mudou fazendo com que o workflow clássico possa ser utilizado para qualquer tipo de chamado. Na minha opinião esta é uma das grandes vantagens da nova versão.

 

Quanto à customização de ciclo de vida, a partir de amanhã compartilharei com vocês todo o código necessário para que isso seja implementado na ferramenta. Isso envolverá a criação de um novo objeto, novos formulários, triggers e métodos SPEL que foram desenvolvidos por mim. Garanto que é uma solução bem completa e tem nos atendido bem a alguns anos.

Segue abaixo o modelo de dados que deverá ser construído através do utilitário Screen Painter (WSP).

 

Factory z_ciclo_de_vida_cr < z_ciclo_de_vida_cr >

id INTEGER UNIQUE

producer_id LOCAL STRING(20)

persistent_id LOCAL STRING(60)

z_dat_End DATE DISPLAY_NAME "Fim"

z_dat_Start DATE DISPLAY_NAME "Início"

z_dur_Time_spent_group DURATION DISPLAY_NAME "Tempo gasto (grupo)"

z_dur_Time_spent_local DURATION DISPLAY_NAME "Tempo gasto (local)"

z_dur_Time_spent_real DURATION DISPLAY_NAME "Tempo gasto (real)"

z_int_Enum INTEGER DISPLAY_NAME "Marcador"

z_srl_Activity SREL -> aty.code DISPLAY_NAME "Atividade"

z_srl_Assignee SREL -> cnt.id DISPLAY_NAME "Responsável"

z_srl_Group SREL -> grp.id DISPLAY_NAME "Grupo"

z_srl_Persistent_id SREL -> cr.persistent_id DISPLAY_NAME "Solicitação"

z_srl_Priority SREL -> pri.enum DISPLAY_NAME "Prioridade"

z_srl_Status SREL -> crs.code DISPLAY_NAME "Status"

z_srl_User SREL -> cnt.id DISPLAY_NAME "Usuário"

last_mod_dt DATE ON_CI {NOW}

last_mod_by SREL -> cnt.id ON_NEW {USER} ON_CI {USER}

 

Sempre lembrando que a criação de objetos e atributos na SDM exige um bom conhecimento técnico e por conta disso, deve ser feito por profissional capacitado.

 

Abaixo uma captura de tela do resultado final do ciclo de vida sendo utilizado por um incidente, por exemplo.

Amanhã eu continuo. Até

 

 

CA SDM Brasil Sumário - Índice

Busca pela tag CA SDM BRASIL  nas comunidades CA

Summary CA Service Management Community

 

publish originally: January 21 of 2016 23:07

From: CA SDM BRASIL

By: Daniel Bighelini

TMACUL

CA SDM - Como Mudar o Logo?

Posted by TMACUL Champion Jan 21, 2016

CA SDM - Como Mudar o Logo?

 

Para alterar o logotipo é comum utilizarmos o procedimento de substituir o logo no caminho, para isso procure o caminho $NX_ROOT/site/mods/www/wwwroot/img e coloque seu logotipo com o nome (circleca.png).

 

O recomendado conforme citado pelo Daniel Bighelini é:

  1. Editar o arquivo "ahdtop_site.htmpl"
  2. colocar na pasta "$NX_ROOT\site\mods\www\htmpl\default" e
  3. Incluir as variáveis abaixo dentro da seção <SCRIPT>.
    • var cfgProductName = "CA Service Desk Manager";
    • var cfgFormTitle = "CA Service Desk Manager";
    • usdImg["circleca"] = "$CAisd/sitemods/img/logotipo.jpg";

 

 

 

Destacando que edições no arquivo "nx.env" não devem ser feitas pelos usuários pois este arquivo só pode ser manipulado pelo programa pdm_configure, gerenciador de opções e o utilitário pdm_inst. Se isso for feito, corre-se o risco destas configurações não serem mantidas em reconfigurações do produto.

 

 

Para alterar o nome CA Service Desk Manager procure o caminho $NX_ROOT/NX.env  procure a opção @NX_INSTALL_OPTION e coloque o texto desejado.

 

 

Change the Logos - CA Service Management - 14.1 - CA Technologies Documentation

TEC502605 - Como mudar o Nome CA Service Desk

How Multi-Tenancy Works - CA Service Management - 14.1 - CA Technologies Documentation

FAQ349322

TEC502605 

CAREERS & the disABLED Magazine recognizes the professional and personal achievements of outstanding individuals with disabilities. We also honor progressive employers in the public and private sectors.

 

Each year, Careers & the disABLED magazine honors "Employees of the Year" and "Employers of the Year".

LOW RES_CD_TOP 50_COLOR_2016.jpg

CATECHNOLOGIES.jpg

 

CAD_WINTER_COVER_300X400.jpg

 

Equal Opportunity Publications - Awards Page - Careers & the Disabled

 

 

CA Technologies Named to 2015 Working Mother 100 Best Companies

Hoje eu estava pensando em uma forma pra estimular o compartilhamento de experiências aqui no grupo. Muitas pessoas me procuram pra falar sobre dificuldades de SDM ou de algum processo ITIL ou de gestão, mas na maioria das vezes, reservadamente.
Acho que isso acontece por receio de exposição ou alguma outra razão que não conheço...

Já fiz muita customização na ferramenta e posso garantir que muitos desses aperfeiçoamentos vieram da troca de experiências ou analisando soluções de outras empresas. Duas ou mais cabeças sempre pensam melhor que uma. É o que penso.

Por conta disso, eu tava pensando em lançar um desafio aqui no grupo.
Gostaria que todos compartilhassem sua maior dificuldade na ferramenta ou na execução de algum processo para que este desafio fosse discutido aqui. Tenho certeza que diversas ideias surgiriam e os resultados poderiam ser bem bons.


O que acham?

Amanhã publicarei uma solução customizada envolvendo o assunto "Ciclo de vida de incidentes/problemas/solicitações". Aguardem.

Até a próxima.

 

CA SDM Brasil Sumário - Índice

Busca pela tag CA SDM BRASIL  nas comunidades CA

 

publish originally: January 20 of 2016 21:55

From CA SDM BRASIL

By: Daniel Bighelini

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.

TMACUL

CATÁLOGO DE SERVIÇOS

Posted by TMACUL Champion Jan 20, 2016

CA SDM Brasil Sumário - Índice

 

CATÁLOGO DE SERVIÇOS

 

Todos que já enfrentaram o desafio de criar um catálogo de serviços dentro de uma ferramenta sabem que esta não é uma tarefa fácil. Longe disso...

Imaginem então conseguir criar um catálogo depois de meses de trabalho, implantá-lo na ferramenta e descobrir que os usuários não estão encontrando o que precisam... Que problemão né?

 

Pois é. Foi pensando nisso que resolvemos inovar criando uma nova interface de catálogo de serviços dentro da ferramenta com recursos totalmente nativos (HTMPL, PDM_LIST, Javascript, JQuery, etc) da CA SDM. Todo o investimento se resume em dois arquivos HTMPL incluídos na pasta site/mods.
Além do visual bem simplificado e ao mesmo tempo "diferente", são exibidas informações contextuais de cada requisição que informam ao usuário uma previsão de atendimento real baseada em turnos de trabalho dos recursos envolvidos, últimas requisições solicitadas, média de avaliação de pesquisas de satisfação, pesquisa heurística inteligente e outras melhorias bem legais.


O video abaixo faz uma pequena demonstração.
Até a próxima.

 

CA SDM Categories

 

publish originally: January 19 of 2016 18:34

from: CA SDM Brasil - facebook

By: Daniel Bighelini

CUSTOMIZANDO ARQUIVAMENTO E ELIMINAÇÃO 15/01/2016

 

Uma funcionalidade indispensável na ferramenta para preservar sua performance é o recurso de arquivamento de eliminação.

Através deste recurso é possível criar regras automáticas que arquivem e/ou eliminem registros específicos da base de dados.

Dependendo da utilização da ferramenta, algumas tabelas podem crescer acentuadamente prejudicando a performance geral do sistema. Eu costumo criar regras que eliminem automaticamente registros das seguintes tabelas depois de 180 dias. Estas tabelas são apenas logs e não afetarão o uso do sistema.

 

Log de auditoria

Log da sessão

Log de eventos

Log de pesquisa de conhecimento

Cabeçalho log de notificação

Log de ICs CMDB

Log de verificação de mudanças não autorizadas

 

Além disso, é possível criar novas regras de eliminação fazendo uma customização baseada no arquivo "itil_arcpur_cfg.xml" que deverá ser armazenado na pasta "$NX_ROOT\site\mods\cfg" antes que o elemento "</arcpur>" seja declarado. Para isso, basta incluir as seguintes linhas no final do arquivo:

 

<main_obj>

<name>Nome dos registros</name>

<internal_name>nome_interno</internal_name>

<factory>nome_objeto</factory>

<default_query>delete_flag=0</default_query>

<date_field>last_mod_dt</date_field>

</main_obj>

 

 

Publicado Originalmente: 18 de janeiro de 2016 às 17:33

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.

 

Bom proveito.

 

SDM REST Client 1.00.zip

 

Publicado Originalmente: October 15, 2015 às 18:07

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

 

CÓDIGO DO DIA: void z_help(string objeto, string metodo)

 

Desenvolvi uma função que pode ajudar a esclarecer o funcionamento dos metodos disponiveis da linguagem SPEL.

É exibido o nome, função, parâmetros e funcionamento do método.

É necessário um pouco de imaginação para interpretar as informações mas ajuda muito.

 

Exemplos de utilização:

z_help('api', 'val_by_key') // Exibe informações do metodo 'val_by_key' do objeto 'api'

z_help('api') // TODOS metodos do objeto 'api'

z_help() // IDEM acima

 

Até a próxima.

 

z_help.spl

 

Publicado Originalmente: October 09, 2015 às 14:43

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

 

 

LINGUAGEM SPEL (Continuação)

 

Continuando o assunto da otimização da função "exec", vou explicar o funcionamento de uma forma bem simplista.

O código é relativamente simples mas precisa ser bem entendido antes de sua implementação. Está bem documentado, quase autoexplicativo e bem parametrizável. Se quiser aprimorá-lo e distribuí-lo, fique bem a vontade.

 

Não foi fácil construí-lo devido a algumas particularidades que descobri durante o desenvolvimento. A principal dificuldade foi constatar que qualquer chamada da função "exec" sempre será executada no servidor primário da SDM, mesmo quando disparada de um servidor secundário. Outra dificuldade se deu quando o SDM estava instalado de forma distribuída, mas felizmente tudo foi resolvido.

Caso tenham alguma dúvida, postem aqui mesmo.

 

FUNCIONAMENTO

1) É executada uma função customizada chamada "string z_executar(string zs_cmd, int zi_depurar, string zs_metodo)";

2) Em seguida, através de uma bridge batch (z_executar_bridge.cmd), o comando informado é executado e os retornos são gerados;

3) O resultado da execução retorna para a função SPEL que então processa os dados.

 

COMO UTILIZAR:

1) Copie os arquivos z_executar.spl e z_executar_bridge.cmd para a pasta $NX_ROOT/site/mods/majic;

2) Altere o valor das variáveis "batadmin" e "batpassword" no arquivo z_executar_bridge.cmd informando o nome do usuário de windows que tem permissões de leitura e gravação no compartilhamento administrativo (Ex.: D$) da unidade onde está instalada o SDM em todos os servidores (primário e secundários);

3) Para fazer a chamada da função, utilize o exemplo abaixo:

 

string zs_cmd, zs_result;

zs_cmd = 'java.exe blablablablabla xyz';

zs_result = z_executar(zs_cmd, zi_depurar, zs_metodo);

 

int zi_errorlevel, zi_pos_delim;

string zs_delim, zs_return;

zs_delim = "@;@"; // define o delimitador utilizado na string de return

 

if (!is_null(zs_result)) {

zi_pos_delim = sindex(zs_result, zs_delim);

zi_errorlevel = (int) substr(zs_result, 0, zi_pos_delim);

zs_return = substr(zs_result, zi_pos_delim + 3);

if (zi_errorlevel == 0) { // em caso de sucesso

// faz algo

} else { // em caso de falha

// faz outro algo

}

 

} else {

zi_errorlevel = -1;

zs_return = format("%s ERRO ao processar a saida da execucao do comando '%s': %d", zs_metodo, zs_cmd, zi_errorlevel);

logf(ERROR, zs_return);

}

 

Aproveitem.

Até a próxima!

 

 

z_executar.zip

 

Publicado Originalmente: september 30, 2015 às 11:54

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

TMACUL

DICA DO DIA: Notepad++ & Spel

Posted by TMACUL Champion Jan 17, 2016

DICA DO DIA: Notepad++ & Spel

 

Estou catalogando no Notepad++ toda a linguagem Spel que tenho conhecimento. Vou disponibilizar aqui os procedimentos necessários para fazer o Notepad++ conhecer a linguagem.

 

1) Copie o arquivo spel.xml (anexado neste post) para dentro da pasta "C:\Program Files (x86)\Notepad++\plugins\APIs";

 

2) A partir do Notepad++, clique em "Language", "Define your language" e por último clique no botão "Import" selecionando em seguida o arquivo "userDefineLang_Spel.xml" (também anexado neste post).

 

Ainda não acabei mas já tem muita coisa documentada, Considerem esta versão inicial 1.0. Aproveitem!


spel for notepad.zip

 

Publicado Originalmente: september 23, 2015 às 21:55

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

CUSTOMIZAÇÃO DO DIA: Melhorias no "AUTOSUGGEST"


Boa tarde pessoal,

 

Retornando à ativa, hoje fiz uma pequena customização na ferramenta SDM que aprimora o funcionamento do recurso de 'autosuggest' que é utilizado para sugerir registros em campos 'lookup' em formulários de edição e pesquisa durante o preenchimento pelo usuário.
Esta customização possibilita 03 melhorias na ferramenta:

 

1) Em todos os fomrulários, as sugestões exibidas em todos os campos utilizarão o critério "contém" ao invés do critério nativo "começar com";

 

2) Em formulários de edição, as sugestões exibidas no campo "Grupo" estarão relacionadas com o contato digitado no campo "Responsável", e vice-versa. Nativamente, isso somente ocorre no campo "Responsável";

 

3) Em todos os formulários, as sugestões exibidas nos campos "Serviço afetado" e "Item de configuração" levarão em conta informações existentes no campo "system_name" além do campo padrão "name". Nativamente, somente o campo "name" é considerado nas sugestões.

COMO UTILIZAR?


- Esta customização envolve a modificação do arquivo "autosuggest.js" que deverá ser armazenado na pasta "$NX_ROOT\site\mods\www\wwwroot\scripts".
- O cache do navegador dos usuários precisa ser limpo para que a nova versão da lib entre em vigor.
- Esta customização pode ser facilmente adaptada para ter comportamentos diferenciados de acordo com o tipo de formulário (edição/pesquisa) e o tipo de atributo envolvido.

 

Bom proveito.
Até a próxima.

 

Download em: Improved autosuggest in lookup fields

 

 

Publicado Originalmente: 15 de janeiro de 2016 às 18:34

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

TMACUL

CA Service Desk Reviews

Posted by TMACUL Champion Jan 15, 2016

Esta solução foi adaptada ao português sobre a resposta do Timur - cdtj aos questionamento feito em: Re: Automatically close window after click save button

 

HiTimur, Thank You for sharing your code, it's one adaptation to Brazilian Portuguese.

 

 

Precisa definir 3 argumentos

 

1. Definir next_persid :

ahdframeset.top_splash.next_persid = "<SOME_PERSID>";

Utilizadno para criar objetos filho, o persid são o persistent id dos pais.

 

2. Atualizar o SET.id no formulário:

var set_id = main_form.elements["SET.id"];

set_id.value = "HTMPL=show_main_detail.htmpl&SET.id=" + "$args.id";

set_id.name = "INPUT_FIELDS_TO_PARSE";

 

Para obter mais informações, detalhe a função detailSave().

 

 

Abaixo o código da solução completa utilizada nos meus formulários

function setAutoClose() {

    if (_dtl.edit) {

        var set_id = main_form.elements["SET.id"];

        set_id.value = "HTMPL=show_main_detail.htmpl&SET.id=" + "$args.id";

        set_id.name = "INPUT_FIELDS_TO_PARSE";

        ahdframeset.top_splash.next_persid = "z_mi_rep:" + argParentID;

    }

}

...

<BODY class="detailro" onunload="unloadActions();" onload="setAutoClose();">

Alguns links úteis para utilizar o CABI

 

 

 

CABI4::. Summary - BOXI for CA SDM 

http://www.econotimes.com/CA-Technologies-The-Surprise-Of-2016-Will-Be-The-Resurgence-Of-Blockchain-Technology-141587CA Technologies: The Surprise Of 2016 Will Be The Resurgence Of Blockchain Technology
Read more at http://www.econotimes.com/CA-Technologies-The-Surprise-Of-2016-Will-Be-The-Resurgence-Of-Blockchain-Technology-141587#IWSKv3p9tuKKv2Td.99

 

Tuesday, January 12, 2016 5:22 AM UTC

 

 

CA Technologies, the U.S.-based IT giant, has put forward five technology predictions for 2016 in a blog post. Penned by Otto Berkes, Chief Technology Officer at CA Technologies, the predictions relate to container proliferation, agile security, analytics, Internet of Things (IoT), and blockchain technology.

 

According to Berkes, IoT is a high-potential technology and is at a very young stage. He said as IoT moves mainstream in 2016, the “identity of things” will gain importance – the “identity” of a device and any data flow to it must be confirmed and trusted.

 

He added that the development of IoT sensors and smart devices and their interaction with us in critical areas, such as the healthcare and automotive industries, will help simplify and improve customer experiences.

 

Coming to the topic of blockchain technology, Berkes said that it was a key word in many startups two years ago. He said that the technology is poised for renewal, particularly when the predicted increase in IoT is taken into account along with the need to engage securely among devices and have a record of those engagements.

 

“The surprise of 2016 will be the resurgence of blockchain technology and its refinement to where it can truly find a home outside of the Bitcoin transaction ledger”, said Berkes. “Blockchain will have to overcome its “guilt by association” with the Bitcoin problems, but the capability exists for it to become the storage of choice for sensors and IoT in general.”

 

He also pointed out that a technology, like blockchain, that relies on a network of computers and has privacy at its core will be an “important enabler” of IoT.

 

“Businesses have the potential in 2016 to exceed customer expectations on every level by living agile practices and digitally transforming their operations”, Berkes added.
Read more at http://www.econotimes.com/CA-Technologies-The-Surprise-Of-2016-Will-Be-The-Resurgence-Of-Blockchain-Technology-141587#IWSKv3p9tuKKv2Td.99

 

É possível associar contatos a tipos de tratamento especial.

Essa associação lhe permite exibir e localizar facilmente contatos que exigem atenção especial, por exemplo, para identificar tickets em uma lista que especifica:

  • VIPs (Very Important Person - Pessoas muito importantes),
  • Deficientes visuais ou
  • Visitantes como usuários finais afetados.

 

É possível criar tipos de tratamento especial e associá-los a contatos.

 

Para criar um tipo de tratamento especial, faça o seguinte:

 

Siga estas etapas:

 

ImagensDescrição
CASDM_Login.jpg01. CA SDM Login
TAB_Menu_adm.jpg02. Na guia Administração
CASDM_Menu_Adm_ServiceDesk.jpg03. Selecione Service Desk,
menu_dados_de_aplicativo.jpg04. Selecione Dados de aplicativo
menu_codigos.jpg05. Códigos
tipos_de_tratamento_especial.jpg

06. Tipos de tratamentos especiais

Aparece a página Lista de tratamento especial.

Criar.jpg

07. Clique em Criar.

Aparece a página Criar tratamento especial.

criar_tratamento_especial.jpg08. Preencha os campos como apropriado e clique em Salvar.
botao_atualizar_integrantes_do_tratamento_especial.jpg09. Clique em Atualizar membros do tratamento especial.

A página Pesquisa de contato aparece.

10. Preencha os campos de pesquisa conforme apropriado, e clique em Pesquisar

11. Selecione um ou mais contatos na coluna Contatos e use o botão Mover (>>) para mover os contatos para a coluna Tratamento especial. Clique em OK.

 

Observação: é possível remover um contato de uma associação usando o botão Mover (<<). Mova o contato na coluna à direita para a coluna da esquerda.O tipo de tratamento especial é criado e associado aos contatos.

 

12. Clique em Fechar janela.

 

 

Este procedimento está oficialmente descrito na documentação CA WIKI

 

Opções de tipos de tratamento especial -     Portuguese - Brazil

 

Special Handling Types Options -                  English

 

The viewer could not process an event. Your request could not be completed because a failure occurred while the report was being processed. Please contact your system administrator. [RCIRAS0546]

---- Error code:0 [CRWEB00000119]

RCIRAS0546.png

 

com.businessobjects.report.web.shared.WebReportingException: The viewer could not process an event. Your request could not be completed because a failure occurred while the report was being processed.  Please contact your system administrator. [RCIRAS0546] ---- Error code:0 [CRWEB00000119]

at com.businessobjects.report.web.shared.WebReportingException.throwWebReportingException(WebReportingException.java:71)

at com.businessobjects.report.web.component.ViewerContainer.processEvents(ViewerContainer.java:1439)

at com.businessobjects.report.web.WorkflowController.doEventProcessing(WorkflowController.java:353)

at com.businessobjects.report.web.WorkflowController.doLifecycle(WorkflowController.java:255)

at com.businessobjects.report.web.WorkflowController.doAsyncLifecycle(WorkflowController.java:106)

at com.crystaldecisions.report.web.viewer.CrystalReportViewerUpdater._processHttpRequest(CrystalReportViewerUpdater.java:61)

at com.crystaldecisions.report.web.ServerControl.processHttpRequest(ServerControl.java:345)

at com.crystaldecisions.report.web.viewer.CrystalReportViewerServlet.doUpdate(CrystalReportViewerServlet.java:206)

at com.crystaldecisions.report.web.viewer.CrystalReportViewerServlet.doPost(CrystalReportViewerServlet.java:194)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

at com.businessobjects.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:110)

at com.businessobjects.http.servlet.internal.ServletLastFilterChainElement.service(ServletLastFilterChainElement.java:30)

at com.businessobjects.http.servlet.internal.filter.FilterChainImpl.doFilter(FilterChainImpl.java:46)

at com.businessobjects.bip.core.web.filter.BrowserRenderingModeFilter.doFilter(BrowserRenderingModeFilter.java:32)

at com.businessobjects.http.servlet.internal.FilterRegistration.doFilter(FilterRegistration.java:72)

at com.businessobjects.http.servlet.internal.filter.FilterChainImpl.doFilter(FilterChainImpl.java:43)

at com.businessobjects.bip.core.web.boetrustguard.BOETrustPrepareFilter.doFilter(BOETrustPrepareFilter.java:35)

at com.businessobjects.http.servlet.internal.FilterRegistration.doFilter(FilterRegistration.java:72)

at com.businessobjects.http.servlet.internal.filter.FilterChainImpl.doFilter(FilterChainImpl.java:43)

at com.businessobjects.bip.core.web.supportabilty.TraceLogScopeFilter.doFilter(TraceLogScopeFilter.java:38)

at com.businessobjects.http.servlet.internal.FilterRegistration.doFilter(FilterRegistration.java:72)

at com.businessobjects.http.servlet.internal.filter.FilterChainImpl.doFilter(FilterChainImpl.java:43)

at com.businessobjects.sdk.actionfilter.WorkflowFilter.doFilter(WorkflowFilter.java:45)

at com.businessobjects.http.servlet.internal.FilterRegistration.doFilter(FilterRegistration.java:72)

at com.businessobjects.http.servlet.internal.filter.FilterChainImpl.doFilter(FilterChainImpl.java:43)

at com.businessobjects.bip.core.web.appcontext.RequestInitFilter.doFilter(RequestInitFilter.java:26)

at com.businessobjects.http.servlet.internal.FilterRegistration.doFilter(FilterRegistration.java:72)

at com.businessobjects.http.servlet.internal.filter.FilterChainImpl.doFilter(FilterChainImpl.java:43)

at com.businessobjects.http.servlet.internal.BundlePathAwareServiceHandler.serviceHelper(BundlePathAwareServiceHandler.java:235)

at com.businessobjects.http.servlet.internal.BundlePathAwareServiceHandler.service(BundlePathAwareServiceHandler.java:197)

at com.businessobjects.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:248)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

at org.eclipse.equinox.servletbridge.BridgeServlet.service(BridgeServlet.java:220)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at com.businessobjects.pinger.TimeoutManagerFilter.doFilter(TimeoutManagerFilter.java:168)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)

at java.lang.Thread.run(Thread.java:761)

Caused by: com.crystaldecisions.sdk.occa.report.lib.ReportSDKException: Your request could not be completed because a failure occurred while the report was being processed.  Please contact your system administrator.---- Error code:-2147217395 [RCIRAS0546] Error code name:serverProgrammingError

at com.crystaldecisions.sdk.occa.report.lib.ReportSDKException.throwReportSDKException(ReportSDKException.java:120)

at com.crystaldecisions.sdk.occa.managedreports.ps.internal.SendRequestHelper.sendRequest(SendRequestHelper.java:141)

at com.crystaldecisions.sdk.occa.managedreports.ps.internal.CacheReportSource.sendRequest(CacheReportSource.java:1796)

at com.crystaldecisions.sdk.occa.managedreports.ps.internal.CacheReportSource.getPage(CacheReportSource.java:1283)

at com.businessobjects.report.web.event.PageListener.renderContentLocally(PageListener.java:377)

at com.businessobjects.report.web.event.PageListener.getPage(PageListener.java:178)

at com.businessobjects.report.web.event.PageListener.updatePage(PageListener.java:120)

at com.businessobjects.report.web.event.UpdatePageEvent.processListener(UpdatePageEvent.java:47)

at com.businessobjects.report.web.event.ViewerBroadcaster.broadCastEvent(ViewerBroadcaster.java:136)

at com.businessobjects.report.web.event.ViewerBroadcaster.broadcast(ViewerBroadcaster.java:110)

at com.businessobjects.report.web.event.EventQueue.processEvents(EventQueue.java:53)

at com.businessobjects.report.web.component.ViewerContainer.processEvents(ViewerContainer.java:1426)

... 51 more

 

 

Solution: 

server memory upgrade - Before to invest on server resources, search for these itens:

 

01. Are you using 16 Gb RAM or more for CABI Server?

02. Try to run 3 times, is it possible see the results?

03. Testing your CA SDM Connection (odbcad32.exe)

 

 

 

TEC 1197186

CABI 4.1 Supported Platforms

 

 

Sometimes it is necessary to consult a list of records of an object and it is important to know functioning of domset's. A domset defined as a list of values must be created. Therefore, the correct use of a domset directly influences the result and function of performance "sync_fetch" for example. In addition to various other functions similar listing ("select", "select_count", "fetch", etc.).

 

Basically, there are 02 types of Domsets: MList (Master) and RLIST (Restricted), and within these, two subtypes: and STATIC DYNAMIC.

And furthermore there may be other specific domset's of a factory that were created for a specific need of an application (Ex .: scoreboard on the cr object).

 

To see all domset's available on an object, use the command

bop_sinfo -l <object name>

 

 

As a rule, restricted domset's (RLIST) have "where" clause built into own operation. And because of this generate a subset of records from a domset MList. I will highlight two domset's the 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

 

The difference is: domsets RLIST only includes records "active".  Furthermore, MLIST's are usually faster - because the CA SDM maintains pointers object server memory columns in RAM instead of using a bank index. This is good and bad at the same time but I will not dwell here.

 

What is the difference between gift set STATIC and 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.

 

The object list always use static domset's when created NOT suffered content change even when process, some record is added, modified or deleted. If it were dynamic, it would happen and the search result would change.

 

 

Finishing, an interesting tip:

Many implementers often create a .MOD file certain object by declaring a STANDARD_LIST as in the example below:

 

MODIFY FACTORY in {

STANDARD_LISTS {

SORT_BY "open_date DESC,priority DESC";

};

};

 

This makes the SDM "replaces" all existing MList and RLIST domsets the objects and the results sometimes directly affect the product performance. Instead, choose customize the form "list _ ***. HTMPL" changing the PDM_MACRO "lsend" or manipulating the $ sort server variable. It is much more practical and enables different registry sorting settings according to the function (role) User.

 

 

was publish initially: 13 de outubro de 2015 às 16:06

From: CA SDM Brasil - Facebook

Author: Daniel Bighelini

 

Translated by Google attending to request by Timur

 

Do you would like to see in Portuguese, access : Leia em português:

LINGUAGEM SPEL (domset's) 13/10/2015

CA Virtual Summit - 03.03.2016 - http://www.cavirtualsummit.com/

 

Finalmente a transformação digital encontrou o palco perfeito.

 

Finalmente la transformación digital encontró un escenàrio perfecto

Impacto do anúncio da Microsoft a respeito do fim do suporte para o Internet Explorer 8, 9 e 10 com relação ao Gerenciamento de Serviços CA

 

 

A CA Technologies está trabalhando continuamente para melhorar nosso software e serviços para melhor atender às necessidades dos nossos clientes. Esta mensagem é para informar os clientes sobre o impacto que o anúncio da Microsoft em 7 de agosto de 2014 para se aposentar suporte para algumas versões do Internet Explorer terá sobre uso de Gestão CA Service (CA Service Desk Manager, o CA Service Catalog, CA IT Asset Manager da sua organização ).

 

Em 7 de agosto, 2014, a Microsoft fez uma mudança significativa em sua política de apoio Internet Explorer. Terça-feira eficaz, 12 de janeiro de 2016, apenas a versão mais atual do Internet Explorer disponíveis para um sistema operacional com suporte receberão apoio e segurança atualizações técnicas. Com relação ao CA Service Management, existem dois conjuntos de potenciais impactos:

 

As versões suportadas GA (12,9 e 14,1) do CA Service Management são compatíveis com a versão mais recente do Microsoft Internet Explorer (IE Microsoft Internet Explorer 11), e os clientes são encorajados a começar a usar o mesmo em conjunto com CA Service Management.

 

Os clientes podem continuar a utilizar as versões anteriores do Microsoft Internet Explorer que são percebidas como "suportado" nas matrizes de suporte para o CA Service Desk Manager 12.9, o CA Service Catalog 12.9, CA IT Asset Manager 12.9 e CA Serviço de Gerenciamento de 14,1. No entanto, depois de terça-feira janeiro 12, 2016, a CA Technologies deixará de fornecer quaisquer correções, patches, service packs, atualizações, upgrades, mudanças programáticas ou cobertura para quaisquer questões resultantes de tal uso. Os clientes podem continuar a entrar em contato com o suporte da CA depois de terca-feira, janeiro 12, 2016, para a configuração básica, uso e solução de problemas do CA Service Management com o Microsoft Internet Explorer 8, 9 ou 10 em um "tal como está". Se uma solução não pode ser determinado, o cliente entende que seu problema será considerado "insolúvel".

 

Neste momento, nós encorajamos você a planejar os impactos listados acima. Como um lembrete, CA Service Management também suporta as versões de outros navegadores - Mozilla Firefox e Google Chrome - como observado nas matrizes de suporte das versões GA suportados.

 

Se você tiver qualquer dúvida sobre o cronograma de apoio, entre em contato com o suporte técnico da CA Service Management através do portal online do CA Support. A nossa Política de Ciclo de Vida do Suporte Técnico também está disponível neste site.

 

O seu sucesso é muito importante para nós, e estamos ansiosos para continuar a nossa parceria de sucesso com você.

 

Anúncio original em Inglês, por Rajeev Kumar

Impact of Microsoft’s Announcement regarding End of Support for Internet Explorer 8, 9 and 10 with regards to CA Service Management 

 

traduzido para o portuguêsno Google Translator

 

CA Service Desk Manager Certification Matrix - CA Technologies

 

APM129 Supportability Matrix - CA Asset Portfolio Management 12.9

 

 

Commands

Pdm_d_refresh

Pdm_webcache

Pdm_cache_refresh

Pdm_tomcat_nxd

Pdm_publish

Command-Line_Interface

 

Administration

Options_Manager.

Data_Type_Conversion

 

LDAP_Integration

 

Data_Partitions.

Web_Screen_Painter.

 

 

more..

How_to_Script_Buttons

 

Troubleshooting_Spell_Code

Set_Priority_Based_on_Urgency_and_Impact

Custom Lookup method for TextAPI

Modify_Action_and_Condition_Macros_via_the_GUI

R12_Go_button_Search_Customization

Conditionally_Attach_an_Event.

Add_Personalized_Response_to_Manual_Notification

Send_WaitCall_attrSync_fetch.

Action_Macro_to_Log_Solution_and_Resolve_Ticket.

Increasing_Default_Field_Size

Root_Cause.

Add_Log_Entry_When_a_Property_Value_Changes_on_a_Ticket.

Additional_Sorting_on_List_Panel.

Attachments_on_Configuration_Items_r12.

Refresh_Customer_Info_Before_Saving_the_Ticket.

Service_Desk_FAQ.

Sample_Queries.

SD_working_with_Google_Chrome.

Send_Survey_based_on_Variables

Close_attached_incidents.

Dependent_dropdowns

Send_WaitCall_Attr

Events_and_Macros.

Add_Custom_Activity_Log_Action_Macro.

Service_Desk_History.

List_Tickets_ORDER_BY_Group

Dob_attr_type_info.

Add_Log_Entry_for_Updates_to_Custom_Fields.

Copying_an_Access_Type_Scoreboard.

Web_Services.

Attachments_on_Configuration_Items

Get_dob_Spell_method

Display_Buttons_for_Group_members_only.

Get_val_Spell_method

Get_attr_vals

Changing_Error_Alert_Color_and_adding_Error_Alert_Pop-ups

Time-based_Stored_Queries

Cnt.get_members_to_notify_by_persid

How_To_Manage_Spell-Based_Macros.

Conditional_Display_of_Drop-Down_Content.

SPELL_CODE_to_Make_ACT_/_EVT_INTERNAL.

URLS_for_Computer_Telephony_Integration_(CTI).

Search_Requests,_Incidents,_and_Problems_Simultaneously_for_Ticket_Number.

SPELL_CODE_to_to_add_event_at_50%25_and_75%25_of_the_time_between schedule start time and duration

Count_Ticket_Reopens

Control_the_Request_Areas_Displayed_to_the_End_Users

Add_Checkbox,_Date,_Drop-down,_Lookup,_Readonly_and_Text_Fields_to_Properties

CA Unicenter Service Desk (also known as CA Service Desk, Unicenter ServicePlus Service Desk, Advanced Help Desk, ServiceIT, USPSD, USD and AHD) is an enterprise service desk software solution provided by CA, Inc.

Product History

In 1991, a company named Networx, Inc. was formed. During 1992, Networx developed a service desk product named Paradigm. In mid-1992 Networx began shipping an AIX-based UNIX version to IBM, their first client. In December 1992, Networx began shipping a Sun Solaris compatible version. In the following years, Networx developed HP-UX and Microsoft Windows NT/2000 versions. In early 1993, Paradigm won LAN Magazine's Product of the Year Award in the service desk category.In September 1993, Networx, and all of its assets, was sold to Legent Corporation. CA (then known as Computer Associates) acquired Legent Corporation in 1995. CA began selling Paradigm in mid-1995. In early 1996, a companion product to Paradigm was created and named Unicenter TNG Advanced Help Desk Option (AHD). The functionality of Paradigm and AHD was fundamentally the same; however, Paradigm was sold as a stand-alone service desk, whereas AHD was sold as an option to Unicenter TNG.In early 1999, Paradigm was renamed as ServiceIT Enterprise Edition. Both AHD and ServiceIT Enterprise Edition existed until October 2001, at which time they were combined into one product and sold as Unicenter Service Desk version 5.5. With this release, one could install Unicenter Service Desk as either stand-alone or integrated with Unicenter TNG. During this period CA acquired Professional Help Desk (PHD) and Platinum’s Apriori product. Both acquisitions brought significant knowledge management functionality to CA.In April 2002, CA introduced a service desk suite called Unicenter ServicePlus. Unicenter ServicePlus consisted of five modules as follows:

    • Unicenter ServicePlus Service Desk
    • Unicenter ServicePlus Customer Service
    • Unicenter ServicePlus Knowledge Tools
    • Unicenter ServicePlus Collaboration Tools
    • Unicenter ServicePlus Predictive Tools

Customer Service, Knowledge Tools and Collaboration Tools (aka Human Touch) above were initially part of the CA Intelligent CRM Suite; however, CA stopped selling these products under the “Intelligent CRM” label. Unicenter ServicePlus Knowledge Tools is a product that is based on technology acquired from the Professional Help Desk and Apriori acquisitions.The creation of the Unicenter ServicePlus solution set mostly involved re-branding the products: Unicenter ServicePlus Service Desk 5.5.1 was Unicenter Service Desk 5.5; the only difference being the name and updated branding within the product.

    • Unicenter ServicePlus Customer Service - was Intelligent CRM Suite Customer Service
    • Unicenter ServicePlus Knowledge Tools - was Intelligent CRM Suite Customer Intelligence
    • Unicenter ServicePlus Collaboration Tools - was Intelligent CRM Suite Human Touch
    • Unicenter ServicePlus Predictive Tools - was new and based on the CA artificial intelligence technology, Neugents.

6.0

In April 2003, CA made available new versions of both Unicenter ServicePlus Service Desk and Unicenter ServicePlus Knowledge Tools. Both of these new product releases were generally available and labeled version 6.0. The Unicenter ServicePlus Customer Service functionality was incorporated into this new release of Unicenter ServicePlus Service Desk to allow customers to leverage both internal and external support within a single system.

In November 2003, a French version of Unicenter ServicePlus Service Desk 6.0 was released. In May 2004, CA added a new product to the overall suite, Unicenter ServicePlus Dashboard. The Dashboard is a near real-time graphical display tool designed to provide key metrics to service desk operations management.

In July 2004, a decision was made to retire the Unicenter ServicePlus Collaboration Tools and Unicenter ServicePlus Predictive Tools.

R11

In October 2005, CA announced availability of the r11.0 version for all the products within the Service Support initiative, i.e. Unicenter Service Desk, Unicenter Service Desk Knowledge Tools, Unicenter Service Desk Dashboard, and a new product, Unicenter Service Intelligence. The Unicenter Service Intelligence product focused on a CIO’s view of all service support activities and the ability to understand the trends within the internal support organization. The r11.0 version of these products featured support for the Ingres database and two operating environments including Windows and Linux. The ServicePlus brand name was removed with this release.

R11.0 was a major upgrade of the Unicenter line of product by making them working together using the same core of information (the ca-mdb). The database model was an evolution highly inspire of the ITIL model but was not a fully CMDB. This also need some new process behind the scene like the CORA for synchronization between Configuration Item.

In January 2006, CA released the r11.1 version for Unicenter Service Desk, Unicenter Service Desk Knowledge Tools and Unicenter Service Desk Dashboard, which added additional support for the Microsoft SQL Server database.

In January 2006, CA announced the acquisition of Control-F1, a privately held provider of support automation solutions that automatically prevent, detect, and repair end-user computer problems before they disrupt critical IT services. The newly acquired Control-F1 products extended the CA service support solution offering, and included version 5.3 of CA SupportBridge Live Automation, CA SupportBridge Self-Service Automation, and CA SupportBridge Self-Healing Automation.

In March 2006, CA announced that the Unicenter Service Intelligence product would be merged into a future version of Unicenter Asset Intelligence to form a combined cross-product reporting solution. Because of this decision, no future versions of the stand-alone Unicenter Service Intelligence product would be built beyond r11.0.

In June 2006, Unicenter Service Desk, Unicenter Service Desk Knowledge Tools and Unicenter Service Desk Dashboard r11.2 were released. The r11.2 version provided support for more platforms, including UNIX (Sun Solaris, IBM AIX and HP-UX), and the Oracle database. The r11.2 version also provided new accessibility features that align with the US Government’s Section 508 and WCAG standards.

In August 2006, CA released a localized version of r11.1. This release provided fully translated versions of r11.1 in French, German and Japanese. A localized release of r11.2 available in French, German, Japanese, Italian, Spanish, Brazilian Portuguese and Simplified Chinese is currently planned for 2007.

In February 2007, CA SupportBridge 6.0 was released.

R12

R12 of USD has been made available through a beta program to some USD consultants. One of the largest changes of this release is the adoption of user profiles and roles, a feature intended to avoid the need for several administrative virtual users.

Overview

This article provides customization to detail_in.htmpl for refreshing end user location and phone (as displayed on the form) when the end user changes BEFORE saving the change. The code works, but I am not crazy about it. I am hoping that someone can find a more elegant way to implement the same. I have only implemented and did limited testing in development, so the code has not been tested in the real world environment.

My understanding of the code is very limited, and was gained by trial and error, so my explanation and terminology might not be correct.

There are functions that you can use to call the server, I only mention two of them here: upd_workframe() and display_new_page(). In calls to these functions you can specify a callback function that will receive the results of the server lookup. In this code, I used two calls to display_new_page(): zCustomerLocationCallback() was specified as the callback in the 1st call, and zCustomerPhoneCallback() in the second one.

I encountered a few problems. First, I could not find a way to look up both location and phone in one server call, even though they both would be a lookup of the same record based on the same contact UUID. As a result, I had to do two server calls. Another problem is that if you try to do one server call after another, only the callback that was evoked by the last one will be executed. In other words, if in backfill_cnt_event() I had the following code, I would only see the phone being refreshed:

upd_workframe("GET_SVC_CONTRACT", "new_customer=cnt:" + cntID,

"func=parent.ahdframe.get_svc_callback");

display_new_page(url,ahdframeset.workframe); // with url for zCustomerLocationCallback()

…..

display_new_page(url,ahdframeset.workframe); // with url for zCustomerPhoneCallback()

That means that if you want to execute more than one callback per event, you have to call the next one from the previous. In this particular scenario, I had to execute 3 callback functions when an end user changes:
1. Service contract check (upd_workframe("GET_SVC_CONTRACT"..) - out of the box behavior)
2. Location lookup
3. Phone lookup
So I had to “chain” them: location callback function triggers phone callback, and phone callback triggers Service contract check.

I based my code on nr_inv_tab.htmpl and nr_ops.js: this code causes the manufacturer to be refreshed when the model of the asset changes. zcustomerChanged() is based on ModelChanged(), and the 2 callback functions are based on modelChangedCallback(). The difference is that I could not use onBlur() or on Change(), because I needed contact UUID, not the combo name(there can be duplicates), and it wouldn’t be available there. That’s why I used function

backfill_cnt_event( form_name, base_name, lname, fname, mname, cntID, caller_type )

where cntID is the new contact UUID. Also, I noticed that in nr_inv_tab.htmpl vendor only gets refreshed if the model is selected from the model search window, and not if you type it in and tab out. My code works in both scenarios.

View the Complete Code

Click Here to download the complete code.

Customization Steps

Step 1. Add customer location and phone

Note that Ids are important here - they will be used by the callback functions to refresh the fields.

<PDM_MACRO NAME=dtlReadonly hdr="End User Location" attr="customer.location" id=custloc> <PDM_MACRO NAME=dtlReadonly hdr="End User Phone" attr="customer.phone_number" id=custphone>

Step 2. Modify function backfill_cnt_event() as follows

Comment out (or delete) Contract enforcement code and add a call the new custom function. It will look as follows:

function backfill_cnt_event( form_name, base_name, lname, fname, mname,

  cntID, caller_type )

{

   if (_dtl.edit && !_dtl.skip_agt_check)

   {

var f = void(0);

var r = form_name.match(/main_form([0-9]*)/);

if ( r != null ) {

if ( r[1].length == 0 )

f = _dtl.form[0];

else

f = _dtl.form[r[1]-0];

}

detailAgtCheck(f, base_name, cntID, prop_ref);

   }

  detailCntBackfill( form_name, base_name, lname, fname, mname,

  cntID, caller_type );

 

   // sk: if user org has a service contract, the following code will clear out the category after changing user

   // if it is not a private category from the contract under the contract, and will display message:

   // "The current category can not be used with the current End User. The category has been reset."

// Contract enforcement: 

/*
if (ahdtop.cfgNX_CLASSIC_SLA_PROCESSING != 'Yes' &&
base_name == "customer" && typeof cntID != "undefined" && cntID.length > 1) {

  upd_workframe("GET_SVC_CONTRACT", "new_customer=cnt:" + cntID,
"func=parent.ahdframe.get_svc_callback");
}
*/

   // Note: even if remove "typeof cntID != "undefined" && cntID.length > 1", zRefreshCustomerInfo() still does not get called

   if (base_name == "customer" && typeof cntID != "undefined" && cntID.length > 1)

   {

  zcustomerChanged(form_name, base_name, lname, fname, mname, cntID, caller_type);

   }

}

Step 3. Add the following code at the end of backfill_cnt_event()

if (base_name == "customer" && typeof cntID != "undefined" && cntID.length > 1)

   {

  zcustomerChanged(form_name, base_name, lname, fname, mname, cntID, caller_type);

   }

Step 4. Add the following java script code before function backfill_cnt_event()

var zcurrCustID="";

 

// Based on modelChanged() in nr_ops.js

function zcustomerChanged(form_name, base_name, lname, fname, mname, cntID, caller_type ) {

  //alert(cntID); //newly selected contact UUID

  var zFID=document.forms["main_form"].elements["FID"].value;

  var zSID=document.forms["main_form"].elements["SID"].value;

  var zcntID=cntID.replace("U","");

  zcntID=zcntID.replace("'","");

 

  if (zcurrCustID == zcntID)

   return;

  zcurrCustID=cntID;

 

  var url;

  if(ahdframe.currentAction==0) // =0 if customer selected from contact list; =6 if typed in

  {

  set_action_in_progress(ACTN_AUTOFILL);

  }

  url=cfgCgi+"?SID="+zSID+"+FID="+zFID

  +"+OP=SEARCH+FACTORY=cnt"

  +"+KEEP.domset_name=RLIST_STATIC"

  +"+QBE.EQ.id="+escape(zcntID)

  +"+KEEP.backfill_attr=location.name"

  +"+HTMPL=javascript:parent.ahdframe.zCustomerLocationCallback";

  display_new_page(url,ahdframeset.workframe);

  if(ahdframe.currentAction==0) // =0 if customer selected from contact list; =6 if typed in

  {

  set_action_in_progress(ACTN_AUTOFILL);

  }

}

 

// Based on modelChangedCallback() in nr_ops.js

function zCustomerLocationCallback(persid,value,rel_attr_val)

{

  set_action_in_progress(0);

  //alert(persid); // cnt UUID with "cnt:" prefix

  //alert(rel_attr_val); // cnt UUID without "cnt:" prefix

  //alert(value); // location name

  var e=document.getElementById("custloc");

  if(e!=null)

  e.innerHTML=value;

 

  var zFID=document.forms["main_form"].elements["FID"].value;

  var zSID=document.forms["main_form"].elements["SID"].value;

  var url=cfgCgi+"?SID="+zSID+"+FID="+zFID

  +"+OP=SEARCH+FACTORY=cnt"

  +"+KEEP.domset_name=RLIST_STATIC"

  +"+QBE.EQ.id="+escape(rel_attr_val)

  +"+KEEP.backfill_attr=phone_number"

  +"+HTMPL=javascript:parent.ahdframe.zCustomerPhoneCallback";

  display_new_page(url,ahdframeset.workframe);

  if(ahdframe.currentAction==0) // =0 if customer selected from contact list; =6 if typed in

  {

  set_action_in_progress(ACTN_AUTOFILL);

  }

}

 

// Based on modelChangedCallback() in nr_ops.js

function zCustomerPhoneCallback(persid,value,rel_attr_val)

{

  set_action_in_progress(0);

  var e=document.getElementById("custphone");

  if(e!=null)

  e.innerHTML=value;

 

  if (ahdtop.cfgNX_CLASSIC_SLA_PROCESSING != 'Yes') {  

  upd_workframe("GET_SVC_CONTRACT", "new_customer=cnt:" + rel_attr_val, "func=parent.ahdframe.get_svc_callback");

  }

}

Para os desenvolvedores de plantão.

É possível criar novas operações web do tipo "OP=DISPLAY_FORM / SEARCH / etc" que possibilitem que o usuário dispare novos métodos SPEL através da interface web.

O retorno se dá através do comando "send_frame_resp" que alimenta um javascript em um frame oculto do formulário de origem. A execução é síncrona e pode possibilitar que o SDM execute literalmente qualquer coisa.

 

As operações nativas do produto ficam armazenadas no arquivo $NX_ROOT\bopcfg\www\op_table.cfg. E as novas operações customizadas devem ficar em $NX_ROOT\site\mods\www\op_custom.cfg.

 

Dentro destas respectivas pastas os respectivos arquivos de métodos SPEL devem ser armazenados.

Operações não são executadas pelo processo SPEL_SRVR, mas sim pelo WEBENGINE. Portanto, toda vez que houver modificação em algum método, o webengine deverá ser reiniciado.

A estrutura ficaria parecida com o exemplo abaixo:

No arquivo op_custom.cfg:

Z_TESTE z_teste MODIFY UPDATE

 

 

No arquivo z_teste.spl

z_teste(...) {

int zi_id_event;

object zo_new_obj;

zi_id_event = argv[0];

zo_new_obj = argv[1];

dump_args(zo_new_obj);

string return_msg;

return_msg = format("TESTE OK no objeto %s", zo_new_obj.PERSID);

 

 

if (!is_null(return_msg)) {

format_to_js(return_msg));

zo_new_obj.CALLBACK="alert(myMsg)";

 

 

string zs_new_js;

zs_new_js = format("var myMsg='%s';", return_msg);

send_frame_resp((long)zi_id_event, (object)zo_new_obj, (string)zs_new_js);

}}

 

 

E finalmente no formulário HTMPL::

var url = cfgCgi + "?SID=" + cfgSID + "+FID=" + fid_generator() + "+OP=Z_TESTE" + "+FACTORY=cr" + "+PERSID=" + argPersistentID + "+POPUP_NAME=" + '$args.KEEP.POPUP_NAME' + "+KEEP.POPUP_NAME=" + '$args.KEEP.POPUP_NAME' + "+CALLBACK=test";

<PDM_MACRO name=button Caption="TEST OP" Func="display_new_page(url, ahdframeset.workframe);" hotkey_name="TEST_OP[P]" ID=TEST_OP>

 

 

Mais informações no link: SPEL: Register custom webengine OP

 

Publicado Originalmente: 14 de setembro às 10:07

Em: CA SDM Brasil - facebook

Por: daniel-bighelini

 

 

Social Communities for CA Service Management Arround the world - CA Technologies

Copying an Access Type Scoreboard

 

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 instructions for copying the default Scoreboard of one Access Type and using it for the default of a new Access Type.

Note: r12 includes a copy feature which makes these procedures obsolete when creating a new Access Type. However, they may still be used when wanting to update existing Access Type Scoreboards.

Procedures

Step 1. Obtain of Both Access Types

Run the following command where the sym is the name of the Access Type you are obtaining the id for:

pdm_extract -f "select id from Access_Type where sym='Administrator'"

In this example, the id returned is 2402. Lets assume the id of the other Access Type returned an id of 400001.

Step 2. Backup the User_Query Table

pdm_extract -f "select * from User_Query where obj_persid='acctyp:2402'" > User_Query_bkup.txt

Step 3. Extract the Original Access Type's Scoreboard

pdm_extract -f "select expanded, factory, label, last_mod_by, last_mod_dt, obj_persid, parent, query, query_set, query_type, sequence from User_Query where obj_persid='acctyp:2402'" > score_out.txt

Step 4. Edit the Extract File

Edit the score_out.txt file and change any occurrence of acctyp:2402 to the new access type value of acctyp:400001. Save the modified output to a new file scoreboard_in.txt

Step 5. Load the New Data

pdm_load -i -f scoreboard_in.txt -v

Step 6. Extract Parent References

Now comes the hard part of parent/child relationships... otherwise known as folder/node relationships. Run the following two command:

pdm_extract -f "select id, parent, sequence from User_Query where obj_persid='acctyp:2402'" > part1.txt
pdm_extract -f "select id, parent, sequence from User_Query where obj_persid='acctyp:400001’" > part2.txt

Step 7. Compare the Extracts

Open both these files and place them side by side. Compare part1.txt and part2.txt. Notice all the entries with the parent set to "0". These are the folders that appear on the Scoreboard. All the other entries are the nodes that reside within the folders. Notice how the nodes all reference the id of a parent... in other words the id of the folder they belong to. In the part2.txt extract all the nodes are still referencing the id's of folders belonging to the original Access Type's Scoreboard (part1.txt). What you need to do is change all these parent references to ids belonging to the folders of the new Access Type's Scoreboard. Do this by editing part2.txt and saving it as part2_new.txt.

part1.txtpart2.txtpart2_new.txt
TABLE User_Query id parent sequence { "7872" ,"0" ,"100" } { "7966" ,"7872" ,"200" } { "7967" ,"7872" ,"300" } { "7800" ,"7872" ,"400" } { "7801" ,"7872" ,"500" } { "7802" ,"7872" ,"600" } { "7803" ,"7872" ,"800" } { "7804" ,"7872" ,"800" } { "8051" ,"7872" ,"900" } { "8052" ,"7872" ,"1000" } { "7805" ,"7872" ,"1100" } { "7806" ,"7872" ,"1200" } { "7807" ,"7872" ,"1300" } { "7808" ,"7872" ,"1400" } { "7809" ,"7872" ,"1500" } { "7810" ,"7872" ,"1600" } { "7811" ,"7872" ,"1700" } { "7812" ,"7872" ,"1800" } { "7813" ,"7872" ,"1900" } { "7968" ,"0" ,"2000" } { "7969" ,"7968" ,"2100" } { "42000" ,"7969" ,"2150" } { "7970" ,"7969" ,"2200" } { "7971" ,"7969" ,"2300" } { "7972" ,"7969" ,"2400" } { "7973" ,"7968" ,"2500" }
TABLE User_Query id parent sequence { "400365" ,"0" ,"100" } { "400366" ,"7872" ,"200" } { "400367" ,"7872" ,"300" } { "400368" ,"7872" ,"400" } { "400369" ,"7872" ,"500" } { "400370" ,"7872" ,"600" } { "400371" ,"7872" ,"800" } { "400372" ,"7872" ,"800" } { "400373" ,"7872" ,"900" } { "400374" ,"7872" ,"1000" } { "400375" ,"7872" ,"1100" } { "400376" ,"7872" ,"1200" } { "400377" ,"7872" ,"1300" } { "400378" ,"7872" ,"1400" } { "400379" ,"7872" ,"1500" } { "400380" ,"7872" ,"1600" } { "400381" ,"7872" ,"1700" } { "400382" ,"7872" ,"1800" } { "400383" ,"7872" ,"1900" } { "400384" ,"0" ,"2000" } { "400385" ,"7968" ,"2100" } { "400386" ,"7969" ,"2150" } { "400387" ,"7969" ,"2200" } { "400388" ,"7969" ,"2300" } { "400389" ,"7969" ,"2400" } { "400390" ,"7968" ,"2500" }
TABLE User_Query id parent sequence { "400365" ,"0" ,"100" } { "400366" ," 400365" ,"200" } { "400367" ," 400365" ,"300" } { "400368" ," 400365" ,"400" } { "400369" ," 400365" ,"500" } { "400370" ," 400365" ,"600" } { "400371" ," 400365" ,"800" } { "400372" ," 400365" ,"800" } { "400373" ," 400365" ,"900" } { "400374" ," 400365" ,"1000" } { "400375" ," 400365" ,"1100" } { "400376" ," 400365" ,"1200" } { "400377" ," 400365" ,"1300" } { "400378" ," 400365" ,"1400" } { "400379" ," 400365" ,"1500" } { "400380" ," 400365" ,"1600" } { "400381" ," 400365" ,"1700" } { "400382" ," 400365" ,"1800" } { "400383" ," 400365" ,"1900" } { "400384" ,"0" ,"2000" } { "400385" ," 400384" ,"2100" } { "400386" ," 400385" ,"2150" } { "400387" ," 400385" ,"2200" } { "400388" ," 400385" ,"2300" } { "400389" ," 400385" ,"2400" } { "400390" ," 400384" ,"2500" }

Step 8. Load part2_new.txt

Load the new part2_new.txt file back to update the relevant rows for the new access type.

pdm_load -f part2_new.txt -v

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

 

This page was last modified 12:05, 7 November 2008.  This page has been accessed 4,316 times.  Content is available under Attribution-Noncommercial-Share Alike 3.0 UnportedDisclaimers

Attachments on Configuration Items

 

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 attachment capabilities to Configuration Items.

Note: This customization is designed for r11.x and r12.1 versions only. For r12.5 and above use the revised version

Procedures

Step 1. Modify Schema

For ALL releases make your schema change 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'. Take the code you need from the examples below.

LREL attmnt_lrel "nr:PDM" attachments <> attmnt assets;

Step 2. Publish the Schema changes

For ALL releases recycle the Service Desk service.

Step 3. Edit the detail_nr.htmpl form

Add the following code to the BODY of the form in the PDM_NOTEBOOK area (for R12 this modification can be made to cmdbNotebook.htmpl): additional extension forms will need to be modified appropriately detail_har_virx.htmpl, detail_har_serx.htmpl,

 

<PDM_TAB ID=attmnt SRC="OP=SHOW_DETAIL+HTMPL=xx_attmnt_tab.htmpl+FACTORY=nr+PERSID=$args.persistent_id" NAME="Attachments"  height=300></pdm_tab>

Step 4. Edit the xx_attmnt_tab.htmpl form

This step will add "Edit" and "Delete" right-click options if the Inventory Functional Access is granted on the user's Access Type. If this scripting is not added then you will only have the option to view a document.

Search for the following scripting:
switch ("$prop.factory") { case "cr":  attmntAccess = "${ACCESS.call_mgr:0}" - 0; break; case "iss": attmntAccess = "${ACCESS.issue_mgr:0}" - 0; break; case "chg": attmntAccess = "${ACCESS.change_mgr:0}" - 0; break; }
... and add the following case:
case "nr": attmntAccess = "${ACCESS.inventory:0}" - 0; break;

Step 5. Clear the web cache

Publish your changes via the Web Screen Painter. The process of publishing automatically initiates a pdm_webcache.

NOTICE

Be advised that implementing this customization will result in a few ERRORS in the stdlogs, but there has been no reported degradation in functionality.

kt_daemon         16316 ERROR        DomWrap.c       1106 cSelect: failed In method select_sd_ref_num. Error Message: Error 103 AHD03053: Bad where clause: invalid constraint.  Could not recognize persistent_id.  OUTER_JOIN ca_owned_resource.id = usp_owned_resource.id kt_daemon         16316 ERROR        DomWrap.c        806 Failed to complete reply method: 'select_sd_ref_num' ,BOP Name:'attmnt:400063' in class:'CAttmntLinks', Error:AHD03053: Bad where clause: invalid constraint.  Could not recognize persistent_id.  OUTER_JOIN ca_owned_resource.id = usp_owned_resource.id domsrvr           13132 ERROR        attr.c          6164 Error in ATTR_INIT trigger get_attached_name for attached_name: AHD03053: Bad where clause: invalid constraint.  Could not recognize persistent_id.  OUTER_JOIN ca_owned_resource.id = usp_owned_resource.id

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

 

 

This page was last modified 13:06, 6 December 2012.  This page has been accessed 10,091 times.  Content is available under Attribution-Noncommercial-Share Alike 3.0 UnportedDisclaimers

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.

 

 

Create a Request, Change Order and Contact through Web Services via VB

Step1: Create a web reference in the front end.

  1. Start the front end.
  2. Go to Website menu and click “Add web reference”.
  3. In the URL box provide the web service URL and click go. http://<hostname>:8080/axis/services/USD_R11_WebService?wsdl'''
  4. We can find the methods being pulled out.
  5. Add the webreference with the name “WebReference”.

Step 2: Create an Object of the web reference

Dim ws As New WebReference.USD_WebService

Step 3: Specify the Correct web service URL

ws.Url = "http://<hostname>:8080/axis/services/USD_R11_WebService?wsdl"

Step 4: Provide the username and password to get the sid value

Dim username, password As String Dim sid As Integer username = "analyst1" password = "123" sid = ws.login(username, password)

where login is the method used to get the sid.

Step 5: Get the User Handle

Dim userhandle As String userhandle = ws.getHandleForUserid(sid, username)

Where getHandleForUserid is the method

Step 6: Create a Request

Dim attrVal(5), attr(1), prop(1), persistent_id As String Dim requestHandle, requestNumber As String attrVal = New String() {"customer", userhandle, "category", "<category id>", "description", "Description here"} prop = New String() {""} attr = New String() {persistent_id} requestHandle = "" requestNumber = "" ws.createRequest(sid, userhandle, attrVal, prop, "", attr, requestHandle, requestNumber)

Step 7: Create a Change Order

Dim attrVal(5), attr(1), prop(1), persistent_id As String Dim requestHandle, requestNumber As String attrVal = New String() {"requestor", userhandle, "category", "category id", "description", "description here"} prop = New String() {""} attr = New String() {cpersistent_id} requestHandle = "" requestNumber = "" ws.createChangeOrder(sid, userhandle, attrVal, prop, "", cattr, requestHandle, requestNumber)

Step 8: Create a contact

Dim attrVal(5), attr(1), persistent_id As String Dim contactHandle, contactNumber As String attrVal = New String() {"first_name","Mike", "last_name", "Tolland", "userid", "mike.tolland", "contact_num", "<Password here>", "email_address", "mike.tolland@abc.co.in", "phone_number", "00989876723"} attr = New String() {persistent_id} ws.createObject(sid, "cnt", attrVal, attr, contactHandle, contactNumber)

 

Creating Code for VB.net 2008 and R11

Create object / login and return basic information

Dim sid As String Dim uHandle As String Dim b As New casoap.USD_WebServiceSoapClient sid = b.login("Administrator", "password")     Dim user As String = "devak01" uhandle = b.getHandleForUserid(sid, user) Dim arryVals As String() = {"first_name", "last_name", "organization", _ "organization.name", "admin_org.name", _ "group_list.length"} Dim arryValsresults As String = b.getObjectValues(sid, uHandle, arryVals)

 

Create a Asset / Hardware Configuration item

Dim newexten As String = "" Dim extenName As String = "" Dim assethndle As String = "" Dim car As String = "" Dim chgHandle As String = "" Dim chgNum As String = ""   Dim attrVal() As String = {"name", "hello2", "class", "grc:10000002"} ReDim Preserve attrVal(3) Dim persistent_id As String = "persistent_id" Dim attr() As String = {persistent_id} ReDim Preserve attr(0)   b.createAsset(sid, attrVal, attr, car, assethndle, newexten, extenName)

Create a Change Order

Dim attrVal() As String = {"requestor", uHandle, "category", "5103", "description", "hello world"} ReDim Preserve attrVal(5)   Dim persistent_id As String = "persistent_id" Dim attr() As String = {persistent_id} ReDim Preserve attr(0) Dim prop() As String = {} ReDim Preserve prop(1) Dim chgHandle As String = "" Dim chgNum As String = ""     b.createChangeOrder(sid, uHandle, attrVal, prop, _ "", attr, chgHandle, chgNum)

How to Use Web Services

I am using Visual Web Developer Express.Net. It is free and easy to use. To consume the USD web services, create a new web application.

Now is time to get to work

Once your page is set up:

Click the Website > add reference

Enter the URL to the web services WSDL file, which is located at' http ://< your server>:8080/axis/services/USD_R11_WebService?wsdl'

You might want to study a little XML and WSDL, but it isn't neccesary. Look up the topic, Consume or Consuming Web Services.

Quick Reference

Consuming Web service With Visual Studio/ Express Web Developer

Go to the Menu Bar and click Website > Add Web Reference (name it anything you want then click --> Add reference

And that is it!


To use the web reference, create a new instance of the web service VB.Net Class program file

Partial Class tickets Inherits System.Web.UI.UserControl   Private ws As New USD_WebService . . . To consume the service, call your first function ws.login(username, password)
'the login function returns a system id value so...' 'lets rewrite the above code to look like the code below...'   Dim sid As String sid = ws.login(username, password)

 

Example Code: Using Webservice in VB.NET Web Application

Here is a complete Code Snippit 
Imports System.IO Imports System.Xml Imports System.Xml.Serialization Imports <ReferenceToWebServiceWSDL> Imports Connection   Partial Class _Default   Inherits System.Web.UI.Page   Dim ws As New USD_WebService Dim sid As String Dim userhandle, username, password As String Dim attrVal(5), attr(0), prop(0) As String Dim requestHandle, requestNumber As String Dim persistent_id As String Dim catAttrib(5) As String   Dim xmlReturn As String Dim pcatHandle As XmlNodeList Dim xDoc As XmlDocument = New XmlDocument() Dim pcatResult As String   'Class for handling the button click submit' Protected Sub Submit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Submit.Click   Dim name = “Username” Dim pass As String = "password"   sid = ws.login(name, pass)   'get the Handle for the userid' userhandle = ws.getHandleForUserid(sid,name) 'Get The Category Attributes' catAttrib = New String(0) {}   'Category Handle for the incident area' Try xReturn = ws.doSelect(sid, "pcat", "sym = 'HARDWARE.PRINTER.SETUP'", 1, catAttrib) xDoc.LoadXml(xReturn) xHandle = xDoc.GetElementsByTagName("Handle") xResult = xHandle(0).InnerText catHandle = xResult Catch ex As Exception Response.Write("Exception caught while invoking an XML Web service.") End Try   'Priority handle for the ticeket' 'sym = priority.Value' '505     0     0     None Priority unassigned' '500     0     1     5     LOW Priority '501     0     2     4     MEDIUM-LOW Priority '502     0     3     3     MEDIUM Priority '503     0     4     2     MEDIUM-HIGH Priority '504     0     5     1     HIGH Priority   Dim pri As String() pri = New String() {"pri:505", "pri:504", "pri:503", "pri:502", "pri:501", "pri:500"}   'Set the priority number Testing only' priority_number = 1     attrib = New String() {"customer", userhandle, "priority", "pri:502", "category", _ pcatResult, "description", "Test"} prop = New String() {""} attr = New String() {persistent_id} requestHandle = "" requestNumber = ""   'Create the ticket' 'Including a try catch block for catching an error dealing with additional fields' ws.createRequest(sid, userhandle, attrVal, prop, "", attr, requestHandle, requestNumber)   'I need to close the connection.' ws.logout()   End Sub   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load   ws.Url =  _ "http://<yourServerName>:8080/axis/services/USD_R11_WebService?wsdl" End Sub End Class

ASP Web Project

Create an ASP .NET Web Project Below is a sample ASP Page. Copy and paste the code Between the <Form></Form> tags.

'default.aspx' <asp:Label id="replay" runat="server" />   'Get the User Name and Password' <input type="text" id="username" runat="server" /> <input type="password" id="password" runat="server" />

I've created a demo VS 2010 ASP.NET web project to showcase a lot of functionality of the web services. Download here the project files: SD_WebService


Having Fun

Pop the code below in your VB file. When the user logs in correctly the form will disapear and s\he will be greeted by there username

'in your default.aspx.vb file' Dim ws As New USD_WebService   'Login' ws.login(username.Text, password.Text)   'Just for fun hide input areas' username.Visable = false password.Visalbe = false   'Say Hello to you user' replay.Text = " Welcome " & username.Text


If you copy and paste the code, you need to remove the aphostrophy at the end of each comment only. To do this just use your find and replace function. MenuBar Item Edit > Find and Replace --> Quck Replace > find What: ' . Next, Replace With <- test box insert a space. You'll have to do this one-by-one so not to uncomment the whole line.

create request and search request app using web services in c#

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using za.co.mtn.vmcausddv02_fld; using System.IO; using System.Xml; using System.Xml.Serialization; using System.Collections;

public partial class MAIN : System.Web.UI.Page {

   USD_WebService wsUSD = new USD_WebService(); string username = null; string password = null; int sid = 0; string userhandle = null; string[] attrVal; string[] attr; string[] prop; string persistent_id; string requestHandle; string requestNumber; string result; string login_username; string login_password; string login_userhandle; string ref_num; string res_count; string ref_handle; 
   XmlDocument Doc = new XmlDocument(); XmlNodeList nodeList = default(XmlNodeList); XmlElement root; 

 

   string xResult = null; XmlNodeList xHandle = default(XmlNodeList); XmlDocument xDoc = new XmlDocument(); 

 

protected void btnSubmit_Click(object sender, EventArgs e) { try { username = "horne_g"; password = "GavJac456"; sid = wsUSD.login(username, password); userhandle = wsUSD.getHandleForUserid(sid, username); 
           attrVal = new string[] { 

"customer", userhandle, "category", ddlCatogorie.SelectedValue, "description", txtDescription.Text

       }; prop = new string[] { "" }; attr = new string[] { "persistent_id" }; 
           requestHandle = ""; requestNumber = ""; 
           wsUSD.createRequest(sid, userhandle, attrVal, prop, "", attr, ref requestHandle, ref requestNumber); lblrequest.Text = requestNumber; // txtSearch.Text = requestNumber; //log out (sid) wsUSD.logout(sid); mtvSearchReq.Visible = true; } catch (Exception ex) { lblnumberUSDs.Text = ex.ToString(); } } 

protected void btnSearch_Click(object sender, EventArgs e)

   { username = "horne_g"; password = "GavJac456"; sid = wsUSD.login(username, password);  //ussing the array i created string[] attrs = new string[5]; attrs[2] = "ref_num"; attrs[1] = "description"; attrs[0] = "status"; attrs[3] = "group"; 
       try { sid = wsUSD.login(username, password); 
           result = wsUSD.doSelect(sid, "cr", "ref_num = '" + txtSearch.Text + "'", 2, attrs); xDoc.LoadXml(result); xHandle = xDoc.GetElementsByTagName("Attributes"); xResult = xHandle[0].InnerText;   
           ref_handle = xResult; 
           lblnumberUSDs.Text = attrs.ToString(); 
           //Doc.LoadXml(result); 
           //root = Doc.DocumentElement; //nodeList = root.SelectNodes("//Attribute[AttrName='ref_num']/AttrValue"); 

 

           //res_count = nodeList.Count.ToString(); lblnumberUSDs.Text = res_count; 
          // lblResult.Text = ref_handle; //txtresult.Text = result; txtresult.Text = ref_handle; wsUSD.logout(sid); } catch(Exception ex) { lblnumberUSDs.Text = ex.ToString(); } } 

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

 

 

This page was last modified 11:39, 4 October 2012.  This page has been accessed 34,259 times.  Content is available under Attribution-Noncommercial-Share Alike 3.0 UnportedDisclaimers

Add Log Entry for Updates to Custom Fields

 

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 updates occur to custom fields.

Procedures

Step 1 .Create Activity Associations

  1. Login as admin
  2. Open Notification setup > Activity Associations.
  3. Click on Create New.
  4. Enter the custom field name in the symbol text box(zcustomfield1).
  5. Enter a code in the code text box (custom)
  6. Choose the object type from the drop-down box (Change/isssue/request/wf/..).
  7. Enter a description of the field (The MCC Application Code field on a Request).
  8. Enter the custom attribute name (zcustomfield1).
  9. Enter the activity type. You can use "Field Update" or you can create a new activity type if you need to specify notifications for the activity type you select. (Field Update).
  10. Check the "Log Me" checkbox.
  11. click Save.

Step 2. Create the trigger

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

For older releases recycle the Service Desk service.

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

 

This page was last modified 08:32, 29 November 2010.  This page has been accessed 13,384 times.  Content is available under Attribution-Noncommercial-Share Alike 3.0 UnportedDisclaimers

Web Screen Painter

 

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 articles provides an under-the-hood explanation of the Web Screen Painter (WSP) and the Schema Designer introduced in r11.x.

Web Screen Painter

WSP Facts:

  • Located on the Primary Server.
  • Uses Tomcat exclusively.
  • All published changes are automatically exported to all Secondary Servers.

On Save

When initiating a save (File > Save) the following occurs:
  • The $NX_ROOT\site\mods\wsp\project directory is created if it does not already exist.
  • A new or modified file is stored within the $NX_ROOT\site\mods\wsp\project\... directory which has a structure that mimics the location of the default version of the file.
    For example: If editing the bin_form_np.htmpl used by the Analyst Interface which originally resides in $NX_ROOT\bopcfg\www\htmpl\web\analyst, a saved copy will be placed in$NX_ROOT\site\mods\wsp\project\www\htmpl\web\analyst.
  • Do not forget that also 2 tables are updated by web screen painter to "remind" the modification. It is possible that some change (made manually for example) are not know by the WSP with all the side effect that can result in case of modification.

On Publish

When initiating a publish (File > Publish) the following occurs:
  • Any saved versions of the files being published that reside within $NX_ROOT\site\mods\wsp\project\... are removed.
  • A new or modified file will be stored on the Primary and all Secondary Servers within the $NX_ROOT\site\mods\... directory which has a structure that mimics the location of the default version of the file.
    For example: If editing the bin_form_np.htmpl used by the Analyst Interface which originally resides in $NX_ROOT\bopcfg\www\htmpl\web\analyst, a saved copy will be placed in$NX_ROOT\site\mods\www\htmpl\web\analyst. CA ensures that the default files are never altered by your customizations by saving custom files in a dedicated location.
  • A deleted file will be removed from the Primary and all Secondary Servers.
  • The pdm_webcache command is automatically initiate which clears the cache on the Primary and all Secondary Servers.

Backing out

Both published and unpublished forms can be deleted via the WSP. However, you can also navigate through the directory structure and delete the file.
  • For saved but unpublished, navigate through the $NX_ROOT\site\mods\wsp\project\... directory and remove the target file.
  • For published files, navigate through the $NX_ROOT\site\mods\... directory on the Primary and all Secondary Servers, delete your file from all servers, and run the pdm_webcache from the Primary Server.

 

 

This page was last modified 05:24, 30 November 2010.  This page has been accessed 7,734 times.  Content is available under Attribution-Noncommercial-Share Alike 3.0 UnportedDisclaimers

Copying an Access Type Scoreboard

 

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 instructions for copying the default Scoreboard of one Access Type and using it for the default of a new Access Type.

Note: r12 includes a copy feature which makes these procedures obsolete when creating a new Access Type. However, they may still be used when wanting to update existing Access Type Scoreboards.

Procedures

Step 1. Obtain of Both Access Types

Run the following command where the sym is the name of the Access Type you are obtaining the id for:

pdm_extract -f "select id from Access_Type where sym='Administrator'"

In this example, the id returned is 2402. Lets assume the id of the other Access Type returned an id of 400001.

Step 2. Backup the User_Query Table

pdm_extract -f "select * from User_Query where obj_persid='acctyp:2402'" > User_Query_bkup.txt

Step 3. Extract the Original Access Type's Scoreboard

pdm_extract -f "select expanded, factory, label, last_mod_by, last_mod_dt, obj_persid, parent, query, query_set, query_type, sequence from User_Query where obj_persid='acctyp:2402'" > score_out.txt

Step 4. Edit the Extract File

Edit the score_out.txt file and change any occurrence of acctyp:2402 to the new access type value of acctyp:400001. Save the modified output to a new file scoreboard_in.txt

Step 5. Load the New Data

pdm_load -i -f scoreboard_in.txt -v

Step 6. Extract Parent References

Now comes the hard part of parent/child relationships... otherwise known as folder/node relationships. Run the following two command:

pdm_extract -f "select id, parent, sequence from User_Query where obj_persid='acctyp:2402'" > part1.txt
pdm_extract -f "select id, parent, sequence from User_Query where obj_persid='acctyp:400001’" > part2.txt

Step 7. Compare the Extracts

Open both these files and place them side by side. Compare part1.txt and part2.txt. Notice all the entries with the parent set to "0". These are the folders that appear on the Scoreboard. All the other entries are the nodes that reside within the folders. Notice how the nodes all reference the id of a parent... in other words the id of the folder they belong to. In the part2.txt extract all the nodes are still referencing the id's of folders belonging to the original Access Type's Scoreboard (part1.txt). What you need to do is change all these parent references to ids belonging to the folders of the new Access Type's Scoreboard. Do this by editing part2.txt and saving it as part2_new.txt.

part1.txtpart2.txtpart2_new.txt
TABLE User_Query id parent sequence { "7872" ,"0" ,"100" } { "7966" ,"7872" ,"200" } { "7967" ,"7872" ,"300" } { "7800" ,"7872" ,"400" } { "7801" ,"7872" ,"500" } { "7802" ,"7872" ,"600" } { "7803" ,"7872" ,"800" } { "7804" ,"7872" ,"800" } { "8051" ,"7872" ,"900" } { "8052" ,"7872" ,"1000" } { "7805" ,"7872" ,"1100" } { "7806" ,"7872" ,"1200" } { "7807" ,"7872" ,"1300" } { "7808" ,"7872" ,"1400" } { "7809" ,"7872" ,"1500" } { "7810" ,"7872" ,"1600" } { "7811" ,"7872" ,"1700" } { "7812" ,"7872" ,"1800" } { "7813" ,"7872" ,"1900" } { "7968" ,"0" ,"2000" } { "7969" ,"7968" ,"2100" } { "42000" ,"7969" ,"2150" } { "7970" ,"7969" ,"2200" } { "7971" ,"7969" ,"2300" } { "7972" ,"7969" ,"2400" } { "7973" ,"7968" ,"2500" }
TABLE User_Query id parent sequence { "400365" ,"0" ,"100" } { "400366" ,"7872" ,"200" } { "400367" ,"7872" ,"300" } { "400368" ,"7872" ,"400" } { "400369" ,"7872" ,"500" } { "400370" ,"7872" ,"600" } { "400371" ,"7872" ,"800" } { "400372" ,"7872" ,"800" } { "400373" ,"7872" ,"900" } { "400374" ,"7872" ,"1000" } { "400375" ,"7872" ,"1100" } { "400376" ,"7872" ,"1200" } { "400377" ,"7872" ,"1300" } { "400378" ,"7872" ,"1400" } { "400379" ,"7872" ,"1500" } { "400380" ,"7872" ,"1600" } { "400381" ,"7872" ,"1700" } { "400382" ,"7872" ,"1800" } { "400383" ,"7872" ,"1900" } { "400384" ,"0" ,"2000" } { "400385" ,"7968" ,"2100" } { "400386" ,"7969" ,"2150" } { "400387" ,"7969" ,"2200" } { "400388" ,"7969" ,"2300" } { "400389" ,"7969" ,"2400" } { "400390" ,"7968" ,"2500" }
TABLE User_Query id parent sequence { "400365" ,"0" ,"100" } { "400366" ," 400365" ,"200" } { "400367" ," 400365" ,"300" } { "400368" ," 400365" ,"400" } { "400369" ," 400365" ,"500" } { "400370" ," 400365" ,"600" } { "400371" ," 400365" ,"800" } { "400372" ," 400365" ,"800" } { "400373" ," 400365" ,"900" } { "400374" ," 400365" ,"1000" } { "400375" ," 400365" ,"1100" } { "400376" ," 400365" ,"1200" } { "400377" ," 400365" ,"1300" } { "400378" ," 400365" ,"1400" } { "400379" ," 400365" ,"1500" } { "400380" ," 400365" ,"1600" } { "400381" ," 400365" ,"1700" } { "400382" ," 400365" ,"1800" } { "400383" ," 400365" ,"1900" } { "400384" ,"0" ,"2000" } { "400385" ," 400384" ,"2100" } { "400386" ," 400385" ,"2150" } { "400387" ," 400385" ,"2200" } { "400388" ," 400385" ,"2300" } { "400389" ," 400385" ,"2400" } { "400390" ," 400384" ,"2500" }

Step 8. Load part2_new.txt

Load the new part2_new.txt file back to update the relevant rows for the new access type.

pdm_load -f part2_new.txt -v

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

This page was last modified 12:05, 7 November 2008.  This page has been accessed 4,316 times.  Content is available under Attribution-Noncommercial-Share Alike 3.0 UnportedDisclaimers

List Tickets ORDER BY Group

 

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 will help you sort your Incident, Change Order and Request List in Scoreboard.

Procedures

Step 1 : Create the script

A script is created as an .mod 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).

Below is the mod file for Change Orders - I have named it to be zchgsort.mod MODIFY FACTORY chg { STANDARD_LISTS {

 SORT_BY "group.last_name, chg_ref_num, status, open_date, priority"; 

}; };

Below is the mod file for Incidents - I have named it to be zinsort.mod MODIFY FACTORY cr { STANDARD_LISTS {

 SORT_BY "group.last_name, ref_num, status, open_date, priority"; 

}; };

Step 2 : Edit the list_chg.htmpl file for Change Order and list_cr.htmpl for Incidents

1) Search for the following text in your list_chg.htmpl file

<pdm_macro name=lsStart> <pdm_macro name=lsWrite text="pdm_if \"@{list.sla_violation:0}\" != '0'">

2) Just above the <pdm_macro name=lsStart> define the following var ref_num_style;

3) Now, Edit the pdm_macro column for Group to the following <pdm_macro name=lsCol hdr="Group" attr=group link=yes>

Below is the customization to the list_cr.htmpl file

1) Search for the following in your list_cr.htmpl file <PDM_MACRO NAME=lsStart>

2) Just above the <pdm_macro name=lsStart> define the following var ref_num_style;

3) Now, Edit the pdm_macro column for Group to the following <PDM_MACRO NAME=lsCol hdr=Group/Parent attr=group link=yes>

Step 3: Save Files and perform the following

1) Run the pdm_webcache from the command prompt 2) Stop and Start the Unicenter Service Desk Services. 3) Look at your Analyst Login and expand the "All" scoreboard value under Incidents and Change Order to see if your tickets are sorted as per the Group 4) Note : You first need to add the column "Group" if you did not have it earlier.

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

 

This page was last modified 13:34, 25 October 2011.  This page has been accessed 2,817 times.  Content is available under Attribution-Noncommercial-Share Alike 3.0 UnportedDisclaimers

Resolved: Create new chgnr lrel via Webservice

 

post Nov 9 2008, 02:29 AM

Post #2




found the solution...:
the line of code should be....:

 

 

 

string s_chg_id[] = {"chg:id_here"};
string s_asset = "nr:asset_id_here";
int sid;

 

myWS.createLrelRelationships(sid, asset , "chgnr", s_chg_id);

 

 

 

and it works like charm....
have fun

Um pequeno código de teste para logar na solução CA SDM e fechar um ticket utilizando o webservice do CA Service Desk Manager

 

URL padrao para o WS CA SDM http://localhost:8080/axis/services/USD_R11_WebService?WSDL

 

Module CASDM

 

 

    Dim USD As New localhost.USD_WebService

    Dim strSessionID As String = ""

 

 

    Function Login(user As String, password As String, url As String) As String

 

 

        Dim strReturn As String = ""

        Try

            url = IIf(Len(url) > 0, url, "http://localhost:8080/axis/services/USD_R11_WebService?WSDL")

            USD.Url = url

            strSessionID = USD.login(user, password)

            strReturn = strSessionID

        Catch ex As Exception

            strReturn = ex.Message

        End Try

 

 

        Return strReturn

    End Function

 

 

   

    Function CloseTicket(persid As String) As String

        Dim strReturn As String = ""

 

 

        If strSessionID.Length = 0 Then

            strReturn = "requires login"

        Else

 

 

            Dim ticket_handle As String = persid

            Try

                strReturn = USD.closeTicket(strSessionID, "ticket fechado", ticket_handle)

            Catch ex As Exception

                strReturn = ex.Message

            End Try

        End If

 

 

        Return strReturn

    End Function

 

 

 

 

End Module

 

OBS: Este codigo pode nao obter boa performance em utilizacao em massa.

          CUIDADO: Toda persolizacao pode ocasionar falhas no CA SDM.

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.