delphi4arab منتديات دلفي للعرب
كيف أعمل ربط بن جدولين؟ - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : كيف أعمل ربط بن جدولين؟ (/showthread.php?tid=10741)

الصفحات: 1 2


كيف أعمل ربط بن جدولين؟ - ALG2009 - 05-04-2020

السلام عليكم
كيف أقوم بربط جدولين بعلاقة 1,N في قاعدة البيانات من نوع فايربيرد مع العلم أني حاولت الحصول على برنامج مجاني ولم أجد؟


RE: كيف أعمل ربط بن جدولين؟ - larbiparadox - 05-04-2020

وعليك السلام

نفترض أن لدينا قاعدة بيانات كمثال إسمها DATABASE.FDB

تحتوي على :

- جدول الرئيسي الاب (1) إسمه PERE يحتوي على الحقول التالية CODE و NOM و OBS

- جدول ثانوي الابن (N)  إسمه FILS يحتوي على الحقول التالية CODE و NOM_FILS و AGE

العلاقة بين الجدولين هو  CODE أي كل أب له مجموعة من الأولاد

---------------------------------------------------------------------------

* لمذا أختار فايربيرد ؟

- إذا كنت أريد كتابة برنامج لمستعمل واحد لا يحتاج المشاركة ، لكن قاعدة البيانات ضخمة

- أحتاج البرنامج للعمل على الشبكة

- يمكن لعدة منصات للولوج إلى قاعدة البيانات

- إلخ ... توجد عدة أسباب لاختيار

---------------------------------------------------------------------------

تعريف فايربيرد :

نبذة تاريخية
انبثقت فايربيرد من الشفرة المصدرية لقاعدة بيانات انتربيس 6.0 من بورلاند. وهي مفتوحة المصدر ولا يوجد بها ترخيص مزدوج. وسواء احتجت إليها لتطبيقات تجارية أو مفتوحة المصدر، فهي مجانا بالكامل!
تقنية فايربيرد قيد الاستخدام منذ 20 عاما، مما يجعلها منتجا شديد النضوج والاستقرار.
المميزات الرئيسية
لا يغرنك حجم المثبت! فايربيرد هو نظام قوي ومكتمل المزايا لإدارة قواعد البيانات العلائقية. ويمكنه مناولة قواعد بيانات حجمها من مجموعة كيلو بايت فقط إلى العديد من الغيغابايت مع أداء جيد ودون الحاجة إلى صيانتها في أغلب الأحوال!

[/url]
المصدر من الموقع الرسمي

النسخ النهائية للتحميل

Firebird 2.5

Firebird 3.0

للتحميل من الموقع الرسمي

كما توجد Firebird 4.0 فهي تطوير مستمر Beta  ليست نهائية

لتحميل من الموقع

---------------------------------------------------------------------------

- قاعدة Firebird يمكن تثبيتها على Linux x86 و Linux AMD64 و windows x86 x64

* معلومات مهمة : لو ثبتنا Firebird 2.5 وأنشأنا بها قاعدة البيانات فستكون نسختها اصدار (ODS) 11.2 فلا يمكن فتحها بنسخة أخرى

إذا ما هو ODS هو إختصار لـ On Disk Structure  أي تحتوي كل قاعدة بيانات Firebird على بنية محددة جيدًا. يشير رقم إصدار ODS (على بنية القرص) المخزن في صفحة رأس قاعدة البيانات إلى إصدار ODS المستخدم في قاعدة البيانات هذه.

نسخة Firebird 2.5 رقم اصدار  البنية الخاص بها ODS هو 11.2

نسخة Firebird 3.0 رقم اصدار  البنية الخاص بها ODS هو 12.0

* كما توجد نسخ تدمج مع البرنامج لا تثبت embedded أي بإختصار محمولة لا نحتاج الى تثبيت فيربيد و لا تعمل على الشبكة

* اسم المستعمل الفتراضي لقاعدة البيانات : sysdba

* كلمة المرور الافتراضية لقاعدة البيانات : masterkey

- بنسبة لكلمة المرور يمكننا تغييرها بعد التنصيب عند النسخ 2.5 و الخلف ، أما النسخة 3.0 يمكن تغييرها عند التثبيت

