تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
تمرير صورة الى CrystalReport
#1
بسم الله الرحمن الرحيم

وصلى الله على محمد وآله الطاهرين

السلام عليكم ورحمة الله وبركاته


في هذا الموضوع سنقوم بشرح كيفية تمرير صورة كـParameter الى تقرير CrystalReport بصورة سهلة ومبسطة ان شاءالله وبلغتي #C و VB وقاعدة بيانات Access2007

كثير منا يواجه مشكلة مع التقارير وخاصة مع كيفية عرض صورة محددة من قبل المستخدم عن طريق الـParameter في التقرير ,اذ لا يوجد Parameter من نوع صورة أو Binary في تقارير CrystalReport أو MicrosoftReport يمكننا من استقبال صورة مرسلة عن طريق Parameter الى التقرير ,لذا الحل الوحيد هو تمرير مسار الصورة الى Parameter نصي ومن ثم اسناد هذا الـParameter الى كائن الصورة في التقرير لكي نتمكن من عرض الصورة في التقرير ,وهذا ما سنفعله تماما ان شاءالله في درسنا هذا.

الفكرة كما بينا هي تمرير مسار الصورة الى Parameter نصي وقبل ذلك نسند هذا الـParameter كموقع للصورة الى كائن الـOleObject في التقرير بهذه الطريقة نتمكن ممن عرض صورة محدد من قبل المستخدم.

وهنا ستسألني أليست الصورة مخزنة في قاعدة بيانات؟ أقول: نعم. وتقول لي اذا كيف ستمررها الى التقرير؟ أقول: سوف اقوم بجلب الصورة من قاعدة البيانات واعرضها في أداة PictureBox ومن ثم أقوم بخزن الصورة في مسار معين ثابت ومن ثم امرر مسار الصورة الى التقرير وأخيرا أقوم بمسح الصورة من ذلك المسار.

بسم الله نبدأ

أولا نقوم بانشاء قاعدة بيانات Access2007 باسم myDB وننشئ ثلاث حقول على التوالي: Emp_ID, Emp_Name, Emp_Image
Emp_ID=ترقيم تلقائي
Emp_Name=نص
Emp_Image=كائن OLE

ثم نقوم بتصميم المشروع كالتالي:



ومن خلال شريط القوائم نختار Project ثم Add New Item ثم Reporting ونضيف تقرير CrystalReport فارغ الى المشروع ,ومن خلال الToolBox نضيف ثلاث باراميترات باسماء: Emp_ID, Emp_Name, picPath على التوالي الى تقرير عن طريق Parameter Fields ,انظر الى الصورة التالية:



بعد اضافة الثلاث باراميترات نسحب الباراميتر الاول والثاني الى التقرير

ثم نضيف كائن OLE الى تقرير بالشكل التالي: كلك أيمن على التقرير ثم Insert ثم OLEObject فتظهر لنا النفاذة التالية:



ومن ثم كلك أيمن على الكائن ثم نختار Format Object ستظهر لنا نافذة ومن خلال التبويب Picture نسند الباراميتر الثالث الى الكائن كما في الشكل التالي:



ثم



ثم Save and Close

الى هنا انتهينا من تصميم التقرير. الان نأتي الى كتابة الاكواد:

اولا نضيف مجالات الاسماء الاتية:

C#
PHP كود :
using System.IO;
using System.Data.OleDb;
using CrystalDecisions.Shared

VB
PHP كود :
Imports System.IO
Imports System
.Data.OleDb
Imports CrystalDecisions
.Shared 

ثانيا المتغيرات العامة:

#C
PHP كود :
private string conStr "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\myDB.accdb;Persist Security Info=False;";
 
       private OleDbConnection myCon;
 
       private OleDbDataAdapter myAdapter;
 
       private OleDbCommandBuilder myCmdBuilder;
 
       private DataTable myTable;
 
       private DataSet mySet;
 
       private DataRow myRow;
 
       private string imgPath;
 
       private myReport report

VB
PHP كود :
Private conStr As String "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\myDB.accdb;Persist Security Info=False;"
        
Private myCon As OleDbConnection
        
Private myAdapter As OleDbDataAdapter
        
Private myCmdBuilder As OleDbCommandBuilder
        
Private myTable As DataTable
        
Private mySet As DataSet
        
Private myRow As DataRow
        
Private imgPath As String
        
