Sumas en un iterador
Sumar varios elementos de una iteración
Para sumar elementos en un iterador, debemos configurar las acciones en los eventos change de cada elemento que interviene como sumando. En el ejemplo que mostramos a continuación, se define una suma de elementos que se encuentran dentro de la misma iteración de un iterador.
PASO 1. Lo primero que haremos será definir las variables para poder recopilar los datos de cada iteración.
var indice = wf.obtenerContextoPadre(this).indice;
var idIterador = "iterator-sumas";
PASO 2. Obtenemos los valores de los campos que queremos sumar.
Para evitar errores de cálculo, vamos a definir que en el caso de que el campo esté vacío, el valor sea cero.
var importe01 = wf.obtenerValor("importe01", idIterador, indice)||0;
var importe02 = wf.obtenerValor("importe02", idIterador, indice)||0;
PASO 3. Realizamos la suma y guardamos el resultado en el campo habilitado para ello.
En la suma que mostramos en el ejemplo, vemos que se están sumando valores con cifras decimales, por lo que usamos parseFloat .para convertir la cadena que recogimos del elemento. Para sumas con valores enteros, usaremos parseInt.
Además, como los ejemplos se hacen con elementos de tipo moneda, ajustaremos el resultado a dos decimales, para ello usaremos .toFixed(2);
Por último antes de escribir el valor del resultado en el campo, podemos añadir una última condición para evitar la impresión de resultados no deseados. Aunque en este caso podría ser opcional, ya que anteriormente hemos definido en los elementos a sumar, la condición de que en el caso de estar vacíos y no recoger ningún valor, por defecto será cero.
Ya solo nos queda modificar el valor del resultado en la misma iteración en la que nos encontramos.
var totalimporte = parseFloat(importe01) + parseFloat(importe02);
totalimporte = totalimporte.toFixed(2);
if (!isNaN(totalimporte)) {
wf.modificarValor("totalimporte0", totalimporte, idIterador, indice);
}
Sumar un elemento en todas las iteraciones existentes
Para sumar elementos en un iterador en todas las iteraciones del mismo, debemos configurar las acciones en los eventos change de los campos que intervienen en la suma, así como en los en los eventos addIteration y removeIteration .
En el ejemplo que mostramos a continuación, se define una suma de un mismo elemento a lo largo de todas las iteraciones del iterador.
PASO 1. Lo primero que haremos será definir las variables para el nombre del campo a sumar y el campo en el que mostraremos el resultado de la suma.
var idIterador = "iterator-sumas";
var nombreColumnaSumar = "totalimporte0";
var nombreCampoSuma = "totalimporte0-fueraiterador";
PASO 2. A continuación obtenemos el valor del campo que vamos a sumar y definimos las variables para recorrer el iterador.
var valores = wf.obtenerIteracionesTotales(idIterador);
var i = 0;
var r = 0;
PASO 3. Sumamos los valores registrados en cada iteración.
En la suma que mostramos en el ejemplo, veremos que se están sumando valores con cifras decimales por lo que usamos parseFloat, para sumas con valores enteros usaremos parseInt.
for (i = 0; i<valores;i++){
var valorIteracion = wf.obtenerValor(nombreColumnaSumar, idIterador, i);
if (!isNaN(parseFloat(valorIteracion))) {
r = r + parseFloat(valorIteracion);
}
}
PASO 4. Mostramos el resultado en el campo que hayamos definido para ese propósito.
En el ejemplo se muestras las opciones para ofrecer el resultado con todos los decimales o redondeado únicamente a dos decimales.
// Si se quiere mostrar la suma final sin redondeo:
// wf.modificarValor(nombreCampoSuma, r);
// Si se quiere mostrar la suma final redondeada a dos decimales:
var resultado = parseFloat(r).toFixed(2);
wf.modificarValor(nombreCampoSuma, resultado);
A tener en cuenta
En el caso de que los campos que queremos sumar dentro del iterador, a su vez se encuentren dentro de una sección, será necesario especificar el contexto del iterador. Para ello, las variables para recopilar los datos de cada iteración (Paso 1), serán las siguientes:
parent = $(this).closest(".webform-element").parent().closest(".webform-element");
var indice = wf.obtenerContextoPadre(parent).indice;
var idIterador = "iterator-sumas";
Descarga ejemplo
Tienes disponible el código json del ejemplo de fragmento para su descarga y que puedas probarlo y adaptarlo a tus necesidades. Ver: sumas_en_un_iterador.json