Авторизация



Работает ли функция автоматического связывания Crystal Reports?

Оценить
(0 голоса)

При первоначальном добавлении в отчет таблиц 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 (Автоматическое интеллектуальное связывание).

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

Внимание! Хотя возможность включать в один отчет базы данных нескольких типов значительно повышает степень гибкости Crystal Reports, она может крайне негативно сказываться на производительности отчета. Из-за того, что в таком случае выполнены должны быть несколько различных запросов к базе данных, которые Crystal Reports объединяет вместе локально, процесс обработки отчета может занимать значительно большее количество времени.

Типы соединений, типы связи и принудительное соединение

При связывании двух таблиц необходимо внимательно продумать, какие записи будут возвращаться из обеих таблиц. Рассмотрим незначительные изменения, внесенные в нормализированные структуры таблиц, которые были проиллюстрированы ранее в этой главе; новые структуры таблиц представлены в табл. 15.4 и табл. 15.5.

Работает ли функция автоматического связывания Crystal Reports?

Работает ли функция автоматического связывания Crystal Reports?

При беглом взгляде на эти две таблицы обнаруживаются два несоответствия: для сотрудницы с именем Дэниз (Denise) в таблице Department нет соответствующей записи, а для отдела Finance (Финансовый отдел) в таблице Employee не существует сотрудников. Считается, что у этих двух таблиц отсутствует ссылочная целостность — модный термин, который просто означает, что стопроцентного совпадения между двумя таблицами нет. Модный это термин или нет, для вас, как разработчика отчета, это будет очень важным. Проблему отсутствия ссылочной целостности необходимо как-то решать.

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

Примером обстоятельств, при которых ссылочная целостность играет важную роль, является ситуация, когда отчет разрабатывается с целью распечатки платежных чеков для сотрудников. В качестве примера давайте рассмотрим представленные ранее таблицы. При желании печатать на корешке чека название отдела, в котором работает тот или иной сотрудник, дабы ускорить распространение чеков между сотрудниками, потребуется объединить таблицы Employee и Department по полю Department Number (Номер отдела). Вполне можно предположить, что чек будет выглядеть подобно показанному на рис. 15.14.

Но при этом возникает вопрос: “А что же будет с Дениз?” (последней сотрудницей в таблице Employee). Учитывая тот факт, что Дениз является высокооплачиваемым сотрудником, по крайней мере, по сравнению со многими другими, она, скорее всего, будет очень заинтересована в том, чтобы получить зарплату, независимо от того, соблюдается ссылочная целостность или нет. Еще одним интересным вопросом является вопрос: “Будут ли распечатываться чеки для финансового отдела (Finance)?”. Ответы на эти вопросы будут зависеть того, какой тип соединения используется при связывании этих двух таблиц.

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

•    Inner Join (внутреннее соединение, иногда называемое соединением по равенству). Включает записи из обеих таблиц только тогда, когда соединяемые поля равны.

•    Left Outer Join (левостороннее внешнее соединение, иногда называемое просто внешним соединением). Включает все записи из левой таблицы и записи из правой таблицы только тогда, когда соединяемые поля равны.

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

Рис. 15.14. Чеки на заработную плату, выдаваемые сотрудникам

Ниже представлены два других типа соединения, которые применяются менее часто:

•    Right Outer Join (правостороннее внешнее соединение). Включает все записи из правой таблицы и записи из левой таблицы только тогда, когда соединяемые поля равны.

Дениз такой выбор, как и выбор типа “внутреннее соединение”, вряд ли обрадует. Чек тоже будет испорчен: название отдела напечатается (на корешке чека), а вот ни имени сотрудника, ни суммы заработной платы на этом чеке не будет.

•    Full Outer Join (полное внешнее соединение). Включает все записи из обеих таблиц, независимо от того, являются соединяемые поля равными или нет.

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

Выбор типа соединения и типа связи на вкладке Links диалогового окна эксперта Database Expert
Принудительное соединение в Crystal Report
Просмотр SQL-запроса
Команды SQL в Crystal Reports
Создание SQL-команды

Добавить комментарий


Защитный код
Обновить