![]() |
|
الاجراءات الخارجية 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 يمكنك من هنا الاعلان عن الاجراء الخارجي مرئيا او فتح نافذة 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 للسيرفر اغلق برنامج ادارة قواعد البيانات وافتحه من جديد للتعرف عليها RE: الاجراءات الخارجية UDF في فايربيرد - larbiparadox - 28-07-2022 يوجد برنامج يقوم بتحليل ملفات DLL و يقوم بإستخراج function مخزنة في ملف DLL كإثراء للموضوع
Capture d’écran 2022-07-28 155303.png (الحجم : 22.94 ك ب / التحميلات : 82)
رابط البرنامج Alternate DLL Analyzer كود : https://www.alternate-tools.com/pages/c_dllanalyzer.php?lang=engRE: الاجراءات الخارجية 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 غير موجود و حسب ما قرأت انها غير أمنة وتسبب ثغرات بقاعدة البيانات ولا حاجة لها الا للضرورة فقط . |