חיפוש רשומות בטבלאות באמצעות פקודות 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
    למערך האפשרויות.