--------------------------------------------

ما هي البرامج التي تساعدني في إنشاء قواعد بيانات الفيربيرد :

البرامج المجانية :

* برنامج FlameRobin :   موقع البرنامج     التحميل  من هنا لتحميل

* برنامج TurboBird: موقع البرنامج

أما البرامج التجارية :

*برنامج  Firebird SQL Studio v6.0.2.487 و Firebird Database Designer v6.0.1.470 موقع البرامج من هنا

*برنامج  Firebird Maestro موقع البرنامج من هنا

* برنامج IBExpert Personal Edition تعد أفضل برنامج ، موقع البرنامج [url=www.ibexpert.net]من هنا ، كما توجد نسخة Free لكنها محدودة الخصائص

--------------------------------------------

* سأثبت برنامج FlameRobin ، أمر مهم إذا ثبت فيربيد x32 يجب تثبيت FlameRobin x32

- نقوم بإنشاء قاعدة بيانات المذكورة في أول الموضوع DATABASE.FDB و التي تحتوي على جدولين PERE و FILS

و كل جدول بدوره يحتوي على حقول PERE  (CODE و NOM و OBS)     ،   FILS (CODE و NOM_FILS و AGE)

[صورة: 280343157.png]


[صورة: 103613746.png]


يتبع .....


RE: كيف أعمل ربط بن جدولين؟ - larbiparadox - 06-04-2020

إتمام المشاركة السابقة
..................................

- بعد أن أنشأة قاعدة البيانات  DATABASE.FDB سأقوم بكتابة الجداول عن طريق لغة SQL

- لتنظيم أسماء الجداول سأسمي جدول الاب بـ TABLE01_PERE و جدول الابن بـ TABLE02_FILS

تكون كتابة جدول الاب كتالي
كود :
CREATE TABLE TABLE01_PERE (
  CODE  INTEGER NOT NULL PRIMARY KEY,
  NOM   VARCHAR(20),
  OBS   VARCHAR(20)
);

- هنا قلنا أشأ جدول إسمه TABLE01_PERE
- و يحتوي الجدول على الحقل CODE هذا يأخذ أعداد صحيحة INTEGER و لا يقبل أن يكون فارغ NOT NULL و لا تكرر القيم PRIMARY KEY
- الحقل NOM و OBS تكون قيمته نصية VARCHAR طولها 22 حرف

* كملاحظة بنسبة للحقول النصية بأغلب نستعمل CHAR ، يسألني شخص لماذا إستعملت VARCHAR ، أولا يجب أن نعرف الفرق بينهما
   كمثال : لو أني أخزن قيم ثابة كمثال طول النص 2 من حروف ، إذا كانت القيمة باللغة أجنبية تكون كمثال القيمة AB ليس بمشكل ، وإذا كانت باللغة العربية
   و كتبنا كمثال أب إذا البرنامج يدعم unicode سيخزنها أب و العكس تخزن برموز و عدد الحروف سيفوق ما سرحنا به
    ومنه نستنتج أن CHAR  يكون ثابت طول الحروف و VARCHAR يكون متغير طول الحروف


- بالنسبة للحقل CODE سأجعله يأخذ قيمة تلقائية ، أقصد ترقيم تلقائي Autoincrement تكون الكتابة SQL كتالي

الخطوة الأولة سأنشأ حقل GENERATOR وفائدة منه تخزن فيه أخر قيم الحقل الترقيم تلقائي تكون تسميته GEN_TABLE01_PERE_ID
كود :
CREATE GENERATOR GEN_TABLE01_PERE_ID;


الخطوة الاثانية سننشأ TRIGGER نستطيع أن نقول كأنه إجراء مهامه عند إضافة حقل سيقوم بعملية حساب إضافة قيمة المخزنة في الحقل GENERATOR
كود :
SET TERM ^ ;

CREATE TRIGGER TABLE01_PERE_BI FOR TABLE01_PERE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.CODE IS NULL) THEN
    NEW.CODE = GEN_ID(GEN_TABLE01_PERE_ID,1);
END^

SET TERM ; ^

- نشرح الكتابة:  بالنسبة إلى ;^ SET TERM   نحن نقول يبدأ من و ينتهي عند^ ; SET TERM    
- ننشأ TRIGGER إسمه TABLE01_PERE_BI خاصة بالجدول TABLE01_PERE ، في حالة نشاط BEFORE INSERT عند إدراج حقل يعطي قيمة جديدة للحقل CODE وذلك بالجمع عن طريق الدالة GEN_ID بإضافة 1 إلى حقل GENERATOR المسمى GEN_TABLE01_PERE_ID
 

* يمكننا الإستغناء على الخطوة الاولة و الثانية فهي خاصة بالترقيم التلقائي ، وهذا بإعطاء قيمة مباشرة عند حجز البيانات


* الان إنشاء الجدول TABLE02_FILS ، أضن أنه لا يحتاج إلى شرح
كود :
CREATE TABLE TABLE02_FILS (
  CODE      INTEGER NOT NULL,
  NOM_FILS  VARCHAR(20),
  AGE       VARCHAR(20)
);


يتبع ...

إتمام المشاركة السابقة

..................................

شرح بعض الامور الاساسية الخاصة بـ FlameRobin

[صورة: 447733431.png]
1 - فتح قاعدة بيانات موجودة من قبل
2 - إشاء قاعدة بيانات
3 - إنشاء جدول
4 - إظهار قيم الجدول
5 - محرر كود SQL
6 - مجموعة من خيارات تسهل علينا الكتابة من : فتح و إدراج و تحديث و وحذف ،... إلخ ، كل يأتي منسق ما عليك سوى التعديل



يتبع ....


RE: كيف أعمل ربط بن جدولين؟ - larbiparadox - 06-04-2020

إتمام المشاركة السابقة
..................................

الان إلى عملية الربط:

بواسطة دلفي 7 : يعتمد الدلفي على مكونات InterBase لربط بقواعد البيانات ، نعلم جيدا أن أصل FireBird هو InterBase و تابع الملف هو .GDB و الفيربيرد هو .fdb

[صورة: 222395749.png]

* الأن إلى إدراج مكونات الربط : 

1 - IBDatabase1 : هو لربط قاعدة البيانات ، نفترض أن مسار قاعدة البيانات في جهازي أو جهاز أخر هو C:\FDB1\DATABASE.FDB

الان يجب معرفة بعض الامور: إذا كنت أريد الاتصال بقاعدة البيانات على نفس الجهاز أي محلي يكون عنوانه : localhost أو 127.0.0.1

الإعدادات :

الاتصال من جهاز محلي :

[صورة: 453054413.png]

1 - نختار إتصال عن بعد
2 - إسم الجهاز المحلي localhost أو 127.0.0.1  و بعدها إسم محرك الاقراص c  تكتب على هذا الشكلlocalhost\c \\
3 - مسار قاعدة البيانات بدون إسم محرك القرص FDB1\DATABASE.FDB\
4 - إسم المستعمل
5 - كلمة الامرور
6 - طريقة الكتابة
7 - فحص الاتصال


الاتصال بجهاز أخر :

- نفترض أن لدينا جهاز أخر عنوان ip هو 192.168.137.10 و إسم الجهاز PC2-PC

* كيفية معرفة عنوان ip و اسم الجهاز
[صورة: 708311473.png]
- عن طريق CMD نكتب ipConfig  ، أما إسم الجهاز بواسطة إقونة جهاز كمبيوتر كليك يمين


2 - IBTable1 و IBTable2 وهذا ربطهما بالجدولين الاب و إبن و بعدها نربطهما مع  IBTransaction1 لا يمكننا ربطه مباشرة مع IBDatabase على عكس IBQuery

3 - IBTransaction1 وسيط لعمل Transaction بين IBTable و IBDatabase

و DataSource لربطهما مع DBGrid



يتبع ....

إتمام المشاركة السابقة
..................................

الاتصال بجهاز أخر :

- إذا كان ip ثابت ، نستعمل ip أما إذا كان متغير نستعمل إسم الجهاز

- الأن لدينا جهاز أخر عنوانه ip هو 192.168.137.10 و إسم الجهاز PC2-PC

- و قاعدة البيانات موجودة في مجلد إسمه FDB2 الموجود في محرك الاقراص :C و قاعدة البيانات إسمها DATABASE.FDB

