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

Ради простоты при подготовке образца отчета была просто выбрана таблица SaleOrderHeader из базы данных AdventureWorksLT. Выбор целой таблицы -- удобный способ начать работу. Однако в ней содержится гораздо больше данных, чем нужно; это противоречит основному принципу проектирования баз данных: всегда извлекать лишь нужные данные. Чтобы сократить данные в отчете, следует запустить BIDS из меню Start, All Programs, Microsoft SQL Server 2005, SQL Server Business Intelligence Development Studio. Откройте сохраненный проект отчета с выбранным по умолчанию именем Report Project1.

В открытом проекте отчета щелкните на вкладке Data. В панели таблиц установите флажки для столбцов SalesOrderID, OrderDate, DueDate, Status, CustomerID и TotalDue. Читать отчет с сокращенным до шести числом столбцов будет гораздо проще.

Значение идентификатора потребителя непонятно большинству пользователей, поэтому присоединим таблицу Customer и введем имя потребителя. Щелкните правой кнопкой мыши в панели таблиц и выберите пункт Add Table из контекстного меню. В диалоговом окне Add Table выберите Customer и щелкните на кнопке Add; конструктор отчетов автоматически соединит таблицы по столбцу CustomerID. Установите флажок CompanyName в окне таблицы Customer, чтобы конструктор отчетов автоматически перестроил нужную инструкцию SQL в панели SQL. Затем, чтобы сортировать отчет по потребителям, прокрутите панель Columns до CustomerID, как показано на рисунке.

Выберите значение 1 из раскрывающегося списка поля Sort Order, чтобы конструктор отчетов выполнил сортировку по возрастанию по Customer. Затем сохраните проект, щелкнув на значке Save.

В следующей статье будет показано, как обновить структуру отчета, чтобы использовать новое выделение данных.

Учимся работать с транзакциями

Транзакции -- мощный инструмент обеспечения целостности данных, недостаточно используемый многими начинающими разработчиками баз данных. В сущности, транзакции представляют собой механизм группирования одного или нескольких обновлений базы данных, чтобы SQL Server Express мог обработать их как одну сущность. Когда транзакция завершается, все операции обновления в транзакции записываются в базу данных. Если транзакция отменяется до того, как она была завершена, все операции обновления отменяются, и база данных остается прежней.

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

Транзакция начинается с инструкции BEGIN TRANSACTION. Для сохранения данных используется инструкция COMMIT TRANSACTION, а для отмены транзакции -- инструкция ROLLBACK TRANSACTION. В приведенном образце исходного текста создается временная таблица с именем #MyTempTable, затем запускается транзакция для вставки строки в #MyTempTable (транзакции дано имя InsertData, но делать это не обязательно). Затем транзакция завершается и начинается другая транзакция (названная DeleteData), которая удаляет строку. Затем вторая транзакция отменяется, и таблица остается без изменений.

CREATE TABLE #MyTempTable
(
Column1 INT,
Column2 VARCHAR(20)
)

BEGIN TRANSACTION InsertData;
INSERT INTO #MyTempTable (Column1, Column2)
VALUES (1, 'Test Data');
COMMIT TRANSACTION InsertData;
GO
-- Добавление новой строки

SELECT * FROM #MyTempTable

BEGIN TRANSACTION DeleteData;
DELETE FROM #MyTempTable WHERE Column1 = 1
ROLLBACK TRANSACTION DeleteData;
GO

-- Таблица остается без изменений
SELECT * FROM #MyTempTable

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