|
15.11.2010, 14:53 | #1 |
sys*#**#**#**#**#*
|
Создание связи N:N при преобразовании интереса.
Добрый день всем.
У интереса есть связь N:1 к кастомному обьекту "Проект". У объектов Контакт и бизнес партнер настроил связь N:N к этому же обьекту, так как клиент может участвовать в нескольких проектах, ну и соответственно у проекта должно быть N контактов и бизнес партнеров. Хотелось бы сделать чтобы при преобразовании интереса у контакта и бизнес партнера устанавливалась связь N:N с проектом связанным с интересом. Дайте пожалуйста пинок куда копать хотя бы. Понимаю что легче будет реализовать плагином, сижу ковыряю студию. |
|
15.11.2010, 15:03 | #2 |
Чайный пьяница
|
Подобная задача реализовывалась мной - http://a33ik.blogspot.com/2009/07/pl...notes-and.html
Разница в том, что прийдётся вычитывать ассоциированные с интересом записи и ассоциировать с контактом/компанией.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: CCNP|Leonid (1). |
15.11.2010, 22:06 | #3 |
sys*#**#**#**#**#*
|
А можете еще подсказать в какой табличке хряняться данные о связях?
Как я понимаю мне фактически нужно взять из таблицы отношение "проекта" к интересу", конкретно GUID проекта и подставить его в таблицу где хранятся отношения N:N поменяв GUID контакта либо бизнес партнера на тот который генерируется при преобразовании интереса? |
|
15.11.2010, 22:35 | #4 |
Консультант-джедай
|
При создании связи N:N Вы указываете имя связи, вот так же и будет называться новая табличка в ней и будут указаны сопоставления GUID'ов записей участвующих в связи N:N.
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
|
За это сообщение автора поблагодарили: CCNP|Leonid (1). |
16.11.2010, 22:50 | #5 |
sys*#**#**#**#**#*
|
Что то не получается, толи я туплю, то ли неясно. я вот думаю, при квалификации интереса создается возможная сделка, может в sql триггер повесить на таблицу возможных сделок, если мол у нее значение [OriginatingLeadId] не равняется нулю брать GUID проекта и создавать запись в таблице отношений N_N для контакта привязанного к возможной сделке. Насколько я понял при курении SDK мне нужно использовать ManyToManyMetadata класс?
|
|
16.11.2010, 23:41 | #6 |
Чайный пьяница
|
Цитата:
Сообщение от CCNP|Leonid
Что то не получается, толи я туплю, то ли неясно. я вот думаю, при квалификации интереса создается возможная сделка, может в sql триггер повесить на таблицу возможных сделок, если мол у нее значение [OriginatingLeadId] не равняется нулю брать GUID проекта и создавать запись в таблице отношений N_N для контакта привязанного к возможной сделке. Насколько я понял при курении SDK мне нужно использовать ManyToManyMetadata класс?
1. Для получения связанных записей необходимо использовать QueryExpression и LinkEntity. Примеров в интернете благо море - можно найти подобное. 2. После того, как связанные записи получены их необходимо ассоциировать с созданной возможной сделкой при помощи AssociateEntitiesRequest.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
18.11.2010, 10:05 | #7 |
sys*#**#**#**#**#*
|
Добрый день, уже 2 день не получается.
Вот что получилось. Ткните носом в ошибки плз. X++: using System; using System.Collections.Generic; using System.Text; using Microsoft.Crm.Sdk; using Microsoft.Crm.SdkTypeProxy; using Microsoft.Crm.Sdk.Query; namespace LeadConversionPlugin { public class ContactCreationHandler : IPlugin { #region IPlugin Members public void Execute(IPluginExecutionContext context) { if (context.MessageName == MessageName.Create && context.InputParameters.Contains("Target") && context.InputParameters["Target"] is DynamicEntity) { DynamicEntity entity = (DynamicEntity)context.InputParameters["Target"]; //Проверяем является ли значение контактом if (entity.Name != EntityName.contact.ToString()) return; // Проверяем есть ли у контакта связь с интересом if (!entity.Properties.Contains("originatingleadid")) return; //Получаем Guid интереса Guid leadid = ((Lookup)entity["originatingleadid"]).Value; //получаем Guid контакта Guid contactid = (Guid)context.OutputParameters["Id"]; ICrmService crmservice = context.CreateCrmService(true); //Just build the query which will be used to retrieve //all child annotations (notes and attachements) //QueryByAttribute query = new QueryByAttribute(); //query.ColumnSet = new AllColumns(); //query.EntityName = EntityName.annotation.ToString(); //query.Attributes = new string[] { "objectid" }; //query.Values = new object[] { leadid }; QueryExpression relationshipCheckQuery = new QueryExpression(); relationshipCheckQuery.EntityName = "new_project"; relationshipCheckQuery.ColumnSet = new ColumnSet(new string[] { "new_projectid" }); // // // Code Create Moniker for first Entity: Contact Moniker Moniker1 = new Moniker(); Moniker1.Id = contactid; Moniker1.Name = EntityName.contact.ToString(); // Code Create Moniker for second Entity: New_CustomEntity Moniker Moniker2 = new Moniker(); Moniker2.Id = leadid; Moniker2.Name = EntityName.new_project.ToString(); string strManyToManyRelationshipName = "new_new_project_contactId"; RetrieveMultipleRequest request = new RetrieveMultipleRequest(); request.Query = query; request.ReturnDynamicEntities = false; RetrieveMultipleResponse response = (RetrieveMultipleResponse)crmservice.Execute(request);}} public bool AssociateManyToManyEntityRecords(Moniker Moniker1, Moniker Moniker2, string strEntityRelationshipName){ try { // Create an AssociateEntities request. AssociateEntitiesRequest request = new AssociateEntitiesRequest(); // Set the ID of Moniker1 to the ID of the lead. request.Moniker1 = Moniker1; // Set the ID of Moniker2 to the ID of the contact. request.Moniker2 = Moniker2; // Set the relationship name to associate on. request.RelationshipName = strEntityRelationshipName; // Execute the request. service.Execute(request); return true; } catch (SoapException ex) { return false; } } } #endregion IPlugin Members } |
|
18.11.2010, 10:53 | #8 |
Чайный пьяница
|
Цитата:
Сообщение от CCNP|Leonid
Добрый день, уже 2 день не получается.
Вот что получилось. Ткните носом в ошибки плз. X++: using System; using System.Collections.Generic; using System.Text; using Microsoft.Crm.Sdk; using Microsoft.Crm.SdkTypeProxy; using Microsoft.Crm.Sdk.Query; namespace LeadConversionPlugin { public class ContactCreationHandler : IPlugin { #region IPlugin Members public void Execute(IPluginExecutionContext context) { if (context.MessageName == MessageName.Create && context.InputParameters.Contains("Target") && context.InputParameters["Target"] is DynamicEntity) { DynamicEntity entity = (DynamicEntity)context.InputParameters["Target"]; //Проверяем является ли значение контактом if (entity.Name != EntityName.contact.ToString()) return; // Проверяем есть ли у контакта связь с интересом if (!entity.Properties.Contains("originatingleadid")) return; //Получаем Guid интереса Guid leadid = ((Lookup)entity["originatingleadid"]).Value; //получаем Guid контакта Guid contactid = (Guid)context.OutputParameters["Id"]; ICrmService crmservice = context.CreateCrmService(true); //Just build the query which will be used to retrieve //all child annotations (notes and attachements) //QueryByAttribute query = new QueryByAttribute(); //query.ColumnSet = new AllColumns(); //query.EntityName = EntityName.annotation.ToString(); //query.Attributes = new string[] { "objectid" }; //query.Values = new object[] { leadid }; QueryExpression relationshipCheckQuery = new QueryExpression(); relationshipCheckQuery.EntityName = "new_project"; relationshipCheckQuery.ColumnSet = new ColumnSet(new string[] { "new_projectid" }); // // // Code Create Moniker for first Entity: Contact Moniker Moniker1 = new Moniker(); Moniker1.Id = contactid; Moniker1.Name = EntityName.contact.ToString(); // Code Create Moniker for second Entity: New_CustomEntity Moniker Moniker2 = new Moniker(); Moniker2.Id = leadid; Moniker2.Name = EntityName.new_project.ToString(); string strManyToManyRelationshipName = "new_new_project_contactId"; RetrieveMultipleRequest request = new RetrieveMultipleRequest(); request.Query = query; request.ReturnDynamicEntities = false; RetrieveMultipleResponse response = (RetrieveMultipleResponse)crmservice.Execute(request);}} public bool AssociateManyToManyEntityRecords(Moniker Moniker1, Moniker Moniker2, string strEntityRelationshipName){ try { // Create an AssociateEntities request. AssociateEntitiesRequest request = new AssociateEntitiesRequest(); // Set the ID of Moniker1 to the ID of the lead. request.Moniker1 = Moniker1; // Set the ID of Moniker2 to the ID of the contact. request.Moniker2 = Moniker2; // Set the relationship name to associate on. request.RelationshipName = strEntityRelationshipName; // Execute the request. service.Execute(request); return true; } catch (SoapException ex) { return false; } } } #endregion IPlugin Members } Код: using System; using System.Collections.Generic; using System.Text; using Microsoft.Crm.Sdk; using Microsoft.Crm.SdkTypeProxy; using Microsoft.Crm.Sdk.Query; using System.Web.Services.Protocols; namespace LeadConversionPlugin { public class ContactCreationHandler : IPlugin { #region IPlugin Members public void Execute(IPluginExecutionContext context) { if (context.MessageName == MessageName.Create && context.InputParameters.Contains("Target") && context.InputParameters["Target"] is DynamicEntity) { DynamicEntity entity = (DynamicEntity)context.InputParameters["Target"]; //Проверяем является ли значение контактом if (entity.Name != EntityName.contact.ToString()) return; // Проверяем есть ли у контакта связь с интересом if (!entity.Properties.Contains("originatingleadid")) return; //Получаем Guid интереса Guid leadid = ((Lookup)entity["originatingleadid"]).Value; //получаем Guid контакта Guid contactid = (Guid)context.OutputParameters["Id"]; ICrmService crmservice = context.CreateCrmService(true); QueryExpression relationshipCheckQuery = new QueryExpression(); relationshipCheckQuery.EntityName = "new_project"; relationshipCheckQuery.ColumnSet = new ColumnSet(new string[] { "new_projectid" }); LinkEntity link = relationshipCheckQuery.AddLink("<название связи N:N между проектом и лидом>", "new_projectid", "new_projectid"); link.LinkCriteria.AddCondition("leadid", ConditionOperator.Equal, leadid); RetrieveMultipleRequest request = new RetrieveMultipleRequest(); request.Query = relationshipCheckQuery; request.ReturnDynamicEntities = true; List<BusinessEntity> list = ((RetrieveMultipleResponse)crmservice.Execute(request)).BusinessEntityCollection.BusinessEntities; foreach (DynamicEntity de in list) { AssociateEntitiesRequest assrequest = new AssociateEntitiesRequest(); assrequest.Moniker1 = new Moniker("contact", contactid); assrequest.Moniker2 = new Moniker("new_project", ((Key)de["new_projectid"]).Value); assrequest.RelationshipName = "<название связи N:N между проектом и контактом>"; crmservice.Execute(assrequest); } } } } #endregion IPlugin Members }
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
Теги |
бизнес-партнер, интересы, контакт, связанные сущности, связь n:n, связи |
|
|