! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

몇 초만에 500,000개 행 보고서 생성하기 > 온라인 스터디

본문 바로가기

ComponentOne

온라인 스터디

Winforms윈폼 몇 초만에 500,000개 행 보고서 생성하기

페이지 정보

작성자 GrapeCity 작성일 2022-08-22 10:02 조회 555회 댓글 0건

본문

ComponentOne FlexReport 및 대용량 데이터 집합을 사용하는 경우 특정 그룹화를 기반으로 특정 데이터를 검색해야 할 수 있습니다. 예를 들어 일부 판매 데이터를 작업 중인 경우 국가별로 판매 수를 표시할 보고서를 만들어야할 수 있으며 또는 지역 및 국가의 독특한 결합을 기반으로 데이터를 표시할 보고서를 만들어야 할 수 있습니다.


보고서에서 약 1백만 개의 레코드를 렌더링해야 한다고 가정해 봅시다. 이러한 경우 요구 사항을 기반으로 한 FlexReportDesigner의 홈 탭의 그룹 옵션을 통해 FlexReport 레이아웃에서 그룹을 빌드해야 하며 이러한 종류의 보고서 렌더링은 약 1분이라는 양의 시간이 걸립니다.


하지만 1초도 안 되는 시간에 동일한 기능을 달성할 수 있다면 어떨까요? 이쯤에서 궁금할 겁니다. 어떻게 그게 가능하지?


대답은 '가능하다'입니다.


대용량 데이터 집합에 고성능 분석을 제공하는 독립 실행형 .NET Standard 라이브러리인 ComponentOne DataEngine을 사용하면 이를 수행할 수 있습니다. C1DataEngine은 다른 어떤 열 중심 저장소 접근 방식보다 빠르며 1초도 안 되는 시간에 수백만의 레코드를 처리합니다.


따라서 이를 수행하려면 먼저 요구 사항에 따라 플랫 보고서를 디자인한 다음 FlexReport의 데이터 소스로 할당할 C1DataEngine API를 사용하여 평면화된 양식의 대량 데이터 집합에서 집계된 데이터를 가져와야 합니다.


이 블로그에서는 C1DataEngine을 사용하여 몇 초만에 국가별 판매 데이터를 표시할 보고서를 만드는 방법에 대해 설명합니다. 이는 다음과 같이 몇 개의 단계로 나뉩니다.


  1. 플랫 보고서 디자인

  2. 필수 데이터 확보

  3. FlexViewer에서 보고서 렌더링

지금 ComponentOne을 다운로드하여 사용해보십시오.



플랫 보고서 디자인


이전에 설명했듯이 국가별 판매 데이터를 표시하는 플랫 보고서를 만들어야 합니다. 먼저 데이터베이스 값에 대해 TextFields를 세부 정보 섹션에 추가한 다음 요구 사항에 맞는 레이아웃을 디자인합니다.


다음 스크린샷에 표시된 대로 각 레코드 그룹이 카드 형식으로 표시되는 방식으로 보고서의 서식을 지정했습니다.

플랫 보고서 디자인


이후에는 Windows Forms 응용 프로그램을 만들고 FlexReport 컴포넌트를 추가하여 보고서를 로드하고 보고서를 렌더링할 형식으로 FlexViewer 컨트롤을 추가합니다.

디자인


코드를 통해 보고서를 로드하려면 다음을 사용합니다.

c1FlexReport1.Load(@"..\..\SalesReport.flxr", "SalesReport");



필수 데이터 확보


필수 데이터를 확보하려면 먼저 C1DataEngine API 사용을 위해 다음 필수 패키지를 추가해야 합니다.


  • C1.DataCollection.BindingList

  • C1.DataEngine

  • C1.DataEngine.Collection


이 블로그에서는 CSV 파일을 통해 판매 데이터를 포함한 1백만 개의 레코드를 다룹니다. 먼저 WorkspaceIDataCollection 개체를 초기화하고 CSV 파일에서 필드에 해당하는 데이터를 보유할 수 있는 속성을 포함한 클래스를 만듭니다.


