الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

User Define Function With Crystal Report

بدأه ador_14 في 11 فبراير 2009 · 13 رد · 4,366 مشاهدة · في تصميم وبرمجة التقارير
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم .. أكيد فى عدد كبير من المبرمجين العرب . الذين يريدون إضافة دوال إلى كريستال ريبورت . لعمل حسابات معقدة وغير مدعمة من كريستال ريبورت ..

يوجد ما يعرف ب User Define Function وهو عمل ملف Ufl وتضمينه فى Global Assembly Cash .. والاسم الأخير هو لعمل ملفات Assembly ومشاركتها فى أكثر من برنامج .. لله الحمد ٌقمت بعمل برنامج . سيتم التكلم عليه بالتفصيل . وهو إضافة دالة جديدة لبرنامج كريستال ريبورت . أنا عملت دالة جديدة ووظيفتها إرسال رقم وكما عندى هو المرتب , وطباعته بالحروف . اى بمعنى تحويل الأرقام إلى حروف . والمشكلة التى واجهتنى أن كل شى شغال كويس . بس المشكلة أنه لا يعرض اللغة العربية .. اى يعطينى المخرجات قاربج . هذه هى مشكلتى الحالية . ولكن بغض النظر عنها . دعونا نتطرق لعمل برنامج صغير . متلا إرسال أى رقم من الكريستال ريبورت إلى هذا البرنامج . ومن ثم إرسال النتيجة وهو ضرب العدد فى نفسه . ما رأيكم أيها الإخوة الأفاضل ... لى عودة بعد قليل إن شاء الله

تم تعديل هذه المشاركة بواسطة ador_14 في 11 فبراير 2009 في 22:22

#2

السلام عليكم : دعونا باسم الله نبدا

أولا : To create a UFL class library

سنقوم بعمل كلاس Ufl وتضمينها ضمن Com Interop .

أفتح برنامج الفيجوال ستوديو . فتح مشروع جديد من نوع Class Librarry

إذا أردت أن يكون هذا المشروع أو الدالة سيظهر فى برنامج الكريستال ريبورت . أو أنه سيدعم من برنامج الكريستال ريبورت ..

لا بد من شرط أساسى وهو تسميه المشروع بكلمة بداية وهو Crufl والسبب أن الكريستال ريبورت يدعم الملفات المسبقة بهذه الكلمة ..

متلا سنسمى المشروع باسم : Crufl_MyAssembly

#3

عندما يتم فتح المشروع قم بعمل ضغطة يمنى بالفارة على اسم المشروع وادخل على الخصائص , انتقل إلى Tab باسم Compile وستجد فى أخر الصفحة مجموعة خيارات ,, إختار الخيار الأخير Register For Com Interop , الفائدة منها وهى تسجيل الملف الناتج من البرنامج الحالى تلقائيا بدون عمل regasm.exe utility لهذا الملف . لان هذا الخيار يعوض هذه المرحلة تلقائياً . تم عمل تخزين للمشروع وإغلاق نافدة الخصائص ,,

انا متاسف لاى خطأ إملائى .

#4

الخطوة الحالية تسمى To create the interface with COM attributes

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

ستجد فى مشروعنا ملف Class مسمى باسم Class1 .

* قم بتغير اسمه إلى InterfaceUfl . نقوم بفتح الكلاس . وقم بتغيير القيع الخاص به .. أى سيكون على النحو التالى :

Public Interface InterfaceUfl

End Interface

* قم بإاضافة مكتبة قبل هذا التعريف , أى أعلى الصفحة :

Imports System.Runtime.InteropServices

* قم بإاضافةGuid أعلى الانترفس كما بالشكل التالى

<ComVisible(True), _

InterfaceType(ComInterfaceType.InterfaceIsDual), _

GuidAttribute("E7A4EC98-BF2B-4006-B266-74C74421C3b1")> _

* قم بإاضافة توقيع للدالة التى ستظهر فى الكريستال ريبورت , متلا سنسميها MyFun

Function MyFun(ByVal Value As Integer) As Integer

شكل الانترفس سيصبح على النحو التالى

Imports System.Runtime.InteropServices

Imports System.Drawing.Font

<ComVisible(True), _

InterfaceType(ComInterfaceType.InterfaceIsDual), _

GuidAttribute("E7A4EC98-BF2B-4006-B266-74C74421C3b1")> _

