1.添加或修改成功后显示自动生成的字段值,覆盖updateView4Update,updateView4Add:
public void updateView4Update() {
super.updateView4Update();
showGenField();
}

public void updateView4Add() {
super.updateView4Add();
showGenField();
}

// 添加或修改成功后显示自动生成的字段值
private void showGenField() {
IComposite editorComposit = getEditorComposite("perMeasureQty");
editorComposit.setValue();
editorComposit = getEditorComposite("perPriceQty");
editorComposit.setValue();
}

2.常见列转换类
<field show='1' width='65' dt="agile.erp.dt.Td4UserName" name='CREATE_USER'>created by</field>
<field show='1' width='65' dt="agile.erp.dt.Td4Unit" name='PRICE_UNIT'>计价单位</field>
<field show='1' width='65' dt="agile.erp.dt.Td4ItemImg" name='IMG'>IMG</field>
时间/数字格式化
时间默认格式:yyyy-MM-dd, 可以使用format='yyyy-MM-dd HH:mm:ss'定义其他格式;
数字: format='#'

3.editor composite图档上传
<input type='text' name='agile.erp.editor.utl.file.CompositeFile4ItemImg' label='上传图片' beanField='uploadImg'>

4. 添加默认值设定:可用状态 checkbox样式:
ischar 决定CompositeBox的getText()返回结果可以为0/1或N/Y,默认ischar=false返回0/1.当设置为N时,返回结果使用0/1表示
<input type="box" name="mwt.widgets.editor.CompositeBox" label="可用状态" beanField="rowstate">
<showOrder>10</showOrder>
<nullable>Y</nullable>
<viewType>TYPE_STRING</viewType>
<dataType>String</dataType>
<editable>2</editable>
<clearable>Y</clearable>
<defaultValue>1</defaultValue>
<ischar>N</ischar><!--当需要返回0/1时,需要写-->
</input>

5.Exception in thread "main" java.lang.NullPointerException
at java.util.Collections.sort(Collections.java:158)
at agile.erp.editor.AbstractEditorComposite.initEditorComposits(AbstractEditorComposite.java:1135)
一般是由于没有找到配置文件,并有提示:
error:找不到form style文件:style/sys/fun/RoleAuthorizeFlat.xml
error:didn't set modle, can't create table!

6.error:数据库中未设置样式:T_SYS_GROUP_AUTHORIZE_FLAT_C
error:文件系统中也未找到样式style/T_SYS_GROUP_AUTHORIZE_FLAT_C.xml
Exception in thread "main" java.lang.NullPointerException
at mwt.widgets.tblColumn.TblColumnProperty.createColumns(TblColumnProperty.java:68)
at agile.erp.editor.AbstractEditorComposite.createDataTable(AbstractEditorComposite.java:538)

error:java.security.PrivilegedActionException: com.sun.xml.messaging.saaj.SOAPExceptionImpl: Message send failed
服务器端soap服务已关闭或发送地址错误

7.输入框只允许数字,实体类属性字段为字符型的输入框
<input type='text' name='agile.erp.editor.utl.txt.ComopsiteNumText' label='项次' beanField='keyNo'>

8.实体类扩展属性传值:必须是数据库字段名(驼峰命名法)
public void setValue(String dbFieldName, Object value) {
String beanFieldName = FieldFunction.dbField2BeanField(dbFieldName);
if (isSelfDifined(dbFieldName)) {
map.put(beanFieldName, value);
} else {
map.put(beanFieldName + SUFFIX_ALIAS, value);
}
}

public Object getValue(String dbFieldName) {
String beanFieldName = FieldFunction.dbField2BeanField(dbFieldName);
if (isSelfDifined(dbFieldName)) {
return map.get(beanFieldName);
} else {
return map.get(beanFieldName + SUFFIX_ALIAS);
}
}
在form view style中配置的扩展属性时beanField应为匈牙利命名法,系统会自动转换为数据库字段名

9.时间段查询一般需要扩展
对应查询条件params的类型需要转化Timestamp
if (!StringUtil.isEmpty(head.getValue("AFFIRM_TIME_END"))) {
sb.append(" AND AFFIRM_TIME-1 <= ?");//此处由于传入的值没有时分秒,需要-1天
Date d = (Date) head.getValue("AFFIRM_TIME_END");
Timestamp t = new Timestamp(d.getTime());
params.add(t);
}

