OLAP.ru   Rambler's Top100
Вы находитесь на страницах старой версии сайта. Перейдите на новую версию OLAP.ru
  
Поиск по сайту
Новости
Основы OLAP
Продукты
Business Objects/ Crystal Decisions
Каталог
OLAP в жизни
Тенденции
Download
Яndex
 
 
 
TopList
 

Разработка отчетов для баз данных SQL


Несмотря на то, что в наше время многие компании в своей текущей работе используют базы данных ПК–типа, большинство приложений для ведомств и предприятий используют клиент/серверные СУБД. Как следует из названия, в подобные СУБД включено два компонента: клиент и сервер. Обычно, клиент – это персональный копьютер, использующий такое ПО, как Crystal Reports или приложение для ввода данных, а сервер – это более мощный ПК, работающий под Windows NT/2000, либо миникомпьютер или даже мэйнфрейм на базе Unix. База данных хранится на сервере, а клиент получает к ней доступ путем генерации запросов к серверу. Существует много различных клиент/серверных систем, среди которых наиболее популярны Microsoft SQL Server, Oracle, Sybase, Informix и IBM DB2.

Многие базы данных можно использовать только с Professional или Developer Editions Crystal Reports 8. С помощью Standard Edition можно составлять отчеты только на основе баз данных ПК–типа, Microsoft SQL Server и некоторых баз данных, к которым возможен доступ посредством OLE DB. Если вы планируете использовать Crystal Reports 8 при работе с Oracle, Informix или любыми другими обычными базами данных SQL, следует приобрести Professional или Developer Edition.

Важно понимать отличия между СУБД типа клиент/сервер и СУБД ПК–типа, устанавливаемой в локальной сети. В частности, для составления отчетов СУБД ПК–типа, установленная в локальной сети, значительно менее удобна, чем база данных типа клиент/сервер. На рис. 1 показан ПК для разработки отчетов при двух конфигурациях базы данных. Первая – описывает базу данных Microsoft Access на сервере локальной сети. Вторая изображает ту же базу данных на системе SQL Server.

Сценарий, основанный на локальной сети, серьезно загружает как сеть, так и ПК, используемый для запроса отчетов. Согласно этому сценарию, ПК должен считать по сети полную базу данных Access, содержащую 100 000 записей, отыскивая и выбирая записи, удовлетворяющие критериям отбора отчетов. При этом по сети проходят большие объемы данных, а ПК самостоятельно проводит весь логический отбор.

Клиент/серверная среда намного более эффективна. ПК–клиент просто запрашивает сервер базы данных с помощью языка структурированных запросов (SQL). На сервере базы данных, предположительно являющемся более мощным ПК, компьютером с Unix или мэйнфреймом, запускается ПО, разработанное для чрезвычайно эффективной обработки запросов. Эта программа непосредственно запрашивает базу данных, содержащую 100 000 записей, и отправляет обратно по сети только требуемые 1 000 записей. При такой процедуре и клиентской машине и к сети предъявляется меньше требований, и естественно, что весь процесс обычно занимает меньше времени.

Соединение с базами данных SQL

Первый шаг при создании Crystal Report состоит в выборе базы данных SQL, на основе которой вы планируете разработать отчет. Существует три общепринятых варианта связи, которые можно применять в Crystal Reports для соединения с клиент/серверной базой данных: драйверы прямого доступа к базе данных, ODBC и OLE DB.

Драйверы прямого доступа

В Crystal Reports имеются драйверы прямого доступа, работающие со многими стандартными клиент/серверными базами данных, включая Microsoft SQL Server, Oracle, и IBM DB2. В прямом драйвере базы данных используются собственные методы связи с сервером базы данных, поставляемые вместе с сервером. Для этого следует установить специальное ПО, поставляемое поставщиком базы данных для ПК. Примеры таких пакетов включают Query Analyzer и Enterprise Manager для Microsoft SQL Server 7, а также SQL+ для Oracle.

Crystal Reports распознает наличие таких пакетов и предоставляет драйвер прямого доступа для соединения с базой данных. Кроме того, в Crystal Reports есть и другие драйверы прямого доступа, позволяющие разрабатывать отчет, исходя из каталогов Microsoft Outlook, Microsoft Exchange, баз данных Lotus Notes, лог-файлов сервера Internet Web и протокола событий Windows NT. Можно даже писать отчеты на основе локальной файловой системы, состоящей из файлов и структуры каталогов на вашем локальном или сетевом диске.

Использование драйверов прямого доступа для подключения к серверу базы данных имеет два основных преимущества:

  • Поскольку используется меньше уровней протоколов связи, возможно некоторое увеличение эффективности генерации отчетов.
  • Драйвер прямого доступа может обеспечить большую гибкость при генерации отчетов, основанных на использовании SQL-запросов.

ODBC

Хотя многие компании используют стандартные серверы баз данных, для которых в Crystal Reports предоставляются драйверы прямого доступа, существует много других СУБД, которые вы, возможно, захотите применить при подготовке отчета. Для соединения стандартного ПК–клиента с существующими бесчисленными специализированными серверами и системами необходим какой–либо стандартный метод связи. Для обеспечения этой связи компания Microsoft разработала открытый интерфейс доступа к базам данных (ODBC).

Без особых исключений, любая СУБД, поддерживающая ODBC, может использоваться с Crystal Reports. Если поставщик базы данных предоставляет драйвер ODBC для своей системы, то Crystal Reports с легкостью обеспечит вам генерацию отчетов на ее основе.

Crystal Reports автоматически устанавливает ODBC. Дополнительно устанавливаются некоторые типовые источники данных или общие файлы и форматы базы данных ODBC, включающие источник данных ODBC или использующие стандартную базу данных XTREME.MDB. Перед началом использования Crystal Reports для составления отчетов на основе других систем данных ODBC, следует установить источник данных ODBC. Для его установки используйте ODBC Administrator (опция Crystal Reports Program Group) или Control Panel.