Public Interface InterfaceUfl

Function MyFun(ByVal Value As Integer) As Integer

End Interface

قم بتخزين وإغلاق ملف الانترفس

#5

الخطوة التالية وهى : To create the implementation class with COM attributes

هذه المرحلة سيتم فيها عمل كلاس يرث من الانترفس السابقة :

ضغطة يمنى بالفارة على المشروع واضافة Class جديدة , سنسميها متلا : MyClassUfl

Public Class MyClassUfl

End Class

لكى نجعل الكلاش يرث من الانترفس , قم ببعض التعديل على التوقيع الخاص بالكلاس , سيصبح على النحول التالى

Public Class MyClassUfl : Implements InterfaceUfl

Public Function MyFun(ByVal Value As Integer) As String Implements InterfaceUfl.MyFun

Return (Vlaue * Value)

End Function

End Class

قم بتخزين الكلاس

#6

قم بإضافة مكتبة فى اعلى الكلاس وهى نفس المكتبة الى عملناها فى ملف الانترفس , ووظيفتها لكى يتم تعريف هذا الكلاس للكوم . Com Interop

المكتبة هى :

Imports System.Runtime.InteropServices

اسفل المكتبة واعلى التوقيع الخاص بالكلاس قم باضافة تعريف ل GUID

وهو عبارة عن رقم فريد لهذا الدالة , متلا قم بوضع الشكل التالى :

<ComVisible(True), ClassInterface(ClassInterfaceType.None), _

GuidAttribute("F5DCE88F-AD38-4a9a-9A69-0F8DC0EDB4b1")> _

الشكل النهائة للكلاس سيصبح كتالى

Imports System.Runtime.InteropServices

<ComVisible(True), ClassInterface(ClassInterfaceType.None), _

GuidAttribute("F5DCE88F-AD38-4a9a-9A69-0F8DC0EDB4b1")> _

Public Class MyClassUfl : Implements InterfaceUfl

Public Function MyFun(ByVal Value As Integer) As String Implements InterfaceUfl.MyFun

Return (Vlaue * Value)

End Function

End Class

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

والغائب عن الساحة البرمجية العربية , ولكم جزيل الشكر

#7

الان انتهينا من عمل ملف الانترفس والكلاس بشكل شبه نهائى ... ننتقل لنقطة أخرى وهى assign a strong-name key to the Class library

وهى باختصار عمل اسم فريد للمشروع الخاص بنا : سيتم التعرف عليه عند وضع مشروع ضمن ملفات الاسمبلى الخاصة بالفريم وورك :

ضغطة يمنى بالفارة على اسم المشروع وانتقل الى الخصائص : ثم الانتقال إلى Tab باسم Signing وهى ما قبل الاخير فى صفحة الخصائص .

عند فتح هذا الشاشة ستجد خيار وحيد أمامك وهو Sign The Assembly قم بوضع علامة الاختيار عليه :

من الكومبو بكوس الدى اسفله والمسمى ب Choose A stonge Name Key File

قم باختيار new :

ستظهر نافدة جديدة اول خيار فاها وهو : Key File Name

قم بادخال اسم فريد خاص بك : متلا ليكن اسمك او لقبك .

فى الخيار التالى وهو Protect My Key File With A Password . قم بازالة الخيار عليه . لانه غير مشروط علينا فى هذا المتال .

اضغط Ok .

خزن المشروع واغلق شاشة الخصائص .

ضغطة يمنى بالفارة على اسم المشروع وقم بعمل Build . واغلق المشروع .

#8

المرحلة الحالية : وهى add the assembly to the Global Assembly Cache

اضافة ملف Dll الخاص بمشروعنا إلى ما يعرف ب "Gac "Global Assembly Cache . وهو الذى سيجعل اى اسمبلى خاص بنا للمشاركة من قبل برامج أخرى . متل برنامج الكريستال ريبورت . والذى هو هدفنا فى هذا المثال ... لننطلق

اولا نذهب الى المسار الخاص بمشروع ولنفرض انه موجود على القرص C :

لنفرض أن المسار المطلوب للوصول الى ملف Dll وهو :

C:\Crufl_MyAssembly\bin\Release

* قم بنسخ هذا المسار فى ClipBoard الخاصة بنظام التشغيل . اى ضغطة يمنى بالفارة على هدا المسار الموجود فى Address ألعلوى

