2013-01-24 41 views
1

我期待構建一個相當簡單的插件,用於計算剩餘使用的「單位」數量&。我有兩個自定義實體(Parent)bc_learninglicences &(Child)bc_llbalance,插件在創建bc_llbalance時觸發,另一個用於更新。
bc_llbalance:包含
bc_learninglicense(查一查場對父母entite bc_learninglicences/bc_name)
bc_units(單位由本記錄中使用)

bc_learninglicences:包含
bc_name
bc_unitsquantity(這是設置爲單位總數量)
bc_unitsused(這需要繼承的 「bc_llbalance」 「bc_units」)
bc_unitsremaining的總和(簡單bc_unitsquantity - bc_unitsused)
好所以我已經包含了我剛剛試圖找出如何讓bc_units用於繼承總和的代碼...客戶關係管理2011年:插件 - 獲取聲明,繼承兒童實體的總和

p.s我是新開發的CRM 2011,只有幾周/幾個項目經驗。

// Obtain the execution context from the service provider. 
Microsoft.Xrm.Sdk.IPluginExecutionContext context (Microsoft.Xrm.Sdk.IPluginExecutionContext) serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext)); 

//Extract the tracing service for use in debugging sandboxed plug-ins. 
ITracingService tracingService =(ITracingService)serviceProvider.GetService(typeof(ITracingService)); 

if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) 
{ 
    // Obtain the target entity from the input parmameters. 
    Entity entity = (Entity)context.InputParameters["Target"]; 

    IOrganizationServiceFactory serviceFactory =(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); 
    IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); 

    EntityReference a = (EntityReference)entity.Attributes["bc_learninglicense"];// ((EntityReference)targetEntity.Attributes["bc_learninglicense"]).Id; 

    if (entity.LogicalName == "bc_llbalance") 
    { 
     //fetchxml to get the sum total of estimatedvalue 
     string value_sum = string.Format(@"<fetch distinct='false' mapping='logical' 
      aggregate='true'><entity name='bc_llbalance'><attribute name='bc_units' 
      alias='units_sum' aggregate='sum' /><filter type='and'><condition 
      attribute='bc_learninglicense' operator='eq' value='{0}' uiname=''</filter></entity> 
      </fetch>", a.Id); 

     FetchExpression fetch = new FetchExpression(value_sum); 
     EntityCollection value_sum_result = service.RetrieveMultiple(fetch); 
     decimal TotalValue = 0; 
     // decimal TotalValue = 0; 

     foreach (var c in value_sum_result.Entities) 
     { 
      TotalValue = ((Decimal)((AliasedValue)c["value_sum"]).Value); 
     } 
     Entity llc = new Entity("bc_learninglicences"); 
     llc.Id = a.Id; 
     llc.Attributes["bc_unitsused"] = TotalValue; 
     service.Update(llc); 
    } 
} 


所以我認爲這個問題與連接到父
實體「bc_learninglicences」,「bc_learninglicense」規定是查找場對孩子
實體「bc_llbalance」。

希望這是有道理的:基本上它不工作

我得到這個錯誤從CRM

Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Unexpected exception from plug-in (Execute): LearningLicenses.LearningLicenses: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts"> 
    <ErrorCode>-2147220956</ErrorCode> 
    <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" /> 
    <Message>Unexpected exception from plug-in (Execute): LearningLicenses.LearningLicenses: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.</Message> 
    <Timestamp>2013-01-24T13:11:51.2373399Z</Timestamp> 
    <InnerFault i:nil="true" /> 
    <TraceText> 

[LearningLicenses: LearningLicenses.LearningLicenses] 
[c1b35170-c563-e211-8c6d-b499bafd5e5b: LearningLicenses.LearningLicenses: Create of bc_llbalance] 


</TraceText> 
</OrganizationServiceFault> 



任何建議或幫助該解決方案將greatfully讚賞。

感謝您隨時爲我提供幫助!
我也有一些jscritp負載的父窗體,它計算子實體的子網格的總和:這只是爲了澄清我需要實現的......這是不夠的,因爲父窗體只更新負載與插件bc_learninglicences將在創建bc_llbalance時進行更新。

 function timeout(){ 
    setTimeout(calcUnitTotal, 3000); 
    } 

    function calcUnitTotal(){ 

    var grid = document.getElementById('Lines').control; 
    var ids = gridControl.get_allRecordIds(); 

    var sum = 0; 
    var cellValue; 

    for(i = 0; i < ids.length; i++) { 

    var cellValue = grid.get_selectedRecords('bc_units')[i].value; 
    var number = Number(cellValue.replace(/[^0-9\.]+/g,"")); 
    sum = sum + number; 
                } 


    Xrm.Page.data.entity.attributes.get('bc_unitsused').setValue(sum); 

    var val1 = Xrm.Page.getAttribute('bc_unitsquantity').getValue(); 

    if(val1 != null && sum != null) 
     { 

    var result = val1 - sum; 

    Xrm.Page.data.entity.attributes.get('bc_unitsremaining').setValue(result); 

    } 
     else { alert(val1 + sum + "error: Values not passed for Remaining") } 

    } 