OLE DB

OLE DB был введен компанией Microsoft для расширения ODBC – предшествующего универсального метода доступа к данным. Доступ к данным с помощью OLE DB, в основном, не претерпел изменений по сравнению с ODBC.  Провайдер данных действует как интерфейс между неравноправными клиентской и серверной системами. Существуют поставщики данных не только для систем классических реляционных баз данных, но и для менее традиционных источников данных, таких как электронные таблицы, Web-серверы и многомерные источники данных OLAP.

Crystal Reports поддерживает источники данных OLE DB, установленные на вашем ПК–клиенте. Более подробную информацию по OLE DB можно найти на web–сайте Microsoft или же в сопроводительной документации пользователя.

Выбор базы данных

При первом запуске Crystal Reports вы можете сразу выбрать клиент/серверную базу данных и войти в нее до того, как откроете существующий отчет или создадите новый. Если вы открыли отчет, но не  вошли в базу данных, используемую для его разработки, то при попытке обновления этого отчета или выборе какой–либо другой функции, требующей обращения к базе данных, появится напоминание о необходимости осуществить вход.

Если вы хотите создать новый отчет на основе клиент/серверной базы данных, можно воспользоваться экспертом отчетов или опцией Blank Report. При использовании эксперта отчетов достаточно нажать кнопку Database для соединения с базой данных. При этом на экране возникнет Data Explorer.

Если же вы выбираете опцию Blank Report для разработки нового отчета, то Data Explorer появляется сразу.

Data Explorer объединяет в одном месте все источники данных, включая драйверы прямого доступа, ODBC и OLE DB. Источники данных ODBC появляются в категории ODBC, а драйверы прямого доступа, так же как OLE DB, доступны в категории More Data Sources. Щелкните по знаку плюс рядом с категорией, которую вы хотите выбрать, и выберите источник данных или драйвер для использования в отчете. В зависимости от выбранного драйвера или источника, появится другое диалоговое окно, приглашающее к вводу другой информации, например, имени пользователя и пароля, желаемой базы данных или другой информации. После того, как вы успешно вошли, Data Explorer покажет список таблиц, хранимых процедур и представлений, имеющихся в выбранной базе данных.

С помощью двойного щелчка мышью, или отмечая выбранную рубрику и нажимая кнопку Add, выберите таблицу, хранимую процедуру или представление для включения в отчет. Рядом с каждой выбранной таблицей появится пункт, отмеченный зеленым цветом. Если вы не видите все ожидаемые таблицы, или если вы хотите ограничить набор доступных таблиц по признаку определенного владельца баз данных или определенной модели названия таблиц, нажмите кнопку Options. При этом будет вызвано диалоговое окно Database Options, описанное ниже в этой главе. Выбрав все таблицы, которые вы хотите включить в отчет, нажмите кнопку Close, тем самым, закрывая Data Explorer и переходя к выбору полей базы данных.

Помните, что если вы вошли в базу данных SQL из Data Explorer, то связь с ней не прерывается даже при закрытии любых использующих эту связь отчетов. Если вы начинаете новый отчет и пытаетесь или выбрать базу данных ПК–типа, или войти в другую базу данных SQL, имя используемой базы данных появится в категории Current Connections в Data Explorer. Если вы не собираетесь использовать эти таблицы в своем отчете, надо сначала выйти из исходного сервера, закрывая и заново запуская Crystal Reports или используя опцию Log On/Off Server. Если у вас есть открытый отчет, выберите Database | Log On/Off Server. Если все отчеты закрыты, выберите File | Log On/Off Server.

Изменение опций SQL

В зависимости от выбранного источника данных, вы можете и не видеть все искомые элементы базы данных. В частности, если ваша база данных поддерживает хранимые процедуры SQL (заранее скомпилированные предложения SQL, которые могут содержать параметры) или представления (виртуальные таблицы, которые могут комбинировать в одной группе несколько текущих таблиц базы данных), вы захотите быть уверенным в возможности видеть их в Data Explorer. Возможно, также у вас возникнет желание ограничить видимые в Data Explorer таблицы до их названий, которые соответствуют определенной модели или которые принадлежат определенному пользователю базы данных.

Эти опции можно дополнительно настроить. Нажмите кнопку Options в Data Explorer, вызывающую диалоговое окно Database Options, показанное на рис. 2.

Область Show этого диалогового окна позволяет ввести ограничения на таблицы, появляющиеся в Data Explorer при входе в базу данных. Просмотрите типы таблиц (Tables, Views, Synonyms, Stored Procedures и System Tables) для определения тех типов таблиц, которые будут появляться. Можно также добавить образец, определяющий таблицу или владельца таблицы, и ограничивающий список таблиц только теми из них, которые или названы подобным образом или принадлежат соответствующему пользователю базы данных.

Область List Tables и Fields By позволяет определить, каким образом таблицы и поля появляются в Data и Field Explorers. Вам предоставляется несколько опций для выбора способа, используемого для сортировки названий таблиц и полей.

