Авторизация



Принудительное соединение в Crystal Report

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

Диалоговое окно Link Options (см. рис. 15.15 и рис. 15.16) содержит раздел Enforce Join (Принудительное соединение). В этом разделе доступны четыре переключателя, позволяющие выбирать включение добавленных в эксперте Database Expert таблиц в окончательный SQL-запрос, отправляемый базе данных, даже если никакие поля из таблицы в отчете использованы не были.

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

Глава 15. Составление отчетов на основе баз данных SQL 439

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

Давайте рассмотрим следующий пример. Две таблицы Oracle (Orders (Заказы), которая является исходной таблицей, и Customer (Клиенты), которая является целевой) связаны по одному общему полю (Customer lD) с использованием типа соединения Inner Join и типа связи “равно”. По умолчанию соединение не является принудительным (Not Enforced). Важный момент в этом примере — это то, какие поля будут размещены в отчете, будут использоваться в выборе формул или записей или будут добавляться в отчет каким-либо иным образом.

В зависимости от устанавливаемого в разделе Enforce Join переключателя, в отчете потенциально будут отображаться разные записи из базы данных, а также разные типы отправляемых серверу Oracle SQL-запросов:

•    Not Enforced (Отключить). Эта опция не добавляет в SQL-запрос никаких дополнительных таблиц, которые нигде в отчете не используются. Например, если в отчет добавляется только поле Order lD (Номер заказа) из таблицы 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 То (Принудительная целевая). Данная опция включит целевую таблицу в запрос, учитывая заданные для нее типы соединения и связи, даже если в отчете никакие поля целевой таблицы не используются. Например, если в отчет из таблицы Orders (Заказы) добавляется только поле Order_ID, а из таблицы Customer (Клиенты) никакие поля не добавляются, результирующий SQL-запрос будет выглядеть следующим образом:

SELECT "ORDERS"."ORDER_ID"

FROM "XTREME"."ORDERS" "ORDERS", "XTREME"."CUSTOMER" "CUSTOMER"

WHERE ("ORDERS"."CUSTOMER ID"="CUSTOMER"."CUSTOMER ID")

Обратите внимание, что таблица Customer (Клиенты) все равно включается в запрос, и что выбранные тип соединения и тип связи будут влиять на набор данные возвращаемых из базы, несмотря на то, что в отчете не используется ни одно no~t из таблицы 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 (Изменить направление связи).

Глава 15. Составление отчетов на основе баз данных SQL 441

FROM "XTREME"."ORDERS" "ORDERS", "XTREME"."CUSTOMER" "CUSTOMER"

WHERE ("ORDERS"."CUSTOMER_ID"="CUSTOMER"."CUSTOMER_ID")

Результатом станет комбинация только заказов, имеющих соответствующую им запись в таблице Customer (Клиенты), и повторение полей из таблицы Customer (Клиент) для каждого подходящего заказа.

Просмотр SQL-запроса
Команды SQL в Crystal Reports
Создание SQL-команды
Добавление параметра в команду
Использование SQL-команды в отчете

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


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