10.编码字段添加或修改后需要显示table中对应的中文
sql:
private StringBuffer genSql() {
String pre = MapRowProcessor.aliasNamePrefix;//A_N_
StringBuffer sb = new StringBuffer("select t.*,dept.dept_name");
sb.append(",pc.code_name ").append(pre).append("POSITION_CLASS_NAME");
sb.append(",p.POSITION_NAME ").append(pre).append("POSITION_NAME");
sb.append(" from HR_STAFF t");
sb.append(" join HR_BASE_DEPARTMENT dept on t.DEPT_NO=dept.DEPT_NO");//当该字段不能为空时,使用内连接
sb.append(" join HR_BASE_POSITION p on p.POSITION_NO=t.POSITION_NO");
sb.append(" left join t_pub_code pc on t.POSITION_CLASS_NO=pc.code_NO and pc.code='POSITIONCLASS'");//当该字段可以为空时,使用左连接
sb.append(" where 1=1");
return sb;
}
table style:
<field show='10' width='116' name='POSITION_CLASS_NAME' relate='POSITION_CLASS_NO'>负责人</field>
relate为编码字段名称(对应table style的table Field name)

11.一般确认状态的查询
// 0 Not Affirm,1 Affirmed,2 All
Object affirmed = pt.getValue("AFFIRM_STATUS");
if (!StringUtil.isEmpty(affirmed)) {
if ("0".equals(affirmed)) {
sb.append(" and affirm_time is null");
} else if ("1".equals(affirmed)) {
sb.append(" and affirm_time is not null");
}
}

12.当手工输入而没有选择项,在失去焦点时清空下拉框
final CompositeCmb cmbFun = (CompositeCmb) getEditorComposite("fun.functionNo");
cmbFun.getCmb().getCombo().addFocusListener(new FocusAdapter() {
public void focusLost(org.eclipse.swt.events.FocusEvent e) {
if (StringUtil.isEmpty(cmbFun.getCmb().getID())) {
cmbFun.clear();
}
}
});
2009-8-10 16:01
此功能已写入控件类,如不需要此功能时使用
cmbFun.removeFocusListener4Clear();

13.soap方法返回非MessageBean对象时需要转换
public boolean isAffirmed(BomOption bo) {
MessageBean callRemote = callRemote(bo);
if (callRemote.isTrue() && callRemote.getObj() != null) {
return (Boolean) callRemote.getObj();
}
return false;
}
public List search(NoteItem noteItem) {
MessageBean callRemote = callRemote(noteItem);
if (callRemote.isTrue() && callRemote.getObj() != null) {
return (List) callRemote.getObj();
}
return null;
}

14.屏蔽原来table的双击事件
final Table table = form.dataTable.getTable();
SelectorHelper.removeDblListener(table);

15.编码直接使用通用的CodeForm和CodeMan,不用再写新的程序,在配置系统模块时:
class: agile.erp.editor.pub.code.CodeForm maxlength4No=1 maxlength4Name=4 uppercase4No=Y
其它属性:titleCodeNo,titleCodeName,titleRemarks分别表示字段显示label标题名称,nullable4Remark表示说明字段是否为必填项
editor id: code.TIMEUNIT (注意必须以code.开头,表示为编码;‘TIMEUNIT’为编码类别)
外键在mancs/pub/code/CodeForeignKey.properties文件中设置,格式:表示为obj对应表的字段(多字段间逗号分隔)+ '.' + 关联表+ '.' +外键字段+ '.' + 说明
eg. Unit=CODE_NO.T_PUB_PRODUCT.CAPACITY_UNIT.has been used,couldn't delete

