Сериализация XML в объект отчета

Обсуждение Stimulsoft Reports.Flex
vyatich
Сообщения: 38
Зарегистрирован: 18 май 2012, 09:55

Сериализация XML в объект отчета

Сообщение vyatich » 18 май 2012, 11:02

Здравствуйте.

В качестве источника данных я указываю XML, возможно ли как нибудь сериализовать эту XML в отчете в объект, например datatime. Или можно ли как нибудь из флеша посылать данные в отчет не в виде XML, а сразу в виде объекта?

Спасибо.
Аватара пользователя
Vladimir
Сообщения: 415
Зарегистрирован: 06 авг 2008, 05:48

Сериализация XML в объект отчета

Сообщение Vladimir » 21 май 2012, 06:47

Здравствуйте,

Да, это возможно. Вы можете воспользоваться указанными ниже способами:


Example 1:

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

var xml: XML =
<Demo>
   <Customers>
      <ID>1</ID>
      <CustomerName>John Smith</CustomerName>
   </Customers>
   <Customers>
      <ID>2</ID>
      <CustomerName>Antonio Moreno</CustomerName>
   </Customers>
   <Customers>
      <ID>3</ID>
      <CustomerName>Elizabeth Brown</CustomerName>
   </Customers>
</Demo>;

var report: StiReport = new StiReport();
report.regData("Demo", "Demo", data);
report.dictionary.synchronize();
report.design();

Example 2:

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

var table: DataTable = new DataTable("Customers");
var column: DataColumn = new DataColumn("CustomerName", StorageType.StringType);
table.columns.add(column);

table.addNewRow().setValue("CustomerName", "John Smith");
table.addNewRow().setValue("CustomerName", "Antonio Moreno");
table.addNewRow().setValue("CustomerName", "Elizabeth Brown");

var dataSet: DataSet = new DataSet("DataSetName");
dataSet.tables.add(table);

var report: StiReport = new StiReport();
report.regDataSet("DataSetName", "DataSetName", dataSet);
report.dictionary.synchronize();
report.design();

Example 3:

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

var dataSet: DataSet = new DataSet("Demo");
var table: DataTable = new DataTable("Employees");
dataSet.tables.add(table);

var column: DataColumn;
var row: DataRow;

column = new DataColumn("EmployeeID", StorageType.IntType);
table.columns.add(column);
column = new DataColumn("LastName", StorageType.StringType);
table.columns.add(column);
column = new DataColumn("FirstName", StorageType.StringType);
table.columns.add(column);
column = new DataColumn("BirthDate", StorageType.DateTimeType);
table.columns.add(column);
column = new DataColumn("DrivingLicense", StorageType.BooleanType);
table.columns.add(column);

row = table.addNewRow();
row.setValue("EmployeeID", 1);
row.setValue("LastName", "Fuller");
row.setValue("FirstName", "Andrew");
row.setValue("BirthDate", new StiDateTime(1972, 02, 18));  // Так же, метод может принимать на вход стандартный для Flex объект Date.
row.setValue("DrivingLicense", true);

row = table.addNewRow();
row.setValue("EmployeeID", 2);
row.setValue("LastName", "Buchanan");
row.setValue("FirstName", "Steven");
row.setValue("BirthDate", new StiDateTime(1965, 03, 03));
row.setValue("DrivingLicense", true);

row = table.addNewRow();
row.setValue("EmployeeID", 3);
row.setValue("LastName", "Peacock");
row.setValue("FirstName", "Margaret");
row.setValue("BirthDate", new StiDateTime(1974, 09, 12));
row.setValue("DrivingLicense", false);

var report: StiReport = new StiReport();
report.regDataSet("Demo", "Demo", dataSet);
report.dictionary.synchronize();
report.design();

Спасибо.
vyatich
Сообщения: 38
Зарегистрирован: 18 май 2012, 09:55

Сериализация XML в объект отчета

Сообщение vyatich » 21 май 2012, 10:19

Ага, спасибо, совет с DataSet подходит как нельзя лучше. Тогда вытекает следующий вопрос. Как правильно прогрмаммно организовать связи между таблицами в этом DataSet. Или можно ссылку на документацию вашего API(ее не смог найти в инете).
HighAley
Сообщения: 1958
Зарегистрирован: 08 июн 2011, 07:36

Сериализация XML в объект отчета

Сообщение HighAley » 22 май 2012, 09:23

Здравствуйте.

К сожалению, документации по API нет.

Вот полный код создания Data Source:

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

var ds1: StiDataSource = new StiDataTableSource("Database", "DataSource1", "DataSource1");
report.dictionary.dataSources.add(ds1);

var ds2: StiDataSource = new StiDataTableSource("Database", "DataSource2", "DataSource2");
report.dictionary.dataSources.add(ds2);

var col1: StiDataColumn = new StiDataColumn("ID", "ID", "ID");
ds1.columns.add(col1);

var col2: StiDataColumn = new StiDataColumn("ID", "ID", "ID");
ds2.columns.add(col2);

var columns1: StiDataColumnsCollection = new StiDataColumnsCollection();
columns1.add(ds1.columns.getByName("ID"));

var columns2: StiDataColumnsCollection = new StiDataColumnsCollection();
columns2.add(ds2.columns.getByName("ID"));

var rel: StiDataRelation = new StiDataRelation("Relation1", "Relation1", "Relation1", ds1, ds2, columns1, columns2);
report.dictionary.relations.add(rel);
Спасибо.
vyatich
Сообщения: 38
Зарегистрирован: 18 май 2012, 09:55

Сериализация XML в объект отчета

Сообщение vyatich » 23 май 2012, 06:48

Ну тогда еще пару вопросов для полного прояснения ситуации. Когда мы пишем в коде:

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

report.regDataSet("Demo", "Demo", dataSet);
то мы же как то должны в генераторе отчета указать, что мы ему будем посылать DataSet, причем имя этого соединения Demo. В генераторе отчета я нашел только соединение с XML данными(что самое близко мне подходит), как указать, что я буду посылать именно DataSet.

И еще, когда я у себя в приложении запускаю отчет, то мне вечно говорит, что Compiling Report или Loading Data. Как избавиться от этого? Вот код, который вызывает отчет:

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

        report = new StiReport();
	report.loadReportFromString(reportString);
	report.dictionary.dataSources.clear();
	report.dataStore.clear();
	report.dictionary.clear();
	report.dictionary.databases.clear();	
	report.regDataSet("Schema","Schema",XMLHead);
	report.dictionary.synchronize();
	report.render(true);
	report.show(viewerFx);
В самом отчете имя источника данных Schema, имя соединения такое же. Недостаток знаний и документации приходится компенсировать вопросами на форуме)
vyatich
Сообщения: 38
Зарегистрирован: 18 май 2012, 09:55

Сериализация XML в объект отчета

Сообщение vyatich » 23 май 2012, 07:06

Эта строчка в отчете присутствует, значит проблема не из за этого.

Вот ссылка на отчет: http://narod.ru/disk/50232156001.250b84 ... s.mrt.html
Аватара пользователя
Vladimir
Сообщения: 415
Зарегистрирован: 06 авг 2008, 05:48

Сериализация XML в объект отчета

Сообщение Vladimir » 24 май 2012, 09:50

Здравствуйте,

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

report.dictionary.dataSources.clear();
report.dictionary.clear();
report.dictionary.databases.clear();
Эти методы очищают структуру данных в шаблоне отчёта, сами данные в шаблоне отчёта не хранятся.

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

report.regDataSet("Schema","Schema",XMLHead);
Этот метод регистрирует данные в объекте отчёта.

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

report.dictionary.synchronize();
Этот метод полностью пересоздаёт структуру данных шаблона отчёта на основе зарегистрированных данных (могут быть нарушены связи таблиц).


Так как структура данных в отчёте у вас уже определена, то её нет необходимости очищать и пересоздавать заново, достаточно лишь убрать соединения с источником данных. Попробуйте следующий код:

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

report.dictionary.databases.clear();  // удаляем источники данных
report.regDataSet("Schema","Schema",XMLHead);  // регистрируем массив данных в объекте отчёта, структура таблиц должна повторять структуру словаря в шаблоне отчёта
report.render(true);  // рендерим отчёт
report.show(viewerFx);
Для очистки массива данных (если они были зарегистрированы ранее), нужно использовать следующий метод:

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

report.dataStore.clear();
Для того, что бы не отображать сообщения Compiling Report, используйте такой вызов метода:

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

report.render(false);
то мы же как то должны в генераторе отчета указать, что мы ему будем посылать DataSet, причем имя этого соединения Demo. В генераторе отчета я нашел только соединение с XML данными(что самое близко мне подходит), как указать, что я буду посылать именно DataSet.
При рендеринге отчёта данные переносятся в DataStore из указанного соединения (XML, SQL и др.), если соединения не заданы (или очищены при помощи метода report.dictionary.databases.clear(), то данные будут браться из DataStore по имени источника данных, которое определено в regData() методе.

Спасибо.
vyatich
Сообщения: 38
Зарегистрирован: 18 май 2012, 09:55

Сериализация XML в объект отчета

Сообщение vyatich » 28 май 2012, 09:24

Спасибо, с Compiling Report разобрался. Немного поразбирался и понял, почему данные XML, посылаемые мной в отчет воспринимались как строка.
С помощью этого выражения мы регистрируем наши данные

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

    report.regDataXML("Schema","Schema",XMLHead);
А можем ли мы еще программно указать XML схему тех данных, которые мы посылаем, как показано в примере выше.
Аватара пользователя
Vladimir
Сообщения: 415
Зарегистрирован: 06 авг 2008, 05:48

Сериализация XML в объект отчета

Сообщение Vladimir » 29 май 2012, 09:11

Здравствуйте,

К сожалению, нет, но есть обходные пути:

1. Формировать коллекцию DataSet, где указаны типы данных
2. Можно указывать тип данных прямо в XML:

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

var xml: XML =
<Demo>
   <Employees>
      <ID type="int">1</ID>
      <Name>John Smith</Name>
      <Discount type="float">0.05</Discount>
      <Birthday type="dateTime">1958-01-08</Birthday>
   </Employees>
   <Employees>
      <ID type="int">2</ID>
      <Name>Antonio Moreno</Name>
      <Discount type="float">0.15</Discount>
      <Birthday type="dateTime">1966-01-26</Birthday>
   </Employees>
</Demo>;
Спасибо.
vyatich
Сообщения: 38
Зарегистрирован: 18 май 2012, 09:55

Сериализация XML в объект отчета

Сообщение vyatich » 29 май 2012, 10:24

Спасибо за помощь, все работает как и должно работать! Только появилась одна загвоздка, связанная с форматированием даты. В самом отчете я указываю в каком формате ее выводить, и когда кидаю тестовую XML со схемой в дизайнер отчета, то все работает как надо, а когда пытаюсь послать в отчет XML из приложения то даты выводит в другом формате, который мне не приемлем(M/D/YYY K:N:SS A). С чем это может быть связано?
Ответить