Jasper reports 在主报表中显示子报表的页码范围

Jasper reports 在主报表中显示子报表的页码范围,jasper-reports,subreport,Jasper Reports,Subreport,我有一份主报告,在详细信息部分有4个子报告。我想在主报告标题部分显示所有子报告的页码范围(例如1-2)。我尝试使用子报表返回值,但它仅在有1个子报表时有效,如果有多个子报表则无效 以下是解决方案 Step1:在每个子报表中创建任意类型的变量,并将计算、增量类型和重置类型设置为无。不需要指定表达式以及初始值表达式 步骤2:在主报告中创建字符串类型的变量,以保存页码(如1-2)的值,并将计算设置为系统。 步骤3:在主报告标题部分添加步骤2中创建的变量,并将评估时间设置为报告。 步骤4:创建scrip

我有一份主报告,在详细信息部分有4个子报告。我想在主报告标题部分显示所有子报告的页码范围(例如1-2)。我尝试使用子报表返回值,但它仅在有1个子报表时有效,如果有多个子报表则无效

以下是解决方案
Step1:在每个子报表中创建任意类型的变量,并将计算、增量类型和重置类型设置为无。不需要指定表达式以及初始值表达式
步骤2:在主报告中创建字符串类型的变量,以保存页码(如1-2)的值,并将计算设置为系统。
步骤3:在主报告标题部分添加步骤2中创建的变量,并将评估时间设置为报告。
步骤4:创建scriptlet并在其中设置页码
公共类PageScriptlet扩展了JRDaultScriptlet{
私有静态int-mgmtReportPages;
专用静态国际收支平衡表报表页;
私有静态int incomeStmtReportPages;
私有静态int addinfo报告页面;
私有静态最终字符串MGMT_REPORT_PAGENUM=“mgmtReportPageNum”;
私有静态最终字符串收入\u STMT\u PAGENUM=“incomestmtpgeneum”;
私有静态最终字符串余额\u表\u PAGENUM=“balanceSheetPageNum”;
私有静态最终字符串ADDINFO_PAGENUM=“ADDINFO PAGENUM”;
私有静态最终字符串MGMT\u REPORT\u INDEX=“mgmtReportIndex”;
私有静态最终字符串INCOMESTMT_INDEX=“incomeStmtIndex”;
专用静态最终字符串余额表\u INDEX=“余额表索引”;
私有静态最终字符串注释\u INDEX=“notesIndex”;
私有静态最终字符串签名\u INDEX=“signatureIndex”;
私有静态整数firstPage=2;
公共PageScriptlet(){
超级();
}
@凌驾
public void afterPageInit()引发JRScriptleException{
Map variablesMap=this.variablesMap;
if(可变映射容器(管理报告索引)){
整数lastPage=mgmtReportPages+1;
字符串索引=null;
如果(第一页==最后一页){
index=String.valueOf(第一页);
}否则{
索引=String.valueOf(第一页)+“-”+String.valueOf(最后一页);
}
此.setVariableValue(管理报告索引,索引);
}
if(可变映射容器(INCOMESTMT_索引)){
整数firstPage=mgmtReportPages+2;
整数lastPage=incomeStmtReportPages;
字符串索引=null;
如果(第一页==最后一页){
index=String.valueOf(第一页);
}否则{
索引=String.valueOf(第一页)+“-”+String.valueOf(最后一页);
}
此.setVariableValue(IncomestMu索引,索引);
}
if(可变资产负债表容器(资产负债表索引)){
整数firstPage=incomeStmtReportPages+1;
整数lastPage=余额SheetReportPages;
字符串索引=null;
如果(第一页==最后一页){
index=String.valueOf(第一页);
}否则{
索引=String.valueOf(第一页)+“-”+String.valueOf(最后一页);
}
此.setVariableValue(平衡表索引,索引);
}
if(变量映射容器(注释索引)){
整数firstPage=balanceSheetReportPages+1;
整数lastPage=AddInfo报告页;
字符串索引=null;
如果(第一页==最后一页){
index=String.valueOf(第一页);
}否则{
索引=String.valueOf(第一页)+“-”+String.valueOf(最后一页);
}
此.setVariableValue(注释索引,索引);
}
if(变量映射容器(签名索引)){
整数lastPage=AddInfo报告页;
字符串索引=String.valueOf(最后一页);
此.setVariableValue(签名索引,索引);
}
}
@凌驾
public void beforePageInit()引发JRScriptleException{
Map variablesMap=this.variablesMap;
整数页码=(整数)this.getVariableValue(“页码”);
if(变量映射容器(管理报告页数)){
mgmtReportPages=pageNumber==null?1:pageNumber+1;
}
if(变量映射包含Y(收入项目页数)){
IncomestMTTreportPages=pageNumber==null?mgmtReportPages+2:IncomestMTTreportPages+1;
}
if(可变映射容器(资产负债表页数)){
balanceSheetReportPages=pageNumber==null?IncomestTreportPages+1:balanceSheetReportPages+1;
}
if(变量映射containsKey(ADDINFO_PAGENUM)){
AddInfo ReportPages=pageNumber==null?balanceSheetReportPages+1:AddInfo ReportPages+1;
}
}
}

