ביצוע שאילתות sql ב-vba. הפעל שאילתה מ-Access באמצעות שאילתת Excel ב-VBA. נתוני מקור לדוגמאות

05.07.2022

Access שמרה שאילתה שפותחה באמצעות בונה השאילתות myQuery. מסד הנתונים מחובר למערכת באמצעות חיבור ODBC. כל פקודות המאקרו כלולות.

Excel יוצר חיבור ADODB לחיבור למסד הנתונים באמצעותו

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .פתח את "MyDatabase.accdb" סוף עם

בדרך כלל אתה פשוט כותב את ה-SQL שלך, שעובד מצוין, ואז פשוט עושה משהו כמו

Dim sqlQuery As String sqlQuery = "SELECT * FROM myTable" הגדר rs = New ADODB.Recordset rs.Open sqlQuery, con, ...

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

כבר ניסיתי את זה

  1. con.Execute("EXEC myQuery"), אבל זה אמר לי שלא ניתן למצוא את myQuery.
  2. rs. פתח את "myQuery" אבל הוא לא חוקי ודורש ממנו הצהרות SELECT/etc

5 תשובות

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

אם נתחיל ממש לפני Dim sqlQuery As String

עמום cmd כחדש ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con הגדר rs = cmd.Execute()

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

כמעט היית שם

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .פתח את "z:\docs\MyDatabase.accdb" סוף עם con.Execute "MyQuery"

פשוט עזוב את המנהל.

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

הצלחתי להריץ שאילתת עדכון שכבר נשמרה ב-Access באמצעות:

חיבור. בצע את "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

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

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

SqlQuery = "SELECT * FROM QueryName;"

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

עבר הרבה זמן מאז שהנושא הזה נוצר. אם אני מבין נכון, אולי אוכל להוסיף משהו שימושי. נתתי שם למה שה-OP מתאר: זהו תהליך השימוש ב-SQL מתוך שאילתה המאוחסנת ב-ACCDB כדי להפעיל ב-VBA דרך DAO או ADOBD. קראתי לזה "ספק נכסי אובייקט", אפילו עם ראשי התיבות OPP בהערות שלי ועבור קידומת/סיומת שם האובייקט.

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

אפילו הלכתי עד כדי פיתוח שיטה לשימוש/הכנסת פרמטרים הניתנים להחלפה ב-SQL שמגיעה משאילתות OPP אלו. לאחר מכן אני משתמש ב-VBA.Replace() כדי להחליף לפני באמצעות SQLב-VBA.

נתיב האובייקט DAO לשאילתת SQL ב-ACCDB הוא כדלקמן:

MySqlStatement = Access.Application.CurrentDb.QueryDefs("myQueryName").SQL

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

SqlText = VBA.Replace(sqlText, "(ReplaceMe00000001)", "SomeActualParameter")

ולאחר מכן השתמש ב-sqlText ב-VBA. הנה דוגמה עובדת:

פונקציה ציבורית MySqlThing() Dim sqlText as String Dim myParamater as String Dim myExpression as String "הגדר הכל. sqlText = getSqlTextFromQuery("myQuery") myParameter = "(ReplaceMe00000001)" myExpression = "Some1217Orment" . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "לאחר מכן השתמש ב-SQL. db.Execute sqlText, dbFailOnError End Function Function getSqlTextFromQuery(ByVal oppName As String) As String Dim applikation db.Execute db.ApO As DAO.QueryDefs Dim qdef As DAO.QueryDef Dim sqlText As String Set app = Access.Application Set db = app.CurrentDb Set qdefs = db.QueryDefs Set qdef = qdefs(oppName) oppGetSqlText = qdef Fun.

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

הערה:מאקרו זה זמין רק בסביבת מסד נתונים של Access (MDB או ACCDB). אם אתה משתמש בסביבת Access Project (ADP), ראה פקודות מאקרו OpenView, OpenSavedProcedureו OpenFunction. פקודת מאקרו OpenRequestלא זמין באפליקציות אינטרנט של Access.