Область Advanced Options определяют поведение различных баз данных, в зависимости от типа используемой базы данных и в соответствии с вашими желаниями. Вот некоторые опции Advanced Options:

  • Use IndexesorServerforSpeed – Выбирайте эту опцию для использования индексных файлов баз данных ПК–типа (например, Microsoft Access и Paradox) и применяйте пункт SQL WHERE для баз данных SQL. Выбор этой опции в большинстве случаев значительно повышает эффективность генерации отчетов.
  • PerformGroupingOnServer – При выборе этой опции Crystal Reports "заставляет" сервер базы данных выполнять максимально возможное количество задач группирования и агрегирования, тем самым, повышая эффективность работы. Некоторые условия, необходимые для использования всех преимуществ этого варианта, будут обсуждаться далее в этой статье.
  • CaseInsensitiveSQLData – С помощью этой опции можно игнорировать регистр при выборе записи в базе данных SQL. Нечувствительность к регистру будет подробно обсуждаться далее в этой статье.
  • AutoSmartLinking – При выборе этой опции Crystal Reports автоматически связывает таблицы базы данных при их добавлению к отчету. Как будет показано далее, во многих случаях это бывает неоправданная трата времени.
  • PerformQueryAsynchronously – Эта опция позволяет остановить выполнение запроса сервером базы данных до возвращения записей отчета в Crystal Reports. В некоторых случаях выполнение запросов, направленных в базу данных SQL, занимает минуты (а иногда и часы). Выбрав эту опцию, вы можете нажать на кнопку Stop (черный квадрат) справа от закладки Preview и аннулировать выполнение запроса на сервере базы данных. 
  • SelectDistinctDataforBrowsing – Это — новая возможность, появившаяся в Version 8. Она позволяет читать базу данных в непрерывном режиме до тех пор, пока при просмотре полей в Field Explorer или Formula Editors не будут найдены 500 уникальных значений полей. Если эта опция отключена, Crystal Reports считывает только первые 500 записей в таблице, даже если среди них мало (или нет совсем) уникальных значений. При включенной опции просматриваемые списки будут объемнее, и при этом может замедлиться выполнение.

Если вы хотите придать постоянный статус некоторым опциям диалогового окна, а не активировать их каждый раз, выберите File | Options в Data Explorer и нажмите на закладку Database. Установите в диалоговом окне опции, которые в дальнейшем будут применяться для всех новых отчетов. 

Другой новой возможностью Crystal Reports 8 является опция Select Distinct Records. При включении этой опции сервер базы данных SQL получает указание возвращать в Crystal Reports только уникальные записи. Любые дублированные записи будут игнорироваться сервером. Для выбора этой опции выбирают Database | Select Distinct Records в раскрывающихся меню или проверяют опцию Select Distinct Records в File | Report Options.

Преобразование отчета базы данных ПК–типа в отчет для клиент-серверной базы данных

Возможны ситуации, когда вы сначала создали отчет на основе базы данных ПК–типа, например, Microsoft Access, а затем решили его преобразовать для использования базы данных SQL с аналогичной структурой. Например, база данных Access может быть перенесена на SQL сервер. Или вы можете разрабатывать отчеты на тестовой базе данных в Btrieve, но в конечном счете, они должны запускаться на базе данных Oracle идентичной структуры.

В каждой из этих ситуаций после первоначального составления отчета надо выбрать другой драйвер базы данных, поскольку, фактически, будет изменен тип используемой базы данных. Выберите Database | Convert Database Driver в раскрывающемся меню. Появится диалоговое окно Convert Database Driver.

Пометьте Convert Database Driver на Next Refresh. При этом активируется ниспадающий список To. Текущий драйвер, используемый для отчета, указан рядом с меткой From. Ниспадающий список показывает имена динамически подключаемой библиотеки для всех установленных драйверов баз данных Crystal Reports. Показанные имена сопровождаются описаниями соответствующих баз данных. Выберите в списке новый драйвер базы данных и нажмите OK. Если вы выбрали защищенную базу данных, то вам будет предложено ввести пароль для входа в эту базу данных.

Если имена таблиц и полей в новой базе данных изменены (например, пробелы могут быть заменены подчеркиванием, если база данных Access переносится на SQL Server), потребуется установить соответствие старых полей новым именам.

Если требуется только выбрать другую базу данных того же типа, используйте Database | Set Location вместо Convert Database Driver. Кроме того, теперь Crystal Reports 8 автоматически преобразует драйвер базы данных при выборе другого типа базы данных в диалоговом окне Set Location.

Переход между базами данных SQL

Возможны и другие ситуации, в которых вы первоначально создаете отчет на определенной базе данных, например, тестовой базе данных ODBC. Затем вам потребуется указать этот отчет в качестве рабочей базы данных ODBC. Поскольку обе базы данных используют соединения ODBC, переход к рабочей базе данных невозможен из диалогового окна Convert Database Driver. Вместо этого, выберите Database I Set Location в раскрывающемся меню. Появится диалоговое окно Set Location.

Выберите первую таблицу, которую вы хотите указать для рабочей базы данных, и нажмите кнопку Set Location. Появится окно Data Explorer, показывающее все базы данных, в которые вы вошли на данный момент, в категории Current Connections. Если связь с рабочей базой данной уже установлена, просто нажмите рядом знак плюс и выберите новую таблицу.

Если связь с рабочей базой данных еще не установлена, выберите категорию и источник данных для соединения с рабочей базой данных. После соединения, таблицы рабочей базы данных появляются под именем источника данных. Дважды щелкните по соответствующей таблице в рабочей базе данных или выберите ее и нажмите Set. При этом отобразится Propagate Server, Database Changes Across Tables  и вопрос  Same Original Information?. При ответе Yes любая другая таблица в отчете, принадлежащем исходной базе данных, будет указана новой базе данных.

Если названия таблиц и полей в новой базе данных изменены, возникнет приглашение установить соответствие старых полей новым именам.

Связывание таблиц

Хотя бывают случаи, когда отчет создается по одной таблице базы данных, обычно требуется, по крайней мере, две, а часто и больше таблиц в отчете, так как большинство современных реляционных баз данных стандартизованы. Стандартизация баз данных заключается в разбивке повторяющейся информации на отдельные таблицы базы данных с целью повышения эффективности и облегчения обслуживания. Рассмотрим следующую таблицу служащих:

Имя служащего

Название отдела

Зарплата

Владимир Петрович

Информационные технологии

30 000

Екатерина Ивановна

Отдел кадров

12 500

Роберт Адамович

Информационные технологии

37 500

Станислав Павлович

Администратор

45 000

Карл Фридрихович

Отдел корреспонденции

8 000

Иван Петрович

Информационные технологии

48 000

Юлия Александровна

Администратор

47 000

Светлана Сергеевна

Отдел корреспонденции

10 000

