אקסס - איך יכול להיות ערך כפול?
-
לא, אני לא מדבר על תוכנה חדשה באקסס... זה רק שדרוג של תוכנה ישנה..
ובכן, יש לי לקוח שעובד באקסס משני מחשבים ברשת מקומית בו זמנית, היות והוא כמעט ולא משתמש עם דוחות המהירות נסבלת, וזו לא הבעיה.
אני משתמש עם טופס שמריץ INSERT SQL לאחת הטבלאות, במשפט הSQL אני לוקח את הערך המקסימלי מאותה הטבלה בעמודה מסויימת, מוסיף לה 1, ומכניס שורה חדשה. (אין לי אפשרות מסיבות מסויימות להשתמש עם ההוספה האוטומטית)
הבעיה החמורה היא, שלפעמים קורה ששני המחשבים עושים את זה באותה שניה [כנראה] וכך נוצר ערך כפול!!!למי יש פתרון? אולי ליצור פונקציה שמורה ששני המחשבים יקראו לה? יש אפשרות כזאת באקסס?
פורסם במקור בפורום CODE613 ב18/09/2017 11:34 (+03:00)
-
השאלה למה אתה צריך את זה, אם אתה סתם מממש מספור אוטומטי אז אל תעשה זאת ותן לאקסס לבחור מספר אוטומטי (הוא עושה זאת ע"י דילוג: כל קליינט מקבל סדרת שורות חדשות שונה עם מספרים, מה שגורם לכך שייתכן שמס' אוטומטי 5 יווצר לפני 4 בגלל שריון לפי קליינט.
אם אתה כן חייב לממש לבד את המספור, אתה צריך לנסות לחקות את זה. למשל בכניסה של האדם לתוכנה הוא מקבל "מזהה קפיצה" מאחד עד עשר (וגם זה צריך לודאות שזה צולח את הבו זמנית - אם כי זה רגע קטן בהרבה מכל אורך חיי התוכנה), ואז כל שורה חדשה זה חייב להיות המספר הזה כמו 5 15 25 35 וכו'.
אם המספר לא חייב להיות עוקב זה מעולה, אתה פשוט מצמיד לכל יוזר קידומת למשל 1000000, 2000000 וכו'. ואז אתה מחפש את המקסימום ליוזר הזה ע"י max והתניית where id < 2000000 אז אתהמקבל טווח ספציפי ליוזר. את הקידומת אתה יכול לקבוע בטבלת משתמשים באופן שרירותי או אוטומטי.אולי לתותחי האקסס יש פתרונות פשוטים יותר.
פורסם במקור בפורום CODE613 ב18/09/2017 12:03 (+03:00)
-
לא הבנתי למה לא מספור אוטומטי אבל אתה יכול עם תנאי ע"י שאתה עושה טבלה נפרדת עם מס' אוטומטי ואתה מחליט עם לשלוף את השורה או ליצור חדשה.
אולי יש קוד שנועל את הטבלה וככה אתה יכול לעשות סתם max רגיל כמו שעשית עד עכשיו, אינני יודע.פורסם במקור בפורום CODE613 ב18/09/2017 12:24 (+03:00)
-
אני מבין שיש לך בכל זאת עמודה של מס אוטו'.
תעשה אינסרט לטבלה, (אתה יכול לקבל באינסרט את התוצאה של המס' האוטו) או שאתה מקבל את המס' האוטו' בטופס
ואח"כ תעשה משפט UPDATE שנראה בערך ככהupdate tbl set DocNum=nz(DMax("DocNum","tbl","DocType=305"),0)+1 where id=1
בגלל שהעידכון מתבצע בתוך הUPDATE הוא מנטר את השאילתות וזה לא אמור לקרות גם בבו זמנית.
חוצמזה, אתה יכול לעשות אינדקס או כלל אימות על 2 שדות, ואז אם השאילתא השנייה תשים את אותו מספר אתה תקבל שגיאה,
תפוס אותה עם משפט שגיאה, ואז תחזיר את הקוד פעם נוספת (או עד בלופ עד שתעבור בלי שגיאה - אני מציע אם אתה שם לופ, שתשים לימיט כדי שלא תיכנס ללופ אינסופי אם תהיה בעייה)פורסם במקור בפורום CODE613 ב18/09/2017 12:35 (+03:00)
-
אני מבין שיש לך בכל זאת עמודה של מס אוטו'.
תעשה אינסרט לטבלה, (אתה יכול לקבל באינסרט את התוצאה של המס' האוטו) או שאתה מקבל את המס' האוטו' בטופס
ואח"כ תעשה משפט UPDATE שנראה בערך ככהupdate tbl set DocNum=nz(DMax("DocNum","tbl","DocType=305"),0)+1 where id=1
בגלל שהעידכון מתבצע בתוך הUPDATE הוא מנטר את השאילתות וזה לא אמור לקרות גם בבו זמנית.
חוצמזה, אתה יכול לעשות אינדקס או כלל אימות על 2 שדות, ואז אם השאילתא השנייה תשים את אותו מספר אתה תקבל שגיאה,
תפוס אותה עם משפט שגיאה, ואז תחזיר את הקוד פעם נוספת (או עד בלופ עד שתעבור בלי שגיאה - אני מציע אם אתה שם לופ, שתשים לימיט כדי שלא תיכנס ללופ אינסופי אם תהיה בעייה)מעניין מאוד. למה נראה לך ששאילתות INSERT הוא נותן להפעיל בו זמנית, ושאילתות UPDATE לא?
מקור הבעיה היא שהמחשב העיקרי פונה אל הDB שבו לוקאלית, והמחשב השני מחובר בWIFI.
למעשה, אתה צודק שאם אני יפעיל שני שאילתות (אחת להוספה, והשניה לעדכון) ממילא יווצר פרק זמן קטנטן שבו יוכל להתבצע בדיקה ולגלות את השורה הנוספת.פורסם במקור בפורום CODE613 ב18/09/2017 12:49 (+03:00)