16.一般combo下拉框
<input type="combo" name="mwt.widgets.editor.CompositeCmb" label="用户编号(一般下拉框)" beanField="userno">
<showOrder>2</showOrder>
<nullable>N</nullable>
<cmbFieldId>userno</cmbFieldId>
<cmbFieldName>username</cmbFieldName>
<viewType>COMBO_ID_VALUE_DATA</viewType>
<seperatorStr> </seperatorStr>-2009-11-9 15:13表示编码与名称间使用空格隔开
<seperatorStr>rpad 15</seperatorStr>-2009-11-9 15:13表示编码需要使用空格填满至15位后再+名称
<dataType>String</dataType>
<editable>2</editable>
<clearable>Y</clearable>
<upperCase>Y</upperCase>
</input>
2009-8-25 17:17 改进可以使用<comboGDPClass>数据提供类名称</comboGDPClass>
可将数据与控件分离;重复使用;改进方便;双击时可以重新刷新数据
数据提供类需要实现ICmbDataProvider或extends CmbDataAbstract

17.全局数据combo下拉框
<input type="combo" name="agile.erp.editor.utl.cmb.Composite.CompositeCmdByGDP" label="大类编号" beanField="parentNo">
<showOrder>2</showOrder>
<nullable>N</nullable>
<comboGDPClass>pdm.item.ItemBigType</comboGDPClass>
<cmbFieldId>typeNo</cmbFieldId>
<cmbFieldName>typeName</cmbFieldName>
<viewType>COMBO_ID_VALUE_DATA</viewType>
<dataType>String</dataType>
<editable>3</editable>
<clearable>N</clearable>
<upperCase>Y</upperCase>
</input>
注意: comboGDPClass属性为src/agile/globeData/GDP.properties中设置的属性(CompositeCmdByGDP可以通过配置找到对应数据提供类)
cmbFieldId为数据对应实体类的编号属性(匈牙利命名,不要写为数据库字段名称)
cmbFieldName为数据对应实体类的名称属性
viewType(COMBO_ID_VALUE_DATA;COMBO_VALUE_DATA;COMBO_ID_VALUE)显示方式

当实体类为通用编码时,可以不用属性<comboGDPClass>pdm.item.ItemBigType</comboGDPClass>
<input type="combo" name="agile.erp.editor.utl.cmb.Composite.CompositeCmdByGDP" label="模具类别" beanField="mouldTypeNo">
<showOrder>3</showOrder>
<nullable>N</nullable>
<code>mould_type</code>
<cmbFieldId>codeNo</cmbFieldId>
<cmbFieldName>codeName</cmbFieldName>
<viewType>COMBO_ID_VALUE_DATA</viewType>
<editable>2</editable>
<clearable>Y</clearable>
</input>

18。选择器,设置为也可以手动输入
SampleNoteItem selSampleItem = (SampleNoteItem) getEditorComposite("sampleItemNo");
selSampleItem.setEditable4Txt(true);
2009-11-18 9:36改进不用写代码:
<modifiableByUser>Y</modifiableByUser>表示选择框是否可以手动输入

19.editable=0 false(自动生成的字段一般为不可修改,但查询时需要输入);
1 true(一直可用,很少有一直可用);
2 editable(大部分为根据操作状态变化);
3主键添加时可以改,修改时不能改;
4永远不可编辑如创建时间、人 ---- clearable=N时,配置ExtendsInfo=clear4Search查询时强制clear
5查询form中查询条件不可编辑
6永远不可编辑,且在setEditor时不需要设置此控件值(一般适用于由其他控件设置或输入后显示相关值,且不保存到数据库中的字段)
setEditor时不需要设置此控件值类似:<skipSetEditor>Y</skipSetEditor>setEditor()方法中不需要设置此项的值
20.initAffterAll()方法
editorGridNum 编辑区域各输入框需要特殊显示或按键及其他监听事件可以在实现initAffterAll()方法中加入
如大文本框写法:
public void initAffterAll() {
IComposite composit = getEditorComposite("remarks");
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 3;
data.heightHint = 36;
composit.setLayoutData(data);
super.initAffterAll();
}
其他输入控件:
CompositeText txtPwd = (CompositeText) getEditorComposite("password");
txtPwd.getTxt().getTextWT().setEchoChar('*');//密码输入框

CompositeBox btnRowstate = (CompositeBox) getEditorComposite("rowstate");
btnRowstate.setChar(false);//checkbox框 返回结果可以表示为0/1;N/Y,默认返回N/Y;当设置为false时,返回结果使用0/1表示
系统默认在回车时跳到下一输入框,屏蔽方法:
IComposite composit = getEditorComposite("remarks");
AbstractComposite ec = (AbstractComposite) composit;
ec.removeTraverse2Next();

