Задумывались ли вы каким образом образом работает генератор отчётов, что представляет из себя шаблон отчёта и из чего состоит подготовленный отчёт? Если вы не получили ответ, то давайте вместе попробуем найти ответы на эти вопросы.
С помощью File->New создаём новый отчёт. Превращаем его в минимальный отчёт, удаляя все бэнды кроме заголовка. Помещаем простое текстовое поле на бэнд заголовка, как показано на следующем рисунке:
Одна страница. Один бэнд не странице. Одно текстовое поле на бэнде. При сохранении этого отчёта получаем следущий файл, содержащий шаблон отчёта (файл с расширением FRX).
<?xml version="1.0" encoding="utf-8"?> <Report ScriptLanguage="CSharp" ReportInfo.Created="05/19/2015 19:07:39" ReportInfo.Modified="05/19/2015 19:21:46" ReportInfo.CreatorVersion="1.0.0.0"> <Dictionary/> <ReportPage Name="Page1"> <ReportTitleBand Name="ReportTitle1" Width="718.2" Height="37.8"> <TextObject Name="Text1" Width="689.85" Height="28.35" Fill.Color="Silver" Text="This is a sample of text string." HorzAlign="Center" VertAlign="Center" Font="Arial, 14pt"/> </ReportTitleBand> </ReportPage> </Report>
Это исходный код отчёта, на основе которого строится отчёт. В этом примере отсутствуют позиции элементов, а значит левый верхний угол объекта совпадает с левым верхним углом "родительского" объекта . Подготовленный отчёт будет выглядеть следующим образом:
Подготовленный отчёт сохраняется в файл с расширением FPX. Подготовленный отчёт это сжатый алгоритмом gzip файл в формате XML. Ниже показано распакованное содержимое подготовленного отчёта:
<?xml version="1.0" encoding="utf-8"?> <preparedreport> <pages> <page1> <b1> <t1/> </b1> </page1> </pages> <sourcepages> <ReportPage Name="Page1"> <ReportTitleBand Name="ReportTitle1" Width="718.2" Height="37.8"> <TextObject Name="Text1" Width="689.85" Height="28.35" Fill.Color="Silver" Text="This is a sample of text string." HorzAlign="Center" VertAlign="Center" Font="Arial, 14pt"/> </ReportTitleBand> </ReportPage> </sourcepages> <dictionary> <b1 name="Page0.ReportTitle1"/> <page1 name="Page0"/> <t1 name="Page0.Text1"/> </dictionary> <bookmarks/> <outline/> <blobstore/> </preparedreport>
Как видно из примера, элементы отчёта "мигрировали" в секцию <sourcepages>. Само тело отчёта, содержащее непосредствено данные, содержатся в секции <pages>. В виду того, что мы использовали нетипично простой отчёт, его тело выродилось в набор ссылок на элементы отчёта. В нашем случае тело отчёта выродилось до следующих ссылок на элементы отчёта:
1 2 3 4 5 6 |
<page1> <b1> <t1/> </b1> </page1> |
В данном случае <page1> ссылается на описание страницы из шаблона отчёта, на странице расположен бэнд <b1>, который ссылается на <ReportTitleBand>, который содержит элемент <t1/>, который ссылается на текстовое поле <TextObject>.
Чтобы понять простые идеи, заложенные в формат FPX, слегка модифицируем подготовленный отчёт в тестовом редакторе, добавив данных в тело отчёта.
<page1> <b1> <t1/> </b1> <b1 Top="38.0"> <t1 x="Manually inserted line in text editor"/> </b1> </page1>
И откроем полученный отчёт в режиме предварительного просмотра.
С помощью простой операции в подготовленный отчёт были добавлены новые данные. При этом использовалось простое правило - каждый элемент отчёта несёт минимум необходимой информации, необходимой для корректного отображения. Информация, которая не меняется в процессе построения отчёта, берётся из шаблона (секция <sourcepages>).
Теперь вы можете добавить новые данные на страницу отчёта используя простой текстовый редактор. Что делать, если данные не поместились на одну страницу? Для ответа на этот вопрос ещё раз модифицируем подготовленный отчёт, добавив новую страницу и новые даенные:
<page1> <b1> <t1/> </b1> <b1 Top="38.0"> <t1 x="Manually inserted line in text editor"/> </b1> </page1> <page1> <b1> <t1 x="This memo on second page"/> </b1> </page1>
В результате мы получили отчёт из двух страниц, как показано на следующем рисунке:
В этом посте нет ни слова о методах внедрения картинок в подготовленный отчёт. Оставайтесь с нами и вы узнаете как в отчётах хранятся картинки и много другой полезной информации.