Dynamics CRM : Récupérer les couples valeur/texte des Picklist
Voici une astuce concernant les Picklist et la récupération dynamique des valeurs et textes qu'elles peuvent avoir. Lorsqu'on veut renseigner la Picklist d'une entité en code, il faut obligatoirement fixer la valeur de la Picklist, le texte ne suffit pas.
Ceci ne fonctionnera pas :
Public Sub updateAccountCategoryCode(ByVal accountid As String, ByVal CategoryCode As String)
Dim a As account = CType(CRMHelper.Retrieve(GetType(account), accountid), account)
Dim acc As Picklist
acc = New Picklist
acc.name = CategoryCode
a.accountcategorycode = acc
CRMHelper.Update(a)
End Sub
Pour que cela fonctionne, il faudrait définir la valeur associée à ce texte de cette manière :
Public Sub updateAccountCategoryCode(ByVal accountid As String, ByVal CategoryCode As String)
Dim a As account = CType(CRMHelper.Retrieve(GetType(account), accountid), account)
Dim acc As Picklist
acc = New Picklist
acc.name = CategoryCode
Select Case CategoryCode
Case "Prospect"
acc.Value = 1
Case "Client"
acc.Value = 2
End Select
a.accountcategorycode = acc
CRMHelper.Update(a)
End Sub
Seulement on est obligé d'aller chercher dans l'interface de CRM les valeurs associées aux textes possibles pour la Picklist, autant dire que cela peut vite devenir chronophage si l'on travaille avec beaucoup de Picklist.
Heureusement, de la même manière que l'on a le WebService principal de l'application (~/MSCRMServices/2006/CRMService.asmx) pour la lecture, mise à jour et suppression d'entités, il existe un 2ème WebService (~/MSCRMServices/2006/MetaDataService.asmx) qui nous permet d'obtenir les méta-données de l'application, dont les PicklistAttributeMetadata (A noter qu'en V4, ce WebService permet aussi de créer, modifier et supprimer les méta-données des entités).
Une fois le WebService ajouté comme référence Web dans Visual Studio, on peut maintenant récupérer les informations de la Picklist qui nous intéresse :
Private Shared Function retrievePicklistAttributeMetadata(ByVal entityName As String, ByVal column As String) As PicklistAttributeMetadata
Dim MetaDataService As New MetadataService
MetaDataService.Credentials = System.Net.CredentialCache.DefaultCredentials
Dim attMetaData As AttributeMetadata = MetaDataService.RetrieveAttributeMetadata(entityName, column)
Dim plAttMetaData As PicklistAttributeMetadata = CType(attMetaData, PicklistAttributeMetadata)
Return plAttMetaData
End Function
Et à partir de là, rien de plus facile que de retrouver le couple de valeur/texte qui nous intéresse dans la propriété Options :
Public Shared Function getPicklistFromText(ByVal entityName As String, ByVal column As String, ByVal text As String) As Picklist
Dim pam As PicklistAttributeMetadata = retrievePicklistAttributeMetadata(entityName, column)
For Each o As [Option] In pam.Options
If (o.Description = text) Then
Dim pl As New Picklist
pl.Value = o.OptionValue
pl.name = o.Description
Return pl
End If
Next
End Function
Ce qui au final réduit considérablement la complexité de la mise à jour de la société de mon exemple initial et supprime la maintenance nécessaire en cas de mise à jour de la Picklist.
Public Sub updateAccountCategoryCode(ByVal accountid As String, ByVal CategoryCode As String)
Dim a As account = CType(CRMHelper.Retrieve(GetType(account), accountid), account)
a.accountcategorycode = getPicklistFromText("account", "accountcategorycode", CategoryCode)
CRMHelper.Update(a)
End Sub
Ça peut toujours servir ;)
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :