מפתחות זרים ללא מפתחות

מפתח זר - חלון סופימכירים את זה שיש לכם מפתח זר או צורך בכזה ומסד הנתונים אינו תומך בה ונדרשת ממכם הרבה מאוד עבודה בשביל ליישם את זה בעצמכם, או שאתם צריכים לקשר טבלאות מ2 מסדי נתונים שונים (לפעמים אפילו מנוע שונה לגמרי) או אם סתם נמאס לכם כל פעם מחדש לכתוב שאילתות JOIN מעצבנות לחבר 2 טבלאות ואח"כ לשמור רק את ה id של הרשומה במפתח בטבלה אחרת. אז פוסט זה יכול לעזור לכם.

אם אתם זוכרים, כתבתי בעבר על כך שבלזרוס יש סדרת מחלקות אשר נקראות בשם הכולל TDataSet, והן בעצם משהו באמצע בין ORM לבין כלי כדוגמת Perl DBI. עכשיו תוכלו לראות עוד דוגמא לכך.

כאשר צריך לפתח סביבה גרפית המשתמשת במפתחות זרים (או פשוט לייבא מידע מטבלה אחרת), אז TDataSet וכמו כן TDBLookupXXXXX נחלצים לעזרתנו ומספקים עבורינו את היכולת הזו ללא קשר אם יש לנו תמיכה ב foreign key או לא, וכאמור גם אם מדובר ב2 מסדי נתונים לגמרי שונים, למשל אחד SQL Server והשני PostgreSQL זה עדיין יעבוד.

לצורך ההדגמה, בואו נבנה באמצעות SQLite3 טבלאות:

DROP TABLE IF EXISTS "Authors";
CREATE TABLE Authors (ID AUTOINC_INT , Author VARCHAR(255));
DROP TABLE IF EXISTS "Comments";
CREATE TABLE Comments (ID AUTOINC_INT , Author INTEGER , Comment TEXT);

הסיבה שבחרתי ב SQLite 3 היא בזכות העובדה הפשוטה שאין לה תמיכה במפתחות זרים, וכך אפשר בעצם לבדוק שהאפשרות עובדת בכל מקרה.

אז יצרנו 2 טבלאות:

  1. טבלת יוצרים
  2. טבלת הערות

עכשיו נבנה ממשק פשוט מאוד ל 3 חלונות:

הראשון יהיה בעצם ה DataModule שלנו, בו אנחנו שומרים את המידע על מסד הנתונים והטבלאות.

ב DataModule נשים 2 רכיבי TDataSource וכן 2 רכיבי TSqlite3Dataset. נקשר בין רכיבי ה TDataSource לבין כל אחד מהטבלאות שנרצה כך שכל אחד מהם יצביע על טבלה אחרת. נבחר בייחד את 2 הטבלאות ונגיד להם איפה לשמור את מסד הנתונים ואת השם של מסד הנתונים.

נספק שם טבלה לכל רכיב טבלה, כלומר אחד Comments והשני Author.  עכשיו במקום לכתוב את השאילתא למעלה, נלחץ 2 לחיצות על הרכיב של Authors ויפתח לנו חלון שיאפשר לנו ליצור שרות:

  1. שדה ID יהיה Autoinc
  2. שדה Author יהיה מסוג String.

עכשיו נלחץ על הכפתור של Create Table והטבלה תיווצר. במידה ומסד הנתונים לא קיים, אז גם מסד הנתונים יווצר עבורינו (אבל אם הוא קיים, הוא לא יצור אותו מחדש).

עכשיו אחרי שנסגור את החלון, נלחץ 2 לחיצות על טבלת הComments, וניצור 3 שדות:

  1. שדה ID – יהיה Autoinc
  2. שדה Comment – יהיה מסוג Memo
  3. שדה Author – יהיה מסוג Integer.

לאחר מכן, ניצור את ההטבלה ולא נשכח לשמור את המידע בחלון ה DataModule.

עוד דבר שמאוד חשוב לדעת על TDataSet הוא שיש פעולות כמו יצירת מסד נתונים, טבלאות וכו', אשר ניתן לבצע באמצעות קוד טבעי ללא שימוש בשאילתות SQL והחלון למעלה של יצירת הטבלה משתמש באותן יכולות, ומאפשר לנו בצורה גרפית לבצע את זה.

עכשיו נחזור לחלון השני (שיהיה הראשון בעצם) אשר יהיה בעצם החלון עבור ההערות, בו אנחנו נשים 3 רכיבים מעורי מסדי נתונים:

  1. TDBNavigator – מאפשר לנו כזכור לבצע פעולות לטבלה בלי שנכתוב שם קוד בשביל שזה יתבצע
  2. TDBMemo – כאן בעצם נכתוב את ההערות שיש (הרי בחרנו לספק ל Comment להיות מסוג טקסט)
  3. TDBLookupComboBox – כאן זה ה"קסם" שלנו לגבי התמיכה במפתח זר

מוסיף גם 2 TLabel כתאור ל2 הרכיבים האחרונים וכפתור סגירה לחלון.

עוד כפתור שארצה להוסיף יהיה מסוג TSpeedButton אשר יפתח לנו חלון שיאפשר לנו לעעבוד עם טבלת היוצרים במידת הצורך (במקרה הזה, זו הדרך היחידה ליצור, לערוך ולמחוק יוצרים).

ב ObjectInspector אחרי שבחרנו ברכיב ב TDBLookupComboBox נהיה צריכים להגדיר את השדות הבאים לפי הסדר:

  1. DataSource – יצביע על שדה הDataSource עבור טבלת ה Comments
  2. DataField – יצביע על שדה Author.
  3. ListSource – יצביע על שדה הDataSource עבור טבלת ה Authors
  4. FieldList – יצביע על שדה ה Author
  5. KeyField – יצביע על שדה ה ID

וזה כל הקסם (מקושר לשיר, כי אי אפשר בלי מוזיקה כשמתכנתים:) )

בשביל לפתוח את החלון של עריכת ה Authors בכפתור נשתמש את זה בצורה הבאה תחת OnClick:

procedure TComments.OpenAuthorsClick ( Sender : TObject ) ;
begin
  Authors := TAuthors.Create(Self);
  try
    Authors.ShowModal;
  finally
    Authors.Close;
    FreeAndNil(Authors);
  end;
  if not DataModule.dbAuthors.Active then
    DataModule.dbAuthors.Open;
end;

למעשה כמו שניתן לראות, אין הרבה קוד שאנחנו כותבים כאן בכלל ומרבית הקוד שאנחנו כותבים הוא מאוד גנרי ופשוט.

את הקוד המלא ניתן להוריד מכאן.

מחשבה אחת על “מפתחות זרים ללא מפתחות

להשאיר תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s