ncv60新查询模板技术红皮书_第1页
ncv60新查询模板技术红皮书_第2页
ncv60新查询模板技术红皮书_第3页
ncv60新查询模板技术红皮书_第4页
ncv60新查询模板技术红皮书_第5页
已阅读5页,还剩47页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前 第一章设计介 模型介 第二章开发说 调用方 自己实现过查询框的情 常用条件Panel的使 附 附一查询条件表中个字段含 附二系统函数列 专题一:定制自定义 专题二:查询模板响 V56新增功 查询模板前台缓 分页异步查 nc.vo.querytem 类 3,双引 V60新功 查询方 前查询模板的功能比较单纯,用一句话概况就是,接受用户的输入,构造SQL语句的WhereAand(Bor(Cand1Form形式,使简单条件(And联接)的录入更方ClearQuest单独的in操作符仍然支持,这样可以消除实际操作时对“或者(or)”操作符的需sql语句中完成查询的排序功能。234组合合成的。比如:部门=’生产部’and(人员编码=’P0001’or人员编码=’P0003’)。在新查询2.1FilterQueryConditionVO。FilterMetaQueryConditionVO进行转换操作后生成的,或从单据元数据生成。IOperator接口是对操作符的抽象。IFileldValueIFieldValueElement是对一个“原子”值的抽象,实际可能是描述了一个整数,或者是一个Whereand,orIFilter形成的一棵树,在新查询模QueryTree来描述。前面举的例子,表示成树的形式就如下图所示。人员编码人员编码人员编码2.2不论是高级视图还是常规视图,其内部都是用QueryTree来组织单个的IFilter2.3QueryTreeIFilter之间的与或关系。对于常规视图来说,用户不用关心,实际也不能修改,IFilter之间QueryTreeIFilter的编辑,往往是和具体的业务相关的,默认的编辑方式不一定能满足业务的要求。IFilter编辑进行扩展。IFilterIFilterEditorIFilter的IFilterEditorFilterEditorManager创建出一个。默认的情况足业务的需要,则可以按需定制符合要求的编辑器,并到FilterEditorManager中,即可FilterMetaLabel控件,中间是供选择操作符的下拉框控件,右边被绿色线框框住的部分IFieldValueIFieldValueEditor,默认情况下创建出来的是的编辑器,DefaultFieldValueEditor也是可以被替换的。上是对IFieldValueElementEditor的包装。DefaultFieldValueEditorIFieldValueElementEditor是否允许多选。上面所描述的DefaultFieldValueEditor的行为如果符合业务的需要,那么你可以坦然接受它,反之则是定IFieldValueEditor的时候了。DefaultFieldValueEditor的情况下,用户在为某个查询条件选定一个部门,或IFieldValueElementEditorManager创建出来的,默认的情况下它又把这个任务委托给了DefaultFieldValueElementEditorFactory这个工厂类。这个工厂类根据在pub_query_conditionIFieldValueElementEditor实例。同样地,这个过程也是可以根据需要扩展的,支持定制IFieldValueElementEditor。。综上所述,新查询模板对IFilter的编辑,分别在IFilterEditor,IFieldValueEditor,辑器,一个XXEditorManager来管理工厂一个定制的编辑器,概况来讲可以分成三个产该自定义编辑器3.把该工厂类到XXEditorManager中。。关于如何,请参看开发说明有关章节2.6IFilterSQL语句。(custom(customisnullorcustomin('C1','C2','C3'))(invisnullorcustomin当然对于订单来说,其经销商和存货字段一般都是不可为空的,上面的"customisnull"sql不会象上面一样是用('C1','C2','C3')这样的形式枚举其有权限的数据而是一个有权sqlsql是以下的形式bd_cubasdoc.pk_areaclbd_cubasdoc.pk_areaclisnullbd_cubasdoc.pk_areaclin(selectdistinctpower.resource_data_idfromsm_power_areaclasspower,sm_useru,sm_user_roleurolewhereu.cuserid='0001SD100000000000UP'andu.cuserid=urole.cuseridandurole.pk_corp='1001'andurole.pk_role=power.pk_roletypecode=1and(power.pk_org='1001' mon_powerNC的权限不但和角色相关,和角色所属的组织也相关,即权限实际上描述了,角色,A有权限查询的公司为(O1,O2),o1,其有权限的经销商为(C1,C2),有权限的存货为(I1,I2);对于公司o2,其有权限的经销商为(C2,C3),有权限的存货为(I2,I3)Ao1o2的数据进行查询时,需要附加(((pk_corp='o1'(customisnull customin('C1','C2'))(invisnullorinvin('I1','I2')))(customisnullorcustomin('C2','C3'))(invisnullorinvin('I2','I3'))custominv对应的数据权限子查询,然后组合成最终的条件。订单订单.制单人=订单.订单号订单.客商.编码订单.客商.名称 (o.c.code=’001’or=‘tiger’oro.no=‘55001’)ando.p (o.c.(code=’001’orname=’tiger’)oro.no=‘55001’)ando.p订单.订单.制单人=订单.客商.名称订单.客商.编码’订单.订单.制单人=订单.客商.(编码=’001’or名称查询getNormalPanel(getWhereSQL(setShowDefine;无getOrderSql(getSqlDscrpt(无getWhereSqlWithoutPower(如果需要指定的temteid,只需要在传入的参数temteinfo中设置其temteid即可如果确实外show继承查询框样例代码可参见:nc.ui.trade.query.HYQueryConditionDLG该类只 teInfotempinfo=new queryDlg=newQueryConditionDLG(this,null,tempinfo);采用与UI工厂原先类似的方法。只是把nc.ui.trade.query.HYQueryDLG替换为PanelINormalQueryPanel参数的nc.ui.querytemte.QueryConditionDLG构造子创建查询框,将自己定义的常用transient。23privateprivateclassTestNormalPanelextendsUIPanelimplementsINormalQueryPanel{privateUILabellabel=newUILabel("Fillthetxt:");privateUITextFieldtxtField=newUITextField(30);publicTestNormalPanel(){}publicJComponent ponent(){returnthis;}publicObjectgetNormalQueryObject(){returntxtField.getText();}publicvoidsetNormalQueryObject(ObjectqryObject){}publicvoidclearData(){}publicvoidreSetData(){}PowerCorrelationVOpcvo=newPowerCorrelationVO(); PowerCorrelationVOpcvo2=new 数据权限是否启用有开关控制,其控制开关为数据权限是否启用有开关控制,其控制开关为 teInfo中的如下字privatebooleanisDataPowerCtrl=数据权限强制开关.(5.3后适用,即总开关作用,其优先级最高privateboolean Switch=IDataPowerEnableJudgerregisterDataPowerEnableJudger(IDataPowerEnableJudgerjudg)Fltereditor属性就需要用查询模板的机制来实现。被的定义在nc.ui.querytemte.CriteriaChangedEvent中,包括如下 Filter改变,包括Filter的值改变和操作符改 Filter移除,从条件编辑器中删除该Filter触 Fltereditor初始化,添加Filter和在高级视图Filter时触发 要使用查询模板机制,需要实现ICriteriaChangedListener接口,并将其使用QueryConditionDLGregisterCriteriaEditorListener(ICriteriaChangedListenerlistener)方法注QueryConditionDLGQueryConditionDLGqcd=newQueryConditionDLG(panel,tnp,tempinfo);qcd.registerCriteriaEditorListener(newICriteriaChangedListener(){publicvoidcriteriaChanged(CriteriaChangedEventevent){List<IFilter>fi=event.getCriteriaEditor().getFiltersByFieldCode("pk_corp");for(inti=0;i<fi.size();i++){corpcode=corpcode="";}}}}DefaultFilterEditordfe=(DefaultFilterEditor)event.getFiltereditor(); FilterEditorChangedUtil.setRefPk(dfe,}}}*注FilterEditorChangedUtil是编辑器改变工具类,目前处理对参照编辑器的各种改变,whereRefModel等,可根据业务组具体要求扩展。在使用查询模板机制时需要注意的是普通视图和高级视图是有差别的那就FilterFilterFilter,只有在创建新的Filter或修改已有Filter时才会以框形式初始化相应的编辑器。详细可提需求,UAPservice解决。如果是combobox,要看数据怎样的,如果是i,c那么默认值为序号,如果是s那 如果想要默认值为aa,bb 则默认值为0,1 则为aa,bbVO teTotalVOProceeor(newIQueryTem publicvoidprocessQueryTempletTotalVO(if(totalVO!=null){QueryConditionVO[]qryconds=totalVO.getConditionVOs();for(QueryConditionVOqcvo:qryconds){if(qcvo.getFieldCode().equals("bd_purorg. }}}}qcd.registerFieldValueEelementEditorFactory(newqcd.registerFieldValueEelementEditorFactory(newIFieldValueElementEditorFactory(){if te.operator".equals(meta.getFieldCode()))UIRefPanerefPane=newrefPane.setWhereString("pk_corp='"+getCurrPK_corp()+"'");returnnewRefElementEditor(refPane,meta.getReturnType());} 自己再去获得想要的取值,而新的查询模块,不允许外面调用者自己去拼写SQL。所以,增强说明,即扩展consultcode.参见查询条件表中字段说明。:常用条件文中已有介绍(参见2.1.3常用条件Panel的使用调用者自己获取常:逻辑条件:查询条件有属性是否查询条件(isCondition)false那么该条件sql,相当于提供一个字段—值对,可以把逻辑条件看作是如何得到用户操作的如果是自己组织的逻辑条件或者自定义的常用条件Panel,那肯定是产品组自己负责得取了。如果是用的默认的逻辑条件Panel,可以用DefaultLogicalEditor.getNormalObject()得null;2度为0的,需要把操作符为“ISNULL。同理,查询模板支持非空查询,对应的操作符为“isnotnull”和“ISNOTNULL设置其他查询条件的值(联动where条件等?权限后,查询模板附加的信息是codeisnullor…这种情况怎么处理?答:在调用模板时,调用TemteInfo的setDatapowerNullStr(StringdatapowerNullStr)sqlcodeisnullorcode=‘datapowerNullStror………附pub_query_templet是否适用参照类型.表示参照显示/返回的值是使用其编码,名称,操作符编码。每个操作符后带有一个预置约束条件,V56V56指标条件,V56V561*:consult_codedatatype相关datatype=1,即整型consult_code1、取值范围为[20,30],那么consult_code的值为20,30。2、取值范围为>20,那么consult_code的值为203、取值范围为<30,那么consult_code的值为consult_code的设置方式是以“,”为分隔符组成字符串,第一个数字表示小数点后位数,第直接写参照名称.Model ..为的名称,对应bd_bdInfo中定义的bd_name,如{人员PK:...为的Pk,,对应bd_bdInfo中定义的pk,如datatype=6I,C,SI:(index):表示返回值是数值0,1,2等;C:(char)表示返回值是字符型的索引,如’0’,’1’等;S:(String)在(i)X或者F:表示多语支持两种形:CX,UC 3和CX,C .前者最终示的为多语定义的内容且返回值为=后面的数值或者是其对应的字符,后者从该模板的功能节点对应下的资源下去取多语。F:pd_dd.(字段值列表).IF,bd_accbank,banktype表名/ 取值时候,如果IF,表示取szqz字段的int表示形式;如果CF,则表示取szqz字段的字符表示形式;如果为SF,则直接取自字段qzsm;v5.3原来的字后追加列名来表示,所取的值!如IF,bd_accbank,banktype,xh表示取对应xh所有的可能测试用例如下:vo.setConsultCode("I,男,女");//return0,1;butnottranslate,sodisencouragevo.setConsultCode("C,男,女");//return'0','1'vo.setConsultCode("S,男,女");//return男","女vo.setConsultCode("I,男=4,女=8");//returnvo.setConsultCode("C,男=4,女=8");//return'4','8'vo.setConsultCode("S,男=male,女=female");//return"male","female" //sameeffectas //returni18n(UPP10100-111),i18n(UPP10100-112);disysameasvo.setConsultCode("SF,bd_produce,batchrule");//returnqzsmvo.setConsultCode("IF,bd_produce,batchrule");//returnszqzvo.setConsultCode("CF,bd_produce,batchrule");//returnchar(szqz)vo.setConsultCode("SF,bd_produce,batchrule,zfqz");//returnzfqzvo.setConsultCode("IF,bd_produce,batchrule,zfqz");//returnszqz.Ifirst //returnxh //returnchar(xh) //return2*instrumentsql在没有instrumentsql的情况下得到的sql为table.code=’001’如果我们把instrumentsql为‘selectidfromtablewhere???’sqlselectidfromtablewheretable.code001’(详见专题一i月(i区间i天(i区间本月第一天(1号本周第一天(周一Filtersql语句往往不能完全满足业SQLSQL呢,在讲清楚这个问题之前,1、BasicSql由查询模板生成的单条查询条件为filed_code+operator_code+value,如下sqldate2007-01-01’BasicSqlIFltergetBasicSql()2、CombinedSql本版查询模板对查询条件按照一定条件进行了合并优化,即符合合并FilterFilter是否能够合并,Filterbooleancombinable(IFilterfilter)FilterMeta中instrumentedsql(sql生成,后文详细介绍)Filter认为可合并。Date2007-01-01’andFlag‘Y’这里我们称之为CombinedSql,可以通过 3、最终sql查询模板中一个Filter最终拼到查询条件中的sql。FilterFilter根据业务场景不同,分为三种情况,下面依次对三种情况进MethodBasicSql内推到一段固定的如:BasicSqldate2007-01-sql为pkin(selectfkfromtablewheredate2007-01-(FilterMetainstrumentedsql属性,前文提到)字段值为“pkin(selectfkfromtablewhere???)”用三个问号代替BasicSql。SQLpkin(selectfkfromtablewheredate2007-01-01’)instrumentedsqlDate的instrumentedsql值为pkin(selectfkfromtablewhere???)同样Flag的instrumentedsql值为pkin(selectfkfromtablewhere???),且二者都在并且逻辑符下,则其构造sql过程为。首先生成各自的BasicSqldate=‘2007-01-01’,Flag=‘Y’。因为二者的instrumentedsqlSqldate2007-01-01’ANDFlag‘Y’,sqlinstrumentedsql中的占位符(???)sql:pkin(selectfkfromtablewheredate=‘2007-01-01’ANDFlag=“当然上述过程由查询模板内部机制处理,业务组只需在数据库中辅助查询”的值“BasicSql可整体作为其查询条件中一部分的情MethodFilterFilter的getSqlString()问我们讲了,查询模板提供了机制,其中就可以一个生产FilterEditor的Sql的拼写。下面是示例代码:qcd.registerFilterEditorFactory(newIFilterEditorFactory(){publicqcd.registerFilterEditorFactory(newIFilterEditorFactory(){publicIFilterEditorcreateFilterEditor(IFilterMetameta){ returnnewDefaultFilterEditor(qcd.getQueryContext(),meta){protectedIFiltercreateFilter(FilterMetameta){returnnewDefaultFilter(meta){publicStringgetSqlString(){Stringvaluereturn"realColumnname="+meta.getFieldCode()+"and}}}return 部分就是重写了DefaultFilter的getSqlSring()方法。这里你可以随自己需要写出SQL。当然,你也可以复写DefaultFilter的getBasicSql()方法,配合第 完成自己的sql。还是第一个方 期的例子,在上面的代码中复写returnnewDefaultFilter(meta){publicStringgetSqlString(){Stringvalue=((DefaultFieldValueElement)return"Querycol="+meta.getFieldCode()+"and"}BasicSql为:Querycoldateanddate2007-01-01’,然后后续处理和方法一中BasicSql后处理的方式相同。上述方法适用于查询条件固定,且查询模板默认生成的sql不能整体作为查询条件一部分的情况另外如果该条件需要保存那么filter不能使一个 该filter需要继承DefaultFilter。Methodsqlsql呢?例sql。那么就需要我们前面章节讲到的机制和机制配合来完成了。如果所属公司查询条件为空,那么条件为pkin(selectfkfromTablewherepk_resppsn=‘somebody’而如果所属公司字段值为pk_corp,那么条件为pkin(selectfkfromTablewherepk_resppsn=‘somebody’andclassclassDefFilterextendsDefaultFilter{Stringpk_corp=null;publicDefFilter(FilterMetafm)}publicStringgetPk_corp()return}publicvoidsetPk_corp(Stringpk_corp)this.pk_corp=}publicStringgetSqlString(){Stringcorp=getPk_corp();if(corp!=null)return"pkin(selectfkfromTablewhere"++"andpk_corp='"+corp+}}这里不像方法2中直接在工厂的方法里面定义一个类是因为在后面的代码中Filter的一个实例。qcd.registerFilterEditorFactory(qcd.registerFilterEditorFactory(newIFilterEditorFactory(){publicIFilterEditorcreateFilterEditor(IFilterMetameta){returnnew protectedIFiltercreateFilter(finalFilterMetameta) returnnewDefFilter(meta) }returnStep3:使用响应机制,从编辑界面取到所属公司条件的值,把它set到qcd.registerCriteriaEditorListener(qcd.registerCriteriaEditorListener(newICriteriaChangedListener(){publicvoidcriteriaChanged(CriteriaChangedEventevent){Stringcorp=List<IFilter>filters=event.getCriteriaEditor()for(IFilterfilter:filters){}(ownercorp='0001'ANDpkin(selectfkfromTablewherepk_resppsn=''pk_corp=我们来看一下查询模板都可以哪些且这些时间都对应着查询模板上的那些具体行为。查询模板定义在CriteriaChangedEvent.java中包括: 查询条件的值变化触发该 查询条件被删除触发该 查询条件编辑器初始化,当普通视图和高级filter会弹出编辑器,也会触发该。 逻辑操作符改变,switch高级界面的逻辑操作符会触发该,但是本版暂不支持该。我们只要在查询模板上一个就可以对这些进行处理了坚挺的方式时调用查询框的registerCriteriaEditorListener(ICriteriaChangedListenerlistener)方法。Step1wherepart改变;Step2(wherepartpart)Step3wherepart。前面两个步骤可以在处理所属公司值改变中处置而第三步则需要在采购组织编码条件初始化中处理。Step1(wherepartpartStep2wherepartFilterEditorChangedUtil工具类,该工具类提供了对默认编辑model等。qcd.registerCriteriaEditorListener(newqcd.registerCriteriaEditorListener(newICriteriaChangedListener(){publicvoidcriteriaChanged(CriteriaChangedEventevent){if(event.getCriteriaEditor()instanceofSimpleEditor){SimpleEditorse=(SimpleEditor)event.getCriteriaEditor();List<IFilterEditor>feList=for(IFilterEditorife:feList)DefaultFilterEditordfe=(DefaultFilterEditor)ife;FilterEditorChangedUtil.setRefWherePart(dfe,"1=0");}}List<IFilter>ifList=for(IFilterfilter:ifList){}}}}}}不多,只是FilterEditorChangedUtil.setRefWherePart改为setRefPk;event.getCriteriaEditor().setFilterValue(IFilterfilter,String即可V56查询框加载查询模板的流程图如下VOts字段是判断其是否变化的标识。需要了解有这个功能即可。如果直接在数据库里修改了查询模板的某些属性而没有修改ts值,那么在调试时就需要删除前台缓存了,缓存文件是:息去执行具体的查询操作。老查询模板(QueryCondition)的开发流程详见QCC开 客户端可以根据自己的需要设置查询框以哪种方式展现,这份信息保存 teInfotempinfo=newTem//setotherattributesvalueQueryConditionDLGqcd=newQueryConditionDLG(this,tempinfo);TemteInfo中的queryType属性来记录查询方式,它的取值有值值它们都定义在 te.querytype.IQueryType中,默认值是不支持复杂查询,即查询框没有查询方式页签创建QueryConditionDLG实例之后,就可以根据查询方式设置其他必要的信息了。共BOTH则需要关注全部三份信息。QueryConditionDLGpublicvoidsetPagedSubjects(ISubject[]qcd.setPagedSubjects(qcd.setPagedSubjects(newISubject[]newSubject("store仓库newSubject("dept部门newSubject("cust客商newSubject("psndoc人员设置的供选择项目必须实现nc.vo.querytemte.querytype.ISubject接口,其中项目编码必须能够唯一标识该项目。nc.vo.querytemte.querytype.Subject类是该接口的默认实现,已QueryConditionDLGpublicvoidsetFixedPagedSubjects(ISubject[]qcd.setFixedPagedSubjects(qcd.setFixedPagedSubjects(newISubject[]newSubject("store仓库newSubject("dept部门newSubject("cust客商newSubject("psndoc人员注:供选择的分页项目和固定分页项目对于同一个查询框实例来说,最多只能有QueryConditionDLGpublicvoidsetMaxNumberEnabled(booleanQueryConditionDLGpublicvoidregisterQueryResu efaultName(INameGeneratorgenerator); efaultName( efaultName(newINameGenerator()publicStringgenerate()returnnew}的名称必须实现nc.ui.querytemte.filtereditor.INameGenerator接口该接口publicString程序需要获取这份信息。QueryConditionDLG提供接口获取这份信息:publicQueryTypeInfoQueryTypeInfo对象,QueryTypeInfo中保存了所有的配置信息,客户端程序根据自己的查询方式去感的信息即可。代码示例:ifif(getQCDPaged().showModal()==UIDialog.ID_OK){QueryTypeInfoinfo=getQCDPaged().getQueryTypeInfo();}UITabbedPaneUITabbedPanetabbedPane=IQueryTypeEditoreditor=QueryTypeEditorFactory.create(Stringname=NCLangRes.getInstance().getStrByID("_tem "QueryConditionEditor-000000");/*tabbedPane.insertTab(name,ponent(),name,create(int)该接口提供的ponent()方法用于返回编辑器对应的UI组件,可以被直接加载到外部容器(如QueryCondition)中。IQueryTypeEd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论