21.添加时,设置默认值,使用<defaultValue>default value</defaultValue>
<input type='text' name='mwt.widgets.editor.CompositeText' label='说明' beanField='remarks'>
<viewType>TYPE_STRING</viewType>
<defaultValue>default value</defaultValue>
</input>
form style中editors/input/defaultValue元素定义默认值。如:
<defaultValue>200</defaultValue>;
默认当前时间使用:<defaultValue>$now</defaultValue> ****可以加减天数,$now+5;$now-10;注意+-号不要有空格
默认当前登录用户:<defaultValue>$logUser</defaultValue>

22.数据库事务
MessageBean mb = new MessageBean();
Session session = null;
try {
session = DboSession.currentSession();
boolean b = session.add(bo);
if (!b) {
session.rollback();
mb.setMb(false,"复制BOM主档信息时失败!");
return mb;
}
} catch (SQLException e) {
e.printStackTrace();
mb.setMb(false,"异常错误:" + e.getMessage());
try {
session.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
return mb;
} finally {
try {
DboSession.closeSession();
} catch (SQLException e) {
e.printStackTrace();
mb.setMb(false,"异常错误:" + e.getMessage());
return mb;
}
}

23.在button区域后面可以加入提示信息
public void initBeforeAll() {
super.initBeforeAll();
setShortMessage(" 总参数 = 参数1 * 参数2 * 参数3");
}
24.备注说明,所占行列位置控制:
IComposite composit = getEditorComposite("description");
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 3;
data.heightHint = 58;
composit.setLayoutData(data);

25.调整显示位置占位时,可能需要使用空控件:
<input type='text' name='agile.erp.editor.utl.txt.CompositeSeperator' label=' ' beanField='seperator'>
<showOrder>42</showOrder>
</input>

26 上下区containerForm
注意***********
已改进,直接在AbstractEditorComposite中完成了
上区指定beanKeyField(initAffterAll(): beanKeyField="stdNo");****注意第42条改进
下区指定headField(下区对象的属性(=上区对象))
******************
上区查询需要覆盖viewSearch,doSearch两个方法
public boolean viewSearch() { ****已在超类中改进完成******
if (isTopComposite) {
clearEditor();
setState(State.STATE_SEARCH);
setEditable(false);
IComposite composit = getEditorComposite("bmQuoteNo");
composit.setEditable(true);
setTableEnable(false);
focuseFirstEditableControl();
return true;
} else {
return super.viewSearch();
}
}
public List doSearch() { ****已在超类中改进完成******
if (isTopComposite) {
String noteNo = getEditorComposite("bmQuoteNo").getText().toString();
MessageBean mb = getManager().load("bm_Quote_No", noteNo,
MaterialQuote.class);
if (mb.isTrue()) {
selectedObj = mb.getObj();
} else {
MessageUtil.Error(mb.getMsg());
}
return null;
} else {
ResultSetHandler h = new MapListHandler(new MapRowProcessor());
List<Object> result = getManager().search(getSelectedObj(), h);
return result;
}
}
下区注意
将上区作为查询条件
public void gatherData() { ****已在超类中改进完成******
super.gatherData();
if (getTopObj() != null) {
Object topObj = getTopObj();
Production head = (Production) topObj;
getSelectedObj().setNoteNo(head.getNoteNo());
getSelectedObj().setHead(head);
}
}
public List<Object> doSearch() { ****已在超类中改进完成******
ProductionItem bottom = getSelectedObj();
if (getTopObj() == null) {
return null;
}
ResultSetHandler h = new MapListHandler(new MapRowProcessor());
List<Object> result = getManager().search(bottom, h);
return result;
}
//将上区作为外键 ****已在超类中改进完成******
public MessageBean doAdd() {
MessageBean mb = null;
ProductionItem obj = getSelectedObj();
if (getTopObj() == null) {
return new MessageBean("上区记录为空,不能新增下区资料!", false);
}
mb = getManager().add(obj);
return mb;
}
27 form style的input元素可以定义extendsInfo子元素,该值可以使用CompositeInfo.getExtendsInfo("decimalDigits")取得
<seperator4Db>;</seperator4Db>-2010-12-27 11:58上午 表示选择多个编码保存到数据库时使用';'隔开(CompositeList使用,默认值为';')
<seperatorStr> </seperatorStr>-2009-11-9 15:13表示显示时编码与名称间使用空格隔开(combox,CompositeList均使用)
<seperatorStr>rpad 15</seperatorStr>-2009-11-9 15:13表示编码需要使用空格填满至15位后再+名称(当编码长度没有限制时使用)
<visibleItemCount>8</visibleItemCount>下拉框显示行数
<decimalDigits>表示text double输入框中小数显示位数(默认是4位)
<modifiableByUser>Y</modifiableByUser>表示选择框是否可以手动输入
<nullableDisabled>Y</nullableDisabled>已设置nullable=N后,当不可编辑时可以为空的控件
<clearable>N</clearable>重新setEditor时不清空
<clear4Search>Y</clear4Search>已设置clear=N后,查询时可以清空输入控件
<ischar>N</ischar>CompositeBox的getText()返回结果可以为0/1
<defaultValue>default value</defaultValue>
<xvalue>codeName.currencyName</xvalue>多个使用;分隔.此设置在gatherData时将当前控件dataObj中codeName属性值设置给当前selectedObject的currencyName属性;作用及用法见供应商建档.币别
<subCmb>subCmbBeanFieldName</subCmb>当前控件改变时,刷新子控件。注意subCmbBeanFieldName必须在当前控件后面.级联下拉框,使用PARENT_NO传递当前控件的值.AbstractCompositeCmb.refreshChild
<enumerate>
<item no='0' name=''/>
<item no='1' name='有效'/>
<item no='2' name='无效'/>
</enumerate>当非编码下拉框时可使用enumerate枚举值(CompositeCmb) ParseConfigure分析
<tags>
<t value='' editMyself=N' desc='插入标签内容' keycode='Q'/>
<t value='常用短语' desc='插入选中内容'/>
</tags>CompositeText框中加入右键菜单,插入常用短语,keycode为快捷键,eg: Function.xml
<width>88</width>查询条件中控件显示长度,
注意用<width>0</width>,则在查询form不设置默认宽度66,一般对于下拉框文字内容比较长时(如客户)好用,不设置width时,下拉框的宽度会随内容加长至全部显示. if (w > 0) { RowData rd = new RowData(w, 12); cmb.setLayoutData(rd);
一般的Combox4AffirmStatus已默认设置width=48 (if (info.getExtendsInfo("width") == null) { info.setExtendsInfo("width", 48);),
对于一般的是否类下拉框(及enumerate定义),名称内容不长的可以设置:<width>48</width>,这样combox控件与text控件长度相同,比较美观
<skipSetEditor>Y</skipSetEditor>setEditor()方法中不需要设置此项的值

<newThread4Search>Y</newThread4Search>大查询或耗时大的sql开启新线程、不影响界面其它操作响应

<filterStyle>T_PUB_PROVIDER_C</filterStyle>下拉框弹出过滤查找form的table style
<spell>REMARK</spell>下拉框弹出过滤查找form 检测汉字首字母拼音的列,多个列使用','分隔,列名称为大写db格式
<hSpan>4</hSpan>决定editor区域显示GridData.horizontalSpan
<vSpan>4</vSpan>GridData.verticalSpan
<clearEnterChar>Y</clearEnterChar>复制内容中包含回车换行时,text框会自动截掉回车符后面的内容,此设置可以去掉换行符
editable,upperCase,maxLength,minLength

<selectorLR>agile.erp.editor.utl.sel.po.MultiSelector4Powder</selectorLR>左右选择框,类似email选择用户(eg.input name='agile.erp.editor.utl.sel.MultiSelector' label='粉')
<autoSearch>Y</autoSearch>MultiSelector左右选择框,弹出窗口时是否自动查询出数据

<maxFileSize>1024000</maxFileSize>限制上传文件大小
<filter>*.xsl</filter>选择文件类型


28 顺序号:production.setNoteNo(genNoteNo(Constant4Prefix.FP_MAKED, 5));

29.选择器弹出窗口可通过扩展属性传递参数
选择样品单时默认确认状态并不可编辑,使用扩展属性defaultAffirmStatus:(0 Not Affirm,1 Affirmed,2 All),扩展3(待确认)
<input type='text' name='agile.erp.editor.utl.sel.SampleNoteItem' label='样品单号' beanField='sampleItemno'>
<maxLength>8</maxLength>
<showOrder>7</showOrder>
<editable>2</editable>
<nullable>N</nullable>
<clearable>Y</clearable>
<modifiableByUser>Y</modifiableByUser><!--表示选择框是否可以手动输入-->
<defaultAffirmStatus>1</defaultAffirmStatus>
</input>
代码参考agile.erp.editor.utl.sel.SampleNoteItem.java 36行
form = new NoteItemQueryForm(shell, ParseEditorConfigure.getConfigurePrefix() + "casep/sample/query/NoteItemQuery.xml");
form.create();
// 默认确认状态(并不可编辑)
String extendsInfo = info.getExtendsInfo("defaultAffirmStatus");
if (!StringUtil.isEmpty(extendsInfo)) {
IComposite ec = form.getEditorComposit("affirmStatusUser");
ec.setText(extendsInfo);
ec.setEditable(false);
}

29.1 选择器需要使用当前form中控件对象值作为参数
selPurchaseOrder.getBtnSelector().addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent e) {
Receive head = (Receive) getTopObj();
selPurchaseOrder.setData("providerNo", head.getProviderNo());
}
});