הגדרות

פקודת מאקרו OpenRequestיש את הטיעונים הבאים:

טיעון מאקרו

תיאור

שם בקשה

שם הבקשה לפתיחה. בחר שם מהרשימה הנפתחת. זה טיעון מתבקש.

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

התצוגה שבה תיפתח הבקשה. בחר בשדה נוףמַשְׁמָעוּת שולחן, בַּנַאִי, תצוגה מקדימה , טבלת ציראוֹ תרשים ציר. ברירת המחדל היא שולחן.

הערה:התצוגות PivotTable ו- PivotChart אינן זמינות בגרסאות Access החל מ-Access 2013.

מצב נתונים

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

הערות

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

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

עצה

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

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

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

כדי להפעיל מאקרו OpenRequestבמודול ויז'ואל בייסיקעבור יישומים (VBA), השתמש בשיטה OpenRequestלְהִתְנַגֵד DoCmd.

שיעור זה מוקדש ל שאילתות SQLלמסד הנתונים על גישה ל-VBA. נבחן כיצד מתבצעות שאילתות INSERT, UPDATE, DELETE למסד הנתונים ב-VBA, וכן נלמד כיצד לקבל ערך ספציפי משאילתת SELECT.

אלה שמתכנתים ב גישה ל-VBAתוך כדי עבודה עם מסד הנתונים שרת SQL, לעתים קרובות הם מתמודדים עם משימה כה פשוטה והכרחית כמו שליחת שאילתת SQL למסד נתונים, בין אם זה INSERT, UPDATE או שאילתת SQL SELECT פשוטה. ומכיוון שאנחנו מתכנתים מתחילים, אנחנו אמורים גם להיות מסוגלים לעשות את זה, אז היום נעשה בדיוק את זה.

כבר נגענו בנושא השגת נתונים משרת SQL, שם כתבנו קוד ב-VBA להשגת נתונים אלו, למשל, במאמר על העלאת נתונים לקובץ טקסט מ-MSSql 2008, או נגענו בו גם ב- מעט בחומר העלאת נתונים מ-Access לתבנית Word ו-Excel אבל כך או אחרת, הסתכלנו על זה בצורה שטחית, והיום אני מציע לדבר על זה קצת יותר בפירוט.

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

נתוני מקור לדוגמאות

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

צור טבלה .( לא NULL, (50) NULL) בתנועה

כפי שכבר אמרתי, נשתמש בפרויקט ADP המוגדר לעבוד עם MS SQL 2008, בו יצרתי טופס בדיקה והוספתי כפתור התחלה עם חתימה "לָרוּץ", שנצטרך לבדוק את הקוד שלנו, כלומר. נכתוב את כל הקוד במטפל האירוע " לחיצה על הכפתור».

שאילתות למסד הנתונים INSERT, UPDATE, DELETE ב-VBA

כדי לא להתעכב יותר מדי, בואו נתחיל מיד, נניח שצריך להוסיף שורה לטבלת הבדיקות שלנו ( קוד הגיב)/

Private Sub start_Click() "הכרז על משתנה לאחסון מחרוזת השאילתה Dim sql_query As String "כתוב את השאילתה שאנחנו צריכים לתוכה sql_query = "INSERT INTO test_table (id, name_mon) VALUES ("6", "יוני")" "ביצוע it DoCmd RunSQL sql_query End Sub

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

כפי שאתה יכול לראות, הנתונים הוכנסו.

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

Private Sub start_Click() "הכרז על משתנה לאחסון מחרוזת השאילתה Dim sql_query As String "כתוב לתוכו שאילתת מחיקה sql_query = "DELETE test_table WHERE id = 6" "הפעל אותו DoCmd.RunSQL sql_query End Sub

אם נבדוק, נראה שהשורה הרצויה נמחקה.

כדי לעדכן את הנתונים, כתוב את בקשת העדכון למשתנה sql_query, אני מקווה שהמשמעות ברורה.

