تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
#The simplest way to make a report in C
#1
[COLOR="#FF0000"]بسم الله الرحمن الرحيم
((رب اشرح لي صدري ويسر لي امري واحلل عقدة من لساني يفقهوا قولي))
صدق الله العلي العظيم
[/COLOR]



[COLOR="#800080"]السلام عليكم ورحمة الله وبركاته
سنتعلم في هذا الموضوع كيفية بناء تقارير في الVS2010 بلغة الC# خطوة خطوة وبالصور و بطريقة سهلة ان شاء الله ,وأنا اعلم أن هنالك الكثير من المقالات حول صناعة التقارير في هذا المنتدى لكن اغلبها بلغة الVB.Net وقلما تجد مقالة تتحدث عن التقارير بلغة الC#.NET ,لهذا كتبت هذه المقالة حول بناء التقارير بلغة الC# مع قاعدة بيانات SQL Server 2008 R2 والCrystal Report.
اولا عليكم بتنزيل برنامج الSAP Crystal Reports, version for vs2010 من هذا الرابط:http://www.businessobjects.com/jump/xi/c...efault.asp

ثانيا ولسبب فصل Microsoft برنامج التقارير عن برنامج الvs2010 ظهرت هنالك مشاكل تتعلق بتشغيل ادوات الCrystal report فعليك اولا قراءة هذا المقال حول كيفية حل هذه المشاكل للاخ حماده عمارة مشكورا على هذا الرابط: [url]http://vb4arb.com/vb/showthread.php?1506-%C7%E1%CD%E1-%C7%E1%C7%CE%ED%D1-%E6%C7%E1%E3%CC%D1%C8-%E1%E3%D4%C7%DF%E1-%C7%E1%DF%D1%ED%D3%CA%C7%E1-2010
[/url]

بسم الله نبدأ
[/COLOR]


[COLOR="#800080"]سنركز على ثلاثة محاور في هذا الموضوع في كيفية بناء التقارير:

اولا: طباعة صف واحد فقط يحدده المستخدم من ال.Datagridview
ثانيا: طباعة الصفوف المحددة فقط في الDatagridview من قبل المستخدم.
ثالثا: طباعة جميع الصفوف الموجودة في الجدول.

اولا: طباعة صف واحد يحدده المستخدم:
المعنى واضح حيث سيقوم المستخدم عن طريق الMouse بتحديد عنصر معين او صف معين لكي يقوم بطباعته

الان تابع معي هذه الخطوات:

1- نفتح برنامج الSQL Server 2008 R2 ثم نقوم باضافة قاعدة بيانات جديدة عن طريق الDatabase ثم New database باسم stdnames ونضغط على اشارة الزائد من الstdnames ونختار Tables ثم NewTable ونضيف الحقول التالية (id, name, age) ونخزن الجدول باسم names كما في الصورة:
[/COLOR]



بعد ذلك نقوم بRightClick على dbo.names من الTables للsdtnames ونختار Edit Top 200 Rows لكي نضيف البيانات الى الجدول فتكون بالشكل التالي:


[COLOR="#800080"]طبعا هذه البيانات المدخلة افتراضية لغرض التعلمSmile
الان نذهب الى هذا المسار: C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA
ونقوم بنسخ الملفين stdnames و stdnames_log الى مخرجات البرنامج.
الى هنا انتهينا من عمل الجدول ,والان سننتقل الى الVS2010 حيث نفتح مشروع جديد ونقوم بتسميته Printing Report نقوم باضافة الادوات اللازمة الى الفورم فتكون كما في الصورة:
[/COLOR]


[COLOR="#800080"]
1-فتح الاتصال مع قاعدة البيانات
2-لعرض البيانات في الDataGridview
3-لطباعة عنصر واحد فقط
4-لطباعة اما كل الصفوف وذلك اذا حدد المستخدم All او الصفوف المحددة اذا حدد المستخدم Only selected




2-اضافة CrystalReport.rpt لطباعة صف واحد فقط
لعمل ذلك اتبع الصور الاتية:[/COLOR]



بعد الضغط على Add نضغط OK ثم Finish لتظهر لنا الصورة التالية:


