2017-04-17 34 views
0

我試圖構建,而無需把某些字段到報告數據庫中創建Encompass360自定義報告的獨立應用程序報告數據庫之外的現場數據。 到目前爲止,我只找到一種方法來做到這一點,但它非常緩慢。 (遠遠高於涵蓋內的正常報告較慢報告數據庫之外的檢索數據時),這需要近2分鐘,提取數據,5個貸這樣做:獲取使用Encompass360 SDK

int count = 5; 
StringList fields = new StringList(); 
      fields.Add("Fields.317"); 
      fields.Add("Fields.3238"); 
      fields.Add("Fields.313"); 
      fields.Add("Fields.319"); 
      fields.Add("Fields.2"); 

// lstLoans.Items contains the string location of the loans(i.e. "My Pipeline\Dave#6") 
foreach (LoanIdentity loanID in lstLoans.Items) 
{ 
    string[] loanIdentifier = loanID.ToString().Split('\\'); 
    Loan loan = Globals.Session.Loans.Folders[loanIdentifier[0]].OpenLoan(loanIdentifier[1]); 

    bool fundingPlus = true; // if milestone == funding || shipping || suspended || completion; 

    if (!fundingPlus) 
     continue; 

    bool oneIsChecked = false; 
    LogMilestoneEvents msEvents = loan.Log.MilestoneEvents; 
    DateTime date; 
    MilestoneEvent ms = null; // better way to do this probably 
    if (checkBox4.Checked) 
    { 
     ms = msEvents.GetEventForMilestone("Completion"); 
     if (ms.Completed) 
     { 
      oneIsChecked = true; 
     } 
    } 
    else if (checkBox3.Checked) 
    { 
     ms = msEvents.GetEventForMilestone("Suspended"); 
     if (ms.Completed) 
     { 
      oneIsChecked = true; 
     } 
    } 
    else if (checkBox2.Checked) 
    { 
     ms = msEvents.GetEventForMilestone("Shipping"); 
     if (ms.Completed) 
     { 
      oneIsChecked = true; 
     } 
    } 
    else if (checkBox1.Checked) 
    { 
     ms = msEvents.GetEventForMilestone("Funding"); 
     if (ms.Completed) 
     { 
      oneIsChecked = true; 
     } 
    } 

    if (!oneIsChecked) 
     continue; 

    string LO = loan.Fields["317"].FormattedValue; 
    string LOid = loan.Fields["3238"].FormattedValue; 
    string city = loan.Fields["313"].FormattedValue; 
    string address = loan.Fields["319"].FormattedValue; 
    string loanAmount = loan.Fields["2"].FormattedValue; 
    if (loanAmount == "") 
    { 
     Console.WriteLine(LO); 
     continue; 
    } 
    int numLoans = 1; 


    addLoanFieldToListView(LO, numLoans, city, address, loanAmount); 

    if (--count == 0) 
     break; 
    } 
} 

我一直無法弄清楚如何使用任何管道方法在報告數據庫之外檢索數據,但是當我查找的所有字段都在報告數據庫中時,使用這些工具檢索數百個貸款的內容幾乎不需要幾秒鐘:

session.Reports.SelectReportingFieldsForLoans(loanGUIDs, fields); 
session.Loans.QueryPipeline(selectedDate, PipelineSortOrder.None); 
session.Loans.OpenPipeline(PipelineSortOrder.None); 

什麼會真正幫助我是如果有人提供了一個簡單的例子來檢索數據之外的數據通過使用包含sdk報告數據庫,這不需要比它應該檢索數據更長的時間。

注:我知道我可以添加字段不在它當前報告數據庫中,所以這不是我要找的答案。

注2:Encompass360沒有它自己的標籤,如果有人能爲手頭的主題添加標籤更好的瞭解,請添加它們。

+0

這將是很難診斷的問題沒有任何經驗與這個特定的SDK工作。有可用的配置文件,如Jetbrains dotTrace和Redgate ANTS可以找到瓶頸。鑑於我以前在這樣的系統上工作的經驗,我最好的猜測是SDK正在加載很多可能不需要的字段,因爲貸款可能有數百個字段。 – Romoku

+0

我相信您的評估對於給定貸款加載可能的所有字段是正確的,但我不確定只有一個字段不在報表數據庫中時纔可以打開。我相信,Encompass應用程序本身所做的是打開每個貸款來檢索數據,如果它不在報告數據庫中。但它比我的獨立應用程序快得多,即使它仍然「很慢」。無論如何,感謝可以用來定位瓶頸的工具@Romoku – brw59

回答

1

我使用Loans上的SelectFields方法來檢索不在Encompass中的報表數據庫中的貸款現場數據。與逐條打開貸款相比,它的性能非常高,但結果以字符串形式返回,因此需要使用一些解析來獲取其本機類型的值。以下是使用此方法的文檔示例。

using System; 
using System.IO; 
using EllieMae.Encompass.Client; 
using EllieMae.Encompass.BusinessObjects; 
using EllieMae.Encompass.Query; 
using EllieMae.Encompass.Collections; 
using EllieMae.Encompass.BusinessObjects.Loans; 

class LoanReader 
{ 
    public static void Main() 
    { 
     // Open the session to the remote server 
     Session session = new Session(); 
     session.Start("myserver", "mary", "maryspwd"); 

     // Build the query criterion for all loans that were opened this year 
     DateFieldCriterion dateCri = new DateFieldCriterion(); 
     dateCri.FieldName = "Loan.DateFileOpened"; 
     dateCri.Value = DateTime.Now; 
     dateCri.Precision = DateFieldMatchPrecision.Year; 

     // Perform the query to get the IDs of the loans 
     LoanIdentityList ids = session.Loans.Query(dateCri); 

     // Create a list of the specific fields we want to print from each loan. 
     // In this case, we'll select the Loan Amount and Interest Rate. 
     StringList fieldIds = new StringList(); 
     fieldIds.Add("2");   // Loan Amount 
     fieldIds.Add("3");   // Rate 

     // For each loan, select the desired fields 
     foreach (LoanIdentity id in ids) 
     { 
     // Select the field values for the current loan 
     StringList fieldValues = session.Loans.SelectFields(id.Guid, fieldIds); 

     // Print out the returned values 
     Console.WriteLine("Fields for loan " + id.ToString()); 
     Console.WriteLine("Amount: " + fieldValues[0]); 
     Console.WriteLine("Rate: " + fieldValues[1]); 
     } 

     // End the session to gracefully disconnect from the server 
     session.End(); 
    } 
} 
+0

我沒有意識到'查詢'可以檢索報告數據庫以外的數據,我認爲它與我一直在使用的OpenReportCursor類似(因爲它也使用查詢和字段)...我會擁有測試, – brw59

+0

作品像一個魅力,謝謝 – brw59

0

您將高度從增加這些領域的報告DB和使用RDB查詢,而不是受益。在內部,Encompass必須在讀取沒有RDB的字段時打開/解析文件,這是一個緩慢的過程。然而它只是對RDB中的字段進行SELECT查詢,這是一個非常快速的過程。此工具可讓您快速檢查/查找RDB中的哪些字段,以便您可以爲查詢創建計劃以及更新RDB的計劃:https://www.encompdev.com/Products/FieldExplorer

您可以通過Session.Loans.QueryPipeline()非常方便地查詢RDB與您使用貸款查詢類似。以下是源代碼的一個很好的示例(在VB中):https://www.encompdev.com/Products/AlertCounterFieldPlugin

+0

我知道我可以將它添加到報告數據庫中,我已經知道如何做到這一點。我正在尋找一個好的解決方案,而無需添加到數據庫。我製作的自定義報告將由一個人每月運行一次,因此我不需要添加所有額外字段。除非你能說服我爲什麼在將大量幾乎從未使用過的數據添加到數據庫中沒有什麼壞處,在這種情況下,爲什麼我不將幾千個字段添加到數據庫中,而這些字段目前不在數據庫中任何人使用? – brw59