שאילתת SELECT למסד נתונים ב-VBA

כאן הדברים קצת יותר מעניינים מאשר עם מבני SQL אחרים.

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

Private Sub start_Click() "הכרז על משתנים "עבור קבוצת רשומות ממסד הנתונים Dim RS As ADODB.Recordset "Query string Dim sql_query As String "מחרוזת להצגת נתוני סיכום בהודעה Dim str As String "צור אובייקט חדש לרשומות set RS = New ADODB .Recordset "Query line sql_query = "SELECT id, name_mon FROM test_table" "הפעל את השאילתה באמצעות הגדרות החיבור הנוכחיות של הפרויקט RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "לולאה דרך הרשומות בעוד לא ( RS.EOF) "מלא את המשתנה כדי להציג את ההודעה str = str & RS.Fields("id") & "-" & RS.Fields("name_mon") & vbnewline "עבור לרשומה הבאה RS.MoveNext Wend " פלט את ההודעה msgbox str End Sub

כאן אנחנו כבר משתמשים בלולאות VBA Access כדי לחזור על כל הערכים בערכת הרשומות שלנו.

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

Private Sub start_Click() "הכרז על משתנים" עבור קבוצת רשומות ממסד הנתונים Dim RS As ADODB.Recordset "Query string Dim sql_query As String "מחרוזת להצגת הערך הסופי Dim str As String "צור אובייקט חדש עבור ערכת רשומות RS = New ADODB.Recordset "Query line sql_query = "SELECT name_mon FROM test_table WHERE id = 5" "הפעל את השאילתה באמצעות הגדרות החיבור הנוכחיות של הפרויקט RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "קבל את הערך שלנו str = RS. Fields(0) msgbox str End Sub

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

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

זה הכל להיום. בהצלחה!

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

יש לי כמה טפסים (טופס תרשים) המבוססים על שאילתות שאני מריץ פרמטרים די קבועים נגדן, רק משנה את מסגרת הזמן (כמו 10 מכירות מובילות בחודש). אז יש לי נהלים שמעבירים אליו אוטומטית את אובייקט התרשים מצגות PowerPoint. אז יש לי את כל השאילתות האלה שנבנו מראש (כמו 63), ודיאגרמת טופס שתתאים (כן... 63... אני יודע שזה רע), ואז כל הדברים האלה נוצרים ב"פתיחה/סגור" " אירוע המוביל לאירוע הבא (זה כמו הניסיון הכי טוב שלי להיות פריצה.... או דומינו; מה שאתה מעדיף).

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

אז חוץ מהשאלה ששאלתי למעלה, מי יכול לתת עצות? תודה

6 תשובות

10

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

Dim dbs As Database Dim rs As Recordset Dim strSQL As String Set dbs = CurrentDb strSQL = "השאילתה שלך כאן הגדר rs = dbs.OpenRecordset(strSQL) אם לא (rs.EOF ו-rs.BOF) אז rs.MoveFirst "קבל תוצאות באמצעות rs.Fields() אחרת "השתמש בתוצאות

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

Rs.MoveFirst Do While Not rs.EOF "עשה משהו כמו rs("SomeFieldName") rs.MoveNext Loop

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

השתמש ב-QueryDef עם פרמטר וקרא לו מ-VBA.
השאילתה קלה יותר לעיצוב...ניתנת לבדיקה בקלות..ונגישה בקלות באמצעות VBA או טופס.

עמום qd כמו querydef set qd = currentdb.querydefs!myquerydef qd.parameters!parm1=val1

או qd.execute

עמום rs כמו ערכת רשומות rs = qd.openrecordset()

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

אז קבע או בנה מחרוזת להצהרת ה-SQL שלך, והכנס את הניקוי שלך, NON SQL INJECT את המחרוזת כארגומנט :)

StrSQL = "SELECT * FROM Customer WHERE ID = " & EnsureParamIsNotSQLInjection(customerID)

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