您应该发布小样本(主报告和子报告的jrxml)来重现问题和屏幕截图。它应该是这样的,因为这里是虚拟jrxml文件的链接,我正试图实现这一点。任何帮助都是值得的。我不要目录。我只想要子报表的页码。这个链接我已经通过了。
    Step1 :  Create variables of any type inside each of the SubReport and the set the calculation, Increment Type and Reset Type to None. No need to specify the Expression as well Initial Value Expression

Step 2 :  Create variables of String type inside the Master Report to hold the value of page number (eg. 1-2)  and set the Calculation as System. 

Step 3 : Add the variables created in Step2 on the Master Report Title section and set the evaluation time as Report.
Step 4 : Create scriptlet and set the page number in that
public class PageScriptlet extends JRDefaultScriptlet {

 private static int mgmtReportPages;
 private static int balanceSheetReportPages;
 private static int incomeStmtReportPages;
 private static int addInfoReportPages;
 private static final String MGMT_REPORT_PAGENUM = "mgmtReportPageNum";
 private static final String INCOME_STMT_PAGENUM = "incomeStmtPageNum";
 private static final String BALANCE_SHEET_PAGENUM = "balanceSheetPageNum";
 private static final String ADDINFO_PAGENUM = "addInfoPageNum";
 private static final String MGMT_REPORT_INDEX = "mgmtReportIndex";
 private static final String INCOMESTMT_INDEX = "incomeStmtIndex";
 private static final String BALANCESHEET_INDEX = "balanceSheetIndex";
 private static final String NOTES_INDEX = "notesIndex";
 private static final String SIGNATURE_INDEX = "signatureIndex";
 private static Integer firstPage = 2;

 public PageScriptlet() {
  super ();
 }

 @Override 
 public void afterPageInit() throws JRScriptletException{
  Map<String, JRFillVariable> variablesMap = this.variablesMap;
  if(variablesMap.containsKey(MGMT_REPORT_INDEX)){
   Integer lastPage = mgmtReportPages+1;
   String index = null;
   if(firstPage == lastPage){
    index = String.valueOf(firstPage);
   }else{
    index = String.valueOf(firstPage)+"-"+String.valueOf(lastPage);
   }
   this.setVariableValue(MGMT_REPORT_INDEX, index);
  }

  if(variablesMap.containsKey(INCOMESTMT_INDEX)){
   Integer firstPage = mgmtReportPages + 2;
   Integer lastPage = incomeStmtReportPages;
   String index = null;
   if(firstPage == lastPage){
    index = String.valueOf(firstPage);
   }else{
    index = String.valueOf(firstPage)+"-"+String.valueOf(lastPage);
   }
   this.setVariableValue(INCOMESTMT_INDEX, index);
  }

  if(variablesMap.containsKey(BALANCESHEET_INDEX)){
   Integer firstPage = incomeStmtReportPages+1;
   Integer lastPage = balanceSheetReportPages;
   String index = null;
   if(firstPage == lastPage){
    index = String.valueOf(firstPage);
   }else{
    index = String.valueOf(firstPage)+"-"+String.valueOf(lastPage);
   }
   this.setVariableValue(BALANCESHEET_INDEX, index);
  }

  if(variablesMap.containsKey(NOTES_INDEX)){
   Integer firstPage = balanceSheetReportPages + 1;
   Integer lastPage = addInfoReportPages;
   String index = null;
   if(firstPage == lastPage){
    index = String.valueOf(firstPage);
   }else{
    index = String.valueOf(firstPage)+"-"+String.valueOf(lastPage);
   }
   this.setVariableValue(NOTES_INDEX, index);
  }

  if(variablesMap.containsKey(SIGNATURE_INDEX)){
   Integer lastPage = addInfoReportPages;
   String index = String.valueOf(lastPage);
   this.setVariableValue(SIGNATURE_INDEX, index);
  }
 }

 @Override 
 public void beforePageInit() throws JRScriptletException{
  Map<String, JRFillVariable> variablesMap = this.variablesMap;
  Integer pageNumber = (Integer)this.getVariableValue("PAGE_NUMBER");
  if(variablesMap.containsKey(MGMT_REPORT_PAGENUM)){
   mgmtReportPages = pageNumber == null ? 1 : pageNumber + 1;
  }
  if(variablesMap.containsKey(INCOME_STMT_PAGENUM)){
   incomeStmtReportPages = pageNumber == null ? mgmtReportPages + 2 : incomeStmtReportPages + 1;
  }

  if(variablesMap.containsKey(BALANCE_SHEET_PAGENUM)){
   balanceSheetReportPages = pageNumber == null ? incomeStmtReportPages + 1 : balanceSheetReportPages + 1;
  }

  if(variablesMap.containsKey(ADDINFO_PAGENUM)){
   addInfoReportPages = pageNumber == null ? balanceSheetReportPages+1 : addInfoReportPages + 1;
  }
 }

}