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

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

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

יצירת מסנן לדו"ח באקסס עם תנאים

מתוזמן נעוץ נעול הועבר תכנות
12 פוסטים 4 כותבים 381 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • hp079H מנותק
    hp079H מנותק
    hp079
    השיב לOdedDvir ב נערך לאחרונה על ידי
    #3

    @OdedDvir לא ממש הבנתי כיצד אני כותב את התנאים לתיבות סימון תלת מצבית ולתיבות הטקסט...

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

      @hp079 לתיבת סימון תלת מצבית שלושה ערכים אפשריים:
      True, False, Null. הערך Null משמעותו ללא סימון.
      אם אין סימון בתיבה זו, מסתמא הלוגיקה היא לא לסנן לפיה, לכן בשורה:

      If (Not IsNull(chkSet_ok)) Then
      

      אתה מוודא שהתיבה מסומנת, כלומר אם היא לא מכילה Null, ואם כן, השורה:

      DynamicCondition="Ok=" & CStr(chkSet_ok)
      

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

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

      If (Len(txtSearchFirstName) > 0) Then
         DynamicCondition=IIF(Len(DynamicCondition)>0, " AND ", "") & "FirstName LIKE %" & txtSearchFirstName & "%"
      End If
      
      hp079H תגובה 1 תגובה אחרונה
      6
      • hp079H מנותק
        hp079H מנותק
        hp079
        השיב לOdedDvir ב נערך לאחרונה על ידי hp079
        #5

        @OdedDvir עשיתי כך

        Dim DynamicCondition As String
        DynamicCondition = ""
        ' Add first condition
        If (Not IsNull(Set_ok)) Then
           DynamicCondition = "ok=" & CStr(Set_ok)
        End If
        
        If (Not IsNull(done)) Then
           DynamicCondition = "done=" & CStr(done)
        End If
        
        If (Len(agent) > 0) Then
           DynamicCondition = IIf(Len(DynamicCondition) > 0, " AND ", "") & "agent LIKE %" & "agent" & "%"
        End If
        
        ' Open report with all my conditions:
        DoCmd.OpenReport "logForOne", acViewPreview, WhereCondition:=DynamicCondition
        

        אבל התנאי של תיבת הטקסט "agent" על השדה agent נתקע, כשעשיתי את התיבות סימון לבד, זה עבד יופי.

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

          @hp079 כתב ביצירת מסנן לדו"ח באקסס עם תנאים:

          DynamicCondition = IIf(Len(DynamicCondition) > 0, " AND ", "") & "agent LIKE %" & "agent" & "%"

          יש לך גרשיים מיותרות מסביב למשתנה agent. אתה צריך לרשום כך:

          DynamicCondition = IIf(Len(DynamicCondition) > 0, " AND ", "") & "agent LIKE %" & agent & "%"
          

          כשה-agent האחרון בשורה מתייחס לשם של פקד תיבת הטקסט בטופס המכיל את שם הסוכן לחיפוש.

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

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

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

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

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

              כתשובת המשקל, עכשיו אני אחיל קצת עקרונות תכנות, ואכתוב את הכל מחדש כך:

              Dim DynamicCondition As String
              
              Private Sub AddCondition(ByRef currentCondition As String, conditionToAdd As String)
              Begin
                 If (Len(currentCondition)=0) Then
                    currentCondition = conditionToAdd
                 Else
                    currentCondition = currentCondition & " AND " & conditionToAdd
                 End If
              End
              
              DynamicCondition=""
              ' Add first condition
              If (Not IsNull(chkSet_ok)) Then AddCondition DynamicCondition, "Ok=" & CStr(chkSet_ok)
              ' Add second condition:
              If (Not IsNull(chkDone)) Then AddCondition DynamicCondition, "Done=" & CStr(chkDone)
              ' Add more conditions
              If (Only_Bar_Mitsva) Then AddCondition DynamicCondition, "Age>=13"
              ...
              ' Open report with all my conditions:
              DoCmd.OpenReport "MyReport", acViewNormal, WhereCondition:=DynamicCondition
              
              dovidD hp079H 2 תגובות תגובה אחרונה
              3
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                השיב לOdedDvir ב נערך לאחרונה על ידי dovid
                #9

                @OdedDvir גירסה שלי:

                Dim DynamicCondition As New Collection
                
                If Not IsNull(chkSet_ok) Then DynamicCondition.Add "Ok=" & CStr(chkSet_ok)
                If Not IsNull(chkDone) Then DynamicCondition.Add "Done=" & CStr(chkDone)
                If Only_Bar_Mitsva Then DynamicCondition.Add "Age>=13"
                
                DoCmd.OpenReport "MyReport", acViewNormal, WhereCondition:=JoinCollection(DynamicCondition, "AND")
                

                JoinCollection:

                Function JoinCollection(col As Collection, operator As String)
                    Dim result As String
                    For i = 1 To col.Count - 1
                       result = result & col(i) & operator
                    Next
                    result = result & col(i)
                    JoinCollection = result
                End Function
                

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

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

                OdedDvirO תגובה 1 תגובה אחרונה
                3
                • hp079H מנותק
                  hp079H מנותק
                  hp079
                  השיב לOdedDvir ב נערך לאחרונה על ידי
                  #10

                  @OdedDvir @dovid תודה אבל זה לא עובד, הוא מקפיץ שגיאה כל פעם משהו אחר.

                  עשיתי קובץ דוגמה עם מה שהבנתי ואיפה שהסתבכתי
                  דוגמה.accdb

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

                    @hp079 אם תצרף את נוסח השגיאה אוכל להתייחס.
                    הגרסא של @dovid יותר תיקנית, רק שבטעות נעלם ממנו ריפוד הרווחים מסביב לאופרטור, וצ"ל כך:

                         result = result & col(i) & " " & operator & " "
                    

                    אפשר גם לבודד כל תנאי על ידי סוגריים, כדי למנוע בעיות קדימות במקרים מסויימים:

                          result = result & "(" col(i) & ") " & operator & " "
                       Next
                       result = result & "(" col(i) & ")"
                    
                    תגובה 1 תגובה אחרונה
                    2
                    • א מנותק
                      א מנותק
                      ארי
                      השיב לhp079 ב נערך לאחרונה על ידי ארי
                      #12

                      @hp079 לפי הדוגמא שלך זה הקוד שאתה צריך

                      Private Sub פקודה16_Click()
                      Dim DynamicCondition As New Collection
                      
                      If Not IsNull(ts_active) Then DynamicCondition.Add "פעיל=" & ts_active
                      If Not IsNull(ts_conected) Then DynamicCondition.Add "מחובר=" & ts_active
                      If Len(txt_sug) > 0 Then DynamicCondition.Add "סוג='" & CStr(txt_sug) & "'"
                      If Len(txt_name) > 0 Then DynamicCondition.Add "שם='" & CStr(txt_name) & "'"
                      
                      DoCmd.OpenReport "דוח1", acViewPreview, WhereCondition:=JoinCollection(DynamicCondition, " AND ")
                      End Sub
                      
                      Function JoinCollection(col As Collection, operator As String)
                          Dim result As String
                          For i = 1 To col.Count
                              If i <> 1 Then result = result & operator & " "
                              result = result & "(" & col(i) & ") "
                          Next
                          JoinCollection = result
                      End Function
                      

                      הקרדיט כמובן ל @dovid ו @OdedDvir

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

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

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

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