חיפוש רשומות בטבלאות באמצעות פקודות Search
לאחר ביצוע שאילתה, מוחזקים ברכיב הטבלה ThTable או ThPrvTable נתונים בזיכרון המקומי.פונקציות ה- Search המוסברות להלן מאפשרות למתכנת לבצע חיפוש ברשומות הטבלאות שבזיכרון, חוסכות כתיבת קוד של לולאות חיפוש ובכך מקצרות את הקוד.
הפונקציות העיקריות הן:
Search(...)
Search_by_Col(...)
SearchRow(...)
SearchRow_by_Col(...)
הערות:
- החיפוש מתבצע על הנתונים שכבר נמצאים בתוך אובייקט הטבלה.
- מספור השורות והעמודות מתחיל מ־0.
ההבדל בין Search לבין SearchRow
שתי משפחות הפונקציות מבצעות חיפוש בתוך הטבלה, אך הן מיועדות לשני דפוסי עבודה שונים.| פונקציה | מחזירה ערך | שימוש עיקרי |
|---|---|---|
| Search | Boolean |
מחזירה True אם נמצאה רשומה מתאימה.
כאשר נמצאה רשומה, הפונקציה מזיזה את הסמן (Row) של הטבלה אל השורה שנמצאה, ומכאן גישה לשדות הרשומה תתבצע באמצעות 1-. |
| SearchRow | Integer |
מחזירה את מספר השורה שנמצאה ללא הזזת הסמן.
מתאימה כאשר רוצים לשמור את מספר השורה במשתנה, לטובת פעולות עתידיות, או להשתמש בו מבלי להסתמך על הרשומה (Row) הפעילה. |
דוגמה בסיסית לשימוש ב־Search:
IF ClientTb.Search(['Client Number'], [], [500001], []) Then
Fman.SB_Message(ClientTb.Field['Client Full Name', -1], False);
בדוגמה זו, לאחר שהחיפוש הצליח, ניתן להשתמש ב־-1
כדי לקרוא מהשורה הפעילה שנמצאה.
דוגמה בסיסית לשימוש ב־SearchRow:
VAR FoundRow: Integer;
Begin
FoundRow:= ClientTb.SearchRow(['Client Number'], [], [500001], []);
IF FoundRow >= 0 Then
Fman.SB_Message(ClientTb.Field['Client Full Name', FoundRow], False);
End;
כאשר משתמשים ב־SearchRow ורוצים להפוך את הרשומה שנמצאה לשורה הפעילה, מבצעים זאת במפורש:
FoundRow:= ClientTb.SearchRow(['Client Number'], [], [500001], []);
IF FoundRow >= 0 Then
ClientTb.Row:= FoundRow;
חיפוש לפי שם שדה או לפי מספר עמודה
ניתן לחפש לפי שם שדה, או לפי מספר עמודה.ברוב הקוד העסקי מומלץ לחפש לפי שם שדה, משום שהקוד נשאר ברור גם אם סדר העמודות בטבלה משתנה.
חיפוש לפי מספר עמודה מתאים כאשר סדר העמודות ידוע ונשלט על ידי הקוד, למשל בטבלה פרטית או בלולאת עיבוד.
| צורת חיפוש | פונקציה מתאימה | מתי להשתמש |
|---|---|---|
| לפי שם שדה | Search / SearchRow | כאשר רוצים קוד ברור ועמיד לשינוי סדר עמודות. |
| לפי מספר עמודה | Search_by_Col / SearchRow_by_Col | כאשר ידוע מראש שהעמודה הרצויה נמצאת באינדקס מסוים. |
שתי הדוגמאות הבאות מחפשות לפי אותו ערך, אם העמודה 0 היא השדה Client Number:
IF ClientTb.Search(['Client Number'], [], [500001], []) Then
Fman.SB_Message(ClientTb.Field['Client Full Name', -1], False);
IF ClientTb.Search_by_Col(0, '', 500001, []) Then
Fman.SB_Message(ClientTb.Field['Client Full Name', -1], False);
מבנה הפרמטרים
בפונקציות החיפוש Search / SearchRow, מעבירים מערכים.המערך הראשון מכיל את שמות השדות, והמערכים הבאים מכילים את ערכי החיפוש כטקסט או כמספר.
| פרמטר | הסבר יישום |
|---|---|
| FldNames | מערך שמות השדות שעליהם מתבצע החיפוש. |
| KeyStr |
מערך ערכי חיפוש טקסטואליים.
כאשר מחפשים לפי ערך מספרי בלבד, מעבירים מערך ריק. |
| KeyNum |
מערך ערכי חיפוש מספריים.
כאשר מחפשים לפי ערך טקסטואלי בלבד, מעבירים מערך ריק. |
| Options |
מערך אפשרויות חיפוש.
האפשרויות הקיימות הן he_Bckwrd ,
he_CaseSens ו־he_First_Check_Row .
|
דוגמת חיפוש לפי שדה מספרי:
IF ClientTb.Search(['Client Number'], [], [500001], []) Then
ClientName:= ClientTb.Field['Client Full Name', -1];
דוגמת חיפוש לפי שדה טקסט:
IF ClientTb.Search(['Client Full Name'], ['John Smith'], [], []) Then
ClientNumber:= ClientTb.IField['Client Number', -1];
דוגמת חיפוש לפי כמה שדות:
IF ClientTb.Search(['Client Number', 'Handling Status'], [], [500001, 1], []) Then
Fman.SB_Message('Client found.', False);
בגרסת החיפוש לפי עמודה, מעבירים מספר עמודה וערך חיפוש אחד.
| פרמטר | הסבר יישום |
|---|---|
| Column | מספר העמודה בטבלה. העמודה הראשונה היא 0. |
| KeyStr |
ערך חיפוש טקסטואלי.
כאשר מחפשים לפי מספר, מעבירים מחרוזת ריקה. |
| KeyNum |
ערך חיפוש מספרי.
כאשר מחפשים לפי טקסט, מעבירים 0. |
| Options |
מערך אפשרויות חיפוש.
האפשרויות הקיימות הן he_Bckwrd ,
he_CaseSens ו־he_First_Check_Row .
|
האפשרות he_First_Check_Row
האפשרותhe_First_Check_Row
גורמת למנגנון החיפוש לבדוק קודם את השורה הפעילה הנוכחית של הטבלה.
אם השורה הפעילה מתאימה לערכי החיפוש, הפונקציה מחזירה אותה מיד.
אם השורה הפעילה אינה מתאימה, החיפוש ממשיך לסריקה רגילה של הטבלה.
כלומר, האפשרות אינה משנה את נקודת ההתחלה של כל הסריקה, אלא מוסיפה בדיקה מוקדמת של Row הנוכחי.
בפונקציות Search האפשרות הזו היא ברירת המחדל.
בפונקציות SearchRow ברירת המחדל היא מערך אפשרויות ריק.
דוגמה:
ClientTb.Row:= 5;
IF ClientTb.Search(['Client Number'], [], [500001], [he_First_Check_Row]) Then
Fman.SB_Message(ClientTb.Field['Client Full Name', -1], False);
כאשר אין צורך לבדוק קודם את השורה הנוכחית, מעבירים מערך אפשרויות ריק:
IF ClientTb.Search(['Client Number'], [], [500001], []) Then
Fman.SB_Message(ClientTb.Field['Client Full Name', -1], False);
ב־SearchRow_by_Col אותה בחירה מוסיפה בדיקה מוקדמת של Row הנוכחי:
FoundRow:= ClientTb.SearchRow_by_Col(0, '', 500001, [he_First_Check_Row]);
אפשרויות חיפוש נוספות
מערך הפרמטרים האחרון (בכל הפונקציות), מיועד לקבל ערך אחד או יותר, המגדירים את תצורת החיפוש.להלן טבת הסבר על הערכים הניתנים ליישום.
| אפשרות | השפעה על החיפוש |
|---|---|
| he_First_Check_Row |
בודקת קודם את Row הנוכחי.
אם נמצאה התאמה בשורה הפעילה, החיפוש מסתיים מיד. |
| he_Bckwrd |
מבצעת את הסריקה הרגילה מהשורה האחרונה אל השורה הראשונה.
אם משלבים גם he_First_Check_Row , Row הנוכחי נבדק לפני הסריקה לאחור.
|
| he_CaseSens |
בחיפוש טקסט, ההשוואה רגישה לאותיות גדולות וקטנות.
ללא אפשרות זו, חיפוש טקסט משתמש בהשוואה שאינה רגישה ל־Case. |
דוגמת חיפוש לאחור:
FoundRow:= ClientTb.SearchRow(['Status'], [], [1], [he_Bckwrd, he_First_Check_Row]);
דוגמת חיפוש טקסט עם רגישות ל־Case:
FoundRow:= ClientTb.SearchRow(['Client Full Name'], ['Demo Client'], [], [he_CaseSens]);
פירוט הפונקציות
הטבלה הבאה מסכמת את ארבעת דפוסי החיפוש הנפוצים בתסריטים.| פונקציה | ערך החזרה | הסבר |
|---|---|---|
| Search([], [], [], [he_First_Check_Row]) | Boolean |
חיפוש לפי שמות שדות.
כאשר נמצאה רשומה, Row של הטבלה עובר לשורה שנמצאה. |
| Search_by_Col(0, '', 0, [he_First_Check_Row]) | Boolean |
חיפוש לפי מספר עמודה.
מתאים כאשר ידוע מראש באיזו עמודה נמצא הערך לחיפוש. גם כאן כאשר נמצאה רשומה, Row של הטבלה עובר לשורה שנמצאה. |
| SearchRow([], [], [], []) | Integer |
חיפוש לפי שמות שדות, עם החזרת מספר השורה שנמצאה.
מתאים כאשר רוצים לשמור את מספר השורה במשתנה. |
| SearchRow_by_Col(0, '', 0, []) | Integer |
חיפוש לפי מספר עמודה, עם החזרת מספר השורה שנמצאה.
מתאים לחיפוש מהיר בעמודה ידועה. |
תבניות שימוש קצרות
חיפוש לקוח לפי מספר לקוח והמשך עבודה על השורה הפעילה:IF ClientTb.Search(['Client Number'], [], [1001], []) Then
Begin
ClientName:= ClientTb.Field['Client Full Name', -1];
ClientStatus:= ClientTb.IField['Status', -1];
End;
חיפוש לפי עמודה מספר 0:
IF ClientTb.Search_by_Col(0, '', 1001, []) Then
Fman.SB_Message(ClientTb.Field['Client Full Name', -1], False);
קבלת מספר שורה בלבד:
FoundRow:= ClientTb.SearchRow(['Client Number'], [], [1001], []);
IF FoundRow >= 0 Then
ClientName:= ClientTb.Field['Client Full Name', FoundRow];
קבלת מספר שורה לפי עמודה:
FoundRow:= ClientTb.SearchRow_by_Col(0, '', 1001, []);
IF FoundRow >= 0 Then
ClientTb.Row:= FoundRow;
חיפוש טקסט בעמודה ידועה:
FoundRow:= ClientTb.SearchRow_by_Col(1, 'Demo Client', 0, []);
IF FoundRow >= 0 Then
Fman.SB_Message(ClientTb.Field['Client Full Name', FoundRow], False);
טעויות נפוצות
| טעות | הסבר ותיקון |
|---|---|
|
שימוש ב־SearchRow ואז קריאה עם -1
|
SearchRow מחזירה מספר שורה.
אם רוצים לקרוא מהשורה שנמצאה, השתמש במספר השורה שהוחזר או הצב אותו אל Row. |
| חיפוש לפי עמודה כאשר סדר העמודות לא קבוע |
אם מבנה הטבלה יכול להשתנות, Search_by_Col עלול לחפש בעמודה אחרת מהמצופה.
בקוד עסקי רגיל עדיף להשתמש ב־Search לפי שם שדה. |
| העברת ערך מספרי כטקסט כאשר השדה מספרי | כאשר מחפשים שדה מספרי, העבר את הערך ב־KeyNum והשאר את KeyStr ריק. |
| התעלמות מערך ההחזרה |
יש לבדוק את ערך ההחזרה לפני קריאה מהשורה שנמצאה.
ב־Search בודקים True/False, וב־SearchRow בודקים שמספר השורה תקין. |
איך לבחור במה להשתמש
-
כאשר צריך למצוא רשומה ולעבוד עליה מיד דרך -1, השתמש ב־Search.
- כאשר צריך לקבל את מספר השורה ולשמור אותו במשתנה, השתמש ב־SearchRow.
- כאשר שם השדה ידוע, השתמש בגרסה לפי שם שדה.
- כאשר העמודה ידועה וסדר העמודות קבוע, ניתן להשתמש בגרסה לפי עמודה.
-
כאשר רוצים לבדוק קודם את השורה הפעילה הנוכחית, הוסף את he_First_Check_Rowלמערך האפשרויות.