Campo calculado
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-07-2022 05:20 AM
Olá. Eu preciso fazer um campo calculado que vai somar vários registros de uma coluna, mas eu não sei quantos serão estes registros. A ideia é mais ou menos essa:
(function calculatedFieldValue(current) {
var A = current.dez22;
var B = current.jan23;
var soma = A+B + ..... ;
return soma; /
})(current);
Alguma dica ?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-07-2022 06:00 AM
Olá,
A solução que acredito que resolveria seria não trabalhar com o current. As váriavéis já estão armazenadas em alguma tabela, portanto você poderia fazer um GlideRecord na tabela, armazenar as variáveis em uma Lista e depois fazer um for para realizar a soma.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-07-2022 06:01 AM - edited 12-07-2022 06:03 AM
Olá Alexandre, tudo bem?
A primeira coisa é pensar na estrutura de armazenamento da sua tabela.
O cenário que vou exemplicar supõe que haverá, por exemplo:
- N registros contendo valores para a coluna "AC";
- N registros contendo valores para a coluna "AL", e assim sucessivamente.
Nesse cenário toda a informação está em uma única tabela denominada 'x_sua_tabela'.
Vamos lá!
Você vai querer criar um Script Include que será chamado pelo lado do cliente, assim que um registro da tabela for aberto.
1) Criar um Script Include (não esqueça de marcar que ele é Client callable) que lerá todos os valores da coluna "valor_x" (exemplo: "AC") e retorna a somatória dos valores dessa coluna.
var NomeDoClientScript = Class.create();
NomeDoClientScript.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
getUserPoints: function() {
var points = 0.00;
var gr = new GlideRecord('x_sua_tabela');
gr.query();
while (gr.next()){
points += gr.getDisplayValue('valor_x');
}
return points;
},
type: 'NomeDoClientScript'
});
2) Criar um Client Script (especifique a sua tabela, tipo = onLoad) com o gatilho apropriado. o onLoad ocorre sempre que um registro da tabela é aberto.
O seu client script ficará mais ou menos assim:
function onLoad() {
var ga = new GlideAjax('NomeDoSeuScriptIncludeAqui');
ga.addParam('sysparm_name','getValores'); //nome do metodo a ser chamado no seu Script Include.
ga.getXMLAnswer(somaTotal);
}
function somaTotal(response) {
var soma = response;
if (soma != null){
g_form.setValue('u_soma', soma); //Atribui a soma a um campo do seu form
} else {
g_form.setValue('u_soma', '0.00');
}
}
Verifique se não é necessário aplicar algum filtro no Client Script pois nesse pseudocódigo estamos lendo a tabela inteira e isso não é uma boa prática.
Dependendo da quantidade de registros isso pode causar uma performance insatisfatória.
Abraços.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-07-2022 07:06 AM
Que tal fazer este cálculo sem código? Será que é possível? Dê uma olhada nestas opções.
https://developer.servicenow.com/blog.do?p=/post/formula-builder/