2013-08-19 2 views
2

Java Crystal Report SDK를 사용하여 저장 프로 시저 또는 ResultSets를 사용하여 보고서를 생성하고 있습니다.Crystal Report - ResultSet을 사용하여 주 보고서 내의 하위 보고서

몇 달 전, ResultSet을 사용하여 보고서 내 하위 보고서의 저장 프로 시저를 실행하려고 한 게시물이 있습니다 : Java Crystal Report SDK - Report & SubReport. 이 경우 저장 프로 시저를 실행하기 위해 설정할 매개 변수를 알고 있으므로 "쉽다".

이제 동일한 작업을 수행하려고합니다. 즉, ResultSet을 사용하여 주 보고서 내 하위 보고서를 채우는 저장 프로 시저를 실행하는 것입니다. 그러나 일반적인 방법으로 : 나는 매개 변수를 미리 알지 못합니다. ParameterFieldController을 사용하여 각각 하나를 설정해야하지만 일부는 주 결과 보고서의 정적 변수, 다른 변수는 주 보고서의 정적 변수 등에서 가져와야합니다.

내가해야 할 일이 많고 가능한 일반. 내 메인 보고서의 데이터 소스를 설정하지 않으면 모든 내용이 자동으로 잘 수행됩니다.

그래서 보고서 및 포함 된 보고서에 ResultSet 및 저장 프로 시저를 혼합하는 "쉬운"방법이 있습니까?

useDatasource() 방법을 우회하는 방법이 있습니까? 이는 확실히 주어진 저장 프로 시저 대신 각 하위 보고서에 대한 주 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); 
} 

SubreportLinklinks에서 절반이 채워지거나 비어 있습니다. 하위 보고서 매개 변수가 주 보고서 저장 프로 시저 또는 수식 필드의 필드에 연결되어있는 경우

  • , 나는이 매개 변수의 이름을 가지고있는 SubreportLink 아니라 하위 보고서에서 연결 매개 변수의 이름 (getMainReportFieldName() 사용) (getSubreportFieldName() 사용) 및 링크 값이 아닙니다.
  • 하위 보고서 매개 변수가 주 보고서의 매개 변수 필드에 연결된 경우 SubreportLink 개체가 비어 있습니다.

그래서, 심지어의 절반 부분을 사용하여,이 상태에서 하위 보고서 매개 변수를 설정하는 것은 매우 까다로운 각 Subreportlink +를 ParameterField 등 내가 잘못 무엇

? 제 경우에 필요한 모든 정보를 얻을 수 있습니까?

ResultSet으로 데이터 소스를 설정하는 대신 내 보고서에서 setTablesLocation() 메서드를 사용할 때 자동으로 내 하위 보고서 매개 변수를 설정하는 방법이 있습니까?

답변

1

오케이 ok 그렇기 때문에 많은 도움이되지 않은 시도 후에 주요 저장 프로 시저가 데이터를 반환 한 경우에만 하위 보고서가 포함 된 보고서를 생성 할 수있는 항목을 발견했습니다. 나는 RowsetCursor을 사용합니다. 나는이 크리스탈 보고서 자바 SDK의 다른 "손실 사용자":

을 도움이되기를 바랍니다

// 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."); 
} 

: 여기

내 코드입니다