Кешированные ReportDocuments
Теперь давайте рассмотрим функции Crystal Reports for Visual Studio .NET для кешированных отчетов. Перетащите разработчик компонентов ReportDocument на плоскость разработки ViewReport.aspx и выберите ProjectName.CustomersBasic из Name: комбинированного списка в диалоговом окне Choose a ReportDocument, не нажимая кнопку OK. Обратите внимание на флажок "Generate cached strongly typed report" ("Создать кешированный строго типизированный отчет") (см. рис.11).
Рис. 11 Функция кешированных отчетов
Установите этот флажок. Щелкните по кнопке OK и назовите созданный компонент как ccbMain. Затем, свяжите элемент управления просмотра с этим объектом в событии Page_Load с помощью следующей строки программы:
cvwMain.ReportSource = ccbMain
Перетащите элементы управления Data Time и Print Time в раздел заголовка страницы отчета. Эти элементы управления можно найти в окне Field Explorer под узлом Special Fields. Затем запустите приложение и просмотрите отчет. Когда вы его запустите в первый раз, элементы управления Data Time и Print Time должны быть одинаковыми (или же очень похожими). Но если вы обновите страницу, то увидите, что Print Time продолжает обновляться, а Data Time остается одним и тем же. Теперь скопируйте текущий адрес URL обозревателя в буфер обмена и закройте обозреватель. Откройте окно нового обозревателя и вставьте в него указанный адрес URL для просмотра отчета в новом сеансе (без перестройки сборки из Visual Studio .NET). Вы увидите, что исходная временная метка будет отображаться в Data Time.
Теперь закройте обозреватель и вернитесь в Visual Studio .NET. Снова перетащите дизайнер компонентов ReportDocument на плоскость разработки ViewReport.aspx и выберите ProjectName.CustomersBasic, сняв флажок "Generate cached strongly typed report". Щелкните по кнопке OK и назовите созданный компонент как "cbsMain". После завершения данной операции свяжите элемент управления просмотра с созданным объектом в событии Page_Load, внеся в программу имя нового компонента:
cvwMain.ReportSource = cbsMain
Запустив приложение, просмотрите отчет и обновите несколько раз страницу. При этом вы увидете, как будет изменяться элемент управления Data Time при каждом обновлении. Эта операция наглядно продемонстрирует вам основное различие между кешированными и некешированными отчетами: кэширование позволяет избежать лишних обращений к базе данных, когда уже есть требуемые данные.
Когда вы используете атрибуты DataDefinition или Database объекта cbsMain (экземпляр моего некешированного ReportDocument) для задания значений параметров или атрибутов входа в таблицы, обратите внимание, что ccbMain (экземпляр кешированного ReportDocument) не имеет таких атрибутов. Как использовать кешированные отчеты по отношению к защищенным таблицам и параметризованным хранимым процедурам? Ключ лежит в программе, расположенной позади строго типизированного отчета. Снова щелкните по кнопке Show All Files (Показать все файлы) в Solution Explorer, перейдите к CustomersBasic.rpt и откройте позади него файл программы. Вы уже были здесь, но сейчас вам следует открыть программу для класса CachedCustomersBasic, содержащуюся в этом файле.
Обратите внимание, что программа создает новый экземпляр некешированного класса CustomersBasic для своего метода CreateReport, поскольку CachedCustomersBasic в действительности содержит CustomersBasic. Таким образом, я могу написать настраиваемую программу в этом общедоступном методе, чтобы иметь доступ к атрибутам Database и DataDefinition как созданного экземпляра класса CustomersBasic, так и интерфейса с защищенными объектами базы данных и параметризованными хранимыми процедурами. Если я применяю этот метод, то при создании нового экземпляра кешированного отчета будет создаваться соответствующий сконфигурированный экземпляр некешированного строго типизированного отчета.
Теперь прокрутите несколько вниз, чтобы увидеть снабженную комментариями программу для другого важного метода, GetCustomizedCacheKey. Этот метод генерирует уникальный ключ, который определяет, будет ли использоваться копия кешированного отчета для выполнения запроса.
Если ключ совпадает с ключом кешированного отчета, то будет использоваться кешированная копия. Если не совпадает, то данные будут выбираться заново.
Если вы убрали из программы комментарии, то специальная функция BuildCompleteCacheKey сгенерирует уникальный ключ для конкретного отчета. Раскомментированная программа, которая во всем остальном оставлена без изменений, выполняется так же как программа с комментариями. Если этот ключ не модифицируется, то Crystal Reports неявно использует алгоритм BuildCompleteCacheKey для создания вашего ключа. Это подходит для многих случаев. Но что делать, если вам требуется модифицировать ключ? Предположим, вы узнали, что в какой-то момент времени ваши данные значительно изменились. Тогда вы могли бы приписать к ключу кеша свою строку, чтобы обеспечить его изменение в этот момент времени или после него. Приведем тривиальный пример: раскомментируйте программу в GetCustomizedCacheKey и вставьте перед оператором Return следующую строку:
key &= DatePart(DateInterval.Minute, Now())
Эта строка прозволяет генерировать новый ключ кеша в тот момент, когда текущее время изменяется на одну минуту. В событии Page_Load класса ViewReport.aspx укажите ccbMain для cvwMain.ReportSource, затем запустите приложение и обновите несколько раз страницу. При этом вы увидите изменение в Data Time, которые происходят, когда минутный отсчет фактического времени увеличивается на единицу. Подобным образом можно приписать к ключу кеша значения различных параметров и другие детали, связанные с данными, чтобы избежать обработки одних и тех же кешированных данных при прогонах отчета. Можно создать собственный ключ, не просто прибавляя кое-какие строки к ключу кеша по умолчанию, но написав его целиком с самого начала; но этот метод я не буду рекомендовать хотя бы потому, что это все равно, что изобретать колесо.
Конечно, эти изменения в классе строго типизированных отчетов весьма полезны, но они связаны с некоторым риском, поскольку при обновлении отчета Visual Studio .NET попытается переписать файл класса этого отчета и, если не принять соответствующих мер, то вы потеряете внесенные изменения.Чтобы этого избежать, вам следует создать собственный класс, реализующий IcachedReport с программой из класса CachedCustomersBasic. После этого вы сможете создать в ViewReport.aspx, а именно в событии Page_Load, экземпляр этого класса и указать на него в cvwMain.ReportSource. На Figure 12 показана программа для данного класса (включая программу, использующую объект ASP.NET Request для задания значения поля параметра отчета и для добавления этого значения в ключ кеша), а также программа (см. ниже), демонстрирующая код события Page_Load, который требуется для ее использования.
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim mcrMain As New cMSDNCachedReport()
McrMain.ASPRequest = Request
CvwMain.ReportSource = mcrMain
End Sub
Содержание раздела