بسم الله الرحمن الرحيم
كثرت الأحاديث عن موضوع ربط الريبورت من نوع Crystal Report بقاعدة بيانات وإحضار البيانات من القاعدة من خلال الكود ومن ثم إعطاء هذه البيانات للريبورت,,,
والحقيقة أنني ما وجدت أي درس يعلمني شخصيا - وأنا كنت أكره الكريستال أيام vb5.0 - كيف أعمل ريبورت متخصص custom report, وأربطه بمحرك بيانات من نوع Adodb.Recordset أو من أي نوع آخر, وكانت النتيجة أنني كنت بين نارين, فإما أن أعمل برامجي بالدوت نت وأعمل تقاريري بـ vb98, أو أن أعمل برامجي بالكامل بـ vb98,,,
ومع نفسي وبعد تعب ما يقرب من أسبوع, وجدت طريقة , هي غير مباشرة, وربما غير سريعة , وهي بالتأكيد غير الطريقة الطبيعية التي يتعامل معها الريبورت, ولكنها تمتاز بأنها طريقة يدوية, وهو ما يريح مبرمج مثلي يحب أن يتحكم في كل شيء,,,
المهم نبدأ على بركة الله, نعمل مشروع جديد من نوع WindowsApplication ونحفظه في أي مجلد ثم ننشئ قاعدة بياناتنا , وستكون في هذا المثال من نوع MSAccess database, ونضع فيها جدولا باسم Table1, وفيه الحقول التالية:
1- ID ويكون من نوع ترقيم تلقائي
2- uname ويكون من نوع نص
3- uPass ويكون من نوع نص
4- notes ويكون من نوع نص
كما ترون جدول عادي جدا, وشائع في البرامج العادية, والآن نتجه لقائمة Project ثم نختر Add new Item , أو نضغط على الأزرار ctrl+shift+a
ومن الأدوات المتاحة نختر أداة Dataset ونسميها Dataset1,,,
الأمر في غاية البساطة حتى الآن, والآن حان دور رسم جدول تخيلي بداخل الأداة Dataset1 يشبه تماما الجدول الموجود فعليا في قاعدة بياناتنا,,,
من نافذة Data Sources التي يمكن عرضها من قائمة Data ثم نختر Show data sources , أو نضغط Shift+Alt+D, سنجد أن أداة DataSet1 قد تم إضافتها للـ Data Sources ببرنامجك نضغط عليها Right Click ثم نختر Edit Dataset With Designer , سنجد أن الأدوات في toolbox قد تغيرت نختر منها أداة DataTable ثم نسحبها للـ designer window.
سنجد أن الجدول قد تم سحبه لنافذة التصميم نضغط عليه Right Click ثم نختر Add , ومنها Column, ونكتب اسم أول حقل لدينا في جدول Table1 الذي أنشأنها مسبقا في Access وهو الحقل ID.
ثم نكرر العملية السابقة حتى نضيف كل الحقول التي صنعناها في الجدول الأصلي, حتى ننتهي وسنسمي الجدول التخيلي بـ dataTable1,,,
والآن أصبحت الـ dataset جاهزة لتكوين تقرير كريستال, من قائمة Project نختر Add new item, ثم نختر تقرير كريستال ريبورت ونسميه CrystalReport1
من قائمة Choose an expert نختر Standard ثم نضغط OK.
من قائمة Available data sources نختر مجلد Project date, ثم ADO.NET DataSets, ثم yourprojectname.DataSet1 ونضيفها لقائمة Selectd Tables, ثم نضغط Next.
نضيف جميع الحقول الموجودة في Available Fields إلى قائمة Feilds to Display,
ثم نضغط next عدد من المرات حتى نصل لنافذة Report Styles, ونختر التنسيق الذي نحبه, ثم نضغط Finish نجد أن البرنامج قام بتنفيذ تصميم الريبورت, ويمكنك أن تضيف وتحذف منه ما تشاء,,,
والآن نريد أن نعرض في هذا التقرير البيانات التي استدرجناها من قاعدة البيانات نذهب إلى نافذة النموذج Form1 ونضيف لها أداة CrystalReportViewer, ونسميها CrystalReportViewer1.
ثم ندخل إلى الكود ونبدأ في حدث Form_Load()...
وقبل أن نكتب أي شيء نذهب من قائمة Project ونختر Add reference ونضيف مرجع adodb...
نعود الآن لنافذة الكود ونبدأ بتصميم الكود, في البداية نقوم بفتح جدول Table1 من قاعدة بيانات data التي صممناها ببرنامج Access في بداية الدرس, وذلك عن طريق الكود التالي:
Dim Con As New ADODB.Connection
Dim Rs As New ADODB.Recordset
Con.Open("Driver={Microsoft Access Driver (*.mdb)};dbq=" & Application.StartupPath & "\data.mdb;")
Rs.Open("SELECT * FROM table1;", Con, 3, 3)حسنا الآن فتحنا الجدول ووضعناه في كائن Adodb.RecordSet وحان وقت تفريغ كائن البيانات منه إلى كائن من نوع System.Data.DataTable, ونعلن عنه كالتالي,,,
Dim SDT As New System.Data.DataTable
والآن وقد أنشأنا الكائن يأتي وقت إنشاء حقوله Feilds ليشبه تماما حقول الجدول الموجود في قاعدة بيانات Access, وذلك كالتالي:
SDT.TableName = "anyname" For I = 0 To Rs.Fields.Count - 1 SDT.Columns.Add(Rs.Fields(I).Name) SDT.Columns(SDT.Columns.Count - 1).AllowDBNull = False Next
والآن وقد أنشأنا الحقول حان وقت إنشاء الصفوف أو records , ويكون ذلك كالتالي:
Dim I2 As Int16 For I = 0 To Rs.RecordCount - 1 Dim S(Rs.Fields.Count) As String For I2 = 0 To Rs.Fields.Count - 1 S(I2) = Rs(I2).Value Next SDT.Rows.Add(S) System.Array.Clear(S, 0, S.Length) Rs.MoveNext() Next
والآن أصبحت كل بياناتنا في كائن System.data.datatable حان وقت إغلاق كائن Adodb.Recordset
Rs.Close()
والآن نعلن عن متغير يحمل بيانات التقرير الذي أنشأناه ويكون كالتالي:
Dim Rpt As New CrystalReport1
ثم نضع البيانات فيه, ثم نعرضه من خلال الأداة CrystalReportViewer, كالتالي:
Rpt.SetDataSource(SDT) CrystalReportViewer1.ReportSource = Rpt
وهكذا أنتهى التقرير المتخصص , ويمكنك بالطبع تغيير قاعدة البيانات من Access إلى أي نوع آخر تحبه, وأنا شخصيا عملته على Mysql Server..
بالمرفقات المثال الفعلي للشرح السابق,,,
أرجو أن يكون الدرس نافعا, وأن ينفع به أخوتي آمين
تحياتي