+0

可以重構catch塊 - 你是隱藏實際的錯誤。另外,如果你沒有對錯誤信息做任何事情,爲什麼要有一個catch塊呢?編輯:等你有兩個catch塊不做任何事。基本上,在我們可以幫忙之前,我們需要ex.Message的信息(或刪除catch塊並讓錯誤拋出) – glosrob

+0

謝謝。我已經刪除了try&catch並且將「TotalValue」改爲了十進制而不是字符串。這給了我已經在這個崗位取代了舊的錯誤味精用新的錯誤... –

+0

好吧,我改變了代碼的最後一位

llc.Attributes [「bc_name」] = a.Id;
llc.Attributes [「bc_unitsused」] = TotalValue;

service.Update(LLC);
我現在已經有了一個新的錯誤---
未處理的異常: -2147220991 的xmlns:d2p1 = 「http://schemas.datacontract.org/2004/07/System.Collections.Generic」/> 無效的XML。
任何想法?也可以假設這是它可能失敗的地方? –

回答

2

得到這個在這裏工作是代碼希望它可以幫助別人:

public void Execute(IServiceProvider serviceProvider) 
    { 
     { 


      // Obtain the execution context from the service provider. 
      Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext) 
       serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext)); 

      //Extract the tracing service for use in debugging sandboxed plug-ins. 
      ITracingService tracingService = 
       (ITracingService)serviceProvider.GetService(typeof(ITracingService)); 

      IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); 
      IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); 

      if (context.InputParameters.Contains("Target") && 
        context.InputParameters["Target"] is Entity) 
      { 
      Entity entity = (Entity)context.InputParameters["Target"]; 
       Guid a = ((EntityReference)entity["bc_learninglicense"]).Id; 
       Entity llc = new Entity("bc_learninglicences"); 
       llc.Id = a; 

         //fetchxml to get the sum total of estimatedvalue 
      string value_sum = string.Format(@"   
       <fetch distinct='false' mapping='logical' aggregate='true'> 
        <entity name='bc_llbalance'> 
         <attribute name='bc_units' alias='units_sum' aggregate='sum' /> 
          <filter type='and'> 
          <condition attribute='bc_learninglicense' operator='eq' value='{0}' uiname='' uitype='' /> 
          </filter> 
        </entity> 
       </fetch>", a); 

         EntityCollection value_sum_result = service.RetrieveMultiple(new FetchExpression(value_sum)); 
         decimal TotalValue = 0; 
         foreach (var c in value_sum_result.Entities) 
         { 
          TotalValue += ((Decimal)((AliasedValue)c["units_sum"]).Value); 
         }  
         llc.Attributes["bc_unitsused"] = TotalValue; 
         service.Update(llc); 
      } 
     } 
    } 
+2

總價值=((十進制)((AliasedValue)C [「聯合國its_sum「])值)。應該肯定使用'+ =',否則每次都會覆蓋該值? – glosrob

+0

是在這種情況下即時得到這樣使用foreach(VAR下在value_sum_result.Entities) 它遍歷每個結果和返回的總和的總和/總圖。 –

0

錯誤

The given key was not present in the dictionary 

意味着你在試圖檢索不屬性包存在的屬性。

我猜這條線是導致異常:

TotalValue = ((Decimal)((AliasedValue)c["value_sum"]).Value); 

這裏我們假定你是價值value_sum是存在的,但它可能不是。

一個簡單的方法來測試,就是寫一樣的東西:

if (c.Attributes.ContainsKey("value_sum")) 
{ 
    throw new InvalidPluginException("Test - yep no key in the dictionary here!"); 
} 

一旦你能證明這是導致該錯誤,那麼你需要看看爲什麼是這種情況。

+0

謝謝,是的,我注意到應該是... TotalValue =((Decimal)((AliasedValue)c [「units_sum」])。Value);我想,我現在得到一個錯誤無效的XML。無效的XML「傳遞給平臺的XML不是格式正確的XML ... –

+0

我也更改了llc.Id = a.Id; 爲llc.Attributes [」bc_name「] = a.Id; –

+0

是場「bc_name」文本字段?如果是的話,嘗試= a.Id.ToString()(字段類型和分配的值應該匹配) – glosrob

相關問題