Отчет Crystal - вложенные в главный отчет с использованием результатов
Я использую JAVA Crystal Report SDK для создания отчетов с использованием хранимых процедур или наборов результатов.
Вот сообщение, которое я сделал несколько месяцев назад, пытаясь выполнить хранимую процедуру моего вложенного отчета в отчете с помощью набора результатов : Java Crystal Report SDK - Report & SubReport. В этом случае я знал параметры, которые нужно установить для выполнения моей хранимой процедуры, поэтому это было "легко".Теперь я пытаюсь сделать то же самое (т. е. выполнить хранимую процедуру для заполнение моего вложенного отчета в основном отчете с использованием результирующего набора), но в общем виде: я не знаю заранее параметры, поэтому я должен установить каждый из них с помощью ParameterFieldController
, но некоторые из них исходят из основного результирующего набора, другие из статических переменных в основном отчете и т. д.
Итак, есть ли "легкий" способ смешивания набора результатов и хранимых процедур в отчете и вложенных отчетах ?
Или есть способ обойти Метод useDatasource()
? это, безусловно, решает использовать основной результирующий набор для каждого вложенного отчета вместо данной хранимой процедуры.
(я должен сохранить результирующий набор для основного отчета и не выполнять его хранимую процедуру по причинам производительности).
После долгих попыток я снова здесь. К сожалению, я все еще задаюсь вопросом, как просто передать мои параметры в вложенные отчеты основного отчета с использованием набора результатов...Вот что я использую для извлечения связей между основным отчетом и вложенными отчетами и параметрами вложенных отчетов:
IStrings subreports = clientDoc.getSubreportController().getSubreportNames();
for (int i = 0; i < subreports.size(); i++) {
// Get subreport
String subreportName = subreports.getString(i);
ISubreportClientDocument subreport = clientDoc.getSubreportController().getSubreport(subreportName);
// Get datasource tables
databaseController = subreport.getDatabaseController();
tables = databaseController.getDatabase().getTables();
// Get links between subreport and main report
SubreportController subreportController = clientDoc.getSubreportController();
SubreportLinks links = subreportController.getSubreportLinks(subreportName);
Fields params = subreport.getDataDefController().getDataDefinition().getParameterFields();
// Set datasource
setTablesLocation(tables, databaseController, args);
}
Дело в том, что каждый SubreportLink
из links
наполовину заполнен или пуст.
- если параметр вложенного отчета связан с полем основной хранимой процедуры отчета или полем формулы, то у меня есть имя этого параметра в
SubreportLink
(используяgetMainReportFieldName()
), но не имя связанного параметра из вложенного отчета (используяgetSubreportFieldName()
), а не значение ссылки. - если параметр вложенного отчета связан с полем параметров основного отчета, то объекты
SubreportLink
пусты.
Таким образом, очень сложно установить параметры вложенных отчетов в этом условии, даже используя половинную часть каждого Subreportlink
+ ParameterField
и т. д.
Что я делаю не так ? Могу ли я получить всю необходимую информацию в моем случае ?
Или, есть ли способ автоматически установить мой параметр вложенных отчетов, как это делается, когда я использовать метод setTablesLocation()
в моем основном отчете (вместо установки источника данных с помощью ResultSet
)?
1 ответ:
Итак, после множества бесплодных попыток я нашел способ генерировать отчет, содержащий вложенные отчеты, только если основная хранимая процедура возвращает данные. Я использую
RowsetCursor
.Вот мой код:
// Here I create a metadata using ONLY the database fields IRowsetMetaData metadata = new RowsetMetaData(); Fields fields = clientDoc.getDataDefController().getDataDefinition().getResultFields(); Fields dbFields = new Fields(); for (int i = 0; i < fields.size(); i++) { IField field = fields.getField(i); if (field instanceof DBField) { dbFields.add(field); } } metadata.setDataFields(dbFields); // Create the rowset cursor with metadata RowsetCursor cursor = clientDoc.getRowsetController().createCursor(null, metadata); FetchedRecordCountInfo countInfo = new FetchedRecordCountInfo(); countInfo.setIsTotalRecordsKnown(false); // Here, if I don't have any record from my stored procedure, I don't execute the report process int nbRecords = cursor.getRecordCount(countInfo); if (nbRecords <= 0) { throw new ReportingException("UnmanagedJob - Report generation : No data, generation aborted."); }
Я надеюсь, что это поможет другому "потерянному пользователю" Crystal Report java SDK:)