حل استخدام التقارير في WPF

حينما تستخدم التقارير في تطبيقات Windows Forms أو في ASP.NET، يكون الأمر سهلا، ولكن حينما تستخدمها في WPF ، ستواجهك بعض العقبات، ساستعرض هنا الطريقة المثلى والمشاكل التي قد تواجهك في أثناء العمل

بداية لا توجد أداة مدمجة في WPF تسمح لك باستخدام التقارير مباشرة ( أقصد بالتقارير بالدرجة الأولى تقارير الفيجوال ستوديو نفسه، وقد ينطبق هذا الشرح على تقارير الكريستال ريبورت )، وإذا أردت استخدام التقارير في  WPF  فعليك باستدعاء عارض التقارير الموجود في Windows Forms.

 

طريقة الاستدعاء سهلة، عليك باتباع الخطوات التالية

- أضف المرجع Add Reference التالي إلى المشروع / Microsoft.Reporting.WinForms

- قم باستدعاء المرجع في منطقة الاستدعاء : xmlns:rv="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms"  من داخل الصفحة

- قم بوضع الوسم WindowsFormsHost أينما تحب في المشروع وهذه الأداة مسؤولة عن جلب أدوات من الWindows Forms  بداخل WPF

- استدعي أداة عارض التقارير بداخل الوسم بالأعلى كالتالي <rv:ReportViewer

تصبح المحصلة لديك كالصورة التالية :

wpf report

 

الآن نأتي لتحميل ملف التقرير ، مع العلم أنني سأفترض أنك قد أعددت تقريرا

           Private Sub Button_Click(sender As Object, e As RoutedEventArgs) 
'' جلب الداتا سيت التي قد قمت بربطها بالتقرير، مهما كان اسمها
Dim dataset As New JewellyManagement.KhalilSaleemDataset
dataset.BeginInit()


'' تعبئة البيانات بالشكل المطلوب وتستطيع كتابة أي شروط او استعلامات كما تشاء ، الأمر روتيني لمن استخدم التقارير سابقا
Dim conn As New SqlCeConnection(My.Settings.JDConnectionString)
Dim cmd As SqlCeCommand = conn.CreateCommand()
cmd.CommandText = "SELECT [ID], [DOB], [Name], [Price], [Notes], CASE [Ttype] WHEN 1 THEN 'يومي' WHEN 2 THEN 'شهري' WHEN 3 THEN 'سنوي' ELSE 'يومي' End as TType,Currency FROM [WalletOut]"
Dim da As New SqlCeDataAdapter(cmd)
da.Fill(dataset.CInfo)



Dim reportinfo As New Microsoft.Reporting.WinForms.ReportDataSource()
reportinfo.Name = "DSInfo"
reportinfo.Value = dataset.CInfo
Me._reportViewer.LocalReport.DisplayName = ReportNameWithDate("تقرير المصروفات ")
Me._reportViewer.LocalReport.DataSources.Add(reportinfo)
Me._reportViewer.LocalReport.ReportEmbeddedResource = "JewellyManagement.WalletFullReport.rdlc"
dataset.EndInit()
_reportViewer.RefreshReport()
End Sub

wpf report

في مثالي انا استخدمت قاعدة بيانات داخلية وربطت البيانات بها، أنت حر كما تريد، قمت بتوزيع الكود إلى 3 أقسام ، لتفهم أن القسم الأول عليك باستدعاء datasource

في القسم الثاني عليك بكتابة استعلامك وملء البيانات وهو إجراء روتيني لك كمبرمج.

 في القسم الثالث عليك بارسال اسم مصدر البيانات من التقرير وفي حالتي كان DSInfo وكذلك عليك استدعاء اسم التقرير ومساره في JewellyManagement.WalletFullReport.rdlc ، وهنا تكمن الخدعة، وهنا سبب كتابتي للمقال.

 

توضيح حول المسار

المعتاد دائما في هذا الكود هو استدعاء المسار بالشكل التالي

          _reportViewer.LocalReport.ReportPath = "../../Incomes/BrakeReport.rdlc" 

حيث ../../ تشير إلى اسم المجمع assembly وثم اسم فضاء الأسماء namespace و Incomes على سبيل المثال هي للمجلد الفرعي ( الداخلي ) الذي أضع فيه التقرير والذي يحمل اسم BrakeReport.rdlc

هذا الأمر طبيعي في Windows Forms ونفس الشيء في WPF المشكلة تظهر حينما تحاول نشر البرنامج ستجد أن المشاكل تظهر ولا ينم عرض التقرير

السبب بسيط هو أن التقرير Embeded Resource وبالتالي لا مسار فيزيائي له، وستفشل كل الطرق في WPF لجلب المسار

الحل يكمن في اسدعاء خاصية ReportEmbeddedResource بدلا من ReportPath  كما عملت في الكود بالأعلى ، ولكن هنالك خدعة بسيطة يجب عملها ألا وهو استبدال ../../ بالمسار الحقيقي في Embedding

في السي شارب عليك باستدعاء اسم المجمع ثم نقطة ، ثم تضع اسم فضاء الأسماء ثم نقطة أي أنه يصبح كالتالي

        _reportViewer.LocalReport.ReportEmbeddedResource = "AssemblyName.NameSpace.ReportName.rdlc"

وطبيعي لو كنت قد وضعت التقرير في مجلد فرعي أن تضيف اسم المجلد الفرعي كفضاء أسماء لأن السي شارب  تعامل المجلدات كفضاءات أسماء فيصبح الأمر هكذا

        _reportViewer.LocalReport.ReportEmbeddedResource = "AssemblyName.NameSpace.FolderName.ReportName.rdlc"

أما في الفيجوال بيسك دوت نت الأمر يختلف فلا يوجد لديك فضاءات اسماء فرعية ( وهذه المعلومة تكلف ثمنها لأني سهيت عنها فاسغرقتني 3 أيام من البحث لحين خطرت على بالي وحللت المشكلة وقررت أن أكتب المقال حتى لا يقع غيري بها ) ، فكل ما عليك فعله هو كتابة اسم المجمع ثم اسم التقرير مهما كان في مجلدات فرعية كالتالي

        _reportViewer.LocalReport.ReportEmbeddedResource = "AssemblyName.ReportName.rdlc

والدليل على كلامي انك حاول وضع تقرير ثان في مشروع الفيجوال بيسك بنفس الاسم وستجد ان البرنامج يرفض هذا ، أقصد نفس الاسم البرمجي، لأنه سيكون في المجمع مباشرة بدون فضاء أسماء، نعم ويمكنك إنشاء فضاءات الأسماء الخاصة بك كما تريد.

بالتوفيق للجميع

هفوة برمجية غير متوقعة أدت إلى ضرر لموقع محترم !

أود في هذا المقال عرض ما حدث معي برمجيا في برمجة موقع محترم، وهذه الهفوة أدت إلى مشاكل جمة لصاحب الموقع.

قبل أن أبدأ بسرد المشكلة أود أن أقول أنه لا عيب في الاعتراف بالأخطاء التي تحدث مع المبرمج، فلا يوجد مبرمج كامل،  ولا كود يعمل بكفاءة بدرجة كاملة، ومن الجيد عندما يسهى المبرمج عن أمر، أو عندما يحدث له أمر جديد غير متوقع أن يدونه أو أن يخبر غيره لكي لا يقع في نفس المشكلة، وهذا ما أقوم به في مقالي، أدون الخطأ وأبلغكم به

 

في إحدى موقع وفي إحدى جزئياته، يقوم المدير برفع صور ابتسامات ويحفظها على مسار في القرص، ويقوم باضافة إختصار لها في قاعدة البيانات

وكان كود الرفع كالتالي

If fileuploads(i).FileName.ToLower().EndsWith("png") Or fileuploads(i).FileName.ToLower().EndsWith("gif") Or fileuploads(i).FileName.ToLower().EndsWith("jpg") Or fileuploads(i).FileName.ToLower().EndsWith("jpeg") Then

السطر هذا بشكل سريع يقوم بتحديد امتداد الملفات المرفوعة وقد حددتها بأربعة امتدادات فقط ( توجد طريقة أخرى لتحديد الامتدادات بشكل أسرع ) ، ومن ثم يتم حفظ هذه الملفات باسم فريد GUID

يدخل المدير فيرفع الملفات والأمور تعمل بدون مشاكل

قام مدير الموقع بتعيين مدير فرعي آخر وهو ما لم يكن بحسباني فقام هذا المدير برفع ملف اختراق وكان امتداده بالشكل التالي : xxxx.asp.png

برمجتي عملت المطلوب وقامت برفع الملف، وقام المدير الجديد عن طريق هذا الملف بعمل العجب في الموقع وهو ما أدى إلى إهانة صاحب الموقع ، ولسبب ما لم يخبرني بما حدث وأخبرني أنه قام بإغلاق موقعه بعدما حدث

بدوري أخبرته أنني لم أتوقع أن يرفع المدير ملف ليضر نفسه، وهو ما أقوم به غالبا، بل اـتغاظى كثيرا في قضية التحقق في المدير لأنه ببساطة المدير، هل سيضر موقعه.

الأخ محمد كان متفهم ولم يلمني وهذا من حسن خلقه، رغم عراقة موقعه، ورغم أنه وجدها فرصة مناسبة لإغلاق الموقع  والبدء من جديد، بل وقمنا بالاتفاق لحظتها على برمجة جديدة وبدأت بها، وهذه نصيحة للمبرمجين، بضرورة اعتبار العلاقات مع العملاء المحترمين على أنها علاقات صداقة وليست علاقات عمل عابرة، فكم من علاقات الصداقة وبل الإخوة التي أقمتها أثناء وبعد العمل.

ما أريد كتابته من ملاحظات لي وللجميع لتلافي هذه المشكلة مستقبلا هي:

1- ضرورة رفع ملفات الموقع Compiled وليست صفحات كود ، وبدون ذكر الأسباب سيكون الأمر أكثر أمانا.

2- لا تؤمن لمدير الموقع مرة أخرى، بل يجب عمل التحقق كما لو أنه مستخدم خارجي .

3- يجب تعطيل الصلاحيات أو الخيارات الإضافية التي لا تلزم ، فمثلا لو أنني قمت بتعطيل asp  أو php  على السيرفر لكان الأمر أفضل لوما استطاع تشغيل الملف، وفي حالة الموقع الذي قمت برفعه كان الأمر متعذر بخصوص تعطيل asp لأن برمجتي asp.net كانت كانت متصلة ببرمجة قديمة asp وهي رغبة العميل

4- لا تفحص الامتداد من اسم اسم الملف بل افحص عبر contenttype

أسأل الله التوفيق

مقدمة إلى قواعد بيانات NoSQL

مقدمة إلى قواعد بيانات NoSQL

ذات مرة أخبرني صديق أن علم قواعد البيانات هو علم منتهي، لا جديد فيه مثل البرمجة، ولكن يبدو أن صديقي يجب أن يحدث قاعدة بياناته، فعلم قواعد البيانات في تطور مستمر وسيكون حديثنا اليوم عن قواعد بيانات NoSQL وخصوصا قاعدة مونغو MongoDB

صحيح أن مبدأ قاعدة NoSQL ليس بالجديد، إلا أن التطوير الحاصل في هذه القاعدة، يعتبر أمر جديد، إذا السؤال هنا، ما هي قاعدة بيانات NoSQL ؟

في البداية ، نتعرف على أنواع قواعد البياناتبيانات

حيث يوجد عدة أنواع هيكلية لقواعد البيانات ، تعلمون الشبكية والهرمية والعلائقية، والكائنية ... إلخ

لا يخفى عليكم النوع المشهور ، وهي قواعد البيانات العلائقية Relational Database ، وهي القواعد المشهورة ( والتي نعرفها ) أوراكل Oracle  ، سكول سيرفر SQL Server ، أكسيس، MySQL ... إلخ

الكثير من الكلام حول هذه القواعد، ولكن ما يهمنا أمرين: الأول أن هذه القواعد تخزن البيانات على شكل جداول - كما يعلم الجميع -، والأمر الثاني، أن هذه الجداول مرتبطة بعلاقات بينها

هنالك نوع OOP Database وهي من اسمها قاعدة معتمدة على الكائنات في بنيتها، وهنالك نوع من قواعد البيانات يسمى Document Oriented Database  أو Document Store أو قواعد NoSQL

هذه القواعد يتم تخزين البيانات فيها على هيئة ملفات مرمزة Encoded  بصيغ معروفة مثل XML أو JSON ، أو حتى ملفات كالوورد أو الأكروبات PDF، المقصد هي في النهاية ملفات كالملفات النصية، تحتلف عن ملفات القواعد العلائقية

