שימוש בפרמטרים בשאילתת עדכון באקסס
-
@OdedDvir
תצוגת SQL :UPDATE ראשי LEFT JOIN חודשי ON [ראשי].[מזהה]=[חודשי].[מזהה] SET ראשי.[חודש 08/20] = IIf(Not (IsNull([חודשי].[Name])),"1","") WHERE ((([ראשי].[חודש 08/20]) Is Null Or ([ראשי].[חודש 08/20]) Like 0));
מה שאני רוצה הוא שאוכל לכתוב משהו כמו:
[חודש [הזן חודש]/[הזן שנה]]
במקום:
[חודש 08/20]
ואז בהפעלת השאילתה זה יבקש את החודש ואת השנה, ויעדכן בשדה הרצוי.
-
@איש-ימיני אמר בשימוש בפרמטרים בשאילתת עדכון באקסס:
UPDATE ראשי LEFT JOIN חודשי ON [ראשי].[מזהה]=[חודשי].[מזהה] SET ראשי.[חודש 08/20] = IIf(Not (IsNull([חודשי].[Name])),"1","")
טוב, אני מבקש סליחה מראש על התשובה המרגיזה, אבל מהשאלה שלך עולה שהנתונים לא מנורמלים כראוי. זה הרגל לא בריא ליצור עמודה חדשה לכל חודש, ויש לשמור את כל נתוני התאריך המדובר בעמודה אחת בלבד.
כמו כן, שימוש בשמות שדות בעברית מאוד לא מומלץ, שימוש בשמות שדות שמעורב בהן עברית + מספרים + תווים אחרים (סלאש) עוד פחות מומלץ.אחרי שפרקתי את זה, אני מציע לך להשתמש בקוד VBA לפתור את הבעיה, כי אני לא חושב שיש דרך להעביר שם שדה כפרמטר באקסס ישירות בעורך השאילתות.
כך תוכל לבנות את מחרוזת השאילתא בקוד כרצונך, ולהריץ אותה אחר כך.
למשל משהו כזה (פישטתי קצת את ה Where)
Dim iMonth, iYear as integer iYear = InputBox("הזן שנה") iMonth = InputBox("הזן חודש") Dim fieldName as String fieldName = "חודש " & iMonth & "/" & iYear Dim SQL as String SQL = "UPDATE ראשי LEFT JOIN חודשי ON [ראשי].[מזהה]=[חודשי].[מזהה] SET ראשי.[" & fieldName & "] = IIf(Not (IsNull([חודשי].[Name])),'1','') WHERE Nz([ראשי].[" & fieldName & "],0)=0;" CurrentDb.Execute SQL
-
@OdedDvir
תודה רבה !!!
עשיתי את זה כך:Dim iMonth, iYear As Integer iYear = InputBox("הזן שנה") iMonth = InputBox("הזן חודש") Dim db As DAO.Database Set db = CurrentDb Dim qryDef As DAO.QueryDef Dim selectSQL As String Dim fieldName As String fieldName = "חודש " & iMonth & "/" & iYear Dim SQL As String Dim newSelectSQL As String newSelectSQL = "UPDATE ראשי LEFT JOIN חודשי ON [ראשי].[מזהה]=[חודשי].[מזהה] SET ראשי.[" & fieldName & "] = IIf(Not (IsNull([חודשי].[Name])),'1','') WHERE Nz([ראשי].[" & fieldName & "],0)=0;" With db.QueryDefs("1234") .SQL = newSelectSQL End With DoCmd.OpenQuery "1234" Set qryDef = Nothing Set db = Nothing
@OdedDvir אמר בשימוש בפרמטרים בשאילתת עדכון באקסס:
טוב, אני מבקש סליחה מראש על התשובה המרגיזה, אבל מהשאלה שלך עולה שהנתונים לא מנורמלים כראוי. זה הרגל לא בריא ליצור עמודה חדשה לכל חודש, ויש לשמור את כל נתוני התאריך המדובר בעמודה אחת בלבד.
אני צריך לדעת למי עדכנתי בכל חודש, יש דרך אחרת לעשות את זה בלי עמודה חדשה בכל חודש?
-
@איש-ימיני אמר בשימוש בפרמטרים בשאילתת עדכון באקסס:
אני צריך לדעת למי עדכנתי בכל חודש, יש דרך אחרת לעשות את זה בלי עמודה חדשה בכל חודש?
אני לא יכול לענות לך בדיוק בלי לדעת יותר פרטים על הטבלאות. באופן כללי, אתה יוצר טבלה אחת עם שני שדות: מזהה, ותאריך עדכון. ובכל עדכון אתה מוסיף שורה למי עדכנת ומתי:
ID | UpdatedOn 100 | 10/01/2020 101 | 10/01/2020
אגב, מדוע שינית את הקוד ומה הרווחת בזה?
-
@OdedDvir אמר ב[שימוש בפרמטרים בשאילתת עדכון
אגב, מדוע שינית את הקוד ומה הרווחת בזה?
ניסיתי בדיוק כמו שכתבת וזה החזיר שגיאה
עשיתי חיפוש קצר על הקוד ומצאתי את זה ושילבתי את זה ביחד ועובד מצוין וזה גם מיד מריץ את השאילתה.@OdedDvir אמר בשימוש בפרמטרים בשאילתת עדכון באקסס:
באופן כללי, אתה יוצר טבלה אחת עם שני שדות: מזהה, ותאריך עדכון. ובכל עדכון אתה מוסיף שורה למי עדכנת ומתי:
ID | UpdatedOn 100 | 10/01/2020 101 | 10/01/2020
איך אני מוסיף לשאילתה שיעדכן בטבלה אחרת את המזהה ואת התאריך?
-
@איש-ימיני אמר בשימוש בפרמטרים בשאילתת עדכון באקסס:
ניסיתי בדיוק כמו שכתבת וזה החזיר שגיאה
שורות 8-9 בקוד שלי אמורות להכתב כשורה אחת ארוכה. ייתכן והדבקת אותן כשתי שורות כמו שמופיע בפוסט.
איך אני מוסיף לשאילתה שיעדכן בטבלה אחרת את המזהה ואת התאריך?
INSERT INTO UserUpdates(Id, UpdatedOn) VALUES (UserId, UpdateDate);
-
@OdedDvir אמר בשימוש בפרמטרים בשאילתת עדכון באקסס:
INSERT INTO UserUpdates(Id, UpdatedOn) VALUES (UserId, UpdateDate);
איך אני משלב את זה עם:
UPDATE ראשי LEFT JOIN חודשי ON [ראשי].[מזהה]=[חודשי].[מזהה] SET ראשי.[" & fieldName & "] = IIf(Not (IsNull([חודשי].[Name])),'1','') WHERE Nz([ראשי].[" & fieldName & "],0)=0;
-
-
@איש-ימיני תצטרך ליצור שתי שאילתות ולהריץ אחת אחרי השניה:
שאילתא לעדכון המונה:
UPDATE Users INNER JOIN Monthly ON Users.Id = Monthly.UserId SET Users.[Counter] = [Users].[Counter]+1;
שאילתא להוספת רשומת עדכון לטבלת UserUpdates:
INSERT INTO UserUpdates ( UserId, UpdatedOn ) SELECT Monthly.UserId, Now() AS UpdatedOn FROM Monthly;
או שתוכל להקצות ערך ברירת מחדל לשדה UpdatedOn בטבלה UserUpdates
=Now()
ואז השאילתא יותר פשוטה:
INSERT INTO UserUpdates ( UserId ) SELECT Monthly.UserId FROM Monthly;
-
@איש-ימיני אמר בשימוש בפרמטרים בשאילתת עדכון באקסס:
עריכה: הוספתי רק את זה:
Nz([Users].[Counter],0)+1בעיקרון אם יש ערך ברירת מחדל 0 לשדה Counter לא צריך, אבל תמיד טוב להיות זהיר...