יצירת מסנן לדו"ח באקסס עם תנאים
-
@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
-
@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 נתקע, כשעשיתי את התיבות סימון לבד, זה עבד יופי.
-
@hp079 כתב ביצירת מסנן לדו"ח באקסס עם תנאים:
DynamicCondition = IIf(Len(DynamicCondition) > 0, " AND ", "") & "agent LIKE %" & "agent" & "%"
יש לך גרשיים מיותרות מסביב למשתנה
agent
. אתה צריך לרשום כך:DynamicCondition = IIf(Len(DynamicCondition) > 0, " AND ", "") & "agent LIKE %" & agent & "%"
כשה-
agent
האחרון בשורה מתייחס לשם של פקד תיבת הטקסט בטופס המכיל את שם הסוכן לחיפוש. -
@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
-
@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
-
@hp079 אם תצרף את נוסח השגיאה אוכל להתייחס.
הגרסא של @dovid יותר תיקנית, רק שבטעות נעלם ממנו ריפוד הרווחים מסביב לאופרטור, וצ"ל כך:result = result & col(i) & " " & operator & " "
אפשר גם לבודד כל תנאי על ידי סוגריים, כדי למנוע בעיות קדימות במקרים מסויימים:
result = result & "(" col(i) & ") " & operator & " " Next result = result & "(" col(i) & ")"
-
@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