平煤报表开发过程.docx
《平煤报表开发过程.docx》由会员分享,可在线阅读,更多相关《平煤报表开发过程.docx(43页珍藏版)》请在冰豆网上搜索。
平煤报表开发过程
平煤报表开发文档
1单层表头固定列模板开发
1.1报表模板
客户化\二次开发工具\模板管理\报表模板初始化
节点编码和功能注册节点编码一致最好
输入节点编码,如果是数据库里不存在此节点编码则新建立了模板,
字段名称来自于表样给的名称;字段代码自己编;如果某一列需要合计等计算,数据类型需要选择整数或小数;如果字段只是程序中使用并不需要显示比如主建,设置位置位于报表头还是报表体;选择类型需要选择“终身隐藏”;如果字段显示时候需要经过公式处理,则选择原始公式列并写上公式,如公式unitcode->getColValue(bd_corp,unitcode,pk_corp,pk_corp)等价于selectunitcodefrombd_corpwherepk_corp=?
?
传入的是字段代码pk_corp的值,并附值给字段代码unitcode列。
报表模板配置如下图一:
图一
显示效果如下图二:
图二
1.2查询模板
客户化\二次开发工具\模板管理\查询模板初始化
查询模板编码和报表模板编码要一致。
点“增加”按钮,在弹出的界面点击取消按钮,出现下图的界面,然后输入模板编码,模板名称,所属节点编码等。
点“保存”按钮,将查询报表先保存下来,然后点修改按钮,点击增行,输入查询条件项。
字段名称来自于表样给定的名称,字段编码自己编,数据类型如果是选择参照,参照名称按<参照类>格式编写,如果是下拉,参照名称按IX,value1=key1,value2=key2格式编写(可能还有其他格式,尚没搞清楚)。
查询模板配置如下图三:
图三
显示效果如下图四:
2功能注册
2.1添加功能注册
用集团用户进入系统,客户化\二次开发工具\系统管理工具\功能注册。
“对应文件名或控制名”的类名是点击功能节点之后进入到报表的入口类(项目中已经改名为nc.ui.pmrt.rpt.base.PmrtUIManager,不是截图中的类)。
这个类见附录。
增加“可执行功能节点”之后,再增加“参数”。
选中刚刚增加的可执行功能节点之后(比如示例中的本单位预算执行情况),然后点击“增加”按钮,出现下图画面,功能性质下拉框选中“参数”,参数编码输入“classname”,参数值输入报表的UI类,这个类随后附上。
点击保存按钮,功能注册完毕。
也可以继续点击“增加”,继续增加报表中需要的按钮,用于按钮权限控制,不详述。
2.2权限分配
客户化\权限管理\权限分配
功能注册之后,需要分配权限才能看到新注册的功能。
集团用户进入,点击分配,然后勾选。
2.3关联功能节点和模板
客户化\二次开发工具\系统管理工具\功能节点默认模板设置
给新增加的功能节点分配查询模板和报表模板。
3程序开发
1
2
3.1报表基类
类名
功能描述
client基类
nc.ui.pmrt.rpt.base.PmrtUIManager
报表入口类,所有报表都通过这个入口,通过配置不同参数对应不同报表UI类
nc.ui.pmrt.rpt.base.ReportUI
报表UI继承的基类
nc.ui.pmrt.rpt.base.PanelModel
报表Model控制类基类
nc.ui.pmrt.rpt.base.IDialog
报表查询对话框接口
nc.ui.pmrt.rpt.base.QueryDialog
报表查询对话框基类
nc.ui.pmrt.rpt.base.QueryDialogPlus
报表查询对话框工具类
Public基类
nc.vo.pmrt.rpt.base.BaseVO
报表VO基类,实现了CircularlyAccessibleValueObject
nc.itf.pmrt.rpt.base.IPanelModel.IPanelModel
报表Model控制类基类接口
3.2报表自定义类
自定义报表类目录命名规则:
pm+模板编码。
如pm36187001。
1.FpClientUI.java
UI界面类,下列需要自己修改的方法:
nodeCode//变量,报表模板编码
nodeName//变量,联查下一个报表的UI类
getBtnAry()//返回报表对应的按钮数组
getQueryVO()//返回自定义的报表查询VO
getPanelModel()//返回报表控制类
需要实现的按钮响应方法
2.FpPanelModel.java
控制类,excQuery()//查询对话框执行的查询动作
3.nc.ui.pmrt.rpt.base.CenterQueryDialog
报表查询对话框类
修改方法getQueryDlg()
4.ReportQueryVO.java
自己的查询VO类,继承循环VO
5.FpPlanVO.java
自己写的报表体显示记录VO,继承循环VO,注意VO字段必须和报表模板字段代码名称一致。
6.IPMRTPlan.java
查询报表记录的类的接口
7.PMRTPlanImpl.java
查询报表记录的类,调用PlanDMO。
8.PlanDMO.java
查询记录的DAO类
9.FpDetailClientUI.java
联查明细界面的UI类
10.FpDetailPanelModel.java
联查明细界面的控制类
3.3配置文件
增加了配置文件Pmrt.upm,在这个配置文件增加PMRTPlanImpl的接口。
4多层表头固定列报表模板开发
4.1模板建立
客户化\模板管理\模板设置\帐表模板设置
先按单层表头模板开发,开发完然后进入到客户化\模板管理\模板设置\帐表模板设置路径下,选中增加的单层表头的模板,如下图,然后点击增加模板按钮,“表体结构”按钮变成可用的了,点击“表体结构”按钮,出现设置表体结构窗口,进行列表头的合并。
然后保存,新增加了一个报表模板编码,编码不能和原默认模板编码一样。
4.2模板分配
客户化\模板管理\模板分配
新建多层表头之后,必须进行模板分配,否则看到的仍然是默认报表模板(单层表头的那个模板),选择报表,选择用户,点击分配按钮,选择要分配的模板,保存。
最后效果如下图:
4.3多层表头固定列报表程序开发
和单层列表头程序开发一样,没有特别的。
5多层表头动态列表头报表开发(交叉报表)
5.1模板建立
多层动态列表头报表模板和普通报表模板有所不同。
如下图的表样,在画模板时公司列也单独作为报表模板的一列(合计被当作公司了)。
报表模板配置。
5.2交叉报表程序
单层固定列表头报表DMO类的开发,界面上需要显示哪些字段,在DMO的SQL就select出哪些字段即可。
而交叉报表的SQL写法有很大不同。
如上图具体SQL是这样的。
Select计划项目,全年累计,公司,当日执行数,本月执行数
fromtable
where1=1
结果如下
计划项目,全年累计,公司,当日执行数,本月执行数
各单位款项231.11合计11.1122.33
转帐收入544.44合计6443.334443.33
各单位款项111.11100151.1132.33
转帐收入222.4410013323.33332.33
转帐收入252.441002523.33537.33
在程序进行交叉之后,就转为:
|合计|1001|1002|
计划项目|全年累计|当日|本月|当日|本月|当日|本月|
各单位款项|231.11|11.11|22.33|51.11|32.33|||
转帐收入|544.44|6443.33|4443.33|3323.33|332.33|523.33|537.33|
6脚本导出
通过root用户进入到系统管理帐套。
“查询模板”按钮导出脚本
pub_query_templet
pub_query_condition
“报表模板”按钮导出脚本
pub_report_templet
pub_report_model
多层合并列表头报表模板导出脚本
pub_report_group
pub_report_model
双击“功能节点注册”
sm_funcregister
双击“按钮注册”导出classname和各个按钮脚本。
sm_butnregister
报表模板和查询模板分配脚本,界面上没找到导出按钮
pub_systemplate
7报表打印功能添加
7.1UAP平台打印工具的类的修改
画打印模板要先生成数据源变量,修改了类nc.impl.uap.print.PrintToolsDAO,
原来代码如下:
由于原来代码返回的items为空,在生成打印模板的数据源变量时候报错,故修改后代码如下:
7.2生成打印模板
二次开发工具-〉UAP集成开发工具-〉点击第一个进入
然后点击工具导航-〉模板管理工具-〉打印模板生成工具。
输入节点号“36H10101”,点击报表单选钮,选中此报表模板。
点击“生成”菜单。
打印模板数据源变量生成成功。
7.3打印模板分配
二次开发工具-〉系统管理工具-〉功能节点默认模板-〉分配打印模板
7.4根据生成的数据源画打印模板
只有执行了7.1步骤,才能生成下图右边的数据源变量,画模板的时候可以直接拖拽数据源变量。
进入二次开发工具-〉模板管理-〉打印模板初始化,选择计划报表,选择系统生成模板,然后点击修改,重新画打印模板。
7.5打印的代码
打印的这些方法也是放到ReportUI基类里的,不用每个报表写。
模板打印:
在基类ReportUI里增加方法,点击模板打印按钮时调用这个方法。
//使用打印模板
publicvoidonPrintTemplate(){
IDataSourcedataSource=newCardPanelPRTS(getPanelModel()
.getNodeCode(),
getPanelModel().getPanel());
PrintEntryprint=newPrintEntry(this,dataSource);
print.setTemplateID(getCorpPrimaryKey(),getPanelModel()
.getNodeCode(),getClientEnvironment().getUser()
.getPrimaryKey(),null);
if(print.selectTemplate()==1){
print.preview();
}
}
直接打印:
所见即所得。
只有第一页打印出列表头。
publicvoidonPrint(){
if(getReportPanel().getBillModel().getRowCount()<=0){
showErrorMessage("没有数据,请查询数据");
return;
}
//得到表体表
nc.ui.pub.beans.UITabletable=null;
table=getReportPanel().getBillTable();
PrintDirectEntryprint=nc.ui.bd.printadapter.PrintManager
.getDirectPrinter(table);
print.setData(getTableData(table));
//设置表头内容(在表格外部)
print.setTopStr(getHeadStr());
//页码显示格式
print.setPageNumStyle("第","页共","页");
//设置打印标题
print.setTitle(getTitle());
print.preview();
}
直接打印:
所见即所得。
每一页都打印列表头,代码比较多,不列出了。
onDirectPrint()。
报表头的自动拼接方法:
直接打印时,打印报表头的字符串。
这个方法也是放到ReportUI基类里的,不用每个报表写。
//拼接打印的表头
publicStringgetHeadStr(){
ReportItem[]items=getReportPanel().getHead_Items();
StringBufferheadStr=newStringBuffer();
ArrayListlist=newArrayList();
if(items!
=null){
for(inti=1;ilist.add(items[i]);
}
Collections.sort(list,this.sortComparator());
for(inti=0;iReportItemitem=(ReportItem)list.get(i);
headStr.append(item.getName()+":
"+item.getValueObject()+"");
}
}
returnheadStr.toString();
}
//按ReportItem的显示顺序排序
publicComparatorsortComparator(){
Comparatorcomparator=newComparator(){
publicintcompare(ReportItemitem1,ReportItemitem2){
if(item1.getShowOrder()!
=item2.getShowOrder()){
returnitem1.getShowOrder()-item2.getShowOrder();
}elseif(!
item1.getName().equals(item2.getName())){
returnitem1.getName().compareTo(item2.getName());
}
return0;
}
};
returncomparator;
}
8报表的交叉方法
8.1UAP平台交叉类的修改
nc.vo.pub.cquery.CrossTable0。
屏蔽以下代码,使返回到界面的记录行不自动排序,比如计划项目的如果按这个代码排序之后就乱了。
//jl+交叉值不排序
//zjb改//modibyyi2011.7.26
//if(i!
=typePos){
//java.util.Collections.sort(v,comparator);
//}
8.2交叉方法的使用
String[]rowKeys=newString[]{"itemname,total_year",};//固定列
String[]colKeys=newString[]{"pk_corp","&type"};//按公司交叉
String[]values=newString[]{"deptdaysum","deptmonthsum"};//当日,本月
accAmtPanel.drawCrossTable(rowKeys,colKeys,values);//交叉方法
9报表的合计
//求合计
SubtotalContextstctx=newSubtotalContext();
stctx.setIsSubtotal(false);
stctx.setTotalNameColKeys("unitName");
stctx.setSumtotalName(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("36106050","UPP36106050-000044")/*@res"--合计--"*/);
stctx.setSubtotalCols(newString[]{"zszcjh","zcjh","zctz","zczx","zsce","zcce"});//这些字段代码均是小数型,不是字符型
accAmtPanel.setSubtotalContext(stctx);
accAmtPanel.subtotal();
accAmtPanel.updateValue();
accAmtPanel.updateUI();
10增加表格体双击监听
//增加表格体监听,单击表格弹出明细界面双击表格单元格进行动作
publicvoidaddCellListener(){
(getPanelModel().getPanel()).getBillTable().addMouseListener(newjava.awt.event.MouseAdapter(){
publicvoidmouseClicked(MouseEvente){
if(e.getClickCount()==2){
onDetail();
}
}
});
}
11自定义参照开发
自定义参照继承AbstractRefModel。
实现方法getFieldCode(),getFieldName(),getHiddenFieldCode(),getPkFieldCode(),getRefTitle(),getTableName(),getWherePart()。
12报表实例一(单层表头固定列模板开发)
12.1需求
本单位预算执行情况分析表
12.2报表模板
12.3查询模板
12.4功能注册
12.5UI类
1.FpCurrBudgetClientUI.java需要修改的地方,继承ReportUI。
//模板编码
nodeCode="36H10101";
//联查明细UI类
nodeName="nc.ui.pmrt.rpt.pm01.FpDetailClientUI";
//返回报表对应的按钮数组。
查询,刷新,打印,联查明细
publicnc.ui.pub.ButtonObject[]getBtnAry(){
returnnewButtonObject[]{m_boQuery,m_boRefresh,m_boPrint,m_boDetail};
}
//返回查询VO
publicBaseVOgetQueryVO(){
if(query==null){
query=newReportQueryVO();
}
returnquery;
}
//返回查询MODEL
publicIPanelModelgetPanelModel(){
if(m_dataModel==null){
m_dataModel=newFpCurrBudgetPanelModel();
}
returnm_dataModel;
}
//联查明细
publicvoidonDetail(){
intindex=(getPanelModel().getPanel()).getBillTable()
.getSelectedRow();
intcount=(getPanelModel().getPanel()).getBodyPanel().getTableModel()
.getRowCount();
if(index<0||index>count-1){
showErrorMessage("请选择一条记录!
");
return;
}
FpPlanVOselectedVO=(FpPlanVO)(getPanelModel()
.getPanel()).getBodyPanel().getTableModel().getBodyValueRowVO(
index,"nc.vo.pmrt.rpt.pm01.FpPlanVO");
if(selectedVO==null
||selectedVO.getAttributeValue("pk_corp")==null
||selectedVO.getAttributeValue("pk_corp").equals("")){
showErrorMessage("请选择一条记录!
");
return;
}
if(m_cardView==null){
m_cardView=(nc.ui.glpub.IUiPanel)m_parent
.showNext(getNodeName());
}else{
m_parent.showNext(m_cardView);
}
ReportQueryVOquery=(ReportQueryVO)getQueryVO();
query.setPk_corp(selectedVO.getAttributeValue("pk_corp").toString());
query.setCreatetype(selectedVO.getCreatetype());
//query.getPk_period();
//query.getPk_sheet();
m_cardView.invoke(query,"联查明细");
}
2.FpCurrBudgetPanelModel.java类,继承PanelModel。
//查询模板编码
nodecode="36H10101";
//返回查询对话框类
publicIDialoggetIQueryDlg(){
if(idlg==null){
idlg=newFpCurrBudgetQryDlg();
idlg.setPanelModel(this);
}
returnidlg;
}
//查询后台结果返回
publicjava.util.VectorexcQuery(BaseVOqueryvo){