Construir filtro con función Javascript

Un usuario Pregunto ✅

Coltsbro

Hola a todos,

Actualmente estoy trabajando para llevar Power BI Embedded a un lugar en el que nuestra empresa pueda pensar en usarlo con más frecuencia. Una limitación que puedo ver actualmente es la necesidad potencial de diferentes filtros/estilos de filtro de una página a otra. En lugar de escribir constantemente el código para el filtro, pensé en crear una función para que se basaran en los parámetros ingresados.

EX: Tengo un filtro:

            var useFilter = {
                $schema: "http://powerbi.com/product/schema#advanced",
                target: {
                    table: table,
                    column: column
                },
                logicalOperator: 'And',
                conditions: [
                    {
                        operator: "Is",
                        value: value
                    }
                ]
            };

Donde la tabla, la columna y el valor eran algunas variables codificadas que tenía en la sección del script. Ahora, esto está bien para una sola vez, pero no es lo suficientemente dinámico para lo que podríamos necesitar. Así que creé una función para tratar de devolver este objeto, en función de los parámetros ingresados. Aquí está la función:

function advancedFilter(table, column, logicalOperator, operator, value){
    
    if (logicalOperator === undefined) {
        logicalOperator = "And";
    }
    if (operator === undefined) {
        operator = "Is";
    }
    if (value === undefined) {
        value = 0;
    }

    var filter = {
        $schema: "http://powerbi.com/product/schema#advanced",
        target: {
            table: table,
            column: column
        },
        logicalOperator: logicalOperator,
        conditions: [
            {
                operator: operator,
                value: value
            }
        ]
    };
}

Entonces establecería una variable así:

var useFilter = advancedFilter(table, column, "And", "Is", arr)

Donde arr es una variable de matriz básica con un valor (104 por ejemplo) en ella. También he intentado simplemente pasar el valor sin procesar en lugar de una matriz. ¿Qué estoy haciendo mal aquí? Cada vez que trato de usar esto, aparece un error: No capturado (en promesa) [Array[4]]. Si uso el filtro de ejemplo en la parte superior, sin la función, todo funciona bien. ¿Alguien tiene respuestas?

@Coltsbro

El siguiente código funciona en mi prueba. Puede depurar su filtro usando la declaración de alerta antes de aplicarlo. Consulta más detalles en Filtros. Por cierto, tenga en cuenta que al usar «In», es valors y cuando otros operadores es un valor escalar. Es posible que deba poner más lógica en su función.

var arr = [1,2,3,4,6,8]

function advancedFilter(table, column, logicalOperator, operator, value){
    
    if (logicalOperator === undefined) {
        logicalOperator = "And";
    }
    if (operator === undefined) {
        operator = "Is";
    }
    if (value === undefined) {
        value = 0;
    }

    return filter = {
        $schema: "http://powerbi.com/product/schema#advanced",
        target: {
            table: table,
            column: column
        },
        //logicalOperator: logicalOperator,
        //conditions: [
        //    {
                operator: operator,
//It is "values" when using a operator "In" values: value // } //] }; } alert(JSON.stringify(advancedFilter("table","column","","In",arr)));

@Coltsbro

El siguiente código funciona en mi prueba. Puede depurar su filtro usando la declaración de alerta antes de aplicarlo. Consulta más detalles en Filtros. Por cierto, tenga en cuenta que al usar «In», es valors y cuando otros operadores es un valor escalar. Es posible que deba poner más lógica en su función.

var arr = [1,2,3,4,6,8]

function advancedFilter(table, column, logicalOperator, operator, value){
    
    if (logicalOperator === undefined) {
        logicalOperator = "And";
    }
    if (operator === undefined) {
        operator = "Is";
    }
    if (value === undefined) {
        value = 0;
    }

    return filter = {
        $schema: "http://powerbi.com/product/schema#advanced",
        target: {
            table: table,
            column: column
        },
        //logicalOperator: logicalOperator,
        //conditions: [
        //    {
                operator: operator,
//It is "values" when using a operator "In" values: value // } //] }; } alert(JSON.stringify(advancedFilter("table","column","","In",arr)));

Coltsbro

En respuesta a Eric_Zhang

Esto ahora funciona para los operadores además de «In». Código modificado:

function advancedFilter(table, column, logicalOperator, operator, value){
    
 if (logicalOperator == undefined || logicalOperator == "" || logicalOperator == null) {
logicalOperator = "And";
}
if (operator == undefined || operator == "" || operator == null) {
operator = "Is";
}
if (value == undefined || value == "" || value == null) {
value = 0;
} if (operator == "In") { return filter = { $schema: "http://powerbi.com/product/schema#advanced", target: { table: table, column: column }, logicalOperator: logicalOperator, conditions: [ { operator: operator, values: value } ] }; } else { return filter = { $schema: "http://powerbi.com/product/schema#advanced", target: { table: table, column: column }, logicalOperator: logicalOperator, conditions: [ { operator: operator, value: value } ] }; } }

Llamado en la vista:

var arr = [104, 102, 117];
var useFilter = advancedFilter(table, column, "", "In", arr);

Empujado a los filtros de informe:

                report.on('loaded', event => {
                    report.getFilters()
                    .then(filters => {
                        filters.push(useFilter);
                        return report.setFilters(filters);
                    })
                })

También puede valer la pena señalar que tengo la función en un archivo javascript separado al que hago referencia en la vista. Esto es lo que devuelve en el cuadro de texto de alerta:

{  
   "$schema":"http://powerbi.com/product/schema#advanced",
   "target":{  
      "table":"SiteInfo",
      "column":"SiteId"
   },
   "logicalOperator":"And",
   "conditions":[  
      {  
         "operator":"In",
         "values":[  
            104,
            102,
            117
         ]
      }
   ]
}

Sigo recibiendo el mensaje de error en la consola del desarrollador en la página web: Uncaught (en promesa): Array[4].

Array[4]
0
:
Object
message
:
"operator is invalid. Not meeting required constraint"
__proto__
:
Object
1
:
Object
message
:
"values is invalid. Not meeting required constraint"
__proto__
:
Object
2
:
Object
message
:
"conditions.0.value is invalid. Not meeting required constraint"
__proto__
:
Object
3
:
Object
message
:
"filter is invalid"

¿Que sugieres?

Coltsbro

En respuesta a Coltsbro

Indiferencia. Parece que «In» es específico de un filtro básico, por lo que arrojaba un error. ¡Todo parece estar funcionando perfectamente ahora, gracias por su ayuda!

En respuesta a Coltsbro

@Coltsbro

Usted es siempre bienvenido. sonriente jajaja

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *