EAS开发问题解决方案汇总

来源:互联网 发布:nba2k17查看球员数据 编辑:程序博客网 时间:2024/04/30 11:53

做了快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"));


原创粉丝点击