تقييم الموضوع :
  • 3 أصوات - بمعدل 3.67
  • 1
  • 2
  • 3
  • 4
  • 5
تمرير صورة الى Crystal Report
#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#.NET

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

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

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


C#.NET
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.NET
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#.NET
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.NET
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#.NET

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.NET

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#.NET

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

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

VB.NET

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 

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

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.NET

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#.NET

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.NET

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#.NET

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.NET

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#.NET

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.NET

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 حيث تأخذ هذه الدالة وسيطين الاول نوع الملف الثاني مسار الملف

والمثال في المرفقات بلغة #C و VB

ولا تنسوني و والدي من صالح دعواتكم


الملفات المرفقة
.zip   DBandCrystal_ExC#.zip (الحجم : 153.13 ك ب / التحميلات : 564)
.zip   DBandCrystal_ExVB.zip (الحجم : 125.18 ك ب / التحميلات : 1,364)
الرد }}}
#2
السلام عليكم

اخواني الاعزاء كانت هنالك بعض الاخطاء في مرفق الـVB لذا أعتذر عن ذلك ,وتم تصحيحها والحمد لله لذا تم تحميل المرفق من جديد

تحياتي
الرد }}}
#3
بارك الله فيك
الرد }}}
تم الشكر بواسطة: 30june , Sajad
#4
يعطيك العافية

مثال جميل
الرد }}}
تم الشكر بواسطة: 30june , Sajad
#5
مثال روعة و مفيد جداً, بارك الله فيك و جعله في ميزان حسناتك


السلام عليكم
الرد }}}
تم الشكر بواسطة: Sajad , 30june
#6
بارك الله فيك على المشروع الراائع والجمييل
الرد }}}
تم الشكر بواسطة: Sajad , rnmr , rnmr
#7
شكرا جداا ليك على المثال طب لو عايز
تقرير كامل اقصد يعنى كل البيانات لكل الصور وليس لسجل واحد فقط
ايه الحل ؟
الرد }}}
تم الشكر بواسطة: Sajad
#8
جزاكـ الله خير استاذ وباركـ الله فيكـ
وجعله الله في ميزان حسناتكـ
وغفر لكـ ولوالديكـ

استاذ شرح ومثال ابداع ما شاءالله تباركـ الرحمن
سؤال استاذ الصراحة انا ما احب الكريستال ريبورت Smile
نصبت فيجوال دوت نت 2012 هل يمكنك شرح الريبورت الي بالفيجوال بحيث امرر صورة مع البيانات وجزاك ربي الجنة
الرد }}}
تم الشكر بواسطة: Sajad
#9
السلام عليكم الله يبارك فيك وجزاك بالمثل

اخي العزيز انا عامل مثال كامل عن الReportViewer تجده على الرابط التالي:

http://vb4arb.com/vb/thread-8050.html

كذلك ستجد كيفية اضافة صورة الى التقرير في الرد التالي:

http://vb4arb.com/vb/thread-8050-post-37...l#pid37521

تحياتي لك
الرد }}}
تم الشكر بواسطة: مبرمج بلا حدود
#10
(20-07-15, 12:16 PM)Sajad كتب : السلام عليكم الله يبارك فيك وجزاك بالمثل

اخي العزيز انا عامل مثال كامل عن الReportViewer تجده على الرابط التالي:

http://vb4arb.com/vb/thread-8050.html

كذلك ستجد كيفية اضافة صورة الى التقرير في الرد التالي:

http://vb4arb.com/vb/thread-8050-post-37...l#pid37521

تحياتي لك

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

جزاكـ الله خير استاذ على الرد ربي يحفظكـ ويرضى عنكـ 
وكل عام وانت بخير وتقبل الله منا ومنك صالح الاعمال 
استاذ هذا الموضوع قرأته 
إقتباس :كذلك ستجد كيفية اضافة صورة الى التقرير في الرد التالي:

http://vb4arb.com/vb/thread-8050-post-37...l#pid37521
هنا حضرتكـ تمرر صورة من فولد انا اريد امررها من قاعدة البيانات 
جزاك الله خير 
اعمل على برنامج ادخال بيانات الى قاعدة البيانات من ضمنها صورة 
مواضيعكـ جميعا مفيده لهذا احتفظ بها واقرأها دائما جعلها الله في موازين حسناتكـ
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الموقع الرسمي لتحميل تقارير كريستال ريبورت Crystal Reports محمد كريّم 6 43,027 26-10-22, 01:56 PM
آخر رد: خالد العصاوي
Exclamation [سؤال] الموقع الرسمي لتحميل تقارير كريستال ريبورت Crystal Reports abarrak 0 1,782 13-03-21, 10:31 PM
آخر رد: abarrak
  [VB.NET] شرح طريقة الطباعة مباشرة بدون Report Viewer youcef3zino 2 5,331 18-12-20, 10:44 PM
آخر رد: a7med saba
  [VB.NET] vb.net 2010 express + Crystal Reports Mokhtar-mako 0 1,580 25-11-20, 11:26 PM
آخر رد: Mokhtar-mako
  سؤال عن تقارير كريستال ريبورت Crystal Reports Yassin246 4 3,567 17-05-20, 03:24 PM
آخر رد: Yassin246
  دورة التقارير في VB.net باستخدام Report Viewer أحمد النجار 8 14,708 13-04-20, 04:58 PM
آخر رد: بسام هزاع
  Report Viewer in VS 2017 Sajad 5 9,175 10-01-19, 03:43 AM
آخر رد: khalidalwdi
  تمرير صورة الى CrystalReport Sajad 22 14,278 02-12-18, 06:32 PM
آخر رد: المتألق9
  درس مبسط :تمرير القيم من برامجنا لتقارير الكريستال ريبورت m.sami.ak 9 11,103 06-02-18, 10:48 AM
آخر رد: KH_Alaswad
  كيفية تمرير البيانات الى Microsoft Report باستخدام الباراميترات Sajad 68 34,475 07-03-17, 10:37 AM
آخر رد: وائل القطاوي

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


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