Хотя такая организация обуславливает достаточно простые условия генерации отчетов, поскольку достаточно одной таблицы для выдачи на печать списка служащих или платежной ведомости, эту таблицу труднее обслуживать. Обратите внимание, что в этой маленькой таблице названия отделов повторяются несколько раз. Представьте себе аналогичную таблицу для компании с 50 000 служащих! Это требует не только большого объема памяти, но и массу дополнительной работы для внесения изменений в таблицу при изменении названия отдела, да и ошибок при такой структуре базы данных избежать будет сложновато.

Например, если название отдела "Информационная технология" заменяется названием "Информационные системы", надо провести поиск и замену по всей таблице служащих, заменяя прежнее название новым при каждом его появлении.

Сопоставьте эту однотабличную схему со следующей структурой базы данных:

Таблица служащих:

Имя служащего

Номер отдела

Зарплата

Владимир

25

30 000

Екатерина Ивановна

17

12 500

Роберт Адамович

25

37 500

Станислав Павлович

8

45 000

Карл Фридрихович

13

8 000

Иван Петрович

25

48 000

Юлия Александровна

8

47 000

Светлана Сергеевна

13

10 000



Таблица Отделов:

Номер отдела

Название отдела

8

Администратор

13

Отдел корреспонденции

17

Отдел кадров

25

Информационные технологии

В данном случае базу данных стандартизовали, поместив информацию об отделах в отдельную таблицу поиска. При такой конфигурации таблица служащих занимает намного меньше памяти, так как для каждого служащего хранится только номер отдела, а не его полное имя. Кроме того, если название Отдела информационной технологии изменяется, надо изменить только одну запись в таблице Отделов во всей базе данных.

Visual Linking Expert

Использование нескольких таблиц усложняет условия составления отчетов, потому что одна таблица служащих уже недостаточна для выдачи на печать списка служащих или платежной ведомости. В предыдущем примере не только понадобилось включить в отчет две таблицы, но также связать их вместе по общему полю. Связывание таблиц (часто называемое также объединением таблиц) состоит в выборе общего поля. Это позволяет второй таблице следовать за главной таблицей по мере ее пошагового (запись за записью) чтения. Для связывания таблиц в Crystal Reports применяется опция Visual Linking Expert, как показано на рисунке 3.

Visual Linking Expert появляется автоматически, когда при первом составлении отчета вы сразу выбираете две или большее число таблиц, или каждый раз, когда вы выбираете дополнительные таблицы с помощью Database | Add Database To Report в раскрывающемся меню. Можно также вызвать Visual Linking Expert, нажимая кнопку Link Expert на панели инструментов Supplementary или выбирая Database | Visual Linking Expert в раскрывающемся меню.

Опция Visual Linking Expert показывает все таблицы, включенные в отчет, и может сразу выбрать связи между таблицами. Если вы видите линии со стрелками, соединяющие поля в таблицах, это означает, что Visual Linking Expert уже применил Smart Linking к таблицам (это будет обсуждаться далее в этой статье). Вам может понадобиться уничтожить эти существующие связи, если они неверны, или самостоятельно добавить новые.

Чтобы уничтожить связь, нажмите на линию, соединяющую две таблицы. Если сначала вам не удается выбрать связь, продолжайте попытки — Crystal Reports вызывает всплывающую подсказку и в это время нельзя выбрать связь. Когда будут высвечены линия связи и соединяемые ею поля, нажмите кнопку Delete Link или клавишу del. Если вы хотите изменить опции связи, например, тип соединения (см. ниже в данной главе), используемый связью индекс или поведение многотабличной связи, нажмите кнопку Link Options или дважды щелкните по выбранной связи.

Чтобы установить связь, нажмите на поле в таблице, от которого вы хотите провести связь, и перенесите мышь на поле другой таблицы, с которым вы хотите установить связь. Между двумя таблицами появится линия связи. Обратите внимание, что в исходной точке линии связи "от" возникнет маленький блок, а в ее конечной точке "к" будет нарисована стрелка.

В Crystal Reports бывает регулярный сбой при выборе первого поля в конечной таблице.Если курсор мыши освобождается значительно выше середины поля, линия связи не прочерчивается. Для надежного проведения линии связи освобождайте курсор в нижней части конечного поля. Эта проблема возникает только в том случае, если вы перемещаетесь на самое первое поле конечной таблицы.

Если Crystal Reports не обнаружит потенциальных проблем с проведенной связью, появится только линия связи, не сопровождаемая сообщениями. Если, однако, Crystal Reports обнаруживает потенциальную проблему, например, рассогласование типов полей, до появления линии связи возникает предупреждение, или же связь не создается совсем.

Добавление новых таблиц к Visual Linking Expert

Часто обнаруживается необходимость добавлять дополнительные таблицы к отчету по мере работы над ним. Для этого выберите Database | Add Database To Report в раскрывающемся меню, а затем откройте Data Explorer, в котором можно выбрать дополнительные таблицы. Можно также добавить таблицы непосредственно из Visual Linking Expert, нажимая кнопку Tables. Появится диалоговое окно Choose Tables To Use In Visual Linking, как показано на рисунке 4.

Все таблицы, предварительно добавленные к отчету, будут перечислены в списке Linked Tables. Если вы попытаетесь снова добавить одну из этих существующих таблиц, вам будет предложено дать псевдоним второй копии таблицы, так как каждая таблица в Visual Linking Expert должна иметь свое имя. Можно добавить дополнительные таблицы, нажимая кнопку Add Table, которая вызывает Data Explorer (кнопки Add Index и Table Description не применяются с базами данных SQL). Выбранная таблица (таблицы) появляется в списке Visible Tables. Эти таблицы будут добавлены к Visual Linking Expert, когда будет закрыто диалоговое окно. Используйте стрелки Add и All для перемещения таблиц между списками Visible Tables и Invisible Tables, в зависимости от того, хотите ли вы добавить данные таблицы к Visual Linking Expert. Если вы предпочитаете, чтобы Visual Linking Expert связал таблицы автоматически, отметьте позицию Perform Smart Linking (Smart Linking будет обсуждаться более подробно далее в этой статье). Как только вы нажали OK, диалоговое окно Choose Tables To Use In Visual Linking закрывается, и в Visual Linking Expert появляются дополнительные таблицы. Теперь можно по необходимости добавить или стереть связи.

Удаление неиспользуемых таблиц из отчета

Допустим, вы нечаянно добавили слишком много таблиц в отчет, или вам больше не нужны таблицы, использовавшиеся ранее в процессе составления отчета. Хотя это может послужить улучшению Crystal Reports в дальнейшем, в настоящее время нельзя удалить любые неиспользуемые таблицы из Visual Linking Expert. Закройте Visual Linking Expert, чтобы вернуться на закладку report Design или Report Expert.

Чтобы удалить таблицы с помощью Report Expert, просто удалите из отчета все поля, исходящие из таблицы, предназначенной для удаления. Затем вернитесь на закладку Data, выберите не нужную больше таблицу и нажмите кнопку Remove. Если вы использовали опции Blank Report и в данный момент работаете непосредственно в закладке Design отчета, выберите Database I Remove from Report в раскрывающемся меню. Выберите не нужную больше таблицу и нажмите Remove. Если какие–то поля остаются в отчете или используются в существующих формулах, соответствующее предупреждение возникнет, прежде чем таблица будет удалена.

До того как вы нажмете Remove, убедитесь, что вы действительно хотите удалить данную таблицу. Нельзя отменить удаление таблицы. Также, если вы удаляете таблицу, на которую ссылаются какие-нибудь формулы, то эти формулы не будут работать после удаления таблицы. Если таблица удалена по ошибке, наилучшее решение — использовать Visual Linking Expert или выбрать Database I Add Database To Report в раскрывающемся меню, чтобы снова добавить таблицу.

Различия связывания между базами данных ПК и SQL

Хотя большинство понятий относительно связывания таблиц применимы в равной мере к базам данных ПК–типа и SQL, существуют отдельные проблемы, о которых надо помнить при работе с базами данных ПК–типа.

Прежде всего, отметьте видимые различия в Visual Linking Expert при использовании баз данных ПК–типа.

Затем обратите внимание на различные поля с маленькими стрелками, отсутствующими при использовании базы данных SQL. Эти стрелки указывают на то, что поле индексировано. Индекс является специальным параметром, создаваемым проектировщиком базы данных для ускорения доступа к таблице. Поиск отдельных записей этой таблицы будет намного быстрее, если он основан на индексированных полях. В зависимости от настройки экрана, вы можете также заметить разницу в цвете индексных стрелок. Различные цвета показывают наилучший вариант, предлагаемый Crystal Reports в отношении того, какие поля могут быть уникальными индексами полей таблицы. Как правило, нет необходимости беспокоиться о цвете индексной стрелки — убедитесь только, что она есть у поля, которое вы пытаетесь связать.

Итак, какие таблицы и поля следует объединять?

Вы быстро поймете, что для аккуратного объединения таблиц и полей надо быть хорошо знакомым с базой данных, по которой разрабатывается отчет. Для успешного связывания необходимо знать расположение таблиц и данные, содержащиеся в общих полях. Эта задача еще больше усложняется разработчиками баз данных, которые защищают свою работу, создавая запутанные и замысловатые имена таблиц и полей.

По–видимому, самым быстрым решением будет консультация с тем, кто разрабатывал базу данных или знаком с ее схемой и содержанием. Кроме этого, вы можете распознать правильные таблицы и поля, которые надо связать, если они логично названы. Если больше ничего не остается, можно просмотреть индивидуальные поля в Visual Linking Expert, нажимая правую кнопку мыши на имени поля и выбирая Browse Field из всплывающего меню. Отыскивая похожие типы данных и соответствующие друг другу выборочные данные в обеих таблицах, можно найти подходящих кандидатов для объединения.

После объединения таблиц всегда проверяйте отчет и контролируйте, что возвращаются правильные данные. Очень просто создать неверную связь, которая не вызывает сообщение об ошибке, но и не возвращает правильно подобранные данные в отчет.

Если большая группа проектировщиков отчетов в вашей организации незнакома с запутанностью базы данных, вы, вероятно, захотите создать Crystal Dictionary, которым они могли бы пользоваться при составлении отчета. Эта возможность обсуждается в ранее опубликованной статье Упрощение баз данных с помощью Crystal Dictionaries.

В некоторых случаях одно поле таблицы может получить более одного индекса — вероятно, один собственный индекс, а другой в качестве части составного индекса. В таких ситуациях, в зависимости от типа создаваемой связи, вы можете предпочесть один индекс другому. Например, если создается связь только по одному полю, которое включено в множественный индекс, то использование индивидуального индекса поля вместо множественного индекса может оказаться предпочтительным (а иногда обязательным). Можно выбрать альтернативный индекс для поля, нажимая кнопку Add Index в диалоговом окне Choose Tables for Visual Linking при добавлении новой таблицы, или в диалоговом окне Link Options (это проиллюстрировано дальше в данной главе). Независимо от видимых различий в индексных указателях, базы данных ПК–типа накладывают одно неизбежное требование: конечное поле, на которое указывает связь, должно быть индексированным. Такого требования нет для исходного поля, но по отношению к конечному полю у вас нет выбора. При попытке указать на неиндексированное поле связь не установится, и появится сообщение об ошибке.

Выбор индексируемых полей при проектировании базы данных должен быть сбалансирован. Чем больше индексированных полей, тем шире выбор связей вы имеете как разработчик отчета. Однако создание слишком большого числа индексов приводит к более громоздким базам данных и потенциальным эксплуатационным проблемам. Если нельзя должным образом присоединить таблицу в связи с тем, что целевое поле не индексировано, можно обратиться к разработчику базы данных или администратору с просьбой о добавлении индекса. Если это неудобно, все же можно составить такой же или очень похожий отчет с помощью подотчетов.

