2017-10-03 5 views
0

Je dois mettre à jour le champ Nom dans les produits d'approbation de prix à l'aide de ssis. C'est mon code dans le composant de script.Comment mettre à jour le champ Nom dans les produits d'approbation de prix (entité personnalisée) dans Dynamics CRM à l'aide du composant de script sis

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    Guid AppProductLookup = new Guid(); 
    AppProductLookup = getAppProductId(Row.Name, ref organizationservice); 
    Entity AppProductEnt = new Entity("new_ticketproduct"); 
    ColumnSet columns = new ColumnSet(true); 
    columns = new ColumnSet(new String[] { "new_name"}); 

    AppProductEnt = organizationservice.Retrieve(AppProductEnt.LogicalName, AppProductLookup, columns); 
    AppProductEnt["new_name"] = Row.Name; 
    organizationservice.Update(AppProductEnt); 

} 

public Guid getAppProductId(string name, ref IOrganizationService service) 
{ 

    Guid AppProductId = Guid.Empty; 
    QueryExpression AppProduct = new QueryExpression { EntityName = "new_ticketproduct", ColumnSet = new ColumnSet(true) }; 
    AppProduct.Criteria.AddCondition("new_name", ConditionOperator.Equal, name); 
    EntityCollection AppProductRetrieve = service.RetrieveMultiple(AppProduct); 

    if (AppProductRetrieve != null && AppProductRetrieve.Entities.Count > 0) 
    { 

     AppProductId = AppProductRetrieve.Entities[0].GetAttributeValue<Guid>("new_ticketproductid"); 

    } 
    return AppProductId; 
} 

Mais j'ai reçu une exception: La référence d'entité ne peut pas avoir d'ID et d'attributs de clé vides. Mais mon champ de nom dans crm est le champ de texte tho. Je l'aide aussi vérifier `

if (AppProductLookup != Guid.Empty) 
    { 
     AppProductEnt = organizationservice.Retrieve(AppProductEnt.LogicalName, AppProductLookup, columns); 
     AppProductEnt["new_name"] = Row.Name; 
     organizationservice.Update(AppProductEnt); 
    } 
    else 
    { 
     //AppProductEnt["new_name"] = Row.Name; 
     //organizationservice.Create(AppProductEnt); 
    } 

Mon point d'arrêt ce code if (AppProductLookup != Guid.Empty) sauter. Donc je n'ai pas d'erreur, mais ce n'est pas ce que je veux. Je n'ai aucune idée de ce qui ne va pas. Donc je suis un peu perdu ici.

enter image description here

enter image description here

+0

Qu'est-ce que votre code essaie de faire? Il semble que ce soit la recherche d'un enregistrement basé sur le nom, puis la mise à jour du champ de nom à la valeur qui a été utilisée pour le rechercher. La ligne "if (! AppProductEnt.Contains (" new_ticketproductid "))" signifie également "Si un enregistrement correspondant n'est pas trouvé". Est-ce ce que vous vouliez? –

+0

J'ai déjà modifié mon code. Ce que je veux, c'est que si le nom existe déjà dans CRM en fonction de la vérification du GUID, je veux mettre à jour le nom au lieu de créer un nouveau nom. Donc ce que j'ai déjà fait est de récupérer le GUID existant pour l'enregistrement de nom dans CRM et essayer de mettre à jour en fonction du GUID. Mais ça ne fonctionne pas comme je le veux. – xChaax

+0

Toujours pas clair. Le code recherche un enregistrement avec name = blaa et le définit sur name = blaa. Pourquoi? De même, si l'appel à getAppProductId() renvoie Guid.Empty, l'appel à Update() échouera car il n'y a pas d'enregistrement à mettre à jour. –

Répondre

0

Comme alternative à cela, je résolu mon problème par Define alternate keys pour un tarif approbation entité Produits et Utilisez UpsertRequest pour insérer ou mettre à jour un enregistrement dans CRM. Veuillez noter que les codes Alternate key et UpsertRequest ne s'appliquent qu'à Dynamics 365 (en ligne), Dynamics 365 (sur site), Dynamics CRM 2016, Dynamics CRM Online.