ارتباط Crystal Report و بانک اطلاعاتی (روش غیر مستقیم)

در این آموزش قصد دارم که شما را با نحوه ی ارتباط با کریستال با روش غیر مستقیم آشنا کنم . این روش به دلیل انعطاف پذیری بالا توصیه میشه . در حالت کلی شما باید یک Dataset را طراحی کنید و بعد از پر کردن آن با داده های خود ، آن را به عنوان منبع داده به کریستال ریپورت معرفی کنید . بانکی که قصد داریم در این مثال معرفی کنیم ، ساختارو داده هایی به شکل زیر دارد :
crystal-report-and-database-communication-indirect-method-1

crystal-report-and-database-communication-indirect-method-1

ایجاد Dataset

برای ایجاد و طراحی Dataset دو راه وجود دارد . می تونید از ابزارهای طراحی Visual Studio استفاده کنید یا اینکه از طریق کد و به صورت داینامیک این کار را انجام دهید ، در این مثال از روش اول استفاده می کنیم . ابتدا بر روی نام پروژه در Solution Explorer راست کلیک کرده و سپس از گزینه Add آیتم New Item… را انتخاب می کنیم :
crystal-report-and-database-communication-indirect-method-3

همانطور که در شکل زیر مشاهده می کنید از پنجره باز شده از قسمت Data ، گزینه Dataset را انتخاب کرده و بر روی دکمه ی Add کلیک می کنیم .
crystal-report-and-database-communication-indirect-method-4

در شکل زیر محیط طراحی Dataset نمایش داده شده است . برای ایجاد یک datatable در dataset بر روی یک قسمت خالی کلیک راست کرده و به صورت زیر یک Datatable ایجاد می کنیم . هر dataset از چند datatable تشکیل می شود . datatable را باید شبیه table موجود در بانک(tablePersonels) ایجاد کنیم زیرا قصد داریم داده های جدول را در آن قرار دهیم .
crystal-report-and-database-communication-indirect-method-5

برای تغییر نام پیشفرض datatable بر روی عنوان آن راست کلیک کرده و گزینه Rename را انتخاب کنید و سپس نام آن را به tablePersonels تغییر دهید .
crystal-report-and-database-communication-indirect-method-6

حال نوبت به اضافه کرده ستون هایی مشابه ستون های موجود در جدول بانک اطلاعاتی می رسد . برای این کار بر روی datatable کلیک راست کرده و به صورت زیر ستون هایی هم نام با جدول بانک ایجاد می کنیم :
crystal-report-and-database-communication-indirect-method-7

بعد از ایجاد ستون می توانیم از پنجره ی Properties خصوصیات مختلف ستون از جمله نوع داده های آن ، نام ، عنوان و… را تغییر دهید :
crystal-report-and-database-communication-indirect-method-8

دو مرحله ی بالا را تا ایجاد کامل ستون ها تکرار کنید تا به صورت شکل زیر ستون ها به datatable اضافه شوند .
crystal-report-and-database-communication-indirect-method-9

یک فرم به صورت زیر در پروژه ایجاد کرده و کنترل های Datagridview و دکمه را بر روی آن قرار دهید :
crystal-report-and-database-communication-indirect-method-10

برای انتقال اطلاعات از پایگاه داده به Dataset ای که در مراحل قبلی ایجاد کردیم ابتدا یک شی از آن ایجاد می کنیم و سپس با استفاده از متدی به صورت زیر اطلاعات موجود در بانک را به آن انتقال می دهیم :

  1: private DataSet1 DataSource = new DataSet1();
  2: 
  3: public DataTable SelectData()
  4: {
  5:     string connectionstring = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
  6:     string selectQuery = "SELECT * FROM tablePersonels;";
  7:     SqlConnection SqlConnection1 = new SqlConnection(connectionstring);
  8:     SqlCommand SqlCommand1 = new SqlCommand(selectQuery, SqlConnection1);
  9:     SqlDataAdapter SqlDataAdapter1 = new SqlDataAdapter(SqlCommand1);
 10:             
 11:     try
 12:     {                
 13:         DataTable result = new DataTable();
 14:         SqlDataAdapter1.Fill(this.DataSource.Tables["tablePersonels"]);
 15:         return this.DataSource.Tables[0];
 16:     }
 17:     catch (Exception ex)
 18:     {
 19:         MessageBox.Show(ex.Message);
 20:         return null;
 21:     }
 22:     finally
 23:     {
 24:         SqlCommand1.Connection.Close();
 25:     }
 26: }

سپس در رویداد Form_Load کد زیر را می نویسیم :

private void Form2_Load(object sender, EventArgs e)
{
       this.dataGridView1.DataSource = this.SelectData();        
}

همانطور که در کد بالا می بینید خروجی متد SelectData که همان جدول tablePersonels موجود در Dataset است را به عنوان منبع داده Datagridview معرفی کرده ایم . با اجرای برنامه داده های به شکل زیر نمایش داده می شوند :

crystal-report-and-database-communication-indirect-method-11

معمولا کاربر داده های گزارش را در یک فرم جدا مشاهده می کند . برای این کار یک فرم خالی با نام frmReporting ایجاد کرده و از قسمت Toolbox کنترل CrystalReportViewer را بر روی آن بکشید :

crystal-report-and-database-communication-indirect-method-12

برای نمایش داده ها در کریستال ریپورت از کنترل CrystalReportViewer استفاده می شود . چون قرار است که اطلاعات بین دو فرم ردو بدل شود یعنی از فرم اصلی به فرمی که ایجاد کرده ایم ( frmReporting ) انتقال داده شوند . باید یک خاصیت از نوع Dataset1(که در مراحل قبلی طراحی کردیم) در فرم FrmReporting ایجاد کنیم، برای اینکار بر روی فرم frmReporting دوبار کلیک کرده و کد زیر را در می نویسید :

//منبع داده برای گزارش که از فرم 1 ارسال می کنیم
public DataSet1 DataSource { get; set; }

private void frmReporting_Load(object sender, EventArgs e)
{
    CrystalReport1 report1 = new CrystalReport1();
    report1.SetDataSource(this.DataSource.Tables["tablePersonels"]);
    crystalReportViewer1.ReportSource = report1;
}

برای نمایش گزارش ، باید یک شی از کلاس CrystalReport1 ایجاد کنیم و با استفاده از متد SetDataSource آن منبع داده (یعنی خصوصیت DataSource) را به آن معرفی کنیم . این خصوصیت از جنس Dataset می باشد و دارای خصوصیتی دیگر به نام Tables است که جدولی که در مراحل قبل به نام tablePersonels ایجاد کردیم را در خود جای می دهد . این که چرا باید یک شی از کلاسی با نام CrystalReport1 ایجاد کنیم بستگی به نام کلاس گزارش ما دارد . برای فهمیدن نام کلاس به شکل زیر عمل می کنیم :

crystal-report-and-database-communication-indirect-method-13

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

if (this.DataSource.tablePersonels.Rows.Count > 0)
{
	frmReporting reporting = new frmReporting();
	reporting.DataSource = this.DataSource;

	reporting.ShowDialog();
}

این کد تعداد سطرهای داخل منبع داده را بررسی میکند اگر رکوردی وجود داشته باشد ، یک شی از فرم frmReporting را ایجاد می کند و منبع داده را در خاصیت DataSource آن قرار می دهد. در درس های بعدی درباره محیط طراحی Crystal Report توضیح می دهیم .