רענון ללא הקפצה

siftach

New member
רענון ללא הקפצה

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

בא ונתחיל מהערה: Requery לא טוב לנו, פקודה זאת מרעננת את כל מה שחי ונושם על המסך שלך וקשור לתוכנה שלך.... (גם אם הוא נראה וגם אם לא, ובתנאי שהוא פתוח) ועכשיו איך אנחנו עוקפים את הבעיה שלך... דבר ראשון אנחנו שומרים את הרשומה שבפוקוס. דבר זה מתבצע ע"י הכרזה על משתנה מסוג Long וטעינת המשתנה... לצורך העניין אם המפתח שלך בטבלה הוא ID אז הפעולה הראשונה בלחיצה על הכפתור שלך תהיה -
lKeepRec = Me![ID]​
עכשיו אנחנו יכולים לעבור לפעולת הרענון... לצורך זה צריך משתנה מסוג String שיכיל את מקור הרשומות של הטופס לדוגמה:
sSQL = " SELECT ID, Field1, Field2 FROM TBL "​
ועכשיו הרענון עצמו:
Me.RecordSource = sSQL​
עכשיו כל מה שנשאר זה להגיע בחזרה לרשומה בה היית.... דבר זה נעשה כך
docmd.GoToRecord acActiveDataObject,,acGoTo, lKeepRec​
פשוט לא?
 

siftach

New member
זה מסובך...

כאמור, הרשומה שבפוקוס נעלמת מהרקורדסט, ככה שמישהי אחרת צריכה לקבל פוקוס. מיהי הרשומה הבאה או הקודמת? יותר גרוע מזה: זה פשע חמור להגדיר את מקור הנתונים של הטופס בתוך הקוד של הטופס. כדי לעשות את זה נכון יש לעשות: sSQL = Me.RecordSource .... .... .... Me.RecordSource = sSQL בכל אופן תודה על הרעיון, זה יוצא שווה ערך להפעלת requery ואחרי זה MoveFirst, וזה מספיק טוב בשבילי.
 
אם זה פשע חמור להגדיר ....

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

siftach

New member
אותך לאלייקים רובינשטיין

זה לא פשע להגדיר Recordset, זה פשע לשנות את RecordSource. מחר את הולך לשנות את מקור הנתונים בטופס, ומן הסתם תשכח שאתה גם משחק איתו בתוך הקוד עצמו. ולגבי המקרה שלי - אני לא מבצע מחיקה אלא עדכון, שכתוצאה ממנו הרשומה דנן לא נכללת יותר ברשומות הרלוונטיות לטופס.
 
../images/Emo6.gif../images/Emo6.gif../images/Emo6.gif../images/Emo6.gif../images/Emo6.gif מה אתה אומר....

אם תסתכל על הכתבה שהוספתי השבוע, תוכח לדעת שאני משחק ביותר מה - RecordSource... אני לפעמים משחק גם ב - SourceObject אז מה, זה אומר שאני אבי אבות הפושעים...? אני אומר לך בצורה שאינה משתמעת לשתי פנים... אתה מבצע מחיקה, בטבלה, או משנה נתונים, הכל טוב ויפה, יש לך שתי אפשרויות, אחת - לעשות רענון לטופס.... ואז אם יש לו בנים אתה מרענן אוטומטית גם אותם, ואם יש לך אירוע On Current נראה אותך מתמודד עם רענון של טופס ו5000 רשומות, וגם בנים ("חורגים לאלוהים"....) האפשרות השניה - הפושעת והאנרכיסטית, היא להגדיר מחדש את מקור הטופס. אני מודיע לך חגיגית כי באמצעות פשע זה, אני סוחט, שודד גונב ואפילו רוצח שניות יקרות מאוד בזמן העבודה. אני יכול להעיד על אפליקציה אחת, גדולה במיוחד, במקום רגיש מאוד, שמדדנו זמנים בשתי השיטות. (עבודה ברשת, עם מסד נתונים אקסס) התוצאות מדהימות במצב של 12000 רשומות אב, ובערך 300000 בכל הילדים ... 1.02 עם רענון (זה לא שניה, זה דקה) ועם עוונות, חטאים ופשעים כמו שלי... 0.5 שניה. אז לאחר נאום הסנגוריה הזה, אני מבקש הקלה בעונש....
 

accessdog

New member
הבהרות

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

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

accessdog

New member
המשך

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

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

siftach

New member
נראה אותך גיבור במרתפי השב"כ

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

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

siftach

New member
למה באקסס?

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

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

אלון_פ

New member
למה הכוונה - רק רשומה אחת מאוגדת

האם א: אתה בונה recordset המאגד רק רשומה אחת או - ב: אתה משתמש בפקדים בלתי מאוגדים וקורא לrecordset -מציב את הערך בשדה ואחכ כותב השינויים לקבצים ?? אלון
 
טכניקה בעבודה על רשומה אחת.

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

אלון_פ

New member
אתה יכול בבקשה

לפרט איזה בעיה בדיוק יש עם הטרנזאקציות? ככל שאני יודע המושג טראנזאקציה (Commit,Rollback ...) רלוונטי רק ב- SP או ב -DAO/Ado ולא בטפסים מקושרים. תודה אלון
 
הסברים בבקשה...

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

אלון_פ

New member
למה? אקסס מנהל נעילות ברמת הטופס

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