delphi4arab منتديات دلفي للعرب
الاجراءات الخارجية UDF في فايربيرد - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : قسم التعريف بمكونات وادوات دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=33)
+--- الموضوع : الاجراءات الخارجية UDF في فايربيرد (/showthread.php?tid=12017)



الاجراءات الخارجية UDF في فايربيرد - Delphi4Us - 28-07-2022

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


كلما زادت احتياجاتي في برامجي كلما زاد البحث عن حلول
واكتشف ان هناك امور احيانا معقدة تحتاج الى اجراءات معقدة ووجدت ان الفايربيرد لديه شئ يسمى 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






[صورة: attachment.php?aid=4663]

يمكنك من هنا الاعلان عن الاجراء الخارجي مرئيا
او فتح نافذة SQL-editor وكتابته يدويا مثل

كود :
DECLARE EXTERNAL FUNCTION ADDMONTH     TIMESTAMP,     INTEGER RETURNS TIMESTAMP ENTRY_POINT 'addMonth' MODULE_NAME 'fbudf';

هذا اجراء لاضافة شهور معينة الى التاريخ

ستلاحظ عند كتابة الاستعلامات انه يخبرك ان هذا الاجراء هو اجراء خارجي

[صورة: attachment.php?aid=4662]


طبعا في الملجد 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 للسيرفر اغلق برنامج ادارة قواعد البيانات وافتحه من جديد للتعرف عليها


RE: الاجراءات الخارجية UDF في فايربيرد - larbiparadox - 28-07-2022

يوجد برنامج يقوم بتحليل ملفات DLL و يقوم بإستخراج  function  مخزنة في ملف DLL

كإثراء للموضوع


[صورة: attachment.php?aid=4664]


.png   Capture d’écran 2022-07-28 155303.png (الحجم : 22.94 ك ب / التحميلات : 82)

رابط البرنامج Alternate DLL Analyzer

كود :
https://www.alternate-tools.com/pages/c_dllanalyzer.php?lang=eng



RE: الاجراءات الخارجية UDF في فايربيرد - أبو معاذ - 28-07-2022

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


إقتباس :http://freeadhocudf.org/index_eng.html



RE: الاجراءات الخارجية UDF في فايربيرد - Delphi4Us - 30-07-2022

حقيقة في فايربيرد من النسخة 3 صار بالامكان تعريف الاجراءات الداخلية ايضا والتي هي غير متوفرة في مع عائلة الاصدارة 2

مثال على التعريف

كود :
CREATE FUNCTION ADD_INT (A INT, B INT DEFAULT 0) RETURNS INT AS BEGIN   RETURN A + B; END

بحال الرغبة في التعديل استخدم العبارة Alert

كود :
ALTER FUNCTION ADD_INT(A INT, B INT, C INT) RETURNS INT AS BEGIN   RETURN A + B + C; END

او استخدام create و alert معا اذا كان موجود يعدل واذا لم يكن موجود ينشئ

كود :
CREATE OR ALTER FUNCTION ADD_INT(A INT, B INT DEFAULT 0) RETURNS INT AS BEGIN   RETURN A + B; END

واعتقد العبارة ReCreate تفعل نفس الشئ

كود :
RECREATE FUNCTION ADD_INT(A INT, B INT DEFAULT 0) RETURNS INT AS BEGIN   RETURN A + B; EN


لحذف الاجراء

كود :
DROP FUNCTION ADD_INT;



طريقة الاستدعاء كأي اجراء او دالة عادية مضمنة مع الفايربيرد

كود :
SELECT ADD_INT(2, 3) AS R FROM RDB$DATABASE

وطالما صارت قابلة للاستدعاء بداخل جملة ال ـ SQL فهذا يعني بالامكان استخدامها كشرط


كود :
SELECT FirstName,LastName FROM Emp where ADD_INT(2,5)=Emp.Salarry

او ليكون الاستعلام اكثر منطقية و واقعي

كود :
SELECT FirstName,LastName FROM Emp where ADD_INT(Emp.Quantty,Emp.Price)=Emp.Salarry


وهذا يعني ان الدالة صارت جزء من جملة الاستعلام 
مما يعني انه سيتم تنفيذها على عدد الصفوف فاذا اجريت استعلام لجلب 1000 سجل فسيتم استدعاء هذا الاجراء 1000 مرة


RE: الاجراءات الخارجية UDF في فايربيرد - Delphi4Us - 02-11-2022

في فايربيرد 4 تم الاستغناء عن الاجراءات الخارجية بعد دعم الاجراءات الداخلية
او بمعنى اخر تم اهمالها وايقافها ويمكنك طبعا اعادتها من سطر الاوامر بالملف Config وستلاحظ ان المجلد UDF غير موجود
و حسب ما قرأت انها غير أمنة وتسبب ثغرات بقاعدة البيانات ولا حاجة لها الا للضرورة فقط .