2009-10-21 18 views
0

Je suis en train de travailler sur la façon d'utiliser le CrmService pour fermer une tâche dans MS CRM 4.0MS CRM 4.0 CrmService - Fermer une tâche

J'ai essayé d'utiliser le SetStateTaskRequest pour définir un état de la tâche et le statut à TaskState.Completed et 5. J'ai également essayé TaskState.Completed et -1, mais pas de dés là non plus.

De toute façon, je reçois seulement l'exception toujours "Serveur n'a pas pu traiter la demande" lors de la tentative CrmService.Execute.

Je peux créer et mettre à jour des tâches aussi librement que je le souhaite. Mais je n'arrive pas à les mettre au point. C'est frustrant. J'ai remarqué que je ne peux que définir l'état d'une tâche à terminer dans Sage CRM via l'action Fermer la tâche. Je me demandais s'il y a un appel CrmService distinct que je dois faire pour effectuer l'action Close Task, plutôt que de passer par la méthode CrmService.Execute.

Oh: Je me connecte au CrmService avec toutes les permissions. Donc, je ne vois pas que ce serait un problème d'autorisations sur l'élément de tâche.

Je ne peux pas penser à quoi d'autre pourrait causer ce problème. Tout conseil ou même juste un point dans la bonne direction serait très apprécié.

FIRST EDIT:

Merci à Grega g pour me faire vérifier le champ Détail de l'exception.

J'ai maintenant un message d'exception plus détaillé. Dans la forme XML:

<error> 
    <code>0x80040203</code> 
    <description>Invalid format of input XML for request SetStateTask: required field 'EntityId' is missing.</description> 
    <type>Platform</type> 
</error> 

Ce qui est bizarre - considèrent mon code (presque identique à greg g de:

 SetStateTaskRequest request = new SetStateTaskRequest(); 
     request.EntityID = gTaskId; 
     request.TaskState = TaskState.Completed; 

     // ETaskStatusCode is an enumeration of the status codes taken from the StringMap in CRM. 
     // 
     // ETaskStatusCode.Completed = 5 - I can confirm this is the accurate status value for a Closed Task. 
     // 
     // Also, I have attempted this code with -1, which the documentation claims should cause the status 
     // to automatically be set to the default status for the supplied state. No change there. 
     request.TaskStatus = (int)ETaskStatusCode.Completed;    

     SetStateTaskResponse response = CRMManager.CrmService.Execute(request) as SetStateTaskResponse; 

De plus, juste pour confirmer que j'ai le code d'état (et aussi de partager quelque chose que je ai trouvé très utile pour traiter avec MS CRM), voici le SQL que j'utilise pour déterminer les valeurs des statuts de l'entité.

SELECT 
    MSE.ObjectTypeCode, 
    MSE.PhysicalName, 
    SM.AttributeName, 
    SM.Value, 
    SM.AttributeValue 
FROM MetadataSchema.Entity MSE 
    INNER JOIN StringMap SM on MSE.ObjectTypeCode = SM.ObjectTypeCode 
ORDER BY MSE.PhysicalName, SM.AttributeName, SM.AttributeValue 

Je peux confirmer à partir de l'interface Web MS CRM que la valeur d'état qui est aussi associé à une tâche Terminé est également nommé Terminé. Je peux confirmer à partir du SQL ci-dessus que la valeur de ce statut, pour une tâche, est 5 - c'est la valeur passée de mon Enum.

Je peux également confirmer que gTaskId est défini sur un Guid valide qui fait référence à une Tâche qui existe réellement et qui est ouvert au moment de la tentative de fermeture.

Curieux et plus curieux. Des pensées?

Répondre

0

Trouvé! Ok - en examinant mon code ci-dessus et le message d'erreur de près, mon CrmService contenait la propriété EntityID - mais l'exception était que la propriété EntityId manquait.

D'une certaine manière, mon CrmService avait sa propriété EntityId renommée en EntityID.

Renommer la propriété a résolu le problème. Je n'ai toujours aucune idée de comment cela s'est passé en premier lieu. Par sécurité, je vais régénérer un nouveau proxy de service pour m'assurer que mes propriétés sont correctement nommées. En regardant à travers le code, il semble que quelqu'un a fait un find-and-replace sur 'Id' et l'a transformé en 'ID' - qui est la convention de nommage dans mon lieu de travail pour les champs Property qui représentent les clés primaires.

Merci encore à grega g de souligner que la propriété Détail avait les informations supplémentaires dont j'avais besoin.

1

Utilisez la classe SetStateTaskRequest.

SetStateTaskRequest task2Close = new SetStateTaskRequest(); 
task2Close.EntityId = <taskGuid> 
task2Close.TaskState = TaskState.Completed; 
task2Close.TaskStatus = <some value> 

try 
{ 
    SetStateTaskResponse r = (SetStateTaskResponse) crmSvc.Execute(task2Close); 
} 
catch (SoapException e) 
{ 
    //Use e.Details for more info than "server was unable ..." 
} 

Ce code devrait fonctionner (ou vous permettre de voir pourquoi l'erreur se produit)

+0

Tout d'abord, c'est presque * exactement * mon code. Mais je n'avais pas réalisé que je pouvais obtenir un message plus détaillé sur le champ Détails. Cependant, la nature de ce message est ... étrange, compte tenu du contexte. Je vais modifier mon post original avec les détails. –

0

Etes-vous sûr que lorsque vous essayez de fermer la tâche vous passez état valeur qui est valable pour Complété état? Les différents codes d'état ne sont valides qu'avec leurs codes d'état correspondants.Pouvez-vous ajouter votre code source et une partie de la personnalisation de votre entité d'état?

+0

Merci pour la suggestion - mais oui, je suis sûr. J'ai couru du SQL sur le StringMap pour confirmer. Une tâche terminée doit avoir le statut 'Completed', qui est défini sur 5 dans la StringMap pour les tâches. J'ai aussi essayé -1, ce que les états de documentation devraient me donner l'entrée 'par défaut' pour l'état choisi. Pas de chance. –