Страница 1 из 1

Программное создание CrossTab

Добавлено: 15 фев 2013, 17:31
SergeyMironchuk
Здравствуйте!

Пытаюсь программным способом создать шаблон отчета с элементом CtossTab.
Не могли бы подсказать где найти побольше информации на эту тему? Мой код не работает.

Код: Выделить всё

            var report = new StiReport();

            // DataSet для отчета создается внешними средствами
            if (reportData.DataSet.Tables.Count==0) CreateDataSetSql(reportData.DataSet);

            report.RegData(reportData.DataSet);
            report.Dictionary.Synchronize();
            var page = report.Pages[0];

            var crossTab = new StiCrossTab
                {
                    DataSourceName = "ReportData",
                    Name = "CrossTabl1",
                    Page = page
                };

            var rowTotal1 = new StiCrossRowTotal { Name = "RowTotal1", Text = "Итого по отчету", Page = page, TextValue = "Итого по отчету" };
            crossTab.Components.Add(rowTotal1);

            var row1Title = new StiCrossTitle { Name = "Row1_Title", Text = "Товар", TextValue = "Товар", TypeOfComponent = "Row:Row1", Page = page };
            crossTab.Components.Add(row1Title);

            var colTotal1 = new StiCrossColumnTotal { Name = "ColTotal1", Text = "Итого по строке", TextValue = "Итого по строке", Page = page };
            crossTab.Components.Add(colTotal1);

            var leftTitle = new StiCrossTitle { Name = "LeftTitle", Text = "Заголовок отчета", TextValue = "Заголовок отчета", TypeOfComponent = "LeftTitle", Page = page };
            crossTab.Components.Add(leftTitle);

            var row1 = new StiCrossRow
                {
                    Alias = "Product_Name",
                    Name = "Row1",
                    DisplayValue = new StiDisplayCrossValueExpression("{ReportData." + Stimulsoft.Report.CodeDom.StiCodeDomSerializator.ReplaceSymbols("Product_Name") + "}"),
                    Value = new StiCrossValueExpression("{ReportData.Product_Name}"),
                    Total = new StiCrossRowTotal { Name = "RowTotal1" },
                    Page = page
                };
            crossTab.Components.Add(row1);

            var column1 = new StiCrossColumn
                {
                    Alias = "Price_Region_Name",
                    Name = "Column1",
                    DisplayValue = new StiDisplayCrossValueExpression("{ReportData." + Stimulsoft.Report.CodeDom.StiCodeDomSerializator.ReplaceSymbols("Price_Region_Name") + "}"),
                    Value = new StiCrossValueExpression("{ReportData.Price_Region_Name}"),
                    Page = page
                };
            crossTab.Components.Add(column1);

            var sum1 = new StiCrossSummary
                {
                    Alias = "Discount_Perc",
                    Value = new StiCrossValueExpression("{ReportData.Discount_Perc}"),
                    Name = "Sum1",
                    Page = page
                };
            crossTab.Components.Add(sum1);

            var rightTitle = new StiCrossTitle
                {
                    Name = "RightTitle",
                    Text = "Заголовок колонок",
                    TextValue = "Заголовок колонок",
                    TypeOfComponent = "RightTitle",
                    Page = page
                };
            crossTab.Components.Add(rightTitle);

            page.Components.Add(crossTab);
            report.Render(false);
Чего здесь не хватает?

Заранее благодарю за любые ответы.

Re: Программное создание CrossTab

Добавлено: 15 фев 2013, 17:47
HighAley
Здравствуйте.

Самый простой способ -- это создать отчёт, который вам необходим в дизайнере и посмотреть как он строиться во вкладке Код.

Спасибо.

Re: Программное создание CrossTab

Добавлено: 15 фев 2013, 17:57
SergeyMironchuk
Благодарю за подсказку.

Изучив код генерируемого класса отчета, примеры программной генерации отчетов в демонстрационном проекте, нашел работающее решение.
Привожу его код, может кому-то пригодится:

Код: Выделить всё

            var report = new StiReport();

            //Add data to datastore. Данные берутся из файла Demo.xml, входящего в состав поставки
            report.RegData(dataSet1);

            report.Dictionary.Synchronize();

            var page = report.Pages[0];

            var crossTab = new StiCrossTab
            {
                DataSourceName = "Order Details",
                Name = "CrossTabl2",
                Page = page,
                DisplayRectangle = new RectangleD(0,0,19,5)
            };

            var leftTitle = new StiCrossTitle
            {
                    Name = "LeftTitle", 
                    Text = "Кол-во продаж", 
                    TypeOfComponent = "LeftTitle", 
                    Page = page
             };

            var rightTitle = new StiCrossTitle
            {
                Name = "RightTitle",
                Text = "Страна",
                TypeOfComponent = "RightTitle",
                Page = page
            };

            var rowTotal1 = new StiCrossRowTotal
            {
                Name = "RowTotal1",
                Text = "Итого по отчету",
                Page = page
            };

            var columnTotal1 = new StiCrossColumnTotal { Name = "ColumnTotal1", Text = "Итого", Page = page };

            var row1Title = new StiCrossTitle { Name = "Row1_Title", Text = "Товар", TypeOfComponent = "Row:Row1", Page = page };

            var row1 = new StiCrossRow
            {
                Alias = "ProductName",
                Name = "Row1",
                DisplayValue = new StiDisplayCrossValueExpression("{Order_Details.Products.ProductName}"),
                Value = new StiCrossValueExpression("{Order_Details.Products.ProductName}"),
                TotalGuid = rowTotal1.Guid,
                Page = page
            };

            var column1 = new StiCrossColumn
            {
                Alias = "Country",
                Name = "Column1",
                DisplayValue = new StiDisplayCrossValueExpression("{Order_Details.Orders.Customers.Country}"),
                Value = new StiCrossValueExpression("{Order_Details.Orders.Customers.Country}"),
                TotalGuid = columnTotal1.Guid,
                Page = page
            };

            var sum1 = new StiCrossSummary
            {
                Alias = "Quantity",
                Value = new StiCrossValueExpression("{Order_Details.Quantity}"),
                Name = "Sum1",
                Page = page
            };

            crossTab.Components.Add(leftTitle);
            crossTab.Components.Add(rightTitle);
            crossTab.Components.Add(rowTotal1);
            crossTab.Components.Add(columnTotal1);
            crossTab.Components.Add(row1);
            crossTab.Components.Add(row1Title);
            crossTab.Components.Add(column1);
            crossTab.Components.Add(sum1);

            page.Components.Add(crossTab);

            report.Show();


Re: Программное создание CrossTab

Добавлено: 18 фев 2013, 10:07
HighAley
Здравствуйте.

Спасибо за решение проблемы.
Обращайтесь, если возникнут ещё вопросы.

Спасибо.