15 ГЛАВА Составление отчетов на основе баз данных SQL П о причине постоянного появления новых усовершенствованных приложений для работы с базами данных, базы данных персональных компьютеров (ПК) используются все реже и реже. Низкая производительность и ограничения по объему локальных баз данных ПК часто ограничивают их пригодность для больших приложений, критичных к производительности. В то же время большая часть более новых приложений полагается на системы баз данных типа клиент-сервер. Система типа клиент-сервер включает две части: клиент — обычно запускаемое на ПК программное обеспечение, такое как Crystal Reports, или приложение для ввода данных, и сервер — более мощная машина старшей модели, работающая под управлением Windows 2000 Server или Windows Server 2003, или даже мэйнфрейм. Сервер обслуживает базу данных, а клиент передает серверу запросы на доступ к базе данных. Существует множество различных баз данных клиент-серверного типа, среди которых наиболее популярными являются Microsoft SQL Server, Oracle, IBM DB/2 и Informix. Внимание! Некоторые базы данных SQL и методы доступа к ним могут использоваться только с такими версиями Crystal Reports, как Professional или Developer. Версия Standard Edition позволяет составлять отчеты на основе ограниченного набора баз данных. При желании располагать максимальной гибкостью при работе с базами данных, имеет смысл приобрести версию Professional или Developer. Важно понимать и четко разграничивать отличия между системой баз данных типа клиент-сервер и системой баз данных ПК, установленной в совместно используемой локальной сети. Что касается непосредственно составления отчетов, то с системой управления базами данных, работающей в локальной сети, связано намного больше трудностей в плане производительности, нежели с системой управления базами данных типа клиентсервер. На рис. 15.1 показан ПК, который генерирует отчеты, используя две разных базы данных: первая — база данных Microsoft Access, расположенная на сервере локальной сети, а вторая — та же самая база данных, но в системе SQL Server. Сценарий с локальной сетью влечет за собой большую нагрузку как на сеть, так и на ПК, выдающий запрос на создание отчета. При таком сценарии ПК должен прочитать Book_CR11.indb 415 27.06.2006 1:06:27 416 Часть I. Проектирование отчетов через сеть всю базу данных Access, включающую 100 000 записей, просматривая и выбирая записи, отвечающие заданным в отчете критериям. Это требует передачи через сеть огромного объема данных, и ПК приходится выполнять все логические задачи выбора записей самостоятельно. ПК должен передавать все 100 000 записей через сеть, сохраняя у себя только 1000 записей Локальная сеть ПК F:\Accounts.MDB 100 000 записей Сервер локальной сети Клиент отправляет SQLоператор серверу, запрашивая только необходимые записи Локальная или глобальная сеть ПК AccountsSQL 100 000 записей Сервер SQL Сервер читает базу данных и выбирает 1000 затребованных записей, пересылая клиенту только их Рис. 15.1. Извлечение 1000 специфических записей из базы данных локальной сети и базы данных клиент-серверного типа Клиент-серверная среда намного более эффективна. Клиентский ПК просто делает запрос к серверу базы данных с помощью оператора SQL (Structured Query Language — язык структурированных запросов). Сервер базы данных (предположительно более мощный ПК, работающий под управлением Unix компьютер или мэйнфрейм) выполняет специальное программное обеспечение управления базами данных, разработанное для эффективной обработки таких запросов. Он напрямую делает запрос к базе данных, содержащей 100 000 записей, и отсылает через сеть только 1000 запрошенных записей. При таком сценарии нагрузка клиента и сети минимальна, да и весь процесс обычно занимает гораздо меньше времени. Подключение к базам данных SQL Первое, что необходимо сделать при создании отчета Crystal Reports — выбрать базу данных SQL, на которой этот отчет будет основываться. Существуют три основных метода, которые в Crystal Reports можно использовать для подключения к базе данных типа клиент-сервер: прямые драйверы баз данных, ODBC и OLE DB (технология OLE для баз данных). Book_CR11.indb 416 27.06.2006 1:06:27 Глава 15. Составление отчетов на основе баз данных SQL 417 Прямые драйверы баз данных Система Crystal Reports предлагает прямые драйверы, которые работают со многими клиент-серверными базами данных промышленного стандарта, включая, помимо прочих, Oracle и IBM DB2 (однако драйвер Microsoft SQL Server Direct Database из Crystal Reports был исключен). Прямые драйверы баз данных используют встроенные методы доступа, предлагаемые производителем сервера для соединения с сервером базы данных. Это обычно требует установки на компьютер специального программного обеспечения, предоставляемого производителем, такого как SQL*Plus для Oracle. Crystal Reports распознает присутствие таких пакетов и предоставляет прямой драйвер для подключения к базе данных. Кроме того, Crystal Reports предлагает и другие прямые драйверы, позволяющие генерировать отчеты по данным из папок Microsoft Outlook, каталогов Microsoft Exchange, баз данных Lotus Domino, журналов активности Web-серверов и журнала регистрации событий Windows 2000/XP/2003. Можно даже создавать отчеты на основе локальной файловой системы, состоящей из структуры файлов и каталогов диска C или сетевого диска. Для получения более подробной информации о таких специализированных типах отчетов обратитесь к главе 20. Применение прямых драйверов для подключения к серверу базы данных имеет два основных преимущества: • Поскольку используется меньше уровней протоколов связи, при создании отчетов может наблюдаться некоторое улучшение показателей производительности. • Прямой драйвер базы данных обеспечивает большую гибкость при создании специфических для сервера SQL-операторов и других элементов запросов для генерации отчетов. ODBC Хотя многие компании в качестве стандартных используют серверы баз данных, для которых Crystal Reports поддерживает прямые драйверы, существуют и другие системы баз данных и системы обработки данных, которые может потребоваться использовать в качестве источника при создании отчетов. Для подключения стандартных клиентов ПК к специализированным серверам и системам, количество которых огромно, требуется какой-нибудь стандартный метод связи. Компанией Microsoft для обеспечения коммуникаций подобного рода был разработан открытый интерфейс доступа к базам данных (Open Database Connectivity — ODBC). Как правило, с Crystal Reports может использоваться любая совместимая с ODBC серверная или патентованная платформа хранения данных. Если поставщик базы данных или системы поддерживает драйвер Windows ODBC, Crystal Reports сможет взаимодействовать с такой базой данных или системой. Поскольку ODBC был принят в качестве промышленного стандарта, он используется достаточно широко. Совет. В Crystal Reports установлено несколько общих источников данных ODBC для наиболее распространенных форматов и файлов баз данных, включая источник данных ODBC для использования образца базы данных XTREME.MBD. Прежде чем Crystal Reports можно будет применять для составления отчетов на основе других систем данных ODBC, потребуется установить источник данных ODBC. Для настройки источника данных ODBC воспользуйтесь администратором источников данных ODBC, доступным в панели управления Windows. Book_CR11.indb 417 27.06.2006 1:06:27 418 Часть I. Проектирование отчетов OLE DB Компания Microsoft добавила дополнительный стандарт OLE DB, расширяющий предыдущий разработанный ею универсальный метод доступа к данным — ODBC. OLE DB обеспечивает доступ к данным во многом подобно ODBC. В роли интерфейса между несовместимыми системами клиента и сервера выступает поставщик данных. Поставщики данных доступны не только для обычных систем реляционных баз данных, но также и для более нетрадиционных источников данных, таких как крупноформатные таблицы, Web-серверы и источники многомерных данных OLAP. Crystal Reports поддерживает источники данных OLE DB, установленные на клиентском ПК. Многие клиентские приложения, такие как клиентское программное обеспечение OLAP, устанавливают источники данных OLE DB автоматически. На заметку! В качестве источников данных также могут использоваться доступные в Crystal Reports Server/BusinessObjects Enterprise бизнес-представления (Business View) и области (Universes). В таком случае бизнес-представление или область будет просто “указывать” на источник данных Crystal Reports, например на прямое ODBC- или OLE DB-соединение с целевой базой данных SQL. Выбор базы данных При первом запуске Crystal Reports можно сразу же, еще до открытия существующего отчета или создания нового, выбрать и подключиться к базе данных типа клиент-сервер. Если не подключаться, но открыть отчет, основанный на клиент-серверной базе данных, приглашение подключиться последует при первой попытке обновления отчета или попытке выбора любой другой функции, требующей чтения записей из базы данных. Для создания нового отчета на основе базы данных типа клиент-сервер можно воспользоваться мастером создания отчетов или опцией Blank Report (Пустой отчет). Если используется мастер, на его первом экране будут отображены доступные соединения с базами данных, как показано на рис. 15.2. Рис. 15.2. Доступные соединения с базами данных в мастере создания стандартных отчетов Book_CR11.indb 418 27.06.2006 1:06:27 Глава 15. Составление отчетов на основе баз данных SQL 419 При выборе для создания нового отчета опции Blank Report немедленно появляется диалоговое окно эксперта баз данных Database Expert (рис. 15.3). Рис. 15.3. Диалоговое окно эксперта баз данных Эксперт Database Expert в одном месте объединяет все источники данных, включая прямые драйверы для баз данных, ODBC и OLE DB. Выберите один из предложенных типов соединений в подходящей категории. Выбор будет зависеть от того, использовались ли источники данных ранее (источники данных, которые использовались недавно, будут отображаться в категории History (Хронология)), подключились ли вы уже к источнику данных из другого отчета (подключенные на текущий момент источники данных будут отображаться в категории Current Connections (Текущие соединения)) или добавлялось ли соединение с базой данных в папку Favorites (Избранное). Чтобы добавить соединения в папку Favorites эксперта Database Expert, щелкните правой кнопкой мыши на имени нужной базы данных и в контекстном меню выберите пункт Add To Favorites (Добавить в избранное). В категории Repository (Репозиторий) вы найдете папку Data Explorer (Проводник данных), в которой в качестве источника данных можно выбрать команду SQL или одно из доступных в Crystal Reports Server/BusinessObjects Enterprise бизнес-представлений Business View (команды SQL рассматриваются далее в этой главе, а об объектах Business View речь пойдет в главе 16). Щелкните на значке плюс рядом с категорией Repository, чтобы подключиться к репозиторию Crystal Reports Server/BusinessObjects Enterprise и выбрать желаемую команду SQL или объект Business View. Если источник данных, к которому необходимо подключиться, отсутствует во всех категориях, можно создать новое соединение с базой данных, щелкнув на знаке + рядом с категорией Create New Connection (Создать новое соединение). Это отобразит дополнительный набор категорий баз данных для выбора. Снова щелкните на знаке + рядом с подходящей категорией, чтобы создать соединение, используя данный тип соединения. Категории, которые, скорее всего, будут использоваться для подключения к стандартным базам данных типа клиент-сервер, включают ODBC, OLE DB и More Data Sources (Дополнительные источники данных). Book_CR11.indb 419 27.06.2006 1:06:28 420 Часть I. Проектирование отчетов Совет. “ODBC” и “OLE DB” — не единственные аббревиатуры в эксперте Database Expert: сразу после названий категорий ODBC и OLE DB будут отображаться и такие аббревиатуры, как “RDO” и “ADO”, обозначающие дополнительные стандарты Microsoft для доступа к базам данных. RDO (Remote Data Objects — удаленные объекты данных) и ADO (ActiveX Data Objects — объекты данных ActiveX) — это технические термины, описывающие внутренние методы, которые Crystal Reports использует для подключения к источникам данных ODBC и OLE DB. После щелчка на знаке + рядом с категорией ODBC появится отдельное диалоговое окно (рис. 15.4) со списком всех предварительно определенных источников данных ODBC (если нужный источник данных в этом списке отсутствует, воспользуетесь доступным через панель управления Windows администратором источников данных ODBC и добавьте необходимый источник данных). Выберите подходящий источник данных и щелкните в этом диалоговом окне на кнопке Next (Далее). В зависимости от выбранного источника данных, а также от типа базы данных, к которой он подключается, может появиться дополнительное диалоговое окно с приглашением ввести соответствующие регистрационные данные. Рис. 15.4. Диалоговое окно со списком всех предварительно определенных источников данных ODBC В результате щелчка на знаке + рядом с категорией OLE DB также откроется отдельное диалоговое окно OLE DB, в котором будет отображаться список установленных поставщиков OLE DB или специфических для базы данных драйверов, которые были установлены на компьютере (рис. 15.5). Выберите необходимого поставщика данных и щелкните на кнопке Next. Как и в случае с ODBC, остальные опции в диалоговом окне OLE DB, такие как выбор специальной базы данных или ввод регистрационных данных, будут варьироваться в зависимости от выбираемого поставщика. Если планируется использовать прямые драйверы базы данных, щелкните на знаке + рядом с категорией More Data Sources. После этого в диалоговом окне эксперта Database Expert появится еще один уровень подкаталогов. Book_CR11.indb 420 27.06.2006 1:06:28 Глава 15. Составление отчетов на основе баз данных SQL 421 Рис. 15.5. Диалоговое окно со списком всех установленных поставщиков OLE DB Отыщите описание, соответствующее типу прямого драйвера, который должен использоваться, например, “Exchange Folders” (“Каталоги Exchange”) или “Lotus Domino” (в этой категории будут также отображаться и другие источники данных, отличные от SQL, которые более подробно рассматриваются в главе 20). Как и для других методов доступа, при выборе этих драйверов будут открываться специфические для каждой базы данных диалоговые окна с приглашением ввести регистрационные данные. Появление в выбранной категории записи “no items found” (“объекты не найдены”) может свидетельствовать о том, что необходимое для доступа к базе данных клиентское программное обеспечение не было должным образом установлено на компьютере. Например, сообщение подобного рода появится в категории Oracle, если на компьютере не установлен клиент Oracle SQL Plus. Совет. Во время инсталляции Crystal Reports устанавливаются не все драйверы баз данных. При выборе одного из таких источников данных в диалоговом окне Database Expert в первый раз, может последовать приглашение вставить дистрибутивный компакт-диск Crystal Reports для добавления специфического драйвера. Также при добавлении дополнительных источников данных через программу установки Crystal Reports Setup в категории Create New Connection часто будут отображаться соответствующие дополнительные категории. После успешного подключения к базе данных эксперт Database Expert развернет выбранную первоначально категорию и отобразит список баз данных, схем, таблиц, представлений и хранимых процедур, доступных в базе данных (список будет зависеть от типа выбранной базы данных). На рис. 15.6 показано диалоговое окно эксперта Database Expert со списком доступных таблиц базы данных SQL Server, две из которых уже были добавлены в отчет. Выберите таблицу, хранимую процедуру или представление, которое необходимо включить в отчет, либо дважды щелкнув на нужном объекте, либо выделив его и щелкнув на кнопке с изображением стрелки вправо. Book_CR11.indb 421 27.06.2006 1:06:28 422 Часть I. Проектирование отчетов Удалить выделенную таблицу из отчета Добавить выделенную таблицу в список Available Data Sources отчета Таблицы, уже добавленные в отчет Список доступных таблиц Рис. 15.6. Диалоговое окно эксперта Database Expert Можете также, удерживая клавишу <CTRL>, последовательно щелкнуть на нескольких таблицах, а затем добавить их все сразу, воспользовавшись кнопкой со стрелкой вправо. Еще можете выделить одну или более таблиц и просто перетащить их в список Selected Tables (Выбранные таблицы). При желании добавить в отчет абсолютно все таблицы (пожалуй, достаточно редкий случай), щелкните на кнопке с изображением двух стрелок вправо. Таблицы по мере их добавления будут появляться в списке Selected Tables, расположенном в правой части диалогового окна Database Expert. Если случайно была добавлена ненужная таблица или таблицы, выделите ее в списке Selected Tables и удалите, щелкнув на кнопке с изображением стрелки влево. Удалить все ранее добавленные таблицы можно с помощью кнопки с изображением двух стрелок влево. Совет. Щелчок правой кнопкой мыши на объекте в списке Available Data Sources (Доступные источники данных) приводит к появлению контекстного меню, с помощью которого можно выполнять множество операций, рассматриваемых далее в этой главе. Если вы не видите все таблицы, которые ожидали увидеть, или при желании ограничить набор доступных таблиц определенным владельцем базы данных или заданным шаблоном для имен таблиц, щелкните правой кнопкой мыши на списке Available Data Sources и в появившемся контекстном меню выберите пункт Options (Параметры). Откроется диалоговое окно Database Options (Параметры базы данных), которое рас- Book_CR11.indb 422 27.06.2006 1:06:28 Глава 15. Составление отчетов на основе баз данных SQL 423 сматривается далее в этой главе, в разделе “Изменение SQL-параметров”. Установив должным образом параметры в этом диалоговом окне, можно выбрать любую из дополнительных записей, появившихся в списке Available Data Sources. Добавив нужные таблицы в отчет, перейдите на вкладку Links (Связи), чтобы связать таблицы вместе по общим полям (более подробную информацию о связывании таблиц можно найти далее в этой главе, в разделе “Связывание таблиц”). Выбрав и связав таблицы, закройте диалоговое окно эксперта Database Expert, щелкнув на кнопке OK. Не забывайте о том, что, подключившись к базе данных SQL с помощью эксперта Database Expert, вы остаетесь подключенными к этой базе данных, даже если закроете отчеты, основанные на этом соединении. Если вы затем решите создать новый отчет и снова отобразите диалоговое окно Database Expert, в категории Current Connections этого окна будет отображаться та база данных, к которой вы подключались ранее. Не желая использовать эти таблицы в новом отчете, вы можете просто проигнорировать их и выбрать другую базу данных. Чтобы не использовать существующее соединение с базой данных и удалить его из категории Current Connections, отключитесь от исходного сервера, либо закрыв и перезапустив Crystal Reports, либо воспользовавшись опцией Log On/Off Server (Вход/выход из сервера). Если отчет открыт, выберите в меню Database (База данных) пункт Log On/Off Server, а если не открыт — выберите в меню File (Файл) пункт Log On/Off Server. Выделите базу данных в категории Current Connections, от которой необходимо отключиться, и щелкните на кнопке Log Off (Отключиться). Изменение SQL-параметров В зависимости от выбранного источника данных, в диалоговом окне эксперта Database Expert может не оказаться всех необходимых элементов базы данных. В частности, если используемая база данных поддерживает хранимые SQL-процедуры (предварительно скомпилированные SQL-операторы, которые могут принимать параметры) или представления (виртуальные таблицы, которые могут объединять несколько фактических таблиц базы данных в одну группу), и их необходимо использовать в отчете, может потребоваться отобразить их в диалоговом окне эксперта Database Expert. Или же наоборот, может возникнуть желание ограничить список отображаемых в этом диалоговом окне таблиц так, чтобы он содержал имена только тех таблиц, которые соответствуют определенному шаблону или принадлежат определенному пользователю базы данных. Чтобы установить настройки подобного рода, щелкните правой кнопкой мыши в любом месте списка Available Data Sources, расположенном в левой части диалогового окна Database Expert. В появившемся контекстном меню выберите пункт Options, в результате чего отобразится диалоговое окно Database Options, показанное на рис. 15.7. Совет. Отобразить диалоговое окно Database Options можно не только из окна эксперта Database Expert. Выберите в меню File пункт Options (Параметры) и установите необходимые опции на вкладке Database (База данных) диалогового окна Options (Параметры). Раздел Tables and Fields (Таблицы и поля) позволяет определять способ отображения таблиц и полей в эксперте Database Expert и окне проводника Field Explorer. Здесь предлагается множество опций для сортировки имен таблиц и полей, например, сортировка таблиц в эксперте Database Expert и сортировка полей в окне Field Explorer в алфавитном порядке. Раздел Data Explorer данного диалогового окна позволяет ограничивать список таблиц, отображаемых в эксперте Database Expert при подключении к базе данных. Book_CR11.indb 423 27.06.2006 1:06:29 424 Часть I. Проектирование отчетов Отметьте необходимые флажки из набора Tables (Таблицы), Views (Представления), Synonyms (Синонимы), Stored Procedures (Хранимые процедуры) и System Tables (Системные таблицы), чтобы определить тип элементов базы данных, которые должны отображаться. Можете также добавить шаблон имен таблиц или имен владельцев таблиц, чтобы дополнительно ограничить список таблиц. Рис. 15.7. Диалоговое окно Database Options Опции в разделе Advanced Options (Дополнительные опции) позволяют определять поведение базы данных (в зависимости от типа используемой базы данных и личных предпочтений). Здесь доступны такие опции: • Use Indexes or Server for Speed (Использовать индексы или сервер для повышения быстродействия). Устанавливайте эту опцию, если хотите чтобы для баз данных ПК (таких как Microsoft Access или Paradox) использовались индексные файлы, а для баз данных SQL — SQL-конструкция WHERE. В большинстве случаев выбор этой опции приводит к существенному увеличению производительности при составлении отчетов. • Perform Grouping on Server (Выполнять группирование на сервере). Устанавливайте эту опцию, чтобы заставить Crystal Reports выполнять как можно большую часть операций по вычислению промежуточных сумм и агрегатных функций на сервере базы данных для улучшения производительности во время составления отчетов. Определенные условия, необходимые для извлечения максимальной пользы из данной опции, рассматриваются далее в этой главе в разделе “Выполнение группирования на сервере базы данных”. Book_CR11.indb 424 27.06.2006 1:06:29 Глава 15. Составление отчетов на основе баз данных SQL 425 • Database Server Is Case-Insensitive (Сервер базы данных не чувствителен к регистру). Устанавливайте эту опцию, чтобы при выполнении выборки записей из базы данных регистр не учитывался (эта опция может оказаться неэффективной для некоторых баз данных, поскольку не все базы данных можно сделать нечувствительными к регистру). • Select Distinct Data for Browsing (Выбирать различные данные для просмотра). При установке этой опции чтение базы данных при просмотре поля в окне проводника Field Explorer или редакторе Formula Editor будет выполняться до тех пор, пока не будет извлечено его первых 500 уникальных значений. Если оставить этот флажок неотмеченным, Crystal Reports будет считывать только первые 500 записей в таблице, даже если уникальных значений всего несколько или вообще все значения поля одинаковые. При активизации данной опции списки для просмотра становятся намного больше, поэтому не исключено снижение производительности. • Perform Query Asynchronously (Выполнять запрос асинхронно). Эта опция позволяет останавливать обработку запроса на сервере базы данных до тех пор, пока записи базы данных не будут возвращены в Crystal Reports. В некоторых случаях выполнение отправляемых в базу данных SQL запросов может занимать несколько минут (а иногда и часов). Установив этот флажок, можно будет щелкать на кнопке Stop (Остановить) с черным квадратиком, расположенной в правой части вкладки Preview, для отмены выполнения запроса на сервере базы данных. Обратите внимание, что данная опция применима только к определенным базам данных и драйверам – не все базы данных и драйверы поддерживают эту опцию. • Опции проверки (Verify …) Данные опции задают чтение базы данных системой Crystal Reports для определения, не были ли добавлены поля, не изменились ли имена полей и типы данных и так далее. Если поля базы данных изменились, появится сообщение, после ответа на которое все изменения отобразятся в окне проводника Field Explorer. Если оставить эти опции отключенными, то при желании распознать изменения в базе данных проверки придется выполнять вручную, используя меню Database. Смена базы данных Поначалу пользователь может создать отчет на основе базы данных ПК, подобной Microsoft Access, а затем решить преобразовать его так, чтобы в нем использовалась база данных SQL с аналогичной организацией. Возможно, база данных Access увеличилась до размеров базы данных SQL Server, или отчеты первоначально создавались на основе тестовой базы данных в Btrieve, но, в конечном счете, они должны использовать базу данных Oracle. Не исключены также ситуации, когда отчету, изначально созданному на основе базы данных специфического типа, такой как база данных ODBC, может потребоваться “указать” альтернативную базу данных ODBC. В любом случае Crystal Reports предлагает единственный способ установки другой базы данных. Выберите в Database пункт Set Datasource Location (Установить расположение источника данных), после чего появится диалоговое окно Set Datasource Location (Установить расположение источника данных), показанное на рис. 15.8. Если необходимо заменить одну таблицу, выделите ее в списке Current Data Source (Текущий источник данных). Чтобы заменить целую базу данных, включая все ее таблицы, выделите имя базы данных выше элемента Properties (Свойства) и имен отдельных Book_CR11.indb 425 27.06.2006 1:06:29 426 Часть I. Проектирование отчетов таблиц. Затем разверните категорию в списке Replace With (Заменить на), в которой находится новая база данных или таблица. Выделите объект подобного типа (если в верхнем списке выбрана целая база данных, в нижнем списке также должна быть выбрана целая база данных, а если в верхнем списке выбрана только одна таблица, то и в нижнем списке следует выбрать только одну таблицу). При выборе в списке Replace With базы данных, требующей ввода регистрационной информации, предоставьте эту информацию. Выбрав необходимые таблицы или базу данных, щелкните на кнопке Update (Обновить). Выберите исходную таблицу или базу данных, которую необходимо заменить Выберите таблицу или базу данных, на которую будет выполнена замена Щелкните на кнопке Update, чтобы обновить отчет Рис. 15.8. Диалоговое окно Set Datasource Location В случае изменения имен таблиц или полей в базе данных последует приглашение отобразить старые поля на новые. Более подробно эти вопросы будут рассматриваться в главе 18. Добавление в отчет дополнительных таблиц После первоначального выбора и связывания таблиц во время последующего процесса генерации отчета часто возникает необходимость добавления в отчет дополнительных таблиц. Чтобы сделать это, щелкните на кнопке Database Expert (Эксперт баз данных), расположенной в панели инструментов экспертов, или выберите в меню Database пункт Database Expert. На экране появится диалоговое окно эксперта Database Expert, в котором можно добавлять дополнительные таблицы из списка Available Data Sources. Добавив дополнительные таблицы, перейдите на вкладку Links окна эксперта Database Expert, чтобы связать таблицы (связывание таблиц рассматривается далее в этой главе, в разделе “Связывание таблиц”). Book_CR11.indb 426 27.06.2006 1:06:29 Глава 15. Составление отчетов на основе баз данных SQL 427 Все таблицы, добавленные в отчет ранее, будут присутствовать в списке Selected Tables. При попытке добавить одну из существующих таблиц снова, выдается запрос на необходимость присвоить второму вхождению таблицы псевдоним, поскольку каждая используемая на вкладке Links таблица должна иметь уникальное имя. Совет. Преднамеренное неоднократное добавление в отчет одной и той же таблицы не исключается. Если, например, существует общая таблица поиска, используемая несколькими главными или транзакционными таблицами, извлекать искомую информацию путем связывания всех транзакционных или главных таблиц с одной и той же таблицей поиска не получится. Потребуется добавлять таблицу поиска в отчет многократно, каждый раз используя новый псевдоним. Затем можно будет связать каждую транзакционную или главную таблицу с разными версиями таблицы поиска, для каждой из которых установлен свой псевдоним. Удаление из отчета неиспользуемых таблиц Иногда оказывается, что в отчет случайно было добавлено слишком много таблиц, или что используемые ранее в процессе создания отчета таблицы больше не нужны. Если эксперт Database Expert открыт, выделите таблицу, которую необходимо удалить из списка Selected Tables, и щелкните на кнопке с изображением стрелки влево. Чтобы удалить все таблицы из списка Selected Tables и начать заново добавлять новые таблицы, щелкните на кнопке с изображением двух стрелок влево. При попытке удалить таблицы, которые используются в отчете, выдается сообщение с требованием подтвердить удаление. Если вы перешли непосредственно к формированию отчета и на данный момент находитесь на вкладке Design или Preview, откройте снова эксперта Database Expert, воспользовавшись кнопкой в панели инструментов или соответствующим пунктом меню Database, и удалите таблицы из списка Selected Tables. Внимание! Убедитесь, что вы действительно хотите удалить таблицу, прежде чем выполнять щелчок на кнопке с изображением стрелки влево и закрывать окно эксперта Database Expert. Отменить удаление невозможно. Кроме того, после удаления таблицы, на которую имеются ссылки в каких-то формулах, эти формулы работать перестанут. Если таблица удалена по ошибке, откройте эксперт Database Expert и заново добавьте и свяжите таблицу. Или, имея заведомо рабочую сохраненную на диске копию отчета, можете закрыть существующий отчет без сохранения изменений и открыть эту копию. Связывание таблиц Случаи, когда отчет формируется на основе единственной таблицы базы данных, бывают достаточно редко, обычно в отчете требуется использовать, по крайней мере, две, а чаще и большее количество таблиц, поскольку большинство современных реляционных баз данных являются нормализованными. Под нормализацией баз данных понимают разнесение повторяющейся информации по отдельным таблицам базы данных в целях эффективности и простоты обслуживания. Рассмотрим таблицу с именем Employee (Сотрудники), содержимое которой показано в табл. 15.1. Book_CR11.indb 427 27.06.2006 1:06:29 428 Часть I. Проектирование отчетов Таблица 15.1. Структура таблицы Employee Employee Name Department Name Salary Bill Information Technology 50000 Karen Human Resources 32500 Renee Information Technology 37500 John Executive 85000 Carl Mail Room 24000 Jim Information Technology 48000 Julie Executive 87000 Sally Mail Room 23500 Хотя эта таблица представляет собой удобную среду для составления отчетов, поскольку выбирать более одной таблицы для распечатки списка сотрудников или платежных чеков не требуется, работать с такой таблицей намного труднее. Обратите внимание, что названия отделов в этой небольшой таблице повторяются по несколько раз. (А теперь представьте себе таблицу с такой структурой для компании, количество сотрудников которой насчитывает 50 000 человек.) Такая таблица будет не только занимать большой объем пространства для хранения, но и в случае изменения названий отделов потребует немалых усилий на внесение этих изменений. Например, при изменении названия отдела “Information Technology” (“Отдел информационных технологий”) на “Information Systems” (“Отдел информационных систем”), во всей таблице Employee придется выполнить функцию поиска и замены, заменяя каждое вхождение старого названия отдела новым. Сравните эту однотабличную структуру со средой базы данных, описанной в таблицах 15.2 и 15.3. Таблица 15.2. Структура таблицы Employee (Сотрудники) Employee Name Department Number Salary Bill 25 50000 Karen 17 32500 Renee 25 37500 John 8 85000 Carl 13 24000 Jim 25 48000 Julie 8 87000 Sally 13 23500 Таблица 15.3. Структура таблицы Department (Отделы) Department Number Department Name 8 Executive 13 Mail Room 17 Human Resources 25 Information Technology Book_CR11.indb 428 27.06.2006 1:06:30 Глава 15. Составление отчетов на основе баз данных SQL 429 Здесь вы видите, что база данных была нормализована путем помещения информации об отделах в отдельную таблицу поиска. В такой среде таблица Employee использует гораздо меньше памяти, потому что для каждого сотрудника хранится только номер отдела, а не полное его название. Теперь в случае изменения названия отдела “Information Technology” во всей базе данных потребуется изменить всего лишь одну запись в таблице Department. Вкладка Links диалогового окна эксперта Database Expert Использование множества таблиц усложняет среду для составления отчета, поскольку для распечатки списка сотрудников или платежных чеков требуется больше, чем просто таблица Employee. В предыдущем примере необходимо было не только включить в отчет две таблицы, но также и связать их вместе по общему полю. Связывание таблиц (также известное как соединение таблиц) состоит в выборе общего поля или полей, которые позволяют второй таблице следовать за главной по мере считывания ее записей. Связать таблицы в Crystal Reports можно с помощью вкладки Links (Связи) диалогового окна эксперта Database Expert (рис. 15.9). Вкладка Links в диалоговом окне эксперта Database Expert появляется тогда, когда первоначально при создании отчета выбираются две или больше таблиц, или когда в процессе последующей разработки отчета в окне эксперта баз данных добавляются дополнительные таблицы. Если необходимо поработать со связями базы данных, откройте диалоговое окно эксперта Database Expert, щелкнув на кнопке Database Expert в панели инструментов или выбрав в меню Database пункт Database Expert, и перейдите на вкладку Links. Таблицы, выбранные на вкладке Data Обозначение индексированных полей Линии связей Рис. 15.9. Вкладка Links диалогового окна эксперта Database Expert Book_CR11.indb 429 27.06.2006 1:06:30 430 Часть I. Проектирование отчетов Можно свободно перемещать отдельные таблицы в пределах вкладки Links для просмотра их в другом порядке. Также можно изменять размер окна каждой таблицы, делая его больше, меньше, более узким или более широким. Для того чтобы Crystal Reports выполнил автоматическое упорядочение таблиц в соответствии с установленными для них связями, щелкните на кнопке Auto-Arrange (Автоматическое упорядочение). Обычно при первом открытии вкладки Links диалогового окна Database Expert связи между таблицами уже выбраны. Наличие линий со стрелками, соединяющих поля в таблицах, свидетельствует о том, что таблицы на вкладке Links были автоматически связаны (автоматическое связывание таблиц рассматривается далее в этой главе). Можете удалить эти связи, если они установлены некорректно, или добавить новые связи самостоятельно. Чтобы удалить связь, щелкните на линии, соединяющей две таблицы. Линия связи, а также соединяемые ею поля будут выделены. Щелкните на кнопке Delete Link (Удалить связь) или нажмите клавишу <DEL>. Если необходимо изменить параметры связи, такие как тип соединения (типы соединений рассматриваются далее в этой главе, в разделе “Типы соединений, типы связи и принудительное соединение”), или параметры связи множества таблиц, щелкните на кнопке Link Options (Параметры связи) или дважды щелкните на выделенной линии, либо же щелкните на линии правой кнопкой мыши и в появившемся контекстном меню выберите пункт Link Options. Чтобы добавить новую связь, нажмите кнопку мыши на поле в таблице, из которой должна исходить связь, перетащите указатель мыши на другую таблицу, с которой необходимо установить связать, а затем отпустите кнопку мыши на требуемом поле. Между двумя таблицами и полями будет нарисована линия связи. Если Crystal Reports не обнаружит потенциальных проблем с вычерченной связью, просто появится линия и никаких сообщений не последует. Однако если обнаружена потенциальная проблема, такая как, например, несовместимость типов полей, будет выдано предупреждающее сообщение, и связь создана не будет (рис. 15.10). Рис. 15.10. Предупреждающее сообщение о несовместимости типов полей Book_CR11.indb 430 27.06.2006 1:06:30 Глава 15. Составление отчетов на основе баз данных SQL 431 Значение индексных стрелок Большинство систем баз данных допускает выполнение индексации разработчиком базы данных. Такие проиндексированные поля обозначаются цветными стрелками. Индекс — это специальный параметр, который разработчик базы данных создает для ускорения доступа к таблице. Поиск конкретных записей в такой таблице будет выполняться намного быстрее, когда он основан на индексированном поле. Чтобы просмотреть значения цветов индексных стрелок, щелкните на кнопке Index Legend (Обозначения индексов). Появится диалоговое окно, отображающее различные цвета и соответствующие им индексы (рис. 15.11). При связывании таблиц базы данных связь может устанавливаться на основе любого поля: установка связи с индексированным полем необходимым условием не является. Однако в целях повышения эффективности имеет смысл устанавливать связи именно с индексированными полями. Скорость извлечения записей в таком случае может существенно увеличиться. Порядок связей Рис. 15.11. Диалоговое окно Index Legend После того, как пользователь добавляет в отчет таблицы и затем открывает вкладку Links, Crystal Reports делает предположение по поводу порядка, в котором должны быть связаны таблицы (такое предположение делается только в том случае, если Crystal Reports автоматически устанавливает связи между таблицами, что встречается достаточно часто). Какие таблицы и поля необходимо связывать? Совсем скоро станет ясно, что для безошибочной установки связей между таблицами и полями необходимо хорошо разбираться в базе данных, на основе которой создается отчет. Требуется знать структуру таблиц и данные, которые содержат общие поля, для их успешного связывания. Эта задача может осложняться разработчиками баз данных, которые в целях гарантии собственного трудоустройства создают для таблиц и полей непонятные и сокращенные имена. Пожалуй, самый быстрый способ — это воспользоваться заслуживающими доверия документальными источниками по базам данных или проконсультироваться с кем-нибудь, кто либо разрабатывал базу данных, либо знаком с ее структурой и содержимым. Исключением могут быть случаи, когда пользователь в состоянии отличить подходящие для связывания таблицы и поля благодаря тому, что для них были выбраны интуитивно понятные имена. Если ничего другого не остается, можно просмотреть отдельные поля на вкладке Links диалогового окна Database Expert, щелкая правой кнопкой мыши на имени поля и выбирая в контекстном меню пункт Browse Field (Просмотреть поле). Просматривая подобные типы и образцы данных, совпадающие в обеих таблицах, можно отобрать неплохих кандидатов на связывание. Всегда после установки связи между таблицами тестируйте свой отчет и проверяйте, чтобы возвращались корректные данные. Очень легко установить некорректную связь, которая не будет отображать сообщений об ошибке, но и не будет возвращать в отчет правильно сопоставленные данные. Book_CR11.indb 431 27.06.2006 1:06:30 432 Часть I. Проектирование отчетов При соединении всего лишь двух таблиц ничего подобного не происходит, поскольку между двумя таблицами может быть установлена только одна связь. Однако при соединении трех и более таблиц (в рассматриваемом примере это таблицы A, B и C) Crystal Reports будет устанавливать связь между таблицами в определенном порядке: сначала, скорее всего, таблица A будет связана с таблицей B по одному полю, а затем таблица A с таблицей C — по другому полю. Если используемая в отчете база данных основана на SQL, можно будет просмотреть SQL-запрос, который Crystal Reports отправляет в базу данных, и увидеть порядок, в котором будут устанавливаться связи. В большинстве случаев порядок особой роли играть не будет, поэтому изменять его не придется. Однако, в определенных ситуациях при определенных типах табличных структур и систем баз данных или драйверов для доступа можно заметить разницу в получаемых в результате данных, если вместо порядка “A c B, а затем A с C” выбрать порядок “А с С, а затем A с B”. Если такая разница имеет значение, измените порядок, щелкнув на кнопке Order Links (Упорядочить связи). После щелчка на этой кнопке появляется диалоговое окно Order Links (Упорядочить связи), показанное на рис. 15.12. Рис. 15.12. Диалоговое окно Order Links Выберите связь, которую необходимо передвинуть вверх или вниз по списку, и щелкните на кнопке с изображением стрелки вверх или вниз, которая расположена в верхней части диалогового окна. Установите флажок Link Ordering Is Enforced (Упорядочение связей является обязательным) для гарантии, что Crystal Reports перегруппирует операторы для связей в SQL-запросе, отправляемом базе данных. Использование множества типов баз данных в одном отчете Crystal Reports позволяет использовать более одного типа базы данных в каждом отдельном отчете. Например, может возникнуть необходимость в использовании в отчете главной таблицы транзакций из базы данных типа клиент-сервер с помощью прямого драйвера, одной таблицы поиска меньших размеров из базы данных Microsoft Access, расположенной на диске общего доступа в локальной сети, и другой таблицы поиска Microsoft Excel, которая находится на диске C, через ODBC или соединение Access/Excel (DAO). Book_CR11.indb 432 27.06.2006 1:06:31 Глава 15. Составление отчетов на основе баз данных SQL 433 Чтобы сделать это, вначале, во время создания отчета, выберите все эти различные таблицы из соответствующих категорий эксперта Database Expert. Или, чтобы добавить дополнительные таблицы (даже из баз данных разного типа) после того, как процесс создания отчета уже начался, снова откройте диалоговое окно Database Expert, воспользовавшись соответствующей кнопкой панели инструментов или соответствующим пунктом меню. Выбрав дополнительную таблицу или таблицы, перейдите на вкладку Links и должным образом установите между ними связи. Работает ли функция автоматического связывания Crystal Reports? При первоначальном добавлении в отчет таблиц Crystal Reports пытается автоматически установить связи между ними. Результатом этого процесса часто будут линии связи, отображаемые на вкладке Links при ее первом открытии еще даже до того, как пользователь вручную установит свои собственные линии связи. Это — функция с “добрыми намерениями”, от которой часто больше неприятностей, нежели пользы. Она автоматически устанавливает связи между полями двух смежных таблиц, если поля соответствуют следующим критериям: • Имена полей полностью совпадают. • Типы данных идентичны. • В случае строковых полей, длина полей одинакова. При идеальной базе данных (такой как база данных XTREME, входящая в состав Crystal Reports в качестве образца) функция автоматического связывания работает безошибочно. Однако на практике все обычно происходит иначе. Рассмотрим, например, отчет, который включает таблицу Vendor (Поставщики) и таблицу Customer (Клиенты). Обе таблицы содержат поля с именами Address (Адрес), City (Город), State (Штат) и Zip_Code (Почтовый индекс). Вполне вероятно, что эти поля имеют одинаковую длину и включают данные идентичного типа. Однако эти поля не являются полями, по которым эти две таблицы должны быть объединены. Другой тип автоматического связывания, которое пытается выполнить Crystal Reports — связывание по ключу. В этом случае Crystal Reports пытается определить отношения типа “первичный ключ – внешний ключ” между таблицами путем считывания внутренней структуры базы данных, обеспечиваемой драйвером. Обычно такой тип автоматического связывания необходимо выбирать самостоятельно за счет установки переключателя By Key (По ключу) и последующего щелчка на кнопке Auto-Link, которая находится на вкладке Links. Если определенный набор параметров для первичного и внешнего ключей Crystal Reports найти не смог, появится сообщение, информирующее о том, что связывание по ключам не может быть выполнено, поэтому связи должны устанавливаться по именам полей. Не исключено, что следствием автоматического связывания достаточно часто будут некорректно вычерченные линии связи. В таком случае придется удалять неправильные связи и рисовать правильные. Если в Crystal Reports 10 отключить опцию автоматического связывания можно было только путем внесения соответствующих изменений в системный реестр, то в версии XI это можно сделать в диалоговом окне Options. Просто отобразите это диалоговое окно, выбрав в меню File пункт Options, перейдите на вкладку Database (База данных) и снимите отметку с флажка Automatic Smart Linking (Автоматическое интеллектуальное связывание). Book_CR11.indb 433 27.06.2006 1:06:31 434 Часть I. Проектирование отчетов В общем случае такой смешанный тип составления отчета вполне приемлем. Однако, поскольку соединения с базами данных разного типа нельзя выполнить с помощью единственного SQL-запроса (причина состоит в том, что SQL-запрос по своей природе не может пересекать границы базы данных), Crystal Reports самостоятельно и внутренне установит связи между таблицами. В очень редких случаях для этого может потребоваться устанавливать связи исключительно по строковым полям. Однако наиболее часто смешанное использование баз данных приводит к появлению предупреждающего сообщения (рис. 15.13) о том, что отчет содержит более одного типа базы данных и что применять SQL-выражения или выполнять группировку на сервере нельзя (оба эти вопроса более подробно рассматриваются далее в этой главе). Рис. 15.13. Предупреждающее сообщение в результате смешанного использования баз данных Внимание! Хотя возможность включать в один отчет базы данных нескольких типов значительно повышает степень гибкости Crystal Reports, она может крайне негативно сказываться на производительности отчета. Из-за того, что в таком случае выполнены должны быть несколько различных запросов к базе данных, которые Crystal Reports объединяет вместе локально, процесс обработки отчета может занимать значительно большее количество времени. Типы соединений, типы связи и принудительное соединение При связывании двух таблиц необходимо внимательно продумать, какие записи будут возвращаться из обеих таблиц. Рассмотрим незначительные изменения, внесенные в нормализированные структуры таблиц, которые были проиллюстрированы ранее в этой главе; новые структуры таблиц представлены в табл. 15.4 и табл. 15.5. Таблица 15.4. Новая структура таблицы Employee Employee Name Department Number Salary Karen Renee John Carl Denise 17 25 8 13 32 32500 37500 85000 24000 125000 Таблица 15.5. Новая структура таблицы Department Department Number Department Name 8 13 17 4 25 Executive Mail Room Human Resources Finance Information Technology Book_CR11.indb 434 27.06.2006 1:06:31 Глава 15. Составление отчетов на основе баз данных SQL 435 При беглом взгляде на эти две таблицы обнаруживаются два несоответствия: для сотрудницы с именем Дэниз (Denise) в таблице Department нет соответствующей записи, а для отдела Finance (Финансовый отдел) в таблице Employee не существует сотрудников. Считается, что у этих двух таблиц отсутствует ссылочная целостность — модный термин, который просто означает, что стопроцентного совпадения между двумя таблицами нет. Модный это термин или нет, для вас, как разработчика отчета, это будет очень важным. Проблему отсутствия ссылочной целостности необходимо как-то решать. На заметку! Многие базы данных позволяют устанавливать ссылочную целостность принудительно, так что ситуация, описанная выше, может никогда и не случиться. Если разработчик базы данных выберет опцию поддержания ссылочной целостности между этими двумя таблицами, сотруднику нельзя будет присвоить номер отдела, который не существует в таблице Department, а отдел нельзя будет удалить из таблицы Department, если хотя бы одна из записей таблицы Employee содержит этот отдел. Однако установка опции соблюдения ссылочной целостности нередко приводит к возникновению других сложностей в базе данных, и бывает много случаев, когда основная функция базы данных не позволяет устанавливать эту опцию. При наличии вопросов, касающихся того, каким образом разработана база данных, проконсультируетесь с разработчиком или администратором базы данных. Примером обстоятельств, при которых ссылочная целостность играет важную роль, является ситуация, когда отчет разрабатывается с целью распечатки платежных чеков для сотрудников. В качестве примера давайте рассмотрим представленные ранее таблицы. При желании печатать на корешке чека название отдела, в котором работает тот или иной сотрудник, дабы ускорить распространение чеков между сотрудниками, потребуется объединить таблицы Employee и Department по полю Department Number (Номер отдела). Вполне можно предположить, что чек будет выглядеть подобно показанному на рис. 15.14. Но при этом возникает вопрос: “А что же будет с Дениз?” (последней сотрудницей в таблице Employee). Учитывая тот факт, что Дениз является высокооплачиваемым сотрудником, по крайней мере, по сравнению со многими другими, она, скорее всего, будет очень заинтересована в том, чтобы получить зарплату, независимо от того, соблюдается ссылочная целостность или нет. Еще одним интересным вопросом является вопрос: “Будут ли распечатываться чеки для финансового отдела (Finance)?”. Ответы на эти вопросы будут зависеть того, какой тип соединения используется при связывании этих двух таблиц. Ниже представлены два типа соединений, которыми вы, скорее всего, будете пользоваться наиболее часто: • Inner Join (внутреннее соединение, иногда называемое соединением по равенству). Включает записи из обеих таблиц только тогда, когда соединяемые поля равны. • Left Outer Join (левостороннее внешнее соединение, иногда называемое просто внешним соединением). Включает все записи из левой таблицы и записи из правой таблицы только тогда, когда соединяемые поля равны. Хотя Дениз, возможно, ничего не знает о левостороннем внешнем соединении, пожалуй, она будет более счастлива, если вы выберете именно этот тип соединения. В таком случае она получит чек, на котором всего лишь не будет напечатано название отдела. В Crystal Reports это особенно важно, поскольку здесь для баз данных SQL по умолчанию используется не левостороннее внешнее соединение, а внутреннее соединение. Book_CR11.indb 435 27.06.2006 1:06:31 436 Часть I. Проектирование отчетов Рис. 15.14. Чеки на заработную плату, выдаваемые сотрудникам Ниже представлены два других типа соединения, которые применяются менее часто: • Right Outer Join (правостороннее внешнее соединение). Включает все записи из правой таблицы и записи из левой таблицы только тогда, когда соединяемые поля равны. Дениз такой выбор, как и выбор типа “внутреннее соединение”, вряд ли обрадует. Чек тоже будет испорчен: название отдела напечатается (на корешке чека), а вот ни имени сотрудника, ни суммы заработной платы на этом чеке не будет. • Full Outer Join (полное внешнее соединение). Включает все записи из обеих таблиц, независимо от того, являются соединяемые поля равными или нет. Дениз не была бы против такого типа соединения — в этом случае деньги ей бы заплатили. Однако, этот чек для финансового отдела (Finance) опять бы был испорчен, поскольку не содержал бы никакой информации о сотруднике. Выбор типа соединения и типа связи на вкладке Links диалогового окна эксперта Database Expert На вкладке Links диалогового окна эксперта Database Expert выберите тип соединения, дважды щелкнув на линии связи, прочерченной между двумя подходящими таблицами, щелкнув правой кнопкой мыши на линии связи и выбрав в контекстном меню пункт Link Options (Параметры связи) или выделив линию и щелкнув на кнопке Link Options. Появится диалоговое окно Link Options (Параметры связи), показанное на рис. 15.15. В левой части этого диалогового окна выберите требуемый тип соединения. Book_CR11.indb 436 27.06.2006 1:06:31 Глава 15. Составление отчетов на основе баз данных SQL 437 Рис. 15.15. Диалоговое окно Link Options На заметку! Если таблицы связаны по более чем одному полю, выбор типа соединения для любой из связей установит такой же тип соединения для всех связей. Наличие разных типов соединения для множества связей между одинаковыми таблицами невозможно. Хотя для большинства составляемых бизнес-отчетов подходят такие типы соединения, как внутреннее соединение и левостороннее внешнее соединение, не исключены особые ситуации, в которых может понадобиться использовать и другие перечисленные типы соединений. Доступные в Crystal Reports типы связи. Помимо типа соединения Crystal Reports предлагает дополнительные опции для выбора типа связи, который можно выбирать наравне с типом соединения. • Равно (=). Возвращает записи из таблиц, сопоставляя записи из правой таблицы каждый раз, когда соединяемое поле в левой таблице равно соединяемому полю в правой таблице. • Больше (>). Возвращает записи из левой таблицы, сопоставляя записи из правой таблицы каждый раз, когда соединяемое поле в левой таблице больше соединяемого поля в правой таблице. • Больше или равно (>=). Возвращает записи из левой таблицы, сопоставляя записи из правой таблицы каждый раз, когда соединяемое поле в левой таблице больше или равно соединяемому полю в правой таблице. • Меньше (<). Возвращает записи из левой таблицы, сопоставляя записи из правой таблицы каждый раз, когда соединяемое поле в левой таблице меньше соединяемого поля в правой таблице. • Меньше или равно (<=). Возвращает записи из левой таблицы, сопоставляя записи из правой таблицы каждый раз, когда соединяемое поле в левой таблице меньше или равно соединяемому полю в правой таблице. • Не равно (!=). Возвращает все комбинации записей из двух таблиц, в которых объединяемые поля не равны. При различном сочетании типов соединений и типов связи могут возвращаться очень интересные комбинации данных. Например, при выборе внутреннего соединения (Inner Book_CR11.indb 437 27.06.2006 1:06:32 438 Часть I. Проектирование отчетов Join) и типа связи “меньше” (<) набор возвращаемых данных будет намного больше, нежели при выборе внутреннего соединения (Inner Join) и типа связи “равно” (=). В этом случае записи, между полями которых никаких соответствий найдено не было, возвращаться не будут. Однако при выборе левостороннего внешнего соединения (Left Outer Join) и типа связи “меньше” возращено будет большее количество совпадающих записей, а также записи из левой таблицы, не имеющие соответствий в правой таблице. Чтобы просмотреть, каким образом комбинация из типа соединения и типа связи отразится на SQL-запросе, выберите в меню Database пункт Show SQL Query (Показать SQL-запрос). Если вы знакомы со структурой SQL-запроса, то заметите, что комбинация из типа соединения и типа связи изменяет различные части запроса. Например, при выборе внутреннего соединения (Inner Join) и типа связи “равно” (=) запрос будет выглядеть следующим образом: FROM "xtreme"."dbo"."Employee" "Employee" INNER JOIN "xtreme"."dbo"."Orders" "Orders" ON "Employee"."Employee ID"="Orders"."Employee ID" При выборе левостороннего внешнего соединения (Left Outer Join) и типа связи “меньше” (<) тип запроса будет таким: FROM {oj "xtreme"."dbo"."Employee" "Employee" LEFT OUTER JOIN "xtreme"."dbo"."Orders" "Orders" ON "Employee"."Employee ID"<"Orders"."Employee ID"} Разумеется, точный формат SQL-запроса и то, какая его часть отвечает за выполнение операций соединения (в одних случаях это конструкция FROM, а в других — конструкция WHERE), зависит от типа базы данных и применяемого драйвера. Также для разных выбираемых типов соединений и связи будут возвращаться очень разные наборы данных. Если вы недостаточно хорошо знакомы с типами соединений и связи, лучше придерживайтесь проверенных и надежных способов, а именно — типов соединений Inner Join (Внутреннее соединение) или Left Outer Join (Левостороннее внешнее соединение) и типа связи “равно” (=). В любом случае настоятельно рекомендуется проверять достоверность результатов отчета на основе оригинального источника данных, дабы гарантировать, что отчет после выбора типов соединений и связи возвращает все необходимые данные. На заметку! Некоторые типы соединений и связи не будут доступны, что зависит от типа выбранной для отчета базы данных. В таких случаях все эти недоступные опции в диалоговом окне Link Options будут обесцвечены. Принудительное соединение в Crystal Reports Диалоговое окно Link Options (см. рис. 15.15 и рис. 15.16) содержит раздел Enforce Join (Принудительное соединение). В этом разделе доступны четыре переключателя, позволяющие выбирать включение добавленных в эксперте Database Expert таблиц в окончательный SQL-запрос, отправляемый базе данных, даже если никакие поля из таблицы в отчете использованы не были. По умолчанию, соединения не являются принудительными. В таком случае при добавлении нескольких таблиц в эксперте Database Expert, но включении в отчет полей только из одной таблицы, SQL-запрос не будет содержать даже ссылок на остальные таблицы, и связи, выбираемые на вкладке Links, не будут иметь никакого эффекта. Опции Book_CR11.indb 438 27.06.2006 1:06:32 Глава 15. Составление отчетов на основе баз данных SQL 439 в разделе Enforce Join позволяют принудительно учитывать параметры соединений и связи, даже если в отчет включены поля не из всех таблиц. Давайте рассмотрим следующий пример. Две таблицы Oracle (Orders (Заказы), которая является исходной таблицей, и Customer (Клиенты), которая является целевой) связаны по одному общему полю (Customer_ID) с использованием типа соединения Inner Join и типа связи “равно”. По умолчанию соединение не является принудительным (Not Enforced). Важный момент в этом примере — это то, какие поля будут размещены в отчете, будут использоваться в выборе формул или записей или будут добавляться в отчет каким-либо иным образом. В зависимости от устанавливаемого в разделе Enforce Join переключателя, в отчете потенциально будут отображаться разные записи из базы данных, а также разные типы отправляемых серверу Oracle SQL-запросов: • Not Enforced (Отключить). Эта опция не добавляет в SQL-запрос никаких дополнительных таблиц, которые нигде в отчете не используются. Например, если в отчет добавляется только поле Order_ID (Номер заказа) из таблицы Orders (Заказы) и никакие поля из таблицы Customer (Клиенты) не используются, результирующий SQL-запрос будет выглядеть следующим образом: SELECT "Orders"."ORDER_ID" FROM "XTREME"."ORDERS" "Orders" Обратите внимание на то, что таблица Customer (Клиенты) в запрос включена не была, и что выбранные тип соединения и тип связи не будут влиять на набор данных, возвращаемых из базы данных. • Enforced From (Принудительная исходная). Данная опция включит исходную таблицу в запрос, учитывая заданные для нее типы соединения и связи, даже если в отчете никакие поля исходной таблицы не используются. Например, если в отчет из таблицы Customer (Клиент) добавляется только поле Customer_ID, а из таблицы Orders (Заказы) никакие поля не добавляются, результирующий SQL-запрос будет выглядеть следующим образом: SELECT "CUSTOMER"."CUSTOMER_NAME" FROM "XTREME"."ORDERS" "ORDERS", "XTREME"."CUSTOMER" "CUSTOMER" WHERE ("ORDERS"."CUSTOMER_ID"="CUSTOMER"."CUSTOMER_ID") Обратите внимание, что таблица Orders (Заказы) все равно включается в запрос, и что выбранные тип соединения и тип связи будут влиять на набор данных, возвращаемых из базы, даже несмотря на то, что в отчете не используется ни одно поле из таблицы Orders (Заказы). Результатом является включение копий имен клиентов (Customer Name), сопоставляемых с каждым заказом. • Enforced To (Принудительная целевая). Данная опция включит целевую таблицу в запрос, учитывая заданные для нее типы соединения и связи, даже если в отчете никакие поля целевой таблицы не используются. Например, если в отчет из таблицы Orders (Заказы) добавляется только поле Order_ID, а из таблицы Customer (Клиенты) никакие поля не добавляются, результирующий SQL-запрос будет выглядеть следующим образом: SELECT "ORDERS"."ORDER_ID" FROM "XTREME"."ORDERS" "ORDERS", "XTREME"."CUSTOMER" "CUSTOMER" WHERE ("ORDERS"."CUSTOMER_ID"="CUSTOMER"."CUSTOMER_ID") Book_CR11.indb 439 27.06.2006 1:06:32 440 Часть I. Проектирование отчетов Обратите внимание, что таблица Customer (Клиенты) все равно включается в запрос, и что выбранные тип соединения и тип связи будут влиять на набор данных, возвращаемых из базы, несмотря на то, что в отчете не используется ни одно поле из таблицы Customer (Клиенты). Результатом является включение только идентификационных номеров заказов (Order ID), имеющих соответствующую им запись в таблице Customer (Клиенты) (благодаря тому, что было применено внутреннее соединение (Inner Join)), невзирая на то, что сам отчет не содержит никакой информации из таблицы Customer (Клиенты). • Enforced Both (Принудительные обе). Эта опция включает в запрос и исходную таблицу, и целевую таблицу, учитывая заданные для них тип соединения и тип связи, независимо от того, какие таблицы включены в отчет. Таким образом, в то время как на конструкцию SELECT будет влиять то, включаются ли поля из таблицы Orders (Заказы), таблицы Customer (Клиенты) или обеих таблиц, конструкции FROM и WHERE всегда будут ссылаться на обе таблицы: Какая таблица должна быть исходной (таблицей “from”), а какая — целевой (таблицей “to”)? Добавление связи на вкладке Links выполняется следующим образом: необходимо щелкнуть на поле в исходной таблице, а затем перетащить линию связи поверх нужного поля в целевой таблице. Поначалу может оказаться невозможным определить, какая же из таблиц была исходной, а какая целевой. В большинстве случаев Crystal Reports никак не будет обозначать такое различие, если используются устанавливаемые по умолчанию типы Inner Join и “равно” (=). Однако при замене типа соединения и типа связи на альтернативные или при использовании определенных баз данных или драйверов можно будет отличить, какая таблица является исходной, а какая целевой, присмотревшись внимательно к начерченной линии — со стороны исходной таблицы линия будет заканчиваться небольшим прямоугольником, а со стороны целевой таблицы — стрелкой. Возникает вопрос, имеет ли значение то, какая таблица является исходной, а какая целевой? Ответ опять-таки зависит от выбираемого типа соединения и типа связи, а также от того, устанавливается ли специальная опция для их принудительного включения. В целом, если выбрать опции Inner Join и = и при этом оставить установленной опцию Not Enforced, то, какая из таблиц является исходной, а какая целевой, особого значения иметь не будет. Однако при выборе любых других типов соединений и связи или установке любой другой, отличной от Not Enforced опции, это будет иметь значение, поскольку исходная (левая) таблица и целевая (правая) таблица определяют то, каким образом составляется SQL-запрос, и то, какие записи возвращаются. Поскольку левосторонние внешние соединения возвращают записи на основании того, какая таблица является “исходной”, а какая — “целевой”, порядок, в котором связываются таблицы, при использовании такого типа соединения будет играть очень важную роль. Если связь установлена некорректно с логической точки зрения, в отчет вернется не тот, который нужно, набор записей. Имея подозрение, что связь была установлена в обратном направлении и, желая поменять исходную и целевую таблицы местами, можно просто удалить и начертить связь заново или же щелкнуть правой кнопкой мыши на линии связи и в контекстном меню выбрать пункт Reverse Link (Изменить направление связи). Book_CR11.indb 440 27.06.2006 1:06:32 Глава 15. Составление отчетов на основе баз данных SQL 441 FROM "XTREME"."ORDERS" "ORDERS", "XTREME"."CUSTOMER" "CUSTOMER" WHERE ("ORDERS"."CUSTOMER_ID"="CUSTOMER"."CUSTOMER_ID") Результатом станет комбинация только заказов, имеющих соответствующую им запись в таблице Customer (Клиенты), и повторение полей из таблицы Customer (Клиент) для каждого подходящего заказа. Просмотр SQL-запроса Поскольку Crystal Reports работает с базами данных SQL, ему время от времени приходится преобразовывать таблицы, поля, связи, сортировку и группировку, которые использовались для разработки отчета, в синтаксис SQL. SQL-операторы, генерируемые Crystal Reports, можно просматривать с помощью пункта Show SQL Query меню Database. Ниже рассматривается вкладка Design отчета, который использует данные из образца базы XTREME, преобразованной из Microsoft Access в Microsoft SQL Server и доступной через ODBC. В этом отчете используются таблицы Orders (Заказы) и Customer (Клиенты), связанные посредством внутреннего соединения (Inner Join) и связи типа “равно” (=) по полю Customer ID. Переключатель Not Enforced был оставлен выбранным, но поля из обеих таблиц включены в отчет. Эксперт выбора записей Select Expert ограничивает отчет данными, касающимися только клиентов из США (USA). Обратите внимание на поля, помещенные в раздел подробностей. Также обратите внимание на то, что на основе поля Customer.Region была создана группа. Все сказанное проиллюстрировано на рис. 15.16. Рис. 15.16. Вкладка Design отчета, использующего данные из образца базы XTREME Чтобы просмотреть SQL-оператор, который Crystal Reports создает для запроса, отправляемого базе данных, выберите в меню Database пункт Show SQL Query. Появится диалоговое окно Show SQL Query (Показать SQL-запрос), показанное на рис. 15.17. Обратите внимание на различные части, или конструкции, SQL-оператора: • SELECT. Подбирает поля базы данных, необходимые для отчета (а именно для раздела подробностей, формул, группирования, выборки записей и так далее). • FROM. Выбирает таблицы для использования и конкретизирует тип соединения для связывания таблиц. • WHERE. Задает правило выбора записей. • ORDER BY. Требует, чтобы сервер SQL перед отправкой записей обратно клиенту сортировал их в порядке Customer.Region (для группы Region). Book_CR11.indb 441 27.06.2006 1:06:33 442 Часть I. Проектирование отчетов Рис. 15.17. Диалоговое окно Show SQL Query Синтаксис SQL может меняться в зависимости от типа базы данных, на основе которой составляется отчет, и от того, используется ли для соединения с базой ODBC или прямые драйверы. Синтаксис для соединения таблиц также будет разным. И фактическое соединение таблиц может отображаться либо в конструкции FROM, либо в конструкции WHERE. На рис. 15.18 представлено то же диалоговое окно Show SQL Query для “родного” соединения с базой данных Oracle, использующего “родной” драйвер (обратите внимание, помимо всего прочего, на то, что соединение и связывание выполняются в конструкции WHERE, а не в конструкции FROM). Рис. 15.18. Диалоговое окно Show SQL Query при соединении с базой данных Oracle А на рис. 15.19 показано то же окно Show SQL Query для базы данных XTREME. MBD в формате Microsoft Access, доступ к которой осуществляется через ODBC (запрос подобен запросу, отправляемому базе данных SQL Server, только конструкция WHERE не содержит символ “N” и для имен полей используется несколько иная пунктуация). Хотя вы можете и не считать себя экспертом по базам данных и не иметь привычку создавать на лету огромные по размерам SQL-операторы, возможность просмотра SQLзапроса, отправляемого Crystal Reports серверу, имеет одно преимущество: она крайне полезна при возникновении проблем с производительностью или каких-нибудь других сложностей во время работы с отчетом. Book_CR11.indb 442 27.06.2006 1:06:33 Глава 15. Составление отчетов на основе баз данных SQL 443 Рис. 15.19. Диалоговое окно Show SQL Query при соединении с базой данных Microsoft Access через ODBC Например, необходимо сделать так, чтобы большая часть, если не все условия выбора записей преобразовывались в конструкцию WHERE SQL-запроса. Это увеличит до предела количество операций, выполняемых сервером базы данных, и сведет к минимуму объем данных, которые придется обрабатывать Crystal Reports после того, как эти данные будут возвращены сервером. Вопросы, связанные с производительностью, рассматриваются далее в этой главе. Команды SQL в Crystal Reports Как уже упоминалось ранее, SQL-запрос, сгенерированный Crystal Reports, можно просмотреть в диалоговом окне Show SQL Query. Запрос формируется Crystal Reports внутренне на основе опций, выбираемых в диалоговом окне эксперта Database Expert, диалоговом окне эксперта Select Expert, на вкладке Design и в других местах. Однако если вы хорошо разбираетесь в языке SQL используемой версии базы данных, у вас может возникнуть желание создать свой собственный SQL-запрос и основать отчет на нем. Сделать это можно с помощью команды SQL (SQL Command). Механизм SQL-команд позволяет создавать “сквозной” SQL-оператор, выполняющий более специфические запросы на сервере базы данных, такие как агрегированные функции, запросы типа UNION или вложенные запросы типа SELECT. После того, как SQL-команда создана, ее можно использовать в качестве основы для отчета (SQL-команда похожа на таблицу) или добавить ее в репозиторий Crystal Reports Server/BusinessObjects Enterprise, так чтобы другие разработчики отчетов могли использовать ее в качестве основы для разрабатываемых ими отчетов. Создание SQL-команды Прежде чем приступать к созданию SQL-команды, потребуется подключиться к базе данных, которая будет служить основой для этой команды. В начале, когда отчет только создается, к базе данных можно подключиться с помощью эксперта Database Expert, как описывалось ранее в этой главе. Если необходимо создать SQL-команду после того, как разработка отчета началась, просто отобразите снова диалоговое окно эксперта Database Expert, воспользовавшись соответствующей кнопкой панели инструментов или выбрав в меню Database пункт Database Expert. Book_CR11.indb 443 27.06.2006 1:06:33 444 Часть I. Проектирование отчетов После того, как соединение с базой данных установлено, в диалоговом окне Database Expert над категориями таблиц, представлений и хранимых процедур в списке Available Data Sources появится опция Add Command (Добавить команду). Дважды щелкните на этой опции, чтобы вывести диалоговое окно Add Command To Report (Добавить команду в отчет), показанное на рис. 15.20. Ввод SQLоператора выполняется здесь Удаление параметра времени выполнения Изменение параметра времени выполнения Добавление параметра времени выполнения Рис. 15.20. Диалоговое окно Add Command To Report Начните с ввода в соответствующем поле SQL-оператора, который будет использоваться для команды. Обратите внимание, что функции наподобие “Expert” или “Build” в этом диалоговом окне будут не доступны — придется самостоятельно вводить SQLоператор в корректном формате, соответствующем используемому драйверу или соединению с базой данных. При наличии сомнений по поводу синтаксиса SQL можете создать SQL-оператор с помощью инструмента, предоставляемого производителем базы данных. Устранив ошибки в SQL-запросе посредством такого инструмента, скопируйте SQL-код в буфер обмена Windows и вставьте оператор в диалоговое окно Add Command to Report. После щелчка на кнопке OK в диалоговом окне Add Command To Report Crystal Reports отправит команду базе данных для синтаксической проверки. В случае наличия ошибки драйвер базы данных вернет сообщение с соответствующим описанием. Затем снова появится диалоговое окно Add Command To Report, в котором можно будет откорректировать SQL-оператор и опять щелкнуть на кнопке OK. После того, как будет предоставлен корректный SQL-оператор, диалоговое окно Add Command To Report закроется и в списке Selected Tables, расположенном в правой части диалогового окна Database Expert, в качестве имени таблицы появится надпись “Command”. При желании дать SQL-команде более описательное имя, выделите ее в списке Selected Tables, нажмите и удерживайте кнопку мыши в течение нескольких секунд: имя команды будет переведено в режим редактирования, в котором слово “Command” можно будет заменить чем-то более информативным (обратите внимание на то, что использование пробелов не допускается). Book_CR11.indb 444 27.06.2006 1:06:33 Глава 15. Составление отчетов на основе баз данных SQL 445 Если требуется просмотреть или отредактировать содержимое созданной ранее команды, щелкните правой кнопкой мыши на команде в списке Selected Tables. В появившемся контекстном меню выберите пункт View Command (Показать команду) или Edit Command (Редактировать команду) — в любом случае SQL-команда появится в том же диалоговом окне, с помощью которого она создавалась. При выборе опции View Command отредактировать команду будет нельзя — при выборе опции Edit Command команду можно будет модифицировать (то есть добавить, изменить или удалить ее параметры) или добавить в репозиторий Crystal Reports Server/BusinessObjects Enterprise. Внимание! Чтобы удалить ненужную команду, выберите ее в списке Selected Tables и щелкните на кнопке с изображением стрелки влево. Помните, что команда будет удалена безвозвратно. Команда не будет перенесена в список в левой части диалогового окна Database Expert, из которого ее можно было бы добавить обратно в отчет. Команда удаляется навсегда. Добавление параметра в команду Как и в случае с отчетами, может потребоваться, чтобы SQL-команда при передаче в базу данных выдавала подсказку на ввод определенной информации. Это, например, позволит запускать команду для определенного отдела, ограничивать ее конкретными временными рамками или уровнями продаж. Добиться подобных результатов можно, создав параметр в диалоговом окне Command Parameter (Параметр команды) и затем включив его в SQL-оператор. Чтобы добавить новый параметр, щелкните на кнопке Create (Создать), которая расположена рядом со списком Parameter List (Список параметров). Появится диалоговое окно Command Parameter, показанное на рис. 15.21. Задайте имя параметра Введите необязательный текст подсказки Выберите тип данных параметра Добавьте необязательное значение по умолчанию для параметра Рис. 15.21. Диалоговое окно Command Parameter Введите нужную информацию в этом диалоговом окне: необходимо, по крайней мере, выбрать имя для параметра и тип значения. Две других опции — текст подсказки (Prompting Text) и значение по умолчанию (Default Value) — являются необязательными. Введите для параметра имя, которое не используется никакими другими параметрами SQL-команды, и удостоверьтесь, что выбрали тип данных, который соответствует подразумеваемому для параметра применению (если параметр будет использоваться для сравнения с числовым полем базы данных, для опции Value Type (Тип значения) выбе- Book_CR11.indb 445 27.06.2006 1:06:33 446 Часть I. Проектирование отчетов рите значение Number (Число)). Выбрав требуемые значения для опций, щелкните на кнопке OK. Параметр будет добавлен в список Parameter List. Если впоследствии понадобится изменить или удалить параметр, выделите его в списке Parameter List. Затем щелкните на кнопке Modify (Изменить) или Delete (Удалить). После щелчка на кнопке Delete параметр будет просто удален из списка (также не забудьте удалить все ссылки на этот параметр в SQL-операторе). После щелчка на кнопке Modify появится диалоговое окно Command Parameter, в котором можно будет изменить любой из элементов параметра. После того, как параметр создан, чтобы он заработал, необходимо где-нибудь в SQLоператоре предусмотреть ссылку на него. Например, если требуется заменить жестко закодированное число в конструкции WHERE на параметр, отредактируйте SQL-оператор, поставив вместо жестко закодированного числа имя параметра. При этом можно либо ввести имя параметра непосредственно в самом SQL-операторе (включая круглые скобки вокруг имени параметра и предшествующий имени параметра вопросительный знак), либо установить курсор в то место, куда должно быть помещено имя параметра, и дважды щелкнуть на параметре в списке Parameter List. Таким образом, бывшую конструкцию с жестко закодированным числом: WHERE "Order Amount" > 1000 можно заместить версией, управляемой параметром: WHERE "Order Amount" > {?Order Limit} Добавив один или более параметров в SQL-команду, щелкните на кнопке OK: последует приглашение ввести значения для параметров, после чего команда снова будет отправлена в базу данных для проверки корректности синтаксиса SQL. Любые появившиеся из-за добавления параметра ошибки будут отображены в соответствующем сообщении, а затем опять откроется диалоговое окно Add Command To Report, в котором эти ошибки можно будет исправить. Если команда синтаксически правильна, отобразится диалоговое окно эксперта Database Expert. Совет. При желании сделать SQL-команду доступной для других пользователей в организации, скопируйте текст команды в какой-нибудь совместно используемый через сеть текстовый файл или, при наличии установленной системы Crystal Reports Server/BusinessObjects Enterprise, сохраните SQL-команду в репозитории. Вопрос использования SQL-команд из репозитория более подробно рассматривается в главе 17. Использование SQL-команды в отчете После создания SQL-команда появится в списке Selected Tables диалогового окна Database Expert подобно таблице базы данных. После закрытия диалогового окна эксперта Database Expert все возвращаемые этой SQL-командой поля появятся в окне проводника Field Explorer — просто перетащите их в отчет точно так же, как перетащили бы любое другое поле базы данных. Еще, прежде чем продолжить разработку отчета, SQL-команду можно даже связать с другой таблицей базы данных. А впоследствии можно добавить в отчет дополнительную таблицу и связать ее с имеющейся SQL-командой по одному или более полям. При связывании дополнительных таблиц с SQL-командой помните о том, что в таком случае количество доступных опций для выбора типов соединений и типов связи будет ограниченным, о чем рассказывалось ранее в этой главе, в разделе “Использование множества типов баз данных в одном отчете”. Book_CR11.indb 446 27.06.2006 1:06:33 Глава 15. Составление отчетов на основе баз данных SQL 447 Использование SQL-команды, основанной на параметре. Если в SQL-команду был добавлен один или несколько параметров, во время создания команды и позже, при обновлении основанного на этой команде отчета, будет появляться приглашение на ввод значений параметров. Кроме того, параметр будет отображаться в окне проводника Field Explorer, как будто он был добавлен в отчет (в главе 13 приведена дополнительная информация о полях параметров отчета). При обновлении отчета последует приглашение выбрать перезапуск отчета с существующими значениями параметров или ввод новых значений параметров. При выборе второй опции появится уже знакомая подсказка с предложением ввести значения для параметров SQL-команды. Добавленные в команду параметры могут размещаться непосредственно в отчете и даже использоваться в формулах отчета. Внимание! Во время создания включаемого в SQL-команду параметра дополнительные типы параметров, такие как параметры с множественными значениями или параметры с диапазонами, для выбора не доступны. И даже при редактировании готового параметра в окне проводника Field Explorer такой выбор вряд ли будет возможен. Однако вы можете создавать статические и динамические списки выбора для параметров SQL-команды, а также использовать результирующие данные SQL-команды в качестве источника данных для динамических/каскадных списков выбора. Более подробная информация об этих опциях представлена в главе 13. Включаемый в команду параметр можно даже переименовать в окне проводника Field Explorer точно так же, как поле обычного параметра (хотя имя параметра в SQL-команде это не изменит). Использование хранимых процедур SQL Большинство систем баз данных SQL включает возможность использования хранимых процедур. Хранимая процедура (stored procedure) — это SQL-запрос, который был вычислен, или “скомпилирован”, сервером базы данных заранее и хранится на сервере наряду с обычными таблицами базы данных. Поскольку хранимая процедура скомпилирована заблаговременно, она часто выполняется быстрее, чем динамически отправляемый SQL-запрос. Хранимые процедуры могут создаваться разработчиком или администратором базы данных для специфических запросов, которые будут выполняться часто. Для увеличения гибкости хранимые процедуры могут принимать один или более параметров, предлагающих пользователю ввести то или иное значение, которое затем применяется хранимой процедурой для выполнения запроса. Например, во время выполнения хранимой процедуры, которая возвращает несколько полей из связанных таблиц на основе параметров Country (Страна) или Order Date (Дата заказа), последует приглашение ввести название определенной страны и дату заказа. После этого процедура вернет набор результатов, содержащий только записи, соответствующие двум указанным значениям. Выбор хранимых процедур Crystal Reports интерпретирует хранимые процедуры практически идентично обычным таблицам базы данных. Хранимые процедуры отображаются в диалоговом окне эксперта Database Expert и используются в отчете точно так же, как и обычные таблицы базы данных. Единственное различие состоит в том, что хранимая процедура может иметь ассоциируемые с ней параметры. Однако можно выбрать, должны или не должны Book_CR11.indb 447 27.06.2006 1:06:34 448 Часть I. Проектирование отчетов хранимые процедуры отображаться в диалоговом окне Database Expert. Самый быстрый способ обеспечить их отображение — щелкнуть правой кнопкой мыши в списке Available Data Sources диалогового окна Database Expert и в контекстном меню выбрать пункт Options. Затем в диалоговом окне Database Options необходимо проверить, установлен ли флажок Stored Procedures (Хранимые процедуры), как показано на рис. 15.7. Эту опцию можно включить для всех новых отчетов, установив аналогичный флажок на вкладке Database (База данных) диалогового окна Options (Параметры), которое доступно через меню File. В результате при открытии базы данных SQL наряду с обычными таблицами будут отображаться и хранимые процедуры (рис. 15.22). Рис. 15.22. Отображение хранимых процедур наряду с обычными таблицами Совет. Crystal Reports позволяет устанавливать связи между хранимыми процедурами и другими таблицами базы данных. Только в этом случае следует помнить об ограничениях, касающихся выбора типа соединения и типа связи, о которых рассказывалось ранее в этой главе, в разделе “Использование множества типов баз данных в одном отчете”. Работа с параметрами хранимой процедуры После того, как хранимая процедура, на основе которой будет создаваться отчет, выбрана, последует приглашение ввести в диалоговом окне Enter Values значения параметров этой хранимой процедуры (рис. 15.23). Данное диалоговое окно идентично диалоговому окну для создания полей параметров, которое рассматривалось в главе 13. Введите необходимые значения для параметров и щелкните на кнопке OK. Затем можете просто спокойно продолжить процесс создания своего отчета. Хранимая процедура предоставит список полей, которые можно использовать в отчете, подобно обычной таблице базы данных. Book_CR11.indb 448 27.06.2006 1:06:34 Глава 15. Составление отчетов на основе баз данных SQL 449 Рис. 15.23. Диалоговое окно Enter Values для ввода значений параметров хранимой процедуры Параметры хранимых процедур ведут себя практически идентично полям параметров Crystal Reports. Параметры хранимых процедур будут отображаться в категории Parameter Fields (Поля параметров) окна проводника Field Explorer. Параметр хранимой процедуры можно редактировать подобно обычному параметру отчета (разве что удалить его из окна проводника Field Explorer не получится). Как и в случае с параметрами SQL-команд (они рассматривались ранее в этой главе), выбор дополнительных типов параметров, таких как параметры с множеством значений или параметры диапазонов, будет невозможен. Однако можно будет создать статические или динамические/каскадные списки выбора, установить ограничения по длине или маску редактирования для строковых параметров либо определить ограничения по диапазону для числовых параметров и параметров типа даты. Для получения более подробной информации об этих опциях обратитесь в главу 13. Включаемый в процедуру параметр можно будет даже переименовать в окне проводника Field Explorer точно так же, как обычное поле параметра (хотя имя параметра в хранимой процедуре это не изменит). Во время обновления отчета будет появляться то же диалоговое окно Refresh Report Data (Обновить данные отчета), что и при использовании полей параметров, с предложением выбрать одну из следующих опций: Use Current Parameter Values (Использовать текущие значения параметров) или Prompt For New Parameter Values (Запросить новые значения параметров), как показано на рис. 15.24. При выборе второй опции сервер запустит хранимую процедуру с новыми значениями и возвратит Crystal Reports новый результирующий набор. Book_CR11.indb 449 27.06.2006 1:06:34 450 Часть I. Проектирование отчетов Рис. 15.24. Диалоговое окно Refresh Report Data Использование полей SQL-выражений Иногда необходимо, чтобы сервер базы данных фактически выполнял некоторые вычисления, отсылая вычисленное поле обратно вместе с результирующим набором базы данных. Добиться этого можно с помощью полей SQL-выражений, создаваемых непосредственно в окне Filed Explorer. SQL-выражение (SQL expression) подобно формуле за исключением того, что оно полностью состоит из полей базы данных и SQL-функций, поддерживаемых языком определенного сервера SQL, с которым вы работаете. Иногда использование SQL-выражения вместо SQL-формулы дает некоторые преимущества. Выражение вычисляется на стороне сервера, а не клиента, что может улучшить показатели производительности. Главное преимущество касается вычислений или других специализированных функций, которые используются в операциях по выбору записей. В случае применения в операции выбора записей формулы Crystal Reports сервер базы данных обычно не может ее выполнить, поскольку не понимает языка формул Crystal Reports. Однако если создать SQL-выражение и использовать его в этой операции выборки записей, SQL-сервер полностью поймет выражение, и операция выборки записей будет выполняться сервером базы данных. Создание SQL-выражений Первое необходимое условие для применения SQL-выражений заключается в том, что использоваться должна база данных SQL или ODBC. При использовании базы данных ПК, не работающей с SQL-интерфейсом, SQL-выражения не применяются, и в окне проводника Field Explorer даже не будет отображаться соответствующая категория. Также использовать SQL-выражения не получится и в тех случаях, когда отчет основан на одной или более SQL-командах, хранимых процедурах или представлениях Business View. Когда применяется прямое соединение с базой данных SQL, окно проводника Field Explorer включает дополнительную категорию под названием SQL Expression Fields (Поля SQL-выражений). Щелкните на кнопке Field Explorer (Проводник полей), расположенной в панели стандартных инструментов, или воспользуйтесь пунктом Field Explorer меню View (Вид), чтобы отобразить диалоговое окно Field Explorer (или, если окно проводника Field Explorer было свернуто посредством щелчка на значке с изображением кнопки, наведите на него курсор мыши). Затем щелкните на категории SQL Expression Fields (Поля SQL-выражения) и щелкните на кнопке New (Создать), расположенной в панели Book_CR11.indb 450 27.06.2006 1:06:34 Глава 15. Составление отчетов на основе баз данных SQL 451 инструментов проводника полей, или же щелкните правой кнопкой мыши на категории SQL Expression Fields и в появившемся контекстном меню выберите пункт New. Процесс создания SQL-выражения во многом подобен процессу создания формул Crystal Reports (см. главу 5). Сначала последует приглашение присвоить SQL-выражению имя. Как и в случае с именами формул, имена SQL-выражений должны быть достаточно короткими и легкими для понимания. В имя можно включать пробелы, а также заглавные и строчные буквы. При размещении SQL-выражения в разделе подробностей отчета присваиваемое SQL-выражению имя будет также и заголовком столбца. Сразу после присвоения имени SQL-выражению и щелчка на кнопке OK откроется диалоговое окно SQL Expression Editor (Редактор SQL-выражений), показанное на рис. 15.25. Список полей базы данных, доступных для SQLвыражения Доступные встроенные SQLоперации, используемые базой данных и драйвером Доступные встроенные SQLфункции, используемые базой данных и драйвером Текст SQLвыражения Рис. 15.25. Редактор SQL-выражений Обратите внимание на схожие черты между редактором SQL-выражений и другими доступными в Crystal Reports редакторами формул. Создание SQL-выражений в сущности то же самое, что и создание других формул: введите выражение непосредственно в текстовой области Formula (Формула) или дважды щелкните в верхней части каждого из трех полей, если необходима помощь в построении выражения. Обратите внимание на то, что при работе с формулами, полями параметров и результирующими полями Crystal Reports добавляет в начале имени SQL-выражения специальный символ процента (%), который служит для обозначения полей SQL-выражения. Функции и операторы, доступные в редакторе SQL-выражений, будут меняться в зависимости от используемой базы данных и драйвера. Если вы посмотрите на дерево функций на рис. 15.26, то увидите там конкретный набор доступных SQL-функций. Book_CR11.indb 451 27.06.2006 1:06:35 452 Часть I. Проектирование отчетов Рис. 15.26. Изменения в SQL-запросе после размещения SQL-выражения в разделе подробностей отчета В данном примере представлены функции для отчета, использующего Microsoft Access через ODBC. Для другого метода подключения с этой же базой данных или для базы данных другого типа диалоговое окно редактора SQL-выражений будет отображать совершенно иной набор SQL-функций. Поэтому после изменения используемой в отчете базы данных с помощью пункта Set Location (Установить расположение) меню Database, скорее всего, потребуется отредактировать или изменить некоторые SQL-выражения. Для получения более подробной информации о различных встроенных SQLфункциях вашей определенной базы данных или драйвера, просмотрите документацию по этой базе данных или драйверу. Например, может возникнуть потребность, чтобы у просматривающего отчет пользователя была возможность с помощью всего лишь одного поля параметра задавать полностью или частично имя контактного лица для поиска. Если клиент, контактные данные которого совпадают с введенными данными, существует, он будет включен в отчет. В таблице Customer (Клиенты) образца базы данных XTREME контактная информация фактически разнесена по отдельным полям базы данных First Name (Имя) и Last Name (Фамилия). Без использования SQL-выражения существует два способа настройки такого поиска: • Создать два поля параметров — одно для имени, а другое для фамилии — и попытаться сравнить их с полями базы данных. • Создать формулу Crystal Reports, объединяющую имя и фамилию, и сравнить формулу с полем параметра. Однако проблемы возникают при использовании любого из этих двух способов. Если выбирается первый вариант, для просматривающего отчет пользователя становится намного сложнее ввести полностью или частично имя контактного лица, такое как, например, “Chris” (чтобы отыскать, скажем, всех клиентов с именем “Christopher” и “Christine”), поскольку для игнорирования поля параметра с фамилией, если пользователь желает выполнить поиск только по именам (полным или неполным), потребуется дополнительная логика. Или же, если работающий с отчетом пользователь желает просмотреть всех клиентов с фамилией “Jones”, независимо от их имени, тогда для поля параметра с именем понадобится применить подобную логику. Пользователю для поиска нужных клиентов было бы намного проще иметь возможность ввести “Chris*” или “*Jones”. При выборе второго варианта поиск по полностью или частично введенному имени, описанный выше, будет работать, но поскольку имя и фамилия объединяются в формуле, Book_CR11.indb 452 27.06.2006 1:06:35 Глава 15. Составление отчетов на основе баз данных SQL 453 операция по выбору записей не будет выполняться на сервере базы данных (памятуйте о том, что большинство формул Crystal Reports нельзя преобразовать в SQL, так что выбор записей будет выполняться на стороне клиента). Используя SQL-выражения, вы получаете возможность объединить преимущества обоих способов. Имя и фамилию можно объединить в один объект и сравнить с полем параметра. Но поскольку операция конкатенации выполняется на сервере базы данных, он также будет выполнять и операцию выборки записей, отправляя обратно клиенту данные только о запрашиваемых клиентах, а не обо всех клиентах. SQL-выражение, позволяющее добиться таких результатов, удивительно похоже на формулу Crystal Reports: `Customer`.`Contact First Name` + ' ' + `Customer`.`Contact Last Name` Однако обратите внимание на различия: • Имена полей не заключаются в фигурные скобки. • Строковый литерал, который разделяет поле имени и поле фамилии, должен использовать обратные одинарные кавычки — двойные кавычки работать не будут. После того, как SQL-выражение создано, его можно перетащить в отчет подобно любому полю базы данных, полю формулы или другому объекту. Также его можно использовать в обычных формулах отчета или в формулах для условного форматирования. Обратите внимание на изменения в SQL-запросе (открыв его для просмотра путем выбора в меню Database пункта Show SQL Query), появившиеся после размещения упомянутого SQL-выражения в разделе подробностей (рис. 15.26). Хотя в отчете полю SQL-выражения было присвоено имя, Crystal Reports непосредственно в SQL-оператор добавляет только саму формулу SQL-выражения. Имя поля SQL-выражения просто присутствует в эксперте Select Expert и в других частях отчета. Для применения этого SQL-выражения в операции выбора записей воспользуйтесь доступной в диалоговом окне эксперта Select Expert операцией Like, которая позволяет указывать групповые символы при поиске по объединенным имени и фамилии контактного лица. Если строковое поле параметра с именем {?Contact Prompt} уже создано, диалоговое окно Select Expert будет выглядеть так, как показано на рис. 15.27. Если после этого при обновлении отчета и появления приглашения указать значения для поля параметра {?Contact Prompt} вы введете Chris*, то получите результаты, показанные на рис. 15.28. SQL-запрос, отправляемый серверу базы данных, показан на рис. 15.29. Рис. 15.27. Диалоговое окно Select Expert, в котором используется поле параметра {?Contact Prompt} Book_CR11.indb 453 27.06.2006 1:06:35 454 Часть I. Проектирование отчетов Рис. 15.28. Результат ввода значения Chris* для поля параметра {?Contact Prompt} Рис. 15.29. SQL-запрос, отправляемый серверу базы данных, результаты выполнения которого показаны на рис. 15.28 Обратите внимание, что конструкция WHERE включает текст формулы SQL-выражения и SQL-операцию сравнения, разрешающую поиск с использованием групповых символов. В конечном итоге получаются гибкие формулы Crystal Reports в сочетании с высокой скоростью выполнения на сервере операций выбора записей. Выполнение группирования на сервере базы данных Еще одной мощной функцией серверов баз данных SQL является обработка данных на стороне сервера, в частности группирование. Группирование на сервере касается способности SQL-сервера выполнять обобщающие вычисления по группам записей, возвращая клиенту только промежуточные суммы, сводки и другие итоговые данные. При создании итогового отчета (что случается достаточно часто), данная способность сервера может существенно сократить объем пересылаемых через сеть данных. Итоговые вычисления также могут выполняться не на клиенте, а на сервере. Рассмотрим простой отчет по объемам продаж в регионах (Sales by Regions), который показан на рис. 15.30. Это начало отчета, который просто включает всех клиентов из США (USA), группируя их по регионам и отображая для каждой отдельной группы количество клиентов и промежуточную сумму продаж. Поскольку отображается и раздел подробностей, серверу базы данных потребуется пересылать в Crystal Reports данные всех клиентов из США. Crystal Reports по мере обработки отчета фактически вычисляет на машине клиента промежуточную сумму продаж и количество клиентов. Это становится ясно при просмотре SQL-запроса для данного отчета (рис. 15.31). Book_CR11.indb 454 27.06.2006 1:06:35 Глава 15. Составление отчетов на основе баз данных SQL 455 Рис. 15.30. Пример отчета по объемам продаж в регионах Рис. 15.31. SQL-запрос для отчета, показанного на рис. 15.30 Обратите внимание на то, что этот достаточно простой SQL-оператор просто подбирает поля базы данных и ограничивает записи только записями с данными по США. Единственной используемой здесь серверной функцией, помогающей с группированием, является конструкция ORDER BY, выполняющая предварительную сортировку набора результатов по регионам перед его отправкой клиенту. Чтобы создать итоговый отчет, просто скройте раздел подробностей, щелкнув правой кнопкой мыши в закрашенной серым цветом области Details, которая расположена в левой части вкладки Design, и в появившемся контекстном меню выбрав пункт Hide (Drill-Down OK) (Скрыть (детализация включена)). Теперь отчет будет показывать только итоговые данные: никакая информация об отдельных клиентах отображаться не будет (рис. 15.32). Однако если вы посмотрите на SQL-запрос даже после обновления отчета, то изменений в нем не найдете, поскольку функция группирования на сервере по умолчанию отключена. Сервер по-прежнему отправляет в Crystal Reports сведения об абсолютно всех клиентах из США, а Crystal Reports приходится по-прежнему обрабатывать записи отдельных клиентов, чтобы вычислить количество клиентов и среднюю сумму продаж. Поля базы данных в разделе подробностей являются скрытыми, но база данных возвращает их в любом случае. Book_CR11.indb 455 27.06.2006 1:06:35 456 Часть I. Проектирование отчетов Рис. 15.32. Отчет по объемам продаж в регионах, отображающий только итоговые данные Включение функции группирования на сервере Существует несколько способов включения функции, отвечающей за выполнение группирования на сервере: • Чтобы включить эту функцию только для текущего отчета, выберите в меню Database пункт Perform Grouping on Server (Выполнять группирование на сервере). Также можете выбрать в меню File пункт Report Options (Параметры отчета) и в появившемся диалоговом окне Report Options (Параметры отчета) установить флажок Perform Grouping on Server (Выполнять группирование на сервере). Или же щелкните правой кнопкой мыши в области Available Data Sources диалогового окна эксперта Database Expert и в контекстном меню выберите пункт Options. • Чтобы включить эту функцию для всех создаваемых в будущем отчетов, выберите в меню File пункт Options (Параметры) и отметьте флажок Perform Grouping on Server на вкладке Database (База данных) диалогового окна Options (Параметры). После установки данной опции отчет измениться не должен. А вот в SQL-запросе появятся существенные изменения, как показано на рис. 15.33. Рис. 15.33. SQL-запрос после включения функции группирования на сервере Book_CR11.indb 456 27.06.2006 1:06:36 Глава 15. Составление отчетов на основе баз данных SQL 457 Конструкция SELECT теперь включает только поле группы (в данном случае — Region (Регион)) и две функции агрегирования, выполняющие операции суммирования и подсчета количества клиентов непосредственно на сервере перед отправкой данных клиенту. Также появилась новая конструкция GROUP BY, которой до этого не было. Эта новая конструкция заставляет сервер выполнять группирование записей базы данных и все суммарные вычисления. Клиенту будут отсылаться только итоговые суммы. Условия для выполнения группирования на сервере Чтобы можно было использовать функцию группирования на сервере, отчет должен соответствовать определенным критериям и быть составленным определенным образом. Задумавшись над тем, как сервер группирует и суммирует записи, вы начнете понимать, почему ваш отчет должен отвечать требованиям, которые перечислены в табл. 15.6. Таблица 15.6. Условия для выполнения группирования на сервере Условие Причина В отчете должна быть, по крайней мере, одна группа. Для добавления в SQL-запрос конструкции GROUP BY в отчете должна быть определена, по крайне мере, одна группа. Раздел подробностей должен быть скрыт. Если раздел подробностей является видимым, никакого группирования на сервере выполняться не будет, потому что сервер должен будет отсылать клиенту отдельные записи базы данных для отображения в этом разделе. Включайте в заголовки и нижние колонтитулы групп только поля групп или поля итоговых сумм. Если включаются любые другие поля базы данных (или поля формул, которые содержат не поля групп или итоговых сумм, а что-нибудь другое), серверу для надлежащего отображения отчета придется отсылать клиенту данные раздела подробностей. Не выполняйте группирование или выбор записей на основе формул Crystal Reports. Поскольку многие формулы Crystal Reports не могут быть преобразованы в SQL, они должны вычисляться на стороне клиента, прежде чем отчет сможет их выбрать или сгруппировать. Из-за этого условия серверу приходится отсылать клиенту записи раздела подробностей. Это еще одна причина, по которой предпочтение может отдаваться применению SQL-выражений вместо формул, поскольку SQLвыражения могут использоваться для выполнения группирования на сервере. Промежуточные суммы должны основываться на итоговых полях. Если для промежуточных сумм (см. главу 5) в качестве основы используются поля подробностей, Crystal Reports для их подсчета во время обработки отчета потребуются данные раздела подробностей, а это препятствует тому, чтобы группирование выполнялось на сервере. Отчет может содержать только итоговые поля Sum, Maximum, Minimum и Count. Crystal Reports не может преобразовывать другие типы итоговых функций в SQL. Следовательно, при использовании других функций группирование будет выполняться на стороне клиента. Сортировка групп отчета может выполняться только по возрастанию или убыванию. Группирование в заданном порядке выполняться не будет. Поскольку Crystal Reports в качестве основы для группирования в специально заданном порядке использует свою собственную внутреннюю логику, ему необходимы записи раздела подробностей для того, чтобы правильно определить, в какие заданные группы их помещать, а это требует отправки таких записей сервером. Эффекты детализации Когда Crystal Reports выполняет свое собственное группирование, принцип детализации отчета достаточно прост. Даже если раздел подробностей или заголовки и нижние колонтитулы групп не отображаются, Crystal Reports все равно обрабатывает их и хранит создаваемые ими данные. Когда просматривающий отчет пользователь дважды щелкает кнопкой мыши для детализации определенной группы, Crystal Reports просто открывает новую вкладку детализации и показывает данные, которые раньше не отображались. Book_CR11.indb 457 27.06.2006 1:06:36 458 Часть I. Проектирование отчетов Однако, при включении функции группирования на сервере данных для отображения в разделе подробностей, когда пользователь детализирует отчет, не будет — клиенту отсылаются только суммарные данные! Тем не менее, Crystal Reports все равно разрешает детализацию, он просто отправляет другой запрос серверу SQL каждый раз, когда пользователь детализирует тот или иной объект в отчете. Второй запрос просто запрашивает данные раздела подробностей для детализируемой группы, добавляя дополнительные критерии в конструкцию WHERE. Этот метод позволяет воспользоваться преимуществами выполняемого на сервере группирования, при этом по-прежнему обеспечивая высокую интерактивность детализации. Цена, которую приходится заплатить пользователю — это дополнительное время, необходимое серверу SQL для обработки второго запроса. Посмотрите на рис. 15.34. Обратите внимание на то, что пользователь детализировал определенный регион. Появилась новая вкладка детализации, отображающая подробные данные по этому региону. Обратите внимание на новый динамически сгенерированный SQL-запрос. Рис. 15.34. SQL-запрос, сгенерированный для целей детализации Просмотреть создаваемые для целей детализации SQL-запросы можно, выбрав при просмотре вкладки детализации в меню Database пункт Show SQL Query. Если вы вернетесь на основную вкладку Preview и отобразите запрос оттуда, вы опять увидите конструкцию GROUP BY. Вопросы, касающиеся производительности С базами данных SQL (или базами данных ПК, соединение с которыми устанавливается через ODBC) связан совершенной иной набор характеристик производительности, нежели с базами данных ПК. Как уже не раз упоминалось в этой главе, одним из главных преимуществ баз данных SQL по сравнению с базами данных ПК является способность сервера базы данных выполнять выбор записей и группирование локально сразу же при Book_CR11.indb 458 27.06.2006 1:06:36 Глава 15. Составление отчетов на основе баз данных SQL 459 получении SQL-запроса из Crystal Reports. Сервер возвращает набор результатов обратно в Crystal Reports только после того, как самостоятельно выполнит выборку записей и группирование. Переложите всю работу на сервер Как правило, при составлении отчетов пользователь всегда желает, чтобы большая часть операций по обработке данных выполнялась сервером базы данных. Программное обеспечение для серверов баз данных рассчитано и соответствующим образом настроено для выполнения как раз таких операций, и часто устанавливается на очень мощных машинах с целью еще большего увеличения производительности. Наличие любой ошибки, которая может стать причиной того, что сервер будет отсылать обратно каждую запись базы данных (а базы данных SQL, содержащие миллион и более записей, — далеко не редкость) для ее локальной обработки системой Crystal Reports, в большинстве случаев приводит к неудовлетворительным показателям производительности. Чтобы увидеть, какая часть запроса вычисляется (или вычисляется ли вообще хоть какая-нибудь часть запроса) на сервере базы данных, просмотрите запрос, выбрав в меню Database пункт Show SQL Query. Обратите внимание на конструкцию WHERE. Если таковая отсутствует, отбор записей вообще не будет выполняться на сервере, каждая запись в базе данных будет пересылаться на ПК для проведения сортировки самой системой Crystal Reports. А на это может уходить очень много времени! При выполнении сортировки или группирования в отчете поищите конструкцию ORDER BY. Если таковая имеется, сервер базы данных будет предварительно сортировать данные перед их отправкой Crystal Reports. Это может существенно ускорить форматирование отчета. Если конструкция ORDER BY отсутствует, но группирование или сортировка была задана, сервер будет отсылать записи Crystal Reports несортированными, и клиент должен будет сортировать их самостоятельно. При желании использовать функцию группирования на сервере удостоверьтесь в наличии в запросе конструкции GROUP BY. Это гарантирует, что сервер будет выполнять группирование и агрегирование данных до их отправки Crystal Reports. Если упомянутая конструкция отсутствует, посмотрите, удовлетворены ли условия использования функции группирования на сервере, перечисленные в табл. 15.6. Для гарантии выполнения операции выбора записей на сервере Crystal Reports необходимо преобразовать формулу выбора записей в SQL-конструкцию WHERE. Ниже приводится несколько практических советов, позволяющих гарантировать преобразование большей части операций выбора записей в SQL и их выполнение на сервере. • Не используйте поля формул в качестве основы для выбора записей. Обычно Crystal Reports не удается преобразовать формулы в SQL, так что большинство операций выбора записей на основе полей формул будет передаваться на выполнение в Crystal Reports. Большинство формул первого прохода могут быть преобразованы в SQL, а вот остальные – нет. Проверяйте свои SQL-запросы, дабы убедиться в том, что формулы, используемые для выбора записей, были успешно преобразованы в SQL-конструкцию WHERE. На заметку! Для получения более подробной информации о составных частях формул обращайтесь в главу 5. Book_CR11.indb 459 27.06.2006 1:06:36 460 Часть I. Проектирование отчетов • Не используйте в своих критериях выбора встроенные функции языка формул Crystal Reports, подобные ToText. Опять-таки, обычно Crystal Reports не может преобразовать эти функции в SQL, потому эти части операций по выбору записей не будут выполняться на сервере. Возможно, получится отыскать подобную функцию в поле SQL-выражения и использовать для выбора записей выражение. Использование индексированных полей В Crystal Reports при просмотре вкладки Links диалогового окна Database Expert обычно можно увидеть разноцветные стрелки, которыми обозначены поля, проиндексированные разработчиком базы данных. Хотя устанавливать связь только по индексированным полям обязательным требованием не является, все равно по возможности следует пытаться устанавливать связи именно по таким полям (конечно, если это допускает структура базы данных). В зависимости от используемой системы управления базами данных, установка связей с неиндексированными полями или выполнение выбора записей по неиндексированным полям может крайне негативно сказаться на производительности отчета. Большинство систем баз данных SQL поддерживают возможности индексации, которые могут понадобиться разработчику во время создания базы данных. По возможности взаимодействуйте с разработчиком базы данных для гарантии того, что индексы будут созданы не только для удовлетворения потребностей, касающихся применения базы данных, но также и потребностей, касающихся составления отчетов. Попытайтесь использовать индексированные поля в качестве целевых полей при связывании и для выбора записей настолько часто, насколько это возможно. Увеличить производительность также может как можно более частое использование полей из основной или управляющей таблицы. Например: имеется основная транзакционная таблица, связанная с пятью таблицами поиска, и при выборе записей планируется использовать описания из этих таблиц поиска. Вместо этого для выбора записей лучше рассмотреть вариант использования полей в основной таблице (даже если придется иметь дело с кодами в основной таблице, а не с описаниями из таблицы поиска). Опять-таки, если поля в основной таблице проиндексированы, производительность, скорее всего, повысится. Book_CR11.indb 460 27.06.2006 1:06:36