30.不允许重复输入(编号等,有事为组合唯一键),注:如果只在数据库中配置了唯一键,重复时给用户的提示不友好.
a.使用系统配置: 系统管理(&S) -> 系统配置 -> 数据库表实体类对应
定义唯一键(UK)多个唯一键需要使用‘;'隔开
组合唯一键,组合字段之间使用','隔开
<class name="sys.ctrl.code.Code" table="T_PUB_CODE" id="ID" uk="CODE_NO,CODE.编号不能重复;CODE_NAME,CODE.名称不能重复" />

31.public static void show(String standardNo)鼠标双击显示相关信息时出现错误:
Could not open the editor: An exception was thrown during initialization
java.lang.NullPointerException
at agile.erp.editor.Editor.init(Unknown Source)
at org.eclipse.ui.internal.EditorManager.createSite(EditorManager.java:799)
控制台显示:error:ParseEditorConfigure:didn't find editor id:casep.sample.std.StdTabContainerForm, use the editor id as configure file.
此时一般应为editorId写错,和模块管理中的不一致:
IWorkbenchWindow win = Form.site.getWorkbenchWindow();
EditorInput ei = new EditorInput("sample.std.StdTabContainerForm");//此处必需为模块管理中定义的editorId,也就是必须与菜单中一致

