查询引擎查询引擎SQLSQL整理与数据加工整理与数据加工2013年8月16日冯海涛查询引擎•SQL整理•SQL整理(SQLRepair):指在SQL查询之前,对SQL所作的调整。通常会根据参数的不同,对查询的表、字段或条件等信息进行增补或修改。•数据加工•数据加工(DataProcess):数据加工是指某个(或某几个)结果集在经过一系列加工算法的变换后得到另一个结果集,而后者通常是业务上要求的展现结果。与SQL整理与数据加工的区别在于:前者在SQL查询之前进行,作用的对象是SQL定义,数据加工在查询之后进行,作用的对象是结果集。查询引擎SQL整理查询引擎SQL整理获得参数值Stringpar=(getValue("areaCode")==null)?"":getValue("areaCode").toString();由查询获得结果集StorageDataSetds=ModelUtil.getQueryResult_Sql("AAA",getHashParam(),getEnvInfo().getAccountDsn());由SQL获得结果集QEDataSetds=newQEDataSet();ds.setSQLString("selectunitcode,unitnamefrombd_corp");ds.setDsName(getQmd().getDsName());setDataSet(ds);通用查询引擎SQL整理SQL整理•追加查询表:在已有的查询定义中追加查询表•追加连接条件:关联新加表与已有表的连接关系查询引擎SQL整理•追加查询字段SelectFldVOsf=newSelectFldVO();sf.setExpression("bd_deptdoc.deptname");sf.setFldname("部门名称");sf.setFldalias("deptname");addField(sf);查询引擎SQL整理•修改查询字段查询引擎SQL整理•修改查询字段SelectFldVOsf=newSelectFldVO();sf.setExpression("bd_corp.pk_corp");sf.setFldname("公司主键");sf.setFldalias("pk_corp");modifyField(0,sf);查询引擎SQL整理•追加查询条件生成代码后可以再编辑条件,括号内是完成的单个where条件addWhere("pk_corp=#LoginCorp#");•按参数追加条件查询引擎SQL整理Stringpar=(getValue("pkcorp")==null)?"":getValue("pkcorp").toString();if(!par.equals(""))addWhere("pk_corp='"+par+"'");Stringpar=(getValue("iss")==null)?"":getValue("iss").toString();if(!par.equals("")){if(par.equals("是")){addWhere("bd_corp.isseal='Y'");}elseif(par.equals("否")){addWhere("bd_corp.isseal='N'");}}查询引擎SQL整理•按参数追加条件使用案例查询引擎SQL整理•按参数追加条件使用案例•数据加工-公式设置查询引擎数据加工•公式设置查询引擎数据加工StorageDataSetds=ModelUtil.getQueryResult_Sql("NewI60",getHashParam(),getEnvInfo().getAccountDsn());String[]strColNames=newString[]{"registerfund","VV"};int[]iDataTypes=newint[]{Variant.INT,Variant.INT};String[]strColFormulas=newString[]{"registerfund->registerfund+100","VV->200"};DataFormulateProviderdfp=newDataFormulateProvider(strColNames,iDataTypes,strColFormulas);dfp.setDataProviders(newObject[]{ds});setProvider(dfp);查询引擎数据加工•字符分组拼接StorageDataSetds=ModelUtil.getQueryResult_Sql("NewID58",getHashParam(),getEnv().getDefaultDsn());String[]strGroupCols=newString[]{“pk_areacl”,“areaclname”};//设置分组列String[]strConcatCols=newString[]{“custname”};//设置合并显示的列DataGroupConcatProviderdgcp=newDataGroupConcatProvider(strGroupCols,strConcatCols,",","[","]",strGroupCols);dgcp.setDataProviders(newObject[]{ds});setProvider(dgcp);查询引擎数据加工•行间占比先按分组排序列进行分组排序,然后计算单元格与其所在分组小计值的比,或者为单元格与其所在列总合计值的比即比例=本行数值/多行总和部门汉族员工人数蒙族员工占比满族员工人数汉族员工占比蒙族员工人数蒙族员工占比部门14214/202/101/8……………………………………部门n合计20108查询引擎数据加工•行间占比使用案例查询引擎数据加工•行间占比使用案例StorageDataSetds=ModelUtil.getQueryResult_Sql("NewID15copy",getHashParam(),getEnvInfo().getAccountDsn());String[]strGroupCols=null;String[]strDividedCols=newString[]{"zs","py","wj"};String[]strPercentCols=newString[]{"zszb","pyzb","wjzb"};RateComputeProviderrcp=newRateComputeProvider(strGroupCols,strDividedCols,strPercentCols,false);rcp.setDataProviders(newObject[]{ds});setProvider(rcp);查询引擎数据加工•行间占比使用案例查询引擎数据加工•折行余额借方发生列AA对应查询中选择字段的别名贷方发生列BB对应查询中选择字段的别名余额列CC对应查询中选择字段的别名java.math.BigDecimalye=newjava.math.BigDecimal(0.0);ds.first();while(ds.inBounds()){java.math.BigDecimaljf=ds.getBigDecimal("AA");java.math.BigDecimaldf=ds.getBigDecimal("BB");ye=ye.add(jf).subtract(df);ds.setBigDecimal("CC",ye);ds.next();}setDataSet(ds);CC=CC+AA-BB查询引擎数据加工折行余额应用折行合计,根据公司主键变化,重新计算合计。java.math.BigDecimalye=newjava.math.BigDecimal(0.0);ds.first();Stringoldcorp="";Stringnewcorp="";while(ds.inBounds()){newcorp=ds.getString("pk_corp");//pk_corp合计重新计算开关取值,根据实际替换if(!newcorp.equals(oldcorp)){oldcorp=newcorp;ye=newjava.math.BigDecimal(0.0);}java.math.BigDecimaljf=ds.getBigDecimal("AAA");java.math.BigDecimaldf=ds.getBigDecimal("BBB");ye=ye.add(jf).subtract(df);ds.setBigDecimal("CCC",ye);ds.next();}setDataSet(ds);查询引擎数据加工•行号区间筛选StorageDataSetds=ModelUtil.getQueryResult_Sql("NewID58copy",getHashParam(),getEnvInfo().getAccountDsn());DatasetUtil.filterRowsByInterval(ds,2,5);setDataSet(ds);取得指定行号范围内的数据查询引擎数据加工•行号数列筛选StorageDataSetds=ModelUtil.getQueryResult_Sql("NewID58copycopy",getHashParam(),getEnvInfo().getAccountDsn());DatasetUtil.filterRowsByArray(ds,2,1);setDataSet(ds);保留结果集行为a*N+b计算结果查询引擎数据加工•重复分组过滤StorageDataSetds=ModelUtil.getQueryResult_Sql("New100",getHashParam(),getEnvInfo().getAccountDsn());DatasetUtil.clearRepeatedData(ds,newString[]{"areaclname"});setDataSet(ds);查询引擎数据加工SQL整理和数据加工存放在数据库中BLOB字段执行前自动生成java代码,然后编译为class文件再执行调用生成代码中置nchome\modules\uapqe\META-INF\var•Source存放数据加工生成的JAVA源码•Classes存放编译后的class文件文件名格式QIUE_DP_NewID58_nc56.java前缀查询设计的编码数据源名称谢谢!