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

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

נבחר להציג את השדות הבאים:

הממ... עדיין חסר לי את שדה שם התורם.
אני יכול להציג את שם המשפחה ואת השם הפרטי בנפרד, אבל אני רוצה כמובן להציג את שם התורם המלא.
לא בעיה!
אני יכול ליצור שדה מחושב FullName שמחבר את השם הפרטי ושם המשפחה של התורם.
אבל רגע, זה נשמע לי מוכר...
יש לי כבר שאילתה שעושה זאת: qryDonor_FullName.
במקום ליצור שוב שדה מחושב, בואו ונשתמש בה.
למה?
עיקרון ה-DRY
לפני כעשרים שנה, פירסמו שני מתכנתים אמריקאים את העיקרון הבא בתכנון מערכות:
Don't Repeat Yourself (אל תחזור על עצמך) או בקיצור DRY. הנוסח הרשמי לעיקרון זה הוא:
לכל פיסת ידע צריך להיות ייצוג יחיד, חד משמעי וסמכותי במערכת.
במילים פשוטות, זה אומר שלא נשכפל שום חלק במערכת אלא אם כן הדבר הכרחי.
עקרון זה נועד כדי להפחית כפילויות מיוצרות במערכת, ועל ידי כך ליצור מערכת קלה לתחזוקה, כי שינוי של גורם יחיד במערכת לא יאלץ שינויים נוספים בגורמים אחרים שאינם קשורים אליו לוגית.
ניקח לדוגמא את המקרה שלנו:
כרגע, שם התורם המלא מוצג לפי הסדר הבא: שם משפחה + רווח + שם התורם. נניח שבעוד שנה ירצה בעל הבית להציג את שמות התורמים המלאים בסדר הפוך, דהיינו במקום כהן אברהם – אברהם כהן וכו'.
אם הרכבת השם המלא של התורם מבוצעת רק במקום יחיד במערכת, דהיינו בשאילתה הנ"ל, כל שעלינו לעשות הוא לשנות את הגדרת השדה המחושב שם – והשינוי ישתקף בכל מקום במערכת.
אבל, אם בכל פעם יצרנו שוב את השדה המחושב מחדש – זה הופך לעבודת נמלים מייגעת...
אז יופי, בואו ונוסיף גם את השאילתה למשטח העבודה, והופ – נראה שהפעם אקסס לא הייתה כל כך מבריקה, והחליטה לצרף את השדה ID מטבלת התרומות לשדה ID בשאילתה, כפי שמוצג בדרמטיות בתמונה הבאה:

מדוע זה קרה?
אקסס זיהתה את שם השדה ID הזהה בשתי מקורות הנתונים, והחליטה "לעזור לנו" על ידי יצירת הצירוף עבורנו. אבל זה כמובן לא נכון!
אם היינו קוראים לשדה המפתח בכל טבלה בשם מלא, כפי שנהגנו במפתח הזר, למשל DonationID במקום ID בטבלת התרומות, או DonorID במקום ID בטבלת התורמים וכו', המנגנון של אקסס אכן היה עוזר לנו.
זו אכן סכמה נפוצה, ובאמת בתחילת דרכי כך נהגתי, אבל היא פחות מקובלת, ובקוד היא נעשית מסורבלת עוד יותר, כי ניגשים לשדה המזהה כך: Donor.DonorID במקום כך: Donor.ID.
לכן אני מעדיף לוותר על העזרה של אקסס כאן, וליצור ידנית את הצירוף, תמורת הרווח של קוד ושאילתות יותר קריאים.
בואו נתקן את הצירוף:
נבחר את החץ ונמחק אותו על ידי הקשה על מקש Delete, ובמקום, נגרור את שדה ID מטבלת התורמים לשדה ID בשאילתת השם המלא, כך:

כעת נוסיף גם את השדה FullName לחגיגה:

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

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

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

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

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

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

נעצב את הדוח כיד הדמיון הטובה עלינו:

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

כדי לראות את התוצאה:

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

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