您的位置:首页 > 其它

EAS开发问题解决方案汇总

2013-11-29 08:23 477 查看
做了快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"));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: