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

FlexReport에서 파라미터와 여러 데이터 소스 사용하기 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

FlexReport에서 파라미터와 여러 데이터 소스 사용하기

페이지 정보

작성자 GrapeCity 작성일 2020-02-13 00:00 조회 3,307회 댓글 0건

본문

FlexReport를 사용하여 보고서를 작성할 경우, 데이터에 액세스할 때 고려해야 할 사항이 몇 가지 있습니다. 보고서에 전체 데이터베이스 또는 정보 테이블을 제공하고자 하는 경우가 있지만 해당 정보를 제한하려는 경우가 있습니다. 예를 들어, 송장 보고서를 작성하는 경우, 데이터베이스의 모든 주문에 대한 송장이 아니라 특정 주문에 대한 송장이 필요할 것입니다.


FlexReport에 로드되는 정보의 양을 제한할 수있는 두 가지 방법은 파라미터와 필터링입니다. 이 둘의 주요 차이점은 조작이 발생할 때 생깁니다. 파라미터는 SQL 명령의 WHERE 절에 포함되므로 필요한 서버에서만 레코드를 가져옵니다. 필터를 사용하려면 모든 데이터를 로드 한 다음 지정된 레코드만 보고서에 포함시켜야 합니다. 각각 유용한 시나리오가 있습니다.


두 가지 방법의 실제 예를 제공하기 위해, 샘플과 함께 제공되는 NorthWind AccessDB의 주문 테이블을 기반으로 송장 보고서를 생성하는 데모 애플리케이션을 작성했습니다.


참고 : 이 샘플에 AccessDB를 사용하고 있고, Microsoft JET 공급자는 32 비트이므로 32 비트 버전의 FlexReportDesigner를 사용해야 합니다. 샘플에서 InvoiceFlexReport.flxr을 수정하려면 32비트 버전의 FlexReportDesigner로 파일을 열어야 합니다.


해당 버전은 여기에서 찾을 수 있습니다.


C:\Program Files (x86)\ComponentOne\Apps\v4.5.2\C1FlexReportDesigner32.4.5.2.exe


SQL 데이터베이스를 사용하는 경우 32비트와 64비트 모두에 대한 SQL 데이터 제공자가 있으므로 32비트 또는 64비트 FlexReportDesigner를 사용할 수 있습니다.


주요 데이터 소스 설정


먼저 새로운 FlexReport 보고서 정의를 만들어야 합니다. FlexReportDesigner를 열고 "New Report"를 클릭합니다. 이제 보고서에 대한 데이터를 설정해야 합니다 Documents/ComponentOne Samples/Common 폴더에서 제공하는 C1NWind.mdb를 사용하고 있습니다.


다음 Connection 문자열을 사용하고 있습니다.


Provider=Microsoft.Jet.OLEDB.4.0;Data Source=?(SpecialFolder.MyDocuments)\ComponentOne Samples\Common\C1NWind.mdb;Persist Security Info=False


참고 : 문서의 폴더 경로는 컴퓨터의 로그인(IE C:\Users\andrew.paxinos\Documents)에 따라 다르므로 “? (SpecialFolder.MyDocuments)”를 사용하고 있습니다.


이제 필요한 데이터를 파악해야 합니다. Orders 테이블에는 보고하려는 OrderID와 대부분의 세부 정보가 포함됩니다. 그러나 CustomerID 외래키 참조만 포함하므로, 동일한 데이터 소스에서 주문과 고객 테이블을 모두 얻으려면 결합을 사용해야 합니다.


SELECT Orders.OrderID, Orders.OrderDate, Orders.ShippedDate, Orders.ShipName, Orders.ShipAddress, Orders.ShipCity, Orders.ShipRegion, Orders.ShipPostalCode, Customers.CompanyName, Customers.Address, Customers.City, Customers.Region, Customers.PostalCode FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID

FlexReport에서 파라미터 및 여러 데이터 소스 사용


파라미터 생성


다음으로, 보고 할 특정 OrderID를 제공할 수 있도록 파라미터를 설정해야 합니다. “데이터” 탭에서 “파라미터”를 마우스 오른쪽 버튼으로 클릭하고 “파라미터 추가”를 클릭하십시오.


FlexReport에서 파라미터 및 여러 데이터 소스 사용


새 파라미터의 이름을 pOrderID로 지정하십시오.


FlexReport에서 파라미터 및 여러 데이터 소스 사용


이제 이전에 생성한 기본 데이터 소스를 마우스 오른쪽 버튼으로 클릭하고 "편집"을 선택하십시오.


FlexReport에서 파라미터 및 여러 데이터 소스 사용


방금 만든 파라미터를 사용하는 WHERE 절을 SQL SELECT문에 추가해야 합니다. 이 경우 WHERE OrderID = pOrderID를 끝에 추가합니다.


SELECT Orders.OrderID, Orders.OrderDate, Orders.ShippedDate, Orders.ShipName, Orders.ShipAddress, Orders.ShipCity, Orders.ShipRegion, Orders.ShipPostalCode, Customers.CompanyName, Customers.Address, Customers.City, Customers.Region, Customers.PostalCode FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID WHERE OrderID = pOrderID


보고서 디자인


다음으로, Sold To / Shipped To 배열에서 두 테이블의 필드를 사용하여 보고서 헤더를 배치합니다.


FlexReport에서 파라미터 및 여러 데이터 소스 사용


보고서의 세부사항 섹션의 경우, OrderID와 관련된 주문 세부 사항 테이블에서 각 주문의 개별 개별 항목을 가져와야 합니다. 이 경우 하위 보고서를 사용하는 것이 좋습니다. 비어있는 새 보고서를 작성하고 이름을 "InvoiceSubReport"로 지정하겠습니다.


FlexReport에서 파라미터 및 여러 데이터 소스 사용


"데이터" 탭을 클릭하고 "메인"을 마우스 오른쪽 버튼으로 클릭 한 후 "편집"을 선택하십시오. 동일한 연결 문자열을 사용하십시오. 이 경우 주문 세부 사항 테이블의 모든 필드가 필요하지만 여기에는 ProductID 외래키이므로 다른 결합을 사용하여 제품 테이블에서 ProductName을 가져옵니다.


SELECT [Order Details].OrderID, Products.ProductName, [Order Details].UnitPrice, [Order Details].Quantity, [Order Details].Discount FROM [Order Details] INNER JOIN Products ON [Order Details].ProductID = Products.ProductID;


참고 : 하위 보고서에 주문 세부 정보 ProductID 열이 표시되지 않더라도 주문 세부 정보 열을 포함하고 있습니다. 이 작업을 수행하여 해당 필드를 통해 기본 보고서와 하위 보고서를 연결할 수 있습니다. 또한 하위 보고서에 파라미터 또는 WHERE 절을 포함하지 않아도 됩니다. 그런 다음 하위 보고서에 필드를 배치했습니다 (아래 참조).


FlexReport에서 파라미터 및 여러 데이터 소스 사용


"InvoiceReport"를 다시 클릭하고 상단의 리본에서 "삽입" 탭을 클릭하고 "SubReport> InvoicesSubReport"를 선택한 다음 하위 보고서를 보고서의 세부 정보 섹션에 그립니다.


FlexReport에서 파라미터 및 여러 데이터 소스 사용

FlexReport에서 파라미터 및 여러 데이터 소스 사용


"하위 보고서"를 마우스 오른쪽 단추로 클릭하고 "하위 보고서 링크"를 선택하십시오.


FlexReport에서 파라미터 및 여러 데이터 소스 사용


마스터 및 하위 보고서 모두에 대해 "OrderID" 열이 선택되어 있는지 확인하고 "확인"을 클릭하십시오.


FlexReport에서 파라미터 및 여러 데이터 소스 사용


