NC6X报表数据加工做语义模型返回SQL篇教学文稿.docx
- 文档编号:9885338
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:36
- 大小:1.19MB
NC6X报表数据加工做语义模型返回SQL篇教学文稿.docx
《NC6X报表数据加工做语义模型返回SQL篇教学文稿.docx》由会员分享,可在线阅读,更多相关《NC6X报表数据加工做语义模型返回SQL篇教学文稿.docx(36页珍藏版)》请在冰豆网上搜索。
NC6X报表数据加工做语义模型返回SQL篇教学文稿
报表语义模型(数据加工:
返回SQL方式)
数据加工方式:
1.返回查询SQL;2.返回结果集DataSet;3.返回数据表(下次做了提供案例)。
实现方式基本一致,可以参照系统原有报表语义模型(抱歉不详细仅供参考)
1、实现基本思路概况(不详细比较啰嗦)
1.首先不管语义模型数据加工是返回SQL、DataSet或者TABLE任何一种类型基本实现步骤一致;
2.先按需求实现的难易程度来选择使用以上那种方式来实现:
一般数据都能SQL查询出来的,偶尔有一两点数据取不到可以选择返回SQL,不会取数的那段创建临时表;如果是基本上都是东拼西凑的取数那就返回DataSet方式;最后一种时返回TABLE这种场景标准产品用的也不多,后续提供案例;
3.数据加工做语义脚本肯定需要定义接口和实现类,确定好报表属于那个模块创建接口和实现类并配置好接口文件UPM就好,具体配置可以参考改模块其他接口文件;
4.数据加工接口参数一一般都是传com.ufida.dataset.IContext或者nc.pub.smart.context.SmartContext,这个是报表上下文,所有查询参数及系统变量
5.都放在这个里面,语义模型与接口里面这个两个context基本可以互相转换,后面案例就可以看出;
6.不要想着是不是我要先把语义模型和自由报表配置好了再写数据加工代码,没用!
正确可行的方式先写数据加工代码;
7.首先就要自己明确报表的取数逻辑,脑海大概设计下大概的代码怎么写;
8.确定查询条件及数据类型,接口实现类里面定义全局变量查询条件(推荐)默认否赋值,方便调试代码,因为这块还没用到查询模板,没法动态获取查询条件,后面分配了查询模板重新覆盖查询变量值就好了(数据加工报表只能做单据查询模板那种分配给报表节点);
9.如果是DataSet返回方式的接口实现类里面定义好元数据列及数据类型,SQL返回方式没有这一步操作;
10.然后就是写报表取数逻辑代码,按自己默认设定查询变量值去写好代码及判断逻辑,最后返回数据(SQL、DataSet或者TABLE);
11.客开报表一般把语义模型和自由报表定义在集团或者全局的节点,这也是规范和经验所得;
12.在语义模型-集团(举例,全局节点也行)节点定义好自己的与模型,点设计弹出界面数据加工放入调用写好的数据加工过接口进行代码调试及代码纠正;
13.现在调试接口参数context基本上时没有什么数据的,目前也不会有查询条件字段在里面,没有分配给节点查询模板呢,打开报表节点查询调用代码才能看到里面很多参数和值,所以暂时接口实现类不初始化查询参数方法及校验;
14.语义模型数据加工里面放入调用接口代码,格式化,编译通过,下一步,代码成功的话会正常返回报表字段列(元数据)页签,点确定,“3选择字段”自己添加字段列,这里的字段必须是代码返回的,不能自己随便新增无效的;自己添加字段“表达式大方框”必须选择左下角“数据加工(dp)”里面的字段,这个表达式里面可以写公式;最后解释下“数据加工(dp)”这个命名都是这样写规范,防止其他实施不随意修改。
15.然后就是自由报表设计了,在“自由报表-集团”或者“自由报表-全局”节点,引入刚才做好的语义模型文件,设计报表界面及相关统计等(这里不多说,不懂问实施或开发);
16.记得自由报表设计界面有右上角“标题”左边有个“主组织属性设置”螺丝一样的按钮,如果是报表存在组织查询条件的报表,这里必须设置集团和组织字段(代码或者SQL里面默认字段pk_org与pk_group)就不需要你设置,自动识别,否则需要手动设置(集团节点设置pk_group,反之都设置),如果这里没设置,可能出现语义模型可以预览数据,而自由报表预览无数据现象。
一般不需要查询组织条件的报表,报表字段只需要业务字段+pk_group,发布组织类型为集团的报表节点即可;如果需要用到组织查询的报表,报表字段只需要业务字段+pk_group+pk_org,发布组织类型为具体组织(销售、库存、财务等)的的报表节点。
17.自由报表界面格式设计好了就需要发布节点,如果改报表用不到组织字段那就发布集团类型的报表节点;如果用到了组织,那就发布具体的组织(销售、库存、财务等)的节点。
18.分配报表节点权限,制作报表查询模板,并分配给报表;
19.打开报表节点校验报表及查询模板能否正常加载出来;
20.如果报表正常显示加载出来,测试查询模板,接口实现类断点调试,把剩下的查询参数初始化与查询条件值校验工作完成;
21.以上工作完成,导出代码补丁、报表文件补丁、SQL脚本补丁给实施测试验证就大功告成!
2、定义报表数据加工接口及实现类代码
1.定义接口及接口方法:
截图:
以下是代码:
packagenc.itf.cmp.report.ext;
importcom.ufida.dataset.IContext;
/**
*资金管理>现金管理报表>集团现金流简表(新)(性能优化-由原来的语义脚本改成数据加工)
*
*@authorWYR
*@since2017-09-25
*
*/
publicinterfaceGroupcashflowprofileNewItf{
/**
*集团现金流简表(新)
*
*@paramcontext
*@return
*@throwsException
*/
publicStringgetQuerySql(IContextcontext)throwsException;
}
2.接口实现类截图介代码:
截图:
代码:
packagenc.impl.cmp.report.ext;
importnc.itf.cmp.report.ext.GroupcashflowprofileNewItf;
importcom.ufida.dataset.IContext;
/**
*资金管理>现金管理报表>集团现金流简表(新)(性能优化-由原来的语义脚本改成数据加工)
*
*@authorWYR
*@since2017-09-25
*
*/
publicclassGroupcashflowprofileNewImplimplementsGroupcashflowprofileNewItf{
/**
*资金管理>现金管理报表>集团现金流简表(新)(性能优化-由原来的语义脚本改成数据加工)
*
*@authorWYR
*@since2017-09-25
*
*/
publicStringgetQuerySql(IContextcontext)throwsException{
returnnull;
}
}
3.后面自己完善逻辑。
3、创建临时表参考案列
importjava.util.ArrayList;
importjava.util.List;
importnc.impl.pubapp.pattern.database.TempTable;
importnc.vo.pub.JavaType;
//NC6x后台创建临时表并插入数据(select多列fromTempTable那种)
publicStringcreateTempTable(StringtempName,String[]ids){
List>rows=newArrayList
>();
for(Stringite:
ids){
List
String[]dates=ite.split(",");
row.add(dates[0]);
row.add(dates[1]);
rows.add(row);
}
//这个自己写个Stringcolumns="id1,id2,id3,...";分割一下就好了,方便拼接select语句查询
String[]columns={
"id1","id2"
};
String[]columnTypes={
"CHAR(20)","CHAR(20)"
};
JavaType[]types=newJavaType[]{
JavaType.String,JavaType.String
};
TempTabledao=newTempTable();
returndao.getTempTable(tempName,columns,columnTypes,types,rows);//返回表名
}
4、查询条件获取与查询模板简单说明
5、义模型放入数据加工接口代码操作步骤
1.创建语义模型:
2.设计语义模型(语义模型按钮组下面点设计按钮):
3.放入数据加工写好的代码接口代码:
4.格式化代码>编译>下一步>确定:
5.添加语义模型字段:
6、自由报表设计
7、实打开报表节点测试查询模板调试代码修改代码(自己体会)
此处省略一万个草泥马(骂平台的最多能调试三次,超过3次报错直接结束开发环境启动的服务)........
8、接口文件配置
xmlversion="1.0"encoding="gb2312"?
>
--资金管理>现金管理报表>集团现金流简表(新)报表查询接口-->
9、提供案例所有类代码:
1.临时表VO:
packagenc.vo.cmp.report.ext;
/***
*资金管理>现金管理报表>集团现金流简表(新)临时表VO
*
*@authorWYR
*@since2017-09-26
*
*/
publicclassGpCflowprofileNewTempVO{
privateStringpk_group;
privateStringinoutname;
privateStringcuname;
privatedoublemoney;
privateStringtallydate;
privateStringcashflow;
publicStringgetPk_group(){
returnpk_group;
}
publicvoidsetPk_group(Stringpk_group){
this.pk_group=pk_group;
}
publicStringgetInoutname(){
returninoutname;
}
publicvoidsetInoutname(Stringinoutname){
this.inoutname=inoutname;
}
publicStringgetCuname(){
returncuname;
}
publicvoidsetCuname(Stringcuname){
this.cuname=cuname;
}
publicdoublegetMoney(){
returnmoney;
}
publicvoidsetMoney(doublemoney){
this.money=money;
}
publicStringgetTallydate(){
returntallydate;
}
publicvoidsetTallydate(Stringtallydate){
this.tallydate=tallydate;
}
publicStringgetCashflow(){
returncashflow;
}
publicvoidsetCashflow(Stringcashflow){
this.cashflow=cashflow;
}
}
2.接口:
packagenc.itf.cmp.report.ext;
importcom.ufida.dataset.IContext;
/**
*资金管理>现金管理报表>集团现金流简表(新)(性能优化-由原来的语义脚本改成数据加工)
*
*@authorWYR
*@since2017-09-25
*
*/
publicinterfaceGroupcashflowprofileNewItf{
/**
*集团现金流简表(新)
*
*@paramcontext
*@return
*@throwsException
*/
publicStringgetQuerySql(IContextcontext)throwsException;
}
3.实现类:
packagenc.impl.cmp.report.ext;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importnc.bs.dao.BaseDAO;
importnc.bs.dao.DAOException;
importnc.impl.pubapp.pattern.database.TempTable;
importnc.itf.cmp.report.ext.GroupcashflowprofileNewItf;
importnc.jdbc.framework.processor.BeanListProcessor;
importnc.vo.cmp.report.ext.GpCflowprofileNewTempVO;
importnc.vo.pub.JavaType;
importnc.vo.pub.query.ConditionVO;
importnc.vo.pubapp.pattern.exception.ExceptionUtils;
importcom.ufida.dataset.IContext;
importmon.util.NumberUtils;
importcom.ufida.report.anareport.FreeReportContextKey;
/**
*资金管理>现金管理报表>集团现金流简表(新)(性能优化-由原来的语义脚本改成数据加工)
*
*@authorWYR
*@since2017-09-25
*
*/
publicclassGroupcashflowprofileNewImplimplementsGroupcashflowprofileNewItf{
/*****最终返回的查询SQL******/
privateStringBuilderbuilderSQL=newStringBuilder();
privateBaseDAOdao=null;
/*****创建的临时表名*******/
privateStringTempTableName=null;
/*****临时表查询SQL列*******/
privatefinalStringTempSelectField="pk_group,inoutname,cuname,money,tallydate,cashflow";
/*****项目类型(拼SQL用到)******/
privateString[]cashflows=newString[]{
"经营流入","经营流出","土地费用","筹资流入","筹资流出","投资流入","投资流出","集团内部抵消项","理财收支"};
/*******开始日期*********/
privateStringbeg_date="2017-06-01";
/*******结束日期*********/
privateStringend_date="2017-09-2523:
59:
59";
/********java数据类型*********/
privateJavaType[]types=newJavaType[]{
JavaType.String,JavaType.String,JavaType.String,JavaType.BigDecimal,JavaType.String,JavaType.String
};
/************数据库列类型*************/
privateString[]columnTypes={"char(20)","varchar(100)","varchar(30)","decimal(28,8)","char(19)","varchar(30)"};
//以下汇率只是以默认定义的(测试使用,否则开发时语义模型没法测试编译下一步通过),后续查询条件必输会覆盖值
//那个时候还没用到查询模板
/********美元汇率********/
privatedoubleusd=6.5382;
/********港币汇率********/
privatedoublehkd=0.83687;
/********马币汇率********/
privatedoublemb=1.55;
/********澳元汇率********/
privatedoubleob=1.7;
/********新币汇率********/
privatedoublexb=1.2;
/********加币汇率********/
privatedoublejb=1.3;
/**
*资金管理>现金管理报表>集团现金流简表(新)(性能优化-由原来的语义脚本改成数据加工)
*
*@authorWYR
*@since2017-09-25
*
*/
publicStringgetQuerySql(IContextcontext)throwsException{
returnnull;
}
/***
*拼接查询SQL
*
*@paramcontext报表参数上下文
*@authorWYR
*@since2017-09-25
*@return
*@throwsException
*/
privateStringgetConvertSql(IContextcontext)throwsException{
TempTableName=null;
this.getQueryParameters(context);
this.checkQueryParametersIsNotNull();
this.getCreateTempTableName();
this.buildSelectSql();
this.getEmbeddedSql();
returnthis.builderSQL.toString();
}
/***
*获取第二层嵌套的SQL
*
*@authorWYR
*@since2017-09-26
*@throwsException
*/
privatevoidgetEmbeddedSql()throwsException{
StringBuilderbdSql=newStringBuilder();
bdSql.append("from");
bdSql.append("(");
bdSql.append("(");
bdSql.append("("+getSameCasewhenPartSql("A.经营","经营流入")+")");
bdSql.append("Unionall");
bdSql.append("("+getSameCasewhenPartSql("A.经营","经营流出")+")");
bdSql.append(")");
bdSql.append("Unionall");
bdSql.append("("+getSameCasewhenPartSql("B.土地费用","土地费用")+")");
bdSql.append("Unionall");
bdSql.append("(");
bdSql.append("("+getSameCasewhenPartSql("C.筹资","筹资流入")+")");
bdSql.append("Unionall");
bdSql.append("("+getSameCasewhenPartSql("C.筹资","筹资流出")+")");
bdSql.append(")");
bdSql.append("Unionall");
bdSql.append("(");
bdSql.append("("+getSameCasewhenPartSql("D.投资","投资流入")+")");
bdSql.append("Unionall");
bdSql.append("("+getSameCasewhenPartSql("D.投资","投资流出")+")");
bdSql.append(")");
bdSql.append("Unionall");
bdSql.append("(");
bdSql.append("("+getSameCasewhenPartSql("E.集团内部","集团内部抵消项")+")");
bdSql.append(")");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NC6X 报表 数据 加工 语义 模型 返回 SQL 教学 文稿