امروزه با توجه به حجم وسیع اطلاعات، استفاده از Database در برنامه ها به جزء لاینفک تبدیل گشته است. حال با توجه به اینکه در زمینه های تجاری (و یا زمینه های غیرتجاری با حجم زیاد اطلاعات) ارائه ی گزارش از این Database ها، امری الزامی در یک نرم افزار و یا یک شبکه است، لازم است که ساختاری مناسب جهت انجام این مهم ایجاد شود.
سالها پیش متخصصان بعد از ایجاد کامل نرم افزار، مجبور به صرف زمان قابل توجهی (گاهی به اندازه نیمی از زمان ایجاد نرم افزار) برای ساخت و مدیریت این گزارش ها بودند، به خاطر اینکه مجبور می شدند علاوه بر ایجاد اطلاعات گزارش، آنرا (به عنوان مثال) داخل یک صفحه A4 قرار دهند، به صورتی که هم قابل چاپ (بدون هیچ نرم افزار کمکی) باشد، و هم با تقسیم اطلاعات در صفحات پشت سر هم، فرمت و قالب بندی آنها بدون تغییر باقی بماند. طی چند سال اخیر، روش ها و نرم افزار های متعددی از شرکت های مختلف برای حل این معزل و کمک به برنامه نویسان ارائه شد.
در هیچ زمینه ای، روش های مختلف کامل نیستند و هر کدام مزایا و معایبی دارند. این روشها هم از این قاعده مستثنی نبودند، ولی بالاخره روشی که شرکت فرانسوی Business Objects ارائه داد، توسط مایکروسافت به عنوان یک روش استاندارد در پلتفرم NET. پذیرفته شد، و یک نسخه ی رایگان (و البته با امکانات محدود) از نرم افزار آن که Crystal Reports نام دارد،هم در Visual Studio .Net گنجانده شد. این مطلب را می توانید در فرم اسپلش Visual Studio و در زیر منوی About از Visual Studio مشاهده کنید.
نکاتی که قبل از شروع مقاله باید به آنها دقت کنید :
بحث کامل در مورد Crystal Reports حداقل به 4-3 کتاب می انجامد. این فناوری حتی یک زبان برای خود دارد، و به دلیل کاربرد گسترده، از دو Syntax مختلف تشکیل شده است، تا طیف وسیع برنامه نویسان، با کمترین زمانی که صرف می کنند، بتوانند از Crystal Reportsاستفاده کنند. البته در این مقاله فقط در مورد نحوه ی استفاده از آن بحث می شود، که البته بحث کامل خود آن نیز به چند مقاله نیاز دارد.
نکته: این مقاله به صورتی نوشته شده است که در صورت نخواندن قسمت های آتی مقاله، بتوانید بدون اشکال از Crystal Reports در نرم افزار هایتان بهره ببرید.
برای بهره برداری کامل از این مقاله، نیاز به مهارت های زیر دارید:
- داشتن علم مقدماتی SQL Server
- آشنایی به یکی از زبان های .NET (البته برنامه های این مقاله به زبان C#.NET نوشته شده است، ولی با توجه به اینکه فهم توابع به کار برده شده، برای درک کامل کد و ترجمه آن به هر زبان دیگری از جمله VB و #J کافی می باشد، برای درک کامل این مقاله، آشنایی به هرکدام از زبان های NET. برای شما کافی است.)
بخش طراحی و استفاده از Wizard
با فرض اینکه بانک اطلاعاتی test در SQL Server با جدول studs موجود است:
1- قبل از هر کاری باید یک اتصال به بانک اطلاعاتی برقرار کرده و یک دیتاست ایجاد کنید. ساده ترین کار این است که با باز کردن پانل Server Explorer از منوی View و با کلیک راست روی نود Data Connections و اجرای گزینه Add Connection یک اتصال به بانک اطلاعاتی برقرار نمائید. سپس شکل زیر را خواهید داشت که لیست جداول و دیگر اجرای بانک اطلاعاتی نمایش داده خواهد شد.
برای ایجاد دیتاست، از کادر Add Item استفاده کنید و پس از باز شده پنجره دیتاست، و جداول دلخواه را از پنجره Server Explorer به داخل دیتاست درگ کنید. (با فرض اینکه نام دیتاست همان پیش فرض DataSet1 انتخاب شود)
2- فرم جدیدی برای گزارش به پروژه اضافه کرده و از toolbox کامپوننت CrystalReportViewer را به داخل آن درگ کنید. تا شکل زیر بدست آید:
در صورتی که پنل Tasks مربوط به CrystalReportViewer1 را مشاهده نمی کنید، بر روی فلش کوچکی که در سمت راست و بالای CrystalReportViewer1 قرار دارد، کلیک کنید. گزینه ی Create a New Crystal Report را از پنل Tasks انتخاب کرده و نامی را که برای فایل گزارش پیشنهاد می شود، تایید کنید. در این هنگام فایلی به نام CrystalReport1.rpt ایجاد شده و صفحه ی Crystal Reports Gallery باز می شود. در این صفحه شما می توانید قالب کلی گزارش را انتخاب کنید. برای برنامه ی ما گزینه های پیش فرض جوابگو هستند، پس تنها بر روی OK کلیک کنید. در صفحه بعد باید Data Source مورد نیاز را انتخاب کنید.
در لیست Available Data Source ، مسیر Project Data –> ADO.NET DataSets را باز کرده و در دیتاستی که ایجاد کردید، جدول مورد نظر را انتخاب کرده و بر روی دکمه < کلیک کنید، تا جدول به لیست Selected Tables افزوده شود. دکمه Next را انتخاب کنید، تا صفحه ی انتخاب فیلد نمایان شود. نود جدولتان را که داخل لیست Available Fields قرار دارد، باز کنید. کلید کنترل را نگه دارید و فیلد هایی را که می خواهید در گزارشات موجود باشند، انتخاب کنید. بر روی دکمه < کلیک کنید تا فیلد ها به لیست Fields To Display اضافه شوند.
نکته: قسمت اصلی ویزارد در همین مرحله به اتمام می رسد، ولی در مرحله ی بعد، گروه بندی فیلد ها توضیح داده می شوند. در صورتی که به گروه بندی نیازی ندارید، برای خروج از ویزارد می توانید در همین صفحه بر روی دکمه Finish کلیک کنید.
بر روی دکمه Next کلیک کنید، تا صفحه Grouping ظاهر شود. یکی از فیلد های Report Fieldsرا که در لیست Available Fields قرار دارد انتخاب کرده، و بر روی دکمه < کلیک کنید، تا فیلد به لیست Group By افزوده شود.
نکته: در اینجا ذکر چند نکته ضروری است:
اولا: شما می توانید چند فیلد را از نود Report Fields انتخاب کنید. در این صورت گروه بندی به صورت سلسه مراتبی انجام می شود، به این معنا که در صورتی گروه بندی با فیلد (I)ام صورت می گیرد، که بیش از یک رکورد از اطلاعات در یک گروه که با فیلد (I – 1)ام دسته بندی شده است، وجود داشته باشد.
ثانیا: شما می توانید یک فیلد از جدولتان را که در نود Report Fieldsموجود نیست، برای گروه بندی انتخاب کنید. در این صورت با وجود اینکه فیلد انتخاب شده، در جدولتان موجود نیست، ولی رکورد ها بر حسب آن فیلد دسته بندی می شوند.
کار ما با ویزارد در همین نقطه به پایان می رسد، پس بر روی دکمه Finish کلیک کنید. (در صفحات بعد می توانید اطلاعات دیگری از جمله ُSummarized Fields و Filter Fields را ست کنید و ظاهر کلی گزارش را تغییر دهید.)
در این لحظه فایل گزارش به پروژه افزوده شده و فایل در Visual Studio نمایش داده می شود.
بخش کد نویسی
رویداد Load فرم حاوی گزارش راباز کرده و به صورت زیر کد نویسی کنید:
1- ابتدا باید مسیر فایل گزارش را در یک متغیر نگهداری کنید: (فرض کنید فایل در شاخه ی D:\Project\CrystalReport قرار دارد.)
String repPath = “D:\Project\CrystalReport\CrystalReport1.rpt”;
نکته: این کد با اینکه درست است، ولی قابلیت حمل را زیر سوال می برد، چون با تغییر محل شاخه ی پروژه باید این مسیر را عوض کنید.
برای قابلیت حمل می توانید از کدی مشابه کد زیر استفاده کنید:
String repPath = Application.StartupPath;
repPath = repPath.Substring(0, repPath.Length-9) + “CrystalReport1.rpt”;
2- در این قسمت باید یک CrystalDocument بسازید و مسیر فایل گزارش را در آن Load کنید:
CrystalDecisions.CrystalReports.Engine.ReportDocument
repDoc1= new CrystalDecisions.CrystalReports.Engine.ReportDocument();
repDoc1.Load(repPath);
3- در این زمان یک دیتاست بسازید و اطلاعات جدولتان را در آن قرار دهید، سپس آن را به متد SetDataSource از سند گزارشتان ارسال کنید:
SqlConnection conn = new SqlConnection(“server=(local);Integrated Security=True; database=test”);
SqlDataAdapter da = new SqlDataAdapter(“SELECT * FROM studs “,conn);
DataSet ds = new DataSet1();
conn.Open();
da.Fill(ds, “studs”);
conn.Close();
repDoc1.SetDataSource(ds);
4- در انتها خاصیت ReportSource از کنترل CrystalReportViewer1 را به سند گزارشتان تنظیم کنید:
crystalReportViewer1.ReportSource = repDoc1;
در ذیل کد تابع Load بصورت یکجا نشان داده شده است:
private void crystalReportViewer1_Load(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(“server=(local);Integrated
Security=True; database=test”);
String repPath = Application.StartupPath;
repPath = repPath.Substring(0, repPath.Length – 9) +
“CrystalReport1.rpt”;
CrystalDecisions.CrystalReports.Engine.ReportDocument repDoc1 = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
repDoc1.Load(repPath);
SqlDataAdapter da = new SqlDataAdapter(“SELECT * FROM studs “,conn);
DataSet ds = new DataSet1();
conn.Open();
da.Fill(ds, “studs”);
conn.Close();
repDoc1.SetDataSource(ds);
CrystalReportViewer1.ReportSource = repDoc1;
}
نکته: توجه شود که در کد فوق نام Dataset1 (نام فایل دیتاستی که ایجاد کردید) ایجاد شده، نه یک DataSet و برای استفاده از تابع بالا لازم است خط زیر را به بالای صفحه ی کد اضافه کنید:
using System.Data.SqlClient;
نکته: توجه شود که راه های ساده تری هم برای استفاده از Crystal Reports وجود دارد، که بعضی نیاز به کد نویسی هم ندارند، ولی در این مقاله عمدا این روش آموزش داده شد که بتوانید با کمی تغییر در کد “”Select * From studs هر گونه فیلتری برای اطلاعات در نظر بگیرید، و عملا نیاز به مراتب کمتری به استفاده از زبان Crystal Report برای به دست آوردن اطلاعات با یک فیلتر خاص، داشته باشید.
برای نمایش گزارش باید فرم را نمایش دهید . در ذیل نتیجه اجرای گزارش نمایش داده شده است:
با کمک دکمه های Toolbar موجود در بالای کنترل CrystalReportViewer1 ، خروجی دادن اطلاعات به فرمت های مختلف ( از جمله PDF، DOC و XLS ) ، پرینت اطلاعات ، جستجو در داده ها، صفحه پیمایی اطلاعات و حتی زوم کردن بر روی صفحه ( تا 400% و بدون کاهش کیفیت نوشته ها ) را برای شما و کاربر نهایی مهیا می کند.