32.一般查看错误信息的方法
直接在eclipse中启动整个项目,在eclipse console可以看到一部分system输出信息
如果出现异常大多会在eclipse.exe所在盘符根目录下有文件夹runtime-agile.erp4mh.product/.metadata,其中.log文件为日志
直接通过.jnlp登录系统,jre的控制台可以看到一般system信息
如果出现异常会在C:\agile.erp4mh\log\.metadata,其中.log文件为日志

33.在使用过程中可以动态的改变form style中input控件的属性值
另外扩展属性使用setExtendsInfo(key,value),如:
txtSeqNO.getTxt().setLabelText("旧产品编号");
txtSeqNO.getTxt().setTextLimit(8);
txtSeqNO.getTxt().setMinLimited(8);
txtSeqNO.getTxt().setNotNull(true)
txtSeqNO.getTxt().setExtendsInfo("defaultTeamNoValue", head.getTeamNo())

34.comman.jar,agile.common.jar 更新地址 http://www.leewards.com/soap/jre

35.一些输入控件可用状态根据其他控件(如下拉框)的值来改变,处理方法
a.在控制控件上添加addModifyListener();
b.修改时:
public boolean viewUpdate() {
boolean viewUpdate = super.viewUpdate();
if (!viewUpdate) {
return false;
}
CompositeCmb cmbAdjType = (CompositeCmb) getEditorComposite("adjustType");
String id = cmbAdjType.getID();
cmbAdjType.clear();
cmbAdjType.setID(id);
return true;
}

