چكيده
همانطور که میدانیم مهمترین بخش هر برنامه ، استفاده از اطلاعات یا بخش گزارش گیری می باشد .دراین مقاله به نحوه استفاده از Crystal Report در برنامه Web Application برای گرفتن گزارشات و چاپ آنها خواهیم پرداخت . ابتدا به نحوه ایجاد یک گزارش خاص در Crystal Report می پردازیم که این گزارش با استفاده از یک Query روی دیتا بیس SqlServer شکل می گیرد. که این query تنها واسطی جهت انتقال اطلاعات از هر محیط برنامه نویسی به محیط Crystal Report می باشد . آنگاه به محیط Web Application رفته و با استفاده از زبان برنامه نویسی VB.Net به استفاده از این گزارش و روشهای چاپ آن می پردازیم .
مقدمه
همانطور که میدانید نرم افزار مخصوص گرفتن گزارش CrestalReport می باشد . توسط این نرم افزار می توان به بانکهای اطلاعاتی متصل شده و گزارشات مورد نظر را استخراج نمود . با این نرم افزار می توان گزارشات پیشرفته و پیچیده ای را ایجاد نمود . طراحی خروجی گزارشات به وسیله Crystal Report می تواند به راحتی صورت گرفته به طوری که نظر و علاقه هر کاربری را تامین نماید. ایجاد این خروجی توسط ابزار موجود در WinApp ها و WebApp ها اگر امکان پذیر باشد می توان گفت بسیار دشوار است . لذا اغلب زبانهای برنامه نویسی راههایی را برای اتصال و استفاده از گزارشات Crystal Report در خود تعریف نموده اند. مثلا Visual Studio.Net یک Commponent برای گرفتن گزارش از CrystalReport اضافه نموده است . که به راحتی همان خروجی که در CrystalReport می توانیم مشاهده کنیم را در خروجی برنامه داشته باشیم .
در این مقاله ابتدا به ایجاد یک گزارش در Crystal Report پرداخته و سپس به نحوه فراخوانی این گزارش در Web App که به زبان VB.Net نوشته شده پرداخته است و در انتها به چگونگی چاپ گزارش خواهیم پرداخت .
ایجاد گزارش در CrystalReport
در این قسمت به شرح روش ایجاد یک نمونه گزارش در Crystal Report 8.5 می پردازیم ، که از این گزارش در برنامه استفاده خواهیم نمود .
ابتدا Crystal Report را اجرا می کنیم
در دیالوگ خوش آمد گویی در بخش create New Crystal Reaport Document گزینه As aBlank Report را انتخاب میکنیم .
تصویر(1)
در دیلوگ Data Explorer باز شده روی +More Data Source رفته و Active data(Ado) را انتخاب می کنیم مطابق تصویر (1) . پنجره Select Data Source باز می شود.
از دیالوگ Select Data Source گزینه Ado and Oledb را انتخاب نموده و کلید Build تصویر (2) را کلیک کرده و وارد دیالوگ DataLinkProperty می شویم .
تصویر(2)
از دیالوگ DataLink Properties در تب Provider آیتم Microsoft OlE DBprovider For Sql Server را انتخاب می کنیم تصویر (3) و کلید Next را فشار می دهیم . سپس وارد تب Connection شده و تنظیمات آن را انجام می دهیم . ابتدا در 1.Select or Enter a Server Name نام سرور را وارد می کنیم . که اسم همان دستگاهی است که SqlServer روی آن نصب گردیده است . در بخش 2.Enter Information to logon to the Server قسمت Use a Specific user name and password را انتخاب نموده و user و Password ارتباط با بانک را وارد می کنیم .
در بخش 3.select the data base on the server نام بانک اطلاعاتی مورد نظر را در SqlServer وارد می کنیم که در اینجا ما NorthWind را انتخاب می نماییم . کلید TestConnection را زده و در صورت آمدن پیغام Test Connection Succeded ارتباط با بانک به درستی صورت پذیرفته است .
تصویر(3)
سپس Ok نموده و به دیالوگ Select data Source برمی گردیم آنجا نیز Ok نموده یک دیالوگ دیگر باعنوان Sql Server Login باز می شود که دوباره Password اتصال را می پرسد . Password را وارد نموده و Ok را کلیک می نماییم .
به صفحه Data Explorer بر می گردیم در آنجا زیر Active Data(Ado) یک Connection به نام سرور ایجاد گردیده است که زیر آن یک آیتم تحت عنوان Ado آورده شده است این آیتم را انتخاب نموده و کلید Add را کلیک می کنیم .
حال دیالوگ Select Record Set باز می شود در این دیالوگ گزینه Sql را انتخاب نموده ودر Listbox آن می توان دستور Select * from employees را نوشت تصویر(4) . نکته قابل توجه این است که این دستور Select سوری بوده و شما می توانید هر دیتایی را از طریق برنامه به این دستور پاس دهید .که این مطلب را به زودی خواهید دید .
تصویر(4)
پس از زدن دستور Select برای خروج Ok نموده و به صفحه Dataexplorer باز می گردیم و در آنجا نیز کلید Close را کلیک می کنیم . حال به محیط Crystal Report می آیم و در دیالوگ Field Explorer ، DataBase Field را کلیک نموده تا زیر آن Ado ظاهر گردد. آن را نیز باز نموده فیلدهایی که در Select انتخاب نمودیم را در اینجا می بینیم . هر یک از این فیلدها را یکی یکی روی صفحه Crystal Reaport قرار می دهیم هر یک از این فیلدها مانند کانالهایی هستند که دیتا را از سطح برنامه به محیط Crystal Reaport منتقل می کنند . یک TextObject به ابتدای گزارش در بخش Reaport header اضافه نموده و عنوان گزارش را Report of Emploees در آن تایپ می کنیم . فیلد City را در بخش report header اضافه می کنیم و یک TextObject نیز در کناز آن گذاشته و متن City: را در آن وارد می کنیم تصویر (5).
تصویر (5)
گزارش را ذخیره نموده اسم فایل را Rep1 می گذاریم و از محط CrystalReport خارج می شویم .
ایجاد برنامه گزارش گیری
ابتدا برنامه Microsoft Visual Studio.Net 2003 را اجرا می کنیم new Project نموده تا یک پروژه جدید را باز کنیم .
در دیالوگ NewProject در بخش Project Type/Visual Basic Projects و در Template/Asp.net WebApplication را انتخاب می کنیم . به این ترتیب وارد محیط Microsoft Visual Basic.Net می شویم به صورت دیفالت یک form به نام Webform1.aspx ایجاد می گردد .
در سمت راست صفحه روی آن رفته و نام آن را به FrmRep تغییر می دهیم . FrmRep را با Component ها مطابق تصویر(6) پر می کنیم .
تصویر (6)
CrystalReport را از Component های موجود در لیست Webform در ToolBox انتخاب نموده ایم . یک صفحه WebForm جدید به نام FrmPrn ایجاد می کنیم که از آن برای ارسال متن گزارش آماده چاپ استفاده می گردد . در این WebForm تنها یک Component Crystal Report Viewer را اضافه می کنیم .
برای اضافه نمودن گزارشی که در Crystal Report ساختیم روی File\Addnewitem میکنیم . از دیالوگ Add Newitem Web Application در بخش categories\Webproject item و از قسمت template/crystalreport را انتخاب می کنیم در بخش name رفته و نام گزارش را crep1.rpt وارد میکنیم و آنگاه کلید Open را کلیک می کنیم .
دیالوگ Crystal Report Gallery ظاهر می گردد . در بخش Create a New CrestalReport Document قسمت From an Existing Report را انتخاب می کنیم . و گزارش را که در محیط CrystalReport به نام Rep1.rpt ذخیره نمودیم را انتخاب کرده و Open می کنیم .
گزارشی که در Crystal Report تهیه و طراحی کرده بودیم در محیط برنامه نویسی به نام Crep1.rpt باز می شود. کلید ذخیره را می زنیم . دیالوگی ظاهر می شود که تغییر فرمت فایل را می پرسد کلید Yes را انتخاب می کنیم گزارش در Web App ذخیره می گردد .
روی فرم FrmRep رفته و ID مربوط به Button در یافت گزارش را BtRep می گزاریم ، همچنین مقدار ID مربوط به Button چاپ گزارش را BtPrn می گزاریم . در ابتدای کلاس متغییرهای مورد نیاز را به صورت Public معرفی می کنیم
Imports System.Data.SqlClient ' SqlServer
Public Class WebForm1
Inherits System.Web.UI.Page
'Public cls As New Clss
Public cn As New SqlConnection
Public dadb As New SqlDataAdapter
Public dset As New DataSet
Public myReport As New WebApplication6.Crep1
Protected WithEvents Txtcity As System.Web.UI.WebControls.TextBox
'متغییری که برای جستجوی شهر استفاده می گردد
Public sqlstr As New SqlCommand
حال روی کلید در یافت گزارش رفته و دوبار کلیک می کنیم و کد مربوط به کلیک این کلید را به صورت زیر می نویسیم .
Private Sub Btrep_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btrep.Click
'دريافتگزارش '
cn.ConnectionString = "Password=as;User ID=sa;Initial Catalog=northwind;Data Source=jam"
sqlstr = New SqlCommand(" select * from employees where city='" + Txtcity.Text + "' ", cn)
dadb.SelectCommand = sqlstr
dset = New DataSet
dadb.Fill(dset)
If dset.Tables(0).Rows.Count <> 0 Then
myReport.Database.Tables(0).SetDataSource(dset.Tab les(0))
CrystalReportViewer1.ReportSource = myReport
CrystalReportViewer1.DataBind()
End If
End Sub
توسط این کد ابتدا به دیتابیس مرتبط شده و بایک Select که با شرط مساوی بودن City با مقدار TxtCity که از ورودی میگیرد تنظیم گردیده و دیتاها از جدول Employees خوانده می شود و به DataSet به نام Dset منتقل میگردد . رکوردهای خوانده شده از طریق Dset به Myreport انتقال داده و سپس جهت نمایش به Crystal Report Viewer1 انتقال داده می شود و پس از اجرا خروجی برنامه را مطابق تصویر() داریم.
تصویر(7)
چاپ گزارش
دو روش برای چاپ گزارش وجود دارد
الف ) زمانی که بخواهیم کلیه گزارشات تنها از روی سرور گرفته شود در این صورت Printer مورد نظر را روی سرور نصب کرده و کاربران هرگاه چاپ گزارش راکلیک کنند خروجی را از طریق Printer نصب شده روی سرور می توانند دریافت کنند این برای مواردی که چاپ گزارش می خواهیم متمرکز باشد مفید است .
لذا کد ذیل را دربخش کلیک چاپ گزارش وارد می کنیم .
Private Sub BtPrn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtPrn.Click
'چاپگزارش '
cn.ConnectionString = "Password=as;User ID=sa;Initial Catalog=northwind;Data Source=jam"
sqlstr = New SqlCommand(" select * from employees where city='" + Txtcity.Text + "' ", cn)
dadb.SelectCommand = sqlstr
dset = New DataSet
dadb.Fill(dset)
If dset.Tables(0).Rows.Count <> 0 Then
myReport.Database.Tables(0).SetDataSource(dset.Tab les(0))
myReport.PrintToPrinter(1, True, 1, 999)
End If
End Sub
البته می توان سایر مشخصات ازجمله نام Printer چپ و راست و بالا و پایین را از صفحه تنظیم نمود .
ب ) روش دوم اینکه هر کاربر بتواند از طریق چاپگر خود گزارش مورد نظر را چاپ کند . در این صورت از یک فرم جدید استفاده می کنیم که در آن خروجی را متناسب با آنچه می خواهیم چاپ شود بیرون می آوریم و کل صفحه را از طریق File\print چاپ میکنیم در این صورت نیاز به استفاده از یک متغییر هستیم که در دو فرم قابل شناسایی باشد یک روش استفاده از Session می باشد در این صورت ابتدا این متغییر را در بخش Session_Startدر Global.asax وارد می کنیم که در آن Dsettemp را به عنوان یک Sesstion معرفی نموده ایم .
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
Session.Add("dsettemp", New DataSet)
' Fires when the session is started
End Sub
در کلیک کلید چاپ گزارش کد زیر را وارد می کنیم
Private Sub BtPrn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtPrn.Click
'چاپگزارش '
cn.ConnectionString = "Password=as;User ID=sa;Initial Catalog=northwind;Data Source=jam"
sqlstr = New SqlCommand(" select * from employees where city='" + Txtcity.Text + "' ", cn)
dadb.SelectCommand = sqlstr
dset = New DataSet
dadb.Fill(dset)
If dset.Tables(0).Rows.Count <> 0 Then
myReport.Database.Tables(0).SetDataSource(dset.Tab les(0))
Session("dsettemp") = dset
Response.Redirect("frmprint.aspx")
End If
End Sub
حال به فرم FrmPint رفته و کد زیر را در page_load وارد می کنیم .
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
Dim dset As New DataSet
dset = Session("dsettemp")
myReport.Database.Tables(0).SetDataSource(dset.Tab les(0))
CrystalReportViewer1.DisplayGroupTree = False
CrystalReportViewer1.DisplayToolbar = False
CrystalReportViewer1.ReportSource = myReport
CrystalReportViewer1.DisplayGroupTree = False
CrystalReportViewer1.DataBind()
End Sub
تصویر (8)
در این صورت با کلیک روی کلید چاپ گزارش خروجی مطابق تصویر(8) خواهد بود .