منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : تمرير صورة الى Crystal Report
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
بسم الله الرحمن الرحيم

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

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


في هذا الموضوع سنقوم بشرح كيفية تمرير صورة كـ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

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

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

تحياتي
بارك الله فيك
يعطيك العافية

مثال جميل
مثال روعة و مفيد جداً, بارك الله فيك و جعله في ميزان حسناتك


السلام عليكم
بارك الله فيك على المشروع الراائع والجمييل
شكرا جداا ليك على المثال طب لو عايز
تقرير كامل اقصد يعنى كل البيانات لكل الصور وليس لسجل واحد فقط
ايه الحل ؟
جزاكـ الله خير استاذ وباركـ الله فيكـ
وجعله الله في ميزان حسناتكـ
وغفر لكـ ولوالديكـ

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

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

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

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

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

تحياتي لك
(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
هنا حضرتكـ تمرر صورة من فولد انا اريد امررها من قاعدة البيانات 
جزاك الله خير 
اعمل على برنامج ادخال بيانات الى قاعدة البيانات من ضمنها صورة 
مواضيعكـ جميعا مفيده لهذا احتفظ بها واقرأها دائما جعلها الله في موازين حسناتكـ
الصفحات : 1 2