36.全局数据下拉框(用户既可选择也可输入) 保存name值(用户输入值),而不是保存编号id值
<input type="combo" name="agile.erp.editor.utl.cmb.Composite.CompositeCmdByGDP4Editable" label="地址" beanField="uop">
<showOrder>3</showOrder>
<nullable>Y</nullable>
<code>Addr</code>
<cmbFieldId>codeNo</cmbFieldId>
<cmbFieldName>codeName</cmbFieldName>
<editable>2</editable>
<clearable>Y</clearable>
</input>

37.public void initAffterAll() {
super.initAffterAll();
// table一直可用
tableAlwaysEnable = true;
//所有button都不可用
disableAllButton = true;
// form不可编辑(查询添加修改删除等按钮不可用,一般用于下区)
}
37.1 //新增/删除按钮不可用
public void checkStateMachine() {
super.checkStateMachine();
IButton button = getButton(ButtonFactory.BTN_ID_ADD);
button.setEnable(false);
button = getButton(ButtonFactory.BTN_ID_DELETE);
button.setEnable(false);
button = getButton(ButtonFactory.BTN_ID_SEARCH);
button.setEnable(false);
}
38. mb = UserSession.isMyDataOrAdmins(noteHead);
if (mb.isFalse()) {
mb.setMsg("只有创建人或管理员才能改动样品单!");
}
上中下区参考NoteHmbContainerForm
***已经在超类中实现
***创建人确认只有创建人或管理员才能确认,超类中实现了
39.主档数据无子数据查询
<input type="box" name="mwt.widgets.editor.CompositeBox" label="无子数据" beanField="nochild">
<showOrder>60</showOrder>
<viewType>TYPE_STRING</viewType>
<dataType>String</dataType>
<ischar>Y</ischar>
</input>
if ("Y".equals(bomOption.getValue("NOCHILD"))) {
sb.append(" and not exists (select ti.option_item_no from t_pdm_bom_option_item ti where ti.option_no = t.option_no)");
}
40.Attempted to lock an already-locked dir
svn: Working copy 'E:\workspacePlm\agio.plm\src\agile\erp\dt' locked
出现这个问题后使用“清理”功能,如果还不行,就直接到上一级目录,再执行“清理”,然后再“更新”。
有时候如果看到某个包里面的文件夹没有SVN的标志,直接用“Ctrl+Delete”手工删除,然后“清理”,最后“更新”或“提交”。

41.用ant编译web工程时,碰到java.lang.OutOfMemoryError: Java heap space异常
方法1、window->preferences->java->installed jres->(选择执行的jdk)edit...
把default vm arguments 的参数设为-Xms64m -Xmx512m

42. 一般在上区中给出,下区可以取到getTopForm().beanKeyField
当上下区对应字段不相同,可能是:responseNo=ecnNo,而不是responseNo(上区字段=下区字段)
当有多个下区时上区只能指定一个,所以HbContainerForm需要在createBottomArea addTab时自己指定:
EcnNoteDocForm ecnNoteDocForm = new EcnNoteDocForm();
ecnNoteDocForm.setData("beanKeyField", "responseNo=ecnNo");
addTab(ecnNoteDocForm, "反应单附件明细", "eng/ecn/EcnNoteDoc.xml");

