Отчет MS Access - Изменить RecordSource с VBA, используя параметр из главной формы - PullRequest
0 голосов
/ 20 ноября 2018

Я не осознавал, что мое первоначальное сообщение (которое я удалил) публиковалось под учетной записью новичка - извинения ......

В любом случае, вот моя проблема:

У меня есть основная форма, в которой перечислены различные «Консультанты».Эта основная форма также имеет параметры «Тип консультанта», «Дата начала» и «Дата окончания», которые можно использовать для фильтрации списка.

Для этого необходим отчет с перечнем «Консультанты» определенного типа.Имейте в виду, что этот фильтр «типа» может применяться к любому из 4 различных полей типа («type1», «type2», «type3», «type4»).

Что я хочу Чтобы сделать это, поместите кнопку, которая запускает отчет, в основную форму, потому что параметр «Тип консультанта» уже существует.Затем я хочу сгенерировать SQL на основе этого параметра (и параметра даты, который я уже сделал) и использовать этот набор записей для заполнения отчета.

SQL работает нормально, но полученные данные нене передается в отчет, поэтому я получаю всех записей, а не только те, которые мне нужны.Источник данных объекта отчета устанавливается в фоновую таблицу для заполнения полей / текстовых полей.

Вот код

На главной форме

Private Sub Button_Click()
Dim s As String
If IsNull(Me.Type.Value) Then
        MsgBox "Please Select a Type", vbCritical, "Report Error"
    Else
        s = "Select Consultant.* from Consultant "
        s = s & "Where ((consultant.typeone = '" & Me.Type.Value & "') OR (Consultant.typetwo = '" & Me.Type.Value & "') OR (Consultant.typethree = '" & Me.Type.Value & "') OR (Consultant.typefour = '" & Me.Type.Value & "'))"
        s = s & "And (((Consultant.[End date]) <= DateAdd(""d"", -730, Now()))) ORDER BY Consultant.Last_Name"
        DoCmd.OpenReport "RptList", acViewPreview, , , acDialog
    End If

End Sub

Теперь, очевидно, все складывается, когда я открываю отчет, потому что в DoCmd нет ничего, что говорит "Использование этого набора записей".И это моя проблема.

Я стараюсь не создавать отдельную небольшую выпадающую форму для заполнения части данных, которые находятся прямо передо мной.Кроме того, подключение SQL непосредственно к источнику записей отчета с использованием форм! [MainForm]! [Type]. Значение для переменных «Type» не работало.Я подозреваю, что это может быть связано с тем, что форма не активна при нажатии кнопки отчета?

Я думал, что QueryDef может работать.Но я не понимаю, как это реализовать, чтобы знать, сработает ли это.И я гуглил по кругу ......

Я не знаю, что мне не хватает.ПОМОГИТЕ!

1 Ответ

0 голосов
/ 21 ноября 2018

AS C Perkins Предложил использовать условие where в docmd.Openreport

Что-то вроде

    DoCmd.OpenReport "RptList", acViewPreview, , , acDialog, wherecondition:="consultant.typeone = "  & Me.Type.Value

Другой способ - вы можете создать объект с помощью Query def и использовать его для изменения запроса ввремя выполнения на основе выбранных пользователем критериев.

попробуйте вот так

сохраните Report_Query в MsAccess и используйте этот запрос в качестве источника записей для вашего отчета

Dim s as string

 s = "Select Consultant.* from Consultant "
 s = s & "Where ((consultant.typeone = '" & Me.Type.Value & "') OR (Consultant.typetwo = '" & Me.Type.Value & "') OR (Consultant.typethree = '" & Me.Type.Value & "') OR (Consultant.typefour = '" & Me.Type.Value & "'))"
 s = s & "And (((Consultant.[End date]) <= DateAdd(""d"", -730, Now()))) ORDER BY Consultant.Last_Name"

CurrentDb.QueryDefs("Report_Query").sql = s

DoCmd.OpenReport "RptList", acViewPreview, , , acDialog
...