Campo calculado

Alexandre17
Tera Expert

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:

Alexandre17_0-1670418482356.png

(function calculatedFieldValue(current) {
var A = current.dez22;
var B = current.jan23;
var soma = A+B + ..... ;
    return soma; /
})(current);

Alguma dica  ? 

 

 

 

3 REPLIES 3

Guilherme B
Giga Guru
Giga Guru

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.

 

 

Carlos Camacho
Mega Sage
Mega Sage

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.

 

_willians
ServiceNow Employee
ServiceNow Employee

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/

 

https://docs.servicenow.com/en-US/bundle/tokyo-application-development/page/administer/form-builder/...