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

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

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

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

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

    @hp079 אפשר.
    הואיל ואתה רוצה להבין את התהליך, אתן לך את הכיוון, ומשם תוכל להמשיך לבד.
    בתחביר פתיחה של דוח, ניתן להגדיר מסנן או תנאי:

    OpenReport ReportName, View, FilterName, WhereCondition, WindowMode, OpenArgs
    

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

    Dim DynamicCondition As String
    DynamicCondition=""
    ' Add first condition
    If (Not IsNull(chkSet_ok)) Then
       DynamicCondition="Ok=" & CStr(chkSet_ok)
    End If
    ' Add second condition:
    If (Not IsNull(chkDone)) Then
       DynamicCondition=IIF(Len(DynamicCondition)>0, DynamicCondition & " AND ", "") & "Done=" & CStr(chkDone)
    End If
    ' Add more conditions
    If (Only_Bar_Mitsva) Then
       DynamicCondition=IIF(Len(DynamicCondition)>0, DynamicCondition & " AND ", "") & "Age>=13"
    End If
    ...
    ' Open report with all my conditions:
    DoCmd.OpenReport "MyReport", acViewNormal, WhereCondition:=DynamicCondition
    
    hp079H תגובה 1 תגובה אחרונה
    5
    • 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
                        • דף הבית
                        • קטגוריות
                        • פוסטים אחרונים
                        • משתמשים
                        • חיפוש
                        • חוקי הפורום