טבלאות מערכת וטבלאות פרטיות
|
במערכת התסריטים של הייפר, טבלה היא האובייקט המרכזי לאחסון וטיפול בנתונים.
לרוב, הנתונים המוצגים למשתמש במסך מקורם בטבלאות ומולן עובד קוד התסריט אם לטובת שינוי ערכים ואם לטובת בדיקות, חישובים ופלטים. שרת הנתונים ומודול התסריטים של הייפר מכיר שני סוגי טבלאות: ThTable ו־ThPrvTable המוסברות בהמשך. לצורך הדמיה דמיין שטבלת נתונים של הייפר היא כמו גליון EXCEL המכיל ריבוי טורים (שדות), ולכל טור יש מאפיינים כגון:
עליך להבין כי טבלת נתונים בהייפר היא אינה טבלת SQL, אלא אובייקט יחודי של התוכנה ופעולות כגון שאילתות טעינת נתונים וגישה לנתוני טבלאות מתבצעות באמצעות סט פקודות ייחודי להייפר כמוסבר בהמשך ההדרכה. עץ הניווט של עורך התסריטים (המוצג בצד שמאל של החלון) מנגיש למתכנת את אובייקטי הטבלאות הרלוונטיות והזמינות לאותו המודול ממנו הוא נפתח. לדוגמה, כפי שניתן לראות בתמונה 1 - מודול התסריטים הנפתח מחלון הלקוח, מנגיש למתכנת (אוטומטית) גישה לרשומת הלקוח עצמו יחד עם רשומות קשורות מהטבלאות:
למרות שמודול התסריטים מנגיש מספר טבלאות מצומצם לאותו החלון, ניתן לייצר גישה לכל הטבלאות בהייפר באמצעות קוד ייעודי כמודרך בהמשך (לדוגמה: תמונה 2). |
תמונה 1: טבלאות מונגשות כברירת מחדל בהתאם למודול![]() |
תמונה 2: טבלאות שנוצרו ידנית על ידי כותב הקוד
![]() |
הערות:
- ההדרכה והדוגמאות בעמוד זה ניתנות על כרטיס לקוח, אך הן רלוונטית לכל שאר המודולים של הייפר בהתאמה.
-
לפני שאתה מתחיל לעבוד על טבלת נתונים וודא שאתה מכיר את מבנה, תוכן וקשרי הטבלה לטבלאות נסמכות וקשורות !
לרשותך מדריך הטבלאות המקוון שלנו כאן
ההבדל בין ThTable לבין ThPrvTable
| סוג טבלה | מאפיין מרכזי | מה בפועל מקבלים |
|---|---|---|
| טבלה מערכתית מלאה לפי סכימה קיימת | תכיל את כל שדות הטבלה כפי שהוגדרו בסכימת המערכת, לרבות המאפיינים והרשאות עבודה של שדות הטבלה | |
| טבלה פרטית בשליטת התסריט | מקושרת לטבלת מערכת, אך מכילה רשימת שדות שנבחרו סלקטיבית (באמצעות קוד התסריט), ללא יישום הרשאות גישה ועריכה של טבלת המערכת |
מתי משתמשים בכל סוג טבלה
ThTable מתאים כאשר:- עובדים מול טבלת מערכת מלאה של ישות או כל מודול אחר למשל: ClientTb (לקוחות), ContactsTb (אנשי קשר), Monthly_BillingTb (הוראות קבע) וכיו"ב.
- נדרשת גישה מלאה לשדות הקיימים בטבלה כפי שהוגדרו בסכימה ובהתחשב בהרשאות.
- צריך לבצע Load/Query/Update על כל נתוני ישות/טבלה קיימת.
- צריך לבצע הוספת רשומות חדשות לאותה טבלה מערכתית קיימת.
ThPrvTable מתאים כאשר:
- צריך טבלת עבודה מקומית לצורך דיאלוג, בחירה זמנית, עיבוד ביניים או תצוגת עזר.
- רוצים לעבוד רק עם תת־סט שדות במקום כל שדות טבלת המקור.
- נדרש מבנה שדות דינמי שמוגדר על ידי התסריט עצמו.
- נדרש לבצע עדכון נתונים נקודתי לשדה אחד או יותר ברשומה קיימת.
יצירת טבלה (ThTable / ThPrvTable)
באפשרותך לייצר ו"לקשור" למודול הרלוונטי טבלת מערכת מלאה או פרטית (לבחירתך ובהתאם לצורך).כל טבלה שתייצר חייבת להיקשר לטבלה כלשהי בסכימה של מסד הנתונים. כלומר, לא ניתן לייצר טבלה חדשה במבנה מומצא שלא מבוסס על אחת הטבלאות הקיימות בסכימה של מסד הנתונים של הייפר.
הטבלה שתיצור תהיה קשורה וזמינה לאותו החלון/מסך/דוח כל עוד שהוא פעיל והיא תשוחרר אוטומטית במעמד סגירתו.
תהליך יצירת טבלה המוסבר בפרק זה יוצר רק את "שלד" הטבלה ללא נתונים. טעינה או השמה של נתונים לטבלה מוסברת בהמשך ההדרכה.
יצירת טבלת מערכת (ThTable) באמצעות Fman.Create_Table
באפשרותך לייצר טבלת מערכת על ידי כתיבת קוד ידני או באמצעות הפעלת אשף יצירת הטבלאות בעץ הניווט.האשף מנגיש למתכנת ממשק ויזואלי שבסופו מיוצר אובייקט טבלה (מאותחל) בעץ הניווט וקוד בלוח הגזירים (Clipboard) המחכה להדבקתו בתסריט.
| הנחיות ביצוע | תמונות להמחשה |
|---|---|
|
|
קוד יצירת הטבלה המיוצר ע"י האשף
Var ServTicket: ThTable;
ServTicket:= Fman.Create_Table('hyp_Service Ticket', 'ServTicket', False);
ServTicket:= Fman.Find_Table('ServTicket');
| קוד | הסבר יישום |
|---|---|
| Var ServTicket: ThTable; |
הכרזה ויצירת אובייקט מסוג טבלת מערכת.
ניתן ליישום בכל פרוצדורה/אירוע בתסריט, אבל אם מיושם בהתחלת הקוד כפרמטר גלובאלי, אזי לא יידרש לבצע שימוש בפקודה FIND המוסברת בהמשך. |
| ServTicket:= Fman.Create_Table('hyp_Service Ticket', 'ServTicket', False); |
אתחול האובייקט עם טבלה חדשה.
|
| ServTicket:= Fman.Find_Table('ServTicket'); | במידה והטבלה אינה גלובאלית אלא נמצאת בתוך פרוצדורה/פונקציה/אירוע, יש לקרוא לפקודת Find בכדי לחדש באותו נקודת קוד את הקישור לטבלה ולאפשר את המשך הגישה לנתונים. |
דוגמאות ליישום קוד יצירה (ThTable)
טבלה גלובאלית המאפשרת גישה מכל מקום בתסריט:// הכרזה בראש התסריט
VAR ServTicket: ThTable;
//=== INIT ===
Procedure Init;
Begin
// יצירה ואתחול הטבלה בשלב ה- Init
ServTicket:= Fman.Create_Table('hyp_Service Ticket', 'ServTicket', False);
End;
Procedure GetClientServiceTickets;
Begin
// כאן נעבוד מול הטבלה: טעינת נתונים וכיו"ב
End;
יצירה והכרזה ב- INIT וגישה מכל מקום אחר.
במקרה הזה, מכיוון שהאובייקט "ServTicket" שהוכרז באירוע INIT אינו זמין לפרוצדורה אחרת
העבודה מול הטבלה תתחיל קודם כל בחידוש הקישור ע"י הכרזה (שורה 11) + FIND (שורה 13) ורק אז ניתן לבצע המשך עבודה מול הטבלה...
חידוש הקישור נדרש מכיוון שאובייקטי הטבלאות הנוצרים בכל פרוצדורה פרטית או אירוע מערכת שהוא (כגון INIT), מוחזקים על ידי מנהל החלונות "Frame Manager" (מכאן השם Fman בממשק).
//=== INIT ===
Procedure Init;
VAR ServTicket: ThTable;
Begin
// יצירה ואתחול הטבלה בשלב ה- Init
ServTicket:= Fman.Create_Table('hyp_Service Ticket', 'ServTicket', False);
End;
Procedure GetClientServiceTickets;
VAR ServTicket: ThTable;
Begin
ServTicket:= Fman.Find_Table('ServTicket');
// המשך עבודה מול הטבלה...
End;
יצירה, הכרזה ושימוש הכל בתוך פרוצדורה/אירוע אחד - לא רלוונטי לאירוע INIT בגלל שלא מדובר רק ביצירת הטבלה
Procedure DoSomething;
Var ServTicket: ThTable;
Begin
ServTicket:= Fman.Create_Table('hyp_Service Ticket', 'ServTicket', False);
ServTicket:= Fman.Find_Table('ServTicket');
// המשך עבודה מול הטבלה ...
End;
יצירת טבלה פרטית (ThPrvTable) באמצעות Fman.Create_PrvTable
ממשק יצירת טבלה פרטית דומה מאוד ליצירת טבלת מערכת.גם כאן מומלץ להשתמש באשף יצירת הטבלה הפרטית הפועל באותה הצורה כמו בטבלת מערכת.
| הנחיות ביצוע | תמונות להמחשה |
|---|---|
|
|
קוד יצירת הטבלה המיוצר ע"י האשף
Var ServTicket: ThPrvTable;
ServTicket:= Fman.Create_PrvTable('hyp_Service Ticket', 'ServTicket',
['Ticket Number','Ticket Status','Priority','About Order No.','Ticket Source','Title','Subject / Complain'], True);
ServTicket:= Fman.Find_PrvTable('ServTicket');
| קוד | הסבר יישום |
|---|---|
| Var ServTicket: ThPrvTable; |
הכרזה ויצירת אובייקט מסוג טבלה פרטית.
ניתן ליישום בכל פרוצדורה/אירוע בתסריט, אבל אם מיושם בהתחלת הקוד כפרמטר גלובאלי, אזי לא יידרש לבצע שימוש בפקודה FIND המוסברת בהמשך. |
| ServTicket:= Fman.Create_PrvTable('hyp_Service Ticket', 'ServTicket', ['Ticket Number','Ticket Status','Priority','About Order No.','Ticket Source','Title','Subject / Complain'], True); |
אתחול האובייקט עם טבלה חדשה:
|
| ServTicket:= Fman.Find_PrvTable('ServTicket'); | במידה והטבלה אינה גלובאלית אלא נמצאת בתוך פרוצדורה/פונקציה/אירוע, יש לקרוא לפקודת Find בכדי לחדש באותו נקודת קוד את הקישור לטבלה ולאפשר את המשך הגישה לנתונים. |
הגדרת שדות לטבלה פרטית
בשונה מיצירת טבלת מערכת המאותחלת אוטומטית עם כל השדות של הטבלה המקושרת, תהליך היצירה של טבלה פרטית מקשר אוטומטית רק את שדה/ות המפתח של הטבלה המקושרת,ועל המתכנת להגדיר את שאר שדות הטבלה בכל אחת משלושת הדרכים הבאות:
- באמצעות אשף יצירת הטבלה (השלב השלישי בתהליך)
- באמצעות "Add_DB_Field" - המוסיפה שדה מהסכימה של הטבלה המקושרת
-
באמצעות "Add_Field" - המוסיפה שדה על פי הגדרה פרטנית.
משמע: למרות שהטבלה הפרטית מקושרת לסכימה של טבלת מערכת עם שדה המפתח בלבד, אין חובה ליישם את שאר שדות הסכימה, וניתן להוסיף לטבלה הפרטית כל שדה שתרצה.
רק קח בחשבון שלא ניתן לשמור למסד הנתונים שדות או רשומה שאינה זהה במבנה לסכימה של הטבלה המקושרת!
להלן הסבר אודות קוד הוספת השדות
| קוד | הסבר יישום |
|---|---|
| ServTicket.Add_DB_Field('', ''); |
פונקציה המקבלת 2 פרמטרים ע"פ הסדר הבא ומחזירה ערך: Boolean
|
| ServTicket.Add_Field('', '', he_Integer, False, 0, he_Edit); |
פונקציה המקבלת מספר פרמטרים המגדירים את השדה ומחזירה: Boolean
|
דוגמאות ליישום קוד יצירה (ThPrvTable)
בדוגמה הנוכחית יצרנו טבלה פרטית המקושרת לטבלת לקוחות בהייפר והוספנו לה את השדות הבאים://=== INIT ===//
Procedure Init;
VAR Clients_Found: ThPrvTable;
Begin
// יצירה ידנית ללא שימוש באשף מצריכה להגדיר את שדה המפתח של הטבלה המקושרת (במקרה הזה 'Client Number')
Clients_Found:= Fman.Create_PrvTable('hyp_Clients', 'Clients_Found', ['Client Number'], True);
// הוספת שדות ידנית (מהסכימה) ללא שם ויזואלי...
Clients_Found.Add_DB_Field('Client Full Name', '');
Clients_Found.Add_DB_Field('ID Number', '');
Clients_Found.Add_DB_Field('Handling Status', '');
Clients_Found.Add_DB_Field('Gender', '');
Clients_Found.Add_DB_Field('Created On', '');
Clients_Found.Add_DB_Field('Created By', '');
// הוספת שדה נוסף שאינו בסכימה של טבלת הלקוחות המקושרת
Clients_Found.Add_Field('ID as Int', 'מספר זהות נומרי', he_Integer, False, 0, he_Edit); // הוספת שדה מספר לטבלת הלקוחות לטובת המרה מטקסט למספר
// אתחול הטבלה כמוסבר בהמשך
Clients_Found.GlobalInit;
End;
הפרוצדורה GlobalInit
במידה והנך מייצר טבלה מכל סוג שהוא או מעדכן מבנה שדות באמצעות הקוד לדוגמה: בעקבות הרצת כפתור, אירוע משתמש, פעולה מאוחרת, או יצירת טבלה דינמית שלא עוברת דרך מחזור האתחול הרגיל של המודול או "Compile" ידני,עליך להריץ את הפרוצדורה TblName.GlobalInit בקוד.
GlobalInit לא טוען נתונים מהשרת, אלא "מפעיל" את האובייקט המקומי, בונה/מרענן את "FldSet", מחבר הגדרות סכימה, מכין הרשאות/שדות/UI, ומאפשר ל־ "ThDataGrid" / "ThFieldsArea" לעבוד נכון מול הטבלה.
מתי לא צריך להריץ GlobalInit:
אם הטבלה נוצרת באירוע `Init` כחלק ממחזור האתחול הרגיל של מודול התסריטים, ובמיוחד במודול הדינמי, הקוד שמאחורי המערכת כבר קורא ל- GlobalInit.
שחרור טבלה ידנית
למרות שמנהל החלונות (Fman) אחראי על שחרור הטבלאות ושאר האובייקטים שנוצרו במודול ואיפוס הזיכרון הרלוונטי,באפשרותך לתת הוראת שחרור ידנית לטבלה. הוראה זו מבצעת "חיסול" ושחרור הזיכרון הרלוונטי שנתפס.
2 דרכים להריץ את פקודת השחרור:
TableName.Free
Fman.Free_Table(TableName: String)
להמשך הדרכה בנושא גישה לנתוני טבלאות (Field/Cell והמרות), המשך לעמוד 1722.
להמשך הדרכה בנושא שאילתות, המשך לעמוד 1723.

