السلام عليكم ورحمة الله
كلما زادت احتياجاتي في برامجي كلما زاد البحث عن حلول
واكتشف ان هناك امور احيانا معقدة تحتاج الى اجراءات معقدة ووجدت ان الفايربيرد لديه شئ يسمى UDF
طبعا ليس لدي المام كامل ولازلت اجرب وسوف اشرح فقط ما استطعت ان افهمه
الاجراءات الخارجية هي موجودة بمكتبات خارجية DLL عند تنصيب الفايربيرد توجد مكتبة وحيدة مضمنة معه fbudf.dll وموجودة بالمجلد UDF
في ملفات المساعدة يوجد سؤال لماذا الاجراءات الخارجية ولدينا الاجراءات المخزنة
الاجراءات المخزنة تبقى قاصرة احيانا عن اجراء بعض الامور
وهذا لمسته بنفسي فاحيانا يصبح الاجراء مركب ومتداخل ويعترض السيرفر انه غير قادر على تنفيد هذا التركيب المتداخل
مثال
الاستعلام المركب اذا اضفت له فلترة بالعبارة Where مرتين مرة للعبارة Select الاولى ومرة للعبارة Select الثانية غالبا لن ينفذ السيرفر هذا الاستعلام
ولتفادي هذه المشكلة يمكن اللجؤ الى الاجراءات الخارجية وتنفيذ العمليات المعقدة بشكل منفصل لتخفيف التعقيد على السيرفر في التداخل الذي يحصل عنده وايضا لترتيب وتقليل الشوشرة عليك ايضا في فصل العملية الى عدة عمليات
طبعا لتستخدمها بداخل قاعدة البيانات يجب ان تعلن عن الاجراءات التي تريد ان تستخدمها وتضيفها الى قاعدة البيانات
في برنامج IBexpert او اي برنامج ستجد تحت الجداول والقوادح والاجراءت المخزنة الاجراءات الخارجية UDF's
![[صورة: attachment.php?aid=4663]](https://delphi4arab.net/forum/attachment.php?aid=4663)
يمكنك من هنا الاعلان عن الاجراء الخارجي مرئيا
او فتح نافذة SQL-editor وكتابته يدويا مثل
هذا اجراء لاضافة شهور معينة الى التاريخ
ستلاحظ عند كتابة الاستعلامات انه يخبرك ان هذا الاجراء هو اجراء خارجي
![[صورة: attachment.php?aid=4662]](https://delphi4arab.net/forum/attachment.php?aid=4662)
طبعا في الملجد UDF بمجلد سيرفر الفايربيرد ستجلد ملفات نصية SQL فيها بيان بكل الاجراءات الموجودة بالمكتبة والتي يمكن استخدامها
بعد الاعلان عن الاجراء يمكنك استخدامه في الاستعلامات بشكل طبيعي مثل
هناك الكثير من الاجراءات التي يمكن استخدامها والكثير من المكتبات الي يمكن اضافتها
هنا درس لمكتبات يمكن استخدامها تحوي العشرات وربما المئات من الاجراءات
و من هنا يمكنك تحميل المكتبة المجانية
ومن هنا يمكنك مطالعة كل الاجراءات التي تحويها
لاحظ جزء بسيط من الاجراءات التي تحويها
مثال من الاجراء الاول على سبيل المثال
يعيد الحرف I من الحروف الانجليزية
واعتقد بالامكان استخدام حتى مكتبات النظام ويندوز نفسه لانك لو لاحظت التالي
في الـ MODULE_NAME تكتب اسم المكتبة اللتي تريدها
كما ان بالامكان انشاء ملف DLL بالدلفي واستخدام الاجراءات التي فيه من داخل قاعدة البيانات او من قبل سيرفر الفايربيرد
وهنا مثال على الاستخدام
وتبقى ملاحظة صغيرة عند اضافة مكتبات جديدة System32 او مجلد Bin للسيرفر اغلق برنامج ادارة قواعد البيانات وافتحه من جديد للتعرف عليها
كلما زادت احتياجاتي في برامجي كلما زاد البحث عن حلول
واكتشف ان هناك امور احيانا معقدة تحتاج الى اجراءات معقدة ووجدت ان الفايربيرد لديه شئ يسمى UDF
طبعا ليس لدي المام كامل ولازلت اجرب وسوف اشرح فقط ما استطعت ان افهمه
الاجراءات الخارجية هي موجودة بمكتبات خارجية DLL عند تنصيب الفايربيرد توجد مكتبة وحيدة مضمنة معه fbudf.dll وموجودة بالمجلد UDF
في ملفات المساعدة يوجد سؤال لماذا الاجراءات الخارجية ولدينا الاجراءات المخزنة
الاجراءات المخزنة تبقى قاصرة احيانا عن اجراء بعض الامور
وهذا لمسته بنفسي فاحيانا يصبح الاجراء مركب ومتداخل ويعترض السيرفر انه غير قادر على تنفيد هذا التركيب المتداخل
مثال
كود :
For Select d1,sun(E1* F4) ,S3,A5 from (Select H1,Sum(O4),sum(p2) From EmpTable);
الاستعلام المركب اذا اضفت له فلترة بالعبارة Where مرتين مرة للعبارة Select الاولى ومرة للعبارة Select الثانية غالبا لن ينفذ السيرفر هذا الاستعلام
ولتفادي هذه المشكلة يمكن اللجؤ الى الاجراءات الخارجية وتنفيذ العمليات المعقدة بشكل منفصل لتخفيف التعقيد على السيرفر في التداخل الذي يحصل عنده وايضا لترتيب وتقليل الشوشرة عليك ايضا في فصل العملية الى عدة عمليات
طبعا لتستخدمها بداخل قاعدة البيانات يجب ان تعلن عن الاجراءات التي تريد ان تستخدمها وتضيفها الى قاعدة البيانات
في برنامج IBexpert او اي برنامج ستجد تحت الجداول والقوادح والاجراءت المخزنة الاجراءات الخارجية UDF's
يمكنك من هنا الاعلان عن الاجراء الخارجي مرئيا
او فتح نافذة SQL-editor وكتابته يدويا مثل
كود :
DECLARE EXTERNAL FUNCTION ADDMONTH
TIMESTAMP,
INTEGER
RETURNS TIMESTAMP
ENTRY_POINT 'addMonth' MODULE_NAME 'fbudf';
هذا اجراء لاضافة شهور معينة الى التاريخ
ستلاحظ عند كتابة الاستعلامات انه يخبرك ان هذا الاجراء هو اجراء خارجي
طبعا في الملجد UDF بمجلد سيرفر الفايربيرد ستجلد ملفات نصية SQL فيها بيان بكل الاجراءات الموجودة بالمكتبة والتي يمكن استخدامها
بعد الاعلان عن الاجراء يمكنك استخدامه في الاستعلامات بشكل طبيعي مثل
كود :
select
addmonth(Emp.mdate,5)
from Emp
group by Emp.mdate
هناك الكثير من الاجراءات التي يمكن استخدامها والكثير من المكتبات الي يمكن اضافتها
هنا درس لمكتبات يمكن استخدامها تحوي العشرات وربما المئات من الاجراءات
كود :
https://blogs.embarcadero.com/user-defined-functions-with-interbase/
و من هنا يمكنك تحميل المكتبة المجانية
كود :
http://freeadhocudf.org/index_eng.html
ومن هنا يمكنك مطالعة كل الاجراءات التي تحويها
كود :
http://freeadhocudf.org/documentation_english/dok_eng_inhalt.html
لاحظ جزء بسيط من الاجراءات التي تحويها
كود :
DECLARE EXTERNAL FUNCTION F_ARABIC2ROMAN
INTEGER
RETURNS CSTRING(255) FREE_IT
ENTRY_POINT 'arabic2roman' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_CONVERTFROM33
CSTRING(255)
RETURNS INTEGER FREE_IT
ENTRY_POINT 'convertfrom33' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_CONVERTFROMBASE
CSTRING(255) ,
INTEGER ,
CSTRING(255)
RETURNS INTEGER FREE_IT
ENTRY_POINT 'convertfrombase' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_CONVERTTO33
INTEGER
RETURNS CSTRING(255) FREE_IT
ENTRY_POINT 'convertto33' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_CONVERTTOBASE
INTEGER ,
INTEGER ,
CSTRING(255)
RETURNS CSTRING(255) FREE_IT
ENTRY_POINT 'converttobase' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_AC2SQM
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'ac2sqm' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_AR2SQM
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'ar2sqm' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_BAR2PA
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'bar2pa' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_BAR2TORR
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'bar2torr' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_BBL2L
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'bbl2l' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_BHP2KW
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'bhp2kw' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_C2F
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'c2f' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_CAL2J
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'cal2j' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_CBL2M
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'cbl2m' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_CBM2RT
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'cbm2rt' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_CH2M
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'ch2m' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_CT2G
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'ct2g' MODULE_NAME 'FreeAdhocUDF';
DECLARE EXTERNAL FUNCTION F_C_CUB2CUYD
DOUBLE PRECISION
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'cum2cuyd' MODULE_NAME 'FreeAdhocUDF';
مثال من الاجراء الاول على سبيل المثال
كود :
select F_ARABIC2ROMAN(1) from Emp
يعيد الحرف I من الحروف الانجليزية
واعتقد بالامكان استخدام حتى مكتبات النظام ويندوز نفسه لانك لو لاحظت التالي
كود :
DECLARE EXTERNAL FUNCTION RDB$GET_CONTEXT
VARCHAR(80) NULL,
VARCHAR(80) NULL
RETURNS VARCHAR(255) FREE_IT
ENTRY_POINT 'get_context' MODULE_NAME 'system_module';
في الـ MODULE_NAME تكتب اسم المكتبة اللتي تريدها
كما ان بالامكان انشاء ملف DLL بالدلفي واستخدام الاجراءات التي فيه من داخل قاعدة البيانات او من قبل سيرفر الفايربيرد
وهنا مثال على الاستخدام
كود :
https://firebirdsql.org/en/writing-udfs-for-interbase/
وتبقى ملاحظة صغيرة عند اضافة مكتبات جديدة System32 او مجلد Bin للسيرفر اغلق برنامج ادارة قواعد البيانات وافتحه من جديد للتعرف عليها
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم