2010-10-01 2 views
0

В Access 2007 у меня есть форма, позволяющая просматривать и экспортировать параметры отчетов проекта.DoCmd.OutputTo On Report Not Unload

DoCmd.OutputTo, похоже, странно ведет себя при работе с отчетами, для которых свойство Modal установлено в true. В настоящее время модальное значение установлено в True в событии Open для всех отчетов, с которыми я работаю.

Если я

DoCmd.OpenReport szReportName, acViewPreview 
DoCmd.Close acReport, szReportName

Затем фокус и управление возвращается в исполняющем форме нормально.

Если экспортировать непосредственно, а и использовать

DoCmd.OutputTo acOutputReport, szReportName

Затем отчет правильно экспортируется, но контроль никогда не возвращается к исполняющему форме. Он полностью отключен. Тот же код работает очень хорошо, если я использую Modal = False при открытии отчета. Я немного экспериментировал с крючками событий отчета, чтобы попытаться выяснить, в чем разница, и OnUnload никогда не попадает после вызова OutputTo.


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

Таким образом, фактические вопросы:

  1. Есть ли хорошая причина для OutputTo не триггер событие Unload? Если это нормальное поведение, то прекрасно, но я бы хотя бы хотел понять причину этого.
  2. Есть ли способ экспортировать модальный отчет и все еще восстановить контроль над другими окнами? Или, по крайней мере, не-хакерский способ повторного включения и уделения внимания вызывающей форме?

ответ

0

Ваш первый код:

DoCmd.OpenReport szReportName, acViewPreview 
    DoCmd.Close acReport, szReportName 

... будет ошибка, если отчет является модальным. Причина, почему вторая строка не может быть выполнена до тех пор, пока отчет, открытый в первой строке, не будет закрыт. Итак, как только вы перейдете ко второй строке, вы получите сообщение об ошибке, потому что отчет больше не открывается.

Что вам нужно сделать, это не установлено модальность в листе свойств отчета, но в команде DoCmd.OpenReport:

DoCmd.OpenReport szReportName, acViewPreview, , , acDialog 

Переключатель acDialog открывает его покадрово, и код паузы, пока отчет не будет закрывается, а затем продолжается.

Но когда вы используете DoCmd.OutputTo, он будет вести себя нормально, потому что отчет не является модальным.

В общем случае в формах доступа и отчетах вам совсем не нужно устанавливать свойство Modal, так как вы всегда можете его открыть во время выполнения.

Я не знаю, почему вы полагаете, что вам нужно установить модальное свойство в событии OnOpen отчета вообще. Там нет никакого кода, и я не думаю, что это хорошее место для его изменения (и ожидал, что он не будет работать в первую очередь, поскольку вы не можете изменить режим окна после того, как окно уже создано , возможно, OnOpen выполняется до создания видимого окна?).

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

+0

Я согласен с тем, что установка модального (или любого) свойства в коде отчета менее желательна. Честно говоря, я не сказал, что я просто пытаюсь сохранить прежнее поведение. Я считаю, что Modal использовался вместо acDialog, потому что мы не хотели, чтобы отчет находился в режиме PopUp. Несмотря на это, я сопротивлялся acDialog, потому что он ведет себя иначе, чем свойство Modal - он все же позволяет мне переключать фокус на вызывающую форму. Я забыл, что это действительно должно быть одно и то же, поэтому мне кажется, что я должен искать что-то еще не так с отчетом, который вызывает acDialog, чтобы он не вел себя модально. – Jelly

+0

Popup и Modal - это две совершенно разные пропозиции, и открытие формы или отчета с помощью acDialog НЕ приводит к тому, что форма/отчет находятся в режиме Popup. В принципе, насколько я могу судить, acDialog вызывает игнорирование свойств Modal и Popup. –

+0

Я только что протестировал отчет, открытый с помощью командной кнопки с помощью acDialog, и неважно, какие были установлены свойства Modal/Popup, я не мог настроить фокус на форму вызова до тех пор, пока превью отчета не будет закрыт. –