Seleccionar multiples valores de un mismo parametro y filtrar segun lo seleccionado
Muchas veces se tiene una tabla que se quiere filtrar de acuerdo a un parámetro que permite la múltiple selección de valores sobre el mismo.
Una opción sería traer todos los registros del dataset y filtrar de acuerdo a si es igual a los valores del parámetro en cuestión. Esto si bien es una solución buena cuando hay pocos registros en el dataset, cuando hay muchos registros es terriblemente ineficiente, porque trae todo a memoria y luego filtra.
La opción que se presenta aquí es delegar ese trabajo al motor de o3 o al de la base de datos dependiendo la fuente de datos.
El ejemplo esta hecho sobre el cubo de cronos.
Generar un data set para obtener los valores posibles del parametro:
Definir el parámetro:
Luego de esto hay que definir el dataset que va a ser el que muestre la tabla con la información que se quiere.
Notar que se le pasa un valor a contratos, totalmente aleatorio, pero necesario para generar la estructura de la tabla(columnas).
Luego en el script beforeopen del dataset ese valor sera reemplazado de la siguiente forma:
Aqui el texto para poder copiarse
var query=this.queryText; var largovalores=params["Contratos"].value.length; var texto=""; for(i=0; i<largovalores;i++) { text=texto+ "[Contratos].["+params["Contratos"].value[i]+"],"; } texto=texto.substring(0,texto.length-1);//Se remueve la coma ultima query = query.replace("[Contratos].[Cerrado]",texto); this.queryText=query;
Asi la consulta es totalmente dinámica, y se construye la misma, una vez seleccionados los parámetros.
De forma análoga se puede hacer con sql:
Definir la consulta del dataset asi
select * from Clientes cli where --reemplazoContratos
Luego en el beforeopen de ese dataset
var consulta=this.queryText; //Reemplazo de contratos var contratosarray=params["Contrato"].value; var contratoLength = contratosarray.length; var contratos=''; for (var i = 0; i < contratoLength ; i++) { if(i==0) { contratos=contratosarray[i]; } else { contratos=contratos+','+contratosarray[i]; } } var areemplazar = 'cli.IdContrato in ('+ contratos+ ')'; consulta = consulta.replace('--reemplazoContratos',areemplazar);