EAS-BOS開發(fā)問題解決_第1頁
EAS-BOS開發(fā)問題解決_第2頁
EAS-BOS開發(fā)問題解決_第3頁
EAS-BOS開發(fā)問題解決_第4頁
EAS-BOS開發(fā)問題解決_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Studio新建的UI發(fā)布只能看到抽象類的問題在導入了新的解決方案之后,在二次開發(fā)時進行新建UI,進行發(fā)布,但是在代碼視圖中只能看到抽象類,沒有其他的代碼。對于客戶二次開發(fā)中用戶自定義的單據(jù)才生成實現(xiàn)類,但發(fā)現(xiàn)BOSStudio新建的ui元數(shù)據(jù)自定義標記為<userDefined>false</userDefined>,導致在發(fā)布時認為不是用戶自定義的,因此沒生成實現(xiàn)類。需要把ToolCommon插件下(E:\kingdee\bos\BOSModular\boscommon\eclipse\plugins\com.kingdee.bos.toolcommon)的perties這個文件中的isDevelopVersion=true改為:isDevelopVersion=false如何修改UI的父類?如何修改EditUI綁定的實體Entity?點擊UI,選擇左邊瀏覽方式“大綱”。選擇DataObjects的editData(查詢對象)設置由自己定義的一個Entity元素據(jù)。Java源碼會有這樣一句話:editData=(com.kingdee.eas.fi.fi_cs.CsAccountViewInfo)ov;其中CsAccountViewInfo是自己定義的一個Entity。而com.kingdee.eas.fi.fi_cs則是他的路徑。如何修改ListUI綁定的查詢Query?解決:點擊UI,選擇左邊瀏覽方式“大綱”。選擇DataObjects的mainQuery(查詢對象)設置由自己定義的一個Query元素據(jù)。Java源碼會有這樣一句話:mainQueryPK=newMetaDataPK("com.kingdee.eas.fi.fi_cs.app","CsAccountViewQuery");其中CsAccountViewQuery是自己定義的一個Query。而com.kingdee.eas.fi.fi_cs.app則是他的路徑。將一個元數(shù)據(jù)從一個文件夾直接拉到另外一個文件夾,打開文件的時候會報錯誤com.kingdee.bos.engine.MDParseError解決:把元數(shù)據(jù)從一個文件夾移到另一個文件夾不能直接拉。需要用復制功能,并且只能夠在EAS-BOS的工作透視圖下。如果在其他視圖下進行操作,將無法復原。導出sql的時候CreateTable.sql無法創(chuàng)建table,oracle和sqlserver定義的類型有什么不一致原因:導出數(shù)據(jù)表會自動生成一些腳本,但是選擇oracle時,實際導出的卻是sqlserver的腳本。導出有問題,oracle和sqlserver導出的都是sqlserver的腳本。解決:認清oracle和sqlserver定義的類型有什么不一致。Oracle的Date等同于sqlserver的DateTime,nvarchar2等同于sqlserver的nvarchar。Varchar2等同于sqlserver的.kingdee.bos.metadata.MetaDataNotFoundException:CannotfoundmetadataBOSType[null]原因:沒有重寫ListUI的getBizInterface()方法。解決:一定要重新實現(xiàn)ListUI和EditUI的getBizInterface()方法,重新實現(xiàn)ListUI的getBizInterface()方法問題解決。keyFiled沒有設置,請重寫getFiledName()方法。解決:在設置query元數(shù)據(jù)的時候沒有配置好主鍵,一定要設置主鍵無法實現(xiàn)字段排序解決:在*UI.java文件上面添加方法protectedvoidtblMain_tableClicked(KDTMouseEvente)throwsException{ //覆蓋原方法 super.tblMain_tableClicked(e);}該方法會實現(xiàn)父類的排序功能。備注:tblMain_tableClicked是指雙擊的事件。一般用在查詢頁面。還有一個tblMain_tableSelectChanged是指點擊時觸發(fā)的事件。日志操作寫錯:指標錄入(分配)審核寫成了指標錄入(分配)修改。原因:審核,反審核的操作最后都執(zhí)行了修改的操作。所以就將日志文件改成了修改。而不是審核或者反審核。分析:日志操作一般在.log文件上面做修改。比如說這個問題。日志文件為指標管理屬于集中支付模塊,gov_biz.log在這個模塊的源文件下面gov/biz/。一般添加日志在.log文件的日志項。選擇某個目錄,為其添加日志項,組名,別名都需要每一層每一層寫清楚(這會自動默認上下級關系)。接著選定引用對象,(有兩種對象:引用對象和功能對象)。功能對象還不是很了解,引用對象是一個實體。接著選定某些引用方法,意思就是這些方法觸發(fā)的時候寫入日志。另外還有一個方法寫入日志。直接在某個按鈕操作調用寫日志方法。該方法在GovBasedataUtils是基礎數(shù)據(jù)管理公用函數(shù)及接口。方法名為setOperLog,該方法有兩個,具備不同的參數(shù)。選擇所需要的方法調用。備注:針對這個bug需要注意一個空指針的問題,如果直接調用父類的actionPassAudit_actionPerforme的方法,會出現(xiàn)這個問題。原因是有refresh(e)方法進行刷新。所以不能調用父類的方法,自己重寫。修改完日志的時候,還需要在文件菜單中同步一下日志項數(shù)據(jù)。setOperLog方法是寫log進入操作對象這個字段。而不是寫入操作這個字段。這點需要注意。進入基礎資料關聯(lián)管理進行修改,刪除的時候,日志操作出現(xiàn)字符串,沒有正確顯示操作對象分析:首先檢查日志有沒有出錯,沒有出錯的話可在java文件中進行修改。因為是刪除和修改操作,所以我們可以重寫父類的刪除修改操作,添加一個寫日志的操作。解決:首先找到該Java文件:GovBaseDocBizRefListUI.java。重寫actionEdit_actionPerformed和actionRemove_actionPerformed方法。(GovBaseDocBizRefInfo)getBizInterface().getValue(newObjectUuidPK(keyValue),getSelectorItemCols())是用來得到自己定義的對象這里是GovBaseDocBizRefInfo。而該對象的數(shù)據(jù)則用getSelectorItemCols()方法來獲取。最后則是自己定義的寫log的方法。在改bug的過程中,還出現(xiàn)一個問題,就是寫日志操作必須在修改和刪除操作之前執(zhí)行,否則會出現(xiàn)一些意外問題,比如說寫日志寫的不是當前選擇的數(shù)據(jù),而是選擇第一條數(shù)據(jù)。還有就是出現(xiàn)刪除操作提示記錄找不到。這都是因為把寫日志操作放在了修改和刪除操作之后導致的。原因是如果是修改操作后返回的是第一條數(shù)據(jù),修改完自然寫的就是第一條數(shù)據(jù)的日志了。如果先刪除再寫日志的話肯定得不到對象,因為被先刪除了,所以會出現(xiàn)提示。無法啟動debugserver.bat,debugserver窗口自動關閉。解決:到W:\apusic\domains\server1路徑下將server.xml文件刪除即可解決。Oraclesql語句報錯:“未明確定義列”解決:在表關聯(lián)中出現(xiàn)了相同的字段名字,給與一個別名就可以解決。如何在java文件中添加一個F7控件備注:由于不允許在標準產品上面添加控件,所以只能夠在java上面添加。解決:可參考F7業(yè)務控件指南(KDBizPromptBox)使用指南。在這里只寫上一些基礎配置。一般使用F7都給包含在一個KDLabelContainer控件里面。創(chuàng)建一個KDLabelContainer控件this.borrowContain=newcom.kingdee.bos.ctrl.swing.KDLabelContainer();創(chuàng)建一個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方法執(zhí)行的。而該方法又通過調用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,會出現(xiàn)跟前面的控件重疊解決:設置KDLable的constrain中的anchor,看來這個是重要的屬性。EAS的查詢是如何實現(xiàn)的解決:(例子)protectedbooleanisHasAttachMent(Stringbosid)throwsException{CoreBaseCollectionass=(CoreBaseCollection)BoAttchAssoFactory .getRemoteInstance().getCollection("selectFAttachmentID"+ "whereboid='"+bosid+"'"); if(ass!=null&&ass.size()>0) returntrue; returnfalse;}解析:該例子很簡單,但是不知道的人確實非常困惑。現(xiàn)在說明一下。首先應該是BoAttchAssoFactory這個類,每一個實體都有一個factory這個類。這個例子的實體就是BoAttchAsso。這個factory類提供了一個遠程的接口獲取對象。CoreBaseCollection則是將這個對象包裝起來。對象里面的內容就是根據(jù)里面的sql得出來的。注意該sql是用實體來查詢的。不是數(shù)據(jù)庫sql。FAttachmentID,boid都是BoAttchAsso實體里面的屬性。這個例子總的就是說去實體里面找數(shù)據(jù)然后返回一個對象。給實體新增了一個屬性,如何獲取該實體這個屬性的值解決:給實體新增了一個屬性,發(fā)布后都會在以Abstract開頭的info類中產生get,set方法。比如給實體BgAdjustBill新增了一個屬性isNeedOrNotAttachment,發(fā)布后會在AbstractBgAdjustBillInfo類中產生這兩個方法。publicbooleanisIsNeedOrNotAttachment(){returngetBoolean("isNeedOrNotAttachment");}publicvoidsetIsNeedOrNotAttachment(booleanitem){setBoolean("isNeedOrNotAttachment",item);}就采用editData.isIsNeedOrNotAttachment()方法獲得屬性的值。editData是在list頁面?zhèn)鞯絜dit頁面上的對象,想要獲取對象的值都可以通過editData。Edit頁面的數(shù)據(jù)如何保存解決:采用數(shù)據(jù)綁定。在Edit的UI界面選擇數(shù)據(jù)綁定。例子:在edit和list頁面分別有兩個checkbox控件。想要讓他們關聯(lián)起來。在edit的ui頁面上選擇數(shù)據(jù)綁定,選中要綁定的checkbox控件,由于是checkbox,所以是個bollean型的,選擇其selected功能,再選擇下一步綁定實體的屬性。這樣子就關聯(lián)上了。點擊保存的時候會將其保存。彈出提示窗口的信息如何設置解決:MsgBox.showWarning(this,EASResource.getString( BgAdjustBillHelper.RESOURCESTR, "mustBeSameOrg")其中mustBeSameOrg為資源文件.resource定義的名稱。如何融合行。變成如下的形式現(xiàn)在的形式是如下。解決:privatevoidsetMergeColumn(booleanmerge){ //增加對于單據(jù)頭的表格融合設置 StringmergeColumnKeys[]=getMergeColumnKeys(); if(mergeColumnKeys!=null&&mergeColumnKeys.length>0){ tblMain.checkParsed();//指定KDTable要進行數(shù)據(jù)分組 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數(shù)組是UI上面顯示的字段名稱,具體要融合哪些列,可以在table右鍵選擇編輯表信息。里面有各個字段的名稱。這里的字段還要按照順序來排列,不允許中間有一個字段沒有寫進來,可以從編輯表信息里面查找,中間如果漏寫了一個會沒有效果,意思就是必須得按照順序來排列。 String[]columnKeys={"id","createTime","number", "bgS","state","","", "lastUpdateTime","attachment","bizDate"}; returncolumnKeys; }在每次執(zhí)行查詢后調用setMergeColumn(true)這個方法就行了。如何添加功能快捷鍵?解決:this.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put( KeyStroke.getKeyStroke("ctrlN"),"actionAddNew");其中actionAddNew就是function。2008-10-20問題:如何添加一個參數(shù)子系統(tǒng)樹節(jié)點和參數(shù)?解決:參數(shù)子系統(tǒng)樹節(jié)點可以通過直接修改xml文件來添加。標準產品的xml文件為:SubSystem.xml。政府行業(yè)新增加的文件為:SubSystem_industry.xml。新增一個子系統(tǒng)數(shù)節(jié)點可以參考文章。添加一個子節(jié)點的xml(例子)<rowfullname="com.kingdee.eas.ma.budget"name="budget"alias_l1="budget"alias_l2="政府預算"alias_l3="政府預算"isleaf="1"parent=""/>其中fullname為包名。Parent表示父級目錄的包名。isLeaf表示目錄的層次。添加完之后,必需停止服務,并且在控制管理臺那里的工具選項選擇產生子系統(tǒng)樹。這個步驟最好在服務器上面做,本地運行產生子系統(tǒng)樹貌似會出錯。在服務器上面操作時,需要將eas\server\metas\mdbview-metas.jar覆蓋本地的所有這個包。完成后重起服務,進入系統(tǒng)平臺->系統(tǒng)配置->參數(shù)設置。這時候會發(fā)現(xiàn)還沒有出現(xiàn)剛才產生的節(jié)點。由于如果節(jié)點下面沒有任何參數(shù)的話,此節(jié)點是不會顯示的?,F(xiàn)在為節(jié)點添加參數(shù)。選中任意一個節(jié)點,按F12,會彈出一個參數(shù)對話框,可以在這個對話框添加,修改,刪除參數(shù)。選中剛才的節(jié)點:政府預算。新增一個參數(shù)。新增參數(shù)需要了解一點:組織類型非常重要,如果該節(jié)點的組織類型與所要添加參數(shù)的組織類型不一致,該參數(shù)將不會在參數(shù)設置頁面里面顯示,因為參數(shù)設置頁面只是顯示與節(jié)點的組織類型相同的參數(shù),其它則不顯示。如果要想添加一個不同的組織類型的參數(shù),則需要重新添加一個節(jié)點,將節(jié)點的類型設置為要添加參數(shù)的組織類型。然后再新增加參數(shù),總結起來就是說參數(shù)的組織類型要與節(jié)點的組織類型一致才可以在參數(shù)設置頁面顯示出來。設置節(jié)點的組織類型的方法如下:找到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"/>這句話的意思就是將上面添加的政府預算的節(jié)點的組織類型設置為預算組織。Key對應fullname,value="CostCenter"的意思為設置組織類型為預算組織。想要查找有哪些組織類型,可以參考OrgType.enum。名稱為value的可選值。參數(shù)添加成功之后,需要導出參數(shù)的sql腳本。路徑如下:系統(tǒng)平臺-->預警平臺-->預警條目設置-->按F11,選擇參數(shù)導出,輸入?yún)?shù)的編碼。如何獲取“下次直接進入的方案”中自定義頁簽的過濾條件。解決: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方法增加多一個類型參數(shù)。就可以看到效果了,EAS默認的是WinStyle.SHOW_MENUBAR或者WinStyle.SHOW_STATUSBAR。如何默認最大化窗口?解決:(例子)if(windowinstanceofKDFrame){//最大化 ((KDFrame)window).setExtendedState(KDFrame.MAXIMIZED_BOTH);}elseif(windowinstanceofDialog){ ((Dialog)window).setSize(Toolkit.getDefaultToolkit().getScreenSize()); }執(zhí)行腳本的時候報“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);在通用查詢窗口點擊確定的時候如何驗證頁面上的一些條件?解決:實現(xiàn)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。解決:自定義是一個頁簽(框架的功能實現(xiàn)),要實現(xiàn)自定義頁簽必須讓UI繼承類monquery.client.CustomerQueryPanel。在實例化一個CommonQueryDialog的時候,首先將UI封裝進CommonQueryDialog對象里面。protectedCommonQueryDialoginitMessageExportDialog(UIContextuicontext)throwsException{dialog=newCommonQueryDialog();//實例化MetaDataPKmainQueryPK=newMetaDataPK(".stdextend","GovPersonSimpleHelpQuery");//用于在自定義頁簽實現(xiàn)字段過濾功能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("短信數(shù)據(jù)導出");//設置探出框的title。dialog.setWidth(550);dialog.setHeight(300);returndialog;}具體更多的設置可以參考CommonQueryDialog這個類。如何從CommonQueryDialog得到自定義UI。解決:publicvoidactionTxtExport_actionPerformed(ActionEvente)throwsException{dialog=initMessageExportDialog(uiContext);if(dialog.show())//彈出對話框出現(xiàn)的時候,代碼運行停留在這一行。當點擊確定的時候將繼續(xù)運行。{tHelper.setDialog(dialog);GovHrMessageExportUIgovHrMessageExportUI=(GovHrMessageExportUI)dialog.getUserPanel(0);用這種方式得到自定義UI。得到了UI,相當于實例化了這樣的一個類,還可以得到類的方法。Stringpath=govHrMessageExportUI.getPath();//getPath()是定義在GovHrMessageExportUI中的方法。} }如何實現(xiàn)一個彈出保存對話框。GovFileChooserPromptBox prmtRoad=newGovFileChooserPromptBox(this,GovFileChooserPromptBox.CHOOSERTYPE_TXT); //GovFileChooserPromptBox是自已定義的一個保存彈出框,可以找到該類進行參考。里面有一個保存樣式設置的??梢员4鏋槭裁搭愋偷奈募? prmtRoad.setDisplayFormat("$name$");//設置顯示格式 prmtRoad.setEditable(false);//設置是否可以輸入,false的話只能夠通過點擊F7進入。如何在彈出的對話框點擊確定后進行驗證。解決:在UI實現(xiàn),UI是封裝進入對話框的UI。dialog.addUserPanel(UI);publicbooleanverify(){}如何設置一個監(jiān)聽事件,在切換單元格的時候進行一些動作。解決: privatevoidsetMoneySumAction(){ kdtBgDetail.addKDTEditListener(newKDTEditAdapter(){ publicvoideditStopped(KDTEditEvente){ //當光標移出單元格的時候觸發(fā)事件 …… } }); }將setMoneySumAction方法設置在ONLOAD中。如何判斷單擊了列頭。解決:protectedvoidorderByClickTableHead(KDTMouseEvente)throwsException{if(e.getType()==KDTStyleConstants.HEAD_ROW &&e.getButton()==MouseEvent.BUTTON1&&e.getClickCount()==1){……}如何實現(xiàn)排序。如何默認進入一個ListUI實現(xiàn)按照某個字段進行排序解決:如何實現(xiàn)排序參考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)));//創(chuàng)建樹,bulitTree(schemeSet)必須是TreeNode對象,包含了所有各級的節(jié)點。 }protectedTreeNodebulitTree(GovHrSchemeSetCollectionsrc){ KDTreeNoderesult=newKDTreeNode("薪酬方案組合");//創(chuàng)建一個節(jié)點,處于最上層。 for(inti=0;i<src.size();i++){ KDTreeNodetn=newKDTreeNode(src.get(i)); if(src.get(i).getSchemeSetEntry().size()>0){//判斷是否有分錄對象,有的話還要再創(chuàng)建子節(jié)點。 for(intj=0;j<src.get(i).getSchemeSetEntry().size();j++){ KDTreeNodeleaf=newKDTreeNode(src.get(i).getSchemeSetEntry().get(j));//將一個對象設置為一個節(jié)點,該節(jié)點就是一個GovHrSchemeSetEntry對象。 tn.add(leaf); } } result.add(tn); } returnresult; }循環(huán)創(chuàng)建節(jié)點的方法: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直接關聯(lián)。會出現(xiàn)上面的問題是因為(舉例說明)ActionA調用了ActionB,然后在寫引用屬性的時候直接把方法B給寫上了,沒有用ActionA,然后就出現(xiàn)了那個問題。ActionB不是按鈕的直接觸發(fā)Action。要直接寫上按鈕的Action。如何加監(jiān)聽?解決:示例代碼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{}}});觸發(fā)監(jiān)聽事件是在KDTSelectManager類中的fireTableSelectChanged方法,可以看到一共觸發(fā)了多少個監(jiān)聽器。2008-12-18問題:工作流無法跑通分析:跟蹤了代碼發(fā)現(xiàn)在WfBizEventListener類中executeAfter方法里面的代碼StringboId=EventUtils.getBoPK(eventInfo.getEventMethods().get(operationPK.toString()),args);取得的boId為空,使工作流無法走通。解決:這是BOS工作流的一個bug,需要在實體里面上設置這里的業(yè)務對象主鍵的id為空。在<event>屬性上找到對應方法<name>reqSubmit</name>下面的isBOPK屬性置為true。如何在消息中心可以批量處理單據(jù)?解決:在對應的實體對象中需要設置一下擴展屬性ListUI,將對應的ListUI配置進去。2008-12-19問題:工作流批量處理報錯java.lang.NullPointerException:nullat:com.kingdee.eas.base.multiapprove.client.MultiApproveListUI.onLoad(MultiApproveListUI.java:299)分析:跟蹤代碼,發(fā)現(xiàn)StringfstBoId=((AssignmentInfo)approveAssignInfos.get(0)).getBizObjectIds();這里的fstBoId為空,導致空指針錯誤。解決:沒有在工作流環(huán)境中的提交節(jié)點進行配置,沒有正確生成單據(jù)。正確配置如下:進行設置后,將會在提交到工作流的時候正確生成單據(jù)。只有在工作流環(huán)境中重新正確配置提交節(jié)點的任務之后才會生效,對之前錯誤的單據(jù)沒有影響,需要重新進行操作流程新增-〉提交,新的單據(jù)不會報錯。2008-12-19問題:重新定義了實體事件,在工作流環(huán)境中無法找到。分析:已經打上補丁并且生成了子系統(tǒng)樹,但是還是無法在工作流環(huán)境中找到。解決:需要將工作流環(huán)境重啟,即使重新連接登陸都不能夠刷新的,只有將環(huán)境重啟了才行。(郁悶)2008-12-20問題:如何判斷該單據(jù)已經處在工作流中。解決:在Context中有這個屬性。用這個判斷this.getUIContext().get("isFromWorkflow")。2008-12-21問題:消息中心打回修改重新提交的時候報“已在工作流處理中,當前任務或執(zhí)行人不匹配”解決:一般是實體或者功能配置錯誤,查看對應的處理事件。這個錯誤是因為在參數(shù)與映射中對應的事件參數(shù)沒有設置進去。修改后即可。如何獲得所需的對象?包括過濾,獲取指定的某些關聯(lián)對象。解決:一個對象里面可能有些屬性關聯(lián)到其他的對象,可以通過以下寫法獲得。(注釋文字為自己理解,并非標準)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為對應實體的屬性,意思是獲得關聯(lián)對象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會拿出所有關聯(lián)的對象,而info2只會拿出所指定的某些關聯(lián)對象。2008-12-30問題:鼠標右鍵沒有選項,添加導入導出等選項。解決:關鍵在于onShow方法。在重寫onShow方法的時候要super一下。還有就是右鍵按鈕的加載在于CoreUI類的initUserConfig方法,會初始化表格設置。而這個方法只在onShow方法中調用。備注:如果要自己添加導入導出選項的時候,需要做以下操作。enableExportExcel(kdtPaymentDetail);checkTableCommonMenu(kdtPaymentDetail);這兩句代碼是設置導入導出功能是否要實現(xiàn),并且檢查右鍵的有效性。kdtPaymentDetail則為KDTable。其實還有另外一個實現(xiàn)方法,就是在頁面上重寫getTableForCommon(),返回一個KDTable就行了。客戶端和服務端獲取當前組織?解決:客戶端:mon.client.SysContext用法:SysContext.getSysContext().getCurrentXXX();服務器端:com.kingdee.eas.util.app.ContextUtil用法:ContextUtil.getCurrentXXX(Contextctx)當前組織的方法為getCurrentCtrlUnit();如何獲取當前頁面元數(shù)據(jù)?解決:IMetaDataLoaderloader=MetaDataLoaderFactory.getRemoteMetaDataLoader();EntityObjectInfoentityInfo=loader.getEntity(newMetaDataPK(ProcessDocumentRuleEditUI.class.getName()));【如何實現(xiàn)導入導出功能?】解決:(實現(xiàn)非樹形頁面的導入導出)Step1.實現(xiàn)導入導出,必須在其ListUI頁面實現(xiàn)getExportParam和getImportParam方法,返回一個ArrayList,在其里面有一個DatataskParameter對象,該對象包含了導入導出的方式datataskMode,有兩種DatataskMode.ExpMode或者DatataskMode.ImpMode;說明alias“過程文檔規(guī)則”和解決方案solutionName“ProcessDocumentRule”,這兩個會出現(xiàn)在xls表格里面。如圖:對象的setContextParam()方法可以設置一些數(shù)據(jù)然后從服務端得到。具體可參考(ProcessDocumentRuleListUI.java)。Step2.用administrator登陸,在系統(tǒng)平臺->引入引出管理->引入引出模板管理,點擊維護自定義模板,選擇新增模板,填寫基本信息,進行字段設置。字段設置有規(guī)定,如果是非樹形的,則用編碼,是樹形的則用長編碼。(具體這個我覺得可以看對應的實體的屬性列表中是否包含有TreeBase這個對象,有的話就要用長編碼,沒有的話就用編碼,還有一點就是實體里面有關聯(lián)屬性的,要看關聯(lián)屬性對應的實體來決定長編碼或者編碼)除了這個還要設置實現(xiàn)類的名稱,導入導出都會調用該類實現(xiàn)。新增完之后,導出該模板根據(jù)具體細節(jié)進行修改,刪除掉剛才創(chuàng)建的模板,進入模板編輯在文件上面選擇新增,引入模板。重新填寫一些信息,保存模板就OK了。Step3.編寫導入導出實現(xiàn)類(參考ProcessDocumentRuleImport.java)該類繼承了AbstractDataTransmission,具體說明如下:有兩個變量,ALL_FIELDS是在模板設置的各個字段名稱,All_OBJS指的字段對應實體的屬性。還有必須實現(xiàn)方法transmit和getController,可以在transmit方法中進行數(shù)據(jù)的驗證,驗證成功后會轉化為一個CoreBaseInfo。getController方法則返回一個工廠處理類。exportTransmit方法實現(xiàn)的是導出數(shù)據(jù)。getExportQueryInfo方法則是返回一個字符串,在進行數(shù)據(jù)導出的時候會去找對應的Query進行數(shù)據(jù)查詢。具體參考如何查詢執(zhí)行的SQL,跟蹤每個序時簿頁面執(zhí)行的SQL。解決:跟蹤VirtualModeDataAccess這個類的getRowSetBySeqTable方法。2009-1-15問題:如何設置多級審批頁面?備注:在實體里面有一個擴展屬性“序時簿UI的類名”,如果設置了某個listUI的話,在消息中心進行多級審批就能夠顯示指定的listUI,適用于單個實體被單個頁面使用,但是當改實體被多個頁面引用的時候,而多個頁面都有審批的話,這里就不適用了。(不確定的一點就是如果有botp轉換的話也是用這個listUI設置,兩個需要的listUI不一致,會產生有沖突,最好還是不要這樣子設置)比如說budget.entity被多個頁面“一上建議數(shù)”,“一上審核”,“二上編制”,“二下審核”共用。解決:實體還有另一個擴展屬性:“多級審批特定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問題:工作流中如何設置會審功能?分析:會審就是需要有多人審批一個單據(jù)才行。解決:在任務一欄中的是否支持會簽打鉤。就能夠支持會審功能了。會審功能有兩個選項:一票否決和全部投票。一票否決的意思是指“一個人不同意”,則活動到此結束,并且審批結果為不同意。如果這時還有其他審批人未處理,該活動也結束了。全部投票指的是根據(jù)票數(shù)的多少決定(該功能有待驗證)自定義頁簽過濾條件多增加了幾個字段,在綁定的Query里面找不到。解決:在QueryMetaUtil.java中實現(xiàn)了一個功能,就是可以追加Query,可以在不改動原Query的情況下增加多一個新的Query,給自定義頁簽的過濾條件添加多新的Query的字段。在二維數(shù)組String[][]mergeQuery中添加多一組數(shù)據(jù),數(shù)組內容:源query,合并用query,源query主實體關聯(lián)字段,合并用query主實體關聯(lián)字段。如何獲得自定義條件?解決:EntityViewInfofilterEntityInfoGol=dialog.getEntityViewInfoResult();filterEntityInfoGol是根據(jù)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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論