2017-09-30 6 views
0

Je dois créer ou mettre à jour le champ de recherche de numéro de ticket dans les produits d'approbation de prix. Ce numéro de ticket (champ de recherche) est lié à Ticket (champ de texte) dans une autre entité appelée Tickets d'approbation de prix.Comment insérer un numéro de ticket (champ de recherche) dans les produits d'approbation de tarification MS Dynamics CRM (entité personnalisée) à l'aide du composant de script ssis

Ceci est mon code dans le composant de script.

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 

    Entity ApprovalProductEnt = new Entity("new_ticketproduct"); 
    ColumnSet columns = new ColumnSet(true); 
    columns = new ColumnSet(new String[] { "new_ticket", 
     "new_productgroup", 
     "new_producttype", 
     "new_productitem" }); 

    Guid TicketNumberId = new Guid(); 
    TicketNumberId = getTicketNumber(Row.OppportunityID, ref organizationservice); 

    //update 
    if (TicketNumberId != Guid.Empty) 
    { 
     ApprovalProductEnt["new_ticket"] = new EntityReference("new_pricingapprovalticket", TicketNumberId); 
    } 
    else 
    //create 
    if (TicketNumberId != Guid.Empty) 
    { 
     ApprovalProductEnt["new_ticket"] = new EntityReference("new_pricingapprovalticket", TicketNumberId); 
    } 
} 

public Guid getTicketNumber(string ticketnumber, ref IOrganizationService service) 
{ 
    Guid TicketNumberGuid = Guid.Empty; 
    QueryExpression TicketNumberQuery = new QueryExpression { EntityName = "new_pricingapprovalticket", ColumnSet = new ColumnSet(true) }; 
    TicketNumberQuery.Criteria.AddCondition("new_ticketnumber", ConditionOperator.Equal, ticketnumber); 
    EntityCollection TicketNumberQueryRetrieve = service.RetrieveMultiple(TicketNumberQuery); 

    for (var i = 0; i <TicketNumberQueryRetrieve.Entities.Count; i++) 
    { 
     TicketNumberGuid = TicketNumberQueryRetrieve.Entities[0].GetAttributeValue<Guid>("new_ticket"); 
    } 

    return TicketNumberGuid; 
} 

Lorsque je démarre le package SSIS, son exécution sans erreur. Mais d'une manière ou d'une autre, aucune donnée n'est insérée.

enter image description here

je n'ai aucun problème pour créer un champ de texte normal. Mais quand il s'agit de chercher sur le terrain, les solutions Internet suggèrent d'utiliser EntityReference selon mon code, mais je n'ai aucune idée de ce qui ne va pas. Donc je suis un peu perdu ici.

+0

Je n'ai pas vu Service.Create ou Service.Update dans votre code. Il n'y a pas non plus de différence dans le bloc de création/mise à jour. –

Répondre

0

La recherche est une colonne de relation (clé étrangère) de l'entité associée. Vous devez vérifier s'il existe une fiche disponible pour mapper la clé ou créer l'enregistrement de ce type à mapper. ColumnSet n'est pas nécessaire dans la première méthode lors de la création d'un enregistrement d'entité.

Mais vous devez mapper les colonnes du fichier source/table Rows. ColumnSet est utile comme dans la seconde méthode lors de la récupération de l'ensemble de données.

La boucle n'est pas nécessaire dans la 2ème méthode.

Il vous suffit de mettre les pièces manquantes dans votre extrait pour que vous compreniez, cela peut être improvisé.

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    Entity ApprovalProductEnt = new Entity("new_ticketproduct"); 

    ApprovalProductEnt["new_productgroup"] = Row.ProductGroup; 
    ApprovalProductEnt["new_producttype"] = Row.ProductType; 
    ApprovalProductEnt["new_productitem"] = Row.ProductItem; 

    Guid TicketNumberId = new Guid(); 
    TicketNumberId = getTicketNumber(Row.OppportunityID, ref organizationservice); 

    //update 
    if (TicketNumberId != Guid.Empty) 
    { 
     ApprovalProductEnt["new_ticket"] = new EntityReference("new_pricingapprovalticket", TicketNumberId); 
    } 
    else 
    //create 
    { 
     Entity TicketEnt = new Entity("new_pricingapprovalticket"); 
     TicketEnt["new_name"] = Row.OppportunityID; 
     TicketNumberId = organizationservice.Create(TicketEnt); 

     ApprovalProductEnt["new_ticket"] = new EntityReference("new_pricingapprovalticket", TicketNumberId); 
    } 

    organizationservice.Create(ApprovalProductEnt); 
} 


public Guid getTicketNumber(string ticketnumber, ref IOrganizationService service) 
{ 
    Guid TicketNumberGuid = Guid.Empty; 
    QueryExpression TicketNumberQuery = new QueryExpression { EntityName = "new_pricingapprovalticket", ColumnSet = new ColumnSet(true) }; 
    TicketNumberQuery.Criteria.AddCondition("new_ticketnumber", ConditionOperator.Equal, ticketnumber); 
    EntityCollection TicketNumberQueryRetrieve = service.RetrieveMultiple(TicketNumberQuery); 

if (TicketNumberQueryRetrieve.Entities.Count > 0) 
    TicketNumberGuid = TicketNumberQueryRetrieve.Entities[0].GetAttributeValue<Guid>("new_ticket"); 

return TicketNumberGuid; 
} 
+0

Ouais, Just remarqué que je ne suis pas 'Service.Create ou Service.Update' dans mon code. Je viens de changer le nom 'new_name' pour le nom exact du champ de ticket dans l'entité de ticket. Merci M. Arun pour la réponse. – xChaax

+0

Salut @Arun Vinoth. Le code ci-dessus crée toujours un nouvel enregistrement même si le numéro de ticket existe déjà dans CRM. – xChaax

+0

new_ticketproduct sera toujours créé. new_pricingapprovalticket sera référencé (création ou extraction de guid existant). Lequel vous parlez? –