Buscar en este blog

domingo, 21 de septiembre de 2014

Conservar los filtros de usuario en un grid


Aquí un pedazo de código que me costó tiempo, es por si alguna vez necesitan conservar los filtros del usuario en un grid y al mismo tiempo aplicar y/o quitar un filtro por código.

En mi caso, necesitaba que dependiendo del valor de un checkbox se mostraran u ocultaran los registros en un grid dependiendo del valor de un campo especifico, pero además que se conservaran los filtros que el usuario hubiera puesto.

En el executequery del datasource del form:

public void executeQuery()
{
    //Instancia para el queryRun del Datasource
    //(es la que va a traer los filtros del usuario)
    Query                   queryRunForProjRevenueTrans;
    QueryBuildDataSource    qbdsForProjRevenueTrans;
    QueryBuildRange         qbrForProjRevenueTrans;

    //Instancia para el query del Datasource
    //(es la que trae el query original)
    Query                   origQueryForProjRevenueTrans;
    QueryBuildDataSource    origQbdsForProjRevenueTrans;
    QueryBuildRange         origQbrForProjRevenueTrans;
  
    boolean updateOrigQuery;
 
    //Revisa si el query con filtros de usuario existe,
    //sino existe, toma el query original
    if(ProjRevenueTrans_DS !=null && ProjRevenueTrans_DS.queryRun() != null && ProjRevenueTrans_DS.queryRun().query() != null)
    {
        queryRunForProjRevenueTrans = ProjRevenueTrans_DS.queryRun().query();
        updateOrigQuery = true;
    }
    else
        queryRunForProjRevenueTrans = ProjRevenueTrans_DS.query();
       
    //Limpiando el range personalizado que se necesita por código
    qbdsForProjRevenueTrans = queryRunForProjRevenueTrans.dataSourceName("ProjRevenueTrans");
    qbdsForProjRevenueTrans.clearRange(fieldnum(ProjRevenueTrans, GRWReferencia));
    qbrForProjRevenueTrans = qbdsForProjRevenueTrans.addRange(fieldnum(ProjRevenueTrans, GRWReferencia));
 
    //Actualizando los querys en ambos casos (query o queryRun)
    if(MostrarDetalles.value() == 1//Este es mi control (checkbox) condicionante para poner un range por código
    {
        qbrForProjRevenueTrans.value(SysQuery::valueUnlimited());
        if(updateOrigQuery)
        {
            origQbdsForProjRevenueTrans =  ProjRevenueTrans_DS.query().dataSourceName("ProjRevenueTrans");
            origQbdsForProjRevenueTrans.clearRange(fieldnum(ProjRevenueTrans, GRWReferencia));
            origQbrForProjRevenueTrans = origQbdsForProjRevenueTrans.addRange(fieldnum(ProjRevenueTrans,GRWReferencia));
            origQbrForProjRevenueTrans.value(SysQuery::valueUnlimited());
        }
 }
    else
    {
        qbrForProjRevenueTrans.value(SysQuery::valueEmptyString());
        if(updateOrigQuery)
        {
            origQbdsForProjRevenueTrans =  ProjRevenueTrans_DS.query().dataSourceName("ProjRevenueTrans");
            origQbdsForProjRevenueTrans.clearRange(fieldnum(ProjRevenueTrans, GRWReferencia));
            origQbrForProjRevenueTrans = origQbdsForProjRevenueTrans.addRange(fieldnum(ProjRevenueTrans,GRWReferencia));
            origQbrForProjRevenueTrans.value(SysQuery::valueEmptyString());
        }
    }
 
    super();
}


Y en el modified de mi checkbox solo llamé un método que hace el research del datasource

ProjRevenueTrans_ds.research(true);



Por último, te invito a que te unas a la página de facebook recién creada para estar al día con las actualizaciones del blog y que podamos tener más comunicación. La meta? es hacer la comunidad de habla hispana mas grande sobre Dynamics Ax en cuestiones de desarrollo.


No hay comentarios.:

Publicar un comentario