התוכן כאן עשוי לחול על Northwind 2.0 Developer Edition ועל Starter Edition.
VBA (Visual Basic for Applications) הוא שפת התיכנות המשמשת בכל מוצרי Office. למידה VBA מאפשרת לך לעבוד עם כל מוצרי Office (לא רק עם Access).
בעת חיפוש אחר "כיצד לבצע", הקפד לחפש דוגמאות ספציפיות של Access ולכלול את Microsoft Access בחיפוש. לעתים קרובות פתרונות עבור מוצרי Office האחרים יפעלו - אך אין ערובה לכך. Microsoft Access הוא מוצר למבוגרים; כלומר, קיימות דוגמאות רבות; וזה נהדר עבורך!כמו כן, פירוש הדבר שספרים ישנים יותר בתיכנות של Access עדיין ניתנים לעיון. רבים מהספרים הקודמים עדיין זמינים באתרים של ספרים בשימוש בשברים מהעלות המקורית שלהם. עיין באתר האינטרנט של Microsoft כדי לקבוע אילו גירסאות של Access עדיין נתמכות ולבצע אותן.
משאבי סיום התמיכה עבור Office - פריסת Office | Microsoft Learn
להלן כמה קישורים לתיעוד של Access ב- Microsoft.
קבצי Microsoft Access הם קבצי Office. קבצי Office חייבים להיות ב"מיקום מהימן" או "התוכן שלהם זמין". פריטים אלה נחשבים ל"בטוחים" מכיוון שיצרת אותם, או שהם מגיעים ממקור מהימן. בדוק אם קיימים מיקומים מהימנים בכל פעם שאתה פותח כל קובץ Office. מכאן נתייחס אליה כמהימנה/זמינה. הערה: אם גירסה חדשה של היישום מופצת ופתוחה ממיקום שאינו מהימן, תהליך הפיכת התוכן לזמין חוזר על עצמו.
קבל מידע נוסף על מיקומים מהימנים.:
פקודות מאקרו, פונקציות והמשנה הן האופן שבו אתה מיישם לוגיקה עסקית במסד הנתונים של Access. חשוב שתבין את היקף וניראות לפני שתתחיל.
אירועים (כגון לחיצה על פקד) בפקדים בטופס (לדוגמה, לחצנים, תיבות טקסט, תוויות וכדומה) מפעילים תהליכים אחרים, כגון הוספה, מחיקה של רשומות או פתיחת טפסים. ניתן ליישם תהליכים אלה באמצעות פקודות מאקרו או VBA. Northwind Starter Edition משתמש בעיקר בפקודות מאקרו, וב- VBA מסוימות שבהן פקודות מאקרו אינן יכולות לבצע את הפונקציות הדרושות. Northwind Developer Edition משתמש בעיקר ב- VBA.
סוגי פקדים מסוימים כוללים אשפים מוכללים כדי ליצור מאקרו באופן אוטומטי. לדוגמה, הוספת לחצן פקודה לטופס פותחת אשף המציע כמה אפשרויות של פונקציונליות עבור הלחצן. הוספת תיבה משולבת פותחת אשף שניתן לקבוע את תצורתו לחיפוש רשומה מסוימת בטופס.
חלונית הניווט היא הדרך העיקרית שבה אתה מציג את כל אובייקטי מסד הנתונים שלך ולגשת אליהם, והיא מוצגת בצד הימני של חלון Access כברירת מחדל.
חלונית הניווט של Northwind הותאמו אישית. יצרנו קטגוריה מותאמת אישית שנקראת Northwind Starter 2.0. הדבר מאפשר לנו לארגן את האובייקטים לפי אזור פונקציונלי.חשוב ללמוד אודות טווח וניראות בתוך Access/Office. באפשרותך להתחיל כאן:
לפעמים אתה זקוק למשתנה כדי להתקיים לאחר האובייקט שיצר אותו יוצא מחוץ לטווח. ראה טווח וניראות לעיל. קיימות שלוש דרכים עיקריות לעשות זאת: משתנים ציבוריים, משתנים זמניים ואחסון הערכים בטבלה מקומית. מפתחים רבים משתמשים בשילוב של אלה. לכל אחד מהם יש יתרונות וחסרונות. מידע נוסף על כל אחד מהם כאן:
משתנה ציבורי של מודול VBA:
Vars זמניים:
אחסון הערכים בטבלה המקומית
-
משתנים ציבוריים ומשתנים זמניים קיימים עבור ההפעלה הנוכחית ו יוצאים מחוץ לטווח כאשר היישום נסגר. אך מה אם ברצונך לשמור משתנים ספציפיים למשתמש בין הפעלות? באפשרותך לאחסן ערכים מסוג זה בטבלה מקומית. ב- Northwind 2.0 משתנה כזה נשמר בטבלה שנקראת SystemSettings. הערך בטבלה הוא ShowWelcome. ערך זה מורה ל- Access אם ברצונך לראות את מסך הפתיחה בכל פעם שאתה נכנס או לא.
מפתחים צריכים לעתים קרובות להעביר פרמטרים מצורה אחת לאחרת, או מתוך טופס לדוח. פרמטרים אלה מעבירים מידע חשוב, שבו הפונקציה שנקראה תשתמש כדי לקבוע את תצורתה. יש כמה דרכים שבהן הטופס או הדוח השני יכול לקבל מידע מהצורה הראשונה. להלן כמה דרכים אלה:
-
הטופס השני יכול "להביט לאחור" לטופס הראשון כדי לאסוף ערכים מסוימים, כנראה בפקד גלוי או בלתי נראה. לדוגמה: lngCustomerID = Forms!FirstForm!cboCustomerID
-
הטופס הראשון יכול לשמור ערכים במשתנים כלליים או במשתנים זמניים. לדוגמה: g_lngUserID = Me.cboUserID TempVars.Add "UserID", Me.cboUserID
השיטה שבה נעשה שימוש לעתים קרובות ב- Northwind Developer Edition וכן בחיינו המקצועיים משתמשת בארגומנט OpenArgs של DoCmd.OpenForm או OpenReport. לדוגמה: DoCmd.OpenForm "frmCompanyDetail", OpenArgs:=StringFormat("CompanyID={0} &CompanyTypeID={1}", Me.VendorID, ctVendor)
אנו משלבים שתי טכניקות כאן: (1) השימוש ב- OpenArgs כדי להעביר ב- VendorID ו- VendorType, ו- (2) השימוש בפונקציה StringFormat() כדי ליצור, לדוגמה, מחרוזת זו:
CompanyID=5&CompanyTypeID=2
מחרוזת זו דומה מאוד למחרוזת שאילתה כפי שנעשה בה שימוש בדפדפן. היא מכילה זוג אחד או יותר של "שם/ערך" המופרדים באמצעות תו אמפרסנד:
name1=value1&name2=value2
היתרון של מחרוזת כזו הוא של כל ערך יש שם. השווה זאת לגישה פשוטה יותר שבה היית מגדיר את OpenArgs ל- "5,2" בלבד. במקרה כזה, היה צריך מאמץ לגלות מה כל ערך מציין. מתן שמות לכל ערך הופך את מחרוזת השאילתה ל"תיאור עצמי", שהיא תרגול תיכנות טוב.
בקצה המקבל של DoCmd.OpenForm אנו נמצאים בדרך כלל באירוע Form_Open או Form_Load וברצונך לנתח את המחרוזת OpenArgs לרכיבים שלה.
ב- Northwind, ניתן לעשות זאת באמצעות הפונקציה StringToDictionary . היא מקבלת פונקציה ה כמו מחרוזת שאילתה ומנתחת אותה לרכיבים שלה. לאחר מכן, רכיבים אלה מאוחסנים באובייקט Scripting.Dictionary . שים לב כי פעולה זו דורשת ממך להשתמש ב'כלים >' ולהגדיר הפניה ל- Microsoft Scripting Runtime (scrrun.dll).
התכונות והיתרונות של האובייקט Dictionary כוללים:
-
סדר הרכיבים אינו חשוב
-
פונקציות פשוטות להוספה והסרה של רכיבי האוסף
-
פונקציות לאיסוף בלולאה באוסף, כך שתוכל לדעת מה נמצא בו
-
פונקציה Exists כדי שתוכל לבדוק אם רכיב מסוים זמין
השימוש באובייקט המילון מופיע לאורך Northwind. לדוגמה, האירוע Form_LoadfrmGenericDialog.
פקודות מאקרו שנוצרו באמצעות אשפי בקרה ב- Access כוללות לעתים רחוקות טיפול בשגיאות; VBA שנוצר באמצעות אשפי בקרה עשוי להיות מוגבל ל- MsgBox Err.Description כללי.
ב- Northwind 2.0 אנו מראים לך כיצד לעשות זאת טוב יותר בעת שימוש בקוד VBA. יישמנו את מה שנקרא מטפל בשגיאות כללי. שגיאות להתרחשות בכל הליך קוראות לפונקציה ברמה הכללית כדי להציג את השגיאה. היתרון הגדול כאן הוא שטיפול בשגיאות הוא עקבי. ואם ההודעה צריכה להשתנות (לדוגמה, כדי להציג בנוסף את מספר השגיאה או כדי לרשום את השגיאה בקובץ), יש לבצע אותה במקום אחד בלבד.
clsErrorHandler הוא מודול המחלקה המיישם את קוד טיפול בשגיאות. מודול מחלקה שומר את כל הפונקציות העיקריות והעזרות שלו יחד ביחידה אחת, ובכך כוסת את הקוד.
המאקרו AutoExec קורא לפונקציה Startup ב - modStartup. In Starter Edition, the function creates an instance of clsErrorHandler and saves it as a global variable that is available for use throughout the application. In Dev edition a static class is used – see the comments at the top of the class module.
למעשה, קוד טיפול בשגיאות בהליכים הוא עקבי כל כך שהצלחנו ליצור את כל השגיאות תוך פחות מחמש דקות באמצעות קוד VBA ספציפי שהתקין כל הליך עם המטפל הנכון בשגיאות. (הקוד אינו כלול בתבנית). הן מהדורות התבניות של Northwind 2.0 Starter והן מהדורת המפתחים הותרגו בתחילה עם גישה זו לטיפול בשגיאות.
'טיפול משופר בשגיאות
החל מגירסה 2.2 של Northwind Developer Edition, המטפל בשגיאות שופר, הודות למשוב מהקהילה של Access. מהדורת Starter אינה משתנה.
למעשה, המטפל בשגיאות בגירסה הקודמת (2.0 - פורסם באפריל 2023) הוא:
Public Sub HandleError(…) MsgBox Err.DescriptionEnd Sub
בגירסה 2.2 הוא משודרג ל:
Public Sub HandleError (…, Optional ByVal IsEventProcedure As Boolean = False) If Not IsEventProcedure Then Err.Raise lngError, strErrSource End If MsgBox Err.DescriptionEnd Sub
כדי להבין מדוע שינוי זה בוצע, תחילה נבין מה גורם להפעלת הקוד:
-
המאקרו AutoExec קורא לפרוצדורת ההפעלה, שמבצעת כמה אתחולים לפני פתיחת הטופס הראשון.
-
המשתמש מקיים אינטראקציה עם היישום, כגון פתיחת טופס או לחיצה על לחצן, וגורם לפעולת פרוצדורות אירוע כגון Form_Load ו - cmdPrintInvoice_Click.
'
בנוסף פרוצדורות אירוע, ליישומים יש הליכי משנה ופונקציות - בעיקר במודולים - וקוד זה נקרא מתוך פרוצדורות האירוע. הליכים אלה נקראים "הליכים רגילים".
בגירסה 2.0 של Northwind, ההליכים הסטנדרטיים מטפלים בשגיאות משלהם בהודעות, אך הם לא יתוודע באופן כלשהו לפרוצדורת אירוע השיחות שאירעה שגיאה. מצב זה עשוי להיות שגוי אם פרוצדורת האירוע כוללת את הקוד הבא שאמור לפעול ללא קשר לשגיאה הקודמת שטופעה על-ידי הפרוצדורה שנקראה. בטח, נוכל להחליף את Routine בפונקציה המחזירה הצלחה או כישלון, ולקוד בהתאם לפרוצדורת האירוע, אך זו לא תמיד אפשרות.
בגירסה 2.2 של Northwind, ההליכים הסטנדרטיים אינם מטפלים בהודעות שגיאה, אלא, באמצעות Err.Raise, מדווחים עליהם בחזרה לפרוצדורת אירוע השיחות. לאחר מכן, פרוצדורת האירוע של השיחות תציג את השגיאה המועלה ותחדש את פעולתה Exit_Handler. זה טוב יותר, מכיוון שהוא מאפשר לנוהל השיחות להסיק בצורה מבוקרת.
כדי להשתמש בקוד של Northwind בגירסה 2.2, פרוצדורות אירוע חייבות לעבור ל- HandleError ארגומנט שלישי המציין שהשיחה היא פרוצדורת אירוע. Northwind Dev Edition עודכן כדי לעשות זאת.
למודול 'מטפל בשגיאות' רב-עוצמה יותר תהיה תמיכה בהליכים "דוחפים ופותר" ב"ערימה" (מערך). הרכיב הראשון יהיה תמיד פרוצדורת האירוע, ולכן אין צורך בארגומנט הנוסף. יישום זה חורך מהיעדים של Northwind Dev Edition.
MRU, או 'היו בשימוש לאחרונה ' היא רשימה של הזמנות והזמנות רכש שהיו בשימוש לאחרונה. מומלץ לחזור לפריטים אלה לעתים קרובות כדי להציב אותם במצב הבא. רשימות MRU מוצגות לעתים קרובות במוצרי Office כרשימה של קבצים שהיו בשימוש לאחרונה, שייתכן שתרצה לפתוח מחדש.
במהדורה של Northwind Dev, כדי ליישם את התכונה MRU (שאינה קיימת במהדורה Starter), עליך ליצור תחילה את הפריטים הבאים:
-
טבלה לאחסון מידע MRU.
-
קוד לעדכון הטבלה בעת פתיחת הזמנה או הזמנת רכש (PO).
-
קוד לעדכון הרשימה הנפתחת של MRU ברצועת הכלים.
-
קוד לטעינת הפריט כאשר פריט MRU נבחר מרצועת הכלים.
הבה נבחן כל אחד מהם ביתר פירוט.
1. טבלה לאחסון מידע MRU.
כדאי לסקור את העיצוב של טבלה MRU, במיוחד את האינדקסים שלה. שים לב שקיים SortIdx של אינדקס כפול כדי לסייע במיון מהיר של פריטי MRU ברשימה הנפתחת של רצועת הכלים, וכן אינדקס ייחודי לאכיפת הכלל העסקי שעבור כל משתמש פריט יכול להתרחש פעם אחת בלבד. לדוגמה, פתיחה כפולה של אותו סדר אינה יוצרת שתי רשומות בטבלת MRU.
הטבלה מנצלת את העובדה שכל שדות PK (מפתח ראשי) הקשורים ל- MRU במסד הנתונים הם 'מספור אוטומטי', כך שניתן להשתמש בסוג הנתונים 'מספר שלם ארוך' עבור PKValue.
2. קוד כדי לעדכן את הטבלה בעת פתיחת הזמנה או P.O.
ב- NW2 בחרנו להוסיף לרשימת ה- MRU רק בעת יצירת רשומה חדשה, לא כאשר רשומה קיימת עודכנה שוב. בהחלט נוכל להעביר את שיחת AddToMRU Form_AfterInsert ל- Form_AfterUpdate כדי לתמוך באפשרות זו.
ההליכים AddToMRU ו- DeleteFromMRU מיושמים ב- modGlobal, שהוא מודול רגיל שההליכים הציבוריים שלו גלויים מכל טופס.
AddToMRU (כפי שמציע השם) מוסיף את הפריט החדש לטבלת ה- MRU, ולאחר מכן באופן אופציונלי חתוך אותו בחזרה, מוחק את הרשומה הישנה ביותר, אם הוא גדל מעבר לגודל המרבי (MAX_MRU_COUNT). השלב האחרון הוא ככל הנראה הכי פחות ידוע למפתחי Access: יש לרענן את הרשימה הנפתחת של רצועת הכלים, והתהליך מושג על-ידי קריאה ל- InvalidateControl. זהו אות לרצועת הכלים להפעלה מחדש של תהליך האתחול שלו.
3. הרשימה הנפתחת 'קוד לעדכון MRU' ברצועת הכלים.
בזמן ההפעלה, ולאחר קריאה ל- InvalidateControl , מתבצעת ערכה מורכבת של פונקציות כדי לאכלס את רצועת הכלים. הליכים אלה נקראים על-ידי ה- XML של רצועת הכלים בטבלה uSysRibbons המציינת בחלקו:
<group id="gCurrentStatus" label="MRU">
<box id="bxMRU" boxStyle="vertical">
<dropDown id="ddMRU"
getItemCount="ddMRU_GetItemCount"
getItemLabel="ddMRU_GetItemLabel"
getSelectedItemIndex="ddMRU_GetSelectedItemIndex"
getItemID="ddMRU_GetItemID"
onAction="ddMRU_OnAction"
screentip="Most Recently Used Objects">
</dropDown>
</box>
</group>
ארבע פונקציות התקשרות חזרה אלה מאכלסות את הרשימה הנפתחת. שים לב ש רעיון זה זהה מאוד למתואר כאן עבור תיבות משולבות רגילות.
אם אתה מבטל את התדפיס של שורות debug.Print ב- modRibbonCallback והפעל מחדש את היישום, החלון המיידי יציג רצף כזה:
ddMRU_GetItemCount ddMRU 6
ddMRU_GetItemLabel ddMRU 0 Order 60, Proseware, Inc.
ddMRU_GetItemID ddMRU 0 2
ddMRU_GetItemLabel ddMRU 1 Order 62, Best For You Organics Company
ddMRU_GetItemID ddMRU 1 4
ddMRU_GetItemLabel ddMRU 2 Order 63, Wide World Importers
ddMRU_GetItemID ddMRU 2 5
ddMRU_GetItemLabel ddMRU 3 Order 66, Proseware, Inc.
ddMRU_GetItemID ddMRU 3 8
ddMRU_GetItemLabel ddMRU 4 Order 67, Best For You Organics Company
ddMRU_GetItemID ddMRU 4 9
ddMRU_GetItemLabel ddMRU 5 Order 68, Adatum Corporation
ddMRU_GetItemID ddMRU 5 10
ddMRU_GetSelectedItemIndex ddMRU 0
כאן ניתן לראות ש- Access קורא תחילה לפרוצדורה שמחזירה את מספר הפריטים שיש לטעון בארגומנט ByRef של ddMRU_GetItemCount. זהו גם הזמן שבו אנו פותחים את השאילתה בטבלת MRU ומטמון אותה מכיוון שהיא עומדה להיות בשימוש כמה פעמים.
רצועת הכלים מבצעת קריאה חוזרת לשני הליכים כדי לקבל את הערכים 'מזהה' ו'תווית' עבור הרשימה הנפתחת של שתי עמודות.
לבסוף, הוא קורא לפרוצדורה כדי לבטל את הפריט שיש לבחור. (במקרה שלנו, זהו הראשון.)
4. קוד לטעינת פריט כאשר הפריט MRU נבחר מרצועת הכלים.
בדומה לכל פריט אחר ברצועת הכלים, המאפיין OnAction ב- XML של רצועת הכלים מציין פונקציית התקשרות חזרה שישמש לביצוע הפעולה:
onAction="ddMRU_OnAction"
הליך זה מיושם ב - modRibbonCallback. היא משתמשת מחדש בערכת הרשומות הפתוחה כבר כדי למצוא את הרשומה עם הפריט שנבחר, ולאחר מכן, בהתאם ל- TableName נדרש, פותחת את הטופס המתאים, מעבירה את ערך ה- PK שיש להיטען.
-
Northwind 2.0 Developer Edition: Template-Tutorial
-
Northwind 2.0 Developer Edition: All topics