شرح طريقة اضافة تقرير Crystal Reports في الـ ASP.NET بكلا اللغتين VB.NET ,C#.NET

بسم الله الرحمن الرحيم
اللهم صلي على محمد وآل محمد ...
في البداية حبيت اطرح هذا الموضوع لكي يستفيد من الكثير من الاعضاء وبخصوص هذا المنتدى الرائع .. ولاحظت انه لا توجد مصادر كثيرة او شروحات لهذا الشيء .. فقلت لما لا اضع هذا
الشيء ,, وبما اني اعرفه جيداً ليستفيد منه الغير ..
سوف نقوم بكتابة الكود على كلا اللغتين الـ VB.NET and C#.NET لتعم الاستفادة للجميع ..
اولاً سوف نقوم بالتطبيق على الـ ASP.NET VB.NET
افتح الـ Microsoft Visual Studio 2005 واختر من
File >>> New >>> Web Site

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_1.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_1.JPG[/IMG]
ثم بعد ذلك سوف تظهر لك نافذة أنشاء ويب جديد .. اختر منها ASP.NET Web Site مع التاكد من الـ Language انها Visual Basic
وكذلك الـ location انه File System
وكذلك لا تنسى ان تغير اسم المجلد او تدعه كما هو باسمه الافتراضي ,, وسوف يتم حفظ الملفات في الـ My Documents في مجلد الـ Visual Studio 2005

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_2.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_2.JPG[/IMG]
ثم اضغط على Ok لكي يتم انشاء الموقع...
طيب الان لا بد من وجود داتا بيس .. ليكي يتم الاتصال بها ..
أنشأ داتا بيس بأي اسم يعجبك .. وانا عن نفسي انشات داتا بيس باسم db1 من نوع Microsoft Access
وكذلك انشا جدول بأي اسم .. وانا انشات جدول باسم tbl_Client للعملاء ..
وكذلك انشأ حقول في الجدول على حسب متطلباتك .. وعن نفسي انشات هذه الحقول ..
ID من نوع AutoNumber
C_Name من نوع Text
C_Phone من نوع Text
C_Address من نوع Text

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_3.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_3.JPG[/IMG]
بعد انشاء الداتا بيس .. اضف فيها بيانات مبدئية لكي نعرضها في التقرير .. فيما بعد ..
الان قم بنسخ الداتا بيس لديك إلى المشروع .. وضعها في مجلد الـ App_Data وهذا المجلد موجود في الـ
كود
My Documents\Visual Studio 2005\Your_WebSite\App_Data
Your_WebSite تعني اسم مشروعك الذي انشاته مسبقا
الان اذهب إلى المشروع لكي نقوم باضافة الكرستال ريبوت
من خلال شريط الادوات ToolBox اذهب إلى ادوات الكرستال ريبوت .. وهي تكون تحت كلمه Crystal Reports اضغط دبل كلك على الاداة CrystalReportViewer

سوف يتم ادراجها على الصفحة بهذه الصورة