המפתח כאן הוא שכל הפונקציות הללו יחיו במקום אחד וישתמשו בהן בכל מקום. הנה דוגמה ב-VBScript.

Sub DoStuff(strSQL) Set adoCon = Server.CreateObject("ADODB.Connection") strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db\Database.mdb") "strConnString = "DRIVER=(מנהל התקן של Microsoft Access (*.mdb)); DBQ=" & Server.MapPath("db\Database.mdb") adoCon.Open strConnString Set rsMain = Server.CreateObject("ADODB.Recordset") rsMain.Open strSQL, adoCon Do While NOT rsMain.EOF customerName = rsMain(" CustomerName") "דוגמה טיפשית RsMain.MoveNext Loop rsMain.Close הגדר adoCon = Nothing End Sub

דרך נוספת לעשות זאת, שנראה שאף אחד לא הזכיר, היא לשייך את הגרף שלך ל-QueryDef שנשמר בודד, ולאחר מכן בזמן ריצה, להחליף את ה-QueryDef. כעת, אני לא ממליץ לשנות QueryDefs שמורים עבור רוב ההקשרים מכיוון שזה גורם לנפיחות חזיתית ובדרך כלל אפילו לא הכרחי (ברוב ההקשרים שבהם אתה משתמש ב-QueryDefs שמורים ניתן לסנן בצורה כזו או אחרת בהקשר שבו הם השתמשו, עבור לדוגמה, כאחד מטפסי RecordSource, אתה פשוט מעביר ארגומנט אחד ל-DoCmd.OpenForm).

הגרפים שונים מכיוון שלא ניתן לשנות גרפי SQL בזמן ריצה.

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

פרמטרים!! ארוך;

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

