用友NC系统查询引擎应用心得
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.查询引擎向导设计可否使用视图?
答:需要将视图维护到数据字典中才可使用,这个视图一定要物理创建也可用
也可直接在SQL手工设计中使用
2.在交叉报表上,一些常用到的合计项目要如何添加,如报表最后添加的合计行、合计列
要如何添加?
答:对于交叉报表列合计,在交叉属性页签“值”上单击鼠标,会弹出“小计设置”对话框,根据需要打上勾即可,入下图所示
运行结果如下,后两列
对于合计行,运行显示结果后,右键就有小计合计功能
3.报表发布为“报表模板节点”后,查询条件使用比较灵活,能否支持用户灵活使用?比如,用户使用多个存货编码作为查询条件
答:QE与模板只是实现了简单应用的集成,无法实现一个查询参数与多行查询模板条件之间的对应。其原因是,QE的一个查询参数只能有一个固定取值,这个参数可以在查询定义中被多次引用,引用处才决定筛选条件的逻辑;而查询模板直接定义的就是筛选条件(字段+操作符+值)。查询模板与QE之间以参数哈希表的方式实现参数传递,当查询模板利用自身功能将一个参数对应的筛选条件复制成多个筛选条件,那么构造参数哈希表时只能相互冲掉,在QE的SQL整理处无法得到该参数的不同取值,也就无法加以区别。
所以,QE与模板的集成支持不了查询模板的高级功能,包括通过项目名称下拉列表和增加自定义条件等方式基于一个参数构造多行条件。对于范例中提及的应用,只能支持到“商品编码in ('编码1','编码2',...)”的应用。
4.查询引擎报表如何保存查询条件?
答: a)发布为普通报表节点,见下图
b)V56版本支持发布为独立节点保存查询条件,如下图
[历史设置]中可保存查询条件
5.穿透
穿透分查询间穿透和穿透到节点
a)查询间穿透
这种穿透方式虽然便捷,但是有些场景却不太适用:
假设查询A穿透到查询B,查询B中有需要隐藏的ID列或者有公式列
举例:
查询A如下
查询A根据存货id穿透到查询B,穿透规则中加如下代码
String value = getPeneValue("CINVBASDOCID");
getHashParam().put("cinvbasdocid", new ParamVO(value));
StorageDataSet ds = ModelUtil.getQueryResult("z10", getHashParam(), getEnvInfo().getAccountDsn());
setId("z10");
setDataSet(ds);
上面显示结果中存货的公式列未执行公式,显然不合要求
b)穿透到节点,分下面两种
1)查询A穿透到单据B,只要目标单据实现ILinkQuery接口,就可以根据单据号穿透到对应单据
2)查询A穿透到报表B(报表B为查询B发布后的表报节点),针对上面查询间穿透不适合的场景,穿透到报表节点就能解决该问题
将报表B发布为报表节点后,将功能注册脚本类名修改为"nc.ui.pub.querymodel.LinkableQueryNodeUI",如图
查询A穿透到表报B的运行结果如下
6.报表发布为普通报表节点后,对in操作符的支持情况如何?
答:V56版本及之前版本,均不支持in操作符,因此不适合将参数包含in操作符的自定义查询发布为普通报表节点;后续版本是否支持未知.
现象如下:
在V56环境中,进行查询引擎报表设计时参数设置如下,操作符为{=@in}
将节点发布为普通报表节点后,查询对话框中的操作符显示为两个"等于",并且无论使用哪个操作符,都报"查询执行有误";并且参照选择值时可以多选,返回到界面上时为多值,但是焦点移开就变成一个值
7.表报发布为普通节点是否支持新查询模板?
答:V56及以前版本均未支持新查询模板
8.如何实现发布一个节点,根据参数决定执行不同查询?效果如下:
String parExec = (getValue("execby") == null) ? "" : getValue("execby").toString(); //根据执行方案确定调用哪个查询
String rptID = null;
if ( parExec.equals("执行z1查询"))
{
rptID = "z1";
}
else if ( parExec.equals("执行z3查询"))
{
rptID = "z3";
}
//改变查询定义
changeDef(rptID);
9.#PENE_RULE_ID#是什么?
如:数据加工中有如下代码
StorageDataSet ds = ModelUtil.getQueryResult_Sql(id, getHashParam(), getEnvInfo(
).getAccountDsn(), getEnvInfo().getAccountDsn());
getHashParam().put("#PENE_RULE_ID#",new ParamVO( id));
setDataSet(ds);
答:#PENE_RULE_ID#是穿透用ID,在数据加工中这样使用可以实现发布一个节点根据不同参数值对应不同查询。(执行效果可参考8)
10.如何实现一个查询设计完成多种动态交叉?
效果如下:
所加SQL整理代码片段如下:
// 获得“交叉样式”参数的值
String par = (getValue("crossby") == null) ? "" : getValue("crossby").toString(); if (par.equalsIgnoreCase("按仓库交叉")) {
// 设置不同交叉样式
QueryBaseDef qbd = getQueryBaseDef();
RotateCrossVO rc = qbd.getRotateCross();
rc.setStrRows(new String[] {"invname"});//设置行砝码
rc.setStrCols(new String[] {"storname","&type"});//设置列砝码
rc.setStrVals(new String[] {"nnumber", "npacknumber"});//设置值砝码
setQueryBaseDef(qbd);
}
&type必须有,否则结果不交叉