وقم بعمل Copy .

* افتح قائمة ابدا وانتقل الى البرامج ومن تم الى الفيجوال ستوديو . ستجد Visual Studio Tools

واختر منها Visual Studio 2008 Command Prompt

سيفتح لك شاشة الكوماند برومت الخاصة بالدوس

اكتب الامر التالى Cd قم بعمل Space تم قم بلصق المسار الذى قمنا بنسخه

سيصبح الامر كالتالى

Cd C:\Crufl_MyAssembly\bin\Release

اضغط على انتر

الان المسار هو مسار مشروعنا . لادخال ملف Dll الخاص بالمشروع ضمن ملفات Gac

قم بكتابة الامر التالى

gacutil -if ProjectName.DLL

واسم المشروع الخاص بنا او ملف الاسمبلى الناتج من مشروعنا هو باسم MyAssembly

ادا يكون الامور الكتالى

gacutil -if MyAssembly.DLL

اضغط انتر

سيعطيك النتيجة التالية

Assembly Successfully Addred To The Cache

وهو بمعنى انه تم اضافة ملف الاسمبلى الخاص بالمشروع ضمن نطاق ملفات الاسمبلى الموجودة فى نظام التشغيل .. ولكن دعونا نتاكد من وجوده

افتح القرص C

ادخل على ملف Windows

ستجد ملف باسم Assembly

قم بفتحه

ستجد ملف الاسمبلى الخاص بنا موجود ضمن هذا الملفات ...

#9

الخطو النهائية : العمل بالدالة التى قمنا بعملها منذ قليل داخل كريستال ريبورت .. افتح الفيجوال استوديو . مشروع جديد من نوع Windows Application

داخل المشروع قم باضافة عنصر جديد وهو كريستال ريبورت .. وقم بفتحه بشكل عادى .. اى اختار Empty Report ...

قم باضافة Unbound Feild من نوع Number على سبي المتال .. قمت بوضعه على التقرير

قم بضغطة يمنى على هذا الحقل واختار او خيار وهو Edit Furmola

ستجد كود جاهز وهو WhileReadingRecords;

0.0

قم بمسحه .. تم انتقل شجرة الدوال .. الشجرة الوسطى فى الاعلى .. وادهب الى اخر دالة والمسمى ب Additional Functions

قم بفتحها وستجد معرف باسم

( Visual Basic Ufls(U2LCom.Dll

قم بفتحها .. ستجد المفاجاة المنتظرة وهى مشروعنا السابق ... وهو

اسم المشروع + اسم الكلاس الخاص بالدالة + اسم الدالة (المتغير)

(اسم المتغير)MyAssemblyMyClassUflMyFun

قم باختيارها كفورموله لهدا المتغير وقم بارسال رقم 5 كمتال

خزن وقم بتنفيد الريبورت

النتيجة التى ظهرت هى 25

وهو ما قمنا به فى المشروع ضرب المتغير فى نفسه ..

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

ارجو من الجميع الدعاء لى ولوالدى .. وبارك الله لى ولكم فى ما ينفع صلاح الامة والدين

ملاحظة : انا عملت مشروع بحيت يطبع حروف للرقم ولكنه كتال ارسل رقم خمسة .. يطبع خمسة . بعمنى عام التفقيط ..

مشكلتى انه يطبع قاربج .. اى لايدعم اللغة العربية ... من يعرف حل للمشكلة الرجاء .. عرض هذا الحل

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

#10

المشكلة انحلت بحمد الله ..

#11

السلام عليكم .. انا مستغرب من شى واحد

وهو ان عدد المشاهدات قارب المائة ,, ولم يصل اى رد واحد منكم .. هل الموضوع مبهم .. هل الشرح ليس بدرجة كافيه .. ممكن

المهم :: اى استفسار او توضيح .. انا فى الخدمة ان شاء الله

سلامات

تم تعديل هذه المشاركة بواسطة ador_14 في 14 فبراير 2009 في 17:50

#12

بســم الله الـرحمــن الرحيــم

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

أخي العزيز

بارك الله فيك وغفر لك ولأبويك

وشكرا على هذا الموضوع الجميل

#13

بارك الله فيك اخى اسامة

#14

بارك الله فيك اخى اسامة

مواضيع مشابهة