2016-11-11 104 views
1

讓我從我沒有經驗豐富的VB開始,一直在絞盡腦汁想出了這件事......我看到了我不能解決的問題似乎把我厚厚的頭骨包裹起來,因爲我是一個新手。微軟Access - 表單列表框選擇作爲報表的數據需求

我有一個表格的數據庫。該表格有2個列表框「List1」和「發票類型」。每個都有獨特的價值。對於每個Unbound Listbox,我有一個「全選」和「清除選擇」按鈕,並且它們可以工作。

我有一個「StartDate」和「EndDate」,它們都適用於所有3個報告按鈕。我已經通過在查詢本身中使用它們作爲標準來完成此操作。

我的報告是「CompleteTransRPT」,「NoPaymentRPT」和「PaidRPT」。每個報告都有一個按鈕,除了通過列表框中選擇的內容之外,所有三個報告都可以工作。

我目前的代碼包括:

Private Sub Detail_Click() 

End Sub 

Private Sub BTNRunReport_Click() 
On Error GoTo BTNRunReport_Click_Err 

    DoCmd.OpenReport "CompleteTransRPT", acViewReport, "", "", acNormal 


BTNRunReport_Click_Exit: 
    Exit Sub 

BTNRunReport_Click_Err: 
    MsgBox Error$ 
    Resume BTNRunReport_Click_Exit 

End Sub 

Private Sub BTNPaidInvoices_Click() 
On Error GoTo BTNPaidInvoices_Click_Err 

    DoCmd.OpenReport "PaidRPT", acViewReport, "", "", acNormal 


BTNRunReport_Click_Exit: 
    Exit Sub 

BTNRunReport_Click_Err: 
    MsgBox Error$ 
    Resume BTNPaidInvoices_Click_Exit 

End Sub 

Private Sub DeSelectAllTeams_Click() 

    Dim varItm As Variant 

    With TeamName 

     For Each varItm In .ItemsSelected 
      .Selected(varItm) = False 
     Next varItm 

    End With 
End Sub 

Private Sub SelectAllTeams_Click() 

Dim i As Integer 

For i = 0 To Forms!InvoiceReporting!TeamName.ListCount - 1 
Forms!InvoiceReporting!TeamName.Selected(i) = True 
Next i 

End Sub 

Private Sub SelectAllInvoices_Click() 

Dim i As Integer 

For i = 0 To Forms!InvoiceReporting!InvoiceType.ListCount - 1 
Forms!InvoiceReporting!InvoiceType.Selected(i) = True 
Next i 

End Sub 

Private Sub DeSelectAllInvoices_Click() 

    Dim varItm As Variant 

    With InvoiceType 

     For Each varItm In .ItemsSelected 
      .Selected(varItm) = False 
     Next varItm 

    End With 
End Sub 

如何使用兩個列表框選定字段作爲什麼在報告中顯示的要求是什麼? 編輯:這裏是要求一個報表查詢

