做了快5年的EAS开发,遇到过的问题数不胜数,最近在帮新同事处理问题时发现好多问题是似曾相识的 ,现将这些问题及解决方法汇总下来,并不断维护吧。
1.开发过程中往往会遇到某些字段或表不存在的提示,而这些属性确不是我们开发的,故不知道是那个表少属性。
解决方案:
第一步:通过在com.kingdee.bos.sql.shell.KDPreparedStatement类里的构造函数方法设置断点,来抓出ksql、dialect_sql变量里的sql语句。
第二步:将得到的语句在查询分析器里执行 看下 是否存在缺少的字段,并看是哪个表少的字段
2.新增一个物业管理的模块,在创建ui基类的时候发现一个问题,需要将序时簿中的参数通过上下文传递到editui中(例如:左树右表的树节点),实现方案如下:
重构listUI的prepareUIContext()方法,给上下文传参即可
例如:
protected void prepareUIContext(UIContext uiContext, ActionEvent e) {
super.prepareUIContext(uiContext, e);
uiContext.put(UIContext.PARENTNODE, SaleUnit);
}
注:在editUI中需要在界面加载后才可获得参数。
3.服务端提示:ShowInfo格式的友好提示
NumericExceptionSubItem interfaceException = new NumericExceptionSubItem(
"", "不允许编制同一个物料XXXXXX");
throw new InterfaceDataBaseException(interfaceException);
4.存储过程的执行参考案例:
Connection conn = this.getConnection(ctx);
//调用XX存储过程
String sql="{call P_Archive_Demo_Exp(?,?,?)}";
CallableStatement cs = conn.prepareCall(sql);
cs.setString(1, projectid);
//改为根据单头采购组织取数(问题清单2要求修改--需求人员余潺)
cs.setString(2, purOrgUnitId);
cs.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
Object rowSet=(Object) cs.getObject(3);
if(rowSet instanceof OracleResultSet) {
OracleResultSet rs = (OracleResultSet)rowSet;
while(rs.next()) {
String fmid=rs.getString("fmid");//物料ID
String fcarno=rs.getString("fcarno");//跟踪号
BigDecimal fqty = rs.getBigDecimal("fqty");//定额
}
}
5.弹框控制逻辑:
UIContext uiContext = new UIContext();
uiContext.put("id", id);
uiContext.put("purOrgUnitId", purOrgUnitId);
String uiClass = "com.kingdee.eas.industry.emm.scm.sm.client.FilePartBillDetailListUI";
IUIWindow popUI = UIFactory.createUIFactory(UIFactoryName.MODEL).create(uiClass, uiContext, null, OprtState.VIEW);
popUI.show();
其中,如果弹出的ui界面不需要工具栏及最大化等按钮,用UIFactoryName.MODEL参数
目标界面中通过getUIContext().get("id") 获取参数值
6.新增单据分录按钮添加框架方法,在开发一个单据中分录的新增行删除行按钮简便处理方式:
第一步,定义变量:
protected com.kingdee.eas.framework.client.multiDetail.DetailPanel kdtEntry_detailPanel = null;
第二部,添加DetailPanel到panel容器中,并重构initUIContentLayout()方法实现具体逻辑:
public void initUIContentLayout() {
super.initUIContentLayout();
kdtEntry_detailPanel = (com.kingdee.eas.framework.client.multiDetail.DetailPanel)com.kingdee.eas.framework.client.multiDetail.HMDUtils.buildDetail(this,dataBinder,kdtEntry,new com.kingdee.eas.scm.supmanager.supmanager_manager.supmana_mana04.QualityProblemNoticeEntryInfo(),null,false);
kDPanel1.add(kdtEntry_detailPanel, new KDLayout.Constraints(5, 15, 963, 218, KDLayout.Constraints.ANCHOR_TOP | KDLayout.Constraints.ANCHOR_BOTTOM | KDLayout.Constraints.ANCHOR_LEFT | KDLayout.Constraints.ANCHOR_RIGHT));
}
7.设置大文本控件(KDTextArea)滚动条的简易方法,避免使用多语言的大文本控件:
第一步:定义KDScrollPane变量
protected com.kingdee.bos.ctrl.swing.KDScrollPane scrollPaneType;
第二步:重构 initUIContentLayout() 方法并实现给大文本添加滚动Pane的代码
public void initUIContentLayout() {
super.initUIContentLayout();
scrollPaneType = new com.kingdee.bos.ctrl.swing.KDScrollPane();
conttype.setBoundEditor(scrollPaneType);
scrollPaneType.getViewport().add(txttype, null);
}
8.序时簿中获取选中行中某单元格的值方法,例如获取启用状态字段来判断是否可修改:
//String strid =getSelectedKeyValue();
int selectRows[] = KDTableUtil.getSelectedRows(tblMain);
String strStatus =ListUiHelper.getSelectedKeyValue(selectRows, tblMain, "deletedStatus");
9.序时簿 单据单头行合并,重构 getMergeColumnKeys方法
public String[] getMergeColumnKeys()
{
return new String[] {"id","number""};
}
10.单据编辑界面修改,需要重新加载界面控件值(例如审核时反写后),此时不需要提示单据修改的提示
setOprtState(OprtState.VIEW);
setDataObject(editData);
loadFields();
setSave(true);
setSaved(true);
11.eas中editui设置出滚动条的方法:
第一步:在editui代码类中重构一下三个方法
public boolean useScrollPane() {
return true;
}
public int getVerticalScrollPolicy() {
return 20;
}
public int getHorizontalScrollPolicy() {
return 30;
}
第二部:在editui元数据中设置界面属性:
设置CoreUI(panel)的preferredSize属性的高宽等同于界面高宽
12. // 初始化默认过滤条件,true为打开过滤框,false为默认不打开过滤框
protected boolean initDefaultFilter() {
if (getUIContext().get("MyFilter") instanceof FilterInfo) {
return false;
} else
return true;
}
13.表格kdtable添加鼠标右键显示的excel导出功能(元数据发布的默认有,但是代码创建的表格需要调用下面方法):
coreUI类里的addCommonMenusToTable(table)方法
14.服务端新增单据进工作流,(接口同步场景用)
案例代码如下:
WfEventListenerStateManager.getInstance().enableEventListener();
ProjectDocBillFactory.getLocalInstance(ctx)
.submit(projectDocBillInfo);
WfEventListenerStateManager.getInstance().disableEventListener();
15.根据单据id找到单据的相关信息(实体,表,ui等)
BOSUuid id = BOSUuid.read(billId);
BOSObjectType type = id.getType();
IMetaDataLoader loader = MetaDataLoaderFactory.getRemoteMetaDataLoader();
EntityObjectInfo vo = loader.getEntity(type);
String editUi = vo.getExtendedProperty("editUI");
16.checkBox控件值改变时,如需要改为选择前的值方法:
if(e.getStateChange()==2){
ObjOldValue =e.getItem();
}
int res = MsgBox.showConfirm2(this, "XXXXXXXX,请确认!");
if(res==0){
kdtFeeEntry.removeRows();
}else{
combApplyType.setSelectedItem(ObjOldValue,false);
combApplyType.setModel(comboPromGroup.getModel());
return;
}
获取上下文中的信息(当前登录人、当前公司等)
客户端:SysContext.getSysContext().getCurrentUserInfo();
服务端:ContextUtil.getCurrentUserInfo(ctx);
17.代码中根据编码规则获取编码的简单实现
protected void recycleNumberByOrg(IObjectValue editData,String orgType,String number) {
if (!StringUtils.isEmpty(number))
{
try {
String companyID = null;
com.kingdee.eas.base.codingrule.ICodingRuleManager iCodingRuleManager = com.kingdee.eas.base.codingrule.CodingRuleManagerFactory.getRemoteInstance();
if(!com.kingdee.util.StringUtils.isEmpty(orgType) && !"NONE".equalsIgnoreCase(orgType) && com.kingdee.eas.common.client.SysContext.getSysContext().getCurrentOrgUnit(com.kingdee.eas.basedata.org.OrgType.getEnum(orgType))!=null) {
companyID =com.kingdee.eas.common.client.SysContext.getSysContext().getCurrentOrgUnit(com.kingdee.eas.basedata.org.OrgType.getEnum(orgType)).getString("id");
}
else if (com.kingdee.eas.common.client.SysContext.getSysContext().getCurrentOrgUnit() != null) {
companyID = ((com.kingdee.eas.basedata.org.OrgUnitInfo)com.kingdee.eas.common.client.SysContext.getSysContext().getCurrentOrgUnit()).getString("id");
}
if (!StringUtils.isEmpty(companyID) && iCodingRuleManager.isExist(editData, companyID) && iCodingRuleManager.isUseIntermitNumber(editData, companyID)) {
iCodingRuleManager.recycleNumber(editData,companyID,number);
}
}
catch (Exception e)
{
handUIException(e);
}
}
}
调用:
recycleNumberByOrg(editData,"NONE",editData.getString("number"));
18.服务端获取上下文:ContextUtil.getCurrentUserInfo(ctx);
客户端获取上下文:SysContext.getSysContext().getCurrentUserInfo();
web端获取上下文:
Context ctx =WafContext.getInstance().getContext();
UserInfo user = ContextUtil.getCurrentUserInfo(ctx);