43.2010-4-13 19:54
直接使用form.viewUpdate() form.viewDelete()会漏掉权限检测,正确方法
if(form.hadAuthorizedOperate4Edit()) {
form.viewUpdate();
}
44.2010-4-13 19:54权限检测,超类中已检测,如有其它特殊权限控制,需要覆盖此方法
******(这两个方法均在viewUpdate,viewDelete之前使用,所以要注意:直接使用form.viewUpdate和viewDelete会漏掉权限检测。见43
protected MessageBean hadAuthorated2Update() {
MessageBean mb = UserSession.isMyDataOrAdmins((BaseValueObject) selectedObj);
if (!mb.isTrue()) {
mb.setMb(false, "对不起,您不是此数据记录创建人,不能修改此记录!");
}
return mb;
}
protected MessageBean hadAuthorated2Delete() {
MessageBean mb = UserSession.isMyDataOrAdmins((BaseValueObject) selectedObj);
if (!mb.isTrue()) {
mb.setMb(false, "对不起,您不是此数据记录创建人,不能删除此记录!");
}
return mb;
}
上下区具体参考BomOptionForm

45 切换颜色的列(相邻两行对应列的值相同为相同颜色,下一行该列值不相同时切换颜色)
public void initAffterAll():
mediator.addAlternateColorCol(tblColumnProp.colIndex("CREATE_TIME"));

46 选择器手动输入或选择后填写相关控件值
final PoriItemNoSelector selPori = (PoriItemNoSelector) getEditorComposite("poriItemno");
selPori.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
int maxLength = selPori.getInfo().getMaxLength();
if (selPori.isEmpty()
|| maxLength > selPori.getTxt().getText().length()) {
txtQtyCheckIn.clear();
txtQtyInvalid.clear();
return;
}
ReceiveItem ri;
if (selPori.getDataObj() == null) {
MessageBean load = getManager().load("pori_Itemno",
selPori.getTxt().getText(), ReceiveItem.class);
if (load.isTrue()) {
ri = (ReceiveItem) load.getObj();
selPori.setData(BaseMan.KEY4DATA, ri);
} else {
Debug.error(load.getMsg());
return;
}
} else {
ri = (ReceiveItem) selPori.getDataObj();
}
txtQtyCheckIn.setText(ri.getQtyReceive());
}
});

如果关联字段是保存到数据库表的,modifyText需要加入(只有在添加和修改的时候需要设置相关值,选中时不需要设置,因为setEditor会再设置1次)
if (getState() != State.STATE_NEW && getState() != State.STATE_EDIT) {
return;
}

47 添加时数据不清空 button使用
a.在form class中加入参数:btn4NoClear=Y
b.在form style中配置<data><btn4NoClear>Y</btn4NoClear></data>

48 确认form,修改‘确认’按钮标题在initAffterAll()使用
titleAffirm = "取消确认";
titleAffirm = "解除取消";
49 eclipse高效快捷键:
ctrl+E
ctrl+J
ctrl+M
50 form class参数汇总: 程序中使用getArgValue("key")获得参数值
a.btn4NoClear=Y(见47)
b.-t+fieldName=labelTitle(见改进11)
c.CodeForm minlength4No=1 minlength4No=1 maxlength4No=6 maxlength4Name=10 uppercase4No=N editable4No=Y
nullable4Remark titleRemarks titleCodeName
d.editMyself=N
e.CatalogueForm -catalogue=SPRO_TYPE -rank=2 -lengths=1,3

51. 关于标志字段查询问题的处理统一一下: /*****已改进,见开发改进日志117
1.建档form时不需要别名
2.查询form时使用别名
3.建档form中查询doSearch方法里面man.search前将标志字段set为null
4.man的genCondition不直接使用getField判断,使用getValue("别名")判断标志字段的条件(这样第3点可省略)

52.打印页面使用了控件,需要在ie选项中设置
高级->安全->允许活动内容在我的机器上的文件中运行

53.SQL语言中的换行符 chr(13)||chr(10)

54.对数据库操作事务很长时,需要增加catch所有Exception,防止由于未知异常,破坏事务完整性
} catch (Exception e) {
e.printStackTrace();
mb.append(e.getMessage()+" ,发生异常错误!");
mb.setTrue(false);
try {
session.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
return mb;
55.负数 TYPE_double_negative

56.下区doSaveItems后刷新上区,"下区处于编辑状态,请保存数据后再编辑上区!"解决方法:
需要先保存state,设置空的state,viewRefresh()后再设置原state
public MessageBean doSaveItems(List modified) {
MessageBean saveItems = getManager().saveItems(modified);
if (saveItems.isTrue()) {
int old = getState();
setState(State.SELECT);
getTopForm().viewRefresh();
setState(old);
}
return saveItems;
}

57.getSelectedVOs 与 getLstSelected区别
a.getLstSelected根据checkbox多选(一般用于弹出选择窗口)
b.getSelectedVOs在本form中多选行

58.下区为无table的form,随时可编辑
public void setState(int state) {
if (state == State.NO_SELECT && selectedObj != null) {
state = State.SELECT;
}
super.setState(state);
}
只能添加一次
public boolean viewAdd() {
if (selectedObj != null) {
MessageUtil.warn("已经存在加工要求,不能重复添加!");
return false;
}
return super.viewAdd();
}