Данный учебный курс посвящен генератору отчетов Crystal Reports. Это приложение для многих стало стандартом обработки информации, хранимой в базах данных различных типов. Crystal Reports предоставляет разработчикам широкие возможности по созданию самых разнообразных отчетов — от простых до очень сложных. Приложение поддерживает работу с корпоративными данными различных форматов из различных источников данных. В книге подробно рассматриваются все аспекты создания и распространения отчетов, приводятся многочисленные алгоритмы и примеры работы с программой. Уче
бный курс ориентирован не только на опытных пользователей, уже умеющих работать с базами данных, но и на начинающих, кто только хотел бы научиться создавать отчеты, используя реляционные и SQL-базы данных, механизм ODBC и другие технологии хранения и обработки информации.
Содержание
Введение
Как организована эта книга
Обозначения, принятые в книге
Образцы данных
Дополнительные ресурсы
Благодарности
От издательства
Глава 1. Основы реляционных баз данных
Обзор
Понятие о реляционной базе данных
Псевдонимы
Местонахождение файлов
Индексные таблицы
Связывание таблиц
Ведущие и подчиненные таблицы
Типы отношений
Повышение эффективности при связях один-ко-многим
Повышение эффективности отбора записей
Мастер Visual Linking Expert
Связывание индексированных таблиц
Методы просмотра таблиц в базах данных прямого доступа
Связи в источниках данных ODBC
Контрольные вопросы
Глава 2. Язык SQL и базы данных
SQL - язык запросов
Архитектура клиент-сервер
Система управления базой данных SQL DBMS
Хранимые процедуры
Использование SQL в Crystal Reports
Элементы языка SQL
Серверная обработка
SQL-запрос и группирование данных на сервере
Соответствие между полями отчета и базы данных
Элементы окна Map Fields
Изменение соответствия между полями
Определение соответствия при изменении полей базы данных
Определение соответствия при изменении драйвера базы данных
Контрольные вопросы
Глава 3. Проектирование отчета
Основные этапы разработки отчета
Формулирование целей отчета
Разработка макета отчета
Выбор данных и их источника
Обработка данных
Задание параметров печати
Разработка прототипа на бумаге
Начало работы с Crystal Reports
Образцы отчетов
Модель формирования отчета
Описание схемы генерации отчета
Этапы генерации отчета
Контрольные вопросы
Глава 4. Интерфейс Crystal Reports
Способы создания отчета
Мастера Report Experts
Существующий отчет
Новый отчет
Источники данных для отчета
База данных
Запросы
Словари
Обзор типов полей
Поля базы данных
Поля формул
Параметрические поля
Специальные поля
Поля нарастающих итогов
Поля SQL-выражений
Итоговые поля
Поля названий групп
Выбор источника данных и полей таблиц
Проводник по источникам данных
Проводник по полям отчета
Среда проектирования отчета
Вкладка Design
Вкладка Preview
Свойства вкладок Preview и Design
Контрольные вопросы
Глава 5. Создание первого отчета
Мастера создания отчета
Стандартный
Серийное письмо
Бланк
Перекрестный отчет
С подчиненным отчетом
Почтовые наклейки
Раскрывающийся отчет
Многомерный
Быстрый старт для новичков
Предварительные замечания
Создание отчета
Выбор источника данных
Области отчета
Вставка поля
Действия с полями в отчете
Выделение поля
Добавление новых полей
Предварительный просмотр
Отображение имен полей
Объединение полей с текстовыми объектами
Добавление информации о свойствах файла
Добавление заголовка
Форматирование объектов
Добавление заголовка поля
Фильтрация записей
Удаление поля
Удаление пустых промежутков
Группировка и сортировка
Вставка логотипа в отчет
Быстрый старт для опытных пользователей
Контрольные вопросы
Глава 6. Порядок конструирования отчета
Предварительные действия
Выбор источника данных
Создание связей между таблицами
Размещение данных в отчете
Поля базы данных
Текстовые объекты
Специальные поля
Поля формул
Поля нарастающих итогов
Поля рисунков
Поля SQL-выражений
Поля гиперссылок
Отбор записей
Группировка, сортировка и подведение итогов
Применение развертывания для итоговых данных
Форматирование данных
Применение масштабирования
Вставка на страницу колонтитулов
Вставка титульной страницы
Добавление информации о документе
После изучения основ
Контрольные вопросы
Глава 7. Выборка записей
Отбор записей
Параметры отбора записей
Задание полей выборки
Применение мастера Select Expert
Использование формул отбора
Взаимодействие между Select Expert и Record Selection Formula Editor
Применение шаблонов формул
Создание выборки на основе строковых значений
Создание выборки на основе чисел
Создание выборки на основе дат
Создание выборки на основе заданных диапазонов дат
Создание выборки на основе комбинаций дат, чисел и символов
Использование шаблона формулы
Советы по повышению быстродействия
Общие
Базы данных PC
Базы данных SQL
Повышение эффективности формул отбора записей
Ограничение объема данных, запрашиваемых в базе данных
Примеры формул отбора записей
Создание эффективных формул отбора записей
Отладка формул отбора записей
Исправление формул отбора, не создающих данных
Исправление несоответствия регистра
Лишние пробелы в формуле отбора
Примеры отчетов с использованием выборки
Контрольные вопросы
Глава 8. Сортировка, группировка и подведение итогов
Сортировка данных
Поле сортировки
Направление сортировки
Сортировка по одному или нескольким полям
Группировка данных
Группы и порядок сортировки
Группы, заданные пользователем
Сортировка записей в группе
Фильтрация групп
Применение Select Expert для отбора групп
Применение формул отбора
Отладка формул отбора групп
Задание интервалов для групп
Группировка по первому символу названия
Многоуровневая (иерархическая) группировка данных
Редактирование групп в отчете
Подведение итогов в группах
Сортировка групп по итоговым величинам
Выбор N наибольших (наименьших) значений
Промежуточные итоги
Общие итоги по затратам
Вычисление процентов
Заголовки групп
Стандартные заголовки
Переменные заголовки
Переменные заголовки на основе формулы
Заголовки, определяемые пользователем
Скрытые заголовки групп
Использование свойства drill-down для заголовков групп
Образцы отчетов с итогами
Контрольные вопросы
Глава 9. Нарастающие итоги
Что такое нарастающий итог?
Размещение поля нарастающих итогов
Создание нарастающих итогов
Нарастающий итог в списке
Нарастающий итог в группе
Нарастающий итог с учетом условия
Создание нарастающих итогов при связях один-ко-многим
Создание нарастающих итогов с помощью формулы
Образцы отчетов с нарастающими итогами
Контрольные вопросы
Глава 10. Отчеты с сегментированием областей
Сегменты областей отчета
Работа с сегментами
Слияние двух соседних сегментов
Разбиение сегментов и изменение их размера
Удаление свободного пространства в сегменте
Использование в отчете нескольких сегментов
Защита объектов переменной длины от наложения
Форматирование объектов по заданному условию
Выделение чередующихся строк цветом фона
Подавление пустых строк для полей, не содержащих значений
Добавление пустых строк по заданному условию
Серийные письма
Работа с текстовыми объектами
Создание серийного письма с помощью текстового объекта
Печать сообщения в соответствии с заданным условием
Пример серийного письма
Контрольные вопросы
Глава 11. Форматирование
Основы форматирования
Средства форматирования отчета
Характеристики областей отчета
Объект, прикладываемый к следующей области
Готовые бланки
Скрытие областей отчета
Скрытие объектов
Размещение текстовых объектов
Предохранение текста внутри объекта от усечения
Предупреждение разрывов в тексте, не имеющем пробелов
Размещение текстовых объектов с несколькими строками текста
Импорт текстовых объектов из файла
Промежутки между текстовыми объектами
Применение размерной сетки
Визуализация сетки
Применение направляющих
Визуализация направляющих
Вставка направляющих
Позиционирование объектов с помощью направляющих
Привязка объектов к направляющим
Отступы строк
Представление данных Overflow Field
Выделение нескольких объектов
Свободное размещение
Вертикальное позиционирование
Кернинг и интерлиньяж
Задание размера шрифта
Шрифты TrueType
Поля страниц
Применение полей по умолчанию
Установка размера и ориентации страницы
Драйверы принтера
Атрибуты форматирования
Абсолютное форматирование
Добавление рамки, фона и тени к полю
Вставка и редактирование линий
Вставка и редактирование прямоугольников
Вставка контурных фигур
Бухгалтерское форматирование отчета
Пустые промежутки между строками
Относительное форматирование
Условные свойства атрибутов
Форматирование шрифта по условию
Исключение колонтитула с первой страницы
Мастер выделения
Задание приоритетов выделения
Условное форматирование полей с помощью Highlighting Expert
Отмена и восстановление действий
Контрольные вопросы
Глава 12. Параметрические поля в отчете
Типы полей параметров
Создание поля параметра
Удаление поля параметра
Ввод значения параметра
Обновление данных
Дополнительные свойства параметра
Контрольные вопросы
Глава 13. Перекрестные таблицы
Понятие перекрестной таблицы
Пример перекрестной таблицы
Создание перекрестной таблицы
Создание перекрестной таблицы с помощью мастера
Изменение стиля оформления перекрестной таблицы
Изменение параметров сетки перекрестной таблицы
Вставка перекрестной таблицы в отчет
Форматирование перекрестной таблицы
Подавление вывода некоторых данных перекрестной таблицы
Печать перекрестной таблицы, занимающей несколько страниц
Образец отчета с перекрестной таблицей
Контрольные вопросы
Глава 14. Создание OLAP-отчетов
OLAP-анализ в Crystal Reports
Объекты таблицы OLAP
Создание отчета OLAP
Изменение параметров оформления таблицы
Обновление данных отчета OLAP
Образец отчета с таблицей OLAP
Контрольные вопросы
Глава 15. Применение формул
Понятие формулы
Типовые примеры использования формул
Объекты формул
Синтаксис формул Crystal и Basic
Применение формул
Вызов редактора формул
Интерфейс окна Formula Editor
Ввод компонентов формулы
Создание и редактирование формулы
Копирование формулы
Правила редактирования копии формулы
Удаление формулы
Отладка формул
Основные сведения
Контрольные вопросы
Глава 16. Создание формул в Basic Syntax
Обзор синтаксиса Basic
Советы по изучению синтаксиса Basic
Основы синтаксиса Basic
Результат вычисления формулы
Ограничения на изменение типа данных
Соотношение формул с функциями Microsoft Visual Basic
Обязательное присвоение значения переменной
Нечувствительность к регистру
Комментарии
Поля
Обозначение полей в формуле
Примеры формул, содержащих поля
Утверждения
Присваивание значения
Простые типы данных
Числовой
Денежный
Строковый
Логический
Дата и время
Интервальный тип
Применение интервалов в формулах
Массивы
Переменные
Использование переменных
Объявление переменной с помощью Dim
Объявление переменных без задания типа
Область действия переменной
Локальные переменные
Глобальные переменные
Разделяемые переменные
Объявление массивов
Использование массивов
Использование массивов с циклом For/Next
Значения по умолчанию
Автоматическое преобразование типа
Функции
Функции, аналогичные функциям Visual Basic
Функции итогов
Функции диапазонов дат
Функции массивов
Функции Evaluation Time
Функции этапа печати
Функции свойств документа
Функции условного форматирования
Операторы
Арифметические
Порядок вычислений
Операторы сравнения
Логические операторы
Строковые операторы
Пустые значения полей и функция IsNull
Управляющие структуры
Условный оператор If
Пример использования оператора If
Однострочный оператор If
Условный оператор Select
Цикл типа For/Next
Пример формулы с оператором For/Next
Оператор Exit For
Оператор цикла Do/Loop
Оператор цикла While
Ограничения на циклы
Ограничения на формулы синтаксиса Basic
Пример отчета с формулой синтаксиса Basic
Контрольные вопросы
Глава 17. Создание формул в Crystal Syntax
Обзор синтаксиса Crystal
Новые компоненты синтаксиса Crystal
Основы синтаксиса Crystal
Результат вычисления формулы
Нечувствительность к регистру
Комментарии
Поля
Обозначение полей в формуле
Примеры формул, содержащих поля
Выражения
Несколько выражений
Применение выражения с условием If
Операторы присваивания и равенства
Простые типы данных
Числовой
Денежный
Строковый
Логический
Дата и время
Интервальный тип
Применение интервалов в формулах
Массивы
Переменные
Использование переменных
Объявление переменной
Область действия переменной
Локальные переменные
Глобальные переменные
Разделяемые переменные
Объявление массивов
Переменные массивов в формулах
Использование массивов с циклом For
Значения по умолчанию
Автоматическое преобразование типа
Функции
Функции общего вида
Функции итогов
Функции диапазонов дат
Функции массивов
Функции Evaluation Time
Функции этапа печати
Функции свойств документа
Функции условного форматирования
Операторы
Арифметические
Порядок вычислений
Операторы сравнения
Логические операторы
Строковые операторы
Пустые значения и функция IsNull
Управляющие структуры
Выражение If
Пример использования оператора If
Особенности применения оператора If
Выражение Select
Цикл типа For
Пример формулы с оператором For
Оператор Exit For
Оператор цикла While
Ограничения на циклы
Ограничения на формулы синтаксиса Crystal
Контрольные вопросы
Глава 18. Распространение и просмотр отчетов
Распространение отчетов
Печать отчета
Пересылка отчета по факсу
Экспорт отчета
Экспорт в приложение
Экспорт в файл
Экспорт в папку Microsoft Exchange
Экспорт в Lotus Domino
Сохранение отчета в формате предыдущей версии
Работа с папками Web Folders
Просмотр отчетов из браузера
Демонстрация возможностей Report Viewer
Применение Report Viewer на ActiveX
Применение Report Viewer на Java (Browser JVM)
Применение Report Viewer на Java (Java plug-in)
Применение Report Viewer plug-in
Применение Report Viewer на HTML (Frames)
Применение Report Viewer на HTML
Контрольные вопросы
Глава 19. Подчиненные отчеты
Понятие подчиненного отчета
Связанные и несвязанные подчиненные отчеты
Обеспечение связи подчиненного отчета
Связанные таблицы и подчиненные отчеты при связи один-ко-многим
Создание подчиненного отчета
Предварительный просмотр подчиненного отчета
Сохранение подчиненного отчета как самостоятельного отчета
Обновление данных подчиненного отчета
Связь подчиненного отчета с данными главного отчета
Связывание подчиненного отчета с основным без изменения формулы отбора
Использование подчиненных отчетов для объединения отчетов без взаимной связи
Создание подчиненных отчетов для несвязанных данных
Связывание вида link to/from с полем формулы
Связь между неиндексированными таблицами
Подчиненные отчеты, вызываемые по требованию
Создание подписи для подчиненного отчета по требованию
Создание различных представлений данных в отчете
Образцы отчетов
Контрольные вопросы
Глава 20. Построение диаграмм
Основные понятия
Обзор диаграмм
Типы диаграмм
Виды диаграмм
Место для диаграммы
Диаграмма с развертыванием данных
Построение диаграмм
Диаграммы типа Advanced layout
Построение диаграммы типа Group layout
Построение диаграммы типа Cross-Tab layout
Построение диаграммы типа OLAP layout
Работа с диаграммой
Редактирование диаграммы с помощью Chart Expert
Редактирование диаграммы на вкладке Analyzer
Форматирование элементов диаграммы на вкладке Analyzer
Изменение масштаба гистограмм и линейных графиков
Изменение размера и положения диаграммы
Печать диаграммы в последующем сегменте
Образцы отчетов
Контрольные вопросы
Глава 21. Географические карты
Основные понятия
Типы карт
Виды карт
Место для размещения карты
Карта с развертыванием данных
Построение карты
Построение карты типа Advanced
Построение карты типа Group
Построение карты типа Cross-Tab
Построение карты типа OLAP
Создание карты в подчиненном отчете
Работа с картой
Редактирование карты с помощью Map Expert
Редактирование карты на вкладке Analyzer
Изменение вида карты
Изменение слоев карты
Разрешение несоответствия данных
Замена географической карты
Изменение размера и расположения карты
Печать карты в последующем сегменте
Масштабирование, панорамирование и центрирование карты с помощью Map Navigator
Управление панелью Map Navigator
Контрольные вопросы
Глава 22. Создание отчетов на базе запросов
Применение запросов Access
Доступ к запросам Access с помощью DAO
Доступ к запросам Access с помощью ODBC
Доступ к параметрическим запросам Access
Использование источников данных ODBC
Подключение к MS SQL Server с помощью ODBC
Хранимые процедуры SQL
Расширение свойств базы данных
Связи типа один-ко-многим
SQL-запросы
Контрольные вопросы
Глава 23. Создание отчетов в Excel и Access
Надстройки Seagate Crystal Reports Add-Ins
Надстройка для Microsoft Excel
Надстройка для Microsoft Access
Работа с Microsoft Excel Add-In
Установка мастера Crystal Report Wizard в Excel
Создание отчетов в Excel
Работа с Microsoft Access Add-In
Установка мастера Crystal Report Access Wizard
Создание отчетов в Access
Контрольные вопросы
Глава 24. Crystal SQL Designer
Запросы в Crystal SQL Designer
Модуль Crystal SQL Designer
Создание нового запроса с помощью Crystal SQL Designer
Связывание таблиц и задание типа объединения
Параметры связи
Предварительный просмотр данных
Подведение итогов с помощью агрегатных функций
Создание запроса из уже существующего
Задание параметров в Crystal SQL Designer
Распространение запросов и отчетов на их основе
Контрольные вопросы
Глава 25. Словари
Понятие о словаре
Создание словаря
Создание словаря с помощью мастера Crystal Dictionary Expert
Добавление таблиц к словарю
Связывание нескольких таблиц
Создание представления данных
Доступность таблиц и полей для пользователя
Организация представления данных
Графическая информация в словаре
Создание примерных данных для доступа пользователя
Работа с существующим словарем
Доступ к словарю из отчета
Задание параметров в Crystal Dictionary
Распространение отчетов, построенных на базе словаря
Контрольные вопросы
Алфавитный указатель
ОТРЫВОК
Основы реляционных баз данных
В главе рассматриваются основы построения и использования реляционных баз данных, связи между таблицами базы данных и индексирование таблиц. Обсуждаются как общие понятия, так и задачи, возникающие при работе с файлами баз данных. В завершение представлены типы связей SQL для источников данных, доступных через ODBC.
Обзор
Существуют различные системы управления базами данных Database Management Systems (DBMSDBMS). Программа Crystal Reports позволяет работать со всеми из них. Причем, процесс взаимодействия с файлами, таблицами, записями и полями, входящими в базу данных, будет одним и тем же независимо от типа используемой базы данных. Любому разработчику отчетов в среде Crystal Reports требуется уметь работать с индексами таблиц и создавать связи между ними, использовать псевдонимы, указывающие на файлы базы данных, в том числе на перемещенные или переименованные файлы.
Доступ к данным с помощью ODBC и работа с SQL базами данных рассматривается в главе "Язык SQL и базы данных" на с. .
Понятие о реляционной базе данных
При разработке архитектуры базы данных чаще всего применяется реляционная модель данных. Приложения для создания базы данных на основе этой модели используют систему управления Relational Database Management Systems (RDBMSRDBMS). В реляционной базе данные организуются в систему строк и столбцов. Строки называются записямибаза данных;записи, а столбцы - полямибаза данных;поля. Совокупность записей и полей образует таблицу базы данных. Каждая запись содержит набор взаимосвязанных данных, например информацию об определенном покупателе. Каждое поле представляет определенный
тип данных, одинаковый для всех записей таблицы, например имя покупателя.
Часто данные двух различных таблиц связаны между собой общим полем. Например, таблица покупателей Customers содержит поле Customer ID для каждого покупателя, а таблица заказов Orders содержит такое же поле Customer ID для указания на покупателя, сделавшего данный заказ. Эти поля позволяют создать отношениеотношение между таблицами, графически отображаемое линией связи. Как связать две таблицы с помощью общего поля см. в разделе "Связывание таблиц" на с. .
Псевдонимы
По разным причинам расположение файла базы данных или его имя может измениться. Создавая отчет, необходимо быть уверенным, что мастер создания отчета Report Designer сможет найти новое местоположение файла или переименованную таблицу. Это особенно важно при использовании в отчете формул, ссылающихся на таблицу, у которой впоследствии изменилось имя. Исправить вручную ссылку на одно поле не представляет труда, но поиск всех формул, содержащих такую ссылку, может стать сложной и трудоемкой задачей.
Для решения этой проблемы конструктор отчета Report Designer использует псевдонимы псевдоним (aliasesalias) при обращении к таблицам и файлам. Псевдонимы являются указателями, информирующими программу, где следует искать поле базы данных. При изменении имени или местоположения базы данных этот указатель достаточно просто обновить. Сам псевдоним при этом не меняется, так что все формулы остаются без изменения. Конструктор отчета обращается к псевдониму для определения имени и местоположения необходимого файла базы данных, находит соответствующее поле данных и вы
числяет результат формулы на основе его значения.
При первом указании на таблицу или файл мастер создания отчета Report Designer автоматически назначает псевдонимы таблицам базы данных. По умолчанию в качестве псевдонима используется имя исходной таблицы. В тех базах данных, где каждая таблица хранится в виде отдельного файла, используется имя этого файла без учета расширения. Например, для файла базы данных dBASE Company.dbf программа создаст по умолчанию псевдоним Company. Можно принять предложенный по умолчанию псевдоним либо для любой из таблиц создать новый с помощью команды Alias Database4Set AliasSet Alias (База данных4Назнач
ить псевдоним). Однако если в формулах отчета уже используется предыдущий псевдоним, их необходимо отредактировать, используя вновь созданный псевдоним таблицы.
Местонахождение файлов
При переименовании или перемещении файла базы данных программа Crystal Reports при следующем обращении к отчету не сможет найти данные. Аналогичная ситуация возникает и в случае, когда отчет создан на одном компьютере, где все базы данных находятся в определенной папке, а затем скопирован на другой компьютер, где те же базы данных находятся в другом месте. В любом из случаев необходимо удостовериться в наличии баз данных, требуемых для отчета, и обновить указатели на новое место расположения или новое имя базы данных.
КомандаКоманда;Verify Database Database4Verify DatabaseVerify Database (База данных4Проверить базу данных) проверяет указатели на источник данных для отчета. Если файл базы данных не найден, то программа извещает об обнаруженном несоответствии.
Указатели на источник данных отчета Crystal Reports можно изменить командой Database4Set Location (База данных4 Задать местоположение). Это наиболее простой способ, позволяющий указать новое имя файла или местонахождение базы данных.
Кроме того, команда Set Location позволяет задать драйвер для выбранного источника данных. Например, преобразовать источник прямого доступа в источник данных ODBC. При этом действуют следующие правила:
при перемещении одной таблицы команда Set Location может сохранить указанный тип источника данных или заменить его любым другим типом;
при перемещении нескольких таблиц команда Set Location преобразует их все в тот же самый тип источника данных; перемещение нескольких таблиц с преобразованием типа источника данных выполняется с помощью команды Data?base4Convert Database Driver (База данных4 Изменить драйвер базы данных).
Подробнее см. в разделе "Изменение источника данных ODBC для отчета" на с. .
Индексные таблицы
Создание индекс для таблиц базы данных увеличивает скорость доступа к данным и уменьшает время, необходимое для их преобразования. Часть систем управления базами данных DBMS автоматически создают индексные таблицы, однако большинство приложений требует создания индексов вручную. Поэтому необходимо проверить существование индексов в используемых базах данных, что позволит увеличить эффективность генерации отчетов.
ПРИМЕЧАНИЕ. Часть приложений систем управления базами данных DBMS не поддерживает индексацию таблиц. Для информации о поддержке и создании индексов следует обратиться к описанию соответствующего приложения.
Мастер Visual Linking Expert (Визуальный мастер связей) также позволяет определить, созданы ли индексы для таблиц используемой базы данных.
Таблица 1.1. Базовая таблица заказов
Order# Customer Amount
10444 Allez Distribution 25141.50
10470 BG Mountain Inc. 19164.30
10485 Sierra Mountain 8233.50
10488 Mountain Toad 24580.50
10495 SFB Inc. 7911.80
10501 La Bomba de Bicicleta 1956.20
10511 BG Mountain Inc. 1683.60
10544 Sierra Bicycle Group 19766.20
10568 Mountain Tops Inc. 29759.55
10579 Sierra Bicycle Group 12763.95
В реляционной базе данных индексы служат для более удобного доступа к данным. Например, в табл. 1.1 информация упорядочена по полю номера заказа Order#. Это удобно, если мы знаем номер конкретного заказа, но как быть, если надо найти все заказы определенного покупателя? Предположим, мы хотим найти все заказы, сделанные Sierra Bicycle Group. Процессор базы данных (database engine) должен начать с просмотра первой записи в таблице, сравнивая хранимое имя покупателя с запрашиваемым. Если соответствия нет, то он переходит ко второму заказу и проверяет в нем имя покупателя. Когда он
достигнет заказа, который соответствует требуемому имени покупателя, то должен запомнить информацию и перейти к следующему заказу.
Используя эту методику, необходимо прочитать поля Order# и Customer для каждой записи в таблице. Это потребует значительного времени и вычислительных ресурсов для проверки таблиц, содержащих сотни тысяч или миллионы записей. Вместо этого можно создать индекс для таблицы, основываясь на поле Customer. Индекс может выглядеть следующим образом.
Таблица 1.2. Индекс по названиям покупателей
Customer Pointer to Order#
Allez Distribution 10444
BG Mountain Inc. 10470
BG Mountain Inc. 10511
La Bomba de Bicicleta 10501
Mountain Toad 10488
Mountain Tops Inc. 10568
SFB Inc. 10495
Sierra Bicycle Group 10544
Sierra Bicycle Group 10579
Sierra Mountain 10485
В нем информация упорядочена по покупателям, а не по заказам. Отметим также, что второй столбец содержит указатели (pointers) на определенные номера заказов исходной таблицы. Используя индекс, процессор базы данных находит заданного покупателя (в нашем примере - Sierra Bicycle Group) в первом столбце Customer. Из каждой записи индекса, соответствующей нужному покупателю, процессор узнает указатель на соответствующую запись в исходной таблице. Поэтому в исходной таблице считываются только заказы выбранного покупателя. Наконец, поскольку информация в индексе упорядочена
по именам покупателей, то процессору базы данных нет необходимости продолжать просмотр таблицы индексов после того, как он обнаружит, что следующая запись не соответствует выбранному покупателю.
Таким образом, использование индексов ускоряет процесс генерации отчетов, что является важным фактором для баз данных с большим количеством записей.
Связывание таблиц
При создании связи устанавливается соответствие записей одной таблицы записям другой. Например, при связывании таблиц Orders и Customers мы указываем, что каждой записи из таблицы заказов Orders должен соответствовать определенный покупатель из таблицы Customer. При создании связи используется поле, общее для обеих таблиц. Программа Crystal Reports использует связь для поиска соответствующих записей в обеих таблицах. В нашем примере связь обеспечивает помещение в каждой строке отчета данных, касающихся каждого заказа, из обеих связанных таблиц.
Ведущие и подчиненные таблицы
Задание связи идет от одной таблицы к другой. Таблица, с которой начинают устанавливать связь (link fromlink from), является ведущей (primary) таблицей, а таблица, к которой подводят связь (link tolink to), становится подчиненной (lookup). Записи в ней просматриваются со стороны ведущей таблицы. В случае простой связи Report Designer выбирает первую запись ведущей таблицыведущая таблица и находит все соответствующие ей записи в подчиненной таблицеподчиненная таблица. Как только будут найдены все совпадения с первой записью ведущей таблицы, происходит переход ко второй записи и выпол
няется поиск совпадений для нее.
ВНИМАНИЕ. Crystal Reports может устанавливать связь между текстовыми полями при неполном их совпадении. Такая связь называется частичной (partial linkpartial link). Чтобы разрешить задание частичных связейчастичная связь в Crystal Reports в окне Link Options (Параметры связи) устанавливают флажок Allow partial text matches (Разрешить частичное совпадение текста).
Примером частичной связи полей может служить запись, в поле которой содержится значение Chris и запись другой таблицы, в поле которой содержится значение Christopher. Однако частичные связи требуют, чтобы значение в подчиненной таблице было длиннее, чем в ведущей. Таким образом, значение Chris можно связать со значением Christopher, но не наоборот. Значение Christopher нельзя связать со значением Chris.
Типы отношений
При связывании двух таблиц между их записями устанавливается один из следующих типов отношений:
Один-к-одному (one-to-one);
Один-ко-многим (one-to-many).
Отношение один-к-одному
При связи к одному один-к-одному (one-to-oneone-to-one) каждой записи ведущей таблицы соответствует только одна запись в подчиненной (в соответствии со значением поля связи). Например, в базе данных Xtreme.mdb таблица Employee содержит информацию о служащих компании, их должностях, зарплатах, увольнении и т. п. Таблица Employee Addresses включает домашний адрес каждого сотрудника. Таблицу Employee можно связать с таблицей Employee Addresses по полю Employee ID в каждой из таблиц. Определенному сотруднику соответствует только одна запись в каждой из таблиц. Следовательно, при связывании этих таблиц д
ля каждой записи таблицы Employee можно найти только одну запись в таблице Employee Addresses. Это и есть отношение один к одному.
Отношение один-ко-многим
При связи один-ко-многим (one-to-manyone-to-many) каждой записи ведущей таблицы может соответствовать одна или несколько записей подчиненной (в соответствии со значением поля связи). В базе данных Xtreme.mdb таблица Customer содержит информацию о каждом покупателе, разместившем в компании свой заказ. Таблица Orders включает информацию обо всех заказах, сделанных покупателем. Таблицу Customer можно связать с таблицей Orders по полю Customer ID в каждой из таблиц. Поскольку каждый из покупателей может сделать несколько заказов, то в таблице Orders несколько записей может соответствовать одн
ой конкретной записи таблицы Customers. Это пример отношения один-ко-многим один ко многим.
Повышение эффективности при связях один-ко-многим
Минимизация времени генерации отчета и уменьшение сетевого трафика при использовании серверных баз данных возможно при правильном использовании формул отбора и индексирования таблиц, связанных отношением один-ко-многим. В противном случае возможна передача десятков и сотен лишних записей, которые не будут включены в результирующий отчет.
В случае связи один-ко-многим между двумя таблицами количество записей, которые читает и преобразовывает процессор базы данных, зависит от множества факторов. Для оценки влияния этих факторов рассмотрим табл. 1.3 и 1.4, которые составлены, исходя из следующих предположений:
в таблице A имеется 26 записей (по одной на каждую букву латинского алфавита);
в таблице B находится 2600 записей (по 100 записей, соответствующих каждой записи таблицы A);
создаваемый отчет должен найти две записи из таблицы A и соответствующие им 200 записей (100+100) из таблицы B;
при наиболее успешном сценарии выполнения задачи программа должна прочитать 200 записей;
при наихудшем сценарии программа выполнит задачу, прочитав все 67 600 записей.
ПРИМЕЧАНИЕ. Для файлов SQL баз данных эффективное создание отчетов определяется иначе, чем для файлов с прямым доступом из Crystal Reports. Здесь под SQL базой данных понимается также любая база данных, доступная через ODBC.
Таблица включает следующие столбцы.
Связи/Подчиненный отчет. Указывает на создание отчета из связанных таблиц либо на создание подчиненного отчета, использующего данные из основного.
Формула отбора. Определяет наличие формулы отбора записей в основном отчете, которая задает ограничения на ключевое (индексное) поле таблицы A.
Индекс A. Определяет наличие индекса для поля таблицы A.
Индекс B. Определяет наличие индекса для поля таблицы B.
Читается в A. Количество записей, прочитанных в таблице A при поиске двух требуемых записей.
Читается в B. Количество записей, прочитанных в таблице B при поиске 200 искомых записей.
Всего читается записей. Общее число прочитанных при выполнении задачи записей.
Файлы прямого доступа
Таблица 1.3. Зависимость эффективности для источника прямого доступа
Связи/ Подчиненный отчет Формула отбора Индекс A Индекс B Читается в A Читается в B Всего читается записей
Связанный Нет Да или нет Да 26 100 2600 (26*100)
Связанный Да Нет Да 26 100 2600 (26*100)
Связанный Да Да Да 2 100 200 (2*100)
Подчиненный отчет Нет Нет Нет 26 2600 67 600 (26*2600)
Подчиненный отчет Нет Да Нет 2 2600 67 600 (26*2600)
Подчиненный отчет Нет Да Да 26 100 2600 (26*100)
Подчиненный отчет Да Нет Нет 2 2600 5200 (2*2600)
Подчиненный отчет Да Нет Да 26 100 2600 (26*100)
Подчиненный отчет Да Да Да 2 100 200 (2*100)
При работе с файлами данных связь один-ко-многим возникает как при связывании таблиц одного отчета, так и при добавлении к основному отчету подчиненного.
Связь файлов данных
ри выборе данных из связанных файлов в случае связи один-ко-многим программа выполняет следующую процедуру: заданная формула отбора делится на отдельные компоненты и те из них, что могут быть переданы для обработки с помощью процедур базы данных (database DLL), передаются системе управления базой данных, что позволяет ограничить объем запрашиваемой информации.
Рассмотрим следующую формулу выборки:
{customer.REGION} in "CA" to "IL" AND
Remainder ({customer.CUSTOMER ID},2)=0
В этой формуле часть до оператора AND содержит условие выборки для поля Region в диапазоне значений от CA до IL. Программа передает это условие процедуре, в случае базы данных прямого доступа, или на сервер, в случае данных SQL. См. главу "Выборка записей" на с. .
Вторая часть формулы требует выполнения отбора в процессе генерации отчета с помощью Report Engine. При этом используется встроенная функция, вычисляющая значение на основе поля базы данных, что не может быть выполнено в процедуре или на сервере. Поэтому программа не передает данное условие.
Если таблица A является индексированной, а условие, ограничивающее диапазон значений, основано на индексированном поле (в нашем примере {customer.REGION}), программа обращается непосредственно к искомой записи таблицы A (первой записи со значением CA) и читает ее.
Для этой записи программа находит соответствующую запись в таблице B, используя индекс поля этой таблицы.
Программа возвращает объединенную запись (A+B) в конструктор отчета Report Designer, который проверяет ее на соответствие остальной части формулы отбора.
Затем программа читает следующую соответствующую запись таблицы B и возвращает объединенную запись и т. д., пока не будут прочитаны все подходящие записи таблицы B.
После этого программа возвращается к таблице A и читает в ней следующую запись. Так как таблица индексирована и отсортирована в возрастающем порядке, то нет необходимости проверки на соответствие условию значению CA. Однако программа выполняет проверку на соответствие значению IL. Если запись все еще находится в заданном диапазоне, то программа начинает процесс поиска совпадающих записей для данной записи.
Данные действия повторяются до тех пор, пока не будут отобраны все заданные записи таблицы A и соответствующие им записи таблицы B.
Чтобы найти две записи в таблице A и 100 соответствующих им записей в таблице B, программа должна прочитать 200 записей.
ПРИМЕЧАНИЕ.
Подчиненная таблица (Table B) обязательно должна быть индексированной, в противном случае создать связь будет невозможно.
Если таблица A не индексирована или существует индекс, который не используется формулой отбора записей (она базируется на поле без индекса), то программа читает первую запись таблицы. Это происходит следующим образом:
для этой записи программа ищет первую соответствующую запись в таблице B, используя ее индекс;
затем программа возвращает объединенную запись (A+B) в конструктор отчета Report Designer, который проверяет ее на удовлетворение всей формуле отбора;
после этого ищется вторая соответствующая запись таблицы B и программа возвращает следующую объединенную запись, затем третью и т. д., пока не будут возвращены все записи таблицы B, соответствующие первой записи таблицы A.
наконец, программа переходит к следующей записи таблицы A и процесс поиска совпадающих значений и их передача в процессор повторяется вновь.
Таким образом, чтобы найти две записи таблицы A и 100 соответствующих записей в таблице B, программа прочитает 2600 записей.
Подчиненные отчеты и файлы данных
Если главный отчет основан на таблице A, а подчиненныйподчиненный отчет базируется на таблице B и все записи взаимосвязаны, то будут выполнены следующие действия:
если число подчиненных отчетов в программе определяется индексами и формулой отбора главного отчета, то:
если таблица A индексирована, а главный отчет включает формулу отбора, которая базируется на индексированном поле, программа оперирует двумя подчиненными отчетами;
если таблица A не индексирована или она содержит индекс, но формула отбора не ограничивает число записей индексированного поля, программа оперирует 26 подчиненными отчетами;
если число записей, читаемых для каждого подчиненного отчета, определяется наличием индекса в таблице B, то
если таблица B индексирована, программа прочитает только совпадающие записи (100) при генерации подчиненного отчета;
если таблица B не содержит индекса, программа при генерации отчета всегда читает все записи таблицы B (2600).
Случай SQL баз данных
Таблица 1.4. Зависимость эффективности для SQL базы данных
Связи/ Подчиненный отчет Формула отбора Читается в A Читается в B Всего читается записей
Связанный Нет 26 100 2600 (26*100)
Связанный Да 2 100 200 (2*100)
Подчиненный отчет Нет 26 100 2600 (26*100)
Подчиненный отчет Да 2 100 200 (2*100)
Поскольку индексы для SQL баз данныхSQL базы данных не обязательны, то эффективность будет одинаковой для связанных таблиц или подчиненных отчетов и будет зависеть только от наличия формулы отбора в главном отчете, ограничивающей диапазон данных таблицы A. Для сравнения см. раздел "Связь файлов данных" на с. .
Связанные таблицы SQL
Если в формуле отбора содержится ограничение на данные, то оно будет передано на сервер:
если формула ограничивает число данных в таблице A, сервер выберет записи таблицы A, удовлетворяющие критерию отбора (2), найдет соответствующие им записи таблицы B (100) и возвратит 200 объединенных записей в конструктор отчета Report Designer;
если формулы отбора нет либо она не ограничивает число данных таблицы A, сервер поставит в соответствие каждой записи таблицы A (26) соответствующие записи таблицы B (100) и возвратит 2600 объединенных записей в конструктор отчета Report Designer.
В обоих случаях конструктор отчета Report Designer затем применит формулу отбора целиком к переданным ему объединенным записям.
Подчиненные отчеты в SQL базах данных
При создании главного отчета на основе таблицы A и подчиненного отчета на основе таблицы B:
число подчиненных отчетов в программе определяется формулой отбора в главном отчете:
если формула отбора ограничивает количество обрабатываемых записей таблицы A, то программа создает подчиненные отчеты только для записей, удовлетворяющих заданному критерию отбора (в нашем примере - два отчета);
если формула отбора отсутствует либо не ограничивает число записей таблицы A, то программа генерирует подчиненные отчеты для всех записей таблицы A (26);
число записей, читаемых каждым подчиненным отчетом, будет одинаковым независимо от ограничений таблицы A, при этом каждый подчиненный отчет читает только те записи таблицы B, которые соответствуют записи в таблице A (100).
Повышение эффективности отбора записей
Случай № 1. Как в файлах баз данных, так и в SQL базах данных программа разделяет формулу отбора на части и передает на сервер те из них, которые могут быть на нем выполнены.
Следовательно, если в формуле отбора первый компонент можно выполнить на сервере, то он будет передан, затем при невозможности передачи второго компонента он будет пропущен, если третий компонент можно передать на сервер, то он также будет передан и т. д.:
в случае файлов прямого доступа программа передает те условия отбора, которые могут быть выполнены системой управления базой данных (database translation layer);
в случае SQL баз данных программа передает на сервер те условия, которые могут быть записаны с помощью оператора WHERE.
Хотя и существуют некоторые исключения, как правило, программа может передать на сервер любой элемент формулы, сравнивающий значение поля с константой. Практически это означает, что на сервере можно проверить любой критерий, созданный с помощью мастера отбора Select Expert: равенство (equal to), один из (one of ), меньше чем (less than), больше чем (greater than), меньше или равно (less than or equal ), больше или равно (greater than or equal ), в заданном диапазоне (between), начинается с (starting with) или похоже на (like).
Следует рассмотреть два особых случая формулы отбора, в которых она включает несколько условий, причем часть из них может быть выполнена на сервере, а другая нет.
Формулы с оператором AND
{customer.REGION} = "CA" AND
{customer.CUSTOMER ID}[3 to 5] = "777"
В этом случае программа исследует возможность отправки на сервер условия, расположенного перед оператором AND, но не после него. Поскольку искомые записи должны удовлетворять обоим условиям, программа передаст на сервер первое из них, получит данные, удовлетворяющие ему, а затем в конструкторе отчета Report Designer применит второе условие к этим отобранным данным. Следовательно, правило для логического умножения AND таково, что программа передает на сервер любое возможное условие.
Формулы с оператором OR
{customer.REGION} = "CA" OR
{customer.CUSTOMER ID}[3 to 5] = "777"
В этом случае также исследуется возможность отправки на сервер условия, расположенного перед оператором OR, но не после него. Поскольку существуют записи, которые могут удовлетворять второму условию, но не удовлетворять первому, передача первого условия на сервер не имеет смысла, поскольку в этом случае будет получен неполный набор данных. Следовательно, программа ничего не отправляет на сервер, а получает от него полный набор данных и проверяет оба условия в конструкторе отчета Report Designer. Правило для логического сложения OR таково, что программа предает
на сервер либо все условия, либо ничего.
Случай № 2. Чтобы увеличить производительность с помощью индекса таблицы A, необходимо удостовериться, что: задана формула отбора;
в формуле ограничивается число значений индексированного поля таблицы A;
в диалоговом окне Report Options (Параметры отчета) установлен флажок Use Indexes or Server for speed (Использовать индексы или сервер) - см. раздел "Активизация серверной обработки" на с. .
Случай № 3. Если в таблице А есть индексированное поле, которое можно использовать в условии отбора, создайте такое условие.
Предположим, что существуют три товара (Product 1, Product 2, Product 3) и требуется определить продажи товара Product 2 в США. По полю Product индекс не создан, но имеется индекс по полю Order Date. Поскольку известно, что товар Product 2 поступил в продажу позднее июля 1995, то можно ускорить создание отчета, ограничив записи заказами, сделанными после даты July 1995 с помощью формулы отбора. В этом случае программа использует индекс поля Order Date для получения заказов, сделанных после заданной даты (меньший набор записей, чем полная база данных), а затем выполнит поиск появления товара Product 2 в э
том ограниченном наборе данных, а не в полной базе.
Мастер Visual Linking Expert
Visual Linking Expert (Визуальный мастер связей) предназначен для установления отношений между таблицами. При выборе из меню командыкоманда;Add Database To Report Database4Add Database To Report (База данных4Добавить базу данных к отчету) и указании на дополнительную таблицу базы данных открывается окно Visual Linking Expert, демонстрирующее таблицы, на которых основывается отчет.
Самый простой способ создания связей между таблицами - использование кнопки Link в окне Visual Linking Expert, позволяющей автоматически определить связи между таблицами на основе их одноименных полей или вхождения полей в индексы (в том случае, если база данных поддерживает индексы).
Связывание индексированных таблиц
При связывании таблиц баз данных прямого доступа связь задается от поля ведущей таблицы к индексированному полю подчиненной таблицы. При этом поле ведущей таблицы может быть индексированным, но это не обязательное условие. Поле подчиненной таблицы обязательно должно быть индексировано. Несомненно, что оба поля должны иметь один и тот же тип данных (например, можно связать текстовое поле одной таблицы с текстовым полем другой либо числовое поле одной таблицы с числовым полем другой при условии их одинакового размера, но нельзя связать числовое поле од
ной таблицы с текстовым полем другой).
ПРИМЕЧАНИЕ. Некоторые приложения DBMS разрешают выполнять преобразование значений поля к другому типу данных при создании индекса. Например, поле в таблице может быть числовым, в то время как в индексе эти значения преобразуются в текст. Однако при выборе этого поля для связи с другой таблицей следует указывать поле с исходным типом данных. Нельзя связать текстовое поле с числовым, хотя бы для него и был создан текстовый индекс.
При связывании таблиц из различных источников ODBC, например MS SQL Server и Oracle, для установления связей можно использовать только поля таблиц текстового типа, так как они записаны в базе данных одинаковым способом, независимо от варианта источника данных. Для других типов данных способ хранения может отличаться, поэтому в Crystal Reports нельзя связывать базы данных разного типа по полям, имеющим тип, отличный от текстового.
Выбор индекса, используемого для связи
При использовании опции Smart Linking для организации связи между таблицами по полю, входящему в несколько индексов, Crystal Reports выбирает для связи один из них, причем не обязательно тот, который вы хотите использовать. Контроль выбранного индекса и его изменение можно выполнить в области Index (Индекс) окнаокно;Link Options Link OptionsLink Options (Параметры связи).
Вызов данного диалогового окна возможен одним из следующих методов:
двойным щелчком на изображении линии связи;
выделением линии связи и щелчком на кнопке Link Options окна Visual Linking Expert (Мастер визуальных связей);
щелчком правой кнопки мыши на изображении линии связи и выбором командыOptions (Параметры) контекстного меню.
Область Index диалогового окна Link Options состоит из двух частей.
Раскрывающийся список Index In Use (Используемые индексы).Index In Use В этом поле отображается выбранный индекс. Щелчок на кнопке списка откроет перечень всех доступных для связывания индексов, а также значение No specific index (Без индекса). Если индекс отсутствует в списке, то его можно включить в список с помощью кнопки Add Index (Добавить индекс).
Поле ввода Fields in Index (Поля индекса). Fields in Index В этом поле отображаются имена полей, включенных в индекс, заданный в поле Index In Use.
При выборе значения No specific index программа выберет индекс в следующий раз, когда будет использован режим предварительного просмотра отчета на вкладке Preview (Просмотр).
ПРИМЕЧАНИЕ. Не все приложения DBMS поддерживают индексирование таблиц. Прежде чем создавать связи между таблицами, следует удостовериться, что база данных может использовать индексы.
Методы просмотра таблиц в базах данных прямого доступа
Если таблица связана с двумя или большим числом других таблиц, то в Crystal Reports следует указать порядок просмотра связанных данных от ведущей таблицы ко второй, третьей и другим подчиненным таблицам.
В Crystal Reports на выбор имеется три варианта просмотра подчиненных таблиц:
одновременный просмотр всех таблиц, см. раздел на с. ;
просмотр всех записей одной таблицы, затем всех записей другой таблицы, см. раздел на с. ;
просмотр всех комбинаций двух файлов, см. раздел на с. .
Эти варианты доступны в случае, когда ведущая таблица связана с двумя или большим числом подчиненных таблиц. При этом каждая связь ведущей таблицы должна быть типа link from. Например, этот вариант будет доступен в случае связи таблицы Customer как ведущей по отношению к таблицам Orders и Credit. Однако если таблица Customer является ведущей по отношению к таблице Orders, а таблица Credit является ведущей по отношению к таблице Customer, то этот вариант будет недоступен.
ВНИМАНИЕ. Эти варианты недоступны при использовании источников данных ODBC.
В примере, приведенном далее и демонстрирующем каждый из методов, будут представлены три поля из трех разных связанных таблиц. В каждом случае таблица Customer связана с таблицами Credit и Orders. Будем рассматривать поле Customer Name из таблицы Customer, поле Amount из таблицы Credit и поле Order Amount из таблицы Orders. Они не являются полями связи между этими таблицами, но данные, находящиеся в этих полях, позволят представить, каким образом данные выбираются при использовании каждого из трех методов.
Одновременный просмотр всех таблиц
При задании этого параметра каждой записи в таблице Customer ищется соответствующая запись таблицы Credit и соответствующая запись таблицы Orders. Затем выполняется поиск следующей соответствующей записи в таблице Credit и в таблице Orders и т. д. Как только все соответствующие записи будут найдены, процесс повторится для следующей записи таблицы Customer.
Следует отметить, что в отчете каждому значению поля Amount таблицы Credit совсем необязательно должно соответствовать значение поля Order Amount таблицы Orders, причем связь между ними отсутствует. Однако каждой записи таблицы Customer одновременно ставится в соответствие запись таблицы Credit и одна запись из таблицы Orders. Как только в таблице Credit закончатся записи для выбранного значения из таблицы Customer, пустые значения будут представлены в поле этой таблицы, в то время как значения записей из таблицы Orders будут существовать. Это же справедливо и для таблицы Orders при просм
отре в ней всех записей.
Таблица 1.5. Выбор значений при одновременном просмотре таблиц
Customer Table Customer Name Credit Table Amount Orders Table Order Amount
Cyclists Incorporated ($1088.56) $1529.70
Cyclists Incorporated ($1260.12) $23.50
CyclePath Corp. ($1958.03) $49.50
CyclePath Corp. ($1076.43) $1702.60
CyclePath Corp. ($75.04)
The Great Bike Shop ($138.98) $3269.70
The Great Bike Shop $5219.55
The Great Bike Shop $1538.20
Просмотр всех записей одной таблицы, затем всех записей другой таблицы
При выборе этого параметра для каждой записи таблицы Customer ищутся все соответствующие записи таблицы Credit (Table B), а затем все соответствующие записи таблицы Orders (Table C). Затем процесс повторяется для следующей записи таблицы Customer, пока не будут просмотрены все записи.
Таблица 1.6. Выбор значений при поочередном просмотре таблиц
Customer Table Customer Name Credit Table Amount Orders Table Order Amount
Cyclists Incorporated ($1088.56)
Cyclists Incorporated ($1260.12)
Cyclists Incorporated $1529.70
Cyclists Incorporated $23.50
CyclePath Corp. ($1958.03)
CyclePath Corp. ($1076.43)
CyclePath Corp. ($75.04)
CyclePath Corp. $49.50
CyclePath Corp. $1702.60
The Great Bike Shop ($138.98)
The Great Bike Shop $3269.70
The Great Bike Shop $5219.55
The Great Bike Shop $1538.20
ПРИМЕЧАНИЕ. Если необходимо, чтобы данные таблицы C (в примере это таблица Orders) появились в отчете раньше, чем данные таблицы B (Credit), следует изменить связи между таблицами таким образом, чтобы связь с таблицей C была установлена ранее, чем связь с таблицей B. Сделать это можно, используя Visual Linking Expert (Мастер визуальных связей). Чтобы изменить порядок связей, следует удалить уже существующие и задать новые в выбранном порядке.
Создание отчетов в Crystal Reports: учебный курс. / И. Кузнецов - СПб: Питер, 2002. - 544 с.
|