2013-12-18 17 views
0

我正在使用Aspose在Microsoft CRM Dyanmics 2011中的幻燈片中生成動態內容。即使代碼中的邏輯在數據字段和關係中的數據填充不正確似乎是正確的,不應該產生空值或空值,並且我已經確認數據庫中的字段確實有數據(對於某些字段和關係而言,數據確實填充正確)。所有這些問題都是在Powerpoint本身開始生成之前發生的,所以實際上這些問題可能不是「Aspose」問題,它們可能只是異步檢索數據的Web Service/CRM問題。爲Aspose動態幻燈片生成客戶關係管理收集數據的空值2011

的Aspose幻燈片工作流程:

1)一個HTML網頁資源包括Silverlight的按鈕,下載PowerPoint演示報告
2)按鈕點擊Silverlight應用程序Asyncronosously收集通過網絡在CRM從項目實體所需的所有數據服務請求
3)將數據編譯爲Project類,然後將其傳遞給ReportGenerator服務並使用數據填充Powerpoint的各個部分(這是我們使用定製Aspose內容的部分)
4 )Aspose功能通過每個指定的幻燈片並解析它們添加到數據中需要。 5)Powerpoint完成並吐出數據填充的用戶。

這是兩個例子,我有麻煩獲取數據填充。下面的project.Pwins值最終爲null,它告訴我lambda表達式沒有正確執行,它在方法結束時保持爲空,它告訴我突出顯示的行甚至沒有被執行。

實施例1:

/// <summary> 
    /// Retrieves and stores information required for P(win) report, and then tries to send a web service request. 
    /// </summary> 
    /// <param name="service"></param> 
    private void LoadPwin(ReportServiceClient service) 
    { 
     string filter = string.Format("?$filter=sfa_Project/Id eq guid'{0}'", GetProjectId()); 
     string url = GetEntitySetAddress("sfa_pwin_competitor") + filter; 

     WebClient client = new WebClient(); 
     client.DownloadStringCompleted += (sender, args) => 
     { 
      if (args.Error == null) 
      { 
       StringReader stream = new StringReader(args.Result); 
       XmlReader reader = XmlReader.Create(stream); 

       List<PWin> pwins = new List<PWin>(); 
       List<Dictionary<string, string>> dictionaries = LoadEntitiesFromXml(reader); 
       foreach (Dictionary<string, string> dictionary in dictionaries) 
       { 
        PWin pwin = new PWin(); 
        pwin.CompanyName = ParseDictionaryValue(dictionary["sfa_competitor"]); 
        pwin.IsBoeing = (ParseDictionaryValue(dictionary["sfa_is_boeing"]) == "true"); 
        pwin.IsDomestic = (ParseDictionaryValue(dictionary["sfa_domestic_or_international"]) == "true"); 
        pwin.AffordabilityWeight = ParseDictionaryValueToNumber(dictionary["sfa_affordability_weight"]); 
        pwin.AffordabilityScore = ParseDictionaryValueToNumber(dictionary["sfa_affordability_score"]); 
        pwin.CustomerRelationshipWeight = ParseDictionaryValueToNumber(dictionary["sfa_customer_relationship_weight"]); 
        pwin.CustomerRelationshipScore = ParseDictionaryValueToNumber(dictionary["sfa_customer_relationship_score"]); 
        pwin.CustomerAdvantageWeight = ParseDictionaryValueToNumber(dictionary["sfa_customer_advantage_weight"]); 
        pwin.CustomerAdvantageScore = ParseDictionaryValueToNumber(dictionary["sfa_customer_advantage_score"]); 
        pwin.CompetitionWeight = ParseDictionaryValueToNumber(dictionary["sfa_competition_weight"]); 
        pwin.CompetitionScore = ParseDictionaryValueToNumber(dictionary["sfa_competition_score"]); 
        pwin.CPOBCWeight = ParseDictionaryValueToNumber(dictionary["sfa_cpobc_weight"]); 
        pwin.CPOBCScore = ParseDictionaryValueToNumber(dictionary["sfa_cpobc_score"]); 
        pwin.CompanyResourcesWeight = ParseDictionaryValueToNumber(dictionary["sfa_company_resources_weight"]); 
        pwin.CompanyResourcesScore = ParseDictionaryValueToNumber(dictionary["sfa_company_resources_score"]); 
        pwin.CompanyResourcesInvestmentWeight = ParseDictionaryValueToNumber(dictionary["sfa_company_resources_investment_weight"]); 
        pwin.CompanyResourcesInvestmentScore = ParseDictionaryValueToNumber(dictionary["sfa_company_resources_investment_score"]); 
        pwin.ProgramBackgroundWeight = ParseDictionaryValueToNumber(dictionary["sfa_program_background_weight"]); 
        pwin.ProgramBackgroundScore = ParseDictionaryValueToNumber(dictionary["sfa_program_background_score"]); 
        pwin.ContinuityOfEffortWeight = ParseDictionaryValueToNumber(dictionary["sfa_continuity_of_effort_weight"]); 
        pwin.ContinuityOfEffortScore = ParseDictionaryValueToNumber(dictionary["sfa_continuity_of_effort_score"]); 
        pwin.ExecutionWeight = ParseDictionaryValueToNumber(dictionary["sfa_execution_weight"]); 
        pwin.ExecutionScore = ParseDictionaryValueToNumber(dictionary["sfa_execution_score"]); 
        pwin.TechnicalSolutionWeight = ParseDictionaryValueToNumber(dictionary["sfa_technical_solution_weight"]); 
        pwin.TechnicalSolutionScore = ParseDictionaryValueToNumber(dictionary["sfa_technical_solution_score"]); 
        pwin.StrategyToWinWeight = ParseDictionaryValueToNumber(dictionary["sfa_strategy_to_win_weight"]); 
        pwin.StrategyToWinScore = ParseDictionaryValueToNumber(dictionary["sfa_strategy_to_win_score"]); 
        pwin.ManagementStrengthWeight = ParseDictionaryValueToNumber(dictionary["sfa_management_strength_weight"]); 
        pwin.ManagementStrengthScore = ParseDictionaryValueToNumber(dictionary["sfa_management_strength_score"]); 
        pwin.CustomerPercievedCommitmentWeight = ParseDictionaryValueToNumber(dictionary["sfa_customers_percieved_commitment_weight"]); 
        pwin.CustomerPercievedCommitmentScore = ParseDictionaryValueToNumber(dictionary["sfa_customers_percieved_commitment_score"]); 
        pwin.PastPerformanceWeight = ParseDictionaryValueToNumber(dictionary["sfa_past_performance_weight"]); 
        pwin.PastPerformanceScore = ParseDictionaryValueToNumber(dictionary["sfa_past_performance_score"]); 

        pwin.RawPWin = ParseDictionaryValueToDecimal(dictionary["sfa_pwin_score"]); 
        pwin.RelativePWin = ParseDictionaryValueToDecimal(dictionary["sfa_relative_pwin_score"]); 
        pwins.Add(pwin); 
       } 

       project.PWins = new ObservableCollection<PWin>(pwins); 
       PwinReady = true; 

       reader.Close(); 
       TrySendRequest(service); 
      } 
     }; 

     client.DownloadStringAsync(new Uri(url)); 
    } 

