ניווט

    תחומים
    • הרשמה
    • התחברות
    • חיפוש
    • קטגוריות
    • פוסטים אחרונים
    • משתמשים
    • חיפוש
    • מקצועות
    חוקי הפורום

    אקסס למתחילים: יצירת מערכת לניהול תורמים

    תוכנה
    1
    16
    564
    טוען פוסטים נוספים
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
    תגובה
    • הגב כנושא
    התחבר בכדי לפרסם תגובה
    נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
    • OdedDvir
      OdedDvir @בערל נערך לאחרונה על ידי OdedDvir

      כהמשך לפוסט: https://tchumim.com/topic/10485/מערכת-לניהול-תורמים/11

      @בערל השלב הראשון הוא התכנון כמובן. והתכנון הראשון הוא מבנה הנתונים.
      בבסיס הנתונים (להלן db) הנתונים נשמרים כאוסף של טבלאות. כל עמודה בטבלה מציינת "שדה", וכל שורה מציינת "רשומה".

      אבל קודם כל, היכרות פשוטה:

      חלק א: יצירת טבלת התורמים והטופס שלה:

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

      לשם כך תפתח את אקסס, ובתפריט תבחר יצירה > עיצוב טבלה, ותקליד את השורות הבאות:

      4cb60cd7-6e2d-4864-8fed-579d747f7c20-תמונה.png

      אחר כך תעמוד על השורה של ה-ID ותלחץ בתפריט למעלה על הסמל של "מפתח ראשי".
      שים לב שנוסף ליד השורה סמל של מפתח:
      e1ff2cef-a3dd-4f75-90df-ce904523db3d-תמונה.png

      סגור את הטבלה ותקרא לה: Donor (תורם)

      היה קל, נכון?
      בוא ניצור עכשיו טופס פשוט שבו נוכל להקליד נתוני תורמים:
      תסמן את הטבלה Donor בפאנל שבצד ימין, ובתפריט למעלה תבחר: יצירה > טופס.
      אקסס תיצור מיד טופס בשבילך:
      af774ad1-e827-4c1e-b53a-8100c7a845cc-תמונה.png
      סגור ושמור בשם frmDonor

      פתח את הטופס ותכניס כמה שמות של תורמים. תוכל לנווט בין הרשומות עם החצים למטה.

      בפוסט הבא ניצור טבלה וטופס של תרומות, ונקשר אותו לטופס הזה.

      בערל תגובה 1 תגובה אחרונה תגובה ציטוט 21
      • OdedDvir
        OdedDvir נערך לאחרונה על ידי

        חלק ב: יצירת טבלת התרומות והטופס

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

        504ac6b0-ac53-4f65-a42f-a99f6381a6dd-תמונה.png

        שים לב: השדה השני DonorID הוא המקשר של התרומה לתורם.
        עוד דבר חשוב: בחר את השדה האחרון CreatedOn, ולמטה בחלון המאפיינים של השדה, תחת ערך ברירת מחדל תכניס את הפונקציה (המובנית):

        =Now()
        

        זה יכניס אוטומטית את הזמן הנוכחי ביצירת רשומת תרומה חדשה.

        שמור את הטבלה בשם Donation.

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

        שמור את הטופס בשם frmDonation
        קח הפסקה לכוס קפה, ונמשיך בפוסט הבא.

        תגובה 1 תגובה אחרונה תגובה ציטוט 20
        • OdedDvir
          OdedDvir נערך לאחרונה על ידי OdedDvir

          חלק ג: קישור בין הנתונים של התורמים והתרומות

          הכח של בסיס נתונים רלציונאלי (כגון אקסס, SQL) נובע מהגדרת קשרי הגומלין (relationships) בין הנתונים.
          הקשר בין רשומה של תורם לרשומה של תרומה הוא קשר של אחד-להרבה (one-to-many)
          כי לכל תורם יכולות להיות מספר תרומות (לפחות אם אנחנו אופטימיים 🙂 )
          כדי להגדיר את הקשר בין הטבלאות, נבחר בתפריט למעלה: כלי מסד נתונים > קשרי גומלין
          ונוסיף את שתי הטבלאות שיצרנו:
          b9314d60-4527-435c-87f6-31e2769c0e1d-תמונה.png

          עכשיו נבחר את השדה DonorID בטבלת התרומות, ונגרור אותו אל השדה ID בטבלת התורמים.
          אם לא טעינו, נפתח חלון כזה:
          5edb4f2a-ae6c-42f4-90fd-77eab01012f3-תמונה.png

          נסמן את התיבה: "אכוף שלמות הקשרים בין הטבלאות". זה מבטיח שלא יהיו לנו רשומות יתומות, דהיינו רשומות של תרומות שאין להן רשומת תורם תואמת.

          נקליק על "צור". שים לב שעכשיו הטבלאות מחוברות על ידי קו. הסימון 1 - ∞ מציין שהקשר הוא "אחד-להרבה" כנ"ל.
          be8defca-0038-4799-9488-ae02388883a8-תמונה.png
          סגור את חלון קשרי הגומלין ושמור את השינויים.

          עכשיו מתחיל הכיף:
          נפתח את הטופס של התורמים בתצוגת עיצוב, ונרחיב את החלון קצת למטה כדי לעשות חלל פנוי לרשימת התרומות:
          2fe4aaaf-3419-4be1-8a64-7941c59867eb-תמונה.png

          נגרור לתוך החלל שיצרנו את הטופס של התרומות frmDonation, כדי ליצור טופס משנה:
          b3aea687-7ff9-4d53-ba0b-bcf015e0af3d-תמונה.png

          נסגור ונשמור את הטופס של התורם.
          עכשיו נפתח את הטופס של התרומות בתצוגת עריכה, ובגליון המאפיינים של הטופס, נשנה את תצוגת ברירת המחדל ל- גליון נתונים (זה יהפוך את התצוגה לגליון נתונים כמו באקסל)
          bae18698-b57e-4264-9314-39f3f71f37c1-תמונה.png
          כמו כן, נמחק מהטופס את שני השדות הראשונים: ID ו- DonorID:
          e42b9635-2974-4331-aa09-1a1674febe8c-תמונה.png

          נסגור ונשמור.

          שים לב: עכשיו כשנפתח את הטופס הראשי (של התורם) יוצגו עבור כל תורם כל התרומות שלו, ורק שלו:
          75338ea5-6ed2-4a63-a48a-d131183804db-תמונה.png

          f3e7b202-fb75-4f73-be8d-1e104768dc2e-תמונה.png
          הפלא ופלא!
          איך זה קורה?
          הסבר בפוסט הבא!

          תגובה 1 תגובה אחרונה תגובה ציטוט 23
          • OdedDvir
            OdedDvir נערך לאחרונה על ידי OdedDvir

            חלק ד - נקודות למחשבה

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

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

            ב. קיים שדה מזהה לרשומה בשם ID.
            ככלל, לכל טבלה ב-db תמיד יהיה שדה כזה, והוא נקרא מפתח ראשי. סוג הנתונים בו הוא מספר שלם (ארוך), ובדרך כלל הוא יהיה מסוג מספור אוטומטי, זהו שדה לקריאה בלבד וה-db אחראי לטפל בערכים שלו, והוא קובע באופן אוטומטי את הערך שלו בכל יצירת רשומה חדשה (בקפיצות של 1).
            ערך השדה הוא ייחודי ונקבע באופן חד-פעמי, כלומר, אם למשל ברשומה האחרונה ID=4, גם אם נמחק אותה וניצור רשומה חדשה, ה-db יקצה לרשומה החדשה ID=5, למרות שכבר אין רשומה עם ID=4.

            המנגנון הזה מבטיח שתמיד ניגש לרשומה הנכונה.

            דרך משל, אם לפלוני היה מספר תעודת זהות 1002, גם אם הוא נפטר, לא ישתמשו במספר שלו עבור אדם אחר, כדי שתמיד פלוני יזוהה עם המספר 1002.

            ג. סוג הנתונים בשאר השדות
            כברירת מחדל, גודל השדה "טקסט קצר" הוא עד 255 תוים.
            אם ודאי לנו שלא נשתמש בכזה אורך, נוכל להקטין את גדול השדה המקסימלי, על מנת לחסוך מקום ולשפר יעילות.
            בואו נגדיר מחדש את אורך השדות שלנו: LastName, FirstName, MobilePhone להיות כל אחד 30 תוים:

            נבחר את השורה LastName, ולמטה במאפיינים, נגדיר גודל שדה 30:
            c75467de-69e5-494f-bc65-0d46ec3eaab8-תמונה.png
            נחזור על הפעולה גם עבור השדות FirstName ו-MobilePhone. נסגור ונשמור את הטבלה, ואז נקבל את תיבת ההתראה הבאה:
            5dda42d5-dc9f-46c9-95b6-0aa51a004af7-תמונה.png
            שדואגת שלא נעשה דבר טיפשי בטעות. במקרה שלנו מסתמא לא הכנסנו שם גדול מ-30 תוים. פשוט נאשר וזהו.
            הערה: אם כבר היה בשדה ערך גדול מ-30 תוים, המחרוזת תיחתך אחרי התו השלושים.

            נעבור לטבלה השניה:

            טבלת התרומות
            גם כאן יש מפתח ראשי בשם ID. אבל יש כאן שדה נוסף:

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

            זה מעלה שתי נקודות חשובות למחשבה:
            איך נוודא שלא שכחנו בטעות למלא את השדה?
            ומה אם ננסה לרשום מספר שלא נמצאת עבורו רשומה בתורמים (=התורם לא קיים)....?

            אל תדאגו.

            תאמינו או לא, את שתי הבעיות האלו כבר פתרנו כשהגדרנו את קשרי הגומלין בין הטבלאות, וסימננו את התיבה "אכוף שלמות הקשרים בין הטבלאות"!

            א. אם ננסה להכניס בשדה DonorID ערך שלא קיים בטבלת התורמים, למשל 1000, ה-db יסרב לשמור את רשומת התרומה, כי הוא מוודא עבורינו שלא יהיו רשומות "יתומות" (תרומות ללא תורם משוייך)
            ב. אם ננסה למחוק מטבלת התורמים תורם שקיימת עבורו תרומה - שוב ה-db לא יאפשר זאת.

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

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

            טוב, שיעורי בית (אוף...):
            לקצר את אורך השדה של מספר הטלפון הנייד ל-20 תוים.

            בפוסט הבא ב"ה נמשיך לעבור על הטפסים שעשינו.

            תגובה 1 תגובה אחרונה תגובה ציטוט 24
            • OdedDvir
              OdedDvir נערך לאחרונה על ידי

              חלק ד - תוספת: בקשר למדריך הזה

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

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

              תגובה 1 תגובה אחרונה תגובה ציטוט 17
              • OdedDvir
                OdedDvir נערך לאחרונה על ידי OdedDvir

                חלק ה: טפסים מקושרים

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

                נשים לב שהטופס מקושר לטבלה עצמה, זה אומר שכל שינוי של נתונים בטופס – מיד מבוצע גם בטבלה עצמה, בלי שנדאג לאיך זה מתבצע.

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

                אקסס גם מספקת לנו סרגל ניווט כברירת מחדל בתחתית כל טופס, תראו בתחתית טופס התורמים:
                ac3d3956-373a-4b22-abd8-6f4c56e8c108-תמונה.png
                ויש בו אפילו מנגנון חיפוש פשוט!
                תנסו להקליד שם של תורם למטה, אקסס מיד תעבור לרשומה הרלוונטית.
                9b9fddbe-830f-4a61-ab0a-db020bd2c031-תמונה.png

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

                תשאלו: מה זה טפסים מקושרים?

                אז זוכרים שיצרנו קשרי גומלין בין התורמים והתרומות? בואו תראו מה קרה:

                תפתחו את טבלת התורמים, הפעם בתצוגת גליון נתונים (פשוט תקליקו עליה פעמיים)
                שימו לב שיש סימן + לפני כל שורה:
                2d0b31a9-100f-4c81-a2f3-6321a40e2b94-תמונה.png
                אם נלחץ עליו, נקבל את רשימת התרומות של אברהם כהן:
                b2a0e933-65c9-4778-bf5d-4f56b4156e88-תמונה.png

                אבל חסר כאן שדה אחד, שמתם לב? השדה DonorID נעלם. אקסס מסתירה אותו, כי היא יודעת שלגבי התרומות של אברהם כהן, המזהה של התרומה צריך תמיד להיות המזהה של אברהם כהן, כלומר 1, לכן היא קובעת עבורנו את הערך בשדה באופן אוטומטי ל-1, ומסתירה את העמודה הזו.

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

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

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

                מחיאות כפיים לאקסס!

                אם אתם רוצים להציץ מתחת למכסה המנוע ולראות היכן מופיע הקישור בטופס, תפתחו את הטופס של התורמים בתצוגת עיצוב, תבחרו את טופס המשנה, ובמאפיינים שלו יש לשונית שנקראת נתונים, והנה השדות המקשרים לפניכם:
                94216113-919b-4606-a6cc-d5d22f89b816-תמונה.png

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

                בפוסט הבא נעסוק אי"ה בשאילתות.

                תגובה 1 תגובה אחרונה תגובה ציטוט 15
                • OdedDvir
                  OdedDvir נערך לאחרונה על ידי OdedDvir

                  חלק ו: שאילתות חלק א: שאילתת בחירה עם שדה מחושב

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

                  שאילתות במסד הנתונים מבוססות על שפה שנקראת SQL שזה בתרגום חופשי "שפת שאילתות מובנית". (תודה ל @yossiz על ההארה)

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

                  שאילתא ראשונה: שם מלא
                  נניח שאני רוצה להציג את השם המלא של כל תורם.
                  נבחר בתפריט למעלה: יצירה > עיצוב שאילתא, נבחר את טבלת התורמים Donor, ונוסיף אותה למשטח העבודה:
                  3435e023-1a96-4f8e-b504-d1450c2d53f0-תמונה.png
                  נעמוד על השדה הראשון, ונפתח מהתפריט למעלה את בונה הביטויים:
                  d36d5950-01a8-480f-a7ea-54b23c4c5dc5-תמונה.png
                  בחלון שנפתח נרשום:

                  FullName: LastName & " " & FirstName
                  

                  ונלחץ על אישור:
                  dce0f636-8169-4c89-b3df-73e4925a393e-תמונה.png
                  נעבור לתצוגת גליון נתונים (בתפריט בצד ימין):
                  746d9949-0c26-45c8-ae8b-dcb672723ecd-תמונה.png
                  ונראה את התוצאות:
                  0ed64a31-12c4-4d2e-b258-cc138fa0a166-תמונה.png
                  השאילתא יצרה שדה מחושב בשם FullName, שמכיל את הנוסחא:

                  LastName & " " & FirstName
                  

                  אנו משתמשים באופרטור & כדי לחבר מחרוזות, בדומה לאקסל.

                  הערה: השאילתא הזו לא ממש שימושית, כי חסר בה את השדה המזהה ID. בכוונה השמטתי אותו כטעות של מתחילים, ובהמשך כשניתקל בבעיה ונראה שאנו חייבים אותו, נערוך את השאילתא ונוסיף גם אותו.

                  אתם זוכרים שאמרתי לכם שאקסס דואגת ליצור את פקודת ה-SQL בשבילנו? אז תנשמו עמוק, ובואו נראה כיצד כתובה השאילתא בשפת SQL. בתפריט נעבור לתצוגת SQL:
                  8f16486f-2e65-44c9-9f24-d780f1346e71-תמונה.png
                  והנה לפנינו פקודת הSQL שמרכיבה את השאילתא:
                  00446027-17a1-44b8-9367-1714885544fb-תמונה.png
                  תתבוננו ותראו שבאמת שפת SQL לא כל כך נוראית. הפקודה SELECT אומרת שהשאילתא תבחר את השדות LastName ו-FirstName, ותוסיף ביניהם רווח, והמילה AS יוצרת שדה חדש בשם FullName. המילה FROM מציינת כי השדות ייבחרו מתוך הטבלה Donor.

                  נשמור את השאילתא בשם qryDonor_FullName.

                  בפוסט הבא נכיר את שאילתת הקיבוץ.

                  תגובה 1 תגובה אחרונה תגובה ציטוט 15
                  • OdedDvir
                    OdedDvir נערך לאחרונה על ידי OdedDvir

                    חלק ז: שאילתות חלק ב: שאילתת קיבוץ

                    נניח שאני רוצה לדעת מה כמה כסף תרם כל תורם. לשם כך אנו זקוקים לשאילתת קיבוץ. שאילתת קיבוץ כשמה כן היא, מקבצת לנו נתונים הקשורים זה לזה לתוך שדה יחיד. במקרה שלנו, היא תחשב את הסכום של כל התרומות לכל תורם.

                    שאילתא שנייה: סכום התרומות לתורם
                    נבחר בתפריט למעלה: יצירה > עיצוב שאילתא, נבחר את טבלת התרומות Donation, ונוסיף אותה למשטח העבודה:
                    dfc68a90-aa49-49ea-aff2-6245d8b8b731-תמונה.png
                    עכשיו נקליק פעמיים על השדה DonorID, הוא יתווסף לרשימה למטה:
                    9d013d99-fafe-4f2b-b335-64ce21cb8f7f-תמונה.png
                    נוסיף גם את השדה Amount:
                    98dfb532-0f3d-4300-8656-17c64b5aca38-תמונה.png
                    עכשיו, נבחר מהתפריט למעלה את הסמל של הסיגמא, שכתוב מתחתיו "סכומים":
                    8e072ca2-bffe-421c-b33f-07621efe248a-תמונה.png
                    שימו לב שנוספה למטה עוד שורה, עם הכותרת "סך הכל", ולכל שדה כתוב "קיבוץ לפי":
                    8b6f5462-46b6-4909-9414-98dfa5b4bee9-תמונה.png
                    זה אומר שהפכנו את סוג השאילתא משאילתת בחירה פשוטה לשאילתת קיבוץ.

                    נשנה בעמודה של Amount את האפשרות "קיבוץ לפי" לאפשרות Sum (=סכום)
                    ccd80d28-e004-44d9-a2bd-47c77759c1e4-תמונה.png
                    זהו, השאילתא מוכנה!
                    כדי לראות את התוצאות, נעבור לתצוגת גליון נתונים, והנה התוצאות:
                    60fac243-5916-4735-9c7e-ea895fd07b4b-תמונה.png

                    רגע, מה קרה לכותרת של העמודה השניה? אקסס נתנה לה שם אחר כדי לציין שזוהי עמודה של סכום. אבל זוכרים כמה אנו צריכים להזהר במתן שמות לעמודות? חובה עלינו לשנות את שם העמודה לשם תקני. נחזור לתצוגת עיצוב:
                    557f7826-4b52-48a1-900a-30b72a5e3e52-תמונה.png
                    נבחר את העמודה השניה, ובתפריט למעלה נפתח את בונה הביטויים:
                    6bc69e83-7201-47a8-9439-5ba9ccc01fb1-תמונה.png
                    בחלון שנפתח נרשום:

                    TotalAmount: Amount
                    

                    f935402a-b9d3-45bc-8aff-f717281892af-תמונה.png
                    ונלחץ על אישור. נעבור שוב לתצוגת גליון נתונים, ונראה שעכשיו הכותרת של העמודה השניה השתנתה ל: TotalAmount:
                    70fc0227-f20a-48a5-a69e-6f78562ede3a-תמונה.png
                    נשמור את השאילתא בשם qryDonation_TotalAmount.

                    יפה, נכון?

                    כן, אבל לא כל כך שימושי... מי זוכר מיהו התורם מספר 2 ומיהו התורם מספר 732?
                    אני רוצה להציג גם את שם התורם ליד הסכום שתרם!
                    בסדר, בסדר, בפוסט הבא נלמד איך לשלב את שתי השאילתות שיצרנו יחד, וליצור את התוצאה המבוקשת.

                    תגובה 1 תגובה אחרונה תגובה ציטוט 16
                    • OdedDvir
                      OdedDvir נערך לאחרונה על ידי OdedDvir

                      חלק ח: שאילתות חלק ג: שאילתות צירוף

                      טוב, אז יש לנו שאילתה אחת בשם: qryDonor_FullName שמציגה את השמות המלאים של התורמים, להלן נקרא לה: "שאילתת-השמות", ויש לנו עוד שאילתא בשם qryDonation_TotalAmount שמציגה את סכום התרומות של כל תורם, להלן תיקרא: "שאילתת-הסכומים".

                      אנחנו רוצים לחבר את שתי השאילתות ביחד, כדי לקבל את התוצאה הבאה:
                      2e2122d4-87be-4428-a337-446755350932-תמונה.png

                      איך עושים את זה?

                      לשם כך נכיר סוג נוסף של שאילתא, והוא (תופים בבקשה...)
                      שאילתת צירוף

                      שאילתא זו מצרפת שתי טבלאות או שאילתות, או יותר.

                      פתחו את מעצב השאילתות (יצירה > עיצוב שאילתא), ונעבור ללשונית של שאילתות כדי להציג את רשימת השאילתות שלנו:
                      0251fbdd-11df-4f1e-bb5d-9358cae169d9-תמונה.png

                      נוסיף את שתי השאילתות למשטח העבודה:
                      4e056719-20e4-4a49-822a-0e84f9de1433-תמונה.png

                      אבל...
                      איך נחבר את שתי השאילתות? מה השדה שמקשר ביניהן?
                      התשובה היא: אין שדה כזה...

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

                      בואו נתקן את הבעיה. נסגור את עורך השאילתות. תופיע ההודעה הבאה:
                      3a60bca8-46f6-4402-8712-6bb5607dc640-תמונה.png
                      נבחר לא. אחרי שנתקן את שאילתות הבסיס, ניצור מחדש את השאילתא.

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

                      נפתח את שאילתת השמות בתצוגת עיצוב, ונוסיף את השדה ID לרשימת השדות (על ידי הקלקה כפולה על שם השדה):
                      3202f66e-1a5d-4198-b1c7-b072fd73df06-תמונה.png
                      נעבור לתצוגת גליון נתונים ונראה שעכשיו השדה מוצג בשאילתא:
                      d1bd949d-66c0-456d-9dcc-310dc6b0afc6-תמונה.png
                      הממ... השדה המזהה מוצג בעמודה השנייה ולא בראשונה... בואו נתקן גם את זה.

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

                      לשם כך נחזור לתצוגת עיצוב, ונלחץ על המלבן האפור בראש העמודה של ID:
                      66fb764d-95b8-4314-88b5-a4f98a6d9928-תמונה.png
                      העמודה נצבעה בשחור:
                      ff7fca0a-5898-46b6-9608-a36c1e8a0b3e-תמונה.png
                      נלחץ שוב פעם שנייה, ונגרור את העמודה לתחילת הרשימה, לפני עמודת השמות:
                      e541504e-bec5-40dd-93e8-69cde8b0cbec-תמונה.png
                      נשים לב שסדר העמודות השתנה:
                      d2db898b-9f8a-436d-a23c-7f2753bdd537-תמונה.png
                      נסגור ונשמור את השאילתא.

                      עכשיו הכל מוכן ליצירת השאילתה שלנו:

                      מי זוכר איך בונים את שאילתת הצירוף? צריך לפתוח את מעצב השאילתות ולהוסיף את שתי השאילתות, אבל בואו נראה עוד דרך לעשות זאת:

                      בתפריט נבחר יצירה > עיצוב שאילתא, אבל הפעם, נסגור את החלון של הבחירה בלי להוסיף כלום למשטח העבודה, נקבל משטח ריק.
                      הפעם, נגרור את שתי השאילתות מהפאנל הימני לתוך המשטח:
                      20780ce2-175a-4dd0-bd8f-a5b72022c22d-תמונה.png

                      נשים לב שהפעם מופיע בשאילתת השמות שדה המפתח בשם ID.
                      כדי לקשר את השאילתות, נגרור את השדה ID משאילתת השמות אל השדה DonorID בשאילתת הסכומים, ונראה שנוצר קו מחבר בין השאילתות (מזכיר לכם משהו?):

                      נוסיף את השדות הבאים לפי הסדר:
                      מטבלת השמות: ID, FullName
                      ומטבלת הסכומים: TotalAmount
                      c98bc0f3-92d9-4349-b405-54c8253be992-תמונה.png
                      נעבור לתצוגת עיצוב כדי לבדוק את התוצאות:
                      992b78d4-aed7-41e8-8d62-3f2df085333f-תמונה.png
                      נראה שזה עובד!

                      אבל רגע,
                      לאן נעלם ישראל יעקב?
                      תעלומה.

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

                      תגובה 1 תגובה אחרונה תגובה ציטוט 13
                      • OdedDvir
                        OdedDvir נערך לאחרונה על ידי OdedDvir

                        חלק ט: שאילתות חלק ד: שאילתות צירוף חיצוני

                        אז מה קרה לישראל יעקב?
                        כל הכבוד ל @בערל שענה תשובה נכונה לשאלה:

                        כי השאילתא שלנו מצרפת בין qryDonor_FullName ל-qryDonation_TotalAmount
                        מכיוון שישראל יעקב אינו תרם (עדיין), הוא לא מופיע ב- qryDonation_TotalAmount
                        ולכן גם לא נמצא בתוצאה הסופית שממזגת בין שניהם
                        ולמה הוא לא מופיע ב-qryDonation_TotalAmount שהוא תרם 0.00?
                        כי qryDonation_TotalAmount מבוסס על טבלת Donation ושם הרי לא מופיע תרומות של אפסים, אז אין לשאילתא שלנו (כרגע) שום מקור לשלוף את המידע
                        הבנתי נכון?

                        כן, מצוין! (שאר התלמידים ישארו בסוף השיעור לנקות את הכיתה 😊 )

                        הבעיה נוצרה כי השאילתא שלנו משתמשת בצירוף פנימי.

                        צירוף פנימי יציג נתונים רק כאשר יש מזהה תואם בשתי מקורות הנתונים, דהיינו בשתי השאילתות שלנו.

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

                        בואו נפתח שוב את השאילתא, ונעבור לתצוגת SQL. שימו לב למילים INNER JOIN שהדגשתי בצהוב, שפירושן צירוף פנימי:
                        c62f7528-cdcf-440a-bf76-ba5fc788f469-תמונה.png

                        כדי שהשאילתא תציג את כל התורמים, אנו צריכים ליצור צירוף חיצוני.

                        צירוף חיצוני מציג את כל הנתונים ממקור נתונים אחד, ורק את הרשומות התואמות מהמקור השני. למקור הנתונים שאנו רוצים להציג את כולו, קוראים טבלת הבסיס. ולשני קוראים טבלת המשנה.

                        זה בעצם מה שאנחנו מבקשים: להציג את כל הרשומות משאילתת השמות (בסיס), ורק את הרשומות התואמות משאילתת הסיכום (משנה).

                        נחזור לתצוגת עיצוב. נקליק פעמיים על הקו המקשר בין השאילתות, והחלון הבא יצוץ:
                        afee00bc-3489-415d-9c1d-e21cb8f2bd89-תמונה.png
                        שימו לב שאקסס קראה לשאילתת השמות: הטבלה השמאלית, ולשאילתת הסכומים: הטבלה הימנית, למרות שבחלון שנפתח המיקום שלהן הפוך. זה בגלל שאקסס מתורגמת מימין לשמאל, ואילו שפת SQL משתמשת בתחביר של אנגלית, שבה הטבלה הראשונה נכתבת משמאל לטבלה השניה... בגרסא האנגלית של אקסס המיקום שלהן נכון.

                        יש כאן שלוש אפשרויות:

                        1. אפשרות ברירת המחדל: רק השורות בהן המזהה שווה. זהו צירוף פנימי.
                        2. כל הרשומות מטבלת השמות (=השמאלית) ורק הרשומות הרלוונטיות מטבלת הסכומים (הימנית)
                          זה נקרא צירוף חיצוני שמאלי.
                        3. כל הרשומות מטבלת הסכומים (הימנית) ורק הרשומות הרלוונטיות מטבלת השמות (=השמאלית)
                          זה נקרא כמובן צירוף חיצוני ימני.

                        אז מה האפשרות שאנו מבקשים?
                        נכון, אפשרות מספר שתיים.
                        נבחר ונאשר.
                        תראו מה קרה לקו המחבר:
                        f3698292-64e3-492d-bc3e-a848ba967e4d-תמונה.png
                        הוא הפך לחץ! אקסס מודיעה לנו שיש כאן צירוף חיצוני. טבלת הבסיס היא הטבלה שממנה יוצא החץ, וטבלת המשנה היא הטבלה שאליה החץ מגיע.

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

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

                        נעבור לתצוגת גליון נתונים, ,ונראה שהפעם השאילתה קיבצה נדחי ישראל:
                        fcf4f3b0-30e5-4912-a9a3-7d0d9564b055-תמונה.png

                        אבל עדיין יש עבודה.

                        שימו לב שהסכום של ישראל הוא ריק ולא מכיל 0.

                        הערה: כאשר שאילתת צירוף חיצוני לא מוצאת רשומה עם מפתח תואם בטבלת המשנה, היא מחזירה ערך מיוחד שנקרא NULL, שפירושו = כלום, שום דבר, גורנישט, וכו'.

                        אם ברצוננו להציג שם אפס, צריך ליצור שדה מחושב:

                        נחזור לתצוגת עיצוב, נבחר את השדה TotalAmount, וניכנס לבונה הביטויים:
                        e3b75927-ba3b-4115-a7fd-38cc68f4b4f4-תמונה.png
                        נרשום שם את הנוסחה הבאה:
                        f43c1fd0-0e44-480a-9d2b-21cd6bfabb41-תמונה.png
                        נלחץ על אישור, ונעבור לתצוגת גליון נתונים כדי לראות את התוצאות:
                        6bd28c05-70e7-4b86-8f82-4764afea9570-תמונה.png
                        עכשיו לישראל מופיע אחר כבוד סכום תרומות כולל של 0.

                        מי שם לב למשהו לא בסדר?

                        מישהו?

                        נכון מאוד. העמודה של הסכום קיבלה שם מוזר Expr1...

                        אני לא זוכר שנתתי לה שם כזה...

                        נחזור לתצוגת העיצוב, ונרחיב את העמודה השלישית כדי לראות את הנוסחא:
                        341edb9c-f566-49fc-b8de-7f062631af65-תמונה.png
                        ונראה שאקסס נתנה את השם Expr1 לעמודה:
                        c50fad45-45e2-4688-8527-73c48e629d6e-תמונה.png
                        מה הפשט?
                        זה קרה בגלל שכתבנו נוסחא אך לא סיפקנו שם לשדה. לכל שדה חייב להיות שם, ולכן אקסס נתנה לו את השם הכללי Expr1, דהיינו "ביטוי מספר 1".

                        בואו נשנה את השם ל: DonorTotaDonation:
                        2d15132d-0092-44ee-92b6-a4f57d78f221-תמונה.png
                        נפתח בתצוגת גליון נתונים, ונראה שהכל בסדר:
                        ed37c16f-aacb-44f9-80c8-142524c50081-תמונה.png

                        הערה: נתנו לעמודה את השם DonorTotalDonation, ולא TotalAmount מפני שאם כן, הנוסחא היתה

                        TotalAmount: IIf(TotalAmount Is Null, 0, TotalAmount)
                        

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

                        מה שמביא אותי להערה הבאה:

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

                        יופי!
                        נשמור את השאילתא בשם: qryDonor_TotalDonation
                        ונצא להפסקה.

                        תגובה 1 תגובה אחרונה תגובה ציטוט 14
                        • OdedDvir
                          OdedDvir נערך לאחרונה על ידי OdedDvir

                          חלק י: שיעורי בית

                          חלק מהמטלות שאני אתן הן קלות, וחלק יותר מאתגרות.
                          מה שחשוב זה להנות ולא להיבהל...
                          גם כשלא מצליחים - זהו חלק חשוב מתהליך הלימוד!

                          1. הוסף מיון לשאילתת השמות, כך שהיא תציג את שמות התורמים לפי סדר הא"ב.
                          2. הוסף לשאילתת הסיכום גם שדה בשם DonationCount שיכיל את מספר התרומות של כל תורם. דהיינו עבור אברהם יופיע 3, ליצחק יופיע 1, וליעקב יופיע 0 בדוגמא שלנו.
                          3. סדר את שאילת הסכומים לפי סכום התרומות בסדר יורד, כלומר שבשורה הראשונה יופיע התורם שתרם הכי הרבה.
                          4. אני רוצה לשמור עבור כל תורם את פרטי ההתקשרות עמו. כלומר שעבור כל תורם יהיה יומן שיחות עם תאריך השיחה ותקציר השיחה. צור טבלה חדשה בשם DonorConversation כדי לנהל את פרטי ההתקשרות. חשוב: אילו שדות אמורים להופיע בטבלה?
                          5. צור קשר גומלין מתאים בין טבלת התורמים לטבלת השיחות.
                          6. צור טופס חדש בשם frmDonorConversation שמציג את פרטי ההתקשרות.
                          7. הטמע את הטופס הנ"ל בטופס התורמים הראשי, כך שליד רשימת התרומות תוצג גם היסטוריית השיחות.

                          בהצלחה לכולם!
                          בפוסט הבא נציג את הפתרונות בע"ה.

                          בערל תגובה 1 תגובה אחרונה תגובה ציטוט 9
                          • OdedDvir
                            OdedDvir נערך לאחרונה על ידי OdedDvir

                            חלק יא: פתרונות לשיעורי הבית

                            שוב יש"כ ל @בערל על התשובות, למעשה הוא ענה נכון על כל המטלות. אני בכל זאת אביא כאן גם את התשובות שלי:

                            1. כדי לא להשאיר את המדריך חסר
                            2. כי יש לי הערות קטנות פה ושם

                            אז מה היה לנו?

                            1. הוסף מיון לשאילתת השמות, כך שהיא תציג את שמות התורמים לפי סדר הא"ב.

                            טוב, אז אמנם לא למדנו איך למיין עמודות, אבל מי שקצת מחפש רואה את השורה של המיון:
                            8cd34fb2-d5bb-4b06-891f-4e2a2eb91665-תמונה.png

                            1. הוסף לשאילתת הסיכום גם שדה בשם DonationCount שיכיל את מספר התרומות של כל תורם. דהיינו עבור אברהם יופיע 3, ליצחק יופיע 1, וליעקב יופיע 0 בדוגמא שלנו.

                            גם כאן, מי ששם לב כשבנינו את עמודת הסיכום בשאילתת הקיבוץ, הבחין שיש עוד נוסחאות לבחירה, אחת מהן היא Count, שהיא פשוט סופרת את מספר הרשומות עבור שדה מסויים:
                            d7704356-4587-4eab-aef4-12ed57a65393-תמונה.png
                            הערה: בתור פרקטיקה טובה, אני רגיל לספור את המופעים של השדה המזהה בטבלה, דהיינו השדה ID, מפני שהוא תמיד מכיל ערך. אם הייתי בוחר בשדה שחלק מהשורות שלו מכילות לפעמים NULL, הפונקציה Count לא סופרת את השורות האלו. אכן לעתים זה כן שימושי להתעלם מהן, והכל לפי העניין.

                            1. סדר את שאילת הסכומים לפי סכום התרומות בסדר יורד, כלומר שבשורה הראשונה יופיע התורם שתרם הכי הרבה.

                            זה פשוט, על ידי הוספת מיון לעמודת הסכומים:
                            b5a651fa-c106-4e2b-9ebb-d10d1a84b77d-תמונה.png

                            4.אני רוצה לשמור עבור כל תורם את פרטי ההתקשרות עמו. כלומר שעבור כל תורם יהיה יומן שיחות עם תאריך השיחה ותקציר השיחה. צור טבלה חדשה בשם DonorConversation כדי לנהל את פרטי ההתקשרות. חשוב: אילו שדות אמורים להופיע בטבלה?

                            גם זה ממש דומה לטבלת התרומות, ישר כח לכל מי שזכר גם פה לספק ערך ברירת מחדל לזמן השיחה:
                            2ea58f41-0ba4-4248-8b98-f311a094b809-תמונה.png

                            1. צור קשר גומלין מתאים בין טבלת התורמים לטבלת השיחות.

                            בבקשה:
                            26da5cd7-a475-47e2-b19f-018c64221f95-תמונה.png

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

                            1. צור טופס חדש בשם frmDonorConversation שמציג את פרטי ההתקשרות.

                            שני קליקים וסיימתי:
                            ab741bfb-7837-48f5-a435-0d2a34c09af0-תמונה.png

                            7.הטמע את הטופס הנ"ל בטופס התורמים הראשי, כך שליד רשימת התרומות תוצג גם היסטוריית השיחות:

                            שוב, קלי קלות, פשוט לגרור את הטופס לתוך הטופס הראשי:
                            92969368-b963-4987-82c7-e5c084bd6650-תמונה.png

                            סיכום:

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

                            כאן בונים

                            מי שחוש העיצוב שלו מפותח אפילו מעט, יכול להרים גבה ולומר: מה זה העיצוב הזה? ככה לא בונים טופס, ואיך אפשר להשתמש בזה בכלל?

                            על זה יש לי שתי תשובות:
                            א. MVP
                            לא, אני לא מתכוון לדגם של מאזדה. MVP הוא קיצור של Minimum Viable Product.

                            ההגדרה הרשמית (לפי המכלול) : מוצר בר-קיימא מינימלי הוא מוצר עם המינימום ההכרחי של תכונות כך שלקוח יוכל להשתמש במוצר.

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

                            אבל צחוק בצד, זה השלב הראשון והחשוב מאוד בפיתוח תוכנה.

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

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

                            ב. סבתא אקסס
                            כנגד היכולות הגבוהות שלה בפיתוח, אקסס מאד דלה בצד של חווית המשתמש.

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

                            טוב די עם הפיטפוטים.

                            בשיעור הבא נוסיף עוד מימד למערכת ניהול התורמים, והוא: רשימת הנתמכים.
                            יהיה מעניין בעז"ה.

                            תגובה 1 תגובה אחרונה תגובה ציטוט 9
                            • OdedDvir
                              OdedDvir נערך לאחרונה על ידי OdedDvir

                              חלק יב: רשימת הנתמכים

                              בואו נראה מה עשינו עד עכשיו.

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

                              כעת אני רוצה לעבור לצד השני של הנתמכים.

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

                              אבל יש לי כמה כללים:

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

                              2. התורם הנדיב, בבואו לקיים מצווות צדקה, יוכל לבחור מתוך שתי אפשרויות של תרומה:

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

                              נשמע מורכב? בואו נתחיל עם מה שכבר אנו יודעים.

                              ניצור טבלה חדשה עבור המשפחות, עם השדות הבאים:
                              2c376a49-6651-4b37-804a-299b23784a0c-תמונה.png

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

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

                              למה?

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

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

                              נשמור את הטבלה בשם Family.

                              עכשיו יש לנו בעיה.

                              איך מגדירים את קשרי הגומלין בין המשפחות לתורמים? 🤔

                              אחרי ההתבוננות, נשים לב כי לכל תורם יכולות להיות כמה משפחות קשורות, אז לכאורה זה קשר של יחיד-רבים... אבל גם לכל משפחה יכולים להיות כמה תורמים קשורים!

                              אחרי עוד קצת עיון 🤔🤔, נראה שהדרך לשמור את הנתונים על הקשרים בין התורמים למשפחות, היא על ידי רשימה של זוגות:

                              משפחה-תורם.
                              משפחה-תורם.
                              משפחה-תורם.

                              לקשר הזה קוראים קשר של רבים לרבים. והדרך ליישם אותו בבסיס הנתונים היא על ידי טבלת עזר, או טבלת זוגות.

                              צרו טבלה חדשה עם השדות הבאים:
                              f998dc7d-95c6-4904-b1de-a5bdb292966d-תמונה.png
                              נסו לשמור את הטבלה בשם: Family_Donor... אקסס תקפיץ לכם את החלון הבא:
                              92d690f7-b14f-4e7f-9761-c80394cd306e-תמונה.png
                              מה קרה?
                              אקסס דואגת לנו שנעבוד נכון!

                              לא הגדרנו שדה מזהה בטבלה, ואקסס מתריעה על כך.

                              הממ... נוכל להוסיף את השדה ID כמו קודם... אבל אם נחשוב על כך, אין לו כל כך משמעות בטבלה הזו, כי עבור כל מזהה משפחה FamilyID, אין לי חשיבות לשורה מסויימת אחת בלבד של מזהה תורם DonorID, אלא אני תמיד אצטרך לייבא את כל השורות ששייכות אליה בבת אחת, מבלי חשיבות לסדר.

                              הנכון הוא לקבוע כי שתי השדות גם יחד הם שדה המפתח של הטבלה. הגדרה כזו נקראת מפתח מרוכב (Composite Key)

                              לשם כך נבחר את שתי השורות יחד, על ידי גרירה של הריבוע האפור מימין לשם השדה:
                              69d418e4-20a6-4fdc-b289-e69e92b4714f-תמונה.png
                              עכשיו נלחץ בתפריט על הסמל של המפתח הראשי, ונבחין כי נוסף סימון של מפתח לפני שתי השורות:
                              a3ef9e1a-a831-42dd-8ad7-0f0a94120432-תמונה.png

                              מעולה. עכשיו נוכל לשמור את הטבלה בשלווה, בלי שום התראות מאקסס.

                              נעבור כעת להגדרת קשרי הגומלין, ונוסיף את הטבלאות החדשות Family, Family_Donor למשטח העבודה.
                              נגדיר את קשרי הגומלין לפי התמונה הבאה:
                              0aaebc2c-f472-48ff-b16e-93df892e4b8c-תמונה.png

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

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

                              בפוסט הבא ניצור את הטפסים המתאימים לניהול הטבלאות שהוספנו.

                              תגובה 1 תגובה אחרונה תגובה ציטוט 12
                              • OdedDvir
                                OdedDvir נערך לאחרונה על ידי

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

                                חלק יג: נפלאות התיבה המשולבת

                                כל טופס מכיל בתוכו פקדים. הפקדים הם הרכיבים החזותיים המרכיבים את ממשק המשתמש.
                                אם נתבונן בטפסים שאקסס הכינה עבורנו, נראה שיש שם שני סוגי פקדים: תווית, ותיבת טקסט:
                                4c0093b9-a3c2-4024-a8fa-fd9eb0437c59-תמונה.png

                                נבחין בין שתי מחלקות של פקדים:

                                1. פקד סטטי - פקד שהערך שהוא מציג הוא קבוע. כלומר המשתמש לא יכול לשנות ישירות את הערך שלו. התווית, למשל, היא פקד סטטי.
                                2. פקד דינמי - פקד שהערך שהוא מציג אינו קבוע. כלומר המשתמש יכול לשנות ישירות את הערך שלו. תיבת הטקסט, למשל, היא פקד דינמי.

                                את הפקדים הדינמיים גם נחלק לשני סוגים:

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

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

                                1. פקד לא מאוגד - לא מאוגד לשדה כלשהו בטבלה.

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

                                התוית ותיבת הטקסט הם מן הסתם הפקדים הנפוצים ביותר.

                                במקום השלישי והמכובד, נמצאת התיבה המשולבת (ComboBox)

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

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

                                היתרונות האלו משדרגים את חווית המשתמש באופן מהותי.
                                בואו נראה.

                                פתחו את טבלת התרומות Donation בתצוגת עיצוב. עברו לשדה DonorID, ולמטה במפייני השדה שלו, בחרו בלשונית "בדיקת מידע":
                                a0ac2fb8-bf33-4c25-8aa0-908f171229f6-תמונה.png

                                נבחין כי כרגע השדה מוגדר כתיבת טקסט. אם נקליק עם הסמן על השורה, נראה בצד שמאל שלה חץ קטן למטה, נלחץ עליו ונבחר מהרשימה את התיבה המשולבת:
                                f70a0548-88cc-44f2-8e7d-c6c74e532240-תמונה.png
                                נקבל שלל של אפשרויות חדשות!
                                הכניסו את הערכים הבאים, כפי שהם מופיעים בתמונה:
                                2efa0424-32ca-488a-be71-6ec57a6085f4-תמונה.png
                                שימרו את הטבלה ועיברו לתצוגת גליון נתונים. בשורה הראשונה, כנסו לשדה של DonorID ותבחינו כי יש חץ קטן למטה בסוף השדה. זה מציין כי השדה מוצג כתיבה משולבת. לחצו על החץ:
                                2cac4496-c105-4c50-8b02-dfcf2e370a48-תמונה.png
                                אקסס תציג לנו את שם התורם המלא ליד המזהה שלו!

                                איך זה קרה?
                                בואו נחזור על מה שעשינו:

                                א. שינינו את מאפייני השדה כך שיציג תיבה משולבת במקום תיבת טקסט רגילה.
                                ב. הגדרנו את מקור השורה של התיבה המשולבת להיות השאילתא qryDonor_FullName שכזכור, מציגה את שם התורם המלא לצד המזהה שלו.
                                ג. הגדרנו את מונה העמודות ל-2, כך שיוצגו שתי העמודות הראשונות בשאילתא.

                                כעת שימו לב שבהגדרות התיבה המשולבת, מוגדרת העמודה המאוגדת להיות מספר 1:
                                abc1fa93-9cfd-404d-b018-4adc15b84fdb-תמונה.png
                                העמודה המאוגדת היא הערך האמיתי שנשמר בשדה שבטבלה. במקרה שלנו, העמודה הראשונה של השאילתא qryDonor_FullName היא המספר המזהה-ID של התורם (ולא השם המלא-FullName)

                                מה שמביא אותנו לשלב הבא:
                                בואו נסתיר לגמרי את המזהה של התורם!

                                כנסו שוב למאפייני השדה של DonorID, והפעם, הוסיפו במאפיין "רוחב עמודות" את הטקסט הבא 4;0:
                                9d09ffb0-81fa-4f8f-b627-e0c9e5daaa66-תמונה.png
                                כך אנו מגדירים את רוחב העמודות שיוצגו בתיבה המשולבת (משמאל לימין). דהיינו:
                                עמודה מספר 1 תוצג ברוחב 0 ס"מ (=מוסתרת)
                                עמודה מספר 1 תוצג ברוחב 4 ס"מ
                                שימרו את הטבלה ועברו לתצוגת גליון נתונים. שימו לב שעכשיו מוצגים שמות התורמים בלבד, ללא המזהה שלהם:
                                1b17e78b-4b61-4478-be89-ebe8a90e2174-תמונה.png
                                שנו את תרומה מספר 1 לתורם ישראל יעקב:
                                1fc7ff8a-ee37-423e-840d-eeb84f11a212-תמונה.png
                                ראיתם כמה שזה קל וברור! זוהי העוצמה שבתיבה המשולבת. הנה כל היתרונות שציינתי בהתחלה:

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

                                מקווה שהכל היה ברור. מעכשיו התיבה המשולבת תהיה הפקד החביב עלינו.

                                שיעורי בית:

                                1. צרו שאילתא חדשה: qryFamily_FullName ובה שני שדות: המזהה של המשפחה ID, ושדה מחושב FamilyFullName שמחבר את שם המשפחה, שם האב, וא"ו החיבור ושם האם, כך שתתקבלנה התוצאות הבאות:
                                ID FamilyFullName
                                1 ראובני אברהם ושרה
                                2 שמעוני יצחק ורבקה
                                

                                וכו'.

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

                                בהצלחה רבה!

                                בפוסט הבא נציג אי"ה את הפתרונות (גם לשיעור שעבר).

                                תגובה 1 תגובה אחרונה תגובה ציטוט 12
                                • OdedDvir
                                  OdedDvir נערך לאחרונה על ידי

                                  חלק יד: פתרונות לשיעורים הקודמים ויישום של התיבה המשולבת

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

                                  טופס המשפחות
                                  שני קליקים וסיימנו:
                                  4b357523-6f77-40b7-bff3-04424d1f458e-תמונה.png

                                  שימו לב טוב שאקסס הוסיפה עבורנו בתחתית הטופס פקד המכיל טבלה. מזהים? זו רשימת התורמים שמשוייכים למשפחה הזו בטבלת הזוגות Family_Donor.

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

                                  טופס הזוגות:
                                  לכאורה כמו קודם, נבחר את הטבלה, נלחץ על הכפתור ליצירת טופס - והנה:
                                  106d972b-3e4e-4c26-b8d6-c27aaf356822-תמונה.png

                                  אבל רגע.
                                  שימו לב שזה טופס שמציג בכל פעם רשומה אחת בלבד. זה מאוד לא נוח לעבודה שלנו.

                                  הייתי רוצה טופס שמציג את כל הרשומות, שורה אחר שורה, כך הרבה יותר קל לנהל את רשימת הזוגות. לשם כך ניצור טופס טבלאי. זהו טופס שמכיל רשומות מרובות, שורה אחר שורה.

                                  בואו נמחק את הטופס שיצרנו, והפעם נשתמש באשף ליצירת טופס טבלאי.

                                  כמו קודם, ראשית נבחר את הטבלה Familiy_Donor, אך הפעם נבחר מתפריט העיצוב: "טפסים נוספים" > "פריטים מרובים":
                                  b8706086-e503-44f0-8a16-95863e38274f-תמונה.png
                                  נקבל את הטופס הזה:
                                  0052df42-c9c0-4ffc-87ff-01a1694a4678-תמונה.png

                                  נשמור אותו בשם frmFamily_Donor.

                                  יופי. הלאה.

                                  צרו שאילתא חדשה: qryFamily_FullName ובה שני שדות: המזהה של המשפחה ID, ושדה מחושב FamilyFullName שמחבר את שם המשפחה, שם האב, וא"ו החיבור ושם האם.

                                  פתרון:
                                  06bc55fc-bf1e-45d5-a0d4-64418f49e674-תמונה.png

                                  עברית קשה שפה:
                                  יש כאן חלק מעצבן עם וא"ו החיבור, כששמים אותה באותה מחרוזת עם תו הרווח, זה נראה כאילו האות קודמת לרווח. אהבתי את הפתרון היצירתי של @בערל, להוסיף את הרווח בנפרד ואחר כך את האות וא"ו.
                                  שתי נקודות!

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

                                  הנה מאפייני השדה FamilyID:
                                  86e038fb-59b9-4848-8493-119f35e92476-תמונה.png
                                  מאפייני השדה DonorID כמעט זהים, אלא שמקור השורה שם הוא שונה, כמובן, דהיינו qryDonor_FullName.
                                  והנה התוצאה:
                                  5bfd47e3-db7f-42f6-ad52-2e2330eb1713-תמונה.png
                                  קריא וברור!

                                  אבל יש בונוס: הואיל וביצענו שינוי בהגדרות תצוגת השדה DonorID בטבלת הזוגות, כך שיציג תיבה משולבת ולא תיבת טקסט פשוטה, כעת השתנתה גם התצוגה בטופס המשפחה לתיבה משולבת, ושם התורם מופיע במלואו:
                                  85c3417e-1b7d-43a8-ab0c-41b46ea24f7e-תמונה.png
                                  כמה קל עכשיו לשייך תורמים למשפחה!

                                  אבל משום מה בטופס הזוגות, התצוגה לא השתנתה, ומוצגים שם רק המזהים של המשפחות והתורמים, בתיבת טקסט פשוטה ולא בתיבה משולבת. תראו:
                                  c759d454-ab76-4a93-b657-8fdb60ca5262-תמונה.png

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

                                  אני לא רוצה לבחור בדרך ההרסנית הזו... כי מה קורה אם כבר בינתיים הוספנו עוד דברים בטופס, כגון לשנות את הכותרת שלו לדבר יותר קריא, למשל:
                                  5714284e-9bd9-4b47-b9ff-cba9a721c0e0-תמונה.png
                                  ומה אם כבר נקשרנו לטופס הזה, ואנחנו רוצים לחוס על חייו?

                                  בואו נלמד עכשיו איך אפשר להגדיר את השינוי בתצוגה באופן ידני בטופס הקיים, מבלי לאבד את מעשה ידינו עד כה.
                                  פתחו את הטופס בתצוגת עיצוב.
                                  הקליקו קליק ימני על תיבת הטקסט של FamilyID > שנה ל: > תיבה משולבת:
                                  246d8ec2-61cd-4876-9578-67c0c83b720f-תמונה.png

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

                                  1. בכרטסת נתונים הגדירו את מקור השורה להיות: qryFamily_FullName:
                                    940645ee-e427-4200-a59d-89898024b37c-תמונה.png
                                    2.בכרטסת תבנית הגדירו את מונה העמודות להיות 2, ואת רוחב העמודות ל 4;0:
                                    08bf43fa-6231-4885-8965-b23c200970e4-תמונה.png
                                    (נשמע מוכר, לא?)

                                  אני משאיר לכם להבין איך הפכתי גם את תיבת הטקסט השנייה של DonorID לתיבה משולבת.
                                  הנה התוצאה (לאחר קוסמטיקה קלה של הרחבת העמודות בטופס):
                                  77dd6925-52be-4aad-b5dd-9656f5459c14-תמונה.png

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

                                  בתור הכנה לשלב הבא:

                                  1. הוסיפו שדה חדש לטבלת התרומות, בשם: TargetFamilyID, מטיפוס מספר שלם ארוך, שיכיל את המזהה של המשפחה שעבורה מיועדת התרומה.
                                  2. קיבעו את ערך ברירת המחדל לשדה זה להיות NULL במקום 0 (למתבוננים: מדוע?)
                                  3. הגדירו את קשרי הגומלין עבור שדה זה.
                                  תגובה 1 תגובה אחרונה תגובה ציטוט 5
                                  • OdedDvir
                                    OdedDvir נערך לאחרונה על ידי OdedDvir

                                    חלק טו: שדרוג התרומות

                                    קודם כל פתרונות:

                                    1. הוסיפו שדה חדש לטבלת התרומות, בשם: TargetFamilyID, שיכיל את המזהה של המשפחה שעבורה מיועדת התרומה.
                                    2. קיבעו את ערך ברירת המחדל לשדה זה להיות NULL במקום 0.

                                    פתרון:
                                    c55be9dd-eee0-46aa-b099-d75a8ebdf5ee-תמונה.png

                                    (למתבוננים: מדוע?)

                                    כי אין משמעות לערך 0. הרי מעולם לא תהיה משפחה עם ID 0, לכן יותר מדוייק להקצות את NULL, שפירושו: כלום.

                                    הערה: גם אם אקסס לא מאפשרת ערך 0 בשדה מספור אוטומטי, והוא תמיד מתחיל מ-1, יש מערכות DB שמאפשרות ליצור שדה מספור אוטומטי שמתחיל מ-0 (או אפילו מערך אחר). במקרה כזה הנתונים שלנו עלולים להטעות אותנו!
                                    גם לגבי פונקצית ספירה Count, שדה המכיל ערך 0 נספר, בעוד שדה המכיל NULL - לא נספר.

                                    בתור פרקטיקה טובה, נשתמש בכלל הבא:
                                    בכל מקום שאין משמעות לערך ברירת המחדל 0, נעדיף את NULL.

                                    אם אנחנו כבר כאן, אז על הדרך בואו נשנה גם את המאפיינים של השדה כך שיציג את שם המשפחה המיועדת כתיבה משולבת:
                                    7484480c-d688-4799-a8ce-d7028a9af4cd-תמונה.png

                                    1. הגדירו את קשרי הגומלין עבור שדה זה.

                                    פתרון:
                                    1e93761c-d363-4beb-ae04-0f4657c80b5a-תמונה.png

                                    יש לנו הרבה עבודה היום, אז קדימה:

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

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

                                    הנה הטופס החדש, שימו לב לשדה של משפחת הייעד:
                                    59ff69c0-95bb-47ac-8663-642ff0b8560a-תמונה.png

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

                                    תיכף ניצור טופס נוסף עבור התרומות, אשר יהיה בתצוגת גליון נתונים, המציגה רשומות מרובות.

                                    נשמור את הטופס החדש בשם frmDonationCard.

                                    נחזור על השלב האחרון שוב, ניצור טופס לתרומות כמו קודם, אך הפעם נשנה את תבנית העיצוב שלו לגליון נתונים, וכן נמחק את הפקדים של ID ו- DonorID:
                                    b5a3aa19-c4d3-435e-884b-0fe0770da5de-תמונה.png

                                    את הטופס השני נשמור בשם: frmDonationList.

                                    עדכון הטופס של התורם
                                    נסו לפתוח את טופס התורמים frmDonor. תקבלו הודעת שגיאה:
                                    f8ccd6f3-c197-4eca-b907-ccb1eb8f7940-תמונה.png

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

                                    לחצו על אישור, שימו לב כי נותר חלל ריק במקום שבו היה טופס המשנה:
                                    9130cebc-f100-49a0-bb0e-0852065f69b9-תמונה.png

                                    בואו נתקן את הבעיה. נעבור לתצוגת עיצוב (אקסס שוב תתריע על השגיאה. נלחץ אישור)
                                    נבחר את פקד טופס המשנה:
                                    669054ce-2309-42f6-9ba7-9c69c21b63d4-תמונה.png

                                    ובמאפיינים, נשנה את אובייקט המקור של הפקד להיות frmDonationList:
                                    44daed64-2769-4ac6-9dce-95cd512d626d-תמונה.png

                                    שימו לב שקישור שדות האב עדיין מכיל את הערך ID, וקישור שדות הצאצא עדיין מכיל את הערך DonorID:
                                    4428766f-a134-41b3-90af-92b9c529b6a3-תמונה.png

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

                                    נעבור לתצוגת טופס ונראה שהכל תקין:
                                    64b9627c-3338-4867-bd13-745a98f7807e-תמונה.png
                                    נסגור ונשמור.

                                    עדיין חסרה לנו פונקציה עיקרית וחשובה.

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

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

                                    נתחיל באפשרות א:
                                    רצינו שכל תורם יוכל לשייך את תרומותיו רק אל המשפחות המשוייכות אליו, וכרגע מוצגות לכל תורם כל המשפחות הקיימות.
                                    לשם כך אנחנו רוצים לסנן את התיבה המשולבת של TargetFamilyID שבטופס המשנה frmDonationList, כך שתציג רק המשפחות המשוייכות לתורם הנוכחי בטופס האב frmDonor.

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

                                    המשפחות "ראובני אברהם ושרה" וכן "שמעוני יצחק ורבקה" מקושרות לכל התורמים. לעומתן, המשפחות "זבולוני יעקב ולאה", וכן "אשרי אדם וחוה", משוייכות כל אחת רק לתורם אחד, כדלקמן:
                                    1908773c-fb6e-49d7-a6fb-5c8ffe3d2eff-תמונה.png

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

                                    למעשה, אנו מבקשים להציג שלש שדות:

                                    • ID, FamilyFullName מתוך השאילתה qryFamily_FullName
                                    • DonorID מתוך הטבלה Family_Donor

                                    לשם כך ניצור שאילתת עזר, שמצרפת את שתי הטבלאות הנ"ל.

                                    הערה: מי שאזניו רגישות (או יותר נכון, עיניו) שם לב שאני לפעמים קורא לשאילתה בשם "טבלה". מבחינת אקסס, אין הבדל עקרוני בין השניים. ניתן לבסס טפסים הן על שאילתות והן על טבלאות, ניתן לבסס שאילתות על שאילתות וכו'.

                                    יצירה > עיצוב שאילתה > ונבחר להציג את הכל:
                                    632ca6ed-082e-43e5-b96b-5e9793b56935-תמונה.png
                                    יתכן והתצוגה בגרסת אקסס שלכם שונה מעט. הפאנל האפור שבתמונה נכנס רק לאחרונה כשדרוג לאקסס.

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

                                    נחזור לעניינו.
                                    נוסיף למשטח העבודה את הטבלה Family_Donor, ואת השאילתא qryFamily_FullName.
                                    נגדיר את הצירוף הפנימי בין השדות ID ו-FamilyID, ונוסיף לשאילתא את השדות לפי הסדר הבא:

                                    1. ID
                                    2. FamilyFullName
                                    3. DonorID

                                    52b4f9cb-9de9-4d6e-a203-49d6c4d330af-תמונה.png
                                    נעבור לתצוגת עיצוב ונראה שליד כל משפחה מופיעה גם עמודת התורם המשוייך אליה:
                                    1dfe0af2-0759-4558-9ab7-4bb7ef7927b8-תמונה.png
                                    מעולה.

                                    נשמור את השאילתה בשם: qryFamily_FullName_Donor.

                                    שלב ב: החלפת מקור השורה של התיבה המשולבת בטופס המשנה
                                    נפתח את טופס המשנה qryDonationList בתצוגת עיצוב, נסמן את התיבה המשולבת של משפחת הייעד, ובמאפיין מקור שורה נמחק את הכתוב לגמרי, כך:
                                    04da71d5-f434-48fd-a775-bcdddb8f33b8-תמונה.png
                                    כעת נלחץ על שלושת הנקודות משמאל למקור השורה:
                                    5b5317a2-aae0-4383-b0ea-052bcbecabd2-תמונה.png
                                    אקסס תכניס אותנו למסך עורך השאילתות. נוסיף למשטח העבודה את שאילתת העזר שלנו: qryFamily_FullName_Donor, ונוסיף את השדות לפי הסדר כמקודם:
                                    cf9f3707-2870-4f7e-836b-04e30618300f-תמונה.png

                                    כעת לשלב המכריע:
                                    נעמוד על הקריטריון של DonorID, ונפתח את הבונה:
                                    fbc41fa5-cfd9-4889-8376-be78aed8f4d3-תמונה.png

                                    • בחלונית שנפתחה, נבחר מצד ימין את הקובץ של אקסס שלנו > Forms > כל הטפסים > frmDonorCard. (טופס האב)
                                    • מקטגוריות הביטויים נבחר את ID. (מזהה התורם)
                                    • ומתוך ערכי הביטויים נקליק פעמיים על "<ערך>" (הפריט הראשון)

                                    אקסס תבנה עבורינו את הביטוי הבא: [Forms]![frmDonor]![ID]

                                    להלן ממוספרים כל שלבי התהליך:
                                    3b0a724e-8779-40a7-a42a-2842d78cfa95-תמונה.png
                                    נלחץ על אישור ונסגור את עורך השאילתות.
                                    שימו לב לקריטריון שנוסף לעמודה DonorID:
                                    7dd58d3e-c90e-47ca-9663-a403898d54e0-תמונה.png

                                    הנתיב [Forms]![frmDonor]![ID] מציין את השדה ID בטופס frmDonor.

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

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

                                    כעת נסגור את עורך השאילתות, על ידי האיקס למעלה:
                                    8ae86509-793c-4769-a678-821d356a92ce-תמונה.png
                                    אקסס תשאל האם אנו רוצים לשמור את השינויים שעשינו במאפיין של מקור השורה:
                                    0c7513f8-8ecf-4545-a576-7adbf4a61230-תמונה.png
                                    נבחר כן.
                                    נסגור את תצוגת העיצוב של הטופס, ונשמור כמובן את השינויים שעשינו בו.

                                    נפתח את טופס האב frmDonor, ונראה לאילו משפחות ניתן כעת לשייך את התרומות של כהן אברהם:
                                    0b5e9b1c-4ec5-4bf5-bfeb-9b9a22f7ae18-תמונה.png
                                    נשים לב שאלו המשפחות המשוייכות אליו בטבלה Family_Donor:
                                    c4c699c5-e293-42a7-b7a3-4433344c9032-תמונה.png
                                    נעבור ללוי יצחק, ונראה שאצלו קיימות 3 משפחות אפשריות, כי אקסס עידכנה את התיבה המשולבת עבורו:
                                    9e38074b-1c2b-4af0-a7a5-a6798a889b08-תמונה.png
                                    זו בדיוק הפונקציונאליות שביקשנו!
                                    👏 👏
                                    אבל היתה עוד אפשרות:

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

                                    פירוש: אם התורם לא יבחר משפחה ביעד, לי כמנהל תהיה האפשרות לשייך בעצמי את התרומה, גם למשפחה שאינה משודכת עמו.
                                    נראה כי אופציה זו כבר קיימת בטופס התרומה frmDonationCard, כי שם לא ביצענו שום סינון על השדה TargetFamilyID.
                                    למשל עבור אברהם כהן, נוכל לבחור גם את משפחת זבולוני או אשרי:
                                    6d26322a-d635-445e-ab71-037c7207b84b-תמונה.png

                                    המשימה הושלמה בהצלחה! 👍

                                    ננוח קצת, כי כבר עלו בדעתי שתי בעיות שעלולות לצוץ במערכת שלנו.

                                    אולי אתם כבר יודעים? (אם כן, ציינו בתגובות)

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

                                    עד כאן להיום, שבת שלום!

                                    תגובה 1 תגובה אחרונה תגובה ציטוט 9
                                    • 1 / 1
                                    • First post
                                      Last post
                                    בא תתחבר לדף היומי!