שימוש במשפט SQL כמשתנה בקוד, ושאלות על טפסים באקסס
-
כמה שאלות באקסס:
- האם ואיך ניתן להגדיר משתנה ב VBA על בסיס משפט SQL? דוגמא:
if "SELECT Donor.ID, Sum(Donations.Amount) AS SumמתוךAmount FROM Donor LEFT JOIN Donations ON Donor.ID = Donations.DonorID GROUP BY Donor.ID HAVING (((Donor.ID)=[Forms]![frmDonorCard]![ID]));" > 500 then msgBox end if
דהיינו אם סכום התרומות לתורם זה גדול מ500 אז לדוג' תקפוץ הודעה וכו'
עריכה: אחרי תגובתו של @OdedDvir למטה - השאלות האחרות הועברו לנושא נפרד.
-
@סקרן-0 אמר בשימוש במשפט SQL כמשתנה בקוד, ושאלות על טפסים באקסס:
כמה שאלות באקסס:
- האם ואיך ניתן להגדיר משתנה ב VBA על בסיס משפט SQL? דוגמא:
if "SELECT Donor.ID, Sum(Donations.Amount) AS SumמתוךAmount FROM Donor LEFT JOIN Donations ON Donor.ID = Donations.DonorID GROUP BY Donor.ID HAVING (((Donor.ID)=[Forms]![frmDonorCard]![ID]));" > 500 then msgBox end if
דהיינו אם סכום התרומות לתורם זה גדול מ500 אז לדוג' תקפוץ הודעה וכו'
-
אני רוצה לעשות אופציה של תרומה של מוצרים עם בחירה מתיבה משולבת, ולצורך זה עשיתי רשימת מוצרים ורשימת חנויות, וכן טבלה שמקשרת ביניהם כך שכשמעדכנים מוצר ברשימה הנפתחת של החנויות יופיעו רק החנויות הרלוונטיות.
כעת אני רוצה שהסכום יהיה באופן אוטומטי, כלומר שבבחירת מוצר X מחנות Y - בתיבת הסכום יופיע הסכום אוטומטית (כמובן שלכל קשר מוצר-חנות יש סכום משלו)
אני מניח שצריך לעשות בטבלת הקשרים של המוצרים לחנויות עוד שדה של סכום, השאלה היא איך אפשר להגדיר ערך ברירת מחדל בטופס על בסיס זה -
כיון שרציתי לתת אפשרות לתרום כמה מוצרים על מקרה אחד, חילקתי את התרומות לשתי טבלאות - טבלת המקרים (עם קוד מקרה, שם המשפחה, פרטי המקרה) וטבלה של אמצעי התרומה (מוצר, חנות, כמות, סכום) כשלכל מקרה יש כמה רשומות באמצעי התרומה (כיון שייתכן לתרום על מקרה של שרפה בבית גם מטבח ב"א.א. מטבחים" וגם ספה ב"א.א. ספות" )
כעת אני רוצה להוציא דוח אחד על כל המקרה שבו יהיה פירוט של כל המוצרים שתרם (כמו קבלה מחנות). השאלה איך ניתן להכניס שדות מכמה רשומות (של כל המוצרים בתרומה הנוכחית) לתוך דוח אחד (ששייך לתרומה הכוללת)
if DSum("Amount","Donation","DonorId=nz([Forms]![frmDonorCard]![ID],0)")>500 then msgbox end if
-
@סקרן-0 אמר בשימוש במשפט SQL כמשתנה בקוד, ושאלות על טפסים באקסס:
@אפר-שריפה תודה רבה. אכן במקרה הספציפי הנ"ל אפשר לפתור ע"י חישוב בVBA בלי SQL, ואני עדיין שואל תיאורטית אם יש דרך כזו.
זו הדרך התקינה לדעתי
אבל בכל מקרה ניתן לייצר משתנה RecordSet ולטעון אליו שאילתא
ואז לגשת לשדה הרלוונטי -
@סקרן-0 לשאלתך הראשונה:
האם ואיך ניתן להגדיר משתנה ב VBA על בסיס משפט SQL?
משפט SQL באקסס לא מחזיר ערך. הוא פשוט הוראה לבסיס הנתונים לבצע שאילתה מסויימת.
שמא כוונתך לשאול: האם ניתן לשלוף ערך מסויים מתוך שאילתא\משפט SQL?
התשובה הקצרה היא כן. השאלה היא מה המשתנה אמור להכיל? תוצאה של שדה מסויים? סכום של עמודה מסויימת? מספר הרשומות? לכל מקרה יש אופן ביצוע אחר. לחלק יש כבר פונקציות מובנות באקסס, כמוDSum
שציין @אפר-שריפה.באופן כללי, אם אתה מבקש לקבל שדה מסויים בשאילתא, אפשר להשתמש באובייקט
RecordSet
, כמו שציין יפה @אפר-שריפה.מובן שעליך לוודא שהשאילתא מחזירה רק רשומה אחת, אחרת לא ברור מאיזו רשומה יאוחזר הערך.
הפונקציה הבאה מחזירה ערך של שדה מתוך שאילתא. אם יש כמה רשומות, היא מחזירה את השדה ברשומה הראשונה:
Public Function GetFieldFromSQL(SQL As String, fieldName As String) As Variant Dim rs As DAO.Recordset Dim result As Variant Set rs = CurrentDb.OpenRecordset(SQL, dbOpenSnapshot, dbReadOnly) result = Null If Not rs.EOF Then result = rs.Fields(fieldName).Value rs.Close GetFieldFromSQL = result End Function
לדוגמא (על פי המדריך למערכת תורמים):
Dim SQL As String SQL = "SELECT FullName FROM qryDonor_FullName WHERE ID=2" Debug.Print GetFieldFromSQL(SQL, "FullName")
תודפס התוצאה:
לוי יצחק
לגבי שאלותיך האחרות, נא פתח פוסטים נפרדים עבור כל שאלה, עם כותרת מתאימה, כדי שיהיה בזה תועלת לשאר החברים, ואשתדל לענות.
-