BOS常用代码说明
下面是一些界面常用代码说明
ListUI
1) getSelectedKeValue:单行选择时,获取当前选中行的主键值,返回ID
2) getSelectedIdValues:多行选择时,获取选中行的主键集合,返回List
3) checkSelected:判断是否有选中行。做业务处理的时候一般先调用一下此方法
4) refreshList:刷新当前序时薄
5) prepareUIContext:ListUI到EditUI的值传递
EditUI
1) createNewData:为界面赋初始值,一般情况下,设置界面的控件默认值可以通过在这个方法中对控件对应的属性设置初始值即可。
2) initListener:注册界面控件的监听事件
3) verifyInput:提交或者保存的时候做校验,这个方法中直接对当前的editData的值做校验即可
4) loadFields:将editData的值赋值到控件上,一般有以下几种情况会扩展此方法:a)某控件没有做数据绑定,在界面加载的时候,需要写代码手工赋值;b)一些控件需要显示某些实体属性之外的值,在界面加载的时候,需要写代码手工赋值;
5) storeFields:将控件的值赋值给editDta中的属性,一般某控件没有做数据绑定,但是又需要保存的话,需要在这个方法中将控件值赋值给editData
6) setDataObject:一般在BOTP下推的时候会被调用,在这个方法中,会自动根据botp转换关系生成目标单据,某些botp无法配置的值,可以再这个方法中重新设置。即可以再这个方法中对botp转换之后的editData做数据加工,加工完成的数据就是最终显示到界面上的数据
7) initWorkButton:给自定义按钮增加图标,一般针对Action设置
8) initDataStatus:这个方法中通过当前对象(调用getDataObject获取当前对象)的属性值来设置控件的使能属性,即是否可用,是否可见等
其他
分录新增行删除行的响应事件:一般是EditUI实现接口IdetailPanelListener,然后在initListener方法中在表格对应的detailpanel上注册对应的事件,示例代码如下
protected void initListener() { super.initListener(); Container pnlPlaceCirc = kdtGoods.getParent().getParent(); if (pnlPlaceCirc instanceof DetailPanel) { DetailPanel cc = (DetailPanel) pnlPlaceCirc; cc.addAddListener(this);//增加行事件 cc.addInsertListener(this);//插入行事件 cc.addRemoveListener(this);//删除行事件 } }
实现IdetailPanelListener接口中定义的两个方法
public void afterEvent(DetailPanelEvent e) throws Exception { IObjectValue vo = e.getObjectValue(); if (vo instanceof XXXInfo) { //点击按钮后调用,一般通过vo的类型来判断操作的是哪个表 //这个方法中一般是处理分录删除后的后处理 } } public void beforeEvent(DetailPanelEvent e) throws Exception { IObjectValue vo = e.getObjectValue(); if (vo instanceof BigContractGoodInfo) { //点击按钮后,加载数据前调用,一般通过vo的类型来判断操作的是哪个表 //这个方法中一般可以对分录增加默认值 } }
获取表格选中行:
KDTableUtil.getSelectedRows(tblMain);返回int数组,代表选中的行的索引
KDTableUtil.getSelectedRow(tblMain);然会IRow,即选中的行
2) 为表格F7控件设置固定的过滤条件,一般先获取到表格中的F7,然后增加willshow事件,
KDBizPromptBox f7Factory = (KDBizPromptBox) tbl.getColumn("factory").getEditor().getComponent(); f7Factory.addSelectorListener(new SelectorListener() { public void willShow(SelectorEvent e) { try { factory_willShow(e); } catch (Exception exc) { handUIException(exc); } } });
在willshow中增加过滤条件
private void factory_willShow(SelectorEvent e) { EntityViewInfo view = new EntityViewInfo(); FilterInfo filter = new FilterInfo(); filter.getFilterItems().add(new FilterItemInfo("gwgys",Boolean.TRUE)); filter.getFilterItems().add(new FilterItemInfo("gngys",Boolean.TRUE)); filter.setMaskString("#0 or #1"); view.setFilter(filter); KDBizPromptBox f7 = (KDBizPromptBox) tbl.getColumn("factory").getEditor().getComponent(); f7.setEntityViewInfo(view); f7.getQueryAgent().resetRuntimeEntityView(); }
为界面上的F7设置过滤条件
EntityViewInfo evi = new EntityViewInfo(); FilterInfo filter = new FilterInfo(); filter.getFilterItems().add(new FilterItemInfo("gwgys", Boolean.TRUE)); filter.getFilterItems().add( new FilterItemInfo("wmBizStatus", new Integer( WMBizBillStatusEnum.AUDIT_VALUE))); evi.setFilter(filter); prmtsupplier.setEntityViewInfo(evi); prmtsupplier.getQueryAgent().resetRuntimeEntityView();
根据ID生成IobjectPK:IObjectPK objectUuidPK = newObjectUuidPK(id);
根据ID生成BosUUID:BOSUuid read = BOSUuid.read(id);
客户段远程调用写法:XXXFactory.getRemoteInstance()
根据ID获取Info:
XXXFactory.getRemoteInstance().getXXXInfo(IObjectPKpk);//直接获取info,如果info中含有关联属性,只能取到关联属性的ID XXXFactory.getRemoteInstance().getXXXInfo(IObjectPKpk, SelectorItemCollection selector);//直接获取Info,通过在selector中指定需要取哪些属性,比如 SelectorItemCollectionsic = new SelectorItemCollection(); //表示获取info所有的属性 sic.add(newSelectorItemInfo("*")); //表示获取info上creator上所有的属性 sic.add(newSelectorItemInfo("creator.*")); //表示只获取info上auditor上id,name和number三个属性 sic.add(new SelectorItemInfo("auditor.id")); sic.add(newSelectorItemInfo("auditor.number")); sic.add(newSelectorItemInfo("auditor.name"));
上面的写法表示需要查询Info所有的属性,以及info上creator这个关联属性所有的属性和info上auditor这个关联属性的id,name和number三个属性
服务端常用代码(服务端代码只能写在XXXControllerBean中,XXX为实体的名字)
服务端代码一般带下划线的是供业务重载或者覆盖的方法,不带下划线的方法中处理了权限,工作流等功能,一般情况下不要覆盖或者重载
protectedIObjectPK _addnew(Context ctx, IObjectValue model):新增单据会调用这个方法,如果在新增后有某些业务处理可以扩展这个方法,然后再后面加上自己的逻辑
protected void_delete(Context ctx, IObjectPK pk):删除单据会调用这个方法,如果在删除后有某些业务处理可以扩展这个方法,然后再后面加上自己的逻辑
protected void _update(Context ctx, IObjectPKpk, IObjectValue model)::修改单据会调用这个方法,如果在修改后有某些业务处理可以扩展这个方法,然后再后面加上自己的逻辑
重载的时候一定要先调用super.XXX,然后再调用自己的逻辑,以覆盖_delete为例,一般写成:
protected void _delete(Context ctx, IObjectPK pk) throws BOSException, EASBizException { // 先调用super. _delete super._delete(ctx, pk); //然后再调用自己的逻辑 afterDelete(ctx,pk) }对于自己在实体上新增方法后发布出来的方法也是一样,抽象类中都会生成两个方法,一个带下划线的,一个不带下划线的,一般情况下只能去覆盖带下划线的那个方法,比如实体Test中增加方法method1,那么在实体的控制Bean(即TestControllerBean)的基类就生成两个方法,一个是method1,一个是_ method1,只需要在_ method1写业务逻辑代码即可。
五一三天也过去了,明天就要上班了,纠结啊~~~今晚把自己最近学到的东西写到博客里面,希望能给像我一样接触金蝶的朋友们带来帮助!
写的都比较乱,都是平时记录下来的,有时间会慢慢整理的。好了今天写发这些吧!洗洗睡觉!