2016-10-28 1 views
0

Итак, я написал плагин для выполнения простых вычислений и полей обновления на основе определенных условий. Плагин компилирует и не вызывает никаких ошибок при профилировании или создании любых экземпляров, где я могу отлаживать мой код, который расстраивает. В любом случае, без дальнейших церемоний:Плагин CRM не будет обновлять или делать что-либо, чтобы изменить значение поля

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using BPT.PluginCommon.BaseClasses; 
using Microsoft.Xrm.Sdk; 
using Microsoft.Xrm.Sdk.Query; 
using Xrm; 

namespace Engage.Crm.Plugins 
{ 
    public class VoidPayment : BPTPluginBase 
    { 
     bpt_DuesHeader oDuesHeader = new bpt_DuesHeader(); 
     Account org = new Account(); 
     public override void HandleAfterOp() 
     { 
      try 
      { 
       base.HandleAfterOp(); 
       var crmContext = new XrmServiceContext(this.OrganizationService); 
       if (this.PluginExecutionContext.MessageName == MessageName.Create || 
        this.PluginExecutionContext.MessageName == MessageName.Update) 
       { 
        if (this.InputTargetEntity.Attributes.Contains("gih_void")) 
        { 
         var Void = (bool) this.InputTargetEntity.Attributes["gih_void"]; 
         var voidReason = (OptionSetValue) this.InputTargetEntity.Attributes["gih_voidreason"]; 
         var totalPayments = (Money) this.InputTargetEntity.Attributes["bpt_TotalPayments"]; 
         var amountBilled = 
          crmContext.bpt_DuesHeaderSet.Where(
            o => o.bpt_DuesHeaderId == this.PluginExecutionContext.PrimaryEntityId) 
           .ToList() 
           .Sum(o => o.bpt_TotalAmountBilled == null ? 0 : o.bpt_TotalAmountBilled.Value); 
         if (Void) 
         { 
          this.oDuesHeader.bpt_TotalAdjustments = new Money(amountBilled); 
          this.oDuesHeader.bpt_TotalAmountBilled = 
           new Money(oDuesHeader.bpt_TotalAdjustments.Value + totalPayments.Value); 
          this.oDuesHeader.bpt_Balance = new Money(amountBilled); 
          if (voidReason.Value == 914020000) 
           //should be dropped not default option  
          { 
           oDuesHeader.gih_terminationdate = DateTime.Now; 
          } 
         } 
         OrganizationService.Update(oDuesHeader); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       this.TracingService.Trace(this.ToString() + " {0}", "Exception: {0}", ex.ToString()); 
       throw; 
      } 

     } 
    } 
} 

Извините, код не формируется хорошо! Помогите! Плагин зарегистрирован как пост-операционный и синхронный. Любое понимание было бы полезно, и если модератор мог бы форматировать код, который был бы очень признателен, потому что он не позволял мне добавлять четыре пробела в определенные места.

+0

Вам необходимо установить Id на oDuesHeader, чтобы обновление работало. – Lidaranis

+0

А так в начале, когда я хватаю атрибуты, я должен включить bpt_dueserid = new Guide()? –

+1

вы включаете идентификатор, но не с новым указателем. вы берете руководство объекта, который хотите обновить. что-то вроде строк this.oDuesHeader.Id = anyentityyoutanttoupdate.id; – Lidaranis

ответ

0

Плагины в CRM создаются один раз, а затем используются несколько раз, возможно, даже одновременно, поэтому, помимо установки идентификатора, не используйте поля уровня класса. Вы создаете условие гонки, которое действительно может сделать некоторые нежелательные изменения.

+0

Что именно вы подразумеваете под полями уровня класса? –

+0

bpt_DuesHeader oDuesHeader = new bpt_DuesHeader(); Учетная запись org = new Account(); – Daryl

+0

Ну ладно, так что вместо этого просто используйте var oDuesHeader = new bpt_DuesHeader() –

Смежные вопросы