實施例2下面的project.TeamMembers值最終被空:

/// <summary> 
    /// Retrieves and stores information required for Capture Team Roster report, and then tries to send a web service request. 
    /// </summary> 
    /// <param name="service"></param> 
    private void LoadCaptureTeamRoster(ReportServiceClient service) 
    { 
     string filter = string.Format("?$select=sfa_name,sfa_Role&$filter=sfa_Project/Id eq guid'{0}'", GetProjectId()); 
     string url = GetEntitySetAddress("sfa_team_roster") + filter; 

     WebClient client = new WebClient(); 
     client.DownloadStringCompleted += (sender, args) => 
     { 
      if (args.Error == null) 
      { 
       StringReader stream = new StringReader(args.Result); 
       XmlReader reader = XmlReader.Create(stream); 

       List<TeamMember> members = new List<TeamMember>(); 

       List<Dictionary<string, string>> dictionaries = LoadEntitiesFromXml(reader); 
       foreach (Dictionary<string, string> dictionary in dictionaries) 
       { 
        TeamMember member = new TeamMember(); 
        member.Name = ParseDictionaryValue(dictionary["sfa_name"]); 
        member.Role = ParseDictionaryValue(dictionary["sfa_role"]); 

        members.Add(member); 
       } 

       project.TeamMembers = new ObservableCollection<TeamMember>(members); 

       CaptureTeamRosterReady = true; 

       reader.Close(); 

       TrySendRequest(service); 
      } 
     }; 
     client.DownloadStringAsync(new Uri(url)); 
    } 

下面是另一個例子,是不是與關係的問題,而是是在CRM中的項目實體上填充字段的問題,該問題在檢索數據後顯示爲空。無論CaptureTeamLeader和ProgramManager最終被空字符串,但該項目名和ProjectNumber沒有煩惱填充

private void LoadCampaignTitle(ReportServiceClient service) 
    { 
     project.ProjectName = GetAttributeValue("sfa_name"); 
     project.ProjectNumber = GetAttributeValue("sfa_project_number"); 
     project.CaptureTeamLeader = GetAttributeValue("sfa_capture_team_leader_emp"); 
     project.ProgramManager = GetAttributeValue("sfa_program_manager_emp"); 
     CampaignTitleReady = true; 

     TrySendRequest(service); 
    } 

任何幫助將不勝感激。提前致謝!

編輯:

這是問了的AttributeValue方法:

/// <summary> 
    /// Gets the value of provided attribute from the current page's Xrm data. If for any reason the retrieval fails, returns an empty string. 
    /// </summary> 
    /// <param name="attributeName"></param> 
    /// <returns></returns> 
    private string GetAttributeValue(string attributeName) 
    { 
     // NOTE: This is the preferred way to retrieve data from the CRM. However for some unknown issue, 
     // this always returns NULL. It will be replaced with directly calling .eval to the window object. 
     // dynamic Xrm = (ScriptObject)HtmlPage.Window.GetProperty("window.parent.Xrm"); 
     try 
     { 
      return HtmlPage.Window.Invoke("getAttributeValue", attributeName).ToString(); 
     } 
     catch (ArgumentNullException) 
     { 
      return string.Empty; 
     } 
     catch (ArgumentException) 
     { 
      return string.Empty; 
     } 
     catch (InvalidOperationException) 
     { 
      return string.Empty; 
     } 
    } 
+0

請發佈您正在使用的GetAttributeValue函數的代碼?我正在查看最後一個代碼示例,'LoadCampaignTitle',並且我的猜測是未加載的兩個是'EntityReference'類型,它們是獲取Name值的問題。 – Nicknow

+0

感謝您的關注,我現在已經包含了GetAttributeValue方法。 –

回答

0

對這一問題的解決方案是數字1 downloadstringasync,在我的代碼中的其他地方進行了異步模式,因此調試器做的事情當他們真的剛剛被處決時,他把我扔掉,並把事情表現爲空。實際的修補程序需要對web服務所在的文件夾中的client.xml文件進行一些更改。

相關問題