* شيئ مهم بالنسبة لـ windows7  أو مضاد الفيروسات يجب سماح الاتصال بالمنافذ و المشاركة بالنسبة للنظام كتالي

[صورة: 278956141.png]

التأكد من ip  عن طريق ping
[صورة: 183910126.png]

الان عملية الاتصال

[صورة: 648052403.png]




 يتبع ....

إتمام المشاركة السابقة
..................................

الان إلى عملية الربط بين الجدولين:


يجب إدراج معلومات وهذا كي يتسنى لنا الربط بين الاب و الابن

- على سبيل المثال الاب الاول رقم code  يساوي 1  و بتالي رقم code  أبنائه هو 1 ، نفس الشئ للاب الثاني رقم code  يساوي 2  و بتالي رقم code  أبنائه هو 2

يكون كتالي

[صورة: 377831983.png]

الان إلى عملية عند الضغط على الاب الاول يظهر أبنائه و نفس الشئ للاب الثاني

[صورة: 715336103.png]

1 - نضغط مرة واحدة أو نحدد جدول الابن IBTable2
2 - من MasterSource نختار DataSource الاب والذي اسمه DataSource1 و الذي هو المتحكم
3 - في MasterFields نضغط على قفل الذي فيه ثلاث نقاط ... تخرج النافذة
4 - نحدد الحقل المشترك لابن
5 - و بعدها نحدد الحقل المشترك للاب
6 - نضغط على اضافة
7 - تأكيد الاعدادات

و الان النتيجة ، عند الضغط في DBGrid1 الخاص بالاب يظهر فقط الابنائه في  DBGrid2 نفس السئ للاب الثاني يظهر ابنائه

[صورة: 899356651.png]


* اردت التبسيط لكيف تصل الفكرة

- ليس بالضرورة اتباع نفس الاسلوب توجد عدة طرق للربط

* والكل من هذا أن دلفي 7 لم يعد يلبي جميع متطلبات المبرمجين ، مثلا أنا عندي سنوات لم أبرمج به

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

بالتوفيق


RE: كيف أعمل ربط بن جدولين؟ - ALG2009 - 06-04-2020

جزاك الله خير وأدخل الجنة عل هذا الشرح الرائع
لقد طبقت الربط مع العلم أني استخدم فايرداك
وهنا لي سؤال لماذا قمت الربط بالدلفي أليس الربط يكون في قاعدة البيانات نفسها اي ربط الجدولين داخل قاعده البيانات؟
وأريد أ أسألك أيضا ما الفرق بين الربط بالدلفي كما قمت بشرحه والربط داخل قاعده البيانات هل هناك خصائص لكل منها؟


RE: كيف أعمل ربط بن جدولين؟ - larbiparadox - 06-04-2020

(06-04-2020, 04:43 PM)ALG2009 كتب : جزاك الله خير وأدخل الجنة عل هذا الشرح الرائع
لقد طبقت الربط مع العلم أني استخدم فايرداك
وهنا لي سؤال لماذا قمت الربط بالدلفي أليس الربط يكون في قاعدة البيانات نفسها اي ربط الجدولين داخل قاعده البيانات؟
وأريد أ أسألك أيضا ما الفرق بين الربط بالدلفي كما قمت بشرحه والربط داخل قاعده البيانات هل هناك خصائص لكل منها؟

أولا شكرا لك

- بالنسبة للربط يكون في البرنامج لأنه هو الذي يظهر النتيجة ،  وهذا وفقط معطيات المخزنة في قاعدة البيانات ،لكن في تصميم قاعدة البيانات يظهر لك ذلك ان الجداول مربوطة مع بعضها البعض

- توضع في قاعدة البيانات حقول مشتركة للربط بينها و بين الجداول ، أضن أن فكرتك جائت من Access حتى ولو رأيت الربط لكن البرنامج هو الذي يقوم بذلك

كمثال يمكن فتح جدولين على انهما جدول واحد عن طريق sql لكن وفق حقول مشتركة

- بمعنى أخص أن البرنامج يطلب من SGBD  وهو يعيد له مايطلب

ربما تجد من الاخوة في المنتدى يشرحها افضل مني


RE: كيف أعمل ربط بن جدولين؟ - ALG2009 - 06-04-2020

