استفاده از جداول پدر و فرزند در گزارش – 2

برای ایجاد گزارش بر روی نام پروژه در Solution Explorer راست کلیک کرده و از منوی Add گزینه ی Add Item… را انتخاب نمایید :
parent-child-table-crystalreport(5)

در پنجره ی نمایش داده شده ، از سربرگ Reporting گزینه ی Crystal Reports را انتخاب نمایید و بعد از تعیین نام برای آن بر روی دکمه ی Add کلیک کنید :
parent-child-table-crystalreport(12)
در مرحله ی بعد پنجره ی زیر نمایش داده می شود ، گزینه ی As a blank report را انتخاب کنید و سپس بر روی دکمه ی کلیک کنید :
parent-child-table-crystalreport(13)
در محیط طراحی گزارش و در پنجره ی Field Explorer بر روی گزینه ی Database Fields راست کلیک کرده و از منوی ظاهر شده گزینه ی Database Expert را انتخاب نمایید :
parent-child-table-crystalreport(14)
به شکل زیر Dataset را به گزارش معرفی نمایید :
parent-child-table-crystalreport(15)
بعد از انجام مراحله ی بالا Datatable موجود در Dataset با موفقیت به قسمت Database Fields اضافه می شود :
parent-child-table-crystalreport(16)
برای نمایش داده ها باید فیلد های Datatable را به قسمت Details گزارش Drag & Drop کنیم :
parent-child-table-crystalreport(17)

کار معرفی Dataset به گزارش و طراحی آن به اتمام رسید در مرحله ی بعد باید داده ها را از بانک واکشی کرده و در Dataset قرار دهیم ، سپس با استفاده از کنترل Crystal Report Viewer گزارش را به کاربر نشان دهیم . در پنجره ی Toolbox یک کنترل Crystal Report Viewer بر روی فرم قرار دهید . بر روی فرم برنامه دابل کلیک کرده و فضای نام های زیر را به کلاس فرم اضافه کنید :

using System.Data;
using System.Data.SqlClient;

سپس متد ی به شکل زیر در کلاس فرم بنویسید :

 
private DataTable ReturnDatasource()
{
    string connectionstring = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    string selectQuery = "SELECT tablePersonels.Id,tablePersonels.FirstName, tablePersonels.LastName," 
                       + "CarName, CarColor FROM tablePersonels "
                       + "JOIN tableCars ON tablePersonels.Id = tableCars.personelId;";
    SqlConnection SqlConnection1 = new SqlConnection(connectionstring);
    SqlCommand SqlCommand1 = new SqlCommand(selectQuery, SqlConnection1);
    SqlDataAdapter SqlDataAdapter1 = new SqlDataAdapter(SqlCommand1);

    try
    {
        CrystalReportDataset resultDataset = new CrystalReportDataset();
        SqlDataAdapter1.Fill(resultDataset.Tables["MergePersonelsAndCars"]);
        return resultDataset.Tables[0];
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return null;
    }
    finally
    {
        SqlCommand1.Connection.Close();
    }
}

رشته اتصال برنامه را در فایل App.Config برنامه به شکل زیر تعریف کرده ایم :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="ConnectionString" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|DataBase.mdf;Integrated Security=True;Connect Timeout=30"/>
</connectionStrings>
</configuration>

شما باید رشته اتصال را با توجه به مکان و نوع بانک اطلاعاتی خود تغییر دهید . بعد از تعریف رشته اتصال باید با استفاده از کلاس ConfigurationManager که در فضای نام System.Configuration وجود دارد ، از آن استفاده کنید .
به طور خلاصه متد بالا یک کوئری را بر روی بانک اطلاعاتی اجرا می کند و نتایج آن را در Dataset ای که در مراحل قبلی ساخته ایم قرار می دهد

کوئری متد به شکل زیر می باشد :

string selectQuery = "SELECT tablePersonels.Id,tablePersonels.FirstName, tablePersonels.LastName,"
                           + "CarName, CarColor FROM tablePersonels "

این پرس و جو یک دستور JOIN است که داده های دو جدول tablePersonels و tableCars را به همدیگر متصل می کند و نتایج آن را برگشت می دهد .

در مر حله ی آخر در رویداد Load فرم کد زیر را بنویسید :

Report1 report = new Report1();
report.SetDataSource(this.ReturnDatasource());
this.crystalReportViewer1.ReportSource = report;

برای نمایش یک گزارش باید از کلاس آن یک شی ایجاد کنیم. نام کلاس معمولا با نام فایل گزارش یکسان است . در مرحله ی بعد باید با استفاده از متد SetDatasource منبع داده آن را مشخص کنیم . منبع داده این مثال همان متد ReturnDatasource می باشد . در مرحله ی آخر باید با استفاده از خصوصیت ReportSource کنترل Crystal Report Viewer گزارش را نشان دهیم . برنامه را اجرا کنید و نتیجه را مشاهده کنید :
parent-child-table-crystalreport(18)