EAS-BOS开发问题解决_第1页
EAS-BOS开发问题解决_第2页
EAS-BOS开发问题解决_第3页
EAS-BOS开发问题解决_第4页
EAS-BOS开发问题解决_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

Studio新建的UI发布只能看到抽象类的问题在导入了新的解决方案之后,在二次开发时进行新建UI,进行发布,但是在代码视图中只能看到抽象类,没有其他的代码。对于客户二次开发中用户自定义的单据才生成实现类,但发现BOSStudio新建的ui元数据自定义标记为<userDefined>false</userDefined>,导致在发布时认为不是用户自定义的,因此没生成实现类。需要把ToolCommon插件下(E:\kingdee\bos\BOSModular\boscommon\eclipse\plugins\com.kingdee.bos.toolcommon)的perties这个文件中的isDevelopVersion=true改为:isDevelopVersion=false如何修改UI的父类?如何修改EditUI绑定的实体Entity?点击UI,选择左边浏览方式“大纲”。选择DataObjects的editData(查询对象)设置由自己定义的一个Entity元素据。Java源码会有这样一句话:editData=(com.kingdee.eas.fi.fi_cs.CsAccountViewInfo)ov;其中CsAccountViewInfo是自己定义的一个Entity。而com.kingdee.eas.fi.fi_cs则是他的路径。如何修改ListUI绑定的查询Query?解决:点击UI,选择左边浏览方式“大纲”。选择DataObjects的mainQuery(查询对象)设置由自己定义的一个Query元素据。Java源码会有这样一句话:mainQueryPK=newMetaDataPK("com.kingdee.eas.fi.fi_cs.app","CsAccountViewQuery");其中CsAccountViewQuery是自己定义的一个Query。而com.kingdee.eas.fi.fi_cs.app则是他的路径。将一个元数据从一个文件夹直接拉到另外一个文件夹,打开文件的时候会报错误com.kingdee.bos.engine.MDParseError解决:把元数据从一个文件夹移到另一个文件夹不能直接拉。需要用复制功能,并且只能够在EAS-BOS的工作透视图下。如果在其他视图下进行操作,将无法复原。导出sql的时候CreateTable.sql无法创建table,oracle和sqlserver定义的类型有什么不一致原因:导出数据表会自动生成一些脚本,但是选择oracle时,实际导出的却是sqlserver的脚本。导出有问题,oracle和sqlserver导出的都是sqlserver的脚本。解决:认清oracle和sqlserver定义的类型有什么不一致。Oracle的Date等同于sqlserver的DateTime,nvarchar2等同于sqlserver的nvarchar。Varchar2等同于sqlserver的.kingdee.bos.metadata.MetaDataNotFoundException:CannotfoundmetadataBOSType[null]原因:没有重写ListUI的getBizInterface()方法。解决:一定要重新实现ListUI和EditUI的getBizInterface()方法,重新实现ListUI的getBizInterface()方法问题解决。keyFiled没有设置,请重写getFiledName()方法。解决:在设置query元数据的时候没有配置好主键,一定要设置主键无法实现字段排序解决:在*UI.java文件上面添加方法protectedvoidtblMain_tableClicked(KDTMouseEvente)throwsException{ //覆盖原方法 super.tblMain_tableClicked(e);}该方法会实现父类的排序功能。备注:tblMain_tableClicked是指双击的事件。一般用在查询页面。还有一个tblMain_tableSelectChanged是指点击时触发的事件。日志操作写错:指标录入(分配)审核写成了指标录入(分配)修改。原因:审核,反审核的操作最后都执行了修改的操作。所以就将日志文件改成了修改。而不是审核或者反审核。分析:日志操作一般在.log文件上面做修改。比如说这个问题。日志文件为指标管理属于集中支付模块,gov_biz.log在这个模块的源文件下面gov/biz/。一般添加日志在.log文件的日志项。选择某个目录,为其添加日志项,组名,别名都需要每一层每一层写清楚(这会自动默认上下级关系)。接着选定引用对象,(有两种对象:引用对象和功能对象)。功能对象还不是很了解,引用对象是一个实体。接着选定某些引用方法,意思就是这些方法触发的时候写入日志。另外还有一个方法写入日志。直接在某个按钮操作调用写日志方法。该方法在GovBasedataUtils是基础数据管理公用函数及接口。方法名为setOperLog,该方法有两个,具备不同的参数。选择所需要的方法调用。备注:针对这个bug需要注意一个空指针的问题,如果直接调用父类的actionPassAudit_actionPerforme的方法,会出现这个问题。原因是有refresh(e)方法进行刷新。所以不能调用父类的方法,自己重写。修改完日志的时候,还需要在文件菜单中同步一下日志项数据。setOperLog方法是写log进入操作对象这个字段。而不是写入操作这个字段。这点需要注意。进入基础资料关联管理进行修改,删除的时候,日志操作出现字符串,没有正确显示操作对象分析:首先检查日志有没有出错,没有出错的话可在java文件中进行修改。因为是删除和修改操作,所以我们可以重写父类的删除修改操作,添加一个写日志的操作。解决:首先找到该Java文件:GovBaseDocBizRefListUI.java。重写actionEdit_actionPerformed和actionRemove_actionPerformed方法。(GovBaseDocBizRefInfo)getBizInterface().getValue(newObjectUuidPK(keyValue),getSelectorItemCols())是用来得到自己定义的对象这里是GovBaseDocBizRefInfo。而该对象的数据则用getSelectorItemCols()方法来获取。最后则是自己定义的写log的方法。在改bug的过程中,还出现一个问题,就是写日志操作必须在修改和删除操作之前执行,否则会出现一些意外问题,比如说写日志写的不是当前选择的数据,而是选择第一条数据。还有就是出现删除操作提示记录找不到。这都是因为把写日志操作放在了修改和删除操作之后导致的。原因是如果是修改操作后返回的是第一条数据,修改完自然写的就是第一条数据的日志了。如果先删除再写日志的话肯定得不到对象,因为被先删除了,所以会出现提示。无法启动debugserver.bat,debugserver窗口自动关闭。解决:到W:\apusic\domains\server1路径下将server.xml文件删除即可解决。Oraclesql语句报错:“未明确定义列”解决:在表关联中出现了相同的字段名字,给与一个别名就可以解决。如何在java文件中添加一个F7控件备注:由于不允许在标准产品上面添加控件,所以只能够在java上面添加。解决:可参考F7业务控件指南(KDBizPromptBox)使用指南。在这里只写上一些基础配置。一般使用F7都给包含在一个KDLabelContainer控件里面。创建一个KDLabelContainer控件this.borrowContain=newcom.kingdee.bos.ctrl.swing.KDLabelContainer();创建一个KDBizPromptBox控件this.borrowBox=newcom.kingdee.bos.ctrl.extendcontrols.KDBizPromptBox();将KDBizPromptBox附在KDLabelContainer上面。borrowContain.setBoundEditor(borrowBox);设置一个弹出窗口FilterInfofilter=newFilterInfo();FilterItemCollectionfic=filter.getFilterItems();fic.add(newFilterItemInfo("CU.id",company.getCU().getId().toString()));fic.add(newFilterItemInfo("CAA.id",null,CompareType.NOTEQUALS));filter.setMaskString("#0and#1");AccountPromptBoxapb=newAccountPromptBox(this,company.getAccountTable(),filter);设置一些属性。设置borrowBox为可编辑this.borrowBox.setEditable(true);设置borrowBox的编辑格式this.borrowBox.setEditFormat("$number$");设置borrowBox的显示格式this.borrowBox.setCommitFormat("$helpCode$;$number$;$name$");设置borrowBox的提交格式this.borrowBox.setDisplayFormat("$number$-$name$");设置borrowBox的查询对象this.borrowBox.setQueryInfo("com.kingdee.eas.basedata.master.account.app.F7AccountViewQuery");设置borrowBox的弹出窗口this.borrowBox.setSelector(apb);在查询页面上保存一个方案的时候是如何得到页面上各个控件的值。解决:由于保存一个查询方案的时候是由QueryToolBar类中的saveButton_actionPerformed方法执行的。而该方法又通过调用getCustomerParams()方法来获得界面上各个控件的值。如果控件是通过java文件上添加的,就是不是在标准产品上面改的,所以必须在getCustomerParams()方法中设置调用setObject()方法进行设置。例子:Debitvalue为一个引用。RptParamsparams=super.getCustomerParams();params.setObject(debitvalue,debitBox.getValue()==null?"":debitBox.getValue());无法显示一个控件的值。解决:虽然上面的一个问题可以保存控件的值,但是要让控件保存的值显示出来,还需要添加一个方法setCustomerParams()方法,将控件的值设置进去。例子: if(params.getObjectElement(debitvalue)!=null){ debitBox.setValue(params.getObjectElement(debitvalue)); }如何在页面显示时间格式,金钱格式解决:在UI的编辑表信息那里选择:时间的字段,然后在formatString填入“%r{yyyy-M-d}t”这个是显示年月日的。依次类推。金钱格式为#,###.00在UI上面添加一个KDLable,会出现跟前面的控件重叠解决:设置KDLable的constrain中的anchor,看来这个是重要的属性。EAS的查询是如何实现的解决:(例子)protectedbooleanisHasAttachMent(Stringbosid)throwsException{CoreBaseCollectionass=(CoreBaseCollection)BoAttchAssoFactory .getRemoteInstance().getCollection("selectFAttachmentID"+ "whereboid='"+bosid+"'"); if(ass!=null&&ass.size()>0) returntrue; returnfalse;}解析:该例子很简单,但是不知道的人确实非常困惑。现在说明一下。首先应该是BoAttchAssoFactory这个类,每一个实体都有一个factory这个类。这个例子的实体就是BoAttchAsso。这个factory类提供了一个远程的接口获取对象。CoreBaseCollection则是将这个对象包装起来。对象里面的内容就是根据里面的sql得出来的。注意该sql是用实体来查询的。不是数据库sql。FAttachmentID,boid都是BoAttchAsso实体里面的属性。这个例子总的就是说去实体里面找数据然后返回一个对象。给实体新增了一个属性,如何获取该实体这个属性的值解决:给实体新增了一个属性,发布后都会在以Abstract开头的info类中产生get,set方法。比如给实体BgAdjustBill新增了一个属性isNeedOrNotAttachment,发布后会在AbstractBgAdjustBillInfo类中产生这两个方法。publicbooleanisIsNeedOrNotAttachment(){returngetBoolean("isNeedOrNotAttachment");}publicvoidsetIsNeedOrNotAttachment(booleanitem){setBoolean("isNeedOrNotAttachment",item);}就采用editData.isIsNeedOrNotAttachment()方法获得属性的值。editData是在list页面传到edit页面上的对象,想要获取对象的值都可以通过editData。Edit页面的数据如何保存解决:采用数据绑定。在Edit的UI界面选择数据绑定。例子:在edit和list页面分别有两个checkbox控件。想要让他们关联起来。在edit的ui页面上选择数据绑定,选中要绑定的checkbox控件,由于是checkbox,所以是个bollean型的,选择其selected功能,再选择下一步绑定实体的属性。这样子就关联上了。点击保存的时候会将其保存。弹出提示窗口的信息如何设置解决:MsgBox.showWarning(this,EASResource.getString( BgAdjustBillHelper.RESOURCESTR, "mustBeSameOrg")其中mustBeSameOrg为资源文件.resource定义的名称。如何融合行。变成如下的形式现在的形式是如下。解决:privatevoidsetMergeColumn(booleanmerge){ //增加对于单据头的表格融合设置 StringmergeColumnKeys[]=getMergeColumnKeys(); if(mergeColumnKeys!=null&&mergeColumnKeys.length>0){ tblMain.checkParsed();//指定KDTable要进行数据分组 tblMain.getGroupManager().setGroup(merge); for(inti=0;i<mergeColumnKeys.length;i++){//指明要对列进行分组 tblMain.getColumn(mergeColumnKeys[i]).setGroup(merge);//指明要对列的分组进行单元融合 tblMain.getColumn(mergeColumnKeys[i]).setMergeable(merge); //有些时候会因为刷新然后没有重新排序,所以就要写下面这一句。tblMain.getGroupManager().group(); } } } //返回需要融合的列 publicString[]getMergeColumnKeys(){//columnKeys数组是UI上面显示的字段名称,具体要融合哪些列,可以在table右键选择编辑表信息。里面有各个字段的名称。这里的字段还要按照顺序来排列,不允许中间有一个字段没有写进来,可以从编辑表信息里面查找,中间如果漏写了一个会没有效果,意思就是必须得按照顺序来排列。 String[]columnKeys={"id","createTime","number", "bgS","state","","", "lastUpdateTime","attachment","bizDate"}; returncolumnKeys; }在每次执行查询后调用setMergeColumn(true)这个方法就行了。如何添加功能快捷键?解决:this.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put( KeyStroke.getKeyStroke("ctrlN"),"actionAddNew");其中actionAddNew就是function。2008-10-20问题:如何添加一个参数子系统树节点和参数?解决:参数子系统树节点可以通过直接修改xml文件来添加。标准产品的xml文件为:SubSystem.xml。政府行业新增加的文件为:SubSystem_industry.xml。新增一个子系统数节点可以参考文章。添加一个子节点的xml(例子)<rowfullname="com.kingdee.eas.ma.budget"name="budget"alias_l1="budget"alias_l2="政府预算"alias_l3="政府預算"isleaf="1"parent=""/>其中fullname为包名。Parent表示父级目录的包名。isLeaf表示目录的层次。添加完之后,必需停止服务,并且在控制管理台那里的工具选项选择产生子系统树。这个步骤最好在服务器上面做,本地运行产生子系统树貌似会出错。在服务器上面操作时,需要将eas\server\metas\mdbview-metas.jar覆盖本地的所有这个包。完成后重起服务,进入系统平台->系统配置->参数设置。这时候会发现还没有出现刚才产生的节点。由于如果节点下面没有任何参数的话,此节点是不会显示的。现在为节点添加参数。选中任意一个节点,按F12,会弹出一个参数对话框,可以在这个对话框添加,修改,删除参数。选中刚才的节点:政府预算。新增一个参数。新增参数需要了解一点:组织类型非常重要,如果该节点的组织类型与所要添加参数的组织类型不一致,该参数将不会在参数设置页面里面显示,因为参数设置页面只是显示与节点的组织类型相同的参数,其它则不显示。如果要想添加一个不同的组织类型的参数,则需要重新添加一个节点,将节点的类型设置为要添加参数的组织类型。然后再新增加参数,总结起来就是说参数的组织类型要与节点的组织类型一致才可以在参数设置页面显示出来。设置节点的组织类型的方法如下:找到W:\eas\Server\server\lib\client\eas\bs-param-client.jar这个包,双击进入找到com\kingdee\eas\base\param\client\subSysIdToOrgTypeMaps.xml这个文件。添加的xml为:<attributekey="com.kingdee.eas.ma.budget"value="CostCenter"/>这句话的意思就是将上面添加的政府预算的节点的组织类型设置为预算组织。Key对应fullname,value="CostCenter"的意思为设置组织类型为预算组织。想要查找有哪些组织类型,可以参考OrgType.enum。名称为value的可选值。参数添加成功之后,需要导出参数的sql脚本。路径如下:系统平台-->预警平台-->预警条目设置-->按F11,选择参数导出,输入参数的编码。如何获取“下次直接进入的方案”中自定义页签的过滤条件。解决:entityViewInfoTmp=(EntityViewInfo)iQuery.getDefaultFilterInfo(getQuerySolutionUIName(),queryName);QuerySolutionInfosolution=iQuery.getDefaultSolution(getQuerySolutionUIName(),queryName);如何给窗口添加最大化,最小化按钮?分析:当点击一个按钮的时候,会弹出一个窗口,窗口可以有五种类型:分别是FIXTAB,NEWTAB,NEWWIN,NEWSESSION,MODEL。FIXTAB的意思是弹出的窗口会替换掉原来在Tab上面的那个窗口。NEWTAB的意思是在Tab上面新增加一个弹出窗口。NEWWIN的意思是在页面中间弹出一个窗口,NEWSESSION的意思是在Tab上面弹出一个窗口,替代掉原来的窗口,并且重新刷新一下。MODEL的意思是在页面中间弹出一个窗口,没有最大化,最小化按钮。解决:点击按钮的会弹出一个窗口,代码如下。uiWindow=UIFactory.createUIFactory(UIFactoryName.NEWWIN).create(CmpSummaryReportUI.class.getName(),uiContext,null,OprtState.VIEW);uiWindow.show();从蓝色部分可以看出产生窗口的类型,这是一个在页面中间弹出的窗口,包含有最大化最小化按钮。另外可以查看对应的窗体是哪个。找到UIFactoryName.Java里面配置好了上面五种类型的窗口。还有更深入的功能则是可以在这些窗口上面显示菜单栏,工具栏等。则是通过WinStyle.java来配置。一共有八种类型,分别设置八种类型的值进去看可以得到不同的效果。另外可以不用上面的代码。uiWindow=UIFactory.createUIFactory(UIFactoryName.NEWWIN).create(CmpSummaryReportUI.class.getName(),uiContext,null,OprtState.VIEW,WinStyle.SHOW_MENUBAR);uiWindow.show();直接在create方法增加多一个类型参数。就可以看到效果了,EAS默认的是WinStyle.SHOW_MENUBAR或者WinStyle.SHOW_STATUSBAR。如何默认最大化窗口?解决:(例子)if(windowinstanceofKDFrame){//最大化 ((KDFrame)window).setExtendedState(KDFrame.MAXIMIZED_BOTH);}elseif(windowinstanceofDialog){ ((Dialog)window).setSize(Toolkit.getDefaultToolkit().getScreenSize()); }执行脚本的时候报“ORA-01843无效的月份”的错误。解决:{ts'2008-05-1214:59:14'}。在EAS下面插入时间需要这样子格式。如何去掉键盘的上,下键对kdtable的上下移动操作解决:在onload中加入以下2行代码即可.//屏蔽键盘的上下键对表格记录上下移动操作--[core] tblMain.getActionMap().put(KDTAction.SELECT_DOWN_CELL,null); tblMain.getActionMap().put(KDTAction.SELECT_UP_CELL,null);如何获得鼠标右键的那些按钮。解决:KDTMenuManagertm=getMenuManager(this.tblMain);KDPopupMenumenu=tm.getMenu();Component[]components=menu.getComponents();如何屏蔽鼠标右键的按钮解决:privatevoidhideTableSet(){ //TODO自动生成方法存根 KDPopupMenukdmenu=newKDPopupMenu(); KDTMenuManagertm=getMenuManager(kdtEntry); KDPopupMenumenu=tm.getMenu(); Component[]components=menu.getComponents(); ListhideMenusName=newArrayList(); hideMenusName.add("tableSetting"); hideMenusName.add("saveSetting"); hideMenusName.add("restoreSetting"); hideMenusName.add("deleteSetting"); if(null!=components&&components.length>0) for(inti=0;i<components.length;i++){ Componentc=components[i]; if(cinstanceofKDSeparator) kdmenu.add(c); if(cinstanceofJMenuItem){ JMenuItemmenuItem=(JMenuItem)c; if(!hideMenusName.contains(menuItem.getName())) kdmenu.add(c); } } tm.setMenu(kdmenu); } publicvoidonShow()throwsException{ super.onShow(); hideTableSet();}还有hideTableSet方法一定要写在onShow里面。如何针对一个cell设置一个弹出F7对话框?解决:FileChooserPromptBoxnf7=newFileChooserPromptBox(this,FileChooserPromptBox.CHOOSERTYPE_OPEN); nf7.setDisplayFormat("$name$"); nf7.setEditable(true); KDTDefaultCellEditorcellEditorPath=newKDTDefaultCellEditor(nf7); this.tblMain.getColumn(TB_FILEPATH).setEditor(cellEditorPath);FileChooserPromptBox是一个特别的F7,没有办法在UI上面进行拖拉,可以直接产生。以上是在一个单元格里面设置还有另外一种是:kDLabelContainer.setBoundEditor(nf7);放在容器kDLabelContainer里面。在服务端获得info的写法解决:BgAdjustBillInfoadjustBillInfo=(BgAdjustBillInfo)this._getValue(ctx,pk);在通用查询窗口点击确定的时候如何验证页面上的一些条件?解决:实现verify()方法。该方法会在点击确定的时候进行一些验证。弹出保存文件对话框代码解决:KDFileChooserm_chooserSave=newKDFileChooser(); m_chooserSave.setFileFilter(newExcelFileFilter()); intresult=m_chooserSave.showSaveDialog(this); if(result!=KDFileChooser.APPROVE_OPTION) return; Filef=m_chooserSave.getSelectedFile(); //appendToExcel(f.getAbsolutePath()+f.getName()+".xls",true,true,getUITitle()); //appendToTxt(f.getAbsolutePath()+".txt"); StringfileName=""; if(f.getAbsolutePath().endsWith(".txt")){ fileName=f.getAbsolutePath(); }else{ fileName=f.getAbsolutePath()+".txt"; } if(f.exists()) { if(MsgBox.showConfirm2(EASResource.getString(OrgInnerUtils.strResource+"FILE_IS_EXIST"))!=0){ return; } } appendToTxt(fileName,false); MsgBox.showInfo(EASResource.getString(ExportTxtResourceURL+"EXPORT_TXT_SUCC")+fileName);如何导出TXT文本?分析:建立一个FileOutputStream。解决:publicvoidappendToTxt(StringfileName,StringstrTxt){ FileOutputStreamfos=null; try{ fos=newFileOutputStream(fileName); fos.write(strTxt.getBytes()); }catch(IOExceptione){} finally{ try{ fos.close(); }catch(IOExceptione1){} } }strTxt是需要导出的txt字符串。fileName是导出路径。如何让一个UI有自定义查询?分析:该图显示的是一个弹出对话框CommonQueryDialog。其中条件页签是自己定义的一个UI。解决:自定义是一个页签(框架的功能实现),要实现自定义页签必须让UI继承类monquery.client.CustomerQueryPanel。在实例化一个CommonQueryDialog的时候,首先将UI封装进CommonQueryDialog对象里面。protectedCommonQueryDialoginitMessageExportDialog(UIContextuicontext)throwsException{dialog=newCommonQueryDialog();//实例化MetaDataPKmainQueryPK=newMetaDataPK(".stdextend","GovPersonSimpleHelpQuery");//用于在自定义页签实现字段过滤功能if(this.getUIWindow()==null){dialog.setOwner((Component)getUIContext().get(UIContext.OWNERWINDOW));}else{dialog.setOwner(this);}dialog.setUiObject(this);dialog.setParentUIClassName(this.getClass().getName());dialog.addUserPanel(getMessageExportUserPanel(uicontext));//将UI封装进CommonQueryDialog对象里面。dialog.setShowToolbar(false);//是否显示工具条,默认方案等。dialog.setShowFilter(true);//显示自定义查询页签dialog.setQueryObjectPK(mainQueryPK);//将自定义过滤功能封装进来dialog.setTitle("短信数据导出");//设置探出框的title。dialog.setWidth(550);dialog.setHeight(300);returndialog;}具体更多的设置可以参考CommonQueryDialog这个类。如何从CommonQueryDialog得到自定义UI。解决:publicvoidactionTxtExport_actionPerformed(ActionEvente)throwsException{dialog=initMessageExportDialog(uiContext);if(dialog.show())//弹出对话框出现的时候,代码运行停留在这一行。当点击确定的时候将继续运行。{tHelper.setDialog(dialog);GovHrMessageExportUIgovHrMessageExportUI=(GovHrMessageExportUI)dialog.getUserPanel(0);用这种方式得到自定义UI。得到了UI,相当于实例化了这样的一个类,还可以得到类的方法。Stringpath=govHrMessageExportUI.getPath();//getPath()是定义在GovHrMessageExportUI中的方法。} }如何实现一个弹出保存对话框。GovFileChooserPromptBox prmtRoad=newGovFileChooserPromptBox(this,GovFileChooserPromptBox.CHOOSERTYPE_TXT); //GovFileChooserPromptBox是自已定义的一个保存弹出框,可以找到该类进行参考。里面有一个保存样式设置的。可以保存为什么类型的文件。 prmtRoad.setDisplayFormat("$name$");//设置显示格式 prmtRoad.setEditable(false);//设置是否可以输入,false的话只能够通过点击F7进入。如何在弹出的对话框点击确定后进行验证。解决:在UI实现,UI是封装进入对话框的UI。dialog.addUserPanel(UI);publicbooleanverify(){}如何设置一个监听事件,在切换单元格的时候进行一些动作。解决: privatevoidsetMoneySumAction(){ kdtBgDetail.addKDTEditListener(newKDTEditAdapter(){ publicvoideditStopped(KDTEditEvente){ //当光标移出单元格的时候触发事件 …… } }); }将setMoneySumAction方法设置在ONLOAD中。如何判断单击了列头。解决:protectedvoidorderByClickTableHead(KDTMouseEvente)throwsException{if(e.getType()==KDTStyleConstants.HEAD_ROW &&e.getButton()==MouseEvent.BUTTON1&&e.getClickCount()==1){……}如何实现排序。如何默认进入一个ListUI实现按照某个字段进行排序解决:如何实现排序参考EmployeeMutiF7UIGov.java。进入ListUI的时候默认排序可以重写父类的initDefaultFilter()方法。该方法会在进入页面的时候进行调用。设定过滤可以这样子:if(mainQuery==null) mainQuery=newEntityViewInfo(); FilterInfofilterInfo=newFilterInfo();//实例化一个过滤对象。 filterInfo.getFilterItems().add(newFilterItemInfo("isDelete",newInteger(0)));//添加过滤条件isDelete=0; filterInfo.getFilterItems().add(newFilterItemInfo("enable",newInteger(StateEnum.DISABLE_VALUE),CompareType.NOTEQUALS));//添加过滤条件enable!=枚举StateEnum的DISABLE_VALUE值。 filterInfo.setMaskString("#0and#1");//将刚才两个条件设置进去。其中#0代表isDelete的过滤,#1代表enable的过滤。 this.mainQuery.setFilter(filterInfo);//最后将对象设进EntityViewInfo,做了封装了。有一点需要注意的是首先要找到Query,因为isDelete,enable是Query的属性,而不是代表表里的字段。设定排序是这样子的: SorterItemInfosorterOrderItem1=newSorterItemInfo("enable");//实例化一个排序对象 sorterOrderItem1.setSortType(SortType.ASCEND);//设置排序类型 mainQuery.getSorter().add(sorterOrderItem1);//添加进入EntityViewInfo对象的Sorter的属性中。如何初始化一个Tree?解决:例子protectedvoidinitTree()throwsException{GovHrSchemeSetCollectionschemeSet=GovHrSchemeSetFactory.getRemoteInstance().getGovHrSchemeSetCollection( "select*,schemeSetEntry.cmpScheme.*,schemeSetEntry.*wherehrOrgUnit.id='"+HRSchemeUtils.getClientHROrgUnitInfo().getId().toString()+"'orderbynumberasc");//获取集合对象。 treeMain.setModel(newDefaultTreeModel(bulitTree(schemeSet)));//创建树,bulitTree(schemeSet)必须是TreeNode对象,包含了所有各级的节点。 }protectedTreeNodebulitTree(GovHrSchemeSetCollectionsrc){ KDTreeNoderesult=newKDTreeNode("薪酬方案组合");//创建一个节点,处于最上层。 for(inti=0;i<src.size();i++){ KDTreeNodetn=newKDTreeNode(src.get(i)); if(src.get(i).getSchemeSetEntry().size()>0){//判断是否有分录对象,有的话还要再创建子节点。 for(intj=0;j<src.get(i).getSchemeSetEntry().size();j++){ KDTreeNodeleaf=newKDTreeNode(src.get(i).getSchemeSetEntry().get(j));//将一个对象设置为一个节点,该节点就是一个GovHrSchemeSetEntry对象。 tn.add(leaf); } } result.add(tn); } returnresult; }循环创建节点的方法:protectedKDTreeNodebulitTree(TreeNodesrc){ if(src==null){ returnnull; } KDTreeNoderesult=newKDTreeNode(((DefaultKingdeeTreeNode)src).getUserObject()); for(intchildren=0;children<src.getChildCount();children++){ TreeNodetn=(TreeNode)src.getChildAt(children); if(!tn.isLeaf()){ result.add((KDTreeNode)bulitTree(tn)); }else{ result.add(newKDTreeNode(((DefaultKingdeeTreeNode)tn).getUserObject())); } } returnresult; }用户没有分配到某个操作的权限,但是却可以直接操作,权限设置无效。解决:权限项设置要与按钮的Action直接关联。会出现上面的问题是因为(举例说明)ActionA调用了ActionB,然后在写引用属性的时候直接把方法B给写上了,没有用ActionA,然后就出现了那个问题。ActionB不是按钮的直接触发Action。要直接写上按钮的Action。如何加监听?解决:示例代码this.tblMain.addKDTSelectListener(newcom.kingdee.bos.ctrl.kdf.table.event.KDTSelectListener(){publicvoidtableSelectChanged(com.kingdee.bos.ctrl.kdf.table.event.KDTSelectEvente){try{tblMain_tableSelectChanged(e);}catch(Exceptionexc){handUIException(exc);}finally{}}});触发监听事件是在KDTSelectManager类中的fireTableSelectChanged方法,可以看到一共触发了多少个监听器。2008-12-18问题:工作流无法跑通分析:跟踪了代码发现在WfBizEventListener类中executeAfter方法里面的代码StringboId=EventUtils.getBoPK(eventInfo.getEventMethods().get(operationPK.toString()),args);取得的boId为空,使工作流无法走通。解决:这是BOS工作流的一个bug,需要在实体里面上设置这里的业务对象主键的id为空。在<event>属性上找到对应方法<name>reqSubmit</name>下面的isBOPK属性置为true。如何在消息中心可以批量处理单据?解决:在对应的实体对象中需要设置一下扩展属性ListUI,将对应的ListUI配置进去。2008-12-19问题:工作流批量处理报错java.lang.NullPointerException:nullat:com.kingdee.eas.base.multiapprove.client.MultiApproveListUI.onLoad(MultiApproveListUI.java:299)分析:跟踪代码,发现StringfstBoId=((AssignmentInfo)approveAssignInfos.get(0)).getBizObjectIds();这里的fstBoId为空,导致空指针错误。解决:没有在工作流环境中的提交节点进行配置,没有正确生成单据。正确配置如下:进行设置后,将会在提交到工作流的时候正确生成单据。只有在工作流环境中重新正确配置提交节点的任务之后才会生效,对之前错误的单据没有影响,需要重新进行操作流程新增-〉提交,新的单据不会报错。2008-12-19问题:重新定义了实体事件,在工作流环境中无法找到。分析:已经打上补丁并且生成了子系统树,但是还是无法在工作流环境中找到。解决:需要将工作流环境重启,即使重新连接登陆都不能够刷新的,只有将环境重启了才行。(郁闷)2008-12-20问题:如何判断该单据已经处在工作流中。解决:在Context中有这个属性。用这个判断this.getUIContext().get("isFromWorkflow")。2008-12-21问题:消息中心打回修改重新提交的时候报“已在工作流处理中,当前任务或执行人不匹配”解决:一般是实体或者功能配置错误,查看对应的处理事件。这个错误是因为在参数与映射中对应的事件参数没有设置进去。修改后即可。如何获得所需的对象?包括过滤,获取指定的某些关联对象。解决:一个对象里面可能有些属性关联到其他的对象,可以通过以下写法获得。(注释文字为自己理解,并非标准)EntityViewInfoviewInfo=newEntityViewInfo();//建立一个实体封装对象。 FilterInfofi=newFilterInfo();//建立一个过滤对象。 fi.getFilterItems().add(newFilterItemInfo("contractId",contractIds));//设置过滤条件为contractId这个字段的值等于contractIds。 viewInfo.setFilter(fi);SelectorItemCollectionsic=newSelectorItemCollection();//建立一个选择器。 sic.add(newSelectorItemInfo("*"));//实体本身的所有属性。 sic.add(newSelectorItemInfo("entrys.*"));//entrys为对应实体的属性,意思是获得关联对象entrys的所有属性。 sic.add(newSelectorItemInfo("entrys.paymentBill.*"));paymentBill为entrys的属性。viewInfo.setSelector(sic);payRequestBillCols=PayRequestBillFactory.getRemoteInstance().getPayRequestBillCollection(viewInfo)备注:BudgetInfoinfo=budget.getBudgetInfo(arrayPK[i]); SelectorItemCollectionsic=newSelectorItemCollection(); sic.add(newSelectorItemInfo("*")); sic.add(newSelectorItemInfo("yearProject.*")); sic.add(newSelectorItemInfo("yearPject.*")); sic.add(newSelectorItemInfo("pRIDetail.*")); BudgetInfoinfo2=budget.getBudgetInfo(arrayPK[i],sic);Info与info2的不同之处在于,info会拿出所有关联的对象,而info2只会拿出所指定的某些关联对象。2008-12-30问题:鼠标右键没有选项,添加导入导出等选项。解决:关键在于onShow方法。在重写onShow方法的时候要super一下。还有就是右键按钮的加载在于CoreUI类的initUserConfig方法,会初始化表格设置。而这个方法只在onShow方法中调用。备注:如果要自己添加导入导出选项的时候,需要做以下操作。enableExportExcel(kdtPaymentDetail);checkTableCommonMenu(kdtPaymentDetail);这两句代码是设置导入导出功能是否要实现,并且检查右键的有效性。kdtPaymentDetail则为KDTable。其实还有另外一个实现方法,就是在页面上重写getTableForCommon(),返回一个KDTable就行了。客户端和服务端获取当前组织?解决:客户端:mon.client.SysContext用法:SysContext.getSysContext().getCurrentXXX();服务器端:com.kingdee.eas.util.app.ContextUtil用法:ContextUtil.getCurrentXXX(Contextctx)当前组织的方法为getCurrentCtrlUnit();如何获取当前页面元数据?解决:IMetaDataLoaderloader=MetaDataLoaderFactory.getRemoteMetaDataLoader();EntityObjectInfoentityInfo=loader.getEntity(newMetaDataPK(ProcessDocumentRuleEditUI.class.getName()));【如何实现导入导出功能?】解决:(实现非树形页面的导入导出)Step1.实现导入导出,必须在其ListUI页面实现getExportParam和getImportParam方法,返回一个ArrayList,在其里面有一个DatataskParameter对象,该对象包含了导入导出的方式datataskMode,有两种DatataskMode.ExpMode或者DatataskMode.ImpMode;说明alias“过程文档规则”和解决方案solutionName“ProcessDocumentRule”,这两个会出现在xls表格里面。如图:对象的setContextParam()方法可以设置一些数据然后从服务端得到。具体可参考(ProcessDocumentRuleListUI.java)。Step2.用administrator登陆,在系统平台->引入引出管理->引入引出模板管理,点击维护自定义模板,选择新增模板,填写基本信息,进行字段设置。字段设置有规定,如果是非树形的,则用编码,是树形的则用长编码。(具体这个我觉得可以看对应的实体的属性列表中是否包含有TreeBase这个对象,有的话就要用长编码,没有的话就用编码,还有一点就是实体里面有关联属性的,要看关联属性对应的实体来决定长编码或者编码)除了这个还要设置实现类的名称,导入导出都会调用该类实现。新增完之后,导出该模板根据具体细节进行修改,删除掉刚才创建的模板,进入模板编辑在文件上面选择新增,引入模板。重新填写一些信息,保存模板就OK了。Step3.编写导入导出实现类(参考ProcessDocumentRuleImport.java)该类继承了AbstractDataTransmission,具体说明如下:有两个变量,ALL_FIELDS是在模板设置的各个字段名称,All_OBJS指的字段对应实体的属性。还有必须实现方法transmit和getController,可以在transmit方法中进行数据的验证,验证成功后会转化为一个CoreBaseInfo。getController方法则返回一个工厂处理类。exportTransmit方法实现的是导出数据。getExportQueryInfo方法则是返回一个字符串,在进行数据导出的时候会去找对应的Query进行数据查询。具体参考如何查询执行的SQL,跟踪每个序时簿页面执行的SQL。解决:跟踪VirtualModeDataAccess这个类的getRowSetBySeqTable方法。2009-1-15问题:如何设置多级审批页面?备注:在实体里面有一个扩展属性“序时簿UI的类名”,如果设置了某个listUI的话,在消息中心进行多级审批就能够显示指定的listUI,适用于单个实体被单个页面使用,但是当改实体被多个页面引用的时候,而多个页面都有审批的话,这里就不适用了。(不确定的一点就是如果有botp转换的话也是用这个listUI设置,两个需要的listUI不一致,会产生有冲突,最好还是不要这样子设置)比如说budget.entity被多个页面“一上建议数”,“一上审核”,“二上编制”,“二下审核”共用。解决:实体还有另一个扩展属性:“多级审批特定Query”,在这里设置进listUI使用到的Query。在消息中心多级审批就会显示Query查询的结果。对于某些字段的显示样式也可以通过Query的扩展属性来设置。比如说要设置金额的显示样式,需要选中金额字段,选择扩展属性:“F7或简单实体的显示格式”,设置显示格式:“#0.00”,这样子就会在页面上显示金额的样式,无须在java类里面设置某个字段的样式,非常方便。还有一点就是设置扩展属性“是否在KDTable显示”如何对Query中的String类型的字段进行排序?分析:在实体budgetQuery中的SUMSCOREPRIVALUE字段是String,对其进行排列是无效的。

解决:在该字段的计算式中输入:convert(int,#0),会在SQL里面将其转换为CONVERT(int,"BUDGET".FSumScorePriValue)AS"SUMSCOREPRIVALUE"然后再进行排序设置。2009-2-4问题:工作流中如何设置会审功能?分析:会审就是需要有多人审批一个单据才行。解决:在任务一栏中的是否支持会签打钩。就能够支持会审功能了。会审功能有两个选项:一票否决和全部投票。一票否决的意思是指“一个人不同意”,则活动到此结束,并且审批结果为不同意。如果这时还有其他审批人未处理,该活动也结束了。全部投票指的是根据票数的多少决定(该功能有待验证)自定义页签过滤条件多增加了几个字段,在绑定的Query里面找不到。解决:在QueryMetaUtil.java中实现了一个功能,就是可以追加Query,可以在不改动原Query的情况下增加多一个新的Query,给自定义页签的过滤条件添加多新的Query的字段。在二维数组String[][]mergeQuery中添加多一组数据,数组内容:源query,合并用query,源query主实体关联字段,合并用query主实体关联字段。如何获得自定义条件?解决:EntityViewInfofilterEntityInfoGol=dialog.getEntityViewInfoResult();filterEntityInfoGol是根据Query来定义的字段获得的,字段的名称=所选条件。如下图:2009-2-10问题:登陆时报找不到intEnum这个类。解决:读取class文件路径没有问题,构建路径也没有问题。最后检查W:\eas\Server\server\bin\server.pl中my$classpath="E:/530_540work/EAS530_GOV/classes;";配置是否正确;这里的classpath应该为class文件路径。可以参考W:\eas\dev下面的client-user.liblist文件。如何添加合计行?分析:利用KDTable的合计功能。解决:改代码来源自宋大伟voidinitGroupInfo() { IRowrow0;// table.getMergeManager().setDataMode(KDTMergeManager.DATA_KEEPFIRST); table.getGroupManager().setGroup(true); table.getGroupManager().setOrientation(KDTStyleConstants.DOWN); row0=(IRow)table.getGroupManager().getStatRowTemplate(-1); //row0.getStyleAttributes().setBackground(Color.blue); row0.getCell(0).setValue("总计"); row0.getCell(2).setExpressions(KDTGroupManager.STAT_SUM); row0.getCell(3).setExpressions(KDTGroupManager.STAT_SUM); row0.getCell(4).setExpressions(KDTGroupManager.STAT_SUM); //row0.getCell(3).setExpressions("=sum(d1:d5)"); table.getGroupManager().setTotalize(true); row0=(IRow)table.getGroupManager().getStatRowTemplate(0); row0.getStyleAttributes().setBackground(Color.green); //row0.getStyleAttributes().setHorizontalAlign(HorizontalAlignment.CENTER); row0.getCell(0).setValue("平均值"); row0.getCell(2).setExpressions(KDTGroupManager.STAT_SUM); row0.getCell(3).setExpressions(KDTGroupManager.STAT_SUM); row0.getCell(4).setExpressions(KDTGroupManager.STAT_SUM); //row0.getCell(3).setExpressions("=cell(ROW_INDEX-3,COLUMN_INDEX).getValue()"); table.getColumn(0).setGroup(true); table.getColumn(0).setStat(true); table.getColumn(0).setMergeable(true); row0=(IRow)table.getGroupManager().getStatRowTemplate(1); row0.getStyleAttributes().setBackground(Color.cyan); row0.getCell(1).setValue("最大值"); row0.getCell(2).setExpressions(KDTGroupManager.STAT_SUM); row0.getCell(3).setExpressions(KDTGroupManager.STAT_SUM); row0.getCell(4).setExpressions(KDTGroupManager.STAT_SUM); //row0.getCell(3).setExpressions("=cell(ROW_INDEX-2,COLUMN_INDEX).getValue()"); table.getColumn(1).setGroup(true); table.getColumn(1).setStat(true); table.getColumn(1).setMergeable(true);// table.getColumn(4).getStyleAttributes().setNumberFormat("#,##0.00"); row0=(IRow)table.getGroupManager().getStatRowTemplate(2) row0.getStyleAttributes().setBackground(Color.LIGHT_GRAY); row0.getCell(2).setValue("最小值"); row0.getCell(3).setExpressions(KDTGroupManager.STAT_SUM); row0.getCell(4).setExpressions(KDTGroupManager.STAT_SUM);//row0.getCell(3).setExpressions("=cell(ROW_INDEX-1,COLUMN_INDEX).getValue()"); table.getColumn(2).setGroup(true); table.getColumn(2).setStat(true); table.getColumn(2).setMergeable(true); }自己的代码: tblMain.getGroupManager().setGroup(true); tblMain.getGroupManager().setOrientation(KDTStyleConstants.DOWN); IRowrow0;// 获取总计行的模板(总计行的分组级别为-1) row0=(IRow)tblMain.getGroupManager().getStatRowTemplate(-1);// 修改总计行的背景色 row0.getStyleAt

温馨提示

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

评论

0/150

提交评论