Auteur de questions
Mettre à jour une champs de recherche dans l'unité incident

Question
-
Bonjour à tous,
J'ai programmé un boute de code faisant en sorte que lorsqu'une nouvelle instance d'une entité customizée est crée, un champs de recherche de l'entité incident reliée à l'instance précédente est mis à jour avec les références de l'instance nouvellement crée. Le code s'exécute sans problème et j'ai vérifié qu'il passait par toutes les conditions. Cependant le champs ne se met pas à jour, j'ai testé le code sur d'autres champs qui ne se mettent pas à jour non plus...Où est mon erreur?
public void Execute(IServiceProvider serviceProvider) { // Instanciation des services IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = factory.CreateOrganizationService(null); Entity target = (Entity)context.InputParameters["Target"]; EntityReference contrats = (EntityReference)target.Attributes["new_contratsid"]; FetchExpression fetch = new FetchExpression(@" <fetch distinct='false' mapping='logical'> <entity name='" + context.PrimaryEntityName + "'><link-entity name='new_contrats' alias='nombreligne' from='new_contratsid' to='new_contratsid'><filter type='and'><condition attribute='new_contratsid' value='" + contrats.Id + "' operator='eq'></condition></filter></link-entity></entity></fetch>"); EntityCollection lines = service.RetrieveMultiple(fetch); // Vérification qu'il y a au moins une ligne de contrat associée if (lines.Entities.Any()) { var first = lines.Entities.Last(); if (first.GetAttributeValue<OptionSetValue>("statecode").Value == 1) { FetchExpression query = new FetchExpression(@" <fetch distinct='false' mapping='logical'> <entity name='incident'><link-entity name='new_lignecontrat' alias='ligneContrat' from='new_lignecontratid' to='new_lignecontrat'><filter type='and'><condition attribute='new_lignecontratid' value='" + first.Id + "' operator='eq'></condition></filter></link-entity></entity></fetch>"); EntityCollection incident = service.RetrieveMultiple(query); if (incident.Entities.Any()) { foreach (var e in incident.Entities) { if (e.GetAttributeValue<OptionSetValue>("statecode").Value == 0) { EntityReference active = e.GetAttributeValue<EntityReference>("new_lignecontrat"); active = new EntityReference(target.LogicalName, target.Id); var test = e.GetAttributeValue<String>("new_ville"); test = "Lyon"; service.Update(e); } } } } } } } }
Merci d'avance !
Toutes les réponses
-
Bonjour Lisbeth,
Dans votre code, je ne vois nulle part une affectation de valeur à un champ de recherche de l'objet "e" qui semble être celui que vous voulez mettre à jour...
Je vois des GetAttribute qui sont une lecture de valeur mais je ne suis pas certain que la façon dont vous essayez de mettre à jour fonctionne...
Je réécrirais bien le code de la façon suivante:
e["new_lignecontrat"] = new EntityReference(target.logicalName, target.Id); e["new_ville"] = "Lyon"; service.Update(e);
Est ce bien ce que vous souhaitez faire? Si oui, l'objet target est il bien une ligne contrat personnalisée?
My blog : http://mscrmtools.blogspot.com
Did you try the new CrmDiagTool for Microsoft Dynamics CRM 2011 ? If not, follow me
Upgraded tools for Dynamics CRM 2011!
View Layout Replicator | Searchable Property Updater | Ribbon Browser | SiteMap Editor | JavaScript Web Resource Manager | Role updater -
Bonjour Tanguy et merci pour votre réponse,
J'ai modifié mon code juste après mon premier post de la façon suivante :
if (e.GetAttributeValue("statecode").Value == 0) {
e.Attributes["new_lignecontrat"] = new EntityReference (target.LogicalName, target.Id);
}
Puis tester votre code ce matin, mais sans résultat. "target" représente effectivement une entité ligne de contrat personnalisée et e une instance de l'entité incident liée à l'instance personnalisée précédente.J'ai également supprimé le service.update, mon plugin fonctionnant en pre-operation. L'entité à mettre à jour est bien l'entité incident.
- Modifié Lisbeth Johnsson mardi 7 février 2012 09:25
-
Si vous êtes en preOperation, et que vous souhaitez mettre à jour un enregistrement qui n'est pas celui qui a déclenché le plugin, alors le service.Update est obligatoire.
Si le code s'execute sans problème, c'est peut être que vous n'atteignez pas le code de modification. Etes vous sur que les mutliples conditions (if) sont respectées et que vous atteignez bien le code de mise à jour?
My blog : http://mscrmtools.blogspot.com
Did you try the new CrmDiagTool for Microsoft Dynamics CRM 2011 ? If not, follow me
Upgraded tools for Dynamics CRM 2011!
View Layout Replicator | Searchable Property Updater | Ribbon Browser | SiteMap Editor | JavaScript Web Resource Manager | Role updater -
Merci Tanguy,
Mon plugin est en post-operation puisque l'entité incident ne peut être mise à jour qu'après la création effective de l'entité. Malgré le service.Update de l'incident, le lookup ne se met pas à jour...J'ai vérifié plusieurs fois et le code est bien atteint si les conditions sont requises.
-
Je veux juste essayer de savoir si j'ai bien compris le besoin:
Lors d'un événement (Create ou Update, ça n'est pas indiqué dans le code) sur une ligne de contrat:
- identification du contrat associé
- récupération de toutes les lignes de contrats associées à ce contrat
- On prend la dernière de la liste
- On cherche les incidents dont les contrats sont attachés à cette dernière ligne de contrat trouvée
- On affecte la ligne ayant initié le traitement aux incidents retrouvés
Déjà, est ce bien le traitement attendu?
My blog : http://mscrmtools.blogspot.com
Did you try the new CrmDiagTool for Microsoft Dynamics CRM 2011 ? If not, follow me
Upgraded tools for Dynamics CRM 2011!
View Layout Replicator | Searchable Property Updater | Ribbon Browser | SiteMap Editor | JavaScript Web Resource Manager | Role updater -
-
Pour moi, le code devrait être bon, dans ce que vous avez écrit:
if (e.GetAttributeValue("statecode").Value == 0) {
e.Attributes["new_lignecontrat"] = new EntityReference (target.LogicalName, target.Id);
}
Il manque simplement le service.Update() mais j'imagine qu'il existe dans votre code.
Si vous arrivez à faire du debug pas à pas et que vous arrivez sur la méthode Update mais que vous ne voyez pas cette modification dans les incidents, peut être y a t il un autre bout de code quelque part qui empêche cette modification
My blog : http://mscrmtools.blogspot.com
Did you try the new CrmDiagTool for Microsoft Dynamics CRM 2011 ? If not, follow me
Upgraded tools for Dynamics CRM 2011!
View Layout Replicator | Searchable Property Updater | Ribbon Browser | SiteMap Editor | JavaScript Web Resource Manager | Role updater