Показать сообщение отдельно
Старый 04.02.2009, 12:34   #32  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
Артем, спасибо за совет.

А реализовал след. образом:

X++:
XmlDocument configDoc;
        public AccountRetrieveMultipleHandler(string unsecureConfig, string secureConfig)
        { 
               configDoc = new XmlDocument();
               configDoc.LoadXml(unsecureConfig);
        }

        #region IPlugin Members
        public void Execute(IPluginExecutionContext context)
        {
            if (context.Depth > 1)
                return;

            XmlDocument inDoc = new XmlDocument();
            inDoc.LoadXml((string)context.InputParameters.Properties["FetchXml"]);

            string enityName = inDoc.SelectSingleNode("fetch/entity/@name").InnerText;
            if (enityName == "account")
            {
                ICrmService serv = context.CreateCrmService(true);
                
                // Create a QueryExpression.
                QueryExpression qe = new QueryExpression();
                qe.EntityName = "role";
                qe.ColumnSet = new AllColumns();

                // Set up the join between the role entity
                // and the intersect table systemuserroles.
                LinkEntity le = new LinkEntity();
                le.LinkFromEntityName = "role";
                le.LinkFromAttributeName = "roleid";
                le.LinkToEntityName = "systemuserroles";
                le.LinkToAttributeName = "roleid";

                // Set up the join between the intersect table
                // systemuserroles and the systemuser entity.
                LinkEntity le2 = new LinkEntity();
                le2.LinkFromEntityName = "systemuserroles";
                le2.LinkFromAttributeName = "systemuserid";
                le2.LinkToEntityName = "systemuser";
                le2.LinkToAttributeName = "systemuserid";

                // The condition is to find the user ID.
                //Microsoft.Crm.Sdk.Query.c
                ConditionExpression ce = new ConditionExpression();
                ce.AttributeName = "systemuserid";
                ce.Operator = ConditionOperator.Equal;
                ce.Values = new object[] { context.UserId };

                FilterExpression fe = new FilterExpression();
                fe.AddCondition(ce);
                le2.LinkCriteria = fe;
                le.LinkEntities.Add(le2);
                qe.LinkEntities.Add(le);

                // Execute the query.
                BusinessEntityCollection bec = serv.RetrieveMultiple(qe);

                string rolename = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@securityrole").InnerText;//"Системный администратор";
                bool roleFound = false;
                if (bec.BusinessEntities.Count > 0)
                {
                    for (int i = 0; i < bec.BusinessEntities.Count; i++)
                    {
                        if (rolename == ((role)bec.BusinessEntities[i]).name)
                            roleFound = true;
                    }
                }

                if (!roleFound)
                {
                    XmlElement conditionElem;
                    XmlAttribute conditionAttr;
                    conditionElem = inDoc.CreateElement("condition");

                    conditionAttr =  inDoc.CreateAttribute("attribute");
                    conditionAttr.InnerText = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@attribute").InnerText;//"customertypecode";
                    conditionElem.Attributes.Append(conditionAttr);

                    conditionAttr = inDoc.CreateAttribute("operator");
                    conditionAttr.InnerText = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@operator").InnerText;//"ne";
                    conditionElem.Attributes.Append(conditionAttr);

                    conditionAttr = inDoc.CreateAttribute("value");
                    conditionAttr.InnerText = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@value").InnerText;//"3";
                    conditionElem.Attributes.Append(conditionAttr);

                    inDoc.SelectSingleNode("fetch/entity/filter").AppendChild(conditionElem);

                    context.InputParameters.Properties["FetchXml"] = inDoc.OuterXml;
                }
            }
        }
        #endregion