الان دع الاداة .. سوف نرجع لها لاحقاً ...
اذهب إلى شريط الادوات .. سوف ترى ايقونه شكلها مربع ... اضغط عليها واختر منها Add New Item...

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_6.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_6.JPG[/IMG]
او من خلال Solution Explorer ثم كلك يمين على اسم الموقع ثم اختار منها Add New Item...

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_7.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_7.JPG[/IMG]
ثم بعد ذلك سوف يظهر لك مربع حوار Add New Item اختر منه CrystalReport واجعل اسمه الافتراضي كما هو ..

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_8.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_8.JPG[/IMG]
ثم بعد ذلك اضغط على Ok لكي يتم اضافة التقرير .. بعد ذلك سوف تظهر لك نافذة الـ Crystal Reports Gallery

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_9.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_9.JPG[/IMG]
دع الخيارات كما هي واضغط على زر OK لكي تظهر لك نافذة Standard Report Create Wizard

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_10.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_10.JPG[/IMG]
انتق الخيار Create New Connection
ثم انتق الخيار OLE DB ADO
سوف تظهر لك نافذة تحديد مزودات الربط بقواعد البيانات ... وبما اننا نستخدم مايكروسوفت اكسس لابد من اختيار
كود
Microsoft Jet 4.0 OLE DB Provider

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_11.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_11.JPG[/IMG]
بعد اختيار المزود للاتصال اضغط على زر Next لكي تظهر لك نافذة تحديد قاعدة البيانات .. قم بتحديد القاعدة التي تم انشاءها مسبقا في بداية الشرح .. من خلال الضغط على الزر المقابل
النص Database Name

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_12.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_12.JPG[/IMG]
بعد تحديد الداتا بيس ..

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_13.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_13.JPG[/IMG]
الان اضغط على زر التالي Next لكي تظهر لك النافذة التالية

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_14.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_14.JPG[/IMG]
دع الخيارات كما هي .. واضغط على كلمه Finish لكي ترجع إلى اول نافذة ومن خلالها يتم اظهار الجداول التي في الداتا بيس ..
قم بتحديد الجدول tbl_Client ثم اضغط على الزر الذي في الاعلى ( <


" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_15.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_15.JPG[/IMG]
لكي تم اختيار الجدول .. ومن ثم اضغط على زر Next لكي تظهر لك نافذة تحديد الاعمدة المراد اظهارها في التقرير

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_16.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_16.JPG[/IMG]
قم بالضغط على زر (<<

لكي تم اضافة كل الاعمدة .. وفي حالة تريد فقط عدد من الاعمدة يمكنك تحديد واحداُ تلوا الآخر ... بعد تحديد الاعمدة .. قم بالضغط على زر التالي Next سوف تظهر
لك نافذة آخرى هنا يتم فيها اذا كنت تريد عمل علاقات او قروب وغيرها .. دعها كما هي اضغط على Next حتى تصل إلى تحديد شكل التقرير ...
سوف تظهر لك نافذة تحديد الثيم للكرستال ريبوت ... اختر اي شكل مناسب لتقريرك ..

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_17.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_17.JPG[/IMG]
ثم بعد ذلك اضغط على زر Finish لكي يتم انشاء التقرير .. ووضع الحقول في التقرير وسوف يكون الشكل النهائي بهذا الشكل ..

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_18.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_18.JPG[/IMG]
وهذا هو شكل التقرير .. وشكله غير مثير للاهتمام .. الان اذهب إلى صفحة الـ Default.aspx وقم بتحديد الاداة CrystalReportViewer1 سوف يظهر لك الوسم الذكي .. على الاداة انتقه واختر
من خلال الـ Choose Report Source

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_18.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_18.JPG[/IMG]
أختر New Report Source لكي تظهر لك نافذة آخرى Create Report Source

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_19.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_19.JPG[/IMG]
دع الاسم الافتراضي كما هو .....وقم بتحديد الكرستال ريبوت الذي انشأناه مسبقا ..

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_20.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_20.JPG[/IMG]
من خلال القائمة المنسدلة .. ثم اضغط على OK

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_21.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_21.JPG[/IMG]
بعد ذلك سوف يتصل التقرير مع الداتا بيس .. وسوف يعرض لك الاعمدة في الجدول ومعها بيانات يتم عرضها لكي يبن لك انه تم الاتصال
ملاحظة يتم ادراج بيانات افتراضية في التقرير .. وليس لها علاقة بالجدول.. ولكن فقط يبين لك شكل التقرير سيكون بهذا الشكل في العرض وعند التشغيل سوف ترى البيانات الفعلية في
الجدول ..

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_22.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_22.JPG[/IMG]
الان لنجرب التقرير ... اذهب من خلال القائمة Build واختر منها Build Solution

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_22.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_22.JPG[/IMG]
بعد ان ترى انه تم Build Succeeded

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_24.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_24.JPG[/IMG]
قم بتشغيل المشروع من خلال الزر للتشغيل

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_25.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_25.JPG[/IMG]
لكي يتم اظهار البيانات الفعلية التي في الجدول المختار ..

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_26.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_26.JPG[/IMG]
الان انتهينا من كل شيء .. ولكن ... السؤال يطرح نفسه .. ماذا لو اردت ان اطبع سجل واحد ؟ ماهي الطريقة ..
وفي هذا الشرح يعرض لنا كل البيانات .. وكذلك الاتصال ليس مربوط بالكود وكذلك قاعدة البيانات .. فهذا يعني عندما تقوم بتشغيل المشروع على جهاز آخر سوف لا يتعرف على الداتا بيس ..
وهذه مشكلة ..
اذا لنقوم بكتابة الكود لكي يكون التقرير ديناميكي .. وليس البيانات تكون فيه Static
اذهب إلى صفحة الـ Default.aspx واضغط دبل كلك على الصفحة لكي تنفتح لك نافذة الكود ...
إذهب مباشرة إلى أعلى صفحة الكود وقم بكتابة هذه التعريفات للاتصال بقواعد البيانات والكرسيتال ريبوت ..
كود
Imports System.Data.OleDb
Imports System.Data
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System.Collections
ثم اذهب الى الـ بيج لود Page_Load وقم بكتابة هذه الكود التالي .. سوف نقوم بالتعديل عليه ..
كود
Dim rpt As New ReportDocument
rpt.Load(Server.MapPath("CrystalReport.rpt"))
Dim db As New OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + Server.MapPath(".\\db1.mdb"))
db.Open()
Dim SQLs As String
SQLs = ""
Dim ad As New OleDbDataAdapter(SQLs, db)
Dim da As New DataSet
ad.Fill(da, "Earth")
rpt.SetDataSource(da)
rpt.PrintOptions.PaperOrientation = CrystalDecisions.Shared.PaperOrientation.DefaultPaperOrientation
CrystalReportViewer1.ReportSource = rpt
db.Close()
ad.Dispose()
da.Dispose()
كما هو موضح ...

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_27.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_27.JPG[/IMG]
لاحظ اخي القارئ .. اننا تركنا هذا المتغير فارغ ..
كود
SQLs = ""
سوف نقوم باخذ جملة الاستعلام من خلال الكرستال ريبوت .. ونضع له شرط ..
الان اجعل الكرستال ريبوت هو المحدد حاليا CrystalReport.rpt ثم من خلال شريط الادوت الذي يكون على اليسار الخاص للكرستال ريبوت Field Explorer

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_28.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_28.JPG[/IMG]
اضغط على Show SQL Query لكي تظهر لك هذه النافذة

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_29.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_29.JPG[/IMG]
قم بنسخ جملة الاستعلام.. لكي نقوم بالتعديل عليها .. الان ارجع إلى صفحة الديفولت .. Default.aspx.vb وقم باسناد جملة الاستعلام إلى المتغير SQLs وسوف نسنده بشرط معين بشرط
رقم الـ ID= 1 لكي يصبح المتغير قيمة المتغير بهذا الشكل
كود
SQLs = "SELECT `tbl_Client`.`ID`, `tbl_Client`.`C_Name`, `tbl_Client`.`C_Phone`, `tbl_Client`.`C_Address`FROM `tbl_Client` `tbl_Client` Where ID=1"
وبهذه الطريقة انتهينا ..
قم بتشغيل التقرير .. لكي يظهر لك فقط سجل واحد .. كما هو مبين ..

" target="_blank" href="http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_30.JPG[/IMG]" target="_blank">http://www.arabmoheet.net/forum/Members_Upload_Pics/34925/Crystal_Report_30.JPG[/IMG]
شرح بعض الاكواد للتوضيح
استخدمنا امر
كود
Imports System.Data.OleDb
Imports System.Data
لتعريف مكتبات الربط بقواعد البيانات
وكذلك اظهار او اتاحة الخصائص للتقرير
كود
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System.Collections
عرفنا متغير من نوع rpt لياخذ خصائص التقرير
كود
Dim rpt As New ReportDocument
rpt.Load(Server.MapPath("CrystalReport.rpt"))
ومن ثم التعرف على مسار التقرير وتحديده .. في الموقع ..
وهنا
كود
Dim db As New OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + Server.MapPath(".\\App_Data\\db1.mdb"))
db.Open()
Dim SQLs As String
SQLs = "SELECT `tbl_Client`.`ID`, `tbl_Client`.`C_Name`, `tbl_Client`.`C_Phone`, `tbl_Client`.`C_Address`FROM `tbl_Client` `tbl_Client` Where ID=1"
قمنا بتعرف متغير للاتصال ومن ثم فتحه .. وعرفنا متغير SQLs لياخذ لكي يتحفظ بقيمة او بالاحرى يخزن جملة الاستعلام في المتغير ..
ومن ثم عرفنا الادبتر .. لكي يتم تنفيد جملة السكيول
وعرفنا الداتا ست لكي ياخذ القيم المرجعه من خلال الادبتر ..
كود
Dim ad As New OleDbDataAdapter(SQLs, db)
Dim da As New DataSet
ad.Fill(da, "tbl_Client")
ثم بعد ذلك اسندنا قيمة الداتا ست إلى التقرير .لياخذ البيانات منها
كود
rpt.SetDataSource(da)
ثم بعد ذلك كتبنا هذا الكود التالي لكي يهيئ التقرير للطباعة بالعرض والطول ..
كود
rpt.PrintOptions.PaperOrientation = CrystalDecisions.Shared.PaperOrientation.DefaultPaperOrientation
ويمكن تجاهل هذا السطر ..
ثم اسندنا لعارض الكرستال ريبوت مصدر الريبوت وهو الـ rpt لكي يتعرف على الريبوت
كود
CrystalReportViewer1.ReportSource = rpt
ومن ثم اغلاق كلاُ من
كود
db.Close()
ad.Dispose()
da.Dispose()
خلاصة الحديث كله .. انه يمكن تمرير جملة SQL للصفحة سواء مشروطه ام بدون شرط سوف تيم تنفيذها وعرضها في التقرير .. وسوف يتم جلب البياانات إلى التقرير سواء سجل واحد او عدة
سجلات على حسب القيمة المرجعة من الاستعلام ..
الان الكود بلغة الـ C#.NET
ضع هذا الكود في اعلى النافذة
كود
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.Collections;
وضع هذا الكود في البيج لود ..
كود
ReportDocument rpt = new ReportDocument();
rpt.Load(Server.MapPath("CrystalReport.rpt"));
String SQLs;
SQLs = "SELECT `tbl_Client`.`ID`, `tbl_Client`.`C_Name`, `tbl_Client`.`C_Phone`, `tbl_Client`.`C_Address`FROM `tbl_Client` `tbl_Client` Where ID=1";
String strConnection = "Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=" + Server.MapPath(".\\App_Data\\db1.mdb");
//create a new OleDbConnection object using the connection string
OleDbConnection objConnect = new OleDbConnection(strConnection);
//open the connection to the database
objConnect.Open();
OleDbDataAdapter ad = new OleDbDataAdapter(SQLs, objConnect);
DataSet da = new DataSet();
ad.Fill(da, "tbl_Client");
rpt.SetDataSource(da);
rpt.PrintOptions.PaperOrientation = CrystalDecisions.Shared.PaperOrientation.DefaultPaperOrientation;
CrystalReportViewer1.ReportSource = rpt;
objConnect.Close();
ad.Dispose();
da.Dispose();
وهذا والله أعلم..
ربي اني لَمَا انزلتَ اليّ من خيرٍ فقير