מצב אחד שבו עליך לשכתב את QueryDef עבור גרף הוא אם אתה רוצה לאפשר למשתמש לבחור N במשפט TOP N SQL. במילים אחרות, אם אתה רוצה להיות מסוגל לבחור TOP 5 או TOP 10 או TOP 20, תצטרך לשנות את ה-QueryDef השמור מכיוון שלא ניתן להגדיר את N.

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

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

    אם זה מופר, ההשפעות הבאות אפשריות:

  • מספר כמו 10.5 עם פסיק במקום נקודה ייתפס כרשימה של שני מספרים 10 ו-5, מה שיוביל לאיזשהו אי התאמה במספר השדות,
  • מחרוזת כמו ואסיה ללא מרכאות ואפוסטרופים תיתפס כשם של שדה, אם קיים שדה כזה, או כשם של פרמטר שיתבקש מיד,
  • תאריך כמו 1/2/2010 או 1/2/2010 ללא סימני גיבוב יטופל כביטוי אריתמטי (עם חלוקה וחיסור, בהתאמה),
  • תאריך כמו 1.2.2010 יתפרש כמספר שבר עם שני נקודות עשרוניות ויגרום לשגיאה,
  • תאריך עם סימני גיבוב, אך לא בפורמט האמריקאי, ייתפס כתאריך, אך שונה (היום והחודש יסודרו מחדש).

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

    1. שימוש במספרים

    SELECT * FROM Table WHERE (((טבלה .כמות)= 12 .197 ));
    VBA v1

    Dim q As Single q = 12 .197 strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)=" & q & "));"
    VBA v2

    Dim q As String q = "12,197" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)=" & Str (q) & "));"
    הערה:

  • VBA v1- עבור מספרים שלמים. עבור מספרים שברים זהו מקרה מיוחד, רק כאשר מפריד המערכת הוא נקודה.
  • VBA v2- אפשרות נכונה יותר, כי בתכנות קלאסי, ניתן לשרשר רק מחרוזות עם מחרוזות, בעוד VBA v1 משתמש בהמרת סוג מרומז, למרות שלא היו תלונות על שיטה זו עבור מספרים שלמים. (הדוגמה ניתנת כאשר מפריד המערכת הוא פסיק.)
  • לפעמים הפונקציה CStr() משמשת גם להמרה, אבל היא לא תמיד ישימה, כי מחזיר מספר כמחרוזת, כאשר הוא נכתב דרך מפריד המערכת, ואילו SQL מקבל רק נקודה כמפריד.
  • NB!בעת שימוש במפרידי מערכת לא טיפוסיים, ייתכן שהדוגמאות לעיל לא יעבדו במקרים אלה, עליך להחליף את מפריד המערכת בנקודה. להלן פונקציה שמחזירה את מפריד המערכת.
    הפונקציה GetDecimalSeparator() כמחרוזת GetDecimalSeparator = Format ( 0 #, "." ) End Function שים לב גם שחלק מפעולות Access סטנדרטיות עשויות שלא לעבוד במקרה זה.

    2. שימוש בחוטים

    SELECT * FROM Table WHERE (((Table .Name)="All" ));
    VBA v1

    Dim q As String q = "הכל" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)=" "" & DoubleQuote(q) & "" "));"
    VBA v2

    Dim q As String q = "הכל" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)="" & DoubleApostrophe(q) & "" ));"
    הערה:

  • VBA v1: DoubleQuote() - פונקציה שמכפילה ציטוטים.

    דוגמא:
    מצב דגימה:
    a"a"s SQL:
    WHERE field=" a""a"s"VBA:
    strWhere = " WHERE field=""" & "a""""a"s" & """ "

  • VBA v2:: DoubleApostrophe() - פונקציה שמכפילה אפוסתרופים.

    דוגמא:
    מצב דגימה:
    a"a"s SQL:
    WHERE field=" a"a""s"VBA:
    strWhere = " WHERE field="" & "a""a""s" & "" "

  • הפונקציות DoubleQuote ו-DoubleApostrophe שהוזכרו לעיל אינן פונקציות Access מובנות, אלא פונקציות מוגדרות על ידי משתמש, שהיישום שלהן נתון לשיקול דעתו של המתכנת. בפרט, ב-Access גרסאות 2000 ומעלה תוכלו להשתמש בפונקציית Replace המובנית למטרה זו, וב-97 ומטה תוכלו להשתמש בפונקציה זו:

    Public Function Replace97(StrMain As String , StrFind As String , StrZam As String ) As String On Error GoTo err Dim pos As Long If StrFind = "" Then GoTo err If StrMain = "" Then Replace97 = StrZam: Exit Function Do Until InStr( 1 , StrMain, StrFind) = 0 pos = InStr( 1 , StrMain, StrFind) StrMain = mid (StrMain, 1 ,פוזי- 1 ) & StrZam & mid (StrMain, pos + Len(StrFind), Len(StrMain)) Loop Replace97 = StrMain Exit Function Err: Replace97 = StrMain End Function
    3. שימוש בתאריכים

    SELECT * FROM Table WHERE (((Table .TimeOpen)=# 3 /31 /2003 11 :17 :19 #));
    VBA

    עמום q כתאריך q = עכשיו strSQL = "בחר * " _ & "מטבלה " _ & "WHERE (((Table.TimeOpen)=#" & פורמט (ש, "mm\/dd\/yy hh\:mm \:ss") & "#));"
    הערה:

  • Microsoft JET SQL פועלת עם תאריכים בפורמט אמריקאי, כלומר. בדיוק בטופס שלעיל חודש/יום/שנה.
  • אל תשמיט את התווים # (זה מקיף את כל קבוע תאריך/שעה) ו-\ (זה מונע את החלפת ה-/ ו-: בהגדרות מקומיות, וזה מה שפונקציית Format נוטה לעשות ומונעת פעולה תקינהפקודות SQL).
  • מומלץ לקרוא כאן: על דרכים לאחסון תאריך/שעה.
  • NB!אין להשתמש בהמרת תאריך למספר שלם (או ארוך), כי ב-Access וב-SQL Server, מספרים שונים תואמים לאותו תאריך ובהשוואה, אתה יכול לקבל תוצאה בלתי צפויה.

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