حيث تخزين البيانات في هذه الملفات يتم بسهولة، وبدون وجود بنية صارمة كما في القواعد العلائقية مثال لوصف قاعدة بيانات NoSQL لمكتبة

{

الكتاب: " خديعة التطور"

الكاتب: "هارون يحيى"

بتاريخ:" طبيعي ما احفظ التاريخ"

دور _لنشر: [  الاسم: " مكتبة المنارة"،

الاسم : " مكتبة النهضة "،

الاسم : " مكتبة الاسكندرية"   ]

}

وهذا يمثل حقل واحد، وهو أقرب لصيغة JSON أو XML ، وهنالك عدة خوارزميات متبعة في هذه القواعد، وتختلف اختلاف كبير في طريقة تخزين واسترداد البيانات، فهنالك مثلا أنواع يتم فيها استرداد البيانات عن طريق اسم فريد بكل حقل، وهو مشابه أيضا لمبدأ المفتاح والقيمة Key-Value .

ما الذي يميز قواعد NoSQL على القواعد العلائقية ؟

قواعد البيانات العلائقة تحتاج للعديد من الموارد ، وتحتاج لخبرة عالية لإدارتها، وخبرة في تصميمها وتنصيبها وضبط إعداداتها، بينما قواعد بيانات NoSQL مصممة لتحتاج أقل إدارة، وأقل صيانة

أيضا هنالك صعوبات في التعامل مع ملفات القاعدة كتقسيم الملفات Clustering ونقل البيانات، والمقصود هنا أن قواعد البيانات العلائقية لا تتعامل بكفاءة مع الكميات الضخمة من البيانات ، مثلا كموقع الفيسبوك، حيث كمية البيانات المخزنة ضخمة جدا، وكمية العمليات على القاعدة ضخمة جدا، وأساسا لم يتم تصميم قواعد البيانات العلائقية لتحميل هذا الكم الهائل من البيانات والعمليات عليها،

إذا قواعد بيانات NoSQL تستخدم في حالة كان هنالك بيانات، وكمية هذه البيانات والعمليات عليها ضخمة، وغير مهم وجود العلاقات بينها، والمهم هنا استرداد هذه البيانات الضخمة بكفاءة عالية.

هذا الموقع به جميع قواعد بيانات NoSQL ، وتجد فيه قاعدة بيانات مونجو، أيضا تجد فيه قاعدة بيانات كاساندرا Cassandra والتي والله العليم تستخدم في الفيسبوك، حيث أعتقد فريق الفيسبوك طورها ووضعها مفتوحة المصدر لكي يساهم بها كل من يستطيع.

نكمل إن شاء الله المرة القادمة في قاعدة بيانات MongoDB، حيث الحديث اليوم عام عن قواعد بيانات NoSQL ، والمرة القادمة سنختار قاعدة للحديث عنها

بالتوفيق للجميع

كيفية التعامل مع أداة Fileupload بداخل أداة Gridview   

في أحيان كثيرة يلزمك وضع أداة Fileupload بداخل حقل TemplateField  في الجريدفيو أو أي أداة مشابهة للجريدفيو، وذلك للقيام بعملية التعديل أو الإضافة. وإليك الطريقة.

سنستخدم أداة جريدفيو ، مع أداة SqlDataSource  وسيكون هنالك عمود على هيئة قالب TemplateField ، وبديهي جدا أن نضع أداتنا ( أداة الرفع ) في بند التعديل بداخل القالب كالمثال



الآن قمنا بضبط عرض الصورة في الجريدفيو وقمنا بضبط عرض الصورة وأداة الرفع في حالة ضغط المستخدم على زر تعديل الجريد فيو.

الآن علينا كتابة كود التعديل ، وهذا يتم في حدث RowUpdating
 وسيكون كالتالي

الكود تقليدي ، قمنا بجلب أداة الرفع من السطر المختار
ثم استعديت دالة برمجتها سابقا تقوم برفع الملف وإرجاع اسمه لأستخدمه لاحقا
ثم حذفت الصورة القديمة لأني رفعت صورة بدلا منها.
الخيار لك في طريقة كتابة الكود ولكن ما يهم في السطر الأخير ، حيث يهمك أن ترسل اسم الملف الجديدة كوسيطة إلى العمود الذي تريد التعديل إليه ، مثلا سأعدل على عمود اسمه Picture ، فسيكون السطر كالتالي
e.NewValues("Picture") = imgname