이 샘플에서는 런타임에 하위 보고서의 데이터 소스를 수정하여 나중에(필터링 예제에서) 쉽게 식별 할 수 있도록 "subInvoiceSubReport" 필드의 이름을 바꿀 것입니다.


FlexReport에서 파라미터 및 여러 데이터 소스 사용


.NET 응용 프로그램에서 FlexReport 및 FlexViewer를 사용하여 표시


보고서가 완성되었으므로 애플리케이션을 빌드 해봅시다. 우리는 이 샘플에 대해 Winforms 앱을 사용하지만 모든 플랫폼에서 동일한 개념이 작동합니다.


고객이 사용하는 일반적인 디자인을 모방하려고 합니다. 주문 테이블의 모든 주문을 표시하는 그리드가 있는 기본 양식이 있습니다. 사용자는 그리드에서 주문 중 하나를 선택할 수 있으며 보고서 버전의 송장과 함께 새 양식을 로드하는 버튼이 있습니다.


먼저 C1FlexGrid를 폼과 2개의 .NET 버튼에 놓겠습니다. 하나의 버튼은 파라미터를 통해 FlexReport를 생성하고 다른 하나는 필터링 및 XML/DataTable 데이터 소스를 사용합니다.


FlexReport에서 파라미터 및 여러 데이터 소스 사용


다음으로 보고서에 사용한 AccessDB에서 orders 테이블을 가져 와서 해당 데이터를 .NET DataTable에 배치하고 FlexGrid를 바인딩합니다. 또한 FlexGrid 편집을 비활성화하고 버튼 클릭 이벤트에 다음 코드를 추가합니다.


        public Form1()  
        {  
            InitializeComponent();  
            // Find the current users Documents folder  
            string documentsfolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);  
            // Establish connection string for Northwind Access DB in the ComponentOne Samples/Common folder  
            string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ documentsfolder +@"\ComponentOne Samples\Common\C1NWind.mdb";

            // Create a DataTable and fill it with the contents of the Orders table  
            DataTable dt = new DataTable();  
            using (OleDbConnection conn = new OleDbConnection(connString))  
            {  
                OleDbCommand cmd = new OleDbCommand("Select * FROM Orders", conn);  
                conn.Open();  
                OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);  
                adapter.Fill(dt);  
            }  
            // Bind the FlexGrid to the Orders table  
            c1FlexGrid1.DataSource = dt;  
            // Disable editing (grid being used a selector only)  
            c1FlexGrid1.AllowEditing = false;  
        }

        private void btnParameter_Click(object sender, EventArgs e)  
        {  
            // Get the value of the cell in the currently selected row and column OrderID  
            int OrderID = (int)c1FlexGrid1[c1FlexGrid1.Row, c1FlexGrid1.Cols["OrderID"].Index];  
            // Create an instance of frmFlexReport and pass OrderID  
            frmFlexReport Report = new frmFlexReport(OrderID);  
            Report.Show();  
        }

        private void btnFilter_Click(object sender, EventArgs e)  
        {  
            // Get the value of the cell in the currently selected row and column OrderID  
            int OrderID = (int)c1FlexGrid1[c1FlexGrid1.Row, c1FlexGrid1.Cols["OrderID"].Index];  
            // Create an instance of frmFlexReportFilter and pass OrderID  
            frmFlexReportFilter Report = new frmFlexReportFilter(OrderID);  
            Report.Show();  
        }  


파라미터 사용


파라미터 버전의 경우 frmFlexReport라는 추가 Windows 양식을 만들고 전달된 int 값 (FlexGrid에서 선택한 행 OrderID 열의 OrderID)을 허용하도록 생성자를 수정했습니다. 다음으로, 보고서 폴더와 InvoiceReport 보고서에 Invoice.flxr 파일을 로드하고 pOrderID 파라미터를 전달된 값으로 설정한 후 FlexViewer를 로드합니다.


    public partial class frmFlexReport : Form  
    {  
        // Note, modified constructor to accept int to be passed  
        public frmFlexReport(int pOrderID)  
        {  
            InitializeComponent();  
            // Load the Report  
            c1FlexReport1.Load(."./../Reports/Invoice.flxr", "InvoiceReport");  
            // Set the parameter with the value selected in the grid  
            c1FlexReport1.Parameters["pOrderID"].Value = pOrderID;  
            // Load the FlexViewer  
            c1FlexViewer1.DocumentSource = c1FlexReport1;  
        }  
    }


