locked
Dynamically Filter the View Criteria RRS feed

  • Question

  • Hi all,

    I have requirement to filter the records on the My active accounts  and Active Accounts based on the opportunity primary contact matching the accounts primary contact.

    I have tried this using retrieve multiple plugin on savedquery entity.

    In my Plugin i am updating the view fetchxml. but it is not updating the view.

    Please suggest me on this requirement.


    Thursday, June 13, 2013 7:50 AM

Answers

  • HI all,

    We can dynamically filter the standard view filter .

    Below are the steps to this  process:

    1) Create a plugin 

    2) Register this plugin on RetrieveMultiple Message

    3) Primary Entity as the entity on which the view search spec should be modified dynamically

    4) pre - validation 10 stage

    5) synchronous - call

    Below is sample code on which i achieved this functioanlity:

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

    IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                                    IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                    if (context.Mode == 0 && context.Stage == 20 && context.MessageName.Equals("RetrieveMultiple"))
                    {
                        TracingMessages.AppendLine("------------------------------------------------------------------------------");
                        TracingMessages.AppendLine("Entered in to Context");
                        if (context.InputParameters.Contains("Query"))
                        {
                            TracingMessages.AppendLine("Entered in to Query");
                            if (context.InputParameters["Query"] is QueryExpression)
                            {
                                TracingMessages.AppendLine("Entered in to QueryExpression");
                                 //context.
                                QueryExpression objQueryExpression = (QueryExpression)context.InputParameters["Query"];
                                TracingMessages.AppendLine(objQueryExpression.EntityName.ToString());
                                if (objQueryExpression.EntityName == your entity)
                                {
                                    TracingMessages.AppendLine("-----------------------------------------------------Start Condtion");

                                    Guid UserId = context.UserId;
                                    ColumnSet UserCol = new ColumnSet("territoryid");
                                    Entity User = service.Retrieve("systemuser", UserId, UserCol);
                                    Guid locationId = ((EntityReference)User.Attributes["territoryid"]).Id;
                                    string LocationName = ((EntityReference)User.Attributes["territoryid"]).Name;
                                    TracingMessages.AppendLine(LocationName);
                                    TracingMessages.AppendLine(locationId.ToString());
                                    ConditionExpression QueryExpre = new ConditionExpression(Your Query Expression);
                                    FilterExpression Filte = new FilterExpression
                                    {
                                        FilterOperator = LogicalOperator.Or,
                                        Conditions = { QueryExpre }


                                    };
                                    int CondtionCount = objQueryExpression.Criteria.Conditions.Count;
                                    TracingMessages.AppendLine(CondtionCount.ToString());
                                    for (int i = 0; i < CondtionCount; i++)
                                    {
                                        var WriteAttribute = objQueryExpression.Criteria.Conditions[i].AttributeName.ToString();// get the default condition expression from the view query expression
                                        TracingMessages.AppendLine(WriteAttribute);

       // Compare the your Condition Expression with systems Default Condition Expression
                                        if (WriteAttribute == your condition expression)
                                        {

                                            objQueryExpression.Criteria.AddFilter(Filte);
                                            //context.InputParameters["Query"] = objQueryExpression;
                                            TracingMessages.AppendLine(" Got the Expression");
                                        }

                                    }
                                    TracingMessages.AppendLine("-----------------------------------------------------End Condtion");

                                    int FilterCount = objQueryExpression.Criteria.Filters.Count;


                                    TracingMessages.AppendLine(FilterCount.ToString());
                                    for (int i = 0; i < FilterCount; i++)
                                    {
                                        var writefilterConditioncount = objQueryExpression.Criteria.Filters[i].Conditions.Count;
                                        TracingMessages.AppendLine(writefilterConditioncount.ToString());
                                        for( int j =0  ; j< writefilterConditioncount; j++)
                                        {
                                            var Attribute = objQueryExpression.Criteria.Filters[i].Conditions[j].AttributeName.ToString();

                                            //var Operator = objQueryExpression.Criteria.Filters[i].Conditions[j].Operator.ToString();
                                            TracingMessages.AppendLine(Attribute);
                                        }
                                        var WriteFilterValue = objQueryExpression.Criteria.Filters[i].Conditions[i].Operator.ToString();
                                        objQueryExpression.Criteria.FilterOperator = LogicalOperator.Or;
                                        var Wri = objQueryExpression.Criteria.FilterOperator.ToString();
                                        TracingMessages.AppendLine(WriteFilterValue);
                                        TracingMessages.AppendLine(Wri);
                                    }



                                    TracingMessages.AppendLine("In Saved");
                                 }
                                }
                            }
                        }
                    }

                catch (FaultException<OrganizationServiceFault> e)
                {
                    //TracingMessages.AppendLine(e.Message);

                    // Handle the exception.
                    throw;
                }
                catch (Exception e)
                {
                    //TracingMessages.AppendLine(e.Message);
                    throw e;
                }
                finally
                {
                    StreamWriter sw  = null;
                    string TraceFilePath = @"D:\TraceLog\TraceLog.txt";
                    sw = new StreamWriter(TraceFilePath, true);
                    sw.WriteLine("Date        : " +
                               DateTime.Now.ToLongTimeString());
                    sw.WriteLine("Message :" + TracingMessages.ToString().Trim());
                    sw.Flush();
                    sw.Close();
                }
            }
        }
    }

    But instead of implementing this example . if your functionality includes system user entity search spec we can acheive the same with new advanced find feature which includes the system user options.

    • Marked as answer by Siddhu336 Wednesday, June 26, 2013 12:21 PM
    Wednesday, June 26, 2013 12:21 PM