الآن كل شيء تمام ، ولكن يبقى أمر أخير ، وهو ماذا لو قام بالتعديل على الصف في الجريد فيو ولكن لم يرغب بأن يرفق ملف جديد ( وفي حالتي صورة جديدة ) !
عندها سيتم استبدال اسم الملف في القاعدة بقيمة فارغة NULL  ، وهنا يجب إجراء تعديل على جملة التعديل في SqlDataSource ، ويجب توقع القيمة الفارغة فبدلا من أن تكون الجملة مشابهة ل
UPDATE [Departments] SET [Name] = @Name, Picture=@Picture  where id=@id
ستصبح مشابهة ل
UPDATE [Departments] SET [Name] = @Name, Picture=isnull(@Picture,Picture) where id=@id

بالتوفيق للجميع
<

هل انتهيت من برمجة موقعك ب ASP.NET وتريد فحص قبل نشره ؟

عند الإنتهاء من برمجة موقع ، والتأكد من أن البرمجة لا تحتوي على أخطاء ، تحتاج لعمل مراجعات عديدة وهامة، مثلا توافقه مع محركات البحث، وجود روابط لا تعمل، دعمه للجوال وغيرها من هذه المراجعات والفحوصات الهامة ، ولكن من أين يبدأ المبرمج الغلبان ؟

الإجابة من هذا الموقع
http://webdevchecklist.com/asp.net/

فكرة الموقع بسيطة ، وبالتأكيد ستعجبك وستعرف كيف تستخدمه

بالتوفيق لكم

الجديد في Visual Studio 2012 Update 1

في الغالب كنا نسمع ب Visual Studio Service Pack 1 ولكن الآن نسمع ب Update 1، لماذا هذه التسمية وما الجديد .

أكثر ما أسعدني في الفيجوال ستوديو 2012 هو نظام التحديثات الجديد الذي تبنته مايكروسوفت، والذي يشعرك بأن الفريق يعمل معك طوال الوقت جنبا إلى جنب، فبعد نجاح ال NuGet ووصول تحديثات المكتبات أولا بأول لك قررت مايكروسوفت طرح تحديثات الفيجوال ستوديو بنفس النمط.

النمط الجديد يقضي بأن تقوم مايكروسوفت بإرسال التحديثات للفيجوال ستوديو أولا بأول بدلا من تجميعها وإرسالها في فترات طويلة، أي أن التحديثات الجديدة ستكون مستمرة ، مثلا هنالك مشكلة في الفيجوال ستوديو وجب تصليحها، لن يكون عليك الانتظار لستة أشهر لحين صدور حزمة التحديثات ، بل ستصلك التحديثات في أقرب فرصة ممكنة وهكذا .

حول الجديد في هذه الحزمة ، هنالك الكثير من التحديثات ولكن أغلبها لذوي الاختصاص وأكتب منها ما شدني

  1. عشرات الأخطاء تم إصلاحها.
  2. دعم لخصائص جديدة في تطوير الشير بوينت 2010 وقريبا 2013.
  3. نظام جديدة لبناء قيود أثناء بناء التطبيقات على الويندوز فون 8.
  4. دعم التطوير بالكود الغير مدار للسي بلس بلس، وهي الميزة التي رأيتها وأسعدت بها، فكثير من المستخدمين ما زالوا يستخدمون إكس بي ويجب بناء تطبيقات أو تعديلها لهم ، أو حتى كتابة تطبيقات سي بلس بلس قديمة والتعديل عليها.
  5. تحديثات كثيرة للـ Team Foundation

أهلا بالجيل الجديد من التحديثات ، وشكرا مطورو مايكروسوفت

نسيت رابط التحديث ، من هنا

بعض تصاميم المواقع المتجاوبة الجميلة

استكمالا لففرة منير بركات حول تصميم الويب التفاعلي Responsive Web Desigen أضع لكم بعض المواقع الجميلة والجذابة

أو بالأحرى ، بعض المواقع التي ستصدمك

25 Beautiful Responsive Web Design Examples for Inspiration

30 Example

60 Examples of Responsive Website Design


60+ Creative Examples of Responsive Web Design



24 Excellent Examples of Responsive Web Design