من الParameter Fields نضيف ثلاثة حقول وذلك بRightClick على ParameterFields ثم New ثم تقوم بتسمية الباراميتر باسماء الحقول التي تريد طباعتها او اسماء مشابهة بعد ذلك عن طريق الMouse نعمل Drag&Drop للباراميترات ونضيفها الى الSection3(Details) ,انظر الى الصورة التالية:


[COLOR="#800080"]الى هنا انتهينا من تهيئة التقرير لطباعة بيانات صف واحد فقط.

الان نضيف Form جديد ونسميه PrintOneForm ونضيف الاداة CrystalReportViewer اليه ونغير خاصية الModifire للاداة الى Public
ثم نكتب الكود الاتي في الPrintOne[/COLOR]


PHP كود :
//لاختيار الصف المحدد
            
DataGridViewRow r dataGridView1.CurrentRow;
            
//لاختيار الخلية المحددة للصف المحدد من قبل المستخدم
            
int id = (int)r.Cells["id"].Value;
            
string name = (string)r.Cells["name"].Value;
            
int age = (int)r.Cells["age"].Value;
           
            
//////////////////////////////////////////////////////////////

            //انشاء instance من PrintOneForm          
            
PrintOneForm pof = new PrintOneForm();
            
//انشاء instanceمن التقرير
            
PrintOneReport por = new PrintOneReport();
            
//ارسال البيانات الى التقرير عن طريق دالة الSetParameterValue 
            
por.SetParameterValue("id"id);
            
por.SetParameterValue("name"name);
            
por.SetParameterValue("age"age);
            
//ربط التقرير باداة الReportViewer
            
pof.crystalReportViewer1.ReportSource por;
            
pof.Show(); 

وتكون كود الConnectكالآتي:

PHP كود :
private void Connectbtn_Click(object senderEventArgs e)
        {
            if (
Table())
            {
                
MessageBox.Show("Connection succeed");
            }
            else
            {
                
MessageBox.Show("Connection failed");
            }
        } 

دالة الTable:

PHP كود :
public bool Table()
        {
            
sqlcon = new SqlConnection(constr);
            
sqladpt = new SqlDataAdapter(selectsqlcon);
            
/////////////////////////////////////////
            
try
            {
                
sqlcon.Open();
                
myset = new DataSet();
                
sqladpt.Fill(myset);
                
mytable myset.Tables[0];
                return 
true;
            }
            catch(
Exception ex)
            {
                
MessageBox.Show(ex.Message);
                return 
false;
            }
            finally
            {
                
sqlcon.Close();
            }
        } 

كود اظهار البيانات في الDatagridview

PHP كود :
private void Showbtn_Click(object senderEventArgs e)
        {
            
dataGridView1.DataSource mytable;
        } 

متغيرات عامة:

PHP كود :
string constr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|stdnames.mdf;integrated security=true;Connect Timeout=30;";
        
string select "select * from names";
        
SqlConnection sqlcon;
        
SqlDataAdapter sqladpt;
        
DataTable mytable,t;
        
DataSet myset;
        
DataRow rowr;
        
DataColumn c


[COLOR="#800080"]ثانيا وثالثا : طباعة الصفوف التي يحددها المستخدم او طباعة كل الصفوف في الجدول

1- نضيف CrystalReport.rpt جديد كما في الصورة الرابعة ونقوم بتسميته PrintAllReport و بعد الضغط على Add ثم Ok نعمل كما في الصورة التالية:[/COLOR]


[COLOR="#800080"]
حيث نختار Create New Connection ثم OLE DB(ADO) فتظهر لنا الصورة التالية:[/COLOR]




بعد اختيار Next نفعل كما الصورة التالية:

[COLOR="#800080"]
1-نختار اسم الserver
2-نختار integrated security في حالة عدم وجود username and password اما غير ذلك نكتب الاسم والرقم السري بدون اختيار الIntegrated Security
3-اختيار قاعدة البيانات
ثم Next وFinish
الان تظهر لنا هذه الصورة :
[/COLOR]



[COLOR="#800080"]نفعل تماما كما في الصورة اعلاه

ثم نفعل كما في الصورة التالية طبعا بعد الضغط على Next Smile[/COLOR]




ثم Next فتظهر لنا التقرير بهذه الصورة


[COLOR="#800080"]كما تلاحظون ان الباراميترات اضيفت تلقائيا الى التقريرSmile

