Как я могу использовать OpenArgs для печати нескольких отчетов в ситуации цикла?

#for-loop #ms-access #vba #ms-access-2007 #openargs

#для цикла #ms-access #vba #ms-access-2007 #openargs

Вопрос:

Я уменьшаю свои базы данных, устраняю дублирующиеся отчеты, где могу, и создаю лучший код. У меня есть одна база данных, в которой участвуют наши сварщики и мастера. В этом коде я могу распечатать отчет для отдельного мастера, который отправляет строку «strActive» через openargs. Отчет просматривает strActive и в действии OpenForm устанавливает фильтр для активных, неактивных или всех сварщиков на основе переданного строкового значения.

Он отлично работает для одной страницы кода за раз. Там пользователь выбирает бригадира из списка или вводит номер часов бригадира. Запрос, на котором основан отчет, использует глобальную строку «ForemanCLK», чтобы получить результаты только для этого сварщика.

Раньше у меня было три отчета: один для всех сварщиков, один для активных сварщиков и один для неактивных сварщиков.

Ранее я устанавливал переменную на основе strActive и открывал соответствующий отчет, используя другую переменную в коде вместо имени отчета. Цикл работал нормально и открывал отчет 39 раз, каждый раз с новым именем и данными мастера.

Я озадачен тем, почему открытие отчета сейчас с помощью openarg не работает. Я получаю только первое имя бригадира, 39 раз. Я убедился, что получаю переменную foremanCLK разных мастеров, закомментировав строку docmd и debug.print(ввод) различные значения, необходимые для формы. Отчет просто не загружается правильно.

 Set rec = CurrentDb.OpenRecordset(sql)

    rec.MoveFirst

    For ctr = 0 To rec.RecordCount - 1
        ForemanCLK = rec(0).Value
        DoCmd.OpenReport "rptForeman", acViewNormal, , , , strActive
        'DoCmd.OpenReport "rptForeman", acViewNormal
    rec.MoveNext

    Next
 

Приведенный выше код дает мне много копий одного и того же отчета бригадира, отфильтрованного strActive

     For ctr = 0 To rec.RecordCount - 1
        ForemanCLK = rec(0).Value
        'DoCmd.OpenReport "rptForeman", acViewNormal, , , , strActive
        DoCmd.OpenReport "rptForeman", acViewNormal
    rec.MoveNext
 

Но это дает мне всех разных мастеров, за исключением того, что они не фильтруются.

Я попытался передать предложение Where.

 acViewNormal, ,"[active]=" amp; True
 

и

 acViewNormal, ,"[active]=" amp; False
 

и

 acViewNormal, ,"[active]=" amp; True amp; " OR [active]=" amp; False
 

Я выполнил ту же проверку с одним отчетом, и он фильтрует правильно, но в цикле он вообще не фильтрует. Однако это дает мне разных мастеров.

Большой вопрос здесь…

ПОЧЕМУ? У access недостаточно времени между отчетами, чтобы закрыть его, и поэтому он не выполняет операции с событием open?

Есть еще идеи?

Ответ №1:

Вы должны явно закрыть отчет внутри вашего цикла : DoCmd.Close acReport, "rptForeman" . Если OpenReport вызывается во второй раз для уже открытого отчета, объект получает фокус в access, но он не запускает событие Open повторно.

Комментарии:

1. Я никогда не использовал приведенный выше код, и у меня не было проблем с созданием нескольких отчетов в цикле, при использовании acView Normal Даже приведенный выше код (минус OpenArgs) будет генерировать несколько отчетов с разными именами, каждый раз получая данные из запроса. Проблема, похоже, только в фильтре. Тем не менее, мне нравится идея использования этого кода при использовании acViewReport, чтобы иметь возможность закрыть отчет, если он теряет фокус или другие ошибки. Спасибо!

Ответ №2:

Хорошо, я должен повесить голову от стыда.

Я с ошибкой проверил весь приведенный выше код, используя все переменные, кроме strActive.

Когда я добавил это в свою строку debug.print, ничего не получилось. Как это может быть !?!!??

Я просто забыл установить это в начале подраздела, как я сделал с другим действием, которое открывает один отчет. strActive — это глобальная переменная, но она не была установлена ни в какой другой точке кода до этого фрагмента.

Как только это было добавлено в начало подраздела, все работало нормально.