Отчет 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 2

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