private Workspace _workspace;
private IDataCollection<object> _dataCollection;
class SalesData
      {
           public string Region { get; set; }
           public string Country { get; set; }
           public string ItemType { get; set; }
           public string SalesChannel { get; set; }
           public string OrderPriority { get; set; }
           public DateTime OrderDate { get; set; }
           public string OrderID { get; set; }
           public DateTime ShipDate { get; set; }
           public int UnitsSold { get; set; }
           public double UnitPrice { get; set; }
           public double UnitCost { get; set; }
           public double TotalRevenue { get; set; }
           public double TotalCost { get; set; }
           public double TotalProfit { get; set; }
}


Workspace 개체에서 전체 1백만 개의 레코드를 확보하려면 아래 코드 스니펫에 제공된 대로 CsvReader를 사용합니다.

//Initialize a new workspace folder relative to the project root directory
workspace = new Workspace();
workspace.Init("workspace");

//Read CSV data and convert it into a collection of custom .NET objects
var reader = new StreamReader(@"..\..\Sales Records.csv");
var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
var salesDataList = csv.GetRecords<SalesData>().AsEnumerable();

//Import CSV data from custom collection to a DataEngine table
ObjectConnector<SalesData> connector = new ObjectConnector<SalesData>(workspace, salesDataList);
connector.GetData("SalesData");
workspace.Save();


데이터베이스에서 추출할 특정 데이터는 TotalCost, TotalRevenue 및 각 고유 국가의 TotalProfit이며 이는 단순 작업을 수행할 쿼리를 정의하는 동안 C1.DataEngine 어셈블리의 Op 클래스를 사용하여 쿼리를 통해 완료할 수 있습니다.


DataEngine 쿼리의 결과는 캐싱되며 후속 실행이 더욱 빨라집니다. 이 쿼리는 기본 데이터가 새로고쳐질 때까지 캐싱된 상태로 유지됩니다. 저장된 타임스탬프를 확인하여 주기적으로(예: 시간별 또는 일별) 데이터를 새로 고칠 수 있습니다.

dynamic salesTable = workspace.table("SalesData");
dynamic query = workspace.query("SalesByCountry", new
{
Country = salesTable.Country,
TotalCost = Op.Sum(salesTable.TotalCost),
TotalProfit = Op.Sum(salesTable.TotalProfit),
TotalRevenue = Op.Sum(salesTable.TotalRevenue),
});


C1DataEngineCollection 클래스를 사용하여 C1DataEngineCollection 개체를 기반으로 FlexReport의 데이터 소스로 할당할 C1DataCollectionBindingList 클래스 및 특정 쿼리를 기반으로 작업 공간에서 데이터를 가져옵니다.


C1DataEngineCollection _dataCollection = new C1DataEngineCollection(workspace, query);
c1FlexReport1.DataSource.Recordset = new C1DataCollectionBindingList(_dataCollection);



FlexViewer에서 보고서 렌더링


런타임에서 FlexViewer에 표시할 보고서의 경우 Flexreport를 FlexReport의 DocumentSource 속성에 바인딩해야 합니다.

c1FlexViewer1.DocumentSource = c1FlexReport1;


보고서는 위의 모든 프로세스를 따른 후에 짧은 시간 안에 렌더링되며 아래 GIF와 같은 모습이 됩니다.

데모


FlexReport를 직접 사용하여 이 대량의 데이터를 작업하려는 경우 아래 표시된 항목과 같이 그룹화된 보고서를 만들어야 합니다.

판매 리포트


첨부된 GIF는 다음 코드를 사용하여 직접 FlexReport에 1백만 개의 레코드를 할당한 후 보고서가 렌더링되는 방법을 보여줍니다.

DataTable dt = new DataTable();
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\..\\Sales Records.mdb;";
OleDbConnection conn = new OleDbConnection(connectionString);
OleDbDataAdapter adapter = new OleDbDataAdapter("Select * from SalesRecords", conn);
adapter.Fill(dt);
c1FlexReport1.Load(@"..\..\SalesReportGrouped.flxr", "SalesReport");
c1FlexReport1.DataSource.Recordset = dt;
c1FlexViewer1.DocumentSource = c1FlexReport1;


데모


C1DataEngine API를 사용하여 규모가 큰 보고서를 만드는 방법에 대한 이 데모를 활용해보시길 바랍니다.


문서 링크에서 C1DataEngine에 대한 자세한 내용은 도움말을 통해서 알아볼 수 있습니다.





지금 바로 ComponentOne을 다운로드하여 직접 테스트해보세요!

 
  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그1

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.