نضيف Form جديد ونسميه PrintAllForm ونضيف عليه اداة الCrystalReportViewer ونجعل خاصية Modifireللاداة Public
ثم نكتب الكود الاتي في الPrintAll [/COLOR]


PHP كود :
private void PrintAllbtn_Click(object senderEventArgs e)
        {
            
PrintAllForm paf = new PrintAllForm();
            
PrintAllReport par = new PrintAllReport();
            
//Only Selected في حالة اختيار الخيار
            
if (onlyrdbtn.Checked)
            {
                
= new DataTable();//انشاء جدول جديد للصفوف المحددة
                
int ij;
                
DataGridViewSelectedRowCollection rc dataGridView1.SelectedRows;// Datagridviewاختيار الصفوف المحددة من ال 

                //انشاء اعمدة بعدد الاعمدة المختارة من الجدول واضافتها الى الجدول الجديد
                
for (0mytable.Columns.Counti++)
                {
                    
= new DataColumn(mytable.Columns[i].ToString());
                    
t.Columns.Add(c);
                }
                
                for (
0rc.Counti++)
                {
                    
//واضافتها الى الجدول الجديد Datagridviewانشاء صفوف بعدد الصفوف المختارة من قبل المستخدم من ال
                    
t.NewRow();
                    
t.Rows.Add(r);
                    for (
0dataGridView1.ColumnCountj++)
                    {
                        
t.Rows[i][j] = (rc[i].Cells[j].Value);//اضافة العناصر من الصفوف المحددة الى الصفوف الجديدة في الجدول الجديد
                    
}
                }
                
//هي مصدر البيانات للصفوف المحددة فقط tتحديد مصدر البيانات للتقرير وهنا الجدول
                
par.SetDataSource(t);
            }
            
//All في حالة اختيار الخيار 
            
else if (allrdbtn.Checked)
            {
                
//هي مصدر البيانات mytable  تحديد مصدر البيانات للتقرير وهنا الجدول الرئيسي 
                
par.SetDataSource(mytable);
            }
            
paf.crystalReportViewer1.ReportSource par;
            
paf.Show();
        } 


[COLOR="#000080"]الشرح مع كل سطر من الكود وتجدون البرنامج في المرفقات

الى هنا وبفضل الله وصلنا الى نهاية الموضوع حيث تعلمنا كيفية بناء التقارير بلغة الC# بصورة مبسطة و اتمنى ان تكونوا قد استفدتم ان شاء الله وانتظر ردودكم الجميلة واستفساراتكم القيمة ولا تنسوني ووالدي من صالح دعواتكم راجيا الله تعالى ان يوفقنا وإياكم لمراضيهSmile[/COLOR]


الملفات المرفقة
.rar   sajad.rar (الحجم : 233.38 ك ب / التحميلات : 255)
الرد }}}
تم الشكر بواسطة:
#2
شرح رائع وجميل جدا جدا جدا جزيت خير اخي الكريم ولكن عندي سؤال


كيف طريقة ربط القاعدة باداتا سيت واستدعاء الداتاست في الكريستال ريبورت

يعني لو كنت اريد ان اعمل ريبورت بشرط بين تاريخين كيف ؟؟؟
الرد }}}
تم الشكر بواسطة:
#3
السلام عليكم اخي الكريم

تستطيع عمل ذلك بوضع شرط في الSelect باستخدام الامر between وتضع الناتج اكيدا عن طريق الFill بالdataset ومن ثم تمرر البيانات الى الCrystalReport

شكرا على التعليق والمرور بارك الله فيك
الرد }}}
تم الشكر بواسطة:
#4
جزاكم الله خيرا
الرد }}}
تم الشكر بواسطة:
#5
لوتكرمتم احتاج اختار من القريد مثلا اكثر من سجل 2او 3
ياريت تتفضلوا علينا وتشرح لنا وجزاكم الله خيرا
الرد }}}
تم الشكر بواسطة:
#6
السلام عليكم

اخي العزيز انت اختر الOnlySelected ومن ثم حدد عدد من السجلات عن طريق الماوس ثم PrintAll

الرد }}}
تم الشكر بواسطة:
#7
تسلم استاذي وصلت الفكرة مشكور
الرد }}}
تم الشكر بواسطة: Sajad
#8
السلام عليكم

موفق ان شاءالله
الرد }}}
تم الشكر بواسطة:



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


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