필터 사용


필터 버전의 경우 샘플의 /Data 폴더에 AccessDB에 포함된 동일한 열과 데이터를 포함하는 2 개의 XML 파일을 만들었습니다. 해당 데이터는 두 개의 .NET DataTable에 로드됩니다. 동일한 FLXR과 InvoiceReport를 로드하겠습니다. 다음으로 로드 된 보고서의 메인 DataSource.RecordSet을 수정하여 적절한 DataTable을 가리키도록 합니다. 그런 다음 FlexReport's.Fields [“subInvoiceSubReport”] 필드를 SubReportField 객체로 캡처하여 하위 보고서의 DataSource.RecordSet을 다른 DataTable로 설정할 수 있습니다.


그리고 나서 더 이상 WHERE 절이 있는 데이터 소스가 없으므로 파라미터 콜렉션을 지우면 파라미터를 사용할 수 없습니다. 마지막으로 DataSource.Filter 속성을 OrderID 문자열로 설정하고 생성자에 전달된 값과 같게 한 후 FlexViewer 컨트롤을 로드하여 보고서를 렌더링합니다.


    public partial class frmFlexReportFilter : Form  
    {  
        // Note, modified constructor to accept int to be passed  
        public frmFlexReportFilter(int pOrder)  
        {  
            InitializeComponent();

            // Load dataTables from .xml files in the /Data folder  
            DataTable dtOrdersCustomer = new DataTable();  
            dtOrdersCustomer.ReadXml(."./../Data/OrdersCustomer.xml");  
            DataTable dtOrderDetailsProducts = new DataTable();  
            dtOrderDetailsProducts.ReadXml(."./../Data/OrderDetailsProduct.xml");

            // Load the Invoice Report  
            c1FlexReport1.Load(."./../Reports/Invoice.flxr", "InvoiceReport");

            // Replace the existing SQL data source by pointing directly to the DataTable  
            c1FlexReport1.DataSources["Main"].Recordset = dtOrdersCustomer;

            // Capture the SubReport field from the InvoiceReport and create a .NET object named subInvoiceSubReport  
            C1.Win.FlexReport.SubreportField subInvoiceSubReport = c1FlexReport1.Fields["subInvoiceSubReport"] as C1.Win.FlexReport.SubreportField;  
            // Set the SubReport's DataSource RecordSet to the other DataTable  
            subInvoiceSubReport.Subreport.DataSources["Main"].Recordset = dtOrderDetailsProducts;

            // Clear the Parameter collection (since we're not using it anymore)  
            c1FlexReport1.Parameters.Clear();  
            // Set the Filter String  
            c1FlexReport1.DataSources["Main"].Filter = "OrderID = " + pOrder.ToString();  
            // Load the FlexViewer  
            c1FlexViewer1.DocumentSource = c1FlexReport1;  
        }  
    }


FlexReport로 작업할 때 데이터를 사용하고 조작하는 방법을 더 잘 이해할 수 있기를 바랍니다. 파라미터를 사용하는 데이터 소스의 크기 및 액세스 속도에 따라 보고서에 필요한 데이터만 제거하기 때문에 일반적으로 성능이 향상됩니다. 그러나 WHERE 절을 사용할 수 없는 상황이거나 보고서에 표시하기 전에 데이터를 조작해야 하는 경우 (그러나 해당 변경 사항을 데이터 소스에 적용하지 않으려는 경우) 필터가 좋은 옵션일 수 있습니다.


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

댓글목록

등록된 댓글이 없습니다.

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

태그1

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