Gestión de Registros con Interactive Grids (basado en el modelo)

Gestión de Registros con Interactive Grids (basado en el modelo)

Introducción

En esta ocasión veremos 2 de las funcionalidades más requeridas por parte de los usuarios, que serían la de suma de valores de una grilla y suma de valores según los registros seleccionados. Dichas funcionalidades son posibles gracias a las API's provistas por APEX para el manejo del modelo a nivel de interfaz mediante Javascript, vamos a verlas!!

Realizar sumatoria de todos los registros

Para este ejemplo realizaremos la sumatoria de una columna por registro, generando un totalizador basado en los datos proveidos por la grilla.
Lo primero que debemos hacer es obtener el modelo de la grilla. ¿Cómo hacemos eso? asignandole un ID estático a la región que contiene la grilla, luego recorreremos ese modelo utilizando la función forEach y posteriormente las funciones getRecordId que nos permite obtener el id interno del registro y getRecordMetadata con el cuál obtenemos el estado del registro basado en los metadatos, por ejemplo podemos determinar si un registro fue recientemente agregado o si se encuentra seleccionado para su eliminación.

Así que veamos el código que realizará esta acción.

function calcular_totales(){
    //obtenemos el modelo
    var modelo = apex.region('id_de_la_region').call('getViews','grid').model;
        total = 0;
    //recorremos el modelo
    modelo.forEach(function(r) {
        //obtenemos el metadato basado en el id del registro
        var registro = r,
        id = modelo.getRecordId(registro),
        meta = modelo.getRecordMetadata(id),
        //obtenemos el valor de la columna
        salario = parseFloat(modelo.getValue(registro,"NOMBRE_COLUMNA"));
        /* para este cálculo sumamos solo los registros que contengan números, 
        excluimos los marcados para eliminar y los recien agregados*/
        if ( !isNaN( salario ) && !meta.deleted && !meta.agg ) {
            total += salario;
        }
    })
    /*llegado este punto la variable total 
    ya contiene la sumatoria de los registros y puede ser utilizada por ejemplo
    para mostrarla en algún campo*/
    apex.item("P1_CAMPO").setValue(total);
}

Para llamar a la función, podemos hacerlo con una Acción Dinámica de tipo Javascript, bastaría solo con poner el nombre de la función, ejemplo:

calcular_totales();

De esta manera muy simple y en poco más de 12 líneas de código hemos recorrido de manera sencilla todo el modelo de la grilla realizando la sumatoria de una sola columna por cada registro.

Modo de uso

Puede ser usada en acciones dinámicas de tipo javaScript, pero lo ideal para evitar repetir el código es colocarlo dentro de una función javaScript y agregarlo a la sección de Function and Global Variables ubicada las propiedades de la página que vamos a utilizar, de esta manera solamente debemos llamar a la función por su nombre desde las acciones dinámicas y en caso de que necesitemos modificar el código lo haríamos solamente en un solo lugar.

Puedes verlo en funcionamiento en este laboratorio (Gestión de Registros).

Sumatoria de registros seleccionados

Ahora realizaremos nuevamente una sumatoria de columnas pero solo de los registros seleccionados, para lo cuál modificaremos nuestro código de la siguiente manera.

Utilizaremos nuevamente la funciones del modelo getRecordId y getRecordMetadata, también agregaremos el widget de nombre getSelectedRecords y la función getFieldKey los cuales son ideales para estos casos.

Vamos al código.

function calcular_seleccion(){
    var region = apex.region('id_de_la_region'),
        //obtenemos el modelo
        modelo = region.call('getViews','grid').model,
        //obtenemos los registros seleccionados almacenados en un array
        registros = region.call( "getSelectedRecords"), 
        total = 0,
        //especificamos la columna que utilizaremos
        salario = modelo.getFieldKey("NOMBRE_COLUMNA"),
        i;
    //recorremos los registros seleccionados
    for ( i = 0; i < registros.length; i++ ) {
        var id = modelo.getRecordId(registros[i]),
            meta = modelo.getRecordMetadata(id);
        //validamos cada registro del array y realizamos la sumatoria
        if (!isNaN( salario ) && !meta.deleted && !meta.agg ) {
            total += parseFloat(registros[i][salario]);
        }
    }
    /*llegado este punto la variable total 
    ya contiene la sumatoria de los registros y puede ser utilizada por ejemplo
    para mostrarla en algún campo*/
    apex.item("P1_CAMPO").setValue(total);
}

Como verán en pocas líneas hemos recorrido los registros seleccionados uno por uno y obteniendo en este caso nuevamente el totalizador a nuestra disposición para mostrarlo al usuario o realizar alguna otra acción con el mismo.

Demo

Puedes verlo en funcionamiento en este laboratorio (Gestión de Registros).

Preservar registros seleccionados por página

En caso de que quisieramos que los registros permanezcan seleccionados a través de la paginación de la Grilla, agregamos el siguiente código en los atributos del IG en la sección de JavaScript Initialization Code.

function(config) {   
    config.defaultGridViewOptions = {     
        persistSelection: true   
    };
    return config;
}

Conclusión

Llegamos al final de otro post cargado de información, hemos visto 2 pequeñas funciones muy útiles pero que no se limitan solo a realizar sumatorias, sino que también nos muestran un sin fín de posibles usos y aplicaciones, tales como validaciones, cálculos, gestión de ciertos datos y mucho más.

Espero que te sea de mucha ayuda, consultas y sugerencias siempre son bienvenidas. Nos encontramos próximamente en otro post.

No olvides seguirme en las redes sociales para enterarte de más :) !!
Saludos!!