الاجراءات الخارجية UDF في فايربيرد
#1
السلام عليكم ورحمة الله


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


الملفات المرفقة
.jpg   111.jpg (الحجم : 21.19 ك ب / التحميلات : 22)
.jpg   222.jpg (الحجم : 26.62 ك ب / التحميلات : 24)
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 4 users say قال شكرا ل Delphi4Us على المشاركة المفيدة
  • bassem_43, larbiparadox, أبو معاذ, محمد عبد العزيز
الرد
#2
يوجد برنامج يقوم بتحليل ملفات DLL و يقوم بإستخراج  function  مخزنة في ملف DLL

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


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


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

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

كود :
https://www.alternate-tools.com/pages/c_dllanalyzer.php?lang=eng
‏اللّهمّ فرّج أُموراً ضَاقت بها صُدورنا وعجزت بها حيلتنا وقلّ بها صَبرنا الّلهمّ أَسعِد قلوبنا بما أنتَ أعْلَمُ بِهِ مِنّا
[-] كل من 3 users say قال شكرا ل larbiparadox على المشاركة المفيدة
  • bassem_43, Delphi4Us, أبو معاذ
الرد
#3
السلام عليكم.
هذا الموقع فيه أيضا مجموعة من UDF الجاهزة ،
ربما بعضها يحتاج إلى تحديث.


إقتباس :http://freeadhocudf.org/index_eng.html
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
[-] كل من 1 user says قال شكرا ل أبو معاذ على المشاركة المفيدة
  • Delphi4Us
الرد
#4
حقيقة في فايربيرد من النسخة 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 مرة
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 1 user says قال شكرا ل Delphi4Us على المشاركة المفيدة
  • أبو معاذ
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم