דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
OdedDvirO

OdedDvir

@OdedDvir
אודות
פוסטים
2.4k
נושאים
59
קבוצות
0
עוקבים
21
עוקב אחרי
0

פוסטים

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

  • אקסס למתחילים: יצירת מערכת לניהול תורמים
    OdedDvirO 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

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

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


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

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

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

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

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

    =Now()
    

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

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

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

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


  • אקסס למתחילים: יצירת מערכת לניהול תורמים
    OdedDvirO 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 תוים.

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


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

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

    שלום לכולם! מקווה שנהנתם מהחופש הגדול...

    היום הגענו לחלק די קל ומהנה (יחסית...) והוא בניית התפריטים.

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

    אני רוצה ליצור משהו כזה:
    929e98e0-7562-4e49-a60f-0a3e19ce26ba-תמונה.png

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

    שלב א: יצירת טופס תפריט המשפחות
    נפתח טופס חדש ריק, על ידי יצירה > עיצוב טופס.
    נבחר מתפריט העיצוב את פקד הניווט:
    61ed66c8-6c6a-49f5-8bf9-5a4114bce9a8-תמונה.png

    ואז פשוט נקליק בתוך הטופס קרוב לפינה הימנית העליונה:
    0d5c7b84-09e4-4a24-8d64-f05976996eb5-תמונה.png

    אקסס תיצור עבורנו פקד ניווט:
    779206f3-882f-4bbc-b756-7694ed7498e8-תמונה.png

    לפקד הניווט שני חלקים:

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

    נוסיף לחצן לפקד הניווט על ידי לחיצה על המקום שמסומן [הוסף חדש], ונרשום בתוכו "רשימת משפחות". אקסס יצרה עבורנו לחצן חדש:
    a1142b9b-6195-4492-8f19-eaa454574989-תמונה.png

    נגדיל את הלחצן כך שיציג את כל הכיתוב:
    758a4992-e004-4c80-a6b5-d7411662a887-תמונה.png

    נוסיף עוד לחצן עם הכיתוב "כרטיס משפחה":
    cff8531e-602b-4a9d-bb4e-9efaf52ce9d0-תמונה.png

    כעת נותר לנו להגדיר איזה טופס ייפתח על ידי כל לחצן.
    ניכנס למאפיינים של הלחצן הראשון (רשימת המשפחות), ובלשונית הנתונים נבחר את המאפיין "שם יעד ניווט", ונבחר מתיבת הרשימה המשולבת את טופס רשימת המשפחות frmFamilyList:
    51f0751a-69df-48cc-91c1-d5cde737dad6-תמונה.png

    באופן דומה, גם בלחצן השני, נבחר את שם יעד הניווט להיות טופס כרטיס המשפחה frmFamilyCard:
    4da4aa8a-1182-4f17-af7f-856644ad27da-תמונה.png

    לסיום, נסיר מן הטופס את הפקדים המיותרים: בוררי הרשומות, לחצני ניווט ופסי הגלילה: (להלן: "שלשת המעצבנים")
    50efdb0e-dfef-428f-a7ca-f51e02ffd7c0-תמונה.png

    ונצמצם את השוליים המיותרים מסביב לפקד הניווט (מסומנים בכתום):
    d673cde3-9d38-4c66-85f1-cd7651ad2743-תמונה.png
    נסגור את הטופס ונשמור אותו בשם navFamilies.
    כעת פתחו את הטופס שיצרנו ובידקו את לחצני הניווט:
    33298f0e-8cb3-45a3-9509-2ec6ca431b0a-תמונה.png

    1bc0fe86-ab00-4812-8ef3-d9ce8b3dc785-תמונה.png

    שלב ב: יצירת טופס התפריט הראשי
    בדומה לשלב הקודם, נפתח טופס חדש ריק, על ידי יצירה > עיצוב טופס, ונוסיף אליו פקד ניווט, ונוסיף שלושה לחצנים כפי שמופיע בתמונה הבאה:
    b0fefc87-12a4-45e7-a8f3-ed955d07a0ee-תמונה.png

    כעת נהפוך את הכיוון של התפריט לאנכי.
    לשם כך נבחר את פקד הניווט כולו (זוכרים? החלק העליון) על ידי הקלקה במקום הריק (לא על לחצן):
    c79ac8cc-4754-420f-a1d9-59007a192374-תמונה.png

    שימו לב שכל פקד הניווט מסומן כעת.
    מתוך המאפיינים בלשונית התבנית נגדיר את המאפיין "מרחב" ל-"אנכי". שימו לב לשינוי בפריסת הלחצנים, כעת הם מופיעים מלמעלה למטה:
    cc6ce00b-e005-465f-b735-660af708bd7e-תמונה.png

    אך עדיין פקד הניווט מופיע בצמוד לחלק העליון של טופס המשנה, ולא מצידו הימני כמו בתכנון.
    אל דאגה, נשנה זאת מיד: נגרור את כל פקד הניווט, כך שיופיע בצמוד לדופן הימנית של טופס המשנה.
    שימו לב לגרור אותו אל הדופן הימנית ממש, כך שיוצג קו בצבע ורוד חלש בצד ימין:
    240fd155-ddf3-4577-8221-4ba8e4e3a283-תמונה.png

    כעת נקטין את רוחב פקד הניווט לגודל יותר סביר:
    26b9919a-dd02-40f6-b134-528f7af8257e-תמונה.png

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

    להלן התוצאה:
    9d35ed40-74d8-4c8e-9561-7f64ac3fe405-תמונה.png

    נהדר, זה לא היה קשה, נכון?

    קחו אויר, כי החלק הבא קצת יותר מורכב.

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

    לחצן תצוגת המשפחה
    פתחו את הטופס בתצוגת עיצוב, ובחרו את לחצן הצגת המשפחה. שנו את שמו ל: cmdViewFamilyCard:
    14cfc6d5-ef64-4b6b-90d5-9bee54fd7eb7-תמונה.png

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

     DoCmd.BrowseTo acBrowseToForm, "frmFamilyCard", "navMain.NavigationSubform>navFamilies.NavigationSubform", "ID=" & Me.ID
    

    הסבר הקוד:
    אנו משתמשים כאן באובייקט DoCmd שראינו בעבר, המכיל פונקציות שונות באקסס. מתוכו אנו מפעילים את הפונקציה BrowseTo שתפקידה לנווט אל טופס מסויים. הפונקציה מקבלת כמה פרמטרים:
    65ae142a-605d-4230-9469-b47200ef9bbb-תמונה.png

    • הפרמטר הראשון acBrowseToForm מציין את סוג האובייקט לתצוגה. במקרה שלנו הוא טופס.

    כדי להציג דוח במקום טופס, יש לציין acBrowseToReport במקום acBrowseToForm.

    • הפרמטר השני "frmFamilyCard" מציין את שם הטופס לפתיחה הלא הוא כרטיס המשפחה.
    • הפרמטר השלישי "navMain.NavigationSubform>navFamilies.NavigationSubform" מציין את הנתיב שבו ייפתח הטופס.
      כיוון שבנינו מערכת של תפריטי ניווט מקוננים (תפריט ראשי>תפריט המשפחות) אנו צריכים לציין במפורש את כל המסלול שדרכו נגיע ליעד המבוקש (טופס המשנה של תפריט המשפחות). התחביר הוא כך:
      שם_טופס_הניווט.שם_פקד_טופס_המשנה (כברירת מחדל הוא NavigationSubform)
      אם יש כמה טפסי ניווט אחד בתוך השני (כמו אצלנו), מפרידים ביניהם על ידי הסימן "גדול מ" <.
      כך מתקבלת התוצאה הנ"ל.

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

    • הפרמטר הרביעי "ID=" & Me.ID מציין קריטריון לחיפוש רשומה מבוקשת לתצוגה.
      פרמטר זה הוא אופציונאלי, וכאשר מציינים אותו, אקסס תחפש בטופס שנפתח את הרשומה המתאימה לקריטריון, ותקפוץ אליה בפתיחת הטופס.
      לדוגמא, אם אנו רוצים להציג את המשפחה שהמזהה ID שלה הוא 7, עלינו להעביר לפונקציה את הקריטריון: "ID=7".
      הואיל וברצוננו להציג את המשפחה המתאימה לשורה שבה לחצנו על הלחצן, ואנחנו לא יודעים מה יהיה המזהה שלה, נוכל לקבל את המזהה שלה על ידי האובייקט Me.ID וניצור את הקריטריון המתאים על ידי חיבור מחרוזות.

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

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

    טעות בכתובת
    הניווט של אקסס אינו מושלם.
    נסו לפתוח ישירות את הטופס של רשימת המשפחות frmFamilyList, וללחוץ על הלחצן "הצג".
    למרבה התסכול, במקום להציג את הטופס, אקסס תציג הודעת שגיאה:
    ad51c3b1-8ab4-4465-b976-e8857dd3fd0e-תמונה.png

    מה קרה?
    ההודעה הזו מוצגת מפני שאנו מנסים לגשת לנתיב שאינו קיים.
    הרי בקוד צייננו שהנתיב המבוקש הוא "navMain.NavigationSubform>navFamilies.NavigationSubform". אבל הטפסים של הניווט navMain ו-navFamilies לא פתוחים כעת, ולכן הנתיב שגוי.

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

    לחצן יצירת משפחה חדשה
    בואו ניצור גם את הלחצן של יצירת משפחה חדשה. נבחר את הלחצן, וניצור עבורו פונקצית אירוע בעת לחיצה:
    1e7bf761-05a7-43ec-8dff-e66bf5dbd51e-תמונה.png

    לשמחתנו, הקוד הנדרש דומה לקוד הקודם (נוכל להעתיק ולהדביק, ולשנות כנדרש):

    DoCmd.BrowseTo acBrowseToForm, "frmFamilyCard", "navMain.NavigationSubform>navFamilies.NavigationSubform", , , acFormAdd
    

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

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

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

    לחצן מחיקת המשפחה
    מחיקת משפחה היא תהליך מורכב, הואיל ויש לכל משפחה קשרי גומלין שונים. בנוסף, אני לא בטוח שכדאי לאפשר מחיקת משפחה מתצוגת הרשימה. לכן אני אחזור בי ואסיר את לחצן המחיקה מרשימת המשפחות, כדי לאפשר מחיקת משפחה רק מכרטיס המשפחה:
    8cb6114f-a2b9-4c8e-9a41-ad0ffb38f4c0-תמונה.png

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


  • אקסס למתחילים: יצירת מערכת לניהול תורמים
    OdedDvirO 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
    הפלא ופלא!
    איך זה קורה?
    הסבר בפוסט הבא!


  • איך שואלים שאלות בפורום
    OdedDvirO OdedDvir

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

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

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

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

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

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

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

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

    בקיצור: הסיכוי שלך לקבל עזרה אמיתית שואף לאפס.


  • דיון ענייני: איך לתמחר פרוייקט תוכנה
    OdedDvirO OdedDvir

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

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

    1. מה הערך של הפרויקט בשוק

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

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

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

    2. מה ערך הפרויקט עבור הלקוח שלך?

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

    3. מה ערך הפרויקט עבורך?

    יש שלוש שיטות עיקריות לתמחור: תשלום יחיד מראש, תשלום יחיד + תמיכה חודשית, מנוי חודשי.

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

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

    תחשוב טוב, כיצד נראית התמיכה לטווח ארוך שלך? מה העלות שלך לטווח הארוך?

    נניח שמכרת למישהו תוכנה ב-6000 ₪. נשמע מחיר לא רע למתחיל, לא? אבל - אתה תומך בה למשך שנתיים. זה אומר שבשורה התחתונה הרווחת 250 ₪ בחודש. האם זה עדיין שווה לך?

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

    4. עלויות נוספות

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

    מסקנה

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


  • פרימייר פרו - הדרכה - כיצד לטשטש או לפקסל דמות נעה
    OdedDvirO OdedDvir

    כתגובה לפוסט של @שעטנ-ז-ג-ץ : https://tchumim.com/topic/9451/האם-יש-הדרכה-איך-לפקסל-פנים-או-דמות-בהסרטה/13

    מדריך בסיסי לטשטוש דמות נעה בסרטון

    נפתח את פרימייר, ונייבא את הסרטון. בחרתי בסרטון הנדיר של אגודת ישראל משנת 1923 (בו גם נראה החפץ חיים זצ"ל). אני רוצה לטשטש את פני האיש עם החולצה הלבנה שנראה בדקה 2:19 משמאל:
    151ca087-5170-4ff8-b503-8f51b4b4909f-תמונה.png

    שלב א: יצירת אפקט טשטוש \ פיקסול:
    נבחר למטה משמאל את הלשונית Effects, ואת המסנן Mosaic (פיקסול):
    (אם רוצים טשטוש - צריך לבחור במקומו אחד מאפקטי ה-Blur)
    ונגרור את האפקט לתוך קו-הזמן (מסומן בחץ):
    a8cc4b93-7cff-4f41-ae02-a158c6c50a36-תמונה.png

    שלב ב: הגדרת מסכה לאפקט
    נבחר למעלה משמאל את לשונית Effect Control (מספר 1 בתמונה), נבחר צורת אליפסה (2), נשנה את הגודל כך שיתאים רק לפנים של האיש (3) ואחר כך נגדיר את מספר הריבועים ל100 על 100 כדי שהאפקט ישתלב יותר בסרטון ולא יראה כמו ריבוע אחד גדול (4):
    14a1794f-a18b-4024-bf9e-19aa5d139022-תמונה.png

    שלב ג: הגדרת המסכה לעקוב אחרי האזור הנבחר באופן אוטומטי
    כעת באותה לשונית ניתן להגדיר את אופן המעקב אחר התנועה על ידי לחיצה על המפתח השוודי, בדרך כלל הרצוי הוא האופציה האחרונה, שבה המסכה משנה מיקום, גודל וסיבוב אוטומטית (ברירת מחדל)
    נלחץ על הפליי ▶ וניתן לפלאי התוכנה לעשות את שלה. התוכנה תנסה לעקוב עם תנועת המסכה אחרי האזור שבחרנו, ותתחיל ליצור KeyFrames שמציינים את מאפייני המסיכה (גודל, מיקום, סיבוב). כשהדמות יצאה מהמסך - יש ללחוץ על Stop (אחרת המסיכה תישאר גלוייה גם כשהדמות נעלמה)
    f0c0a1ad-ab31-40c4-b961-637f8aff1c32-תמונה.png

    הערות:

    1. ניתן לכוונן אחר כך את הKeyFrames בנפרד, על ידי לחיצה על האזור המסומן:
      1f390641-945e-4702-9e0e-9e25a297962c-תמונה.png
    2. ניתן לקבל שליטה על תהליך התזוזה וליצור כל KeyFrame בנפרד על ידי הלחצנים מימין או משמאל ללחצן ▶ או לצעוד אחורה במקום קדימה.
    3. יש עוד הרבה אפשרויות כאן, ואידך זיל גמור (או שתשאל כאן...)

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

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

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

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


  • אקסס למתחילים: יצירת מערכת לניהול תורמים
    OdedDvirO 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?
    אני רוצה להציג גם את שם התורם ליד הסכום שתרם!
    בסדר, בסדר, בפוסט הבא נלמד איך לשלב את שתי השאילתות שיצרנו יחד, וליצור את התוצאה המבוקשת.


  • אקסס למתחילים: יצירת מערכת לניהול תורמים
    OdedDvirO 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.

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


  • אקסס למתחילים: יצירת מערכת לניהול תורמים
    OdedDvirO 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
    ונצא להפסקה.


  • אקסס למתחילים: תגובות
    OdedDvirO OdedDvir

    @yossiz אמר באקסס למתחילים: תגובות:

    נראה לי שה-S מייצג structured - לא simple.

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

    מאיפה יש לך את הזמן והכוחות להשקיע בזה?!

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


  • אקסס למתחילים: יצירת מערכת לניהול תורמים
    OdedDvirO 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

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

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


  • סגירת מחלוקת בעליאקספרס: מידע שימושי
    OdedDvirO OdedDvir

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

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

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

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

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

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

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

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

    ההנהלה תחקור את המקרה ותברר מי האשם. ברוב המקרים לקוחות זוכים ומוכרים לא ישרים מקבלים קנסות.

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

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

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

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

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


  • אקסס למתחילים: יצירת מערכת לניהול תורמים
    OdedDvirO 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 בשאילתת הסכומים, ונראה שנוצר קו מחבר בין השאילתות (מזכיר לכם משהו?):
    e5198941-7d79-489b-804f-fae7509b75bd-תמונה.png
    נוסיף את השדות הבאים לפי הסדר:
    מטבלת השמות: ID, FullName
    ומטבלת הסכומים: TotalAmount
    c98bc0f3-92d9-4349-b405-54c8253be992-תמונה.png
    נעבור לתצוגת עיצוב כדי לבדוק את התוצאות:
    992b78d4-aed7-41e8-8d62-3f2df085333f-תמונה.png
    נראה שזה עובד!

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

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


  • אקסס למתחילים: תגובות
    OdedDvirO OdedDvir

    שלום לכולם!
    לשאלות או תגובות, אשמח אם תגיבו כאן.

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


  • אקסס למתחילים: יצירת מערכת לניהול תורמים
    OdedDvirO 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.

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

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

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

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

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

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

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

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

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


  • תכנות | איך להתחיל?
    OdedDvirO OdedDvir

    וואו, תודה @למה שעוררת את הנושא החשוב!
    ברצוני להוסיף את התובנות שלי:

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

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

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

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


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

    חלק י"ח: VBA - חלק א: היכרות, עורך הקוד, ואירועים

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

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

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

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

    60 שניות על VBA
    על קצה המזלג, VBA הוא קיצור של Visual Basic for Applications. זוהי שפת תכנות, שמשמשת בעיקר בתוך היישומים הנפוצים של אופיס, דהינו וורד, אקסל וכמובן אקסס.

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

    ל-VBA כמה יתרונות חשובים:

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

    נחזור לענייננו:

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

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

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

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

    פתחו את טופס רשימת התרומות (טופס המשנה) frmDonationList בתצוגת עיצוב.
    שימו לב: כשפותחים טופס בתצוגת עיצוב, כברירת מחדל, אקסס בוחרת את פקד הטופס.
    סימן ההיכר לכך הוא הריבוע השחור בפינה השמאלית העליונה, ליד הסרגל של הטופס:
    d3a4350f-aae0-482f-b9a6-fb3097ea7d28-תמונה.png
    אם בטעות לחצתם ובחרתם פקד אחר, עליכם לבחור בפקד הטופס, על ידי לחיצה על הפינה הנ"ל, או בחירה של פקד הטופס מסרגל המאפיינים:
    fd12c8da-1ad3-4a0c-8610-48ba61a8ed3d-תמונה.png

    יפה, כעת בחרו מסרגל המאפיינים את הלשונית "אירוע". שימו לב לרשימה הארוכה של האירועים האפשריים בפקד הטופס:
    b0f702b1-bc49-48c1-90b3-03d8720692f0-תמונה.png

    בחרו את הארוע: "בעת סגירה". בסוף השורה, לחצו על שלושת הנקודות ... ובחלון בחירת הבונה בחרו באפשרות האחרונה: בונה קוד, ולחצו על אישור:
    2808c4d5-e016-4865-b31c-933e3deccaff-תמונה.png

    אקסס תפתח עבורנו את עורך ה-VBA:
    86ab78c8-d4d2-4025-839d-00127576eb97-תמונה.png

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

    בואו נתעלם מכל מה שמסביב ונתמקד בשתי שורות הקוד הבאות:
    601c24a1-1945-4ccb-8836-dbcfe15b9ce9-תמונה.png

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

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

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

    ב- VBA יש הבחנה בין שני סוגי תהליכים: Sub-Routine (תת-שגרה) ו- Function (פונקציה), כאשר הסוג ראשון לא מחזיר ערך, והאחרון כן. בשפות מודרניות כיום מקובל להשתמש רק במושג פונקציה עבור שני הסוגים הנ"ל (את הסוג הראשון, מכנים בשם פונקציה שלא מחזירה ערך). לשם פשטות אני לא אדקדק בלשוני ואשתמש גם אני רק במילה פונקציה, אא"כ אהיה מוכרח אחרת.

    הלאה,

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

    יצירת קוד לריצה באירוע סגירת הטופס

    בואו נקפוץ למים, ונוסיף בין השורות הנ"ל את הקוד הבא:
    734c4f28-87eb-4ff5-a0c1-9fe393aa1037-תמונה.png

    הסבר:

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

    ככלל, נקצה שמות משמעותיים למשתנים, אשר מעידים על תוכנם, ולא נשתמש בקיצורים או ראשי תיבות, או שמות עלומים כגון x,y וכו'.

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

    המילה השמורה As היא קידומת לשונית שהוכנסה לשפת VB. שפת Basic תוכננה עם כל מיני מילים מיותרות כאלו, כדי להקל על קריאות הקוד.

    • השורה השנייה מבצעת קריאה לפונקציית המנייה DCount ומכניסה את הערך שהחזירה הפונקציה לתוך המשתנה donationsToUpdate.

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

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

    1. שם השדה שאותו אנו מונים: TargetFamilyID
    2. שם הטבלה שמכילה את השדה: Donation
    3. תנאי למניית השדה: StatusID=1

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

    שימו לב שלא הוספנו בתנאי בדיקה אם השדה TargetFamilyID אינו ריק (כלומר התרומה משוייכת למשפחה), מדוע?
    כפי שציינתי בעבר, פונקציות מנייה ממילא מתעלמות משדה המכיל Null.
    הואיל והשדה TargetFamilyID הוא בעצמו השדה הנמנה, אין צורך להוסיף בפירוש בתנאי כי הוא אינו ריק, הבדיקה ממילא מבוצעת על ידי הפונקציה DCount.

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

    רוצים לראות מה עשינו?
    בואו נחזור לטופס שלנו.
    נלחץ על Alt+F11 או על הסמל של אקסס (הסמל העתיק...) בצד שמאל למעלה בחלון עורך ה-VBA:
    37390dc4-2015-4f73-bc37-768efb119723-תמונה.png
    אפשר גם לסגור לגמרי את העורך כדי לחזור לאקסס.
    נסגור את הטופס וכמובן נשמור את השינויים.

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

    רגע, בואו נחזור לעורך ה-VBA (על ידי הקשה שוב על Alt+F11).
    שימו לב לחלונית ה Immediate בתחתית העורך: רואים את האפס הקטן?
    4a81c3f0-ed4b-4cec-9b82-8972c7f340b0-תמונה.png

    זהו הפלט שיצרה הפונקציה בסגירת הטופס. הוא כרגע 0 כי אין לנו תרומות לטיפול (עם סטטוס =1 שמשוייכות למשפחה). אז בואו וניצור רשומה כזו.
    חיזרו שוב לאקסס והוסיפו תרומה חדשה לכהן אברהם, על סך 72 שקלים, ושייכו אותה למשפחה:
    ea71d188-b820-45d5-8c34-f8b45c3b54a1-תמונה.png
    סיגרו את הטופס, וחיזרו לעורך הקוד. שימו לב שעתה נוספה שורה מתחת לאפס ובה מופיע המספר 1:
    86aa30ce-e8b5-46fa-bfe1-b21eb138661e-תמונה.png
    שמציין כי כעת זוהתה רשומה אחת לטיפול.

    צעד גדול למתכנת המתחיל.

    בפוסט הבא ב"ה נסיים את הפונקציה.

    שיעורי בית

    1. הוסיפו לפונקציה שיצרנו עוד משתנה מסוג Double בשם amountToUpdate, והכניסו לתוכו את סכום התרומות שעומדות לעדכון. השתמשו בפונקצית הסכום DSum (וכן, היא קרובת משפחה של DCount)
    2. הדפיסו בחלון ה-immediate גם את ערך המשתנה שיצרתם, מתחת למספר הרשומות לעדכון.
    3. צרו משתנה שלישי בשם userMessage מסוג מחרוזת String, שיכיל בתוכו את המשפט הבא:
      "ברשימת התרומות קיימות לעדכון X תרומות על סך כולל של Y"
      כאשר במקום X ו-Y יופיעו הערכים הנכונים (השתמשו במשתנים שיצרתם ובשרשור מחרוזות על ידי האופרטור &. הדפיסו גם את המשפט בחלון הפלט.

    בהצלחה!

  • 1
  • 2
  • 3
  • 4
  • 5
  • 91
  • 92
  • 1 / 92
  • התחברות

  • אין לך חשבון עדיין? הרשמה

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