SELECT Almost.[Invoice #], Almost.[Invoice Date], Almost.[Invoice Amount], 
    Almost.Payment, Almost.Expression AS Due, Almost.[Invoice Type], 
    Almost.[Invoice Comments], Almost.[Team Name] 
FROM Almost 
WHERE (((Almost.[Invoice Date]) Between [Forms]![INVOICEREPORTING]![txtBeginDate] 
            And [Forms]![INVOICEREPORTING]![txtEndDate])); 

結束:

Option Compare Database 

Private Sub Detail_Click() 

End Sub 



Private Sub BTNRunReport_Click() 
On Error GoTo BTNRunReport_Click_Err 
    'DoCmd.OpenReport "CompleteTransRPT", acViewReport, , strFilter 
    Dim strFilter As String 
    Dim lSelCnt As Long 
    strFilter = "" 

    strWhere = GetValues(Me.TeamName, "Team Name", lSelCnt) 
    If lSelCnt >= 1 Then strFilter = strFilter & "(" & strWhere & ")" 

    lSelCnt = 0 
    strWhere = GetValues(Me.InvoiceType, "Invoice Type", lSelCnt) 
    If lSelCnt >= 1 Then 
     If Len(strFilter) > 0 Then 
      strFilter = strFilter & " AND (" & strWhere & ")" 
     Else 
      strFilter = strFilter & " (" & strWhere & ")" 
     End If 
    End If 


    Debug.Print strFilter 

    DoCmd.OpenReport "CompleteTransRPT", acViewReport, , strFilter 

BTNRunReport_Click_Exit: 
    Exit Sub 

BTNRunReport_Click_Err: 
    MsgBox Error$ 
    Resume BTNRunReport_Click_Exit 

End Sub 

Private Sub BTNPaidInvoices_Click() 
On Error GoTo BTNPaidInvoices_Click_Err 
'DoCmd.OpenReport "PaidRPT", acViewReport, , strFilter 
    Dim strFilter As String 
    Dim lSelCnt As Long 
    strFilter = "" 

    strWhere = GetValues(Me.TeamName, "Team Name", lSelCnt) 
    If lSelCnt >= 1 Then strFilter = strFilter & "(" & strWhere & ")" 

    lSelCnt = 0 
    strWhere = GetValues(Me.InvoiceType, "Invoice Type", lSelCnt) 
    If lSelCnt >= 1 Then 
     If Len(strFilter) > 0 Then 
      strFilter = strFilter & " AND (" & strWhere & ")" 
     Else 
      strFilter = strFilter & " (" & strWhere & ")" 
     End If 
    End If 


    Debug.Print strFilter 

    DoCmd.OpenReport "PaidRPT", acViewReport, , strFilter 

BTNPaidInvoices_Click_Exit: 
    Exit Sub 

BTNPaidInvoices_Click_Err: 
    MsgBox Error$ 
    Resume BTNPaidInvoices_Click_Exit 


End Sub 

Private Sub BTNUnPaidInvoices_Click() 
On Error GoTo BTNUnPaidInvoices_Click_Err 

    'DoCmd.OpenReport "CompleteTransRPT", acViewReport, , strFilter 
    Dim strFilter As String 
    Dim lSelCnt As Long 
    strFilter = "" 

    strWhere = GetValues(Me.TeamName, "Team Name", lSelCnt) 
    If lSelCnt >= 1 Then strFilter = strFilter & "(" & strWhere & ")" 

    lSelCnt = 0 
    strWhere = GetValues(Me.InvoiceType, "Invoice Type", lSelCnt) 
    If lSelCnt >= 1 Then 
     If Len(strFilter) > 0 Then 
      strFilter = strFilter & " AND (" & strWhere & ")" 
     Else 
      strFilter = strFilter & " (" & strWhere & ")" 
     End If 
    End If 


    Debug.Print strFilter 

    DoCmd.OpenReport "NoPaymentRPT", acViewReport, , strFilter 

    'DoCmd.OpenReport "NoPaymentRPT", acViewReport, "", "", acNormal 


BTNUnPaidInvoices_Click_Exit: 
    Exit Sub 

BTNUnPaidInvoices_Click_Err: 
    MsgBox Error$ 
    Resume BTNUnPaidInvoices_Click_Exit 

End Sub 

Private Sub DeSelectAllTeams_Click() 

    Dim varItm As Variant 

    With TeamName 

     For Each varItm In .ItemsSelected 
      .Selected(varItm) = False 
     Next varItm 

    End With 
End Sub 

Private Sub SelectAllTeams_Click() 

Dim i As Integer 

For i = 0 To Forms!INVOICEREPORTING!TeamName.ListCount - 1 
Forms!INVOICEREPORTING!TeamName.Selected(i) = True 
Next i 

End Sub 

Private Sub SelectAllInvoices_Click() 

Dim i As Integer 

For i = 0 To Forms!INVOICEREPORTING!InvoiceType.ListCount - 1 
Forms!INVOICEREPORTING!InvoiceType.Selected(i) = True 
Next i 

End Sub 

Private Sub DeSelectAllInvoices_Click() 

    Dim varItm As Variant 

    With InvoiceType 

     For Each varItm In .ItemsSelected 
      .Selected(varItm) = False 
     Next varItm 

    End With 
End Sub 


Function GetValues(lstbox As ListBox, lstField As String, lSelectedCnt As Long) As String 

    Dim varItem As Variant  'Selected items 
    Dim strWhere As String  'String to use as WhereCondition 
    Dim strDescrip As String 'Description of WhereCondition 
    Dim lngLen As Long   'Length of string 
    Dim strDelim As String  'Delimiter for this field type. 

    'strDelim = """" 

    'Loop through the ItemsSelected in the list box. 
    With lstbox 
     For Each varItem In .ItemsSelected 
      If Not IsNull(varItem) Then 
       'Build up the filter from the bound column (hidden). 
       strWhere = strWhere & "'" & strDelim & .ItemData(varItem) & strDelim & "'," 
       lSelectedCnt = lSelectedCnt + 1 
      End If 
     Next 
    End With 

    'Remove trailing comma. Add field name, IN operator, and brackets. 
    lngLen = Len(strWhere) - 1 
    If lngLen > 0 Then 
     GetValues = "[" & lstField & "] IN (" & Left$(strWhere, lngLen) & ")" 
    End If 

End Function 

它的工作原理,但如果有人看到任何問題,請讓我知道。我希望能夠在未來能夠幫助別人......我基本上使用別人的代碼,並將其工作,直到通過將來自不同站點的各種帖子合併爲止。

+1

只是因爲我不能幫助它(不是因爲它的任何有關你的問題),我要發表評論並說垂直空白和橫幅評論(這絕對是零的目的)是非常分散注意力,並損害你的代碼的可讀性。良好的評論應該說*爲什麼*,而不是*什麼* - 評論說,確切地說,代碼已經說了什麼,是壞評論。應刪除不良評論。 –

+1

「對報告中顯示的內容的要求」 - 搜索詞將是「過濾器」;-)您的報告查詢需要一個將這些參數值作爲參數的「WHERE」子句。因此,將您用於報告的查詢包括在內是相關的。 –

+0

爲了上帝的愛,請將您的按鈕名稱從'Command76'等更改爲有意義的東西。 – Andre

回答

0

對於多選列表框,這需要一些代碼。

您需要從列表框中爲[發票類型]構建動態篩選器,然後使用此篩選器打開報表。

所以你想要的是

' if Invoice Types are ID numbers: 
strFilter = "[Invoice Type] IN (4, 15, 77)" 
' or if Invoice Types are text: 
strFilter = "[Invoice Type] IN ('xx', 'yy', 'zz')" 

DoCmd.OpenReport "CompleteTransRPT", acViewReport, "", strFilter, acNormal 

以及如何獲得strFilter
通過連接所有列表框.ItemsSelected值,請參閱:

MS Access - Multi Select Listbox to delete records from table

https://stackoverflow.com/a/6075399/3820271

+0

請記住我是新手...... xx yy和zz代表什麼?因爲它們是文本值。 –

+0

它們是您的「發票類型」列表框中的選定值。上面的代碼只是一個靜態的例子 - 你實際上必須做的是動態構建strFilter,如鏈接問題所示。 – Andre

+0

是試圖消化文章/帖子 –