Crystal Report - вложенные отчеты в основном отчете с использованием ResultSet

Я использую Java Crystal Report SDK для создания отчетов с использованием хранимых процедур или ResultSets.

Вот сообщение, которое я сделал несколько месяцев назад, пытаясь выполнить хранимую процедуру моего подотчета в отчете с помощью ResultSet: Java Crystal Report SDK - Отчет и подотчет. В этом случае я знал параметры, которые нужно установить для выполнения моей хранимой процедуры, так что это было «легко».

Теперь я пытаюсь сделать то же самое (т.е. выполнить хранимую процедуру для заполнения моего подотчета в основном отчете с помощью ResultSet), но в общем виде: я не знаю заранее параметры, поэтому я должен установить каждый использует ParameterFieldController, но некоторые исходят из основного ResultSet, другие - из статических переменных в основном отчете и т. д.

Я понимаю, что предстоит еще многое сделать и рассмотреть множество случаев, чтобы быть как можно более общим. Хотя, когда я не устанавливаю источник данных для своего основного отчета, все это делается автоматически.

Итак, существует ли «простой» способ смешать ResultSet и хранимые процедуры в отчете и подотчетах?

Или есть способ обойти метод useDatasource()? который определенно решает использовать основной ResultSet для каждого подотчета вместо данной хранимой процедуры.

(Мне нужно сохранить ResultSet для основного отчета и не выполнять повторно его хранимую процедуру по соображениям производительности).

После множества попыток я вернулся сюда. К сожалению, мне все еще интересно, как просто передать мои параметры во вложенные отчеты основного отчета с помощью ResultSet ...

Вот что я использую для получения связей между основным отчетом и параметрами вложенных отчетов и вложенных отчетов:

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)?


person Mikolaj    schedule 19.08.2013    source источник


Ответы (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.");
}

Надеюсь, это поможет другому "потерявшемуся пользователю" Java SDK Crystal Report :)

person Mikolaj    schedule 12.09.2013