2015-03-12 3 views
1

Предположим, у меня есть одна таблица под названием «Клиенты». Он содержит 2 поля:Отобразить несколько конкретных записей в отчете

Name 
Address 

Я хочу, чтобы пользователи могли выбирать несколько записей, выбирая их имена. Например, что-то вроде наличия окна списка, содержащего все имена записей в базе данных. Я хочу, чтобы пользователи могли выбрать несколько элементов, как:

Dave Richardson 
Bob Smith 
Sophie Parker 

, а затем отображать только записи с этими именами в отчете.

+0

Возможно, для этого вам понадобится VBA. Хотите ли вы? – PaulFrancis

+0

Да, я ожидал, что он потребует VBA. Это нормально со мной. К сожалению, это требование моей базы данных, и Google не предоставляет большую помощь. –

ответ

3

Вы можете использовать опцию WhereCondition для DoCmd.OpenReport Method, чтобы отфильтровать отчет по мере необходимости.

Const cstrReport As String = "YourReportNameHere" 
Dim custNames As String 
Dim lItem As Variant 
Dim strWhereCondition As String 

With Me.yourListBoxName 
    For Each lItem In .ItemsSelected 
     custNames = custNames & ",'" & Replace(.ItemData(lItem), "'", "''") & "'" 
    Next 
End With 

If Len(custNames) > 0 Then 
    custNames = Mid(custNames, 2) 
    strWhereCondition = "[Name] IN (" & custNames & ")" 
End If 

DoCmd.OpenReport ReportName:=cstrReport, View:=acViewPreview, _ 
    WhereCondition:=strWhereCondition 

Примечание Этот подход имеет общие черты с ответом PaulFrancis. Фактически, я скопировал его код и изменил его. Главное отличие заключается в том, что этот подход не требует пересмотра сохраненного запроса для фильтрации отчета.

+1

Ханс, я не мог разобраться с использованием предложения IN в методе OpenReport, поэтому моя стратегия по изменению запроса, я подумал об этом для начала. Ну, новый урок узнал. Спасибо (+1) – PaulFrancis

+1

Добро пожаловать, PF. Я ценю ваши вклады и рад, что вы нашли это полезным. Приветствия. – HansUp

2

Установки, которые у меня есть, это форма с SubForm и ListBox, Listbox будет иметь имена всех ваших клиентов. Так RowSource будет,

SELECT 
    customerNameFieldName 
FROM 
    yourTableName; 

Свойство Multi Select будет настроен на Extended. Затем кнопка будет иметь следующий код, который будет генерировать SQL для источника записей SubForm.

Private Sub buttonName_Click() 
    Dim lItem As Varaint, strSQL As String 
    Dim custNames As String, whereStr As String 
    Dim dbObj As dao.Database 
    Dim tmpQryDef As QueryDef 

    Set dbObj = CurrentDb() 

    For Each lItem In Me.yourListBoxName.ItemsSelected 
     custNames = custNames & "'" & Me.yourListBoxName.ItemData(lItem) & "', " 
    Next 

    Id Len(custNames) <> 0 Then 
     custNames = Left(custNames, Len(custNames) - 2) 

     whereStr = "WHERE customerNameFieldName IN (" & custNames & ")" 
    End If 

    strSQL = "SELECT someFields FROM someTable " & whereStr 

    Set tmpQryDef = dbObj.QueryDefs("Summary 3 Q1") 
    tmpQryDef.SQL = strSQL 

    DoCmd.OpenReport "yourReportName", acViewNormal 

    Set dbObj = Nothing 
    Set tmpQryDef = Nothing 
End Sub 

Так что теперь подчиненной будет иметь RecordSource, основываясь на всей информации, которую вы выбрали в ListBox.

+0

Также не забудьте установить для списка многостраничные свойства как простые, так и расширенные. – EvDev

+0

@EvDev, думал, что я уже упоминал это;) – PaulFrancis

+0

Выглядит очень многообещающе, я старался адаптировать его к своей ситуации, но безуспешно. У меня есть форма с полем списка на мультиэлементе, содержащем имена, но кнопка должна открыть отчет. Этот отчет уже существует, и в основном это будет дополнительная функция. Как я могу применить это к моей ситуации? Many Thanks –

Смежные вопросы