جزاك الله خيرا وحفظك من كل سوء
في انتظار الجواب من البقية وتوضيح الغموض
وكيف يمكن الربط بين جدولين علاقة 1 الى 1 ؟


RE: كيف أعمل ربط بن جدولين؟ - larbiparadox - 06-04-2020

(06-04-2020, 09:14 PM)ALG2009 كتب : جزاك الله خيرا وحفظك من كل سوء
في انتظار الجواب من البقية وتوضيح الغموض
وكيف يمكن الربط بين جدولين علاقة 1 الى 1 ؟

شكرا اخي الكريم

استعمل sql  عن طريق SQL Joins

كمثال

كود :
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;

توجد عدة خيارات
  • (INNER) JOIN: إرجاع السجلات التي تحتوي على قيم متطابقة في كلا الجدولين
  • LEFT (OUTER) JOIN:  إرجاع جميع السجلات من الجدول الأيسر ، والسجلات المتطابقة من الجدول الأيمن
  • RIGHT (OUTER) JOIN: إرجاع كافة السجلات من الجدول الأيمن والسجلات المتطابقة من الجدول الأيسر
  • FULL (OUTER) JOIN:إرجاع جميع السجلات عندما يكون هناك تطابق في الجدول الأيسر أو الأيمن
[صورة: 254034929.png]


RE: كيف أعمل ربط بن جدولين؟ - ALG2009 - 07-04-2020

على ما أظن Join تستخدم مع الجدول المربوطه في قاعدة البيانات وهذا ما لم أجد له إجابة لحد الآن ؟

أنت قلت بأن 

إقتباس :[size=small]1 - نضغط مرة واحدة أو نحدد جدول الابن IBTable2[/size]
[size=small]2 - من MasterSource نختار DataSource الاب والذي اسمه DataSource1 و الذي هو المتحكم[/size]
[size=small]3 - في MasterFields نضغط على قفل الذي فيه ثلاث نقاط ... تخرج النافذة[/size]
[size=small]4 - نحدد الحقل المشترك لابن[/size]
[size=small]5 - و بعدها نحدد الحقل المشترك للاب[/size]
[size=small]6 - نضغط على اضافة[/size]
[size=small]7 - تأكيد الاعدادات[/size]


وقلت بأن هذه الطريقة هي علاقة 1,n فكيف يمكن تمثيل العلاقة 1,1 ؟ هل تمثل بنفس الطريقة!!

بهذا أعيد السؤال 
كيف أقوم بربط جدولين بعلاقة 1,N في قاعدة البيانات من نوع فايربيرد مع العلم أني أحاول الحصول على برنامج مجاني ولم أجد؟


RE: كيف أعمل ربط بن جدولين؟ - larbiparadox - 08-04-2020

(07-04-2020, 01:29 PM)ALG2009 كتب : على ما أظن Join تستخدم مع الجدول المربوطه في قاعدة البيانات وهذا ما لم أجد له إجابة لحد الآن ؟

أنت قلت بأن 

إقتباس :[size=small]1 - نضغط مرة واحدة أو نحدد جدول الابن IBTable2[/size]
[size=small]2 - من MasterSource نختار DataSource الاب والذي اسمه DataSource1 و الذي هو المتحكم[/size]
[size=small]3 - في MasterFields نضغط على قفل الذي فيه ثلاث نقاط ... تخرج النافذة[/size]
[size=small]4 - نحدد الحقل المشترك لابن[/size]
[size=small]5 - و بعدها نحدد الحقل المشترك للاب[/size]
[size=small]6 - نضغط على اضافة[/size]
[size=small]7 - تأكيد الاعدادات[/size]


وقلت بأن هذه الطريقة هي علاقة 1,n فكيف يمكن تمثيل العلاقة 1,1 ؟ هل تمثل بنفس الطريقة!!

بهذا أعيد السؤال 
كيف أقوم بربط جدولين بعلاقة 1,N في قاعدة البيانات من نوع فايربيرد مع العلم أني أحاول الحصول على برنامج مجاني ولم أجد؟

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

و بالنسبة إلى Join تكون النتيجة في جدول واحد ، أي دمج عدة جداول مع بعضها البعض وفق شروط معينة