بسم الله الرحمن الرحيم
وصلى الله على محمد وآله الطاهرين
السلام عليكم ورحمة الله وبركاته
في هذا الموضوع سنقوم بشرح كيفية تمرير صورة كـ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#
VB
ثانيا المتغيرات العامة:
#C
VB
ثالثا: دالة الاتصال بقاعدة البيانات:
#C
VB
رابعا: دالة الاضافة:
#C
VB
خامسا: دالتا تحويل الصورة الى Bytes والعكس:
#C
VB
سادسا: دالة البحث:
#C
VB
الى هنا انتهينا من استعراض الدوال.
واستدعاء هذه الدوال تكون بالشكل التالي:
#C
VB
في البداية نقوم بجلب صورة الموظف ثم نقوم بالاتصال بقاعدة البيانات وبعد ذلك نضيف البيانات الى قاعدة البيانات بحيث نقوم في البداية تحويل الصورة الى Bytes ومن ثم نمررها الى الدالة مع الاسم لتضاف الى قاعدة البيانات.
واذا اردنا البحث نستدعي دالة البحث مع تمرير اسم الموظف اليها ليتم عرض بيانات الموظف وفي دالة البحث نستدعي دالة تحويل الـBytes الىImage كما هو موضح من خلال الاكواد.
أخيرا التقرير وتصدير التقرير الى ملف Pdf
#C
VB
طبعا تمرير البيانات ستكون من خلال الدالة SetParameterValue
كما تلاحظون نقوم بتعريف كائن MemoryStream لخزن الصورة في الذاكرة وبعد ذلك نقوم بحفظ الصورة في مجلد Pics في القرص C (طبعا مسار الصورة تستطيع تغييرها كما تريد)
وبد ذلك نمرر مسار الصورة الى التقرير وبعد ذلك نحذف الصورة
وأخيرا تصدير التقرير الى ملف Pdf
#C
VB
والتصدير سهل جدا من خلال الدالة ExportToDisk حيث تأخذ هذه الدالة وسيطين الاول نوع الملف الثاني مسار الملف
الامثلة
وصلى الله على محمد وآله الطاهرين
السلام عليكم ورحمة الله وبركاته
في هذا الموضوع سنقوم بشرح كيفية تمرير صورة كـ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 String, img 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 sender, EventArgs e)
{
if (OFDialog.ShowDialog() == DialogResult.OK)
{
imgPath = OFDialog.FileName;
PicBox.Image = Image.FromFile(imgPath);
}
}
private void Connect_btn_Click(object sender, EventArgs e)
{
if (Connect())
{
MessageBox.Show("تم الاتصال بنجاح", "حالة الاتصال");
}
else
{
MessageBox.Show("فشل الاتصال","حالة الاتصال");
}
}
private void Inser_btn_Click(object sender, EventArgs e)
{
string EmpName = Name_txt.Text;
byte[] imgbytes = ConvertToByte(imgPath);
Insert(EmpName, imgbytes);
}
private void Srch_btn_Click(object sender, EventArgs e)
{
DoSearch(Srch_cbx.Text);
}
VB
PHP كود :
Private Sub Browse_btn_Click(sender As Object, e As 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 Object, e As EventArgs)
If Connect() Then
MessageBox.Show("تم الاتصال بنجاح", "حالة الاتصال")
Else
MessageBox.Show("فشل الاتصال", "حالة الاتصال")
End If
End Sub
Private Sub Inser_btn_Click(sender As Object, e As EventArgs)
Dim EmpName As String = Name_txt.Text
Dim imgbytes As Byte() = ConvertToByte(imgPath)
Insert(EmpName, imgbytes)
End Sub
Private Sub Srch_btn_Click(sender As Object, e As EventArgs)
DoSearch(Srch_cbx.Text)
End Sub
في البداية نقوم بجلب صورة الموظف ثم نقوم بالاتصال بقاعدة البيانات وبعد ذلك نضيف البيانات الى قاعدة البيانات بحيث نقوم في البداية تحويل الصورة الى Bytes ومن ثم نمررها الى الدالة مع الاسم لتضاف الى قاعدة البيانات.
واذا اردنا البحث نستدعي دالة البحث مع تمرير اسم الموظف اليها ليتم عرض بيانات الموظف وفي دالة البحث نستدعي دالة تحويل الـBytes الىImage كما هو موضح من خلال الاكواد.
أخيرا التقرير وتصدير التقرير الى ملف Pdf
#C
PHP كود :
private void Report_btn_Click(object sender, EventArgs 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(m, System.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 Object, e As 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(m, System.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 sender, EventArgs e)
{
SFDialog.Filter = "Pdf Files|*.pdf";
if (SFDialog.ShowDialog() == DialogResult.OK)
{
report.ExportToDisk(ExportFormatType.PortableDocFormat, SFDialog.FileName);
MessageBox.Show("تم تصدير التقرير بنجاح","تصدير");
}
}
VB
PHP كود :
Private Sub ExportToPdf_btn_Click(sender As Object, e As EventArgs)
SFDialog.Filter = "Pdf Files|*.pdf"
If SFDialog.ShowDialog() = DialogResult.OK Then
report.ExportToDisk(ExportFormatType.PortableDocFormat, SFDialog.FileName)
MessageBox.Show("تم تصدير التقرير بنجاح", "تصدير")
End If
End Sub
والتصدير سهل جدا من خلال الدالة ExportToDisk حيث تأخذ هذه الدالة وسيطين الاول نوع الملف الثاني مسار الملف
الامثلة