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

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

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

עזרה | הזנת ערך הפרמטר באקסס

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

    למה זה קורה
    כתבתי ביטוי בבונה, זה הביטוי:

    CostPerProduct: vb_AveragePerMonthlyProduct(vb0MN(),[IDLtem])*[SealsCM]
    

    כמובן כל השדות קיימים הכל כתוב נכון (ככל מה שידוע לי)

    ראוי לציין ששדה SealsCM הוא שדה מחושב באותה השאילתה

    תכלס בהפעלת השאילתה הוא מקפיץ חלון כזה
    e0a1cb25-0809-49e1-bd42-e10f22f3b01e-image.png

    לאחר שאני לוחץ אישור (בלי לכתוב כלום בפנים)
    אני מקבל את השדה מחושב בדיוק לפי מה שכתבתי בביטוי

    b40c9841-7fb5-450c-8527-6e51667fccc1-image.png

    מישהו יודע למה קופץ החלון הזה?
    ומה אני צריך לכתוב כדי שלא יקפוץ?

    ניתן לפנות אלי גם ב al0548446188@gmail.com
    ותמיד... אבל תמיד תוכלו לשאול אותי ב :) כאן שאלות באקסל

    S תגובה 1 תגובה אחרונה
    0
    • ליבלל מנותק
      ליבלל מנותק
      ליבל
      כתב ב נערך לאחרונה על ידי
      #2

      תנסה לשנות לסוגריים עגולות

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

        @ליבל אמר בעזרה | הזנת ערך הפרמטר באקסס:

        תנסה לשנות לסוגריים עגולות

        @ליבל לא עוזר

        ניתן לפנות אלי גם ב al0548446188@gmail.com
        ותמיד... אבל תמיד תוכלו לשאול אותי ב :) כאן שאלות באקסל

        chagoldC תגובה 1 תגובה אחרונה
        0
        • chagoldC מנותק
          chagoldC מנותק
          chagold
          השיב לאוריי ב נערך לאחרונה על ידי chagold
          #4

          @אוריי אולי ככה
          CostPerProduct: vb_AveragePerMonthlyProduct((vb0MN(),[IDLtem])*([SealsCM]))

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

            @chagold אמר בעזרה | הזנת ערך הפרמטר באקסס:

            @אוריי אולי ככה
            CostPerProduct: vb_AveragePerMonthlyProduct((vb0MN(),[IDLtem])*([SealsCM]))

            לצערי גם כך לא עובד

            ניתן לפנות אלי גם ב al0548446188@gmail.com
            ותמיד... אבל תמיד תוכלו לשאול אותי ב :) כאן שאלות באקסל

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

              @אוריי אמר בעזרה | הזנת ערך הפרמטר באקסס:

              לצערי גם כך לא עובד

              לא נראה שיש סיבה שהסוגריים יעזרו משהו.

              בעיה מוכרת.

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

              אולי @clickone יש לו יותר מידע מתי זה קורה.

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

                @מלא אמר בעזרה | הזנת ערך הפרמטר באקסס:

                @אוריי אמר בעזרה | הזנת ערך הפרמטר באקסס:

                לצערי גם כך לא עובד

                לא נראה שיש סיבה שהסוגריים יעזרו משהו.

                בעיה מוכרת.

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

                אולי @clickone יש לו יותר מידע מתי זה קורה.

                ככל הנראה זה מה שאני יעשה אבל זה לוקח הרבה משאבים לאקסס
                בכל אופן שאילתה על שאילתה זה מה ש @clickone הציע לי אבל זה לא יותר קצר מלעשות את החישוב גם בחדש

                ניתן לפנות אלי גם ב al0548446188@gmail.com
                ותמיד... אבל תמיד תוכלו לשאול אותי ב :) כאן שאלות באקסל

                OdedDvirO תגובה 1 תגובה אחרונה
                0
                • S מנותק
                  S מנותק
                  Shmuel754
                  השיב לאוריי ב נערך לאחרונה על ידי
                  #8

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

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

                    יש דרך ארוכה וקצרה ויש קצרה וארוכה:

                    הדרך הקצרה והארוכה

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

                    הדרך הארוכה והקצרה

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

                    כללי אצבע:

                    1. חישובים שאמורים להתבצע רק פעם אחת - לבצע רק פעם אחת ולשמור בטבלה.
                    2. להמנע כמה שניתן מלהכניס פונקציות בשאילתות. בפרט פונקציות שמוגדרות על ידי המשתמש.

                    זה נכון הן מבחינת יעילות:

                    • שאילתות רצות הרבה יותר מהר מקוד VBA באקסס, כי כל קריאה לפונקציה דורשת משאבים מהמערכת.
                    • אתה לא צריך לחשב חישובים מיותרים פעמיים (או יותר) כדי שהשאילתא תואיל בטובה לקבל את הערך של הפונקציה.
                    • שים לב שאפילו בפונקציות טריוויאליות, כמו Nz() או IsNull() עדיף לרשום בSQL טהור ולא לבצע קריאה ל-VBA, תשווה למשל בין:
                    IsNull(SomeField) AS ValueIsEmpty
                    

                    ל:

                    (SomeField Is Null) AS ValueIsEmpty
                    

                    הראשונה קוראת לפונקצית VBA בשם IsNull() בעוד השניה משתמשת רק בSQL והיא הרבה יותר מהירה.

                    דוגמה שניה:
                    תשווה בין:

                    Nz(Amount,0)
                    

                    ל:

                    IIf(Amount Is Null, 0, Amount)
                    

                    האופציה השנייה עדיפה בהרבה, כי היא משתמשת ב SQL טהור, ולכן

                    • אתה לא מבצע קריאה לפונקציה
                    • אתה שומר על טיפוס המשתנה בשדה (Data Type)
                    • הקריטריון (אם יש בשאילתה) מחושב נכון
                    • העמודה ממויינת נכון

                    (הערה: יש הבדל עצום בין IIF של SQL שהיא פונקציה יעילה, לבין IIF של VBA, שהוא פונקציה גרועה שמחשבת תמיד את שתי התוצאות האפשריות!)

                    והן מבחינת תחזוקה:

                    • לפעמים פונקציה כתובה לא נכון ומייצרת שגיאת ריצה שמוכפלת אלפי פעמים בשאילתא - תרחיש לא נעים בכלל הן לך כמפתח וכ"ש למשתמש.
                    • אם תרצה אי פעם לשדרג לבסיס נתונים אחר - הפונקציות לא יעבדו.
                    WWWW תגובה 1 תגובה אחרונה
                    6
                    • WWWW מנותק
                      WWWW מנותק
                      WWW
                      השיב לOdedDvir ב נערך לאחרונה על ידי WWW
                      #10

                      @odeddvir כל מילה פנינה!

                      @odeddvir אמר בעזרה | הזנת ערך הפרמטר באקסס:

                      לבין IIF של VBA, שהוא פונקציה גרועה שמחשבת תמיד את שתי התוצאות האפשריות!

                      מה ההסבר בזה? למה זה נצרך? הרי ב 90% מהמקרים זה לא נצרך, מה הסברא לעשות ברירת מחדל כזה?

                      WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                      OdedDvirO תגובה 1 תגובה אחרונה
                      0
                      • OdedDvirO מנותק
                        OdedDvirO מנותק
                        OdedDvir
                        השיב לWWW ב נערך לאחרונה על ידי OdedDvir
                        #11

                        @www אמר בעזרה | הזנת ערך הפרמטר באקסס:

                        מה ההסבר בזה? למה זה נצרך? הרי ב 90% מהמקרים זה לא נצרך, מה הסברא לעשות ברירת מחדל כזה?

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

                        Debug.Print MyMax(2, SquareRoot(2))
                        

                        התוכנה תחשב גם את השורש הריבועי של 2, עוד לפני הקריאה לפונקציה MyMax, למרות שבסוף לא תשתמש בו.
                        היתרון ב-IIF של SQL הוא שאם התנאי נכון, לא מבוצע חישוב של הפרמטר השני, והשאילתא מתעלמת ממנו.
                        הניחוש שלי הוא שב-VBA הפונקציה IIF מיושמת כפונקציה רגילה ולא כקיצור ל IF שלם, דהיינו:

                        IIF (Condition, A, B)
                        

                        אינו מיושם כ:

                        If (Condition) Then
                        Do A
                        Else
                        Do B
                        End If
                        
                        WWWW תגובה 1 תגובה אחרונה
                        3
                        • WWWW מנותק
                          WWWW מנותק
                          WWW
                          השיב לOdedDvir ב נערך לאחרונה על ידי WWW
                          #12

                          @odeddvir אמר בעזרה | הזנת ערך הפרמטר באקסס:

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

                          מי גילה למחשב (לפני החישוב של הפרמטר השני) שבסוף לא אשתמש בו?
                          משא"כ ב IIF יש הסתברות (ממוצעת) של 50% שלא אשתמש בתנאי השני.

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

                          WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                          OdedDvirO תגובה 1 תגובה אחרונה
                          0
                          • OdedDvirO מנותק
                            OdedDvirO מנותק
                            OdedDvir
                            השיב לWWW ב נערך לאחרונה על ידי
                            #13

                            @www אמר בעזרה | הזנת ערך הפרמטר באקסס:

                            שהפלטפורמה מיושנת

                            נכון. בשפות מתקדמות יותר קיים אופרטור יעיל לכך, למשל ב-C#:

                            condition ? consequent : alternative
                            

                            אם התנאי (condition) נכון, לא מבוצעת הערכה של הפרמטר השני (alternative)

                            WWWW תגובה 1 תגובה אחרונה
                            2
                            • WWWW מנותק
                              WWWW מנותק
                              WWW
                              השיב לOdedDvir ב נערך לאחרונה על ידי WWW
                              #14

                              @odeddvir אני מכיר את זה מפלטפורמות אחרות, בפלטפורמות הסטנדרטיות יש תמיד אפשרות של && ו || גם ב שתי תנאים של IF.

                              איך זה ב VBA? לדוגמה:

                              IF (a = 1 OR b = 2)
                              

                              WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                              OdedDvirO תגובה 1 תגובה אחרונה
                              0
                              • OdedDvirO מנותק
                                OdedDvirO מנותק
                                OdedDvir
                                השיב לWWW ב נערך לאחרונה על ידי OdedDvir
                                #15

                                @www אגב, המונח שאנו עוסקים בו נקרא Short-circuit evaluation.
                                לצערי הוא לא קיים בשפת VBA.
                                תמיד שני הצדדים יחושבו, דהיינו גם אם a = 1 עדיין תבוצע ההשוואה האם b=1 למרות שהתנאי הוא or והתוצאה היא ודאי אמת.

                                תגובה 1 תגובה אחרונה
                                3

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

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

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