Используя базы данных SQL, вы не увидите цветных стрелок в Visual Linking Expert. Также отсутствует требование индексирования конечных полей. Однако, вы все же можете захотеть связать индексированные поля везде и всегда, когда это возможно. Очень часто критикуют Crystal Reports за плохие технические характеристики, хотя проблема, в действительности, обусловлена скоростью обработки запроса на сервере. Во многих случаях ее можно списать на связывание неиндексированных полей. Поскольку нет видимых ключей, показывающих индексированные поля, то при подозрении, что эксплуатационные проблемы обусловлены объединением неиндексированных полей, следует обратиться к администратору или проектировщику базы данных.

Действительно ли Smart Linking является таким "умным"?

Smart Linking подключается по умолчанию при первой установке Crystal Reports. Smart Linking представляет собой хорошо задуманную функцию, которая часто не стоит вызываемых ей хлопот. Smart Linking автоматически объединяет поля в двух примыкающих таблицах в тех случаях, когда поля удовлетворяют следующим критериям:

  • Имена полей в точности одинаковы
  • Типы данных идентичны
  • В случае строковых полей их длина одинакова
  • В случае баз данных ПК–типа конечное поле индексировано

При идеальной настройке (как в случае поставляемого с Crystal Reports образца базы данных XTREME.MDB), Smart Linking прекрасно функционирует. Однако, действительность очень отличается от идеала.

Рассмотрим, например, отчет, включающий таблицы Vendor (Поставщик) и Customer (Заказчик). Обе таблицы содержат поля с именами Address (адрес), City (город), State (страна) и Zip Code (почтовый индекс). Очень вероятно, что эти поля имеют  идентичные типы данных и длину. Smart Linking обязательно объединит две таблицы по всем четырем полям. Но эти поля не подходят для объединения этих двух таблиц.

В версии 8 есть усовершенствование, названное Linking by Key.Это новая опция в Visual Linking Expert. Если включен Smart Linking, Crystal Reports автоматически использует описанный выше сценарий наименования полей для их объединения. Если при этом создаются неверные связи, их можно уничтожить и создать другие, используя ключевую информацию базы данных вместо информации, содержащейся в имени поля. Уничтожив плохие связи, выберите переключатель By Key в Visual Linking Expert и нажмите кнопку Link. Переделка связей будет осуществляться по ключевой информации базы данных. Crystal Reports может обнаружить "внешнюю" и "первичную" ключевую информацию в ограниченном наборе баз данных, таких как Oracle и SQL Server, Informix via ODBC and OLE DB, и Microsoft Access, использующая Microsoft OLE DB Provider for Access.

Поскольку Smart Linking часто приводит к затратам времени на удаление неверных связей и создание правильных связей вручную, его можно отключить. Отметьте File I Options в раскрывающихся меню и отмените Auto–SmartLinking не закладке Database. При появлении Visual Linking Expert вы можете реализовать связи вручную с помощью перемещения мыши или  опции Linking by Key.

Использование нескольких типов баз данных в одном отчете

Crystal Reports не ограничивается использованием одной базой данных на отчет. Например, можно снабдить отчет главной таблицей протоколов из базы данных клиент/сервер с помощью драйвера прямого доступа, поисковой таблицей меньшего размера из базы данных Microsoft Access на общем диске локальной сети, и другой поисковой таблицей из электронной таблицы Microsoft Excel на вашем диске C, с помощью ODBC или OLE DB.

Для этого достаточно выбрать, как обычно, первую таблицу. Затем вызовите Visual Linking Expert и нажмите кнопку Add Table. Появится Data Explorer, с помощью которого можно соединиться с дополнительными базами данных и выбрать желаемые таблицы. Закройте Data Explorer для добавления новых таблиц к Visual Linking Expert и объедините их нужным образом.

В общем случае этот тип смешанного генерирования отчета абсолютно приемлем с одним пояснением: при объединении двух таблиц из разных источников данных, таких как база данных Oracle или другая таблица из базы данных SQL–сервера, можно установить связь только с одним полем. При попытке связать больше полей появится сообщение "Invalid file link. Not all fields in same index expression." Увы, это ограничение Crystal Reports.

Типы объединения

При объединении двух таблиц необходимо внимательно следить за тем, какие записи будут возвращены из обеих таблиц. Рассмотрим небольшую модификацию стандартизованных табличных структур, проиллюстрированных выше в этой статье.

Таблица служащих:

Имя служащего

Номер Отдела

Зарплата

Екатерина Ивановна

17

12 500

Роберт Адамович

25

37 500

Станислав Павлович

8

45 000

Карл Фридрихович

13

8 000

Дарья Николаевна

32

52 000



Таблица отделов:

Номер Отдела

Название Отдела

8

Диспетчер

13

Отдел корреспонденции

17

Отдел кадров

4

Финансовый отдел

25

Информационные технологии

Даже быстрый взгляд на эти две таблицы выявляет два несоответствия: нет подходящей для Дарьи Николаевны записи в таблице Отделов, а у финансового отдела отсутствуют служащие в таблице служащих. Говорят, что у этих таблиц нет ссылочной целостности данных.Этот причудливый компьютерный термин просто означает, что две таблицы не полностью соответствуют друг другу. Причудливый это термин или нет, но он очень важен для вас как для составителя отчетов. Вы должны решить, как поступать с отсутствием целостности ссылок.

Многие базы данных могут принудительно обеспечивать ссылочную целостность, так что описанная выше ситуация никогда не возникает. Если проектировщик базы данных выбирает принудительную ссылочную целостность между двумя таблицами, то служащему нельзя приписать номер отдела, не существующий в таблице Отделов, а запись отдела нельзя удалить из таблицы Отделов, если хоть одна запись таблицы служащих содержит его название.

Однако принудительная ссылочная целостность часто является причиной дополнительных сложностей при работе с базой данных, и нередко основные функции базы данных не позволяют ввести принудительную ссылочную целостность. Если у вас появляются вопросы о функциональности вашей базы данных, самым разумным было бы обратиться к разработчику или администратору базы данных.

Одна из ситуаций, в которых ссылочная целостность очень важна, это проектирование отчета для распечатки платежных ведомостей служащих. Рассмотрим приведенные выше таблицы в качестве основы для ваших платежных ведомостей. Если вы хотите, чтобы отдел, в котором работает данный служащий, распечатывался на корешке для облегчения раздачи платежных ведомостей, вам понадобится объединить таблицу служащих и таблицу отделов по полю номера Отдела. Законно предположить, что вид вашей платежной ведомости улучшится, но тут же возникнут проблемы.

Для вас, как составителя отчета, актуальным будет вопрос: "Что же произойдет с Дарьей Николаевной?" (последний служащий в таблице служащих). Считая ее высокооплачиваемым работником, по крайней мере, с большинства точек зрения, можно полагать, что она заинтересована в оплате независимо от целостности ссылок. Другой интересный вопрос – "Будут ли напечатаны какие-нибудь ведомости для финансового отдела?" Ответы на ваши вопросы зависят от типа объединения, который вы используете для связывания двух таблиц.

Вот два типа объединения, с которыми вы будете сталкиваться наиболее часто:

  • Equaljoin(Равное объединение) (часто называемое внутренним объединением) Включает записи из обеих таблиц только при условии идентичности/равенства полей
  • Leftouterjoin(Левостороннее внешнее объединение) (иногда называемое просто внешним объединением) Включает все записи из левой таблицы, а записи из правой таблицы только при условии идентичности/равенства полей.

Даже если Дарья Николаевна не знает, что такое левостороннее внешнее объединение, она, вероятно, будет намного счастливее, если вы им воспользуетесь. В результате, она просто получит платежную ведомость без напечатанного названия отдела. Это особенно важно в Crystal Reports, так как в базах данных SQL по умолчанию выбирается тип равного объединения.

Третий тип объединения используется реже. Он заключается в следующем:

  • Rightouterjoin (Правостороннее внешнее объединение) Включает все записи из правой таблицы, а записи из левой таблицы только при условии идентичности/равенства полей.

Этот выбор так же не понравился бы Дарье Николаевне, как и равное объединение. К тому же, у вас останется испорченная ведомость с напечатанным на корешке названием отдела Финансы, но без распечатки служащих или зарплаты.

Выбор типа объединения в VisualLinkingExpert

Выберите тип объединения в Visual Linking Expert, дважды щелкая по линии связи между двумя интересующими вас таблицами, или отмечая связь и нажимая кнопку Link Options. Появится диалоговое окно Link Options, показанное на рис. 5. Выберите желаемый тип нажатием на переключатель в нижнем правом углу диалогового окна.

Если таблицы связаны по нескольким полям, выбор типа объединения для любой связи установит тот же тип для всех связей. Нельзя иметь разные типы объединения для нескольких связей между одними и теми же таблицами.

Хотя наиболее типичные коммерческие отчеты могут быть сделаны с применением равных объединений или левосторонних внешних объединений, могут возникнуть особые ситуации, когда используются другие типы объединений:

  • Greaterjoin (Объединение по условию Больше) Повторяет записи из левой таблицы, соответствующие записям из правой таблицы, каждый раз, когда соединяемое поле слева больше, чем соединяемое поле справа
  • Lessjoin (Объединение по условию Меньше) Повторяет записи из левой таблицы, соответствующие записям из правой таблицы, каждый раз, когда соединяемое поле слева меньше, чем соединяемое поле справа
  • Greaterorequaljoin (Объединение по условию Больше или Равно) Повторяет записи из левой таблицы, соответствующие записям из правой таблицы, каждый раз, когда соединяемое поле слева больше или равно, чем соединяемое поле справа
  • Lessorequaljoin (Объединение по условию Меньше или Равно) Повторяет записи из левой таблицы, соответствующие записям из правой таблицы, каждый раз, когда соединяемое поле слева меньше или равно, чем соединяемое поле справа
  • Notequaljoin (Объединение по условию Не равно) Возвращает все комбинации записей из двух таблиц, если объединяемые поля не равны

Изменять тип объединения можно только для баз данных SQL. Если вызываются опции связи для базы данных ПК–типа, переключатель SQL Join Type становится недоступен. За базами данных ПК–типа закреплено левостороннее внешнее объединение, даже если отключенный переключатель показывает равное объединение.

Какая таблица является исходной ("от") и какая конечной ("к") с точки зрения направленности связи?

При использовании Visual Linking Expert рисование связи начинается со щелчка по исходной таблице. Затем связь перемещается на желаемое поле в конечной таблице. Глядя на направление линии связи, также как на блок и стрелку, вы можете сказать, какая таблица является "от", и какая – "к". Линия связи движется от одной таблицы к другой. При этом на конце "от" линии высвечивается маленький блок, а на конце "к" – стрелка.

Не вызывает споров вопрос "Есть ли различие между таблицами "от" и "к"?" Ответ снова имеет отношение к выбранному типу объединения. Вообще говоря, при равном объединении различие не велико. Однако, оно существенно при любом другом типе объединения, потому что таблица "от" (или левая) и таблица "к" (или правая) определяют, каким образом возвращаются данные.

Соотношения между таблицами часто называют один–к-одному или один–ко–многим. Если в обеих таблицах всегда согласовывается только одна запись, то не важно, какая из таблиц левая, и какая правая — речь идет о соотношении один–к–одному. Однако когда каждой записи в одной таблице соответствует много записей в другой таблице, направление связи существенно. Пусть, например, таблица, содержащая много заказов от одного заказчика, связывается с таблицей, содержащей только одну подходящую запись заказчика. Вероятно, вы захотите провести связь от таблицы Orders (Заказы) (таблица "много") к таблице Customer (Заказчик) (таблица "один").

