סיוע באקסס

פוזנא

New member
סיוע באקסס

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

אם שם המפתח הוא ID ואם הטבלה בעלת השדה האחד נקראת X והשדה יקרא Y אז תשתמש באחת משת הדרכים הבאות: 1. קריטריון במקור הטופס (מקוד באירוע בעת פתיחה של הטופס)
WHERE TBL.ID < " & Dlookup("[Y]","X")​
2. דרך התקשרות ולולאה הבאה
Do Until rst.ID = Dlookup("[Y]","X")​
 

bugg

New member
אפשר גם

RecordsetObject.MoveFirst RecordsetObject.Move Dlookup(...)​
או אם צריך להגיע לרשומה שעונה על קריטריון מסויים:
RecordsetObject.FindFirst WhereConditionStringValue​
ואם זה פשוט חיפוש של רשומה עם ערך מסויים במפח=תח הראשי:
RecordsetObject.Seek PrimeryIndexValue​
 

פוזנא

New member
לשמוליק וBUGG

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

bugg

New member
אשמח ../images/Emo13.gif

הפונקציה הבאה:
DLookup( "Table1", "Field1", "Criteria" )​
מחפשת ב-Table1 רשומה שעונה על הקריטריון Criteria (שהוא כמו חלק ה-WHERE במשפט SQL), ומחזירה, מאותה רשומה את ערכו של השדה Field1. אם ישנן כמה רשומות שעונות על התנאי, הערך שיוחזר יהיה זה של הרשומה הראשונה. ואם לא ציינת תנאי, יוחזר הערך מהרשומה הראשונה.
RecordsetObject.MoveFirst​
ממקם את הסמן (את מה שמצביע על רשומות) על הרשומה הראשונה (ז"א שכל נתון שתשלוף כרגע ישלף מהרשומה הראשונה). ו...
RecordsetObject.Move IntValue​
מזיז את הסמן IntValue רשומות קדימה/אחורה (תלוי אם זה מספר חיובי/שלילי בהתאמה). במקרה שלנו IntValue הוא הערך שהפונקציה DLookup החזירה. כדי להגיע אל רשומה מספר X בטבלה, יש לבצע את שני הצעדים: 1. לגשת לתחילת הטבלה (הרשומה הראשונה). 2. לזוז X רשומות קדימה. ולשאלתך, לא זה לא סותר את מה שכתבת. זו פשוט דרך יעילה יותר (לדעתי) להגיע לרשומה X בטבלה מאשר להשתמש בלולאה.
 
ל../images/Emo15.gif יש ../images/Emo15.gif .... ../images/Emo6.gif

כל משפטי הנתונים (אלו שמתחילים ב-D) כמו DlookUp בנויים בצורה הזאת:
Dlookup("Field1","Table1"Criteria")​
כל השאר נכון.....
 

bugg

New member
תודה שמוליק

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

פוזנא

New member
Rאשית תודה רבה, שנית...

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

bugg

New member
אז

עד כמה שהבנתי, אמרת שהטבלה השניה מכילה רק רשומה אחת שבה יש את מספר הרשומה שאליה צריך להגיע בטופס, נכון? אם כך, ה-criteria לא צריך להיות דינאמי - הוא לא צריך להיות קיים כלל. הרי יש לך רק רשומה אחת שם. עכשיו, יש כמה דרכים. אם אתה מתעקש להשאר במקרו, תשתמש בפקודה GoToRecord שהיא המקבילה של ה-Move שהראנו לך קודם. אם אתה רוצה להעביר את הכל לקוד VB, אז פשוט באירוע שבו אתה מפעיל את המקרו, תפעיל קוד במקום, ותשתמש בפונקציות שהראנו לך קודם. ואם אתה רוצה לשלב בינהם - להשאר עם המקרו שכתבת עד עכשיו אבל להשתמש ב-VB בשביל המשימה הספציפית הזו, אז: 1. תכתוב את הפונקציה שממקמת את הטופס ברשומה המבוקשת בקוד VB (במודול של הטופס, לא חייבים מודול חדש). 2. תשתמש בפקודץ המקרו RunCode כדי לקרוא לפונקציה הזו. באשר להיכן למקם את הקוד (באיזה ארוע), זה תלוי בך - מתי אתה רוצה שזה יתבצע בדיוק? אבל אם כבר כתבת את המקרו אז אני מניח שכתבת אותו עבור אירוע מסויים - כנראה שזה הארוע המתאים, לא?
 

rozeyoter

New member
שלום פוזנא

אני לא תכנת אקסס במלא מובן המילה אלא יותר VB לא כ"כ הבנתי את בעייתך אולי אם תסביר מה המטרה הסופית יהיה פשוט יותר לתת תשובה. ראשית כל צריך לפתוח את הטבלא ע"י ORDER BY השדה שעל פיו אתה מעוניין להציג/לעצור תצוגת רשומות. שנית כל דרך יותר "VיBית" תהיה לפתוח את הטבלא הנל ב RECORDSET בפונקציה ציבורית ולעשות את הלולאה שאתה מדבר עליה עד לתנאי שתשים. כאשר אתה ממלא טבלא אחרת בנתונים הנל. ולבסוף מציג את נתוני הטבלא השניה בטופס... מקווה שעזרתי.
 

פוזנא

New member
ושוב שלום ל BUGG ו ROZEYOTEr

BUGG, לגבי GOTORECORD, הוא מבקש היסט כמספר נתון ולא מקבל קישור לתא מסוים. לגבי להעביר הכל ל VB נראה לי קצת גדול עלי כי אני לא יודע לממשק בין VB לאקסס. לגבי הפתרון שנתת לי לעשות במאקרו RUNCODE - לזה בדיוק אני חותר !! אבל לא ברור לי מה זה מודול של טופס ואיך אני מגיע אליו ומה התחביר של הקמת פונקציה. לצורך הפשטה, לטופס קוראים continue old test והוא מבוסס על טבלה בשם GROUPS. לטבלה בעלת מספר הרשומה הרצוי קוראים number of group והיא כוללת שדה אחד בשם num . הטבלה הזו מכילה רשומה אחת שהתוכן שלה מתעדכן ואינו קבוע. כרגע בפתיחת הטופס (לא תמיד!) רץ לי מאקרו מסוים המכיל עשרות מניפולצות ובסופו אני מעוניים באותו RUNCODE שירוץ על אותה טבלת GROUPS ויעצור ברשומה שמספרה מאוחסן בטבלת NUMBER OF GROUP ושיגאל את נפשי המיוסרת. ברור לי שהפתרון הוא ב VB אבל הידע שלי אפסי ! בקיצור, איך תכל´ס עושים את זה ?? ושוב ושוב ושוב -- תודה רבה רבה רבה !!!
ול ROZEYOTER - ארבע השורות האחרונות שכתבת הם יפנית בשבילי. אנא, חזור דור אחד אחורה....
 

bugg

New member
אז למה לא אמרת קודם? ../images/Emo13.gif

GoToRecord זה הפתרון. וההיסט זה בדיוק מה שאתה מחפש. זוכר את DLookup? זה ההיסט. קודם כל תשתמש בפקודת מקרו כדי להגיע לרשומה הראשונה (אני לא זוכר את שמה אבל חייבת להיות פקודה בסגנון MoveFirst), ואז, כשאתה נמצא ברשומה הראשונה, ההיסט הוא מספר הרשומה אליה אתה רוצה להגיע (או מספר הרשומה שאליה אתה רוצה להגיע - זה ההיסט). ומאיפה אתה משיג את המספר הזה (מספר הרשומה)? בעזרת DLookup. ולכן, בהיסט של GoToRecord תכתוב:
Dlookup("[num]", "[number of groups]")​
זה הכל.
 

פוזנא

New member
../images/Emo51.gif../images/Emo51.gif../images/Emo51.gifזה עובד !

תודה על הסבלנות ועל החיוך BUGG !!!חשבתי שכבר הרימו ידיים ממני....
 
VיBית לא תעזור כאן...

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