金蝶EAS开发笔记
1.界面介紹
1.?新建業務單位,若無需求,默認選用財務組織。
2. 在項目路徑下的\metadata\com\kingdee\eas\custom\bill 可改單據名稱。
3. 標準:默認先在用戶自定義下面建立報表(rpt)、基礎資料(basedata)和業務單據(bill),即在業務組別下面建業務單元,然后再在下面建業務組別,最后再建業務單元??偣菜膶咏Y構。
rpt里面建一個項目名,再下面自建app和client。
4.?規范布局按鈕,位于頁面的上方,可一鍵規范布局。
5. 主要的元數據:
? ? 1)entity(實體):設計開發視圖->app->entity->屬性。
? ? 有兩種類型,鑰匙圖標和園點圖標。前者表示自有屬性,后者表示關聯屬性,類似于數據庫中的外鍵。也可以在屬性右邊的方法里面,添加自定義的方法。
? ? 2)table(數據表):可直接理解為數據庫里面的表,在此可以查看對應的字段名稱、類型和長度等等。
? ? 3)query(查詢):?主要就是SQL語句。?在子對象(主對象下面的屬性)里面可以選擇連接方式,若連接方式為默認類型就相當于于內連接,父對象所有行<---->左連接,子對象所有行<---->右連接。
6. 修改了單據的屬性,一定要記得發布業務單元,發布完業務單元之后,接著一定要刷新Java代碼。
7.info對象:類似于一般開發中的,POJO對象或者叫entity對象。
8.ListUI和EditUI屬于前端頁面,ControllerBean.java是負責處理后臺的業務邏輯的。前后端所使用的代碼不相同。
2.單據
? 1. 使用鋼鐵基類后添加組織需要加上的代碼:
? ?EditUI編輯界面:
?public KDBizPromptBox getMainOrgUnit() {return prmtFICompany;// 主業務組織控件}protected OrgType getMainBizOrgType() {return OrgType.Company;// 組織類型}? ?ListUI序時簿界面:
?protected OrgType getMainBizOrgType() {return OrgType.Company;}protected String getPropertyOfBizOrg(OrgType orgType) {return "FICompany.id";}? 2.取值和設值
(1)控件:
? ? 獲取值:
? ? this.控件名稱.getValue或get類型(如getText),
? ??設置值:
? ? this.控件名稱.setValue或set類型(如setText)。
(2)分錄(kdtEntry):
? ??獲取值:
? 先獲取單元格,再定位到列。
this.kdtEntry.getCell(rowIndex, kdtEntry.getColumnIndex("RowName")).getValue(值);? ? 或者
this.kdtEntry.getCell(rowIndex, "RowName").getValue(值);? ? 設置值:
this.kdtEntry.getCell(rowIndex, kdtEntry.getColumnIndex("RowName")).setValue(值);? ??或者
this.kdtEntry.getCell(rowIndex, "RowName").setValue(值);? 3.方法
? ? onload():類加載后調用此方法,在方法里面設置監聽事件,設置初始值。操作的是控件。
? ? onshow():綁定控件。
? ? createNewDate(): 在UI頁面添加控件后會進入此方法,用于設置默認值。不能在onload()設置默認值,會被覆蓋。操作的是對象。使用字段名稱。
? ? ?createNewDetailData():操作分錄,也是用來設置默認值。
? 基本用法:
//此例子為DEP的采購訂單 @Override public IObjectValue createNewDetailData(KDTable arg0) {//獲取到控件final KDFormattedTextField rate = (KDFormattedTextField)DEPUtils.findComponetByName(this, "控件名稱");PurOrderEntryInfo vo = (PurOrderEntryInfo)super.createNewDetailData(arg0);vo.put("控件名稱", rate.getValue());return vo; }? ? ?storeField() : 將控件的值綁定到數據庫,方法觸發的時機是在保存前、提交前、窗體關閉前。
? ? ?beforeStoreFields(): 用于綁定前的事件處理。
? ? ?verifyInput(): 校驗數據,方法里面寫保存和提交的操作。
? 4.事件
最常用的就兩個事件:editStarted和editStopped。如果是在分錄上,則為kdtEntry_editStarted和kdtEntry_editStopped。
還有mouseClicked、properyChange。
添加事件的步驟:在UI界面的事件里面找到對應的事件名稱,雙擊點進去,然后保存事件,將事件的名稱復制到相應的Java代碼里面
? 5.監聽器
(1)addDataChangeListener:
? 用法:
控件名稱.addDataChangeListener(new DataChangeListener(){@Overridepublic void dataChanged(DataChangeEvent arg0){......}});?(2)addActionListener:
?用法:
控件名稱.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {......}});? 6. F7
? F7類型的控件命名為:pk+自定義的控件名稱
? F7過濾:
EntityViewInfo viewInfo = new EntityViewInfo();//視圖 FilterInfo filterInfo = new FilterInfo(); //過濾設置過濾條件 filterInfo.getFilterItems().add(new FilterItemInfo("xxx"='yyyy'));//相當于where1 filterInfo.getFilterItems().add(new FilterItemInfo("zzz"='kkkk'));//相當于where2 new FilterItemInfo("number","11111",CompareType.EQUALS);//比較,相當于蒼穹的QFilter filterInfo.setMaskString("#0 or #1");//將and替換成or,下表從0開始viewInfo.setFilter(filterInfo); this.控件名稱.setEntityViewInfo(viewInfo);? 7. 序時簿的常用方法
? ? ? refreshList:刷新頁面
? ? ? refresh:刷新操作
? ? ? getSeletedValue:獲取單據的id
? ? ??getSeletedList:獲取下標
? 8.Factory
? ? 在app下面的ControlBean.java下面操作數據庫,在對應的介入點寫代碼( _save() 增加 、 _submit 提交、_audit?審核、_unAudit 反審核和 _delete 刪除 ),只有要上下文關系,就能調用其它的Factory。
? ? ?Factory:調用指定的屬性,在entity里面查詢方法,子類沒有去父類查找。
? ? 服務端通過工廠獲取本地Controller實例:
?IProject iproj = ProjectFactory.getLocalInstance(ctx);? ? 客戶端通過工廠獲取遠程Controller實例:
IProject iproj = ProjectFactory.getRemoteInstance();? 9.Experience?
? ? 獲取分錄的行數:this.kdtEntry.getRowCount()
? ? 獲取枚舉類型的值:this.枚舉類型的字段名稱.getSelectedIndex(),返回的是int型,需要和自定義的枚舉值比較是否相等。
4.監聽器
F7字段:
this.F7字段.addDataChangeListener(new DataChangeListener(){@Overridepublic void dataChanged(DataChangeEvent event) {.......} });?分錄刪除行:
this.分錄面板.addRemoveListener(new IDetailPanelListener(){@Overridepublic void afterEvent(DetailPanelEvent paramDetailPanelEvent)throws Exception {.......}}@Overridepublic void beforeEvent(DetailPanelEvent paramDetailPanelEvent)throws Exception {........} });5.異常處理
EASBIzException:業務異常。
throw new EASBizException(new NumericExceptionSubItem("error","提示信息的內容"));BOSException:編程時的異常,SQL,空指針......
throw new BOSException(e);handleException:在前端拋出的異常,在createNewDate方法里面,因為其父類沒有拋出異常。
ps:在處理異常時,不能e.printStackTrace(),除非自己確保語句沒有異常。
? ? ?也可以用如下方法,來彈出提示信息:
MsgBox.error("warning", "提示內容", this); 或者 MsgBox.info("warning", "提示內容", this);?不過此方法有局限性。?
6.SQL
利用工廠:
查詢數據: SelectorItemCollection sic = new SelectorItemCollection(); sic.add("id"); sic.add("name"); XXXXXXFactory.getLocalInstance(ctx).getXXXXXXInfo(new ObjectUuidPK(),sic); XXXXXXFactory.getLocalInstance(ctx).getXXXXXXInfo("此處填寫少了from條件的SQL語句,因為已經確定了表對象"); 或者 XXXXXXFactory.getLocalInstance(ctx).getXXXXXXInfo("where name = "); //過濾 EntityViewInfo viewInfo = new EntityViewInfo();//視圖 FilterInfo filterInfo = new FilterInfo(); //過濾 XXXXXXFactory.getLocalInstance(ctx).getXXXXXXCollection(viewInfo); 說明:XXXXXX為自命名的單據名稱?直接執行SQL:
前端: 增刪改:FMIsqlFacadeFactory.getRemoteInstance().executeSql(sqlString); 查:IRowSet selectRowSet = SQLExecutorFactory.getRemoteInstance(sqlString).executeSQL();后臺: 增刪改:DbUtil.execute(ctx, sqlString); 查:IRowSet rowSet = DbUtil.executeQuery(ctx, sqlString);7.標準改造(DEP)
用user登錄系統,在動態擴展平臺高級版。
在實體類里面添加字段,不會在頁面上顯示出來,適合開發人員。
在元數據校驗或元數據檢查里面復制PK(全類名),新建Java類,命名為:名稱+CTEx。新建的類會自動進入繼承的類的子類的onload方法。
標準擴展類:
命名:名稱+Ex
以CF開頭的列名為自添加的,以F開頭的列名為本來就有。?
拿到控件名稱:
DEPUtils.findComponentByName(this,"控件名稱")獲取類型為KDCheckBox的值 :?
int xxx = 控件名稱.getSelected();ps:當值為32時,?KDCheckBox為勾選狀態。
8.WebSocket接口:
添加方法:在entity里面的方法里聲明一個方法。
創建接口也類似,但是命名+Facade,然后發布websocket,在runtime文件夾里面打開資源目錄,把生成的文件拉到資源目錄里面。
localhsot:56898/ormrpc/services,本地的地址,用來查看暴露的接口。部署到服務器后,記得要改成對應訂單服務器地址和端口號。
9.手工報表
繼承檢行分析的包。
_createTempTable方法,得到臨時表,查詢的列和顯示的列要一致。
_query方法(四個參數),查詢臨時表。
新建用戶頁面,自建一個UI界面。
自定義彈窗:
說明:UrgentMaterial和Cause為分錄的某一個列名,UrgentMaterialsUI為自定義的UI界面。aaaa為自定義的key值,get和put時,名稱要保持一致。
int rowIndex = e.getRowIndex(); int colIndex = e.getColIndex(); if(colIndex == kdtEntry.getColumnIndex("UrgentMaterial")){//判斷單元格是否為空ICell cell = this.kdtEntry.getCell(rowIndex,"UrgentMaterial");if(cell != null){//判斷列是否為空Boolean value = (Boolean)this.kdtEntry.getCell(rowIndex,"UrgentMaterial").getValue();if(value){UIContext context = new UIContext(ui);context.put("aa","bb");//可往 UIContext 類的實例里 put 參數,這些參數可以帶到被打開的界面上IUIWindow uiWindow = null;try {uiWindow = UIFactory.createUIFactory(UIFactoryName.MODEL).create(com.kingdee.eas.custom.bill.client.UrgentMaterialsUI.class.getName(), context, null, OprtState.VIEW);uiWindow.show();} catch (UIException uException) {handUIException(uException);}this.kdtEntry.getCell(rowIndex, "Cause").setValue(uiWindow.getUIObject().getUIContext().get("aaaa"));}else {this.kdtEntry.getCell(rowIndex, "Cause").setValue("");}}}?自定義彈窗的Java代碼:
@Override public void ConfirmButton_mouseClicked(java.awt.event.MouseEvent e) {getUIContext().put("aaaa", this.kDTextArea.getText());//獲取文本里面的內容this.disposeUIWindow();//關閉窗體 }10.修改客戶端地址
?參考路徑如上圖所示,更改配置文件里面的服務器地址即可,適用于IP地址發生改變時。
11.常用快捷鍵
ctrl + e:查看詳細的報錯信息。
alt + shift + d:打開debug panel??加上?ctrl + f? 查找結點,查看返回值類型。
ctrl + shift + q :分析執行器。
ctrl + alt + ] :選中要查詢的SQL語句,點擊錄制,暫停,然后就能SQL查看SQL的運行時間。
12.查詢分析器
刪除查詢分析器里面的內容只要刪除下面這個文件里面的內容即可:
13.從客戶端下載服務器下面的文件
總結
- 上一篇: 2019海康威视软件开发工程师(C/C+
- 下一篇: 基于Arduino的自动调速风扇