דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. הרצת שאילתה בלולאה - VBA אקסס

הרצת שאילתה בלולאה - VBA אקסס

מתוזמן נעוץ נעול הועבר תכנות
26 פוסטים 5 כותבים 603 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ס מנותק
    ס מנותק
    סקרן 0
    כתב ב נערך לאחרונה על ידי
    #1

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

    א dovidD OdedDvirO M 4 תגובות תגובה אחרונה
    0
    • א מנותק
      א מנותק
      ארי
      השיב לסקרן 0 ב נערך לאחרונה על ידי
      #2

      @סקרן-0 רק כדי להבין.
      יש לך טבלת לקוחות, טבלת אנשי שיווק, וטבלה שמכילה קוד לקוח וקוד האיש שיווק שלו?

      תגובה 1 תגובה אחרונה
      1
      • dovidD מחובר
        dovidD מחובר
        dovid ניהול
        השיב לסקרן 0 ב נערך לאחרונה על ידי
        #3

        @סקרן-0 תצרף מבנה טבלאות תאירוטי או אמיתי של המקרה.

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        תגובה 1 תגובה אחרונה
        2
        • OdedDvirO מנותק
          OdedDvirO מנותק
          OdedDvir
          השיב לסקרן 0 ב נערך לאחרונה על ידי
          #4

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

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

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

          ס תגובה 1 תגובה אחרונה
          6
          • ס מנותק
            ס מנותק
            סקרן 0
            השיב לOdedDvir ב נערך לאחרונה על ידי
            #5

            @OdedDvir @dovid האמת שאחרי ששאלתי את השאלה ישבתי עוד זמן רב על התוכנה, והבנתי שהשאלה נבעה מהבנה שגויה שלי על המבנה של ה DB.
            אני לא יכול לצרף מבנה טבלאות כמו שביקש @dovid בצדק רב, (וליתר דיוק זה דורש ממני עבודה מיותרת כמו שאסביר).

            לאחר מעשה הבנתי שהנסיונות לפתור את הבעיה באמצעות שאילתות עדכון אחרות וכדו' לא רלוונטי, והאופציה היחידה שרלוונטית במקרה שלי זה כמו ששאלתי בהתחלה (באופן לא ברור....) וכמו שכתב @OdedDvir (באופן ברור):

            לכתוב קוד שמפעיל את הכפתור 10000 פעמים.

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

            א תגובה 1 תגובה אחרונה
            0
            • א מנותק
              א מנותק
              ארי
              השיב לסקרן 0 ב נערך לאחרונה על ידי
              #6

              @סקרן-0 האמת שאף פעם לא שמעתי על אפשרות גרועה כ"כ, במיוחד שלפי מה שאתה טוען זו האפשרות היחידה....
              הקוד לכאו' אמור להיות די פשוט:

              for i = 1 to 10000
                   'your code
              next i
              

              איפה זה מסתבך?
              בלי לדעת את המבנה הבסיסי של התוכנה, לא נראה לי שאפשר לעזור יותר מזה...

              תגובה 1 תגובה אחרונה
              2
              • M מנותק
                M מנותק
                mekev
                השיב לסקרן 0 ב נערך לאחרונה על ידי mekev
                #7

                @סקרן-0

                נקודה למחשבה:
                מה יעזור לך ההרצה בלולאה הנ"ל

                אם מדובר על עדכון של אותו איש שיווק לכל הלקוחות - כאמור, תבצע עדכון גורף

                אם מדובר על עדכון איש שיווק שונה בכל לקוח
                את אותה טרמינולוגיה שאתה מעוניין להכניס בלולאה בלחצן
                (כגון: אם זה לקוח ג'ינג'י שייך לסוכן איציק, אם זה לקוח רזה שייך לסוכן שלמה)

                תכניס מראש בשאילתת עדכון הגורפת

                ס תגובה 1 תגובה אחרונה
                2
                • ס מנותק
                  ס מנותק
                  סקרן 0
                  השיב לmekev ב נערך לאחרונה על ידי
                  #8

                  @mekev זה בדיוק הנקודה (ולכן גם מה שכתב @ארי צריך איזו התאמה למה שאני צריך...)

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

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

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

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

                  OdedDvirO dovidD 2 תגובות תגובה אחרונה
                  0
                  • OdedDvirO מנותק
                    OdedDvirO מנותק
                    OdedDvir
                    השיב לסקרן 0 ב נערך לאחרונה על ידי
                    #9

                    @סקרן-0 ההצעה שלי לשאילתת עדכון אינה דורשת שינוי במבנה מסד הנתונים, השאילתא נשענת על המבנה הקיים.
                    אם אתה מורשה להוסיף קוד משלך, מה הבעיה להוסיף שאילתא?

                    ס תגובה 1 תגובה אחרונה
                    4
                    • ס מנותק
                      ס מנותק
                      סקרן 0
                      השיב לOdedDvir ב נערך לאחרונה על ידי
                      #10

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

                      על הצד שזה כן יהיה מותר לי (וסתם להעשרה...) התחביר של השאילתא צריך להיות כך?

                      UPDATE משווקים
                      INNER JOIN (לקוחות)  ON משווקים.פרמטר = לקוחות.פרמטר SET לקוחות.משווק = [משווקים].[משווק];
                      
                      

                      תודה רבה, ושוב תודה לכל מי שעונה אפילו שהשאלה לא ברורה מספיק...

                      dovidD תגובה 1 תגובה אחרונה
                      0
                      • dovidD מחובר
                        dovidD מחובר
                        dovid ניהול
                        השיב לסקרן 0 ב נערך לאחרונה על ידי
                        #11

                        @סקרן-0 כתב בהרצת שאילתה בלולאה - VBA אקסס:

                        לכן האופציה היחידה שיש לי זה זה להשתמש בטופס העדכון שהוא יצר

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

                        1. שם הטבלה של הלקוחות, שם השדה של מזהה לקוח, השדה שאתה מכין לאחסן את המזהה/שם משווק
                        2. שם הטבלה של המשווקים, שם השדה של מזהה משווק.
                        3. איפה נמצא הנתון של הקשר בין הלקוחות למשווק/עובד. אם זו טבלה מה שמה, ומה שמות השדות הרלוונטיים, אם זה משהו אחר (?) אנא פרט את הנקודה הזו העיקרית שחסרה מאז בואך לנושא.

                        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                        בכל נושא אפשר ליצור קשר dovid@tchumim.com

                        dovidD תגובה 1 תגובה אחרונה
                        3
                        • dovidD מחובר
                          dovidD מחובר
                          dovid ניהול
                          השיב לסקרן 0 ב נערך לאחרונה על ידי dovid
                          #12

                          @סקרן-0 כתב בהרצת שאילתה בלולאה - VBA אקסס:

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

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

                          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                          בכל נושא אפשר ליצור קשר dovid@tchumim.com

                          ס תגובה 1 תגובה אחרונה
                          2
                          • dovidD מחובר
                            dovidD מחובר
                            dovid ניהול
                            השיב לdovid ב נערך לאחרונה על ידי dovid
                            #13

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

                            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                            בכל נושא אפשר ליצור קשר dovid@tchumim.com

                            תגובה 1 תגובה אחרונה
                            2
                            • ס מנותק
                              ס מנותק
                              סקרן 0
                              השיב לdovid ב נערך לאחרונה על ידי סקרן 0
                              #14

                              @dovid

                              @dovid כתב בהרצת שאילתה בלולאה - VBA אקסס:

                              אפשר בקוד לכתוב את כל השאילתה, ולכן מה שכתבת לא רלוונטי.

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

                              @dovid כתב בהרצת שאילתה בלולאה - VBA אקסס:

                              עזוב, תן לנו לעזור לך, בבקשה!

                              וואו! - אני אביא את המקרה האמיתי (הוא קצת יותר מורכב כדלהלן, ולכן העדפתי לשאול ע"י משל... אולי טעיתי...)

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

                              1.טבלת "תורמים" - "רחוב", "עיר", "שכונה".
                              2. טבלת "רחובות" - "מזהה_רחוב", "מזהה_עיר", "שם_רחוב", "מזהה_שכונה"
                              3. טבלת "ערים" - "מזהה_עיר", "שם_עיר"
                              4. טבלת "שכונות" - "מזהה_שכונה", "שם_שכונה".

                              כעת המטרה היא שבהזנת העיר והרחוב יתעדכן אוטומטית הנתון ב תורמים.שכונה

                              הקוד המקורי שאמור לעשות את זה הוא:

                              If Not IsNull(Me!רחוב) Then
                                      Me!שכונה = Nz(DLookup("שם_שכונה", "שכונהלרחוב", "רחוב = '" & Me!רחוב & "' AND עיר = '" & Me!עיר & "'"), "")
                                  End If
                              

                              (שכונהלרחוב זו שאילתא שמוציאה את שם_עיר מ"ערים", שם_רחוב מ"רחובות", ושם_שכונה מ"שכונות")

                              הקוד הזה לא עובד, והסיבה שלא שאלתי איך לתקן אותו היא מהסיבה דלעיל, שחששתי שזה יפגע באחריות וכו'.

                              למעשה יש טופס עדכון, שמבוסס על הטבלה "רחובות", כשעל כל שורה יש כפתור "עדכון", שמריץ את הקוד הבא:

                              Private Sub עדכן_Click()
                              
                                      DoCmd.SetWarnings 0
                                      DoCmd.RunSQL "UPDATE תורמים SET תורמים.שכונה = '" & DLookup("שם_שכונה", "שכונה", "קוד_שכונה =" & Me!קודשכונה & " and קוד_עיר = " & Me!קודעיר) & "' WHERE (((תורמים.עיר)= '" & DLookup("שם", "ערים", "קוד =" & Me!קודעיר) & "') AND ((תורמים.רחוב)= '" & Me!שם & "'));"
                                      DoCmd.SetWarnings -1
                                  End If
                              
                              End Sub
                              

                              במצב כזה, אני צריך לעבור רחוב רחוב (כ 5000 רלוונטיים במצטבר) וללחוץ על "עדכון".
                              זה כל המידע שיש לי לומר, וכל עזרה תתקבל בברכה.

                              נ.ב. @dovid האם כדאי למחוק את הפוסטים הקודמים שלי? או שיש בהם איזה תוספת מידע מועילה? לשיקולך...)

                              תודה ענקית!

                              dovidD תגובה 1 תגובה אחרונה
                              0
                              • dovidD מחובר
                                dovidD מחובר
                                dovid ניהול
                                השיב לסקרן 0 ב נערך לאחרונה על ידי
                                #15

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

                                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                ס תגובה 1 תגובה אחרונה
                                2
                                • ס מנותק
                                  ס מנותק
                                  סקרן 0
                                  השיב לdovid ב נערך לאחרונה על ידי
                                  #16

                                  @dovid "רחוב, עיר, שכונה" הם טקסט.

                                  dovidD תגובה 1 תגובה אחרונה
                                  1
                                  • dovidD מחובר
                                    dovidD מחובר
                                    dovid ניהול
                                    השיב לסקרן 0 ב נערך לאחרונה על ידי dovid
                                    #17

                                    @סקרן-0 שאילתה כזו:

                                    SELECT שכונות.שם_שכונה, רחובות.שם_רחוב, ערים.שם_עיר 
                                    FROM (רחובות INNER JOIN שכונות ON רחובות.מזהה_שכונה = שכונות.מזהה_שכונה)
                                    INNER JOIN ערים ON רחובות.מזהה_עיר = ערים.מזהה_עיר
                                    

                                    מניבה תוצאה נכונה או שגיאה כל שהיא?
                                    ואם התוצאה נראית נכונה, האם בשאילתה הבאה ישנה התאמה בין הרחובות והערים והשכונה:

                                    SELECT רחוב, עיר, שכונה, שאילתה.שם_שכונה FROM תורמים 
                                    LEFT JOIN 
                                    (
                                    SELECT שכונות.שם_שכונה, רחובות.שם_רחוב, ערים.שם_עיר 
                                    FROM (רחובות INNER JOIN שכונות ON רחובות.מזהה_שכונה = שכונות.מזהה_שכונה)
                                    INNER JOIN ערים ON רחובות.מזהה_עיר = ערים.מזהה_עיר
                                    ) AS שאילתה ON 
                                    שאילתה.שם_רחוב = תורמים.רחוב AND
                                    שאילתה.שם_עיר = תורמים.עיר 
                                    
                                    

                                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                    ס תגובה 1 תגובה אחרונה
                                    2
                                    • ס מנותק
                                      ס מנותק
                                      סקרן 0
                                      השיב לdovid ב נערך לאחרונה על ידי
                                      #18

                                      @dovid השאילתא הראשונה מחזירה הודעת שגיאה "שגיאת תחביר במשפט JOIN

                                      תודה רבה!

                                      dovidD תגובה 1 תגובה אחרונה
                                      1
                                      • dovidD מחובר
                                        dovidD מחובר
                                        dovid ניהול
                                        השיב לסקרן 0 ב נערך לאחרונה על ידי
                                        #19

                                        @סקרן-0 כתבתי בטעות FORM במקום FROM.
                                        תיקנתי כעת במקור, נסה כעת.

                                        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                        בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                        ס תגובה 1 תגובה אחרונה
                                        0
                                        • ס מנותק
                                          ס מנותק
                                          סקרן 0
                                          השיב לdovid ב נערך לאחרונה על ידי סקרן 0
                                          #20

                                          @dovid תיקנתי את זה בעצמי ולמרות זאת זה החזיר את אותה שגיאה.
                                          האם אתה מתכוון לזה:

                                          SELECT ערים.שם, שכונה.שם_שכונה, רחובות.שם
                                          FROM ערים INNER JOIN (שכונה INNER JOIN רחובות ON שכונה.קוד_שכונה = רחובות.קודשכונה) ON (ערים.קוד = שכונה.קוד_עיר) AND (ערים.קוד = רחובות.קודעיר);
                                          
                                          

                                          (השמות בפועל קצת שונים ממה שכתבתי בהתחלה, כמובן שתיקנתי אצלי לפני שעדכנתי על השגיאה)

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

                                          dovidD תגובה 1 תגובה אחרונה
                                          0

                                          • 1
                                          • 2
                                          בא תתחבר לדף היומי!
                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • דף הבית
                                          • קטגוריות
                                          • פוסטים אחרונים
                                          • משתמשים
                                          • חיפוש
                                          • חוקי הפורום