Если вы заинтересованы в "обратном" порядке связи и хотите переключить таблицы "от" и "к", просто уничтожьте связь и нарисуйте ее заново, или щелкните справа от связи и выберите Reverse Link в раскрывающемся меню.

Связывание одной таблицы ПК–типа с несколькими таблицами

Существует некоторый выбор вариантов создания определенных типов связей между несколькими таблицами при использовании базы данных ПК–типа. Эти возможности возникают при связывании первичной ("ведущей") таблицы с двумя или несколькими вторичными поисковыми таблицами. Число и комбинация возвращаемых записей могут варьироваться в зависимости от того, сколько записей в поисковой таблице подходит каждой записи в первичной таблице. Эти типы связей иногда называют связями "A к B, A к C". Поскольку в базе данных ПК–типа нельзя изменить тип объединения, иногда может понадобиться изменение способа, применяемого Crystal Reports для чтения записи в этих ситуациях.

Рассмотрим следующий пример: в базе данных Microsoft Access находятся три таблицы: Cust, содержащая несколько заказчиков; Orders, содержащая по несколько заказов от каждого заказчика; и Credits, содержащая кредитные уведомления для двух заказчиков.

Если вы составляете отчет, перечисляющий заказчиков наряду с заказами и кредитами для каждого из них, вы обнаружите несколько способов, с помощью которых отчет мог бы показать эти комбинации записей. В данном примере таблицы были следующим образом связаны в Visual Linking Expert:

Обратите внимание, что таблица Cust связана с обеими вторичными таблицами по полю Number. Каждый раз, когда вы таким образом объединяете несколько таблиц в одну, Crystal Reports предоставляет дополнительный выбор—When Linking To Two Files from This File—в диалоговом окне Link Options, которое появляется при двойном щелчке по линии связи. Пользуясь этими опциями, можно выбрать поисковый метод для многотабличной связи:

Переключатели When Linking To Two Files from This File применимы только в базах данных ПК–типа. Они не доступны при любом использовании SQL базы данных. Если вам важно, каким способом ваша SQL база данных возвращает записи в подобных ситуациях, попробуйте различные типы объединения или проконсультируйтесь с администратором базы данных.

Следующие три примера были созданы с помощью предыдущей базы данных Access.  Они показывают Customer Name (Имя Заказчика) из таблицы Cust (называемой здесь Таблица A), Order ID (ID Заказа) и Order Amount (Величина Заказа) из таблицы Orders (Заказы) (Таблица B), Credit ID (ID Кредита) и Credit Amount (Величина Кредита) из таблицы Credits (Кредиты) (Таблица C). Каждый пример показывает результаты выбора одной из трех опций области When Linking To Two Files from This File диалогового окна Link Options.

LookUpBothattheSameTime В этом методе сначала читаются запись из таблицы A, первая подходящая запись в таблице B и первая подходящая запись в таблице C. Затем повторяется та же запись из таблицы A (если есть дополнительные соответствия в таблицах B или C), и включаются следующие подходящие записи из таблиц B и C. Если в Crystal Reports заканчиваются подходящие записи в таблицах B или C, но в другой вторичной таблице они еще остаются, для этой таблицы появляются нулевые значения. Ниже приведен образец отчета при выборе этой опции:

Имя

ID Заказа

Величина заказа

ID Кредита

Кредит

Иванов

1

10 000

1

 –10 000

Иванов

2

12 000

1

 –10 000

Семенов

3

20 000

2

 –23 000

Семенов

4

30 000

3

 –45 000

Катаев

5

45 000

   

Катаев

6

24 000

   

LookUpAllofOne, ThenAllofOthers По существу, эта опция полностью отделяет вторичные таблицы друг от друга. Crystal Reports считывает запись в таблице A. После этого сначала читаются все подходящие записи в таблице B, оставляя чистыми поля для таблицы C. Затем повторяется та же запись из таблицы A, и включаются все подходящие записи из таблицы C, оставляя чистыми поля для таблицы B. Вот пример отчета при выборе этой опции:

Имя

ID Заказа

Величина заказа

ID Кредита

Кредит

Иванов

1

10 000

   

Иванов

2

12 000

   

Иванов  

   

1

–10 000

Семенов

3

20 000

   

Семенов

4

30 000

   

Семенов

   

2

–23 000

Семенов         

   

3

–45 000

Катаев  

5

45 000

   

Катаев       

6

24 000

   

Обычно это единственная из трех опций, которая не повторяет ту же запись из вторичных таблиц (хотя записи первичной таблицы повторяются). Следовательно, этот наиболее прямой метод при вычислении полей промежуточного итога или сводки для группы.

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

LookUpAlltheCombinationsoftheTwoFiles В помощью этой опции можно быстро превратить записи для относительно небольшой базы данных в отчет чудовищного размера. Она начинает с чтения первой записи Таблицы A и ее подгонки к записи Таблицы B. Затем для каждой подходящей записи Таблицы С повторяются записи как Таблицы A, так и Таблицы B. После этого происходит переход на следующую подходящую запись Таблицы B (хотя речь все еще идет о процедуре для первой записи Таблицы A), и записи A и B повторяются для следующей подходящей записи C. Когда в Crystal Reports заканчиваются записи Таблицы B, происходит переход к следующей записи Таблицы A, и весь процесс начинается сначала. Ниже приведен образец отчета при выборе этой опции:

Имя

     ID Заказа

  Величина заказа

  ID Кредита

 Кредит

Иванов

1

10 000

1

–10 000

Иванов

2

12 000

 1

 –10 000

Семенов

3

20 000

 2

–23 000

Семенов

3

20 000

3

–45 000

Семенов

4

30 000

2

–23 000

Семенов

4

30 000

3

 –45 000

Катаев

5

45 000

   

Катаев

6

24 000

   


Продолжение следует!

 Обсудить на форуме   Написать вебмастеру 

© 2001 Interface Ltd