Private report As myReport 

ثالثا: دالة الاتصال بقاعدة البيانات:

#C
PHP كود :
private bool Connect()
 
       {
 
           myCon = new OleDbConnection(conStr);
 
           myAdapter = new OleDbDataAdapter("select * from Emp"myCon);
 
           myCmdBuilder = new OleDbCommandBuilder(myAdapter);

 
           try
            
{
 
               myCon.Open();
 
               mySet = new DataSet("Emp");
 
               myAdapter.Fill(mySet"Emp");
 
               myTable mySet.Tables["Emp"];

 
               ///////////////////////////////////
 
               dataGridView1.DataSource myTable;
 
               Srch_cbx.DataSource myTable;
 
               Srch_cbx.DisplayMember "Emp_Name";
 
               ///////////////////////////////////

 
               return true;
 
           }
 
           catch (Exception ex)
 
           {
 
               MessageBox.Show(ex.Message);
 
               return false;
 
           }
 
           finally
            
{
 
               myCon.Close();
 
           }
 
       

VB
PHP كود :
Private Function Connect() As Boolean
            myCon 
= New OleDbConnection(conStr)
            
myAdapter = New OleDbDataAdapter("select * from Emp"myCon)
            
myCmdBuilder = New OleDbCommandBuilder(myAdapter)

            Try
                
myCon.Open()
                
mySet = New DataSet("Emp")
                
myAdapter.Fill(mySet"Emp")
                
myTable mySet.Tables("Emp")

                
'''////////////////////////////////
                dataGridView1.DataSource = myTable
                Srch_cbx.DataSource = myTable
                Srch_cbx.DisplayMember = "Emp_Name"
                '''
////////////////////////////////

                
Return True
            
Catch ex As Exception
                MessageBox
.Show(ex.Message)
                Return 
False
            
Finally
                
myCon.Close()
            
End Try
        
End Function 

رابعا: دالة الاضافة:

#C
PHP كود :
private bool Insert(string name,byte[]img)
 
       {
 
           try
            
{
 
               myRow myTable.NewRow();
 
               myRow["Emp_Name"] = name;
 
               myRow["Emp_Image"] = img;
 
               myTable.Rows.Add(myRow);
 
               myAdapter.Update(myTable);
 
               return true;
 
           }
 
           catch
            
{
 
               return false;
 
           }
 
       

VB
PHP كود :
Private Function Insert(name As Stringimg As Byte()) As Boolean
            
Try
                
myRow myTable.NewRow()
                
myRow("Emp_Name") = name
                myRow
("Emp_Image") = img
                myTable
.Rows.Add(myRow)
                
myAdapter.Update(myTable)
                Return 
True
            
Catch
                Return 
False
            End 
Try
        
End Function 

خامسا: دالتا تحويل الصورة الى Bytes والعكس:

#C
PHP كود :
private byte[] ConvertToByte(string imgFile)
 
       {
 
           return File.ReadAllBytes(imgFile);
 
       }

 
       private Image ConvertToImage(byte[] imgBytes)
 
       {
 
           return Image.FromStream(new MemoryStream(imgBytes));
 
       

VB
PHP كود :
Private Function ConvertToByte(imgFile As String) As Byte()
            Return 
File.ReadAllBytes(imgFile)
        
End Function

        Private Function 
ConvertToImage(imgBytes As Byte()) As Image
            
Return Image.FromStream(New MemoryStream(imgBytes))
        
End Function 

سادسا: دالة البحث:

#C
PHP كود :
private bool DoSearch(string empname)
 
       {
 
           try
            
{
 
               myRow = (DataRow)myTable.Select("Emp_Name like '%" empname "%'").GetValue(0);
 
               ID_txt.Text myRow["Emp_ID"].ToString();
 
               Name_txt.Text myRow["Emp_Name"].ToString();
 
               PicBox.Image ConvertToImage((byte[])myRow["Emp_Image"]);
 
               return true;
 
           }
 
           catch
            
{
 
               return false;
 
           }
 
       

VB
PHP كود :
Private Function DoSearch(empname As String) As Boolean
            
Try
                
myRow DirectCast(myTable.[Select]("Emp_Name like '%" empname "%'").GetValue(0), DataRow)
                
ID_txt.Text myRow("Emp_ID").ToString()
                
Name_txt.Text myRow("Emp_Name").ToString()
                
PicBox.Image ConvertToImage(DirectCast(myRow("Emp_Image"), Byte()))
                Return 
True
            
Catch
                Return 
False
            End 
Try
        
End Function 

الى هنا انتهينا من استعراض الدوال.

واستدعاء هذه الدوال تكون بالشكل التالي:

#C
PHP كود :
private void Browse_btn_Click(object senderEventArgs e)
 
       {
 
           if (OFDialog.ShowDialog() == DialogResult.OK)
 
           {
 
               imgPath OFDialog.FileName;
 
               PicBox.Image Image.FromFile(imgPath);
 
           }
 
       }

 
       private void Connect_btn_Click(object senderEventArgs e)
 
       {
 
           if (Connect())
 
           {
 
               MessageBox.Show("تم الاتصال بنجاح""حالة الاتصال");
 
           }
 
           else
            
{
 
               MessageBox.Show("فشل الاتصال","حالة الاتصال");
 
           }
 
       }

 
       private void Inser_btn_Click(object senderEventArgs e)
 
       {
 
           string EmpName Name_txt.Text;
 
           byte[] imgbytes ConvertToByte(imgPath);
 
           Insert(EmpNameimgbytes);
 
       }

 
       private void Srch_btn_Click(object senderEventArgs e)
 
       {
 
           DoSearch(Srch_cbx.Text);
 
       

VB
PHP كود :
Private Sub Browse_btn_Click(sender As ObjectAs EventArgs)
            If 
OFDialog.ShowDialog() = DialogResult.OK Then
                imgPath 
OFDialog.FileName
                PicBox
.Image Image.FromFile(imgPath)
            
End If
        
End Sub

        
Private Sub Connect_btn_Click(sender As ObjectAs EventArgs)
            If 
Connect() Then
                MessageBox
.Show("تم الاتصال بنجاح""حالة الاتصال")
            Else
                
MessageBox.Show("فشل الاتصال""حالة الاتصال")
            
End If
        
End Sub

        
Private Sub Inser_btn_Click(sender As ObjectAs EventArgs)
            
Dim EmpName As String Name_txt.Text
            Dim imgbytes 
As Byte() = ConvertToByte(imgPath)
            
Insert(EmpNameimgbytes)
        
End Sub

        
Private Sub Srch_btn_Click(sender As ObjectAs EventArgs)
            
DoSearch(Srch_cbx.Text)
        
End Sub 

في البداية نقوم بجلب صورة الموظف ثم نقوم بالاتصال بقاعدة البيانات وبعد ذلك نضيف البيانات الى قاعدة البيانات بحيث نقوم في البداية تحويل الصورة الى Bytes ومن ثم نمررها الى الدالة مع الاسم لتضاف الى قاعدة البيانات.
واذا اردنا البحث نستدعي دالة البحث مع تمرير اسم الموظف اليها ليتم عرض بيانات الموظف وفي دالة البحث نستدعي دالة تحويل الـBytes الىImage كما هو موضح من خلال الاكواد.

أخيرا  التقرير وتصدير التقرير الى ملف Pdf

#C
PHP كود :
private void Report_btn_Click(object senderEventArgs e)
 
       {
 
           report = new myReport();
 
           report.SetParameterValue("Emp_ID"ID_txt.Text);
 
           report.SetParameterValue("Emp_Name"Name_txt.Text);

 
           MemoryStream m = new MemoryStream();
 
           PicBox.Image.Save(mSystem.Drawing.Imaging.ImageFormat.Jpeg);
 
           File.WriteAllBytes("C:\\Pics\\t.jpg"m.ToArray());
 
           report.SetParameterValue("picPath""C:\\Pics\\t.jpg");
 
           
            crystalReportViewer1
.ReportSource report;
 
           crystalReportViewer1.Refresh();
 
           File.Delete("C:\\Pics\\t.jpg");
 
       

VB
PHP كود :
Private Sub Report_btn_Click(sender As ObjectAs EventArgs)
    
            
report = New myReport()
            
report.SetParameterValue("Emp_ID"ID_txt.Text)
            
report.SetParameterValue("Emp_Name"Name_txt.Text)

            
Dim m As New MemoryStream()
            
PicBox.Image.Save(mSystem.Drawing.Imaging.ImageFormat.Jpeg)
            
File.WriteAllBytes("C:\Pics\t.jpg"m.ToArray())
            
report.SetParameterValue("picPath""C:\Pics\t.jpg")

            
crystalReportViewer1.ReportSource report
            crystalReportViewer1
.Refresh()
            
File.Delete("C:\Pics\t.jpg")

        
End Sub 

طبعا تمرير البيانات ستكون من خلال الدالة SetParameterValue

كما تلاحظون نقوم بتعريف كائن MemoryStream لخزن الصورة في الذاكرة وبعد ذلك نقوم بحفظ الصورة في مجلد Pics في القرص C (طبعا مسار الصورة تستطيع تغييرها كما تريد)
وبد ذلك نمرر مسار الصورة الى التقرير وبعد ذلك نحذف الصورة

وأخيرا تصدير التقرير الى ملف Pdf

#C
PHP كود :
private void ExToPdf_btn_Click(object senderEventArgs e)
 
       {
 
           SFDialog.Filter "Pdf Files|*.pdf";
 
           if (SFDialog.ShowDialog() == DialogResult.OK)
 
           {
 
               report.ExportToDisk(ExportFormatType.PortableDocFormatSFDialog.FileName);
 
               MessageBox.Show("تم تصدير التقرير بنجاح","تصدير");
 
           }
 
       

VB
PHP كود :
Private Sub ExportToPdf_btn_Click(sender As ObjectAs EventArgs)
            
SFDialog.Filter "Pdf Files|*.pdf"
            
If SFDialog.ShowDialog() = DialogResult.OK Then
                report
.ExportToDisk(ExportFormatType.PortableDocFormatSFDialog.FileName)
                
MessageBox.Show("تم تصدير التقرير بنجاح""تصدير")
            
End If
        
End Sub 

والتصدير سهل جدا من خلال الدالة ExportToDisk حيث تأخذ هذه الدالة وسيطين الاول نوع الملف الثاني مسار الملف

الامثلة


المثال بلغة VB.NET

ولا تنسوني و والدي من صالح دعواتكم
الرد }}}
#2
[COLOR="#FF0000"]يجب أن تضع للبعض سمعات قبل إعطائها إلى sajad مرة أخرى.
[/COLOR]


السلام عليكم ورحمة الله وبركاته






ما شاء الله تبارك الله

أسأل الله يزيدك من علمه لما تقدمه من نفع للجميع





السلام عليكم ورحمة الله وبركاته
الرد }}}
تم الشكر بواسطة:
#3
جزاك الله خير على الشرح الرائع وجعله بميزان حسناتك
الرد }}}
تم الشكر بواسطة:
#4
السلام عليكم

إقتباس :ما شاء الله تبارك الله

أسأل الله يزيدك من علمه لما تقدمه من نفع للجميع

الله يبارك بيك ابو رائد آمين أجمعين يارب

إقتباس :جزاك الله خير على الشرح الرائع وجعله بميزان حسناتك

وجزيت بالمثل شكرا على المرور ان شاءالله تكون الموضوع ذا فائدة للجميع

موفقين ان شاءالله
الرد }}}
تم الشكر بواسطة:
#5
السيد الفاضل صاحب الموضوع ما زلنا ننتظر الموضوع في بي للعلم معظم الناس والمعاهد التعليمية تغمل بي في بي وليس سي شارب
الرد }}}
تم الشكر بواسطة:
#6
السلام عليكم

أخي العزيز كما ترى الموضوع بلغتي الـ#c و الـvb تستطيع من خلال أكواد الـ vb أن تصنع مثال بنفسك
قريبا ان شاءالله ساقوم بوضع المثال بالـvb
الرد }}}
تم الشكر بواسطة:
#7
فريد دائما
الرد }}}
تم الشكر بواسطة:
#8
السلام عليكم

المثال بلغة الـvb في المرفقات


الملفات المرفقة
.zip   DBandCrystal_ExVB.zip (الحجم : 100.4 ك ب / التحميلات : 172)
الرد }}}
تم الشكر بواسطة: Amir_Alzubidy
#9
جزاك الله خير على الشرح الرائع وجعله بميزان حسناتك
الرد }}}
تم الشكر بواسطة:
#10
السلام عليكم

إقتباس :جزاك الله خير على الشرح الرائع وجعله بميزان حسناتك

وجزاك بالمثل يعطيك العافية
الرد }}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم