2017-04-17 8 views
0

レポートデータベースに特定のフィールドを入れることなく、Encompass360のカスタムレポートを作成するスタンドアロンアプリケーションを作成しようとしています。 これまで私はそれを行う方法を見つけただけですが、それは非常に遅いです。 (レポートデータベースの外部でデータを取得包含する内の通常のレポートよりもはるかに遅い。)それは、これを行う5つのローンのデータを引っ張って、ほぼ2分かかります: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を使用して、データベースをレポートします。

注:現時点ではないレポートデータベースにフィールドを追加できることはわかっているので、これは私が探している回答ではありません。

Note#2:Encompass360には独自のタグがありません。もし誰かが手持ちの被写体に追加できる優れたタグを知っていれば追加してください。

+0

この特定のSDKを使用している経験がなくても、問題を診断するのは難しいでしょう。ボトルネックを見つけることができるJetbrains dotTraceやRedgate ANTSなどのプロファイラがあります。このようなシステムでの私の以前の経験から、私の推測によると、SDKは、ローンに何百ものものがあるので、必要ではないかもしれない多くのフィールドをロードしています。 – Romoku

+0

私はあなたの評価が、おそらくすべてのローンのフィールドの読み込みについて正しいと考えていますが、レポートデータベースにないときには1つのフィールドだけを開くことはできません。 Encompassアプリケーション自体が行うことは、レポートデータベースにない場合にデータを取得するための個々のローンを開くことです。しかし、それは私のスタンドアロンのアプリケーションよりはるかに高速ですが、それでもまだ「遅い」です。それにもかかわらず、ボトルネックの位置を特定するためのツールに感謝@ROMoku – brw59

答えて

1

LoansSelectFieldsメソッドを使用して、Encompassのレポートデータベースにないローンフィールドデータを取得します。ローンを1つずつ開くのに比べてパフォーマンスは優れていますが、結果は文字列として返されるため、ネイティブタイプの値を取得するには解析が必要です。以下は、このメソッドを使用するためのドキュメントの例です。

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クエリを使用することで、大きなメリットがあります。内部的には、RDBのないフィールドを読み込むときにEncompassがファイルをオープン/解析する必要がありますが、遅いプロセスです。それでも、非常に高速なプロセスであるRDBのフィールドに対してSELECTクエリを実行するだけです。このツールを使用すると、RDB内のどのフィールドが素早く確認/検索できるようになり、クエリの計画とRDBを更新する計画を作成できます。https://www.encompdev.com/Products/FieldExplorer

Session.Loans.QueryPipelineあなたのローンクエリーの使用と同様です。 VBのソースコードの例を以下に示します:https://www.encompdev.com/Products/AlertCounterFieldPlugin

+0

報告データベースにフィールドを追加することができ、私はすでにこれを行う方法を知っています。私はデータベースに追加せずに良い解決策を探しています。私が作成しているカスタムレポートは1人で月に1回実行されるので、余分なフィールドをすべて追加する必要はありません。データベースにほとんど使われていない大量のデータを追加することに何の害がないのかを私に納得させることができない限り、その中には現在データベースにない何千ものフィールドを追加しないでください誰にでも使われますか? – brw59

関連する問題